static makeDebugData(longTasks, jsUrls, taskTimingsByEvent) {
    /** @type {Array<string>} */
    const urls = [];
    /** @type {Array<DebugTask>} */
    const tasks = [];

    for (const longTask of longTasks) {
      const attributableUrl = getAttributableURLForTask(longTask, jsUrls);

      const {startTime, duration, timeByTaskGroup} =
          LongTasks.getTimingBreakdown(longTask, taskTimingsByEvent);

      // Round time per group and sort entries so order is consistent.
      const timeByTaskGroupEntries = [...timeByTaskGroup]
        .map(/** @return {[TaskGroupIds, number]} */ ([group, time]) => [group, roundTenths(time)])
        .sort((a, b) => a[0].localeCompare(b[0]));

      tasks.push({
        urlIndex: insertUrl(urls, attributableUrl),
        startTime: roundTenths(startTime),
        duration: roundTenths(duration),
        ...Object.fromEntries(timeByTaskGroupEntries),
      });
    }

    return {
      type: 'debugdata',
      urls,
      tasks,
    };
  }
@param {Array<LH.Artifacts.TaskNode>} longTasks
@param {Set<string>} jsUrls
@param {Map<Lantern.Types.TraceEvent, LH.Gatherer.Simulation.NodeTiming>|undefined} taskTimingsByEvent
@return {LH.Audit.Details.DebugData}