code: def log(self):
      if self.is_silent:
          return
  
      if self._state == "none":
          return
  
      parts = [("  " * self._level + f"{self._name}", None)]
  
      if self._state == "entered":
          if self._progress == 0.0:
              parts.append("...")
          else:
              parts.append(
                  (
                      f" {math.floor(self._progress * 100) :4.0f}%",
                      logger.Text.meta2,
                  )
              )
      else:
          if self.is_successful:
              parts.append(("...[DONE]", logger.Text.success))
          else:
              parts.append(("...[FAIL]", logger.Text.danger))
  
      if self._is_timed and self._progress > 0.0:
          duration_ms = 1000 * self.get_estimated_time()
          parts.append((f"\t{duration_ms :,.2f}ms", logger.Text.meta))
  
      if self.message is not None:
          parts.append((f"\t{self.message}", logger.Text.value))
  
      if self._state != "entered" and self._is_new_line:
          parts.append(("\n", None))
  
      return parts
  
imports: import math
  import time
  from typing import TYPE_CHECKING, List
  from labml import logger
  from ..tracker import tracker_singleton
label_desc: Use image node_id 3 for calling the OuterSection obj's underlying member method code with example usage: obj.log() and returns: parts