<html>
  <head>
    <title>Results of Cluster Telemetry Tryserver Run</title>
    {% include "column_threshold_css.html" %}
  </head>

  <body>
    <h2>Results of Cluster Telemetry Tryserver Run</h2>
    Run requester: {{ requester_email }}
    <br/>
    Run description: {{ description }}
    <br/>
    This report was created on {{ html_report_date }}
    <br/>
    <br/>
    The run was done on {{ target_platform }} slaves using the {{ pageset_type }} page set
    <br/>
    The run was done using Chromium commit hash <a href='https://chromium.googlesource.com/chromium/src/+/{{ chromium_hash }}'>{{ chromium_hash|slice:":7" }}</a> and Skia commit hash <a href='https://skia.googlesource.com/skia/+/{{ skia_hash }}'>{{ skia_hash|slice:":7" }}</a>
    <br/>
    The specified patch(es) are: <a href='{{ chromium_patch_link }}'>Chromium</a>/<a href='{{ skia_patch_link }}'>Skia</a> (if no patch is specified the page will be empty)
    <br/>
    Browser arguments for the nopatch run: "{{ browser_args_nopatch }}"
    <br/>
    Browser arguments for the withpatch run: "{{ browser_args_withpatch }}"
    <br/>
    <br/>
    The raw CSVs used to create the below tables are here: <a href='{{ raw_csv_nopatch }}'>nopatch</a>/<a href='{{ raw_csv_withpatch }}'>withpatch</a>
    <br/>
    Read <a href="https://docs.google.com/a/chromium.org/document/d/1GhqosQcwsy6F-eBAmFn_ITDF7_Iv_rY9FhCKwAnk9qQ/edit?pli=1#heading=h.lgvqzgu7bc4d">this</a> for an explanation of CT's accuracy of results.
    <br/>
    {% if crashed_instances %}
      <br/><b>Note:</b> The following slaves are down and their results are missing from the report: <b>{{ crashed_instances }}</b><br/>
    {% endif %}
    {% if missing_devices %}
      <br/><b>Note:</b> Android devices in the following slaves are down and their results are missing from the report: <b>{{ missing_devices }}</b><br/>
    {% endif %}
    {% if missing_output_slaves %}
      <br/><b>Note:</b> The following slaves failed to report their results:
          {% for missing_output_slave in missing_output_slaves %}
            <a href="{{ logs_link_prefix }}{{ missing_output_slave }}">task{{ missing_output_slave }}</a>
          {% endfor %}
      <br/>
    {% endif %}
    <br/>
    Each pageset was repeated: {{ num_repeated }} time{% if num_repeated > 1 %}s{% endif %}
    <br/>
    Percentage difference threshold used: {{ threshold }}%
    <br/>
    Outliers discarded from top and bottom: {{ discard_outliers }}%
    <br/>
    Fieldnames displayed only if they were outputted by minimum {{ min_webpages }} webpages.
    <br/><br/>
    Click on a fieldname to see the webpages breakdown.
    <br/><br/><br/>

    {% if sorted_fieldnames_totals_items %}
    <table border="1" cellpadding="5">
      <tr bgcolor="#CCCCFF">
        <th>Fieldname</th>
        <th>#Webpages</th>
        <th>Total</th>
        <th>Total with Patch</th>
        <th>Percentage Change</th>
        <th>Percentage Difference</th>
      </tr>
      {% for fieldname, fieldname_values in sorted_fieldnames_totals_items %}
        <tr>
          <td><a href='{{ absolute_url }}fieldname{{ forloop.counter }}.html'>{{ fieldname }}</a></td>
          <td>{{ fieldname_values.total_webpages_reported }}</td>
          <td>{{ fieldname_values.value1|floatformat:"-3" }}</td>
          <td>{{ fieldname_values.value2|floatformat:"-3" }}</td>
          <td {% if fieldname_values.perc_diff <= 0 %}class="belowthreshold"{% else %}class="abovethreshold"{% endif %} >{{ fieldname_values.perc_change|floatformat:"-3" }}%</td>
          <td {% if fieldname_values.perc_diff <= 0 %}class="belowthreshold"{% else %}class="abovethreshold"{% endif %} >{{ fieldname_values.perc_diff|floatformat:"-3" }}%</td>
        </tr>
      {% endfor %}
    </table>
    {% else %}
      <h4>No results. It is very likely something went wrong with this run. Please contact rmistry@.</h4>
    {% endif %}
  </body>
</html>
