diff --git a/CHANGELOG.md b/CHANGELOG.md
index 50de15e..932dc54 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,7 @@
+## 4.0.0
+
+- Support null safety.
+
 ## 3.8.3
 
 - Require the latest shelf and remove dead code.
diff --git a/lib/client/sse_client.dart b/lib/client/sse_client.dart
index 00def10..0f1da87 100644
--- a/lib/client/sse_client.dart
+++ b/lib/client/sse_client.dart
@@ -15,7 +15,7 @@
 ///
 /// The client can send any JSON-encodable messages to the server by adding
 /// them to the [sink] and listen to messages from the server on the [stream].
-class SseClient extends StreamChannelMixin<String> {
+class SseClient extends StreamChannelMixin<String?> {
   final _incomingController = StreamController<String>();
 
   final _outgoingController = StreamController<String>();
@@ -26,11 +26,11 @@
 
   int _lastMessageId = -1;
 
-  EventSource _eventSource;
+  late EventSource _eventSource;
 
-  String _serverUrl;
+  late String _serverUrl;
 
-  Timer _errorTimer;
+  Timer? _errorTimer;
 
   /// [serverUrl] is the URL under which the server is listening for
   /// incoming bi-directional SSE connections.
@@ -113,8 +113,8 @@
     close();
   }
 
-  void _onOutgoingMessage(String message) async {
-    String encodedMessage;
+  void _onOutgoingMessage(String? message) async {
+    String? encodedMessage;
     try {
       encodedMessage = jsonEncode(message);
     } on JsonUnsupportedObjectError catch (e) {
diff --git a/lib/src/server/sse_handler.dart b/lib/src/server/sse_handler.dart
index 8dec99e..d8a867e 100644
--- a/lib/src/server/sse_handler.dart
+++ b/lib/src/server/sse_handler.dart
@@ -13,12 +13,12 @@
 import 'package:stream_channel/stream_channel.dart';
 
 // RFC 2616 requires carriage return delimiters.
-String _sseHeaders(String origin) => 'HTTP/1.1 200 OK\r\n'
+String _sseHeaders(String? origin) => 'HTTP/1.1 200 OK\r\n'
     'Content-Type: text/event-stream\r\n'
     'Cache-Control: no-cache\r\n'
     'Connection: keep-alive\r\n'
-    'Access-Control-Allow-Credentials: true\r\n'
-    'Access-Control-Allow-Origin: $origin\r\n'
+    'Access-Control-Allow-Credentials: true\r\n' 
+    "${origin != null ? 'Access-Control-Allow-Origin: $origin\r\n'  : ''}"
     '\r\n\r\n';
 
 class _SseMessage {
@@ -28,7 +28,7 @@
 }
 
 /// A bi-directional SSE connection between server and browser.
-class SseConnection extends StreamChannelMixin<String> {
+class SseConnection extends StreamChannelMixin<String?> {
   /// Incoming messages from the Browser client.
   final _incomingController = StreamController<String>();
 
@@ -38,10 +38,10 @@
   Sink _sink;
 
   /// How long to wait after a connection drops before considering it closed.
-  final Duration _keepAlive;
+  final Duration? _keepAlive;
 
   /// A timer counting down the KeepAlive period (null if hasn't disconnected).
-  Timer _keepAliveTimer;
+  Timer? _keepAliveTimer;
 
   /// Whether this connection is currently in the KeepAlive timeout period.
   bool get isInKeepAlivePeriod => _keepAliveTimer?.isActive ?? false;
@@ -57,7 +57,7 @@
 
   /// Wraps the `_outgoingController.stream` to buffer events to enable keep
   /// alive.
-  StreamQueue _outgoingStreamQueue;
+  late StreamQueue _outgoingStreamQueue;
 
   /// Creates an [SseConnection] for the supplied [_sink].
   ///
@@ -67,7 +67,7 @@
   ///
   /// If [keepAlive] is not supplied, the connection will be closed immediately
   /// after a disconnect.
-  SseConnection(this._sink, {Duration keepAlive}) : _keepAlive = keepAlive {
+  SseConnection(this._sink, {Duration? keepAlive}) : _keepAlive = keepAlive {
     _outgoingStreamQueue = StreamQueue(_outgoingController.stream);
     unawaited(_setUpListener());
     _outgoingController.onCancel = _close;
@@ -154,7 +154,7 @@
       // been completely closed, set a timer to close after the timeout period.
       // If the connection comes back, this will be cancelled and all messages left
       // in the queue tried again.
-      _keepAliveTimer = Timer(_keepAlive, _close);
+      _keepAliveTimer = Timer(_keepAlive!, _close);
     }
   }
 
@@ -187,11 +187,11 @@
 class SseHandler {
   final _logger = Logger('SseHandler');
   final Uri _uri;
-  final Duration _keepAlive;
-  final _connections = <String, SseConnection>{};
+  final Duration? _keepAlive;
+  final _connections = <String?, SseConnection>{};
   final _connectionController = StreamController<SseConnection>();
 
-  StreamQueue<SseConnection> _connectionsStream;
+  StreamQueue<SseConnection>? _connectionsStream;
 
   /// [_uri] is the URL under which the server is listening for
   /// incoming bi-directional SSE connections.
@@ -203,7 +203,7 @@
   ///
   /// If [keepAlive] is not supplied, connections will be closed immediately
   /// after a disconnect.
-  SseHandler(this._uri, {Duration keepAlive}) : _keepAlive = keepAlive;
+  SseHandler(this._uri, {Duration? keepAlive}) : _keepAlive = keepAlive;
 
   StreamQueue<SseConnection> get connections =>
       _connectionsStream ??= StreamQueue(_connectionController.stream);
@@ -221,8 +221,8 @@
       // Check if we already have a connection for this ID that is in the process
       // of timing out (in which case we can reconnect it transparently).
       if (_connections[clientId] != null &&
-          _connections[clientId].isInKeepAlivePeriod) {
-        _connections[clientId]._acceptReconnection(sink);
+          _connections[clientId]!.isInKeepAlivePeriod) {
+        _connections[clientId]!._acceptReconnection(sink);
       } else {
         var connection = SseConnection(sink, keepAlive: _keepAlive);
         _connections[clientId] = connection;
@@ -280,7 +280,7 @@
   String _originFor(shelf.Request req) =>
       // Firefox does not set header "origin".
       // https://bugzilla.mozilla.org/show_bug.cgi?id=1508661
-      req.headers['origin'] ?? req.headers['host'];
+      req.headers['origin'] ?? req.headers['host']!;
 
   /// Immediately close all connections, ignoring any keepAlive periods.
   void shutdown() {
diff --git a/pubspec.yaml b/pubspec.yaml
index 0c67e5c..6f637fe 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -1,5 +1,5 @@
 name: sse
-version: 3.8.3
+version: 4.0.0
 homepage: https://github.com/dart-lang/sse
 description: >-
   Provides client and server functionality for setting up bi-directional
@@ -7,7 +7,7 @@
   requests.
 
 environment:
-  sdk: ">=2.2.0 <3.0.0"
+  sdk: '>=2.12.0 <3.0.0'
 
 dependencies:
   async: ^2.0.8
diff --git a/test/sse_test.dart b/test/sse_test.dart
index cbd8e6d..ad84d7e 100644
--- a/test/sse_test.dart
+++ b/test/sse_test.dart
@@ -16,10 +16,10 @@
 import 'package:webdriver/io.dart';
 
 void main() {
-  HttpServer server;
-  WebDriver webdriver;
-  SseHandler handler;
-  Process chromeDriver;
+  late HttpServer server;
+  late WebDriver webdriver;
+  late SseHandler handler;
+  late Process chromeDriver;
 
   setUpAll(() async {
     try {
diff --git a/test/web/index.dart b/test/web/index.dart
index 7d00757..e149372 100644
--- a/test/web/index.dart
+++ b/test/web/index.dart
@@ -9,7 +9,7 @@
 void main() {
   var channel = SseClient('/test');
 
-  document.querySelector('button').onClick.listen((_) {
+  document.querySelector('button')!.onClick.listen((_) {
     channel.sink.close();
   });
 
diff --git a/test/web/index.dart.js b/test/web/index.dart.js
index 5f962b9..741866a 100644
--- a/test/web/index.dart.js
+++ b/test/web/index.dart.js
@@ -1,4 +1,4 @@
-// Generated by dart2js (fast startup emitter, strong), the Dart to JavaScript compiler version: 2.12.0-133.2.beta.
+// Generated by dart2js (fast startup emitter, strong), the Dart to JavaScript compiler version: 2.13.0-203.0.dev.
 // The code supports the following hooks:
 // dartPrint(message):
 //    if this function is defined it is called instead of the Dart [print]
@@ -27,6 +27,14 @@
       to[key] = from[key];
     }
   }
+  function mixinProperties(from, to) {
+    var keys = Object.keys(from);
+    for (var i = 0; i < keys.length; i++) {
+      var key = keys[i];
+      if (!to.hasOwnProperty(key))
+        to[key] = from[key];
+    }
+  }
   var supportsDirectProtoAccess = function() {
     var cls = function() {
     };
@@ -58,7 +66,7 @@
       for (var j = 0; j < keys.length; j++) {
         var key = keys[j];
         var f = holder[key];
-        if (typeof f == 'function')
+        if (typeof f == "function")
           f.name = key;
       }
     }
@@ -81,7 +89,7 @@
       inherit(classes[i], sup);
   }
   function mixin(cls, mixin) {
-    copyProperties(mixin.prototype, cls.prototype);
+    mixinProperties(mixin.prototype, cls.prototype);
     cls.prototype.constructor = cls;
   }
   function lazyOld(holder, name, getterName, initializer) {
@@ -170,7 +178,7 @@
     var funs = [];
     for (var i = 0; i < funsOrNames.length; i++) {
       var fun = funsOrNames[i];
-      if (typeof fun == 'string')
+      if (typeof fun == "string")
         fun = container[fun];
       fun.$callName = callNames[i];
       funs.push(fun);
@@ -248,9 +256,10 @@
   var C = {},
   H = {JS_CONST: function JS_CONST() {
     },
+    LateError$fieldNI: function(fieldName) {
+      return new H.LateError("Field '" + fieldName + "' has not been initialized.");
+    },
     checkNotNullable: function(value, $name, $T) {
-      if (value == null)
-        throw H.wrapException(new H.NotNullableError($name, $T._eval$1("NotNullableError<0>")));
       return value;
     },
     IterableElementError_noElement: function() {
@@ -259,11 +268,7 @@
     LateError: function LateError(t0) {
       this._message = t0;
     },
-    closure: function closure() {
-    },
-    NotNullableError: function NotNullableError(t0, t1) {
-      this.__internal$_name = t0;
-      this.$ti = t1;
+    nullFuture_closure: function nullFuture_closure() {
     },
     EfficientLengthIterable: function EfficientLengthIterable() {
     },
@@ -308,8 +313,6 @@
       else if (value == null)
         return "null";
       res = J.toString$0$(value);
-      if (typeof res != "string")
-        throw H.wrapException(H.argumentErrorValue(value));
       return res;
     },
     Primitives_objectHashCode: function(object) {
@@ -321,10 +324,8 @@
       return hash;
     },
     Primitives_parseInt: function(source, radix) {
-      var match, decimalMatch;
-      if (typeof source != "string")
-        H.throwExpression(H.argumentErrorValue(source));
-      match = /^\s*[+-]?((0x[a-f0-9]+)|(\d+)|([a-z0-9]+))\s*$/i.exec(source);
+      var decimalMatch,
+        match = /^\s*[+-]?((0x[a-f0-9]+)|(\d+)|([a-z0-9]+))\s*$/i.exec(source);
       if (match == null)
         return null;
       if (3 >= match.length)
@@ -340,26 +341,27 @@
       return H.Primitives__objectTypeNameNewRti(object);
     },
     Primitives__objectTypeNameNewRti: function(object) {
-      var dispatchName, $constructor, constructorName;
+      var dispatchName, t1, $constructor, constructorName;
       if (object instanceof P.Object)
         return H._rtiToString(H.instanceType(object), null);
       if (J.getInterceptor$(object) === C.Interceptor_methods || type$.UnknownJavaScriptObject._is(object)) {
         dispatchName = C.C_JS_CONST(object);
-        if (H.Primitives__saneNativeClassName(dispatchName))
+        t1 = dispatchName !== "Object" && dispatchName !== "";
+        if (t1)
           return dispatchName;
         $constructor = object.constructor;
         if (typeof $constructor == "function") {
           constructorName = $constructor.name;
-          if (typeof constructorName == "string" && H.Primitives__saneNativeClassName(constructorName))
+          if (typeof constructorName == "string")
+            t1 = constructorName !== "Object" && constructorName !== "";
+          else
+            t1 = false;
+          if (t1)
             return constructorName;
         }
       }
       return H._rtiToString(H.instanceType(object), null);
     },
-    Primitives__saneNativeClassName: function($name) {
-      var t1 = $name !== "Object" && $name !== "";
-      return t1;
-    },
     Primitives_stringFromCharCode: function(charCode) {
       var bits;
       if (charCode <= 65535)
@@ -396,32 +398,20 @@
     Primitives_getMilliseconds: function(receiver) {
       return receiver.isUtc ? H.Primitives_lazyAsJsDate(receiver).getUTCMilliseconds() + 0 : H.Primitives_lazyAsJsDate(receiver).getMilliseconds() + 0;
     },
-    iae: function(argument) {
-      throw H.wrapException(H.argumentErrorValue(argument));
-    },
     ioore: function(receiver, index) {
       if (receiver == null)
         J.get$length$asx(receiver);
       throw H.wrapException(H.diagnoseIndexError(receiver, index));
     },
     diagnoseIndexError: function(indexable, index) {
-      var $length, t1, _s5_ = "index";
+      var $length, _s5_ = "index";
       if (!H._isInt(index))
         return new P.ArgumentError(true, index, _s5_, null);
-      $length = H._asIntS(J.get$length$asx(indexable));
-      if (!(index < 0)) {
-        if (typeof $length !== "number")
-          return H.iae($length);
-        t1 = index >= $length;
-      } else
-        t1 = true;
-      if (t1)
+      $length = H._asInt(J.get$length$asx(indexable));
+      if (index < 0 || index >= $length)
         return P.IndexError$(index, indexable, _s5_, null, $length);
       return P.RangeError$value(index, _s5_);
     },
-    argumentErrorValue: function(object) {
-      return new P.ArgumentError(true, object, null, null);
-    },
     wrapException: function(ex) {
       var wrapper, t1;
       if (ex == null)
@@ -447,7 +437,7 @@
     },
     TypeErrorDecoder_extractPattern: function(message) {
       var match, $arguments, argumentsExpr, expr, method, receiver;
-      message = H.quoteStringForRegExp(message.replace(String({}), '$receiver$'));
+      message = H.quoteStringForRegExp(message.replace(String({}), "$receiver$"));
       match = message.match(/\\\$[a-zA-Z]+\\\$/g);
       if (match == null)
         match = H.setRuntimeTypeInfo([], type$.JSArray_String);
@@ -456,11 +446,11 @@
       expr = match.indexOf("\\$expr\\$");
       method = match.indexOf("\\$method\\$");
       receiver = match.indexOf("\\$receiver\\$");
-      return new H.TypeErrorDecoder(message.replace(new RegExp('\\\\\\$arguments\\\\\\$', 'g'), '((?:x|[^x])*)').replace(new RegExp('\\\\\\$argumentsExpr\\\\\\$', 'g'), '((?:x|[^x])*)').replace(new RegExp('\\\\\\$expr\\\\\\$', 'g'), '((?:x|[^x])*)').replace(new RegExp('\\\\\\$method\\\\\\$', 'g'), '((?:x|[^x])*)').replace(new RegExp('\\\\\\$receiver\\\\\\$', 'g'), '((?:x|[^x])*)'), $arguments, argumentsExpr, expr, method, receiver);
+      return new H.TypeErrorDecoder(message.replace(new RegExp("\\\\\\$arguments\\\\\\$", "g"), "((?:x|[^x])*)").replace(new RegExp("\\\\\\$argumentsExpr\\\\\\$", "g"), "((?:x|[^x])*)").replace(new RegExp("\\\\\\$expr\\\\\\$", "g"), "((?:x|[^x])*)").replace(new RegExp("\\\\\\$method\\\\\\$", "g"), "((?:x|[^x])*)").replace(new RegExp("\\\\\\$receiver\\\\\\$", "g"), "((?:x|[^x])*)"), $arguments, argumentsExpr, expr, method, receiver);
     },
     TypeErrorDecoder_provokeCallErrorOn: function(expression) {
       return function($expr$) {
-        var $argumentsExpr$ = '$arguments$';
+        var $argumentsExpr$ = "$arguments$";
         try {
           $expr$.$method$($argumentsExpr$);
         } catch (e) {
@@ -477,9 +467,6 @@
         }
       }(expression);
     },
-    NullError$: function(_message, match) {
-      return new H.NullError(_message, match == null ? null : match.method);
-    },
     JsNoSuchMethodError$: function(_message, match) {
       var t1 = match == null,
         t2 = t1 ? null : match.method;
@@ -489,7 +476,7 @@
       if (ex == null)
         return new H.NullThrownFromJavaScriptException(ex);
       if (ex instanceof H.ExceptionAndStackTrace)
-        return H.saveStackTrace(ex, ex.dartException);
+        return H.saveStackTrace(ex, type$.Object._as(ex.dartException));
       if (typeof ex !== "object")
         return ex;
       if ("dartException" in ex)
@@ -503,7 +490,7 @@
       return error;
     },
     _unwrapNonDartException: function(ex) {
-      var message, number, ieErrorCode, nsme, notClosure, nullCall, nullLiteralCall, undefCall, undefLiteralCall, nullProperty, undefProperty, undefLiteralProperty, match, t1, _null = null;
+      var message, number, ieErrorCode, t1, nsme, notClosure, nullCall, nullLiteralCall, undefCall, undefLiteralCall, nullProperty, undefProperty, undefLiteralProperty, match, _null = null;
       if (!("message" in ex))
         return ex;
       message = ex.message;
@@ -516,7 +503,8 @@
               return H.saveStackTrace(ex, H.JsNoSuchMethodError$(H.S(message) + " (Error " + ieErrorCode + ")", _null));
             case 445:
             case 5007:
-              return H.saveStackTrace(ex, H.NullError$(H.S(message) + " (Error " + ieErrorCode + ")", _null));
+              t1 = H.S(message) + " (Error " + ieErrorCode + ")";
+              return H.saveStackTrace(ex, new H.NullError(t1, _null));
           }
       }
       if (ex instanceof TypeError) {
@@ -532,12 +520,12 @@
         undefLiteralProperty = $.$get$TypeErrorDecoder_undefinedLiteralPropertyPattern();
         match = nsme.matchTypeError$1(message);
         if (match != null)
-          return H.saveStackTrace(ex, H.JsNoSuchMethodError$(H._asStringS(message), match));
+          return H.saveStackTrace(ex, H.JsNoSuchMethodError$(H._asString(message), match));
         else {
           match = notClosure.matchTypeError$1(message);
           if (match != null) {
             match.method = "call";
-            return H.saveStackTrace(ex, H.JsNoSuchMethodError$(H._asStringS(message), match));
+            return H.saveStackTrace(ex, H.JsNoSuchMethodError$(H._asString(message), match));
           } else {
             match = nullCall.matchTypeError$1(message);
             if (match == null) {
@@ -569,8 +557,10 @@
                 t1 = true;
             } else
               t1 = true;
-            if (t1)
-              return H.saveStackTrace(ex, H.NullError$(H._asStringS(message), match));
+            if (t1) {
+              H._asString(message);
+              return H.saveStackTrace(ex, new H.NullError(message, match == null ? _null : match.method));
+            }
           }
         }
         return H.saveStackTrace(ex, new H.UnknownJsTypeError(typeof message == "string" ? message : ""));
@@ -615,7 +605,7 @@
     },
     invokeClosure: function(closure, numberOfArguments, arg1, arg2, arg3, arg4) {
       type$.Function._as(closure);
-      switch (H._asIntS(numberOfArguments)) {
+      switch (H._asInt(numberOfArguments)) {
         case 0:
           return closure.call$0();
         case 1:
@@ -671,6 +661,7 @@
         $prototype.$static_name = propertyName;
         trampoline = $function;
       }
+      type$.Object._as(reflectionInfo);
       $prototype.$signature = H.Closure__computeSignatureFunctionNewRti(reflectionInfo, isStatic, isIntercepted);
       $prototype[callName] = trampoline;
       for (applyTrampoline = trampoline, i = 1; i < functions.length; ++i) {
@@ -774,7 +765,9 @@
           return t1.$add();
         $.Closure_functionCounter = t1 + 1;
         selfName = "self" + t1;
-        return new Function("return function(){var " + selfName + " = this." + H.S(H.BoundClosure_selfFieldName()) + ";return " + selfName + "." + H.S(stubName) + "();}")();
+        t1 = "return function(){var " + selfName + " = this.";
+        t2 = $.BoundClosure_selfFieldNameCache;
+        return new Function(t1 + (t2 == null ? $.BoundClosure_selfFieldNameCache = H.BoundClosure_computeFieldNamed("self") : t2) + ";return " + selfName + "." + H.S(stubName) + "();}")();
       }
       $arguments = "abcdefghijklmnopqrstuvwxyz".split("").splice(0, arity).join(",");
       t1 = $.Closure_functionCounter;
@@ -782,7 +775,9 @@
         return t1.$add();
       $.Closure_functionCounter = t1 + 1;
       $arguments += t1;
-      return new Function("return function(" + $arguments + "){return this." + H.S(H.BoundClosure_selfFieldName()) + "." + H.S(stubName) + "(" + $arguments + ");}")();
+      t1 = "return function(" + $arguments + "){return this.";
+      t2 = $.BoundClosure_selfFieldNameCache;
+      return new Function(t1 + (t2 == null ? $.BoundClosure_selfFieldNameCache = H.BoundClosure_computeFieldNamed("self") : t2) + "." + H.S(stubName) + "(" + $arguments + ");}")();
     },
     Closure_cspForwardInterceptedCall: function(arity, isSuperCall, $name, $function) {
       var getSelf = H.BoundClosure_selfOf,
@@ -837,9 +832,11 @@
       }
     },
     Closure_forwardInterceptedCallTo: function(receiver, $function) {
-      var stubName, arity, lookedUpFunction, t1, t2, $arguments,
-        selfField = H.BoundClosure_selfFieldName(),
-        receiverField = $.BoundClosure_receiverFieldNameCache;
+      var receiverField, stubName, arity, lookedUpFunction, t1, t2, $arguments,
+        selfField = $.BoundClosure_selfFieldNameCache;
+      if (selfField == null)
+        selfField = $.BoundClosure_selfFieldNameCache = H.BoundClosure_computeFieldNamed("self");
+      receiverField = $.BoundClosure_receiverFieldNameCache;
       if (receiverField == null)
         receiverField = $.BoundClosure_receiverFieldNameCache = H.BoundClosure_computeFieldNamed("receiver");
       stubName = $function.$stubName;
@@ -850,7 +847,7 @@
       if (t2)
         return H.Closure_cspForwardInterceptedCall(arity, !t1, stubName, $function);
       if (arity === 1) {
-        t1 = "return function(){return this." + H.S(selfField) + "." + H.S(stubName) + "(this." + receiverField + ");";
+        t1 = "return function(){return this." + selfField + "." + H.S(stubName) + "(this." + receiverField + ");";
         t2 = $.Closure_functionCounter;
         if (typeof t2 !== "number")
           return t2.$add();
@@ -858,7 +855,7 @@
         return new Function(t1 + t2 + "}")();
       }
       $arguments = "abcdefghijklmnopqrstuvwxyz".split("").splice(0, arity - 1).join(",");
-      t1 = "return function(" + $arguments + "){return this." + H.S(selfField) + "." + H.S(stubName) + "(this." + receiverField + ", " + $arguments + ");";
+      t1 = "return function(" + $arguments + "){return this." + selfField + "." + H.S(stubName) + "(this." + receiverField + ", " + $arguments + ");";
       t2 = $.Closure_functionCounter;
       if (typeof t2 !== "number")
         return t2.$add();
@@ -880,10 +877,6 @@
     BoundClosure_receiverOf: function(closure) {
       return closure._receiver;
     },
-    BoundClosure_selfFieldName: function() {
-      var t1 = $.BoundClosure_selfFieldNameCache;
-      return t1 == null ? $.BoundClosure_selfFieldNameCache = H.BoundClosure_computeFieldNamed("self") : t1;
-    },
     BoundClosure_computeFieldNamed: function(fieldName) {
       var t1, i, $name,
         template = new H.BoundClosure("self", "target", "receiver", "name"),
@@ -917,7 +910,7 @@
     },
     lookupAndCacheInterceptor: function(obj) {
       var interceptor, interceptorClass, altTag, mark, t1,
-        tag = H._asStringS($.getTagFunction.call$1(obj)),
+        tag = H._asString($.getTagFunction.call$1(obj)),
         record = $.dispatchRecordsForInstanceTags[tag];
       if (record != null) {
         Object.defineProperty(obj, init.dispatchPropertyName, {value: record, enumerable: false, writable: true, configurable: true});
@@ -1373,7 +1366,7 @@
     },
     getTypeFromTypesTable: function(index) {
       var table, type, rti;
-      H._asIntS(index);
+      H._asInt(index);
       table = init.types;
       type = table[index];
       if (typeof type == "string") {
@@ -1383,27 +1376,13 @@
       }
       return type;
     },
-    createRuntimeType: function(rti) {
-      var recipe, starErasedRecipe, starErasedRti,
-        type = rti._cachedRuntimeType;
-      if (type != null)
-        return type;
-      recipe = rti._canonicalRecipe;
-      starErasedRecipe = recipe.replace(/\*/g, "");
-      if (starErasedRecipe === recipe)
-        return rti._cachedRuntimeType = new H._Type(rti);
-      starErasedRti = H._Universe_eval(init.typeUniverse, starErasedRecipe, true);
-      type = starErasedRti._cachedRuntimeType;
-      return rti._cachedRuntimeType = type == null ? starErasedRti._cachedRuntimeType = new H._Type(starErasedRti) : type;
-    },
     _installSpecializedIsTest: function(object) {
-      var unstarred, isFn, testRti = this,
-        t1 = type$.Object;
-      if (testRti === t1)
+      var t1, unstarred, isFn, testRti = this;
+      if (testRti === type$.Object)
         return H._finishIsFn(testRti, object, H._isObject);
       if (!H.isStrongTopType(testRti))
         if (!(testRti === type$.legacy_Object))
-          t1 = testRti === t1;
+          t1 = false;
         else
           t1 = true;
       else
@@ -1437,10 +1416,11 @@
       return testRti._is(object);
     },
     _installSpecializedAsCheck: function(object) {
-      var t1, asFn, testRti = this;
+      var t1, testRti = this,
+        asFn = H._generalAsCheckImplementation;
       if (!H.isStrongTopType(testRti))
         if (!(testRti === type$.legacy_Object))
-          t1 = testRti === type$.Object;
+          t1 = false;
         else
           t1 = true;
       else
@@ -1449,8 +1429,11 @@
         asFn = H._asTop;
       else if (testRti === type$.Object)
         asFn = H._asObject;
-      else
-        asFn = H._generalNullableAsCheckImplementation;
+      else {
+        t1 = H.isNullable(testRti);
+        if (t1)
+          asFn = H._generalNullableAsCheckImplementation;
+      }
       testRti._as = asFn;
       return testRti._as(object);
     },
@@ -1493,10 +1476,12 @@
       return !!J.getInterceptor$(object)[tag];
     },
     _generalAsCheckImplementation: function(object) {
-      var testRti = this;
-      if (object == null)
-        return object;
-      else if (testRti._is(object))
+      var t1, testRti = this;
+      if (object == null) {
+        t1 = H.isNullable(testRti);
+        if (t1)
+          return object;
+      } else if (testRti._is(object))
         return object;
       H._failedAsCheck(object, testRti);
     },
@@ -1514,7 +1499,7 @@
     _Error_compose: function(object, objectRti, checkedTypeDescription) {
       var objectDescription = P.Error_safeToString(object),
         objectTypeDescription = H._rtiToString(objectRti == null ? H.instanceType(object) : objectRti, null);
-      return objectDescription + ": type '" + H.S(objectTypeDescription) + "' is not a subtype of type '" + H.S(checkedTypeDescription) + "'";
+      return objectDescription + ": type '" + objectTypeDescription + "' is not a subtype of type '" + checkedTypeDescription + "'";
     },
     _TypeError$fromMessage: function(message) {
       return new H._TypeError("TypeError: " + message);
@@ -1526,7 +1511,9 @@
       return object != null;
     },
     _asObject: function(object) {
-      return object;
+      if (object != null)
+        return object;
+      throw H.wrapException(H._TypeError__TypeError$forType(object, "Object"));
     },
     _isTop: function(object) {
       return true;
@@ -1650,11 +1637,11 @@
     _rtiArrayToString: function(array, genericContext) {
       var s, sep, i;
       for (s = "", sep = "", i = 0; i < array.length; ++i, sep = ", ")
-        s += C.JSString_methods.$add(sep, H._rtiToString(array[i], genericContext));
+        s += sep + H._rtiToString(array[i], genericContext);
       return s;
     },
     _functionRtiToString: function(functionType, genericContext, bounds) {
-      var boundsLength, outerContextLength, offset, i, t1, t2, t3, typeParametersText, typeSep, t4, t5, boundRti, kind, parameters, requiredPositional, requiredPositionalLength, optionalPositional, optionalPositionalLength, named, namedLength, returnTypeText, argumentsText, sep, _s2_ = ", ";
+      var boundsLength, outerContextLength, offset, i, t1, t2, typeParametersText, typeSep, t3, t4, boundRti, kind, parameters, requiredPositional, requiredPositionalLength, optionalPositional, optionalPositionalLength, named, namedLength, returnTypeText, argumentsText, sep, _s2_ = ", ";
       if (bounds != null) {
         boundsLength = bounds.length;
         if (genericContext == null) {
@@ -1665,24 +1652,24 @@
         offset = genericContext.length;
         for (i = boundsLength; i > 0; --i)
           C.JSArray_methods.add$1(genericContext, "T" + (offset + i));
-        for (t1 = type$.nullable_Object, t2 = type$.legacy_Object, t3 = type$.Object, typeParametersText = "<", typeSep = "", i = 0; i < boundsLength; ++i, typeSep = _s2_) {
+        for (t1 = type$.nullable_Object, t2 = type$.legacy_Object, typeParametersText = "<", typeSep = "", i = 0; i < boundsLength; ++i, typeSep = _s2_) {
           typeParametersText += typeSep;
-          t4 = genericContext.length;
-          t5 = t4 - 1 - i;
-          if (t5 < 0)
-            return H.ioore(genericContext, t5);
-          typeParametersText = C.JSString_methods.$add(typeParametersText, genericContext[t5]);
+          t3 = genericContext.length;
+          t4 = t3 - 1 - i;
+          if (t4 < 0)
+            return H.ioore(genericContext, t4);
+          typeParametersText = C.JSString_methods.$add(typeParametersText, genericContext[t4]);
           boundRti = bounds[i];
           kind = boundRti._kind;
           if (!(kind === 2 || kind === 3 || kind === 4 || kind === 5 || boundRti === t1))
             if (!(boundRti === t2))
-              t4 = boundRti === t3;
+              t3 = false;
             else
-              t4 = true;
+              t3 = true;
           else
-            t4 = true;
-          if (!t4)
-            typeParametersText += C.JSString_methods.$add(" extends ", H._rtiToString(boundRti, genericContext));
+            t3 = true;
+          if (!t3)
+            typeParametersText += " extends " + H._rtiToString(boundRti, genericContext);
         }
         typeParametersText += ">";
       } else {
@@ -1699,11 +1686,11 @@
       namedLength = named.length;
       returnTypeText = H._rtiToString(t1, genericContext);
       for (argumentsText = "", sep = "", i = 0; i < requiredPositionalLength; ++i, sep = _s2_)
-        argumentsText += C.JSString_methods.$add(sep, H._rtiToString(requiredPositional[i], genericContext));
+        argumentsText += sep + H._rtiToString(requiredPositional[i], genericContext);
       if (optionalPositionalLength > 0) {
         argumentsText += sep + "[";
         for (sep = "", i = 0; i < optionalPositionalLength; ++i, sep = _s2_)
-          argumentsText += C.JSString_methods.$add(sep, H._rtiToString(optionalPositional[i], genericContext));
+          argumentsText += sep + H._rtiToString(optionalPositional[i], genericContext);
         argumentsText += "]";
       }
       if (namedLength > 0) {
@@ -1712,7 +1699,7 @@
           argumentsText += sep;
           if (named[i + 1])
             argumentsText += "required ";
-          argumentsText += J.$add$ansx(H._rtiToString(named[i + 2], genericContext), " ") + named[i];
+          argumentsText += H._rtiToString(named[i + 2], genericContext) + " " + named[i];
         }
         argumentsText += "}";
       }
@@ -1720,7 +1707,7 @@
         genericContext.toString;
         genericContext.length = outerContextLength;
       }
-      return typeParametersText + "(" + argumentsText + ") => " + H.S(returnTypeText);
+      return typeParametersText + "(" + argumentsText + ") => " + returnTypeText;
     },
     _rtiToString: function(rti, genericContext) {
       var s, questionArgument, argumentKind, $name, $arguments, t1, t2,
@@ -1743,10 +1730,10 @@
         questionArgument = rti._primary;
         s = H._rtiToString(questionArgument, genericContext);
         argumentKind = questionArgument._kind;
-        return J.$add$ansx(argumentKind === 11 || argumentKind === 12 ? C.JSString_methods.$add("(", s) + ")" : s, "?");
+        return (argumentKind === 11 || argumentKind === 12 ? "(" + s + ")" : s) + "?";
       }
       if (kind === 8)
-        return "FutureOr<" + H.S(H._rtiToString(rti._primary, genericContext)) + ">";
+        return "FutureOr<" + H._rtiToString(rti._primary, genericContext) + ">";
       if (kind === 9) {
         $name = H._unminifyOrTag(rti._primary);
         $arguments = rti._rest;
@@ -1757,7 +1744,6 @@
       if (kind === 12)
         return H._functionRtiToString(rti._primary, genericContext, rti._rest);
       if (kind === 13) {
-        genericContext.toString;
         t1 = rti._primary;
         t2 = genericContext.length;
         t1 = t2 - 1 - t1;
@@ -1781,8 +1767,8 @@
     },
     _Universe_findErasedType: function(universe, cls) {
       var $length, erased, $arguments, i, $interface,
-        metadata = universe.eT,
-        probe = metadata[cls];
+        t1 = universe.eT,
+        probe = t1[cls];
       if (probe == null)
         return H._Universe_eval(universe, cls, false);
       else if (typeof probe == "number") {
@@ -1792,7 +1778,7 @@
         for (i = 0; i < $length; ++i)
           $arguments.push(erased);
         $interface = H._Universe__lookupInterfaceRti(universe, cls, $arguments);
-        metadata[cls] = $interface;
+        t1[cls] = $interface;
         return $interface;
       } else
         return probe;
@@ -1805,12 +1791,12 @@
     },
     _Universe_eval: function(universe, recipe, normalize) {
       var rti,
-        cache = universe.eC,
-        probe = cache.get(recipe);
+        t1 = universe.eC,
+        probe = t1.get(recipe);
       if (probe != null)
         return probe;
       rti = H._Parser_parse(H._Parser_create(universe, null, recipe, normalize));
-      cache.set(recipe, rti);
+      t1.set(recipe, rti);
       return rti;
     },
     _Universe_evalInEnvironment: function(universe, environment, recipe) {
@@ -1940,7 +1926,7 @@
         t1 = baseType._kind;
         if (!H.isStrongTopType(baseType))
           if (!(baseType === type$.legacy_Object))
-            t2 = baseType === type$.Object;
+            t2 = false;
           else
             t2 = true;
         else
@@ -2103,142 +2089,142 @@
       return {u: universe, e: environment, r: recipe, s: [], p: 0, n: normalize};
     },
     _Parser_parse: function(parser) {
-      var t1, i, ch, universe, array, head, base, u, parameters, optionalPositional, named, item,
+      var t2, i, ch, t3, array, head, base, parameters, optionalPositional, named, item,
         source = parser.r,
-        stack = parser.s;
-      for (t1 = source.length, i = 0; i < t1;) {
+        t1 = parser.s;
+      for (t2 = source.length, i = 0; i < t2;) {
         ch = source.charCodeAt(i);
         if (ch >= 48 && ch <= 57)
-          i = H._Parser_handleDigit(i + 1, ch, source, stack);
+          i = H._Parser_handleDigit(i + 1, ch, source, t1);
         else if ((((ch | 32) >>> 0) - 97 & 65535) < 26 || ch === 95 || ch === 36)
-          i = H._Parser_handleIdentifier(parser, i, source, stack, false);
+          i = H._Parser_handleIdentifier(parser, i, source, t1, false);
         else if (ch === 46)
-          i = H._Parser_handleIdentifier(parser, i, source, stack, true);
+          i = H._Parser_handleIdentifier(parser, i, source, t1, true);
         else {
           ++i;
           switch (ch) {
             case 44:
               break;
             case 58:
-              stack.push(false);
+              t1.push(false);
               break;
             case 33:
-              stack.push(true);
+              t1.push(true);
               break;
             case 59:
-              stack.push(H._Parser_toType(parser.u, parser.e, stack.pop()));
+              t1.push(H._Parser_toType(parser.u, parser.e, t1.pop()));
               break;
             case 94:
-              stack.push(H._Universe__lookupGenericFunctionParameterRti(parser.u, stack.pop()));
+              t1.push(H._Universe__lookupGenericFunctionParameterRti(parser.u, t1.pop()));
               break;
             case 35:
-              stack.push(H._Universe__lookupTerminalRti(parser.u, 5, "#"));
+              t1.push(H._Universe__lookupTerminalRti(parser.u, 5, "#"));
               break;
             case 64:
-              stack.push(H._Universe__lookupTerminalRti(parser.u, 2, "@"));
+              t1.push(H._Universe__lookupTerminalRti(parser.u, 2, "@"));
               break;
             case 126:
-              stack.push(H._Universe__lookupTerminalRti(parser.u, 3, "~"));
+              t1.push(H._Universe__lookupTerminalRti(parser.u, 3, "~"));
               break;
             case 60:
-              stack.push(parser.p);
-              parser.p = stack.length;
+              t1.push(parser.p);
+              parser.p = t1.length;
               break;
             case 62:
-              universe = parser.u;
-              array = stack.splice(parser.p);
+              t3 = parser.u;
+              array = t1.splice(parser.p);
               H._Parser_toTypes(parser.u, parser.e, array);
-              parser.p = stack.pop();
-              head = stack.pop();
+              parser.p = t1.pop();
+              head = t1.pop();
               if (typeof head == "string")
-                stack.push(H._Universe__lookupInterfaceRti(universe, head, array));
+                t1.push(H._Universe__lookupInterfaceRti(t3, head, array));
               else {
-                base = H._Parser_toType(universe, parser.e, head);
+                base = H._Parser_toType(t3, parser.e, head);
                 switch (base._kind) {
                   case 11:
-                    stack.push(H._Universe__lookupGenericFunctionRti(universe, base, array, parser.n));
+                    t1.push(H._Universe__lookupGenericFunctionRti(t3, base, array, parser.n));
                     break;
                   default:
-                    stack.push(H._Universe__lookupBindingRti(universe, base, array));
+                    t1.push(H._Universe__lookupBindingRti(t3, base, array));
                     break;
                 }
               }
               break;
             case 38:
-              H._Parser_handleExtendedOperations(parser, stack);
+              H._Parser_handleExtendedOperations(parser, t1);
               break;
             case 42:
-              u = parser.u;
-              stack.push(H._Universe__lookupStarRti(u, H._Parser_toType(u, parser.e, stack.pop()), parser.n));
+              t3 = parser.u;
+              t1.push(H._Universe__lookupStarRti(t3, H._Parser_toType(t3, parser.e, t1.pop()), parser.n));
               break;
             case 63:
-              u = parser.u;
-              stack.push(H._Universe__lookupQuestionRti(u, H._Parser_toType(u, parser.e, stack.pop()), parser.n));
+              t3 = parser.u;
+              t1.push(H._Universe__lookupQuestionRti(t3, H._Parser_toType(t3, parser.e, t1.pop()), parser.n));
               break;
             case 47:
-              u = parser.u;
-              stack.push(H._Universe__lookupFutureOrRti(u, H._Parser_toType(u, parser.e, stack.pop()), parser.n));
+              t3 = parser.u;
+              t1.push(H._Universe__lookupFutureOrRti(t3, H._Parser_toType(t3, parser.e, t1.pop()), parser.n));
               break;
             case 40:
-              stack.push(parser.p);
-              parser.p = stack.length;
+              t1.push(parser.p);
+              parser.p = t1.length;
               break;
             case 41:
-              universe = parser.u;
+              t3 = parser.u;
               parameters = new H._FunctionParameters();
-              optionalPositional = universe.sEA;
-              named = universe.sEA;
-              head = stack.pop();
+              optionalPositional = t3.sEA;
+              named = t3.sEA;
+              head = t1.pop();
               if (typeof head == "number")
                 switch (head) {
                   case -1:
-                    optionalPositional = stack.pop();
+                    optionalPositional = t1.pop();
                     break;
                   case -2:
-                    named = stack.pop();
+                    named = t1.pop();
                     break;
                   default:
-                    stack.push(head);
+                    t1.push(head);
                     break;
                 }
               else
-                stack.push(head);
-              array = stack.splice(parser.p);
+                t1.push(head);
+              array = t1.splice(parser.p);
               H._Parser_toTypes(parser.u, parser.e, array);
-              parser.p = stack.pop();
+              parser.p = t1.pop();
               parameters._requiredPositional = array;
               parameters._optionalPositional = optionalPositional;
               parameters._named = named;
-              stack.push(H._Universe__lookupFunctionRti(universe, H._Parser_toType(universe, parser.e, stack.pop()), parameters));
+              t1.push(H._Universe__lookupFunctionRti(t3, H._Parser_toType(t3, parser.e, t1.pop()), parameters));
               break;
             case 91:
-              stack.push(parser.p);
-              parser.p = stack.length;
+              t1.push(parser.p);
+              parser.p = t1.length;
               break;
             case 93:
-              array = stack.splice(parser.p);
+              array = t1.splice(parser.p);
               H._Parser_toTypes(parser.u, parser.e, array);
-              parser.p = stack.pop();
-              stack.push(array);
-              stack.push(-1);
+              parser.p = t1.pop();
+              t1.push(array);
+              t1.push(-1);
               break;
             case 123:
-              stack.push(parser.p);
-              parser.p = stack.length;
+              t1.push(parser.p);
+              parser.p = t1.length;
               break;
             case 125:
-              array = stack.splice(parser.p);
+              array = t1.splice(parser.p);
               H._Parser_toTypesNamed(parser.u, parser.e, array);
-              parser.p = stack.pop();
-              stack.push(array);
-              stack.push(-2);
+              parser.p = t1.pop();
+              t1.push(array);
+              t1.push(-2);
               break;
             default:
               throw "Bad character " + ch;
           }
         }
       }
-      item = stack.pop();
+      item = t1.pop();
       return H._Parser_toType(parser.u, parser.e, item);
     },
     _Parser_handleDigit: function(i, digit, source, stack) {
@@ -2345,7 +2331,7 @@
         return true;
       if (!H.isStrongTopType(t))
         if (!(t === type$.legacy_Object))
-          t1 = t === type$.Object;
+          t1 = false;
         else
           t1 = true;
       else
@@ -2358,7 +2344,7 @@
       if (H.isStrongTopType(s))
         return false;
       if (s._kind !== 1)
-        t1 = s === type$.Null || s === type$.JSNull;
+        t1 = false;
       else
         t1 = true;
       if (t1)
@@ -2368,10 +2354,23 @@
         if (H._isSubtype(universe, sEnv[s._primary], sEnv, t, tEnv))
           return true;
       tKind = t._kind;
+      t1 = s === type$.Null || s === type$.JSNull;
+      if (t1) {
+        if (tKind === 8)
+          return H._isSubtype(universe, s, sEnv, t._primary, tEnv);
+        return t === type$.Null || t === type$.JSNull || tKind === 7 || tKind === 6;
+      }
+      if (t === type$.Object) {
+        if (sKind === 8)
+          return H._isSubtype(universe, s._primary, sEnv, t, tEnv);
+        if (sKind === 6)
+          return H._isSubtype(universe, s._primary, sEnv, t, tEnv);
+        return sKind !== 7;
+      }
       if (sKind === 6)
         return H._isSubtype(universe, s._primary, sEnv, t, tEnv);
       if (tKind === 6) {
-        t1 = t._primary;
+        t1 = H.Rti__getQuestionFromStar(universe, t);
         return H._isSubtype(universe, s, sEnv, t1, tEnv);
       }
       if (sKind === 8) {
@@ -2380,8 +2379,8 @@
         return H._isSubtype(universe, H.Rti__getFutureFromFutureOr(universe, s), sEnv, t, tEnv);
       }
       if (sKind === 7) {
-        t1 = H._isSubtype(universe, s._primary, sEnv, t, tEnv);
-        return t1;
+        t1 = H._isSubtype(universe, type$.Null, sEnv, t, tEnv);
+        return t1 && H._isSubtype(universe, s._primary, sEnv, t, tEnv);
       }
       if (tKind === 8) {
         if (H._isSubtype(universe, s, sEnv, t._primary, tEnv))
@@ -2389,8 +2388,8 @@
         return H._isSubtype(universe, s, sEnv, H.Rti__getFutureFromFutureOr(universe, t), tEnv);
       }
       if (tKind === 7) {
-        t1 = H._isSubtype(universe, s, sEnv, t._primary, tEnv);
-        return t1;
+        t1 = H._isSubtype(universe, s, sEnv, type$.Null, tEnv);
+        return t1 || H._isSubtype(universe, s, sEnv, t._primary, tEnv);
       }
       if (leftTypeVariable)
         return false;
@@ -2432,7 +2431,7 @@
       return false;
     },
     _isFunctionSubtype: function(universe, s, sEnv, t, tEnv) {
-      var sParameters, tParameters, sRequiredPositional, tRequiredPositional, sRequiredPositionalLength, tRequiredPositionalLength, requiredPositionalDelta, sOptionalPositional, tOptionalPositional, sOptionalPositionalLength, tOptionalPositionalLength, i, t1, sNamed, tNamed, sNamedLength, tNamedLength, sIndex, tIndex, tName, sName;
+      var sParameters, tParameters, sRequiredPositional, tRequiredPositional, sRequiredPositionalLength, tRequiredPositionalLength, requiredPositionalDelta, sOptionalPositional, tOptionalPositional, sOptionalPositionalLength, tOptionalPositionalLength, i, t1, sNamed, tNamed, sNamedLength, tNamedLength, sIndex, tIndex, tName, sName, sIsRequired;
       if (!H._isSubtype(universe, s._primary, sEnv, t._primary, tEnv))
         return false;
       sParameters = s._rest;
@@ -2478,14 +2477,26 @@
           sIndex += 3;
           if (tName < sName)
             return false;
-          if (sName < tName)
+          sIsRequired = sNamed[sIndex - 2];
+          if (sName < tName) {
+            if (sIsRequired)
+              return false;
             continue;
+          }
+          t1 = tNamed[tIndex + 1];
+          if (sIsRequired && !t1)
+            return false;
           t1 = sNamed[sIndex - 1];
           if (!H._isSubtype(universe, tNamed[tIndex + 2], tEnv, t1, sEnv))
             return false;
           break;
         }
       }
+      for (; sIndex < sNamedLength;) {
+        if (sNamed[sIndex + 1])
+          return false;
+        sIndex += 3;
+      }
       return true;
     },
     _isInterfaceSubtype: function(universe, s, sEnv, t, tEnv) {
@@ -2541,7 +2552,7 @@
       var t1;
       if (!H.isStrongTopType(t))
         if (!(t === type$.legacy_Object))
-          t1 = t === type$.Object;
+          t1 = false;
         else
           t1 = true;
       else
@@ -2572,9 +2583,6 @@
     _FunctionParameters: function _FunctionParameters() {
       this._named = this._optionalPositional = this._requiredPositional = null;
     },
-    _Type: function _Type(t0) {
-      this._rti = t0;
-    },
     _Error: function _Error() {
     },
     _TypeError: function _TypeError(t0) {
@@ -2589,7 +2597,7 @@
       return {i: interceptor, p: proto, e: extension, x: indexability};
     },
     getNativeInterceptor: function(object) {
-      var proto, objectProto, $constructor, interceptor,
+      var proto, objectProto, $constructor, interceptor, t1,
         record = object[init.dispatchPropertyName];
       if (record == null)
         if ($.initNativeDispatchFlag == null) {
@@ -2609,7 +2617,14 @@
           throw H.wrapException(P.UnimplementedError$("Return interceptor for " + H.S(proto(object, record))));
       }
       $constructor = object.constructor;
-      interceptor = $constructor == null ? null : $constructor[J.JS_INTEROP_INTERCEPTOR_TAG()];
+      if ($constructor == null)
+        interceptor = null;
+      else {
+        t1 = $._JS_INTEROP_INTERCEPTOR_TAG;
+        if (t1 == null)
+          t1 = $._JS_INTEROP_INTERCEPTOR_TAG = init.getIsolateTag("_$dart_js");
+        interceptor = $constructor[t1];
+      }
       if (interceptor != null)
         return interceptor;
       interceptor = H.lookupAndCacheInterceptor(object);
@@ -2623,15 +2638,14 @@
       if (proto === Object.prototype)
         return C.PlainJavaScriptObject_methods;
       if (typeof $constructor == "function") {
-        Object.defineProperty($constructor, J.JS_INTEROP_INTERCEPTOR_TAG(), {value: C.UnknownJavaScriptObject_methods, enumerable: false, writable: true, configurable: true});
+        t1 = $._JS_INTEROP_INTERCEPTOR_TAG;
+        if (t1 == null)
+          t1 = $._JS_INTEROP_INTERCEPTOR_TAG = init.getIsolateTag("_$dart_js");
+        Object.defineProperty($constructor, t1, {value: C.UnknownJavaScriptObject_methods, enumerable: false, writable: true, configurable: true});
         return C.UnknownJavaScriptObject_methods;
       }
       return C.UnknownJavaScriptObject_methods;
     },
-    JS_INTEROP_INTERCEPTOR_TAG: function() {
-      var t1 = $._JS_INTEROP_INTERCEPTOR_TAG;
-      return t1 == null ? $._JS_INTEROP_INTERCEPTOR_TAG = init.getIsolateTag("_$dart_js") : t1;
-    },
     JSArray_markFixedList: function(list, $T) {
       list.fixed$length = Array;
       return list;
@@ -2640,7 +2654,7 @@
       if (typeof receiver == "number") {
         if (Math.floor(receiver) == receiver)
           return J.JSInt.prototype;
-        return J.JSDouble.prototype;
+        return J.JSNumNotInt.prototype;
       }
       if (typeof receiver == "string")
         return J.JSString.prototype;
@@ -2659,24 +2673,6 @@
         return receiver;
       return J.getNativeInterceptor(receiver);
     },
-    getInterceptor$ansx: function(receiver) {
-      if (typeof receiver == "number")
-        return J.JSNumber.prototype;
-      if (typeof receiver == "string")
-        return J.JSString.prototype;
-      if (receiver == null)
-        return receiver;
-      if (receiver.constructor == Array)
-        return J.JSArray.prototype;
-      if (typeof receiver != "object") {
-        if (typeof receiver == "function")
-          return J.JavaScriptFunction.prototype;
-        return receiver;
-      }
-      if (receiver instanceof P.Object)
-        return receiver;
-      return J.getNativeInterceptor(receiver);
-    },
     getInterceptor$asx: function(receiver) {
       if (typeof receiver == "string")
         return J.JSString.prototype;
@@ -2707,15 +2703,6 @@
         return receiver;
       return J.getNativeInterceptor(receiver);
     },
-    getInterceptor$s: function(receiver) {
-      if (typeof receiver == "string")
-        return J.JSString.prototype;
-      if (receiver == null)
-        return receiver;
-      if (!(receiver instanceof P.Object))
-        return J.UnknownJavaScriptObject.prototype;
-      return receiver;
-    },
     getInterceptor$x: function(receiver) {
       if (receiver == null)
         return receiver;
@@ -2740,11 +2727,6 @@
     get$onClick$x: function(receiver) {
       return J.getInterceptor$x(receiver).get$onClick(receiver);
     },
-    $add$ansx: function(receiver, a0) {
-      if (typeof receiver == "number" && typeof a0 == "number")
-        return receiver + a0;
-      return J.getInterceptor$ansx(receiver).$add(receiver, a0);
-    },
     $eq$: function(receiver, a0) {
       if (receiver == null)
         return a0 == null;
@@ -2764,9 +2746,6 @@
     forEach$1$ax: function(receiver, a0) {
       return J.getInterceptor$ax(receiver).forEach$1(receiver, a0);
     },
-    startsWith$1$s: function(receiver, a0) {
-      return J.getInterceptor$s(receiver).startsWith$1(receiver, a0);
-    },
     toString$0$: function(receiver) {
       return J.getInterceptor$(receiver).toString$0(receiver);
     },
@@ -2802,7 +2781,7 @@
     },
     JSInt: function JSInt() {
     },
-    JSDouble: function JSDouble() {
+    JSNumNotInt: function JSNumNotInt() {
     },
     JSString: function JSString() {
     }
@@ -2890,21 +2869,18 @@
       }($function, 1);
       return $.Zone__current.registerBinaryCallback$3$1(new P._wrapJsFunctionForAsync_closure($protected), type$.void, type$.int, type$.dynamic);
     },
-    Future_Future$value: function(value, $T) {
-      var t1 = new P._Future($.Zone__current, $T._eval$1("_Future<0>"));
-      t1._asyncComplete$1(value);
-      return t1;
+    AsyncError$: function(error, stackTrace) {
+      var t1 = H.checkNotNullable(error, "error", type$.Object);
+      return new P.AsyncError(t1, stackTrace == null ? P.AsyncError_defaultStackTrace(error) : stackTrace);
     },
-    _Future__chainForeignFuture: function(source, target) {
-      var e, s, exception;
-      target._state = 1;
-      try {
-        source.then$1$2$onError(new P._Future__chainForeignFuture_closure(target), new P._Future__chainForeignFuture_closure0(target), type$.Null);
-      } catch (exception) {
-        e = H.unwrapException(exception);
-        s = H.getTraceFromException(exception);
-        P.scheduleMicrotask(new P._Future__chainForeignFuture_closure1(target, e, s));
+    AsyncError_defaultStackTrace: function(error) {
+      var stackTrace;
+      if (type$.Error._is(error)) {
+        stackTrace = error.get$stackTrace();
+        if (stackTrace != null)
+          return stackTrace;
       }
+      return C.C__StringStackTrace;
     },
     _Future__chainCoreFuture: function(source, target) {
       var t1, t2, listeners;
@@ -2982,6 +2958,12 @@
             $.Zone__current = oldZone;
           t1 = _box_0.listenerValueOrError;
           if (t4._is(t1)) {
+            t5 = _box_0.listener.$ti;
+            t5 = t5._eval$1("Future<2>")._is(t1) || !t5._rest[1]._is(t1);
+          } else
+            t5 = false;
+          if (t5) {
+            t4._as(t1);
             result = _box_0.listener.result;
             if (t1._state >= 4) {
               current = t3._as(result._resultOrListeners);
@@ -3022,7 +3004,7 @@
       t1 = type$.dynamic_Function_Object;
       if (t1._is(errorHandler))
         return t1._as(errorHandler);
-      throw H.wrapException(P.ArgumentError$value(errorHandler, "onError", "Error handler must accept one Object or one Object and a StackTrace as arguments, and return a a valid result"));
+      throw H.wrapException(P.ArgumentError$value(errorHandler, "onError", "Error handler must accept one Object or one Object and a StackTrace as arguments, and return a valid result"));
     },
     _microtaskLoop: function() {
       var entry, next;
@@ -3118,8 +3100,9 @@
     _nullDoneHandler: function() {
     },
     _cancelAndValue: function(subscription, future, value) {
-      var cancelFuture = subscription.cancel$0();
-      if (cancelFuture != null && cancelFuture !== $.$get$Future__nullFuture())
+      var cancelFuture = subscription.cancel$0(),
+        t1 = $.$get$Future__nullFuture();
+      if (cancelFuture !== t1)
         cancelFuture.whenComplete$1(new P._cancelAndValue_closure(future, value));
       else
         future._complete$1(value);
@@ -3130,19 +3113,6 @@
         return P.Timer__createTimer(duration, type$.void_Function._as(callback));
       return P.Timer__createTimer(duration, type$.void_Function._as(t1.bindCallbackGuarded$1(callback)));
     },
-    AsyncError$: function(error, stackTrace) {
-      var t1 = H.checkNotNullable(error, "error", type$.Object);
-      return new P.AsyncError(t1, stackTrace == null ? P.AsyncError_defaultStackTrace(error) : stackTrace);
-    },
-    AsyncError_defaultStackTrace: function(error) {
-      var stackTrace;
-      if (type$.Error._is(error)) {
-        stackTrace = error.get$stackTrace();
-        if (stackTrace != null)
-          return stackTrace;
-      }
-      return C.C__StringStackTrace;
-    },
     _rootHandleUncaughtError: function($self, $parent, zone, error, stackTrace) {
       P._schedulePriorityAsyncCallback(new P._rootHandleUncaughtError_closure(error, stackTrace));
     },
@@ -3189,11 +3159,9 @@
       }
     },
     _rootScheduleMicrotask: function($self, $parent, zone, f) {
-      var t1;
       type$.void_Function._as(f);
-      t1 = C.C__RootZone !== zone;
-      if (t1)
-        f = !(!t1 || false) ? zone.bindCallbackGuarded$1(f) : zone.bindCallback$1$1(f, type$.void);
+      if (C.C__RootZone !== zone)
+        f = zone.bindCallbackGuarded$1(f);
       P._scheduleAsyncCallback(f);
     },
     _AsyncRun__initializeScheduleImmediate_internalCallback: function _AsyncRun__initializeScheduleImmediate_internalCallback(t0) {
@@ -3231,6 +3199,10 @@
     _wrapJsFunctionForAsync_closure: function _wrapJsFunctionForAsync_closure(t0) {
       this.$protected = t0;
     },
+    AsyncError: function AsyncError(t0, t1) {
+      this.error = t0;
+      this.stackTrace = t1;
+    },
     _Completer: function _Completer() {
     },
     _AsyncCompleter: function _AsyncCompleter(t0, t1) {
@@ -3262,13 +3234,13 @@
       this.$this = t1;
     },
     _Future__chainForeignFuture_closure: function _Future__chainForeignFuture_closure(t0) {
-      this.target = t0;
+      this.$this = t0;
     },
     _Future__chainForeignFuture_closure0: function _Future__chainForeignFuture_closure0(t0) {
-      this.target = t0;
+      this.$this = t0;
     },
     _Future__chainForeignFuture_closure1: function _Future__chainForeignFuture_closure1(t0, t1, t2) {
-      this.target = t0;
+      this.$this = t0;
       this.e = t1;
       this.s = t2;
     },
@@ -3425,10 +3397,6 @@
       this.future = t0;
       this.value = t1;
     },
-    AsyncError: function AsyncError(t0, t1) {
-      this.error = t0;
-      this.stackTrace = t1;
-    },
     _Zone: function _Zone() {
     },
     _rootHandleUncaughtError_closure: function _rootHandleUncaughtError_closure(t0, t1) {
@@ -3437,11 +3405,6 @@
     },
     _RootZone: function _RootZone() {
     },
-    _RootZone_bindCallback_closure: function _RootZone_bindCallback_closure(t0, t1, t2) {
-      this.$this = t0;
-      this.f = t1;
-      this.R = t2;
-    },
     _RootZone_bindCallbackGuarded_closure: function _RootZone_bindCallbackGuarded_closure(t0, t1) {
       this.$this = t0;
       this.f = t1;
@@ -3612,10 +3575,7 @@
     MapMixin: function MapMixin() {
     },
     _parseJson: function(source, reviver) {
-      var parsed, e, exception, t1;
-      if (typeof source != "string")
-        throw H.wrapException(H.argumentErrorValue(source));
-      parsed = null;
+      var e, exception, t1, parsed = null;
       try {
         parsed = JSON.parse(source);
       } catch (exception) {
@@ -3703,7 +3663,7 @@
     Error__objectToString: function(object) {
       if (object instanceof H.Closure)
         return object.toString$0(0);
-      return "Instance of '" + H.S(H.Primitives_objectTypeName(object)) + "'";
+      return "Instance of '" + H.Primitives_objectTypeName(object) + "'";
     },
     List_List$filled: function($length, fill, $E) {
       var result;
@@ -3789,8 +3749,7 @@
       return new P.RangeError(minValue, maxValue, true, invalidValue, $name, "Invalid value");
     },
     IndexError$: function(invalidValue, indexable, $name, message, $length) {
-      var t1 = H._asIntS($length == null ? J.get$length$asx(indexable) : $length);
-      return new P.IndexError(t1, true, invalidValue, $name, "Index out of range");
+      return new P.IndexError($length, true, invalidValue, $name, "Index out of range");
     },
     UnsupportedError$: function(message) {
       return new P.UnsupportedError(message);
@@ -3930,6 +3889,9 @@
       jsPromise.then(H.convertDartClosureToJS(new P.promiseToFuture_closure(completer, $T), 1), H.convertDartClosureToJS(new P.promiseToFuture_closure0(completer), 1));
       return t1;
     },
+    NullRejectionException: function NullRejectionException(t0) {
+      this.isUndefined = t0;
+    },
     promiseToFuture_closure: function promiseToFuture_closure(t0, t1) {
       this.completer = t0;
       this.T = t1;
@@ -3954,10 +3916,10 @@
         xhr = new XMLHttpRequest();
       C.HttpRequest_methods.open$3$async(xhr, method, url, true);
       C.HttpRequest_methods.set$withCredentials(xhr, true);
-      t2 = type$.nullable_void_Function_legacy_ProgressEvent;
+      t2 = type$.nullable_void_Function_ProgressEvent;
       t3 = t2._as(new W.HttpRequest_request_closure(xhr, completer));
       type$.nullable_void_Function._as(null);
-      t4 = type$.legacy_ProgressEvent;
+      t4 = type$.ProgressEvent;
       W._EventStreamSubscription$(xhr, "load", t3, false, t4);
       W._EventStreamSubscription$(xhr, "error", t2._as(completer.get$completeError()), false, t4);
       if (sendData != null)
@@ -4075,7 +4037,7 @@
   },
   M = {
     SseClient$: function(serverUrl) {
-      var t1 = type$.legacy_String;
+      var t1 = type$.String;
       t1 = new M.SseClient(P.StreamController_StreamController(t1), P.StreamController_StreamController(t1), F.Logger_Logger("SseClient"), new P._AsyncCompleter(new P._Future($.Zone__current, type$._Future_dynamic), type$._AsyncCompleter_dynamic));
       t1.SseClient$1(serverUrl);
       return t1;
@@ -4087,7 +4049,7 @@
       _._logger = t2;
       _._onConnected = t3;
       _._lastMessageId = -1;
-      _._errorTimer = _._serverUrl = _._eventSource = null;
+      _._errorTimer = _.__SseClient__serverUrl = _.__SseClient__eventSource = null;
     },
     SseClient_closure: function SseClient_closure(t0) {
       this.$this = t0;
@@ -4124,10 +4086,13 @@
     }},
   E = {
     main: function() {
-      var channel = M.SseClient$("/test"),
-        t1 = J.get$onClick$x(document.querySelector("button")),
-        t2 = t1.$ti,
-        t3 = t2._eval$1("~(1)?")._as(new E.main_closure(channel));
+      var t2, t3,
+        channel = M.SseClient$("/test"),
+        t1 = document.querySelector("button");
+      t1.toString;
+      t1 = J.get$onClick$x(t1);
+      t2 = t1.$ti;
+      t3 = t2._eval$1("~(1)?")._as(new E.main_closure(channel));
       type$.nullable_void_Function._as(null);
       W._EventStreamSubscription$(t1._target, t1._eventType, t3, false, t2._precomputed1);
       t2 = channel._incomingController;
@@ -4152,7 +4117,7 @@
       return H.Primitives_objectHashCode(receiver);
     },
     toString$0: function(receiver) {
-      return "Instance of '" + H.S(H.Primitives_objectTypeName(receiver)) + "'";
+      return "Instance of '" + H.Primitives_objectTypeName(receiver) + "'";
     }
   };
   J.JSBool.prototype = {
@@ -4191,7 +4156,7 @@
       var dartClosure = receiver[$.$get$DART_CLOSURE_PROPERTY_NAME()];
       if (dartClosure == null)
         return this.super$JavaScriptObject$toString(receiver);
-      return "JavaScript function for " + H.S(J.toString$0$(dartClosure));
+      return "JavaScript function for " + J.toString$0$(dartClosure);
     },
     $isFunction: 1
   };
@@ -4239,12 +4204,10 @@
       return receiver[index];
     },
     $indexSet: function(receiver, index, value) {
-      H._asIntS(index);
+      H._asInt(index);
       H._arrayInstanceType(receiver)._precomputed1._as(value);
       if (!!receiver.immutable$list)
         H.throwExpression(P.UnsupportedError$("indexed set"));
-      if (!H._isInt(index))
-        throw H.wrapException(H.diagnoseIndexError(receiver, index));
       if (index >= receiver.length || index < 0)
         throw H.wrapException(H.diagnoseIndexError(receiver, index));
       receiver[index] = value;
@@ -4255,7 +4218,7 @@
   J.JSUnmodifiableArray.prototype = {};
   J.ArrayIterator.prototype = {
     get$current: function() {
-      return this._current;
+      return this.$ti._precomputed1._as(this._current);
     },
     moveNext$0: function() {
       var t2, _this = this,
@@ -4352,7 +4315,7 @@
     $isnum: 1
   };
   J.JSInt.prototype = {$isint: 1};
-  J.JSDouble.prototype = {};
+  J.JSNumNotInt.prototype = {};
   J.JSString.prototype = {
     codeUnitAt$1: function(receiver, index) {
       if (index < 0)
@@ -4367,8 +4330,6 @@
       return receiver.charCodeAt(index);
     },
     $add: function(receiver, other) {
-      if (typeof other != "string")
-        throw H.wrapException(P.ArgumentError$value(other, null, null));
       return receiver + other;
     },
     startsWith$1: function(receiver, pattern) {
@@ -4444,20 +4405,17 @@
   };
   H.LateError.prototype = {
     toString$0: function(_) {
-      var message = this._message;
-      return message != null ? "LateInitializationError: " + message : "LateInitializationError";
+      var t1 = "LateInitializationError: " + this._message;
+      return t1;
     }
   };
-  H.closure.prototype = {
+  H.nullFuture_closure.prototype = {
     call$0: function() {
-      return P.Future_Future$value(null, type$.Null);
+      var t1 = new P._Future($.Zone__current, type$._Future_Null);
+      t1._asyncComplete$1(null);
+      return t1;
     },
-    $signature: 14
-  };
-  H.NotNullableError.prototype = {
-    toString$0: function(_) {
-      return "Null is not a valid value for the parameter '" + this.__internal$_name + "' of type '" + H.createRuntimeType(this.$ti._precomputed1).toString$0(0) + "'";
-    }
+    $signature: 12
   };
   H.EfficientLengthIterable.prototype = {};
   H.ListIterable.prototype = {
@@ -4472,7 +4430,7 @@
   };
   H.ListIterator.prototype = {
     get$current: function() {
-      return this.__internal$_current;
+      return this.$ti._precomputed1._as(this.__internal$_current);
     },
     moveNext$0: function() {
       var t3, _this = this,
@@ -4524,7 +4482,7 @@
     toString$0: function(_) {
       var t1 = this._method;
       if (t1 == null)
-        return "NoSuchMethodError: " + H.S(this.__js_helper$_message);
+        return "NoSuchMethodError: " + this.__js_helper$_message;
       return "NoSuchMethodError: method not found: '" + t1 + "' on null";
     }
   };
@@ -4534,11 +4492,11 @@
         _s38_ = "NoSuchMethodError: method not found: '",
         t1 = _this._method;
       if (t1 == null)
-        return "NoSuchMethodError: " + H.S(_this.__js_helper$_message);
+        return "NoSuchMethodError: " + _this.__js_helper$_message;
       t2 = _this._receiver;
       if (t2 == null)
-        return _s38_ + t1 + "' (" + H.S(_this.__js_helper$_message) + ")";
-      return _s38_ + t1 + "' on '" + t2 + "' (" + H.S(_this.__js_helper$_message) + ")";
+        return _s38_ + t1 + "' (" + _this.__js_helper$_message + ")";
+      return _s38_ + t1 + "' on '" + t2 + "' (" + _this.__js_helper$_message + ")";
     }
   };
   H.UnknownJsTypeError.prototype = {
@@ -4612,7 +4570,7 @@
       var receiver = this._receiver;
       if (receiver == null)
         receiver = this._self;
-      return "Closure '" + H.S(this._name) + "' of " + ("Instance of '" + H.S(H.Primitives_objectTypeName(receiver)) + "'");
+      return "Closure '" + H.S(this._name) + "' of " + ("Instance of '" + H.Primitives_objectTypeName(type$.Object._as(receiver)) + "'");
     }
   };
   H.RuntimeError.prototype = {
@@ -4705,7 +4663,7 @@
       t1._precomputed1._as(key);
       t1._eval$1("2()")._as(ifAbsent);
       if (_this.containsKey$1(key))
-        return _this.$index(0, key);
+        return t1._rest[1]._as(_this.$index(0, key));
       value = ifAbsent.call$0();
       _this.$indexSet(0, key, value);
       return value;
@@ -4799,7 +4757,7 @@
   };
   H.LinkedHashMapKeyIterator.prototype = {
     get$current: function() {
-      return this.__js_helper$_current;
+      return this.$ti._precomputed1._as(this.__js_helper$_current);
     },
     moveNext$0: function() {
       var cell, _this = this,
@@ -4824,19 +4782,19 @@
     call$1: function(o) {
       return this.getTag(o);
     },
-    $signature: 4
+    $signature: 5
   };
   H.initHooks_closure0.prototype = {
     call$2: function(o, tag) {
       return this.getUnknownTag(o, tag);
     },
-    $signature: 15
+    $signature: 13
   };
   H.initHooks_closure1.prototype = {
     call$1: function(tag) {
-      return this.prototypeForTag(H._asStringS(tag));
+      return this.prototypeForTag(H._asString(tag));
     },
-    $signature: 16
+    $signature: 14
   };
   H.NativeTypedData.prototype = {};
   H.NativeTypedArray.prototype = {
@@ -4851,8 +4809,8 @@
       return receiver[index];
     },
     $indexSet: function(receiver, index, value) {
-      H._asIntS(index);
-      H._asDoubleS(value);
+      H._asInt(index);
+      H._asDouble(value);
       H._checkValidIndex(index, receiver, receiver.length);
       receiver[index] = value;
     },
@@ -4861,8 +4819,8 @@
   };
   H.NativeTypedArrayOfInt.prototype = {
     $indexSet: function(receiver, index, value) {
-      H._asIntS(index);
-      H._asIntS(value);
+      H._asInt(index);
+      H._asInt(value);
       H._checkValidIndex(index, receiver, receiver.length);
       receiver[index] = value;
     },
@@ -4930,11 +4888,6 @@
     }
   };
   H._FunctionParameters.prototype = {};
-  H._Type.prototype = {
-    toString$0: function(_) {
-      return H._rtiToString(this._rti, null);
-    }
-  };
   H._Error.prototype = {
     toString$0: function(_) {
       return this.__rti$_message;
@@ -4948,7 +4901,7 @@
       t1.storedCallback = null;
       f.call$0();
     },
-    $signature: 5
+    $signature: 6
   };
   P._AsyncRun__initializeScheduleImmediate_closure.prototype = {
     call$1: function(callback) {
@@ -4958,19 +4911,19 @@
       t2 = this.span;
       t1.firstChild ? t1.removeChild(t2) : t1.appendChild(t2);
     },
-    $signature: 17
+    $signature: 15
   };
   P._AsyncRun__scheduleImmediateJsOverride_internalCallback.prototype = {
     call$0: function() {
       this.callback.call$0();
     },
-    $signature: 1
+    $signature: 3
   };
   P._AsyncRun__scheduleImmediateWithSetImmediate_internalCallback.prototype = {
     call$0: function() {
       this.callback.call$0();
     },
-    $signature: 1
+    $signature: 3
   };
   P._TimerImpl.prototype = {
     _TimerImpl$2: function(milliseconds, callback) {
@@ -5003,6 +4956,8 @@
       var t2, _this = this,
         t1 = _this.$ti;
       t1._eval$1("1/?")._as(value);
+      if (value == null)
+        value = t1._precomputed1._as(value);
       if (!_this.isSync)
         _this._future._asyncComplete$1(value);
       else {
@@ -5014,10 +4969,7 @@
       }
     },
     completeError$2: function(e, st) {
-      var t1;
-      if (st == null)
-        st = P.AsyncError_defaultStackTrace(e);
-      t1 = this._future;
+      var t1 = this._future;
       if (this.isSync)
         t1._completeError$2(e, st);
       else
@@ -5035,13 +4987,22 @@
     call$2: function(error, stackTrace) {
       this.bodyFunction.call$2(1, new H.ExceptionAndStackTrace(error, type$.StackTrace._as(stackTrace)));
     },
-    $signature: 18
+    $signature: 16
   };
   P._wrapJsFunctionForAsync_closure.prototype = {
     call$2: function(errorCode, result) {
-      this.$protected(H._asIntS(errorCode), result);
+      this.$protected(H._asInt(errorCode), result);
     },
-    $signature: 19
+    $signature: 17
+  };
+  P.AsyncError.prototype = {
+    toString$0: function(_) {
+      return H.S(this.error);
+    },
+    $isError: 1,
+    get$stackTrace: function() {
+      return this.stackTrace;
+    }
   };
   P._Completer.prototype = {
     completeError$2: function(error, stackTrace) {
@@ -5083,12 +5044,13 @@
       var errorCallback = this.errorCallback,
         t1 = type$.dynamic,
         t2 = type$.Object,
-        t3 = this.$ti._eval$1("2/"),
-        t4 = this.result._zone;
+        t3 = asyncError.error,
+        t4 = this.$ti._eval$1("2/"),
+        t5 = this.result._zone;
       if (type$.dynamic_Function_Object_StackTrace._is(errorCallback))
-        return t3._as(t4.runBinary$3$3(errorCallback, asyncError.error, asyncError.stackTrace, t1, t2, type$.StackTrace));
+        return t4._as(t5.runBinary$3$3(errorCallback, t3, asyncError.stackTrace, t1, t2, type$.StackTrace));
       else
-        return t3._as(t4.runUnary$2$2(type$.dynamic_Function_Object._as(errorCallback), asyncError.error, t1, t2));
+        return t4._as(t5.runUnary$2$2(type$.dynamic_Function_Object._as(errorCallback), t3, t1, t2));
     }
   };
   P._Future.prototype = {
@@ -5189,6 +5151,17 @@
       }
       return prev;
     },
+    _chainForeignFuture$1: function(source) {
+      var e, s, exception, _this = this;
+      _this._state = 1;
+      try {
+        source.then$1$2$onError(new P._Future__chainForeignFuture_closure(_this), new P._Future__chainForeignFuture_closure0(_this), type$.Null);
+      } catch (exception) {
+        e = H.unwrapException(exception);
+        s = H.getTraceFromException(exception);
+        P.scheduleMicrotask(new P._Future__chainForeignFuture_closure1(_this, e, s));
+      }
+    },
     _complete$1: function(value) {
       var listeners, _this = this,
         t1 = _this.$ti;
@@ -5197,7 +5170,7 @@
         if (t1._is(value))
           P._Future__chainCoreFuture(value, _this);
         else
-          P._Future__chainForeignFuture(value, _this);
+          _this._chainForeignFuture$1(value);
       else {
         listeners = _this._removeListeners$0();
         t1._precomputed1._as(value);
@@ -5216,6 +5189,7 @@
     },
     _completeError$2: function(error, stackTrace) {
       var listeners, t1, _this = this;
+      type$.Object._as(error);
       type$.StackTrace._as(stackTrace);
       listeners = _this._removeListeners$0();
       t1 = P.AsyncError$(error, stackTrace);
@@ -5250,7 +5224,7 @@
           P._Future__chainCoreFuture(value, _this);
         return;
       }
-      P._Future__chainForeignFuture(value, _this);
+      _this._chainForeignFuture$1(value);
     },
     _asyncCompleteError$2: function(error, stackTrace) {
       type$.StackTrace._as(stackTrace);
@@ -5273,21 +5247,28 @@
   };
   P._Future__chainForeignFuture_closure.prototype = {
     call$1: function(value) {
-      var t1 = this.target;
+      var error, stackTrace, exception,
+        t1 = this.$this;
       t1._state = 0;
-      t1._complete$1(value);
+      try {
+        t1._completeWithValue$1(t1.$ti._precomputed1._as(value));
+      } catch (exception) {
+        error = H.unwrapException(exception);
+        stackTrace = H.getTraceFromException(exception);
+        t1._completeError$2(error, stackTrace);
+      }
     },
-    $signature: 5
+    $signature: 6
   };
   P._Future__chainForeignFuture_closure0.prototype = {
     call$2: function(error, stackTrace) {
-      this.target._completeError$2(error, type$.StackTrace._as(stackTrace));
+      this.$this._completeError$2(type$.Object._as(error), type$.StackTrace._as(stackTrace));
     },
-    $signature: 7
+    $signature: 8
   };
   P._Future__chainForeignFuture_closure1.prototype = {
     call$0: function() {
-      this.target._completeError$2(this.e, this.s);
+      this.$this._completeError$2(this.e, this.s);
     },
     $signature: 0
   };
@@ -5318,13 +5299,7 @@
       } catch (exception) {
         e = H.unwrapException(exception);
         s = H.getTraceFromException(exception);
-        if (_this.hasError) {
-          t1 = type$.AsyncError._as(_this._box_1.source._resultOrListeners).error;
-          t2 = e;
-          t2 = t1 == null ? t2 == null : t1 === t2;
-          t1 = t2;
-        } else
-          t1 = false;
+        t1 = _this.hasError && type$.AsyncError._as(_this._box_1.source._resultOrListeners).error === e;
         t2 = _this._box_0;
         if (t1)
           t2.listenerValueOrError = type$.AsyncError._as(_this._box_1.source._resultOrListeners);
@@ -5354,7 +5329,7 @@
     call$1: function(_) {
       return this.originalSource;
     },
-    $signature: 21
+    $signature: 19
   };
   P._Future__propagateToListeners_handleValueCallback.prototype = {
     call$0: function() {
@@ -5378,11 +5353,11 @@
   };
   P._Future__propagateToListeners_handleError.prototype = {
     call$0: function() {
-      var asyncError, e, s, t1, exception, t2, t3, t4, _this = this;
+      var asyncError, e, s, t1, exception, t2, _this = this;
       try {
         asyncError = type$.AsyncError._as(_this._box_1.source._resultOrListeners);
         t1 = _this._box_0;
-        if (H.boolConversionCheck(t1.listener.matchesErrorTest$1(asyncError)) && t1.listener.errorCallback != null) {
+        if (t1.listener.matchesErrorTest$1(asyncError) && t1.listener.errorCallback != null) {
           t1.listenerValueOrError = t1.listener.handleError$1(asyncError);
           t1.listenerHasError = false;
         }
@@ -5390,14 +5365,12 @@
         e = H.unwrapException(exception);
         s = H.getTraceFromException(exception);
         t1 = type$.AsyncError._as(_this._box_1.source._resultOrListeners);
-        t2 = t1.error;
-        t3 = e;
-        t4 = _this._box_0;
-        if (t2 == null ? t3 == null : t2 === t3)
-          t4.listenerValueOrError = t1;
+        t2 = _this._box_0;
+        if (t1.error === e)
+          t2.listenerValueOrError = t1;
         else
-          t4.listenerValueOrError = P.AsyncError$(e, s);
-        t4.listenerHasError = true;
+          t2.listenerValueOrError = P.AsyncError$(e, s);
+        t2.listenerHasError = true;
       }
     },
     $signature: 0
@@ -5435,18 +5408,18 @@
   };
   P.Stream_first_closure.prototype = {
     call$0: function() {
-      var e, s, t1, exception, error, stackTrace;
+      var e, s, t1, exception, stackTrace;
       try {
         t1 = H.IterableElementError_noElement();
         throw H.wrapException(t1);
       } catch (exception) {
         e = H.unwrapException(exception);
         s = H.getTraceFromException(exception);
-        error = e;
+        t1 = e;
         stackTrace = s;
         if (stackTrace == null)
-          stackTrace = P.AsyncError_defaultStackTrace(error);
-        this.future._completeError$2(error, stackTrace);
+          stackTrace = P.AsyncError_defaultStackTrace(t1);
+        this.future._completeError$2(t1, stackTrace);
       }
     },
     $signature: 0
@@ -5680,6 +5653,8 @@
       var result, t1 = {};
       $E._eval$1("0?")._as(futureValue);
       t1.resultValue = null;
+      if (!$E._is(null))
+        throw H.wrapException(new P.ArgumentError(false, null, "futureValue", "Must not be null"));
       t1.resultValue = $E._as(futureValue);
       result = new P._Future($.Zone__current, $E._eval$1("_Future<0>"));
       this.set$_onDone(new P._BufferingStreamSubscription_asFuture_closure(t1, result));
@@ -5818,18 +5793,18 @@
     call$2: function(error, stackTrace) {
       var cancelFuture = this.$this.cancel$0(),
         t1 = this.result;
-      if (cancelFuture != $.$get$Future__nullFuture())
+      if (cancelFuture !== $.$get$Future__nullFuture())
         cancelFuture.whenComplete$1(new P._BufferingStreamSubscription_asFuture__closure(t1, error, stackTrace));
       else
         t1._completeError$2(error, stackTrace);
     },
-    $signature: 7
+    $signature: 8
   };
   P._BufferingStreamSubscription_asFuture__closure.prototype = {
     call$0: function() {
       this.result._completeError$2(this.error, this.stackTrace);
     },
-    $signature: 1
+    $signature: 3
   };
   P._BufferingStreamSubscription__sendError_sendError.prototype = {
     call$0: function() {
@@ -5962,20 +5937,11 @@
     },
     $signature: 0
   };
-  P.AsyncError.prototype = {
-    toString$0: function(_) {
-      return H.S(this.error);
-    },
-    $isError: 1,
-    get$stackTrace: function() {
-      return this.stackTrace;
-    }
-  };
   P._Zone.prototype = {$isZone: 1};
   P._rootHandleUncaughtError_closure.prototype = {
     call$0: function() {
-      var error = H.wrapException(this.error);
-      error.stack = J.toString$0$(this.stackTrace);
+      var error = type$.Object._as(H.wrapException(this.error));
+      error.stack = this.stackTrace.toString$0(0);
       throw error;
     },
     $signature: 0
@@ -5993,7 +5959,7 @@
       } catch (exception) {
         e = H.unwrapException(exception);
         s = H.getTraceFromException(exception);
-        P._rootHandleUncaughtError(_null, _null, this, e, type$.StackTrace._as(s));
+        P._rootHandleUncaughtError(_null, _null, this, type$.Object._as(e), type$.StackTrace._as(s));
       }
     },
     runUnaryGuarded$1$2: function(f, arg, $T) {
@@ -6009,7 +5975,7 @@
       } catch (exception) {
         e = H.unwrapException(exception);
         s = H.getTraceFromException(exception);
-        P._rootHandleUncaughtError(_null, _null, this, e, type$.StackTrace._as(s));
+        P._rootHandleUncaughtError(_null, _null, this, type$.Object._as(e), type$.StackTrace._as(s));
       }
     },
     runBinaryGuarded$2$3: function(f, arg1, arg2, T1, T2) {
@@ -6026,12 +5992,9 @@
       } catch (exception) {
         e = H.unwrapException(exception);
         s = H.getTraceFromException(exception);
-        P._rootHandleUncaughtError(_null, _null, this, e, type$.StackTrace._as(s));
+        P._rootHandleUncaughtError(_null, _null, this, type$.Object._as(e), type$.StackTrace._as(s));
       }
     },
-    bindCallback$1$1: function(f, $R) {
-      return new P._RootZone_bindCallback_closure(this, $R._eval$1("0()")._as(f), $R);
-    },
     bindCallbackGuarded$1: function(f) {
       return new P._RootZone_bindCallbackGuarded_closure(this, type$.void_Function._as(f));
     },
@@ -6063,14 +6026,6 @@
       return $R._eval$1("@<0>")._bind$1(T1)._bind$1(T2)._eval$1("1(2,3)")._as(f);
     }
   };
-  P._RootZone_bindCallback_closure.prototype = {
-    call$0: function() {
-      return this.$this.run$1$1(this.f, this.R);
-    },
-    $signature: function() {
-      return this.R._eval$1("0()");
-    }
-  };
   P._RootZone_bindCallbackGuarded_closure.prototype = {
     call$0: function() {
       return this.$this.runGuarded$1(this.f);
@@ -6123,15 +6078,16 @@
       t1._contents = t2 + ": ";
       t1._contents += H.S(v);
     },
-    $signature: 8
+    $signature: 9
   };
   P.MapMixin.prototype = {
     forEach$1: function(_, action) {
-      var t1, key;
-      H._instanceType(this)._eval$1("~(MapMixin.K,MapMixin.V)")._as(action);
-      for (t1 = this.get$keys(), t1 = t1.get$iterator(t1); t1.moveNext$0();) {
-        key = t1.get$current();
-        action.call$2(key, this.$index(0, key));
+      var t2, key,
+        t1 = H._instanceType(this);
+      t1._eval$1("~(MapMixin.K,MapMixin.V)")._as(action);
+      for (t2 = this.get$keys(), t2 = t2.get$iterator(t2), t1 = t1._eval$1("MapMixin.V"); t2.moveNext$0();) {
+        key = t2.get$current();
+        action.call$2(key, t1._as(this.$index(0, key)));
       }
     },
     get$length: function(_) {
@@ -6271,94 +6227,94 @@
   P.JsonDecoder.prototype = {};
   P._JsonStringifier.prototype = {
     writeStringContent$1: function(s) {
-      var t1, t2, offset, i, charCode, t3, t4,
+      var t1, offset, i, charCode, t2, t3,
         $length = s.length;
-      for (t1 = J.getInterceptor$s(s), t2 = this._sink, offset = 0, i = 0; i < $length; ++i) {
-        charCode = t1._codeUnitAt$1(s, i);
+      for (t1 = this._sink, offset = 0, i = 0; i < $length; ++i) {
+        charCode = C.JSString_methods._codeUnitAt$1(s, i);
         if (charCode > 92) {
           if (charCode >= 55296) {
-            t3 = charCode & 64512;
-            if (t3 === 55296) {
-              t4 = i + 1;
-              t4 = !(t4 < $length && (C.JSString_methods._codeUnitAt$1(s, t4) & 64512) === 56320);
+            t2 = charCode & 64512;
+            if (t2 === 55296) {
+              t3 = i + 1;
+              t3 = !(t3 < $length && (C.JSString_methods._codeUnitAt$1(s, t3) & 64512) === 56320);
             } else
-              t4 = false;
-            if (!t4)
-              if (t3 === 56320) {
-                t3 = i - 1;
-                t3 = !(t3 >= 0 && (C.JSString_methods.codeUnitAt$1(s, t3) & 64512) === 55296);
+              t3 = false;
+            if (!t3)
+              if (t2 === 56320) {
+                t2 = i - 1;
+                t2 = !(t2 >= 0 && (C.JSString_methods.codeUnitAt$1(s, t2) & 64512) === 55296);
               } else
-                t3 = false;
+                t2 = false;
             else
-              t3 = true;
-            if (t3) {
+              t2 = true;
+            if (t2) {
               if (i > offset)
-                t2._contents += C.JSString_methods.substring$2(s, offset, i);
+                t1._contents += C.JSString_methods.substring$2(s, offset, i);
               offset = i + 1;
-              t3 = t2._contents += H.Primitives_stringFromCharCode(92);
-              t3 += H.Primitives_stringFromCharCode(117);
-              t2._contents = t3;
-              t3 += H.Primitives_stringFromCharCode(100);
-              t2._contents = t3;
-              t4 = charCode >>> 8 & 15;
-              t3 += H.Primitives_stringFromCharCode(t4 < 10 ? 48 + t4 : 87 + t4);
-              t2._contents = t3;
-              t4 = charCode >>> 4 & 15;
-              t3 += H.Primitives_stringFromCharCode(t4 < 10 ? 48 + t4 : 87 + t4);
-              t2._contents = t3;
-              t4 = charCode & 15;
-              t2._contents = t3 + H.Primitives_stringFromCharCode(t4 < 10 ? 48 + t4 : 87 + t4);
+              t2 = t1._contents += H.Primitives_stringFromCharCode(92);
+              t2 += H.Primitives_stringFromCharCode(117);
+              t1._contents = t2;
+              t2 += H.Primitives_stringFromCharCode(100);
+              t1._contents = t2;
+              t3 = charCode >>> 8 & 15;
+              t2 += H.Primitives_stringFromCharCode(t3 < 10 ? 48 + t3 : 87 + t3);
+              t1._contents = t2;
+              t3 = charCode >>> 4 & 15;
+              t2 += H.Primitives_stringFromCharCode(t3 < 10 ? 48 + t3 : 87 + t3);
+              t1._contents = t2;
+              t3 = charCode & 15;
+              t1._contents = t2 + H.Primitives_stringFromCharCode(t3 < 10 ? 48 + t3 : 87 + t3);
             }
           }
           continue;
         }
         if (charCode < 32) {
           if (i > offset)
-            t2._contents += C.JSString_methods.substring$2(s, offset, i);
+            t1._contents += C.JSString_methods.substring$2(s, offset, i);
           offset = i + 1;
-          t3 = t2._contents += H.Primitives_stringFromCharCode(92);
+          t2 = t1._contents += H.Primitives_stringFromCharCode(92);
           switch (charCode) {
             case 8:
-              t2._contents = t3 + H.Primitives_stringFromCharCode(98);
+              t1._contents = t2 + H.Primitives_stringFromCharCode(98);
               break;
             case 9:
-              t2._contents = t3 + H.Primitives_stringFromCharCode(116);
+              t1._contents = t2 + H.Primitives_stringFromCharCode(116);
               break;
             case 10:
-              t2._contents = t3 + H.Primitives_stringFromCharCode(110);
+              t1._contents = t2 + H.Primitives_stringFromCharCode(110);
               break;
             case 12:
-              t2._contents = t3 + H.Primitives_stringFromCharCode(102);
+              t1._contents = t2 + H.Primitives_stringFromCharCode(102);
               break;
             case 13:
-              t2._contents = t3 + H.Primitives_stringFromCharCode(114);
+              t1._contents = t2 + H.Primitives_stringFromCharCode(114);
               break;
             default:
-              t3 += H.Primitives_stringFromCharCode(117);
-              t2._contents = t3;
-              t3 += H.Primitives_stringFromCharCode(48);
-              t2._contents = t3;
-              t3 += H.Primitives_stringFromCharCode(48);
-              t2._contents = t3;
-              t4 = charCode >>> 4 & 15;
-              t3 += H.Primitives_stringFromCharCode(t4 < 10 ? 48 + t4 : 87 + t4);
-              t2._contents = t3;
-              t4 = charCode & 15;
-              t2._contents = t3 + H.Primitives_stringFromCharCode(t4 < 10 ? 48 + t4 : 87 + t4);
+              t2 += H.Primitives_stringFromCharCode(117);
+              t1._contents = t2;
+              t2 += H.Primitives_stringFromCharCode(48);
+              t1._contents = t2;
+              t2 += H.Primitives_stringFromCharCode(48);
+              t1._contents = t2;
+              t3 = charCode >>> 4 & 15;
+              t2 += H.Primitives_stringFromCharCode(t3 < 10 ? 48 + t3 : 87 + t3);
+              t1._contents = t2;
+              t3 = charCode & 15;
+              t1._contents = t2 + H.Primitives_stringFromCharCode(t3 < 10 ? 48 + t3 : 87 + t3);
               break;
           }
         } else if (charCode === 34 || charCode === 92) {
           if (i > offset)
-            t2._contents += C.JSString_methods.substring$2(s, offset, i);
+            t1._contents += C.JSString_methods.substring$2(s, offset, i);
           offset = i + 1;
-          t3 = t2._contents += H.Primitives_stringFromCharCode(92);
-          t2._contents = t3 + H.Primitives_stringFromCharCode(charCode);
+          t2 = t1._contents += H.Primitives_stringFromCharCode(92);
+          t1._contents = t2 + H.Primitives_stringFromCharCode(charCode);
         }
       }
       if (offset === 0)
-        t2._contents += H.S(s);
+        t1._contents += s;
       else if (offset < $length)
-        t2._contents += t1.substring$2(s, offset, $length);
+        t1._contents += C.JSString_methods.substring$2(s, offset, $length);
     },
     _checkCycle$1: function(object) {
       var t1, t2, i, t3;
@@ -6435,7 +6391,7 @@
       var t2, i,
         t1 = this._sink;
       t1._contents += "[";
-      t2 = J.getInterceptor$ax(list);
+      t2 = J.getInterceptor$asx(list);
       if (t2.get$isNotEmpty(list)) {
         this.writeObject$1(t2.$index(list, 0));
         for (i = 1; i < t2.get$length(list); ++i) {
@@ -6462,7 +6418,7 @@
       t2._contents += "{";
       for (separator = '"'; i < t1; i += 2, separator = ',"') {
         t2._contents += separator;
-        _this.writeStringContent$1(H._asStringS(keyValueList[i]));
+        _this.writeStringContent$1(H._asString(keyValueList[i]));
         t2._contents += '":';
         t3 = i + 1;
         if (t3 >= t1)
@@ -6483,7 +6439,7 @@
       C.JSArray_methods.$indexSet(t1, t2.i++, key);
       C.JSArray_methods.$indexSet(t1, t2.i++, value);
     },
-    $signature: 8
+    $signature: 9
   };
   P._JsonStringStringifier.prototype = {
     get$_partialResult: function() {
@@ -6534,7 +6490,7 @@
       twoDigitMinutes = t1.call$1(C.JSInt_methods._tdivFast$1(t2, 60000000) % 60);
       twoDigitSeconds = t1.call$1(C.JSInt_methods._tdivFast$1(t2, 1000000) % 60);
       sixDigitUs = new P.Duration_toString_sixDigits().call$1(t2 % 1000000);
-      return "" + C.JSInt_methods._tdivFast$1(t2, 3600000000) + ":" + H.S(twoDigitMinutes) + ":" + H.S(twoDigitSeconds) + "." + H.S(sixDigitUs);
+      return "" + C.JSInt_methods._tdivFast$1(t2, 3600000000) + ":" + twoDigitMinutes + ":" + twoDigitSeconds + "." + sixDigitUs;
     }
   };
   P.Duration_toString_sixDigits.prototype = {
@@ -6551,7 +6507,7 @@
         return "0000" + n;
       return "00000" + n;
     },
-    $signature: 9
+    $signature: 10
   };
   P.Duration_toString_twoDigits.prototype = {
     call$1: function(n) {
@@ -6559,7 +6515,7 @@
         return "" + n;
       return "0" + n;
     },
-    $signature: 9
+    $signature: 10
   };
   P.Error.prototype = {
     get$stackTrace: function() {
@@ -6625,16 +6581,12 @@
       return "RangeError";
     },
     get$_errorExplanation: function() {
-      var t1,
-        invalidValue = H._asIntS(this.invalidValue);
-      if (typeof invalidValue !== "number")
-        return invalidValue.$lt();
-      if (invalidValue < 0)
+      if (H._asInt(this.invalidValue) < 0)
         return ": index must not be negative";
-      t1 = this.length;
+      var t1 = this.length;
       if (t1 === 0)
         return ": no indices are valid";
-      return ": index should be less than " + H.S(t1);
+      return ": index should be less than " + t1;
     },
     get$length: function(receiver) {
       return this.length;
@@ -6647,8 +6599,8 @@
   };
   P.UnimplementedError.prototype = {
     toString$0: function(_) {
-      var message = this.message;
-      return message != null ? "UnimplementedError: " + message : "UnimplementedError";
+      var t1 = "UnimplementedError: " + this.message;
+      return t1;
     }
   };
   P.StateError.prototype = {
@@ -6684,8 +6636,8 @@
   };
   P.CyclicInitializationError.prototype = {
     toString$0: function(_) {
-      var variableName = this.variableName;
-      return variableName == null ? "Reading static variable during its initialization" : "Reading static variable '" + variableName + "' during its initialization";
+      var t1 = "Reading static variable '" + this.variableName + "' during its initialization";
+      return t1;
     }
   };
   P._Exception.prototype = {
@@ -6696,7 +6648,7 @@
   P.FormatException.prototype = {
     toString$0: function(_) {
       var message = this.message,
-        report = message != null && "" !== message ? "FormatException: " + H.S(message) : "FormatException";
+        report = "" !== message ? "FormatException: " + message : "FormatException";
       return report;
     }
   };
@@ -6724,7 +6676,7 @@
   };
   P.Null.prototype = {
     get$hashCode: function(_) {
-      return P.Object.prototype.get$hashCode.call(C.JSNull_methods, this);
+      return P.Object.prototype.get$hashCode.call(this, this);
     },
     toString$0: function(_) {
       return "null";
@@ -6738,7 +6690,7 @@
       return H.Primitives_objectHashCode(this);
     },
     toString$0: function(_) {
-      return "Instance of '" + H.S(H.Primitives_objectTypeName(this)) + "'";
+      return "Instance of '" + H.Primitives_objectTypeName(this) + "'";
     },
     toString: function() {
       return this.toString$0(this);
@@ -6781,7 +6733,7 @@
       return receiver.localName;
     },
     get$onClick: function(receiver) {
-      return new W._ElementEventStreamImpl(receiver, "click", false, type$._ElementEventStreamImpl_legacy_MouseEvent);
+      return new W._ElementEventStreamImpl(receiver, "click", false, type$._ElementEventStreamImpl_MouseEvent);
     },
     $isElement: 1
   };
@@ -6834,7 +6786,7 @@
       else
         t3.completeError$1(e);
     },
-    $signature: 22
+    $signature: 20
   };
   W.HttpRequestEventTarget.prototype = {};
   W.MessageEvent.prototype = {$isMessageEvent: 1};
@@ -6866,11 +6818,11 @@
     cancel$0: function() {
       var _this = this;
       if (_this._target == null)
-        return null;
+        return $.$get$nullFuture();
       _this._unlisten$0();
       _this._target = null;
       _this.set$_html$_onData(null);
-      return null;
+      return $.$get$nullFuture();
     },
     onData$1: function(handleData) {
       var t1, _this = this;
@@ -6892,15 +6844,12 @@
       }
     },
     _unlisten$0: function() {
-      var t3,
-        t1 = this._html$_onData,
-        t2 = t1 != null;
-      if (t2) {
-        t3 = this._target;
-        t3.toString;
-        type$.nullable_dynamic_Function_Event._as(t1);
-        if (t2)
-          J._removeEventListener$3$x(t3, this._eventType, t1, false);
+      var t2,
+        t1 = this._html$_onData;
+      if (t1 != null) {
+        t2 = this._target;
+        t2.toString;
+        J._removeEventListener$3$x(t2, this._eventType, type$.nullable_dynamic_Function_Event._as(t1), false);
       }
     },
     set$_html$_onData: function(_onData) {
@@ -6911,13 +6860,13 @@
     call$1: function(e) {
       return this.onData.call$1(type$.Event._as(e));
     },
-    $signature: 10
+    $signature: 1
   };
   W._EventStreamSubscription_onData_closure.prototype = {
     call$1: function(e) {
       return this.handleData.call$1(type$.Event._as(e));
     },
-    $signature: 10
+    $signature: 1
   };
   P._AcceptStructuredClone.prototype = {
     findSlot$1: function(value) {
@@ -7003,7 +6952,7 @@
       J.$indexSet$ax(t1, key, t2);
       return t2;
     },
-    $signature: 23
+    $signature: 21
   };
   P._convertDartToNative_Value_closure.prototype = {
     call$1: function(element) {
@@ -7015,7 +6964,7 @@
     call$2: function(key, value) {
       this.object[key] = P._convertDartToNative_Value(value);
     },
-    $signature: 24
+    $signature: 22
   };
   P._AcceptStructuredCloneDart2Js.prototype = {
     forEachJsField$2: function(object, action) {
@@ -7027,6 +6976,11 @@
       }
     }
   };
+  P.NullRejectionException.prototype = {
+    toString$0: function(_) {
+      return "Promise was rejected with a value of `" + (this.isUndefined ? "undefined" : "null") + "`.";
+    }
+  };
   P.promiseToFuture_closure.prototype = {
     call$1: function(r) {
       return this.completer.complete$1(0, this.T._eval$1("0/?")._as(r));
@@ -7035,6 +6989,8 @@
   };
   P.promiseToFuture_closure0.prototype = {
     call$1: function(e) {
+      if (e == null)
+        return this.completer.completeError$1(new P.NullRejectionException(e === undefined));
       return this.completer.completeError$1(e);
     },
     $signature: 2
@@ -7048,7 +7004,7 @@
   };
   P.SvgElement.prototype = {
     get$onClick: function(receiver) {
-      return new W._ElementEventStreamImpl(receiver, "click", false, type$._ElementEventStreamImpl_legacy_MouseEvent);
+      return new W._ElementEventStreamImpl(receiver, "click", false, type$._ElementEventStreamImpl_MouseEvent);
     }
   };
   Y.Level.prototype = {
@@ -7072,17 +7028,21 @@
   F.Logger.prototype = {
     get$fullName: function() {
       var t1 = this.parent,
-        t2 = t1 == null || t1.name === "",
+        t2 = t1 == null ? null : t1.name.length !== 0,
         t3 = this.name;
-      return t2 ? t3 : t1.get$fullName() + "." + t3;
+      return t2 === true ? t1.get$fullName() + "." + t3 : t3;
     },
     get$level: function() {
-      var effectiveLevel, t1;
-      if (this.parent == null)
-        effectiveLevel = this._level;
-      else {
+      var t1, effectiveLevel;
+      if (this.parent == null) {
+        t1 = this._level;
+        t1.toString;
+        effectiveLevel = t1;
+      } else {
         t1 = $.$get$Logger_root();
-        effectiveLevel = t1._level;
+        t1 = t1._level;
+        t1.toString;
+        effectiveLevel = t1;
       }
       return effectiveLevel;
     },
@@ -7105,6 +7065,7 @@
       }
     },
     _publish$1: function(record) {
+      return null;
     }
   };
   F.Logger_Logger_closure.prototype = {
@@ -7120,37 +7081,40 @@
         $parent = F.Logger_Logger(C.JSString_methods.substring$2(thisName, 0, dot));
         thisName = C.JSString_methods.substring$1(thisName, dot + 1);
       }
-      t1 = new F.Logger(thisName, $parent, P.LinkedHashMap_LinkedHashMap$_empty(type$.legacy_String, type$.legacy_Logger));
+      t1 = new F.Logger(thisName, $parent, P.LinkedHashMap_LinkedHashMap$_empty(type$.String, type$.Logger));
       if ($parent == null)
         t1._level = C.Level_INFO_800;
       else
         $parent._children.$indexSet(0, thisName, t1);
       return t1;
     },
-    $signature: 25
+    $signature: 23
   };
   M.SseClient.prototype = {
+    get$_eventSource: function() {
+      var t1 = this.__SseClient__eventSource;
+      return t1 == null ? H.throwExpression(H.LateError$fieldNI("_eventSource")) : t1;
+    },
     SseClient$1: function(serverUrl) {
-      var t2, t3, t4, _this = this,
-        clientId = T.generateUuidV4(),
-        t1 = W.EventSource__factoryEventSource(serverUrl + "?sseClientId=" + clientId, P.LinkedHashMap_LinkedHashMap$_literal(["withCredentials", true], type$.String, type$.dynamic));
-      _this._eventSource = t1;
-      _this._serverUrl = serverUrl + "?sseClientId=" + clientId;
-      t1 = new W._EventStream(t1, "open", false, type$._EventStream_legacy_Event);
+      var t1, t2, t3, t4, _this = this,
+        clientId = T.generateUuidV4();
+      _this.__SseClient__eventSource = W.EventSource__factoryEventSource(serverUrl + "?sseClientId=" + clientId, P.LinkedHashMap_LinkedHashMap$_literal(["withCredentials", true], type$.String, type$.dynamic));
+      _this.__SseClient__serverUrl = serverUrl + "?sseClientId=" + clientId;
+      t1 = new W._EventStream(_this.get$_eventSource(), "open", false, type$._EventStream_Event);
       t1.get$first(t1).whenComplete$1(new M.SseClient_closure(_this));
-      C.EventSource_methods.addEventListener$2(_this._eventSource, "message", _this.get$_onIncomingMessage());
-      C.EventSource_methods.addEventListener$2(_this._eventSource, "control", _this.get$_onIncomingControlMessage());
-      t1 = _this._eventSource;
-      t2 = type$.nullable_void_Function_legacy_Event;
+      C.EventSource_methods.addEventListener$2(_this.get$_eventSource(), "message", _this.get$_onIncomingMessage());
+      C.EventSource_methods.addEventListener$2(_this.get$_eventSource(), "control", _this.get$_onIncomingControlMessage());
+      t1 = _this.get$_eventSource();
+      t2 = type$.nullable_void_Function_Event;
       t3 = t2._as(new M.SseClient_closure0(_this));
       type$.nullable_void_Function._as(null);
-      t4 = type$.legacy_Event;
+      t4 = type$.Event;
       W._EventStreamSubscription$(t1, "open", t3, false, t4);
-      W._EventStreamSubscription$(_this._eventSource, "error", t2._as(new M.SseClient_closure1(_this)), false, t4);
+      W._EventStreamSubscription$(_this.get$_eventSource(), "error", t2._as(new M.SseClient_closure1(_this)), false, t4);
     },
     close$0: function(_) {
       var t1, _this = this;
-      _this._eventSource.close();
+      _this.get$_eventSource().close();
       if (_this._onConnected.future._state === 0) {
         t1 = _this._outgoingController;
         new P._ControllerStream(t1, H._instanceType(t1)._eval$1("_ControllerStream<1>")).listen$2$cancelOnError(null, true).asFuture$1$1(null, type$.dynamic);
@@ -7159,20 +7123,20 @@
       _this._outgoingController.close$0(0);
     },
     _onIncomingControlMessage$1: function(message) {
-      var data = new P._AcceptStructuredCloneDart2Js([], []).convertNativeToDart_AcceptStructuredClone$2$mustCopy(type$.legacy_MessageEvent._as(type$.legacy_Event._as(message)).data, true);
+      var data = new P._AcceptStructuredCloneDart2Js([], []).convertNativeToDart_AcceptStructuredClone$2$mustCopy(type$.MessageEvent._as(type$.Event._as(message)).data, true);
       if (J.$eq$(data, "close"))
         this.close$0(0);
       else
         throw H.wrapException(P.UnsupportedError$('Illegal Control Message "' + H.S(data) + '"'));
     },
     _onIncomingMessage$1: function(message) {
-      this._incomingController.add$1(0, H._asStringS(C.C_JsonCodec.decode$2$reviver(0, H._asStringS(new P._AcceptStructuredCloneDart2Js([], []).convertNativeToDart_AcceptStructuredClone$2$mustCopy(type$.legacy_MessageEvent._as(type$.legacy_Event._as(message)).data, true)), null)));
+      this._incomingController.add$1(0, H._asString(C.C_JsonCodec.decode$2$reviver(0, H._asString(new P._AcceptStructuredCloneDart2Js([], []).convertNativeToDart_AcceptStructuredClone$2$mustCopy(type$.MessageEvent._as(type$.Event._as(message)).data, true)), null)));
     },
     _onOutgoingDone$0: function() {
       this.close$0(0);
     },
     _onOutgoingMessage$1: function(message) {
-      return this._onOutgoingMessage$body$SseClient(H._asStringS(message));
+      return this._onOutgoingMessage$body$SseClient(H._asStringQ(message));
     },
     _onOutgoingMessage$body$SseClient: function(message) {
       var $async$goto = 0,
@@ -7202,8 +7166,9 @@
                   throw exception;
               }
               $async$handler = 3;
+              t1 = $async$self.__SseClient__serverUrl;
               $async$goto = 6;
-              return P._asyncAwait(W.HttpRequest_request($async$self._serverUrl + "&messageId=" + ++$async$self._lastMessageId, "POST", encodedMessage, true), $async$_onOutgoingMessage$1);
+              return P._asyncAwait(W.HttpRequest_request((t1 == null ? H.throwExpression(H.LateError$fieldNI("_serverUrl")) : t1) + "&messageId=" + ++$async$self._lastMessageId, "POST", encodedMessage, true), $async$_onOutgoingMessage$1);
             case 6:
               // returning from await.
               $async$handler = 1;
@@ -7215,8 +7180,7 @@
               $async$handler = 2;
               $async$exception = $async$currentError;
               e1 = H.unwrapException($async$exception);
-              t1 = "Failed to send " + H.S(message) + ":\n " + H.S(e1);
-              $async$self._logger.log$4(C.Level_SEVERE_1000, t1, null, null);
+              $async$self._logger.log$4(C.Level_SEVERE_1000, "Failed to send " + H.S(message) + ":\n " + H.S(e1), null, null);
               $async$self.close$0(0);
               // goto after finally
               $async$goto = 5;
@@ -7246,7 +7210,7 @@
       t2 = t1._outgoingController;
       new P._ControllerStream(t2, H._instanceType(t2)._eval$1("_ControllerStream<1>")).listen$2$onDone(t1.get$_onOutgoingMessage(), t1.get$_onOutgoingDone());
     },
-    $signature: 1
+    $signature: 3
   };
   M.SseClient_closure0.prototype = {
     call$1: function(_) {
@@ -7254,7 +7218,7 @@
       if (t1 != null)
         t1.cancel$0();
     },
-    $signature: 12
+    $signature: 1
   };
   M.SseClient_closure1.prototype = {
     call$1: function(error) {
@@ -7264,7 +7228,7 @@
       if (t2 !== true)
         t1._errorTimer = P.Timer_Timer(C.Duration_5000000, new M.SseClient__closure(t1, error));
     },
-    $signature: 12
+    $signature: 1
   };
   M.SseClient__closure.prototype = {
     call$0: function() {
@@ -7286,45 +7250,45 @@
       if (t1.future._state === 0)
         t1.completeError$1(error);
     },
-    $signature: 1
+    $signature: 0
   };
   T.generateUuidV4__generateBits.prototype = {
     call$1: function(bitCount) {
       return this.random.nextInt$1(C.JSInt_methods._shlPositive$1(1, bitCount));
     },
-    $signature: 27
+    $signature: 25
   };
   T.generateUuidV4__printDigits.prototype = {
     call$2: function(value, count) {
       return C.JSString_methods.padLeft$2(C.JSInt_methods.toRadixString$1(value, 16), count, "0");
     },
-    $signature: 13
+    $signature: 11
   };
   T.generateUuidV4__bitsDigits.prototype = {
     call$2: function(bitCount, digitCount) {
       return this._printDigits.call$2(this._generateBits.call$1(bitCount), digitCount);
     },
-    $signature: 13
+    $signature: 11
   };
   R.StreamChannelMixin.prototype = {};
   E.main_closure.prototype = {
     call$1: function(_) {
-      type$.legacy_MouseEvent._as(_);
+      type$.MouseEvent._as(_);
       this.channel._outgoingController.close$0(0);
     },
-    $signature: 28
+    $signature: 26
   };
   E.main_closure0.prototype = {
     call$1: function(s) {
       var count, t1, t2, t3, i, t4, t5, lastEvent;
-      H._asStringS(s);
-      if (J.startsWith$1$s(s, "send ")) {
+      H._asString(s);
+      if (C.JSString_methods.startsWith$1(s, "send ")) {
         count = P.int_parse(C.JSArray_methods.get$last(s.split(" ")));
         for (t1 = this.channel._outgoingController, t2 = H._instanceType(t1), t3 = t2._precomputed1, t2 = t2._eval$1("_DelayedData<1>"), i = 0; i < count; ++i) {
           t4 = t3._as("" + i);
-          if (t1._state >= 4)
-            H.throwExpression(t1._badEventState$0());
           t5 = t1._state;
+          if (t5 >= 4)
+            H.throwExpression(t1._badEventState$0());
           if ((t5 & 1) !== 0)
             t1._sendData$1(t4);
           else if ((t5 & 3) === 0) {
@@ -7344,7 +7308,7 @@
         t1.add$1(0, H._instanceType(t1)._precomputed1._as(s));
       }
     },
-    $signature: 29
+    $signature: 27
   };
   (function aliases() {
     var _ = J.Interceptor.prototype;
@@ -7360,34 +7324,34 @@
       _instance_2_u = hunkHelpers._instance_2u,
       _instance_1_u = hunkHelpers._instance_1u,
       _instance_0_u = hunkHelpers._instance_0u;
-    _static_1(P, "async__AsyncRun__scheduleImmediateJsOverride$closure", "_AsyncRun__scheduleImmediateJsOverride", 3);
-    _static_1(P, "async__AsyncRun__scheduleImmediateWithSetImmediate$closure", "_AsyncRun__scheduleImmediateWithSetImmediate", 3);
-    _static_1(P, "async__AsyncRun__scheduleImmediateWithTimer$closure", "_AsyncRun__scheduleImmediateWithTimer", 3);
+    _static_1(P, "async__AsyncRun__scheduleImmediateJsOverride$closure", "_AsyncRun__scheduleImmediateJsOverride", 4);
+    _static_1(P, "async__AsyncRun__scheduleImmediateWithSetImmediate$closure", "_AsyncRun__scheduleImmediateWithSetImmediate", 4);
+    _static_1(P, "async__AsyncRun__scheduleImmediateWithTimer$closure", "_AsyncRun__scheduleImmediateWithTimer", 4);
     _static_0(P, "async___startMicrotaskLoop$closure", "_startMicrotaskLoop", 0);
     _static_1(P, "async___nullDataHandler$closure", "_nullDataHandler", 2);
-    _static_2(P, "async___nullErrorHandler$closure", "_nullErrorHandler", 6);
+    _static_2(P, "async___nullErrorHandler$closure", "_nullErrorHandler", 7);
     _static_0(P, "async___nullDoneHandler$closure", "_nullDoneHandler", 0);
-    _instance(P._Completer.prototype, "get$completeError", 0, 1, null, ["call$2", "call$1"], ["completeError$2", "completeError$1"], 20, 0);
-    _instance_2_u(P._Future.prototype, "get$_completeError", "_completeError$2", 6);
-    _static_1(P, "convert___defaultToEncodable$closure", "_defaultToEncodable", 4);
+    _instance(P._Completer.prototype, "get$completeError", 0, 1, null, ["call$2", "call$1"], ["completeError$2", "completeError$1"], 18, 0);
+    _instance_2_u(P._Future.prototype, "get$_completeError", "_completeError$2", 7);
+    _static_1(P, "convert___defaultToEncodable$closure", "_defaultToEncodable", 5);
     var _;
-    _instance_1_u(_ = M.SseClient.prototype, "get$_onIncomingControlMessage", "_onIncomingControlMessage$1", 11);
-    _instance_1_u(_, "get$_onIncomingMessage", "_onIncomingMessage$1", 11);
+    _instance_1_u(_ = M.SseClient.prototype, "get$_onIncomingControlMessage", "_onIncomingControlMessage$1", 1);
+    _instance_1_u(_, "get$_onIncomingMessage", "_onIncomingMessage$1", 1);
     _instance_0_u(_, "get$_onOutgoingDone", "_onOutgoingDone$0", 0);
-    _instance_1_u(_, "get$_onOutgoingMessage", "_onOutgoingMessage$1", 26);
+    _instance_1_u(_, "get$_onOutgoingMessage", "_onOutgoingMessage$1", 24);
   })();
   (function inheritance() {
     var _mixin = hunkHelpers.mixin,
       _inherit = hunkHelpers.inherit,
       _inheritMany = hunkHelpers.inheritMany;
     _inherit(P.Object, null);
-    _inheritMany(P.Object, [H.JS_CONST, J.Interceptor, J.ArrayIterator, P.Error, H.Closure, P.Iterable, H.ListIterator, H.FixedLengthListMixin, H.TypeErrorDecoder, H.NullThrownFromJavaScriptException, H.ExceptionAndStackTrace, H._StackTrace, P.MapMixin, H.LinkedHashMapCell, H.LinkedHashMapKeyIterator, H.Rti, H._FunctionParameters, H._Type, P._TimerImpl, P._AsyncAwaitCompleter, P._Completer, P._FutureListener, P._Future, P._AsyncCallbackEntry, P.Stream, P.StreamSubscription, P.StreamTransformerBase, P._StreamController, P._AsyncStreamControllerDispatch, P._BufferingStreamSubscription, P._StreamSinkWrapper, P._DelayedEvent, P._DelayedDone, P._PendingEvents, P._StreamIterator, P.AsyncError, P._Zone, P.ListMixin, P.Codec, P._JsonStringifier, P.DateTime, P.Duration, P.OutOfMemoryError, P.StackOverflowError, P._Exception, P.FormatException, P.Null, P._StringStackTrace, P.StringBuffer, W.EventStreamProvider, P._AcceptStructuredClone, P._JSRandom, Y.Level, L.LogRecord, F.Logger, R.StreamChannelMixin]);
+    _inheritMany(P.Object, [H.JS_CONST, J.Interceptor, J.ArrayIterator, P.Error, H.Closure, P.Iterable, H.ListIterator, H.FixedLengthListMixin, H.TypeErrorDecoder, H.NullThrownFromJavaScriptException, H.ExceptionAndStackTrace, H._StackTrace, P.MapMixin, H.LinkedHashMapCell, H.LinkedHashMapKeyIterator, H.Rti, H._FunctionParameters, P._TimerImpl, P._AsyncAwaitCompleter, P.AsyncError, P._Completer, P._FutureListener, P._Future, P._AsyncCallbackEntry, P.Stream, P.StreamSubscription, P.StreamTransformerBase, P._StreamController, P._AsyncStreamControllerDispatch, P._BufferingStreamSubscription, P._StreamSinkWrapper, P._DelayedEvent, P._DelayedDone, P._PendingEvents, P._StreamIterator, P._Zone, P.ListMixin, P.Codec, P._JsonStringifier, P.DateTime, P.Duration, P.OutOfMemoryError, P.StackOverflowError, P._Exception, P.FormatException, P.Null, P._StringStackTrace, P.StringBuffer, W.EventStreamProvider, P._AcceptStructuredClone, P.NullRejectionException, P._JSRandom, Y.Level, L.LogRecord, F.Logger, R.StreamChannelMixin]);
     _inheritMany(J.Interceptor, [J.JSBool, J.JSNull, J.JavaScriptObject, J.JSArray, J.JSNumber, J.JSString, H.NativeTypedData, W.EventTarget, W.DomException, W.Event]);
     _inheritMany(J.JavaScriptObject, [J.PlainJavaScriptObject, J.UnknownJavaScriptObject, J.JavaScriptFunction]);
     _inherit(J.JSUnmodifiableArray, J.JSArray);
-    _inheritMany(J.JSNumber, [J.JSInt, J.JSDouble]);
-    _inheritMany(P.Error, [H.LateError, H.NotNullableError, P.TypeError, H.JsNoSuchMethodError, H.UnknownJsTypeError, H.RuntimeError, P.AssertionError, H._Error, P.JsonUnsupportedObjectError, P.NullThrownError, P.ArgumentError, P.UnsupportedError, P.UnimplementedError, P.StateError, P.ConcurrentModificationError, P.CyclicInitializationError]);
-    _inheritMany(H.Closure, [H.closure, H.TearOffClosure, H.initHooks_closure, H.initHooks_closure0, H.initHooks_closure1, P._AsyncRun__initializeScheduleImmediate_internalCallback, P._AsyncRun__initializeScheduleImmediate_closure, P._AsyncRun__scheduleImmediateJsOverride_internalCallback, P._AsyncRun__scheduleImmediateWithSetImmediate_internalCallback, P._TimerImpl_internalCallback, P._awaitOnObject_closure, P._awaitOnObject_closure0, P._wrapJsFunctionForAsync_closure, P._Future__addListener_closure, P._Future__prependListeners_closure, P._Future__chainForeignFuture_closure, P._Future__chainForeignFuture_closure0, P._Future__chainForeignFuture_closure1, P._Future__asyncCompleteWithValue_closure, P._Future__chainFuture_closure, P._Future__asyncCompleteError_closure, P._Future__propagateToListeners_handleWhenCompleteCallback, P._Future__propagateToListeners_handleWhenCompleteCallback_closure, P._Future__propagateToListeners_handleValueCallback, P._Future__propagateToListeners_handleError, P.Stream_length_closure, P.Stream_length_closure0, P.Stream_first_closure, P.Stream_first_closure0, P._StreamController__subscribe_closure, P._StreamController__recordCancel_complete, P._BufferingStreamSubscription_asFuture_closure, P._BufferingStreamSubscription_asFuture_closure0, P._BufferingStreamSubscription_asFuture__closure, P._BufferingStreamSubscription__sendError_sendError, P._BufferingStreamSubscription__sendDone_sendDone, P._PendingEvents_schedule_closure, P._cancelAndValue_closure, P._rootHandleUncaughtError_closure, P._RootZone_bindCallback_closure, P._RootZone_bindCallbackGuarded_closure, P._RootZone_bindUnaryCallbackGuarded_closure, P.MapBase_mapToString_closure, P._JsonStringifier_writeMap_closure, P.Duration_toString_sixDigits, P.Duration_toString_twoDigits, W.HttpRequest_request_closure, W._EventStreamSubscription_closure, W._EventStreamSubscription_onData_closure, P._AcceptStructuredClone_walk_closure, P._convertDartToNative_Value_closure, P.convertDartToNative_Dictionary_closure, P.promiseToFuture_closure, P.promiseToFuture_closure0, F.Logger_Logger_closure, M.SseClient_closure, M.SseClient_closure0, M.SseClient_closure1, M.SseClient__closure, T.generateUuidV4__generateBits, T.generateUuidV4__printDigits, T.generateUuidV4__bitsDigits, E.main_closure, E.main_closure0]);
+    _inheritMany(J.JSNumber, [J.JSInt, J.JSNumNotInt]);
+    _inheritMany(P.Error, [H.LateError, P.TypeError, H.JsNoSuchMethodError, H.UnknownJsTypeError, H.RuntimeError, P.AssertionError, H._Error, P.JsonUnsupportedObjectError, P.NullThrownError, P.ArgumentError, P.UnsupportedError, P.UnimplementedError, P.StateError, P.ConcurrentModificationError, P.CyclicInitializationError]);
+    _inheritMany(H.Closure, [H.nullFuture_closure, H.TearOffClosure, H.initHooks_closure, H.initHooks_closure0, H.initHooks_closure1, P._AsyncRun__initializeScheduleImmediate_internalCallback, P._AsyncRun__initializeScheduleImmediate_closure, P._AsyncRun__scheduleImmediateJsOverride_internalCallback, P._AsyncRun__scheduleImmediateWithSetImmediate_internalCallback, P._TimerImpl_internalCallback, P._awaitOnObject_closure, P._awaitOnObject_closure0, P._wrapJsFunctionForAsync_closure, P._Future__addListener_closure, P._Future__prependListeners_closure, P._Future__chainForeignFuture_closure, P._Future__chainForeignFuture_closure0, P._Future__chainForeignFuture_closure1, P._Future__asyncCompleteWithValue_closure, P._Future__chainFuture_closure, P._Future__asyncCompleteError_closure, P._Future__propagateToListeners_handleWhenCompleteCallback, P._Future__propagateToListeners_handleWhenCompleteCallback_closure, P._Future__propagateToListeners_handleValueCallback, P._Future__propagateToListeners_handleError, P.Stream_length_closure, P.Stream_length_closure0, P.Stream_first_closure, P.Stream_first_closure0, P._StreamController__subscribe_closure, P._StreamController__recordCancel_complete, P._BufferingStreamSubscription_asFuture_closure, P._BufferingStreamSubscription_asFuture_closure0, P._BufferingStreamSubscription_asFuture__closure, P._BufferingStreamSubscription__sendError_sendError, P._BufferingStreamSubscription__sendDone_sendDone, P._PendingEvents_schedule_closure, P._cancelAndValue_closure, P._rootHandleUncaughtError_closure, P._RootZone_bindCallbackGuarded_closure, P._RootZone_bindUnaryCallbackGuarded_closure, P.MapBase_mapToString_closure, P._JsonStringifier_writeMap_closure, P.Duration_toString_sixDigits, P.Duration_toString_twoDigits, W.HttpRequest_request_closure, W._EventStreamSubscription_closure, W._EventStreamSubscription_onData_closure, P._AcceptStructuredClone_walk_closure, P._convertDartToNative_Value_closure, P.convertDartToNative_Dictionary_closure, P.promiseToFuture_closure, P.promiseToFuture_closure0, F.Logger_Logger_closure, M.SseClient_closure, M.SseClient_closure0, M.SseClient_closure1, M.SseClient__closure, T.generateUuidV4__generateBits, T.generateUuidV4__printDigits, T.generateUuidV4__bitsDigits, E.main_closure, E.main_closure0]);
     _inherit(H.EfficientLengthIterable, P.Iterable);
     _inheritMany(H.EfficientLengthIterable, [H.ListIterable, H.LinkedHashMapKeyIterable]);
     _inherit(H.NullError, P.TypeError);
@@ -7441,12 +7405,12 @@
     mangledNames: {},
     getTypeFromName: getGlobalFromName,
     metadata: [],
-    types: ["~()", "Null()", "~(@)", "~(~())", "@(@)", "Null(@)", "~(Object,StackTrace)", "Null(Object,StackTrace)", "~(Object?,Object?)", "String(int)", "~(Event)", "~(Event*)", "Null(Event*)", "String*(int*,int*)", "Future<Null>()", "@(@,String)", "@(String)", "Null(~())", "Null(@,StackTrace)", "~(int,@)", "~(Object[StackTrace?])", "_Future<@>(@)", "~(ProgressEvent)", "@(@,@)", "~(@,@)", "Logger*()", "~(String*)", "int*(int*)", "Null(MouseEvent*)", "Null(String*)"],
+    types: ["~()", "~(Event)", "~(@)", "Null()", "~(~())", "@(@)", "Null(@)", "~(Object,StackTrace)", "Null(Object,StackTrace)", "~(Object?,Object?)", "String(int)", "String(int,int)", "Future<Null>()", "@(@,String)", "@(String)", "Null(~())", "Null(@,StackTrace)", "~(int,@)", "~(Object[StackTrace?])", "_Future<@>(@)", "~(ProgressEvent)", "@(@,@)", "~(@,@)", "Logger()", "~(String?)", "int(int)", "~(MouseEvent)", "~(String)"],
     interceptorsByTag: null,
     leafTags: null,
     arrayRti: typeof Symbol == "function" && typeof Symbol() == "symbol" ? Symbol("$ti") : "$ti"
   };
-  H._Universe_addRules(init.typeUniverse, JSON.parse('{"JavaScriptFunction":"JavaScriptObject","PlainJavaScriptObject":"JavaScriptObject","UnknownJavaScriptObject":"JavaScriptObject","AbortPaymentEvent":"Event","ExtendableEvent":"Event","AElement":"SvgElement","GraphicsElement":"SvgElement","_ResourceProgressEvent":"ProgressEvent","AudioElement":"HtmlElement","MediaElement":"HtmlElement","PointerEvent":"MouseEvent","CompositionEvent":"UIEvent","MessagePort":"EventTarget","HtmlDocument":"Node","Document":"Node","NativeFloat32List":"NativeTypedArrayOfDouble","JSBool":{"bool":[]},"JSNull":{"Null":[]},"JavaScriptObject":{"Function":[]},"JSArray":{"List":["1"],"Iterable":["1"]},"JSUnmodifiableArray":{"JSArray":["1"],"List":["1"],"Iterable":["1"]},"JSNumber":{"double":[],"num":[]},"JSInt":{"double":[],"int":[],"num":[]},"JSDouble":{"double":[],"num":[]},"JSString":{"String":[],"Pattern":[]},"LateError":{"Error":[]},"NotNullableError":{"Error":[]},"EfficientLengthIterable":{"Iterable":["1"]},"ListIterable":{"Iterable":["1"]},"NullError":{"Error":[]},"JsNoSuchMethodError":{"Error":[]},"UnknownJsTypeError":{"Error":[]},"_StackTrace":{"StackTrace":[]},"Closure":{"Function":[]},"TearOffClosure":{"Function":[]},"StaticClosure":{"Function":[]},"BoundClosure":{"Function":[]},"RuntimeError":{"Error":[]},"_AssertionError":{"Error":[]},"JsLinkedHashMap":{"MapMixin":["1","2"],"LinkedHashMap":["1","2"],"Map":["1","2"],"MapMixin.K":"1","MapMixin.V":"2"},"LinkedHashMapKeyIterable":{"Iterable":["1"]},"NativeTypedArray":{"JavaScriptIndexingBehavior":["1"]},"NativeTypedArrayOfDouble":{"ListMixin":["double"],"JavaScriptIndexingBehavior":["double"],"List":["double"],"Iterable":["double"],"FixedLengthListMixin":["double"],"ListMixin.E":"double"},"NativeTypedArrayOfInt":{"ListMixin":["int"],"JavaScriptIndexingBehavior":["int"],"List":["int"],"Iterable":["int"],"FixedLengthListMixin":["int"]},"NativeInt16List":{"ListMixin":["int"],"JavaScriptIndexingBehavior":["int"],"List":["int"],"Iterable":["int"],"FixedLengthListMixin":["int"],"ListMixin.E":"int"},"NativeInt32List":{"ListMixin":["int"],"JavaScriptIndexingBehavior":["int"],"List":["int"],"Iterable":["int"],"FixedLengthListMixin":["int"],"ListMixin.E":"int"},"NativeInt8List":{"ListMixin":["int"],"JavaScriptIndexingBehavior":["int"],"List":["int"],"Iterable":["int"],"FixedLengthListMixin":["int"],"ListMixin.E":"int"},"NativeUint16List":{"ListMixin":["int"],"JavaScriptIndexingBehavior":["int"],"List":["int"],"Iterable":["int"],"FixedLengthListMixin":["int"],"ListMixin.E":"int"},"NativeUint32List":{"ListMixin":["int"],"JavaScriptIndexingBehavior":["int"],"List":["int"],"Iterable":["int"],"FixedLengthListMixin":["int"],"ListMixin.E":"int"},"NativeUint8ClampedList":{"ListMixin":["int"],"JavaScriptIndexingBehavior":["int"],"List":["int"],"Iterable":["int"],"FixedLengthListMixin":["int"],"ListMixin.E":"int"},"NativeUint8List":{"ListMixin":["int"],"JavaScriptIndexingBehavior":["int"],"List":["int"],"Iterable":["int"],"FixedLengthListMixin":["int"],"ListMixin.E":"int"},"_Error":{"Error":[]},"_TypeError":{"Error":[]},"_TimerImpl":{"Timer":[]},"_AsyncAwaitCompleter":{"Completer":["1"]},"_Completer":{"Completer":["1"]},"_AsyncCompleter":{"_Completer":["1"],"Completer":["1"]},"_Future":{"Future":["1"]},"_StreamController":{"StreamController":["1"],"_StreamControllerLifecycle":["1"],"_EventDispatch":["1"]},"_AsyncStreamController":{"_AsyncStreamControllerDispatch":["1"],"_StreamController":["1"],"StreamController":["1"],"_StreamControllerLifecycle":["1"],"_EventDispatch":["1"]},"_ControllerStream":{"_StreamImpl":["1"],"Stream":["1"]},"_ControllerSubscription":{"_BufferingStreamSubscription":["1"],"StreamSubscription":["1"],"_EventDispatch":["1"]},"_BufferingStreamSubscription":{"StreamSubscription":["1"],"_EventDispatch":["1"]},"_StreamImpl":{"Stream":["1"]},"_DelayedData":{"_DelayedEvent":["1"]},"_DelayedError":{"_DelayedEvent":["@"]},"_DelayedDone":{"_DelayedEvent":["@"]},"_StreamImplEvents":{"_PendingEvents":["1"]},"AsyncError":{"Error":[]},"_Zone":{"Zone":[]},"_RootZone":{"_Zone":[],"Zone":[]},"MapBase":{"MapMixin":["1","2"],"Map":["1","2"]},"MapMixin":{"Map":["1","2"]},"_JsonMap":{"MapMixin":["String","@"],"Map":["String","@"],"MapMixin.K":"String","MapMixin.V":"@"},"_JsonMapKeyIterable":{"ListIterable":["String"],"Iterable":["String"],"ListIterable.E":"String"},"JsonUnsupportedObjectError":{"Error":[]},"JsonCyclicError":{"Error":[]},"JsonEncoder":{"Converter":["Object?","String"]},"JsonDecoder":{"Converter":["String","Object?"]},"double":{"num":[]},"int":{"num":[]},"String":{"Pattern":[]},"AssertionError":{"Error":[]},"TypeError":{"Error":[]},"NullThrownError":{"Error":[]},"ArgumentError":{"Error":[]},"RangeError":{"Error":[]},"IndexError":{"Error":[]},"UnsupportedError":{"Error":[]},"UnimplementedError":{"Error":[]},"StateError":{"Error":[]},"ConcurrentModificationError":{"Error":[]},"OutOfMemoryError":{"Error":[]},"StackOverflowError":{"Error":[]},"CyclicInitializationError":{"Error":[]},"_StringStackTrace":{"StackTrace":[]},"StringBuffer":{"StringSink":[]},"HtmlElement":{"Element":[],"EventTarget":[]},"AnchorElement":{"Element":[],"EventTarget":[]},"AreaElement":{"Element":[],"EventTarget":[]},"Element":{"EventTarget":[]},"EventSource":{"EventTarget":[]},"FormElement":{"Element":[],"EventTarget":[]},"HttpRequest":{"EventTarget":[]},"HttpRequestEventTarget":{"EventTarget":[]},"MessageEvent":{"Event":[]},"MouseEvent":{"Event":[]},"Node":{"EventTarget":[]},"ProgressEvent":{"Event":[]},"SelectElement":{"Element":[],"EventTarget":[]},"UIEvent":{"Event":[]},"_EventStream":{"Stream":["1"]},"_ElementEventStreamImpl":{"_EventStream":["1"],"Stream":["1"]},"_EventStreamSubscription":{"StreamSubscription":["1"]},"SvgElement":{"Element":[],"EventTarget":[]}}'));
+  H._Universe_addRules(init.typeUniverse, JSON.parse('{"PlainJavaScriptObject":"JavaScriptObject","UnknownJavaScriptObject":"JavaScriptObject","JavaScriptFunction":"JavaScriptObject","AbortPaymentEvent":"Event","ExtendableEvent":"Event","AElement":"SvgElement","GraphicsElement":"SvgElement","_ResourceProgressEvent":"ProgressEvent","AudioElement":"HtmlElement","MediaElement":"HtmlElement","PointerEvent":"MouseEvent","CompositionEvent":"UIEvent","MessagePort":"EventTarget","HtmlDocument":"Node","Document":"Node","NativeFloat32List":"NativeTypedArrayOfDouble","JSBool":{"bool":[]},"JSNull":{"Null":[]},"JSArray":{"List":["1"],"Iterable":["1"]},"JSUnmodifiableArray":{"JSArray":["1"],"List":["1"],"Iterable":["1"]},"JSNumber":{"double":[],"num":[]},"JSInt":{"double":[],"int":[],"num":[]},"JSNumNotInt":{"double":[],"num":[]},"JSString":{"String":[],"Pattern":[]},"LateError":{"Error":[]},"EfficientLengthIterable":{"Iterable":["1"]},"ListIterable":{"Iterable":["1"]},"NullError":{"Error":[]},"JsNoSuchMethodError":{"Error":[]},"UnknownJsTypeError":{"Error":[]},"_StackTrace":{"StackTrace":[]},"Closure":{"Function":[]},"TearOffClosure":{"Function":[]},"StaticClosure":{"Function":[]},"BoundClosure":{"Function":[]},"RuntimeError":{"Error":[]},"_AssertionError":{"Error":[]},"JsLinkedHashMap":{"MapMixin":["1","2"],"LinkedHashMap":["1","2"],"Map":["1","2"],"MapMixin.K":"1","MapMixin.V":"2"},"LinkedHashMapKeyIterable":{"Iterable":["1"]},"NativeTypedArray":{"JavaScriptIndexingBehavior":["1"]},"NativeTypedArrayOfDouble":{"ListMixin":["double"],"JavaScriptIndexingBehavior":["double"],"List":["double"],"Iterable":["double"],"FixedLengthListMixin":["double"],"ListMixin.E":"double"},"NativeTypedArrayOfInt":{"ListMixin":["int"],"JavaScriptIndexingBehavior":["int"],"List":["int"],"Iterable":["int"],"FixedLengthListMixin":["int"]},"NativeInt16List":{"ListMixin":["int"],"JavaScriptIndexingBehavior":["int"],"List":["int"],"Iterable":["int"],"FixedLengthListMixin":["int"],"ListMixin.E":"int"},"NativeInt32List":{"ListMixin":["int"],"JavaScriptIndexingBehavior":["int"],"List":["int"],"Iterable":["int"],"FixedLengthListMixin":["int"],"ListMixin.E":"int"},"NativeInt8List":{"ListMixin":["int"],"JavaScriptIndexingBehavior":["int"],"List":["int"],"Iterable":["int"],"FixedLengthListMixin":["int"],"ListMixin.E":"int"},"NativeUint16List":{"ListMixin":["int"],"JavaScriptIndexingBehavior":["int"],"List":["int"],"Iterable":["int"],"FixedLengthListMixin":["int"],"ListMixin.E":"int"},"NativeUint32List":{"ListMixin":["int"],"JavaScriptIndexingBehavior":["int"],"List":["int"],"Iterable":["int"],"FixedLengthListMixin":["int"],"ListMixin.E":"int"},"NativeUint8ClampedList":{"ListMixin":["int"],"JavaScriptIndexingBehavior":["int"],"List":["int"],"Iterable":["int"],"FixedLengthListMixin":["int"],"ListMixin.E":"int"},"NativeUint8List":{"ListMixin":["int"],"JavaScriptIndexingBehavior":["int"],"List":["int"],"Iterable":["int"],"FixedLengthListMixin":["int"],"ListMixin.E":"int"},"_Error":{"Error":[]},"_TypeError":{"Error":[]},"_Future":{"Future":["1"]},"_TimerImpl":{"Timer":[]},"_AsyncAwaitCompleter":{"Completer":["1"]},"AsyncError":{"Error":[]},"_Completer":{"Completer":["1"]},"_AsyncCompleter":{"_Completer":["1"],"Completer":["1"]},"_StreamController":{"StreamController":["1"],"_StreamControllerLifecycle":["1"],"_EventDispatch":["1"]},"_AsyncStreamController":{"_AsyncStreamControllerDispatch":["1"],"_StreamController":["1"],"StreamController":["1"],"_StreamControllerLifecycle":["1"],"_EventDispatch":["1"]},"_ControllerStream":{"_StreamImpl":["1"],"Stream":["1"]},"_ControllerSubscription":{"_BufferingStreamSubscription":["1"],"StreamSubscription":["1"],"_EventDispatch":["1"]},"_BufferingStreamSubscription":{"StreamSubscription":["1"],"_EventDispatch":["1"]},"_StreamImpl":{"Stream":["1"]},"_DelayedData":{"_DelayedEvent":["1"]},"_DelayedError":{"_DelayedEvent":["@"]},"_DelayedDone":{"_DelayedEvent":["@"]},"_StreamImplEvents":{"_PendingEvents":["1"]},"_Zone":{"Zone":[]},"_RootZone":{"_Zone":[],"Zone":[]},"MapBase":{"MapMixin":["1","2"],"Map":["1","2"]},"MapMixin":{"Map":["1","2"]},"_JsonMap":{"MapMixin":["String","@"],"Map":["String","@"],"MapMixin.K":"String","MapMixin.V":"@"},"_JsonMapKeyIterable":{"ListIterable":["String"],"Iterable":["String"],"ListIterable.E":"String"},"JsonUnsupportedObjectError":{"Error":[]},"JsonCyclicError":{"Error":[]},"JsonEncoder":{"Converter":["Object?","String"]},"JsonDecoder":{"Converter":["String","Object?"]},"double":{"num":[]},"int":{"num":[]},"String":{"Pattern":[]},"AssertionError":{"Error":[]},"TypeError":{"Error":[]},"NullThrownError":{"Error":[]},"ArgumentError":{"Error":[]},"RangeError":{"Error":[]},"IndexError":{"Error":[]},"UnsupportedError":{"Error":[]},"UnimplementedError":{"Error":[]},"StateError":{"Error":[]},"ConcurrentModificationError":{"Error":[]},"OutOfMemoryError":{"Error":[]},"StackOverflowError":{"Error":[]},"CyclicInitializationError":{"Error":[]},"_StringStackTrace":{"StackTrace":[]},"StringBuffer":{"StringSink":[]},"HttpRequest":{"EventTarget":[]},"HttpRequestEventTarget":{"EventTarget":[]},"MouseEvent":{"Event":[]},"ProgressEvent":{"Event":[]},"UIEvent":{"Event":[]},"HtmlElement":{"Element":[],"EventTarget":[]},"AnchorElement":{"Element":[],"EventTarget":[]},"AreaElement":{"Element":[],"EventTarget":[]},"Element":{"EventTarget":[]},"EventSource":{"EventTarget":[]},"FormElement":{"Element":[],"EventTarget":[]},"MessageEvent":{"Event":[]},"Node":{"EventTarget":[]},"SelectElement":{"Element":[],"EventTarget":[]},"_EventStream":{"Stream":["1"]},"_ElementEventStreamImpl":{"_EventStream":["1"],"Stream":["1"]},"_EventStreamSubscription":{"StreamSubscription":["1"]},"SvgElement":{"Element":[],"EventTarget":[]}}'));
   H._Universe_addErasedTypes(init.typeUniverse, JSON.parse('{"EfficientLengthIterable":1,"NativeTypedArray":1,"StreamTransformerBase":2,"MapBase":2,"Codec":2,"StreamChannelMixin":1}'));
   0;
   var type$ = (function rtii() {
@@ -7466,7 +7430,10 @@
       JavaScriptFunction: findType("JavaScriptFunction"),
       JavaScriptIndexingBehavior_dynamic: findType("JavaScriptIndexingBehavior<@>"),
       List_dynamic: findType("List<@>"),
+      Logger: findType("Logger"),
       Map_dynamic_dynamic: findType("Map<@,@>"),
+      MessageEvent: findType("MessageEvent"),
+      MouseEvent: findType("MouseEvent"),
       Null: findType("Null"),
       Object: findType("Object"),
       ProgressEvent: findType("ProgressEvent"),
@@ -7475,9 +7442,10 @@
       UnknownJavaScriptObject: findType("UnknownJavaScriptObject"),
       _AsyncCompleter_HttpRequest: findType("_AsyncCompleter<HttpRequest>"),
       _AsyncCompleter_dynamic: findType("_AsyncCompleter<@>"),
-      _ElementEventStreamImpl_legacy_MouseEvent: findType("_ElementEventStreamImpl<MouseEvent*>"),
-      _EventStream_legacy_Event: findType("_EventStream<Event*>"),
+      _ElementEventStreamImpl_MouseEvent: findType("_ElementEventStreamImpl<MouseEvent>"),
+      _EventStream_Event: findType("_EventStream<Event>"),
       _Future_HttpRequest: findType("_Future<HttpRequest>"),
+      _Future_Null: findType("_Future<Null>"),
       _Future_dynamic: findType("_Future<@>"),
       _Future_int: findType("_Future<int>"),
       _Future_void: findType("_Future<~>"),
@@ -7491,14 +7459,8 @@
       dynamic_Function_Object_StackTrace: findType("@(Object,StackTrace)"),
       dynamic_Function_dynamic_dynamic: findType("@(@,@)"),
       int: findType("int"),
-      legacy_Event: findType("Event*"),
-      legacy_Logger: findType("Logger*"),
-      legacy_MessageEvent: findType("MessageEvent*"),
-      legacy_MouseEvent: findType("MouseEvent*"),
       legacy_Never: findType("0&*"),
       legacy_Object: findType("Object*"),
-      legacy_ProgressEvent: findType("ProgressEvent*"),
-      legacy_String: findType("String*"),
       nullable_Future_Null: findType("Future<Null>?"),
       nullable_List_dynamic: findType("List<@>?"),
       nullable_Object: findType("Object?"),
@@ -7508,8 +7470,8 @@
       nullable_nullable_Object_Function_2_nullable_Object_and_nullable_Object: findType("Object?(Object?,Object?)?"),
       nullable_nullable_Object_Function_dynamic: findType("Object?(@)?"),
       nullable_void_Function: findType("~()?"),
-      nullable_void_Function_legacy_Event: findType("~(Event*)?"),
-      nullable_void_Function_legacy_ProgressEvent: findType("~(ProgressEvent*)?"),
+      nullable_void_Function_Event: findType("~(Event)?"),
+      nullable_void_Function_ProgressEvent: findType("~(ProgressEvent)?"),
       num: findType("num"),
       void: findType("~"),
       void_Function: findType("~()"),
@@ -7524,7 +7486,6 @@
     C.Interceptor_methods = J.Interceptor.prototype;
     C.JSArray_methods = J.JSArray.prototype;
     C.JSInt_methods = J.JSInt.prototype;
-    C.JSNull_methods = J.JSNull.prototype;
     C.JSNumber_methods = J.JSNumber.prototype;
     C.JSString_methods = J.JSString.prototype;
     C.JavaScriptFunction_methods = J.JavaScriptFunction.prototype;
@@ -7682,17 +7643,16 @@
     $.Zone__current = C.C__RootZone;
     $._toStringVisiting = H.setRuntimeTypeInfo([], H.findType("JSArray<Object>"));
     $.LogRecord__nextNumber = 0;
-    $.Logger__loggers = P.LinkedHashMap_LinkedHashMap$_empty(type$.legacy_String, type$.legacy_Logger);
+    $.Logger__loggers = P.LinkedHashMap_LinkedHashMap$_empty(type$.String, type$.Logger);
   })();
   (function lazyInitializers() {
     var _lazyFinal = hunkHelpers.lazyFinal,
-      _lazy = hunkHelpers.lazy,
-      _lazyOld = hunkHelpers.lazyOld;
+      _lazy = hunkHelpers.lazy;
     _lazyFinal($, "DART_CLOSURE_PROPERTY_NAME", "$get$DART_CLOSURE_PROPERTY_NAME", function() {
       return H.getIsolateAffinityTag("_$dart_dartClosure");
     });
     _lazyFinal($, "nullFuture", "$get$nullFuture", function() {
-      return C.C__RootZone.run$1$1(new H.closure(), H.findType("Future<Null>"));
+      return C.C__RootZone.run$1$1(new H.nullFuture_closure(), H.findType("Future<Null>"));
     });
     _lazyFinal($, "TypeErrorDecoder_noSuchMethodPattern", "$get$TypeErrorDecoder_noSuchMethodPattern", function() {
       return H.TypeErrorDecoder_extractPattern(H.TypeErrorDecoder_provokeCallErrorOn({
@@ -7713,7 +7673,7 @@
     });
     _lazyFinal($, "TypeErrorDecoder_nullLiteralCallPattern", "$get$TypeErrorDecoder_nullLiteralCallPattern", function() {
       return H.TypeErrorDecoder_extractPattern(function() {
-        var $argumentsExpr$ = '$arguments$';
+        var $argumentsExpr$ = "$arguments$";
         try {
           null.$method$($argumentsExpr$);
         } catch (e) {
@@ -7726,7 +7686,7 @@
     });
     _lazyFinal($, "TypeErrorDecoder_undefinedLiteralCallPattern", "$get$TypeErrorDecoder_undefinedLiteralCallPattern", function() {
       return H.TypeErrorDecoder_extractPattern(function() {
-        var $argumentsExpr$ = '$arguments$';
+        var $argumentsExpr$ = "$arguments$";
         try {
           (void 0).$method$($argumentsExpr$);
         } catch (e) {
@@ -7762,12 +7722,12 @@
       return P._AsyncRun__initializeScheduleImmediate();
     });
     _lazyFinal($, "Future__nullFuture", "$get$Future__nullFuture", function() {
-      return H.findType("_Future<Null>")._as($.$get$nullFuture());
+      return type$._Future_Null._as($.$get$nullFuture());
     });
     _lazy($, "_hasErrorStackProperty", "$get$_hasErrorStackProperty", function() {
       return new Error().stack != void 0;
     });
-    _lazyOld($, "Logger_root", "$get$Logger_root", function() {
+    _lazyFinal($, "Logger_root", "$get$Logger_root", function() {
       return F.Logger_Logger("");
     });
   })();
@@ -7811,7 +7771,7 @@
       callback(null);
       return;
     }
-    if (typeof document.currentScript != 'undefined') {
+    if (typeof document.currentScript != "undefined") {
       callback(document.currentScript);
       return;
     }
@@ -7825,10 +7785,11 @@
       scripts[i].addEventListener("load", onLoad, false);
   })(function(currentScript) {
     init.currentScript = currentScript;
+    var callMain = E.main;
     if (typeof dartMainRunner === "function")
-      dartMainRunner(E.main, []);
+      dartMainRunner(callMain, []);
     else
-      E.main([]);
+      callMain([]);
   });
 })();
 
