library #lib;
import self as self;
import "dart:core" as core;
import "dart:_internal" as _in;

typedef _ScheduleImmediateClosure = (() → void) → void;
class _ScheduleImmediate extends core::Object {
  static field (() → void) → void _closure = null;
[@vm.bytecode=
Bytecode {
  Entry                0
  CheckStack           0
  Push                 FP[-5]
  PushConstant         CP#1
  IndirectStaticCall   1, CP#0
  Drop1
  PushNull
  ReturnTOS
}
ConstantPool {
  [0] = ArgDesc num-args 1, num-type-args 0, names []
  [1] = StaticICData target 'dart:core::Object::'' (constructor)', arg-desc CP#0
}
]  synthetic constructor •() → self::_ScheduleImmediate
    : super core::Object::•()
    ;
}
class _NamespaceImpl extends core::Object implements self::_Namespace {
  static field self::_NamespaceImpl _cachedNamespace = null;
[@vm.bytecode=
Bytecode {
  Entry                0
  CheckStack           0
  Push                 FP[-5]
  PushConstant         CP#1
  IndirectStaticCall   1, CP#0
  Drop1
  PushNull
  ReturnTOS
}
ConstantPool {
  [0] = ArgDesc num-args 1, num-type-args 0, names []
  [1] = StaticICData target 'dart:core::Object::'' (constructor)', arg-desc CP#0
}
]  constructor _() → self::_NamespaceImpl
    : super core::Object::•()
    ;
[@vm.bytecode=
Bytecode {
  Entry                0
  CheckStack           0
  Push                 FP[-6]
  Push                 FP[-5]
  NativeCall           CP#0
  ReturnTOS
}
ConstantPool {
  [0] = NativeEntry Namespace_Create
}
]  @_in::ExternalName::•("Namespace_Create")
  external static method _create(self::_NamespaceImpl namespace, dynamic n) → self::_NamespaceImpl;
[@vm.bytecode=
Bytecode {
  Entry                0
  CheckStack           0
  Push                 FP[-5]
  NativeCall           CP#0
  ReturnTOS
}
ConstantPool {
  [0] = NativeEntry Namespace_GetPointer
}
]  @_in::ExternalName::•("Namespace_GetPointer")
  external static method _getPointer(self::_NamespaceImpl namespace) → core::int;
[@vm.bytecode=
Bytecode {
  Entry                0
  CheckStack           0
  NativeCall           CP#0
  ReturnTOS
}
ConstantPool {
  [0] = NativeEntry Namespace_GetDefault
}
]  @_in::ExternalName::•("Namespace_GetDefault")
  external static method _getDefault() → core::int;
[@vm.bytecode=
Bytecode {
  Entry                2
  CheckStack           0
  Allocate             CP#0
  StoreLocal           r1
  Push                 r1
  PushConstant         CP#2
  IndirectStaticCall   1, CP#1
  Drop1
  Push                 FP[-5]
  PushConstant         CP#4
  IndirectStaticCall   2, CP#3
  StoreStaticTOS       CP#5
  PushNull
  ReturnTOS
}
ConstantPool {
  [0] = Class #lib::_NamespaceImpl
  [1] = ArgDesc num-args 1, num-type-args 0, names []
  [2] = StaticICData target '#lib::_NamespaceImpl::_ (constructor)', arg-desc CP#1
  [3] = ArgDesc num-args 2, num-type-args 0, names []
  [4] = StaticICData target '#lib::_NamespaceImpl::_create', arg-desc CP#3
  [5] = StaticField #lib::_NamespaceImpl::_cachedNamespace (field)
}
]  static method _setupNamespace(dynamic namespace) → void {
    self::_NamespaceImpl::_cachedNamespace = self::_NamespaceImpl::_create(new self::_NamespaceImpl::_(), namespace);
  }
[@vm.bytecode=
Bytecode {
  Entry                2
  CheckStack           0
  PushConstant         CP#0
  PushStatic           CP#0
  EqualsNull
  JumpIfFalse          L1
  Allocate             CP#1
  StoreLocal           r1
  Push                 r1
  PushConstant         CP#3
  IndirectStaticCall   1, CP#2
  Drop1
  PushConstant         CP#5
  IndirectStaticCall   0, CP#4
  PushConstant         CP#7
  IndirectStaticCall   2, CP#6
  StoreStaticTOS       CP#0
L1:
  PushConstant         CP#0
  PushStatic           CP#0
  ReturnTOS
}
ConstantPool {
  [0] = StaticField #lib::_NamespaceImpl::_cachedNamespace (field)
  [1] = Class #lib::_NamespaceImpl
  [2] = ArgDesc num-args 1, num-type-args 0, names []
  [3] = StaticICData target '#lib::_NamespaceImpl::_ (constructor)', arg-desc CP#2
  [4] = ArgDesc num-args 0, num-type-args 0, names []
  [5] = StaticICData target '#lib::_NamespaceImpl::_getDefault', arg-desc CP#4
  [6] = ArgDesc num-args 2, num-type-args 0, names []
  [7] = StaticICData target '#lib::_NamespaceImpl::_create', arg-desc CP#6
}
]  static get _namespace() → self::_NamespaceImpl {
    if(self::_NamespaceImpl::_cachedNamespace.{core::Object::==}(null)) {
      self::_NamespaceImpl::_cachedNamespace = self::_NamespaceImpl::_create(new self::_NamespaceImpl::_(), self::_NamespaceImpl::_getDefault());
    }
    return self::_NamespaceImpl::_cachedNamespace;
  }
[@vm.bytecode=
Bytecode {
  Entry                0
  CheckStack           0
  PushConstant         CP#1
  IndirectStaticCall   0, CP#0
  PushConstant         CP#3
  IndirectStaticCall   1, CP#2
  ReturnTOS
}
ConstantPool {
  [0] = ArgDesc num-args 0, num-type-args 0, names []
  [1] = StaticICData target '#lib::_NamespaceImpl::get:_namespace', arg-desc CP#0
  [2] = ArgDesc num-args 1, num-type-args 0, names []
  [3] = StaticICData target '#lib::_NamespaceImpl::_getPointer', arg-desc CP#2
}
]  static get _namespacePointer() → core::int
    return self::_NamespaceImpl::_getPointer(self::_NamespaceImpl::_namespace);
}
class _Namespace extends core::Object {
[@vm.bytecode=
Bytecode {
  Entry                0
  CheckStack           0
  Push                 FP[-5]
  PushConstant         CP#1
  IndirectStaticCall   1, CP#0
  Drop1
  PushNull
  ReturnTOS
}
ConstantPool {
  [0] = ArgDesc num-args 1, num-type-args 0, names []
  [1] = StaticICData target 'dart:core::Object::'' (constructor)', arg-desc CP#0
}
]  synthetic constructor •() → self::_Namespace
    : super core::Object::•()
    ;
[@vm.bytecode=
Bytecode {
  Entry                0
  CheckStack           0
  Push                 FP[-5]
  PushConstant         CP#1
  IndirectStaticCall   1, CP#0
  Drop1
  PushNull
  ReturnTOS
}
ConstantPool {
  [0] = ArgDesc num-args 1, num-type-args 0, names []
  [1] = StaticICData target '#lib::_NamespaceImpl::_setupNamespace', arg-desc CP#0
}
]  static method _setupNamespace(dynamic namespace) → void {
    self::_NamespaceImpl::_setupNamespace(namespace);
  }
[@vm.bytecode=
Bytecode {
  Entry                0
  CheckStack           0
  PushConstant         CP#1
  IndirectStaticCall   0, CP#0
  ReturnTOS
}
ConstantPool {
  [0] = ArgDesc num-args 0, num-type-args 0, names []
  [1] = StaticICData target '#lib::_NamespaceImpl::get:_namespace', arg-desc CP#0
}
]  static get _namespace() → self::_Namespace
    return self::_NamespaceImpl::_namespace;
[@vm.bytecode=
Bytecode {
  Entry                0
  CheckStack           0
  PushConstant         CP#1
  IndirectStaticCall   0, CP#0
  ReturnTOS
}
ConstantPool {
  [0] = ArgDesc num-args 0, num-type-args 0, names []
  [1] = StaticICData target '#lib::_NamespaceImpl::get:_namespacePointer', arg-desc CP#0
}
]  static get _namespacePointer() → core::int
    return self::_NamespaceImpl::_namespacePointer;
}
class VMLibraryHooks extends core::Object {
  static field dynamic timerFactory = null;
  static field dynamic eventHandlerSendData = null;
  static field dynamic timerMillisecondClock = null;
  static field dynamic resourceReadAsBytes = null;
  static field dynamic packageRootString = null;
  static field dynamic packageConfigString = null;
  static field dynamic packageRootUriFuture = null;
  static field dynamic packageConfigUriFuture = null;
  static field dynamic resolvePackageUriFuture = null;
  static field dynamic _computeScriptUri = null;
  static field dynamic _cachedScript = null;
[@vm.bytecode=
Bytecode {
  Entry                0
  CheckStack           0
  Push                 FP[-5]
  PushConstant         CP#1
  IndirectStaticCall   1, CP#0
  Drop1
  PushNull
  ReturnTOS
}
ConstantPool {
  [0] = ArgDesc num-args 1, num-type-args 0, names []
  [1] = StaticICData target 'dart:core::Object::'' (constructor)', arg-desc CP#0
}
]  synthetic constructor •() → self::VMLibraryHooks
    : super core::Object::•()
    ;
[@vm.bytecode=
Bytecode {
  Entry                1
  CheckStack           0
  Push                 FP[-5]
  StoreStaticTOS       CP#0
  PushNull
  StoreStaticTOS       CP#1
  PushNull
  ReturnTOS
}
ConstantPool {
  [0] = StaticField #lib::VMLibraryHooks::_computeScriptUri (field)
  [1] = StaticField #lib::VMLibraryHooks::_cachedScript (field)
}
]  static set platformScript(dynamic f) → void {
    self::VMLibraryHooks::_computeScriptUri = f;
    self::VMLibraryHooks::_cachedScript = null;
  }
[@vm.bytecode=
Bytecode {
  Entry                1
  CheckStack           0
  PushConstant         CP#0
  PushStatic           CP#0
  EqualsNull
  JumpIfFalse          L1
  PushConstant         CP#1
  PushStatic           CP#1
  EqualsNull
  BooleanNegateTOS
  PopLocal             r0
  Jump                 L2
L1:
  PushFalse
  PopLocal             r0
L2:
  Push                 r0
  JumpIfFalse          L3
  PushConstant         CP#1
  PushStatic           CP#1
  DynamicCall          1, CP#3
  StoreStaticTOS       CP#0
L3:
  PushConstant         CP#0
  PushStatic           CP#0
  ReturnTOS
}
ConstantPool {
  [0] = StaticField #lib::VMLibraryHooks::_cachedScript (field)
  [1] = StaticField #lib::VMLibraryHooks::_computeScriptUri (field)
  [2] = ArgDesc num-args 1, num-type-args 0, names []
  [3] = ICData dynamic target-name 'call', arg-desc CP#2
}
]  static get platformScript() → dynamic {
    if(self::VMLibraryHooks::_cachedScript.{core::Object::==}(null) && !self::VMLibraryHooks::_computeScriptUri.{core::Object::==}(null)) {
      self::VMLibraryHooks::_cachedScript = [@vm.call-site-attributes.metadata=receiverType:dynamic] self::VMLibraryHooks::_computeScriptUri.call();
    }
    return self::VMLibraryHooks::_cachedScript;
  }
}
class Stdin extends core::Object {
[@vm.bytecode=
Bytecode {
  Entry                0
  CheckStack           0
  Push                 FP[-5]
  PushConstant         CP#1
  IndirectStaticCall   1, CP#0
  Drop1
  PushNull
  ReturnTOS
}
ConstantPool {
  [0] = ArgDesc num-args 1, num-type-args 0, names []
  [1] = StaticICData target 'dart:core::Object::'' (constructor)', arg-desc CP#0
}
]  synthetic constructor •() → self::Stdin
    : super core::Object::•()
    ;
}
class _StdIOUtils extends core::Object {
[@vm.bytecode=
Bytecode {
  Entry                0
  CheckStack           0
  Push                 FP[-5]
  PushConstant         CP#1
  IndirectStaticCall   1, CP#0
  Drop1
  PushNull
  ReturnTOS
}
ConstantPool {
  [0] = ArgDesc num-args 1, num-type-args 0, names []
  [1] = StaticICData target 'dart:core::Object::'' (constructor)', arg-desc CP#0
}
]  synthetic constructor •() → self::_StdIOUtils
    : super core::Object::•()
    ;
[@vm.bytecode=
Bytecode {
  Entry                0
  CheckStack           0
  PushNull
  ReturnTOS
}
ConstantPool {
}
]  static method _getStdioInputStream(core::int fd) → self::Stdin
    return null;
}
static field core::int _stdinFD = 0;
static field core::int _stdoutFD = 1;
static field core::int _stderrFD = 2;
static field core::String _rawScript;
static field self::Stdin _stdin;
[@vm.bytecode=
Bytecode {
  Entry                0
  CheckStack           0
  Push                 FP[-5]
  NativeCall           CP#0
  ReturnTOS
}
ConstantPool {
  [0] = NativeEntry Builtin_PrintString
}
]@_in::ExternalName::•("Builtin_PrintString")
external static method _printString(core::String s) → void;
[@vm.bytecode=
Bytecode {
  Entry                0
  CheckStack           0
  Push                 FP[-5]
  InterfaceCall        1, CP#1
  PushConstant         CP#3
  IndirectStaticCall   1, CP#0
  Drop1
  PushNull
  ReturnTOS
}
ConstantPool {
  [0] = ArgDesc num-args 1, num-type-args 0, names []
  [1] = InterfaceCall target-name 'toString', arg-desc CP#0
  [2] = Reserved
  [3] = StaticICData target '#lib::_printString', arg-desc CP#0
}
]static method _print(dynamic arg) → void {
  self::_printString(arg.{core::Object::toString}());
}
[@vm.bytecode=
Bytecode {
  Entry                0
  CheckStack           0
  PushConstant         CP#0
  ReturnTOS
}
ConstantPool {
  [0] = TearOff #lib::_print
}
]static method _getPrintClosure() → dynamic
  return self::_print;
[@vm.bytecode=
Bytecode {
  Entry                1
  CheckStack           0
  Push                 FP[-5]
  StoreStaticTOS       CP#0
  PushNull
  ReturnTOS
}
ConstantPool {
  [0] = StaticField #lib::_ScheduleImmediate::_closure (field)
}
]static method _setScheduleImmediateClosure((() → void) → void closure) → void {
  self::_ScheduleImmediate::_closure = closure;
}
[@vm.bytecode=
Bytecode {
  Entry                1
  CheckStack           0
  Push                 FP[-7]
  StoreStaticTOS       CP#0
  Push                 FP[-6]
  StoreStaticTOS       CP#1
  Push                 FP[-5]
  StoreStaticTOS       CP#2
  PushNull
  ReturnTOS
}
ConstantPool {
  [0] = StaticField #lib::_stdinFD (field)
  [1] = StaticField #lib::_stdoutFD (field)
  [2] = StaticField #lib::_stderrFD (field)
}
]static method _setStdioFDs(core::int stdin, core::int stdout, core::int stderr) → void {
  self::_stdinFD = stdin;
  self::_stdoutFD = stdout;
  self::_stderrFD = stderr;
}
[@vm.bytecode=
Bytecode {
  Entry                2
  CheckStack           0
  PushConstant         CP#0
  PushStatic           CP#0
  PushConstant         CP#1
  InterfaceCall        2, CP#3
  AssertBoolean        0
  JumpIfTrue           L1
  PushConstant         CP#0
  PushStatic           CP#0
  PushConstant         CP#5
  InterfaceCall        2, CP#3
  AssertBoolean        0
  PopLocal             r1
  Jump                 L2
L1:
  PushTrue
  PopLocal             r1
L2:
  Push                 r1
  JumpIfTrue           L3
  PushConstant         CP#0
  PushStatic           CP#0
  PushConstant         CP#6
  InterfaceCall        2, CP#3
  AssertBoolean        0
  PopLocal             r0
  Jump                 L4
L3:
  PushTrue
  PopLocal             r0
L4:
  Push                 r0
  JumpIfFalse          L5
  PushConstant         CP#0
  PushStatic           CP#0
  PushConstant         CP#8
  IndirectStaticCall   1, CP#7
  ReturnTOS
L5:
  PushConstant         CP#10
  IndirectStaticCall   0, CP#9
  PushNull
  PushConstant         CP#0
  PushStatic           CP#0
  PushConstant         CP#11
  IndirectStaticCall   2, CP#2
  InterfaceCall        2, CP#12
  ReturnTOS
}
ConstantPool {
  [0] = StaticField #lib::_rawScript (field)
  [1] = String 'http:'
  [2] = ArgDesc num-args 2, num-type-args 0, names []
  [3] = InterfaceCall target-name 'startsWith', arg-desc CP#2
  [4] = Reserved
  [5] = String 'https:'
  [6] = String 'file:'
  [7] = ArgDesc num-args 1, num-type-args 0, names []
  [8] = StaticICData target 'dart:core::Uri::parse', arg-desc CP#7
  [9] = ArgDesc num-args 0, num-type-args 0, names []
  [10] = StaticICData target 'dart:core::Uri::get:base', arg-desc CP#9
  [11] = StaticICData target 'dart:core::_Uri::file (constructor)', arg-desc CP#2
  [12] = InterfaceCall target-name 'resolveUri', arg-desc CP#2
  [13] = Reserved
}
]static method _scriptUri() → core::Uri {
  if(self::_rawScript.{core::String::startsWith}("http:") || self::_rawScript.{core::String::startsWith}("https:") || self::_rawScript.{core::String::startsWith}("file:")) {
    return core::Uri::parse(self::_rawScript);
  }
  else {
    return core::Uri::base.{core::Uri::resolveUri}(core::_Uri::file(self::_rawScript));
  }
}
[@vm.bytecode=
Bytecode {
  Entry                1
  CheckStack           0
  PushConstant         CP#0
  PushConstant         CP#2
  IndirectStaticCall   1, CP#1
  Drop1
  PushNull
  ReturnTOS
}
ConstantPool {
  [0] = TearOff #lib::_scriptUri
  [1] = ArgDesc num-args 1, num-type-args 0, names []
  [2] = StaticICData target '#lib::VMLibraryHooks::set:platformScript', arg-desc CP#1
}
]static method _setupHooks() → dynamic {
  self::VMLibraryHooks::platformScript = self::_scriptUri;
}
[@vm.bytecode=
Bytecode {
  Entry                2
  CheckStack           0
  PushConstant         CP#0
  PushStatic           CP#0
  EqualsNull
  JumpIfFalse          L1
  PushConstant         CP#1
  PushStatic           CP#1
  PushConstant         CP#3
  IndirectStaticCall   1, CP#2
  StoreLocal           r1
  Push                 r1
  StoreStaticTOS       CP#0
  PopLocal             r0
  Jump                 L2
L1:
  PushNull
  PopLocal             r0
L2:
  Push                 r0
  Drop1
  PushConstant         CP#0
  PushStatic           CP#0
  ReturnTOS
}
ConstantPool {
  [0] = StaticField #lib::_stdin (field)
  [1] = StaticField #lib::_stdinFD (field)
  [2] = ArgDesc num-args 1, num-type-args 0, names []
  [3] = StaticICData target '#lib::_StdIOUtils::_getStdioInputStream', arg-desc CP#2
}
]static get stdin() → self::Stdin {
  self::_stdin.{core::Object::==}(null) ?{self::Stdin} self::_stdin = self::_StdIOUtils::_getStdioInputStream(self::_stdinFD) : null;
  return self::_stdin;
}
[@vm.bytecode=
Bytecode {
  Entry                0
  CheckStack           0
  PushNull
  ReturnTOS
}
ConstantPool {
}
]static method main() → dynamic {}
