code: def output_plantuml(self) -> None:
      lines = []
      for item in self._items:
          line = f"{item.src} --> {item.dst}: {item.info}"
          lines.append((item.ts, line))
      print("@startuml")
      header = """
  !theme crt-amber
  skinparam responseMessageBelowArrow true
  box "User Process"
  participant User as MainThread
  control router as MsgRouterThr
  control check_stop as ChkStopThr
  control net_stat as NetStatThr
  end box
  
  queue record_q as record_q
  queue result_q as result_q
  
  box "Internal Process"
  control handler as HandlerThread
  control stats as StatsThr
  queue send_q as send_q
  queue write_q as write_q
  control writer as WriterThread
  control sender as SenderThread
  end box
          """
      print(header)
      # TODO: move to common place (sorted sequence items)
      for _, line in sorted(lines):
          print(line)
      print("@enduml")
  
file_path: wandb/tools/tracelog-tool.py
imports: import argparse
  import pathlib
  import sys
  from dataclasses import dataclass
  from typing import List
label_desc: Use image node_id 4 for calling the TracelogParser obj's underlying member method code with example usage: obj.output_plantuml() without return types