<!DOCTYPE html> {# #}
<html lang="en"> {# #}
<head> {# #}
    <meta charset="utf-8"> {# #}
    <meta name="viewport" content="width=device-width, initial-scale=1.0"> {# #}
    <meta name="generator" content="rustdoc"> {# #}
    <meta name="description" content="{{page.description}}"> {# #}
    <title>{{page.title}}</title> {# #}
    <script>if(window.location.protocol!=="file:") {# Hack to skip preloading fonts locally - see #98769 #}
    document.head.insertAdjacentHTML("beforeend","{{files.source_serif_4_regular}},{{files.fira_sans_regular}},{{files.fira_sans_medium}},{{files.source_code_pro_regular}},{{files.source_code_pro_semibold}}".split(",").map(f=>`<link rel="preload" as="font" type="font/woff2" crossorigin href="{{static_root_path|safe}}${f}">`).join("")) {# #}
    </script> {# #}
    <link rel="stylesheet" {#+ #}
          href="{{static_root_path|safe}}{{files.normalize_css}}"> {# #}
    <link rel="stylesheet" {#+ #}
          href="{{static_root_path|safe}}{{files.rustdoc_css}}">
    {% if !layout.default_settings.is_empty() %}
    <script id="default-settings" {#+ #}
      {%~ for (k, v) in layout.default_settings ~%}
        data-{{k}}="{{v}}"
      {% endfor %}
    ></script>
    {% endif %}
    <meta name="rustdoc-vars" {#+ #}
         data-root-path="{{page.root_path|safe}}" {#+ #}
         data-static-root-path="{{static_root_path|safe}}" {#+ #}
         data-current-crate="{{layout.krate}}" {#+ #}
         data-themes="{{themes|join(",") }}" {#+ #}
         data-resource-suffix="{{page.resource_suffix}}" {#+ #}
         data-rustdoc-version="{{rustdoc_version}}" {#+ #}
         data-channel="{{rust_channel}}" {#+ #}
         data-search-js="{{files.search_js}}" {#+ #}
         data-settings-js="{{files.settings_js}}" {#+ #}
    > {# #}
    <script src="{{static_root_path|safe}}{{files.storage_js}}"></script>
    {% if page.css_class.contains("crate") %}
    <script defer src="{{page.root_path|safe}}crates{{page.resource_suffix}}.js"></script>
    {% else if page.css_class == "src" %}
    <script defer src="{{static_root_path|safe}}{{files.src_script_js}}"></script> {# #}
    <script defer src="{{page.root_path|safe}}src-files{{page.resource_suffix}}.js"></script>
    {% else if !page.css_class.contains("mod") %}
    <script defer src="sidebar-items{{page.resource_suffix}}.js"></script>
    {% else if !page.css_class.contains("sys") %}
    <script defer src="../sidebar-items{{page.resource_suffix}}.js"></script>
    {% endif %}
    <script defer src="{{static_root_path|safe}}{{files.main_js}}"></script>
    {% if layout.scrape_examples_extension %}
    <script defer src="{{static_root_path|safe}}{{files.scrape_examples_js}}"></script>
    {% endif %}
    <noscript> {# #}
        <link rel="stylesheet" {#+ #}
           href="{{static_root_path|safe}}{{files.noscript_css}}"> {# #}
    </noscript>
    {% if layout.css_file_extension.is_some() %}
        <link rel="stylesheet" {#+ #}
            href="{{page.root_path|safe}}theme{{page.resource_suffix}}.css">
    {% endif %}
    {% if !layout.favicon.is_empty() %}
        <link rel="icon" href="{{layout.favicon}}">
    {% else %}
        <link rel="alternate icon" type="image/png" {#+ #}
            href="{{static_root_path|safe}}{{files.rust_favicon_png_32}}"> {# #}
        <link rel="icon" type="image/svg+xml" {#+ #}
            href="{{static_root_path|safe}}{{files.rust_favicon_svg}}">
    {% endif %}
    {{ layout.external_html.in_header|safe }}
</head> {# #}
<body class="rustdoc {{+page.css_class}}"> {# #}
    <!--[if lte IE 11]> {# #}
    <div class="warning"> {# #}
        This old browser is unsupported and will most likely display funky things. {# #}
    </div> {# #}
    <![endif]-->
    {{ layout.external_html.before_content|safe }}
    {% if page.css_class != "src" %}
    <nav class="mobile-topbar"> {# #}
        <button class="sidebar-menu-toggle" title="show sidebar"></button>
        {% if !layout.logo.is_empty() || page.rust_logo %}
        <a class="logo-container" href="{{page.root_path|safe}}{{display_krate_with_trailing_slash|safe}}index.html">
        {% if page.rust_logo %}
            <img class="rust-logo" src="{{static_root_path|safe}}{{files.rust_logo_svg}}" alt="">
        {% else if !layout.logo.is_empty() %}
            <img src="{{layout.logo}}" alt="">
        {% endif %}
        </a>
        {% endif %}
    </nav>
    {% endif %}
    <nav class="sidebar">
        {% if page.css_class != "src" %}
        <div class="sidebar-crate">
            {% if !layout.logo.is_empty() || page.rust_logo %}
            <a class="logo-container" href="{{page.root_path|safe}}{{display_krate_with_trailing_slash|safe}}index.html">
                {% if page.rust_logo %}
                    <img class="rust-logo" src="{{static_root_path|safe}}{{files.rust_logo_svg}}" alt="logo">
                {% else if !layout.logo.is_empty() %}
                    <img src="{{layout.logo}}" alt="logo">
                {% endif %}
            </a>
            {% endif %}
            <h2> {# #}
                <a href="{{page.root_path|safe}}{{display_krate_with_trailing_slash|safe}}index.html">{{display_krate|wrapped|safe}}</a>
                {% if !display_krate_version_number.is_empty() %}
                    <span class="version">{{+ display_krate_version_number}}</span>
                {% endif %}
            </h2> {# #}
        </div>
        {% if !display_krate_version_extra.is_empty() %}
        <div class="version">{{+ display_krate_version_extra}}</div>
        {% endif %}
        {% else %}
        <div class="src-sidebar-title"> {# #}
            <h2>Files</h2> {# #}
        </div>
        {% endif %}
        {{ sidebar|safe }}
    </nav> {# #}
    <div class="sidebar-resizer"></div> {# #}
    <main>
        {% if page.css_class != "src" %}<div class="width-limiter">{% endif %}
            {# defined in storage.js to avoid duplicating complex UI across every page #}
            {# and because the search form only works if JS is enabled anyway #}
            <rustdoc-search></rustdoc-search> {# #}
            <section id="main-content" class="content">{{ content|safe }}</section>
        {% if page.css_class != "src" %}</div>{% endif %}
    </main>
    {{ layout.external_html.after_content|safe }}
</body> {# #}
</html> {# #}
