def METHOD_NAME(
    self,
    target_host: TargetHost,
    options: Log4ShellOptions,
    agent_binary_downloaded: Event,
    exploit_class_downloaded: Event,
    timestamp: float,
    interrupt: Event,
) -> Tuple[bool, bool]:
    exploitation_success = False
    propagation_success = False
    exploitation_success = Log4ShellExploitClient._wait_for_victim_to_download_java_bytecode(
        exploit_class_downloaded, options.exploit_download_timeout, interrupt
    )
    if not exploitation_success:
        error_message = "Timed out while waiting for victim to download the Java bytecode"
        logger.debug(error_message)
        self._publish_exploitation_event(
            target_host=target_host, time=timestamp, success=False, error_message=error_message
        )
        return exploitation_success, propagation_success
    self._publish_exploitation_event(target_host=target_host, time=timestamp, success=True)
    propagation_success = Log4ShellExploitClient._wait_for_victim_to_download_agent(
        agent_binary_downloaded, options.agent_binary_download_timeout, interrupt
    )
    if not propagation_success:
        error_message = "Timed out while waiting for victim to download the Agent binary"
        logger.debug(error_message)
        self._publish_propagation_event(
            target_host=target_host, time=timestamp, success=False, error_message=error_message
        )
        return exploitation_success, propagation_success
    self._publish_propagation_event(target_host, success=propagation_success)
    return exploitation_success, propagation_success