library test;
import self as self;
import "dart:async" as asy;
import "dart:core" as core;

static method main() → dynamic /* originally async */ {
  final asy::Completer<asy::FutureOr<dynamic>> :completer = asy::Completer::sync<asy::FutureOr<dynamic>>();
  asy::FutureOr<dynamic> :return_value;
  dynamic :async_op_then;
  dynamic :async_op_error;
  dynamic :await_jump_var = 0;
  dynamic :await_ctx_var;
  dynamic :saved_try_context_var0;
  function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
    try {
      #L1:
      {
        () → asy::Stream<core::Null> f = () → asy::Stream<core::Null> /* originally async* */ {
          dynamic :controller;
          dynamic :async_op_then;
          dynamic :async_op_error;
          dynamic :await_jump_var = 0;
          dynamic :await_ctx_var;
          dynamic :saved_try_context_var0;
          dynamic :saved_try_context_var1;
          function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
            try
              try {
                #L2:
                {
                  if(:controller.add(null))
                    return null;
                  else
                    [yield] null;
                }
                return;
              }
              on dynamic catch(dynamic :exception, dynamic :stack_trace) {
                :controller.addError(:exception, :stack_trace);
              }
            finally {
              :controller.close();
            }
          :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
          :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
          :controller = new asy::_AsyncStarStreamController::•(:async_op);
          return :controller.stream;
        };
        asy::Stream<dynamic> y = f.call();
        asy::Stream<core::String> z = f.call();
        asy::_awaitHelper(f.call().{asy::Stream::first}, :async_op_then, :async_op_error, :async_op);
        [yield] null;
        core::String s = :result;
      }
      :completer.complete(:return_value);
      return;
    }
    on dynamic catch(dynamic :exception, dynamic :stack_trace) {
      :completer.completeError(:exception, :stack_trace);
    }
  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
  asy::Future::microtask<dynamic>(:async_op);
  return :completer.future;
}
