static computeImpactsFromObservedTasks(tasks, startTimeMs, endTimeMs) {
    /** @type {Map<LH.Artifacts.TaskNode, number>} */
    const taskToImpact = new Map();

    /** @type {Map<LH.Artifacts.TaskNode, number>} */
    const taskToBlockingTime = new Map();

    for (const task of tasks) {
      const event = {
        start: task.startTime,
        end: task.endTime,
        duration: task.duration,
      };

      const topLevelTask = this.getTopLevelTask(task);
      const topLevelEvent = {
        start: topLevelTask.startTime,
        end: topLevelTask.endTime,
        duration: topLevelTask.duration,
      };

      const tbtImpact = calculateTbtImpactForEvent(event, startTimeMs, endTimeMs, topLevelEvent);
      const blockingTime = calculateTbtImpactForEvent(event, -Infinity, Infinity, topLevelEvent);

      taskToImpact.set(task, tbtImpact);
      taskToBlockingTime.set(task, blockingTime);
    }

    return this.createImpactTasks(tasks, taskToImpact, taskToBlockingTime);
  }
@param {LH.Artifacts.TaskNode[]} tasks
@param {number} startTimeMs
@param {number} endTimeMs
@return {LH.Artifacts.TBTImpactTask[]}