code: def parse_lines(self, lines):
      cur_function_addr = ""
      for line in lines:
          fragments = line.split()
          if fragments[0] == "FILE":
              assert int(fragments[1]) == len(self.files)
              self.files.append(" ".join(fragments[2:]))
          elif fragments[0] == "PUBLIC":
              self.symbols[int(fragments[1], 16)] = " ".join(
                  fragments[3:]
              )
          elif fragments[0] in ["CFI", "STACK"]:
              pass
          elif fragments[0] == "FUNC":
              cur_function_addr = int(fragments[1], 16)
              if not cur_function_addr in self.symbols.keys():
                  self.symbols[cur_function_addr] = " ".join(
                      fragments[4:]
                  )
          else:
              # Line starting with an address.
              addr = int(fragments[0], 16)
              self.address_list.append(addr)
              # Tuple of symbol address, size, line, file number.
              self.addresses[addr] = (
                  cur_function_addr,
                  int(fragments[1], 16),
                  int(fragments[2]),
                  int(fragments[3]),
              )
      self.address_list.sort()
  
imports: import bisect
  import os
  import re
  import subprocess
  import sys
label_desc: Use image node_id 2 for calling the BreakpadSymbolizer obj's underlying member method code with example usage: obj.parse_lines(lines) without return types