text: import lldb
  import os
  import sys
  import shlex
  
  def connect_command(debugger, command, result, internal_dict):
      # These two are passed in by the script which loads us
      connect_url = internal_dict['fruitstrap_connect_url']
      error = lldb.SBError()
  
      process = lldb.target.ConnectRemote(lldb.target.GetDebugger().GetListener(), connect_url, None, error)
  
      # Wait for connection to succeed
      listener = lldb.target.GetDebugger().GetListener()
      listener.StartListeningForEvents(process.GetBroadcaster(), lldb.SBProcess.eBroadcastBitStateChanged)
      events = []
      state = (process.GetState() or lldb.eStateInvalid)
      while state != lldb.eStateConnected:
          event = lldb.SBEvent()
          if listener.WaitForEvent(1, event):
              state = process.GetStateFromEvent(event)
              events.append(event)
          else:
              state = lldb.eStateInvalid
  
      # Add events back to queue, otherwise lldb freezes
      for event in events:
          listener.AddEvent(event)
  
  def run_command(debugger, command, result, internal_dict):
      device_app = internal_dict['fruitstrap_device_app']
      args = command.split('--',1)
      error = lldb.SBError()
      lldb.target.modules[0].SetPlatformFileSpec(lldb.SBFileSpec(device_app))
      args_arr = []
      if len(args) > 1:
          args_arr = shlex.split(args[1])
      else:
          args_arr = shlex.split('{args}')
      lldb.target.Launch(lldb.SBLaunchInfo(args_arr), error)
      lockedstr = ': Locked'
      if lockedstr in str(error):
         print('\\nDevice Locked\\n')
         os._exit(254)
      else:
         print(str(error))
  
  def safequit_command(debugger, command, result, internal_dict):
      process = lldb.target.process
      state = process.GetState()
      if state == lldb.eStateRunning:
          process.Detach()
          os._exit(0)
      elif state > lldb.eStateRunning:
          os._exit(state)
      else:
          print('\\nApplication has not been launched\\n')
          os._exit(1)
  
  def autoexit_command(debugger, command, result, internal_dict):
      process = lldb.target.process
      listener = debugger.GetListener()
      listener.StartListeningForEvents(process.GetBroadcaster(), lldb.SBProcess.eBroadcastBitStateChanged | lldb.SBProcess.eBroadcastBitSTDOUT | lldb.SBProcess.eBroadcastBitSTDERR)
      event = lldb.SBEvent()
      while True:
          if listener.WaitForEvent(1, event) and lldb.SBProcess.EventIsProcessEvent(event):
              state = lldb.SBProcess.GetStateFromEvent(event)
          else:
              state = process.GetState()
  
          if state == lldb.eStateExited:
              os._exit(process.GetExitStatus())
          elif state == lldb.eStateStopped:
              debugger.HandleCommand('bt')
              os._exit({exitcode_app_crash})
  
          stdout = process.GetSTDOUT(1024)
          while stdout:
              sys.stdout.write(stdout)
              stdout = process.GetSTDOUT(1024)
  
          stderr = process.GetSTDERR(1024)
          while stderr:
              sys.stdout.write(stderr)
              stderr = process.GetSTDERR(1024)
  