diff --git a/.github/workflows/pages.yml b/.github/workflows/pages.yml new file mode 100644 index 00000000..a7930a7b --- /dev/null +++ b/.github/workflows/pages.yml @@ -0,0 +1,71 @@ +# This workflow uses actions that are not certified by GitHub. +# They are provided by a third-party and are governed by +# separate terms of service, privacy policy, and support +# documentation. + +# Sample workflow for building and deploying a Jekyll site to GitHub Pages +name: Deploy Jekyll site to Pages + +on: + push: + branches: + - "main" + paths: + - "docs/**" + + # Allows you to run this workflow manually from the Actions tab + workflow_dispatch: + +# Sets permissions of the GITHUB_TOKEN to allow deployment to GitHub Pages +permissions: + contents: read + pages: write + id-token: write + +# Allow one concurrent deployment +concurrency: + group: "pages" + cancel-in-progress: true + +jobs: + # Build job + build: + runs-on: ubuntu-latest + defaults: + run: + working-directory: docs + steps: + - name: Checkout + uses: actions/checkout@v3 + - name: Setup Ruby + uses: ruby/setup-ruby@v1 + with: + ruby-version: '3.1' # Not needed with a .ruby-version file + bundler-cache: true # runs 'bundle install' and caches installed gems automatically + cache-version: 0 # Increment this number if you need to re-download cached gems + working-directory: '${{ github.workspace }}/docs' + - name: Setup Pages + id: pages + uses: actions/configure-pages@v3 + - name: Build with Jekyll + # Outputs to the './_site' directory by default + run: bundle exec jekyll build --baseurl "${{ steps.pages.outputs.base_path }}" + env: + JEKYLL_ENV: production + - name: Upload artifact + # Automatically uploads an artifact from the './_site' directory by default + uses: actions/upload-pages-artifact@v1 + with: + path: "docs/_site/" + + # Deployment job + deploy: + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} + runs-on: ubuntu-latest + needs: build + steps: + - name: Deploy to GitHub Pages + id: deployment + uses: actions/deploy-pages@v2 diff --git a/build/staging/version/BundleInfo.wxi b/build/staging/version/BundleInfo.wxi index a68f4269..8b223f2c 100644 --- a/build/staging/version/BundleInfo.wxi +++ b/build/staging/version/BundleInfo.wxi @@ -1,4 +1,4 @@ - + diff --git a/docs/Gemfile b/docs/Gemfile new file mode 100644 index 00000000..e2f7e0fa --- /dev/null +++ b/docs/Gemfile @@ -0,0 +1,10 @@ +source 'https://rubygems.org' + +gem "jekyll", "~> 4.3.3" # installed by `gem jekyll` +# gem "webrick" # required when using Ruby >= 3 and Jekyll <= 4.2.2 + +gem "just-the-docs", "0.7.0" # pinned to the current release +# gem "just-the-docs" # always download the latest release + +gem "jekyll-default-layout" +gem "jekyll-remote-theme" \ No newline at end of file diff --git a/docs/Gemfile.lock b/docs/Gemfile.lock new file mode 100644 index 00000000..db904052 --- /dev/null +++ b/docs/Gemfile.lock @@ -0,0 +1,100 @@ +GEM + remote: https://rubygems.org/ + specs: + addressable (2.8.6) + public_suffix (>= 2.0.2, < 6.0) + colorator (1.1.0) + concurrent-ruby (1.2.2) + em-websocket (0.5.3) + eventmachine (>= 0.12.9) + http_parser.rb (~> 0) + eventmachine (1.2.7) + ffi (1.16.3) + ffi (1.16.3-x64-mingw-ucrt) + forwardable-extended (2.6.0) + google-protobuf (3.25.1-arm64-darwin) + google-protobuf (3.25.1-x64-mingw-ucrt) + google-protobuf (3.25.1-x86_64-linux) + http_parser.rb (0.8.0) + i18n (1.14.1) + concurrent-ruby (~> 1.0) + jekyll (4.3.3) + addressable (~> 2.4) + colorator (~> 1.0) + em-websocket (~> 0.5) + i18n (~> 1.0) + jekyll-sass-converter (>= 2.0, < 4.0) + jekyll-watch (~> 2.0) + kramdown (~> 2.3, >= 2.3.1) + kramdown-parser-gfm (~> 1.0) + liquid (~> 4.0) + mercenary (>= 0.3.6, < 0.5) + pathutil (~> 0.9) + rouge (>= 3.0, < 5.0) + safe_yaml (~> 1.0) + terminal-table (>= 1.8, < 4.0) + webrick (~> 1.7) + jekyll-default-layout (0.1.5) + jekyll (>= 3.0, < 5.0) + jekyll-include-cache (0.2.1) + jekyll (>= 3.7, < 5.0) + jekyll-remote-theme (0.4.3) + addressable (~> 2.0) + jekyll (>= 3.5, < 5.0) + jekyll-sass-converter (>= 1.0, <= 3.0.0, != 2.0.0) + rubyzip (>= 1.3.0, < 3.0) + jekyll-sass-converter (3.0.0) + sass-embedded (~> 1.54) + jekyll-seo-tag (2.8.0) + jekyll (>= 3.8, < 5.0) + jekyll-watch (2.2.1) + listen (~> 3.0) + just-the-docs (0.7.0) + jekyll (>= 3.8.5) + jekyll-include-cache + jekyll-seo-tag (>= 2.0) + rake (>= 12.3.1) + kramdown (2.4.0) + rexml + kramdown-parser-gfm (1.1.0) + kramdown (~> 2.0) + liquid (4.0.4) + listen (3.8.0) + rb-fsevent (~> 0.10, >= 0.10.3) + rb-inotify (~> 0.9, >= 0.9.10) + mercenary (0.4.0) + pathutil (0.16.2) + forwardable-extended (~> 2.6) + public_suffix (5.0.4) + rake (13.0.6) + rb-fsevent (0.11.2) + rb-inotify (0.10.1) + ffi (~> 1.0) + rexml (3.2.6) + rouge (4.2.0) + rubyzip (2.3.2) + safe_yaml (1.0.5) + sass-embedded (1.69.5-arm64-darwin) + google-protobuf (~> 3.23) + sass-embedded (1.69.5-x64-mingw-ucrt) + google-protobuf (~> 3.23) + sass-embedded (1.69.5-x86_64-linux-gnu) + google-protobuf (~> 3.23) + terminal-table (3.0.2) + unicode-display_width (>= 1.1.1, < 3) + unicode-display_width (2.5.0) + webrick (1.8.1) + +PLATFORMS + arm64-darwin-23 + x64-mingw-ucrt + x86_64-linux + +DEPENDENCIES + jekyll (~> 4.3.3) + jekyll-default-layout + jekyll-remote-theme + just-the-docs (= 0.7.0) + +BUNDLED WITH + 2.3.26 diff --git a/docs/_config.yml b/docs/_config.yml index 8926f5ed..969e4081 100644 --- a/docs/_config.yml +++ b/docs/_config.yml @@ -1,16 +1,76 @@ #site settings -title: Windows MIDI Services Documentation +title: Windows MIDI Services description: User and developer documentation for the Windows MIDI Services project -#show_downloads: true +baseurl: "/docs" twitter_username: pete_brown github_username: psychlist1972 #theme -remote_theme: pages-themes/slate@v0.2.0 +#remote_theme: pages-themes/slate@v0.2.0 +theme: just-the-docs + + +exclude: + # from https://github.com/jekyll/jekyll/blob/master/lib/site_template/_config.yml: + - .sass-cache/ + - .jekyll-cache/ + - gemfiles/ + - Gemfile + - Gemfile.lock + - node_modules/ + - vendor/bundle/ + - vendor/cache/ + - vendor/gems/ + - vendor/ruby/ + + +# Enable or disable the site search +# Supports true (default) or false +search_enabled: true +search: + # Split pages into sections that can be searched individually + # Supports 1 - 6, default: 2 + heading_level: 2 + # Maximum amount of previews per search result + # Default: 3 + previews: 2 + # Maximum amount of words to display before a matched word in the preview + # Default: 5 + preview_words_before: 3 + # Maximum amount of words to display after a matched word in the preview + # Default: 10 + preview_words_after: 3 + # Set the search token separator + # Default: /[\s\-/]+/ + # Example: enable support for hyphenated search words + tokenizer_separator: /[\s/]+/ + # Display the relative url in search results + # Supports true (default) or false + rel_url: true + # Enable or disable the search button that appears in the bottom right corner of every page + # Supports true or false (default) + button: false + + +# For copy button on code +enable_copy_code_button: true + +# Enable or disable heading anchors +heading_anchors: true + +# Back to top link +back_to_top: true +back_to_top_text: "Back to top" + #plugins plugins: - jekyll-remote-theme +- jekyll-default-layout +kramdown: + syntax_highlighter_opts: + block: + line_numbers: false \ No newline at end of file diff --git a/docs/_includes/components/breadcrumbs.html b/docs/_includes/components/breadcrumbs.html new file mode 100644 index 00000000..5db23422 --- /dev/null +++ b/docs/_includes/components/breadcrumbs.html @@ -0,0 +1,51 @@ +{%- comment -%} + Include as: {%- include components/breadcrumbs.html -%} + Depends on: page, site. + Results in: HTML for the breadcrumbs component. + Overwrites: + node, pages_list, parent_page, grandparent_page. +{%- endcomment -%} + +{%- if page.url != "/" and page.parent -%} + + {%- assign pages_list = site[page.collection] | default: site.html_pages -%} + + {%- assign parent_page = nil -%} + {%- assign grandparent_page = nil -%} + + {%- for node in pages_list -%} + + {%- if node.has_children and page.grand_parent -%} + + {%- if node.title == page.parent and node.parent == page.grand_parent -%} + {%- assign parent_page = node -%} + {%- endif -%} + {%- if node.title == page.grand_parent -%} + {%- assign grandparent_page = node -%} + {%- endif -%} + {%- if parent_page and grandparent_page -%} + {%- break -%} + {%- endif -%} + + {%- elsif node.has_children and node.title == page.parent and node.parent == nil -%} + + {%- assign parent_page = node -%} + {%- break -%} + + {%- endif -%} + + {%- endfor -%} + + + +{%- endif -%} diff --git a/docs/_includes/components/nav.html b/docs/_includes/components/nav.html new file mode 100644 index 00000000..aa5af38d --- /dev/null +++ b/docs/_includes/components/nav.html @@ -0,0 +1,75 @@ +{%- comment -%} + Include as: {%- include components/nav.html pages=pages -%} + Depends on: include.pages. + Results in: HTML for the navigation panel. + Includes: + sorted_pages.html + Overwrites: + nav_pages, first_level_pages, second_level_pages, third_level_pages, + node, children_list, child, grand_children_list, grand_child. +{%- endcomment -%} + +{%- assign nav_pages = include.pages + | where_exp: "item", "item.title != nil" + | where_exp: "item", "item.nav_exclude != true" -%} + +{%- include sorted_pages.html pages = nav_pages -%} + +{%- comment -%} + It might be more efficient to sort the pages at each level separately. +{%- endcomment -%} + +{%- assign first_level_pages = sorted_pages + | where_exp: "item", "item.parent == nil" -%} +{%- assign second_level_pages = sorted_pages + | where_exp: "item", "item.parent != nil" + | where_exp: "item", "item.grand_parent == nil" -%} +{%- assign third_level_pages = sorted_pages + | where_exp: "item", "item.grand_parent != nil" -%} + + diff --git a/docs/_includes/components/sidebar.html b/docs/_includes/components/sidebar.html new file mode 100644 index 00000000..13c755bd --- /dev/null +++ b/docs/_includes/components/sidebar.html @@ -0,0 +1,32 @@ +{%- comment -%} + Include as: {%- include components/sidebar.html -%} + Depends on: page(?), site. + Results in: HTML for the side bar. + Includes: + title.html, components/site_nav.html, nav_footer_custom.html + Overwrites: + nav_footer_custom. + Should not be cached, because nav_footer_custom.html might depend on page. +{%- endcomment -%} + + diff --git a/docs/_includes/components/site_nav.html b/docs/_includes/components/site_nav.html new file mode 100644 index 00000000..12a9ffc1 --- /dev/null +++ b/docs/_includes/components/site_nav.html @@ -0,0 +1,67 @@ +{%- comment -%} + Include as: {%- include_cached components/site_nav.html -%} + Depends on: site. + Results in: HTML for the site-nav. + Includes: + components/nav.html + Overwrites: + pages_top_size, collections_size, collection_entry, + collection_key, collection_value, collection. +{%- endcomment -%} + + diff --git a/docs/_includes/site_nav.html b/docs/_includes/site_nav.html new file mode 100644 index 00000000..12a9ffc1 --- /dev/null +++ b/docs/_includes/site_nav.html @@ -0,0 +1,67 @@ +{%- comment -%} + Include as: {%- include_cached components/site_nav.html -%} + Depends on: site. + Results in: HTML for the site-nav. + Includes: + components/nav.html + Overwrites: + pages_top_size, collections_size, collection_entry, + collection_key, collection_value, collection. +{%- endcomment -%} + + diff --git a/docs/_layouts/api_group_page.html b/docs/_layouts/api_group_page.html new file mode 100644 index 00000000..84f03f7f --- /dev/null +++ b/docs/_layouts/api_group_page.html @@ -0,0 +1,5 @@ +--- +layout: default +--- + +{{ content }} \ No newline at end of file diff --git a/docs/_layouts/api_page.html b/docs/_layouts/api_page.html new file mode 100644 index 00000000..84f03f7f --- /dev/null +++ b/docs/_layouts/api_page.html @@ -0,0 +1,5 @@ +--- +layout: default +--- + +{{ content }} \ No newline at end of file diff --git a/docs/_layouts/default.html b/docs/_layouts/default.html index 03084f46..2a73e3ea 100644 --- a/docs/_layouts/default.html +++ b/docs/_layouts/default.html @@ -1,53 +1,41 @@ - - - - - - - - - -{% seo %} - {% include head-custom.html %} - +--- +layout: table_wrappers +--- - + - -
-
- {% if site.github.is_project_page %} - View on GitHub + +{% include head.html %} + + Skip to main content + {% include icons/icons.html %} + {% include components/sidebar.html %} +
+ {% include components/header.html %} +
+ {% include components/breadcrumbs.html %} +
+
+ {% if site.heading_anchors != false %} + {% include vendor/anchor_headings.html html=content beforeHeading="true" anchorBody="" anchorClass="anchor-heading" anchorAttrs="aria-labelledby=\"%html_id%\"" %} + {% else %} + {{ content }} {% endif %} -

{{ site.title | default: site.github.repository_name }}

-

{{ site.description | default: site.github.project_tagline }}

- - {% if site.show_downloads %} -
- Download this project as a .zip file - Download this project as a tar.gz file -
+ {% if page.has_children == true and page.has_toc != false %} + {% include components/children_nav.html %} {% endif %} -
-
- - -
-
- {% include toc.html html=content %} - {{ content }} -
-
- - - - - + {% if site.search_enabled != false %} + {% include components/search_footer.html %} + {% endif %} + + + {% if site.mermaid %} + {% include components/mermaid.html %} + {% endif %} + + \ No newline at end of file diff --git a/docs/_layouts/home.html b/docs/_layouts/home.html new file mode 100644 index 00000000..84f03f7f --- /dev/null +++ b/docs/_layouts/home.html @@ -0,0 +1,5 @@ +--- +layout: default +--- + +{{ content }} \ No newline at end of file diff --git a/docs/_layouts/minimal.html b/docs/_layouts/minimal.html new file mode 100644 index 00000000..b074ab9f --- /dev/null +++ b/docs/_layouts/minimal.html @@ -0,0 +1,34 @@ +--- +layout: table_wrappers +--- + + + + +{% include head.html %} + + Skip to main content + {% include icons/icons.html %} +
+ {% include components/breadcrumbs.html %} +
+ {% if site.heading_anchors != false %} + {% include vendor/anchor_headings.html html=content beforeHeading="true" anchorBody="" anchorClass="anchor-heading" anchorAttrs="aria-labelledby=\"%html_id%\"" %} + {% else %} + {{ content }} + {% endif %} + + {% if page.has_children == true and page.has_toc != false %} + {% include components/children_nav.html %} + {% endif %} + + {% include components/footer.html %} + +
+
+ + {% if site.mermaid %} + {% include components/mermaid.html %} + {% endif %} + + \ No newline at end of file diff --git a/docs/_layouts/page.html b/docs/_layouts/page.html new file mode 100644 index 00000000..84f03f7f --- /dev/null +++ b/docs/_layouts/page.html @@ -0,0 +1,5 @@ +--- +layout: default +--- + +{{ content }} \ No newline at end of file diff --git a/docs/_layouts/post.html b/docs/_layouts/post.html new file mode 100644 index 00000000..84f03f7f --- /dev/null +++ b/docs/_layouts/post.html @@ -0,0 +1,5 @@ +--- +layout: default +--- + +{{ content }} \ No newline at end of file diff --git a/docs/_layouts/table_wrappers.html b/docs/_layouts/table_wrappers.html new file mode 100644 index 00000000..cc6187ad --- /dev/null +++ b/docs/_layouts/table_wrappers.html @@ -0,0 +1,7 @@ +--- +layout: vendor/compress +--- + +{% assign content_ = content | replace: '', '' %} +{{ content_ }} \ No newline at end of file diff --git a/docs/_layouts/vendor/compress.html b/docs/_layouts/vendor/compress.html new file mode 100644 index 00000000..eb40d1d3 --- /dev/null +++ b/docs/_layouts/vendor/compress.html @@ -0,0 +1,10 @@ +--- +# Jekyll layout that compresses HTML +# v3.1.0 +# http://jch.penibelst.de/ +# © 2014–2015 Anatol Broder +# MIT License +--- + +{% capture _LINE_FEED %} +{% endcapture %}{% if site.compress_html.ignore.envs contains jekyll.environment or site.compress_html.ignore.envs == "all" %}{{ content }}{% else %}{% capture _content %}{{ content }}{% endcapture %}{% assign _profile = site.compress_html.profile %}{% if site.compress_html.endings == "all" %}{% assign _endings = "html head body li dt dd optgroup option colgroup caption thead tbody tfoot tr td th" | split: " " %}{% else %}{% assign _endings = site.compress_html.endings %}{% endif %}{% for _element in _endings %}{% capture _end %}{% endcapture %}{% assign _content = _content | remove: _end %}{% endfor %}{% if _profile and _endings %}{% assign _profile_endings = _content | size | plus: 1 %}{% endif %}{% for _element in site.compress_html.startings %}{% capture _start %}<{{ _element }}>{% endcapture %}{% assign _content = _content | remove: _start %}{% endfor %}{% if _profile and site.compress_html.startings %}{% assign _profile_startings = _content | size | plus: 1 %}{% endif %}{% if site.compress_html.comments == "all" %}{% assign _comments = "" | split: " " %}{% else %}{% assign _comments = site.compress_html.comments %}{% endif %}{% if _comments.size == 2 %}{% capture _comment_befores %}.{{ _content }}{% endcapture %}{% assign _comment_befores = _comment_befores | split: _comments.first %}{% for _comment_before in _comment_befores %}{% if forloop.first %}{% continue %}{% endif %}{% capture _comment_outside %}{% if _carry %}{{ _comments.first }}{% endif %}{{ _comment_before }}{% endcapture %}{% capture _comment %}{% unless _carry %}{{ _comments.first }}{% endunless %}{{ _comment_outside | split: _comments.last | first }}{% if _comment_outside contains _comments.last %}{{ _comments.last }}{% assign _carry = false %}{% else %}{% assign _carry = true %}{% endif %}{% endcapture %}{% assign _content = _content | remove_first: _comment %}{% endfor %}{% if _profile %}{% assign _profile_comments = _content | size | plus: 1 %}{% endif %}{% endif %}{% assign _pre_befores = _content | split: "" %}{% assign _pres_after = "" %}{% if _pres.size != 0 %}{% if site.compress_html.blanklines %}{% assign _lines = _pres.last | split: _LINE_FEED %}{% capture _pres_after %}{% for _line in _lines %}{% assign _trimmed = _line | split: " " | join: " " %}{% if _trimmed != empty or forloop.last %}{% unless forloop.first %}{{ _LINE_FEED }}{% endunless %}{{ _line }}{% endif %}{% endfor %}{% endcapture %}{% else %}{% assign _pres_after = _pres.last | split: " " | join: " " %}{% endif %}{% endif %}{% capture _content %}{{ _content }}{% if _pre_before contains "" %}{% endif %}{% unless _pre_before contains "" and _pres.size == 1 %}{{ _pres_after }}{% endunless %}{% endcapture %}{% endfor %}{% if _profile %}{% assign _profile_collapse = _content | size | plus: 1 %}{% endif %}{% if site.compress_html.clippings == "all" %}{% assign _clippings = "html head title base link meta style body article section nav aside h1 h2 h3 h4 h5 h6 hgroup header footer address p hr blockquote ol ul li dl dt dd figure figcaption main div table caption colgroup col tbody thead tfoot tr td th" | split: " " %}{% else %}{% assign _clippings = site.compress_html.clippings %}{% endif %}{% for _element in _clippings %}{% assign _edges = " ;; ;" | replace: "e", _element | split: ";" %}{% assign _content = _content | replace: _edges[0], _edges[1] | replace: _edges[2], _edges[3] | replace: _edges[4], _edges[5] %}{% endfor %}{% if _profile and _clippings %}{% assign _profile_clippings = _content | size | plus: 1 %}{% endif %}{{ _content }}{% if _profile %}
Step Bytes
raw {{ content | size }}{% if _profile_endings %}
endings {{ _profile_endings }}{% endif %}{% if _profile_startings %}
startings {{ _profile_startings }}{% endif %}{% if _profile_comments %}
comments {{ _profile_comments }}{% endif %}{% if _profile_collapse %}
collapse {{ _profile_collapse }}{% endif %}{% if _profile_clippings %}
clippings {{ _profile_clippings }}{% endif %}
{% endif %}{% endif %} \ No newline at end of file diff --git a/docs/_site/assets/css/just-the-docs-dark.css b/docs/_site/assets/css/just-the-docs-dark.css new file mode 100644 index 00000000..f310b8ee --- /dev/null +++ b/docs/_site/assets/css/just-the-docs-dark.css @@ -0,0 +1,7557 @@ +@charset "UTF-8"; +.highlight, +pre.highlight { + background: #f9f9f9; + color: #383942; +} + +.highlight pre { + background: #f9f9f9; +} + +.highlight .hll { + background: #f9f9f9; +} + +.highlight .c { + color: #9fa0a6; + font-style: italic; +} + +.highlight .err { + color: #fff; + background-color: #e05151; +} + +.highlight .k { + color: #a625a4; +} + +.highlight .l { + color: #50a04f; +} + +.highlight .n { + color: #383942; +} + +.highlight .o { + color: #383942; +} + +.highlight .p { + color: #383942; +} + +.highlight .cm { + color: #9fa0a6; + font-style: italic; +} + +.highlight .cp { + color: #9fa0a6; + font-style: italic; +} + +.highlight .c1 { + color: #9fa0a6; + font-style: italic; +} + +.highlight .cs { + color: #9fa0a6; + font-style: italic; +} + +.highlight .ge { + font-style: italic; +} + +.highlight .gs { + font-weight: 700; +} + +.highlight .kc { + color: #a625a4; +} + +.highlight .kd { + color: #a625a4; +} + +.highlight .kn { + color: #a625a4; +} + +.highlight .kp { + color: #a625a4; +} + +.highlight .kr { + color: #a625a4; +} + +.highlight .kt { + color: #a625a4; +} + +.highlight .ld { + color: #50a04f; +} + +.highlight .m { + color: #b66a00; +} + +.highlight .s { + color: #50a04f; +} + +.highlight .na { + color: #b66a00; +} + +.highlight .nb { + color: #ca7601; +} + +.highlight .nc { + color: #ca7601; +} + +.highlight .no { + color: #ca7601; +} + +.highlight .nd { + color: #ca7601; +} + +.highlight .ni { + color: #ca7601; +} + +.highlight .ne { + color: #ca7601; +} + +.highlight .nf { + color: #383942; +} + +.highlight .nl { + color: #ca7601; +} + +.highlight .nn { + color: #383942; +} + +.highlight .nx { + color: #383942; +} + +.highlight .py { + color: #ca7601; +} + +.highlight .nt { + color: #e35549; +} + +.highlight .nv { + color: #ca7601; +} + +.highlight .ow { + font-weight: 700; +} + +.highlight .w { + color: #f8f8f2; +} + +.highlight .mf { + color: #b66a00; +} + +.highlight .mh { + color: #b66a00; +} + +.highlight .mi { + color: #b66a00; +} + +.highlight .mo { + color: #b66a00; +} + +.highlight .sb { + color: #50a04f; +} + +.highlight .sc { + color: #50a04f; +} + +.highlight .sd { + color: #50a04f; +} + +.highlight .s2 { + color: #50a04f; +} + +.highlight .se { + color: #50a04f; +} + +.highlight .sh { + color: #50a04f; +} + +.highlight .si { + color: #50a04f; +} + +.highlight .sx { + color: #50a04f; +} + +.highlight .sr { + color: #0083bb; +} + +.highlight .s1 { + color: #50a04f; +} + +.highlight .ss { + color: #0083bb; +} + +.highlight .bp { + color: #ca7601; +} + +.highlight .vc { + color: #ca7601; +} + +.highlight .vg { + color: #ca7601; +} + +.highlight .vi { + color: #e35549; +} + +.highlight .il { + color: #b66a00; +} + +.highlight .gu { + color: #75715e; +} + +.highlight .gd { + color: #e05151; +} + +.highlight .gi { + color: #43d089; +} + +.highlight .language-json .w + .s2 { + color: #e35549; +} + +.highlight .language-json .kc { + color: #0083bb; +} + +.highlight, +pre.highlight { + background: #31343f; + color: #dee2f7; +} + +.highlight pre { + background: #31343f; +} + +.highlight .hll { + background: #31343f; +} + +.highlight .c { + color: #63677e; + font-style: italic; +} + +.highlight .err { + color: #960050; + background-color: #1e0010; +} + +.highlight .k { + color: #e19ef5; +} + +.highlight .l { + color: #a3eea0; +} + +.highlight .n { + color: #dee2f7; +} + +.highlight .o { + color: #dee2f7; +} + +.highlight .p { + color: #dee2f7; +} + +.highlight .cm { + color: #63677e; + font-style: italic; +} + +.highlight .cp { + color: #63677e; + font-style: italic; +} + +.highlight .c1 { + color: #63677e; + font-style: italic; +} + +.highlight .cs { + color: #63677e; + font-style: italic; +} + +.highlight .ge { + font-style: italic; +} + +.highlight .gs { + font-weight: 700; +} + +.highlight .kc { + color: #e19ef5; +} + +.highlight .kd { + color: #e19ef5; +} + +.highlight .kn { + color: #e19ef5; +} + +.highlight .kp { + color: #e19ef5; +} + +.highlight .kr { + color: #e19ef5; +} + +.highlight .kt { + color: #e19ef5; +} + +.highlight .ld { + color: #a3eea0; +} + +.highlight .m { + color: #eddc96; +} + +.highlight .s { + color: #a3eea0; +} + +.highlight .na { + color: #eddc96; +} + +.highlight .nb { + color: #fdce68; +} + +.highlight .nc { + color: #fdce68; +} + +.highlight .no { + color: #fdce68; +} + +.highlight .nd { + color: #fdce68; +} + +.highlight .ni { + color: #fdce68; +} + +.highlight .ne { + color: #fdce68; +} + +.highlight .nf { + color: #dee2f7; +} + +.highlight .nl { + color: #fdce68; +} + +.highlight .nn { + color: #dee2f7; +} + +.highlight .nx { + color: #dee2f7; +} + +.highlight .py { + color: #fdce68; +} + +.highlight .nt { + color: #f9867b; +} + +.highlight .nv { + color: #fdce68; +} + +.highlight .ow { + font-weight: 700; +} + +.highlight .w { + color: #f8f8f2; +} + +.highlight .mf { + color: #eddc96; +} + +.highlight .mh { + color: #eddc96; +} + +.highlight .mi { + color: #eddc96; +} + +.highlight .mo { + color: #eddc96; +} + +.highlight .sb { + color: #a3eea0; +} + +.highlight .sc { + color: #a3eea0; +} + +.highlight .sd { + color: #a3eea0; +} + +.highlight .s2 { + color: #a3eea0; +} + +.highlight .se { + color: #a3eea0; +} + +.highlight .sh { + color: #a3eea0; +} + +.highlight .si { + color: #a3eea0; +} + +.highlight .sx { + color: #a3eea0; +} + +.highlight .sr { + color: #7be2f9; +} + +.highlight .s1 { + color: #a3eea0; +} + +.highlight .ss { + color: #7be2f9; +} + +.highlight .bp { + color: #fdce68; +} + +.highlight .vc { + color: #fdce68; +} + +.highlight .vg { + color: #fdce68; +} + +.highlight .vi { + color: #f9867b; +} + +.highlight .il { + color: #eddc96; +} + +.highlight .gu { + color: #75715e; +} + +.highlight .gd { + color: #f92672; +} + +.highlight .gi { + color: #a6e22e; +} + +/*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */ +/* Document + ========================================================================== */ +/** + * 1. Correct the line height in all browsers. + * 2. Prevent adjustments of font size after orientation changes in iOS. + */ +html { + line-height: 1.15; /* 1 */ + -webkit-text-size-adjust: 100%; /* 2 */ +} + +/* Sections + ========================================================================== */ +/** + * Remove the margin in all browsers. + */ +body { + margin: 0; +} + +/** + * Render the `main` element consistently in IE. + */ +main { + display: block; +} + +/** + * Correct the font size and margin on `h1` elements within `section` and + * `article` contexts in Chrome, Firefox, and Safari. + */ +h1 { + font-size: 2em; + margin: 0.67em 0; +} + +/* Grouping content + ========================================================================== */ +/** + * 1. Add the correct box sizing in Firefox. + * 2. Show the overflow in Edge and IE. + */ +hr { + box-sizing: content-box; /* 1 */ + height: 0; /* 1 */ + overflow: visible; /* 2 */ +} + +/** + * 1. Correct the inheritance and scaling of font size in all browsers. + * 2. Correct the odd `em` font sizing in all browsers. + */ +pre { + font-family: monospace, monospace; /* 1 */ + font-size: 1em; /* 2 */ +} + +/* Text-level semantics + ========================================================================== */ +/** + * Remove the gray background on active links in IE 10. + */ +a { + background-color: transparent; +} + +/** + * 1. Remove the bottom border in Chrome 57- + * 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari. + */ +abbr[title] { + border-bottom: none; /* 1 */ + text-decoration: underline; /* 2 */ + text-decoration: underline dotted; /* 2 */ +} + +/** + * Add the correct font weight in Chrome, Edge, and Safari. + */ +b, +strong { + font-weight: bolder; +} + +/** + * 1. Correct the inheritance and scaling of font size in all browsers. + * 2. Correct the odd `em` font sizing in all browsers. + */ +code, +kbd, +samp { + font-family: monospace, monospace; /* 1 */ + font-size: 1em; /* 2 */ +} + +/** + * Add the correct font size in all browsers. + */ +small { + font-size: 80%; +} + +/** + * Prevent `sub` and `sup` elements from affecting the line height in + * all browsers. + */ +sub, +sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; +} + +sub { + bottom: -0.25em; +} + +sup { + top: -0.5em; +} + +/* Embedded content + ========================================================================== */ +/** + * Remove the border on images inside links in IE 10. + */ +img { + border-style: none; +} + +/* Forms + ========================================================================== */ +/** + * 1. Change the font styles in all browsers. + * 2. Remove the margin in Firefox and Safari. + */ +button, +input, +optgroup, +select, +textarea { + font-family: inherit; /* 1 */ + font-size: 100%; /* 1 */ + line-height: 1.15; /* 1 */ + margin: 0; /* 2 */ +} + +/** + * Show the overflow in IE. + * 1. Show the overflow in Edge. + */ +button, +input { + /* 1 */ + overflow: visible; +} + +/** + * Remove the inheritance of text transform in Edge, Firefox, and IE. + * 1. Remove the inheritance of text transform in Firefox. + */ +button, +select { + /* 1 */ + text-transform: none; +} + +/** + * Correct the inability to style clickable types in iOS and Safari. + */ +button, +[type=button], +[type=reset], +[type=submit] { + -webkit-appearance: button; +} + +/** + * Remove the inner border and padding in Firefox. + */ +button::-moz-focus-inner, +[type=button]::-moz-focus-inner, +[type=reset]::-moz-focus-inner, +[type=submit]::-moz-focus-inner { + border-style: none; + padding: 0; +} + +/** + * Restore the focus styles unset by the previous rule. + */ +button:-moz-focusring, +[type=button]:-moz-focusring, +[type=reset]:-moz-focusring, +[type=submit]:-moz-focusring { + outline: 1px dotted ButtonText; +} + +/** + * Correct the padding in Firefox. + */ +fieldset { + padding: 0.35em 0.75em 0.625em; +} + +/** + * 1. Correct the text wrapping in Edge and IE. + * 2. Correct the color inheritance from `fieldset` elements in IE. + * 3. Remove the padding so developers are not caught out when they zero out + * `fieldset` elements in all browsers. + */ +legend { + box-sizing: border-box; /* 1 */ + color: inherit; /* 2 */ + display: table; /* 1 */ + max-width: 100%; /* 1 */ + padding: 0; /* 3 */ + white-space: normal; /* 1 */ +} + +/** + * Add the correct vertical alignment in Chrome, Firefox, and Opera. + */ +progress { + vertical-align: baseline; +} + +/** + * Remove the default vertical scrollbar in IE 10+. + */ +textarea { + overflow: auto; +} + +/** + * 1. Add the correct box sizing in IE 10. + * 2. Remove the padding in IE 10. + */ +[type=checkbox], +[type=radio] { + box-sizing: border-box; /* 1 */ + padding: 0; /* 2 */ +} + +/** + * Correct the cursor style of increment and decrement buttons in Chrome. + */ +[type=number]::-webkit-inner-spin-button, +[type=number]::-webkit-outer-spin-button { + height: auto; +} + +/** + * 1. Correct the odd appearance in Chrome and Safari. + * 2. Correct the outline style in Safari. + */ +[type=search] { + -webkit-appearance: textfield; /* 1 */ + outline-offset: -2px; /* 2 */ +} + +/** + * Remove the inner padding in Chrome and Safari on macOS. + */ +[type=search]::-webkit-search-decoration { + -webkit-appearance: none; +} + +/** + * 1. Correct the inability to style clickable types in iOS and Safari. + * 2. Change font properties to `inherit` in Safari. + */ +::-webkit-file-upload-button { + -webkit-appearance: button; /* 1 */ + font: inherit; /* 2 */ +} + +/* Interactive + ========================================================================== */ +/* + * Add the correct display in Edge, IE 10+, and Firefox. + */ +details { + display: block; +} + +/* + * Add the correct display in all browsers. + */ +summary { + display: list-item; +} + +/* Misc + ========================================================================== */ +/** + * Add the correct display in IE 10+. + */ +template { + display: none; +} + +/** + * Add the correct display in IE 10. + */ +[hidden] { + display: none; +} + +:root { + color-scheme: dark; +} + +* { + box-sizing: border-box; +} + +html { + font-size: 0.875rem !important; + scroll-behavior: smooth; +} +@media (min-width: 31.25rem) { + html { + font-size: 1rem !important; + } +} + +body { + font-family: system-ui, -apple-system, blinkmacsystemfont, "Segoe UI", roboto, "Helvetica Neue", arial, sans-serif, "Segoe UI Emoji"; + font-size: inherit; + line-height: 1.4; + color: #e6e1e8; + background-color: #27262b; + overflow-wrap: break-word; +} + +ol, +ul, +dl, +pre, +address, +blockquote, +table, +div, +hr, +form, +fieldset, +noscript .table-wrapper { + margin-top: 0; +} + +h1, +h2, +h3, +h4, +h5, +h6, +#toctitle { + margin-top: 0; + margin-bottom: 1em; + font-weight: 500; + line-height: 1.25; + color: #f5f6fa; +} + +p { + margin-top: 1em; + margin-bottom: 1em; +} + +a { + color: #2c84fa; + text-decoration: none; +} + +a:not([class]) { + text-decoration: underline; + text-decoration-color: #44434d; + text-underline-offset: 2px; +} +a:not([class]):hover { + text-decoration-color: rgba(44, 132, 250, 0.45); +} + +code { + font-family: "SFMono-Regular", menlo, consolas, monospace; + font-size: 0.75em; + line-height: 1.4; +} + +figure, +pre { + margin: 0; +} + +li { + margin: 0.25em 0; +} + +img { + max-width: 100%; + height: auto; +} + +hr { + height: 1px; + padding: 0; + margin: 2rem 0; + background-color: #44434d; + border: 0; +} + +blockquote { + margin: 10px 0; + margin-block-start: 0; + margin-inline-start: 0; + padding-left: 1rem; + border-left: 3px solid #44434d; +} + +.side-bar { + z-index: 0; + display: flex; + flex-wrap: wrap; + background-color: #27262b; +} +@media (min-width: 50rem) { + .side-bar { + flex-flow: column nowrap; + position: fixed; + width: 15.5rem; + height: 100%; + border-right: 1px solid #44434d; + align-items: flex-end; + } +} +@media (min-width: 66.5rem) { + .side-bar { + width: calc((100% - 66.5rem) / 2 + 16.5rem); + min-width: 16.5rem; + } +} + +@media (min-width: 50rem) { + .main { + position: relative; + max-width: 50rem; + margin-left: 15.5rem; + } +} +@media (min-width: 66.5rem) { + .main { + margin-left: max(16.5rem, (100% - 66.5rem) / 2 + 16.5rem); + } +} + +.main-content-wrap { + padding-right: 1rem; + padding-left: 1rem; + padding-top: 1rem; + padding-bottom: 1rem; +} +@media (min-width: 50rem) { + .main-content-wrap { + padding-right: 2rem; + padding-left: 2rem; + } +} +@media (min-width: 50rem) { + .main-content-wrap { + padding-top: 2rem; + padding-bottom: 2rem; + } +} + +.main-header { + z-index: 0; + display: none; + background-color: #27262b; +} +@media (min-width: 50rem) { + .main-header { + display: flex; + justify-content: space-between; + height: 3.75rem; + background-color: #27262b; + border-bottom: 1px solid #44434d; + } +} +.main-header.nav-open { + display: block; +} +@media (min-width: 50rem) { + .main-header.nav-open { + display: flex; + } +} + +.site-nav, +.site-header, +.site-footer { + width: 100%; +} +@media (min-width: 66.5rem) { + .site-nav, + .site-header, + .site-footer { + width: 16.5rem; + } +} + +.site-nav { + display: none; +} +.site-nav.nav-open { + display: block; +} +@media (min-width: 50rem) { + .site-nav { + display: block; + padding-top: 3rem; + padding-bottom: 1rem; + overflow-y: auto; + flex: 1 1 auto; + } +} + +.site-header { + display: flex; + min-height: 3.75rem; + align-items: center; +} +@media (min-width: 50rem) { + .site-header { + height: 3.75rem; + max-height: 3.75rem; + border-bottom: 1px solid #44434d; + } +} + +.site-title { + padding-right: 1rem; + padding-left: 1rem; + flex-grow: 1; + display: flex; + height: 100%; + align-items: center; + padding-top: 0.75rem; + padding-bottom: 0.75rem; + color: #f5f6fa; + font-size: 1.125rem !important; +} +@media (min-width: 50rem) { + .site-title { + padding-right: 2rem; + padding-left: 2rem; + } +} +@media (min-width: 31.25rem) { + .site-title { + font-size: 1.5rem !important; + line-height: 1.25; + } +} +@media (min-width: 50rem) { + .site-title { + padding-top: 0.5rem; + padding-bottom: 0.5rem; + } +} + +.site-button { + display: flex; + height: 100%; + padding: 1rem; + align-items: center; +} + +@media (min-width: 50rem) { + .site-header .site-button { + display: none; + } +} +.site-title:hover { + background-image: linear-gradient(-90deg, #201f23 0%, rgba(32, 31, 35, 0.8) 80%, rgba(32, 31, 35, 0) 100%); +} + +.site-button:hover { + background-image: linear-gradient(-90deg, #201f23 0%, rgba(32, 31, 35, 0.8) 100%); +} + +body { + position: relative; + padding-bottom: 4rem; + overflow-y: scroll; +} +@media (min-width: 50rem) { + body { + position: static; + padding-bottom: 0; + } +} + +.site-footer { + padding-right: 1rem; + padding-left: 1rem; + position: absolute; + bottom: 0; + left: 0; + padding-top: 1rem; + padding-bottom: 1rem; + color: #959396; + font-size: 0.6875rem !important; +} +@media (min-width: 50rem) { + .site-footer { + padding-right: 2rem; + padding-left: 2rem; + } +} +@media (min-width: 31.25rem) { + .site-footer { + font-size: 0.75rem !important; + } +} +@media (min-width: 50rem) { + .site-footer { + position: static; + justify-self: end; + } +} + +.icon { + width: 1.5rem; + height: 1.5rem; + color: #2c84fa; +} + +.main-content { + line-height: 1.6; +} +.main-content ol, +.main-content ul, +.main-content dl, +.main-content pre, +.main-content address, +.main-content blockquote, +.main-content .table-wrapper { + margin-top: 0.5em; +} +.main-content a { + overflow: hidden; + text-overflow: ellipsis; +} +.main-content ul, +.main-content ol { + padding-left: 1.5em; +} +.main-content li .highlight { + margin-top: 0.25rem; +} +.main-content ol { + list-style-type: none; + counter-reset: step-counter; +} +.main-content ol > li { + position: relative; +} +.main-content ol > li::before { + position: absolute; + top: 0.2em; + left: -1.6em; + color: #959396; + content: counter(step-counter); + counter-increment: step-counter; + font-size: 0.75rem !important; +} +@media (min-width: 31.25rem) { + .main-content ol > li::before { + font-size: 0.875rem !important; + } +} +@media (min-width: 31.25rem) { + .main-content ol > li::before { + top: 0.11em; + } +} +.main-content ol > li ol { + counter-reset: sub-counter; +} +.main-content ol > li ol > li::before { + content: counter(sub-counter, lower-alpha); + counter-increment: sub-counter; +} +.main-content ul { + list-style: none; +} +.main-content ul > li::before { + position: absolute; + margin-left: -1.4em; + color: #959396; + content: "•"; +} +.main-content .task-list-item::before { + content: ""; +} +.main-content .task-list-item-checkbox { + margin-right: 0.6em; + margin-left: -1.4em; +} +.main-content hr + * { + margin-top: 0; +} +.main-content h1:first-of-type { + margin-top: 0.5em; +} +.main-content dl { + display: grid; + grid-template: auto/10em 1fr; +} +.main-content dt, +.main-content dd { + margin: 0.25em 0; +} +.main-content dt { + grid-column: 1; + font-weight: 500; + text-align: right; +} +.main-content dt::after { + content: ":"; +} +.main-content dd { + grid-column: 2; + margin-bottom: 0; + margin-left: 1em; +} +.main-content dd blockquote:first-child, +.main-content dd div:first-child, +.main-content dd dl:first-child, +.main-content dd dt:first-child, +.main-content dd h1:first-child, +.main-content dd h2:first-child, +.main-content dd h3:first-child, +.main-content dd h4:first-child, +.main-content dd h5:first-child, +.main-content dd h6:first-child, +.main-content dd li:first-child, +.main-content dd ol:first-child, +.main-content dd p:first-child, +.main-content dd pre:first-child, +.main-content dd table:first-child, +.main-content dd ul:first-child, +.main-content dd .table-wrapper:first-child { + margin-top: 0; +} +.main-content dd dl:first-child dt:first-child, +.main-content dd dl:first-child dd:nth-child(2), +.main-content ol dl:first-child dt:first-child, +.main-content ol dl:first-child dd:nth-child(2), +.main-content ul dl:first-child dt:first-child, +.main-content ul dl:first-child dd:nth-child(2) { + margin-top: 0; +} +.main-content .anchor-heading { + position: absolute; + right: -1rem; + width: 1.5rem; + height: 100%; + padding-right: 0.25rem; + padding-left: 0.25rem; + overflow: visible; +} +@media (min-width: 50rem) { + .main-content .anchor-heading { + right: auto; + left: -1.5rem; + } +} +.main-content .anchor-heading svg { + display: inline-block; + width: 100%; + height: 100%; + color: #2c84fa; + visibility: hidden; +} +.main-content .anchor-heading:hover svg, +.main-content .anchor-heading:focus svg, +.main-content h1:hover > .anchor-heading svg, +.main-content h2:hover > .anchor-heading svg, +.main-content h3:hover > .anchor-heading svg, +.main-content h4:hover > .anchor-heading svg, +.main-content h5:hover > .anchor-heading svg, +.main-content h6:hover > .anchor-heading svg { + visibility: visible; +} +.main-content summary { + cursor: pointer; +} +.main-content h1, +.main-content h2, +.main-content h3, +.main-content h4, +.main-content h5, +.main-content h6, +.main-content #toctitle { + position: relative; + margin-top: 1.5em; + margin-bottom: 0.25em; +} +.main-content h1 + table, +.main-content h1 + .table-wrapper, +.main-content h1 + .code-example, +.main-content h1 + .highlighter-rouge, +.main-content h1 + .sectionbody .listingblock, +.main-content h2 + table, +.main-content h2 + .table-wrapper, +.main-content h2 + .code-example, +.main-content h2 + .highlighter-rouge, +.main-content h2 + .sectionbody .listingblock, +.main-content h3 + table, +.main-content h3 + .table-wrapper, +.main-content h3 + .code-example, +.main-content h3 + .highlighter-rouge, +.main-content h3 + .sectionbody .listingblock, +.main-content h4 + table, +.main-content h4 + .table-wrapper, +.main-content h4 + .code-example, +.main-content h4 + .highlighter-rouge, +.main-content h4 + .sectionbody .listingblock, +.main-content h5 + table, +.main-content h5 + .table-wrapper, +.main-content h5 + .code-example, +.main-content h5 + .highlighter-rouge, +.main-content h5 + .sectionbody .listingblock, +.main-content h6 + table, +.main-content h6 + .table-wrapper, +.main-content h6 + .code-example, +.main-content h6 + .highlighter-rouge, +.main-content h6 + .sectionbody .listingblock, +.main-content #toctitle + table, +.main-content #toctitle + .table-wrapper, +.main-content #toctitle + .code-example, +.main-content #toctitle + .highlighter-rouge, +.main-content #toctitle + .sectionbody .listingblock { + margin-top: 1em; +} +.main-content h1 + p:not(.label), +.main-content h2 + p:not(.label), +.main-content h3 + p:not(.label), +.main-content h4 + p:not(.label), +.main-content h5 + p:not(.label), +.main-content h6 + p:not(.label), +.main-content #toctitle + p:not(.label) { + margin-top: 0; +} +.main-content > h1:first-child, +.main-content > h2:first-child, +.main-content > h3:first-child, +.main-content > h4:first-child, +.main-content > h5:first-child, +.main-content > h6:first-child, +.main-content > .sect1:first-child > h2, +.main-content > .sect2:first-child > h3, +.main-content > .sect3:first-child > h4, +.main-content > .sect4:first-child > h5, +.main-content > .sect5:first-child > h6 { + margin-top: 0.5rem; +} + +.nav-list { + padding: 0; + margin-top: 0; + margin-bottom: 0; + list-style: none; +} +.nav-list .nav-list-item { + font-size: 0.875rem !important; + position: relative; + margin: 0; +} +@media (min-width: 31.25rem) { + .nav-list .nav-list-item { + font-size: 1rem !important; + } +} +@media (min-width: 50rem) { + .nav-list .nav-list-item { + font-size: 0.75rem !important; + } +} +@media (min-width: 50rem) and (min-width: 31.25rem) { + .nav-list .nav-list-item { + font-size: 0.875rem !important; + } +} +.nav-list .nav-list-item .nav-list-link { + display: block; + min-height: 3rem; + padding-top: 0.25rem; + padding-bottom: 0.25rem; + line-height: 2.5rem; + padding-right: 3rem; + padding-left: 1rem; +} +@media (min-width: 50rem) { + .nav-list .nav-list-item .nav-list-link { + min-height: 2rem; + line-height: 1.5rem; + padding-right: 2rem; + padding-left: 2rem; + } +} +.nav-list .nav-list-item .nav-list-link.external > svg { + width: 1rem; + height: 1rem; + vertical-align: text-bottom; +} +.nav-list .nav-list-item .nav-list-link.active { + font-weight: 600; + text-decoration: none; +} +.nav-list .nav-list-item .nav-list-link:hover, .nav-list .nav-list-item .nav-list-link.active { + background-image: linear-gradient(-90deg, #201f23 0%, rgba(32, 31, 35, 0.8) 80%, rgba(32, 31, 35, 0) 100%); +} +.nav-list .nav-list-item .nav-list-expander { + position: absolute; + right: 0; + width: 3rem; + height: 3rem; + padding: 0.75rem; + color: #2c84fa; +} +@media (min-width: 50rem) { + .nav-list .nav-list-item .nav-list-expander { + width: 2rem; + height: 2rem; + padding: 0.5rem; + } +} +.nav-list .nav-list-item .nav-list-expander:hover { + background-image: linear-gradient(-90deg, #201f23 0%, rgba(32, 31, 35, 0.8) 100%); +} +.nav-list .nav-list-item .nav-list-expander svg { + transform: rotate(90deg); +} +.nav-list .nav-list-item > .nav-list { + display: none; + padding-left: 0.75rem; + list-style: none; +} +.nav-list .nav-list-item > .nav-list .nav-list-item { + position: relative; +} +.nav-list .nav-list-item > .nav-list .nav-list-item .nav-list-link { + color: #959396; +} +.nav-list .nav-list-item > .nav-list .nav-list-item .nav-list-expander { + color: #959396; +} +.nav-list .nav-list-item.active > .nav-list-expander svg { + transform: rotate(-90deg); +} +.nav-list .nav-list-item.active > .nav-list { + display: block; +} + +.nav-category { + padding: 0.5rem 1rem; + font-weight: 600; + text-align: start; + text-transform: uppercase; + border-bottom: 1px solid #44434d; + font-size: 0.6875rem !important; +} +@media (min-width: 31.25rem) { + .nav-category { + font-size: 0.75rem !important; + } +} +@media (min-width: 50rem) { + .nav-category { + padding: 0.5rem 2rem; + margin-top: 1rem; + text-align: start; + } + .nav-category:first-child { + margin-top: 0; + } +} + +.nav-list.nav-category-list > .nav-list-item { + margin: 0; +} +.nav-list.nav-category-list > .nav-list-item > .nav-list { + padding: 0; +} +.nav-list.nav-category-list > .nav-list-item > .nav-list > .nav-list-item > .nav-list-link { + color: #2c84fa; +} +.nav-list.nav-category-list > .nav-list-item > .nav-list > .nav-list-item > .nav-list-expander { + color: #2c84fa; +} + +.aux-nav { + height: 100%; + overflow-x: auto; + font-size: 0.6875rem !important; +} +@media (min-width: 31.25rem) { + .aux-nav { + font-size: 0.75rem !important; + } +} +.aux-nav .aux-nav-list { + display: flex; + height: 100%; + padding: 0; + margin: 0; + list-style: none; +} +.aux-nav .aux-nav-list-item { + display: inline-block; + height: 100%; + padding: 0; + margin: 0; +} +@media (min-width: 50rem) { + .aux-nav { + padding-right: 1rem; + } +} + +@media (min-width: 50rem) { + .breadcrumb-nav { + margin-top: -1rem; + } +} + +.breadcrumb-nav-list { + padding-left: 0; + margin-bottom: 0.75rem; + list-style: none; +} + +.breadcrumb-nav-list-item { + display: table-cell; + font-size: 0.6875rem !important; +} +@media (min-width: 31.25rem) { + .breadcrumb-nav-list-item { + font-size: 0.75rem !important; + } +} +.breadcrumb-nav-list-item::before { + display: none; +} +.breadcrumb-nav-list-item::after { + display: inline-block; + margin-right: 0.5rem; + margin-left: 0.5rem; + color: #959396; + content: "/"; +} +.breadcrumb-nav-list-item:last-child::after { + content: ""; +} + +h1, +.text-alpha { + font-size: 2rem !important; + line-height: 1.25; + font-weight: 300; +} +@media (min-width: 31.25rem) { + h1, + .text-alpha { + font-size: 2.25rem !important; + } +} + +h2, +.text-beta, +#toctitle { + font-size: 1.125rem !important; +} +@media (min-width: 31.25rem) { + h2, + .text-beta, + #toctitle { + font-size: 1.5rem !important; + line-height: 1.25; + } +} + +h3, +.text-gamma { + font-size: 1rem !important; +} +@media (min-width: 31.25rem) { + h3, + .text-gamma { + font-size: 1.125rem !important; + } +} + +h4, +.text-delta { + font-size: 0.6875rem !important; + font-weight: 400; + text-transform: uppercase; + letter-spacing: 0.1em; +} +@media (min-width: 31.25rem) { + h4, + .text-delta { + font-size: 0.75rem !important; + } +} + +h4 code { + text-transform: none; +} + +h5, +.text-epsilon { + font-size: 0.75rem !important; +} +@media (min-width: 31.25rem) { + h5, + .text-epsilon { + font-size: 0.875rem !important; + } +} + +h6, +.text-zeta { + font-size: 0.6875rem !important; +} +@media (min-width: 31.25rem) { + h6, + .text-zeta { + font-size: 0.75rem !important; + } +} + +.text-small { + font-size: 0.6875rem !important; +} +@media (min-width: 31.25rem) { + .text-small { + font-size: 0.75rem !important; + } +} + +.text-mono { + font-family: "SFMono-Regular", menlo, consolas, monospace !important; +} + +.text-left { + text-align: left !important; +} + +.text-center { + text-align: center !important; +} + +.text-right { + text-align: right !important; +} + +.label:not(g), +.label-blue:not(g) { + display: inline-block; + padding: 0.16em 0.56em; + margin-right: 0.5rem; + margin-left: 0.5rem; + color: #fff; + text-transform: uppercase; + vertical-align: middle; + background-color: #2869e6; + font-size: 0.6875rem !important; + border-radius: 12px; +} +@media (min-width: 31.25rem) { + .label:not(g), + .label-blue:not(g) { + font-size: 0.75rem !important; + } +} + +.label-green:not(g) { + background-color: #009c7b; +} + +.label-purple:not(g) { + background-color: #5e41d0; +} + +.label-red:not(g) { + background-color: #e94c4c; +} + +.label-yellow:not(g) { + color: #44434d; + background-color: #f7d12e; +} + +.btn { + display: inline-block; + box-sizing: border-box; + padding: 0.3em 1em; + margin: 0; + font-family: inherit; + font-size: inherit; + font-weight: 500; + line-height: 1.5; + color: #2c84fa; + text-decoration: none; + vertical-align: baseline; + cursor: pointer; + background-color: #302d36; + border-width: 0; + border-radius: 4px; + box-shadow: 0 1px 2px rgba(0, 0, 0, 0.12), 0 3px 10px rgba(0, 0, 0, 0.08); + appearance: none; +} +.btn:focus { + text-decoration: none; + outline: none; + box-shadow: 0 0 0 3px rgba(0, 0, 255, 0.25); +} +.btn:focus:hover, .btn.selected:focus { + box-shadow: 0 0 0 3px rgba(0, 0, 255, 0.25); +} +.btn:hover, .btn.zeroclipboard-is-hover { + color: #227efa; +} +.btn:hover, .btn:active, .btn.zeroclipboard-is-hover, .btn.zeroclipboard-is-active { + text-decoration: none; + background-color: #2e2b33; +} +.btn:active, .btn.selected, .btn.zeroclipboard-is-active { + background-color: #29262e; + background-image: none; + box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15); +} +.btn.selected:hover { + background-color: #cfcfcf; +} +.btn:disabled, .btn:disabled:hover, .btn.disabled, .btn.disabled:hover { + color: rgba(102, 102, 102, 0.5); + cursor: default; + background-color: rgba(229, 229, 229, 0.5); + background-image: none; + box-shadow: none; +} + +.btn-outline { + color: #2c84fa; + background: transparent; + box-shadow: inset 0 0 0 2px #e6e1e8; +} +.btn-outline:hover, .btn-outline:active, .btn-outline.zeroclipboard-is-hover, .btn-outline.zeroclipboard-is-active { + color: #1878fa; + text-decoration: none; + background-color: transparent; + box-shadow: inset 0 0 0 3px #e6e1e8; +} +.btn-outline:focus { + text-decoration: none; + outline: none; + box-shadow: inset 0 0 0 2px #5c5962, 0 0 0 3px rgba(0, 0, 255, 0.25); +} +.btn-outline:focus:hover, .btn-outline.selected:focus { + box-shadow: inset 0 0 0 2px #5c5962; +} + +.btn-primary { + color: #fff; + background-color: #2448a7; + background-image: linear-gradient(#2b55c4, #2448a7); + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.25), 0 4px 10px rgba(0, 0, 0, 0.12); +} +.btn-primary:hover, .btn-primary.zeroclipboard-is-hover { + color: #fff; + background-color: #22459e; + background-image: linear-gradient(#2850b7, #22459e); +} +.btn-primary:active, .btn-primary.selected, .btn-primary.zeroclipboard-is-active { + background-color: #21439a; + background-image: none; + box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15); +} +.btn-primary.selected:hover { + background-color: #1d3a85; +} + +.btn-purple { + color: #fff; + background-color: #5739ce; + background-image: linear-gradient(#6f55d5, #5739ce); + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.25), 0 4px 10px rgba(0, 0, 0, 0.12); +} +.btn-purple:hover, .btn-purple.zeroclipboard-is-hover { + color: #fff; + background-color: #5132cb; + background-image: linear-gradient(#6549d2, #5132cb); +} +.btn-purple:active, .btn-purple.selected, .btn-purple.zeroclipboard-is-active { + background-color: #4f31c6; + background-image: none; + box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15); +} +.btn-purple.selected:hover { + background-color: #472cb2; +} + +.btn-blue { + color: #fff; + background-color: #227efa; + background-image: linear-gradient(#4593fb, #227efa); + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.25), 0 4px 10px rgba(0, 0, 0, 0.12); +} +.btn-blue:hover, .btn-blue.zeroclipboard-is-hover { + color: #fff; + background-color: #1878fa; + background-image: linear-gradient(#368afa, #1878fa); +} +.btn-blue:active, .btn-blue.selected, .btn-blue.zeroclipboard-is-active { + background-color: #1375f9; + background-image: none; + box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15); +} +.btn-blue.selected:hover { + background-color: #0669ed; +} + +.btn-green { + color: #fff; + background-color: #10ac7d; + background-image: linear-gradient(#13cc95, #10ac7d); + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.25), 0 4px 10px rgba(0, 0, 0, 0.12); +} +.btn-green:hover, .btn-green.zeroclipboard-is-hover { + color: #fff; + background-color: #0fa276; + background-image: linear-gradient(#12be8b, #0fa276); +} +.btn-green:active, .btn-green.selected, .btn-green.zeroclipboard-is-active { + background-color: #0f9e73; + background-image: none; + box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15); +} +.btn-green.selected:hover { + background-color: #0d8662; +} + +.btn-reset { + background: none; + border: none; + margin: 0; + text-align: inherit; + font: inherit; + border-radius: 0; + appearance: none; +} + +.search { + position: relative; + z-index: 2; + flex-grow: 1; + height: 4rem; + padding: 0.5rem; + transition: padding linear 200ms; +} +@media (min-width: 50rem) { + .search { + position: relative !important; + width: auto !important; + height: 100% !important; + padding: 0; + transition: none; + } +} + +.search-input-wrap { + position: relative; + z-index: 1; + height: 3rem; + overflow: hidden; + border-radius: 4px; + box-shadow: 0 1px 2px rgba(0, 0, 0, 0.12), 0 3px 10px rgba(0, 0, 0, 0.08); + transition: height linear 200ms; +} +@media (min-width: 50rem) { + .search-input-wrap { + position: absolute; + width: 100%; + max-width: 33.5rem; + height: 100% !important; + border-radius: 0; + box-shadow: none; + transition: width ease 400ms; + } +} + +.search-input { + position: absolute; + width: 100%; + height: 100%; + padding: 0.5rem 1rem 0.5rem 2.5rem; + font-size: 1rem; + color: #e6e1e8; + background-color: #302d36; + border-top: 0; + border-right: 0; + border-bottom: 0; + border-left: 0; + border-radius: 0; +} +@media (min-width: 50rem) { + .search-input { + padding: 0.5rem 1rem 0.5rem 3.5rem; + font-size: 0.875rem; + background-color: #27262b; + transition: padding-left linear 200ms; + } +} +.search-input:focus { + outline: 0; +} +.search-input:focus + .search-label .search-icon { + color: #2c84fa; +} + +.search-label { + position: absolute; + display: flex; + height: 100%; + padding-left: 1rem; +} +@media (min-width: 50rem) { + .search-label { + padding-left: 2rem; + transition: padding-left linear 200ms; + } +} +.search-label .search-icon { + width: 1.2rem; + height: 1.2rem; + align-self: center; + color: #959396; +} + +.search-results { + position: absolute; + left: 0; + display: none; + width: 100%; + max-height: calc(100% - 4rem); + overflow-y: auto; + background-color: #302d36; + border-bottom-right-radius: 4px; + border-bottom-left-radius: 4px; + box-shadow: 0 1px 2px rgba(0, 0, 0, 0.12), 0 3px 10px rgba(0, 0, 0, 0.08); +} +@media (min-width: 50rem) { + .search-results { + top: 100%; + width: 33.5rem; + max-height: calc(100vh - 200%) !important; + } +} + +.search-results-list { + padding-left: 0; + margin-bottom: 0.25rem; + list-style: none; + font-size: 0.875rem !important; +} +@media (min-width: 31.25rem) { + .search-results-list { + font-size: 1rem !important; + } +} +@media (min-width: 50rem) { + .search-results-list { + font-size: 0.75rem !important; + } +} +@media (min-width: 50rem) and (min-width: 31.25rem) { + .search-results-list { + font-size: 0.875rem !important; + } +} + +.search-results-list-item { + padding: 0; + margin: 0; +} + +.search-result { + display: block; + padding: 0.25rem 0.75rem; +} +.search-result:hover, .search-result.active { + background-color: #201f23; +} + +.search-result-title { + display: block; + padding-top: 0.5rem; + padding-bottom: 0.5rem; +} +@media (min-width: 31.25rem) { + .search-result-title { + display: inline-block; + width: 40%; + padding-right: 0.5rem; + vertical-align: top; + } +} + +.search-result-doc { + display: flex; + align-items: center; + word-wrap: break-word; +} +.search-result-doc.search-result-doc-parent { + opacity: 0.5; + font-size: 0.75rem !important; +} +@media (min-width: 31.25rem) { + .search-result-doc.search-result-doc-parent { + font-size: 0.875rem !important; + } +} +@media (min-width: 50rem) { + .search-result-doc.search-result-doc-parent { + font-size: 0.6875rem !important; + } +} +@media (min-width: 50rem) and (min-width: 31.25rem) { + .search-result-doc.search-result-doc-parent { + font-size: 0.75rem !important; + } +} +.search-result-doc .search-result-icon { + width: 1rem; + height: 1rem; + margin-right: 0.5rem; + color: #2c84fa; + flex-shrink: 0; +} +.search-result-doc .search-result-doc-title { + overflow: auto; +} + +.search-result-section { + margin-left: 1.5rem; + word-wrap: break-word; +} + +.search-result-rel-url { + display: block; + margin-left: 1.5rem; + overflow: hidden; + color: #959396; + text-overflow: ellipsis; + white-space: nowrap; + font-size: 0.5625rem !important; +} +@media (min-width: 31.25rem) { + .search-result-rel-url { + font-size: 0.625rem !important; + } +} + +.search-result-previews { + display: block; + padding-top: 0.5rem; + padding-bottom: 0.5rem; + padding-left: 1rem; + margin-left: 0.5rem; + color: #959396; + word-wrap: break-word; + border-left: 1px solid; + border-left-color: #44434d; + font-size: 0.6875rem !important; +} +@media (min-width: 31.25rem) { + .search-result-previews { + font-size: 0.75rem !important; + } +} +@media (min-width: 31.25rem) { + .search-result-previews { + display: inline-block; + width: 60%; + padding-left: 0.5rem; + margin-left: 0; + vertical-align: top; + } +} + +.search-result-preview + .search-result-preview { + margin-top: 0.25rem; +} + +.search-result-highlight { + font-weight: bold; +} + +.search-no-result { + padding: 0.5rem 0.75rem; + font-size: 0.75rem !important; +} +@media (min-width: 31.25rem) { + .search-no-result { + font-size: 0.875rem !important; + } +} + +.search-button { + position: fixed; + right: 1rem; + bottom: 1rem; + display: flex; + width: 3.5rem; + height: 3.5rem; + background-color: #302d36; + border: 1px solid rgba(44, 132, 250, 0.3); + border-radius: 1.75rem; + box-shadow: 0 1px 2px rgba(0, 0, 0, 0.12), 0 3px 10px rgba(0, 0, 0, 0.08); + align-items: center; + justify-content: center; +} + +.search-overlay { + position: fixed; + top: 0; + left: 0; + z-index: 1; + width: 0; + height: 0; + background-color: rgba(0, 0, 0, 0.3); + opacity: 0; + transition: opacity ease 400ms, width 0s 400ms, height 0s 400ms; +} + +.search-active .search { + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + padding: 0; +} +.search-active .search-input-wrap { + height: 4rem; + border-radius: 0; +} +@media (min-width: 50rem) { + .search-active .search-input-wrap { + width: 33.5rem; + box-shadow: 0 1px 2px rgba(0, 0, 0, 0.12), 0 3px 10px rgba(0, 0, 0, 0.08); + } +} +.search-active .search-input { + background-color: #302d36; +} +@media (min-width: 50rem) { + .search-active .search-input { + padding-left: 2.3rem; + } +} +@media (min-width: 50rem) { + .search-active .search-label { + padding-left: 0.6rem; + } +} +.search-active .search-results { + display: block; +} +.search-active .search-overlay { + width: 100%; + height: 100%; + opacity: 1; + transition: opacity ease 400ms, width 0s, height 0s; +} +@media (min-width: 50rem) { + .search-active .main { + position: fixed; + right: 0; + left: 0; + } +} +.search-active .main-header { + padding-top: 4rem; +} +@media (min-width: 50rem) { + .search-active .main-header { + padding-top: 0; + } +} + +.table-wrapper { + display: block; + width: 100%; + max-width: 100%; + margin-bottom: 1.5rem; + overflow-x: auto; + border-radius: 4px; + box-shadow: 0 1px 2px rgba(0, 0, 0, 0.12), 0 3px 10px rgba(0, 0, 0, 0.08); +} + +table { + display: table; + min-width: 100%; + border-collapse: separate; +} + +th, +td { + font-size: 0.75rem !important; + min-width: 7.5rem; + padding: 0.5rem 0.75rem; + background-color: #302d36; + border-bottom: 1px solid rgba(68, 67, 77, 0.5); + border-left: 1px solid #44434d; +} +@media (min-width: 31.25rem) { + th, + td { + font-size: 0.875rem !important; + } +} +th:first-of-type, +td:first-of-type { + border-left: 0; +} + +tbody tr:last-of-type th, +tbody tr:last-of-type td { + border-bottom: 0; +} +tbody tr:last-of-type td { + padding-bottom: 0.75rem; +} + +thead th { + border-bottom: 1px solid #44434d; +} + +:not(pre, figure) > code { + padding: 0.2em 0.15em; + font-weight: 400; + background-color: #31343f; + border: 1px solid #44434d; + border-radius: 4px; +} + +a:visited code { + border-color: #44434d; +} + +div.highlighter-rouge, +div.listingblock > div.content, +figure.highlight { + margin-top: 0; + margin-bottom: 0.75rem; + background-color: #31343f; + border-radius: 4px; + box-shadow: none; + -webkit-overflow-scrolling: touch; + position: relative; + padding: 0; +} +div.highlighter-rouge > button, +div.listingblock > div.content > button, +figure.highlight > button { + width: 0.75rem; + opacity: 0; + position: absolute; + top: 0; + right: 0; + border: 0.75rem solid #31343f; + background-color: #31343f; + color: #e6e1e8; + box-sizing: content-box; +} +div.highlighter-rouge > button svg, +div.listingblock > div.content > button svg, +figure.highlight > button svg { + fill: #e6e1e8; +} +div.highlighter-rouge > button:active, +div.listingblock > div.content > button:active, +figure.highlight > button:active { + text-decoration: none; + outline: none; + opacity: 1; +} +div.highlighter-rouge > button:focus, +div.listingblock > div.content > button:focus, +figure.highlight > button:focus { + opacity: 1; +} +div.highlighter-rouge:hover > button, +div.listingblock > div.content:hover > button, +figure.highlight:hover > button { + cursor: copy; + opacity: 1; +} + +div.highlighter-rouge div.highlight { + overflow-x: auto; + padding: 0.75rem; + margin: 0; + border: 0; +} +div.highlighter-rouge pre.highlight, +div.highlighter-rouge code { + padding: 0; + margin: 0; + border: 0; +} + +div.listingblock { + margin-top: 0; + margin-bottom: 0.75rem; +} +div.listingblock div.content { + overflow-x: auto; + padding: 0.75rem; + margin: 0; + border: 0; +} +div.listingblock div.content > pre, +div.listingblock code { + padding: 0; + margin: 0; + border: 0; +} + +figure.highlight pre, +figure.highlight :not(pre) > code { + overflow-x: auto; + padding: 0.75rem; + margin: 0; + border: 0; +} + +.highlight .table-wrapper { + padding: 0.75rem 0; + margin: 0; + border: 0; + box-shadow: none; +} +.highlight .table-wrapper td, +.highlight .table-wrapper pre { + font-size: 0.6875rem !important; + min-width: 0; + padding: 0; + background-color: #31343f; + border: 0; +} +@media (min-width: 31.25rem) { + .highlight .table-wrapper td, + .highlight .table-wrapper pre { + font-size: 0.75rem !important; + } +} +.highlight .table-wrapper td.gl { + width: 1em; + padding-right: 0.75rem; + padding-left: 0.75rem; +} +.highlight .table-wrapper pre { + margin: 0; + line-height: 2; +} + +.code-example, +.listingblock > .title { + padding: 0.75rem; + margin-bottom: 0.75rem; + overflow: auto; + border: 1px solid #44434d; + border-radius: 4px; +} +.code-example + .highlighter-rouge, +.code-example + .sectionbody .listingblock, +.code-example + .content, +.code-example + figure.highlight, +.listingblock > .title + .highlighter-rouge, +.listingblock > .title + .sectionbody .listingblock, +.listingblock > .title + .content, +.listingblock > .title + figure.highlight { + position: relative; + margin-top: -1rem; + border-right: 1px solid #44434d; + border-bottom: 1px solid #44434d; + border-left: 1px solid #44434d; + border-top-left-radius: 0; + border-top-right-radius: 0; +} + +code.language-mermaid { + padding: 0; + background-color: inherit; + border: 0; +} + +.highlight, +pre.highlight { + background: #31343f; + color: #dee2f7; +} + +.highlight pre { + background: #31343f; +} + +.text-grey-dk-000 { + color: #959396 !important; +} + +.text-grey-dk-100 { + color: #5c5962 !important; +} + +.text-grey-dk-200 { + color: #44434d !important; +} + +.text-grey-dk-250 { + color: #302d36 !important; +} + +.text-grey-dk-300 { + color: #27262b !important; +} + +.text-grey-lt-000 { + color: #f5f6fa !important; +} + +.text-grey-lt-100 { + color: #eeebee !important; +} + +.text-grey-lt-200 { + color: #ecebed !important; +} + +.text-grey-lt-300 { + color: #e6e1e8 !important; +} + +.text-blue-000 { + color: #2c84fa !important; +} + +.text-blue-100 { + color: #2869e6 !important; +} + +.text-blue-200 { + color: #264caf !important; +} + +.text-blue-300 { + color: #183385 !important; +} + +.text-green-000 { + color: #41d693 !important; +} + +.text-green-100 { + color: #11b584 !important; +} + +.text-green-200 { + color: #009c7b !important; +} + +.text-green-300 { + color: #026e57 !important; +} + +.text-purple-000 { + color: #7253ed !important; +} + +.text-purple-100 { + color: #5e41d0 !important; +} + +.text-purple-200 { + color: #4e26af !important; +} + +.text-purple-300 { + color: #381885 !important; +} + +.text-yellow-000 { + color: #ffeb82 !important; +} + +.text-yellow-100 { + color: #fadf50 !important; +} + +.text-yellow-200 { + color: #f7d12e !important; +} + +.text-yellow-300 { + color: #e7af06 !important; +} + +.text-red-000 { + color: #f77e7e !important; +} + +.text-red-100 { + color: #f96e65 !important; +} + +.text-red-200 { + color: #e94c4c !important; +} + +.text-red-300 { + color: #dd2e2e !important; +} + +.bg-grey-dk-000 { + background-color: #959396 !important; +} + +.bg-grey-dk-100 { + background-color: #5c5962 !important; +} + +.bg-grey-dk-200 { + background-color: #44434d !important; +} + +.bg-grey-dk-250 { + background-color: #302d36 !important; +} + +.bg-grey-dk-300 { + background-color: #27262b !important; +} + +.bg-grey-lt-000 { + background-color: #f5f6fa !important; +} + +.bg-grey-lt-100 { + background-color: #eeebee !important; +} + +.bg-grey-lt-200 { + background-color: #ecebed !important; +} + +.bg-grey-lt-300 { + background-color: #e6e1e8 !important; +} + +.bg-blue-000 { + background-color: #2c84fa !important; +} + +.bg-blue-100 { + background-color: #2869e6 !important; +} + +.bg-blue-200 { + background-color: #264caf !important; +} + +.bg-blue-300 { + background-color: #183385 !important; +} + +.bg-green-000 { + background-color: #41d693 !important; +} + +.bg-green-100 { + background-color: #11b584 !important; +} + +.bg-green-200 { + background-color: #009c7b !important; +} + +.bg-green-300 { + background-color: #026e57 !important; +} + +.bg-purple-000 { + background-color: #7253ed !important; +} + +.bg-purple-100 { + background-color: #5e41d0 !important; +} + +.bg-purple-200 { + background-color: #4e26af !important; +} + +.bg-purple-300 { + background-color: #381885 !important; +} + +.bg-yellow-000 { + background-color: #ffeb82 !important; +} + +.bg-yellow-100 { + background-color: #fadf50 !important; +} + +.bg-yellow-200 { + background-color: #f7d12e !important; +} + +.bg-yellow-300 { + background-color: #e7af06 !important; +} + +.bg-red-000 { + background-color: #f77e7e !important; +} + +.bg-red-100 { + background-color: #f96e65 !important; +} + +.bg-red-200 { + background-color: #e94c4c !important; +} + +.bg-red-300 { + background-color: #dd2e2e !important; +} + +.d-block { + display: block !important; +} + +.d-flex { + display: flex !important; +} + +.d-inline { + display: inline !important; +} + +.d-inline-block { + display: inline-block !important; +} + +.d-none { + display: none !important; +} + +@media (min-width: 20rem) { + .d-xs-block { + display: block !important; + } + .d-xs-flex { + display: flex !important; + } + .d-xs-inline { + display: inline !important; + } + .d-xs-inline-block { + display: inline-block !important; + } + .d-xs-none { + display: none !important; + } +} +@media (min-width: 20rem) { + .d-xs-block { + display: block !important; + } + .d-xs-flex { + display: flex !important; + } + .d-xs-inline { + display: inline !important; + } + .d-xs-inline-block { + display: inline-block !important; + } + .d-xs-none { + display: none !important; + } +} +@media (min-width: 20rem) { + .d-xs-block { + display: block !important; + } + .d-xs-flex { + display: flex !important; + } + .d-xs-inline { + display: inline !important; + } + .d-xs-inline-block { + display: inline-block !important; + } + .d-xs-none { + display: none !important; + } +} +@media (min-width: 20rem) { + .d-xs-block { + display: block !important; + } + .d-xs-flex { + display: flex !important; + } + .d-xs-inline { + display: inline !important; + } + .d-xs-inline-block { + display: inline-block !important; + } + .d-xs-none { + display: none !important; + } +} +@media (min-width: 20rem) { + .d-xs-block { + display: block !important; + } + .d-xs-flex { + display: flex !important; + } + .d-xs-inline { + display: inline !important; + } + .d-xs-inline-block { + display: inline-block !important; + } + .d-xs-none { + display: none !important; + } +} +@media (min-width: 20rem) { + .d-xs-block { + display: block !important; + } + .d-xs-flex { + display: flex !important; + } + .d-xs-inline { + display: inline !important; + } + .d-xs-inline-block { + display: inline-block !important; + } + .d-xs-none { + display: none !important; + } +} +@media (min-width: 20rem) { + .d-xs-block { + display: block !important; + } + .d-xs-flex { + display: flex !important; + } + .d-xs-inline { + display: inline !important; + } + .d-xs-inline-block { + display: inline-block !important; + } + .d-xs-none { + display: none !important; + } +} +@media (min-width: 20rem) { + .d-xs-block { + display: block !important; + } + .d-xs-flex { + display: flex !important; + } + .d-xs-inline { + display: inline !important; + } + .d-xs-inline-block { + display: inline-block !important; + } + .d-xs-none { + display: none !important; + } +} +@media (min-width: 20rem) { + .d-xs-block { + display: block !important; + } + .d-xs-flex { + display: flex !important; + } + .d-xs-inline { + display: inline !important; + } + .d-xs-inline-block { + display: inline-block !important; + } + .d-xs-none { + display: none !important; + } +} +@media (min-width: 20rem) { + .d-xs-block { + display: block !important; + } + .d-xs-flex { + display: flex !important; + } + .d-xs-inline { + display: inline !important; + } + .d-xs-inline-block { + display: inline-block !important; + } + .d-xs-none { + display: none !important; + } +} +@media (min-width: 20rem) { + .d-xs-block { + display: block !important; + } + .d-xs-flex { + display: flex !important; + } + .d-xs-inline { + display: inline !important; + } + .d-xs-inline-block { + display: inline-block !important; + } + .d-xs-none { + display: none !important; + } +} +@media (min-width: 31.25rem) { + .d-sm-block { + display: block !important; + } + .d-sm-flex { + display: flex !important; + } + .d-sm-inline { + display: inline !important; + } + .d-sm-inline-block { + display: inline-block !important; + } + .d-sm-none { + display: none !important; + } +} +@media (min-width: 31.25rem) { + .d-sm-block { + display: block !important; + } + .d-sm-flex { + display: flex !important; + } + .d-sm-inline { + display: inline !important; + } + .d-sm-inline-block { + display: inline-block !important; + } + .d-sm-none { + display: none !important; + } +} +@media (min-width: 31.25rem) { + .d-sm-block { + display: block !important; + } + .d-sm-flex { + display: flex !important; + } + .d-sm-inline { + display: inline !important; + } + .d-sm-inline-block { + display: inline-block !important; + } + .d-sm-none { + display: none !important; + } +} +@media (min-width: 31.25rem) { + .d-sm-block { + display: block !important; + } + .d-sm-flex { + display: flex !important; + } + .d-sm-inline { + display: inline !important; + } + .d-sm-inline-block { + display: inline-block !important; + } + .d-sm-none { + display: none !important; + } +} +@media (min-width: 31.25rem) { + .d-sm-block { + display: block !important; + } + .d-sm-flex { + display: flex !important; + } + .d-sm-inline { + display: inline !important; + } + .d-sm-inline-block { + display: inline-block !important; + } + .d-sm-none { + display: none !important; + } +} +@media (min-width: 31.25rem) { + .d-sm-block { + display: block !important; + } + .d-sm-flex { + display: flex !important; + } + .d-sm-inline { + display: inline !important; + } + .d-sm-inline-block { + display: inline-block !important; + } + .d-sm-none { + display: none !important; + } +} +@media (min-width: 31.25rem) { + .d-sm-block { + display: block !important; + } + .d-sm-flex { + display: flex !important; + } + .d-sm-inline { + display: inline !important; + } + .d-sm-inline-block { + display: inline-block !important; + } + .d-sm-none { + display: none !important; + } +} +@media (min-width: 31.25rem) { + .d-sm-block { + display: block !important; + } + .d-sm-flex { + display: flex !important; + } + .d-sm-inline { + display: inline !important; + } + .d-sm-inline-block { + display: inline-block !important; + } + .d-sm-none { + display: none !important; + } +} +@media (min-width: 31.25rem) { + .d-sm-block { + display: block !important; + } + .d-sm-flex { + display: flex !important; + } + .d-sm-inline { + display: inline !important; + } + .d-sm-inline-block { + display: inline-block !important; + } + .d-sm-none { + display: none !important; + } +} +@media (min-width: 31.25rem) { + .d-sm-block { + display: block !important; + } + .d-sm-flex { + display: flex !important; + } + .d-sm-inline { + display: inline !important; + } + .d-sm-inline-block { + display: inline-block !important; + } + .d-sm-none { + display: none !important; + } +} +@media (min-width: 31.25rem) { + .d-sm-block { + display: block !important; + } + .d-sm-flex { + display: flex !important; + } + .d-sm-inline { + display: inline !important; + } + .d-sm-inline-block { + display: inline-block !important; + } + .d-sm-none { + display: none !important; + } +} +@media (min-width: 50rem) { + .d-md-block { + display: block !important; + } + .d-md-flex { + display: flex !important; + } + .d-md-inline { + display: inline !important; + } + .d-md-inline-block { + display: inline-block !important; + } + .d-md-none { + display: none !important; + } +} +@media (min-width: 50rem) { + .d-md-block { + display: block !important; + } + .d-md-flex { + display: flex !important; + } + .d-md-inline { + display: inline !important; + } + .d-md-inline-block { + display: inline-block !important; + } + .d-md-none { + display: none !important; + } +} +@media (min-width: 50rem) { + .d-md-block { + display: block !important; + } + .d-md-flex { + display: flex !important; + } + .d-md-inline { + display: inline !important; + } + .d-md-inline-block { + display: inline-block !important; + } + .d-md-none { + display: none !important; + } +} +@media (min-width: 50rem) { + .d-md-block { + display: block !important; + } + .d-md-flex { + display: flex !important; + } + .d-md-inline { + display: inline !important; + } + .d-md-inline-block { + display: inline-block !important; + } + .d-md-none { + display: none !important; + } +} +@media (min-width: 50rem) { + .d-md-block { + display: block !important; + } + .d-md-flex { + display: flex !important; + } + .d-md-inline { + display: inline !important; + } + .d-md-inline-block { + display: inline-block !important; + } + .d-md-none { + display: none !important; + } +} +@media (min-width: 50rem) { + .d-md-block { + display: block !important; + } + .d-md-flex { + display: flex !important; + } + .d-md-inline { + display: inline !important; + } + .d-md-inline-block { + display: inline-block !important; + } + .d-md-none { + display: none !important; + } +} +@media (min-width: 50rem) { + .d-md-block { + display: block !important; + } + .d-md-flex { + display: flex !important; + } + .d-md-inline { + display: inline !important; + } + .d-md-inline-block { + display: inline-block !important; + } + .d-md-none { + display: none !important; + } +} +@media (min-width: 50rem) { + .d-md-block { + display: block !important; + } + .d-md-flex { + display: flex !important; + } + .d-md-inline { + display: inline !important; + } + .d-md-inline-block { + display: inline-block !important; + } + .d-md-none { + display: none !important; + } +} +@media (min-width: 50rem) { + .d-md-block { + display: block !important; + } + .d-md-flex { + display: flex !important; + } + .d-md-inline { + display: inline !important; + } + .d-md-inline-block { + display: inline-block !important; + } + .d-md-none { + display: none !important; + } +} +@media (min-width: 50rem) { + .d-md-block { + display: block !important; + } + .d-md-flex { + display: flex !important; + } + .d-md-inline { + display: inline !important; + } + .d-md-inline-block { + display: inline-block !important; + } + .d-md-none { + display: none !important; + } +} +@media (min-width: 50rem) { + .d-md-block { + display: block !important; + } + .d-md-flex { + display: flex !important; + } + .d-md-inline { + display: inline !important; + } + .d-md-inline-block { + display: inline-block !important; + } + .d-md-none { + display: none !important; + } +} +@media (min-width: 66.5rem) { + .d-lg-block { + display: block !important; + } + .d-lg-flex { + display: flex !important; + } + .d-lg-inline { + display: inline !important; + } + .d-lg-inline-block { + display: inline-block !important; + } + .d-lg-none { + display: none !important; + } +} +@media (min-width: 66.5rem) { + .d-lg-block { + display: block !important; + } + .d-lg-flex { + display: flex !important; + } + .d-lg-inline { + display: inline !important; + } + .d-lg-inline-block { + display: inline-block !important; + } + .d-lg-none { + display: none !important; + } +} +@media (min-width: 66.5rem) { + .d-lg-block { + display: block !important; + } + .d-lg-flex { + display: flex !important; + } + .d-lg-inline { + display: inline !important; + } + .d-lg-inline-block { + display: inline-block !important; + } + .d-lg-none { + display: none !important; + } +} +@media (min-width: 66.5rem) { + .d-lg-block { + display: block !important; + } + .d-lg-flex { + display: flex !important; + } + .d-lg-inline { + display: inline !important; + } + .d-lg-inline-block { + display: inline-block !important; + } + .d-lg-none { + display: none !important; + } +} +@media (min-width: 66.5rem) { + .d-lg-block { + display: block !important; + } + .d-lg-flex { + display: flex !important; + } + .d-lg-inline { + display: inline !important; + } + .d-lg-inline-block { + display: inline-block !important; + } + .d-lg-none { + display: none !important; + } +} +@media (min-width: 66.5rem) { + .d-lg-block { + display: block !important; + } + .d-lg-flex { + display: flex !important; + } + .d-lg-inline { + display: inline !important; + } + .d-lg-inline-block { + display: inline-block !important; + } + .d-lg-none { + display: none !important; + } +} +@media (min-width: 66.5rem) { + .d-lg-block { + display: block !important; + } + .d-lg-flex { + display: flex !important; + } + .d-lg-inline { + display: inline !important; + } + .d-lg-inline-block { + display: inline-block !important; + } + .d-lg-none { + display: none !important; + } +} +@media (min-width: 66.5rem) { + .d-lg-block { + display: block !important; + } + .d-lg-flex { + display: flex !important; + } + .d-lg-inline { + display: inline !important; + } + .d-lg-inline-block { + display: inline-block !important; + } + .d-lg-none { + display: none !important; + } +} +@media (min-width: 66.5rem) { + .d-lg-block { + display: block !important; + } + .d-lg-flex { + display: flex !important; + } + .d-lg-inline { + display: inline !important; + } + .d-lg-inline-block { + display: inline-block !important; + } + .d-lg-none { + display: none !important; + } +} +@media (min-width: 66.5rem) { + .d-lg-block { + display: block !important; + } + .d-lg-flex { + display: flex !important; + } + .d-lg-inline { + display: inline !important; + } + .d-lg-inline-block { + display: inline-block !important; + } + .d-lg-none { + display: none !important; + } +} +@media (min-width: 66.5rem) { + .d-lg-block { + display: block !important; + } + .d-lg-flex { + display: flex !important; + } + .d-lg-inline { + display: inline !important; + } + .d-lg-inline-block { + display: inline-block !important; + } + .d-lg-none { + display: none !important; + } +} +@media (min-width: 87.5rem) { + .d-xl-block { + display: block !important; + } + .d-xl-flex { + display: flex !important; + } + .d-xl-inline { + display: inline !important; + } + .d-xl-inline-block { + display: inline-block !important; + } + .d-xl-none { + display: none !important; + } +} +@media (min-width: 87.5rem) { + .d-xl-block { + display: block !important; + } + .d-xl-flex { + display: flex !important; + } + .d-xl-inline { + display: inline !important; + } + .d-xl-inline-block { + display: inline-block !important; + } + .d-xl-none { + display: none !important; + } +} +@media (min-width: 87.5rem) { + .d-xl-block { + display: block !important; + } + .d-xl-flex { + display: flex !important; + } + .d-xl-inline { + display: inline !important; + } + .d-xl-inline-block { + display: inline-block !important; + } + .d-xl-none { + display: none !important; + } +} +@media (min-width: 87.5rem) { + .d-xl-block { + display: block !important; + } + .d-xl-flex { + display: flex !important; + } + .d-xl-inline { + display: inline !important; + } + .d-xl-inline-block { + display: inline-block !important; + } + .d-xl-none { + display: none !important; + } +} +@media (min-width: 87.5rem) { + .d-xl-block { + display: block !important; + } + .d-xl-flex { + display: flex !important; + } + .d-xl-inline { + display: inline !important; + } + .d-xl-inline-block { + display: inline-block !important; + } + .d-xl-none { + display: none !important; + } +} +@media (min-width: 87.5rem) { + .d-xl-block { + display: block !important; + } + .d-xl-flex { + display: flex !important; + } + .d-xl-inline { + display: inline !important; + } + .d-xl-inline-block { + display: inline-block !important; + } + .d-xl-none { + display: none !important; + } +} +@media (min-width: 87.5rem) { + .d-xl-block { + display: block !important; + } + .d-xl-flex { + display: flex !important; + } + .d-xl-inline { + display: inline !important; + } + .d-xl-inline-block { + display: inline-block !important; + } + .d-xl-none { + display: none !important; + } +} +@media (min-width: 87.5rem) { + .d-xl-block { + display: block !important; + } + .d-xl-flex { + display: flex !important; + } + .d-xl-inline { + display: inline !important; + } + .d-xl-inline-block { + display: inline-block !important; + } + .d-xl-none { + display: none !important; + } +} +@media (min-width: 87.5rem) { + .d-xl-block { + display: block !important; + } + .d-xl-flex { + display: flex !important; + } + .d-xl-inline { + display: inline !important; + } + .d-xl-inline-block { + display: inline-block !important; + } + .d-xl-none { + display: none !important; + } +} +@media (min-width: 87.5rem) { + .d-xl-block { + display: block !important; + } + .d-xl-flex { + display: flex !important; + } + .d-xl-inline { + display: inline !important; + } + .d-xl-inline-block { + display: inline-block !important; + } + .d-xl-none { + display: none !important; + } +} +@media (min-width: 87.5rem) { + .d-xl-block { + display: block !important; + } + .d-xl-flex { + display: flex !important; + } + .d-xl-inline { + display: inline !important; + } + .d-xl-inline-block { + display: inline-block !important; + } + .d-xl-none { + display: none !important; + } +} +.float-left { + float: left !important; +} + +.float-right { + float: right !important; +} + +.flex-justify-start { + justify-content: flex-start !important; +} + +.flex-justify-end { + justify-content: flex-end !important; +} + +.flex-justify-between { + justify-content: space-between !important; +} + +.flex-justify-around { + justify-content: space-around !important; +} + +.v-align-baseline { + vertical-align: baseline !important; +} + +.v-align-bottom { + vertical-align: bottom !important; +} + +.v-align-middle { + vertical-align: middle !important; +} + +.v-align-text-bottom { + vertical-align: text-bottom !important; +} + +.v-align-text-top { + vertical-align: text-top !important; +} + +.v-align-top { + vertical-align: top !important; +} + +.fs-1 { + font-size: 0.5625rem !important; +} +@media (min-width: 31.25rem) { + .fs-1 { + font-size: 0.625rem !important; + } +} + +.fs-2 { + font-size: 0.6875rem !important; +} +@media (min-width: 31.25rem) { + .fs-2 { + font-size: 0.75rem !important; + } +} + +.fs-3 { + font-size: 0.75rem !important; +} +@media (min-width: 31.25rem) { + .fs-3 { + font-size: 0.875rem !important; + } +} + +.fs-4 { + font-size: 0.875rem !important; +} +@media (min-width: 31.25rem) { + .fs-4 { + font-size: 1rem !important; + } +} + +.fs-5 { + font-size: 1rem !important; +} +@media (min-width: 31.25rem) { + .fs-5 { + font-size: 1.125rem !important; + } +} + +.fs-6 { + font-size: 1.125rem !important; +} +@media (min-width: 31.25rem) { + .fs-6 { + font-size: 1.5rem !important; + line-height: 1.25; + } +} + +.fs-7 { + font-size: 1.5rem !important; + line-height: 1.25; +} +@media (min-width: 31.25rem) { + .fs-7 { + font-size: 2rem !important; + } +} + +.fs-8 { + font-size: 2rem !important; + line-height: 1.25; +} +@media (min-width: 31.25rem) { + .fs-8 { + font-size: 2.25rem !important; + } +} + +.fs-9 { + font-size: 2.25rem !important; + line-height: 1.25; +} +@media (min-width: 31.25rem) { + .fs-9 { + font-size: 2.625rem !important; + } +} + +.fs-10 { + font-size: 2.625rem !important; + line-height: 1.25; +} +@media (min-width: 31.25rem) { + .fs-10 { + font-size: 3rem !important; + } +} + +.fw-300 { + font-weight: 300 !important; +} + +.fw-400 { + font-weight: 400 !important; +} + +.fw-500 { + font-weight: 500 !important; +} + +.fw-700 { + font-weight: 700 !important; +} + +.lh-0 { + line-height: 0 !important; +} + +.lh-default { + line-height: 1.4; +} + +.lh-tight { + line-height: 1.25; +} + +.ls-5 { + letter-spacing: 0.05em !important; +} + +.ls-10 { + letter-spacing: 0.1em !important; +} + +.ls-0 { + letter-spacing: 0 !important; +} + +.text-uppercase { + text-transform: uppercase !important; +} + +.list-style-none { + padding: 0 !important; + margin: 0 !important; + list-style: none !important; +} +.list-style-none li::before { + display: none !important; +} + +.mx-auto { + margin-right: auto !important; + margin-left: auto !important; +} + +.m-0 { + margin: 0 !important; +} + +.mt-0 { + margin-top: 0 !important; +} + +.mr-0 { + margin-right: 0 !important; +} + +.mb-0 { + margin-bottom: 0 !important; +} + +.ml-0 { + margin-left: 0 !important; +} + +.mx-0 { + margin-right: 0 !important; + margin-left: 0 !important; +} + +.my-0 { + margin-top: 0 !important; + margin-bottom: 0 !important; +} + +.mxn-0 { + margin-right: -0 !important; + margin-left: -0 !important; +} + +.mx-0-auto { + margin-right: auto !important; + margin-left: auto !important; +} + +.m-1 { + margin: 0.25rem !important; +} + +.mt-1 { + margin-top: 0.25rem !important; +} + +.mr-1 { + margin-right: 0.25rem !important; +} + +.mb-1 { + margin-bottom: 0.25rem !important; +} + +.ml-1 { + margin-left: 0.25rem !important; +} + +.mx-1 { + margin-right: 0.25rem !important; + margin-left: 0.25rem !important; +} + +.my-1 { + margin-top: 0.25rem !important; + margin-bottom: 0.25rem !important; +} + +.mxn-1 { + margin-right: -0.25rem !important; + margin-left: -0.25rem !important; +} + +.mx-1-auto { + margin-right: auto !important; + margin-left: auto !important; +} + +.m-2 { + margin: 0.5rem !important; +} + +.mt-2 { + margin-top: 0.5rem !important; +} + +.mr-2 { + margin-right: 0.5rem !important; +} + +.mb-2 { + margin-bottom: 0.5rem !important; +} + +.ml-2 { + margin-left: 0.5rem !important; +} + +.mx-2 { + margin-right: 0.5rem !important; + margin-left: 0.5rem !important; +} + +.my-2 { + margin-top: 0.5rem !important; + margin-bottom: 0.5rem !important; +} + +.mxn-2 { + margin-right: -0.5rem !important; + margin-left: -0.5rem !important; +} + +.mx-2-auto { + margin-right: auto !important; + margin-left: auto !important; +} + +.m-3 { + margin: 0.75rem !important; +} + +.mt-3 { + margin-top: 0.75rem !important; +} + +.mr-3 { + margin-right: 0.75rem !important; +} + +.mb-3 { + margin-bottom: 0.75rem !important; +} + +.ml-3 { + margin-left: 0.75rem !important; +} + +.mx-3 { + margin-right: 0.75rem !important; + margin-left: 0.75rem !important; +} + +.my-3 { + margin-top: 0.75rem !important; + margin-bottom: 0.75rem !important; +} + +.mxn-3 { + margin-right: -0.75rem !important; + margin-left: -0.75rem !important; +} + +.mx-3-auto { + margin-right: auto !important; + margin-left: auto !important; +} + +.m-4 { + margin: 1rem !important; +} + +.mt-4 { + margin-top: 1rem !important; +} + +.mr-4 { + margin-right: 1rem !important; +} + +.mb-4 { + margin-bottom: 1rem !important; +} + +.ml-4 { + margin-left: 1rem !important; +} + +.mx-4 { + margin-right: 1rem !important; + margin-left: 1rem !important; +} + +.my-4 { + margin-top: 1rem !important; + margin-bottom: 1rem !important; +} + +.mxn-4 { + margin-right: -1rem !important; + margin-left: -1rem !important; +} + +.mx-4-auto { + margin-right: auto !important; + margin-left: auto !important; +} + +.m-5 { + margin: 1.5rem !important; +} + +.mt-5 { + margin-top: 1.5rem !important; +} + +.mr-5 { + margin-right: 1.5rem !important; +} + +.mb-5 { + margin-bottom: 1.5rem !important; +} + +.ml-5 { + margin-left: 1.5rem !important; +} + +.mx-5 { + margin-right: 1.5rem !important; + margin-left: 1.5rem !important; +} + +.my-5 { + margin-top: 1.5rem !important; + margin-bottom: 1.5rem !important; +} + +.mxn-5 { + margin-right: -1.5rem !important; + margin-left: -1.5rem !important; +} + +.mx-5-auto { + margin-right: auto !important; + margin-left: auto !important; +} + +.m-6 { + margin: 2rem !important; +} + +.mt-6 { + margin-top: 2rem !important; +} + +.mr-6 { + margin-right: 2rem !important; +} + +.mb-6 { + margin-bottom: 2rem !important; +} + +.ml-6 { + margin-left: 2rem !important; +} + +.mx-6 { + margin-right: 2rem !important; + margin-left: 2rem !important; +} + +.my-6 { + margin-top: 2rem !important; + margin-bottom: 2rem !important; +} + +.mxn-6 { + margin-right: -2rem !important; + margin-left: -2rem !important; +} + +.mx-6-auto { + margin-right: auto !important; + margin-left: auto !important; +} + +.m-7 { + margin: 2.5rem !important; +} + +.mt-7 { + margin-top: 2.5rem !important; +} + +.mr-7 { + margin-right: 2.5rem !important; +} + +.mb-7 { + margin-bottom: 2.5rem !important; +} + +.ml-7 { + margin-left: 2.5rem !important; +} + +.mx-7 { + margin-right: 2.5rem !important; + margin-left: 2.5rem !important; +} + +.my-7 { + margin-top: 2.5rem !important; + margin-bottom: 2.5rem !important; +} + +.mxn-7 { + margin-right: -2.5rem !important; + margin-left: -2.5rem !important; +} + +.mx-7-auto { + margin-right: auto !important; + margin-left: auto !important; +} + +.m-8 { + margin: 3rem !important; +} + +.mt-8 { + margin-top: 3rem !important; +} + +.mr-8 { + margin-right: 3rem !important; +} + +.mb-8 { + margin-bottom: 3rem !important; +} + +.ml-8 { + margin-left: 3rem !important; +} + +.mx-8 { + margin-right: 3rem !important; + margin-left: 3rem !important; +} + +.my-8 { + margin-top: 3rem !important; + margin-bottom: 3rem !important; +} + +.mxn-8 { + margin-right: -3rem !important; + margin-left: -3rem !important; +} + +.mx-8-auto { + margin-right: auto !important; + margin-left: auto !important; +} + +.m-9 { + margin: 3.5rem !important; +} + +.mt-9 { + margin-top: 3.5rem !important; +} + +.mr-9 { + margin-right: 3.5rem !important; +} + +.mb-9 { + margin-bottom: 3.5rem !important; +} + +.ml-9 { + margin-left: 3.5rem !important; +} + +.mx-9 { + margin-right: 3.5rem !important; + margin-left: 3.5rem !important; +} + +.my-9 { + margin-top: 3.5rem !important; + margin-bottom: 3.5rem !important; +} + +.mxn-9 { + margin-right: -3.5rem !important; + margin-left: -3.5rem !important; +} + +.mx-9-auto { + margin-right: auto !important; + margin-left: auto !important; +} + +.m-10 { + margin: 4rem !important; +} + +.mt-10 { + margin-top: 4rem !important; +} + +.mr-10 { + margin-right: 4rem !important; +} + +.mb-10 { + margin-bottom: 4rem !important; +} + +.ml-10 { + margin-left: 4rem !important; +} + +.mx-10 { + margin-right: 4rem !important; + margin-left: 4rem !important; +} + +.my-10 { + margin-top: 4rem !important; + margin-bottom: 4rem !important; +} + +.mxn-10 { + margin-right: -4rem !important; + margin-left: -4rem !important; +} + +.mx-10-auto { + margin-right: auto !important; + margin-left: auto !important; +} + +@media (min-width: 20rem) { + .m-xs-0 { + margin: 0 !important; + } + .mt-xs-0 { + margin-top: 0 !important; + } + .mr-xs-0 { + margin-right: 0 !important; + } + .mb-xs-0 { + margin-bottom: 0 !important; + } + .ml-xs-0 { + margin-left: 0 !important; + } + .mx-xs-0 { + margin-right: 0 !important; + margin-left: 0 !important; + } + .my-xs-0 { + margin-top: 0 !important; + margin-bottom: 0 !important; + } + .mxn-xs-0 { + margin-right: -0 !important; + margin-left: -0 !important; + } +} +@media (min-width: 20rem) { + .m-xs-1 { + margin: 0.25rem !important; + } + .mt-xs-1 { + margin-top: 0.25rem !important; + } + .mr-xs-1 { + margin-right: 0.25rem !important; + } + .mb-xs-1 { + margin-bottom: 0.25rem !important; + } + .ml-xs-1 { + margin-left: 0.25rem !important; + } + .mx-xs-1 { + margin-right: 0.25rem !important; + margin-left: 0.25rem !important; + } + .my-xs-1 { + margin-top: 0.25rem !important; + margin-bottom: 0.25rem !important; + } + .mxn-xs-1 { + margin-right: -0.25rem !important; + margin-left: -0.25rem !important; + } +} +@media (min-width: 20rem) { + .m-xs-2 { + margin: 0.5rem !important; + } + .mt-xs-2 { + margin-top: 0.5rem !important; + } + .mr-xs-2 { + margin-right: 0.5rem !important; + } + .mb-xs-2 { + margin-bottom: 0.5rem !important; + } + .ml-xs-2 { + margin-left: 0.5rem !important; + } + .mx-xs-2 { + margin-right: 0.5rem !important; + margin-left: 0.5rem !important; + } + .my-xs-2 { + margin-top: 0.5rem !important; + margin-bottom: 0.5rem !important; + } + .mxn-xs-2 { + margin-right: -0.5rem !important; + margin-left: -0.5rem !important; + } +} +@media (min-width: 20rem) { + .m-xs-3 { + margin: 0.75rem !important; + } + .mt-xs-3 { + margin-top: 0.75rem !important; + } + .mr-xs-3 { + margin-right: 0.75rem !important; + } + .mb-xs-3 { + margin-bottom: 0.75rem !important; + } + .ml-xs-3 { + margin-left: 0.75rem !important; + } + .mx-xs-3 { + margin-right: 0.75rem !important; + margin-left: 0.75rem !important; + } + .my-xs-3 { + margin-top: 0.75rem !important; + margin-bottom: 0.75rem !important; + } + .mxn-xs-3 { + margin-right: -0.75rem !important; + margin-left: -0.75rem !important; + } +} +@media (min-width: 20rem) { + .m-xs-4 { + margin: 1rem !important; + } + .mt-xs-4 { + margin-top: 1rem !important; + } + .mr-xs-4 { + margin-right: 1rem !important; + } + .mb-xs-4 { + margin-bottom: 1rem !important; + } + .ml-xs-4 { + margin-left: 1rem !important; + } + .mx-xs-4 { + margin-right: 1rem !important; + margin-left: 1rem !important; + } + .my-xs-4 { + margin-top: 1rem !important; + margin-bottom: 1rem !important; + } + .mxn-xs-4 { + margin-right: -1rem !important; + margin-left: -1rem !important; + } +} +@media (min-width: 20rem) { + .m-xs-5 { + margin: 1.5rem !important; + } + .mt-xs-5 { + margin-top: 1.5rem !important; + } + .mr-xs-5 { + margin-right: 1.5rem !important; + } + .mb-xs-5 { + margin-bottom: 1.5rem !important; + } + .ml-xs-5 { + margin-left: 1.5rem !important; + } + .mx-xs-5 { + margin-right: 1.5rem !important; + margin-left: 1.5rem !important; + } + .my-xs-5 { + margin-top: 1.5rem !important; + margin-bottom: 1.5rem !important; + } + .mxn-xs-5 { + margin-right: -1.5rem !important; + margin-left: -1.5rem !important; + } +} +@media (min-width: 20rem) { + .m-xs-6 { + margin: 2rem !important; + } + .mt-xs-6 { + margin-top: 2rem !important; + } + .mr-xs-6 { + margin-right: 2rem !important; + } + .mb-xs-6 { + margin-bottom: 2rem !important; + } + .ml-xs-6 { + margin-left: 2rem !important; + } + .mx-xs-6 { + margin-right: 2rem !important; + margin-left: 2rem !important; + } + .my-xs-6 { + margin-top: 2rem !important; + margin-bottom: 2rem !important; + } + .mxn-xs-6 { + margin-right: -2rem !important; + margin-left: -2rem !important; + } +} +@media (min-width: 20rem) { + .m-xs-7 { + margin: 2.5rem !important; + } + .mt-xs-7 { + margin-top: 2.5rem !important; + } + .mr-xs-7 { + margin-right: 2.5rem !important; + } + .mb-xs-7 { + margin-bottom: 2.5rem !important; + } + .ml-xs-7 { + margin-left: 2.5rem !important; + } + .mx-xs-7 { + margin-right: 2.5rem !important; + margin-left: 2.5rem !important; + } + .my-xs-7 { + margin-top: 2.5rem !important; + margin-bottom: 2.5rem !important; + } + .mxn-xs-7 { + margin-right: -2.5rem !important; + margin-left: -2.5rem !important; + } +} +@media (min-width: 20rem) { + .m-xs-8 { + margin: 3rem !important; + } + .mt-xs-8 { + margin-top: 3rem !important; + } + .mr-xs-8 { + margin-right: 3rem !important; + } + .mb-xs-8 { + margin-bottom: 3rem !important; + } + .ml-xs-8 { + margin-left: 3rem !important; + } + .mx-xs-8 { + margin-right: 3rem !important; + margin-left: 3rem !important; + } + .my-xs-8 { + margin-top: 3rem !important; + margin-bottom: 3rem !important; + } + .mxn-xs-8 { + margin-right: -3rem !important; + margin-left: -3rem !important; + } +} +@media (min-width: 20rem) { + .m-xs-9 { + margin: 3.5rem !important; + } + .mt-xs-9 { + margin-top: 3.5rem !important; + } + .mr-xs-9 { + margin-right: 3.5rem !important; + } + .mb-xs-9 { + margin-bottom: 3.5rem !important; + } + .ml-xs-9 { + margin-left: 3.5rem !important; + } + .mx-xs-9 { + margin-right: 3.5rem !important; + margin-left: 3.5rem !important; + } + .my-xs-9 { + margin-top: 3.5rem !important; + margin-bottom: 3.5rem !important; + } + .mxn-xs-9 { + margin-right: -3.5rem !important; + margin-left: -3.5rem !important; + } +} +@media (min-width: 20rem) { + .m-xs-10 { + margin: 4rem !important; + } + .mt-xs-10 { + margin-top: 4rem !important; + } + .mr-xs-10 { + margin-right: 4rem !important; + } + .mb-xs-10 { + margin-bottom: 4rem !important; + } + .ml-xs-10 { + margin-left: 4rem !important; + } + .mx-xs-10 { + margin-right: 4rem !important; + margin-left: 4rem !important; + } + .my-xs-10 { + margin-top: 4rem !important; + margin-bottom: 4rem !important; + } + .mxn-xs-10 { + margin-right: -4rem !important; + margin-left: -4rem !important; + } +} +@media (min-width: 31.25rem) { + .m-sm-0 { + margin: 0 !important; + } + .mt-sm-0 { + margin-top: 0 !important; + } + .mr-sm-0 { + margin-right: 0 !important; + } + .mb-sm-0 { + margin-bottom: 0 !important; + } + .ml-sm-0 { + margin-left: 0 !important; + } + .mx-sm-0 { + margin-right: 0 !important; + margin-left: 0 !important; + } + .my-sm-0 { + margin-top: 0 !important; + margin-bottom: 0 !important; + } + .mxn-sm-0 { + margin-right: -0 !important; + margin-left: -0 !important; + } +} +@media (min-width: 31.25rem) { + .m-sm-1 { + margin: 0.25rem !important; + } + .mt-sm-1 { + margin-top: 0.25rem !important; + } + .mr-sm-1 { + margin-right: 0.25rem !important; + } + .mb-sm-1 { + margin-bottom: 0.25rem !important; + } + .ml-sm-1 { + margin-left: 0.25rem !important; + } + .mx-sm-1 { + margin-right: 0.25rem !important; + margin-left: 0.25rem !important; + } + .my-sm-1 { + margin-top: 0.25rem !important; + margin-bottom: 0.25rem !important; + } + .mxn-sm-1 { + margin-right: -0.25rem !important; + margin-left: -0.25rem !important; + } +} +@media (min-width: 31.25rem) { + .m-sm-2 { + margin: 0.5rem !important; + } + .mt-sm-2 { + margin-top: 0.5rem !important; + } + .mr-sm-2 { + margin-right: 0.5rem !important; + } + .mb-sm-2 { + margin-bottom: 0.5rem !important; + } + .ml-sm-2 { + margin-left: 0.5rem !important; + } + .mx-sm-2 { + margin-right: 0.5rem !important; + margin-left: 0.5rem !important; + } + .my-sm-2 { + margin-top: 0.5rem !important; + margin-bottom: 0.5rem !important; + } + .mxn-sm-2 { + margin-right: -0.5rem !important; + margin-left: -0.5rem !important; + } +} +@media (min-width: 31.25rem) { + .m-sm-3 { + margin: 0.75rem !important; + } + .mt-sm-3 { + margin-top: 0.75rem !important; + } + .mr-sm-3 { + margin-right: 0.75rem !important; + } + .mb-sm-3 { + margin-bottom: 0.75rem !important; + } + .ml-sm-3 { + margin-left: 0.75rem !important; + } + .mx-sm-3 { + margin-right: 0.75rem !important; + margin-left: 0.75rem !important; + } + .my-sm-3 { + margin-top: 0.75rem !important; + margin-bottom: 0.75rem !important; + } + .mxn-sm-3 { + margin-right: -0.75rem !important; + margin-left: -0.75rem !important; + } +} +@media (min-width: 31.25rem) { + .m-sm-4 { + margin: 1rem !important; + } + .mt-sm-4 { + margin-top: 1rem !important; + } + .mr-sm-4 { + margin-right: 1rem !important; + } + .mb-sm-4 { + margin-bottom: 1rem !important; + } + .ml-sm-4 { + margin-left: 1rem !important; + } + .mx-sm-4 { + margin-right: 1rem !important; + margin-left: 1rem !important; + } + .my-sm-4 { + margin-top: 1rem !important; + margin-bottom: 1rem !important; + } + .mxn-sm-4 { + margin-right: -1rem !important; + margin-left: -1rem !important; + } +} +@media (min-width: 31.25rem) { + .m-sm-5 { + margin: 1.5rem !important; + } + .mt-sm-5 { + margin-top: 1.5rem !important; + } + .mr-sm-5 { + margin-right: 1.5rem !important; + } + .mb-sm-5 { + margin-bottom: 1.5rem !important; + } + .ml-sm-5 { + margin-left: 1.5rem !important; + } + .mx-sm-5 { + margin-right: 1.5rem !important; + margin-left: 1.5rem !important; + } + .my-sm-5 { + margin-top: 1.5rem !important; + margin-bottom: 1.5rem !important; + } + .mxn-sm-5 { + margin-right: -1.5rem !important; + margin-left: -1.5rem !important; + } +} +@media (min-width: 31.25rem) { + .m-sm-6 { + margin: 2rem !important; + } + .mt-sm-6 { + margin-top: 2rem !important; + } + .mr-sm-6 { + margin-right: 2rem !important; + } + .mb-sm-6 { + margin-bottom: 2rem !important; + } + .ml-sm-6 { + margin-left: 2rem !important; + } + .mx-sm-6 { + margin-right: 2rem !important; + margin-left: 2rem !important; + } + .my-sm-6 { + margin-top: 2rem !important; + margin-bottom: 2rem !important; + } + .mxn-sm-6 { + margin-right: -2rem !important; + margin-left: -2rem !important; + } +} +@media (min-width: 31.25rem) { + .m-sm-7 { + margin: 2.5rem !important; + } + .mt-sm-7 { + margin-top: 2.5rem !important; + } + .mr-sm-7 { + margin-right: 2.5rem !important; + } + .mb-sm-7 { + margin-bottom: 2.5rem !important; + } + .ml-sm-7 { + margin-left: 2.5rem !important; + } + .mx-sm-7 { + margin-right: 2.5rem !important; + margin-left: 2.5rem !important; + } + .my-sm-7 { + margin-top: 2.5rem !important; + margin-bottom: 2.5rem !important; + } + .mxn-sm-7 { + margin-right: -2.5rem !important; + margin-left: -2.5rem !important; + } +} +@media (min-width: 31.25rem) { + .m-sm-8 { + margin: 3rem !important; + } + .mt-sm-8 { + margin-top: 3rem !important; + } + .mr-sm-8 { + margin-right: 3rem !important; + } + .mb-sm-8 { + margin-bottom: 3rem !important; + } + .ml-sm-8 { + margin-left: 3rem !important; + } + .mx-sm-8 { + margin-right: 3rem !important; + margin-left: 3rem !important; + } + .my-sm-8 { + margin-top: 3rem !important; + margin-bottom: 3rem !important; + } + .mxn-sm-8 { + margin-right: -3rem !important; + margin-left: -3rem !important; + } +} +@media (min-width: 31.25rem) { + .m-sm-9 { + margin: 3.5rem !important; + } + .mt-sm-9 { + margin-top: 3.5rem !important; + } + .mr-sm-9 { + margin-right: 3.5rem !important; + } + .mb-sm-9 { + margin-bottom: 3.5rem !important; + } + .ml-sm-9 { + margin-left: 3.5rem !important; + } + .mx-sm-9 { + margin-right: 3.5rem !important; + margin-left: 3.5rem !important; + } + .my-sm-9 { + margin-top: 3.5rem !important; + margin-bottom: 3.5rem !important; + } + .mxn-sm-9 { + margin-right: -3.5rem !important; + margin-left: -3.5rem !important; + } +} +@media (min-width: 31.25rem) { + .m-sm-10 { + margin: 4rem !important; + } + .mt-sm-10 { + margin-top: 4rem !important; + } + .mr-sm-10 { + margin-right: 4rem !important; + } + .mb-sm-10 { + margin-bottom: 4rem !important; + } + .ml-sm-10 { + margin-left: 4rem !important; + } + .mx-sm-10 { + margin-right: 4rem !important; + margin-left: 4rem !important; + } + .my-sm-10 { + margin-top: 4rem !important; + margin-bottom: 4rem !important; + } + .mxn-sm-10 { + margin-right: -4rem !important; + margin-left: -4rem !important; + } +} +@media (min-width: 50rem) { + .m-md-0 { + margin: 0 !important; + } + .mt-md-0 { + margin-top: 0 !important; + } + .mr-md-0 { + margin-right: 0 !important; + } + .mb-md-0 { + margin-bottom: 0 !important; + } + .ml-md-0 { + margin-left: 0 !important; + } + .mx-md-0 { + margin-right: 0 !important; + margin-left: 0 !important; + } + .my-md-0 { + margin-top: 0 !important; + margin-bottom: 0 !important; + } + .mxn-md-0 { + margin-right: -0 !important; + margin-left: -0 !important; + } +} +@media (min-width: 50rem) { + .m-md-1 { + margin: 0.25rem !important; + } + .mt-md-1 { + margin-top: 0.25rem !important; + } + .mr-md-1 { + margin-right: 0.25rem !important; + } + .mb-md-1 { + margin-bottom: 0.25rem !important; + } + .ml-md-1 { + margin-left: 0.25rem !important; + } + .mx-md-1 { + margin-right: 0.25rem !important; + margin-left: 0.25rem !important; + } + .my-md-1 { + margin-top: 0.25rem !important; + margin-bottom: 0.25rem !important; + } + .mxn-md-1 { + margin-right: -0.25rem !important; + margin-left: -0.25rem !important; + } +} +@media (min-width: 50rem) { + .m-md-2 { + margin: 0.5rem !important; + } + .mt-md-2 { + margin-top: 0.5rem !important; + } + .mr-md-2 { + margin-right: 0.5rem !important; + } + .mb-md-2 { + margin-bottom: 0.5rem !important; + } + .ml-md-2 { + margin-left: 0.5rem !important; + } + .mx-md-2 { + margin-right: 0.5rem !important; + margin-left: 0.5rem !important; + } + .my-md-2 { + margin-top: 0.5rem !important; + margin-bottom: 0.5rem !important; + } + .mxn-md-2 { + margin-right: -0.5rem !important; + margin-left: -0.5rem !important; + } +} +@media (min-width: 50rem) { + .m-md-3 { + margin: 0.75rem !important; + } + .mt-md-3 { + margin-top: 0.75rem !important; + } + .mr-md-3 { + margin-right: 0.75rem !important; + } + .mb-md-3 { + margin-bottom: 0.75rem !important; + } + .ml-md-3 { + margin-left: 0.75rem !important; + } + .mx-md-3 { + margin-right: 0.75rem !important; + margin-left: 0.75rem !important; + } + .my-md-3 { + margin-top: 0.75rem !important; + margin-bottom: 0.75rem !important; + } + .mxn-md-3 { + margin-right: -0.75rem !important; + margin-left: -0.75rem !important; + } +} +@media (min-width: 50rem) { + .m-md-4 { + margin: 1rem !important; + } + .mt-md-4 { + margin-top: 1rem !important; + } + .mr-md-4 { + margin-right: 1rem !important; + } + .mb-md-4 { + margin-bottom: 1rem !important; + } + .ml-md-4 { + margin-left: 1rem !important; + } + .mx-md-4 { + margin-right: 1rem !important; + margin-left: 1rem !important; + } + .my-md-4 { + margin-top: 1rem !important; + margin-bottom: 1rem !important; + } + .mxn-md-4 { + margin-right: -1rem !important; + margin-left: -1rem !important; + } +} +@media (min-width: 50rem) { + .m-md-5 { + margin: 1.5rem !important; + } + .mt-md-5 { + margin-top: 1.5rem !important; + } + .mr-md-5 { + margin-right: 1.5rem !important; + } + .mb-md-5 { + margin-bottom: 1.5rem !important; + } + .ml-md-5 { + margin-left: 1.5rem !important; + } + .mx-md-5 { + margin-right: 1.5rem !important; + margin-left: 1.5rem !important; + } + .my-md-5 { + margin-top: 1.5rem !important; + margin-bottom: 1.5rem !important; + } + .mxn-md-5 { + margin-right: -1.5rem !important; + margin-left: -1.5rem !important; + } +} +@media (min-width: 50rem) { + .m-md-6 { + margin: 2rem !important; + } + .mt-md-6 { + margin-top: 2rem !important; + } + .mr-md-6 { + margin-right: 2rem !important; + } + .mb-md-6 { + margin-bottom: 2rem !important; + } + .ml-md-6 { + margin-left: 2rem !important; + } + .mx-md-6 { + margin-right: 2rem !important; + margin-left: 2rem !important; + } + .my-md-6 { + margin-top: 2rem !important; + margin-bottom: 2rem !important; + } + .mxn-md-6 { + margin-right: -2rem !important; + margin-left: -2rem !important; + } +} +@media (min-width: 50rem) { + .m-md-7 { + margin: 2.5rem !important; + } + .mt-md-7 { + margin-top: 2.5rem !important; + } + .mr-md-7 { + margin-right: 2.5rem !important; + } + .mb-md-7 { + margin-bottom: 2.5rem !important; + } + .ml-md-7 { + margin-left: 2.5rem !important; + } + .mx-md-7 { + margin-right: 2.5rem !important; + margin-left: 2.5rem !important; + } + .my-md-7 { + margin-top: 2.5rem !important; + margin-bottom: 2.5rem !important; + } + .mxn-md-7 { + margin-right: -2.5rem !important; + margin-left: -2.5rem !important; + } +} +@media (min-width: 50rem) { + .m-md-8 { + margin: 3rem !important; + } + .mt-md-8 { + margin-top: 3rem !important; + } + .mr-md-8 { + margin-right: 3rem !important; + } + .mb-md-8 { + margin-bottom: 3rem !important; + } + .ml-md-8 { + margin-left: 3rem !important; + } + .mx-md-8 { + margin-right: 3rem !important; + margin-left: 3rem !important; + } + .my-md-8 { + margin-top: 3rem !important; + margin-bottom: 3rem !important; + } + .mxn-md-8 { + margin-right: -3rem !important; + margin-left: -3rem !important; + } +} +@media (min-width: 50rem) { + .m-md-9 { + margin: 3.5rem !important; + } + .mt-md-9 { + margin-top: 3.5rem !important; + } + .mr-md-9 { + margin-right: 3.5rem !important; + } + .mb-md-9 { + margin-bottom: 3.5rem !important; + } + .ml-md-9 { + margin-left: 3.5rem !important; + } + .mx-md-9 { + margin-right: 3.5rem !important; + margin-left: 3.5rem !important; + } + .my-md-9 { + margin-top: 3.5rem !important; + margin-bottom: 3.5rem !important; + } + .mxn-md-9 { + margin-right: -3.5rem !important; + margin-left: -3.5rem !important; + } +} +@media (min-width: 50rem) { + .m-md-10 { + margin: 4rem !important; + } + .mt-md-10 { + margin-top: 4rem !important; + } + .mr-md-10 { + margin-right: 4rem !important; + } + .mb-md-10 { + margin-bottom: 4rem !important; + } + .ml-md-10 { + margin-left: 4rem !important; + } + .mx-md-10 { + margin-right: 4rem !important; + margin-left: 4rem !important; + } + .my-md-10 { + margin-top: 4rem !important; + margin-bottom: 4rem !important; + } + .mxn-md-10 { + margin-right: -4rem !important; + margin-left: -4rem !important; + } +} +@media (min-width: 66.5rem) { + .m-lg-0 { + margin: 0 !important; + } + .mt-lg-0 { + margin-top: 0 !important; + } + .mr-lg-0 { + margin-right: 0 !important; + } + .mb-lg-0 { + margin-bottom: 0 !important; + } + .ml-lg-0 { + margin-left: 0 !important; + } + .mx-lg-0 { + margin-right: 0 !important; + margin-left: 0 !important; + } + .my-lg-0 { + margin-top: 0 !important; + margin-bottom: 0 !important; + } + .mxn-lg-0 { + margin-right: -0 !important; + margin-left: -0 !important; + } +} +@media (min-width: 66.5rem) { + .m-lg-1 { + margin: 0.25rem !important; + } + .mt-lg-1 { + margin-top: 0.25rem !important; + } + .mr-lg-1 { + margin-right: 0.25rem !important; + } + .mb-lg-1 { + margin-bottom: 0.25rem !important; + } + .ml-lg-1 { + margin-left: 0.25rem !important; + } + .mx-lg-1 { + margin-right: 0.25rem !important; + margin-left: 0.25rem !important; + } + .my-lg-1 { + margin-top: 0.25rem !important; + margin-bottom: 0.25rem !important; + } + .mxn-lg-1 { + margin-right: -0.25rem !important; + margin-left: -0.25rem !important; + } +} +@media (min-width: 66.5rem) { + .m-lg-2 { + margin: 0.5rem !important; + } + .mt-lg-2 { + margin-top: 0.5rem !important; + } + .mr-lg-2 { + margin-right: 0.5rem !important; + } + .mb-lg-2 { + margin-bottom: 0.5rem !important; + } + .ml-lg-2 { + margin-left: 0.5rem !important; + } + .mx-lg-2 { + margin-right: 0.5rem !important; + margin-left: 0.5rem !important; + } + .my-lg-2 { + margin-top: 0.5rem !important; + margin-bottom: 0.5rem !important; + } + .mxn-lg-2 { + margin-right: -0.5rem !important; + margin-left: -0.5rem !important; + } +} +@media (min-width: 66.5rem) { + .m-lg-3 { + margin: 0.75rem !important; + } + .mt-lg-3 { + margin-top: 0.75rem !important; + } + .mr-lg-3 { + margin-right: 0.75rem !important; + } + .mb-lg-3 { + margin-bottom: 0.75rem !important; + } + .ml-lg-3 { + margin-left: 0.75rem !important; + } + .mx-lg-3 { + margin-right: 0.75rem !important; + margin-left: 0.75rem !important; + } + .my-lg-3 { + margin-top: 0.75rem !important; + margin-bottom: 0.75rem !important; + } + .mxn-lg-3 { + margin-right: -0.75rem !important; + margin-left: -0.75rem !important; + } +} +@media (min-width: 66.5rem) { + .m-lg-4 { + margin: 1rem !important; + } + .mt-lg-4 { + margin-top: 1rem !important; + } + .mr-lg-4 { + margin-right: 1rem !important; + } + .mb-lg-4 { + margin-bottom: 1rem !important; + } + .ml-lg-4 { + margin-left: 1rem !important; + } + .mx-lg-4 { + margin-right: 1rem !important; + margin-left: 1rem !important; + } + .my-lg-4 { + margin-top: 1rem !important; + margin-bottom: 1rem !important; + } + .mxn-lg-4 { + margin-right: -1rem !important; + margin-left: -1rem !important; + } +} +@media (min-width: 66.5rem) { + .m-lg-5 { + margin: 1.5rem !important; + } + .mt-lg-5 { + margin-top: 1.5rem !important; + } + .mr-lg-5 { + margin-right: 1.5rem !important; + } + .mb-lg-5 { + margin-bottom: 1.5rem !important; + } + .ml-lg-5 { + margin-left: 1.5rem !important; + } + .mx-lg-5 { + margin-right: 1.5rem !important; + margin-left: 1.5rem !important; + } + .my-lg-5 { + margin-top: 1.5rem !important; + margin-bottom: 1.5rem !important; + } + .mxn-lg-5 { + margin-right: -1.5rem !important; + margin-left: -1.5rem !important; + } +} +@media (min-width: 66.5rem) { + .m-lg-6 { + margin: 2rem !important; + } + .mt-lg-6 { + margin-top: 2rem !important; + } + .mr-lg-6 { + margin-right: 2rem !important; + } + .mb-lg-6 { + margin-bottom: 2rem !important; + } + .ml-lg-6 { + margin-left: 2rem !important; + } + .mx-lg-6 { + margin-right: 2rem !important; + margin-left: 2rem !important; + } + .my-lg-6 { + margin-top: 2rem !important; + margin-bottom: 2rem !important; + } + .mxn-lg-6 { + margin-right: -2rem !important; + margin-left: -2rem !important; + } +} +@media (min-width: 66.5rem) { + .m-lg-7 { + margin: 2.5rem !important; + } + .mt-lg-7 { + margin-top: 2.5rem !important; + } + .mr-lg-7 { + margin-right: 2.5rem !important; + } + .mb-lg-7 { + margin-bottom: 2.5rem !important; + } + .ml-lg-7 { + margin-left: 2.5rem !important; + } + .mx-lg-7 { + margin-right: 2.5rem !important; + margin-left: 2.5rem !important; + } + .my-lg-7 { + margin-top: 2.5rem !important; + margin-bottom: 2.5rem !important; + } + .mxn-lg-7 { + margin-right: -2.5rem !important; + margin-left: -2.5rem !important; + } +} +@media (min-width: 66.5rem) { + .m-lg-8 { + margin: 3rem !important; + } + .mt-lg-8 { + margin-top: 3rem !important; + } + .mr-lg-8 { + margin-right: 3rem !important; + } + .mb-lg-8 { + margin-bottom: 3rem !important; + } + .ml-lg-8 { + margin-left: 3rem !important; + } + .mx-lg-8 { + margin-right: 3rem !important; + margin-left: 3rem !important; + } + .my-lg-8 { + margin-top: 3rem !important; + margin-bottom: 3rem !important; + } + .mxn-lg-8 { + margin-right: -3rem !important; + margin-left: -3rem !important; + } +} +@media (min-width: 66.5rem) { + .m-lg-9 { + margin: 3.5rem !important; + } + .mt-lg-9 { + margin-top: 3.5rem !important; + } + .mr-lg-9 { + margin-right: 3.5rem !important; + } + .mb-lg-9 { + margin-bottom: 3.5rem !important; + } + .ml-lg-9 { + margin-left: 3.5rem !important; + } + .mx-lg-9 { + margin-right: 3.5rem !important; + margin-left: 3.5rem !important; + } + .my-lg-9 { + margin-top: 3.5rem !important; + margin-bottom: 3.5rem !important; + } + .mxn-lg-9 { + margin-right: -3.5rem !important; + margin-left: -3.5rem !important; + } +} +@media (min-width: 66.5rem) { + .m-lg-10 { + margin: 4rem !important; + } + .mt-lg-10 { + margin-top: 4rem !important; + } + .mr-lg-10 { + margin-right: 4rem !important; + } + .mb-lg-10 { + margin-bottom: 4rem !important; + } + .ml-lg-10 { + margin-left: 4rem !important; + } + .mx-lg-10 { + margin-right: 4rem !important; + margin-left: 4rem !important; + } + .my-lg-10 { + margin-top: 4rem !important; + margin-bottom: 4rem !important; + } + .mxn-lg-10 { + margin-right: -4rem !important; + margin-left: -4rem !important; + } +} +@media (min-width: 87.5rem) { + .m-xl-0 { + margin: 0 !important; + } + .mt-xl-0 { + margin-top: 0 !important; + } + .mr-xl-0 { + margin-right: 0 !important; + } + .mb-xl-0 { + margin-bottom: 0 !important; + } + .ml-xl-0 { + margin-left: 0 !important; + } + .mx-xl-0 { + margin-right: 0 !important; + margin-left: 0 !important; + } + .my-xl-0 { + margin-top: 0 !important; + margin-bottom: 0 !important; + } + .mxn-xl-0 { + margin-right: -0 !important; + margin-left: -0 !important; + } +} +@media (min-width: 87.5rem) { + .m-xl-1 { + margin: 0.25rem !important; + } + .mt-xl-1 { + margin-top: 0.25rem !important; + } + .mr-xl-1 { + margin-right: 0.25rem !important; + } + .mb-xl-1 { + margin-bottom: 0.25rem !important; + } + .ml-xl-1 { + margin-left: 0.25rem !important; + } + .mx-xl-1 { + margin-right: 0.25rem !important; + margin-left: 0.25rem !important; + } + .my-xl-1 { + margin-top: 0.25rem !important; + margin-bottom: 0.25rem !important; + } + .mxn-xl-1 { + margin-right: -0.25rem !important; + margin-left: -0.25rem !important; + } +} +@media (min-width: 87.5rem) { + .m-xl-2 { + margin: 0.5rem !important; + } + .mt-xl-2 { + margin-top: 0.5rem !important; + } + .mr-xl-2 { + margin-right: 0.5rem !important; + } + .mb-xl-2 { + margin-bottom: 0.5rem !important; + } + .ml-xl-2 { + margin-left: 0.5rem !important; + } + .mx-xl-2 { + margin-right: 0.5rem !important; + margin-left: 0.5rem !important; + } + .my-xl-2 { + margin-top: 0.5rem !important; + margin-bottom: 0.5rem !important; + } + .mxn-xl-2 { + margin-right: -0.5rem !important; + margin-left: -0.5rem !important; + } +} +@media (min-width: 87.5rem) { + .m-xl-3 { + margin: 0.75rem !important; + } + .mt-xl-3 { + margin-top: 0.75rem !important; + } + .mr-xl-3 { + margin-right: 0.75rem !important; + } + .mb-xl-3 { + margin-bottom: 0.75rem !important; + } + .ml-xl-3 { + margin-left: 0.75rem !important; + } + .mx-xl-3 { + margin-right: 0.75rem !important; + margin-left: 0.75rem !important; + } + .my-xl-3 { + margin-top: 0.75rem !important; + margin-bottom: 0.75rem !important; + } + .mxn-xl-3 { + margin-right: -0.75rem !important; + margin-left: -0.75rem !important; + } +} +@media (min-width: 87.5rem) { + .m-xl-4 { + margin: 1rem !important; + } + .mt-xl-4 { + margin-top: 1rem !important; + } + .mr-xl-4 { + margin-right: 1rem !important; + } + .mb-xl-4 { + margin-bottom: 1rem !important; + } + .ml-xl-4 { + margin-left: 1rem !important; + } + .mx-xl-4 { + margin-right: 1rem !important; + margin-left: 1rem !important; + } + .my-xl-4 { + margin-top: 1rem !important; + margin-bottom: 1rem !important; + } + .mxn-xl-4 { + margin-right: -1rem !important; + margin-left: -1rem !important; + } +} +@media (min-width: 87.5rem) { + .m-xl-5 { + margin: 1.5rem !important; + } + .mt-xl-5 { + margin-top: 1.5rem !important; + } + .mr-xl-5 { + margin-right: 1.5rem !important; + } + .mb-xl-5 { + margin-bottom: 1.5rem !important; + } + .ml-xl-5 { + margin-left: 1.5rem !important; + } + .mx-xl-5 { + margin-right: 1.5rem !important; + margin-left: 1.5rem !important; + } + .my-xl-5 { + margin-top: 1.5rem !important; + margin-bottom: 1.5rem !important; + } + .mxn-xl-5 { + margin-right: -1.5rem !important; + margin-left: -1.5rem !important; + } +} +@media (min-width: 87.5rem) { + .m-xl-6 { + margin: 2rem !important; + } + .mt-xl-6 { + margin-top: 2rem !important; + } + .mr-xl-6 { + margin-right: 2rem !important; + } + .mb-xl-6 { + margin-bottom: 2rem !important; + } + .ml-xl-6 { + margin-left: 2rem !important; + } + .mx-xl-6 { + margin-right: 2rem !important; + margin-left: 2rem !important; + } + .my-xl-6 { + margin-top: 2rem !important; + margin-bottom: 2rem !important; + } + .mxn-xl-6 { + margin-right: -2rem !important; + margin-left: -2rem !important; + } +} +@media (min-width: 87.5rem) { + .m-xl-7 { + margin: 2.5rem !important; + } + .mt-xl-7 { + margin-top: 2.5rem !important; + } + .mr-xl-7 { + margin-right: 2.5rem !important; + } + .mb-xl-7 { + margin-bottom: 2.5rem !important; + } + .ml-xl-7 { + margin-left: 2.5rem !important; + } + .mx-xl-7 { + margin-right: 2.5rem !important; + margin-left: 2.5rem !important; + } + .my-xl-7 { + margin-top: 2.5rem !important; + margin-bottom: 2.5rem !important; + } + .mxn-xl-7 { + margin-right: -2.5rem !important; + margin-left: -2.5rem !important; + } +} +@media (min-width: 87.5rem) { + .m-xl-8 { + margin: 3rem !important; + } + .mt-xl-8 { + margin-top: 3rem !important; + } + .mr-xl-8 { + margin-right: 3rem !important; + } + .mb-xl-8 { + margin-bottom: 3rem !important; + } + .ml-xl-8 { + margin-left: 3rem !important; + } + .mx-xl-8 { + margin-right: 3rem !important; + margin-left: 3rem !important; + } + .my-xl-8 { + margin-top: 3rem !important; + margin-bottom: 3rem !important; + } + .mxn-xl-8 { + margin-right: -3rem !important; + margin-left: -3rem !important; + } +} +@media (min-width: 87.5rem) { + .m-xl-9 { + margin: 3.5rem !important; + } + .mt-xl-9 { + margin-top: 3.5rem !important; + } + .mr-xl-9 { + margin-right: 3.5rem !important; + } + .mb-xl-9 { + margin-bottom: 3.5rem !important; + } + .ml-xl-9 { + margin-left: 3.5rem !important; + } + .mx-xl-9 { + margin-right: 3.5rem !important; + margin-left: 3.5rem !important; + } + .my-xl-9 { + margin-top: 3.5rem !important; + margin-bottom: 3.5rem !important; + } + .mxn-xl-9 { + margin-right: -3.5rem !important; + margin-left: -3.5rem !important; + } +} +@media (min-width: 87.5rem) { + .m-xl-10 { + margin: 4rem !important; + } + .mt-xl-10 { + margin-top: 4rem !important; + } + .mr-xl-10 { + margin-right: 4rem !important; + } + .mb-xl-10 { + margin-bottom: 4rem !important; + } + .ml-xl-10 { + margin-left: 4rem !important; + } + .mx-xl-10 { + margin-right: 4rem !important; + margin-left: 4rem !important; + } + .my-xl-10 { + margin-top: 4rem !important; + margin-bottom: 4rem !important; + } + .mxn-xl-10 { + margin-right: -4rem !important; + margin-left: -4rem !important; + } +} +.p-0 { + padding: 0 !important; +} + +.pt-0 { + padding-top: 0 !important; +} + +.pr-0 { + padding-right: 0 !important; +} + +.pb-0 { + padding-bottom: 0 !important; +} + +.pl-0 { + padding-left: 0 !important; +} + +.px-0 { + padding-right: 0 !important; + padding-left: 0 !important; +} + +.py-0 { + padding-top: 0 !important; + padding-bottom: 0 !important; +} + +.p-1 { + padding: 0.25rem !important; +} + +.pt-1 { + padding-top: 0.25rem !important; +} + +.pr-1 { + padding-right: 0.25rem !important; +} + +.pb-1 { + padding-bottom: 0.25rem !important; +} + +.pl-1 { + padding-left: 0.25rem !important; +} + +.px-1 { + padding-right: 0.25rem !important; + padding-left: 0.25rem !important; +} + +.py-1 { + padding-top: 0.25rem !important; + padding-bottom: 0.25rem !important; +} + +.p-2 { + padding: 0.5rem !important; +} + +.pt-2 { + padding-top: 0.5rem !important; +} + +.pr-2 { + padding-right: 0.5rem !important; +} + +.pb-2 { + padding-bottom: 0.5rem !important; +} + +.pl-2 { + padding-left: 0.5rem !important; +} + +.px-2 { + padding-right: 0.5rem !important; + padding-left: 0.5rem !important; +} + +.py-2 { + padding-top: 0.5rem !important; + padding-bottom: 0.5rem !important; +} + +.p-3 { + padding: 0.75rem !important; +} + +.pt-3 { + padding-top: 0.75rem !important; +} + +.pr-3 { + padding-right: 0.75rem !important; +} + +.pb-3 { + padding-bottom: 0.75rem !important; +} + +.pl-3 { + padding-left: 0.75rem !important; +} + +.px-3 { + padding-right: 0.75rem !important; + padding-left: 0.75rem !important; +} + +.py-3 { + padding-top: 0.75rem !important; + padding-bottom: 0.75rem !important; +} + +.p-4 { + padding: 1rem !important; +} + +.pt-4 { + padding-top: 1rem !important; +} + +.pr-4 { + padding-right: 1rem !important; +} + +.pb-4 { + padding-bottom: 1rem !important; +} + +.pl-4 { + padding-left: 1rem !important; +} + +.px-4 { + padding-right: 1rem !important; + padding-left: 1rem !important; +} + +.py-4 { + padding-top: 1rem !important; + padding-bottom: 1rem !important; +} + +.p-5 { + padding: 1.5rem !important; +} + +.pt-5 { + padding-top: 1.5rem !important; +} + +.pr-5 { + padding-right: 1.5rem !important; +} + +.pb-5 { + padding-bottom: 1.5rem !important; +} + +.pl-5 { + padding-left: 1.5rem !important; +} + +.px-5 { + padding-right: 1.5rem !important; + padding-left: 1.5rem !important; +} + +.py-5 { + padding-top: 1.5rem !important; + padding-bottom: 1.5rem !important; +} + +.p-6 { + padding: 2rem !important; +} + +.pt-6 { + padding-top: 2rem !important; +} + +.pr-6 { + padding-right: 2rem !important; +} + +.pb-6 { + padding-bottom: 2rem !important; +} + +.pl-6 { + padding-left: 2rem !important; +} + +.px-6 { + padding-right: 2rem !important; + padding-left: 2rem !important; +} + +.py-6 { + padding-top: 2rem !important; + padding-bottom: 2rem !important; +} + +.p-7 { + padding: 2.5rem !important; +} + +.pt-7 { + padding-top: 2.5rem !important; +} + +.pr-7 { + padding-right: 2.5rem !important; +} + +.pb-7 { + padding-bottom: 2.5rem !important; +} + +.pl-7 { + padding-left: 2.5rem !important; +} + +.px-7 { + padding-right: 2.5rem !important; + padding-left: 2.5rem !important; +} + +.py-7 { + padding-top: 2.5rem !important; + padding-bottom: 2.5rem !important; +} + +.p-8 { + padding: 3rem !important; +} + +.pt-8 { + padding-top: 3rem !important; +} + +.pr-8 { + padding-right: 3rem !important; +} + +.pb-8 { + padding-bottom: 3rem !important; +} + +.pl-8 { + padding-left: 3rem !important; +} + +.px-8 { + padding-right: 3rem !important; + padding-left: 3rem !important; +} + +.py-8 { + padding-top: 3rem !important; + padding-bottom: 3rem !important; +} + +.p-9 { + padding: 3.5rem !important; +} + +.pt-9 { + padding-top: 3.5rem !important; +} + +.pr-9 { + padding-right: 3.5rem !important; +} + +.pb-9 { + padding-bottom: 3.5rem !important; +} + +.pl-9 { + padding-left: 3.5rem !important; +} + +.px-9 { + padding-right: 3.5rem !important; + padding-left: 3.5rem !important; +} + +.py-9 { + padding-top: 3.5rem !important; + padding-bottom: 3.5rem !important; +} + +.p-10 { + padding: 4rem !important; +} + +.pt-10 { + padding-top: 4rem !important; +} + +.pr-10 { + padding-right: 4rem !important; +} + +.pb-10 { + padding-bottom: 4rem !important; +} + +.pl-10 { + padding-left: 4rem !important; +} + +.px-10 { + padding-right: 4rem !important; + padding-left: 4rem !important; +} + +.py-10 { + padding-top: 4rem !important; + padding-bottom: 4rem !important; +} + +@media (min-width: 20rem) { + .p-xs-0 { + padding: 0 !important; + } + .pt-xs-0 { + padding-top: 0 !important; + } + .pr-xs-0 { + padding-right: 0 !important; + } + .pb-xs-0 { + padding-bottom: 0 !important; + } + .pl-xs-0 { + padding-left: 0 !important; + } + .px-xs-0 { + padding-right: 0 !important; + padding-left: 0 !important; + } + .py-xs-0 { + padding-top: 0 !important; + padding-bottom: 0 !important; + } + .p-xs-1 { + padding: 0.25rem !important; + } + .pt-xs-1 { + padding-top: 0.25rem !important; + } + .pr-xs-1 { + padding-right: 0.25rem !important; + } + .pb-xs-1 { + padding-bottom: 0.25rem !important; + } + .pl-xs-1 { + padding-left: 0.25rem !important; + } + .px-xs-1 { + padding-right: 0.25rem !important; + padding-left: 0.25rem !important; + } + .py-xs-1 { + padding-top: 0.25rem !important; + padding-bottom: 0.25rem !important; + } + .p-xs-2 { + padding: 0.5rem !important; + } + .pt-xs-2 { + padding-top: 0.5rem !important; + } + .pr-xs-2 { + padding-right: 0.5rem !important; + } + .pb-xs-2 { + padding-bottom: 0.5rem !important; + } + .pl-xs-2 { + padding-left: 0.5rem !important; + } + .px-xs-2 { + padding-right: 0.5rem !important; + padding-left: 0.5rem !important; + } + .py-xs-2 { + padding-top: 0.5rem !important; + padding-bottom: 0.5rem !important; + } + .p-xs-3 { + padding: 0.75rem !important; + } + .pt-xs-3 { + padding-top: 0.75rem !important; + } + .pr-xs-3 { + padding-right: 0.75rem !important; + } + .pb-xs-3 { + padding-bottom: 0.75rem !important; + } + .pl-xs-3 { + padding-left: 0.75rem !important; + } + .px-xs-3 { + padding-right: 0.75rem !important; + padding-left: 0.75rem !important; + } + .py-xs-3 { + padding-top: 0.75rem !important; + padding-bottom: 0.75rem !important; + } + .p-xs-4 { + padding: 1rem !important; + } + .pt-xs-4 { + padding-top: 1rem !important; + } + .pr-xs-4 { + padding-right: 1rem !important; + } + .pb-xs-4 { + padding-bottom: 1rem !important; + } + .pl-xs-4 { + padding-left: 1rem !important; + } + .px-xs-4 { + padding-right: 1rem !important; + padding-left: 1rem !important; + } + .py-xs-4 { + padding-top: 1rem !important; + padding-bottom: 1rem !important; + } + .p-xs-5 { + padding: 1.5rem !important; + } + .pt-xs-5 { + padding-top: 1.5rem !important; + } + .pr-xs-5 { + padding-right: 1.5rem !important; + } + .pb-xs-5 { + padding-bottom: 1.5rem !important; + } + .pl-xs-5 { + padding-left: 1.5rem !important; + } + .px-xs-5 { + padding-right: 1.5rem !important; + padding-left: 1.5rem !important; + } + .py-xs-5 { + padding-top: 1.5rem !important; + padding-bottom: 1.5rem !important; + } + .p-xs-6 { + padding: 2rem !important; + } + .pt-xs-6 { + padding-top: 2rem !important; + } + .pr-xs-6 { + padding-right: 2rem !important; + } + .pb-xs-6 { + padding-bottom: 2rem !important; + } + .pl-xs-6 { + padding-left: 2rem !important; + } + .px-xs-6 { + padding-right: 2rem !important; + padding-left: 2rem !important; + } + .py-xs-6 { + padding-top: 2rem !important; + padding-bottom: 2rem !important; + } + .p-xs-7 { + padding: 2.5rem !important; + } + .pt-xs-7 { + padding-top: 2.5rem !important; + } + .pr-xs-7 { + padding-right: 2.5rem !important; + } + .pb-xs-7 { + padding-bottom: 2.5rem !important; + } + .pl-xs-7 { + padding-left: 2.5rem !important; + } + .px-xs-7 { + padding-right: 2.5rem !important; + padding-left: 2.5rem !important; + } + .py-xs-7 { + padding-top: 2.5rem !important; + padding-bottom: 2.5rem !important; + } + .p-xs-8 { + padding: 3rem !important; + } + .pt-xs-8 { + padding-top: 3rem !important; + } + .pr-xs-8 { + padding-right: 3rem !important; + } + .pb-xs-8 { + padding-bottom: 3rem !important; + } + .pl-xs-8 { + padding-left: 3rem !important; + } + .px-xs-8 { + padding-right: 3rem !important; + padding-left: 3rem !important; + } + .py-xs-8 { + padding-top: 3rem !important; + padding-bottom: 3rem !important; + } + .p-xs-9 { + padding: 3.5rem !important; + } + .pt-xs-9 { + padding-top: 3.5rem !important; + } + .pr-xs-9 { + padding-right: 3.5rem !important; + } + .pb-xs-9 { + padding-bottom: 3.5rem !important; + } + .pl-xs-9 { + padding-left: 3.5rem !important; + } + .px-xs-9 { + padding-right: 3.5rem !important; + padding-left: 3.5rem !important; + } + .py-xs-9 { + padding-top: 3.5rem !important; + padding-bottom: 3.5rem !important; + } + .p-xs-10 { + padding: 4rem !important; + } + .pt-xs-10 { + padding-top: 4rem !important; + } + .pr-xs-10 { + padding-right: 4rem !important; + } + .pb-xs-10 { + padding-bottom: 4rem !important; + } + .pl-xs-10 { + padding-left: 4rem !important; + } + .px-xs-10 { + padding-right: 4rem !important; + padding-left: 4rem !important; + } + .py-xs-10 { + padding-top: 4rem !important; + padding-bottom: 4rem !important; + } +} +@media (min-width: 31.25rem) { + .p-sm-0 { + padding: 0 !important; + } + .pt-sm-0 { + padding-top: 0 !important; + } + .pr-sm-0 { + padding-right: 0 !important; + } + .pb-sm-0 { + padding-bottom: 0 !important; + } + .pl-sm-0 { + padding-left: 0 !important; + } + .px-sm-0 { + padding-right: 0 !important; + padding-left: 0 !important; + } + .py-sm-0 { + padding-top: 0 !important; + padding-bottom: 0 !important; + } + .p-sm-1 { + padding: 0.25rem !important; + } + .pt-sm-1 { + padding-top: 0.25rem !important; + } + .pr-sm-1 { + padding-right: 0.25rem !important; + } + .pb-sm-1 { + padding-bottom: 0.25rem !important; + } + .pl-sm-1 { + padding-left: 0.25rem !important; + } + .px-sm-1 { + padding-right: 0.25rem !important; + padding-left: 0.25rem !important; + } + .py-sm-1 { + padding-top: 0.25rem !important; + padding-bottom: 0.25rem !important; + } + .p-sm-2 { + padding: 0.5rem !important; + } + .pt-sm-2 { + padding-top: 0.5rem !important; + } + .pr-sm-2 { + padding-right: 0.5rem !important; + } + .pb-sm-2 { + padding-bottom: 0.5rem !important; + } + .pl-sm-2 { + padding-left: 0.5rem !important; + } + .px-sm-2 { + padding-right: 0.5rem !important; + padding-left: 0.5rem !important; + } + .py-sm-2 { + padding-top: 0.5rem !important; + padding-bottom: 0.5rem !important; + } + .p-sm-3 { + padding: 0.75rem !important; + } + .pt-sm-3 { + padding-top: 0.75rem !important; + } + .pr-sm-3 { + padding-right: 0.75rem !important; + } + .pb-sm-3 { + padding-bottom: 0.75rem !important; + } + .pl-sm-3 { + padding-left: 0.75rem !important; + } + .px-sm-3 { + padding-right: 0.75rem !important; + padding-left: 0.75rem !important; + } + .py-sm-3 { + padding-top: 0.75rem !important; + padding-bottom: 0.75rem !important; + } + .p-sm-4 { + padding: 1rem !important; + } + .pt-sm-4 { + padding-top: 1rem !important; + } + .pr-sm-4 { + padding-right: 1rem !important; + } + .pb-sm-4 { + padding-bottom: 1rem !important; + } + .pl-sm-4 { + padding-left: 1rem !important; + } + .px-sm-4 { + padding-right: 1rem !important; + padding-left: 1rem !important; + } + .py-sm-4 { + padding-top: 1rem !important; + padding-bottom: 1rem !important; + } + .p-sm-5 { + padding: 1.5rem !important; + } + .pt-sm-5 { + padding-top: 1.5rem !important; + } + .pr-sm-5 { + padding-right: 1.5rem !important; + } + .pb-sm-5 { + padding-bottom: 1.5rem !important; + } + .pl-sm-5 { + padding-left: 1.5rem !important; + } + .px-sm-5 { + padding-right: 1.5rem !important; + padding-left: 1.5rem !important; + } + .py-sm-5 { + padding-top: 1.5rem !important; + padding-bottom: 1.5rem !important; + } + .p-sm-6 { + padding: 2rem !important; + } + .pt-sm-6 { + padding-top: 2rem !important; + } + .pr-sm-6 { + padding-right: 2rem !important; + } + .pb-sm-6 { + padding-bottom: 2rem !important; + } + .pl-sm-6 { + padding-left: 2rem !important; + } + .px-sm-6 { + padding-right: 2rem !important; + padding-left: 2rem !important; + } + .py-sm-6 { + padding-top: 2rem !important; + padding-bottom: 2rem !important; + } + .p-sm-7 { + padding: 2.5rem !important; + } + .pt-sm-7 { + padding-top: 2.5rem !important; + } + .pr-sm-7 { + padding-right: 2.5rem !important; + } + .pb-sm-7 { + padding-bottom: 2.5rem !important; + } + .pl-sm-7 { + padding-left: 2.5rem !important; + } + .px-sm-7 { + padding-right: 2.5rem !important; + padding-left: 2.5rem !important; + } + .py-sm-7 { + padding-top: 2.5rem !important; + padding-bottom: 2.5rem !important; + } + .p-sm-8 { + padding: 3rem !important; + } + .pt-sm-8 { + padding-top: 3rem !important; + } + .pr-sm-8 { + padding-right: 3rem !important; + } + .pb-sm-8 { + padding-bottom: 3rem !important; + } + .pl-sm-8 { + padding-left: 3rem !important; + } + .px-sm-8 { + padding-right: 3rem !important; + padding-left: 3rem !important; + } + .py-sm-8 { + padding-top: 3rem !important; + padding-bottom: 3rem !important; + } + .p-sm-9 { + padding: 3.5rem !important; + } + .pt-sm-9 { + padding-top: 3.5rem !important; + } + .pr-sm-9 { + padding-right: 3.5rem !important; + } + .pb-sm-9 { + padding-bottom: 3.5rem !important; + } + .pl-sm-9 { + padding-left: 3.5rem !important; + } + .px-sm-9 { + padding-right: 3.5rem !important; + padding-left: 3.5rem !important; + } + .py-sm-9 { + padding-top: 3.5rem !important; + padding-bottom: 3.5rem !important; + } + .p-sm-10 { + padding: 4rem !important; + } + .pt-sm-10 { + padding-top: 4rem !important; + } + .pr-sm-10 { + padding-right: 4rem !important; + } + .pb-sm-10 { + padding-bottom: 4rem !important; + } + .pl-sm-10 { + padding-left: 4rem !important; + } + .px-sm-10 { + padding-right: 4rem !important; + padding-left: 4rem !important; + } + .py-sm-10 { + padding-top: 4rem !important; + padding-bottom: 4rem !important; + } +} +@media (min-width: 50rem) { + .p-md-0 { + padding: 0 !important; + } + .pt-md-0 { + padding-top: 0 !important; + } + .pr-md-0 { + padding-right: 0 !important; + } + .pb-md-0 { + padding-bottom: 0 !important; + } + .pl-md-0 { + padding-left: 0 !important; + } + .px-md-0 { + padding-right: 0 !important; + padding-left: 0 !important; + } + .py-md-0 { + padding-top: 0 !important; + padding-bottom: 0 !important; + } + .p-md-1 { + padding: 0.25rem !important; + } + .pt-md-1 { + padding-top: 0.25rem !important; + } + .pr-md-1 { + padding-right: 0.25rem !important; + } + .pb-md-1 { + padding-bottom: 0.25rem !important; + } + .pl-md-1 { + padding-left: 0.25rem !important; + } + .px-md-1 { + padding-right: 0.25rem !important; + padding-left: 0.25rem !important; + } + .py-md-1 { + padding-top: 0.25rem !important; + padding-bottom: 0.25rem !important; + } + .p-md-2 { + padding: 0.5rem !important; + } + .pt-md-2 { + padding-top: 0.5rem !important; + } + .pr-md-2 { + padding-right: 0.5rem !important; + } + .pb-md-2 { + padding-bottom: 0.5rem !important; + } + .pl-md-2 { + padding-left: 0.5rem !important; + } + .px-md-2 { + padding-right: 0.5rem !important; + padding-left: 0.5rem !important; + } + .py-md-2 { + padding-top: 0.5rem !important; + padding-bottom: 0.5rem !important; + } + .p-md-3 { + padding: 0.75rem !important; + } + .pt-md-3 { + padding-top: 0.75rem !important; + } + .pr-md-3 { + padding-right: 0.75rem !important; + } + .pb-md-3 { + padding-bottom: 0.75rem !important; + } + .pl-md-3 { + padding-left: 0.75rem !important; + } + .px-md-3 { + padding-right: 0.75rem !important; + padding-left: 0.75rem !important; + } + .py-md-3 { + padding-top: 0.75rem !important; + padding-bottom: 0.75rem !important; + } + .p-md-4 { + padding: 1rem !important; + } + .pt-md-4 { + padding-top: 1rem !important; + } + .pr-md-4 { + padding-right: 1rem !important; + } + .pb-md-4 { + padding-bottom: 1rem !important; + } + .pl-md-4 { + padding-left: 1rem !important; + } + .px-md-4 { + padding-right: 1rem !important; + padding-left: 1rem !important; + } + .py-md-4 { + padding-top: 1rem !important; + padding-bottom: 1rem !important; + } + .p-md-5 { + padding: 1.5rem !important; + } + .pt-md-5 { + padding-top: 1.5rem !important; + } + .pr-md-5 { + padding-right: 1.5rem !important; + } + .pb-md-5 { + padding-bottom: 1.5rem !important; + } + .pl-md-5 { + padding-left: 1.5rem !important; + } + .px-md-5 { + padding-right: 1.5rem !important; + padding-left: 1.5rem !important; + } + .py-md-5 { + padding-top: 1.5rem !important; + padding-bottom: 1.5rem !important; + } + .p-md-6 { + padding: 2rem !important; + } + .pt-md-6 { + padding-top: 2rem !important; + } + .pr-md-6 { + padding-right: 2rem !important; + } + .pb-md-6 { + padding-bottom: 2rem !important; + } + .pl-md-6 { + padding-left: 2rem !important; + } + .px-md-6 { + padding-right: 2rem !important; + padding-left: 2rem !important; + } + .py-md-6 { + padding-top: 2rem !important; + padding-bottom: 2rem !important; + } + .p-md-7 { + padding: 2.5rem !important; + } + .pt-md-7 { + padding-top: 2.5rem !important; + } + .pr-md-7 { + padding-right: 2.5rem !important; + } + .pb-md-7 { + padding-bottom: 2.5rem !important; + } + .pl-md-7 { + padding-left: 2.5rem !important; + } + .px-md-7 { + padding-right: 2.5rem !important; + padding-left: 2.5rem !important; + } + .py-md-7 { + padding-top: 2.5rem !important; + padding-bottom: 2.5rem !important; + } + .p-md-8 { + padding: 3rem !important; + } + .pt-md-8 { + padding-top: 3rem !important; + } + .pr-md-8 { + padding-right: 3rem !important; + } + .pb-md-8 { + padding-bottom: 3rem !important; + } + .pl-md-8 { + padding-left: 3rem !important; + } + .px-md-8 { + padding-right: 3rem !important; + padding-left: 3rem !important; + } + .py-md-8 { + padding-top: 3rem !important; + padding-bottom: 3rem !important; + } + .p-md-9 { + padding: 3.5rem !important; + } + .pt-md-9 { + padding-top: 3.5rem !important; + } + .pr-md-9 { + padding-right: 3.5rem !important; + } + .pb-md-9 { + padding-bottom: 3.5rem !important; + } + .pl-md-9 { + padding-left: 3.5rem !important; + } + .px-md-9 { + padding-right: 3.5rem !important; + padding-left: 3.5rem !important; + } + .py-md-9 { + padding-top: 3.5rem !important; + padding-bottom: 3.5rem !important; + } + .p-md-10 { + padding: 4rem !important; + } + .pt-md-10 { + padding-top: 4rem !important; + } + .pr-md-10 { + padding-right: 4rem !important; + } + .pb-md-10 { + padding-bottom: 4rem !important; + } + .pl-md-10 { + padding-left: 4rem !important; + } + .px-md-10 { + padding-right: 4rem !important; + padding-left: 4rem !important; + } + .py-md-10 { + padding-top: 4rem !important; + padding-bottom: 4rem !important; + } +} +@media (min-width: 66.5rem) { + .p-lg-0 { + padding: 0 !important; + } + .pt-lg-0 { + padding-top: 0 !important; + } + .pr-lg-0 { + padding-right: 0 !important; + } + .pb-lg-0 { + padding-bottom: 0 !important; + } + .pl-lg-0 { + padding-left: 0 !important; + } + .px-lg-0 { + padding-right: 0 !important; + padding-left: 0 !important; + } + .py-lg-0 { + padding-top: 0 !important; + padding-bottom: 0 !important; + } + .p-lg-1 { + padding: 0.25rem !important; + } + .pt-lg-1 { + padding-top: 0.25rem !important; + } + .pr-lg-1 { + padding-right: 0.25rem !important; + } + .pb-lg-1 { + padding-bottom: 0.25rem !important; + } + .pl-lg-1 { + padding-left: 0.25rem !important; + } + .px-lg-1 { + padding-right: 0.25rem !important; + padding-left: 0.25rem !important; + } + .py-lg-1 { + padding-top: 0.25rem !important; + padding-bottom: 0.25rem !important; + } + .p-lg-2 { + padding: 0.5rem !important; + } + .pt-lg-2 { + padding-top: 0.5rem !important; + } + .pr-lg-2 { + padding-right: 0.5rem !important; + } + .pb-lg-2 { + padding-bottom: 0.5rem !important; + } + .pl-lg-2 { + padding-left: 0.5rem !important; + } + .px-lg-2 { + padding-right: 0.5rem !important; + padding-left: 0.5rem !important; + } + .py-lg-2 { + padding-top: 0.5rem !important; + padding-bottom: 0.5rem !important; + } + .p-lg-3 { + padding: 0.75rem !important; + } + .pt-lg-3 { + padding-top: 0.75rem !important; + } + .pr-lg-3 { + padding-right: 0.75rem !important; + } + .pb-lg-3 { + padding-bottom: 0.75rem !important; + } + .pl-lg-3 { + padding-left: 0.75rem !important; + } + .px-lg-3 { + padding-right: 0.75rem !important; + padding-left: 0.75rem !important; + } + .py-lg-3 { + padding-top: 0.75rem !important; + padding-bottom: 0.75rem !important; + } + .p-lg-4 { + padding: 1rem !important; + } + .pt-lg-4 { + padding-top: 1rem !important; + } + .pr-lg-4 { + padding-right: 1rem !important; + } + .pb-lg-4 { + padding-bottom: 1rem !important; + } + .pl-lg-4 { + padding-left: 1rem !important; + } + .px-lg-4 { + padding-right: 1rem !important; + padding-left: 1rem !important; + } + .py-lg-4 { + padding-top: 1rem !important; + padding-bottom: 1rem !important; + } + .p-lg-5 { + padding: 1.5rem !important; + } + .pt-lg-5 { + padding-top: 1.5rem !important; + } + .pr-lg-5 { + padding-right: 1.5rem !important; + } + .pb-lg-5 { + padding-bottom: 1.5rem !important; + } + .pl-lg-5 { + padding-left: 1.5rem !important; + } + .px-lg-5 { + padding-right: 1.5rem !important; + padding-left: 1.5rem !important; + } + .py-lg-5 { + padding-top: 1.5rem !important; + padding-bottom: 1.5rem !important; + } + .p-lg-6 { + padding: 2rem !important; + } + .pt-lg-6 { + padding-top: 2rem !important; + } + .pr-lg-6 { + padding-right: 2rem !important; + } + .pb-lg-6 { + padding-bottom: 2rem !important; + } + .pl-lg-6 { + padding-left: 2rem !important; + } + .px-lg-6 { + padding-right: 2rem !important; + padding-left: 2rem !important; + } + .py-lg-6 { + padding-top: 2rem !important; + padding-bottom: 2rem !important; + } + .p-lg-7 { + padding: 2.5rem !important; + } + .pt-lg-7 { + padding-top: 2.5rem !important; + } + .pr-lg-7 { + padding-right: 2.5rem !important; + } + .pb-lg-7 { + padding-bottom: 2.5rem !important; + } + .pl-lg-7 { + padding-left: 2.5rem !important; + } + .px-lg-7 { + padding-right: 2.5rem !important; + padding-left: 2.5rem !important; + } + .py-lg-7 { + padding-top: 2.5rem !important; + padding-bottom: 2.5rem !important; + } + .p-lg-8 { + padding: 3rem !important; + } + .pt-lg-8 { + padding-top: 3rem !important; + } + .pr-lg-8 { + padding-right: 3rem !important; + } + .pb-lg-8 { + padding-bottom: 3rem !important; + } + .pl-lg-8 { + padding-left: 3rem !important; + } + .px-lg-8 { + padding-right: 3rem !important; + padding-left: 3rem !important; + } + .py-lg-8 { + padding-top: 3rem !important; + padding-bottom: 3rem !important; + } + .p-lg-9 { + padding: 3.5rem !important; + } + .pt-lg-9 { + padding-top: 3.5rem !important; + } + .pr-lg-9 { + padding-right: 3.5rem !important; + } + .pb-lg-9 { + padding-bottom: 3.5rem !important; + } + .pl-lg-9 { + padding-left: 3.5rem !important; + } + .px-lg-9 { + padding-right: 3.5rem !important; + padding-left: 3.5rem !important; + } + .py-lg-9 { + padding-top: 3.5rem !important; + padding-bottom: 3.5rem !important; + } + .p-lg-10 { + padding: 4rem !important; + } + .pt-lg-10 { + padding-top: 4rem !important; + } + .pr-lg-10 { + padding-right: 4rem !important; + } + .pb-lg-10 { + padding-bottom: 4rem !important; + } + .pl-lg-10 { + padding-left: 4rem !important; + } + .px-lg-10 { + padding-right: 4rem !important; + padding-left: 4rem !important; + } + .py-lg-10 { + padding-top: 4rem !important; + padding-bottom: 4rem !important; + } +} +@media (min-width: 87.5rem) { + .p-xl-0 { + padding: 0 !important; + } + .pt-xl-0 { + padding-top: 0 !important; + } + .pr-xl-0 { + padding-right: 0 !important; + } + .pb-xl-0 { + padding-bottom: 0 !important; + } + .pl-xl-0 { + padding-left: 0 !important; + } + .px-xl-0 { + padding-right: 0 !important; + padding-left: 0 !important; + } + .py-xl-0 { + padding-top: 0 !important; + padding-bottom: 0 !important; + } + .p-xl-1 { + padding: 0.25rem !important; + } + .pt-xl-1 { + padding-top: 0.25rem !important; + } + .pr-xl-1 { + padding-right: 0.25rem !important; + } + .pb-xl-1 { + padding-bottom: 0.25rem !important; + } + .pl-xl-1 { + padding-left: 0.25rem !important; + } + .px-xl-1 { + padding-right: 0.25rem !important; + padding-left: 0.25rem !important; + } + .py-xl-1 { + padding-top: 0.25rem !important; + padding-bottom: 0.25rem !important; + } + .p-xl-2 { + padding: 0.5rem !important; + } + .pt-xl-2 { + padding-top: 0.5rem !important; + } + .pr-xl-2 { + padding-right: 0.5rem !important; + } + .pb-xl-2 { + padding-bottom: 0.5rem !important; + } + .pl-xl-2 { + padding-left: 0.5rem !important; + } + .px-xl-2 { + padding-right: 0.5rem !important; + padding-left: 0.5rem !important; + } + .py-xl-2 { + padding-top: 0.5rem !important; + padding-bottom: 0.5rem !important; + } + .p-xl-3 { + padding: 0.75rem !important; + } + .pt-xl-3 { + padding-top: 0.75rem !important; + } + .pr-xl-3 { + padding-right: 0.75rem !important; + } + .pb-xl-3 { + padding-bottom: 0.75rem !important; + } + .pl-xl-3 { + padding-left: 0.75rem !important; + } + .px-xl-3 { + padding-right: 0.75rem !important; + padding-left: 0.75rem !important; + } + .py-xl-3 { + padding-top: 0.75rem !important; + padding-bottom: 0.75rem !important; + } + .p-xl-4 { + padding: 1rem !important; + } + .pt-xl-4 { + padding-top: 1rem !important; + } + .pr-xl-4 { + padding-right: 1rem !important; + } + .pb-xl-4 { + padding-bottom: 1rem !important; + } + .pl-xl-4 { + padding-left: 1rem !important; + } + .px-xl-4 { + padding-right: 1rem !important; + padding-left: 1rem !important; + } + .py-xl-4 { + padding-top: 1rem !important; + padding-bottom: 1rem !important; + } + .p-xl-5 { + padding: 1.5rem !important; + } + .pt-xl-5 { + padding-top: 1.5rem !important; + } + .pr-xl-5 { + padding-right: 1.5rem !important; + } + .pb-xl-5 { + padding-bottom: 1.5rem !important; + } + .pl-xl-5 { + padding-left: 1.5rem !important; + } + .px-xl-5 { + padding-right: 1.5rem !important; + padding-left: 1.5rem !important; + } + .py-xl-5 { + padding-top: 1.5rem !important; + padding-bottom: 1.5rem !important; + } + .p-xl-6 { + padding: 2rem !important; + } + .pt-xl-6 { + padding-top: 2rem !important; + } + .pr-xl-6 { + padding-right: 2rem !important; + } + .pb-xl-6 { + padding-bottom: 2rem !important; + } + .pl-xl-6 { + padding-left: 2rem !important; + } + .px-xl-6 { + padding-right: 2rem !important; + padding-left: 2rem !important; + } + .py-xl-6 { + padding-top: 2rem !important; + padding-bottom: 2rem !important; + } + .p-xl-7 { + padding: 2.5rem !important; + } + .pt-xl-7 { + padding-top: 2.5rem !important; + } + .pr-xl-7 { + padding-right: 2.5rem !important; + } + .pb-xl-7 { + padding-bottom: 2.5rem !important; + } + .pl-xl-7 { + padding-left: 2.5rem !important; + } + .px-xl-7 { + padding-right: 2.5rem !important; + padding-left: 2.5rem !important; + } + .py-xl-7 { + padding-top: 2.5rem !important; + padding-bottom: 2.5rem !important; + } + .p-xl-8 { + padding: 3rem !important; + } + .pt-xl-8 { + padding-top: 3rem !important; + } + .pr-xl-8 { + padding-right: 3rem !important; + } + .pb-xl-8 { + padding-bottom: 3rem !important; + } + .pl-xl-8 { + padding-left: 3rem !important; + } + .px-xl-8 { + padding-right: 3rem !important; + padding-left: 3rem !important; + } + .py-xl-8 { + padding-top: 3rem !important; + padding-bottom: 3rem !important; + } + .p-xl-9 { + padding: 3.5rem !important; + } + .pt-xl-9 { + padding-top: 3.5rem !important; + } + .pr-xl-9 { + padding-right: 3.5rem !important; + } + .pb-xl-9 { + padding-bottom: 3.5rem !important; + } + .pl-xl-9 { + padding-left: 3.5rem !important; + } + .px-xl-9 { + padding-right: 3.5rem !important; + padding-left: 3.5rem !important; + } + .py-xl-9 { + padding-top: 3.5rem !important; + padding-bottom: 3.5rem !important; + } + .p-xl-10 { + padding: 4rem !important; + } + .pt-xl-10 { + padding-top: 4rem !important; + } + .pr-xl-10 { + padding-right: 4rem !important; + } + .pb-xl-10 { + padding-bottom: 4rem !important; + } + .pl-xl-10 { + padding-left: 4rem !important; + } + .px-xl-10 { + padding-right: 4rem !important; + padding-left: 4rem !important; + } + .py-xl-10 { + padding-top: 4rem !important; + padding-bottom: 4rem !important; + } +} +@media print { + .site-footer, + .site-button, + #edit-this-page, + #back-to-top, + .site-nav, + .main-header { + display: none !important; + } + .side-bar { + width: 100%; + height: auto; + border-right: 0 !important; + } + .site-header { + border-bottom: 1px solid #44434d; + } + .site-title { + font-size: 1rem !important; + font-weight: 700 !important; + } + .text-small { + font-size: 8pt !important; + } + pre.highlight { + border: 1px solid #44434d; + } + .main { + max-width: none; + margin-left: 0; + } +} +a.skip-to-main { + left: -999px; + position: absolute; + top: auto; + width: 1px; + height: 1px; + overflow: hidden; + z-index: -999; +} + +a.skip-to-main:focus, +a.skip-to-main:active { + color: #2c84fa; + background-color: #27262b; + left: auto; + top: auto; + width: 30%; + height: auto; + overflow: auto; + margin: 10px 35%; + padding: 5px; + border-radius: 15px; + border: 4px solid #264caf; + text-align: center; + font-size: 1.2em; + z-index: 999; +} + +div.opaque { + background-color: #27262b; +} + +/*# sourceMappingURL=just-the-docs-dark.css.map */ \ No newline at end of file diff --git a/docs/_site/assets/css/just-the-docs-dark.css.map b/docs/_site/assets/css/just-the-docs-dark.css.map new file mode 100644 index 00000000..2d356fab --- /dev/null +++ b/docs/_site/assets/css/just-the-docs-dark.css.map @@ -0,0 +1 @@ +{"version":3,"sourceRoot":"","sources":["../../../../../../../../../C:/Users/peteb/.local/share/gem/ruby/3.2.0/gems/just-the-docs-0.7.0/_sass/vendor/OneLightJekyll/syntax.scss","../../../../../../../../../C:/Users/peteb/.local/share/gem/ruby/3.2.0/gems/just-the-docs-0.7.0/_sass/vendor/OneDarkJekyll/syntax.scss","../../../../../../../../../C:/Users/peteb/.local/share/gem/ruby/3.2.0/gems/just-the-docs-0.7.0/_sass/vendor/normalize.scss/normalize.scss","../../../../../../../../../C:/Users/peteb/.local/share/gem/ruby/3.2.0/gems/just-the-docs-0.7.0/_sass/base.scss","../../../../../../../../../C:/Users/peteb/.local/share/gem/ruby/3.2.0/gems/just-the-docs-0.7.0/_sass/color_schemes/dark.scss","../../../../../../../../../C:/Users/peteb/.local/share/gem/ruby/3.2.0/gems/just-the-docs-0.7.0/_sass/support/mixins/_typography.scss","../../../../../../../../../C:/Users/peteb/.local/share/gem/ruby/3.2.0/gems/just-the-docs-0.7.0/_sass/support/mixins/_layout.scss","../../../../../../../../../C:/Users/peteb/.local/share/gem/ruby/3.2.0/gems/just-the-docs-0.7.0/_sass/support/_variables.scss","../../../../../../../../../C:/Users/peteb/.local/share/gem/ruby/3.2.0/gems/just-the-docs-0.7.0/_sass/layout.scss","../../../../../../../../../C:/Users/peteb/.local/share/gem/ruby/3.2.0/gems/just-the-docs-0.7.0/_sass/content.scss","../../../../../../../../../C:/Users/peteb/.local/share/gem/ruby/3.2.0/gems/just-the-docs-0.7.0/_sass/navigation.scss","../../../../../../../../../C:/Users/peteb/.local/share/gem/ruby/3.2.0/gems/just-the-docs-0.7.0/_sass/typography.scss","../../../../../../../../../C:/Users/peteb/.local/share/gem/ruby/3.2.0/gems/just-the-docs-0.7.0/_sass/labels.scss","../../../../../../../../../C:/Users/peteb/.local/share/gem/ruby/3.2.0/gems/just-the-docs-0.7.0/_sass/buttons.scss","../../../../../../../../../C:/Users/peteb/.local/share/gem/ruby/3.2.0/gems/just-the-docs-0.7.0/_sass/support/mixins/_buttons.scss","../../../../../../../../../C:/Users/peteb/.local/share/gem/ruby/3.2.0/gems/just-the-docs-0.7.0/_sass/search.scss","../../../../../../../../../C:/Users/peteb/.local/share/gem/ruby/3.2.0/gems/just-the-docs-0.7.0/_sass/tables.scss","../../../../../../../../../C:/Users/peteb/.local/share/gem/ruby/3.2.0/gems/just-the-docs-0.7.0/_sass/code.scss","../../../../../../../../../C:/Users/peteb/.local/share/gem/ruby/3.2.0/gems/just-the-docs-0.7.0/_sass/utilities/_colors.scss","../../../../../../../../../C:/Users/peteb/.local/share/gem/ruby/3.2.0/gems/just-the-docs-0.7.0/_sass/utilities/_layout.scss","../../../../../../../../../C:/Users/peteb/.local/share/gem/ruby/3.2.0/gems/just-the-docs-0.7.0/_sass/utilities/_typography.scss","../../../../../../../../../C:/Users/peteb/.local/share/gem/ruby/3.2.0/gems/just-the-docs-0.7.0/_sass/utilities/_lists.scss","../../../../../../../../../C:/Users/peteb/.local/share/gem/ruby/3.2.0/gems/just-the-docs-0.7.0/_sass/utilities/_spacing.scss","../../../../../../../../../C:/Users/peteb/.local/share/gem/ruby/3.2.0/gems/just-the-docs-0.7.0/_sass/print.scss","../../../../../../../../../C:/Users/peteb/.local/share/gem/ruby/3.2.0/gems/just-the-docs-0.7.0/_sass/skiptomain.scss","just-the-docs-dark.scss"],"names":[],"mappings":";AAEA;AAAA;EAEE;EACA;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;EACA;;;AAEF;EACE;EACA;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;EACA;;;AAEF;EACE;EACA;;;AAEF;EACE;EACA;;;AAEF;EACE;EACA;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AC5MF;AAAA;EAEE;EACA;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;EACA;;;AAEF;EACE;EACA;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;EACA;;;AAEF;EACE;EACA;;;AAEF;EACE;EACA;;;AAEF;EACE;EACA;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;ACxMF;AAEA;AAAA;AAGA;AAAA;AAAA;AAAA;AAKA;EACE;EACA;;;AAGF;AAAA;AAGA;AAAA;AAAA;AAIA;EACE;;;AAGF;AAAA;AAAA;AAIA;EACE;;;AAGF;AAAA;AAAA;AAAA;AAKA;EACE;EACA;;;AAGF;AAAA;AAGA;AAAA;AAAA;AAAA;AAKA;EACE;EACA;EACA;;;AAGF;AAAA;AAAA;AAAA;AAKA;EACE;EACA;;;AAGF;AAAA;AAGA;AAAA;AAAA;AAIA;EACE;;;AAGF;AAAA;AAAA;AAAA;AAKA;EACE;EACA;EACA;;;AAGF;AAAA;AAAA;AAIA;AAAA;EAEE;;;AAGF;AAAA;AAAA;AAAA;AAKA;AAAA;AAAA;EAGE;EACA;;;AAGF;AAAA;AAAA;AAIA;EACE;;;AAGF;AAAA;AAAA;AAAA;AAKA;AAAA;EAEE;EACA;EACA;EACA;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;AAAA;AAGA;AAAA;AAAA;AAIA;EACE;;;AAGF;AAAA;AAGA;AAAA;AAAA;AAAA;AAKA;AAAA;AAAA;AAAA;AAAA;EAKE;EACA;EACA;EACA;;;AAGF;AAAA;AAAA;AAAA;AAKA;AAAA;AAEE;EACA;;;AAGF;AAAA;AAAA;AAAA;AAKA;AAAA;AAEE;EACA;;;AAGF;AAAA;AAAA;AAIA;AAAA;AAAA;AAAA;EAIE;;;AAGF;AAAA;AAAA;AAIA;AAAA;AAAA;AAAA;EAIE;EACA;;;AAGF;AAAA;AAAA;AAIA;AAAA;AAAA;AAAA;EAIE;;;AAGF;AAAA;AAAA;AAIA;EACE;;;AAGF;AAAA;AAAA;AAAA;AAAA;AAAA;AAOA;EACE;EACA;EACA;EACA;EACA;EACA;;;AAGF;AAAA;AAAA;AAIA;EACE;;;AAGF;AAAA;AAAA;AAIA;EACE;;;AAGF;AAAA;AAAA;AAAA;AAKA;AAAA;EAEE;EACA;;;AAGF;AAAA;AAAA;AAIA;AAAA;EAEE;;;AAGF;AAAA;AAAA;AAAA;AAKA;EACE;EACA;;;AAGF;AAAA;AAAA;AAIA;EACE;;;AAGF;AAAA;AAAA;AAAA;AAKA;EACE;EACA;;;AAGF;AAAA;AAGA;AAAA;AAAA;AAIA;EACE;;;AAGF;AAAA;AAAA;AAIA;EACE;;;AAGF;AAAA;AAGA;AAAA;AAAA;AAIA;EACE;;;AAGF;AAAA;AAAA;AAIA;EACE;;;AC1VF;EACE,cCJa;;;ADOf;EACE;;;AAGF;EEcE;EFXA;;AGAE;EHHJ;IEiBI;;;;AFXJ;EACE,aIfiB;EJgBjB;EACA,aIbiB;EJcjB,OIiBY;EJhBZ,kBIYY;EJXZ;;;AAGF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAYE;;;AAGF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAOE;EACA;EACA;EACA,aI1CyB;EJ2CzB,OIjBY;;;AJoBd;EACE;EACA;;;AAGF;EACE,OIlBS;EJmBT;;;AAGF;EACE;EACA,uBInCY;EJoCZ;;AAEA;EACE;;;AAIJ;EACE,aIvEiB;EJwEjB;EACA,aIvEiB;;;AJ0EnB;AAAA;EAEE;;;AAGF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;EACA;EACA,kBInEY;EJoEZ;;;AAIF;EACE;EAGA;EACA;EACA;EACA;;;AK7GF;EACE;EACA;EACA;EACA,kBD4BY;;ADpBV;EEZJ;IAOI;IACA;IACA,ODwFW;ICvFX;IACA;IACA;;;AFAA;EEZJ;IAgBI;IACA,WD+EQ;;;;ADpFR;EESJ;IAEI;IACA,WD6EY;IC5EZ,aDwEW;;;ADrFX;EESJ;IAUI;;;;AAQJ;EFhBE,eCuDK;EDtDL,cCsDK;ECpCL,aDoCK;ECnCL,gBDmCK;;ADlEH;EE2BJ;IFZI,eCqDG;IDpDH,cCoDG;;;ADpEH;EE2BJ;IAOI,aDkCG;ICjCH,gBDiCG;;;;AC7BP;EACE;EACA;EACA,kBDtBY;;ADpBV;EEuCJ;IAMI;IACA;IACA,QD2CY;IC1CZ,kBD5BU;IC6BV;;;AAGF;EACE;;AFrDA;EEoDF;IAII;;;;AAKN;AAAA;AAAA;EAGE;;AFhEE;EE6DJ;AAAA;AAAA;IAMI,ODiBQ;;;;ACbZ;EACE;;AAEA;EACE;;AF3EA;EEuEJ;IAQI;IACA,aDVG;ICWH,gBDfG;ICgBH;IACA;;;;AAIJ;EACE;EACA,YDCc;ECAd;;AF1FE;EEuFJ;IAMI,QDHY;ICIZ,YDJY;ICKZ;;;;AAIJ;EFxFE,eCuDK;EDtDL,cCsDK;ECoCL;EACA;EACA;EACA;EACA,aDzCK;EC0CL,gBD1CK;EC2CL,ODvFY;EFMZ;;AC3BE;EEmGJ;IFpFI,eCqDG;IDpDH,cCoDG;;;ADpEH;EEmGJ;IHrEI;IACA,aEpCuB;;;ADKvB;EEmGJ;IAaI,aDhDG;ICiDH,gBDjDG;;;;ACgEP;EACE;EACA;EACA,SDjEK;ECkEL;;;AFpIE;EEwIF;IACE;;;AAIJ;EACE;;;AAQF;EACE;;;AASF;EACE;EACA,gBD1FM;EC2FN;;AFnKE;EEgKJ;IAMI;IACA;;;;AAMJ;EFlKE,eCuDK;EDtDL,cCsDK;EC8GL;EACA;EACA;EACA,aDjHK;ECkHL,gBDlHK;ECmHL,ODrKY;EFrBZ;;ACKE;EE6KJ;IF9JI,eCqDG;IDpDH,cCoDG;;;ADpEH;EE6KJ;IH/KI;;;ACEA;EE6KJ;IAYI;IACA;;;;AAIJ;EACE,OD5HK;EC6HL,QD7HK;EC8HL,ODpKS;;;AEtCX;EACE,aFEoB;;AEApB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAOE;;AAGF;EACE;EACA;;AAGF;AAAA;EAEE;;AAIA;EACE,YF+CC;;AE3CL;EACE;EACA;;AAEA;EACE;;AAEA;EACE;EACA;EACA;EACA,OFfM;EEgBN;EACA;EJ9BN;;ACHE;EG2BE;IJrBF;;;ACNA;EG2BE;IAUI;;;AAIJ;EACE;;AAGE;EACE;EACA;;AAOV;EACE;;AAGE;EACE;EACA;EACA,OF7CM;EE8CN;;AAMJ;EACE;;AAIJ;EACE;EACA;;AAKF;EACE;;AAGF;EACE;;AAGF;EACE;EACA;;AAGF;AAAA;EAEE;;AAGF;EACE;EACA;EACA;;AAEA;EACE;;AAIJ;EACE;EACA;EACA;;AAmBE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EACE;;AASF;AAAA;AAAA;AAAA;AAAA;AAAA;EAEE;;AAKN;EACE;EACA;EACA,OFnFG;EEoFH;EACA,eFzFG;EE0FH,cF1FG;EE2FH;;AH1JA;EGmJF;IAUI;IACA;;;AAGF;EACE;EACA;EACA;EACA,OFxIK;EEyIL;;AAYF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EACE;;AAIJ;EACE;;AAGF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAOE;EACA;EACA;;AAEA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAKE;;AAGF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EACE;;AAIJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAWE,YF9JG;;;AG3EP;EACE;EACA;EACA;EACA;;AAEA;ELgBA;EKbE;EACA;;AJCA;EILF;ILmBE;;;ACdA;EILF;ILQA;;;ACHE;EILF;ILWE;;;AKDA;EACE;EACA,YH+DC;EG9DD,aHuDC;EGtDD,gBHsDC;EGrDD;EAEE,eH0DD;EGzDC,cHqDD;;ADlEH;EIKA;IAeI,YHgDD;IG/CC;IAEE,eH6CH;IG5CG,cH4CH;;;AGrCD;EACE,OHkCD;EGjCC,QHiCD;EGhCC;;AAGF;EACE;EACA;;AAGF;EAEE;;AASJ;EACE;EAEE;EAGF,OHWC;EGVD,QHUC;EGTD;EACA,OHjCK;;AD7BP;EIqDA;IAYI,OHGD;IGFC,QHED;IGDC;;;AAGF;EACE;;AAQA;EACE;;AAKN;EACE;EACA,cHtBC;EGuBD;;AAEA;EACE;;AAEA;EACE,OH9EI;;AGiFN;EACE,OHlFI;;AGwFR;EAEI;;AAMJ;EACE;;;AAMR;EACE;EACA;EACA;EACA;EACA;ELjIA;;ACKE;EIuHJ;ILzHI;;;ACEA;EIuHJ;IASI;IACA,YH/DG;IGgEH;;EAEA;IACE;;;;AAMJ;EACE;;AAEA;EACE;;AAGE;EACE,OHtHC;;AGyHH;EACE,OH1HC;;;AGmIX;EACE;EACA;ELvKA;;ACKE;EIgKJ;ILlKI;;;AKuKF;EACE;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;;AJjLA;EIgKJ;IAqBI,eHnHG;;;;ADlEH;EI2LJ;IAEI;;;;AAIJ;EACE;EACA,eHlIK;EGmIL;;;AAGF;EACE;EL7MA;;ACKE;EIuMJ;ILzMI;;;AK6MF;EACE;;AAGF;EACE;EACA,cHjJG;EGkJH,aHlJG;EGmJH,OHnMU;EGoMV;;AAIA;EACE;;;ACpON;AAAA;ENwDE;EACA,aEnDyB;EIFzB;;ALOE;EKXJ;AAAA;IN4DI;;;;AMrDJ;AAAA;AAAA;EN+BE;;AC3BE;EKJJ;AAAA;AAAA;INkCI;IACA,aEpCuB;;;;AIO3B;AAAA;ENiBE;;ACnBE;EKEJ;AAAA;INoBI;;;;AMfJ;AAAA;ENZE;EMgBA;EACA;EACA;;ALbE;EKOJ;AAAA;INTI;;;;AMkBJ;EACE;;;AAGF;AAAA;ENjBE;;ACHE;EKoBJ;AAAA;INdI;;;;AMmBJ;AAAA;EN9BE;;ACKE;EKyBJ;AAAA;IN3BI;;;;AMgCJ;ENnCE;;ACKE;EK8BJ;INhCI;;;;AMoCJ;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;ACvDF;AAAA;EAEE;EACA;EACA,cLoEK;EKnEL,aLmEK;EKlEL,OLiBM;EKhBN;EACA;EACA,kBL6BS;EFnCT;EOSA;;ANJE;EMRJ;AAAA;IPMI;;;;AOSJ;EACE,kBL2BU;;;AKxBZ;EACE,kBLcW;;;AKXb;EACE,kBL2BQ;;;AKxBV;EACE,OLFY;EKGZ,kBLkBW;;;AMlDb;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,ON+BS;EM9BT;EACA;EACA;EACA,kBNiBY;EMhBZ;EACA,eNyEc;EMxEd,YACE;EAEF;;AAEA;EACE;EACA;EACA;;AAGF;EAEE;;AAGF;EAEE;;AAGF;EAIE;EACA;;AAGF;EAGE;EACA;EACA;;AAGF;EACE;;AAKA;EAEE;EACA;EACA;EACA;EACA;;;AAKN;EACE,ON/BS;EMgCT;EACA;;AAEA;EAIE;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA,YACE;;AAIJ;EAEE;;;AAIJ;ECnGE,OP0BM;EOzBN;EACA;EACA,YACE;;AAGF;EAEE,OPiBI;EOhBJ;EACA;;AAGF;EAGE;EACA;EACA;;AAGF;EACE;;;ADgFJ;ECvGE,OP0BM;EOzBN;EACA;EACA,YACE;;AAGF;EAEE,OPiBI;EOhBJ;EACA;;AAGF;EAGE;EACA;EACA;;AAGF;EACE;;;ADoFJ;EC3GE,OP0BM;EOzBN;EACA;EACA,YACE;;AAGF;EAEE,OPiBI;EOhBJ;EACA;;AAGF;EAGE;EACA;EACA;;AAGF;EACE;;;ADwFJ;EC/GE,OP0BM;EOzBN;EACA;EACA,YACE;;AAGF;EAEE,OPiBI;EOhBJ;EACA;;AAGF;EAGE;EACA;EACA;;AAGF;EACE;;;AD4FJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;;AE3HF;EACE;EACA;EACA;EACA,QRgFM;EQ/EN,SRuEK;EQtEL;;ATME;ESZJ;IASI;IACA;IACA;IACA;IACA;;;;AAIJ;EACE;EACA;EACA,QR8DK;EQ7DL;EACA,eRmEc;EQlEd,YACE;EAEF;;ATdE;ESKJ;IAYI;IACA;IACA,WRwEmB;IQvEnB;IACA;IACA;IACA;;;;AAIJ;EACE;EACA;EACA;EACA;EACA;EACA,ORTY;EQUZ,kBRfY;EQgBZ;EACA;EACA;EACA;EACA;;ATvCE;ES2BJ;IAeI;IACA;IACA,kBRxBU;IQyBV;;;AAGF;EACE;;AAEA;EACE,ORvBK;;;AQ4BX;EACE;EACA;EACA;EACA,cRKK;;ADlEH;ESyDJ;IAOI,cRIG;IQHH;;;AAGF;EACE;EACA;EACA;EACA,ORxDU;;;AQ4Dd;EACE;EACA;EACA;EACA;EACA;EACA;EACA,kBRhEY;EQiEZ,4BRPc;EQQd,2BRRc;EQSd,YACE;;ATvFA;ES4EJ;IAeI;IACA,ORDmB;IQEnB;;;;AAIJ;EACE;EACA,eRpCK;EQqCL;EVzFA;;ACXE;ESiGJ;IVnFI;;;ACdA;ESiGJ;IV9FE;;;ACHE;ESiGJ;IV3FI;;;;AUsGJ;EACE;EACA;;;AAGF;EACE;EACA;;AAEA;EAEE,kBX1Ha;;;AW8HjB;EACE;EACA,aR7DK;EQ8DL,gBR9DK;;ADhEH;ES2HJ;IAMI;IACA;IACA,eRnEG;IQoEH;;;;AAIJ;EACE;EACA;EACA;;AAEA;EACE;EV3IF;;ACHE;ES6IF;IVvIE;;;ACNA;ES6IF;IVlJA;;;ACKE;ES6IF;IV/IE;;;AUwJF;EACE,ORrFG;EQsFH,QRtFG;EQuFH,cRzFG;EQ0FH,OR7HO;EQ8HP;;AAGF;EACE;;;AAIJ;EACE;EACA;;;AAGF;EACE;EACA;EACA;EACA,OR5JY;EQ6JZ;EACA;EV3LA;;ACaE;ESwKJ;IVlLI;;;;AU4LJ;EACE;EACA,aRpHK;EQqHL,gBRrHK;EQsHL,cRpHK;EQqHL,aRvHK;EQwHL,ORxKY;EQyKZ;EACA,aR9GO;EQ+GP,mBRzKY;EFvBZ;;ACKE;ESkLJ;IVpLI;;;ACEA;ESkLJ;IAaI;IACA;IACA,cRjIG;IQkIH;IACA;;;;AAIJ;EACE,YRzIK;;;AQ4IP;EACE;;;AAGF;EACE;EV7MA;;ACHE;ES+MJ;IVzMI;;;;AU8MJ;EACE;EACA,ORpJK;EQqJL,QRrJK;EQsJL;EACA,ORlJK;EQmJL,QRnJK;EQoJL,kBRxMY;EQyMZ;EACA;EACA,YACE;EAEF;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,YACE;;;AAMF;EACE;EACA;EACA;EACA;EACA;EACA;;AAGF;EACE,QRvLI;EQwLJ;;AThQA;ES8PF;IAKI,ORxKiB;IQyKjB,YACE;;;AAKN;EACE,kBRxPU;;ADnBV;ES0QF;IAII;;;AT9QF;ESkRF;IAEI;;;AAIJ;EACE;;AAGF;EACE;EACA;EACA;EACA,YACE;;ATjSF;ESuSA;IACE;IACA;IACA;;;AAIJ;EACE,aRvOI;;ADxEJ;ES8SF;IAII;;;;AC7TN;EACE;EACA;EACA;EACA,eT0EK;ESzEL;EACA,eTkFc;ESjFd,YACE;;;AAIJ;EACE;EACA;EACA;;;AAGF;AAAA;EXJE;EWQA;EACA;EACA,kBTMY;ESLZ;EACA;;AVfE;EUOJ;AAAA;IXDI;;;AWWF;AAAA;EACE;;;AAOE;AAAA;EAEE;;AAGF;EACE,gBTkCD;;;AS3BL;EACE;;;AC9CF;EACE;EACA;EACA,kBbDoB;EaEpB;EACA,eV+EY;;;AU1EhB;EACE,cVcY;;;AUqCd;AAAA;AAAA;EAGE;EACA,eVMK;EULL,kBbjEsB;EakEtB,eVgBc;EUfd;EACA;EACA;EACA;;AAIA;AAAA;AAAA;EACE,OVLG;EUMH;EACA;EACA;EACA;EACA;EACA,kBbjFoB;EakFpB,OVrDU;EUsDV;;AAEA;AAAA;AAAA;EACE,MVzDQ;;AU4DV;AAAA;AAAA;EACE;EACA;EACA;;AAGF;AAAA;AAAA;EACE;;AAMF;AAAA;AAAA;EACE;EACA;;;AASJ;EACE;EACA,SV7CG;EU8CH;EACA;;AAGF;AAAA;EAEE;EACA;EACA;;;AAUJ;EAGE;EACA,eVpEK;;AU2CL;EACE;EACA,SV7CG;EU8CH;EACA;;AAGF;AAAA;EAEE;EACA;EACA;;;AAwBF;AAAA;EAEE;EACA,SVjFG;EUkFH;EACA;;;AAQJ;EACE;EACA;EACA;EACA;;AAEA;AAAA;EZvKA;EY2KE;EACA;EACA,kBb7KoB;Ea8KpB;;AXzKA;EWkKF;AAAA;IZpKE;;;AY8KF;EACE;EACA,eV7GG;EU8GH,cV9GG;;AUiHL;EACE;EACA;;;AAKJ;AAAA;EAEE,SV1HK;EU2HL,eV3HK;EU4HL;EACA;EACA,eVlHc;;AUoHd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAIE;EACA;EACA;EACA;EACA;EACA;EACA;;;AAKJ;EACE;EACA;EACA;;;AAIF;AAAA;EAEE,Yb9NsB;EaiOpB,ObhOoB;;;AauOxB;EACE,YbzOsB;;;AcLxB;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAKF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;ACvOF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AbPE;EaiBE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab9BJ;EaiBE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab9BJ;EaiBE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab9BJ;EaiBE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab9BJ;EaiBE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab9BJ;EaiBE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab9BJ;EaiBE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab9BJ;EaiBE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab9BJ;EaiBE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab9BJ;EaiBE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab9BJ;EaiBE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab9BJ;EaiBE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab9BJ;EaiBE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab9BJ;EaiBE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab9BJ;EaiBE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab9BJ;EaiBE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab9BJ;EaiBE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab9BJ;EaiBE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab9BJ;EaiBE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab9BJ;EaiBE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab9BJ;EaiBE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab9BJ;EaiBE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab9BJ;EaiBE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab9BJ;EaiBE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab9BJ;EaiBE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab9BJ;EaiBE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab9BJ;EaiBE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab9BJ;EaiBE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab9BJ;EaiBE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab9BJ;EaiBE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab9BJ;EaiBE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab9BJ;EaiBE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab9BJ;EaiBE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab9BJ;EaiBE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab9BJ;EaiBE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab9BJ;EaiBE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab9BJ;EaiBE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab9BJ;EaiBE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab9BJ;EaiBE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab9BJ;EaiBE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab9BJ;EaiBE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab9BJ;EaiBE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab9BJ;EaiBE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab9BJ;EaiBE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab9BJ;EaiBE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab9BJ;EaiBE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab9BJ;EaiBE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab9BJ;EaiBE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab9BJ;EaiBE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab9BJ;EaiBE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab9BJ;EaiBE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab9BJ;EaiBE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab9BJ;EaiBE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab9BJ;EaiBE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab9BJ;EaiBE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;AAQR;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAKF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;ACjGF;EfDE;;ACaE;EcZJ;IfEI;;;;AeEJ;EfGE;;ACKE;EcRJ;IfMI;;;;AeFJ;EfOE;;ACHE;EcJJ;IfUI;;;;AeNJ;EfWE;;ACXE;EcAJ;IfcI;;;;AeVJ;EfeE;;ACnBE;EcIJ;IfkBI;;;;AedJ;EfmBE;;AC3BE;EcQJ;IfsBI;IACA,aEpCuB;;;;AaiB3B;EfwBE;EACA,aE1CyB;;ADKvB;EcYJ;If4BI;;;;AexBJ;Ef6BE;EACA,aEnDyB;;ADKvB;EcgBJ;IfiCI;;;;Ae7BJ;EfkCE;EACA,aE5DyB;;ADKvB;EcoBJ;IfsCI;;;;AelCJ;EfuCE;EACA,aErEyB;;ADKvB;EcwBJ;If2CI;;;;AevCJ;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE,abxDiB;;;Aa2DnB;EACE,ab1DyB;;;Aa6D3B;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AC/EF;EACE;EACA;EACA;;AAGE;EACE;;;ACLN;EACE;EACA;;;AAQA;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AhBlCA;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AAaN;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AhB7GA;EgBwHE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhB/IJ;EgBwHE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhB/IJ;EgBwHE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhB/IJ;EgBwHE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhB/IJ;EgBwHE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AC3JR;EACE;AAAA;AAAA;AAAA;AAAA;AAAA;IAME;;EAGF;IACE;IACA;IACA;;EAGF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;;EAGF;IACE;;EAGF;IACE;IACA;;;AClCJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;AAAA;EAEE,OjB4BS;EiB3BT,kBjBkBY;EiBjBZ;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;ACpBF;EACE,kBlByBY","sourcesContent":["// Generated with OneLightJekyll applied to Atom's One Light theme\n\n.highlight,\npre.highlight {\n background: #f9f9f9;\n color: #383942;\n}\n.highlight pre {\n background: #f9f9f9;\n}\n.highlight .hll {\n background: #f9f9f9;\n}\n.highlight .c {\n color: #9fa0a6;\n font-style: italic;\n}\n.highlight .err {\n color: #fff;\n background-color: #e05151;\n}\n.highlight .k {\n color: #a625a4;\n}\n.highlight .l {\n color: #50a04f;\n}\n.highlight .n {\n color: #383942;\n}\n.highlight .o {\n color: #383942;\n}\n.highlight .p {\n color: #383942;\n}\n.highlight .cm {\n color: #9fa0a6;\n font-style: italic;\n}\n.highlight .cp {\n color: #9fa0a6;\n font-style: italic;\n}\n.highlight .c1 {\n color: #9fa0a6;\n font-style: italic;\n}\n.highlight .cs {\n color: #9fa0a6;\n font-style: italic;\n}\n.highlight .ge {\n font-style: italic;\n}\n.highlight .gs {\n font-weight: 700;\n}\n.highlight .kc {\n color: #a625a4;\n}\n.highlight .kd {\n color: #a625a4;\n}\n.highlight .kn {\n color: #a625a4;\n}\n.highlight .kp {\n color: #a625a4;\n}\n.highlight .kr {\n color: #a625a4;\n}\n.highlight .kt {\n color: #a625a4;\n}\n.highlight .ld {\n color: #50a04f;\n}\n.highlight .m {\n color: #b66a00;\n}\n.highlight .s {\n color: #50a04f;\n}\n.highlight .na {\n color: #b66a00;\n}\n.highlight .nb {\n color: #ca7601;\n}\n.highlight .nc {\n color: #ca7601;\n}\n.highlight .no {\n color: #ca7601;\n}\n.highlight .nd {\n color: #ca7601;\n}\n.highlight .ni {\n color: #ca7601;\n}\n.highlight .ne {\n color: #ca7601;\n}\n.highlight .nf {\n color: #383942;\n}\n.highlight .nl {\n color: #ca7601;\n}\n.highlight .nn {\n color: #383942;\n}\n.highlight .nx {\n color: #383942;\n}\n.highlight .py {\n color: #ca7601;\n}\n.highlight .nt {\n color: #e35549;\n}\n.highlight .nv {\n color: #ca7601;\n}\n.highlight .ow {\n font-weight: 700;\n}\n.highlight .w {\n color: #f8f8f2;\n}\n.highlight .mf {\n color: #b66a00;\n}\n.highlight .mh {\n color: #b66a00;\n}\n.highlight .mi {\n color: #b66a00;\n}\n.highlight .mo {\n color: #b66a00;\n}\n.highlight .sb {\n color: #50a04f;\n}\n.highlight .sc {\n color: #50a04f;\n}\n.highlight .sd {\n color: #50a04f;\n}\n.highlight .s2 {\n color: #50a04f;\n}\n.highlight .se {\n color: #50a04f;\n}\n.highlight .sh {\n color: #50a04f;\n}\n.highlight .si {\n color: #50a04f;\n}\n.highlight .sx {\n color: #50a04f;\n}\n.highlight .sr {\n color: #0083bb;\n}\n.highlight .s1 {\n color: #50a04f;\n}\n.highlight .ss {\n color: #0083bb;\n}\n.highlight .bp {\n color: #ca7601;\n}\n.highlight .vc {\n color: #ca7601;\n}\n.highlight .vg {\n color: #ca7601;\n}\n.highlight .vi {\n color: #e35549;\n}\n.highlight .il {\n color: #b66a00;\n}\n.highlight .gu {\n color: #75715e;\n}\n.highlight .gd {\n color: #e05151;\n}\n.highlight .gi {\n color: #43d089;\n}\n.highlight .language-json .w + .s2 {\n color: #e35549;\n}\n.highlight .language-json .kc {\n color: #0083bb;\n}\n","// Generated with OneDarkJekyll applied to Atom's One Dark Vivid theme\n\n.highlight,\npre.highlight {\n background: #31343f;\n color: #dee2f7;\n}\n.highlight pre {\n background: #31343f;\n}\n.highlight .hll {\n background: #31343f;\n}\n.highlight .c {\n color: #63677e;\n font-style: italic;\n}\n.highlight .err {\n color: #960050;\n background-color: #1e0010;\n}\n.highlight .k {\n color: #e19ef5;\n}\n.highlight .l {\n color: #a3eea0;\n}\n.highlight .n {\n color: #dee2f7;\n}\n.highlight .o {\n color: #dee2f7;\n}\n.highlight .p {\n color: #dee2f7;\n}\n.highlight .cm {\n color: #63677e;\n font-style: italic;\n}\n.highlight .cp {\n color: #63677e;\n font-style: italic;\n}\n.highlight .c1 {\n color: #63677e;\n font-style: italic;\n}\n.highlight .cs {\n color: #63677e;\n font-style: italic;\n}\n.highlight .ge {\n font-style: italic;\n}\n.highlight .gs {\n font-weight: 700;\n}\n.highlight .kc {\n color: #e19ef5;\n}\n.highlight .kd {\n color: #e19ef5;\n}\n.highlight .kn {\n color: #e19ef5;\n}\n.highlight .kp {\n color: #e19ef5;\n}\n.highlight .kr {\n color: #e19ef5;\n}\n.highlight .kt {\n color: #e19ef5;\n}\n.highlight .ld {\n color: #a3eea0;\n}\n.highlight .m {\n color: #eddc96;\n}\n.highlight .s {\n color: #a3eea0;\n}\n.highlight .na {\n color: #eddc96;\n}\n.highlight .nb {\n color: #fdce68;\n}\n.highlight .nc {\n color: #fdce68;\n}\n.highlight .no {\n color: #fdce68;\n}\n.highlight .nd {\n color: #fdce68;\n}\n.highlight .ni {\n color: #fdce68;\n}\n.highlight .ne {\n color: #fdce68;\n}\n.highlight .nf {\n color: #dee2f7;\n}\n.highlight .nl {\n color: #fdce68;\n}\n.highlight .nn {\n color: #dee2f7;\n}\n.highlight .nx {\n color: #dee2f7;\n}\n.highlight .py {\n color: #fdce68;\n}\n.highlight .nt {\n color: #f9867b;\n}\n.highlight .nv {\n color: #fdce68;\n}\n.highlight .ow {\n font-weight: 700;\n}\n.highlight .w {\n color: #f8f8f2;\n}\n.highlight .mf {\n color: #eddc96;\n}\n.highlight .mh {\n color: #eddc96;\n}\n.highlight .mi {\n color: #eddc96;\n}\n.highlight .mo {\n color: #eddc96;\n}\n.highlight .sb {\n color: #a3eea0;\n}\n.highlight .sc {\n color: #a3eea0;\n}\n.highlight .sd {\n color: #a3eea0;\n}\n.highlight .s2 {\n color: #a3eea0;\n}\n.highlight .se {\n color: #a3eea0;\n}\n.highlight .sh {\n color: #a3eea0;\n}\n.highlight .si {\n color: #a3eea0;\n}\n.highlight .sx {\n color: #a3eea0;\n}\n.highlight .sr {\n color: #7be2f9;\n}\n.highlight .s1 {\n color: #a3eea0;\n}\n.highlight .ss {\n color: #7be2f9;\n}\n.highlight .bp {\n color: #fdce68;\n}\n.highlight .vc {\n color: #fdce68;\n}\n.highlight .vg {\n color: #fdce68;\n}\n.highlight .vi {\n color: #f9867b;\n}\n.highlight .il {\n color: #eddc96;\n}\n.highlight .gu {\n color: #75715e;\n}\n.highlight .gd {\n color: #f92672;\n}\n.highlight .gi {\n color: #a6e22e;\n}\n","/*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */\n\n/* Document\n ========================================================================== */\n\n/**\n * 1. Correct the line height in all browsers.\n * 2. Prevent adjustments of font size after orientation changes in iOS.\n */\n\nhtml {\n line-height: 1.15; /* 1 */\n -webkit-text-size-adjust: 100%; /* 2 */\n}\n\n/* Sections\n ========================================================================== */\n\n/**\n * Remove the margin in all browsers.\n */\n\nbody {\n margin: 0;\n}\n\n/**\n * Render the `main` element consistently in IE.\n */\n\nmain {\n display: block;\n}\n\n/**\n * Correct the font size and margin on `h1` elements within `section` and\n * `article` contexts in Chrome, Firefox, and Safari.\n */\n\nh1 {\n font-size: 2em;\n margin: 0.67em 0;\n}\n\n/* Grouping content\n ========================================================================== */\n\n/**\n * 1. Add the correct box sizing in Firefox.\n * 2. Show the overflow in Edge and IE.\n */\n\nhr {\n box-sizing: content-box; /* 1 */\n height: 0; /* 1 */\n overflow: visible; /* 2 */\n}\n\n/**\n * 1. Correct the inheritance and scaling of font size in all browsers.\n * 2. Correct the odd `em` font sizing in all browsers.\n */\n\npre {\n font-family: monospace, monospace; /* 1 */\n font-size: 1em; /* 2 */\n}\n\n/* Text-level semantics\n ========================================================================== */\n\n/**\n * Remove the gray background on active links in IE 10.\n */\n\na {\n background-color: transparent;\n}\n\n/**\n * 1. Remove the bottom border in Chrome 57-\n * 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari.\n */\n\nabbr[title] {\n border-bottom: none; /* 1 */\n text-decoration: underline; /* 2 */\n text-decoration: underline dotted; /* 2 */\n}\n\n/**\n * Add the correct font weight in Chrome, Edge, and Safari.\n */\n\nb,\nstrong {\n font-weight: bolder;\n}\n\n/**\n * 1. Correct the inheritance and scaling of font size in all browsers.\n * 2. Correct the odd `em` font sizing in all browsers.\n */\n\ncode,\nkbd,\nsamp {\n font-family: monospace, monospace; /* 1 */\n font-size: 1em; /* 2 */\n}\n\n/**\n * Add the correct font size in all browsers.\n */\n\nsmall {\n font-size: 80%;\n}\n\n/**\n * Prevent `sub` and `sup` elements from affecting the line height in\n * all browsers.\n */\n\nsub,\nsup {\n font-size: 75%;\n line-height: 0;\n position: relative;\n vertical-align: baseline;\n}\n\nsub {\n bottom: -0.25em;\n}\n\nsup {\n top: -0.5em;\n}\n\n/* Embedded content\n ========================================================================== */\n\n/**\n * Remove the border on images inside links in IE 10.\n */\n\nimg {\n border-style: none;\n}\n\n/* Forms\n ========================================================================== */\n\n/**\n * 1. Change the font styles in all browsers.\n * 2. Remove the margin in Firefox and Safari.\n */\n\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n font-family: inherit; /* 1 */\n font-size: 100%; /* 1 */\n line-height: 1.15; /* 1 */\n margin: 0; /* 2 */\n}\n\n/**\n * Show the overflow in IE.\n * 1. Show the overflow in Edge.\n */\n\nbutton,\ninput {\n /* 1 */\n overflow: visible;\n}\n\n/**\n * Remove the inheritance of text transform in Edge, Firefox, and IE.\n * 1. Remove the inheritance of text transform in Firefox.\n */\n\nbutton,\nselect {\n /* 1 */\n text-transform: none;\n}\n\n/**\n * Correct the inability to style clickable types in iOS and Safari.\n */\n\nbutton,\n[type=\"button\"],\n[type=\"reset\"],\n[type=\"submit\"] {\n -webkit-appearance: button;\n}\n\n/**\n * Remove the inner border and padding in Firefox.\n */\n\nbutton::-moz-focus-inner,\n[type=\"button\"]::-moz-focus-inner,\n[type=\"reset\"]::-moz-focus-inner,\n[type=\"submit\"]::-moz-focus-inner {\n border-style: none;\n padding: 0;\n}\n\n/**\n * Restore the focus styles unset by the previous rule.\n */\n\nbutton:-moz-focusring,\n[type=\"button\"]:-moz-focusring,\n[type=\"reset\"]:-moz-focusring,\n[type=\"submit\"]:-moz-focusring {\n outline: 1px dotted ButtonText;\n}\n\n/**\n * Correct the padding in Firefox.\n */\n\nfieldset {\n padding: 0.35em 0.75em 0.625em;\n}\n\n/**\n * 1. Correct the text wrapping in Edge and IE.\n * 2. Correct the color inheritance from `fieldset` elements in IE.\n * 3. Remove the padding so developers are not caught out when they zero out\n * `fieldset` elements in all browsers.\n */\n\nlegend {\n box-sizing: border-box; /* 1 */\n color: inherit; /* 2 */\n display: table; /* 1 */\n max-width: 100%; /* 1 */\n padding: 0; /* 3 */\n white-space: normal; /* 1 */\n}\n\n/**\n * Add the correct vertical alignment in Chrome, Firefox, and Opera.\n */\n\nprogress {\n vertical-align: baseline;\n}\n\n/**\n * Remove the default vertical scrollbar in IE 10+.\n */\n\ntextarea {\n overflow: auto;\n}\n\n/**\n * 1. Add the correct box sizing in IE 10.\n * 2. Remove the padding in IE 10.\n */\n\n[type=\"checkbox\"],\n[type=\"radio\"] {\n box-sizing: border-box; /* 1 */\n padding: 0; /* 2 */\n}\n\n/**\n * Correct the cursor style of increment and decrement buttons in Chrome.\n */\n\n[type=\"number\"]::-webkit-inner-spin-button,\n[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\n\n/**\n * 1. Correct the odd appearance in Chrome and Safari.\n * 2. Correct the outline style in Safari.\n */\n\n[type=\"search\"] {\n -webkit-appearance: textfield; /* 1 */\n outline-offset: -2px; /* 2 */\n}\n\n/**\n * Remove the inner padding in Chrome and Safari on macOS.\n */\n\n[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n/**\n * 1. Correct the inability to style clickable types in iOS and Safari.\n * 2. Change font properties to `inherit` in Safari.\n */\n\n::-webkit-file-upload-button {\n -webkit-appearance: button; /* 1 */\n font: inherit; /* 2 */\n}\n\n/* Interactive\n ========================================================================== */\n\n/*\n * Add the correct display in Edge, IE 10+, and Firefox.\n */\n\ndetails {\n display: block;\n}\n\n/*\n * Add the correct display in all browsers.\n */\n\nsummary {\n display: list-item;\n}\n\n/* Misc\n ========================================================================== */\n\n/**\n * Add the correct display in IE 10+.\n */\n\ntemplate {\n display: none;\n}\n\n/**\n * Add the correct display in IE 10.\n */\n\n[hidden] {\n display: none;\n}\n","// Base element style overrides\n// stylelint-disable selector-no-type, selector-max-type, selector-max-specificity, selector-max-id\n\n:root {\n color-scheme: $color-scheme;\n}\n\n* {\n box-sizing: border-box;\n}\n\nhtml {\n @include fs-4;\n\n scroll-behavior: smooth;\n}\n\nbody {\n font-family: $body-font-family;\n font-size: inherit;\n line-height: $body-line-height;\n color: $body-text-color;\n background-color: $body-background-color;\n overflow-wrap: break-word;\n}\n\nol,\nul,\ndl,\npre,\naddress,\nblockquote,\ntable,\ndiv,\nhr,\nform,\nfieldset,\nnoscript .table-wrapper {\n margin-top: 0;\n}\n\nh1,\nh2,\nh3,\nh4,\nh5,\nh6,\n#toctitle {\n margin-top: 0;\n margin-bottom: 1em;\n font-weight: 500;\n line-height: $body-heading-line-height;\n color: $body-heading-color;\n}\n\np {\n margin-top: 1em;\n margin-bottom: 1em;\n}\n\na {\n color: $link-color;\n text-decoration: none;\n}\n\na:not([class]) {\n text-decoration: underline;\n text-decoration-color: $border-color;\n text-underline-offset: 2px;\n\n &:hover {\n text-decoration-color: rgba($link-color, 0.45);\n }\n}\n\ncode {\n font-family: $mono-font-family;\n font-size: 0.75em;\n line-height: $body-line-height;\n}\n\nfigure,\npre {\n margin: 0;\n}\n\nli {\n margin: 0.25em 0;\n}\n\nimg {\n max-width: 100%;\n height: auto;\n}\n\nhr {\n height: 1px;\n padding: 0;\n margin: $sp-6 0;\n background-color: $border-color;\n border: 0;\n}\n\n// adds a GitHub-style sidebar to blockquotes\nblockquote {\n margin: 10px 0;\n\n // resets user-agent stylesheets for blockquotes\n margin-block-start: 0;\n margin-inline-start: 0;\n padding-left: 1rem;\n border-left: 3px solid $border-color;\n}\n","$color-scheme: dark;\n$body-background-color: $grey-dk-300;\n$body-heading-color: $grey-lt-000;\n$body-text-color: $grey-lt-300;\n$link-color: $blue-000;\n$nav-child-link-color: $grey-dk-000;\n$sidebar-color: $grey-dk-300;\n$base-button-color: $grey-dk-250;\n$btn-primary-color: $blue-200;\n$code-background-color: #31343f; // OneDarkJekyll default for syntax-one-dark-vivid\n$code-linenumber-color: #dee2f7; // OneDarkJekyll .nf for syntax-one-dark-vivid\n$feedback-color: darken($sidebar-color, 3%);\n$table-background-color: $grey-dk-250;\n$search-background-color: $grey-dk-250;\n$search-result-preview-color: $grey-dk-000;\n$border-color: $grey-dk-200;\n\n@import \"./vendor/OneDarkJekyll/syntax\"; // this is the one-dark-vivid atom syntax theme\n","@mixin fs-1 {\n font-size: $font-size-1 !important;\n\n @include mq(sm) {\n font-size: $font-size-1-sm !important;\n }\n}\n\n@mixin fs-2 {\n font-size: $font-size-2 !important;\n\n @include mq(sm) {\n font-size: $font-size-3 !important;\n }\n}\n\n@mixin fs-3 {\n font-size: $font-size-3 !important;\n\n @include mq(sm) {\n font-size: $font-size-4 !important;\n }\n}\n\n@mixin fs-4 {\n font-size: $font-size-4 !important;\n\n @include mq(sm) {\n font-size: $font-size-5 !important;\n }\n}\n\n@mixin fs-5 {\n font-size: $font-size-5 !important;\n\n @include mq(sm) {\n font-size: $font-size-6 !important;\n }\n}\n\n@mixin fs-6 {\n font-size: $font-size-6 !important;\n\n @include mq(sm) {\n font-size: $font-size-7 !important;\n line-height: $body-heading-line-height;\n }\n}\n\n@mixin fs-7 {\n font-size: $font-size-7 !important;\n line-height: $body-heading-line-height;\n\n @include mq(sm) {\n font-size: $font-size-8 !important;\n }\n}\n\n@mixin fs-8 {\n font-size: $font-size-8 !important;\n line-height: $body-heading-line-height;\n\n @include mq(sm) {\n font-size: $font-size-9 !important;\n }\n}\n\n@mixin fs-9 {\n font-size: $font-size-9 !important;\n line-height: $body-heading-line-height;\n\n @include mq(sm) {\n font-size: $font-size-10 !important;\n }\n}\n\n@mixin fs-10 {\n font-size: $font-size-10 !important;\n line-height: $body-heading-line-height;\n\n @include mq(sm) {\n font-size: $font-size-10-sm !important;\n }\n}\n","// Media query\n\n// Media query mixin\n// Usage:\n// @include mq(md) {\n// ..medium and up styles\n// }\n@mixin mq($name) {\n // Retrieves the value from the key\n $value: map-get($media-queries, $name);\n\n // If the key exists in the map\n @if $value {\n // Prints a media query based on the value\n @media (min-width: $value) {\n @content;\n }\n } @else {\n @warn \"No value could be retrieved from `#{$media-query}`. Please make sure it is defined in `$media-queries` map.\";\n }\n}\n\n// Responsive container\n\n@mixin container {\n padding-right: $gutter-spacing-sm;\n padding-left: $gutter-spacing-sm;\n\n @include mq(md) {\n padding-right: $gutter-spacing;\n padding-left: $gutter-spacing;\n }\n}\n","// Typography\n\n// prettier-ignore\n$body-font-family: system-ui, -apple-system, blinkmacsystemfont, \"Segoe UI\",\n roboto, \"Helvetica Neue\", arial, sans-serif, \"Segoe UI Emoji\" !default;\n$mono-font-family: \"SFMono-Regular\", menlo, consolas, monospace !default;\n$root-font-size: 16px !default; // DEPRECATED: previously base font-size for rems\n$body-line-height: 1.4 !default;\n$content-line-height: 1.6 !default;\n$body-heading-line-height: 1.25 !default;\n\n// Font size\n// `-sm` suffix is the size at the small (and above) media query\n\n$font-size-1: 0.5625rem !default;\n$font-size-1-sm: 0.625rem !default;\n$font-size-2: 0.6875rem !default; // h4 - uppercased!, h6 not uppercased, text-small\n$font-size-3: 0.75rem !default; // h5\n$font-size-4: 0.875rem !default;\n$font-size-5: 1rem !default; // h3\n$font-size-6: 1.125rem !default; // h2\n$font-size-7: 1.5rem !default;\n$font-size-8: 2rem !default; // h1\n$font-size-9: 2.25rem !default;\n$font-size-10: 2.625rem !default;\n$font-size-10-sm: 3rem !default;\n\n// Colors\n\n$white: #fff !default;\n$grey-dk-000: #959396 !default;\n$grey-dk-100: #5c5962 !default;\n$grey-dk-200: #44434d !default;\n$grey-dk-250: #302d36 !default;\n$grey-dk-300: #27262b !default;\n$grey-lt-000: #f5f6fa !default;\n$grey-lt-100: #eeebee !default;\n$grey-lt-200: #ecebed !default;\n$grey-lt-300: #e6e1e8 !default;\n$purple-000: #7253ed !default;\n$purple-100: #5e41d0 !default;\n$purple-200: #4e26af !default;\n$purple-300: #381885 !default;\n$blue-000: #2c84fa !default;\n$blue-100: #2869e6 !default;\n$blue-200: #264caf !default;\n$blue-300: #183385 !default;\n$green-000: #41d693 !default;\n$green-100: #11b584 !default;\n$green-200: #009c7b !default;\n$green-300: #026e57 !default;\n$yellow-000: #ffeb82 !default;\n$yellow-100: #fadf50 !default;\n$yellow-200: #f7d12e !default;\n$yellow-300: #e7af06 !default;\n$red-000: #f77e7e !default;\n$red-100: #f96e65 !default;\n$red-200: #e94c4c !default;\n$red-300: #dd2e2e !default;\n\n// Spacing\n\n$spacing-unit: 1rem; // 1rem == 16px\n\n$spacers: (\n sp-0: 0,\n sp-1: $spacing-unit * 0.25,\n sp-2: $spacing-unit * 0.5,\n sp-3: $spacing-unit * 0.75,\n sp-4: $spacing-unit,\n sp-5: $spacing-unit * 1.5,\n sp-6: $spacing-unit * 2,\n sp-7: $spacing-unit * 2.5,\n sp-8: $spacing-unit * 3,\n sp-9: $spacing-unit * 3.5,\n sp-10: $spacing-unit * 4,\n) !default;\n$sp-1: map-get($spacers, sp-1) !default; // 0.25 rem == 4px\n$sp-2: map-get($spacers, sp-2) !default; // 0.5 rem == 8px\n$sp-3: map-get($spacers, sp-3) !default; // 0.75 rem == 12px\n$sp-4: map-get($spacers, sp-4) !default; // 1 rem == 16px\n$sp-5: map-get($spacers, sp-5) !default; // 1.5 rem == 24px\n$sp-6: map-get($spacers, sp-6) !default; // 2 rem == 32px\n$sp-7: map-get($spacers, sp-7) !default; // 2.5 rem == 40px\n$sp-8: map-get($spacers, sp-8) !default; // 3 rem == 48px\n$sp-9: map-get($spacers, sp-9) !default; // 3.5 rem == 56px\n$sp-10: map-get($spacers, sp-10) !default; // 4 rem == 64px\n\n// Borders\n\n$border: 1px solid !default;\n$border-radius: 4px !default;\n$border-color: $grey-lt-100 !default;\n\n// Grid system\n\n$gutter-spacing: $sp-6 !default;\n$gutter-spacing-sm: $sp-4 !default;\n$nav-width: 16.5rem !default;\n$nav-width-md: 15.5rem !default;\n$nav-list-item-height: $sp-6 !default;\n$nav-list-item-height-sm: $sp-8 !default;\n$nav-list-expander-right: true;\n$content-width: 50rem !default;\n$header-height: 3.75rem !default;\n$search-results-width: $content-width - $nav-width !default;\n$transition-duration: 400ms;\n\n// Media queries in pixels\n\n$media-queries: (\n xs: 20rem,\n sm: 31.25rem,\n md: $content-width,\n lg: $content-width + $nav-width,\n xl: 87.5rem,\n) !default;\n","// The basic two column layout\n\n.side-bar {\n z-index: 0;\n display: flex;\n flex-wrap: wrap;\n background-color: $sidebar-color;\n\n @include mq(md) {\n flex-flow: column nowrap;\n position: fixed;\n width: $nav-width-md;\n height: 100%;\n border-right: $border $border-color;\n align-items: flex-end;\n }\n\n @include mq(lg) {\n width: calc((100% - #{$nav-width + $content-width}) / 2 + #{$nav-width});\n min-width: $nav-width;\n }\n}\n\n.main {\n @include mq(md) {\n position: relative;\n max-width: $content-width;\n margin-left: $nav-width-md;\n }\n\n @include mq(lg) {\n // stylelint-disable function-name-case\n // disable for Max(), we want to use the CSS max() function\n margin-left: Max(\n #{$nav-width},\n calc((100% - #{$nav-width + $content-width}) / 2 + #{$nav-width})\n );\n // stylelint-enable function-name-case\n }\n}\n\n.main-content-wrap {\n @include container;\n\n padding-top: $gutter-spacing-sm;\n padding-bottom: $gutter-spacing-sm;\n\n @include mq(md) {\n padding-top: $gutter-spacing;\n padding-bottom: $gutter-spacing;\n }\n}\n\n.main-header {\n z-index: 0;\n display: none;\n background-color: $sidebar-color;\n\n @include mq(md) {\n display: flex;\n justify-content: space-between;\n height: $header-height;\n background-color: $body-background-color;\n border-bottom: $border $border-color;\n }\n\n &.nav-open {\n display: block;\n\n @include mq(md) {\n display: flex;\n }\n }\n}\n\n.site-nav,\n.site-header,\n.site-footer {\n width: 100%;\n\n @include mq(lg) {\n width: $nav-width;\n }\n}\n\n.site-nav {\n display: none;\n\n &.nav-open {\n display: block;\n }\n\n @include mq(md) {\n display: block;\n padding-top: $sp-8;\n padding-bottom: $gutter-spacing-sm;\n overflow-y: auto;\n flex: 1 1 auto;\n }\n}\n\n.site-header {\n display: flex;\n min-height: $header-height;\n align-items: center;\n\n @include mq(md) {\n height: $header-height;\n max-height: $header-height;\n border-bottom: $border $border-color;\n }\n}\n\n.site-title {\n @include container;\n\n flex-grow: 1;\n display: flex;\n height: 100%;\n align-items: center;\n padding-top: $sp-3;\n padding-bottom: $sp-3;\n color: $body-heading-color;\n @include fs-6;\n\n @include mq(md) {\n padding-top: $sp-2;\n padding-bottom: $sp-2;\n }\n}\n\n@if variable-exists(logo) {\n .site-logo {\n width: 100%;\n height: 100%;\n background-image: url($logo);\n background-repeat: no-repeat;\n background-position: left center;\n background-size: contain;\n }\n}\n\n.site-button {\n display: flex;\n height: 100%;\n padding: $gutter-spacing-sm;\n align-items: center;\n}\n\n@include mq(md) {\n .site-header .site-button {\n display: none;\n }\n}\n\n.site-title:hover {\n background-image: linear-gradient(\n -90deg,\n rgba($feedback-color, 1) 0%,\n rgba($feedback-color, 0.8) 80%,\n rgba($feedback-color, 0) 100%\n );\n}\n\n.site-button:hover {\n background-image: linear-gradient(\n -90deg,\n rgba($feedback-color, 1) 0%,\n rgba($feedback-color, 0.8) 100%\n );\n}\n\n// stylelint-disable selector-max-type\n\nbody {\n position: relative;\n padding-bottom: $sp-10;\n overflow-y: scroll;\n\n @include mq(md) {\n position: static;\n padding-bottom: 0;\n }\n}\n\n// stylelint-enable selector-max-type\n\n.site-footer {\n @include container;\n\n position: absolute;\n bottom: 0;\n left: 0;\n padding-top: $sp-4;\n padding-bottom: $sp-4;\n color: $grey-dk-000;\n @include fs-2;\n\n @include mq(md) {\n position: static;\n justify-self: end;\n }\n}\n\n.icon {\n width: $sp-5;\n height: $sp-5;\n color: $link-color;\n}\n","@charset \"UTF-8\";\n\n// Styles for rendered markdown in the .main-content container\n// stylelint-disable selector-no-type, max-nesting-depth, selector-max-compound-selectors, selector-max-type, selector-max-specificity, selector-max-id\n\n.main-content {\n line-height: $content-line-height;\n\n ol,\n ul,\n dl,\n pre,\n address,\n blockquote,\n .table-wrapper {\n margin-top: 0.5em;\n }\n\n a {\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n ul,\n ol {\n padding-left: 1.5em;\n }\n\n li {\n .highlight {\n margin-top: $sp-1;\n }\n }\n\n ol {\n list-style-type: none;\n counter-reset: step-counter;\n\n > li {\n position: relative;\n\n &::before {\n position: absolute;\n top: 0.2em;\n left: -1.6em;\n color: $grey-dk-000;\n content: counter(step-counter);\n counter-increment: step-counter;\n @include fs-3;\n\n @include mq(sm) {\n top: 0.11em;\n }\n }\n\n ol {\n counter-reset: sub-counter;\n\n > li {\n &::before {\n content: counter(sub-counter, lower-alpha);\n counter-increment: sub-counter;\n }\n }\n }\n }\n }\n\n ul {\n list-style: none;\n\n > li {\n &::before {\n position: absolute;\n margin-left: -1.4em;\n color: $grey-dk-000;\n content: \"•\";\n }\n }\n }\n\n .task-list-item {\n &::before {\n content: \"\";\n }\n }\n\n .task-list-item-checkbox {\n margin-right: 0.6em;\n margin-left: -1.4em;\n\n // The same margin-left is used above for ul > li::before\n }\n\n hr + * {\n margin-top: 0;\n }\n\n h1:first-of-type {\n margin-top: 0.5em;\n }\n\n dl {\n display: grid;\n grid-template: auto / 10em 1fr;\n }\n\n dt,\n dd {\n margin: 0.25em 0;\n }\n\n dt {\n grid-column: 1;\n font-weight: 500;\n text-align: right;\n\n &::after {\n content: \":\";\n }\n }\n\n dd {\n grid-column: 2;\n margin-bottom: 0;\n margin-left: 1em;\n\n blockquote,\n div,\n dl,\n dt,\n h1,\n h2,\n h3,\n h4,\n h5,\n h6,\n li,\n ol,\n p,\n pre,\n table,\n ul,\n .table-wrapper {\n &:first-child {\n margin-top: 0;\n }\n }\n }\n\n dd,\n ol,\n ul {\n dl:first-child {\n dt:first-child,\n dd:nth-child(2) {\n margin-top: 0;\n }\n }\n }\n\n .anchor-heading {\n position: absolute;\n right: -$sp-4;\n width: $sp-5;\n height: 100%;\n padding-right: $sp-1;\n padding-left: $sp-1;\n overflow: visible;\n\n @include mq(md) {\n right: auto;\n left: -$sp-5;\n }\n\n svg {\n display: inline-block;\n width: 100%;\n height: 100%;\n color: $link-color;\n visibility: hidden;\n }\n }\n\n .anchor-heading:hover,\n .anchor-heading:focus,\n h1:hover > .anchor-heading,\n h2:hover > .anchor-heading,\n h3:hover > .anchor-heading,\n h4:hover > .anchor-heading,\n h5:hover > .anchor-heading,\n h6:hover > .anchor-heading {\n svg {\n visibility: visible;\n }\n }\n\n summary {\n cursor: pointer;\n }\n\n h1,\n h2,\n h3,\n h4,\n h5,\n h6,\n #toctitle {\n position: relative;\n margin-top: 1.5em;\n margin-bottom: 0.25em;\n\n + table,\n + .table-wrapper,\n + .code-example,\n + .highlighter-rouge,\n + .sectionbody .listingblock {\n margin-top: 1em;\n }\n\n + p:not(.label) {\n margin-top: 0;\n }\n }\n\n > h1:first-child,\n > h2:first-child,\n > h3:first-child,\n > h4:first-child,\n > h5:first-child,\n > h6:first-child,\n > .sect1:first-child > h2,\n > .sect2:first-child > h3,\n > .sect3:first-child > h4,\n > .sect4:first-child > h5,\n > .sect5:first-child > h6 {\n margin-top: $sp-2;\n }\n}\n","// Main nav, breadcrumb, etc...\n// stylelint-disable selector-no-type, max-nesting-depth, selector-max-compound-selectors, selector-max-type, selector-max-specificity\n\n.nav-list {\n padding: 0;\n margin-top: 0;\n margin-bottom: 0;\n list-style: none;\n\n .nav-list-item {\n @include fs-4;\n\n position: relative;\n margin: 0;\n\n @include mq(md) {\n @include fs-3;\n }\n\n .nav-list-link {\n display: block;\n min-height: $nav-list-item-height-sm;\n padding-top: $sp-1;\n padding-bottom: $sp-1;\n line-height: #{$nav-list-item-height-sm - 2 * $sp-1};\n @if $nav-list-expander-right {\n padding-right: $nav-list-item-height-sm;\n padding-left: $gutter-spacing-sm;\n } @else {\n padding-right: $gutter-spacing-sm;\n padding-left: $nav-list-item-height-sm;\n }\n\n @include mq(md) {\n min-height: $nav-list-item-height;\n line-height: #{$nav-list-item-height - 2 * $sp-1};\n @if $nav-list-expander-right {\n padding-right: $nav-list-item-height;\n padding-left: $gutter-spacing;\n } @else {\n padding-right: $gutter-spacing;\n padding-left: $nav-list-item-height;\n }\n }\n\n &.external > svg {\n width: $sp-4;\n height: $sp-4;\n vertical-align: text-bottom;\n }\n\n &.active {\n font-weight: 600;\n text-decoration: none;\n }\n\n &:hover,\n &.active {\n background-image: linear-gradient(\n -90deg,\n rgba($feedback-color, 1) 0%,\n rgba($feedback-color, 0.8) 80%,\n rgba($feedback-color, 0) 100%\n );\n }\n }\n\n .nav-list-expander {\n position: absolute;\n @if $nav-list-expander-right {\n right: 0;\n }\n\n width: $nav-list-item-height-sm;\n height: $nav-list-item-height-sm;\n padding: #{$nav-list-item-height-sm * 0.25};\n color: $link-color;\n\n @include mq(md) {\n width: $nav-list-item-height;\n height: $nav-list-item-height;\n padding: #{$nav-list-item-height * 0.25};\n }\n\n &:hover {\n background-image: linear-gradient(\n -90deg,\n rgba($feedback-color, 1) 0%,\n rgba($feedback-color, 0.8) 100%\n );\n }\n\n @if $nav-list-expander-right {\n svg {\n transform: rotate(90deg);\n }\n }\n }\n\n > .nav-list {\n display: none;\n padding-left: $sp-3;\n list-style: none;\n\n .nav-list-item {\n position: relative;\n\n .nav-list-link {\n color: $nav-child-link-color;\n }\n\n .nav-list-expander {\n color: $nav-child-link-color;\n }\n }\n }\n\n &.active {\n > .nav-list-expander svg {\n @if $nav-list-expander-right {\n transform: rotate(-90deg);\n } @else {\n transform: rotate(90deg);\n }\n }\n\n > .nav-list {\n display: block;\n }\n }\n }\n}\n\n.nav-category {\n padding: $sp-2 $gutter-spacing-sm;\n font-weight: 600;\n text-align: start;\n text-transform: uppercase;\n border-bottom: $border $border-color;\n @include fs-2;\n\n @include mq(md) {\n padding: $sp-2 $gutter-spacing;\n margin-top: $gutter-spacing-sm;\n text-align: start;\n\n &:first-child {\n margin-top: 0;\n }\n }\n}\n\n.nav-list.nav-category-list {\n > .nav-list-item {\n margin: 0;\n\n > .nav-list {\n padding: 0;\n\n > .nav-list-item {\n > .nav-list-link {\n color: $link-color;\n }\n\n > .nav-list-expander {\n color: $link-color;\n }\n }\n }\n }\n}\n\n// Aux nav\n\n.aux-nav {\n height: 100%;\n overflow-x: auto;\n @include fs-2;\n\n .aux-nav-list {\n display: flex;\n height: 100%;\n padding: 0;\n margin: 0;\n list-style: none;\n }\n\n .aux-nav-list-item {\n display: inline-block;\n height: 100%;\n padding: 0;\n margin: 0;\n }\n\n @include mq(md) {\n padding-right: $gutter-spacing-sm;\n }\n}\n\n// Breadcrumb nav\n\n.breadcrumb-nav {\n @include mq(md) {\n margin-top: -$sp-4;\n }\n}\n\n.breadcrumb-nav-list {\n padding-left: 0;\n margin-bottom: $sp-3;\n list-style: none;\n}\n\n.breadcrumb-nav-list-item {\n display: table-cell;\n @include fs-2;\n\n &::before {\n display: none;\n }\n\n &::after {\n display: inline-block;\n margin-right: $sp-2;\n margin-left: $sp-2;\n color: $grey-dk-000;\n content: \"/\";\n }\n\n &:last-child {\n &::after {\n content: \"\";\n }\n }\n}\n","// Typography\n// stylelint-disable selector-no-type, selector-max-type, selector-max-specificity, selector-max-id\n\nh1,\n.text-alpha {\n @include fs-8;\n\n font-weight: 300;\n}\n\nh2,\n.text-beta,\n#toctitle {\n @include fs-6;\n}\n\nh3,\n.text-gamma {\n @include fs-5;\n}\n\nh4,\n.text-delta {\n @include fs-2;\n\n font-weight: 400;\n text-transform: uppercase;\n letter-spacing: 0.1em;\n}\n\nh4 code {\n text-transform: none;\n}\n\nh5,\n.text-epsilon {\n @include fs-3;\n}\n\nh6,\n.text-zeta {\n @include fs-2;\n}\n\n.text-small {\n @include fs-2;\n}\n\n.text-mono {\n font-family: $mono-font-family !important;\n}\n\n.text-left {\n text-align: left !important;\n}\n\n.text-center {\n text-align: center !important;\n}\n\n.text-right {\n text-align: right !important;\n}\n","// Labels (not the form kind)\n\n// this :not() prevents a style clash with Mermaid.js's\n// diagram labels, which also use .label\n// for more, see https://github.com/just-the-docs/just-the-docs/issues/1272\n// and the accompanying PR\n.label:not(g),\n.label-blue:not(g) {\n display: inline-block;\n padding: 0.16em 0.56em;\n margin-right: $sp-2;\n margin-left: $sp-2;\n color: $white;\n text-transform: uppercase;\n vertical-align: middle;\n background-color: $blue-100;\n @include fs-2;\n\n border-radius: 12px;\n}\n\n.label-green:not(g) {\n background-color: $green-200;\n}\n\n.label-purple:not(g) {\n background-color: $purple-100;\n}\n\n.label-red:not(g) {\n background-color: $red-200;\n}\n\n.label-yellow:not(g) {\n color: $grey-dk-200;\n background-color: $yellow-200;\n}\n","// Buttons and things that look like buttons\n// stylelint-disable color-named\n\n.btn {\n display: inline-block;\n box-sizing: border-box;\n padding: 0.3em 1em;\n margin: 0;\n font-family: inherit;\n font-size: inherit;\n font-weight: 500;\n line-height: 1.5;\n color: $link-color;\n text-decoration: none;\n vertical-align: baseline;\n cursor: pointer;\n background-color: $base-button-color;\n border-width: 0;\n border-radius: $border-radius;\n box-shadow:\n 0 1px 2px rgba(0, 0, 0, 0.12),\n 0 3px 10px rgba(0, 0, 0, 0.08);\n appearance: none;\n\n &:focus {\n text-decoration: none;\n outline: none;\n box-shadow: 0 0 0 3px rgba(blue, 0.25);\n }\n\n &:focus:hover,\n &.selected:focus {\n box-shadow: 0 0 0 3px rgba(blue, 0.25);\n }\n\n &:hover,\n &.zeroclipboard-is-hover {\n color: darken($link-color, 2%);\n }\n\n &:hover,\n &:active,\n &.zeroclipboard-is-hover,\n &.zeroclipboard-is-active {\n text-decoration: none;\n background-color: darken($base-button-color, 1%);\n }\n\n &:active,\n &.selected,\n &.zeroclipboard-is-active {\n background-color: darken($base-button-color, 3%);\n background-image: none;\n box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15);\n }\n\n &.selected:hover {\n background-color: darken(#dcdcdc, 5%);\n }\n\n &:disabled,\n &.disabled {\n &,\n &:hover {\n color: rgba(102, 102, 102, 0.5);\n cursor: default;\n background-color: rgba(229, 229, 229, 0.5);\n background-image: none;\n box-shadow: none;\n }\n }\n}\n\n.btn-outline {\n color: $link-color;\n background: transparent;\n box-shadow: inset 0 0 0 2px $grey-lt-300;\n\n &:hover,\n &:active,\n &.zeroclipboard-is-hover,\n &.zeroclipboard-is-active {\n color: darken($link-color, 4%);\n text-decoration: none;\n background-color: transparent;\n box-shadow: inset 0 0 0 3px $grey-lt-300;\n }\n\n &:focus {\n text-decoration: none;\n outline: none;\n box-shadow:\n inset 0 0 0 2px $grey-dk-100,\n 0 0 0 3px rgba(blue, 0.25);\n }\n\n &:focus:hover,\n &.selected:focus {\n box-shadow: inset 0 0 0 2px $grey-dk-100;\n }\n}\n\n.btn-primary {\n @include btn-color($white, $btn-primary-color);\n}\n\n.btn-purple {\n @include btn-color($white, $purple-100);\n}\n\n.btn-blue {\n @include btn-color($white, $blue-000);\n}\n\n.btn-green {\n @include btn-color($white, $green-100);\n}\n\n.btn-reset {\n background: none;\n border: none;\n margin: 0;\n text-align: inherit;\n font: inherit;\n border-radius: 0;\n appearance: none;\n}\n","// Colored button\n\n@mixin btn-color($fg, $bg) {\n color: $fg;\n background-color: darken($bg, 2%);\n background-image: linear-gradient(lighten($bg, 5%), darken($bg, 2%));\n box-shadow:\n 0 1px 3px rgba(0, 0, 0, 0.25),\n 0 4px 10px rgba(0, 0, 0, 0.12);\n\n &:hover,\n &.zeroclipboard-is-hover {\n color: $fg;\n background-color: darken($bg, 4%);\n background-image: linear-gradient((lighten($bg, 2%), darken($bg, 4%)));\n }\n\n &:active,\n &.selected,\n &.zeroclipboard-is-active {\n background-color: darken($bg, 5%);\n background-image: none;\n box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15);\n }\n\n &.selected:hover {\n background-color: darken($bg, 10%);\n }\n}\n","// Search input and autocomplete\n\n.search {\n position: relative;\n z-index: 2;\n flex-grow: 1;\n height: $sp-10;\n padding: $sp-2;\n transition: padding linear #{$transition-duration * 0.5};\n\n @include mq(md) {\n position: relative !important;\n width: auto !important;\n height: 100% !important;\n padding: 0;\n transition: none;\n }\n}\n\n.search-input-wrap {\n position: relative;\n z-index: 1;\n height: $sp-8;\n overflow: hidden;\n border-radius: $border-radius;\n box-shadow:\n 0 1px 2px rgba(0, 0, 0, 0.12),\n 0 3px 10px rgba(0, 0, 0, 0.08);\n transition: height linear #{$transition-duration * 0.5};\n\n @include mq(md) {\n position: absolute;\n width: 100%;\n max-width: $search-results-width;\n height: 100% !important;\n border-radius: 0;\n box-shadow: none;\n transition: width ease $transition-duration;\n }\n}\n\n.search-input {\n position: absolute;\n width: 100%;\n height: 100%;\n padding: $sp-2 $gutter-spacing-sm $sp-2 #{$gutter-spacing-sm + $sp-5};\n font-size: 1rem;\n color: $body-text-color;\n background-color: $search-background-color;\n border-top: 0;\n border-right: 0;\n border-bottom: 0;\n border-left: 0;\n border-radius: 0;\n\n @include mq(md) {\n padding: $sp-2 $gutter-spacing-sm $sp-2 #{$gutter-spacing + $sp-5};\n font-size: 0.875rem;\n background-color: $body-background-color;\n transition: padding-left linear #{$transition-duration * 0.5};\n }\n\n &:focus {\n outline: 0;\n\n + .search-label .search-icon {\n color: $link-color;\n }\n }\n}\n\n.search-label {\n position: absolute;\n display: flex;\n height: 100%;\n padding-left: $gutter-spacing-sm;\n\n @include mq(md) {\n padding-left: $gutter-spacing;\n transition: padding-left linear #{$transition-duration * 0.5};\n }\n\n .search-icon {\n width: #{$sp-4 * 1.2};\n height: #{$sp-4 * 1.2};\n align-self: center;\n color: $grey-dk-000;\n }\n}\n\n.search-results {\n position: absolute;\n left: 0;\n display: none;\n width: 100%;\n max-height: calc(100% - #{$sp-10});\n overflow-y: auto;\n background-color: $search-background-color;\n border-bottom-right-radius: $border-radius;\n border-bottom-left-radius: $border-radius;\n box-shadow:\n 0 1px 2px rgba(0, 0, 0, 0.12),\n 0 3px 10px rgba(0, 0, 0, 0.08);\n\n @include mq(md) {\n top: 100%;\n width: $search-results-width;\n max-height: calc(100vh - 200%) !important;\n }\n}\n\n.search-results-list {\n padding-left: 0;\n margin-bottom: $sp-1;\n list-style: none;\n @include fs-4;\n\n @include mq(md) {\n @include fs-3;\n }\n}\n\n.search-results-list-item {\n padding: 0;\n margin: 0;\n}\n\n.search-result {\n display: block;\n padding: $sp-1 $sp-3;\n\n &:hover,\n &.active {\n background-color: $feedback-color;\n }\n}\n\n.search-result-title {\n display: block;\n padding-top: $sp-2;\n padding-bottom: $sp-2;\n\n @include mq(sm) {\n display: inline-block;\n width: 40%;\n padding-right: $sp-2;\n vertical-align: top;\n }\n}\n\n.search-result-doc {\n display: flex;\n align-items: center;\n word-wrap: break-word;\n\n &.search-result-doc-parent {\n opacity: 0.5;\n @include fs-3;\n\n @include mq(md) {\n @include fs-2;\n }\n }\n\n .search-result-icon {\n width: $sp-4;\n height: $sp-4;\n margin-right: $sp-2;\n color: $link-color;\n flex-shrink: 0;\n }\n\n .search-result-doc-title {\n overflow: auto;\n }\n}\n\n.search-result-section {\n margin-left: #{$sp-4 + $sp-2};\n word-wrap: break-word;\n}\n\n.search-result-rel-url {\n display: block;\n margin-left: #{$sp-4 + $sp-2};\n overflow: hidden;\n color: $search-result-preview-color;\n text-overflow: ellipsis;\n white-space: nowrap;\n @include fs-1;\n}\n\n.search-result-previews {\n display: block;\n padding-top: $sp-2;\n padding-bottom: $sp-2;\n padding-left: $sp-4;\n margin-left: $sp-2;\n color: $search-result-preview-color;\n word-wrap: break-word;\n border-left: $border;\n border-left-color: $border-color;\n @include fs-2;\n\n @include mq(sm) {\n display: inline-block;\n width: 60%;\n padding-left: $sp-2;\n margin-left: 0;\n vertical-align: top;\n }\n}\n\n.search-result-preview + .search-result-preview {\n margin-top: $sp-1;\n}\n\n.search-result-highlight {\n font-weight: bold;\n}\n\n.search-no-result {\n padding: $sp-2 $sp-3;\n @include fs-3;\n}\n\n.search-button {\n position: fixed;\n right: $sp-4;\n bottom: $sp-4;\n display: flex;\n width: $sp-9;\n height: $sp-9;\n background-color: $search-background-color;\n border: 1px solid rgba($link-color, 0.3);\n border-radius: #{$sp-9 * 0.5};\n box-shadow:\n 0 1px 2px rgba(0, 0, 0, 0.12),\n 0 3px 10px rgba(0, 0, 0, 0.08);\n align-items: center;\n justify-content: center;\n}\n\n.search-overlay {\n position: fixed;\n top: 0;\n left: 0;\n z-index: 1;\n width: 0;\n height: 0;\n background-color: rgba(0, 0, 0, 0.3);\n opacity: 0;\n transition:\n opacity ease $transition-duration,\n width 0s $transition-duration,\n height 0s $transition-duration;\n}\n\n.search-active {\n .search {\n position: fixed;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n padding: 0;\n }\n\n .search-input-wrap {\n height: $sp-10;\n border-radius: 0;\n\n @include mq(md) {\n width: $search-results-width;\n box-shadow:\n 0 1px 2px rgba(0, 0, 0, 0.12),\n 0 3px 10px rgba(0, 0, 0, 0.08);\n }\n }\n\n .search-input {\n background-color: $search-background-color;\n\n @include mq(md) {\n padding-left: 2.3rem;\n }\n }\n\n .search-label {\n @include mq(md) {\n padding-left: 0.6rem;\n }\n }\n\n .search-results {\n display: block;\n }\n\n .search-overlay {\n width: 100%;\n height: 100%;\n opacity: 1;\n transition:\n opacity ease $transition-duration,\n width 0s,\n height 0s;\n }\n\n @include mq(md) {\n .main {\n position: fixed;\n right: 0;\n left: 0;\n }\n }\n\n .main-header {\n padding-top: $sp-10;\n\n @include mq(md) {\n padding-top: 0;\n }\n }\n}\n","// Tables\n// stylelint-disable max-nesting-depth, selector-no-type, selector-max-type\n\n.table-wrapper {\n display: block;\n width: 100%;\n max-width: 100%;\n margin-bottom: $sp-5;\n overflow-x: auto;\n border-radius: $border-radius;\n box-shadow:\n 0 1px 2px rgba(0, 0, 0, 0.12),\n 0 3px 10px rgba(0, 0, 0, 0.08);\n}\n\ntable {\n display: table;\n min-width: 100%;\n border-collapse: separate;\n}\n\nth,\ntd {\n @include fs-3;\n\n min-width: 7.5rem;\n padding: $sp-2 $sp-3;\n background-color: $table-background-color;\n border-bottom: $border rgba($border-color, 0.5);\n border-left: $border $border-color;\n\n &:first-of-type {\n border-left: 0;\n }\n}\n\ntbody {\n tr {\n &:last-of-type {\n th,\n td {\n border-bottom: 0;\n }\n\n td {\n padding-bottom: $sp-3;\n }\n }\n }\n}\n\nthead {\n th {\n border-bottom: $border $border-color;\n }\n}\n","// Code and syntax highlighting\n// stylelint-disable selector-no-qualifying-type, declaration-block-semicolon-newline-after,declaration-block-single-line-max-declarations, selector-no-type, selector-max-type, scss/comment-no-empty\n\n// {% raw %}\n\n// This instruction applies to all queues not within 'pre' or 'figure', avoiding 'code' generated by the highlight.\n:not(pre, figure) {\n & > code {\n padding: 0.2em 0.15em;\n font-weight: 400;\n background-color: $code-background-color;\n border: $border $border-color;\n border-radius: $border-radius;\n }\n}\n\n// Avoid appearance of dark border around visited code links in Safari\na:visited code {\n border-color: $border-color;\n}\n\n// Content structure for highlighted code blocks using fences or Liquid\n//\n// ```[LANG]...```, no kramdown line_numbers:\n// div.[language-LANG.]highlighter-rouge > div.highlight > pre.highlight > code\n//\n// ```[LANG]...```, kramdown line_numbers = true:\n// div.[language-LANG.]highlighter-rouge > div.highlight > pre.highlight > code\n// > div.table-wrapper > table.rouge-table > tbody > tr\n// > td.rouge-gutter.gl > pre.lineno\n// | td.rouge-code > pre\n//\n// {% highlight LANG %}...{% endhighlight %}:\n// figure.highlight > pre > code.language-LANG\n//\n// {% highlight LANG linenos %}...{% endhighlight %}:\n// figure.highlight > pre > code.language-LANG\n// > div.table-wrapper > table.rouge-table > tbody > tr\n// > td.gutter.gl > pre.lineno\n// | td.code > pre\n//\n// ----...---- (AsciiDoc)\n// div.listingblock > div.content > pre.rouge.highlight\n//\n// fix_linenos removes the outermost pre when it encloses table.rouge-table\n//\n// See docs/index-test.md for some tests.\n//\n// No kramdown line_numbers: fences and Liquid highlighting look the same.\n// Kramdown line_numbers = true: fences have a wider gutter than with Liquid?\n\n// ```[LANG]...```\n// or in AsciiDoc:\n//\n// ----\n// ...\n// ----\n\n// the code may appear with 3 different types:\n// container \\ case: default case, code with line number, code with html rendering\n// top level: div.highlighter-rouge, figure.highlight, figure.highlight\n// second level: div.highlight, div.table-wrapper, pre.highlight\n// third level: pre.highlight, td.code, absent\n// last level: code, pre, code (optionality)\n// highlighter level: span, span, span\n// the spacing are only in the second level for case 1, 3 and in the third level for case 2\n// in AsciiDoc, there is a parent container that contains optionally a title and the content.\n\n// select top level container\ndiv.highlighter-rouge,\ndiv.listingblock > div.content,\nfigure.highlight {\n margin-top: 0;\n margin-bottom: $sp-3;\n background-color: $code-background-color;\n border-radius: $border-radius;\n box-shadow: none;\n -webkit-overflow-scrolling: touch;\n position: relative;\n padding: 0;\n\n // copy button (or other button)\n // the button appear only when there is a hover on the code or focus on button\n > button {\n width: $sp-3;\n opacity: 0;\n position: absolute;\n top: 0;\n right: 0;\n border: $sp-3 solid $code-background-color;\n background-color: $code-background-color;\n color: $body-text-color;\n box-sizing: content-box;\n\n svg {\n fill: $body-text-color;\n }\n\n &:active {\n text-decoration: none;\n outline: none;\n opacity: 1;\n }\n\n &:focus {\n opacity: 1;\n }\n }\n\n // the button can be seen by doing a simple hover in the code, there is no need to go over the location of the button\n &:hover {\n > button {\n cursor: copy;\n opacity: 1;\n }\n }\n}\n\n// setting the spacing and scrollbar on the second level for the first case\n// remove all space on the second and third level\n// this is a mixin to accommodate for the slightly different structures generated via Markdown vs AsciiDoc\n@mixin scroll-and-spacing($code-div, $pre-select) {\n #{$code-div} {\n overflow-x: auto;\n padding: $sp-3;\n margin: 0;\n border: 0;\n }\n\n #{$pre-select},\n code {\n padding: 0;\n margin: 0;\n border: 0;\n }\n}\n\n// for Markdown\ndiv.highlighter-rouge {\n @include scroll-and-spacing(\"div.highlight\", \"pre.highlight\");\n}\n\n// for AsciiDoc. we also need to fix the margins for its parent container.\ndiv.listingblock {\n @include scroll-and-spacing(\"div.content\", \"div.content > pre\");\n\n margin-top: 0;\n margin-bottom: $sp-3;\n}\n\n// {% highlight LANG %}...{% endhighlight %},\n// {% highlight LANG linenos %}...{% endhighlight %}:\n\n// setting the spacing and scrollbar on the second level for the thirt case\n// the css rule are apply only to the last code enviroment\n// setting the scroolbar\nfigure.highlight {\n pre,\n :not(pre) > code {\n overflow-x: auto;\n padding: $sp-3;\n margin: 0;\n border: 0;\n }\n}\n\n// ```[LANG]...```, kramdown line_numbers = true,\n// {% highlight LANG linenos %}...{% endhighlight %}:\n\n// setting the spacing and scrollbar on the thirt level for the second case\n.highlight .table-wrapper {\n padding: $sp-3 0;\n margin: 0;\n border: 0;\n box-shadow: none;\n\n td,\n pre {\n @include fs-2;\n\n min-width: 0;\n padding: 0;\n background-color: $code-background-color;\n border: 0;\n }\n\n td.gl {\n width: 1em;\n padding-right: $sp-3;\n padding-left: $sp-3;\n }\n\n pre {\n margin: 0;\n line-height: 2;\n }\n}\n\n// Code examples: html render of a code\n.code-example,\n.listingblock > .title {\n padding: $sp-3;\n margin-bottom: $sp-3;\n overflow: auto;\n border: 1px solid $border-color;\n border-radius: $border-radius;\n\n + .highlighter-rouge,\n + .sectionbody .listingblock,\n + .content,\n + figure.highlight {\n position: relative;\n margin-top: -$sp-4;\n border-right: 1px solid $border-color;\n border-bottom: 1px solid $border-color;\n border-left: 1px solid $border-color;\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n }\n}\n\n// Mermaid diagram code blocks should be left unstyled.\ncode.language-mermaid {\n padding: 0;\n background-color: inherit;\n border: 0;\n}\n\n// Override OneDarkJekyll Colors for Code Blocks\n.highlight,\npre.highlight {\n background: $code-background-color; // Code Background\n // For Backwards Compatibility Before $code-linenumber-color was added\n @if variable-exists(code-linenumber-color) {\n color: $code-linenumber-color; // Code Line Numbers\n } @else {\n color: $body-text-color; // Code Line Numbers\n }\n}\n\n// Override OneDarkJekyll Colors for Code Blocks\n.highlight pre {\n background: $code-background-color; // Code Background\n}\n\n// {% endraw %}\n","// Utility classes for colors\n\n// Text colors\n\n.text-grey-dk-000 {\n color: $grey-dk-000 !important;\n}\n\n.text-grey-dk-100 {\n color: $grey-dk-100 !important;\n}\n\n.text-grey-dk-200 {\n color: $grey-dk-200 !important;\n}\n\n.text-grey-dk-250 {\n color: $grey-dk-250 !important;\n}\n\n.text-grey-dk-300 {\n color: $grey-dk-300 !important;\n}\n\n.text-grey-lt-000 {\n color: $grey-lt-000 !important;\n}\n\n.text-grey-lt-100 {\n color: $grey-lt-100 !important;\n}\n\n.text-grey-lt-200 {\n color: $grey-lt-200 !important;\n}\n\n.text-grey-lt-300 {\n color: $grey-lt-300 !important;\n}\n\n.text-blue-000 {\n color: $blue-000 !important;\n}\n\n.text-blue-100 {\n color: $blue-100 !important;\n}\n\n.text-blue-200 {\n color: $blue-200 !important;\n}\n\n.text-blue-300 {\n color: $blue-300 !important;\n}\n\n.text-green-000 {\n color: $green-000 !important;\n}\n\n.text-green-100 {\n color: $green-100 !important;\n}\n\n.text-green-200 {\n color: $green-200 !important;\n}\n\n.text-green-300 {\n color: $green-300 !important;\n}\n\n.text-purple-000 {\n color: $purple-000 !important;\n}\n\n.text-purple-100 {\n color: $purple-100 !important;\n}\n\n.text-purple-200 {\n color: $purple-200 !important;\n}\n\n.text-purple-300 {\n color: $purple-300 !important;\n}\n\n.text-yellow-000 {\n color: $yellow-000 !important;\n}\n\n.text-yellow-100 {\n color: $yellow-100 !important;\n}\n\n.text-yellow-200 {\n color: $yellow-200 !important;\n}\n\n.text-yellow-300 {\n color: $yellow-300 !important;\n}\n\n.text-red-000 {\n color: $red-000 !important;\n}\n\n.text-red-100 {\n color: $red-100 !important;\n}\n\n.text-red-200 {\n color: $red-200 !important;\n}\n\n.text-red-300 {\n color: $red-300 !important;\n}\n\n// Background colors\n\n.bg-grey-dk-000 {\n background-color: $grey-dk-000 !important;\n}\n\n.bg-grey-dk-100 {\n background-color: $grey-dk-100 !important;\n}\n\n.bg-grey-dk-200 {\n background-color: $grey-dk-200 !important;\n}\n\n.bg-grey-dk-250 {\n background-color: $grey-dk-250 !important;\n}\n\n.bg-grey-dk-300 {\n background-color: $grey-dk-300 !important;\n}\n\n.bg-grey-lt-000 {\n background-color: $grey-lt-000 !important;\n}\n\n.bg-grey-lt-100 {\n background-color: $grey-lt-100 !important;\n}\n\n.bg-grey-lt-200 {\n background-color: $grey-lt-200 !important;\n}\n\n.bg-grey-lt-300 {\n background-color: $grey-lt-300 !important;\n}\n\n.bg-blue-000 {\n background-color: $blue-000 !important;\n}\n\n.bg-blue-100 {\n background-color: $blue-100 !important;\n}\n\n.bg-blue-200 {\n background-color: $blue-200 !important;\n}\n\n.bg-blue-300 {\n background-color: $blue-300 !important;\n}\n\n.bg-green-000 {\n background-color: $green-000 !important;\n}\n\n.bg-green-100 {\n background-color: $green-100 !important;\n}\n\n.bg-green-200 {\n background-color: $green-200 !important;\n}\n\n.bg-green-300 {\n background-color: $green-300 !important;\n}\n\n.bg-purple-000 {\n background-color: $purple-000 !important;\n}\n\n.bg-purple-100 {\n background-color: $purple-100 !important;\n}\n\n.bg-purple-200 {\n background-color: $purple-200 !important;\n}\n\n.bg-purple-300 {\n background-color: $purple-300 !important;\n}\n\n.bg-yellow-000 {\n background-color: $yellow-000 !important;\n}\n\n.bg-yellow-100 {\n background-color: $yellow-100 !important;\n}\n\n.bg-yellow-200 {\n background-color: $yellow-200 !important;\n}\n\n.bg-yellow-300 {\n background-color: $yellow-300 !important;\n}\n\n.bg-red-000 {\n background-color: $red-000 !important;\n}\n\n.bg-red-100 {\n background-color: $red-100 !important;\n}\n\n.bg-red-200 {\n background-color: $red-200 !important;\n}\n\n.bg-red-300 {\n background-color: $red-300 !important;\n}\n","// Utility classes for layout\n\n// Display\n\n.d-block {\n display: block !important;\n}\n\n.d-flex {\n display: flex !important;\n}\n\n.d-inline {\n display: inline !important;\n}\n\n.d-inline-block {\n display: inline-block !important;\n}\n\n.d-none {\n display: none !important;\n}\n\n@each $media-query in map-keys($media-queries) {\n @for $i from 1 through length($spacers) {\n @include mq($media-query) {\n $size: #{map-get($spacers, sp-#{$i - 1})};\n $scale: #{$i - 1};\n\n // .d-sm-block, .d-md-none, .d-lg-inline\n .d-#{$media-query}-block {\n display: block !important;\n }\n .d-#{$media-query}-flex {\n display: flex !important;\n }\n .d-#{$media-query}-inline {\n display: inline !important;\n }\n .d-#{$media-query}-inline-block {\n display: inline-block !important;\n }\n .d-#{$media-query}-none {\n display: none !important;\n }\n }\n }\n}\n\n// Horizontal alignment\n\n.float-left {\n float: left !important;\n}\n\n.float-right {\n float: right !important;\n}\n\n.flex-justify-start {\n justify-content: flex-start !important;\n}\n\n.flex-justify-end {\n justify-content: flex-end !important;\n}\n\n.flex-justify-between {\n justify-content: space-between !important;\n}\n\n.flex-justify-around {\n justify-content: space-around !important;\n}\n\n// Vertical alignment\n\n.v-align-baseline {\n vertical-align: baseline !important;\n}\n\n.v-align-bottom {\n vertical-align: bottom !important;\n}\n\n.v-align-middle {\n vertical-align: middle !important;\n}\n\n.v-align-text-bottom {\n vertical-align: text-bottom !important;\n}\n\n.v-align-text-top {\n vertical-align: text-top !important;\n}\n\n.v-align-top {\n vertical-align: top !important;\n}\n","// Utility classes for typography\n\n.fs-1 {\n @include fs-1;\n}\n\n.fs-2 {\n @include fs-2;\n}\n\n.fs-3 {\n @include fs-3;\n}\n\n.fs-4 {\n @include fs-4;\n}\n\n.fs-5 {\n @include fs-5;\n}\n\n.fs-6 {\n @include fs-6;\n}\n\n.fs-7 {\n @include fs-7;\n}\n\n.fs-8 {\n @include fs-8;\n}\n\n.fs-9 {\n @include fs-9;\n}\n\n.fs-10 {\n @include fs-10;\n}\n\n.fw-300 {\n font-weight: 300 !important;\n}\n\n.fw-400 {\n font-weight: 400 !important;\n}\n\n.fw-500 {\n font-weight: 500 !important;\n}\n\n.fw-700 {\n font-weight: 700 !important;\n}\n\n.lh-0 {\n line-height: 0 !important;\n}\n\n.lh-default {\n line-height: $body-line-height;\n}\n\n.lh-tight {\n line-height: $body-heading-line-height;\n}\n\n.ls-5 {\n letter-spacing: 0.05em !important;\n}\n\n.ls-10 {\n letter-spacing: 0.1em !important;\n}\n\n.ls-0 {\n letter-spacing: 0 !important;\n}\n\n.text-uppercase {\n text-transform: uppercase !important;\n}\n","// Utility classes for lists\n\n// stylelint-disable selector-max-type\n\n.list-style-none {\n padding: 0 !important;\n margin: 0 !important;\n list-style: none !important;\n\n li {\n &::before {\n display: none !important;\n }\n }\n}\n","// Utility classes for margins and padding\n\n// stylelint-disable block-opening-brace-space-after, block-opening-brace-space-before\n\n// Margin spacer utilities\n\n.mx-auto {\n margin-right: auto !important;\n margin-left: auto !important;\n}\n\n@for $i from 1 through length($spacers) {\n $size: #{map-get($spacers, sp-#{$i - 1})};\n $scale: #{$i - 1};\n\n // .m-0, .m-1, .m-2...\n .m-#{$scale} {\n margin: #{$size} !important;\n }\n .mt-#{$scale} {\n margin-top: #{$size} !important;\n }\n .mr-#{$scale} {\n margin-right: #{$size} !important;\n }\n .mb-#{$scale} {\n margin-bottom: #{$size} !important;\n }\n .ml-#{$scale} {\n margin-left: #{$size} !important;\n }\n\n .mx-#{$scale} {\n margin-right: #{$size} !important;\n margin-left: #{$size} !important;\n }\n\n .my-#{$scale} {\n margin-top: #{$size} !important;\n margin-bottom: #{$size} !important;\n }\n\n .mxn-#{$scale} {\n margin-right: -#{$size} !important;\n margin-left: -#{$size} !important;\n }\n .mx-#{$scale}-auto {\n margin-right: auto !important;\n margin-left: auto !important;\n }\n}\n\n@each $media-query in map-keys($media-queries) {\n @for $i from 1 through length($spacers) {\n @include mq($media-query) {\n $size: #{map-get($spacers, sp-#{$i - 1})};\n $scale: #{$i - 1};\n\n // .m-sm-0, .m-md-1, .m-lg-2...\n .m-#{$media-query}-#{$scale} {\n margin: #{$size} !important;\n }\n .mt-#{$media-query}-#{$scale} {\n margin-top: #{$size} !important;\n }\n .mr-#{$media-query}-#{$scale} {\n margin-right: #{$size} !important;\n }\n .mb-#{$media-query}-#{$scale} {\n margin-bottom: #{$size} !important;\n }\n .ml-#{$media-query}-#{$scale} {\n margin-left: #{$size} !important;\n }\n\n .mx-#{$media-query}-#{$scale} {\n margin-right: #{$size} !important;\n margin-left: #{$size} !important;\n }\n\n .my-#{$media-query}-#{$scale} {\n margin-top: #{$size} !important;\n margin-bottom: #{$size} !important;\n }\n\n .mxn-#{$media-query}-#{$scale} {\n margin-right: -#{$size} !important;\n margin-left: -#{$size} !important;\n }\n }\n }\n}\n\n// Padding spacer utilities\n\n@for $i from 1 through length($spacers) {\n $size: #{map-get($spacers, sp-#{$i - 1})};\n $scale: #{$i - 1};\n\n // .p-0, .p-1, .p-2...\n .p-#{$scale} {\n padding: #{$size} !important;\n }\n .pt-#{$scale} {\n padding-top: #{$size} !important;\n }\n .pr-#{$scale} {\n padding-right: #{$size} !important;\n }\n .pb-#{$scale} {\n padding-bottom: #{$size} !important;\n }\n .pl-#{$scale} {\n padding-left: #{$size} !important;\n }\n\n .px-#{$scale} {\n padding-right: #{$size} !important;\n padding-left: #{$size} !important;\n }\n\n .py-#{$scale} {\n padding-top: #{$size} !important;\n padding-bottom: #{$size} !important;\n }\n}\n\n@each $media-query in map-keys($media-queries) {\n @include mq($media-query) {\n @for $i from 1 through length($spacers) {\n $size: #{map-get($spacers, sp-#{$i - 1})};\n $scale: #{$i - 1};\n\n // .p-sm-0, .p-md-1, .p-lg-2...\n .p-#{$media-query}-#{$scale} {\n padding: #{$size} !important;\n }\n .pt-#{$media-query}-#{$scale} {\n padding-top: #{$size} !important;\n }\n .pr-#{$media-query}-#{$scale} {\n padding-right: #{$size} !important;\n }\n .pb-#{$media-query}-#{$scale} {\n padding-bottom: #{$size} !important;\n }\n .pl-#{$media-query}-#{$scale} {\n padding-left: #{$size} !important;\n }\n\n .px-#{$media-query}-#{$scale} {\n padding-right: #{$size} !important;\n padding-left: #{$size} !important;\n }\n\n .py-#{$media-query}-#{$scale} {\n padding-top: #{$size} !important;\n padding-bottom: #{$size} !important;\n }\n }\n }\n}\n","// stylelint-disable selector-max-specificity, selector-max-id, selector-max-type, selector-no-qualifying-type\n\n@media print {\n .site-footer,\n .site-button,\n #edit-this-page,\n #back-to-top,\n .site-nav,\n .main-header {\n display: none !important;\n }\n\n .side-bar {\n width: 100%;\n height: auto;\n border-right: 0 !important;\n }\n\n .site-header {\n border-bottom: 1px solid $border-color;\n }\n\n .site-title {\n font-size: 1rem !important;\n font-weight: 700 !important;\n }\n\n .text-small {\n font-size: 8pt !important;\n }\n\n pre.highlight {\n border: 1px solid $border-color;\n }\n\n .main {\n max-width: none;\n margin-left: 0;\n }\n}\n","// Skipnav\n// Skip to main content\n\na.skip-to-main {\n left: -999px;\n position: absolute;\n top: auto;\n width: 1px;\n height: 1px;\n overflow: hidden;\n z-index: -999;\n}\n\na.skip-to-main:focus,\na.skip-to-main:active {\n color: $link-color;\n background-color: $body-background-color;\n left: auto;\n top: auto;\n width: 30%;\n height: auto;\n overflow: auto;\n margin: 10px 35%;\n padding: 5px;\n border-radius: 15px;\n border: 4px solid $btn-primary-color;\n text-align: center;\n font-size: 1.2em;\n z-index: 999;\n}\n","\n@import \"./support/support\";\n@import \"./custom/setup\";\n@import \"./color_schemes/light\";\n\n@import \"./color_schemes/dark\";\n\n@import \"./modules\";\ndiv.opaque {\n background-color: $body-background-color;\n}\n@import \"./custom/custom\";\n\n\n"],"file":"just-the-docs-dark.css"} \ No newline at end of file diff --git a/docs/_site/assets/css/just-the-docs-default.css b/docs/_site/assets/css/just-the-docs-default.css new file mode 100644 index 00000000..6fd3863d --- /dev/null +++ b/docs/_site/assets/css/just-the-docs-default.css @@ -0,0 +1,7293 @@ +@charset "UTF-8"; +.highlight, +pre.highlight { + background: #f9f9f9; + color: #383942; +} + +.highlight pre { + background: #f9f9f9; +} + +.highlight .hll { + background: #f9f9f9; +} + +.highlight .c { + color: #9fa0a6; + font-style: italic; +} + +.highlight .err { + color: #fff; + background-color: #e05151; +} + +.highlight .k { + color: #a625a4; +} + +.highlight .l { + color: #50a04f; +} + +.highlight .n { + color: #383942; +} + +.highlight .o { + color: #383942; +} + +.highlight .p { + color: #383942; +} + +.highlight .cm { + color: #9fa0a6; + font-style: italic; +} + +.highlight .cp { + color: #9fa0a6; + font-style: italic; +} + +.highlight .c1 { + color: #9fa0a6; + font-style: italic; +} + +.highlight .cs { + color: #9fa0a6; + font-style: italic; +} + +.highlight .ge { + font-style: italic; +} + +.highlight .gs { + font-weight: 700; +} + +.highlight .kc { + color: #a625a4; +} + +.highlight .kd { + color: #a625a4; +} + +.highlight .kn { + color: #a625a4; +} + +.highlight .kp { + color: #a625a4; +} + +.highlight .kr { + color: #a625a4; +} + +.highlight .kt { + color: #a625a4; +} + +.highlight .ld { + color: #50a04f; +} + +.highlight .m { + color: #b66a00; +} + +.highlight .s { + color: #50a04f; +} + +.highlight .na { + color: #b66a00; +} + +.highlight .nb { + color: #ca7601; +} + +.highlight .nc { + color: #ca7601; +} + +.highlight .no { + color: #ca7601; +} + +.highlight .nd { + color: #ca7601; +} + +.highlight .ni { + color: #ca7601; +} + +.highlight .ne { + color: #ca7601; +} + +.highlight .nf { + color: #383942; +} + +.highlight .nl { + color: #ca7601; +} + +.highlight .nn { + color: #383942; +} + +.highlight .nx { + color: #383942; +} + +.highlight .py { + color: #ca7601; +} + +.highlight .nt { + color: #e35549; +} + +.highlight .nv { + color: #ca7601; +} + +.highlight .ow { + font-weight: 700; +} + +.highlight .w { + color: #f8f8f2; +} + +.highlight .mf { + color: #b66a00; +} + +.highlight .mh { + color: #b66a00; +} + +.highlight .mi { + color: #b66a00; +} + +.highlight .mo { + color: #b66a00; +} + +.highlight .sb { + color: #50a04f; +} + +.highlight .sc { + color: #50a04f; +} + +.highlight .sd { + color: #50a04f; +} + +.highlight .s2 { + color: #50a04f; +} + +.highlight .se { + color: #50a04f; +} + +.highlight .sh { + color: #50a04f; +} + +.highlight .si { + color: #50a04f; +} + +.highlight .sx { + color: #50a04f; +} + +.highlight .sr { + color: #0083bb; +} + +.highlight .s1 { + color: #50a04f; +} + +.highlight .ss { + color: #0083bb; +} + +.highlight .bp { + color: #ca7601; +} + +.highlight .vc { + color: #ca7601; +} + +.highlight .vg { + color: #ca7601; +} + +.highlight .vi { + color: #e35549; +} + +.highlight .il { + color: #b66a00; +} + +.highlight .gu { + color: #75715e; +} + +.highlight .gd { + color: #e05151; +} + +.highlight .gi { + color: #43d089; +} + +.highlight .language-json .w + .s2 { + color: #e35549; +} + +.highlight .language-json .kc { + color: #0083bb; +} + +/*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */ +/* Document + ========================================================================== */ +/** + * 1. Correct the line height in all browsers. + * 2. Prevent adjustments of font size after orientation changes in iOS. + */ +html { + line-height: 1.15; /* 1 */ + -webkit-text-size-adjust: 100%; /* 2 */ +} + +/* Sections + ========================================================================== */ +/** + * Remove the margin in all browsers. + */ +body { + margin: 0; +} + +/** + * Render the `main` element consistently in IE. + */ +main { + display: block; +} + +/** + * Correct the font size and margin on `h1` elements within `section` and + * `article` contexts in Chrome, Firefox, and Safari. + */ +h1 { + font-size: 2em; + margin: 0.67em 0; +} + +/* Grouping content + ========================================================================== */ +/** + * 1. Add the correct box sizing in Firefox. + * 2. Show the overflow in Edge and IE. + */ +hr { + box-sizing: content-box; /* 1 */ + height: 0; /* 1 */ + overflow: visible; /* 2 */ +} + +/** + * 1. Correct the inheritance and scaling of font size in all browsers. + * 2. Correct the odd `em` font sizing in all browsers. + */ +pre { + font-family: monospace, monospace; /* 1 */ + font-size: 1em; /* 2 */ +} + +/* Text-level semantics + ========================================================================== */ +/** + * Remove the gray background on active links in IE 10. + */ +a { + background-color: transparent; +} + +/** + * 1. Remove the bottom border in Chrome 57- + * 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari. + */ +abbr[title] { + border-bottom: none; /* 1 */ + text-decoration: underline; /* 2 */ + text-decoration: underline dotted; /* 2 */ +} + +/** + * Add the correct font weight in Chrome, Edge, and Safari. + */ +b, +strong { + font-weight: bolder; +} + +/** + * 1. Correct the inheritance and scaling of font size in all browsers. + * 2. Correct the odd `em` font sizing in all browsers. + */ +code, +kbd, +samp { + font-family: monospace, monospace; /* 1 */ + font-size: 1em; /* 2 */ +} + +/** + * Add the correct font size in all browsers. + */ +small { + font-size: 80%; +} + +/** + * Prevent `sub` and `sup` elements from affecting the line height in + * all browsers. + */ +sub, +sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; +} + +sub { + bottom: -0.25em; +} + +sup { + top: -0.5em; +} + +/* Embedded content + ========================================================================== */ +/** + * Remove the border on images inside links in IE 10. + */ +img { + border-style: none; +} + +/* Forms + ========================================================================== */ +/** + * 1. Change the font styles in all browsers. + * 2. Remove the margin in Firefox and Safari. + */ +button, +input, +optgroup, +select, +textarea { + font-family: inherit; /* 1 */ + font-size: 100%; /* 1 */ + line-height: 1.15; /* 1 */ + margin: 0; /* 2 */ +} + +/** + * Show the overflow in IE. + * 1. Show the overflow in Edge. + */ +button, +input { + /* 1 */ + overflow: visible; +} + +/** + * Remove the inheritance of text transform in Edge, Firefox, and IE. + * 1. Remove the inheritance of text transform in Firefox. + */ +button, +select { + /* 1 */ + text-transform: none; +} + +/** + * Correct the inability to style clickable types in iOS and Safari. + */ +button, +[type=button], +[type=reset], +[type=submit] { + -webkit-appearance: button; +} + +/** + * Remove the inner border and padding in Firefox. + */ +button::-moz-focus-inner, +[type=button]::-moz-focus-inner, +[type=reset]::-moz-focus-inner, +[type=submit]::-moz-focus-inner { + border-style: none; + padding: 0; +} + +/** + * Restore the focus styles unset by the previous rule. + */ +button:-moz-focusring, +[type=button]:-moz-focusring, +[type=reset]:-moz-focusring, +[type=submit]:-moz-focusring { + outline: 1px dotted ButtonText; +} + +/** + * Correct the padding in Firefox. + */ +fieldset { + padding: 0.35em 0.75em 0.625em; +} + +/** + * 1. Correct the text wrapping in Edge and IE. + * 2. Correct the color inheritance from `fieldset` elements in IE. + * 3. Remove the padding so developers are not caught out when they zero out + * `fieldset` elements in all browsers. + */ +legend { + box-sizing: border-box; /* 1 */ + color: inherit; /* 2 */ + display: table; /* 1 */ + max-width: 100%; /* 1 */ + padding: 0; /* 3 */ + white-space: normal; /* 1 */ +} + +/** + * Add the correct vertical alignment in Chrome, Firefox, and Opera. + */ +progress { + vertical-align: baseline; +} + +/** + * Remove the default vertical scrollbar in IE 10+. + */ +textarea { + overflow: auto; +} + +/** + * 1. Add the correct box sizing in IE 10. + * 2. Remove the padding in IE 10. + */ +[type=checkbox], +[type=radio] { + box-sizing: border-box; /* 1 */ + padding: 0; /* 2 */ +} + +/** + * Correct the cursor style of increment and decrement buttons in Chrome. + */ +[type=number]::-webkit-inner-spin-button, +[type=number]::-webkit-outer-spin-button { + height: auto; +} + +/** + * 1. Correct the odd appearance in Chrome and Safari. + * 2. Correct the outline style in Safari. + */ +[type=search] { + -webkit-appearance: textfield; /* 1 */ + outline-offset: -2px; /* 2 */ +} + +/** + * Remove the inner padding in Chrome and Safari on macOS. + */ +[type=search]::-webkit-search-decoration { + -webkit-appearance: none; +} + +/** + * 1. Correct the inability to style clickable types in iOS and Safari. + * 2. Change font properties to `inherit` in Safari. + */ +::-webkit-file-upload-button { + -webkit-appearance: button; /* 1 */ + font: inherit; /* 2 */ +} + +/* Interactive + ========================================================================== */ +/* + * Add the correct display in Edge, IE 10+, and Firefox. + */ +details { + display: block; +} + +/* + * Add the correct display in all browsers. + */ +summary { + display: list-item; +} + +/* Misc + ========================================================================== */ +/** + * Add the correct display in IE 10+. + */ +template { + display: none; +} + +/** + * Add the correct display in IE 10. + */ +[hidden] { + display: none; +} + +:root { + color-scheme: light; +} + +* { + box-sizing: border-box; +} + +html { + font-size: 0.875rem !important; + scroll-behavior: smooth; +} +@media (min-width: 31.25rem) { + html { + font-size: 1rem !important; + } +} + +body { + font-family: system-ui, -apple-system, blinkmacsystemfont, "Segoe UI", roboto, "Helvetica Neue", arial, sans-serif, "Segoe UI Emoji"; + font-size: inherit; + line-height: 1.4; + color: #5c5962; + background-color: #fff; + overflow-wrap: break-word; +} + +ol, +ul, +dl, +pre, +address, +blockquote, +table, +div, +hr, +form, +fieldset, +noscript .table-wrapper { + margin-top: 0; +} + +h1, +h2, +h3, +h4, +h5, +h6, +#toctitle { + margin-top: 0; + margin-bottom: 1em; + font-weight: 500; + line-height: 1.25; + color: #27262b; +} + +p { + margin-top: 1em; + margin-bottom: 1em; +} + +a { + color: #7253ed; + text-decoration: none; +} + +a:not([class]) { + text-decoration: underline; + text-decoration-color: #eeebee; + text-underline-offset: 2px; +} +a:not([class]):hover { + text-decoration-color: rgba(114, 83, 237, 0.45); +} + +code { + font-family: "SFMono-Regular", menlo, consolas, monospace; + font-size: 0.75em; + line-height: 1.4; +} + +figure, +pre { + margin: 0; +} + +li { + margin: 0.25em 0; +} + +img { + max-width: 100%; + height: auto; +} + +hr { + height: 1px; + padding: 0; + margin: 2rem 0; + background-color: #eeebee; + border: 0; +} + +blockquote { + margin: 10px 0; + margin-block-start: 0; + margin-inline-start: 0; + padding-left: 1rem; + border-left: 3px solid #eeebee; +} + +.side-bar { + z-index: 0; + display: flex; + flex-wrap: wrap; + background-color: #f5f6fa; +} +@media (min-width: 50rem) { + .side-bar { + flex-flow: column nowrap; + position: fixed; + width: 15.5rem; + height: 100%; + border-right: 1px solid #eeebee; + align-items: flex-end; + } +} +@media (min-width: 66.5rem) { + .side-bar { + width: calc((100% - 66.5rem) / 2 + 16.5rem); + min-width: 16.5rem; + } +} + +@media (min-width: 50rem) { + .main { + position: relative; + max-width: 50rem; + margin-left: 15.5rem; + } +} +@media (min-width: 66.5rem) { + .main { + margin-left: max(16.5rem, (100% - 66.5rem) / 2 + 16.5rem); + } +} + +.main-content-wrap { + padding-right: 1rem; + padding-left: 1rem; + padding-top: 1rem; + padding-bottom: 1rem; +} +@media (min-width: 50rem) { + .main-content-wrap { + padding-right: 2rem; + padding-left: 2rem; + } +} +@media (min-width: 50rem) { + .main-content-wrap { + padding-top: 2rem; + padding-bottom: 2rem; + } +} + +.main-header { + z-index: 0; + display: none; + background-color: #f5f6fa; +} +@media (min-width: 50rem) { + .main-header { + display: flex; + justify-content: space-between; + height: 3.75rem; + background-color: #fff; + border-bottom: 1px solid #eeebee; + } +} +.main-header.nav-open { + display: block; +} +@media (min-width: 50rem) { + .main-header.nav-open { + display: flex; + } +} + +.site-nav, +.site-header, +.site-footer { + width: 100%; +} +@media (min-width: 66.5rem) { + .site-nav, + .site-header, + .site-footer { + width: 16.5rem; + } +} + +.site-nav { + display: none; +} +.site-nav.nav-open { + display: block; +} +@media (min-width: 50rem) { + .site-nav { + display: block; + padding-top: 3rem; + padding-bottom: 1rem; + overflow-y: auto; + flex: 1 1 auto; + } +} + +.site-header { + display: flex; + min-height: 3.75rem; + align-items: center; +} +@media (min-width: 50rem) { + .site-header { + height: 3.75rem; + max-height: 3.75rem; + border-bottom: 1px solid #eeebee; + } +} + +.site-title { + padding-right: 1rem; + padding-left: 1rem; + flex-grow: 1; + display: flex; + height: 100%; + align-items: center; + padding-top: 0.75rem; + padding-bottom: 0.75rem; + color: #27262b; + font-size: 1.125rem !important; +} +@media (min-width: 50rem) { + .site-title { + padding-right: 2rem; + padding-left: 2rem; + } +} +@media (min-width: 31.25rem) { + .site-title { + font-size: 1.5rem !important; + line-height: 1.25; + } +} +@media (min-width: 50rem) { + .site-title { + padding-top: 0.5rem; + padding-bottom: 0.5rem; + } +} + +.site-button { + display: flex; + height: 100%; + padding: 1rem; + align-items: center; +} + +@media (min-width: 50rem) { + .site-header .site-button { + display: none; + } +} +.site-title:hover { + background-image: linear-gradient(-90deg, #ebedf5 0%, rgba(235, 237, 245, 0.8) 80%, rgba(235, 237, 245, 0) 100%); +} + +.site-button:hover { + background-image: linear-gradient(-90deg, #ebedf5 0%, rgba(235, 237, 245, 0.8) 100%); +} + +body { + position: relative; + padding-bottom: 4rem; + overflow-y: scroll; +} +@media (min-width: 50rem) { + body { + position: static; + padding-bottom: 0; + } +} + +.site-footer { + padding-right: 1rem; + padding-left: 1rem; + position: absolute; + bottom: 0; + left: 0; + padding-top: 1rem; + padding-bottom: 1rem; + color: #959396; + font-size: 0.6875rem !important; +} +@media (min-width: 50rem) { + .site-footer { + padding-right: 2rem; + padding-left: 2rem; + } +} +@media (min-width: 31.25rem) { + .site-footer { + font-size: 0.75rem !important; + } +} +@media (min-width: 50rem) { + .site-footer { + position: static; + justify-self: end; + } +} + +.icon { + width: 1.5rem; + height: 1.5rem; + color: #7253ed; +} + +.main-content { + line-height: 1.6; +} +.main-content ol, +.main-content ul, +.main-content dl, +.main-content pre, +.main-content address, +.main-content blockquote, +.main-content .table-wrapper { + margin-top: 0.5em; +} +.main-content a { + overflow: hidden; + text-overflow: ellipsis; +} +.main-content ul, +.main-content ol { + padding-left: 1.5em; +} +.main-content li .highlight { + margin-top: 0.25rem; +} +.main-content ol { + list-style-type: none; + counter-reset: step-counter; +} +.main-content ol > li { + position: relative; +} +.main-content ol > li::before { + position: absolute; + top: 0.2em; + left: -1.6em; + color: #959396; + content: counter(step-counter); + counter-increment: step-counter; + font-size: 0.75rem !important; +} +@media (min-width: 31.25rem) { + .main-content ol > li::before { + font-size: 0.875rem !important; + } +} +@media (min-width: 31.25rem) { + .main-content ol > li::before { + top: 0.11em; + } +} +.main-content ol > li ol { + counter-reset: sub-counter; +} +.main-content ol > li ol > li::before { + content: counter(sub-counter, lower-alpha); + counter-increment: sub-counter; +} +.main-content ul { + list-style: none; +} +.main-content ul > li::before { + position: absolute; + margin-left: -1.4em; + color: #959396; + content: "•"; +} +.main-content .task-list-item::before { + content: ""; +} +.main-content .task-list-item-checkbox { + margin-right: 0.6em; + margin-left: -1.4em; +} +.main-content hr + * { + margin-top: 0; +} +.main-content h1:first-of-type { + margin-top: 0.5em; +} +.main-content dl { + display: grid; + grid-template: auto/10em 1fr; +} +.main-content dt, +.main-content dd { + margin: 0.25em 0; +} +.main-content dt { + grid-column: 1; + font-weight: 500; + text-align: right; +} +.main-content dt::after { + content: ":"; +} +.main-content dd { + grid-column: 2; + margin-bottom: 0; + margin-left: 1em; +} +.main-content dd blockquote:first-child, +.main-content dd div:first-child, +.main-content dd dl:first-child, +.main-content dd dt:first-child, +.main-content dd h1:first-child, +.main-content dd h2:first-child, +.main-content dd h3:first-child, +.main-content dd h4:first-child, +.main-content dd h5:first-child, +.main-content dd h6:first-child, +.main-content dd li:first-child, +.main-content dd ol:first-child, +.main-content dd p:first-child, +.main-content dd pre:first-child, +.main-content dd table:first-child, +.main-content dd ul:first-child, +.main-content dd .table-wrapper:first-child { + margin-top: 0; +} +.main-content dd dl:first-child dt:first-child, +.main-content dd dl:first-child dd:nth-child(2), +.main-content ol dl:first-child dt:first-child, +.main-content ol dl:first-child dd:nth-child(2), +.main-content ul dl:first-child dt:first-child, +.main-content ul dl:first-child dd:nth-child(2) { + margin-top: 0; +} +.main-content .anchor-heading { + position: absolute; + right: -1rem; + width: 1.5rem; + height: 100%; + padding-right: 0.25rem; + padding-left: 0.25rem; + overflow: visible; +} +@media (min-width: 50rem) { + .main-content .anchor-heading { + right: auto; + left: -1.5rem; + } +} +.main-content .anchor-heading svg { + display: inline-block; + width: 100%; + height: 100%; + color: #7253ed; + visibility: hidden; +} +.main-content .anchor-heading:hover svg, +.main-content .anchor-heading:focus svg, +.main-content h1:hover > .anchor-heading svg, +.main-content h2:hover > .anchor-heading svg, +.main-content h3:hover > .anchor-heading svg, +.main-content h4:hover > .anchor-heading svg, +.main-content h5:hover > .anchor-heading svg, +.main-content h6:hover > .anchor-heading svg { + visibility: visible; +} +.main-content summary { + cursor: pointer; +} +.main-content h1, +.main-content h2, +.main-content h3, +.main-content h4, +.main-content h5, +.main-content h6, +.main-content #toctitle { + position: relative; + margin-top: 1.5em; + margin-bottom: 0.25em; +} +.main-content h1 + table, +.main-content h1 + .table-wrapper, +.main-content h1 + .code-example, +.main-content h1 + .highlighter-rouge, +.main-content h1 + .sectionbody .listingblock, +.main-content h2 + table, +.main-content h2 + .table-wrapper, +.main-content h2 + .code-example, +.main-content h2 + .highlighter-rouge, +.main-content h2 + .sectionbody .listingblock, +.main-content h3 + table, +.main-content h3 + .table-wrapper, +.main-content h3 + .code-example, +.main-content h3 + .highlighter-rouge, +.main-content h3 + .sectionbody .listingblock, +.main-content h4 + table, +.main-content h4 + .table-wrapper, +.main-content h4 + .code-example, +.main-content h4 + .highlighter-rouge, +.main-content h4 + .sectionbody .listingblock, +.main-content h5 + table, +.main-content h5 + .table-wrapper, +.main-content h5 + .code-example, +.main-content h5 + .highlighter-rouge, +.main-content h5 + .sectionbody .listingblock, +.main-content h6 + table, +.main-content h6 + .table-wrapper, +.main-content h6 + .code-example, +.main-content h6 + .highlighter-rouge, +.main-content h6 + .sectionbody .listingblock, +.main-content #toctitle + table, +.main-content #toctitle + .table-wrapper, +.main-content #toctitle + .code-example, +.main-content #toctitle + .highlighter-rouge, +.main-content #toctitle + .sectionbody .listingblock { + margin-top: 1em; +} +.main-content h1 + p:not(.label), +.main-content h2 + p:not(.label), +.main-content h3 + p:not(.label), +.main-content h4 + p:not(.label), +.main-content h5 + p:not(.label), +.main-content h6 + p:not(.label), +.main-content #toctitle + p:not(.label) { + margin-top: 0; +} +.main-content > h1:first-child, +.main-content > h2:first-child, +.main-content > h3:first-child, +.main-content > h4:first-child, +.main-content > h5:first-child, +.main-content > h6:first-child, +.main-content > .sect1:first-child > h2, +.main-content > .sect2:first-child > h3, +.main-content > .sect3:first-child > h4, +.main-content > .sect4:first-child > h5, +.main-content > .sect5:first-child > h6 { + margin-top: 0.5rem; +} + +.nav-list { + padding: 0; + margin-top: 0; + margin-bottom: 0; + list-style: none; +} +.nav-list .nav-list-item { + font-size: 0.875rem !important; + position: relative; + margin: 0; +} +@media (min-width: 31.25rem) { + .nav-list .nav-list-item { + font-size: 1rem !important; + } +} +@media (min-width: 50rem) { + .nav-list .nav-list-item { + font-size: 0.75rem !important; + } +} +@media (min-width: 50rem) and (min-width: 31.25rem) { + .nav-list .nav-list-item { + font-size: 0.875rem !important; + } +} +.nav-list .nav-list-item .nav-list-link { + display: block; + min-height: 3rem; + padding-top: 0.25rem; + padding-bottom: 0.25rem; + line-height: 2.5rem; + padding-right: 3rem; + padding-left: 1rem; +} +@media (min-width: 50rem) { + .nav-list .nav-list-item .nav-list-link { + min-height: 2rem; + line-height: 1.5rem; + padding-right: 2rem; + padding-left: 2rem; + } +} +.nav-list .nav-list-item .nav-list-link.external > svg { + width: 1rem; + height: 1rem; + vertical-align: text-bottom; +} +.nav-list .nav-list-item .nav-list-link.active { + font-weight: 600; + text-decoration: none; +} +.nav-list .nav-list-item .nav-list-link:hover, .nav-list .nav-list-item .nav-list-link.active { + background-image: linear-gradient(-90deg, #ebedf5 0%, rgba(235, 237, 245, 0.8) 80%, rgba(235, 237, 245, 0) 100%); +} +.nav-list .nav-list-item .nav-list-expander { + position: absolute; + right: 0; + width: 3rem; + height: 3rem; + padding: 0.75rem; + color: #7253ed; +} +@media (min-width: 50rem) { + .nav-list .nav-list-item .nav-list-expander { + width: 2rem; + height: 2rem; + padding: 0.5rem; + } +} +.nav-list .nav-list-item .nav-list-expander:hover { + background-image: linear-gradient(-90deg, #ebedf5 0%, rgba(235, 237, 245, 0.8) 100%); +} +.nav-list .nav-list-item .nav-list-expander svg { + transform: rotate(90deg); +} +.nav-list .nav-list-item > .nav-list { + display: none; + padding-left: 0.75rem; + list-style: none; +} +.nav-list .nav-list-item > .nav-list .nav-list-item { + position: relative; +} +.nav-list .nav-list-item > .nav-list .nav-list-item .nav-list-link { + color: #5c5962; +} +.nav-list .nav-list-item > .nav-list .nav-list-item .nav-list-expander { + color: #5c5962; +} +.nav-list .nav-list-item.active > .nav-list-expander svg { + transform: rotate(-90deg); +} +.nav-list .nav-list-item.active > .nav-list { + display: block; +} + +.nav-category { + padding: 0.5rem 1rem; + font-weight: 600; + text-align: start; + text-transform: uppercase; + border-bottom: 1px solid #eeebee; + font-size: 0.6875rem !important; +} +@media (min-width: 31.25rem) { + .nav-category { + font-size: 0.75rem !important; + } +} +@media (min-width: 50rem) { + .nav-category { + padding: 0.5rem 2rem; + margin-top: 1rem; + text-align: start; + } + .nav-category:first-child { + margin-top: 0; + } +} + +.nav-list.nav-category-list > .nav-list-item { + margin: 0; +} +.nav-list.nav-category-list > .nav-list-item > .nav-list { + padding: 0; +} +.nav-list.nav-category-list > .nav-list-item > .nav-list > .nav-list-item > .nav-list-link { + color: #7253ed; +} +.nav-list.nav-category-list > .nav-list-item > .nav-list > .nav-list-item > .nav-list-expander { + color: #7253ed; +} + +.aux-nav { + height: 100%; + overflow-x: auto; + font-size: 0.6875rem !important; +} +@media (min-width: 31.25rem) { + .aux-nav { + font-size: 0.75rem !important; + } +} +.aux-nav .aux-nav-list { + display: flex; + height: 100%; + padding: 0; + margin: 0; + list-style: none; +} +.aux-nav .aux-nav-list-item { + display: inline-block; + height: 100%; + padding: 0; + margin: 0; +} +@media (min-width: 50rem) { + .aux-nav { + padding-right: 1rem; + } +} + +@media (min-width: 50rem) { + .breadcrumb-nav { + margin-top: -1rem; + } +} + +.breadcrumb-nav-list { + padding-left: 0; + margin-bottom: 0.75rem; + list-style: none; +} + +.breadcrumb-nav-list-item { + display: table-cell; + font-size: 0.6875rem !important; +} +@media (min-width: 31.25rem) { + .breadcrumb-nav-list-item { + font-size: 0.75rem !important; + } +} +.breadcrumb-nav-list-item::before { + display: none; +} +.breadcrumb-nav-list-item::after { + display: inline-block; + margin-right: 0.5rem; + margin-left: 0.5rem; + color: #959396; + content: "/"; +} +.breadcrumb-nav-list-item:last-child::after { + content: ""; +} + +h1, +.text-alpha { + font-size: 2rem !important; + line-height: 1.25; + font-weight: 300; +} +@media (min-width: 31.25rem) { + h1, + .text-alpha { + font-size: 2.25rem !important; + } +} + +h2, +.text-beta, +#toctitle { + font-size: 1.125rem !important; +} +@media (min-width: 31.25rem) { + h2, + .text-beta, + #toctitle { + font-size: 1.5rem !important; + line-height: 1.25; + } +} + +h3, +.text-gamma { + font-size: 1rem !important; +} +@media (min-width: 31.25rem) { + h3, + .text-gamma { + font-size: 1.125rem !important; + } +} + +h4, +.text-delta { + font-size: 0.6875rem !important; + font-weight: 400; + text-transform: uppercase; + letter-spacing: 0.1em; +} +@media (min-width: 31.25rem) { + h4, + .text-delta { + font-size: 0.75rem !important; + } +} + +h4 code { + text-transform: none; +} + +h5, +.text-epsilon { + font-size: 0.75rem !important; +} +@media (min-width: 31.25rem) { + h5, + .text-epsilon { + font-size: 0.875rem !important; + } +} + +h6, +.text-zeta { + font-size: 0.6875rem !important; +} +@media (min-width: 31.25rem) { + h6, + .text-zeta { + font-size: 0.75rem !important; + } +} + +.text-small { + font-size: 0.6875rem !important; +} +@media (min-width: 31.25rem) { + .text-small { + font-size: 0.75rem !important; + } +} + +.text-mono { + font-family: "SFMono-Regular", menlo, consolas, monospace !important; +} + +.text-left { + text-align: left !important; +} + +.text-center { + text-align: center !important; +} + +.text-right { + text-align: right !important; +} + +.label:not(g), +.label-blue:not(g) { + display: inline-block; + padding: 0.16em 0.56em; + margin-right: 0.5rem; + margin-left: 0.5rem; + color: #fff; + text-transform: uppercase; + vertical-align: middle; + background-color: #2869e6; + font-size: 0.6875rem !important; + border-radius: 12px; +} +@media (min-width: 31.25rem) { + .label:not(g), + .label-blue:not(g) { + font-size: 0.75rem !important; + } +} + +.label-green:not(g) { + background-color: #009c7b; +} + +.label-purple:not(g) { + background-color: #5e41d0; +} + +.label-red:not(g) { + background-color: #e94c4c; +} + +.label-yellow:not(g) { + color: #44434d; + background-color: #f7d12e; +} + +.btn { + display: inline-block; + box-sizing: border-box; + padding: 0.3em 1em; + margin: 0; + font-family: inherit; + font-size: inherit; + font-weight: 500; + line-height: 1.5; + color: #7253ed; + text-decoration: none; + vertical-align: baseline; + cursor: pointer; + background-color: #f7f7f7; + border-width: 0; + border-radius: 4px; + box-shadow: 0 1px 2px rgba(0, 0, 0, 0.12), 0 3px 10px rgba(0, 0, 0, 0.08); + appearance: none; +} +.btn:focus { + text-decoration: none; + outline: none; + box-shadow: 0 0 0 3px rgba(0, 0, 255, 0.25); +} +.btn:focus:hover, .btn.selected:focus { + box-shadow: 0 0 0 3px rgba(0, 0, 255, 0.25); +} +.btn:hover, .btn.zeroclipboard-is-hover { + color: #6a4aec; +} +.btn:hover, .btn:active, .btn.zeroclipboard-is-hover, .btn.zeroclipboard-is-active { + text-decoration: none; + background-color: #f4f4f4; +} +.btn:active, .btn.selected, .btn.zeroclipboard-is-active { + background-color: #efefef; + background-image: none; + box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15); +} +.btn.selected:hover { + background-color: #cfcfcf; +} +.btn:disabled, .btn:disabled:hover, .btn.disabled, .btn.disabled:hover { + color: rgba(102, 102, 102, 0.5); + cursor: default; + background-color: rgba(229, 229, 229, 0.5); + background-image: none; + box-shadow: none; +} + +.btn-outline { + color: #7253ed; + background: transparent; + box-shadow: inset 0 0 0 2px #e6e1e8; +} +.btn-outline:hover, .btn-outline:active, .btn-outline.zeroclipboard-is-hover, .btn-outline.zeroclipboard-is-active { + color: #6341eb; + text-decoration: none; + background-color: transparent; + box-shadow: inset 0 0 0 3px #e6e1e8; +} +.btn-outline:focus { + text-decoration: none; + outline: none; + box-shadow: inset 0 0 0 2px #5c5962, 0 0 0 3px rgba(0, 0, 255, 0.25); +} +.btn-outline:focus:hover, .btn-outline.selected:focus { + box-shadow: inset 0 0 0 2px #5c5962; +} + +.btn-primary { + color: #fff; + background-color: #5739ce; + background-image: linear-gradient(#6f55d5, #5739ce); + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.25), 0 4px 10px rgba(0, 0, 0, 0.12); +} +.btn-primary:hover, .btn-primary.zeroclipboard-is-hover { + color: #fff; + background-color: #5132cb; + background-image: linear-gradient(#6549d2, #5132cb); +} +.btn-primary:active, .btn-primary.selected, .btn-primary.zeroclipboard-is-active { + background-color: #4f31c6; + background-image: none; + box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15); +} +.btn-primary.selected:hover { + background-color: #472cb2; +} + +.btn-purple { + color: #fff; + background-color: #5739ce; + background-image: linear-gradient(#6f55d5, #5739ce); + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.25), 0 4px 10px rgba(0, 0, 0, 0.12); +} +.btn-purple:hover, .btn-purple.zeroclipboard-is-hover { + color: #fff; + background-color: #5132cb; + background-image: linear-gradient(#6549d2, #5132cb); +} +.btn-purple:active, .btn-purple.selected, .btn-purple.zeroclipboard-is-active { + background-color: #4f31c6; + background-image: none; + box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15); +} +.btn-purple.selected:hover { + background-color: #472cb2; +} + +.btn-blue { + color: #fff; + background-color: #227efa; + background-image: linear-gradient(#4593fb, #227efa); + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.25), 0 4px 10px rgba(0, 0, 0, 0.12); +} +.btn-blue:hover, .btn-blue.zeroclipboard-is-hover { + color: #fff; + background-color: #1878fa; + background-image: linear-gradient(#368afa, #1878fa); +} +.btn-blue:active, .btn-blue.selected, .btn-blue.zeroclipboard-is-active { + background-color: #1375f9; + background-image: none; + box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15); +} +.btn-blue.selected:hover { + background-color: #0669ed; +} + +.btn-green { + color: #fff; + background-color: #10ac7d; + background-image: linear-gradient(#13cc95, #10ac7d); + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.25), 0 4px 10px rgba(0, 0, 0, 0.12); +} +.btn-green:hover, .btn-green.zeroclipboard-is-hover { + color: #fff; + background-color: #0fa276; + background-image: linear-gradient(#12be8b, #0fa276); +} +.btn-green:active, .btn-green.selected, .btn-green.zeroclipboard-is-active { + background-color: #0f9e73; + background-image: none; + box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15); +} +.btn-green.selected:hover { + background-color: #0d8662; +} + +.btn-reset { + background: none; + border: none; + margin: 0; + text-align: inherit; + font: inherit; + border-radius: 0; + appearance: none; +} + +.search { + position: relative; + z-index: 2; + flex-grow: 1; + height: 4rem; + padding: 0.5rem; + transition: padding linear 200ms; +} +@media (min-width: 50rem) { + .search { + position: relative !important; + width: auto !important; + height: 100% !important; + padding: 0; + transition: none; + } +} + +.search-input-wrap { + position: relative; + z-index: 1; + height: 3rem; + overflow: hidden; + border-radius: 4px; + box-shadow: 0 1px 2px rgba(0, 0, 0, 0.12), 0 3px 10px rgba(0, 0, 0, 0.08); + transition: height linear 200ms; +} +@media (min-width: 50rem) { + .search-input-wrap { + position: absolute; + width: 100%; + max-width: 33.5rem; + height: 100% !important; + border-radius: 0; + box-shadow: none; + transition: width ease 400ms; + } +} + +.search-input { + position: absolute; + width: 100%; + height: 100%; + padding: 0.5rem 1rem 0.5rem 2.5rem; + font-size: 1rem; + color: #5c5962; + background-color: #fff; + border-top: 0; + border-right: 0; + border-bottom: 0; + border-left: 0; + border-radius: 0; +} +@media (min-width: 50rem) { + .search-input { + padding: 0.5rem 1rem 0.5rem 3.5rem; + font-size: 0.875rem; + background-color: #fff; + transition: padding-left linear 200ms; + } +} +.search-input:focus { + outline: 0; +} +.search-input:focus + .search-label .search-icon { + color: #7253ed; +} + +.search-label { + position: absolute; + display: flex; + height: 100%; + padding-left: 1rem; +} +@media (min-width: 50rem) { + .search-label { + padding-left: 2rem; + transition: padding-left linear 200ms; + } +} +.search-label .search-icon { + width: 1.2rem; + height: 1.2rem; + align-self: center; + color: #959396; +} + +.search-results { + position: absolute; + left: 0; + display: none; + width: 100%; + max-height: calc(100% - 4rem); + overflow-y: auto; + background-color: #fff; + border-bottom-right-radius: 4px; + border-bottom-left-radius: 4px; + box-shadow: 0 1px 2px rgba(0, 0, 0, 0.12), 0 3px 10px rgba(0, 0, 0, 0.08); +} +@media (min-width: 50rem) { + .search-results { + top: 100%; + width: 33.5rem; + max-height: calc(100vh - 200%) !important; + } +} + +.search-results-list { + padding-left: 0; + margin-bottom: 0.25rem; + list-style: none; + font-size: 0.875rem !important; +} +@media (min-width: 31.25rem) { + .search-results-list { + font-size: 1rem !important; + } +} +@media (min-width: 50rem) { + .search-results-list { + font-size: 0.75rem !important; + } +} +@media (min-width: 50rem) and (min-width: 31.25rem) { + .search-results-list { + font-size: 0.875rem !important; + } +} + +.search-results-list-item { + padding: 0; + margin: 0; +} + +.search-result { + display: block; + padding: 0.25rem 0.75rem; +} +.search-result:hover, .search-result.active { + background-color: #ebedf5; +} + +.search-result-title { + display: block; + padding-top: 0.5rem; + padding-bottom: 0.5rem; +} +@media (min-width: 31.25rem) { + .search-result-title { + display: inline-block; + width: 40%; + padding-right: 0.5rem; + vertical-align: top; + } +} + +.search-result-doc { + display: flex; + align-items: center; + word-wrap: break-word; +} +.search-result-doc.search-result-doc-parent { + opacity: 0.5; + font-size: 0.75rem !important; +} +@media (min-width: 31.25rem) { + .search-result-doc.search-result-doc-parent { + font-size: 0.875rem !important; + } +} +@media (min-width: 50rem) { + .search-result-doc.search-result-doc-parent { + font-size: 0.6875rem !important; + } +} +@media (min-width: 50rem) and (min-width: 31.25rem) { + .search-result-doc.search-result-doc-parent { + font-size: 0.75rem !important; + } +} +.search-result-doc .search-result-icon { + width: 1rem; + height: 1rem; + margin-right: 0.5rem; + color: #7253ed; + flex-shrink: 0; +} +.search-result-doc .search-result-doc-title { + overflow: auto; +} + +.search-result-section { + margin-left: 1.5rem; + word-wrap: break-word; +} + +.search-result-rel-url { + display: block; + margin-left: 1.5rem; + overflow: hidden; + color: #959396; + text-overflow: ellipsis; + white-space: nowrap; + font-size: 0.5625rem !important; +} +@media (min-width: 31.25rem) { + .search-result-rel-url { + font-size: 0.625rem !important; + } +} + +.search-result-previews { + display: block; + padding-top: 0.5rem; + padding-bottom: 0.5rem; + padding-left: 1rem; + margin-left: 0.5rem; + color: #959396; + word-wrap: break-word; + border-left: 1px solid; + border-left-color: #eeebee; + font-size: 0.6875rem !important; +} +@media (min-width: 31.25rem) { + .search-result-previews { + font-size: 0.75rem !important; + } +} +@media (min-width: 31.25rem) { + .search-result-previews { + display: inline-block; + width: 60%; + padding-left: 0.5rem; + margin-left: 0; + vertical-align: top; + } +} + +.search-result-preview + .search-result-preview { + margin-top: 0.25rem; +} + +.search-result-highlight { + font-weight: bold; +} + +.search-no-result { + padding: 0.5rem 0.75rem; + font-size: 0.75rem !important; +} +@media (min-width: 31.25rem) { + .search-no-result { + font-size: 0.875rem !important; + } +} + +.search-button { + position: fixed; + right: 1rem; + bottom: 1rem; + display: flex; + width: 3.5rem; + height: 3.5rem; + background-color: #fff; + border: 1px solid rgba(114, 83, 237, 0.3); + border-radius: 1.75rem; + box-shadow: 0 1px 2px rgba(0, 0, 0, 0.12), 0 3px 10px rgba(0, 0, 0, 0.08); + align-items: center; + justify-content: center; +} + +.search-overlay { + position: fixed; + top: 0; + left: 0; + z-index: 1; + width: 0; + height: 0; + background-color: rgba(0, 0, 0, 0.3); + opacity: 0; + transition: opacity ease 400ms, width 0s 400ms, height 0s 400ms; +} + +.search-active .search { + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + padding: 0; +} +.search-active .search-input-wrap { + height: 4rem; + border-radius: 0; +} +@media (min-width: 50rem) { + .search-active .search-input-wrap { + width: 33.5rem; + box-shadow: 0 1px 2px rgba(0, 0, 0, 0.12), 0 3px 10px rgba(0, 0, 0, 0.08); + } +} +.search-active .search-input { + background-color: #fff; +} +@media (min-width: 50rem) { + .search-active .search-input { + padding-left: 2.3rem; + } +} +@media (min-width: 50rem) { + .search-active .search-label { + padding-left: 0.6rem; + } +} +.search-active .search-results { + display: block; +} +.search-active .search-overlay { + width: 100%; + height: 100%; + opacity: 1; + transition: opacity ease 400ms, width 0s, height 0s; +} +@media (min-width: 50rem) { + .search-active .main { + position: fixed; + right: 0; + left: 0; + } +} +.search-active .main-header { + padding-top: 4rem; +} +@media (min-width: 50rem) { + .search-active .main-header { + padding-top: 0; + } +} + +.table-wrapper { + display: block; + width: 100%; + max-width: 100%; + margin-bottom: 1.5rem; + overflow-x: auto; + border-radius: 4px; + box-shadow: 0 1px 2px rgba(0, 0, 0, 0.12), 0 3px 10px rgba(0, 0, 0, 0.08); +} + +table { + display: table; + min-width: 100%; + border-collapse: separate; +} + +th, +td { + font-size: 0.75rem !important; + min-width: 7.5rem; + padding: 0.5rem 0.75rem; + background-color: #fff; + border-bottom: 1px solid rgba(238, 235, 238, 0.5); + border-left: 1px solid #eeebee; +} +@media (min-width: 31.25rem) { + th, + td { + font-size: 0.875rem !important; + } +} +th:first-of-type, +td:first-of-type { + border-left: 0; +} + +tbody tr:last-of-type th, +tbody tr:last-of-type td { + border-bottom: 0; +} +tbody tr:last-of-type td { + padding-bottom: 0.75rem; +} + +thead th { + border-bottom: 1px solid #eeebee; +} + +:not(pre, figure) > code { + padding: 0.2em 0.15em; + font-weight: 400; + background-color: #f5f6fa; + border: 1px solid #eeebee; + border-radius: 4px; +} + +a:visited code { + border-color: #eeebee; +} + +div.highlighter-rouge, +div.listingblock > div.content, +figure.highlight { + margin-top: 0; + margin-bottom: 0.75rem; + background-color: #f5f6fa; + border-radius: 4px; + box-shadow: none; + -webkit-overflow-scrolling: touch; + position: relative; + padding: 0; +} +div.highlighter-rouge > button, +div.listingblock > div.content > button, +figure.highlight > button { + width: 0.75rem; + opacity: 0; + position: absolute; + top: 0; + right: 0; + border: 0.75rem solid #f5f6fa; + background-color: #f5f6fa; + color: #5c5962; + box-sizing: content-box; +} +div.highlighter-rouge > button svg, +div.listingblock > div.content > button svg, +figure.highlight > button svg { + fill: #5c5962; +} +div.highlighter-rouge > button:active, +div.listingblock > div.content > button:active, +figure.highlight > button:active { + text-decoration: none; + outline: none; + opacity: 1; +} +div.highlighter-rouge > button:focus, +div.listingblock > div.content > button:focus, +figure.highlight > button:focus { + opacity: 1; +} +div.highlighter-rouge:hover > button, +div.listingblock > div.content:hover > button, +figure.highlight:hover > button { + cursor: copy; + opacity: 1; +} + +div.highlighter-rouge div.highlight { + overflow-x: auto; + padding: 0.75rem; + margin: 0; + border: 0; +} +div.highlighter-rouge pre.highlight, +div.highlighter-rouge code { + padding: 0; + margin: 0; + border: 0; +} + +div.listingblock { + margin-top: 0; + margin-bottom: 0.75rem; +} +div.listingblock div.content { + overflow-x: auto; + padding: 0.75rem; + margin: 0; + border: 0; +} +div.listingblock div.content > pre, +div.listingblock code { + padding: 0; + margin: 0; + border: 0; +} + +figure.highlight pre, +figure.highlight :not(pre) > code { + overflow-x: auto; + padding: 0.75rem; + margin: 0; + border: 0; +} + +.highlight .table-wrapper { + padding: 0.75rem 0; + margin: 0; + border: 0; + box-shadow: none; +} +.highlight .table-wrapper td, +.highlight .table-wrapper pre { + font-size: 0.6875rem !important; + min-width: 0; + padding: 0; + background-color: #f5f6fa; + border: 0; +} +@media (min-width: 31.25rem) { + .highlight .table-wrapper td, + .highlight .table-wrapper pre { + font-size: 0.75rem !important; + } +} +.highlight .table-wrapper td.gl { + width: 1em; + padding-right: 0.75rem; + padding-left: 0.75rem; +} +.highlight .table-wrapper pre { + margin: 0; + line-height: 2; +} + +.code-example, +.listingblock > .title { + padding: 0.75rem; + margin-bottom: 0.75rem; + overflow: auto; + border: 1px solid #eeebee; + border-radius: 4px; +} +.code-example + .highlighter-rouge, +.code-example + .sectionbody .listingblock, +.code-example + .content, +.code-example + figure.highlight, +.listingblock > .title + .highlighter-rouge, +.listingblock > .title + .sectionbody .listingblock, +.listingblock > .title + .content, +.listingblock > .title + figure.highlight { + position: relative; + margin-top: -1rem; + border-right: 1px solid #eeebee; + border-bottom: 1px solid #eeebee; + border-left: 1px solid #eeebee; + border-top-left-radius: 0; + border-top-right-radius: 0; +} + +code.language-mermaid { + padding: 0; + background-color: inherit; + border: 0; +} + +.highlight, +pre.highlight { + background: #f5f6fa; + color: #5c5962; +} + +.highlight pre { + background: #f5f6fa; +} + +.text-grey-dk-000 { + color: #959396 !important; +} + +.text-grey-dk-100 { + color: #5c5962 !important; +} + +.text-grey-dk-200 { + color: #44434d !important; +} + +.text-grey-dk-250 { + color: #302d36 !important; +} + +.text-grey-dk-300 { + color: #27262b !important; +} + +.text-grey-lt-000 { + color: #f5f6fa !important; +} + +.text-grey-lt-100 { + color: #eeebee !important; +} + +.text-grey-lt-200 { + color: #ecebed !important; +} + +.text-grey-lt-300 { + color: #e6e1e8 !important; +} + +.text-blue-000 { + color: #2c84fa !important; +} + +.text-blue-100 { + color: #2869e6 !important; +} + +.text-blue-200 { + color: #264caf !important; +} + +.text-blue-300 { + color: #183385 !important; +} + +.text-green-000 { + color: #41d693 !important; +} + +.text-green-100 { + color: #11b584 !important; +} + +.text-green-200 { + color: #009c7b !important; +} + +.text-green-300 { + color: #026e57 !important; +} + +.text-purple-000 { + color: #7253ed !important; +} + +.text-purple-100 { + color: #5e41d0 !important; +} + +.text-purple-200 { + color: #4e26af !important; +} + +.text-purple-300 { + color: #381885 !important; +} + +.text-yellow-000 { + color: #ffeb82 !important; +} + +.text-yellow-100 { + color: #fadf50 !important; +} + +.text-yellow-200 { + color: #f7d12e !important; +} + +.text-yellow-300 { + color: #e7af06 !important; +} + +.text-red-000 { + color: #f77e7e !important; +} + +.text-red-100 { + color: #f96e65 !important; +} + +.text-red-200 { + color: #e94c4c !important; +} + +.text-red-300 { + color: #dd2e2e !important; +} + +.bg-grey-dk-000 { + background-color: #959396 !important; +} + +.bg-grey-dk-100 { + background-color: #5c5962 !important; +} + +.bg-grey-dk-200 { + background-color: #44434d !important; +} + +.bg-grey-dk-250 { + background-color: #302d36 !important; +} + +.bg-grey-dk-300 { + background-color: #27262b !important; +} + +.bg-grey-lt-000 { + background-color: #f5f6fa !important; +} + +.bg-grey-lt-100 { + background-color: #eeebee !important; +} + +.bg-grey-lt-200 { + background-color: #ecebed !important; +} + +.bg-grey-lt-300 { + background-color: #e6e1e8 !important; +} + +.bg-blue-000 { + background-color: #2c84fa !important; +} + +.bg-blue-100 { + background-color: #2869e6 !important; +} + +.bg-blue-200 { + background-color: #264caf !important; +} + +.bg-blue-300 { + background-color: #183385 !important; +} + +.bg-green-000 { + background-color: #41d693 !important; +} + +.bg-green-100 { + background-color: #11b584 !important; +} + +.bg-green-200 { + background-color: #009c7b !important; +} + +.bg-green-300 { + background-color: #026e57 !important; +} + +.bg-purple-000 { + background-color: #7253ed !important; +} + +.bg-purple-100 { + background-color: #5e41d0 !important; +} + +.bg-purple-200 { + background-color: #4e26af !important; +} + +.bg-purple-300 { + background-color: #381885 !important; +} + +.bg-yellow-000 { + background-color: #ffeb82 !important; +} + +.bg-yellow-100 { + background-color: #fadf50 !important; +} + +.bg-yellow-200 { + background-color: #f7d12e !important; +} + +.bg-yellow-300 { + background-color: #e7af06 !important; +} + +.bg-red-000 { + background-color: #f77e7e !important; +} + +.bg-red-100 { + background-color: #f96e65 !important; +} + +.bg-red-200 { + background-color: #e94c4c !important; +} + +.bg-red-300 { + background-color: #dd2e2e !important; +} + +.d-block { + display: block !important; +} + +.d-flex { + display: flex !important; +} + +.d-inline { + display: inline !important; +} + +.d-inline-block { + display: inline-block !important; +} + +.d-none { + display: none !important; +} + +@media (min-width: 20rem) { + .d-xs-block { + display: block !important; + } + .d-xs-flex { + display: flex !important; + } + .d-xs-inline { + display: inline !important; + } + .d-xs-inline-block { + display: inline-block !important; + } + .d-xs-none { + display: none !important; + } +} +@media (min-width: 20rem) { + .d-xs-block { + display: block !important; + } + .d-xs-flex { + display: flex !important; + } + .d-xs-inline { + display: inline !important; + } + .d-xs-inline-block { + display: inline-block !important; + } + .d-xs-none { + display: none !important; + } +} +@media (min-width: 20rem) { + .d-xs-block { + display: block !important; + } + .d-xs-flex { + display: flex !important; + } + .d-xs-inline { + display: inline !important; + } + .d-xs-inline-block { + display: inline-block !important; + } + .d-xs-none { + display: none !important; + } +} +@media (min-width: 20rem) { + .d-xs-block { + display: block !important; + } + .d-xs-flex { + display: flex !important; + } + .d-xs-inline { + display: inline !important; + } + .d-xs-inline-block { + display: inline-block !important; + } + .d-xs-none { + display: none !important; + } +} +@media (min-width: 20rem) { + .d-xs-block { + display: block !important; + } + .d-xs-flex { + display: flex !important; + } + .d-xs-inline { + display: inline !important; + } + .d-xs-inline-block { + display: inline-block !important; + } + .d-xs-none { + display: none !important; + } +} +@media (min-width: 20rem) { + .d-xs-block { + display: block !important; + } + .d-xs-flex { + display: flex !important; + } + .d-xs-inline { + display: inline !important; + } + .d-xs-inline-block { + display: inline-block !important; + } + .d-xs-none { + display: none !important; + } +} +@media (min-width: 20rem) { + .d-xs-block { + display: block !important; + } + .d-xs-flex { + display: flex !important; + } + .d-xs-inline { + display: inline !important; + } + .d-xs-inline-block { + display: inline-block !important; + } + .d-xs-none { + display: none !important; + } +} +@media (min-width: 20rem) { + .d-xs-block { + display: block !important; + } + .d-xs-flex { + display: flex !important; + } + .d-xs-inline { + display: inline !important; + } + .d-xs-inline-block { + display: inline-block !important; + } + .d-xs-none { + display: none !important; + } +} +@media (min-width: 20rem) { + .d-xs-block { + display: block !important; + } + .d-xs-flex { + display: flex !important; + } + .d-xs-inline { + display: inline !important; + } + .d-xs-inline-block { + display: inline-block !important; + } + .d-xs-none { + display: none !important; + } +} +@media (min-width: 20rem) { + .d-xs-block { + display: block !important; + } + .d-xs-flex { + display: flex !important; + } + .d-xs-inline { + display: inline !important; + } + .d-xs-inline-block { + display: inline-block !important; + } + .d-xs-none { + display: none !important; + } +} +@media (min-width: 20rem) { + .d-xs-block { + display: block !important; + } + .d-xs-flex { + display: flex !important; + } + .d-xs-inline { + display: inline !important; + } + .d-xs-inline-block { + display: inline-block !important; + } + .d-xs-none { + display: none !important; + } +} +@media (min-width: 31.25rem) { + .d-sm-block { + display: block !important; + } + .d-sm-flex { + display: flex !important; + } + .d-sm-inline { + display: inline !important; + } + .d-sm-inline-block { + display: inline-block !important; + } + .d-sm-none { + display: none !important; + } +} +@media (min-width: 31.25rem) { + .d-sm-block { + display: block !important; + } + .d-sm-flex { + display: flex !important; + } + .d-sm-inline { + display: inline !important; + } + .d-sm-inline-block { + display: inline-block !important; + } + .d-sm-none { + display: none !important; + } +} +@media (min-width: 31.25rem) { + .d-sm-block { + display: block !important; + } + .d-sm-flex { + display: flex !important; + } + .d-sm-inline { + display: inline !important; + } + .d-sm-inline-block { + display: inline-block !important; + } + .d-sm-none { + display: none !important; + } +} +@media (min-width: 31.25rem) { + .d-sm-block { + display: block !important; + } + .d-sm-flex { + display: flex !important; + } + .d-sm-inline { + display: inline !important; + } + .d-sm-inline-block { + display: inline-block !important; + } + .d-sm-none { + display: none !important; + } +} +@media (min-width: 31.25rem) { + .d-sm-block { + display: block !important; + } + .d-sm-flex { + display: flex !important; + } + .d-sm-inline { + display: inline !important; + } + .d-sm-inline-block { + display: inline-block !important; + } + .d-sm-none { + display: none !important; + } +} +@media (min-width: 31.25rem) { + .d-sm-block { + display: block !important; + } + .d-sm-flex { + display: flex !important; + } + .d-sm-inline { + display: inline !important; + } + .d-sm-inline-block { + display: inline-block !important; + } + .d-sm-none { + display: none !important; + } +} +@media (min-width: 31.25rem) { + .d-sm-block { + display: block !important; + } + .d-sm-flex { + display: flex !important; + } + .d-sm-inline { + display: inline !important; + } + .d-sm-inline-block { + display: inline-block !important; + } + .d-sm-none { + display: none !important; + } +} +@media (min-width: 31.25rem) { + .d-sm-block { + display: block !important; + } + .d-sm-flex { + display: flex !important; + } + .d-sm-inline { + display: inline !important; + } + .d-sm-inline-block { + display: inline-block !important; + } + .d-sm-none { + display: none !important; + } +} +@media (min-width: 31.25rem) { + .d-sm-block { + display: block !important; + } + .d-sm-flex { + display: flex !important; + } + .d-sm-inline { + display: inline !important; + } + .d-sm-inline-block { + display: inline-block !important; + } + .d-sm-none { + display: none !important; + } +} +@media (min-width: 31.25rem) { + .d-sm-block { + display: block !important; + } + .d-sm-flex { + display: flex !important; + } + .d-sm-inline { + display: inline !important; + } + .d-sm-inline-block { + display: inline-block !important; + } + .d-sm-none { + display: none !important; + } +} +@media (min-width: 31.25rem) { + .d-sm-block { + display: block !important; + } + .d-sm-flex { + display: flex !important; + } + .d-sm-inline { + display: inline !important; + } + .d-sm-inline-block { + display: inline-block !important; + } + .d-sm-none { + display: none !important; + } +} +@media (min-width: 50rem) { + .d-md-block { + display: block !important; + } + .d-md-flex { + display: flex !important; + } + .d-md-inline { + display: inline !important; + } + .d-md-inline-block { + display: inline-block !important; + } + .d-md-none { + display: none !important; + } +} +@media (min-width: 50rem) { + .d-md-block { + display: block !important; + } + .d-md-flex { + display: flex !important; + } + .d-md-inline { + display: inline !important; + } + .d-md-inline-block { + display: inline-block !important; + } + .d-md-none { + display: none !important; + } +} +@media (min-width: 50rem) { + .d-md-block { + display: block !important; + } + .d-md-flex { + display: flex !important; + } + .d-md-inline { + display: inline !important; + } + .d-md-inline-block { + display: inline-block !important; + } + .d-md-none { + display: none !important; + } +} +@media (min-width: 50rem) { + .d-md-block { + display: block !important; + } + .d-md-flex { + display: flex !important; + } + .d-md-inline { + display: inline !important; + } + .d-md-inline-block { + display: inline-block !important; + } + .d-md-none { + display: none !important; + } +} +@media (min-width: 50rem) { + .d-md-block { + display: block !important; + } + .d-md-flex { + display: flex !important; + } + .d-md-inline { + display: inline !important; + } + .d-md-inline-block { + display: inline-block !important; + } + .d-md-none { + display: none !important; + } +} +@media (min-width: 50rem) { + .d-md-block { + display: block !important; + } + .d-md-flex { + display: flex !important; + } + .d-md-inline { + display: inline !important; + } + .d-md-inline-block { + display: inline-block !important; + } + .d-md-none { + display: none !important; + } +} +@media (min-width: 50rem) { + .d-md-block { + display: block !important; + } + .d-md-flex { + display: flex !important; + } + .d-md-inline { + display: inline !important; + } + .d-md-inline-block { + display: inline-block !important; + } + .d-md-none { + display: none !important; + } +} +@media (min-width: 50rem) { + .d-md-block { + display: block !important; + } + .d-md-flex { + display: flex !important; + } + .d-md-inline { + display: inline !important; + } + .d-md-inline-block { + display: inline-block !important; + } + .d-md-none { + display: none !important; + } +} +@media (min-width: 50rem) { + .d-md-block { + display: block !important; + } + .d-md-flex { + display: flex !important; + } + .d-md-inline { + display: inline !important; + } + .d-md-inline-block { + display: inline-block !important; + } + .d-md-none { + display: none !important; + } +} +@media (min-width: 50rem) { + .d-md-block { + display: block !important; + } + .d-md-flex { + display: flex !important; + } + .d-md-inline { + display: inline !important; + } + .d-md-inline-block { + display: inline-block !important; + } + .d-md-none { + display: none !important; + } +} +@media (min-width: 50rem) { + .d-md-block { + display: block !important; + } + .d-md-flex { + display: flex !important; + } + .d-md-inline { + display: inline !important; + } + .d-md-inline-block { + display: inline-block !important; + } + .d-md-none { + display: none !important; + } +} +@media (min-width: 66.5rem) { + .d-lg-block { + display: block !important; + } + .d-lg-flex { + display: flex !important; + } + .d-lg-inline { + display: inline !important; + } + .d-lg-inline-block { + display: inline-block !important; + } + .d-lg-none { + display: none !important; + } +} +@media (min-width: 66.5rem) { + .d-lg-block { + display: block !important; + } + .d-lg-flex { + display: flex !important; + } + .d-lg-inline { + display: inline !important; + } + .d-lg-inline-block { + display: inline-block !important; + } + .d-lg-none { + display: none !important; + } +} +@media (min-width: 66.5rem) { + .d-lg-block { + display: block !important; + } + .d-lg-flex { + display: flex !important; + } + .d-lg-inline { + display: inline !important; + } + .d-lg-inline-block { + display: inline-block !important; + } + .d-lg-none { + display: none !important; + } +} +@media (min-width: 66.5rem) { + .d-lg-block { + display: block !important; + } + .d-lg-flex { + display: flex !important; + } + .d-lg-inline { + display: inline !important; + } + .d-lg-inline-block { + display: inline-block !important; + } + .d-lg-none { + display: none !important; + } +} +@media (min-width: 66.5rem) { + .d-lg-block { + display: block !important; + } + .d-lg-flex { + display: flex !important; + } + .d-lg-inline { + display: inline !important; + } + .d-lg-inline-block { + display: inline-block !important; + } + .d-lg-none { + display: none !important; + } +} +@media (min-width: 66.5rem) { + .d-lg-block { + display: block !important; + } + .d-lg-flex { + display: flex !important; + } + .d-lg-inline { + display: inline !important; + } + .d-lg-inline-block { + display: inline-block !important; + } + .d-lg-none { + display: none !important; + } +} +@media (min-width: 66.5rem) { + .d-lg-block { + display: block !important; + } + .d-lg-flex { + display: flex !important; + } + .d-lg-inline { + display: inline !important; + } + .d-lg-inline-block { + display: inline-block !important; + } + .d-lg-none { + display: none !important; + } +} +@media (min-width: 66.5rem) { + .d-lg-block { + display: block !important; + } + .d-lg-flex { + display: flex !important; + } + .d-lg-inline { + display: inline !important; + } + .d-lg-inline-block { + display: inline-block !important; + } + .d-lg-none { + display: none !important; + } +} +@media (min-width: 66.5rem) { + .d-lg-block { + display: block !important; + } + .d-lg-flex { + display: flex !important; + } + .d-lg-inline { + display: inline !important; + } + .d-lg-inline-block { + display: inline-block !important; + } + .d-lg-none { + display: none !important; + } +} +@media (min-width: 66.5rem) { + .d-lg-block { + display: block !important; + } + .d-lg-flex { + display: flex !important; + } + .d-lg-inline { + display: inline !important; + } + .d-lg-inline-block { + display: inline-block !important; + } + .d-lg-none { + display: none !important; + } +} +@media (min-width: 66.5rem) { + .d-lg-block { + display: block !important; + } + .d-lg-flex { + display: flex !important; + } + .d-lg-inline { + display: inline !important; + } + .d-lg-inline-block { + display: inline-block !important; + } + .d-lg-none { + display: none !important; + } +} +@media (min-width: 87.5rem) { + .d-xl-block { + display: block !important; + } + .d-xl-flex { + display: flex !important; + } + .d-xl-inline { + display: inline !important; + } + .d-xl-inline-block { + display: inline-block !important; + } + .d-xl-none { + display: none !important; + } +} +@media (min-width: 87.5rem) { + .d-xl-block { + display: block !important; + } + .d-xl-flex { + display: flex !important; + } + .d-xl-inline { + display: inline !important; + } + .d-xl-inline-block { + display: inline-block !important; + } + .d-xl-none { + display: none !important; + } +} +@media (min-width: 87.5rem) { + .d-xl-block { + display: block !important; + } + .d-xl-flex { + display: flex !important; + } + .d-xl-inline { + display: inline !important; + } + .d-xl-inline-block { + display: inline-block !important; + } + .d-xl-none { + display: none !important; + } +} +@media (min-width: 87.5rem) { + .d-xl-block { + display: block !important; + } + .d-xl-flex { + display: flex !important; + } + .d-xl-inline { + display: inline !important; + } + .d-xl-inline-block { + display: inline-block !important; + } + .d-xl-none { + display: none !important; + } +} +@media (min-width: 87.5rem) { + .d-xl-block { + display: block !important; + } + .d-xl-flex { + display: flex !important; + } + .d-xl-inline { + display: inline !important; + } + .d-xl-inline-block { + display: inline-block !important; + } + .d-xl-none { + display: none !important; + } +} +@media (min-width: 87.5rem) { + .d-xl-block { + display: block !important; + } + .d-xl-flex { + display: flex !important; + } + .d-xl-inline { + display: inline !important; + } + .d-xl-inline-block { + display: inline-block !important; + } + .d-xl-none { + display: none !important; + } +} +@media (min-width: 87.5rem) { + .d-xl-block { + display: block !important; + } + .d-xl-flex { + display: flex !important; + } + .d-xl-inline { + display: inline !important; + } + .d-xl-inline-block { + display: inline-block !important; + } + .d-xl-none { + display: none !important; + } +} +@media (min-width: 87.5rem) { + .d-xl-block { + display: block !important; + } + .d-xl-flex { + display: flex !important; + } + .d-xl-inline { + display: inline !important; + } + .d-xl-inline-block { + display: inline-block !important; + } + .d-xl-none { + display: none !important; + } +} +@media (min-width: 87.5rem) { + .d-xl-block { + display: block !important; + } + .d-xl-flex { + display: flex !important; + } + .d-xl-inline { + display: inline !important; + } + .d-xl-inline-block { + display: inline-block !important; + } + .d-xl-none { + display: none !important; + } +} +@media (min-width: 87.5rem) { + .d-xl-block { + display: block !important; + } + .d-xl-flex { + display: flex !important; + } + .d-xl-inline { + display: inline !important; + } + .d-xl-inline-block { + display: inline-block !important; + } + .d-xl-none { + display: none !important; + } +} +@media (min-width: 87.5rem) { + .d-xl-block { + display: block !important; + } + .d-xl-flex { + display: flex !important; + } + .d-xl-inline { + display: inline !important; + } + .d-xl-inline-block { + display: inline-block !important; + } + .d-xl-none { + display: none !important; + } +} +.float-left { + float: left !important; +} + +.float-right { + float: right !important; +} + +.flex-justify-start { + justify-content: flex-start !important; +} + +.flex-justify-end { + justify-content: flex-end !important; +} + +.flex-justify-between { + justify-content: space-between !important; +} + +.flex-justify-around { + justify-content: space-around !important; +} + +.v-align-baseline { + vertical-align: baseline !important; +} + +.v-align-bottom { + vertical-align: bottom !important; +} + +.v-align-middle { + vertical-align: middle !important; +} + +.v-align-text-bottom { + vertical-align: text-bottom !important; +} + +.v-align-text-top { + vertical-align: text-top !important; +} + +.v-align-top { + vertical-align: top !important; +} + +.fs-1 { + font-size: 0.5625rem !important; +} +@media (min-width: 31.25rem) { + .fs-1 { + font-size: 0.625rem !important; + } +} + +.fs-2 { + font-size: 0.6875rem !important; +} +@media (min-width: 31.25rem) { + .fs-2 { + font-size: 0.75rem !important; + } +} + +.fs-3 { + font-size: 0.75rem !important; +} +@media (min-width: 31.25rem) { + .fs-3 { + font-size: 0.875rem !important; + } +} + +.fs-4 { + font-size: 0.875rem !important; +} +@media (min-width: 31.25rem) { + .fs-4 { + font-size: 1rem !important; + } +} + +.fs-5 { + font-size: 1rem !important; +} +@media (min-width: 31.25rem) { + .fs-5 { + font-size: 1.125rem !important; + } +} + +.fs-6 { + font-size: 1.125rem !important; +} +@media (min-width: 31.25rem) { + .fs-6 { + font-size: 1.5rem !important; + line-height: 1.25; + } +} + +.fs-7 { + font-size: 1.5rem !important; + line-height: 1.25; +} +@media (min-width: 31.25rem) { + .fs-7 { + font-size: 2rem !important; + } +} + +.fs-8 { + font-size: 2rem !important; + line-height: 1.25; +} +@media (min-width: 31.25rem) { + .fs-8 { + font-size: 2.25rem !important; + } +} + +.fs-9 { + font-size: 2.25rem !important; + line-height: 1.25; +} +@media (min-width: 31.25rem) { + .fs-9 { + font-size: 2.625rem !important; + } +} + +.fs-10 { + font-size: 2.625rem !important; + line-height: 1.25; +} +@media (min-width: 31.25rem) { + .fs-10 { + font-size: 3rem !important; + } +} + +.fw-300 { + font-weight: 300 !important; +} + +.fw-400 { + font-weight: 400 !important; +} + +.fw-500 { + font-weight: 500 !important; +} + +.fw-700 { + font-weight: 700 !important; +} + +.lh-0 { + line-height: 0 !important; +} + +.lh-default { + line-height: 1.4; +} + +.lh-tight { + line-height: 1.25; +} + +.ls-5 { + letter-spacing: 0.05em !important; +} + +.ls-10 { + letter-spacing: 0.1em !important; +} + +.ls-0 { + letter-spacing: 0 !important; +} + +.text-uppercase { + text-transform: uppercase !important; +} + +.list-style-none { + padding: 0 !important; + margin: 0 !important; + list-style: none !important; +} +.list-style-none li::before { + display: none !important; +} + +.mx-auto { + margin-right: auto !important; + margin-left: auto !important; +} + +.m-0 { + margin: 0 !important; +} + +.mt-0 { + margin-top: 0 !important; +} + +.mr-0 { + margin-right: 0 !important; +} + +.mb-0 { + margin-bottom: 0 !important; +} + +.ml-0 { + margin-left: 0 !important; +} + +.mx-0 { + margin-right: 0 !important; + margin-left: 0 !important; +} + +.my-0 { + margin-top: 0 !important; + margin-bottom: 0 !important; +} + +.mxn-0 { + margin-right: -0 !important; + margin-left: -0 !important; +} + +.mx-0-auto { + margin-right: auto !important; + margin-left: auto !important; +} + +.m-1 { + margin: 0.25rem !important; +} + +.mt-1 { + margin-top: 0.25rem !important; +} + +.mr-1 { + margin-right: 0.25rem !important; +} + +.mb-1 { + margin-bottom: 0.25rem !important; +} + +.ml-1 { + margin-left: 0.25rem !important; +} + +.mx-1 { + margin-right: 0.25rem !important; + margin-left: 0.25rem !important; +} + +.my-1 { + margin-top: 0.25rem !important; + margin-bottom: 0.25rem !important; +} + +.mxn-1 { + margin-right: -0.25rem !important; + margin-left: -0.25rem !important; +} + +.mx-1-auto { + margin-right: auto !important; + margin-left: auto !important; +} + +.m-2 { + margin: 0.5rem !important; +} + +.mt-2 { + margin-top: 0.5rem !important; +} + +.mr-2 { + margin-right: 0.5rem !important; +} + +.mb-2 { + margin-bottom: 0.5rem !important; +} + +.ml-2 { + margin-left: 0.5rem !important; +} + +.mx-2 { + margin-right: 0.5rem !important; + margin-left: 0.5rem !important; +} + +.my-2 { + margin-top: 0.5rem !important; + margin-bottom: 0.5rem !important; +} + +.mxn-2 { + margin-right: -0.5rem !important; + margin-left: -0.5rem !important; +} + +.mx-2-auto { + margin-right: auto !important; + margin-left: auto !important; +} + +.m-3 { + margin: 0.75rem !important; +} + +.mt-3 { + margin-top: 0.75rem !important; +} + +.mr-3 { + margin-right: 0.75rem !important; +} + +.mb-3 { + margin-bottom: 0.75rem !important; +} + +.ml-3 { + margin-left: 0.75rem !important; +} + +.mx-3 { + margin-right: 0.75rem !important; + margin-left: 0.75rem !important; +} + +.my-3 { + margin-top: 0.75rem !important; + margin-bottom: 0.75rem !important; +} + +.mxn-3 { + margin-right: -0.75rem !important; + margin-left: -0.75rem !important; +} + +.mx-3-auto { + margin-right: auto !important; + margin-left: auto !important; +} + +.m-4 { + margin: 1rem !important; +} + +.mt-4 { + margin-top: 1rem !important; +} + +.mr-4 { + margin-right: 1rem !important; +} + +.mb-4 { + margin-bottom: 1rem !important; +} + +.ml-4 { + margin-left: 1rem !important; +} + +.mx-4 { + margin-right: 1rem !important; + margin-left: 1rem !important; +} + +.my-4 { + margin-top: 1rem !important; + margin-bottom: 1rem !important; +} + +.mxn-4 { + margin-right: -1rem !important; + margin-left: -1rem !important; +} + +.mx-4-auto { + margin-right: auto !important; + margin-left: auto !important; +} + +.m-5 { + margin: 1.5rem !important; +} + +.mt-5 { + margin-top: 1.5rem !important; +} + +.mr-5 { + margin-right: 1.5rem !important; +} + +.mb-5 { + margin-bottom: 1.5rem !important; +} + +.ml-5 { + margin-left: 1.5rem !important; +} + +.mx-5 { + margin-right: 1.5rem !important; + margin-left: 1.5rem !important; +} + +.my-5 { + margin-top: 1.5rem !important; + margin-bottom: 1.5rem !important; +} + +.mxn-5 { + margin-right: -1.5rem !important; + margin-left: -1.5rem !important; +} + +.mx-5-auto { + margin-right: auto !important; + margin-left: auto !important; +} + +.m-6 { + margin: 2rem !important; +} + +.mt-6 { + margin-top: 2rem !important; +} + +.mr-6 { + margin-right: 2rem !important; +} + +.mb-6 { + margin-bottom: 2rem !important; +} + +.ml-6 { + margin-left: 2rem !important; +} + +.mx-6 { + margin-right: 2rem !important; + margin-left: 2rem !important; +} + +.my-6 { + margin-top: 2rem !important; + margin-bottom: 2rem !important; +} + +.mxn-6 { + margin-right: -2rem !important; + margin-left: -2rem !important; +} + +.mx-6-auto { + margin-right: auto !important; + margin-left: auto !important; +} + +.m-7 { + margin: 2.5rem !important; +} + +.mt-7 { + margin-top: 2.5rem !important; +} + +.mr-7 { + margin-right: 2.5rem !important; +} + +.mb-7 { + margin-bottom: 2.5rem !important; +} + +.ml-7 { + margin-left: 2.5rem !important; +} + +.mx-7 { + margin-right: 2.5rem !important; + margin-left: 2.5rem !important; +} + +.my-7 { + margin-top: 2.5rem !important; + margin-bottom: 2.5rem !important; +} + +.mxn-7 { + margin-right: -2.5rem !important; + margin-left: -2.5rem !important; +} + +.mx-7-auto { + margin-right: auto !important; + margin-left: auto !important; +} + +.m-8 { + margin: 3rem !important; +} + +.mt-8 { + margin-top: 3rem !important; +} + +.mr-8 { + margin-right: 3rem !important; +} + +.mb-8 { + margin-bottom: 3rem !important; +} + +.ml-8 { + margin-left: 3rem !important; +} + +.mx-8 { + margin-right: 3rem !important; + margin-left: 3rem !important; +} + +.my-8 { + margin-top: 3rem !important; + margin-bottom: 3rem !important; +} + +.mxn-8 { + margin-right: -3rem !important; + margin-left: -3rem !important; +} + +.mx-8-auto { + margin-right: auto !important; + margin-left: auto !important; +} + +.m-9 { + margin: 3.5rem !important; +} + +.mt-9 { + margin-top: 3.5rem !important; +} + +.mr-9 { + margin-right: 3.5rem !important; +} + +.mb-9 { + margin-bottom: 3.5rem !important; +} + +.ml-9 { + margin-left: 3.5rem !important; +} + +.mx-9 { + margin-right: 3.5rem !important; + margin-left: 3.5rem !important; +} + +.my-9 { + margin-top: 3.5rem !important; + margin-bottom: 3.5rem !important; +} + +.mxn-9 { + margin-right: -3.5rem !important; + margin-left: -3.5rem !important; +} + +.mx-9-auto { + margin-right: auto !important; + margin-left: auto !important; +} + +.m-10 { + margin: 4rem !important; +} + +.mt-10 { + margin-top: 4rem !important; +} + +.mr-10 { + margin-right: 4rem !important; +} + +.mb-10 { + margin-bottom: 4rem !important; +} + +.ml-10 { + margin-left: 4rem !important; +} + +.mx-10 { + margin-right: 4rem !important; + margin-left: 4rem !important; +} + +.my-10 { + margin-top: 4rem !important; + margin-bottom: 4rem !important; +} + +.mxn-10 { + margin-right: -4rem !important; + margin-left: -4rem !important; +} + +.mx-10-auto { + margin-right: auto !important; + margin-left: auto !important; +} + +@media (min-width: 20rem) { + .m-xs-0 { + margin: 0 !important; + } + .mt-xs-0 { + margin-top: 0 !important; + } + .mr-xs-0 { + margin-right: 0 !important; + } + .mb-xs-0 { + margin-bottom: 0 !important; + } + .ml-xs-0 { + margin-left: 0 !important; + } + .mx-xs-0 { + margin-right: 0 !important; + margin-left: 0 !important; + } + .my-xs-0 { + margin-top: 0 !important; + margin-bottom: 0 !important; + } + .mxn-xs-0 { + margin-right: -0 !important; + margin-left: -0 !important; + } +} +@media (min-width: 20rem) { + .m-xs-1 { + margin: 0.25rem !important; + } + .mt-xs-1 { + margin-top: 0.25rem !important; + } + .mr-xs-1 { + margin-right: 0.25rem !important; + } + .mb-xs-1 { + margin-bottom: 0.25rem !important; + } + .ml-xs-1 { + margin-left: 0.25rem !important; + } + .mx-xs-1 { + margin-right: 0.25rem !important; + margin-left: 0.25rem !important; + } + .my-xs-1 { + margin-top: 0.25rem !important; + margin-bottom: 0.25rem !important; + } + .mxn-xs-1 { + margin-right: -0.25rem !important; + margin-left: -0.25rem !important; + } +} +@media (min-width: 20rem) { + .m-xs-2 { + margin: 0.5rem !important; + } + .mt-xs-2 { + margin-top: 0.5rem !important; + } + .mr-xs-2 { + margin-right: 0.5rem !important; + } + .mb-xs-2 { + margin-bottom: 0.5rem !important; + } + .ml-xs-2 { + margin-left: 0.5rem !important; + } + .mx-xs-2 { + margin-right: 0.5rem !important; + margin-left: 0.5rem !important; + } + .my-xs-2 { + margin-top: 0.5rem !important; + margin-bottom: 0.5rem !important; + } + .mxn-xs-2 { + margin-right: -0.5rem !important; + margin-left: -0.5rem !important; + } +} +@media (min-width: 20rem) { + .m-xs-3 { + margin: 0.75rem !important; + } + .mt-xs-3 { + margin-top: 0.75rem !important; + } + .mr-xs-3 { + margin-right: 0.75rem !important; + } + .mb-xs-3 { + margin-bottom: 0.75rem !important; + } + .ml-xs-3 { + margin-left: 0.75rem !important; + } + .mx-xs-3 { + margin-right: 0.75rem !important; + margin-left: 0.75rem !important; + } + .my-xs-3 { + margin-top: 0.75rem !important; + margin-bottom: 0.75rem !important; + } + .mxn-xs-3 { + margin-right: -0.75rem !important; + margin-left: -0.75rem !important; + } +} +@media (min-width: 20rem) { + .m-xs-4 { + margin: 1rem !important; + } + .mt-xs-4 { + margin-top: 1rem !important; + } + .mr-xs-4 { + margin-right: 1rem !important; + } + .mb-xs-4 { + margin-bottom: 1rem !important; + } + .ml-xs-4 { + margin-left: 1rem !important; + } + .mx-xs-4 { + margin-right: 1rem !important; + margin-left: 1rem !important; + } + .my-xs-4 { + margin-top: 1rem !important; + margin-bottom: 1rem !important; + } + .mxn-xs-4 { + margin-right: -1rem !important; + margin-left: -1rem !important; + } +} +@media (min-width: 20rem) { + .m-xs-5 { + margin: 1.5rem !important; + } + .mt-xs-5 { + margin-top: 1.5rem !important; + } + .mr-xs-5 { + margin-right: 1.5rem !important; + } + .mb-xs-5 { + margin-bottom: 1.5rem !important; + } + .ml-xs-5 { + margin-left: 1.5rem !important; + } + .mx-xs-5 { + margin-right: 1.5rem !important; + margin-left: 1.5rem !important; + } + .my-xs-5 { + margin-top: 1.5rem !important; + margin-bottom: 1.5rem !important; + } + .mxn-xs-5 { + margin-right: -1.5rem !important; + margin-left: -1.5rem !important; + } +} +@media (min-width: 20rem) { + .m-xs-6 { + margin: 2rem !important; + } + .mt-xs-6 { + margin-top: 2rem !important; + } + .mr-xs-6 { + margin-right: 2rem !important; + } + .mb-xs-6 { + margin-bottom: 2rem !important; + } + .ml-xs-6 { + margin-left: 2rem !important; + } + .mx-xs-6 { + margin-right: 2rem !important; + margin-left: 2rem !important; + } + .my-xs-6 { + margin-top: 2rem !important; + margin-bottom: 2rem !important; + } + .mxn-xs-6 { + margin-right: -2rem !important; + margin-left: -2rem !important; + } +} +@media (min-width: 20rem) { + .m-xs-7 { + margin: 2.5rem !important; + } + .mt-xs-7 { + margin-top: 2.5rem !important; + } + .mr-xs-7 { + margin-right: 2.5rem !important; + } + .mb-xs-7 { + margin-bottom: 2.5rem !important; + } + .ml-xs-7 { + margin-left: 2.5rem !important; + } + .mx-xs-7 { + margin-right: 2.5rem !important; + margin-left: 2.5rem !important; + } + .my-xs-7 { + margin-top: 2.5rem !important; + margin-bottom: 2.5rem !important; + } + .mxn-xs-7 { + margin-right: -2.5rem !important; + margin-left: -2.5rem !important; + } +} +@media (min-width: 20rem) { + .m-xs-8 { + margin: 3rem !important; + } + .mt-xs-8 { + margin-top: 3rem !important; + } + .mr-xs-8 { + margin-right: 3rem !important; + } + .mb-xs-8 { + margin-bottom: 3rem !important; + } + .ml-xs-8 { + margin-left: 3rem !important; + } + .mx-xs-8 { + margin-right: 3rem !important; + margin-left: 3rem !important; + } + .my-xs-8 { + margin-top: 3rem !important; + margin-bottom: 3rem !important; + } + .mxn-xs-8 { + margin-right: -3rem !important; + margin-left: -3rem !important; + } +} +@media (min-width: 20rem) { + .m-xs-9 { + margin: 3.5rem !important; + } + .mt-xs-9 { + margin-top: 3.5rem !important; + } + .mr-xs-9 { + margin-right: 3.5rem !important; + } + .mb-xs-9 { + margin-bottom: 3.5rem !important; + } + .ml-xs-9 { + margin-left: 3.5rem !important; + } + .mx-xs-9 { + margin-right: 3.5rem !important; + margin-left: 3.5rem !important; + } + .my-xs-9 { + margin-top: 3.5rem !important; + margin-bottom: 3.5rem !important; + } + .mxn-xs-9 { + margin-right: -3.5rem !important; + margin-left: -3.5rem !important; + } +} +@media (min-width: 20rem) { + .m-xs-10 { + margin: 4rem !important; + } + .mt-xs-10 { + margin-top: 4rem !important; + } + .mr-xs-10 { + margin-right: 4rem !important; + } + .mb-xs-10 { + margin-bottom: 4rem !important; + } + .ml-xs-10 { + margin-left: 4rem !important; + } + .mx-xs-10 { + margin-right: 4rem !important; + margin-left: 4rem !important; + } + .my-xs-10 { + margin-top: 4rem !important; + margin-bottom: 4rem !important; + } + .mxn-xs-10 { + margin-right: -4rem !important; + margin-left: -4rem !important; + } +} +@media (min-width: 31.25rem) { + .m-sm-0 { + margin: 0 !important; + } + .mt-sm-0 { + margin-top: 0 !important; + } + .mr-sm-0 { + margin-right: 0 !important; + } + .mb-sm-0 { + margin-bottom: 0 !important; + } + .ml-sm-0 { + margin-left: 0 !important; + } + .mx-sm-0 { + margin-right: 0 !important; + margin-left: 0 !important; + } + .my-sm-0 { + margin-top: 0 !important; + margin-bottom: 0 !important; + } + .mxn-sm-0 { + margin-right: -0 !important; + margin-left: -0 !important; + } +} +@media (min-width: 31.25rem) { + .m-sm-1 { + margin: 0.25rem !important; + } + .mt-sm-1 { + margin-top: 0.25rem !important; + } + .mr-sm-1 { + margin-right: 0.25rem !important; + } + .mb-sm-1 { + margin-bottom: 0.25rem !important; + } + .ml-sm-1 { + margin-left: 0.25rem !important; + } + .mx-sm-1 { + margin-right: 0.25rem !important; + margin-left: 0.25rem !important; + } + .my-sm-1 { + margin-top: 0.25rem !important; + margin-bottom: 0.25rem !important; + } + .mxn-sm-1 { + margin-right: -0.25rem !important; + margin-left: -0.25rem !important; + } +} +@media (min-width: 31.25rem) { + .m-sm-2 { + margin: 0.5rem !important; + } + .mt-sm-2 { + margin-top: 0.5rem !important; + } + .mr-sm-2 { + margin-right: 0.5rem !important; + } + .mb-sm-2 { + margin-bottom: 0.5rem !important; + } + .ml-sm-2 { + margin-left: 0.5rem !important; + } + .mx-sm-2 { + margin-right: 0.5rem !important; + margin-left: 0.5rem !important; + } + .my-sm-2 { + margin-top: 0.5rem !important; + margin-bottom: 0.5rem !important; + } + .mxn-sm-2 { + margin-right: -0.5rem !important; + margin-left: -0.5rem !important; + } +} +@media (min-width: 31.25rem) { + .m-sm-3 { + margin: 0.75rem !important; + } + .mt-sm-3 { + margin-top: 0.75rem !important; + } + .mr-sm-3 { + margin-right: 0.75rem !important; + } + .mb-sm-3 { + margin-bottom: 0.75rem !important; + } + .ml-sm-3 { + margin-left: 0.75rem !important; + } + .mx-sm-3 { + margin-right: 0.75rem !important; + margin-left: 0.75rem !important; + } + .my-sm-3 { + margin-top: 0.75rem !important; + margin-bottom: 0.75rem !important; + } + .mxn-sm-3 { + margin-right: -0.75rem !important; + margin-left: -0.75rem !important; + } +} +@media (min-width: 31.25rem) { + .m-sm-4 { + margin: 1rem !important; + } + .mt-sm-4 { + margin-top: 1rem !important; + } + .mr-sm-4 { + margin-right: 1rem !important; + } + .mb-sm-4 { + margin-bottom: 1rem !important; + } + .ml-sm-4 { + margin-left: 1rem !important; + } + .mx-sm-4 { + margin-right: 1rem !important; + margin-left: 1rem !important; + } + .my-sm-4 { + margin-top: 1rem !important; + margin-bottom: 1rem !important; + } + .mxn-sm-4 { + margin-right: -1rem !important; + margin-left: -1rem !important; + } +} +@media (min-width: 31.25rem) { + .m-sm-5 { + margin: 1.5rem !important; + } + .mt-sm-5 { + margin-top: 1.5rem !important; + } + .mr-sm-5 { + margin-right: 1.5rem !important; + } + .mb-sm-5 { + margin-bottom: 1.5rem !important; + } + .ml-sm-5 { + margin-left: 1.5rem !important; + } + .mx-sm-5 { + margin-right: 1.5rem !important; + margin-left: 1.5rem !important; + } + .my-sm-5 { + margin-top: 1.5rem !important; + margin-bottom: 1.5rem !important; + } + .mxn-sm-5 { + margin-right: -1.5rem !important; + margin-left: -1.5rem !important; + } +} +@media (min-width: 31.25rem) { + .m-sm-6 { + margin: 2rem !important; + } + .mt-sm-6 { + margin-top: 2rem !important; + } + .mr-sm-6 { + margin-right: 2rem !important; + } + .mb-sm-6 { + margin-bottom: 2rem !important; + } + .ml-sm-6 { + margin-left: 2rem !important; + } + .mx-sm-6 { + margin-right: 2rem !important; + margin-left: 2rem !important; + } + .my-sm-6 { + margin-top: 2rem !important; + margin-bottom: 2rem !important; + } + .mxn-sm-6 { + margin-right: -2rem !important; + margin-left: -2rem !important; + } +} +@media (min-width: 31.25rem) { + .m-sm-7 { + margin: 2.5rem !important; + } + .mt-sm-7 { + margin-top: 2.5rem !important; + } + .mr-sm-7 { + margin-right: 2.5rem !important; + } + .mb-sm-7 { + margin-bottom: 2.5rem !important; + } + .ml-sm-7 { + margin-left: 2.5rem !important; + } + .mx-sm-7 { + margin-right: 2.5rem !important; + margin-left: 2.5rem !important; + } + .my-sm-7 { + margin-top: 2.5rem !important; + margin-bottom: 2.5rem !important; + } + .mxn-sm-7 { + margin-right: -2.5rem !important; + margin-left: -2.5rem !important; + } +} +@media (min-width: 31.25rem) { + .m-sm-8 { + margin: 3rem !important; + } + .mt-sm-8 { + margin-top: 3rem !important; + } + .mr-sm-8 { + margin-right: 3rem !important; + } + .mb-sm-8 { + margin-bottom: 3rem !important; + } + .ml-sm-8 { + margin-left: 3rem !important; + } + .mx-sm-8 { + margin-right: 3rem !important; + margin-left: 3rem !important; + } + .my-sm-8 { + margin-top: 3rem !important; + margin-bottom: 3rem !important; + } + .mxn-sm-8 { + margin-right: -3rem !important; + margin-left: -3rem !important; + } +} +@media (min-width: 31.25rem) { + .m-sm-9 { + margin: 3.5rem !important; + } + .mt-sm-9 { + margin-top: 3.5rem !important; + } + .mr-sm-9 { + margin-right: 3.5rem !important; + } + .mb-sm-9 { + margin-bottom: 3.5rem !important; + } + .ml-sm-9 { + margin-left: 3.5rem !important; + } + .mx-sm-9 { + margin-right: 3.5rem !important; + margin-left: 3.5rem !important; + } + .my-sm-9 { + margin-top: 3.5rem !important; + margin-bottom: 3.5rem !important; + } + .mxn-sm-9 { + margin-right: -3.5rem !important; + margin-left: -3.5rem !important; + } +} +@media (min-width: 31.25rem) { + .m-sm-10 { + margin: 4rem !important; + } + .mt-sm-10 { + margin-top: 4rem !important; + } + .mr-sm-10 { + margin-right: 4rem !important; + } + .mb-sm-10 { + margin-bottom: 4rem !important; + } + .ml-sm-10 { + margin-left: 4rem !important; + } + .mx-sm-10 { + margin-right: 4rem !important; + margin-left: 4rem !important; + } + .my-sm-10 { + margin-top: 4rem !important; + margin-bottom: 4rem !important; + } + .mxn-sm-10 { + margin-right: -4rem !important; + margin-left: -4rem !important; + } +} +@media (min-width: 50rem) { + .m-md-0 { + margin: 0 !important; + } + .mt-md-0 { + margin-top: 0 !important; + } + .mr-md-0 { + margin-right: 0 !important; + } + .mb-md-0 { + margin-bottom: 0 !important; + } + .ml-md-0 { + margin-left: 0 !important; + } + .mx-md-0 { + margin-right: 0 !important; + margin-left: 0 !important; + } + .my-md-0 { + margin-top: 0 !important; + margin-bottom: 0 !important; + } + .mxn-md-0 { + margin-right: -0 !important; + margin-left: -0 !important; + } +} +@media (min-width: 50rem) { + .m-md-1 { + margin: 0.25rem !important; + } + .mt-md-1 { + margin-top: 0.25rem !important; + } + .mr-md-1 { + margin-right: 0.25rem !important; + } + .mb-md-1 { + margin-bottom: 0.25rem !important; + } + .ml-md-1 { + margin-left: 0.25rem !important; + } + .mx-md-1 { + margin-right: 0.25rem !important; + margin-left: 0.25rem !important; + } + .my-md-1 { + margin-top: 0.25rem !important; + margin-bottom: 0.25rem !important; + } + .mxn-md-1 { + margin-right: -0.25rem !important; + margin-left: -0.25rem !important; + } +} +@media (min-width: 50rem) { + .m-md-2 { + margin: 0.5rem !important; + } + .mt-md-2 { + margin-top: 0.5rem !important; + } + .mr-md-2 { + margin-right: 0.5rem !important; + } + .mb-md-2 { + margin-bottom: 0.5rem !important; + } + .ml-md-2 { + margin-left: 0.5rem !important; + } + .mx-md-2 { + margin-right: 0.5rem !important; + margin-left: 0.5rem !important; + } + .my-md-2 { + margin-top: 0.5rem !important; + margin-bottom: 0.5rem !important; + } + .mxn-md-2 { + margin-right: -0.5rem !important; + margin-left: -0.5rem !important; + } +} +@media (min-width: 50rem) { + .m-md-3 { + margin: 0.75rem !important; + } + .mt-md-3 { + margin-top: 0.75rem !important; + } + .mr-md-3 { + margin-right: 0.75rem !important; + } + .mb-md-3 { + margin-bottom: 0.75rem !important; + } + .ml-md-3 { + margin-left: 0.75rem !important; + } + .mx-md-3 { + margin-right: 0.75rem !important; + margin-left: 0.75rem !important; + } + .my-md-3 { + margin-top: 0.75rem !important; + margin-bottom: 0.75rem !important; + } + .mxn-md-3 { + margin-right: -0.75rem !important; + margin-left: -0.75rem !important; + } +} +@media (min-width: 50rem) { + .m-md-4 { + margin: 1rem !important; + } + .mt-md-4 { + margin-top: 1rem !important; + } + .mr-md-4 { + margin-right: 1rem !important; + } + .mb-md-4 { + margin-bottom: 1rem !important; + } + .ml-md-4 { + margin-left: 1rem !important; + } + .mx-md-4 { + margin-right: 1rem !important; + margin-left: 1rem !important; + } + .my-md-4 { + margin-top: 1rem !important; + margin-bottom: 1rem !important; + } + .mxn-md-4 { + margin-right: -1rem !important; + margin-left: -1rem !important; + } +} +@media (min-width: 50rem) { + .m-md-5 { + margin: 1.5rem !important; + } + .mt-md-5 { + margin-top: 1.5rem !important; + } + .mr-md-5 { + margin-right: 1.5rem !important; + } + .mb-md-5 { + margin-bottom: 1.5rem !important; + } + .ml-md-5 { + margin-left: 1.5rem !important; + } + .mx-md-5 { + margin-right: 1.5rem !important; + margin-left: 1.5rem !important; + } + .my-md-5 { + margin-top: 1.5rem !important; + margin-bottom: 1.5rem !important; + } + .mxn-md-5 { + margin-right: -1.5rem !important; + margin-left: -1.5rem !important; + } +} +@media (min-width: 50rem) { + .m-md-6 { + margin: 2rem !important; + } + .mt-md-6 { + margin-top: 2rem !important; + } + .mr-md-6 { + margin-right: 2rem !important; + } + .mb-md-6 { + margin-bottom: 2rem !important; + } + .ml-md-6 { + margin-left: 2rem !important; + } + .mx-md-6 { + margin-right: 2rem !important; + margin-left: 2rem !important; + } + .my-md-6 { + margin-top: 2rem !important; + margin-bottom: 2rem !important; + } + .mxn-md-6 { + margin-right: -2rem !important; + margin-left: -2rem !important; + } +} +@media (min-width: 50rem) { + .m-md-7 { + margin: 2.5rem !important; + } + .mt-md-7 { + margin-top: 2.5rem !important; + } + .mr-md-7 { + margin-right: 2.5rem !important; + } + .mb-md-7 { + margin-bottom: 2.5rem !important; + } + .ml-md-7 { + margin-left: 2.5rem !important; + } + .mx-md-7 { + margin-right: 2.5rem !important; + margin-left: 2.5rem !important; + } + .my-md-7 { + margin-top: 2.5rem !important; + margin-bottom: 2.5rem !important; + } + .mxn-md-7 { + margin-right: -2.5rem !important; + margin-left: -2.5rem !important; + } +} +@media (min-width: 50rem) { + .m-md-8 { + margin: 3rem !important; + } + .mt-md-8 { + margin-top: 3rem !important; + } + .mr-md-8 { + margin-right: 3rem !important; + } + .mb-md-8 { + margin-bottom: 3rem !important; + } + .ml-md-8 { + margin-left: 3rem !important; + } + .mx-md-8 { + margin-right: 3rem !important; + margin-left: 3rem !important; + } + .my-md-8 { + margin-top: 3rem !important; + margin-bottom: 3rem !important; + } + .mxn-md-8 { + margin-right: -3rem !important; + margin-left: -3rem !important; + } +} +@media (min-width: 50rem) { + .m-md-9 { + margin: 3.5rem !important; + } + .mt-md-9 { + margin-top: 3.5rem !important; + } + .mr-md-9 { + margin-right: 3.5rem !important; + } + .mb-md-9 { + margin-bottom: 3.5rem !important; + } + .ml-md-9 { + margin-left: 3.5rem !important; + } + .mx-md-9 { + margin-right: 3.5rem !important; + margin-left: 3.5rem !important; + } + .my-md-9 { + margin-top: 3.5rem !important; + margin-bottom: 3.5rem !important; + } + .mxn-md-9 { + margin-right: -3.5rem !important; + margin-left: -3.5rem !important; + } +} +@media (min-width: 50rem) { + .m-md-10 { + margin: 4rem !important; + } + .mt-md-10 { + margin-top: 4rem !important; + } + .mr-md-10 { + margin-right: 4rem !important; + } + .mb-md-10 { + margin-bottom: 4rem !important; + } + .ml-md-10 { + margin-left: 4rem !important; + } + .mx-md-10 { + margin-right: 4rem !important; + margin-left: 4rem !important; + } + .my-md-10 { + margin-top: 4rem !important; + margin-bottom: 4rem !important; + } + .mxn-md-10 { + margin-right: -4rem !important; + margin-left: -4rem !important; + } +} +@media (min-width: 66.5rem) { + .m-lg-0 { + margin: 0 !important; + } + .mt-lg-0 { + margin-top: 0 !important; + } + .mr-lg-0 { + margin-right: 0 !important; + } + .mb-lg-0 { + margin-bottom: 0 !important; + } + .ml-lg-0 { + margin-left: 0 !important; + } + .mx-lg-0 { + margin-right: 0 !important; + margin-left: 0 !important; + } + .my-lg-0 { + margin-top: 0 !important; + margin-bottom: 0 !important; + } + .mxn-lg-0 { + margin-right: -0 !important; + margin-left: -0 !important; + } +} +@media (min-width: 66.5rem) { + .m-lg-1 { + margin: 0.25rem !important; + } + .mt-lg-1 { + margin-top: 0.25rem !important; + } + .mr-lg-1 { + margin-right: 0.25rem !important; + } + .mb-lg-1 { + margin-bottom: 0.25rem !important; + } + .ml-lg-1 { + margin-left: 0.25rem !important; + } + .mx-lg-1 { + margin-right: 0.25rem !important; + margin-left: 0.25rem !important; + } + .my-lg-1 { + margin-top: 0.25rem !important; + margin-bottom: 0.25rem !important; + } + .mxn-lg-1 { + margin-right: -0.25rem !important; + margin-left: -0.25rem !important; + } +} +@media (min-width: 66.5rem) { + .m-lg-2 { + margin: 0.5rem !important; + } + .mt-lg-2 { + margin-top: 0.5rem !important; + } + .mr-lg-2 { + margin-right: 0.5rem !important; + } + .mb-lg-2 { + margin-bottom: 0.5rem !important; + } + .ml-lg-2 { + margin-left: 0.5rem !important; + } + .mx-lg-2 { + margin-right: 0.5rem !important; + margin-left: 0.5rem !important; + } + .my-lg-2 { + margin-top: 0.5rem !important; + margin-bottom: 0.5rem !important; + } + .mxn-lg-2 { + margin-right: -0.5rem !important; + margin-left: -0.5rem !important; + } +} +@media (min-width: 66.5rem) { + .m-lg-3 { + margin: 0.75rem !important; + } + .mt-lg-3 { + margin-top: 0.75rem !important; + } + .mr-lg-3 { + margin-right: 0.75rem !important; + } + .mb-lg-3 { + margin-bottom: 0.75rem !important; + } + .ml-lg-3 { + margin-left: 0.75rem !important; + } + .mx-lg-3 { + margin-right: 0.75rem !important; + margin-left: 0.75rem !important; + } + .my-lg-3 { + margin-top: 0.75rem !important; + margin-bottom: 0.75rem !important; + } + .mxn-lg-3 { + margin-right: -0.75rem !important; + margin-left: -0.75rem !important; + } +} +@media (min-width: 66.5rem) { + .m-lg-4 { + margin: 1rem !important; + } + .mt-lg-4 { + margin-top: 1rem !important; + } + .mr-lg-4 { + margin-right: 1rem !important; + } + .mb-lg-4 { + margin-bottom: 1rem !important; + } + .ml-lg-4 { + margin-left: 1rem !important; + } + .mx-lg-4 { + margin-right: 1rem !important; + margin-left: 1rem !important; + } + .my-lg-4 { + margin-top: 1rem !important; + margin-bottom: 1rem !important; + } + .mxn-lg-4 { + margin-right: -1rem !important; + margin-left: -1rem !important; + } +} +@media (min-width: 66.5rem) { + .m-lg-5 { + margin: 1.5rem !important; + } + .mt-lg-5 { + margin-top: 1.5rem !important; + } + .mr-lg-5 { + margin-right: 1.5rem !important; + } + .mb-lg-5 { + margin-bottom: 1.5rem !important; + } + .ml-lg-5 { + margin-left: 1.5rem !important; + } + .mx-lg-5 { + margin-right: 1.5rem !important; + margin-left: 1.5rem !important; + } + .my-lg-5 { + margin-top: 1.5rem !important; + margin-bottom: 1.5rem !important; + } + .mxn-lg-5 { + margin-right: -1.5rem !important; + margin-left: -1.5rem !important; + } +} +@media (min-width: 66.5rem) { + .m-lg-6 { + margin: 2rem !important; + } + .mt-lg-6 { + margin-top: 2rem !important; + } + .mr-lg-6 { + margin-right: 2rem !important; + } + .mb-lg-6 { + margin-bottom: 2rem !important; + } + .ml-lg-6 { + margin-left: 2rem !important; + } + .mx-lg-6 { + margin-right: 2rem !important; + margin-left: 2rem !important; + } + .my-lg-6 { + margin-top: 2rem !important; + margin-bottom: 2rem !important; + } + .mxn-lg-6 { + margin-right: -2rem !important; + margin-left: -2rem !important; + } +} +@media (min-width: 66.5rem) { + .m-lg-7 { + margin: 2.5rem !important; + } + .mt-lg-7 { + margin-top: 2.5rem !important; + } + .mr-lg-7 { + margin-right: 2.5rem !important; + } + .mb-lg-7 { + margin-bottom: 2.5rem !important; + } + .ml-lg-7 { + margin-left: 2.5rem !important; + } + .mx-lg-7 { + margin-right: 2.5rem !important; + margin-left: 2.5rem !important; + } + .my-lg-7 { + margin-top: 2.5rem !important; + margin-bottom: 2.5rem !important; + } + .mxn-lg-7 { + margin-right: -2.5rem !important; + margin-left: -2.5rem !important; + } +} +@media (min-width: 66.5rem) { + .m-lg-8 { + margin: 3rem !important; + } + .mt-lg-8 { + margin-top: 3rem !important; + } + .mr-lg-8 { + margin-right: 3rem !important; + } + .mb-lg-8 { + margin-bottom: 3rem !important; + } + .ml-lg-8 { + margin-left: 3rem !important; + } + .mx-lg-8 { + margin-right: 3rem !important; + margin-left: 3rem !important; + } + .my-lg-8 { + margin-top: 3rem !important; + margin-bottom: 3rem !important; + } + .mxn-lg-8 { + margin-right: -3rem !important; + margin-left: -3rem !important; + } +} +@media (min-width: 66.5rem) { + .m-lg-9 { + margin: 3.5rem !important; + } + .mt-lg-9 { + margin-top: 3.5rem !important; + } + .mr-lg-9 { + margin-right: 3.5rem !important; + } + .mb-lg-9 { + margin-bottom: 3.5rem !important; + } + .ml-lg-9 { + margin-left: 3.5rem !important; + } + .mx-lg-9 { + margin-right: 3.5rem !important; + margin-left: 3.5rem !important; + } + .my-lg-9 { + margin-top: 3.5rem !important; + margin-bottom: 3.5rem !important; + } + .mxn-lg-9 { + margin-right: -3.5rem !important; + margin-left: -3.5rem !important; + } +} +@media (min-width: 66.5rem) { + .m-lg-10 { + margin: 4rem !important; + } + .mt-lg-10 { + margin-top: 4rem !important; + } + .mr-lg-10 { + margin-right: 4rem !important; + } + .mb-lg-10 { + margin-bottom: 4rem !important; + } + .ml-lg-10 { + margin-left: 4rem !important; + } + .mx-lg-10 { + margin-right: 4rem !important; + margin-left: 4rem !important; + } + .my-lg-10 { + margin-top: 4rem !important; + margin-bottom: 4rem !important; + } + .mxn-lg-10 { + margin-right: -4rem !important; + margin-left: -4rem !important; + } +} +@media (min-width: 87.5rem) { + .m-xl-0 { + margin: 0 !important; + } + .mt-xl-0 { + margin-top: 0 !important; + } + .mr-xl-0 { + margin-right: 0 !important; + } + .mb-xl-0 { + margin-bottom: 0 !important; + } + .ml-xl-0 { + margin-left: 0 !important; + } + .mx-xl-0 { + margin-right: 0 !important; + margin-left: 0 !important; + } + .my-xl-0 { + margin-top: 0 !important; + margin-bottom: 0 !important; + } + .mxn-xl-0 { + margin-right: -0 !important; + margin-left: -0 !important; + } +} +@media (min-width: 87.5rem) { + .m-xl-1 { + margin: 0.25rem !important; + } + .mt-xl-1 { + margin-top: 0.25rem !important; + } + .mr-xl-1 { + margin-right: 0.25rem !important; + } + .mb-xl-1 { + margin-bottom: 0.25rem !important; + } + .ml-xl-1 { + margin-left: 0.25rem !important; + } + .mx-xl-1 { + margin-right: 0.25rem !important; + margin-left: 0.25rem !important; + } + .my-xl-1 { + margin-top: 0.25rem !important; + margin-bottom: 0.25rem !important; + } + .mxn-xl-1 { + margin-right: -0.25rem !important; + margin-left: -0.25rem !important; + } +} +@media (min-width: 87.5rem) { + .m-xl-2 { + margin: 0.5rem !important; + } + .mt-xl-2 { + margin-top: 0.5rem !important; + } + .mr-xl-2 { + margin-right: 0.5rem !important; + } + .mb-xl-2 { + margin-bottom: 0.5rem !important; + } + .ml-xl-2 { + margin-left: 0.5rem !important; + } + .mx-xl-2 { + margin-right: 0.5rem !important; + margin-left: 0.5rem !important; + } + .my-xl-2 { + margin-top: 0.5rem !important; + margin-bottom: 0.5rem !important; + } + .mxn-xl-2 { + margin-right: -0.5rem !important; + margin-left: -0.5rem !important; + } +} +@media (min-width: 87.5rem) { + .m-xl-3 { + margin: 0.75rem !important; + } + .mt-xl-3 { + margin-top: 0.75rem !important; + } + .mr-xl-3 { + margin-right: 0.75rem !important; + } + .mb-xl-3 { + margin-bottom: 0.75rem !important; + } + .ml-xl-3 { + margin-left: 0.75rem !important; + } + .mx-xl-3 { + margin-right: 0.75rem !important; + margin-left: 0.75rem !important; + } + .my-xl-3 { + margin-top: 0.75rem !important; + margin-bottom: 0.75rem !important; + } + .mxn-xl-3 { + margin-right: -0.75rem !important; + margin-left: -0.75rem !important; + } +} +@media (min-width: 87.5rem) { + .m-xl-4 { + margin: 1rem !important; + } + .mt-xl-4 { + margin-top: 1rem !important; + } + .mr-xl-4 { + margin-right: 1rem !important; + } + .mb-xl-4 { + margin-bottom: 1rem !important; + } + .ml-xl-4 { + margin-left: 1rem !important; + } + .mx-xl-4 { + margin-right: 1rem !important; + margin-left: 1rem !important; + } + .my-xl-4 { + margin-top: 1rem !important; + margin-bottom: 1rem !important; + } + .mxn-xl-4 { + margin-right: -1rem !important; + margin-left: -1rem !important; + } +} +@media (min-width: 87.5rem) { + .m-xl-5 { + margin: 1.5rem !important; + } + .mt-xl-5 { + margin-top: 1.5rem !important; + } + .mr-xl-5 { + margin-right: 1.5rem !important; + } + .mb-xl-5 { + margin-bottom: 1.5rem !important; + } + .ml-xl-5 { + margin-left: 1.5rem !important; + } + .mx-xl-5 { + margin-right: 1.5rem !important; + margin-left: 1.5rem !important; + } + .my-xl-5 { + margin-top: 1.5rem !important; + margin-bottom: 1.5rem !important; + } + .mxn-xl-5 { + margin-right: -1.5rem !important; + margin-left: -1.5rem !important; + } +} +@media (min-width: 87.5rem) { + .m-xl-6 { + margin: 2rem !important; + } + .mt-xl-6 { + margin-top: 2rem !important; + } + .mr-xl-6 { + margin-right: 2rem !important; + } + .mb-xl-6 { + margin-bottom: 2rem !important; + } + .ml-xl-6 { + margin-left: 2rem !important; + } + .mx-xl-6 { + margin-right: 2rem !important; + margin-left: 2rem !important; + } + .my-xl-6 { + margin-top: 2rem !important; + margin-bottom: 2rem !important; + } + .mxn-xl-6 { + margin-right: -2rem !important; + margin-left: -2rem !important; + } +} +@media (min-width: 87.5rem) { + .m-xl-7 { + margin: 2.5rem !important; + } + .mt-xl-7 { + margin-top: 2.5rem !important; + } + .mr-xl-7 { + margin-right: 2.5rem !important; + } + .mb-xl-7 { + margin-bottom: 2.5rem !important; + } + .ml-xl-7 { + margin-left: 2.5rem !important; + } + .mx-xl-7 { + margin-right: 2.5rem !important; + margin-left: 2.5rem !important; + } + .my-xl-7 { + margin-top: 2.5rem !important; + margin-bottom: 2.5rem !important; + } + .mxn-xl-7 { + margin-right: -2.5rem !important; + margin-left: -2.5rem !important; + } +} +@media (min-width: 87.5rem) { + .m-xl-8 { + margin: 3rem !important; + } + .mt-xl-8 { + margin-top: 3rem !important; + } + .mr-xl-8 { + margin-right: 3rem !important; + } + .mb-xl-8 { + margin-bottom: 3rem !important; + } + .ml-xl-8 { + margin-left: 3rem !important; + } + .mx-xl-8 { + margin-right: 3rem !important; + margin-left: 3rem !important; + } + .my-xl-8 { + margin-top: 3rem !important; + margin-bottom: 3rem !important; + } + .mxn-xl-8 { + margin-right: -3rem !important; + margin-left: -3rem !important; + } +} +@media (min-width: 87.5rem) { + .m-xl-9 { + margin: 3.5rem !important; + } + .mt-xl-9 { + margin-top: 3.5rem !important; + } + .mr-xl-9 { + margin-right: 3.5rem !important; + } + .mb-xl-9 { + margin-bottom: 3.5rem !important; + } + .ml-xl-9 { + margin-left: 3.5rem !important; + } + .mx-xl-9 { + margin-right: 3.5rem !important; + margin-left: 3.5rem !important; + } + .my-xl-9 { + margin-top: 3.5rem !important; + margin-bottom: 3.5rem !important; + } + .mxn-xl-9 { + margin-right: -3.5rem !important; + margin-left: -3.5rem !important; + } +} +@media (min-width: 87.5rem) { + .m-xl-10 { + margin: 4rem !important; + } + .mt-xl-10 { + margin-top: 4rem !important; + } + .mr-xl-10 { + margin-right: 4rem !important; + } + .mb-xl-10 { + margin-bottom: 4rem !important; + } + .ml-xl-10 { + margin-left: 4rem !important; + } + .mx-xl-10 { + margin-right: 4rem !important; + margin-left: 4rem !important; + } + .my-xl-10 { + margin-top: 4rem !important; + margin-bottom: 4rem !important; + } + .mxn-xl-10 { + margin-right: -4rem !important; + margin-left: -4rem !important; + } +} +.p-0 { + padding: 0 !important; +} + +.pt-0 { + padding-top: 0 !important; +} + +.pr-0 { + padding-right: 0 !important; +} + +.pb-0 { + padding-bottom: 0 !important; +} + +.pl-0 { + padding-left: 0 !important; +} + +.px-0 { + padding-right: 0 !important; + padding-left: 0 !important; +} + +.py-0 { + padding-top: 0 !important; + padding-bottom: 0 !important; +} + +.p-1 { + padding: 0.25rem !important; +} + +.pt-1 { + padding-top: 0.25rem !important; +} + +.pr-1 { + padding-right: 0.25rem !important; +} + +.pb-1 { + padding-bottom: 0.25rem !important; +} + +.pl-1 { + padding-left: 0.25rem !important; +} + +.px-1 { + padding-right: 0.25rem !important; + padding-left: 0.25rem !important; +} + +.py-1 { + padding-top: 0.25rem !important; + padding-bottom: 0.25rem !important; +} + +.p-2 { + padding: 0.5rem !important; +} + +.pt-2 { + padding-top: 0.5rem !important; +} + +.pr-2 { + padding-right: 0.5rem !important; +} + +.pb-2 { + padding-bottom: 0.5rem !important; +} + +.pl-2 { + padding-left: 0.5rem !important; +} + +.px-2 { + padding-right: 0.5rem !important; + padding-left: 0.5rem !important; +} + +.py-2 { + padding-top: 0.5rem !important; + padding-bottom: 0.5rem !important; +} + +.p-3 { + padding: 0.75rem !important; +} + +.pt-3 { + padding-top: 0.75rem !important; +} + +.pr-3 { + padding-right: 0.75rem !important; +} + +.pb-3 { + padding-bottom: 0.75rem !important; +} + +.pl-3 { + padding-left: 0.75rem !important; +} + +.px-3 { + padding-right: 0.75rem !important; + padding-left: 0.75rem !important; +} + +.py-3 { + padding-top: 0.75rem !important; + padding-bottom: 0.75rem !important; +} + +.p-4 { + padding: 1rem !important; +} + +.pt-4 { + padding-top: 1rem !important; +} + +.pr-4 { + padding-right: 1rem !important; +} + +.pb-4 { + padding-bottom: 1rem !important; +} + +.pl-4 { + padding-left: 1rem !important; +} + +.px-4 { + padding-right: 1rem !important; + padding-left: 1rem !important; +} + +.py-4 { + padding-top: 1rem !important; + padding-bottom: 1rem !important; +} + +.p-5 { + padding: 1.5rem !important; +} + +.pt-5 { + padding-top: 1.5rem !important; +} + +.pr-5 { + padding-right: 1.5rem !important; +} + +.pb-5 { + padding-bottom: 1.5rem !important; +} + +.pl-5 { + padding-left: 1.5rem !important; +} + +.px-5 { + padding-right: 1.5rem !important; + padding-left: 1.5rem !important; +} + +.py-5 { + padding-top: 1.5rem !important; + padding-bottom: 1.5rem !important; +} + +.p-6 { + padding: 2rem !important; +} + +.pt-6 { + padding-top: 2rem !important; +} + +.pr-6 { + padding-right: 2rem !important; +} + +.pb-6 { + padding-bottom: 2rem !important; +} + +.pl-6 { + padding-left: 2rem !important; +} + +.px-6 { + padding-right: 2rem !important; + padding-left: 2rem !important; +} + +.py-6 { + padding-top: 2rem !important; + padding-bottom: 2rem !important; +} + +.p-7 { + padding: 2.5rem !important; +} + +.pt-7 { + padding-top: 2.5rem !important; +} + +.pr-7 { + padding-right: 2.5rem !important; +} + +.pb-7 { + padding-bottom: 2.5rem !important; +} + +.pl-7 { + padding-left: 2.5rem !important; +} + +.px-7 { + padding-right: 2.5rem !important; + padding-left: 2.5rem !important; +} + +.py-7 { + padding-top: 2.5rem !important; + padding-bottom: 2.5rem !important; +} + +.p-8 { + padding: 3rem !important; +} + +.pt-8 { + padding-top: 3rem !important; +} + +.pr-8 { + padding-right: 3rem !important; +} + +.pb-8 { + padding-bottom: 3rem !important; +} + +.pl-8 { + padding-left: 3rem !important; +} + +.px-8 { + padding-right: 3rem !important; + padding-left: 3rem !important; +} + +.py-8 { + padding-top: 3rem !important; + padding-bottom: 3rem !important; +} + +.p-9 { + padding: 3.5rem !important; +} + +.pt-9 { + padding-top: 3.5rem !important; +} + +.pr-9 { + padding-right: 3.5rem !important; +} + +.pb-9 { + padding-bottom: 3.5rem !important; +} + +.pl-9 { + padding-left: 3.5rem !important; +} + +.px-9 { + padding-right: 3.5rem !important; + padding-left: 3.5rem !important; +} + +.py-9 { + padding-top: 3.5rem !important; + padding-bottom: 3.5rem !important; +} + +.p-10 { + padding: 4rem !important; +} + +.pt-10 { + padding-top: 4rem !important; +} + +.pr-10 { + padding-right: 4rem !important; +} + +.pb-10 { + padding-bottom: 4rem !important; +} + +.pl-10 { + padding-left: 4rem !important; +} + +.px-10 { + padding-right: 4rem !important; + padding-left: 4rem !important; +} + +.py-10 { + padding-top: 4rem !important; + padding-bottom: 4rem !important; +} + +@media (min-width: 20rem) { + .p-xs-0 { + padding: 0 !important; + } + .pt-xs-0 { + padding-top: 0 !important; + } + .pr-xs-0 { + padding-right: 0 !important; + } + .pb-xs-0 { + padding-bottom: 0 !important; + } + .pl-xs-0 { + padding-left: 0 !important; + } + .px-xs-0 { + padding-right: 0 !important; + padding-left: 0 !important; + } + .py-xs-0 { + padding-top: 0 !important; + padding-bottom: 0 !important; + } + .p-xs-1 { + padding: 0.25rem !important; + } + .pt-xs-1 { + padding-top: 0.25rem !important; + } + .pr-xs-1 { + padding-right: 0.25rem !important; + } + .pb-xs-1 { + padding-bottom: 0.25rem !important; + } + .pl-xs-1 { + padding-left: 0.25rem !important; + } + .px-xs-1 { + padding-right: 0.25rem !important; + padding-left: 0.25rem !important; + } + .py-xs-1 { + padding-top: 0.25rem !important; + padding-bottom: 0.25rem !important; + } + .p-xs-2 { + padding: 0.5rem !important; + } + .pt-xs-2 { + padding-top: 0.5rem !important; + } + .pr-xs-2 { + padding-right: 0.5rem !important; + } + .pb-xs-2 { + padding-bottom: 0.5rem !important; + } + .pl-xs-2 { + padding-left: 0.5rem !important; + } + .px-xs-2 { + padding-right: 0.5rem !important; + padding-left: 0.5rem !important; + } + .py-xs-2 { + padding-top: 0.5rem !important; + padding-bottom: 0.5rem !important; + } + .p-xs-3 { + padding: 0.75rem !important; + } + .pt-xs-3 { + padding-top: 0.75rem !important; + } + .pr-xs-3 { + padding-right: 0.75rem !important; + } + .pb-xs-3 { + padding-bottom: 0.75rem !important; + } + .pl-xs-3 { + padding-left: 0.75rem !important; + } + .px-xs-3 { + padding-right: 0.75rem !important; + padding-left: 0.75rem !important; + } + .py-xs-3 { + padding-top: 0.75rem !important; + padding-bottom: 0.75rem !important; + } + .p-xs-4 { + padding: 1rem !important; + } + .pt-xs-4 { + padding-top: 1rem !important; + } + .pr-xs-4 { + padding-right: 1rem !important; + } + .pb-xs-4 { + padding-bottom: 1rem !important; + } + .pl-xs-4 { + padding-left: 1rem !important; + } + .px-xs-4 { + padding-right: 1rem !important; + padding-left: 1rem !important; + } + .py-xs-4 { + padding-top: 1rem !important; + padding-bottom: 1rem !important; + } + .p-xs-5 { + padding: 1.5rem !important; + } + .pt-xs-5 { + padding-top: 1.5rem !important; + } + .pr-xs-5 { + padding-right: 1.5rem !important; + } + .pb-xs-5 { + padding-bottom: 1.5rem !important; + } + .pl-xs-5 { + padding-left: 1.5rem !important; + } + .px-xs-5 { + padding-right: 1.5rem !important; + padding-left: 1.5rem !important; + } + .py-xs-5 { + padding-top: 1.5rem !important; + padding-bottom: 1.5rem !important; + } + .p-xs-6 { + padding: 2rem !important; + } + .pt-xs-6 { + padding-top: 2rem !important; + } + .pr-xs-6 { + padding-right: 2rem !important; + } + .pb-xs-6 { + padding-bottom: 2rem !important; + } + .pl-xs-6 { + padding-left: 2rem !important; + } + .px-xs-6 { + padding-right: 2rem !important; + padding-left: 2rem !important; + } + .py-xs-6 { + padding-top: 2rem !important; + padding-bottom: 2rem !important; + } + .p-xs-7 { + padding: 2.5rem !important; + } + .pt-xs-7 { + padding-top: 2.5rem !important; + } + .pr-xs-7 { + padding-right: 2.5rem !important; + } + .pb-xs-7 { + padding-bottom: 2.5rem !important; + } + .pl-xs-7 { + padding-left: 2.5rem !important; + } + .px-xs-7 { + padding-right: 2.5rem !important; + padding-left: 2.5rem !important; + } + .py-xs-7 { + padding-top: 2.5rem !important; + padding-bottom: 2.5rem !important; + } + .p-xs-8 { + padding: 3rem !important; + } + .pt-xs-8 { + padding-top: 3rem !important; + } + .pr-xs-8 { + padding-right: 3rem !important; + } + .pb-xs-8 { + padding-bottom: 3rem !important; + } + .pl-xs-8 { + padding-left: 3rem !important; + } + .px-xs-8 { + padding-right: 3rem !important; + padding-left: 3rem !important; + } + .py-xs-8 { + padding-top: 3rem !important; + padding-bottom: 3rem !important; + } + .p-xs-9 { + padding: 3.5rem !important; + } + .pt-xs-9 { + padding-top: 3.5rem !important; + } + .pr-xs-9 { + padding-right: 3.5rem !important; + } + .pb-xs-9 { + padding-bottom: 3.5rem !important; + } + .pl-xs-9 { + padding-left: 3.5rem !important; + } + .px-xs-9 { + padding-right: 3.5rem !important; + padding-left: 3.5rem !important; + } + .py-xs-9 { + padding-top: 3.5rem !important; + padding-bottom: 3.5rem !important; + } + .p-xs-10 { + padding: 4rem !important; + } + .pt-xs-10 { + padding-top: 4rem !important; + } + .pr-xs-10 { + padding-right: 4rem !important; + } + .pb-xs-10 { + padding-bottom: 4rem !important; + } + .pl-xs-10 { + padding-left: 4rem !important; + } + .px-xs-10 { + padding-right: 4rem !important; + padding-left: 4rem !important; + } + .py-xs-10 { + padding-top: 4rem !important; + padding-bottom: 4rem !important; + } +} +@media (min-width: 31.25rem) { + .p-sm-0 { + padding: 0 !important; + } + .pt-sm-0 { + padding-top: 0 !important; + } + .pr-sm-0 { + padding-right: 0 !important; + } + .pb-sm-0 { + padding-bottom: 0 !important; + } + .pl-sm-0 { + padding-left: 0 !important; + } + .px-sm-0 { + padding-right: 0 !important; + padding-left: 0 !important; + } + .py-sm-0 { + padding-top: 0 !important; + padding-bottom: 0 !important; + } + .p-sm-1 { + padding: 0.25rem !important; + } + .pt-sm-1 { + padding-top: 0.25rem !important; + } + .pr-sm-1 { + padding-right: 0.25rem !important; + } + .pb-sm-1 { + padding-bottom: 0.25rem !important; + } + .pl-sm-1 { + padding-left: 0.25rem !important; + } + .px-sm-1 { + padding-right: 0.25rem !important; + padding-left: 0.25rem !important; + } + .py-sm-1 { + padding-top: 0.25rem !important; + padding-bottom: 0.25rem !important; + } + .p-sm-2 { + padding: 0.5rem !important; + } + .pt-sm-2 { + padding-top: 0.5rem !important; + } + .pr-sm-2 { + padding-right: 0.5rem !important; + } + .pb-sm-2 { + padding-bottom: 0.5rem !important; + } + .pl-sm-2 { + padding-left: 0.5rem !important; + } + .px-sm-2 { + padding-right: 0.5rem !important; + padding-left: 0.5rem !important; + } + .py-sm-2 { + padding-top: 0.5rem !important; + padding-bottom: 0.5rem !important; + } + .p-sm-3 { + padding: 0.75rem !important; + } + .pt-sm-3 { + padding-top: 0.75rem !important; + } + .pr-sm-3 { + padding-right: 0.75rem !important; + } + .pb-sm-3 { + padding-bottom: 0.75rem !important; + } + .pl-sm-3 { + padding-left: 0.75rem !important; + } + .px-sm-3 { + padding-right: 0.75rem !important; + padding-left: 0.75rem !important; + } + .py-sm-3 { + padding-top: 0.75rem !important; + padding-bottom: 0.75rem !important; + } + .p-sm-4 { + padding: 1rem !important; + } + .pt-sm-4 { + padding-top: 1rem !important; + } + .pr-sm-4 { + padding-right: 1rem !important; + } + .pb-sm-4 { + padding-bottom: 1rem !important; + } + .pl-sm-4 { + padding-left: 1rem !important; + } + .px-sm-4 { + padding-right: 1rem !important; + padding-left: 1rem !important; + } + .py-sm-4 { + padding-top: 1rem !important; + padding-bottom: 1rem !important; + } + .p-sm-5 { + padding: 1.5rem !important; + } + .pt-sm-5 { + padding-top: 1.5rem !important; + } + .pr-sm-5 { + padding-right: 1.5rem !important; + } + .pb-sm-5 { + padding-bottom: 1.5rem !important; + } + .pl-sm-5 { + padding-left: 1.5rem !important; + } + .px-sm-5 { + padding-right: 1.5rem !important; + padding-left: 1.5rem !important; + } + .py-sm-5 { + padding-top: 1.5rem !important; + padding-bottom: 1.5rem !important; + } + .p-sm-6 { + padding: 2rem !important; + } + .pt-sm-6 { + padding-top: 2rem !important; + } + .pr-sm-6 { + padding-right: 2rem !important; + } + .pb-sm-6 { + padding-bottom: 2rem !important; + } + .pl-sm-6 { + padding-left: 2rem !important; + } + .px-sm-6 { + padding-right: 2rem !important; + padding-left: 2rem !important; + } + .py-sm-6 { + padding-top: 2rem !important; + padding-bottom: 2rem !important; + } + .p-sm-7 { + padding: 2.5rem !important; + } + .pt-sm-7 { + padding-top: 2.5rem !important; + } + .pr-sm-7 { + padding-right: 2.5rem !important; + } + .pb-sm-7 { + padding-bottom: 2.5rem !important; + } + .pl-sm-7 { + padding-left: 2.5rem !important; + } + .px-sm-7 { + padding-right: 2.5rem !important; + padding-left: 2.5rem !important; + } + .py-sm-7 { + padding-top: 2.5rem !important; + padding-bottom: 2.5rem !important; + } + .p-sm-8 { + padding: 3rem !important; + } + .pt-sm-8 { + padding-top: 3rem !important; + } + .pr-sm-8 { + padding-right: 3rem !important; + } + .pb-sm-8 { + padding-bottom: 3rem !important; + } + .pl-sm-8 { + padding-left: 3rem !important; + } + .px-sm-8 { + padding-right: 3rem !important; + padding-left: 3rem !important; + } + .py-sm-8 { + padding-top: 3rem !important; + padding-bottom: 3rem !important; + } + .p-sm-9 { + padding: 3.5rem !important; + } + .pt-sm-9 { + padding-top: 3.5rem !important; + } + .pr-sm-9 { + padding-right: 3.5rem !important; + } + .pb-sm-9 { + padding-bottom: 3.5rem !important; + } + .pl-sm-9 { + padding-left: 3.5rem !important; + } + .px-sm-9 { + padding-right: 3.5rem !important; + padding-left: 3.5rem !important; + } + .py-sm-9 { + padding-top: 3.5rem !important; + padding-bottom: 3.5rem !important; + } + .p-sm-10 { + padding: 4rem !important; + } + .pt-sm-10 { + padding-top: 4rem !important; + } + .pr-sm-10 { + padding-right: 4rem !important; + } + .pb-sm-10 { + padding-bottom: 4rem !important; + } + .pl-sm-10 { + padding-left: 4rem !important; + } + .px-sm-10 { + padding-right: 4rem !important; + padding-left: 4rem !important; + } + .py-sm-10 { + padding-top: 4rem !important; + padding-bottom: 4rem !important; + } +} +@media (min-width: 50rem) { + .p-md-0 { + padding: 0 !important; + } + .pt-md-0 { + padding-top: 0 !important; + } + .pr-md-0 { + padding-right: 0 !important; + } + .pb-md-0 { + padding-bottom: 0 !important; + } + .pl-md-0 { + padding-left: 0 !important; + } + .px-md-0 { + padding-right: 0 !important; + padding-left: 0 !important; + } + .py-md-0 { + padding-top: 0 !important; + padding-bottom: 0 !important; + } + .p-md-1 { + padding: 0.25rem !important; + } + .pt-md-1 { + padding-top: 0.25rem !important; + } + .pr-md-1 { + padding-right: 0.25rem !important; + } + .pb-md-1 { + padding-bottom: 0.25rem !important; + } + .pl-md-1 { + padding-left: 0.25rem !important; + } + .px-md-1 { + padding-right: 0.25rem !important; + padding-left: 0.25rem !important; + } + .py-md-1 { + padding-top: 0.25rem !important; + padding-bottom: 0.25rem !important; + } + .p-md-2 { + padding: 0.5rem !important; + } + .pt-md-2 { + padding-top: 0.5rem !important; + } + .pr-md-2 { + padding-right: 0.5rem !important; + } + .pb-md-2 { + padding-bottom: 0.5rem !important; + } + .pl-md-2 { + padding-left: 0.5rem !important; + } + .px-md-2 { + padding-right: 0.5rem !important; + padding-left: 0.5rem !important; + } + .py-md-2 { + padding-top: 0.5rem !important; + padding-bottom: 0.5rem !important; + } + .p-md-3 { + padding: 0.75rem !important; + } + .pt-md-3 { + padding-top: 0.75rem !important; + } + .pr-md-3 { + padding-right: 0.75rem !important; + } + .pb-md-3 { + padding-bottom: 0.75rem !important; + } + .pl-md-3 { + padding-left: 0.75rem !important; + } + .px-md-3 { + padding-right: 0.75rem !important; + padding-left: 0.75rem !important; + } + .py-md-3 { + padding-top: 0.75rem !important; + padding-bottom: 0.75rem !important; + } + .p-md-4 { + padding: 1rem !important; + } + .pt-md-4 { + padding-top: 1rem !important; + } + .pr-md-4 { + padding-right: 1rem !important; + } + .pb-md-4 { + padding-bottom: 1rem !important; + } + .pl-md-4 { + padding-left: 1rem !important; + } + .px-md-4 { + padding-right: 1rem !important; + padding-left: 1rem !important; + } + .py-md-4 { + padding-top: 1rem !important; + padding-bottom: 1rem !important; + } + .p-md-5 { + padding: 1.5rem !important; + } + .pt-md-5 { + padding-top: 1.5rem !important; + } + .pr-md-5 { + padding-right: 1.5rem !important; + } + .pb-md-5 { + padding-bottom: 1.5rem !important; + } + .pl-md-5 { + padding-left: 1.5rem !important; + } + .px-md-5 { + padding-right: 1.5rem !important; + padding-left: 1.5rem !important; + } + .py-md-5 { + padding-top: 1.5rem !important; + padding-bottom: 1.5rem !important; + } + .p-md-6 { + padding: 2rem !important; + } + .pt-md-6 { + padding-top: 2rem !important; + } + .pr-md-6 { + padding-right: 2rem !important; + } + .pb-md-6 { + padding-bottom: 2rem !important; + } + .pl-md-6 { + padding-left: 2rem !important; + } + .px-md-6 { + padding-right: 2rem !important; + padding-left: 2rem !important; + } + .py-md-6 { + padding-top: 2rem !important; + padding-bottom: 2rem !important; + } + .p-md-7 { + padding: 2.5rem !important; + } + .pt-md-7 { + padding-top: 2.5rem !important; + } + .pr-md-7 { + padding-right: 2.5rem !important; + } + .pb-md-7 { + padding-bottom: 2.5rem !important; + } + .pl-md-7 { + padding-left: 2.5rem !important; + } + .px-md-7 { + padding-right: 2.5rem !important; + padding-left: 2.5rem !important; + } + .py-md-7 { + padding-top: 2.5rem !important; + padding-bottom: 2.5rem !important; + } + .p-md-8 { + padding: 3rem !important; + } + .pt-md-8 { + padding-top: 3rem !important; + } + .pr-md-8 { + padding-right: 3rem !important; + } + .pb-md-8 { + padding-bottom: 3rem !important; + } + .pl-md-8 { + padding-left: 3rem !important; + } + .px-md-8 { + padding-right: 3rem !important; + padding-left: 3rem !important; + } + .py-md-8 { + padding-top: 3rem !important; + padding-bottom: 3rem !important; + } + .p-md-9 { + padding: 3.5rem !important; + } + .pt-md-9 { + padding-top: 3.5rem !important; + } + .pr-md-9 { + padding-right: 3.5rem !important; + } + .pb-md-9 { + padding-bottom: 3.5rem !important; + } + .pl-md-9 { + padding-left: 3.5rem !important; + } + .px-md-9 { + padding-right: 3.5rem !important; + padding-left: 3.5rem !important; + } + .py-md-9 { + padding-top: 3.5rem !important; + padding-bottom: 3.5rem !important; + } + .p-md-10 { + padding: 4rem !important; + } + .pt-md-10 { + padding-top: 4rem !important; + } + .pr-md-10 { + padding-right: 4rem !important; + } + .pb-md-10 { + padding-bottom: 4rem !important; + } + .pl-md-10 { + padding-left: 4rem !important; + } + .px-md-10 { + padding-right: 4rem !important; + padding-left: 4rem !important; + } + .py-md-10 { + padding-top: 4rem !important; + padding-bottom: 4rem !important; + } +} +@media (min-width: 66.5rem) { + .p-lg-0 { + padding: 0 !important; + } + .pt-lg-0 { + padding-top: 0 !important; + } + .pr-lg-0 { + padding-right: 0 !important; + } + .pb-lg-0 { + padding-bottom: 0 !important; + } + .pl-lg-0 { + padding-left: 0 !important; + } + .px-lg-0 { + padding-right: 0 !important; + padding-left: 0 !important; + } + .py-lg-0 { + padding-top: 0 !important; + padding-bottom: 0 !important; + } + .p-lg-1 { + padding: 0.25rem !important; + } + .pt-lg-1 { + padding-top: 0.25rem !important; + } + .pr-lg-1 { + padding-right: 0.25rem !important; + } + .pb-lg-1 { + padding-bottom: 0.25rem !important; + } + .pl-lg-1 { + padding-left: 0.25rem !important; + } + .px-lg-1 { + padding-right: 0.25rem !important; + padding-left: 0.25rem !important; + } + .py-lg-1 { + padding-top: 0.25rem !important; + padding-bottom: 0.25rem !important; + } + .p-lg-2 { + padding: 0.5rem !important; + } + .pt-lg-2 { + padding-top: 0.5rem !important; + } + .pr-lg-2 { + padding-right: 0.5rem !important; + } + .pb-lg-2 { + padding-bottom: 0.5rem !important; + } + .pl-lg-2 { + padding-left: 0.5rem !important; + } + .px-lg-2 { + padding-right: 0.5rem !important; + padding-left: 0.5rem !important; + } + .py-lg-2 { + padding-top: 0.5rem !important; + padding-bottom: 0.5rem !important; + } + .p-lg-3 { + padding: 0.75rem !important; + } + .pt-lg-3 { + padding-top: 0.75rem !important; + } + .pr-lg-3 { + padding-right: 0.75rem !important; + } + .pb-lg-3 { + padding-bottom: 0.75rem !important; + } + .pl-lg-3 { + padding-left: 0.75rem !important; + } + .px-lg-3 { + padding-right: 0.75rem !important; + padding-left: 0.75rem !important; + } + .py-lg-3 { + padding-top: 0.75rem !important; + padding-bottom: 0.75rem !important; + } + .p-lg-4 { + padding: 1rem !important; + } + .pt-lg-4 { + padding-top: 1rem !important; + } + .pr-lg-4 { + padding-right: 1rem !important; + } + .pb-lg-4 { + padding-bottom: 1rem !important; + } + .pl-lg-4 { + padding-left: 1rem !important; + } + .px-lg-4 { + padding-right: 1rem !important; + padding-left: 1rem !important; + } + .py-lg-4 { + padding-top: 1rem !important; + padding-bottom: 1rem !important; + } + .p-lg-5 { + padding: 1.5rem !important; + } + .pt-lg-5 { + padding-top: 1.5rem !important; + } + .pr-lg-5 { + padding-right: 1.5rem !important; + } + .pb-lg-5 { + padding-bottom: 1.5rem !important; + } + .pl-lg-5 { + padding-left: 1.5rem !important; + } + .px-lg-5 { + padding-right: 1.5rem !important; + padding-left: 1.5rem !important; + } + .py-lg-5 { + padding-top: 1.5rem !important; + padding-bottom: 1.5rem !important; + } + .p-lg-6 { + padding: 2rem !important; + } + .pt-lg-6 { + padding-top: 2rem !important; + } + .pr-lg-6 { + padding-right: 2rem !important; + } + .pb-lg-6 { + padding-bottom: 2rem !important; + } + .pl-lg-6 { + padding-left: 2rem !important; + } + .px-lg-6 { + padding-right: 2rem !important; + padding-left: 2rem !important; + } + .py-lg-6 { + padding-top: 2rem !important; + padding-bottom: 2rem !important; + } + .p-lg-7 { + padding: 2.5rem !important; + } + .pt-lg-7 { + padding-top: 2.5rem !important; + } + .pr-lg-7 { + padding-right: 2.5rem !important; + } + .pb-lg-7 { + padding-bottom: 2.5rem !important; + } + .pl-lg-7 { + padding-left: 2.5rem !important; + } + .px-lg-7 { + padding-right: 2.5rem !important; + padding-left: 2.5rem !important; + } + .py-lg-7 { + padding-top: 2.5rem !important; + padding-bottom: 2.5rem !important; + } + .p-lg-8 { + padding: 3rem !important; + } + .pt-lg-8 { + padding-top: 3rem !important; + } + .pr-lg-8 { + padding-right: 3rem !important; + } + .pb-lg-8 { + padding-bottom: 3rem !important; + } + .pl-lg-8 { + padding-left: 3rem !important; + } + .px-lg-8 { + padding-right: 3rem !important; + padding-left: 3rem !important; + } + .py-lg-8 { + padding-top: 3rem !important; + padding-bottom: 3rem !important; + } + .p-lg-9 { + padding: 3.5rem !important; + } + .pt-lg-9 { + padding-top: 3.5rem !important; + } + .pr-lg-9 { + padding-right: 3.5rem !important; + } + .pb-lg-9 { + padding-bottom: 3.5rem !important; + } + .pl-lg-9 { + padding-left: 3.5rem !important; + } + .px-lg-9 { + padding-right: 3.5rem !important; + padding-left: 3.5rem !important; + } + .py-lg-9 { + padding-top: 3.5rem !important; + padding-bottom: 3.5rem !important; + } + .p-lg-10 { + padding: 4rem !important; + } + .pt-lg-10 { + padding-top: 4rem !important; + } + .pr-lg-10 { + padding-right: 4rem !important; + } + .pb-lg-10 { + padding-bottom: 4rem !important; + } + .pl-lg-10 { + padding-left: 4rem !important; + } + .px-lg-10 { + padding-right: 4rem !important; + padding-left: 4rem !important; + } + .py-lg-10 { + padding-top: 4rem !important; + padding-bottom: 4rem !important; + } +} +@media (min-width: 87.5rem) { + .p-xl-0 { + padding: 0 !important; + } + .pt-xl-0 { + padding-top: 0 !important; + } + .pr-xl-0 { + padding-right: 0 !important; + } + .pb-xl-0 { + padding-bottom: 0 !important; + } + .pl-xl-0 { + padding-left: 0 !important; + } + .px-xl-0 { + padding-right: 0 !important; + padding-left: 0 !important; + } + .py-xl-0 { + padding-top: 0 !important; + padding-bottom: 0 !important; + } + .p-xl-1 { + padding: 0.25rem !important; + } + .pt-xl-1 { + padding-top: 0.25rem !important; + } + .pr-xl-1 { + padding-right: 0.25rem !important; + } + .pb-xl-1 { + padding-bottom: 0.25rem !important; + } + .pl-xl-1 { + padding-left: 0.25rem !important; + } + .px-xl-1 { + padding-right: 0.25rem !important; + padding-left: 0.25rem !important; + } + .py-xl-1 { + padding-top: 0.25rem !important; + padding-bottom: 0.25rem !important; + } + .p-xl-2 { + padding: 0.5rem !important; + } + .pt-xl-2 { + padding-top: 0.5rem !important; + } + .pr-xl-2 { + padding-right: 0.5rem !important; + } + .pb-xl-2 { + padding-bottom: 0.5rem !important; + } + .pl-xl-2 { + padding-left: 0.5rem !important; + } + .px-xl-2 { + padding-right: 0.5rem !important; + padding-left: 0.5rem !important; + } + .py-xl-2 { + padding-top: 0.5rem !important; + padding-bottom: 0.5rem !important; + } + .p-xl-3 { + padding: 0.75rem !important; + } + .pt-xl-3 { + padding-top: 0.75rem !important; + } + .pr-xl-3 { + padding-right: 0.75rem !important; + } + .pb-xl-3 { + padding-bottom: 0.75rem !important; + } + .pl-xl-3 { + padding-left: 0.75rem !important; + } + .px-xl-3 { + padding-right: 0.75rem !important; + padding-left: 0.75rem !important; + } + .py-xl-3 { + padding-top: 0.75rem !important; + padding-bottom: 0.75rem !important; + } + .p-xl-4 { + padding: 1rem !important; + } + .pt-xl-4 { + padding-top: 1rem !important; + } + .pr-xl-4 { + padding-right: 1rem !important; + } + .pb-xl-4 { + padding-bottom: 1rem !important; + } + .pl-xl-4 { + padding-left: 1rem !important; + } + .px-xl-4 { + padding-right: 1rem !important; + padding-left: 1rem !important; + } + .py-xl-4 { + padding-top: 1rem !important; + padding-bottom: 1rem !important; + } + .p-xl-5 { + padding: 1.5rem !important; + } + .pt-xl-5 { + padding-top: 1.5rem !important; + } + .pr-xl-5 { + padding-right: 1.5rem !important; + } + .pb-xl-5 { + padding-bottom: 1.5rem !important; + } + .pl-xl-5 { + padding-left: 1.5rem !important; + } + .px-xl-5 { + padding-right: 1.5rem !important; + padding-left: 1.5rem !important; + } + .py-xl-5 { + padding-top: 1.5rem !important; + padding-bottom: 1.5rem !important; + } + .p-xl-6 { + padding: 2rem !important; + } + .pt-xl-6 { + padding-top: 2rem !important; + } + .pr-xl-6 { + padding-right: 2rem !important; + } + .pb-xl-6 { + padding-bottom: 2rem !important; + } + .pl-xl-6 { + padding-left: 2rem !important; + } + .px-xl-6 { + padding-right: 2rem !important; + padding-left: 2rem !important; + } + .py-xl-6 { + padding-top: 2rem !important; + padding-bottom: 2rem !important; + } + .p-xl-7 { + padding: 2.5rem !important; + } + .pt-xl-7 { + padding-top: 2.5rem !important; + } + .pr-xl-7 { + padding-right: 2.5rem !important; + } + .pb-xl-7 { + padding-bottom: 2.5rem !important; + } + .pl-xl-7 { + padding-left: 2.5rem !important; + } + .px-xl-7 { + padding-right: 2.5rem !important; + padding-left: 2.5rem !important; + } + .py-xl-7 { + padding-top: 2.5rem !important; + padding-bottom: 2.5rem !important; + } + .p-xl-8 { + padding: 3rem !important; + } + .pt-xl-8 { + padding-top: 3rem !important; + } + .pr-xl-8 { + padding-right: 3rem !important; + } + .pb-xl-8 { + padding-bottom: 3rem !important; + } + .pl-xl-8 { + padding-left: 3rem !important; + } + .px-xl-8 { + padding-right: 3rem !important; + padding-left: 3rem !important; + } + .py-xl-8 { + padding-top: 3rem !important; + padding-bottom: 3rem !important; + } + .p-xl-9 { + padding: 3.5rem !important; + } + .pt-xl-9 { + padding-top: 3.5rem !important; + } + .pr-xl-9 { + padding-right: 3.5rem !important; + } + .pb-xl-9 { + padding-bottom: 3.5rem !important; + } + .pl-xl-9 { + padding-left: 3.5rem !important; + } + .px-xl-9 { + padding-right: 3.5rem !important; + padding-left: 3.5rem !important; + } + .py-xl-9 { + padding-top: 3.5rem !important; + padding-bottom: 3.5rem !important; + } + .p-xl-10 { + padding: 4rem !important; + } + .pt-xl-10 { + padding-top: 4rem !important; + } + .pr-xl-10 { + padding-right: 4rem !important; + } + .pb-xl-10 { + padding-bottom: 4rem !important; + } + .pl-xl-10 { + padding-left: 4rem !important; + } + .px-xl-10 { + padding-right: 4rem !important; + padding-left: 4rem !important; + } + .py-xl-10 { + padding-top: 4rem !important; + padding-bottom: 4rem !important; + } +} +@media print { + .site-footer, + .site-button, + #edit-this-page, + #back-to-top, + .site-nav, + .main-header { + display: none !important; + } + .side-bar { + width: 100%; + height: auto; + border-right: 0 !important; + } + .site-header { + border-bottom: 1px solid #eeebee; + } + .site-title { + font-size: 1rem !important; + font-weight: 700 !important; + } + .text-small { + font-size: 8pt !important; + } + pre.highlight { + border: 1px solid #eeebee; + } + .main { + max-width: none; + margin-left: 0; + } +} +a.skip-to-main { + left: -999px; + position: absolute; + top: auto; + width: 1px; + height: 1px; + overflow: hidden; + z-index: -999; +} + +a.skip-to-main:focus, +a.skip-to-main:active { + color: #7253ed; + background-color: #fff; + left: auto; + top: auto; + width: 30%; + height: auto; + overflow: auto; + margin: 10px 35%; + padding: 5px; + border-radius: 15px; + border: 4px solid #5e41d0; + text-align: center; + font-size: 1.2em; + z-index: 999; +} + +div.opaque { + background-color: #fff; +} + +/*# sourceMappingURL=just-the-docs-default.css.map */ \ No newline at end of file diff --git a/docs/_site/assets/css/just-the-docs-default.css.map b/docs/_site/assets/css/just-the-docs-default.css.map new file mode 100644 index 00000000..52c243db --- /dev/null +++ b/docs/_site/assets/css/just-the-docs-default.css.map @@ -0,0 +1 @@ +{"version":3,"sourceRoot":"","sources":["../../../../../../../../../C:/Users/peteb/.local/share/gem/ruby/3.2.0/gems/just-the-docs-0.7.0/_sass/vendor/OneLightJekyll/syntax.scss","../../../../../../../../../C:/Users/peteb/.local/share/gem/ruby/3.2.0/gems/just-the-docs-0.7.0/_sass/vendor/normalize.scss/normalize.scss","../../../../../../../../../C:/Users/peteb/.local/share/gem/ruby/3.2.0/gems/just-the-docs-0.7.0/_sass/base.scss","../../../../../../../../../C:/Users/peteb/.local/share/gem/ruby/3.2.0/gems/just-the-docs-0.7.0/_sass/color_schemes/light.scss","../../../../../../../../../C:/Users/peteb/.local/share/gem/ruby/3.2.0/gems/just-the-docs-0.7.0/_sass/support/mixins/_typography.scss","../../../../../../../../../C:/Users/peteb/.local/share/gem/ruby/3.2.0/gems/just-the-docs-0.7.0/_sass/support/mixins/_layout.scss","../../../../../../../../../C:/Users/peteb/.local/share/gem/ruby/3.2.0/gems/just-the-docs-0.7.0/_sass/support/_variables.scss","../../../../../../../../../C:/Users/peteb/.local/share/gem/ruby/3.2.0/gems/just-the-docs-0.7.0/_sass/layout.scss","../../../../../../../../../C:/Users/peteb/.local/share/gem/ruby/3.2.0/gems/just-the-docs-0.7.0/_sass/content.scss","../../../../../../../../../C:/Users/peteb/.local/share/gem/ruby/3.2.0/gems/just-the-docs-0.7.0/_sass/navigation.scss","../../../../../../../../../C:/Users/peteb/.local/share/gem/ruby/3.2.0/gems/just-the-docs-0.7.0/_sass/typography.scss","../../../../../../../../../C:/Users/peteb/.local/share/gem/ruby/3.2.0/gems/just-the-docs-0.7.0/_sass/labels.scss","../../../../../../../../../C:/Users/peteb/.local/share/gem/ruby/3.2.0/gems/just-the-docs-0.7.0/_sass/buttons.scss","../../../../../../../../../C:/Users/peteb/.local/share/gem/ruby/3.2.0/gems/just-the-docs-0.7.0/_sass/support/mixins/_buttons.scss","../../../../../../../../../C:/Users/peteb/.local/share/gem/ruby/3.2.0/gems/just-the-docs-0.7.0/_sass/search.scss","../../../../../../../../../C:/Users/peteb/.local/share/gem/ruby/3.2.0/gems/just-the-docs-0.7.0/_sass/tables.scss","../../../../../../../../../C:/Users/peteb/.local/share/gem/ruby/3.2.0/gems/just-the-docs-0.7.0/_sass/code.scss","../../../../../../../../../C:/Users/peteb/.local/share/gem/ruby/3.2.0/gems/just-the-docs-0.7.0/_sass/utilities/_colors.scss","../../../../../../../../../C:/Users/peteb/.local/share/gem/ruby/3.2.0/gems/just-the-docs-0.7.0/_sass/utilities/_layout.scss","../../../../../../../../../C:/Users/peteb/.local/share/gem/ruby/3.2.0/gems/just-the-docs-0.7.0/_sass/utilities/_typography.scss","../../../../../../../../../C:/Users/peteb/.local/share/gem/ruby/3.2.0/gems/just-the-docs-0.7.0/_sass/utilities/_lists.scss","../../../../../../../../../C:/Users/peteb/.local/share/gem/ruby/3.2.0/gems/just-the-docs-0.7.0/_sass/utilities/_spacing.scss","../../../../../../../../../C:/Users/peteb/.local/share/gem/ruby/3.2.0/gems/just-the-docs-0.7.0/_sass/print.scss","../../../../../../../../../C:/Users/peteb/.local/share/gem/ruby/3.2.0/gems/just-the-docs-0.7.0/_sass/skiptomain.scss","just-the-docs-default.scss"],"names":[],"mappings":";AAEA;AAAA;EAEE;EACA;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;EACA;;;AAEF;EACE;EACA;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;EACA;;;AAEF;EACE;EACA;;;AAEF;EACE;EACA;;;AAEF;EACE;EACA;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AC9MF;AAEA;AAAA;AAGA;AAAA;AAAA;AAAA;AAKA;EACE;EACA;;;AAGF;AAAA;AAGA;AAAA;AAAA;AAIA;EACE;;;AAGF;AAAA;AAAA;AAIA;EACE;;;AAGF;AAAA;AAAA;AAAA;AAKA;EACE;EACA;;;AAGF;AAAA;AAGA;AAAA;AAAA;AAAA;AAKA;EACE;EACA;EACA;;;AAGF;AAAA;AAAA;AAAA;AAKA;EACE;EACA;;;AAGF;AAAA;AAGA;AAAA;AAAA;AAIA;EACE;;;AAGF;AAAA;AAAA;AAAA;AAKA;EACE;EACA;EACA;;;AAGF;AAAA;AAAA;AAIA;AAAA;EAEE;;;AAGF;AAAA;AAAA;AAAA;AAKA;AAAA;AAAA;EAGE;EACA;;;AAGF;AAAA;AAAA;AAIA;EACE;;;AAGF;AAAA;AAAA;AAAA;AAKA;AAAA;EAEE;EACA;EACA;EACA;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;AAAA;AAGA;AAAA;AAAA;AAIA;EACE;;;AAGF;AAAA;AAGA;AAAA;AAAA;AAAA;AAKA;AAAA;AAAA;AAAA;AAAA;EAKE;EACA;EACA;EACA;;;AAGF;AAAA;AAAA;AAAA;AAKA;AAAA;AAEE;EACA;;;AAGF;AAAA;AAAA;AAAA;AAKA;AAAA;AAEE;EACA;;;AAGF;AAAA;AAAA;AAIA;AAAA;AAAA;AAAA;EAIE;;;AAGF;AAAA;AAAA;AAIA;AAAA;AAAA;AAAA;EAIE;EACA;;;AAGF;AAAA;AAAA;AAIA;AAAA;AAAA;AAAA;EAIE;;;AAGF;AAAA;AAAA;AAIA;EACE;;;AAGF;AAAA;AAAA;AAAA;AAAA;AAAA;AAOA;EACE;EACA;EACA;EACA;EACA;EACA;;;AAGF;AAAA;AAAA;AAIA;EACE;;;AAGF;AAAA;AAAA;AAIA;EACE;;;AAGF;AAAA;AAAA;AAAA;AAKA;AAAA;EAEE;EACA;;;AAGF;AAAA;AAAA;AAIA;AAAA;EAEE;;;AAGF;AAAA;AAAA;AAAA;AAKA;EACE;EACA;;;AAGF;AAAA;AAAA;AAIA;EACE;;;AAGF;AAAA;AAAA;AAAA;AAKA;EACE;EACA;;;AAGF;AAAA;AAGA;AAAA;AAAA;AAIA;EACE;;;AAGF;AAAA;AAAA;AAIA;EACE;;;AAGF;AAAA;AAGA;AAAA;AAAA;AAIA;EACE;;;AAGF;AAAA;AAAA;AAIA;EACE;;;AC1VF;EACE,cCJa;;;ADOf;EACE;;;AAGF;EEcE;EFXA;;AGAE;EHHJ;IEiBI;;;;AFXJ;EACE,aIfiB;EJgBjB;EACA,aIbiB;EJcjB,OIUY;EJTZ,kBIOM;EJNN;;;AAGF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAYE;;;AAGF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAOE;EACA;EACA;EACA,aI1CyB;EJ2CzB,OIlBY;;;AJqBd;EACE;EACA;;;AAGF;EACE,OItBW;EJuBX;;;AAGF;EACE;EACA,uBI/BY;EJgCZ;;AAEA;EACE;;;AAIJ;EACE,aIvEiB;EJwEjB;EACA,aIvEiB;;;AJ0EnB;AAAA;EAEE;;;AAGF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;EACA;EACA,kBI/DY;EJgEZ;;;AAIF;EACE;EAGA;EACA;EACA;EACA;;;AK7GF;EACE;EACA;EACA;EACA,kBD6BY;;ADrBV;EEZJ;IAOI;IACA;IACA,ODwFW;ICvFX;IACA;IACA;;;AFAA;EEZJ;IAgBI;IACA,WD+EQ;;;;ADpFR;EESJ;IAEI;IACA,WD6EY;IC5EZ,aDwEW;;;ADrFX;EESJ;IAUI;;;;AAQJ;EFhBE,eCuDK;EDtDL,cCsDK;ECpCL,aDoCK;ECnCL,gBDmCK;;ADlEH;EE2BJ;IFZI,eCqDG;IDpDH,cCoDG;;;ADpEH;EE2BJ;IAOI,aDkCG;ICjCH,gBDiCG;;;;AC7BP;EACE;EACA;EACA,kBDrBY;;ADrBV;EEuCJ;IAMI;IACA;IACA,QD2CY;IC1CZ,kBDjCI;ICkCJ;;;AAGF;EACE;;AFrDA;EEoDF;IAII;;;;AAKN;AAAA;AAAA;EAGE;;AFhEE;EE6DJ;AAAA;AAAA;IAMI,ODiBQ;;;;ACbZ;EACE;;AAEA;EACE;;AF3EA;EEuEJ;IAQI;IACA,aDVG;ICWH,gBDfG;ICgBH;IACA;;;;AAIJ;EACE;EACA,YDCc;ECAd;;AF1FE;EEuFJ;IAMI,QDHY;ICIZ,YDJY;ICKZ;;;;AAIJ;EFxFE,eCuDK;EDtDL,cCsDK;ECoCL;EACA;EACA;EACA;EACA,aDzCK;EC0CL,gBD1CK;EC2CL,ODxFY;EFOZ;;AC3BE;EEmGJ;IFpFI,eCqDG;IDpDH,cCoDG;;;ADpEH;EEmGJ;IHrEI;IACA,aEpCuB;;;ADKvB;EEmGJ;IAaI,aDhDG;ICiDH,gBDjDG;;;;ACgEP;EACE;EACA;EACA,SDjEK;ECkEL;;;AFpIE;EEwIF;IACE;;;AAIJ;EACE;;;AAQF;EACE;;;AASF;EACE;EACA,gBD1FM;EC2FN;;AFnKE;EEgKJ;IAMI;IACA;;;;AAMJ;EFlKE,eCuDK;EDtDL,cCsDK;EC8GL;EACA;EACA;EACA,aDjHK;ECkHL,gBDlHK;ECmHL,ODrKY;EFrBZ;;ACKE;EE6KJ;IF9JI,eCqDG;IDpDH,cCoDG;;;ADpEH;EE6KJ;IH/KI;;;ACEA;EE6KJ;IAYI;IACA;;;;AAIJ;EACE,OD5HK;EC6HL,QD7HK;EC8HL,ODxKW;;;AElCb;EACE,aFEoB;;AEApB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAOE;;AAGF;EACE;EACA;;AAGF;AAAA;EAEE;;AAIA;EACE,YF+CC;;AE3CL;EACE;EACA;;AAEA;EACE;;AAEA;EACE;EACA;EACA;EACA,OFfM;EEgBN;EACA;EJ9BN;;ACHE;EG2BE;IJrBF;;;ACNA;EG2BE;IAUI;;;AAIJ;EACE;;AAGE;EACE;EACA;;AAOV;EACE;;AAGE;EACE;EACA;EACA,OF7CM;EE8CN;;AAMJ;EACE;;AAIJ;EACE;EACA;;AAKF;EACE;;AAGF;EACE;;AAGF;EACE;EACA;;AAGF;AAAA;EAEE;;AAGF;EACE;EACA;EACA;;AAEA;EACE;;AAIJ;EACE;EACA;EACA;;AAmBE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EACE;;AASF;AAAA;AAAA;AAAA;AAAA;AAAA;EAEE;;AAKN;EACE;EACA;EACA,OFnFG;EEoFH;EACA,eFzFG;EE0FH,cF1FG;EE2FH;;AH1JA;EGmJF;IAUI;IACA;;;AAGF;EACE;EACA;EACA;EACA,OF5IO;EE6IP;;AAYF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EACE;;AAIJ;EACE;;AAGF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAOE;EACA;EACA;;AAEA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAKE;;AAGF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EACE;;AAIJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAWE,YF9JG;;;AG3EP;EACE;EACA;EACA;EACA;;AAEA;ELgBA;EKbE;EACA;;AJCA;EILF;ILmBE;;;ACdA;EILF;ILQA;;;ACHE;EILF;ILWE;;;AKDA;EACE;EACA,YH+DC;EG9DD,aHuDC;EGtDD,gBHsDC;EGrDD;EAEE,eH0DD;EGzDC,cHqDD;;ADlEH;EIKA;IAeI,YHgDD;IG/CC;IAEE,eH6CH;IG5CG,cH4CH;;;AGrCD;EACE,OHkCD;EGjCC,QHiCD;EGhCC;;AAGF;EACE;EACA;;AAGF;EAEE;;AASJ;EACE;EAEE;EAGF,OHWC;EGVD,QHUC;EGTD;EACA,OHrCO;;ADzBT;EIqDA;IAYI,OHGD;IGFC,QHED;IGDC;;;AAGF;EACE;;AAQA;EACE;;AAKN;EACE;EACA,cHtBC;EGuBD;;AAEA;EACE;;AAEA;EACE,OH7EI;;AGgFN;EACE,OHjFI;;AGuFR;EAEI;;AAMJ;EACE;;;AAMR;EACE;EACA;EACA;EACA;EACA;ELjIA;;ACKE;EIuHJ;ILzHI;;;ACEA;EIuHJ;IASI;IACA,YH/DG;IGgEH;;EAEA;IACE;;;;AAMJ;EACE;;AAEA;EACE;;AAGE;EACE,OH1HG;;AG6HL;EACE,OH9HG;;;AGuIb;EACE;EACA;ELvKA;;ACKE;EIgKJ;ILlKI;;;AKuKF;EACE;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;;AJjLA;EIgKJ;IAqBI,eHnHG;;;;ADlEH;EI2LJ;IAEI;;;;AAIJ;EACE;EACA,eHlIK;EGmIL;;;AAGF;EACE;EL7MA;;ACKE;EIuMJ;ILzMI;;;AK6MF;EACE;;AAGF;EACE;EACA,cHjJG;EGkJH,aHlJG;EGmJH,OHnMU;EGoMV;;AAIA;EACE;;;ACpON;AAAA;ENwDE;EACA,aEnDyB;EIFzB;;ALOE;EKXJ;AAAA;IN4DI;;;;AMrDJ;AAAA;AAAA;EN+BE;;AC3BE;EKJJ;AAAA;AAAA;INkCI;IACA,aEpCuB;;;;AIO3B;AAAA;ENiBE;;ACnBE;EKEJ;AAAA;INoBI;;;;AMfJ;AAAA;ENZE;EMgBA;EACA;EACA;;ALbE;EKOJ;AAAA;INTI;;;;AMkBJ;EACE;;;AAGF;AAAA;ENjBE;;ACHE;EKoBJ;AAAA;INdI;;;;AMmBJ;AAAA;EN9BE;;ACKE;EKyBJ;AAAA;IN3BI;;;;AMgCJ;ENnCE;;ACKE;EK8BJ;INhCI;;;;AMoCJ;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;ACvDF;AAAA;EAEE;EACA;EACA,cLoEK;EKnEL,aLmEK;EKlEL,OLiBM;EKhBN;EACA;EACA,kBL6BS;EFnCT;EOSA;;ANJE;EMRJ;AAAA;IPMI;;;;AOSJ;EACE,kBL2BU;;;AKxBZ;EACE,kBLcW;;;AKXb;EACE,kBL2BQ;;;AKxBV;EACE,OLFY;EKGZ,kBLkBW;;;AMlDb;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,ON2BW;EM1BX;EACA;EACA;EACA,kBTTkB;ESUlB;EACA,eNyEc;EMxEd,YACE;EAEF;;AAEA;EACE;EACA;EACA;;AAGF;EAEE;;AAGF;EAEE;;AAGF;EAIE;EACA;;AAGF;EAGE;EACA;EACA;;AAGF;EACE;;AAKA;EAEE;EACA;EACA;EACA;EACA;;;AAKN;EACE,ONnCW;EMoCX;EACA;;AAEA;EAIE;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA,YACE;;AAIJ;EAEE;;;AAIJ;ECnGE,OP0BM;EOzBN;EACA;EACA,YACE;;AAGF;EAEE,OPiBI;EOhBJ;EACA;;AAGF;EAGE;EACA;EACA;;AAGF;EACE;;;ADgFJ;ECvGE,OP0BM;EOzBN;EACA;EACA,YACE;;AAGF;EAEE,OPiBI;EOhBJ;EACA;;AAGF;EAGE;EACA;EACA;;AAGF;EACE;;;ADoFJ;EC3GE,OP0BM;EOzBN;EACA;EACA,YACE;;AAGF;EAEE,OPiBI;EOhBJ;EACA;;AAGF;EAGE;EACA;EACA;;AAGF;EACE;;;ADwFJ;EC/GE,OP0BM;EOzBN;EACA;EACA,YACE;;AAGF;EAEE,OPiBI;EOhBJ;EACA;;AAGF;EAGE;EACA;EACA;;AAGF;EACE;;;AD4FJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;;AE3HF;EACE;EACA;EACA;EACA,QRgFM;EQ/EN,SRuEK;EQtEL;;ATME;ESZJ;IASI;IACA;IACA;IACA;IACA;;;;AAIJ;EACE;EACA;EACA,QR8DK;EQ7DL;EACA,eRmEc;EQlEd,YACE;EAEF;;ATdE;ESKJ;IAYI;IACA;IACA,WRwEmB;IQvEnB;IACA;IACA;IACA;;;;AAIJ;EACE;EACA;EACA;EACA;EACA;EACA,ORhBY;EQiBZ,kBRnBM;EQoBN;EACA;EACA;EACA;EACA;;ATvCE;ES2BJ;IAeI;IACA;IACA,kBR7BI;IQ8BJ;;;AAGF;EACE;;AAEA;EACE,OR3BO;;;AQgCb;EACE;EACA;EACA;EACA,cRKK;;ADlEH;ESyDJ;IAOI,cRIG;IQHH;;;AAGF;EACE;EACA;EACA;EACA,ORxDU;;;AQ4Dd;EACE;EACA;EACA;EACA;EACA;EACA;EACA,kBRpEM;EQqEN,4BRPc;EQQd,2BRRc;EQSd,YACE;;ATvFA;ES4EJ;IAeI;IACA,ORDmB;IQEnB;;;;AAIJ;EACE;EACA,eRpCK;EQqCL;EVzFA;;ACXE;ESiGJ;IVnFI;;;ACdA;ESiGJ;IV9FE;;;ACHE;ESiGJ;IV3FI;;;;AUsGJ;EACE;EACA;;;AAGF;EACE;EACA;;AAEA;EAEE,kBX3Ha;;;AW+HjB;EACE;EACA,aR7DK;EQ8DL,gBR9DK;;ADhEH;ES2HJ;IAMI;IACA;IACA,eRnEG;IQoEH;;;;AAIJ;EACE;EACA;EACA;;AAEA;EACE;EV3IF;;ACHE;ES6IF;IVvIE;;;ACNA;ES6IF;IVlJA;;;ACKE;ES6IF;IV/IE;;;AUwJF;EACE,ORrFG;EQsFH,QRtFG;EQuFH,cRzFG;EQ0FH,ORjIS;EQkIT;;AAGF;EACE;;;AAIJ;EACE;EACA;;;AAGF;EACE;EACA;EACA;EACA,OR5JY;EQ6JZ;EACA;EV3LA;;ACaE;ESwKJ;IVlLI;;;;AU4LJ;EACE;EACA,aRpHK;EQqHL,gBRrHK;EQsHL,cRpHK;EQqHL,aRvHK;EQwHL,ORxKY;EQyKZ;EACA,aR9GO;EQ+GP,mBRrKY;EF3BZ;;ACKE;ESkLJ;IVpLI;;;ACEA;ESkLJ;IAaI;IACA;IACA,cRjIG;IQkIH;IACA;;;;AAIJ;EACE,YRzIK;;;AQ4IP;EACE;;;AAGF;EACE;EV7MA;;ACHE;ES+MJ;IVzMI;;;;AU8MJ;EACE;EACA,ORpJK;EQqJL,QRrJK;EQsJL;EACA,ORlJK;EQmJL,QRnJK;EQoJL,kBR5MM;EQ6MN;EACA;EACA,YACE;EAEF;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,YACE;;;AAMF;EACE;EACA;EACA;EACA;EACA;EACA;;AAGF;EACE,QRvLI;EQwLJ;;AThQA;ES8PF;IAKI,ORxKiB;IQyKjB,YACE;;;AAKN;EACE,kBR5PI;;ADfJ;ES0QF;IAII;;;AT9QF;ESkRF;IAEI;;;AAIJ;EACE;;AAGF;EACE;EACA;EACA;EACA,YACE;;ATjSF;ESuSA;IACE;IACA;IACA;;;AAIJ;EACE,aRvOI;;ADxEJ;ES8SF;IAII;;;;AC7TN;EACE;EACA;EACA;EACA,eT0EK;ESzEL;EACA,eTkFc;ESjFd,YACE;;;AAIJ;EACE;EACA;EACA;;;AAGF;AAAA;EXJE;EWQA;EACA;EACA,kBTEM;ESDN;EACA;;AVfE;EUOJ;AAAA;IXDI;;;AWWF;AAAA;EACE;;;AAOE;AAAA;EAEE;;AAGF;EACE,gBTkCD;;;AS3BL;EACE;;;AC9CF;EACE;EACA;EACA,kBVyBU;EUxBV;EACA,eV+EY;;;AU1EhB;EACE,cVkBY;;;AUiCd;AAAA;AAAA;EAGE;EACA,eVMK;EULL,kBVvCY;EUwCZ,eVgBc;EUfd;EACA;EACA;EACA;;AAIA;AAAA;AAAA;EACE,OVLG;EUMH;EACA;EACA;EACA;EACA;EACA,kBVvDU;EUwDV,OV5DU;EU6DV;;AAEA;AAAA;AAAA;EACE,MVhEQ;;AUmEV;AAAA;AAAA;EACE;EACA;EACA;;AAGF;AAAA;AAAA;EACE;;AAMF;AAAA;AAAA;EACE;EACA;;;AASJ;EACE;EACA,SV7CG;EU8CH;EACA;;AAGF;AAAA;EAEE;EACA;EACA;;;AAUJ;EAGE;EACA,eVpEK;;AU2CL;EACE;EACA,SV7CG;EU8CH;EACA;;AAGF;AAAA;EAEE;EACA;EACA;;;AAwBF;AAAA;EAEE;EACA,SVjFG;EUkFH;EACA;;;AAQJ;EACE;EACA;EACA;EACA;;AAEA;AAAA;EZvKA;EY2KE;EACA;EACA,kBVnJU;EUoJV;;AXzKA;EWkKF;AAAA;IZpKE;;;AY8KF;EACE;EACA,eV7GG;EU8GH,cV9GG;;AUiHL;EACE;EACA;;;AAKJ;AAAA;EAEE,SV1HK;EU2HL,eV3HK;EU4HL;EACA;EACA,eVlHc;;AUoHd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAIE;EACA;EACA;EACA;EACA;EACA;EACA;;;AAKJ;EACE;EACA;EACA;;;AAIF;AAAA;EAEE,YVpMY;EUyMV,OV7MU;;;AUkNd;EACE,YV/MY;;;AW/Bd;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAKF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;ACvOF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AbPE;EaiBE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab9BJ;EaiBE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab9BJ;EaiBE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab9BJ;EaiBE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab9BJ;EaiBE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab9BJ;EaiBE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab9BJ;EaiBE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab9BJ;EaiBE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab9BJ;EaiBE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab9BJ;EaiBE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab9BJ;EaiBE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab9BJ;EaiBE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab9BJ;EaiBE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab9BJ;EaiBE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab9BJ;EaiBE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab9BJ;EaiBE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab9BJ;EaiBE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab9BJ;EaiBE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab9BJ;EaiBE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab9BJ;EaiBE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab9BJ;EaiBE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab9BJ;EaiBE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab9BJ;EaiBE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab9BJ;EaiBE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab9BJ;EaiBE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab9BJ;EaiBE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab9BJ;EaiBE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab9BJ;EaiBE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab9BJ;EaiBE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab9BJ;EaiBE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab9BJ;EaiBE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab9BJ;EaiBE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab9BJ;EaiBE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab9BJ;EaiBE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab9BJ;EaiBE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab9BJ;EaiBE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab9BJ;EaiBE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab9BJ;EaiBE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab9BJ;EaiBE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab9BJ;EaiBE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab9BJ;EaiBE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab9BJ;EaiBE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab9BJ;EaiBE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab9BJ;EaiBE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab9BJ;EaiBE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab9BJ;EaiBE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab9BJ;EaiBE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab9BJ;EaiBE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab9BJ;EaiBE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab9BJ;EaiBE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab9BJ;EaiBE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab9BJ;EaiBE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab9BJ;EaiBE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab9BJ;EaiBE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab9BJ;EaiBE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;AAQR;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAKF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;ACjGF;EfDE;;ACaE;EcZJ;IfEI;;;;AeEJ;EfGE;;ACKE;EcRJ;IfMI;;;;AeFJ;EfOE;;ACHE;EcJJ;IfUI;;;;AeNJ;EfWE;;ACXE;EcAJ;IfcI;;;;AeVJ;EfeE;;ACnBE;EcIJ;IfkBI;;;;AedJ;EfmBE;;AC3BE;EcQJ;IfsBI;IACA,aEpCuB;;;;AaiB3B;EfwBE;EACA,aE1CyB;;ADKvB;EcYJ;If4BI;;;;AexBJ;Ef6BE;EACA,aEnDyB;;ADKvB;EcgBJ;IfiCI;;;;Ae7BJ;EfkCE;EACA,aE5DyB;;ADKvB;EcoBJ;IfsCI;;;;AelCJ;EfuCE;EACA,aErEyB;;ADKvB;EcwBJ;If2CI;;;;AevCJ;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE,abxDiB;;;Aa2DnB;EACE,ab1DyB;;;Aa6D3B;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AC/EF;EACE;EACA;EACA;;AAGE;EACE;;;ACLN;EACE;EACA;;;AAQA;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AhBlCA;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AAaN;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AhB7GA;EgBwHE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhB/IJ;EgBwHE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhB/IJ;EgBwHE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhB/IJ;EgBwHE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhB/IJ;EgBwHE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AC3JR;EACE;AAAA;AAAA;AAAA;AAAA;AAAA;IAME;;EAGF;IACE;IACA;IACA;;EAGF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;;EAGF;IACE;;EAGF;IACE;IACA;;;AClCJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;AAAA;EAEE,OjBwBW;EiBvBX,kBjBaM;EiBZN;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;ACrBF;EACE,kBlBqBM","sourcesContent":["// Generated with OneLightJekyll applied to Atom's One Light theme\n\n.highlight,\npre.highlight {\n background: #f9f9f9;\n color: #383942;\n}\n.highlight pre {\n background: #f9f9f9;\n}\n.highlight .hll {\n background: #f9f9f9;\n}\n.highlight .c {\n color: #9fa0a6;\n font-style: italic;\n}\n.highlight .err {\n color: #fff;\n background-color: #e05151;\n}\n.highlight .k {\n color: #a625a4;\n}\n.highlight .l {\n color: #50a04f;\n}\n.highlight .n {\n color: #383942;\n}\n.highlight .o {\n color: #383942;\n}\n.highlight .p {\n color: #383942;\n}\n.highlight .cm {\n color: #9fa0a6;\n font-style: italic;\n}\n.highlight .cp {\n color: #9fa0a6;\n font-style: italic;\n}\n.highlight .c1 {\n color: #9fa0a6;\n font-style: italic;\n}\n.highlight .cs {\n color: #9fa0a6;\n font-style: italic;\n}\n.highlight .ge {\n font-style: italic;\n}\n.highlight .gs {\n font-weight: 700;\n}\n.highlight .kc {\n color: #a625a4;\n}\n.highlight .kd {\n color: #a625a4;\n}\n.highlight .kn {\n color: #a625a4;\n}\n.highlight .kp {\n color: #a625a4;\n}\n.highlight .kr {\n color: #a625a4;\n}\n.highlight .kt {\n color: #a625a4;\n}\n.highlight .ld {\n color: #50a04f;\n}\n.highlight .m {\n color: #b66a00;\n}\n.highlight .s {\n color: #50a04f;\n}\n.highlight .na {\n color: #b66a00;\n}\n.highlight .nb {\n color: #ca7601;\n}\n.highlight .nc {\n color: #ca7601;\n}\n.highlight .no {\n color: #ca7601;\n}\n.highlight .nd {\n color: #ca7601;\n}\n.highlight .ni {\n color: #ca7601;\n}\n.highlight .ne {\n color: #ca7601;\n}\n.highlight .nf {\n color: #383942;\n}\n.highlight .nl {\n color: #ca7601;\n}\n.highlight .nn {\n color: #383942;\n}\n.highlight .nx {\n color: #383942;\n}\n.highlight .py {\n color: #ca7601;\n}\n.highlight .nt {\n color: #e35549;\n}\n.highlight .nv {\n color: #ca7601;\n}\n.highlight .ow {\n font-weight: 700;\n}\n.highlight .w {\n color: #f8f8f2;\n}\n.highlight .mf {\n color: #b66a00;\n}\n.highlight .mh {\n color: #b66a00;\n}\n.highlight .mi {\n color: #b66a00;\n}\n.highlight .mo {\n color: #b66a00;\n}\n.highlight .sb {\n color: #50a04f;\n}\n.highlight .sc {\n color: #50a04f;\n}\n.highlight .sd {\n color: #50a04f;\n}\n.highlight .s2 {\n color: #50a04f;\n}\n.highlight .se {\n color: #50a04f;\n}\n.highlight .sh {\n color: #50a04f;\n}\n.highlight .si {\n color: #50a04f;\n}\n.highlight .sx {\n color: #50a04f;\n}\n.highlight .sr {\n color: #0083bb;\n}\n.highlight .s1 {\n color: #50a04f;\n}\n.highlight .ss {\n color: #0083bb;\n}\n.highlight .bp {\n color: #ca7601;\n}\n.highlight .vc {\n color: #ca7601;\n}\n.highlight .vg {\n color: #ca7601;\n}\n.highlight .vi {\n color: #e35549;\n}\n.highlight .il {\n color: #b66a00;\n}\n.highlight .gu {\n color: #75715e;\n}\n.highlight .gd {\n color: #e05151;\n}\n.highlight .gi {\n color: #43d089;\n}\n.highlight .language-json .w + .s2 {\n color: #e35549;\n}\n.highlight .language-json .kc {\n color: #0083bb;\n}\n","/*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */\n\n/* Document\n ========================================================================== */\n\n/**\n * 1. Correct the line height in all browsers.\n * 2. Prevent adjustments of font size after orientation changes in iOS.\n */\n\nhtml {\n line-height: 1.15; /* 1 */\n -webkit-text-size-adjust: 100%; /* 2 */\n}\n\n/* Sections\n ========================================================================== */\n\n/**\n * Remove the margin in all browsers.\n */\n\nbody {\n margin: 0;\n}\n\n/**\n * Render the `main` element consistently in IE.\n */\n\nmain {\n display: block;\n}\n\n/**\n * Correct the font size and margin on `h1` elements within `section` and\n * `article` contexts in Chrome, Firefox, and Safari.\n */\n\nh1 {\n font-size: 2em;\n margin: 0.67em 0;\n}\n\n/* Grouping content\n ========================================================================== */\n\n/**\n * 1. Add the correct box sizing in Firefox.\n * 2. Show the overflow in Edge and IE.\n */\n\nhr {\n box-sizing: content-box; /* 1 */\n height: 0; /* 1 */\n overflow: visible; /* 2 */\n}\n\n/**\n * 1. Correct the inheritance and scaling of font size in all browsers.\n * 2. Correct the odd `em` font sizing in all browsers.\n */\n\npre {\n font-family: monospace, monospace; /* 1 */\n font-size: 1em; /* 2 */\n}\n\n/* Text-level semantics\n ========================================================================== */\n\n/**\n * Remove the gray background on active links in IE 10.\n */\n\na {\n background-color: transparent;\n}\n\n/**\n * 1. Remove the bottom border in Chrome 57-\n * 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari.\n */\n\nabbr[title] {\n border-bottom: none; /* 1 */\n text-decoration: underline; /* 2 */\n text-decoration: underline dotted; /* 2 */\n}\n\n/**\n * Add the correct font weight in Chrome, Edge, and Safari.\n */\n\nb,\nstrong {\n font-weight: bolder;\n}\n\n/**\n * 1. Correct the inheritance and scaling of font size in all browsers.\n * 2. Correct the odd `em` font sizing in all browsers.\n */\n\ncode,\nkbd,\nsamp {\n font-family: monospace, monospace; /* 1 */\n font-size: 1em; /* 2 */\n}\n\n/**\n * Add the correct font size in all browsers.\n */\n\nsmall {\n font-size: 80%;\n}\n\n/**\n * Prevent `sub` and `sup` elements from affecting the line height in\n * all browsers.\n */\n\nsub,\nsup {\n font-size: 75%;\n line-height: 0;\n position: relative;\n vertical-align: baseline;\n}\n\nsub {\n bottom: -0.25em;\n}\n\nsup {\n top: -0.5em;\n}\n\n/* Embedded content\n ========================================================================== */\n\n/**\n * Remove the border on images inside links in IE 10.\n */\n\nimg {\n border-style: none;\n}\n\n/* Forms\n ========================================================================== */\n\n/**\n * 1. Change the font styles in all browsers.\n * 2. Remove the margin in Firefox and Safari.\n */\n\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n font-family: inherit; /* 1 */\n font-size: 100%; /* 1 */\n line-height: 1.15; /* 1 */\n margin: 0; /* 2 */\n}\n\n/**\n * Show the overflow in IE.\n * 1. Show the overflow in Edge.\n */\n\nbutton,\ninput {\n /* 1 */\n overflow: visible;\n}\n\n/**\n * Remove the inheritance of text transform in Edge, Firefox, and IE.\n * 1. Remove the inheritance of text transform in Firefox.\n */\n\nbutton,\nselect {\n /* 1 */\n text-transform: none;\n}\n\n/**\n * Correct the inability to style clickable types in iOS and Safari.\n */\n\nbutton,\n[type=\"button\"],\n[type=\"reset\"],\n[type=\"submit\"] {\n -webkit-appearance: button;\n}\n\n/**\n * Remove the inner border and padding in Firefox.\n */\n\nbutton::-moz-focus-inner,\n[type=\"button\"]::-moz-focus-inner,\n[type=\"reset\"]::-moz-focus-inner,\n[type=\"submit\"]::-moz-focus-inner {\n border-style: none;\n padding: 0;\n}\n\n/**\n * Restore the focus styles unset by the previous rule.\n */\n\nbutton:-moz-focusring,\n[type=\"button\"]:-moz-focusring,\n[type=\"reset\"]:-moz-focusring,\n[type=\"submit\"]:-moz-focusring {\n outline: 1px dotted ButtonText;\n}\n\n/**\n * Correct the padding in Firefox.\n */\n\nfieldset {\n padding: 0.35em 0.75em 0.625em;\n}\n\n/**\n * 1. Correct the text wrapping in Edge and IE.\n * 2. Correct the color inheritance from `fieldset` elements in IE.\n * 3. Remove the padding so developers are not caught out when they zero out\n * `fieldset` elements in all browsers.\n */\n\nlegend {\n box-sizing: border-box; /* 1 */\n color: inherit; /* 2 */\n display: table; /* 1 */\n max-width: 100%; /* 1 */\n padding: 0; /* 3 */\n white-space: normal; /* 1 */\n}\n\n/**\n * Add the correct vertical alignment in Chrome, Firefox, and Opera.\n */\n\nprogress {\n vertical-align: baseline;\n}\n\n/**\n * Remove the default vertical scrollbar in IE 10+.\n */\n\ntextarea {\n overflow: auto;\n}\n\n/**\n * 1. Add the correct box sizing in IE 10.\n * 2. Remove the padding in IE 10.\n */\n\n[type=\"checkbox\"],\n[type=\"radio\"] {\n box-sizing: border-box; /* 1 */\n padding: 0; /* 2 */\n}\n\n/**\n * Correct the cursor style of increment and decrement buttons in Chrome.\n */\n\n[type=\"number\"]::-webkit-inner-spin-button,\n[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\n\n/**\n * 1. Correct the odd appearance in Chrome and Safari.\n * 2. Correct the outline style in Safari.\n */\n\n[type=\"search\"] {\n -webkit-appearance: textfield; /* 1 */\n outline-offset: -2px; /* 2 */\n}\n\n/**\n * Remove the inner padding in Chrome and Safari on macOS.\n */\n\n[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n/**\n * 1. Correct the inability to style clickable types in iOS and Safari.\n * 2. Change font properties to `inherit` in Safari.\n */\n\n::-webkit-file-upload-button {\n -webkit-appearance: button; /* 1 */\n font: inherit; /* 2 */\n}\n\n/* Interactive\n ========================================================================== */\n\n/*\n * Add the correct display in Edge, IE 10+, and Firefox.\n */\n\ndetails {\n display: block;\n}\n\n/*\n * Add the correct display in all browsers.\n */\n\nsummary {\n display: list-item;\n}\n\n/* Misc\n ========================================================================== */\n\n/**\n * Add the correct display in IE 10+.\n */\n\ntemplate {\n display: none;\n}\n\n/**\n * Add the correct display in IE 10.\n */\n\n[hidden] {\n display: none;\n}\n","// Base element style overrides\n// stylelint-disable selector-no-type, selector-max-type, selector-max-specificity, selector-max-id\n\n:root {\n color-scheme: $color-scheme;\n}\n\n* {\n box-sizing: border-box;\n}\n\nhtml {\n @include fs-4;\n\n scroll-behavior: smooth;\n}\n\nbody {\n font-family: $body-font-family;\n font-size: inherit;\n line-height: $body-line-height;\n color: $body-text-color;\n background-color: $body-background-color;\n overflow-wrap: break-word;\n}\n\nol,\nul,\ndl,\npre,\naddress,\nblockquote,\ntable,\ndiv,\nhr,\nform,\nfieldset,\nnoscript .table-wrapper {\n margin-top: 0;\n}\n\nh1,\nh2,\nh3,\nh4,\nh5,\nh6,\n#toctitle {\n margin-top: 0;\n margin-bottom: 1em;\n font-weight: 500;\n line-height: $body-heading-line-height;\n color: $body-heading-color;\n}\n\np {\n margin-top: 1em;\n margin-bottom: 1em;\n}\n\na {\n color: $link-color;\n text-decoration: none;\n}\n\na:not([class]) {\n text-decoration: underline;\n text-decoration-color: $border-color;\n text-underline-offset: 2px;\n\n &:hover {\n text-decoration-color: rgba($link-color, 0.45);\n }\n}\n\ncode {\n font-family: $mono-font-family;\n font-size: 0.75em;\n line-height: $body-line-height;\n}\n\nfigure,\npre {\n margin: 0;\n}\n\nli {\n margin: 0.25em 0;\n}\n\nimg {\n max-width: 100%;\n height: auto;\n}\n\nhr {\n height: 1px;\n padding: 0;\n margin: $sp-6 0;\n background-color: $border-color;\n border: 0;\n}\n\n// adds a GitHub-style sidebar to blockquotes\nblockquote {\n margin: 10px 0;\n\n // resets user-agent stylesheets for blockquotes\n margin-block-start: 0;\n margin-inline-start: 0;\n padding-left: 1rem;\n border-left: 3px solid $border-color;\n}\n","$color-scheme: light !default;\n$body-background-color: $white !default;\n$body-heading-color: $grey-dk-300 !default;\n$body-text-color: $grey-dk-100 !default;\n$link-color: $purple-000 !default;\n$nav-child-link-color: $grey-dk-100 !default;\n$sidebar-color: $grey-lt-000 !default;\n$base-button-color: #f7f7f7 !default;\n$btn-primary-color: $purple-100 !default;\n$code-background-color: $grey-lt-000 !default;\n$feedback-color: darken($sidebar-color, 3%) !default;\n$table-background-color: $white !default;\n$search-background-color: $white !default;\n$search-result-preview-color: $grey-dk-000 !default;\n\n@import \"./vendor/OneLightJekyll/syntax\";\n","@mixin fs-1 {\n font-size: $font-size-1 !important;\n\n @include mq(sm) {\n font-size: $font-size-1-sm !important;\n }\n}\n\n@mixin fs-2 {\n font-size: $font-size-2 !important;\n\n @include mq(sm) {\n font-size: $font-size-3 !important;\n }\n}\n\n@mixin fs-3 {\n font-size: $font-size-3 !important;\n\n @include mq(sm) {\n font-size: $font-size-4 !important;\n }\n}\n\n@mixin fs-4 {\n font-size: $font-size-4 !important;\n\n @include mq(sm) {\n font-size: $font-size-5 !important;\n }\n}\n\n@mixin fs-5 {\n font-size: $font-size-5 !important;\n\n @include mq(sm) {\n font-size: $font-size-6 !important;\n }\n}\n\n@mixin fs-6 {\n font-size: $font-size-6 !important;\n\n @include mq(sm) {\n font-size: $font-size-7 !important;\n line-height: $body-heading-line-height;\n }\n}\n\n@mixin fs-7 {\n font-size: $font-size-7 !important;\n line-height: $body-heading-line-height;\n\n @include mq(sm) {\n font-size: $font-size-8 !important;\n }\n}\n\n@mixin fs-8 {\n font-size: $font-size-8 !important;\n line-height: $body-heading-line-height;\n\n @include mq(sm) {\n font-size: $font-size-9 !important;\n }\n}\n\n@mixin fs-9 {\n font-size: $font-size-9 !important;\n line-height: $body-heading-line-height;\n\n @include mq(sm) {\n font-size: $font-size-10 !important;\n }\n}\n\n@mixin fs-10 {\n font-size: $font-size-10 !important;\n line-height: $body-heading-line-height;\n\n @include mq(sm) {\n font-size: $font-size-10-sm !important;\n }\n}\n","// Media query\n\n// Media query mixin\n// Usage:\n// @include mq(md) {\n// ..medium and up styles\n// }\n@mixin mq($name) {\n // Retrieves the value from the key\n $value: map-get($media-queries, $name);\n\n // If the key exists in the map\n @if $value {\n // Prints a media query based on the value\n @media (min-width: $value) {\n @content;\n }\n } @else {\n @warn \"No value could be retrieved from `#{$media-query}`. Please make sure it is defined in `$media-queries` map.\";\n }\n}\n\n// Responsive container\n\n@mixin container {\n padding-right: $gutter-spacing-sm;\n padding-left: $gutter-spacing-sm;\n\n @include mq(md) {\n padding-right: $gutter-spacing;\n padding-left: $gutter-spacing;\n }\n}\n","// Typography\n\n// prettier-ignore\n$body-font-family: system-ui, -apple-system, blinkmacsystemfont, \"Segoe UI\",\n roboto, \"Helvetica Neue\", arial, sans-serif, \"Segoe UI Emoji\" !default;\n$mono-font-family: \"SFMono-Regular\", menlo, consolas, monospace !default;\n$root-font-size: 16px !default; // DEPRECATED: previously base font-size for rems\n$body-line-height: 1.4 !default;\n$content-line-height: 1.6 !default;\n$body-heading-line-height: 1.25 !default;\n\n// Font size\n// `-sm` suffix is the size at the small (and above) media query\n\n$font-size-1: 0.5625rem !default;\n$font-size-1-sm: 0.625rem !default;\n$font-size-2: 0.6875rem !default; // h4 - uppercased!, h6 not uppercased, text-small\n$font-size-3: 0.75rem !default; // h5\n$font-size-4: 0.875rem !default;\n$font-size-5: 1rem !default; // h3\n$font-size-6: 1.125rem !default; // h2\n$font-size-7: 1.5rem !default;\n$font-size-8: 2rem !default; // h1\n$font-size-9: 2.25rem !default;\n$font-size-10: 2.625rem !default;\n$font-size-10-sm: 3rem !default;\n\n// Colors\n\n$white: #fff !default;\n$grey-dk-000: #959396 !default;\n$grey-dk-100: #5c5962 !default;\n$grey-dk-200: #44434d !default;\n$grey-dk-250: #302d36 !default;\n$grey-dk-300: #27262b !default;\n$grey-lt-000: #f5f6fa !default;\n$grey-lt-100: #eeebee !default;\n$grey-lt-200: #ecebed !default;\n$grey-lt-300: #e6e1e8 !default;\n$purple-000: #7253ed !default;\n$purple-100: #5e41d0 !default;\n$purple-200: #4e26af !default;\n$purple-300: #381885 !default;\n$blue-000: #2c84fa !default;\n$blue-100: #2869e6 !default;\n$blue-200: #264caf !default;\n$blue-300: #183385 !default;\n$green-000: #41d693 !default;\n$green-100: #11b584 !default;\n$green-200: #009c7b !default;\n$green-300: #026e57 !default;\n$yellow-000: #ffeb82 !default;\n$yellow-100: #fadf50 !default;\n$yellow-200: #f7d12e !default;\n$yellow-300: #e7af06 !default;\n$red-000: #f77e7e !default;\n$red-100: #f96e65 !default;\n$red-200: #e94c4c !default;\n$red-300: #dd2e2e !default;\n\n// Spacing\n\n$spacing-unit: 1rem; // 1rem == 16px\n\n$spacers: (\n sp-0: 0,\n sp-1: $spacing-unit * 0.25,\n sp-2: $spacing-unit * 0.5,\n sp-3: $spacing-unit * 0.75,\n sp-4: $spacing-unit,\n sp-5: $spacing-unit * 1.5,\n sp-6: $spacing-unit * 2,\n sp-7: $spacing-unit * 2.5,\n sp-8: $spacing-unit * 3,\n sp-9: $spacing-unit * 3.5,\n sp-10: $spacing-unit * 4,\n) !default;\n$sp-1: map-get($spacers, sp-1) !default; // 0.25 rem == 4px\n$sp-2: map-get($spacers, sp-2) !default; // 0.5 rem == 8px\n$sp-3: map-get($spacers, sp-3) !default; // 0.75 rem == 12px\n$sp-4: map-get($spacers, sp-4) !default; // 1 rem == 16px\n$sp-5: map-get($spacers, sp-5) !default; // 1.5 rem == 24px\n$sp-6: map-get($spacers, sp-6) !default; // 2 rem == 32px\n$sp-7: map-get($spacers, sp-7) !default; // 2.5 rem == 40px\n$sp-8: map-get($spacers, sp-8) !default; // 3 rem == 48px\n$sp-9: map-get($spacers, sp-9) !default; // 3.5 rem == 56px\n$sp-10: map-get($spacers, sp-10) !default; // 4 rem == 64px\n\n// Borders\n\n$border: 1px solid !default;\n$border-radius: 4px !default;\n$border-color: $grey-lt-100 !default;\n\n// Grid system\n\n$gutter-spacing: $sp-6 !default;\n$gutter-spacing-sm: $sp-4 !default;\n$nav-width: 16.5rem !default;\n$nav-width-md: 15.5rem !default;\n$nav-list-item-height: $sp-6 !default;\n$nav-list-item-height-sm: $sp-8 !default;\n$nav-list-expander-right: true;\n$content-width: 50rem !default;\n$header-height: 3.75rem !default;\n$search-results-width: $content-width - $nav-width !default;\n$transition-duration: 400ms;\n\n// Media queries in pixels\n\n$media-queries: (\n xs: 20rem,\n sm: 31.25rem,\n md: $content-width,\n lg: $content-width + $nav-width,\n xl: 87.5rem,\n) !default;\n","// The basic two column layout\n\n.side-bar {\n z-index: 0;\n display: flex;\n flex-wrap: wrap;\n background-color: $sidebar-color;\n\n @include mq(md) {\n flex-flow: column nowrap;\n position: fixed;\n width: $nav-width-md;\n height: 100%;\n border-right: $border $border-color;\n align-items: flex-end;\n }\n\n @include mq(lg) {\n width: calc((100% - #{$nav-width + $content-width}) / 2 + #{$nav-width});\n min-width: $nav-width;\n }\n}\n\n.main {\n @include mq(md) {\n position: relative;\n max-width: $content-width;\n margin-left: $nav-width-md;\n }\n\n @include mq(lg) {\n // stylelint-disable function-name-case\n // disable for Max(), we want to use the CSS max() function\n margin-left: Max(\n #{$nav-width},\n calc((100% - #{$nav-width + $content-width}) / 2 + #{$nav-width})\n );\n // stylelint-enable function-name-case\n }\n}\n\n.main-content-wrap {\n @include container;\n\n padding-top: $gutter-spacing-sm;\n padding-bottom: $gutter-spacing-sm;\n\n @include mq(md) {\n padding-top: $gutter-spacing;\n padding-bottom: $gutter-spacing;\n }\n}\n\n.main-header {\n z-index: 0;\n display: none;\n background-color: $sidebar-color;\n\n @include mq(md) {\n display: flex;\n justify-content: space-between;\n height: $header-height;\n background-color: $body-background-color;\n border-bottom: $border $border-color;\n }\n\n &.nav-open {\n display: block;\n\n @include mq(md) {\n display: flex;\n }\n }\n}\n\n.site-nav,\n.site-header,\n.site-footer {\n width: 100%;\n\n @include mq(lg) {\n width: $nav-width;\n }\n}\n\n.site-nav {\n display: none;\n\n &.nav-open {\n display: block;\n }\n\n @include mq(md) {\n display: block;\n padding-top: $sp-8;\n padding-bottom: $gutter-spacing-sm;\n overflow-y: auto;\n flex: 1 1 auto;\n }\n}\n\n.site-header {\n display: flex;\n min-height: $header-height;\n align-items: center;\n\n @include mq(md) {\n height: $header-height;\n max-height: $header-height;\n border-bottom: $border $border-color;\n }\n}\n\n.site-title {\n @include container;\n\n flex-grow: 1;\n display: flex;\n height: 100%;\n align-items: center;\n padding-top: $sp-3;\n padding-bottom: $sp-3;\n color: $body-heading-color;\n @include fs-6;\n\n @include mq(md) {\n padding-top: $sp-2;\n padding-bottom: $sp-2;\n }\n}\n\n@if variable-exists(logo) {\n .site-logo {\n width: 100%;\n height: 100%;\n background-image: url($logo);\n background-repeat: no-repeat;\n background-position: left center;\n background-size: contain;\n }\n}\n\n.site-button {\n display: flex;\n height: 100%;\n padding: $gutter-spacing-sm;\n align-items: center;\n}\n\n@include mq(md) {\n .site-header .site-button {\n display: none;\n }\n}\n\n.site-title:hover {\n background-image: linear-gradient(\n -90deg,\n rgba($feedback-color, 1) 0%,\n rgba($feedback-color, 0.8) 80%,\n rgba($feedback-color, 0) 100%\n );\n}\n\n.site-button:hover {\n background-image: linear-gradient(\n -90deg,\n rgba($feedback-color, 1) 0%,\n rgba($feedback-color, 0.8) 100%\n );\n}\n\n// stylelint-disable selector-max-type\n\nbody {\n position: relative;\n padding-bottom: $sp-10;\n overflow-y: scroll;\n\n @include mq(md) {\n position: static;\n padding-bottom: 0;\n }\n}\n\n// stylelint-enable selector-max-type\n\n.site-footer {\n @include container;\n\n position: absolute;\n bottom: 0;\n left: 0;\n padding-top: $sp-4;\n padding-bottom: $sp-4;\n color: $grey-dk-000;\n @include fs-2;\n\n @include mq(md) {\n position: static;\n justify-self: end;\n }\n}\n\n.icon {\n width: $sp-5;\n height: $sp-5;\n color: $link-color;\n}\n","@charset \"UTF-8\";\n\n// Styles for rendered markdown in the .main-content container\n// stylelint-disable selector-no-type, max-nesting-depth, selector-max-compound-selectors, selector-max-type, selector-max-specificity, selector-max-id\n\n.main-content {\n line-height: $content-line-height;\n\n ol,\n ul,\n dl,\n pre,\n address,\n blockquote,\n .table-wrapper {\n margin-top: 0.5em;\n }\n\n a {\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n ul,\n ol {\n padding-left: 1.5em;\n }\n\n li {\n .highlight {\n margin-top: $sp-1;\n }\n }\n\n ol {\n list-style-type: none;\n counter-reset: step-counter;\n\n > li {\n position: relative;\n\n &::before {\n position: absolute;\n top: 0.2em;\n left: -1.6em;\n color: $grey-dk-000;\n content: counter(step-counter);\n counter-increment: step-counter;\n @include fs-3;\n\n @include mq(sm) {\n top: 0.11em;\n }\n }\n\n ol {\n counter-reset: sub-counter;\n\n > li {\n &::before {\n content: counter(sub-counter, lower-alpha);\n counter-increment: sub-counter;\n }\n }\n }\n }\n }\n\n ul {\n list-style: none;\n\n > li {\n &::before {\n position: absolute;\n margin-left: -1.4em;\n color: $grey-dk-000;\n content: \"•\";\n }\n }\n }\n\n .task-list-item {\n &::before {\n content: \"\";\n }\n }\n\n .task-list-item-checkbox {\n margin-right: 0.6em;\n margin-left: -1.4em;\n\n // The same margin-left is used above for ul > li::before\n }\n\n hr + * {\n margin-top: 0;\n }\n\n h1:first-of-type {\n margin-top: 0.5em;\n }\n\n dl {\n display: grid;\n grid-template: auto / 10em 1fr;\n }\n\n dt,\n dd {\n margin: 0.25em 0;\n }\n\n dt {\n grid-column: 1;\n font-weight: 500;\n text-align: right;\n\n &::after {\n content: \":\";\n }\n }\n\n dd {\n grid-column: 2;\n margin-bottom: 0;\n margin-left: 1em;\n\n blockquote,\n div,\n dl,\n dt,\n h1,\n h2,\n h3,\n h4,\n h5,\n h6,\n li,\n ol,\n p,\n pre,\n table,\n ul,\n .table-wrapper {\n &:first-child {\n margin-top: 0;\n }\n }\n }\n\n dd,\n ol,\n ul {\n dl:first-child {\n dt:first-child,\n dd:nth-child(2) {\n margin-top: 0;\n }\n }\n }\n\n .anchor-heading {\n position: absolute;\n right: -$sp-4;\n width: $sp-5;\n height: 100%;\n padding-right: $sp-1;\n padding-left: $sp-1;\n overflow: visible;\n\n @include mq(md) {\n right: auto;\n left: -$sp-5;\n }\n\n svg {\n display: inline-block;\n width: 100%;\n height: 100%;\n color: $link-color;\n visibility: hidden;\n }\n }\n\n .anchor-heading:hover,\n .anchor-heading:focus,\n h1:hover > .anchor-heading,\n h2:hover > .anchor-heading,\n h3:hover > .anchor-heading,\n h4:hover > .anchor-heading,\n h5:hover > .anchor-heading,\n h6:hover > .anchor-heading {\n svg {\n visibility: visible;\n }\n }\n\n summary {\n cursor: pointer;\n }\n\n h1,\n h2,\n h3,\n h4,\n h5,\n h6,\n #toctitle {\n position: relative;\n margin-top: 1.5em;\n margin-bottom: 0.25em;\n\n + table,\n + .table-wrapper,\n + .code-example,\n + .highlighter-rouge,\n + .sectionbody .listingblock {\n margin-top: 1em;\n }\n\n + p:not(.label) {\n margin-top: 0;\n }\n }\n\n > h1:first-child,\n > h2:first-child,\n > h3:first-child,\n > h4:first-child,\n > h5:first-child,\n > h6:first-child,\n > .sect1:first-child > h2,\n > .sect2:first-child > h3,\n > .sect3:first-child > h4,\n > .sect4:first-child > h5,\n > .sect5:first-child > h6 {\n margin-top: $sp-2;\n }\n}\n","// Main nav, breadcrumb, etc...\n// stylelint-disable selector-no-type, max-nesting-depth, selector-max-compound-selectors, selector-max-type, selector-max-specificity\n\n.nav-list {\n padding: 0;\n margin-top: 0;\n margin-bottom: 0;\n list-style: none;\n\n .nav-list-item {\n @include fs-4;\n\n position: relative;\n margin: 0;\n\n @include mq(md) {\n @include fs-3;\n }\n\n .nav-list-link {\n display: block;\n min-height: $nav-list-item-height-sm;\n padding-top: $sp-1;\n padding-bottom: $sp-1;\n line-height: #{$nav-list-item-height-sm - 2 * $sp-1};\n @if $nav-list-expander-right {\n padding-right: $nav-list-item-height-sm;\n padding-left: $gutter-spacing-sm;\n } @else {\n padding-right: $gutter-spacing-sm;\n padding-left: $nav-list-item-height-sm;\n }\n\n @include mq(md) {\n min-height: $nav-list-item-height;\n line-height: #{$nav-list-item-height - 2 * $sp-1};\n @if $nav-list-expander-right {\n padding-right: $nav-list-item-height;\n padding-left: $gutter-spacing;\n } @else {\n padding-right: $gutter-spacing;\n padding-left: $nav-list-item-height;\n }\n }\n\n &.external > svg {\n width: $sp-4;\n height: $sp-4;\n vertical-align: text-bottom;\n }\n\n &.active {\n font-weight: 600;\n text-decoration: none;\n }\n\n &:hover,\n &.active {\n background-image: linear-gradient(\n -90deg,\n rgba($feedback-color, 1) 0%,\n rgba($feedback-color, 0.8) 80%,\n rgba($feedback-color, 0) 100%\n );\n }\n }\n\n .nav-list-expander {\n position: absolute;\n @if $nav-list-expander-right {\n right: 0;\n }\n\n width: $nav-list-item-height-sm;\n height: $nav-list-item-height-sm;\n padding: #{$nav-list-item-height-sm * 0.25};\n color: $link-color;\n\n @include mq(md) {\n width: $nav-list-item-height;\n height: $nav-list-item-height;\n padding: #{$nav-list-item-height * 0.25};\n }\n\n &:hover {\n background-image: linear-gradient(\n -90deg,\n rgba($feedback-color, 1) 0%,\n rgba($feedback-color, 0.8) 100%\n );\n }\n\n @if $nav-list-expander-right {\n svg {\n transform: rotate(90deg);\n }\n }\n }\n\n > .nav-list {\n display: none;\n padding-left: $sp-3;\n list-style: none;\n\n .nav-list-item {\n position: relative;\n\n .nav-list-link {\n color: $nav-child-link-color;\n }\n\n .nav-list-expander {\n color: $nav-child-link-color;\n }\n }\n }\n\n &.active {\n > .nav-list-expander svg {\n @if $nav-list-expander-right {\n transform: rotate(-90deg);\n } @else {\n transform: rotate(90deg);\n }\n }\n\n > .nav-list {\n display: block;\n }\n }\n }\n}\n\n.nav-category {\n padding: $sp-2 $gutter-spacing-sm;\n font-weight: 600;\n text-align: start;\n text-transform: uppercase;\n border-bottom: $border $border-color;\n @include fs-2;\n\n @include mq(md) {\n padding: $sp-2 $gutter-spacing;\n margin-top: $gutter-spacing-sm;\n text-align: start;\n\n &:first-child {\n margin-top: 0;\n }\n }\n}\n\n.nav-list.nav-category-list {\n > .nav-list-item {\n margin: 0;\n\n > .nav-list {\n padding: 0;\n\n > .nav-list-item {\n > .nav-list-link {\n color: $link-color;\n }\n\n > .nav-list-expander {\n color: $link-color;\n }\n }\n }\n }\n}\n\n// Aux nav\n\n.aux-nav {\n height: 100%;\n overflow-x: auto;\n @include fs-2;\n\n .aux-nav-list {\n display: flex;\n height: 100%;\n padding: 0;\n margin: 0;\n list-style: none;\n }\n\n .aux-nav-list-item {\n display: inline-block;\n height: 100%;\n padding: 0;\n margin: 0;\n }\n\n @include mq(md) {\n padding-right: $gutter-spacing-sm;\n }\n}\n\n// Breadcrumb nav\n\n.breadcrumb-nav {\n @include mq(md) {\n margin-top: -$sp-4;\n }\n}\n\n.breadcrumb-nav-list {\n padding-left: 0;\n margin-bottom: $sp-3;\n list-style: none;\n}\n\n.breadcrumb-nav-list-item {\n display: table-cell;\n @include fs-2;\n\n &::before {\n display: none;\n }\n\n &::after {\n display: inline-block;\n margin-right: $sp-2;\n margin-left: $sp-2;\n color: $grey-dk-000;\n content: \"/\";\n }\n\n &:last-child {\n &::after {\n content: \"\";\n }\n }\n}\n","// Typography\n// stylelint-disable selector-no-type, selector-max-type, selector-max-specificity, selector-max-id\n\nh1,\n.text-alpha {\n @include fs-8;\n\n font-weight: 300;\n}\n\nh2,\n.text-beta,\n#toctitle {\n @include fs-6;\n}\n\nh3,\n.text-gamma {\n @include fs-5;\n}\n\nh4,\n.text-delta {\n @include fs-2;\n\n font-weight: 400;\n text-transform: uppercase;\n letter-spacing: 0.1em;\n}\n\nh4 code {\n text-transform: none;\n}\n\nh5,\n.text-epsilon {\n @include fs-3;\n}\n\nh6,\n.text-zeta {\n @include fs-2;\n}\n\n.text-small {\n @include fs-2;\n}\n\n.text-mono {\n font-family: $mono-font-family !important;\n}\n\n.text-left {\n text-align: left !important;\n}\n\n.text-center {\n text-align: center !important;\n}\n\n.text-right {\n text-align: right !important;\n}\n","// Labels (not the form kind)\n\n// this :not() prevents a style clash with Mermaid.js's\n// diagram labels, which also use .label\n// for more, see https://github.com/just-the-docs/just-the-docs/issues/1272\n// and the accompanying PR\n.label:not(g),\n.label-blue:not(g) {\n display: inline-block;\n padding: 0.16em 0.56em;\n margin-right: $sp-2;\n margin-left: $sp-2;\n color: $white;\n text-transform: uppercase;\n vertical-align: middle;\n background-color: $blue-100;\n @include fs-2;\n\n border-radius: 12px;\n}\n\n.label-green:not(g) {\n background-color: $green-200;\n}\n\n.label-purple:not(g) {\n background-color: $purple-100;\n}\n\n.label-red:not(g) {\n background-color: $red-200;\n}\n\n.label-yellow:not(g) {\n color: $grey-dk-200;\n background-color: $yellow-200;\n}\n","// Buttons and things that look like buttons\n// stylelint-disable color-named\n\n.btn {\n display: inline-block;\n box-sizing: border-box;\n padding: 0.3em 1em;\n margin: 0;\n font-family: inherit;\n font-size: inherit;\n font-weight: 500;\n line-height: 1.5;\n color: $link-color;\n text-decoration: none;\n vertical-align: baseline;\n cursor: pointer;\n background-color: $base-button-color;\n border-width: 0;\n border-radius: $border-radius;\n box-shadow:\n 0 1px 2px rgba(0, 0, 0, 0.12),\n 0 3px 10px rgba(0, 0, 0, 0.08);\n appearance: none;\n\n &:focus {\n text-decoration: none;\n outline: none;\n box-shadow: 0 0 0 3px rgba(blue, 0.25);\n }\n\n &:focus:hover,\n &.selected:focus {\n box-shadow: 0 0 0 3px rgba(blue, 0.25);\n }\n\n &:hover,\n &.zeroclipboard-is-hover {\n color: darken($link-color, 2%);\n }\n\n &:hover,\n &:active,\n &.zeroclipboard-is-hover,\n &.zeroclipboard-is-active {\n text-decoration: none;\n background-color: darken($base-button-color, 1%);\n }\n\n &:active,\n &.selected,\n &.zeroclipboard-is-active {\n background-color: darken($base-button-color, 3%);\n background-image: none;\n box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15);\n }\n\n &.selected:hover {\n background-color: darken(#dcdcdc, 5%);\n }\n\n &:disabled,\n &.disabled {\n &,\n &:hover {\n color: rgba(102, 102, 102, 0.5);\n cursor: default;\n background-color: rgba(229, 229, 229, 0.5);\n background-image: none;\n box-shadow: none;\n }\n }\n}\n\n.btn-outline {\n color: $link-color;\n background: transparent;\n box-shadow: inset 0 0 0 2px $grey-lt-300;\n\n &:hover,\n &:active,\n &.zeroclipboard-is-hover,\n &.zeroclipboard-is-active {\n color: darken($link-color, 4%);\n text-decoration: none;\n background-color: transparent;\n box-shadow: inset 0 0 0 3px $grey-lt-300;\n }\n\n &:focus {\n text-decoration: none;\n outline: none;\n box-shadow:\n inset 0 0 0 2px $grey-dk-100,\n 0 0 0 3px rgba(blue, 0.25);\n }\n\n &:focus:hover,\n &.selected:focus {\n box-shadow: inset 0 0 0 2px $grey-dk-100;\n }\n}\n\n.btn-primary {\n @include btn-color($white, $btn-primary-color);\n}\n\n.btn-purple {\n @include btn-color($white, $purple-100);\n}\n\n.btn-blue {\n @include btn-color($white, $blue-000);\n}\n\n.btn-green {\n @include btn-color($white, $green-100);\n}\n\n.btn-reset {\n background: none;\n border: none;\n margin: 0;\n text-align: inherit;\n font: inherit;\n border-radius: 0;\n appearance: none;\n}\n","// Colored button\n\n@mixin btn-color($fg, $bg) {\n color: $fg;\n background-color: darken($bg, 2%);\n background-image: linear-gradient(lighten($bg, 5%), darken($bg, 2%));\n box-shadow:\n 0 1px 3px rgba(0, 0, 0, 0.25),\n 0 4px 10px rgba(0, 0, 0, 0.12);\n\n &:hover,\n &.zeroclipboard-is-hover {\n color: $fg;\n background-color: darken($bg, 4%);\n background-image: linear-gradient((lighten($bg, 2%), darken($bg, 4%)));\n }\n\n &:active,\n &.selected,\n &.zeroclipboard-is-active {\n background-color: darken($bg, 5%);\n background-image: none;\n box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15);\n }\n\n &.selected:hover {\n background-color: darken($bg, 10%);\n }\n}\n","// Search input and autocomplete\n\n.search {\n position: relative;\n z-index: 2;\n flex-grow: 1;\n height: $sp-10;\n padding: $sp-2;\n transition: padding linear #{$transition-duration * 0.5};\n\n @include mq(md) {\n position: relative !important;\n width: auto !important;\n height: 100% !important;\n padding: 0;\n transition: none;\n }\n}\n\n.search-input-wrap {\n position: relative;\n z-index: 1;\n height: $sp-8;\n overflow: hidden;\n border-radius: $border-radius;\n box-shadow:\n 0 1px 2px rgba(0, 0, 0, 0.12),\n 0 3px 10px rgba(0, 0, 0, 0.08);\n transition: height linear #{$transition-duration * 0.5};\n\n @include mq(md) {\n position: absolute;\n width: 100%;\n max-width: $search-results-width;\n height: 100% !important;\n border-radius: 0;\n box-shadow: none;\n transition: width ease $transition-duration;\n }\n}\n\n.search-input {\n position: absolute;\n width: 100%;\n height: 100%;\n padding: $sp-2 $gutter-spacing-sm $sp-2 #{$gutter-spacing-sm + $sp-5};\n font-size: 1rem;\n color: $body-text-color;\n background-color: $search-background-color;\n border-top: 0;\n border-right: 0;\n border-bottom: 0;\n border-left: 0;\n border-radius: 0;\n\n @include mq(md) {\n padding: $sp-2 $gutter-spacing-sm $sp-2 #{$gutter-spacing + $sp-5};\n font-size: 0.875rem;\n background-color: $body-background-color;\n transition: padding-left linear #{$transition-duration * 0.5};\n }\n\n &:focus {\n outline: 0;\n\n + .search-label .search-icon {\n color: $link-color;\n }\n }\n}\n\n.search-label {\n position: absolute;\n display: flex;\n height: 100%;\n padding-left: $gutter-spacing-sm;\n\n @include mq(md) {\n padding-left: $gutter-spacing;\n transition: padding-left linear #{$transition-duration * 0.5};\n }\n\n .search-icon {\n width: #{$sp-4 * 1.2};\n height: #{$sp-4 * 1.2};\n align-self: center;\n color: $grey-dk-000;\n }\n}\n\n.search-results {\n position: absolute;\n left: 0;\n display: none;\n width: 100%;\n max-height: calc(100% - #{$sp-10});\n overflow-y: auto;\n background-color: $search-background-color;\n border-bottom-right-radius: $border-radius;\n border-bottom-left-radius: $border-radius;\n box-shadow:\n 0 1px 2px rgba(0, 0, 0, 0.12),\n 0 3px 10px rgba(0, 0, 0, 0.08);\n\n @include mq(md) {\n top: 100%;\n width: $search-results-width;\n max-height: calc(100vh - 200%) !important;\n }\n}\n\n.search-results-list {\n padding-left: 0;\n margin-bottom: $sp-1;\n list-style: none;\n @include fs-4;\n\n @include mq(md) {\n @include fs-3;\n }\n}\n\n.search-results-list-item {\n padding: 0;\n margin: 0;\n}\n\n.search-result {\n display: block;\n padding: $sp-1 $sp-3;\n\n &:hover,\n &.active {\n background-color: $feedback-color;\n }\n}\n\n.search-result-title {\n display: block;\n padding-top: $sp-2;\n padding-bottom: $sp-2;\n\n @include mq(sm) {\n display: inline-block;\n width: 40%;\n padding-right: $sp-2;\n vertical-align: top;\n }\n}\n\n.search-result-doc {\n display: flex;\n align-items: center;\n word-wrap: break-word;\n\n &.search-result-doc-parent {\n opacity: 0.5;\n @include fs-3;\n\n @include mq(md) {\n @include fs-2;\n }\n }\n\n .search-result-icon {\n width: $sp-4;\n height: $sp-4;\n margin-right: $sp-2;\n color: $link-color;\n flex-shrink: 0;\n }\n\n .search-result-doc-title {\n overflow: auto;\n }\n}\n\n.search-result-section {\n margin-left: #{$sp-4 + $sp-2};\n word-wrap: break-word;\n}\n\n.search-result-rel-url {\n display: block;\n margin-left: #{$sp-4 + $sp-2};\n overflow: hidden;\n color: $search-result-preview-color;\n text-overflow: ellipsis;\n white-space: nowrap;\n @include fs-1;\n}\n\n.search-result-previews {\n display: block;\n padding-top: $sp-2;\n padding-bottom: $sp-2;\n padding-left: $sp-4;\n margin-left: $sp-2;\n color: $search-result-preview-color;\n word-wrap: break-word;\n border-left: $border;\n border-left-color: $border-color;\n @include fs-2;\n\n @include mq(sm) {\n display: inline-block;\n width: 60%;\n padding-left: $sp-2;\n margin-left: 0;\n vertical-align: top;\n }\n}\n\n.search-result-preview + .search-result-preview {\n margin-top: $sp-1;\n}\n\n.search-result-highlight {\n font-weight: bold;\n}\n\n.search-no-result {\n padding: $sp-2 $sp-3;\n @include fs-3;\n}\n\n.search-button {\n position: fixed;\n right: $sp-4;\n bottom: $sp-4;\n display: flex;\n width: $sp-9;\n height: $sp-9;\n background-color: $search-background-color;\n border: 1px solid rgba($link-color, 0.3);\n border-radius: #{$sp-9 * 0.5};\n box-shadow:\n 0 1px 2px rgba(0, 0, 0, 0.12),\n 0 3px 10px rgba(0, 0, 0, 0.08);\n align-items: center;\n justify-content: center;\n}\n\n.search-overlay {\n position: fixed;\n top: 0;\n left: 0;\n z-index: 1;\n width: 0;\n height: 0;\n background-color: rgba(0, 0, 0, 0.3);\n opacity: 0;\n transition:\n opacity ease $transition-duration,\n width 0s $transition-duration,\n height 0s $transition-duration;\n}\n\n.search-active {\n .search {\n position: fixed;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n padding: 0;\n }\n\n .search-input-wrap {\n height: $sp-10;\n border-radius: 0;\n\n @include mq(md) {\n width: $search-results-width;\n box-shadow:\n 0 1px 2px rgba(0, 0, 0, 0.12),\n 0 3px 10px rgba(0, 0, 0, 0.08);\n }\n }\n\n .search-input {\n background-color: $search-background-color;\n\n @include mq(md) {\n padding-left: 2.3rem;\n }\n }\n\n .search-label {\n @include mq(md) {\n padding-left: 0.6rem;\n }\n }\n\n .search-results {\n display: block;\n }\n\n .search-overlay {\n width: 100%;\n height: 100%;\n opacity: 1;\n transition:\n opacity ease $transition-duration,\n width 0s,\n height 0s;\n }\n\n @include mq(md) {\n .main {\n position: fixed;\n right: 0;\n left: 0;\n }\n }\n\n .main-header {\n padding-top: $sp-10;\n\n @include mq(md) {\n padding-top: 0;\n }\n }\n}\n","// Tables\n// stylelint-disable max-nesting-depth, selector-no-type, selector-max-type\n\n.table-wrapper {\n display: block;\n width: 100%;\n max-width: 100%;\n margin-bottom: $sp-5;\n overflow-x: auto;\n border-radius: $border-radius;\n box-shadow:\n 0 1px 2px rgba(0, 0, 0, 0.12),\n 0 3px 10px rgba(0, 0, 0, 0.08);\n}\n\ntable {\n display: table;\n min-width: 100%;\n border-collapse: separate;\n}\n\nth,\ntd {\n @include fs-3;\n\n min-width: 7.5rem;\n padding: $sp-2 $sp-3;\n background-color: $table-background-color;\n border-bottom: $border rgba($border-color, 0.5);\n border-left: $border $border-color;\n\n &:first-of-type {\n border-left: 0;\n }\n}\n\ntbody {\n tr {\n &:last-of-type {\n th,\n td {\n border-bottom: 0;\n }\n\n td {\n padding-bottom: $sp-3;\n }\n }\n }\n}\n\nthead {\n th {\n border-bottom: $border $border-color;\n }\n}\n","// Code and syntax highlighting\n// stylelint-disable selector-no-qualifying-type, declaration-block-semicolon-newline-after,declaration-block-single-line-max-declarations, selector-no-type, selector-max-type, scss/comment-no-empty\n\n// {% raw %}\n\n// This instruction applies to all queues not within 'pre' or 'figure', avoiding 'code' generated by the highlight.\n:not(pre, figure) {\n & > code {\n padding: 0.2em 0.15em;\n font-weight: 400;\n background-color: $code-background-color;\n border: $border $border-color;\n border-radius: $border-radius;\n }\n}\n\n// Avoid appearance of dark border around visited code links in Safari\na:visited code {\n border-color: $border-color;\n}\n\n// Content structure for highlighted code blocks using fences or Liquid\n//\n// ```[LANG]...```, no kramdown line_numbers:\n// div.[language-LANG.]highlighter-rouge > div.highlight > pre.highlight > code\n//\n// ```[LANG]...```, kramdown line_numbers = true:\n// div.[language-LANG.]highlighter-rouge > div.highlight > pre.highlight > code\n// > div.table-wrapper > table.rouge-table > tbody > tr\n// > td.rouge-gutter.gl > pre.lineno\n// | td.rouge-code > pre\n//\n// {% highlight LANG %}...{% endhighlight %}:\n// figure.highlight > pre > code.language-LANG\n//\n// {% highlight LANG linenos %}...{% endhighlight %}:\n// figure.highlight > pre > code.language-LANG\n// > div.table-wrapper > table.rouge-table > tbody > tr\n// > td.gutter.gl > pre.lineno\n// | td.code > pre\n//\n// ----...---- (AsciiDoc)\n// div.listingblock > div.content > pre.rouge.highlight\n//\n// fix_linenos removes the outermost pre when it encloses table.rouge-table\n//\n// See docs/index-test.md for some tests.\n//\n// No kramdown line_numbers: fences and Liquid highlighting look the same.\n// Kramdown line_numbers = true: fences have a wider gutter than with Liquid?\n\n// ```[LANG]...```\n// or in AsciiDoc:\n//\n// ----\n// ...\n// ----\n\n// the code may appear with 3 different types:\n// container \\ case: default case, code with line number, code with html rendering\n// top level: div.highlighter-rouge, figure.highlight, figure.highlight\n// second level: div.highlight, div.table-wrapper, pre.highlight\n// third level: pre.highlight, td.code, absent\n// last level: code, pre, code (optionality)\n// highlighter level: span, span, span\n// the spacing are only in the second level for case 1, 3 and in the third level for case 2\n// in AsciiDoc, there is a parent container that contains optionally a title and the content.\n\n// select top level container\ndiv.highlighter-rouge,\ndiv.listingblock > div.content,\nfigure.highlight {\n margin-top: 0;\n margin-bottom: $sp-3;\n background-color: $code-background-color;\n border-radius: $border-radius;\n box-shadow: none;\n -webkit-overflow-scrolling: touch;\n position: relative;\n padding: 0;\n\n // copy button (or other button)\n // the button appear only when there is a hover on the code or focus on button\n > button {\n width: $sp-3;\n opacity: 0;\n position: absolute;\n top: 0;\n right: 0;\n border: $sp-3 solid $code-background-color;\n background-color: $code-background-color;\n color: $body-text-color;\n box-sizing: content-box;\n\n svg {\n fill: $body-text-color;\n }\n\n &:active {\n text-decoration: none;\n outline: none;\n opacity: 1;\n }\n\n &:focus {\n opacity: 1;\n }\n }\n\n // the button can be seen by doing a simple hover in the code, there is no need to go over the location of the button\n &:hover {\n > button {\n cursor: copy;\n opacity: 1;\n }\n }\n}\n\n// setting the spacing and scrollbar on the second level for the first case\n// remove all space on the second and third level\n// this is a mixin to accommodate for the slightly different structures generated via Markdown vs AsciiDoc\n@mixin scroll-and-spacing($code-div, $pre-select) {\n #{$code-div} {\n overflow-x: auto;\n padding: $sp-3;\n margin: 0;\n border: 0;\n }\n\n #{$pre-select},\n code {\n padding: 0;\n margin: 0;\n border: 0;\n }\n}\n\n// for Markdown\ndiv.highlighter-rouge {\n @include scroll-and-spacing(\"div.highlight\", \"pre.highlight\");\n}\n\n// for AsciiDoc. we also need to fix the margins for its parent container.\ndiv.listingblock {\n @include scroll-and-spacing(\"div.content\", \"div.content > pre\");\n\n margin-top: 0;\n margin-bottom: $sp-3;\n}\n\n// {% highlight LANG %}...{% endhighlight %},\n// {% highlight LANG linenos %}...{% endhighlight %}:\n\n// setting the spacing and scrollbar on the second level for the thirt case\n// the css rule are apply only to the last code enviroment\n// setting the scroolbar\nfigure.highlight {\n pre,\n :not(pre) > code {\n overflow-x: auto;\n padding: $sp-3;\n margin: 0;\n border: 0;\n }\n}\n\n// ```[LANG]...```, kramdown line_numbers = true,\n// {% highlight LANG linenos %}...{% endhighlight %}:\n\n// setting the spacing and scrollbar on the thirt level for the second case\n.highlight .table-wrapper {\n padding: $sp-3 0;\n margin: 0;\n border: 0;\n box-shadow: none;\n\n td,\n pre {\n @include fs-2;\n\n min-width: 0;\n padding: 0;\n background-color: $code-background-color;\n border: 0;\n }\n\n td.gl {\n width: 1em;\n padding-right: $sp-3;\n padding-left: $sp-3;\n }\n\n pre {\n margin: 0;\n line-height: 2;\n }\n}\n\n// Code examples: html render of a code\n.code-example,\n.listingblock > .title {\n padding: $sp-3;\n margin-bottom: $sp-3;\n overflow: auto;\n border: 1px solid $border-color;\n border-radius: $border-radius;\n\n + .highlighter-rouge,\n + .sectionbody .listingblock,\n + .content,\n + figure.highlight {\n position: relative;\n margin-top: -$sp-4;\n border-right: 1px solid $border-color;\n border-bottom: 1px solid $border-color;\n border-left: 1px solid $border-color;\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n }\n}\n\n// Mermaid diagram code blocks should be left unstyled.\ncode.language-mermaid {\n padding: 0;\n background-color: inherit;\n border: 0;\n}\n\n// Override OneDarkJekyll Colors for Code Blocks\n.highlight,\npre.highlight {\n background: $code-background-color; // Code Background\n // For Backwards Compatibility Before $code-linenumber-color was added\n @if variable-exists(code-linenumber-color) {\n color: $code-linenumber-color; // Code Line Numbers\n } @else {\n color: $body-text-color; // Code Line Numbers\n }\n}\n\n// Override OneDarkJekyll Colors for Code Blocks\n.highlight pre {\n background: $code-background-color; // Code Background\n}\n\n// {% endraw %}\n","// Utility classes for colors\n\n// Text colors\n\n.text-grey-dk-000 {\n color: $grey-dk-000 !important;\n}\n\n.text-grey-dk-100 {\n color: $grey-dk-100 !important;\n}\n\n.text-grey-dk-200 {\n color: $grey-dk-200 !important;\n}\n\n.text-grey-dk-250 {\n color: $grey-dk-250 !important;\n}\n\n.text-grey-dk-300 {\n color: $grey-dk-300 !important;\n}\n\n.text-grey-lt-000 {\n color: $grey-lt-000 !important;\n}\n\n.text-grey-lt-100 {\n color: $grey-lt-100 !important;\n}\n\n.text-grey-lt-200 {\n color: $grey-lt-200 !important;\n}\n\n.text-grey-lt-300 {\n color: $grey-lt-300 !important;\n}\n\n.text-blue-000 {\n color: $blue-000 !important;\n}\n\n.text-blue-100 {\n color: $blue-100 !important;\n}\n\n.text-blue-200 {\n color: $blue-200 !important;\n}\n\n.text-blue-300 {\n color: $blue-300 !important;\n}\n\n.text-green-000 {\n color: $green-000 !important;\n}\n\n.text-green-100 {\n color: $green-100 !important;\n}\n\n.text-green-200 {\n color: $green-200 !important;\n}\n\n.text-green-300 {\n color: $green-300 !important;\n}\n\n.text-purple-000 {\n color: $purple-000 !important;\n}\n\n.text-purple-100 {\n color: $purple-100 !important;\n}\n\n.text-purple-200 {\n color: $purple-200 !important;\n}\n\n.text-purple-300 {\n color: $purple-300 !important;\n}\n\n.text-yellow-000 {\n color: $yellow-000 !important;\n}\n\n.text-yellow-100 {\n color: $yellow-100 !important;\n}\n\n.text-yellow-200 {\n color: $yellow-200 !important;\n}\n\n.text-yellow-300 {\n color: $yellow-300 !important;\n}\n\n.text-red-000 {\n color: $red-000 !important;\n}\n\n.text-red-100 {\n color: $red-100 !important;\n}\n\n.text-red-200 {\n color: $red-200 !important;\n}\n\n.text-red-300 {\n color: $red-300 !important;\n}\n\n// Background colors\n\n.bg-grey-dk-000 {\n background-color: $grey-dk-000 !important;\n}\n\n.bg-grey-dk-100 {\n background-color: $grey-dk-100 !important;\n}\n\n.bg-grey-dk-200 {\n background-color: $grey-dk-200 !important;\n}\n\n.bg-grey-dk-250 {\n background-color: $grey-dk-250 !important;\n}\n\n.bg-grey-dk-300 {\n background-color: $grey-dk-300 !important;\n}\n\n.bg-grey-lt-000 {\n background-color: $grey-lt-000 !important;\n}\n\n.bg-grey-lt-100 {\n background-color: $grey-lt-100 !important;\n}\n\n.bg-grey-lt-200 {\n background-color: $grey-lt-200 !important;\n}\n\n.bg-grey-lt-300 {\n background-color: $grey-lt-300 !important;\n}\n\n.bg-blue-000 {\n background-color: $blue-000 !important;\n}\n\n.bg-blue-100 {\n background-color: $blue-100 !important;\n}\n\n.bg-blue-200 {\n background-color: $blue-200 !important;\n}\n\n.bg-blue-300 {\n background-color: $blue-300 !important;\n}\n\n.bg-green-000 {\n background-color: $green-000 !important;\n}\n\n.bg-green-100 {\n background-color: $green-100 !important;\n}\n\n.bg-green-200 {\n background-color: $green-200 !important;\n}\n\n.bg-green-300 {\n background-color: $green-300 !important;\n}\n\n.bg-purple-000 {\n background-color: $purple-000 !important;\n}\n\n.bg-purple-100 {\n background-color: $purple-100 !important;\n}\n\n.bg-purple-200 {\n background-color: $purple-200 !important;\n}\n\n.bg-purple-300 {\n background-color: $purple-300 !important;\n}\n\n.bg-yellow-000 {\n background-color: $yellow-000 !important;\n}\n\n.bg-yellow-100 {\n background-color: $yellow-100 !important;\n}\n\n.bg-yellow-200 {\n background-color: $yellow-200 !important;\n}\n\n.bg-yellow-300 {\n background-color: $yellow-300 !important;\n}\n\n.bg-red-000 {\n background-color: $red-000 !important;\n}\n\n.bg-red-100 {\n background-color: $red-100 !important;\n}\n\n.bg-red-200 {\n background-color: $red-200 !important;\n}\n\n.bg-red-300 {\n background-color: $red-300 !important;\n}\n","// Utility classes for layout\n\n// Display\n\n.d-block {\n display: block !important;\n}\n\n.d-flex {\n display: flex !important;\n}\n\n.d-inline {\n display: inline !important;\n}\n\n.d-inline-block {\n display: inline-block !important;\n}\n\n.d-none {\n display: none !important;\n}\n\n@each $media-query in map-keys($media-queries) {\n @for $i from 1 through length($spacers) {\n @include mq($media-query) {\n $size: #{map-get($spacers, sp-#{$i - 1})};\n $scale: #{$i - 1};\n\n // .d-sm-block, .d-md-none, .d-lg-inline\n .d-#{$media-query}-block {\n display: block !important;\n }\n .d-#{$media-query}-flex {\n display: flex !important;\n }\n .d-#{$media-query}-inline {\n display: inline !important;\n }\n .d-#{$media-query}-inline-block {\n display: inline-block !important;\n }\n .d-#{$media-query}-none {\n display: none !important;\n }\n }\n }\n}\n\n// Horizontal alignment\n\n.float-left {\n float: left !important;\n}\n\n.float-right {\n float: right !important;\n}\n\n.flex-justify-start {\n justify-content: flex-start !important;\n}\n\n.flex-justify-end {\n justify-content: flex-end !important;\n}\n\n.flex-justify-between {\n justify-content: space-between !important;\n}\n\n.flex-justify-around {\n justify-content: space-around !important;\n}\n\n// Vertical alignment\n\n.v-align-baseline {\n vertical-align: baseline !important;\n}\n\n.v-align-bottom {\n vertical-align: bottom !important;\n}\n\n.v-align-middle {\n vertical-align: middle !important;\n}\n\n.v-align-text-bottom {\n vertical-align: text-bottom !important;\n}\n\n.v-align-text-top {\n vertical-align: text-top !important;\n}\n\n.v-align-top {\n vertical-align: top !important;\n}\n","// Utility classes for typography\n\n.fs-1 {\n @include fs-1;\n}\n\n.fs-2 {\n @include fs-2;\n}\n\n.fs-3 {\n @include fs-3;\n}\n\n.fs-4 {\n @include fs-4;\n}\n\n.fs-5 {\n @include fs-5;\n}\n\n.fs-6 {\n @include fs-6;\n}\n\n.fs-7 {\n @include fs-7;\n}\n\n.fs-8 {\n @include fs-8;\n}\n\n.fs-9 {\n @include fs-9;\n}\n\n.fs-10 {\n @include fs-10;\n}\n\n.fw-300 {\n font-weight: 300 !important;\n}\n\n.fw-400 {\n font-weight: 400 !important;\n}\n\n.fw-500 {\n font-weight: 500 !important;\n}\n\n.fw-700 {\n font-weight: 700 !important;\n}\n\n.lh-0 {\n line-height: 0 !important;\n}\n\n.lh-default {\n line-height: $body-line-height;\n}\n\n.lh-tight {\n line-height: $body-heading-line-height;\n}\n\n.ls-5 {\n letter-spacing: 0.05em !important;\n}\n\n.ls-10 {\n letter-spacing: 0.1em !important;\n}\n\n.ls-0 {\n letter-spacing: 0 !important;\n}\n\n.text-uppercase {\n text-transform: uppercase !important;\n}\n","// Utility classes for lists\n\n// stylelint-disable selector-max-type\n\n.list-style-none {\n padding: 0 !important;\n margin: 0 !important;\n list-style: none !important;\n\n li {\n &::before {\n display: none !important;\n }\n }\n}\n","// Utility classes for margins and padding\n\n// stylelint-disable block-opening-brace-space-after, block-opening-brace-space-before\n\n// Margin spacer utilities\n\n.mx-auto {\n margin-right: auto !important;\n margin-left: auto !important;\n}\n\n@for $i from 1 through length($spacers) {\n $size: #{map-get($spacers, sp-#{$i - 1})};\n $scale: #{$i - 1};\n\n // .m-0, .m-1, .m-2...\n .m-#{$scale} {\n margin: #{$size} !important;\n }\n .mt-#{$scale} {\n margin-top: #{$size} !important;\n }\n .mr-#{$scale} {\n margin-right: #{$size} !important;\n }\n .mb-#{$scale} {\n margin-bottom: #{$size} !important;\n }\n .ml-#{$scale} {\n margin-left: #{$size} !important;\n }\n\n .mx-#{$scale} {\n margin-right: #{$size} !important;\n margin-left: #{$size} !important;\n }\n\n .my-#{$scale} {\n margin-top: #{$size} !important;\n margin-bottom: #{$size} !important;\n }\n\n .mxn-#{$scale} {\n margin-right: -#{$size} !important;\n margin-left: -#{$size} !important;\n }\n .mx-#{$scale}-auto {\n margin-right: auto !important;\n margin-left: auto !important;\n }\n}\n\n@each $media-query in map-keys($media-queries) {\n @for $i from 1 through length($spacers) {\n @include mq($media-query) {\n $size: #{map-get($spacers, sp-#{$i - 1})};\n $scale: #{$i - 1};\n\n // .m-sm-0, .m-md-1, .m-lg-2...\n .m-#{$media-query}-#{$scale} {\n margin: #{$size} !important;\n }\n .mt-#{$media-query}-#{$scale} {\n margin-top: #{$size} !important;\n }\n .mr-#{$media-query}-#{$scale} {\n margin-right: #{$size} !important;\n }\n .mb-#{$media-query}-#{$scale} {\n margin-bottom: #{$size} !important;\n }\n .ml-#{$media-query}-#{$scale} {\n margin-left: #{$size} !important;\n }\n\n .mx-#{$media-query}-#{$scale} {\n margin-right: #{$size} !important;\n margin-left: #{$size} !important;\n }\n\n .my-#{$media-query}-#{$scale} {\n margin-top: #{$size} !important;\n margin-bottom: #{$size} !important;\n }\n\n .mxn-#{$media-query}-#{$scale} {\n margin-right: -#{$size} !important;\n margin-left: -#{$size} !important;\n }\n }\n }\n}\n\n// Padding spacer utilities\n\n@for $i from 1 through length($spacers) {\n $size: #{map-get($spacers, sp-#{$i - 1})};\n $scale: #{$i - 1};\n\n // .p-0, .p-1, .p-2...\n .p-#{$scale} {\n padding: #{$size} !important;\n }\n .pt-#{$scale} {\n padding-top: #{$size} !important;\n }\n .pr-#{$scale} {\n padding-right: #{$size} !important;\n }\n .pb-#{$scale} {\n padding-bottom: #{$size} !important;\n }\n .pl-#{$scale} {\n padding-left: #{$size} !important;\n }\n\n .px-#{$scale} {\n padding-right: #{$size} !important;\n padding-left: #{$size} !important;\n }\n\n .py-#{$scale} {\n padding-top: #{$size} !important;\n padding-bottom: #{$size} !important;\n }\n}\n\n@each $media-query in map-keys($media-queries) {\n @include mq($media-query) {\n @for $i from 1 through length($spacers) {\n $size: #{map-get($spacers, sp-#{$i - 1})};\n $scale: #{$i - 1};\n\n // .p-sm-0, .p-md-1, .p-lg-2...\n .p-#{$media-query}-#{$scale} {\n padding: #{$size} !important;\n }\n .pt-#{$media-query}-#{$scale} {\n padding-top: #{$size} !important;\n }\n .pr-#{$media-query}-#{$scale} {\n padding-right: #{$size} !important;\n }\n .pb-#{$media-query}-#{$scale} {\n padding-bottom: #{$size} !important;\n }\n .pl-#{$media-query}-#{$scale} {\n padding-left: #{$size} !important;\n }\n\n .px-#{$media-query}-#{$scale} {\n padding-right: #{$size} !important;\n padding-left: #{$size} !important;\n }\n\n .py-#{$media-query}-#{$scale} {\n padding-top: #{$size} !important;\n padding-bottom: #{$size} !important;\n }\n }\n }\n}\n","// stylelint-disable selector-max-specificity, selector-max-id, selector-max-type, selector-no-qualifying-type\n\n@media print {\n .site-footer,\n .site-button,\n #edit-this-page,\n #back-to-top,\n .site-nav,\n .main-header {\n display: none !important;\n }\n\n .side-bar {\n width: 100%;\n height: auto;\n border-right: 0 !important;\n }\n\n .site-header {\n border-bottom: 1px solid $border-color;\n }\n\n .site-title {\n font-size: 1rem !important;\n font-weight: 700 !important;\n }\n\n .text-small {\n font-size: 8pt !important;\n }\n\n pre.highlight {\n border: 1px solid $border-color;\n }\n\n .main {\n max-width: none;\n margin-left: 0;\n }\n}\n","// Skipnav\n// Skip to main content\n\na.skip-to-main {\n left: -999px;\n position: absolute;\n top: auto;\n width: 1px;\n height: 1px;\n overflow: hidden;\n z-index: -999;\n}\n\na.skip-to-main:focus,\na.skip-to-main:active {\n color: $link-color;\n background-color: $body-background-color;\n left: auto;\n top: auto;\n width: 30%;\n height: auto;\n overflow: auto;\n margin: 10px 35%;\n padding: 5px;\n border-radius: 15px;\n border: 4px solid $btn-primary-color;\n text-align: center;\n font-size: 1.2em;\n z-index: 999;\n}\n","\n\n@import \"./support/support\";\n@import \"./custom/setup\";\n@import \"./color_schemes/light\";\n\n@import \"./modules\";\ndiv.opaque {\n background-color: $body-background-color;\n}\n@import \"./custom/custom\";\n\n\n"],"file":"just-the-docs-default.css"} \ No newline at end of file diff --git a/docs/_site/assets/css/just-the-docs-head-nav.css b/docs/_site/assets/css/just-the-docs-head-nav.css new file mode 100644 index 00000000..552a3af7 --- /dev/null +++ b/docs/_site/assets/css/just-the-docs-head-nav.css @@ -0,0 +1,3 @@ +.site-nav ul li a { + background-image: linear-gradient(-90deg, #ebedf5 0%, rgba(235, 237, 245, 0.8) 80%, rgba(235, 237, 245, 0) 100%); +} diff --git a/docs/_site/assets/css/just-the-docs-light.css b/docs/_site/assets/css/just-the-docs-light.css new file mode 100644 index 00000000..e1bd8e86 --- /dev/null +++ b/docs/_site/assets/css/just-the-docs-light.css @@ -0,0 +1,7293 @@ +@charset "UTF-8"; +.highlight, +pre.highlight { + background: #f9f9f9; + color: #383942; +} + +.highlight pre { + background: #f9f9f9; +} + +.highlight .hll { + background: #f9f9f9; +} + +.highlight .c { + color: #9fa0a6; + font-style: italic; +} + +.highlight .err { + color: #fff; + background-color: #e05151; +} + +.highlight .k { + color: #a625a4; +} + +.highlight .l { + color: #50a04f; +} + +.highlight .n { + color: #383942; +} + +.highlight .o { + color: #383942; +} + +.highlight .p { + color: #383942; +} + +.highlight .cm { + color: #9fa0a6; + font-style: italic; +} + +.highlight .cp { + color: #9fa0a6; + font-style: italic; +} + +.highlight .c1 { + color: #9fa0a6; + font-style: italic; +} + +.highlight .cs { + color: #9fa0a6; + font-style: italic; +} + +.highlight .ge { + font-style: italic; +} + +.highlight .gs { + font-weight: 700; +} + +.highlight .kc { + color: #a625a4; +} + +.highlight .kd { + color: #a625a4; +} + +.highlight .kn { + color: #a625a4; +} + +.highlight .kp { + color: #a625a4; +} + +.highlight .kr { + color: #a625a4; +} + +.highlight .kt { + color: #a625a4; +} + +.highlight .ld { + color: #50a04f; +} + +.highlight .m { + color: #b66a00; +} + +.highlight .s { + color: #50a04f; +} + +.highlight .na { + color: #b66a00; +} + +.highlight .nb { + color: #ca7601; +} + +.highlight .nc { + color: #ca7601; +} + +.highlight .no { + color: #ca7601; +} + +.highlight .nd { + color: #ca7601; +} + +.highlight .ni { + color: #ca7601; +} + +.highlight .ne { + color: #ca7601; +} + +.highlight .nf { + color: #383942; +} + +.highlight .nl { + color: #ca7601; +} + +.highlight .nn { + color: #383942; +} + +.highlight .nx { + color: #383942; +} + +.highlight .py { + color: #ca7601; +} + +.highlight .nt { + color: #e35549; +} + +.highlight .nv { + color: #ca7601; +} + +.highlight .ow { + font-weight: 700; +} + +.highlight .w { + color: #f8f8f2; +} + +.highlight .mf { + color: #b66a00; +} + +.highlight .mh { + color: #b66a00; +} + +.highlight .mi { + color: #b66a00; +} + +.highlight .mo { + color: #b66a00; +} + +.highlight .sb { + color: #50a04f; +} + +.highlight .sc { + color: #50a04f; +} + +.highlight .sd { + color: #50a04f; +} + +.highlight .s2 { + color: #50a04f; +} + +.highlight .se { + color: #50a04f; +} + +.highlight .sh { + color: #50a04f; +} + +.highlight .si { + color: #50a04f; +} + +.highlight .sx { + color: #50a04f; +} + +.highlight .sr { + color: #0083bb; +} + +.highlight .s1 { + color: #50a04f; +} + +.highlight .ss { + color: #0083bb; +} + +.highlight .bp { + color: #ca7601; +} + +.highlight .vc { + color: #ca7601; +} + +.highlight .vg { + color: #ca7601; +} + +.highlight .vi { + color: #e35549; +} + +.highlight .il { + color: #b66a00; +} + +.highlight .gu { + color: #75715e; +} + +.highlight .gd { + color: #e05151; +} + +.highlight .gi { + color: #43d089; +} + +.highlight .language-json .w + .s2 { + color: #e35549; +} + +.highlight .language-json .kc { + color: #0083bb; +} + +/*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */ +/* Document + ========================================================================== */ +/** + * 1. Correct the line height in all browsers. + * 2. Prevent adjustments of font size after orientation changes in iOS. + */ +html { + line-height: 1.15; /* 1 */ + -webkit-text-size-adjust: 100%; /* 2 */ +} + +/* Sections + ========================================================================== */ +/** + * Remove the margin in all browsers. + */ +body { + margin: 0; +} + +/** + * Render the `main` element consistently in IE. + */ +main { + display: block; +} + +/** + * Correct the font size and margin on `h1` elements within `section` and + * `article` contexts in Chrome, Firefox, and Safari. + */ +h1 { + font-size: 2em; + margin: 0.67em 0; +} + +/* Grouping content + ========================================================================== */ +/** + * 1. Add the correct box sizing in Firefox. + * 2. Show the overflow in Edge and IE. + */ +hr { + box-sizing: content-box; /* 1 */ + height: 0; /* 1 */ + overflow: visible; /* 2 */ +} + +/** + * 1. Correct the inheritance and scaling of font size in all browsers. + * 2. Correct the odd `em` font sizing in all browsers. + */ +pre { + font-family: monospace, monospace; /* 1 */ + font-size: 1em; /* 2 */ +} + +/* Text-level semantics + ========================================================================== */ +/** + * Remove the gray background on active links in IE 10. + */ +a { + background-color: transparent; +} + +/** + * 1. Remove the bottom border in Chrome 57- + * 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari. + */ +abbr[title] { + border-bottom: none; /* 1 */ + text-decoration: underline; /* 2 */ + text-decoration: underline dotted; /* 2 */ +} + +/** + * Add the correct font weight in Chrome, Edge, and Safari. + */ +b, +strong { + font-weight: bolder; +} + +/** + * 1. Correct the inheritance and scaling of font size in all browsers. + * 2. Correct the odd `em` font sizing in all browsers. + */ +code, +kbd, +samp { + font-family: monospace, monospace; /* 1 */ + font-size: 1em; /* 2 */ +} + +/** + * Add the correct font size in all browsers. + */ +small { + font-size: 80%; +} + +/** + * Prevent `sub` and `sup` elements from affecting the line height in + * all browsers. + */ +sub, +sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; +} + +sub { + bottom: -0.25em; +} + +sup { + top: -0.5em; +} + +/* Embedded content + ========================================================================== */ +/** + * Remove the border on images inside links in IE 10. + */ +img { + border-style: none; +} + +/* Forms + ========================================================================== */ +/** + * 1. Change the font styles in all browsers. + * 2. Remove the margin in Firefox and Safari. + */ +button, +input, +optgroup, +select, +textarea { + font-family: inherit; /* 1 */ + font-size: 100%; /* 1 */ + line-height: 1.15; /* 1 */ + margin: 0; /* 2 */ +} + +/** + * Show the overflow in IE. + * 1. Show the overflow in Edge. + */ +button, +input { + /* 1 */ + overflow: visible; +} + +/** + * Remove the inheritance of text transform in Edge, Firefox, and IE. + * 1. Remove the inheritance of text transform in Firefox. + */ +button, +select { + /* 1 */ + text-transform: none; +} + +/** + * Correct the inability to style clickable types in iOS and Safari. + */ +button, +[type=button], +[type=reset], +[type=submit] { + -webkit-appearance: button; +} + +/** + * Remove the inner border and padding in Firefox. + */ +button::-moz-focus-inner, +[type=button]::-moz-focus-inner, +[type=reset]::-moz-focus-inner, +[type=submit]::-moz-focus-inner { + border-style: none; + padding: 0; +} + +/** + * Restore the focus styles unset by the previous rule. + */ +button:-moz-focusring, +[type=button]:-moz-focusring, +[type=reset]:-moz-focusring, +[type=submit]:-moz-focusring { + outline: 1px dotted ButtonText; +} + +/** + * Correct the padding in Firefox. + */ +fieldset { + padding: 0.35em 0.75em 0.625em; +} + +/** + * 1. Correct the text wrapping in Edge and IE. + * 2. Correct the color inheritance from `fieldset` elements in IE. + * 3. Remove the padding so developers are not caught out when they zero out + * `fieldset` elements in all browsers. + */ +legend { + box-sizing: border-box; /* 1 */ + color: inherit; /* 2 */ + display: table; /* 1 */ + max-width: 100%; /* 1 */ + padding: 0; /* 3 */ + white-space: normal; /* 1 */ +} + +/** + * Add the correct vertical alignment in Chrome, Firefox, and Opera. + */ +progress { + vertical-align: baseline; +} + +/** + * Remove the default vertical scrollbar in IE 10+. + */ +textarea { + overflow: auto; +} + +/** + * 1. Add the correct box sizing in IE 10. + * 2. Remove the padding in IE 10. + */ +[type=checkbox], +[type=radio] { + box-sizing: border-box; /* 1 */ + padding: 0; /* 2 */ +} + +/** + * Correct the cursor style of increment and decrement buttons in Chrome. + */ +[type=number]::-webkit-inner-spin-button, +[type=number]::-webkit-outer-spin-button { + height: auto; +} + +/** + * 1. Correct the odd appearance in Chrome and Safari. + * 2. Correct the outline style in Safari. + */ +[type=search] { + -webkit-appearance: textfield; /* 1 */ + outline-offset: -2px; /* 2 */ +} + +/** + * Remove the inner padding in Chrome and Safari on macOS. + */ +[type=search]::-webkit-search-decoration { + -webkit-appearance: none; +} + +/** + * 1. Correct the inability to style clickable types in iOS and Safari. + * 2. Change font properties to `inherit` in Safari. + */ +::-webkit-file-upload-button { + -webkit-appearance: button; /* 1 */ + font: inherit; /* 2 */ +} + +/* Interactive + ========================================================================== */ +/* + * Add the correct display in Edge, IE 10+, and Firefox. + */ +details { + display: block; +} + +/* + * Add the correct display in all browsers. + */ +summary { + display: list-item; +} + +/* Misc + ========================================================================== */ +/** + * Add the correct display in IE 10+. + */ +template { + display: none; +} + +/** + * Add the correct display in IE 10. + */ +[hidden] { + display: none; +} + +:root { + color-scheme: light; +} + +* { + box-sizing: border-box; +} + +html { + font-size: 0.875rem !important; + scroll-behavior: smooth; +} +@media (min-width: 31.25rem) { + html { + font-size: 1rem !important; + } +} + +body { + font-family: system-ui, -apple-system, blinkmacsystemfont, "Segoe UI", roboto, "Helvetica Neue", arial, sans-serif, "Segoe UI Emoji"; + font-size: inherit; + line-height: 1.4; + color: #5c5962; + background-color: #fff; + overflow-wrap: break-word; +} + +ol, +ul, +dl, +pre, +address, +blockquote, +table, +div, +hr, +form, +fieldset, +noscript .table-wrapper { + margin-top: 0; +} + +h1, +h2, +h3, +h4, +h5, +h6, +#toctitle { + margin-top: 0; + margin-bottom: 1em; + font-weight: 500; + line-height: 1.25; + color: #27262b; +} + +p { + margin-top: 1em; + margin-bottom: 1em; +} + +a { + color: #7253ed; + text-decoration: none; +} + +a:not([class]) { + text-decoration: underline; + text-decoration-color: #eeebee; + text-underline-offset: 2px; +} +a:not([class]):hover { + text-decoration-color: rgba(114, 83, 237, 0.45); +} + +code { + font-family: "SFMono-Regular", menlo, consolas, monospace; + font-size: 0.75em; + line-height: 1.4; +} + +figure, +pre { + margin: 0; +} + +li { + margin: 0.25em 0; +} + +img { + max-width: 100%; + height: auto; +} + +hr { + height: 1px; + padding: 0; + margin: 2rem 0; + background-color: #eeebee; + border: 0; +} + +blockquote { + margin: 10px 0; + margin-block-start: 0; + margin-inline-start: 0; + padding-left: 1rem; + border-left: 3px solid #eeebee; +} + +.side-bar { + z-index: 0; + display: flex; + flex-wrap: wrap; + background-color: #f5f6fa; +} +@media (min-width: 50rem) { + .side-bar { + flex-flow: column nowrap; + position: fixed; + width: 15.5rem; + height: 100%; + border-right: 1px solid #eeebee; + align-items: flex-end; + } +} +@media (min-width: 66.5rem) { + .side-bar { + width: calc((100% - 66.5rem) / 2 + 16.5rem); + min-width: 16.5rem; + } +} + +@media (min-width: 50rem) { + .main { + position: relative; + max-width: 50rem; + margin-left: 15.5rem; + } +} +@media (min-width: 66.5rem) { + .main { + margin-left: max(16.5rem, (100% - 66.5rem) / 2 + 16.5rem); + } +} + +.main-content-wrap { + padding-right: 1rem; + padding-left: 1rem; + padding-top: 1rem; + padding-bottom: 1rem; +} +@media (min-width: 50rem) { + .main-content-wrap { + padding-right: 2rem; + padding-left: 2rem; + } +} +@media (min-width: 50rem) { + .main-content-wrap { + padding-top: 2rem; + padding-bottom: 2rem; + } +} + +.main-header { + z-index: 0; + display: none; + background-color: #f5f6fa; +} +@media (min-width: 50rem) { + .main-header { + display: flex; + justify-content: space-between; + height: 3.75rem; + background-color: #fff; + border-bottom: 1px solid #eeebee; + } +} +.main-header.nav-open { + display: block; +} +@media (min-width: 50rem) { + .main-header.nav-open { + display: flex; + } +} + +.site-nav, +.site-header, +.site-footer { + width: 100%; +} +@media (min-width: 66.5rem) { + .site-nav, + .site-header, + .site-footer { + width: 16.5rem; + } +} + +.site-nav { + display: none; +} +.site-nav.nav-open { + display: block; +} +@media (min-width: 50rem) { + .site-nav { + display: block; + padding-top: 3rem; + padding-bottom: 1rem; + overflow-y: auto; + flex: 1 1 auto; + } +} + +.site-header { + display: flex; + min-height: 3.75rem; + align-items: center; +} +@media (min-width: 50rem) { + .site-header { + height: 3.75rem; + max-height: 3.75rem; + border-bottom: 1px solid #eeebee; + } +} + +.site-title { + padding-right: 1rem; + padding-left: 1rem; + flex-grow: 1; + display: flex; + height: 100%; + align-items: center; + padding-top: 0.75rem; + padding-bottom: 0.75rem; + color: #27262b; + font-size: 1.125rem !important; +} +@media (min-width: 50rem) { + .site-title { + padding-right: 2rem; + padding-left: 2rem; + } +} +@media (min-width: 31.25rem) { + .site-title { + font-size: 1.5rem !important; + line-height: 1.25; + } +} +@media (min-width: 50rem) { + .site-title { + padding-top: 0.5rem; + padding-bottom: 0.5rem; + } +} + +.site-button { + display: flex; + height: 100%; + padding: 1rem; + align-items: center; +} + +@media (min-width: 50rem) { + .site-header .site-button { + display: none; + } +} +.site-title:hover { + background-image: linear-gradient(-90deg, #ebedf5 0%, rgba(235, 237, 245, 0.8) 80%, rgba(235, 237, 245, 0) 100%); +} + +.site-button:hover { + background-image: linear-gradient(-90deg, #ebedf5 0%, rgba(235, 237, 245, 0.8) 100%); +} + +body { + position: relative; + padding-bottom: 4rem; + overflow-y: scroll; +} +@media (min-width: 50rem) { + body { + position: static; + padding-bottom: 0; + } +} + +.site-footer { + padding-right: 1rem; + padding-left: 1rem; + position: absolute; + bottom: 0; + left: 0; + padding-top: 1rem; + padding-bottom: 1rem; + color: #959396; + font-size: 0.6875rem !important; +} +@media (min-width: 50rem) { + .site-footer { + padding-right: 2rem; + padding-left: 2rem; + } +} +@media (min-width: 31.25rem) { + .site-footer { + font-size: 0.75rem !important; + } +} +@media (min-width: 50rem) { + .site-footer { + position: static; + justify-self: end; + } +} + +.icon { + width: 1.5rem; + height: 1.5rem; + color: #7253ed; +} + +.main-content { + line-height: 1.6; +} +.main-content ol, +.main-content ul, +.main-content dl, +.main-content pre, +.main-content address, +.main-content blockquote, +.main-content .table-wrapper { + margin-top: 0.5em; +} +.main-content a { + overflow: hidden; + text-overflow: ellipsis; +} +.main-content ul, +.main-content ol { + padding-left: 1.5em; +} +.main-content li .highlight { + margin-top: 0.25rem; +} +.main-content ol { + list-style-type: none; + counter-reset: step-counter; +} +.main-content ol > li { + position: relative; +} +.main-content ol > li::before { + position: absolute; + top: 0.2em; + left: -1.6em; + color: #959396; + content: counter(step-counter); + counter-increment: step-counter; + font-size: 0.75rem !important; +} +@media (min-width: 31.25rem) { + .main-content ol > li::before { + font-size: 0.875rem !important; + } +} +@media (min-width: 31.25rem) { + .main-content ol > li::before { + top: 0.11em; + } +} +.main-content ol > li ol { + counter-reset: sub-counter; +} +.main-content ol > li ol > li::before { + content: counter(sub-counter, lower-alpha); + counter-increment: sub-counter; +} +.main-content ul { + list-style: none; +} +.main-content ul > li::before { + position: absolute; + margin-left: -1.4em; + color: #959396; + content: "•"; +} +.main-content .task-list-item::before { + content: ""; +} +.main-content .task-list-item-checkbox { + margin-right: 0.6em; + margin-left: -1.4em; +} +.main-content hr + * { + margin-top: 0; +} +.main-content h1:first-of-type { + margin-top: 0.5em; +} +.main-content dl { + display: grid; + grid-template: auto/10em 1fr; +} +.main-content dt, +.main-content dd { + margin: 0.25em 0; +} +.main-content dt { + grid-column: 1; + font-weight: 500; + text-align: right; +} +.main-content dt::after { + content: ":"; +} +.main-content dd { + grid-column: 2; + margin-bottom: 0; + margin-left: 1em; +} +.main-content dd blockquote:first-child, +.main-content dd div:first-child, +.main-content dd dl:first-child, +.main-content dd dt:first-child, +.main-content dd h1:first-child, +.main-content dd h2:first-child, +.main-content dd h3:first-child, +.main-content dd h4:first-child, +.main-content dd h5:first-child, +.main-content dd h6:first-child, +.main-content dd li:first-child, +.main-content dd ol:first-child, +.main-content dd p:first-child, +.main-content dd pre:first-child, +.main-content dd table:first-child, +.main-content dd ul:first-child, +.main-content dd .table-wrapper:first-child { + margin-top: 0; +} +.main-content dd dl:first-child dt:first-child, +.main-content dd dl:first-child dd:nth-child(2), +.main-content ol dl:first-child dt:first-child, +.main-content ol dl:first-child dd:nth-child(2), +.main-content ul dl:first-child dt:first-child, +.main-content ul dl:first-child dd:nth-child(2) { + margin-top: 0; +} +.main-content .anchor-heading { + position: absolute; + right: -1rem; + width: 1.5rem; + height: 100%; + padding-right: 0.25rem; + padding-left: 0.25rem; + overflow: visible; +} +@media (min-width: 50rem) { + .main-content .anchor-heading { + right: auto; + left: -1.5rem; + } +} +.main-content .anchor-heading svg { + display: inline-block; + width: 100%; + height: 100%; + color: #7253ed; + visibility: hidden; +} +.main-content .anchor-heading:hover svg, +.main-content .anchor-heading:focus svg, +.main-content h1:hover > .anchor-heading svg, +.main-content h2:hover > .anchor-heading svg, +.main-content h3:hover > .anchor-heading svg, +.main-content h4:hover > .anchor-heading svg, +.main-content h5:hover > .anchor-heading svg, +.main-content h6:hover > .anchor-heading svg { + visibility: visible; +} +.main-content summary { + cursor: pointer; +} +.main-content h1, +.main-content h2, +.main-content h3, +.main-content h4, +.main-content h5, +.main-content h6, +.main-content #toctitle { + position: relative; + margin-top: 1.5em; + margin-bottom: 0.25em; +} +.main-content h1 + table, +.main-content h1 + .table-wrapper, +.main-content h1 + .code-example, +.main-content h1 + .highlighter-rouge, +.main-content h1 + .sectionbody .listingblock, +.main-content h2 + table, +.main-content h2 + .table-wrapper, +.main-content h2 + .code-example, +.main-content h2 + .highlighter-rouge, +.main-content h2 + .sectionbody .listingblock, +.main-content h3 + table, +.main-content h3 + .table-wrapper, +.main-content h3 + .code-example, +.main-content h3 + .highlighter-rouge, +.main-content h3 + .sectionbody .listingblock, +.main-content h4 + table, +.main-content h4 + .table-wrapper, +.main-content h4 + .code-example, +.main-content h4 + .highlighter-rouge, +.main-content h4 + .sectionbody .listingblock, +.main-content h5 + table, +.main-content h5 + .table-wrapper, +.main-content h5 + .code-example, +.main-content h5 + .highlighter-rouge, +.main-content h5 + .sectionbody .listingblock, +.main-content h6 + table, +.main-content h6 + .table-wrapper, +.main-content h6 + .code-example, +.main-content h6 + .highlighter-rouge, +.main-content h6 + .sectionbody .listingblock, +.main-content #toctitle + table, +.main-content #toctitle + .table-wrapper, +.main-content #toctitle + .code-example, +.main-content #toctitle + .highlighter-rouge, +.main-content #toctitle + .sectionbody .listingblock { + margin-top: 1em; +} +.main-content h1 + p:not(.label), +.main-content h2 + p:not(.label), +.main-content h3 + p:not(.label), +.main-content h4 + p:not(.label), +.main-content h5 + p:not(.label), +.main-content h6 + p:not(.label), +.main-content #toctitle + p:not(.label) { + margin-top: 0; +} +.main-content > h1:first-child, +.main-content > h2:first-child, +.main-content > h3:first-child, +.main-content > h4:first-child, +.main-content > h5:first-child, +.main-content > h6:first-child, +.main-content > .sect1:first-child > h2, +.main-content > .sect2:first-child > h3, +.main-content > .sect3:first-child > h4, +.main-content > .sect4:first-child > h5, +.main-content > .sect5:first-child > h6 { + margin-top: 0.5rem; +} + +.nav-list { + padding: 0; + margin-top: 0; + margin-bottom: 0; + list-style: none; +} +.nav-list .nav-list-item { + font-size: 0.875rem !important; + position: relative; + margin: 0; +} +@media (min-width: 31.25rem) { + .nav-list .nav-list-item { + font-size: 1rem !important; + } +} +@media (min-width: 50rem) { + .nav-list .nav-list-item { + font-size: 0.75rem !important; + } +} +@media (min-width: 50rem) and (min-width: 31.25rem) { + .nav-list .nav-list-item { + font-size: 0.875rem !important; + } +} +.nav-list .nav-list-item .nav-list-link { + display: block; + min-height: 3rem; + padding-top: 0.25rem; + padding-bottom: 0.25rem; + line-height: 2.5rem; + padding-right: 3rem; + padding-left: 1rem; +} +@media (min-width: 50rem) { + .nav-list .nav-list-item .nav-list-link { + min-height: 2rem; + line-height: 1.5rem; + padding-right: 2rem; + padding-left: 2rem; + } +} +.nav-list .nav-list-item .nav-list-link.external > svg { + width: 1rem; + height: 1rem; + vertical-align: text-bottom; +} +.nav-list .nav-list-item .nav-list-link.active { + font-weight: 600; + text-decoration: none; +} +.nav-list .nav-list-item .nav-list-link:hover, .nav-list .nav-list-item .nav-list-link.active { + background-image: linear-gradient(-90deg, #ebedf5 0%, rgba(235, 237, 245, 0.8) 80%, rgba(235, 237, 245, 0) 100%); +} +.nav-list .nav-list-item .nav-list-expander { + position: absolute; + right: 0; + width: 3rem; + height: 3rem; + padding: 0.75rem; + color: #7253ed; +} +@media (min-width: 50rem) { + .nav-list .nav-list-item .nav-list-expander { + width: 2rem; + height: 2rem; + padding: 0.5rem; + } +} +.nav-list .nav-list-item .nav-list-expander:hover { + background-image: linear-gradient(-90deg, #ebedf5 0%, rgba(235, 237, 245, 0.8) 100%); +} +.nav-list .nav-list-item .nav-list-expander svg { + transform: rotate(90deg); +} +.nav-list .nav-list-item > .nav-list { + display: none; + padding-left: 0.75rem; + list-style: none; +} +.nav-list .nav-list-item > .nav-list .nav-list-item { + position: relative; +} +.nav-list .nav-list-item > .nav-list .nav-list-item .nav-list-link { + color: #5c5962; +} +.nav-list .nav-list-item > .nav-list .nav-list-item .nav-list-expander { + color: #5c5962; +} +.nav-list .nav-list-item.active > .nav-list-expander svg { + transform: rotate(-90deg); +} +.nav-list .nav-list-item.active > .nav-list { + display: block; +} + +.nav-category { + padding: 0.5rem 1rem; + font-weight: 600; + text-align: start; + text-transform: uppercase; + border-bottom: 1px solid #eeebee; + font-size: 0.6875rem !important; +} +@media (min-width: 31.25rem) { + .nav-category { + font-size: 0.75rem !important; + } +} +@media (min-width: 50rem) { + .nav-category { + padding: 0.5rem 2rem; + margin-top: 1rem; + text-align: start; + } + .nav-category:first-child { + margin-top: 0; + } +} + +.nav-list.nav-category-list > .nav-list-item { + margin: 0; +} +.nav-list.nav-category-list > .nav-list-item > .nav-list { + padding: 0; +} +.nav-list.nav-category-list > .nav-list-item > .nav-list > .nav-list-item > .nav-list-link { + color: #7253ed; +} +.nav-list.nav-category-list > .nav-list-item > .nav-list > .nav-list-item > .nav-list-expander { + color: #7253ed; +} + +.aux-nav { + height: 100%; + overflow-x: auto; + font-size: 0.6875rem !important; +} +@media (min-width: 31.25rem) { + .aux-nav { + font-size: 0.75rem !important; + } +} +.aux-nav .aux-nav-list { + display: flex; + height: 100%; + padding: 0; + margin: 0; + list-style: none; +} +.aux-nav .aux-nav-list-item { + display: inline-block; + height: 100%; + padding: 0; + margin: 0; +} +@media (min-width: 50rem) { + .aux-nav { + padding-right: 1rem; + } +} + +@media (min-width: 50rem) { + .breadcrumb-nav { + margin-top: -1rem; + } +} + +.breadcrumb-nav-list { + padding-left: 0; + margin-bottom: 0.75rem; + list-style: none; +} + +.breadcrumb-nav-list-item { + display: table-cell; + font-size: 0.6875rem !important; +} +@media (min-width: 31.25rem) { + .breadcrumb-nav-list-item { + font-size: 0.75rem !important; + } +} +.breadcrumb-nav-list-item::before { + display: none; +} +.breadcrumb-nav-list-item::after { + display: inline-block; + margin-right: 0.5rem; + margin-left: 0.5rem; + color: #959396; + content: "/"; +} +.breadcrumb-nav-list-item:last-child::after { + content: ""; +} + +h1, +.text-alpha { + font-size: 2rem !important; + line-height: 1.25; + font-weight: 300; +} +@media (min-width: 31.25rem) { + h1, + .text-alpha { + font-size: 2.25rem !important; + } +} + +h2, +.text-beta, +#toctitle { + font-size: 1.125rem !important; +} +@media (min-width: 31.25rem) { + h2, + .text-beta, + #toctitle { + font-size: 1.5rem !important; + line-height: 1.25; + } +} + +h3, +.text-gamma { + font-size: 1rem !important; +} +@media (min-width: 31.25rem) { + h3, + .text-gamma { + font-size: 1.125rem !important; + } +} + +h4, +.text-delta { + font-size: 0.6875rem !important; + font-weight: 400; + text-transform: uppercase; + letter-spacing: 0.1em; +} +@media (min-width: 31.25rem) { + h4, + .text-delta { + font-size: 0.75rem !important; + } +} + +h4 code { + text-transform: none; +} + +h5, +.text-epsilon { + font-size: 0.75rem !important; +} +@media (min-width: 31.25rem) { + h5, + .text-epsilon { + font-size: 0.875rem !important; + } +} + +h6, +.text-zeta { + font-size: 0.6875rem !important; +} +@media (min-width: 31.25rem) { + h6, + .text-zeta { + font-size: 0.75rem !important; + } +} + +.text-small { + font-size: 0.6875rem !important; +} +@media (min-width: 31.25rem) { + .text-small { + font-size: 0.75rem !important; + } +} + +.text-mono { + font-family: "SFMono-Regular", menlo, consolas, monospace !important; +} + +.text-left { + text-align: left !important; +} + +.text-center { + text-align: center !important; +} + +.text-right { + text-align: right !important; +} + +.label:not(g), +.label-blue:not(g) { + display: inline-block; + padding: 0.16em 0.56em; + margin-right: 0.5rem; + margin-left: 0.5rem; + color: #fff; + text-transform: uppercase; + vertical-align: middle; + background-color: #2869e6; + font-size: 0.6875rem !important; + border-radius: 12px; +} +@media (min-width: 31.25rem) { + .label:not(g), + .label-blue:not(g) { + font-size: 0.75rem !important; + } +} + +.label-green:not(g) { + background-color: #009c7b; +} + +.label-purple:not(g) { + background-color: #5e41d0; +} + +.label-red:not(g) { + background-color: #e94c4c; +} + +.label-yellow:not(g) { + color: #44434d; + background-color: #f7d12e; +} + +.btn { + display: inline-block; + box-sizing: border-box; + padding: 0.3em 1em; + margin: 0; + font-family: inherit; + font-size: inherit; + font-weight: 500; + line-height: 1.5; + color: #7253ed; + text-decoration: none; + vertical-align: baseline; + cursor: pointer; + background-color: #f7f7f7; + border-width: 0; + border-radius: 4px; + box-shadow: 0 1px 2px rgba(0, 0, 0, 0.12), 0 3px 10px rgba(0, 0, 0, 0.08); + appearance: none; +} +.btn:focus { + text-decoration: none; + outline: none; + box-shadow: 0 0 0 3px rgba(0, 0, 255, 0.25); +} +.btn:focus:hover, .btn.selected:focus { + box-shadow: 0 0 0 3px rgba(0, 0, 255, 0.25); +} +.btn:hover, .btn.zeroclipboard-is-hover { + color: #6a4aec; +} +.btn:hover, .btn:active, .btn.zeroclipboard-is-hover, .btn.zeroclipboard-is-active { + text-decoration: none; + background-color: #f4f4f4; +} +.btn:active, .btn.selected, .btn.zeroclipboard-is-active { + background-color: #efefef; + background-image: none; + box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15); +} +.btn.selected:hover { + background-color: #cfcfcf; +} +.btn:disabled, .btn:disabled:hover, .btn.disabled, .btn.disabled:hover { + color: rgba(102, 102, 102, 0.5); + cursor: default; + background-color: rgba(229, 229, 229, 0.5); + background-image: none; + box-shadow: none; +} + +.btn-outline { + color: #7253ed; + background: transparent; + box-shadow: inset 0 0 0 2px #e6e1e8; +} +.btn-outline:hover, .btn-outline:active, .btn-outline.zeroclipboard-is-hover, .btn-outline.zeroclipboard-is-active { + color: #6341eb; + text-decoration: none; + background-color: transparent; + box-shadow: inset 0 0 0 3px #e6e1e8; +} +.btn-outline:focus { + text-decoration: none; + outline: none; + box-shadow: inset 0 0 0 2px #5c5962, 0 0 0 3px rgba(0, 0, 255, 0.25); +} +.btn-outline:focus:hover, .btn-outline.selected:focus { + box-shadow: inset 0 0 0 2px #5c5962; +} + +.btn-primary { + color: #fff; + background-color: #5739ce; + background-image: linear-gradient(#6f55d5, #5739ce); + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.25), 0 4px 10px rgba(0, 0, 0, 0.12); +} +.btn-primary:hover, .btn-primary.zeroclipboard-is-hover { + color: #fff; + background-color: #5132cb; + background-image: linear-gradient(#6549d2, #5132cb); +} +.btn-primary:active, .btn-primary.selected, .btn-primary.zeroclipboard-is-active { + background-color: #4f31c6; + background-image: none; + box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15); +} +.btn-primary.selected:hover { + background-color: #472cb2; +} + +.btn-purple { + color: #fff; + background-color: #5739ce; + background-image: linear-gradient(#6f55d5, #5739ce); + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.25), 0 4px 10px rgba(0, 0, 0, 0.12); +} +.btn-purple:hover, .btn-purple.zeroclipboard-is-hover { + color: #fff; + background-color: #5132cb; + background-image: linear-gradient(#6549d2, #5132cb); +} +.btn-purple:active, .btn-purple.selected, .btn-purple.zeroclipboard-is-active { + background-color: #4f31c6; + background-image: none; + box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15); +} +.btn-purple.selected:hover { + background-color: #472cb2; +} + +.btn-blue { + color: #fff; + background-color: #227efa; + background-image: linear-gradient(#4593fb, #227efa); + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.25), 0 4px 10px rgba(0, 0, 0, 0.12); +} +.btn-blue:hover, .btn-blue.zeroclipboard-is-hover { + color: #fff; + background-color: #1878fa; + background-image: linear-gradient(#368afa, #1878fa); +} +.btn-blue:active, .btn-blue.selected, .btn-blue.zeroclipboard-is-active { + background-color: #1375f9; + background-image: none; + box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15); +} +.btn-blue.selected:hover { + background-color: #0669ed; +} + +.btn-green { + color: #fff; + background-color: #10ac7d; + background-image: linear-gradient(#13cc95, #10ac7d); + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.25), 0 4px 10px rgba(0, 0, 0, 0.12); +} +.btn-green:hover, .btn-green.zeroclipboard-is-hover { + color: #fff; + background-color: #0fa276; + background-image: linear-gradient(#12be8b, #0fa276); +} +.btn-green:active, .btn-green.selected, .btn-green.zeroclipboard-is-active { + background-color: #0f9e73; + background-image: none; + box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15); +} +.btn-green.selected:hover { + background-color: #0d8662; +} + +.btn-reset { + background: none; + border: none; + margin: 0; + text-align: inherit; + font: inherit; + border-radius: 0; + appearance: none; +} + +.search { + position: relative; + z-index: 2; + flex-grow: 1; + height: 4rem; + padding: 0.5rem; + transition: padding linear 200ms; +} +@media (min-width: 50rem) { + .search { + position: relative !important; + width: auto !important; + height: 100% !important; + padding: 0; + transition: none; + } +} + +.search-input-wrap { + position: relative; + z-index: 1; + height: 3rem; + overflow: hidden; + border-radius: 4px; + box-shadow: 0 1px 2px rgba(0, 0, 0, 0.12), 0 3px 10px rgba(0, 0, 0, 0.08); + transition: height linear 200ms; +} +@media (min-width: 50rem) { + .search-input-wrap { + position: absolute; + width: 100%; + max-width: 33.5rem; + height: 100% !important; + border-radius: 0; + box-shadow: none; + transition: width ease 400ms; + } +} + +.search-input { + position: absolute; + width: 100%; + height: 100%; + padding: 0.5rem 1rem 0.5rem 2.5rem; + font-size: 1rem; + color: #5c5962; + background-color: #fff; + border-top: 0; + border-right: 0; + border-bottom: 0; + border-left: 0; + border-radius: 0; +} +@media (min-width: 50rem) { + .search-input { + padding: 0.5rem 1rem 0.5rem 3.5rem; + font-size: 0.875rem; + background-color: #fff; + transition: padding-left linear 200ms; + } +} +.search-input:focus { + outline: 0; +} +.search-input:focus + .search-label .search-icon { + color: #7253ed; +} + +.search-label { + position: absolute; + display: flex; + height: 100%; + padding-left: 1rem; +} +@media (min-width: 50rem) { + .search-label { + padding-left: 2rem; + transition: padding-left linear 200ms; + } +} +.search-label .search-icon { + width: 1.2rem; + height: 1.2rem; + align-self: center; + color: #959396; +} + +.search-results { + position: absolute; + left: 0; + display: none; + width: 100%; + max-height: calc(100% - 4rem); + overflow-y: auto; + background-color: #fff; + border-bottom-right-radius: 4px; + border-bottom-left-radius: 4px; + box-shadow: 0 1px 2px rgba(0, 0, 0, 0.12), 0 3px 10px rgba(0, 0, 0, 0.08); +} +@media (min-width: 50rem) { + .search-results { + top: 100%; + width: 33.5rem; + max-height: calc(100vh - 200%) !important; + } +} + +.search-results-list { + padding-left: 0; + margin-bottom: 0.25rem; + list-style: none; + font-size: 0.875rem !important; +} +@media (min-width: 31.25rem) { + .search-results-list { + font-size: 1rem !important; + } +} +@media (min-width: 50rem) { + .search-results-list { + font-size: 0.75rem !important; + } +} +@media (min-width: 50rem) and (min-width: 31.25rem) { + .search-results-list { + font-size: 0.875rem !important; + } +} + +.search-results-list-item { + padding: 0; + margin: 0; +} + +.search-result { + display: block; + padding: 0.25rem 0.75rem; +} +.search-result:hover, .search-result.active { + background-color: #ebedf5; +} + +.search-result-title { + display: block; + padding-top: 0.5rem; + padding-bottom: 0.5rem; +} +@media (min-width: 31.25rem) { + .search-result-title { + display: inline-block; + width: 40%; + padding-right: 0.5rem; + vertical-align: top; + } +} + +.search-result-doc { + display: flex; + align-items: center; + word-wrap: break-word; +} +.search-result-doc.search-result-doc-parent { + opacity: 0.5; + font-size: 0.75rem !important; +} +@media (min-width: 31.25rem) { + .search-result-doc.search-result-doc-parent { + font-size: 0.875rem !important; + } +} +@media (min-width: 50rem) { + .search-result-doc.search-result-doc-parent { + font-size: 0.6875rem !important; + } +} +@media (min-width: 50rem) and (min-width: 31.25rem) { + .search-result-doc.search-result-doc-parent { + font-size: 0.75rem !important; + } +} +.search-result-doc .search-result-icon { + width: 1rem; + height: 1rem; + margin-right: 0.5rem; + color: #7253ed; + flex-shrink: 0; +} +.search-result-doc .search-result-doc-title { + overflow: auto; +} + +.search-result-section { + margin-left: 1.5rem; + word-wrap: break-word; +} + +.search-result-rel-url { + display: block; + margin-left: 1.5rem; + overflow: hidden; + color: #959396; + text-overflow: ellipsis; + white-space: nowrap; + font-size: 0.5625rem !important; +} +@media (min-width: 31.25rem) { + .search-result-rel-url { + font-size: 0.625rem !important; + } +} + +.search-result-previews { + display: block; + padding-top: 0.5rem; + padding-bottom: 0.5rem; + padding-left: 1rem; + margin-left: 0.5rem; + color: #959396; + word-wrap: break-word; + border-left: 1px solid; + border-left-color: #eeebee; + font-size: 0.6875rem !important; +} +@media (min-width: 31.25rem) { + .search-result-previews { + font-size: 0.75rem !important; + } +} +@media (min-width: 31.25rem) { + .search-result-previews { + display: inline-block; + width: 60%; + padding-left: 0.5rem; + margin-left: 0; + vertical-align: top; + } +} + +.search-result-preview + .search-result-preview { + margin-top: 0.25rem; +} + +.search-result-highlight { + font-weight: bold; +} + +.search-no-result { + padding: 0.5rem 0.75rem; + font-size: 0.75rem !important; +} +@media (min-width: 31.25rem) { + .search-no-result { + font-size: 0.875rem !important; + } +} + +.search-button { + position: fixed; + right: 1rem; + bottom: 1rem; + display: flex; + width: 3.5rem; + height: 3.5rem; + background-color: #fff; + border: 1px solid rgba(114, 83, 237, 0.3); + border-radius: 1.75rem; + box-shadow: 0 1px 2px rgba(0, 0, 0, 0.12), 0 3px 10px rgba(0, 0, 0, 0.08); + align-items: center; + justify-content: center; +} + +.search-overlay { + position: fixed; + top: 0; + left: 0; + z-index: 1; + width: 0; + height: 0; + background-color: rgba(0, 0, 0, 0.3); + opacity: 0; + transition: opacity ease 400ms, width 0s 400ms, height 0s 400ms; +} + +.search-active .search { + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + padding: 0; +} +.search-active .search-input-wrap { + height: 4rem; + border-radius: 0; +} +@media (min-width: 50rem) { + .search-active .search-input-wrap { + width: 33.5rem; + box-shadow: 0 1px 2px rgba(0, 0, 0, 0.12), 0 3px 10px rgba(0, 0, 0, 0.08); + } +} +.search-active .search-input { + background-color: #fff; +} +@media (min-width: 50rem) { + .search-active .search-input { + padding-left: 2.3rem; + } +} +@media (min-width: 50rem) { + .search-active .search-label { + padding-left: 0.6rem; + } +} +.search-active .search-results { + display: block; +} +.search-active .search-overlay { + width: 100%; + height: 100%; + opacity: 1; + transition: opacity ease 400ms, width 0s, height 0s; +} +@media (min-width: 50rem) { + .search-active .main { + position: fixed; + right: 0; + left: 0; + } +} +.search-active .main-header { + padding-top: 4rem; +} +@media (min-width: 50rem) { + .search-active .main-header { + padding-top: 0; + } +} + +.table-wrapper { + display: block; + width: 100%; + max-width: 100%; + margin-bottom: 1.5rem; + overflow-x: auto; + border-radius: 4px; + box-shadow: 0 1px 2px rgba(0, 0, 0, 0.12), 0 3px 10px rgba(0, 0, 0, 0.08); +} + +table { + display: table; + min-width: 100%; + border-collapse: separate; +} + +th, +td { + font-size: 0.75rem !important; + min-width: 7.5rem; + padding: 0.5rem 0.75rem; + background-color: #fff; + border-bottom: 1px solid rgba(238, 235, 238, 0.5); + border-left: 1px solid #eeebee; +} +@media (min-width: 31.25rem) { + th, + td { + font-size: 0.875rem !important; + } +} +th:first-of-type, +td:first-of-type { + border-left: 0; +} + +tbody tr:last-of-type th, +tbody tr:last-of-type td { + border-bottom: 0; +} +tbody tr:last-of-type td { + padding-bottom: 0.75rem; +} + +thead th { + border-bottom: 1px solid #eeebee; +} + +:not(pre, figure) > code { + padding: 0.2em 0.15em; + font-weight: 400; + background-color: #f5f6fa; + border: 1px solid #eeebee; + border-radius: 4px; +} + +a:visited code { + border-color: #eeebee; +} + +div.highlighter-rouge, +div.listingblock > div.content, +figure.highlight { + margin-top: 0; + margin-bottom: 0.75rem; + background-color: #f5f6fa; + border-radius: 4px; + box-shadow: none; + -webkit-overflow-scrolling: touch; + position: relative; + padding: 0; +} +div.highlighter-rouge > button, +div.listingblock > div.content > button, +figure.highlight > button { + width: 0.75rem; + opacity: 0; + position: absolute; + top: 0; + right: 0; + border: 0.75rem solid #f5f6fa; + background-color: #f5f6fa; + color: #5c5962; + box-sizing: content-box; +} +div.highlighter-rouge > button svg, +div.listingblock > div.content > button svg, +figure.highlight > button svg { + fill: #5c5962; +} +div.highlighter-rouge > button:active, +div.listingblock > div.content > button:active, +figure.highlight > button:active { + text-decoration: none; + outline: none; + opacity: 1; +} +div.highlighter-rouge > button:focus, +div.listingblock > div.content > button:focus, +figure.highlight > button:focus { + opacity: 1; +} +div.highlighter-rouge:hover > button, +div.listingblock > div.content:hover > button, +figure.highlight:hover > button { + cursor: copy; + opacity: 1; +} + +div.highlighter-rouge div.highlight { + overflow-x: auto; + padding: 0.75rem; + margin: 0; + border: 0; +} +div.highlighter-rouge pre.highlight, +div.highlighter-rouge code { + padding: 0; + margin: 0; + border: 0; +} + +div.listingblock { + margin-top: 0; + margin-bottom: 0.75rem; +} +div.listingblock div.content { + overflow-x: auto; + padding: 0.75rem; + margin: 0; + border: 0; +} +div.listingblock div.content > pre, +div.listingblock code { + padding: 0; + margin: 0; + border: 0; +} + +figure.highlight pre, +figure.highlight :not(pre) > code { + overflow-x: auto; + padding: 0.75rem; + margin: 0; + border: 0; +} + +.highlight .table-wrapper { + padding: 0.75rem 0; + margin: 0; + border: 0; + box-shadow: none; +} +.highlight .table-wrapper td, +.highlight .table-wrapper pre { + font-size: 0.6875rem !important; + min-width: 0; + padding: 0; + background-color: #f5f6fa; + border: 0; +} +@media (min-width: 31.25rem) { + .highlight .table-wrapper td, + .highlight .table-wrapper pre { + font-size: 0.75rem !important; + } +} +.highlight .table-wrapper td.gl { + width: 1em; + padding-right: 0.75rem; + padding-left: 0.75rem; +} +.highlight .table-wrapper pre { + margin: 0; + line-height: 2; +} + +.code-example, +.listingblock > .title { + padding: 0.75rem; + margin-bottom: 0.75rem; + overflow: auto; + border: 1px solid #eeebee; + border-radius: 4px; +} +.code-example + .highlighter-rouge, +.code-example + .sectionbody .listingblock, +.code-example + .content, +.code-example + figure.highlight, +.listingblock > .title + .highlighter-rouge, +.listingblock > .title + .sectionbody .listingblock, +.listingblock > .title + .content, +.listingblock > .title + figure.highlight { + position: relative; + margin-top: -1rem; + border-right: 1px solid #eeebee; + border-bottom: 1px solid #eeebee; + border-left: 1px solid #eeebee; + border-top-left-radius: 0; + border-top-right-radius: 0; +} + +code.language-mermaid { + padding: 0; + background-color: inherit; + border: 0; +} + +.highlight, +pre.highlight { + background: #f5f6fa; + color: #5c5962; +} + +.highlight pre { + background: #f5f6fa; +} + +.text-grey-dk-000 { + color: #959396 !important; +} + +.text-grey-dk-100 { + color: #5c5962 !important; +} + +.text-grey-dk-200 { + color: #44434d !important; +} + +.text-grey-dk-250 { + color: #302d36 !important; +} + +.text-grey-dk-300 { + color: #27262b !important; +} + +.text-grey-lt-000 { + color: #f5f6fa !important; +} + +.text-grey-lt-100 { + color: #eeebee !important; +} + +.text-grey-lt-200 { + color: #ecebed !important; +} + +.text-grey-lt-300 { + color: #e6e1e8 !important; +} + +.text-blue-000 { + color: #2c84fa !important; +} + +.text-blue-100 { + color: #2869e6 !important; +} + +.text-blue-200 { + color: #264caf !important; +} + +.text-blue-300 { + color: #183385 !important; +} + +.text-green-000 { + color: #41d693 !important; +} + +.text-green-100 { + color: #11b584 !important; +} + +.text-green-200 { + color: #009c7b !important; +} + +.text-green-300 { + color: #026e57 !important; +} + +.text-purple-000 { + color: #7253ed !important; +} + +.text-purple-100 { + color: #5e41d0 !important; +} + +.text-purple-200 { + color: #4e26af !important; +} + +.text-purple-300 { + color: #381885 !important; +} + +.text-yellow-000 { + color: #ffeb82 !important; +} + +.text-yellow-100 { + color: #fadf50 !important; +} + +.text-yellow-200 { + color: #f7d12e !important; +} + +.text-yellow-300 { + color: #e7af06 !important; +} + +.text-red-000 { + color: #f77e7e !important; +} + +.text-red-100 { + color: #f96e65 !important; +} + +.text-red-200 { + color: #e94c4c !important; +} + +.text-red-300 { + color: #dd2e2e !important; +} + +.bg-grey-dk-000 { + background-color: #959396 !important; +} + +.bg-grey-dk-100 { + background-color: #5c5962 !important; +} + +.bg-grey-dk-200 { + background-color: #44434d !important; +} + +.bg-grey-dk-250 { + background-color: #302d36 !important; +} + +.bg-grey-dk-300 { + background-color: #27262b !important; +} + +.bg-grey-lt-000 { + background-color: #f5f6fa !important; +} + +.bg-grey-lt-100 { + background-color: #eeebee !important; +} + +.bg-grey-lt-200 { + background-color: #ecebed !important; +} + +.bg-grey-lt-300 { + background-color: #e6e1e8 !important; +} + +.bg-blue-000 { + background-color: #2c84fa !important; +} + +.bg-blue-100 { + background-color: #2869e6 !important; +} + +.bg-blue-200 { + background-color: #264caf !important; +} + +.bg-blue-300 { + background-color: #183385 !important; +} + +.bg-green-000 { + background-color: #41d693 !important; +} + +.bg-green-100 { + background-color: #11b584 !important; +} + +.bg-green-200 { + background-color: #009c7b !important; +} + +.bg-green-300 { + background-color: #026e57 !important; +} + +.bg-purple-000 { + background-color: #7253ed !important; +} + +.bg-purple-100 { + background-color: #5e41d0 !important; +} + +.bg-purple-200 { + background-color: #4e26af !important; +} + +.bg-purple-300 { + background-color: #381885 !important; +} + +.bg-yellow-000 { + background-color: #ffeb82 !important; +} + +.bg-yellow-100 { + background-color: #fadf50 !important; +} + +.bg-yellow-200 { + background-color: #f7d12e !important; +} + +.bg-yellow-300 { + background-color: #e7af06 !important; +} + +.bg-red-000 { + background-color: #f77e7e !important; +} + +.bg-red-100 { + background-color: #f96e65 !important; +} + +.bg-red-200 { + background-color: #e94c4c !important; +} + +.bg-red-300 { + background-color: #dd2e2e !important; +} + +.d-block { + display: block !important; +} + +.d-flex { + display: flex !important; +} + +.d-inline { + display: inline !important; +} + +.d-inline-block { + display: inline-block !important; +} + +.d-none { + display: none !important; +} + +@media (min-width: 20rem) { + .d-xs-block { + display: block !important; + } + .d-xs-flex { + display: flex !important; + } + .d-xs-inline { + display: inline !important; + } + .d-xs-inline-block { + display: inline-block !important; + } + .d-xs-none { + display: none !important; + } +} +@media (min-width: 20rem) { + .d-xs-block { + display: block !important; + } + .d-xs-flex { + display: flex !important; + } + .d-xs-inline { + display: inline !important; + } + .d-xs-inline-block { + display: inline-block !important; + } + .d-xs-none { + display: none !important; + } +} +@media (min-width: 20rem) { + .d-xs-block { + display: block !important; + } + .d-xs-flex { + display: flex !important; + } + .d-xs-inline { + display: inline !important; + } + .d-xs-inline-block { + display: inline-block !important; + } + .d-xs-none { + display: none !important; + } +} +@media (min-width: 20rem) { + .d-xs-block { + display: block !important; + } + .d-xs-flex { + display: flex !important; + } + .d-xs-inline { + display: inline !important; + } + .d-xs-inline-block { + display: inline-block !important; + } + .d-xs-none { + display: none !important; + } +} +@media (min-width: 20rem) { + .d-xs-block { + display: block !important; + } + .d-xs-flex { + display: flex !important; + } + .d-xs-inline { + display: inline !important; + } + .d-xs-inline-block { + display: inline-block !important; + } + .d-xs-none { + display: none !important; + } +} +@media (min-width: 20rem) { + .d-xs-block { + display: block !important; + } + .d-xs-flex { + display: flex !important; + } + .d-xs-inline { + display: inline !important; + } + .d-xs-inline-block { + display: inline-block !important; + } + .d-xs-none { + display: none !important; + } +} +@media (min-width: 20rem) { + .d-xs-block { + display: block !important; + } + .d-xs-flex { + display: flex !important; + } + .d-xs-inline { + display: inline !important; + } + .d-xs-inline-block { + display: inline-block !important; + } + .d-xs-none { + display: none !important; + } +} +@media (min-width: 20rem) { + .d-xs-block { + display: block !important; + } + .d-xs-flex { + display: flex !important; + } + .d-xs-inline { + display: inline !important; + } + .d-xs-inline-block { + display: inline-block !important; + } + .d-xs-none { + display: none !important; + } +} +@media (min-width: 20rem) { + .d-xs-block { + display: block !important; + } + .d-xs-flex { + display: flex !important; + } + .d-xs-inline { + display: inline !important; + } + .d-xs-inline-block { + display: inline-block !important; + } + .d-xs-none { + display: none !important; + } +} +@media (min-width: 20rem) { + .d-xs-block { + display: block !important; + } + .d-xs-flex { + display: flex !important; + } + .d-xs-inline { + display: inline !important; + } + .d-xs-inline-block { + display: inline-block !important; + } + .d-xs-none { + display: none !important; + } +} +@media (min-width: 20rem) { + .d-xs-block { + display: block !important; + } + .d-xs-flex { + display: flex !important; + } + .d-xs-inline { + display: inline !important; + } + .d-xs-inline-block { + display: inline-block !important; + } + .d-xs-none { + display: none !important; + } +} +@media (min-width: 31.25rem) { + .d-sm-block { + display: block !important; + } + .d-sm-flex { + display: flex !important; + } + .d-sm-inline { + display: inline !important; + } + .d-sm-inline-block { + display: inline-block !important; + } + .d-sm-none { + display: none !important; + } +} +@media (min-width: 31.25rem) { + .d-sm-block { + display: block !important; + } + .d-sm-flex { + display: flex !important; + } + .d-sm-inline { + display: inline !important; + } + .d-sm-inline-block { + display: inline-block !important; + } + .d-sm-none { + display: none !important; + } +} +@media (min-width: 31.25rem) { + .d-sm-block { + display: block !important; + } + .d-sm-flex { + display: flex !important; + } + .d-sm-inline { + display: inline !important; + } + .d-sm-inline-block { + display: inline-block !important; + } + .d-sm-none { + display: none !important; + } +} +@media (min-width: 31.25rem) { + .d-sm-block { + display: block !important; + } + .d-sm-flex { + display: flex !important; + } + .d-sm-inline { + display: inline !important; + } + .d-sm-inline-block { + display: inline-block !important; + } + .d-sm-none { + display: none !important; + } +} +@media (min-width: 31.25rem) { + .d-sm-block { + display: block !important; + } + .d-sm-flex { + display: flex !important; + } + .d-sm-inline { + display: inline !important; + } + .d-sm-inline-block { + display: inline-block !important; + } + .d-sm-none { + display: none !important; + } +} +@media (min-width: 31.25rem) { + .d-sm-block { + display: block !important; + } + .d-sm-flex { + display: flex !important; + } + .d-sm-inline { + display: inline !important; + } + .d-sm-inline-block { + display: inline-block !important; + } + .d-sm-none { + display: none !important; + } +} +@media (min-width: 31.25rem) { + .d-sm-block { + display: block !important; + } + .d-sm-flex { + display: flex !important; + } + .d-sm-inline { + display: inline !important; + } + .d-sm-inline-block { + display: inline-block !important; + } + .d-sm-none { + display: none !important; + } +} +@media (min-width: 31.25rem) { + .d-sm-block { + display: block !important; + } + .d-sm-flex { + display: flex !important; + } + .d-sm-inline { + display: inline !important; + } + .d-sm-inline-block { + display: inline-block !important; + } + .d-sm-none { + display: none !important; + } +} +@media (min-width: 31.25rem) { + .d-sm-block { + display: block !important; + } + .d-sm-flex { + display: flex !important; + } + .d-sm-inline { + display: inline !important; + } + .d-sm-inline-block { + display: inline-block !important; + } + .d-sm-none { + display: none !important; + } +} +@media (min-width: 31.25rem) { + .d-sm-block { + display: block !important; + } + .d-sm-flex { + display: flex !important; + } + .d-sm-inline { + display: inline !important; + } + .d-sm-inline-block { + display: inline-block !important; + } + .d-sm-none { + display: none !important; + } +} +@media (min-width: 31.25rem) { + .d-sm-block { + display: block !important; + } + .d-sm-flex { + display: flex !important; + } + .d-sm-inline { + display: inline !important; + } + .d-sm-inline-block { + display: inline-block !important; + } + .d-sm-none { + display: none !important; + } +} +@media (min-width: 50rem) { + .d-md-block { + display: block !important; + } + .d-md-flex { + display: flex !important; + } + .d-md-inline { + display: inline !important; + } + .d-md-inline-block { + display: inline-block !important; + } + .d-md-none { + display: none !important; + } +} +@media (min-width: 50rem) { + .d-md-block { + display: block !important; + } + .d-md-flex { + display: flex !important; + } + .d-md-inline { + display: inline !important; + } + .d-md-inline-block { + display: inline-block !important; + } + .d-md-none { + display: none !important; + } +} +@media (min-width: 50rem) { + .d-md-block { + display: block !important; + } + .d-md-flex { + display: flex !important; + } + .d-md-inline { + display: inline !important; + } + .d-md-inline-block { + display: inline-block !important; + } + .d-md-none { + display: none !important; + } +} +@media (min-width: 50rem) { + .d-md-block { + display: block !important; + } + .d-md-flex { + display: flex !important; + } + .d-md-inline { + display: inline !important; + } + .d-md-inline-block { + display: inline-block !important; + } + .d-md-none { + display: none !important; + } +} +@media (min-width: 50rem) { + .d-md-block { + display: block !important; + } + .d-md-flex { + display: flex !important; + } + .d-md-inline { + display: inline !important; + } + .d-md-inline-block { + display: inline-block !important; + } + .d-md-none { + display: none !important; + } +} +@media (min-width: 50rem) { + .d-md-block { + display: block !important; + } + .d-md-flex { + display: flex !important; + } + .d-md-inline { + display: inline !important; + } + .d-md-inline-block { + display: inline-block !important; + } + .d-md-none { + display: none !important; + } +} +@media (min-width: 50rem) { + .d-md-block { + display: block !important; + } + .d-md-flex { + display: flex !important; + } + .d-md-inline { + display: inline !important; + } + .d-md-inline-block { + display: inline-block !important; + } + .d-md-none { + display: none !important; + } +} +@media (min-width: 50rem) { + .d-md-block { + display: block !important; + } + .d-md-flex { + display: flex !important; + } + .d-md-inline { + display: inline !important; + } + .d-md-inline-block { + display: inline-block !important; + } + .d-md-none { + display: none !important; + } +} +@media (min-width: 50rem) { + .d-md-block { + display: block !important; + } + .d-md-flex { + display: flex !important; + } + .d-md-inline { + display: inline !important; + } + .d-md-inline-block { + display: inline-block !important; + } + .d-md-none { + display: none !important; + } +} +@media (min-width: 50rem) { + .d-md-block { + display: block !important; + } + .d-md-flex { + display: flex !important; + } + .d-md-inline { + display: inline !important; + } + .d-md-inline-block { + display: inline-block !important; + } + .d-md-none { + display: none !important; + } +} +@media (min-width: 50rem) { + .d-md-block { + display: block !important; + } + .d-md-flex { + display: flex !important; + } + .d-md-inline { + display: inline !important; + } + .d-md-inline-block { + display: inline-block !important; + } + .d-md-none { + display: none !important; + } +} +@media (min-width: 66.5rem) { + .d-lg-block { + display: block !important; + } + .d-lg-flex { + display: flex !important; + } + .d-lg-inline { + display: inline !important; + } + .d-lg-inline-block { + display: inline-block !important; + } + .d-lg-none { + display: none !important; + } +} +@media (min-width: 66.5rem) { + .d-lg-block { + display: block !important; + } + .d-lg-flex { + display: flex !important; + } + .d-lg-inline { + display: inline !important; + } + .d-lg-inline-block { + display: inline-block !important; + } + .d-lg-none { + display: none !important; + } +} +@media (min-width: 66.5rem) { + .d-lg-block { + display: block !important; + } + .d-lg-flex { + display: flex !important; + } + .d-lg-inline { + display: inline !important; + } + .d-lg-inline-block { + display: inline-block !important; + } + .d-lg-none { + display: none !important; + } +} +@media (min-width: 66.5rem) { + .d-lg-block { + display: block !important; + } + .d-lg-flex { + display: flex !important; + } + .d-lg-inline { + display: inline !important; + } + .d-lg-inline-block { + display: inline-block !important; + } + .d-lg-none { + display: none !important; + } +} +@media (min-width: 66.5rem) { + .d-lg-block { + display: block !important; + } + .d-lg-flex { + display: flex !important; + } + .d-lg-inline { + display: inline !important; + } + .d-lg-inline-block { + display: inline-block !important; + } + .d-lg-none { + display: none !important; + } +} +@media (min-width: 66.5rem) { + .d-lg-block { + display: block !important; + } + .d-lg-flex { + display: flex !important; + } + .d-lg-inline { + display: inline !important; + } + .d-lg-inline-block { + display: inline-block !important; + } + .d-lg-none { + display: none !important; + } +} +@media (min-width: 66.5rem) { + .d-lg-block { + display: block !important; + } + .d-lg-flex { + display: flex !important; + } + .d-lg-inline { + display: inline !important; + } + .d-lg-inline-block { + display: inline-block !important; + } + .d-lg-none { + display: none !important; + } +} +@media (min-width: 66.5rem) { + .d-lg-block { + display: block !important; + } + .d-lg-flex { + display: flex !important; + } + .d-lg-inline { + display: inline !important; + } + .d-lg-inline-block { + display: inline-block !important; + } + .d-lg-none { + display: none !important; + } +} +@media (min-width: 66.5rem) { + .d-lg-block { + display: block !important; + } + .d-lg-flex { + display: flex !important; + } + .d-lg-inline { + display: inline !important; + } + .d-lg-inline-block { + display: inline-block !important; + } + .d-lg-none { + display: none !important; + } +} +@media (min-width: 66.5rem) { + .d-lg-block { + display: block !important; + } + .d-lg-flex { + display: flex !important; + } + .d-lg-inline { + display: inline !important; + } + .d-lg-inline-block { + display: inline-block !important; + } + .d-lg-none { + display: none !important; + } +} +@media (min-width: 66.5rem) { + .d-lg-block { + display: block !important; + } + .d-lg-flex { + display: flex !important; + } + .d-lg-inline { + display: inline !important; + } + .d-lg-inline-block { + display: inline-block !important; + } + .d-lg-none { + display: none !important; + } +} +@media (min-width: 87.5rem) { + .d-xl-block { + display: block !important; + } + .d-xl-flex { + display: flex !important; + } + .d-xl-inline { + display: inline !important; + } + .d-xl-inline-block { + display: inline-block !important; + } + .d-xl-none { + display: none !important; + } +} +@media (min-width: 87.5rem) { + .d-xl-block { + display: block !important; + } + .d-xl-flex { + display: flex !important; + } + .d-xl-inline { + display: inline !important; + } + .d-xl-inline-block { + display: inline-block !important; + } + .d-xl-none { + display: none !important; + } +} +@media (min-width: 87.5rem) { + .d-xl-block { + display: block !important; + } + .d-xl-flex { + display: flex !important; + } + .d-xl-inline { + display: inline !important; + } + .d-xl-inline-block { + display: inline-block !important; + } + .d-xl-none { + display: none !important; + } +} +@media (min-width: 87.5rem) { + .d-xl-block { + display: block !important; + } + .d-xl-flex { + display: flex !important; + } + .d-xl-inline { + display: inline !important; + } + .d-xl-inline-block { + display: inline-block !important; + } + .d-xl-none { + display: none !important; + } +} +@media (min-width: 87.5rem) { + .d-xl-block { + display: block !important; + } + .d-xl-flex { + display: flex !important; + } + .d-xl-inline { + display: inline !important; + } + .d-xl-inline-block { + display: inline-block !important; + } + .d-xl-none { + display: none !important; + } +} +@media (min-width: 87.5rem) { + .d-xl-block { + display: block !important; + } + .d-xl-flex { + display: flex !important; + } + .d-xl-inline { + display: inline !important; + } + .d-xl-inline-block { + display: inline-block !important; + } + .d-xl-none { + display: none !important; + } +} +@media (min-width: 87.5rem) { + .d-xl-block { + display: block !important; + } + .d-xl-flex { + display: flex !important; + } + .d-xl-inline { + display: inline !important; + } + .d-xl-inline-block { + display: inline-block !important; + } + .d-xl-none { + display: none !important; + } +} +@media (min-width: 87.5rem) { + .d-xl-block { + display: block !important; + } + .d-xl-flex { + display: flex !important; + } + .d-xl-inline { + display: inline !important; + } + .d-xl-inline-block { + display: inline-block !important; + } + .d-xl-none { + display: none !important; + } +} +@media (min-width: 87.5rem) { + .d-xl-block { + display: block !important; + } + .d-xl-flex { + display: flex !important; + } + .d-xl-inline { + display: inline !important; + } + .d-xl-inline-block { + display: inline-block !important; + } + .d-xl-none { + display: none !important; + } +} +@media (min-width: 87.5rem) { + .d-xl-block { + display: block !important; + } + .d-xl-flex { + display: flex !important; + } + .d-xl-inline { + display: inline !important; + } + .d-xl-inline-block { + display: inline-block !important; + } + .d-xl-none { + display: none !important; + } +} +@media (min-width: 87.5rem) { + .d-xl-block { + display: block !important; + } + .d-xl-flex { + display: flex !important; + } + .d-xl-inline { + display: inline !important; + } + .d-xl-inline-block { + display: inline-block !important; + } + .d-xl-none { + display: none !important; + } +} +.float-left { + float: left !important; +} + +.float-right { + float: right !important; +} + +.flex-justify-start { + justify-content: flex-start !important; +} + +.flex-justify-end { + justify-content: flex-end !important; +} + +.flex-justify-between { + justify-content: space-between !important; +} + +.flex-justify-around { + justify-content: space-around !important; +} + +.v-align-baseline { + vertical-align: baseline !important; +} + +.v-align-bottom { + vertical-align: bottom !important; +} + +.v-align-middle { + vertical-align: middle !important; +} + +.v-align-text-bottom { + vertical-align: text-bottom !important; +} + +.v-align-text-top { + vertical-align: text-top !important; +} + +.v-align-top { + vertical-align: top !important; +} + +.fs-1 { + font-size: 0.5625rem !important; +} +@media (min-width: 31.25rem) { + .fs-1 { + font-size: 0.625rem !important; + } +} + +.fs-2 { + font-size: 0.6875rem !important; +} +@media (min-width: 31.25rem) { + .fs-2 { + font-size: 0.75rem !important; + } +} + +.fs-3 { + font-size: 0.75rem !important; +} +@media (min-width: 31.25rem) { + .fs-3 { + font-size: 0.875rem !important; + } +} + +.fs-4 { + font-size: 0.875rem !important; +} +@media (min-width: 31.25rem) { + .fs-4 { + font-size: 1rem !important; + } +} + +.fs-5 { + font-size: 1rem !important; +} +@media (min-width: 31.25rem) { + .fs-5 { + font-size: 1.125rem !important; + } +} + +.fs-6 { + font-size: 1.125rem !important; +} +@media (min-width: 31.25rem) { + .fs-6 { + font-size: 1.5rem !important; + line-height: 1.25; + } +} + +.fs-7 { + font-size: 1.5rem !important; + line-height: 1.25; +} +@media (min-width: 31.25rem) { + .fs-7 { + font-size: 2rem !important; + } +} + +.fs-8 { + font-size: 2rem !important; + line-height: 1.25; +} +@media (min-width: 31.25rem) { + .fs-8 { + font-size: 2.25rem !important; + } +} + +.fs-9 { + font-size: 2.25rem !important; + line-height: 1.25; +} +@media (min-width: 31.25rem) { + .fs-9 { + font-size: 2.625rem !important; + } +} + +.fs-10 { + font-size: 2.625rem !important; + line-height: 1.25; +} +@media (min-width: 31.25rem) { + .fs-10 { + font-size: 3rem !important; + } +} + +.fw-300 { + font-weight: 300 !important; +} + +.fw-400 { + font-weight: 400 !important; +} + +.fw-500 { + font-weight: 500 !important; +} + +.fw-700 { + font-weight: 700 !important; +} + +.lh-0 { + line-height: 0 !important; +} + +.lh-default { + line-height: 1.4; +} + +.lh-tight { + line-height: 1.25; +} + +.ls-5 { + letter-spacing: 0.05em !important; +} + +.ls-10 { + letter-spacing: 0.1em !important; +} + +.ls-0 { + letter-spacing: 0 !important; +} + +.text-uppercase { + text-transform: uppercase !important; +} + +.list-style-none { + padding: 0 !important; + margin: 0 !important; + list-style: none !important; +} +.list-style-none li::before { + display: none !important; +} + +.mx-auto { + margin-right: auto !important; + margin-left: auto !important; +} + +.m-0 { + margin: 0 !important; +} + +.mt-0 { + margin-top: 0 !important; +} + +.mr-0 { + margin-right: 0 !important; +} + +.mb-0 { + margin-bottom: 0 !important; +} + +.ml-0 { + margin-left: 0 !important; +} + +.mx-0 { + margin-right: 0 !important; + margin-left: 0 !important; +} + +.my-0 { + margin-top: 0 !important; + margin-bottom: 0 !important; +} + +.mxn-0 { + margin-right: -0 !important; + margin-left: -0 !important; +} + +.mx-0-auto { + margin-right: auto !important; + margin-left: auto !important; +} + +.m-1 { + margin: 0.25rem !important; +} + +.mt-1 { + margin-top: 0.25rem !important; +} + +.mr-1 { + margin-right: 0.25rem !important; +} + +.mb-1 { + margin-bottom: 0.25rem !important; +} + +.ml-1 { + margin-left: 0.25rem !important; +} + +.mx-1 { + margin-right: 0.25rem !important; + margin-left: 0.25rem !important; +} + +.my-1 { + margin-top: 0.25rem !important; + margin-bottom: 0.25rem !important; +} + +.mxn-1 { + margin-right: -0.25rem !important; + margin-left: -0.25rem !important; +} + +.mx-1-auto { + margin-right: auto !important; + margin-left: auto !important; +} + +.m-2 { + margin: 0.5rem !important; +} + +.mt-2 { + margin-top: 0.5rem !important; +} + +.mr-2 { + margin-right: 0.5rem !important; +} + +.mb-2 { + margin-bottom: 0.5rem !important; +} + +.ml-2 { + margin-left: 0.5rem !important; +} + +.mx-2 { + margin-right: 0.5rem !important; + margin-left: 0.5rem !important; +} + +.my-2 { + margin-top: 0.5rem !important; + margin-bottom: 0.5rem !important; +} + +.mxn-2 { + margin-right: -0.5rem !important; + margin-left: -0.5rem !important; +} + +.mx-2-auto { + margin-right: auto !important; + margin-left: auto !important; +} + +.m-3 { + margin: 0.75rem !important; +} + +.mt-3 { + margin-top: 0.75rem !important; +} + +.mr-3 { + margin-right: 0.75rem !important; +} + +.mb-3 { + margin-bottom: 0.75rem !important; +} + +.ml-3 { + margin-left: 0.75rem !important; +} + +.mx-3 { + margin-right: 0.75rem !important; + margin-left: 0.75rem !important; +} + +.my-3 { + margin-top: 0.75rem !important; + margin-bottom: 0.75rem !important; +} + +.mxn-3 { + margin-right: -0.75rem !important; + margin-left: -0.75rem !important; +} + +.mx-3-auto { + margin-right: auto !important; + margin-left: auto !important; +} + +.m-4 { + margin: 1rem !important; +} + +.mt-4 { + margin-top: 1rem !important; +} + +.mr-4 { + margin-right: 1rem !important; +} + +.mb-4 { + margin-bottom: 1rem !important; +} + +.ml-4 { + margin-left: 1rem !important; +} + +.mx-4 { + margin-right: 1rem !important; + margin-left: 1rem !important; +} + +.my-4 { + margin-top: 1rem !important; + margin-bottom: 1rem !important; +} + +.mxn-4 { + margin-right: -1rem !important; + margin-left: -1rem !important; +} + +.mx-4-auto { + margin-right: auto !important; + margin-left: auto !important; +} + +.m-5 { + margin: 1.5rem !important; +} + +.mt-5 { + margin-top: 1.5rem !important; +} + +.mr-5 { + margin-right: 1.5rem !important; +} + +.mb-5 { + margin-bottom: 1.5rem !important; +} + +.ml-5 { + margin-left: 1.5rem !important; +} + +.mx-5 { + margin-right: 1.5rem !important; + margin-left: 1.5rem !important; +} + +.my-5 { + margin-top: 1.5rem !important; + margin-bottom: 1.5rem !important; +} + +.mxn-5 { + margin-right: -1.5rem !important; + margin-left: -1.5rem !important; +} + +.mx-5-auto { + margin-right: auto !important; + margin-left: auto !important; +} + +.m-6 { + margin: 2rem !important; +} + +.mt-6 { + margin-top: 2rem !important; +} + +.mr-6 { + margin-right: 2rem !important; +} + +.mb-6 { + margin-bottom: 2rem !important; +} + +.ml-6 { + margin-left: 2rem !important; +} + +.mx-6 { + margin-right: 2rem !important; + margin-left: 2rem !important; +} + +.my-6 { + margin-top: 2rem !important; + margin-bottom: 2rem !important; +} + +.mxn-6 { + margin-right: -2rem !important; + margin-left: -2rem !important; +} + +.mx-6-auto { + margin-right: auto !important; + margin-left: auto !important; +} + +.m-7 { + margin: 2.5rem !important; +} + +.mt-7 { + margin-top: 2.5rem !important; +} + +.mr-7 { + margin-right: 2.5rem !important; +} + +.mb-7 { + margin-bottom: 2.5rem !important; +} + +.ml-7 { + margin-left: 2.5rem !important; +} + +.mx-7 { + margin-right: 2.5rem !important; + margin-left: 2.5rem !important; +} + +.my-7 { + margin-top: 2.5rem !important; + margin-bottom: 2.5rem !important; +} + +.mxn-7 { + margin-right: -2.5rem !important; + margin-left: -2.5rem !important; +} + +.mx-7-auto { + margin-right: auto !important; + margin-left: auto !important; +} + +.m-8 { + margin: 3rem !important; +} + +.mt-8 { + margin-top: 3rem !important; +} + +.mr-8 { + margin-right: 3rem !important; +} + +.mb-8 { + margin-bottom: 3rem !important; +} + +.ml-8 { + margin-left: 3rem !important; +} + +.mx-8 { + margin-right: 3rem !important; + margin-left: 3rem !important; +} + +.my-8 { + margin-top: 3rem !important; + margin-bottom: 3rem !important; +} + +.mxn-8 { + margin-right: -3rem !important; + margin-left: -3rem !important; +} + +.mx-8-auto { + margin-right: auto !important; + margin-left: auto !important; +} + +.m-9 { + margin: 3.5rem !important; +} + +.mt-9 { + margin-top: 3.5rem !important; +} + +.mr-9 { + margin-right: 3.5rem !important; +} + +.mb-9 { + margin-bottom: 3.5rem !important; +} + +.ml-9 { + margin-left: 3.5rem !important; +} + +.mx-9 { + margin-right: 3.5rem !important; + margin-left: 3.5rem !important; +} + +.my-9 { + margin-top: 3.5rem !important; + margin-bottom: 3.5rem !important; +} + +.mxn-9 { + margin-right: -3.5rem !important; + margin-left: -3.5rem !important; +} + +.mx-9-auto { + margin-right: auto !important; + margin-left: auto !important; +} + +.m-10 { + margin: 4rem !important; +} + +.mt-10 { + margin-top: 4rem !important; +} + +.mr-10 { + margin-right: 4rem !important; +} + +.mb-10 { + margin-bottom: 4rem !important; +} + +.ml-10 { + margin-left: 4rem !important; +} + +.mx-10 { + margin-right: 4rem !important; + margin-left: 4rem !important; +} + +.my-10 { + margin-top: 4rem !important; + margin-bottom: 4rem !important; +} + +.mxn-10 { + margin-right: -4rem !important; + margin-left: -4rem !important; +} + +.mx-10-auto { + margin-right: auto !important; + margin-left: auto !important; +} + +@media (min-width: 20rem) { + .m-xs-0 { + margin: 0 !important; + } + .mt-xs-0 { + margin-top: 0 !important; + } + .mr-xs-0 { + margin-right: 0 !important; + } + .mb-xs-0 { + margin-bottom: 0 !important; + } + .ml-xs-0 { + margin-left: 0 !important; + } + .mx-xs-0 { + margin-right: 0 !important; + margin-left: 0 !important; + } + .my-xs-0 { + margin-top: 0 !important; + margin-bottom: 0 !important; + } + .mxn-xs-0 { + margin-right: -0 !important; + margin-left: -0 !important; + } +} +@media (min-width: 20rem) { + .m-xs-1 { + margin: 0.25rem !important; + } + .mt-xs-1 { + margin-top: 0.25rem !important; + } + .mr-xs-1 { + margin-right: 0.25rem !important; + } + .mb-xs-1 { + margin-bottom: 0.25rem !important; + } + .ml-xs-1 { + margin-left: 0.25rem !important; + } + .mx-xs-1 { + margin-right: 0.25rem !important; + margin-left: 0.25rem !important; + } + .my-xs-1 { + margin-top: 0.25rem !important; + margin-bottom: 0.25rem !important; + } + .mxn-xs-1 { + margin-right: -0.25rem !important; + margin-left: -0.25rem !important; + } +} +@media (min-width: 20rem) { + .m-xs-2 { + margin: 0.5rem !important; + } + .mt-xs-2 { + margin-top: 0.5rem !important; + } + .mr-xs-2 { + margin-right: 0.5rem !important; + } + .mb-xs-2 { + margin-bottom: 0.5rem !important; + } + .ml-xs-2 { + margin-left: 0.5rem !important; + } + .mx-xs-2 { + margin-right: 0.5rem !important; + margin-left: 0.5rem !important; + } + .my-xs-2 { + margin-top: 0.5rem !important; + margin-bottom: 0.5rem !important; + } + .mxn-xs-2 { + margin-right: -0.5rem !important; + margin-left: -0.5rem !important; + } +} +@media (min-width: 20rem) { + .m-xs-3 { + margin: 0.75rem !important; + } + .mt-xs-3 { + margin-top: 0.75rem !important; + } + .mr-xs-3 { + margin-right: 0.75rem !important; + } + .mb-xs-3 { + margin-bottom: 0.75rem !important; + } + .ml-xs-3 { + margin-left: 0.75rem !important; + } + .mx-xs-3 { + margin-right: 0.75rem !important; + margin-left: 0.75rem !important; + } + .my-xs-3 { + margin-top: 0.75rem !important; + margin-bottom: 0.75rem !important; + } + .mxn-xs-3 { + margin-right: -0.75rem !important; + margin-left: -0.75rem !important; + } +} +@media (min-width: 20rem) { + .m-xs-4 { + margin: 1rem !important; + } + .mt-xs-4 { + margin-top: 1rem !important; + } + .mr-xs-4 { + margin-right: 1rem !important; + } + .mb-xs-4 { + margin-bottom: 1rem !important; + } + .ml-xs-4 { + margin-left: 1rem !important; + } + .mx-xs-4 { + margin-right: 1rem !important; + margin-left: 1rem !important; + } + .my-xs-4 { + margin-top: 1rem !important; + margin-bottom: 1rem !important; + } + .mxn-xs-4 { + margin-right: -1rem !important; + margin-left: -1rem !important; + } +} +@media (min-width: 20rem) { + .m-xs-5 { + margin: 1.5rem !important; + } + .mt-xs-5 { + margin-top: 1.5rem !important; + } + .mr-xs-5 { + margin-right: 1.5rem !important; + } + .mb-xs-5 { + margin-bottom: 1.5rem !important; + } + .ml-xs-5 { + margin-left: 1.5rem !important; + } + .mx-xs-5 { + margin-right: 1.5rem !important; + margin-left: 1.5rem !important; + } + .my-xs-5 { + margin-top: 1.5rem !important; + margin-bottom: 1.5rem !important; + } + .mxn-xs-5 { + margin-right: -1.5rem !important; + margin-left: -1.5rem !important; + } +} +@media (min-width: 20rem) { + .m-xs-6 { + margin: 2rem !important; + } + .mt-xs-6 { + margin-top: 2rem !important; + } + .mr-xs-6 { + margin-right: 2rem !important; + } + .mb-xs-6 { + margin-bottom: 2rem !important; + } + .ml-xs-6 { + margin-left: 2rem !important; + } + .mx-xs-6 { + margin-right: 2rem !important; + margin-left: 2rem !important; + } + .my-xs-6 { + margin-top: 2rem !important; + margin-bottom: 2rem !important; + } + .mxn-xs-6 { + margin-right: -2rem !important; + margin-left: -2rem !important; + } +} +@media (min-width: 20rem) { + .m-xs-7 { + margin: 2.5rem !important; + } + .mt-xs-7 { + margin-top: 2.5rem !important; + } + .mr-xs-7 { + margin-right: 2.5rem !important; + } + .mb-xs-7 { + margin-bottom: 2.5rem !important; + } + .ml-xs-7 { + margin-left: 2.5rem !important; + } + .mx-xs-7 { + margin-right: 2.5rem !important; + margin-left: 2.5rem !important; + } + .my-xs-7 { + margin-top: 2.5rem !important; + margin-bottom: 2.5rem !important; + } + .mxn-xs-7 { + margin-right: -2.5rem !important; + margin-left: -2.5rem !important; + } +} +@media (min-width: 20rem) { + .m-xs-8 { + margin: 3rem !important; + } + .mt-xs-8 { + margin-top: 3rem !important; + } + .mr-xs-8 { + margin-right: 3rem !important; + } + .mb-xs-8 { + margin-bottom: 3rem !important; + } + .ml-xs-8 { + margin-left: 3rem !important; + } + .mx-xs-8 { + margin-right: 3rem !important; + margin-left: 3rem !important; + } + .my-xs-8 { + margin-top: 3rem !important; + margin-bottom: 3rem !important; + } + .mxn-xs-8 { + margin-right: -3rem !important; + margin-left: -3rem !important; + } +} +@media (min-width: 20rem) { + .m-xs-9 { + margin: 3.5rem !important; + } + .mt-xs-9 { + margin-top: 3.5rem !important; + } + .mr-xs-9 { + margin-right: 3.5rem !important; + } + .mb-xs-9 { + margin-bottom: 3.5rem !important; + } + .ml-xs-9 { + margin-left: 3.5rem !important; + } + .mx-xs-9 { + margin-right: 3.5rem !important; + margin-left: 3.5rem !important; + } + .my-xs-9 { + margin-top: 3.5rem !important; + margin-bottom: 3.5rem !important; + } + .mxn-xs-9 { + margin-right: -3.5rem !important; + margin-left: -3.5rem !important; + } +} +@media (min-width: 20rem) { + .m-xs-10 { + margin: 4rem !important; + } + .mt-xs-10 { + margin-top: 4rem !important; + } + .mr-xs-10 { + margin-right: 4rem !important; + } + .mb-xs-10 { + margin-bottom: 4rem !important; + } + .ml-xs-10 { + margin-left: 4rem !important; + } + .mx-xs-10 { + margin-right: 4rem !important; + margin-left: 4rem !important; + } + .my-xs-10 { + margin-top: 4rem !important; + margin-bottom: 4rem !important; + } + .mxn-xs-10 { + margin-right: -4rem !important; + margin-left: -4rem !important; + } +} +@media (min-width: 31.25rem) { + .m-sm-0 { + margin: 0 !important; + } + .mt-sm-0 { + margin-top: 0 !important; + } + .mr-sm-0 { + margin-right: 0 !important; + } + .mb-sm-0 { + margin-bottom: 0 !important; + } + .ml-sm-0 { + margin-left: 0 !important; + } + .mx-sm-0 { + margin-right: 0 !important; + margin-left: 0 !important; + } + .my-sm-0 { + margin-top: 0 !important; + margin-bottom: 0 !important; + } + .mxn-sm-0 { + margin-right: -0 !important; + margin-left: -0 !important; + } +} +@media (min-width: 31.25rem) { + .m-sm-1 { + margin: 0.25rem !important; + } + .mt-sm-1 { + margin-top: 0.25rem !important; + } + .mr-sm-1 { + margin-right: 0.25rem !important; + } + .mb-sm-1 { + margin-bottom: 0.25rem !important; + } + .ml-sm-1 { + margin-left: 0.25rem !important; + } + .mx-sm-1 { + margin-right: 0.25rem !important; + margin-left: 0.25rem !important; + } + .my-sm-1 { + margin-top: 0.25rem !important; + margin-bottom: 0.25rem !important; + } + .mxn-sm-1 { + margin-right: -0.25rem !important; + margin-left: -0.25rem !important; + } +} +@media (min-width: 31.25rem) { + .m-sm-2 { + margin: 0.5rem !important; + } + .mt-sm-2 { + margin-top: 0.5rem !important; + } + .mr-sm-2 { + margin-right: 0.5rem !important; + } + .mb-sm-2 { + margin-bottom: 0.5rem !important; + } + .ml-sm-2 { + margin-left: 0.5rem !important; + } + .mx-sm-2 { + margin-right: 0.5rem !important; + margin-left: 0.5rem !important; + } + .my-sm-2 { + margin-top: 0.5rem !important; + margin-bottom: 0.5rem !important; + } + .mxn-sm-2 { + margin-right: -0.5rem !important; + margin-left: -0.5rem !important; + } +} +@media (min-width: 31.25rem) { + .m-sm-3 { + margin: 0.75rem !important; + } + .mt-sm-3 { + margin-top: 0.75rem !important; + } + .mr-sm-3 { + margin-right: 0.75rem !important; + } + .mb-sm-3 { + margin-bottom: 0.75rem !important; + } + .ml-sm-3 { + margin-left: 0.75rem !important; + } + .mx-sm-3 { + margin-right: 0.75rem !important; + margin-left: 0.75rem !important; + } + .my-sm-3 { + margin-top: 0.75rem !important; + margin-bottom: 0.75rem !important; + } + .mxn-sm-3 { + margin-right: -0.75rem !important; + margin-left: -0.75rem !important; + } +} +@media (min-width: 31.25rem) { + .m-sm-4 { + margin: 1rem !important; + } + .mt-sm-4 { + margin-top: 1rem !important; + } + .mr-sm-4 { + margin-right: 1rem !important; + } + .mb-sm-4 { + margin-bottom: 1rem !important; + } + .ml-sm-4 { + margin-left: 1rem !important; + } + .mx-sm-4 { + margin-right: 1rem !important; + margin-left: 1rem !important; + } + .my-sm-4 { + margin-top: 1rem !important; + margin-bottom: 1rem !important; + } + .mxn-sm-4 { + margin-right: -1rem !important; + margin-left: -1rem !important; + } +} +@media (min-width: 31.25rem) { + .m-sm-5 { + margin: 1.5rem !important; + } + .mt-sm-5 { + margin-top: 1.5rem !important; + } + .mr-sm-5 { + margin-right: 1.5rem !important; + } + .mb-sm-5 { + margin-bottom: 1.5rem !important; + } + .ml-sm-5 { + margin-left: 1.5rem !important; + } + .mx-sm-5 { + margin-right: 1.5rem !important; + margin-left: 1.5rem !important; + } + .my-sm-5 { + margin-top: 1.5rem !important; + margin-bottom: 1.5rem !important; + } + .mxn-sm-5 { + margin-right: -1.5rem !important; + margin-left: -1.5rem !important; + } +} +@media (min-width: 31.25rem) { + .m-sm-6 { + margin: 2rem !important; + } + .mt-sm-6 { + margin-top: 2rem !important; + } + .mr-sm-6 { + margin-right: 2rem !important; + } + .mb-sm-6 { + margin-bottom: 2rem !important; + } + .ml-sm-6 { + margin-left: 2rem !important; + } + .mx-sm-6 { + margin-right: 2rem !important; + margin-left: 2rem !important; + } + .my-sm-6 { + margin-top: 2rem !important; + margin-bottom: 2rem !important; + } + .mxn-sm-6 { + margin-right: -2rem !important; + margin-left: -2rem !important; + } +} +@media (min-width: 31.25rem) { + .m-sm-7 { + margin: 2.5rem !important; + } + .mt-sm-7 { + margin-top: 2.5rem !important; + } + .mr-sm-7 { + margin-right: 2.5rem !important; + } + .mb-sm-7 { + margin-bottom: 2.5rem !important; + } + .ml-sm-7 { + margin-left: 2.5rem !important; + } + .mx-sm-7 { + margin-right: 2.5rem !important; + margin-left: 2.5rem !important; + } + .my-sm-7 { + margin-top: 2.5rem !important; + margin-bottom: 2.5rem !important; + } + .mxn-sm-7 { + margin-right: -2.5rem !important; + margin-left: -2.5rem !important; + } +} +@media (min-width: 31.25rem) { + .m-sm-8 { + margin: 3rem !important; + } + .mt-sm-8 { + margin-top: 3rem !important; + } + .mr-sm-8 { + margin-right: 3rem !important; + } + .mb-sm-8 { + margin-bottom: 3rem !important; + } + .ml-sm-8 { + margin-left: 3rem !important; + } + .mx-sm-8 { + margin-right: 3rem !important; + margin-left: 3rem !important; + } + .my-sm-8 { + margin-top: 3rem !important; + margin-bottom: 3rem !important; + } + .mxn-sm-8 { + margin-right: -3rem !important; + margin-left: -3rem !important; + } +} +@media (min-width: 31.25rem) { + .m-sm-9 { + margin: 3.5rem !important; + } + .mt-sm-9 { + margin-top: 3.5rem !important; + } + .mr-sm-9 { + margin-right: 3.5rem !important; + } + .mb-sm-9 { + margin-bottom: 3.5rem !important; + } + .ml-sm-9 { + margin-left: 3.5rem !important; + } + .mx-sm-9 { + margin-right: 3.5rem !important; + margin-left: 3.5rem !important; + } + .my-sm-9 { + margin-top: 3.5rem !important; + margin-bottom: 3.5rem !important; + } + .mxn-sm-9 { + margin-right: -3.5rem !important; + margin-left: -3.5rem !important; + } +} +@media (min-width: 31.25rem) { + .m-sm-10 { + margin: 4rem !important; + } + .mt-sm-10 { + margin-top: 4rem !important; + } + .mr-sm-10 { + margin-right: 4rem !important; + } + .mb-sm-10 { + margin-bottom: 4rem !important; + } + .ml-sm-10 { + margin-left: 4rem !important; + } + .mx-sm-10 { + margin-right: 4rem !important; + margin-left: 4rem !important; + } + .my-sm-10 { + margin-top: 4rem !important; + margin-bottom: 4rem !important; + } + .mxn-sm-10 { + margin-right: -4rem !important; + margin-left: -4rem !important; + } +} +@media (min-width: 50rem) { + .m-md-0 { + margin: 0 !important; + } + .mt-md-0 { + margin-top: 0 !important; + } + .mr-md-0 { + margin-right: 0 !important; + } + .mb-md-0 { + margin-bottom: 0 !important; + } + .ml-md-0 { + margin-left: 0 !important; + } + .mx-md-0 { + margin-right: 0 !important; + margin-left: 0 !important; + } + .my-md-0 { + margin-top: 0 !important; + margin-bottom: 0 !important; + } + .mxn-md-0 { + margin-right: -0 !important; + margin-left: -0 !important; + } +} +@media (min-width: 50rem) { + .m-md-1 { + margin: 0.25rem !important; + } + .mt-md-1 { + margin-top: 0.25rem !important; + } + .mr-md-1 { + margin-right: 0.25rem !important; + } + .mb-md-1 { + margin-bottom: 0.25rem !important; + } + .ml-md-1 { + margin-left: 0.25rem !important; + } + .mx-md-1 { + margin-right: 0.25rem !important; + margin-left: 0.25rem !important; + } + .my-md-1 { + margin-top: 0.25rem !important; + margin-bottom: 0.25rem !important; + } + .mxn-md-1 { + margin-right: -0.25rem !important; + margin-left: -0.25rem !important; + } +} +@media (min-width: 50rem) { + .m-md-2 { + margin: 0.5rem !important; + } + .mt-md-2 { + margin-top: 0.5rem !important; + } + .mr-md-2 { + margin-right: 0.5rem !important; + } + .mb-md-2 { + margin-bottom: 0.5rem !important; + } + .ml-md-2 { + margin-left: 0.5rem !important; + } + .mx-md-2 { + margin-right: 0.5rem !important; + margin-left: 0.5rem !important; + } + .my-md-2 { + margin-top: 0.5rem !important; + margin-bottom: 0.5rem !important; + } + .mxn-md-2 { + margin-right: -0.5rem !important; + margin-left: -0.5rem !important; + } +} +@media (min-width: 50rem) { + .m-md-3 { + margin: 0.75rem !important; + } + .mt-md-3 { + margin-top: 0.75rem !important; + } + .mr-md-3 { + margin-right: 0.75rem !important; + } + .mb-md-3 { + margin-bottom: 0.75rem !important; + } + .ml-md-3 { + margin-left: 0.75rem !important; + } + .mx-md-3 { + margin-right: 0.75rem !important; + margin-left: 0.75rem !important; + } + .my-md-3 { + margin-top: 0.75rem !important; + margin-bottom: 0.75rem !important; + } + .mxn-md-3 { + margin-right: -0.75rem !important; + margin-left: -0.75rem !important; + } +} +@media (min-width: 50rem) { + .m-md-4 { + margin: 1rem !important; + } + .mt-md-4 { + margin-top: 1rem !important; + } + .mr-md-4 { + margin-right: 1rem !important; + } + .mb-md-4 { + margin-bottom: 1rem !important; + } + .ml-md-4 { + margin-left: 1rem !important; + } + .mx-md-4 { + margin-right: 1rem !important; + margin-left: 1rem !important; + } + .my-md-4 { + margin-top: 1rem !important; + margin-bottom: 1rem !important; + } + .mxn-md-4 { + margin-right: -1rem !important; + margin-left: -1rem !important; + } +} +@media (min-width: 50rem) { + .m-md-5 { + margin: 1.5rem !important; + } + .mt-md-5 { + margin-top: 1.5rem !important; + } + .mr-md-5 { + margin-right: 1.5rem !important; + } + .mb-md-5 { + margin-bottom: 1.5rem !important; + } + .ml-md-5 { + margin-left: 1.5rem !important; + } + .mx-md-5 { + margin-right: 1.5rem !important; + margin-left: 1.5rem !important; + } + .my-md-5 { + margin-top: 1.5rem !important; + margin-bottom: 1.5rem !important; + } + .mxn-md-5 { + margin-right: -1.5rem !important; + margin-left: -1.5rem !important; + } +} +@media (min-width: 50rem) { + .m-md-6 { + margin: 2rem !important; + } + .mt-md-6 { + margin-top: 2rem !important; + } + .mr-md-6 { + margin-right: 2rem !important; + } + .mb-md-6 { + margin-bottom: 2rem !important; + } + .ml-md-6 { + margin-left: 2rem !important; + } + .mx-md-6 { + margin-right: 2rem !important; + margin-left: 2rem !important; + } + .my-md-6 { + margin-top: 2rem !important; + margin-bottom: 2rem !important; + } + .mxn-md-6 { + margin-right: -2rem !important; + margin-left: -2rem !important; + } +} +@media (min-width: 50rem) { + .m-md-7 { + margin: 2.5rem !important; + } + .mt-md-7 { + margin-top: 2.5rem !important; + } + .mr-md-7 { + margin-right: 2.5rem !important; + } + .mb-md-7 { + margin-bottom: 2.5rem !important; + } + .ml-md-7 { + margin-left: 2.5rem !important; + } + .mx-md-7 { + margin-right: 2.5rem !important; + margin-left: 2.5rem !important; + } + .my-md-7 { + margin-top: 2.5rem !important; + margin-bottom: 2.5rem !important; + } + .mxn-md-7 { + margin-right: -2.5rem !important; + margin-left: -2.5rem !important; + } +} +@media (min-width: 50rem) { + .m-md-8 { + margin: 3rem !important; + } + .mt-md-8 { + margin-top: 3rem !important; + } + .mr-md-8 { + margin-right: 3rem !important; + } + .mb-md-8 { + margin-bottom: 3rem !important; + } + .ml-md-8 { + margin-left: 3rem !important; + } + .mx-md-8 { + margin-right: 3rem !important; + margin-left: 3rem !important; + } + .my-md-8 { + margin-top: 3rem !important; + margin-bottom: 3rem !important; + } + .mxn-md-8 { + margin-right: -3rem !important; + margin-left: -3rem !important; + } +} +@media (min-width: 50rem) { + .m-md-9 { + margin: 3.5rem !important; + } + .mt-md-9 { + margin-top: 3.5rem !important; + } + .mr-md-9 { + margin-right: 3.5rem !important; + } + .mb-md-9 { + margin-bottom: 3.5rem !important; + } + .ml-md-9 { + margin-left: 3.5rem !important; + } + .mx-md-9 { + margin-right: 3.5rem !important; + margin-left: 3.5rem !important; + } + .my-md-9 { + margin-top: 3.5rem !important; + margin-bottom: 3.5rem !important; + } + .mxn-md-9 { + margin-right: -3.5rem !important; + margin-left: -3.5rem !important; + } +} +@media (min-width: 50rem) { + .m-md-10 { + margin: 4rem !important; + } + .mt-md-10 { + margin-top: 4rem !important; + } + .mr-md-10 { + margin-right: 4rem !important; + } + .mb-md-10 { + margin-bottom: 4rem !important; + } + .ml-md-10 { + margin-left: 4rem !important; + } + .mx-md-10 { + margin-right: 4rem !important; + margin-left: 4rem !important; + } + .my-md-10 { + margin-top: 4rem !important; + margin-bottom: 4rem !important; + } + .mxn-md-10 { + margin-right: -4rem !important; + margin-left: -4rem !important; + } +} +@media (min-width: 66.5rem) { + .m-lg-0 { + margin: 0 !important; + } + .mt-lg-0 { + margin-top: 0 !important; + } + .mr-lg-0 { + margin-right: 0 !important; + } + .mb-lg-0 { + margin-bottom: 0 !important; + } + .ml-lg-0 { + margin-left: 0 !important; + } + .mx-lg-0 { + margin-right: 0 !important; + margin-left: 0 !important; + } + .my-lg-0 { + margin-top: 0 !important; + margin-bottom: 0 !important; + } + .mxn-lg-0 { + margin-right: -0 !important; + margin-left: -0 !important; + } +} +@media (min-width: 66.5rem) { + .m-lg-1 { + margin: 0.25rem !important; + } + .mt-lg-1 { + margin-top: 0.25rem !important; + } + .mr-lg-1 { + margin-right: 0.25rem !important; + } + .mb-lg-1 { + margin-bottom: 0.25rem !important; + } + .ml-lg-1 { + margin-left: 0.25rem !important; + } + .mx-lg-1 { + margin-right: 0.25rem !important; + margin-left: 0.25rem !important; + } + .my-lg-1 { + margin-top: 0.25rem !important; + margin-bottom: 0.25rem !important; + } + .mxn-lg-1 { + margin-right: -0.25rem !important; + margin-left: -0.25rem !important; + } +} +@media (min-width: 66.5rem) { + .m-lg-2 { + margin: 0.5rem !important; + } + .mt-lg-2 { + margin-top: 0.5rem !important; + } + .mr-lg-2 { + margin-right: 0.5rem !important; + } + .mb-lg-2 { + margin-bottom: 0.5rem !important; + } + .ml-lg-2 { + margin-left: 0.5rem !important; + } + .mx-lg-2 { + margin-right: 0.5rem !important; + margin-left: 0.5rem !important; + } + .my-lg-2 { + margin-top: 0.5rem !important; + margin-bottom: 0.5rem !important; + } + .mxn-lg-2 { + margin-right: -0.5rem !important; + margin-left: -0.5rem !important; + } +} +@media (min-width: 66.5rem) { + .m-lg-3 { + margin: 0.75rem !important; + } + .mt-lg-3 { + margin-top: 0.75rem !important; + } + .mr-lg-3 { + margin-right: 0.75rem !important; + } + .mb-lg-3 { + margin-bottom: 0.75rem !important; + } + .ml-lg-3 { + margin-left: 0.75rem !important; + } + .mx-lg-3 { + margin-right: 0.75rem !important; + margin-left: 0.75rem !important; + } + .my-lg-3 { + margin-top: 0.75rem !important; + margin-bottom: 0.75rem !important; + } + .mxn-lg-3 { + margin-right: -0.75rem !important; + margin-left: -0.75rem !important; + } +} +@media (min-width: 66.5rem) { + .m-lg-4 { + margin: 1rem !important; + } + .mt-lg-4 { + margin-top: 1rem !important; + } + .mr-lg-4 { + margin-right: 1rem !important; + } + .mb-lg-4 { + margin-bottom: 1rem !important; + } + .ml-lg-4 { + margin-left: 1rem !important; + } + .mx-lg-4 { + margin-right: 1rem !important; + margin-left: 1rem !important; + } + .my-lg-4 { + margin-top: 1rem !important; + margin-bottom: 1rem !important; + } + .mxn-lg-4 { + margin-right: -1rem !important; + margin-left: -1rem !important; + } +} +@media (min-width: 66.5rem) { + .m-lg-5 { + margin: 1.5rem !important; + } + .mt-lg-5 { + margin-top: 1.5rem !important; + } + .mr-lg-5 { + margin-right: 1.5rem !important; + } + .mb-lg-5 { + margin-bottom: 1.5rem !important; + } + .ml-lg-5 { + margin-left: 1.5rem !important; + } + .mx-lg-5 { + margin-right: 1.5rem !important; + margin-left: 1.5rem !important; + } + .my-lg-5 { + margin-top: 1.5rem !important; + margin-bottom: 1.5rem !important; + } + .mxn-lg-5 { + margin-right: -1.5rem !important; + margin-left: -1.5rem !important; + } +} +@media (min-width: 66.5rem) { + .m-lg-6 { + margin: 2rem !important; + } + .mt-lg-6 { + margin-top: 2rem !important; + } + .mr-lg-6 { + margin-right: 2rem !important; + } + .mb-lg-6 { + margin-bottom: 2rem !important; + } + .ml-lg-6 { + margin-left: 2rem !important; + } + .mx-lg-6 { + margin-right: 2rem !important; + margin-left: 2rem !important; + } + .my-lg-6 { + margin-top: 2rem !important; + margin-bottom: 2rem !important; + } + .mxn-lg-6 { + margin-right: -2rem !important; + margin-left: -2rem !important; + } +} +@media (min-width: 66.5rem) { + .m-lg-7 { + margin: 2.5rem !important; + } + .mt-lg-7 { + margin-top: 2.5rem !important; + } + .mr-lg-7 { + margin-right: 2.5rem !important; + } + .mb-lg-7 { + margin-bottom: 2.5rem !important; + } + .ml-lg-7 { + margin-left: 2.5rem !important; + } + .mx-lg-7 { + margin-right: 2.5rem !important; + margin-left: 2.5rem !important; + } + .my-lg-7 { + margin-top: 2.5rem !important; + margin-bottom: 2.5rem !important; + } + .mxn-lg-7 { + margin-right: -2.5rem !important; + margin-left: -2.5rem !important; + } +} +@media (min-width: 66.5rem) { + .m-lg-8 { + margin: 3rem !important; + } + .mt-lg-8 { + margin-top: 3rem !important; + } + .mr-lg-8 { + margin-right: 3rem !important; + } + .mb-lg-8 { + margin-bottom: 3rem !important; + } + .ml-lg-8 { + margin-left: 3rem !important; + } + .mx-lg-8 { + margin-right: 3rem !important; + margin-left: 3rem !important; + } + .my-lg-8 { + margin-top: 3rem !important; + margin-bottom: 3rem !important; + } + .mxn-lg-8 { + margin-right: -3rem !important; + margin-left: -3rem !important; + } +} +@media (min-width: 66.5rem) { + .m-lg-9 { + margin: 3.5rem !important; + } + .mt-lg-9 { + margin-top: 3.5rem !important; + } + .mr-lg-9 { + margin-right: 3.5rem !important; + } + .mb-lg-9 { + margin-bottom: 3.5rem !important; + } + .ml-lg-9 { + margin-left: 3.5rem !important; + } + .mx-lg-9 { + margin-right: 3.5rem !important; + margin-left: 3.5rem !important; + } + .my-lg-9 { + margin-top: 3.5rem !important; + margin-bottom: 3.5rem !important; + } + .mxn-lg-9 { + margin-right: -3.5rem !important; + margin-left: -3.5rem !important; + } +} +@media (min-width: 66.5rem) { + .m-lg-10 { + margin: 4rem !important; + } + .mt-lg-10 { + margin-top: 4rem !important; + } + .mr-lg-10 { + margin-right: 4rem !important; + } + .mb-lg-10 { + margin-bottom: 4rem !important; + } + .ml-lg-10 { + margin-left: 4rem !important; + } + .mx-lg-10 { + margin-right: 4rem !important; + margin-left: 4rem !important; + } + .my-lg-10 { + margin-top: 4rem !important; + margin-bottom: 4rem !important; + } + .mxn-lg-10 { + margin-right: -4rem !important; + margin-left: -4rem !important; + } +} +@media (min-width: 87.5rem) { + .m-xl-0 { + margin: 0 !important; + } + .mt-xl-0 { + margin-top: 0 !important; + } + .mr-xl-0 { + margin-right: 0 !important; + } + .mb-xl-0 { + margin-bottom: 0 !important; + } + .ml-xl-0 { + margin-left: 0 !important; + } + .mx-xl-0 { + margin-right: 0 !important; + margin-left: 0 !important; + } + .my-xl-0 { + margin-top: 0 !important; + margin-bottom: 0 !important; + } + .mxn-xl-0 { + margin-right: -0 !important; + margin-left: -0 !important; + } +} +@media (min-width: 87.5rem) { + .m-xl-1 { + margin: 0.25rem !important; + } + .mt-xl-1 { + margin-top: 0.25rem !important; + } + .mr-xl-1 { + margin-right: 0.25rem !important; + } + .mb-xl-1 { + margin-bottom: 0.25rem !important; + } + .ml-xl-1 { + margin-left: 0.25rem !important; + } + .mx-xl-1 { + margin-right: 0.25rem !important; + margin-left: 0.25rem !important; + } + .my-xl-1 { + margin-top: 0.25rem !important; + margin-bottom: 0.25rem !important; + } + .mxn-xl-1 { + margin-right: -0.25rem !important; + margin-left: -0.25rem !important; + } +} +@media (min-width: 87.5rem) { + .m-xl-2 { + margin: 0.5rem !important; + } + .mt-xl-2 { + margin-top: 0.5rem !important; + } + .mr-xl-2 { + margin-right: 0.5rem !important; + } + .mb-xl-2 { + margin-bottom: 0.5rem !important; + } + .ml-xl-2 { + margin-left: 0.5rem !important; + } + .mx-xl-2 { + margin-right: 0.5rem !important; + margin-left: 0.5rem !important; + } + .my-xl-2 { + margin-top: 0.5rem !important; + margin-bottom: 0.5rem !important; + } + .mxn-xl-2 { + margin-right: -0.5rem !important; + margin-left: -0.5rem !important; + } +} +@media (min-width: 87.5rem) { + .m-xl-3 { + margin: 0.75rem !important; + } + .mt-xl-3 { + margin-top: 0.75rem !important; + } + .mr-xl-3 { + margin-right: 0.75rem !important; + } + .mb-xl-3 { + margin-bottom: 0.75rem !important; + } + .ml-xl-3 { + margin-left: 0.75rem !important; + } + .mx-xl-3 { + margin-right: 0.75rem !important; + margin-left: 0.75rem !important; + } + .my-xl-3 { + margin-top: 0.75rem !important; + margin-bottom: 0.75rem !important; + } + .mxn-xl-3 { + margin-right: -0.75rem !important; + margin-left: -0.75rem !important; + } +} +@media (min-width: 87.5rem) { + .m-xl-4 { + margin: 1rem !important; + } + .mt-xl-4 { + margin-top: 1rem !important; + } + .mr-xl-4 { + margin-right: 1rem !important; + } + .mb-xl-4 { + margin-bottom: 1rem !important; + } + .ml-xl-4 { + margin-left: 1rem !important; + } + .mx-xl-4 { + margin-right: 1rem !important; + margin-left: 1rem !important; + } + .my-xl-4 { + margin-top: 1rem !important; + margin-bottom: 1rem !important; + } + .mxn-xl-4 { + margin-right: -1rem !important; + margin-left: -1rem !important; + } +} +@media (min-width: 87.5rem) { + .m-xl-5 { + margin: 1.5rem !important; + } + .mt-xl-5 { + margin-top: 1.5rem !important; + } + .mr-xl-5 { + margin-right: 1.5rem !important; + } + .mb-xl-5 { + margin-bottom: 1.5rem !important; + } + .ml-xl-5 { + margin-left: 1.5rem !important; + } + .mx-xl-5 { + margin-right: 1.5rem !important; + margin-left: 1.5rem !important; + } + .my-xl-5 { + margin-top: 1.5rem !important; + margin-bottom: 1.5rem !important; + } + .mxn-xl-5 { + margin-right: -1.5rem !important; + margin-left: -1.5rem !important; + } +} +@media (min-width: 87.5rem) { + .m-xl-6 { + margin: 2rem !important; + } + .mt-xl-6 { + margin-top: 2rem !important; + } + .mr-xl-6 { + margin-right: 2rem !important; + } + .mb-xl-6 { + margin-bottom: 2rem !important; + } + .ml-xl-6 { + margin-left: 2rem !important; + } + .mx-xl-6 { + margin-right: 2rem !important; + margin-left: 2rem !important; + } + .my-xl-6 { + margin-top: 2rem !important; + margin-bottom: 2rem !important; + } + .mxn-xl-6 { + margin-right: -2rem !important; + margin-left: -2rem !important; + } +} +@media (min-width: 87.5rem) { + .m-xl-7 { + margin: 2.5rem !important; + } + .mt-xl-7 { + margin-top: 2.5rem !important; + } + .mr-xl-7 { + margin-right: 2.5rem !important; + } + .mb-xl-7 { + margin-bottom: 2.5rem !important; + } + .ml-xl-7 { + margin-left: 2.5rem !important; + } + .mx-xl-7 { + margin-right: 2.5rem !important; + margin-left: 2.5rem !important; + } + .my-xl-7 { + margin-top: 2.5rem !important; + margin-bottom: 2.5rem !important; + } + .mxn-xl-7 { + margin-right: -2.5rem !important; + margin-left: -2.5rem !important; + } +} +@media (min-width: 87.5rem) { + .m-xl-8 { + margin: 3rem !important; + } + .mt-xl-8 { + margin-top: 3rem !important; + } + .mr-xl-8 { + margin-right: 3rem !important; + } + .mb-xl-8 { + margin-bottom: 3rem !important; + } + .ml-xl-8 { + margin-left: 3rem !important; + } + .mx-xl-8 { + margin-right: 3rem !important; + margin-left: 3rem !important; + } + .my-xl-8 { + margin-top: 3rem !important; + margin-bottom: 3rem !important; + } + .mxn-xl-8 { + margin-right: -3rem !important; + margin-left: -3rem !important; + } +} +@media (min-width: 87.5rem) { + .m-xl-9 { + margin: 3.5rem !important; + } + .mt-xl-9 { + margin-top: 3.5rem !important; + } + .mr-xl-9 { + margin-right: 3.5rem !important; + } + .mb-xl-9 { + margin-bottom: 3.5rem !important; + } + .ml-xl-9 { + margin-left: 3.5rem !important; + } + .mx-xl-9 { + margin-right: 3.5rem !important; + margin-left: 3.5rem !important; + } + .my-xl-9 { + margin-top: 3.5rem !important; + margin-bottom: 3.5rem !important; + } + .mxn-xl-9 { + margin-right: -3.5rem !important; + margin-left: -3.5rem !important; + } +} +@media (min-width: 87.5rem) { + .m-xl-10 { + margin: 4rem !important; + } + .mt-xl-10 { + margin-top: 4rem !important; + } + .mr-xl-10 { + margin-right: 4rem !important; + } + .mb-xl-10 { + margin-bottom: 4rem !important; + } + .ml-xl-10 { + margin-left: 4rem !important; + } + .mx-xl-10 { + margin-right: 4rem !important; + margin-left: 4rem !important; + } + .my-xl-10 { + margin-top: 4rem !important; + margin-bottom: 4rem !important; + } + .mxn-xl-10 { + margin-right: -4rem !important; + margin-left: -4rem !important; + } +} +.p-0 { + padding: 0 !important; +} + +.pt-0 { + padding-top: 0 !important; +} + +.pr-0 { + padding-right: 0 !important; +} + +.pb-0 { + padding-bottom: 0 !important; +} + +.pl-0 { + padding-left: 0 !important; +} + +.px-0 { + padding-right: 0 !important; + padding-left: 0 !important; +} + +.py-0 { + padding-top: 0 !important; + padding-bottom: 0 !important; +} + +.p-1 { + padding: 0.25rem !important; +} + +.pt-1 { + padding-top: 0.25rem !important; +} + +.pr-1 { + padding-right: 0.25rem !important; +} + +.pb-1 { + padding-bottom: 0.25rem !important; +} + +.pl-1 { + padding-left: 0.25rem !important; +} + +.px-1 { + padding-right: 0.25rem !important; + padding-left: 0.25rem !important; +} + +.py-1 { + padding-top: 0.25rem !important; + padding-bottom: 0.25rem !important; +} + +.p-2 { + padding: 0.5rem !important; +} + +.pt-2 { + padding-top: 0.5rem !important; +} + +.pr-2 { + padding-right: 0.5rem !important; +} + +.pb-2 { + padding-bottom: 0.5rem !important; +} + +.pl-2 { + padding-left: 0.5rem !important; +} + +.px-2 { + padding-right: 0.5rem !important; + padding-left: 0.5rem !important; +} + +.py-2 { + padding-top: 0.5rem !important; + padding-bottom: 0.5rem !important; +} + +.p-3 { + padding: 0.75rem !important; +} + +.pt-3 { + padding-top: 0.75rem !important; +} + +.pr-3 { + padding-right: 0.75rem !important; +} + +.pb-3 { + padding-bottom: 0.75rem !important; +} + +.pl-3 { + padding-left: 0.75rem !important; +} + +.px-3 { + padding-right: 0.75rem !important; + padding-left: 0.75rem !important; +} + +.py-3 { + padding-top: 0.75rem !important; + padding-bottom: 0.75rem !important; +} + +.p-4 { + padding: 1rem !important; +} + +.pt-4 { + padding-top: 1rem !important; +} + +.pr-4 { + padding-right: 1rem !important; +} + +.pb-4 { + padding-bottom: 1rem !important; +} + +.pl-4 { + padding-left: 1rem !important; +} + +.px-4 { + padding-right: 1rem !important; + padding-left: 1rem !important; +} + +.py-4 { + padding-top: 1rem !important; + padding-bottom: 1rem !important; +} + +.p-5 { + padding: 1.5rem !important; +} + +.pt-5 { + padding-top: 1.5rem !important; +} + +.pr-5 { + padding-right: 1.5rem !important; +} + +.pb-5 { + padding-bottom: 1.5rem !important; +} + +.pl-5 { + padding-left: 1.5rem !important; +} + +.px-5 { + padding-right: 1.5rem !important; + padding-left: 1.5rem !important; +} + +.py-5 { + padding-top: 1.5rem !important; + padding-bottom: 1.5rem !important; +} + +.p-6 { + padding: 2rem !important; +} + +.pt-6 { + padding-top: 2rem !important; +} + +.pr-6 { + padding-right: 2rem !important; +} + +.pb-6 { + padding-bottom: 2rem !important; +} + +.pl-6 { + padding-left: 2rem !important; +} + +.px-6 { + padding-right: 2rem !important; + padding-left: 2rem !important; +} + +.py-6 { + padding-top: 2rem !important; + padding-bottom: 2rem !important; +} + +.p-7 { + padding: 2.5rem !important; +} + +.pt-7 { + padding-top: 2.5rem !important; +} + +.pr-7 { + padding-right: 2.5rem !important; +} + +.pb-7 { + padding-bottom: 2.5rem !important; +} + +.pl-7 { + padding-left: 2.5rem !important; +} + +.px-7 { + padding-right: 2.5rem !important; + padding-left: 2.5rem !important; +} + +.py-7 { + padding-top: 2.5rem !important; + padding-bottom: 2.5rem !important; +} + +.p-8 { + padding: 3rem !important; +} + +.pt-8 { + padding-top: 3rem !important; +} + +.pr-8 { + padding-right: 3rem !important; +} + +.pb-8 { + padding-bottom: 3rem !important; +} + +.pl-8 { + padding-left: 3rem !important; +} + +.px-8 { + padding-right: 3rem !important; + padding-left: 3rem !important; +} + +.py-8 { + padding-top: 3rem !important; + padding-bottom: 3rem !important; +} + +.p-9 { + padding: 3.5rem !important; +} + +.pt-9 { + padding-top: 3.5rem !important; +} + +.pr-9 { + padding-right: 3.5rem !important; +} + +.pb-9 { + padding-bottom: 3.5rem !important; +} + +.pl-9 { + padding-left: 3.5rem !important; +} + +.px-9 { + padding-right: 3.5rem !important; + padding-left: 3.5rem !important; +} + +.py-9 { + padding-top: 3.5rem !important; + padding-bottom: 3.5rem !important; +} + +.p-10 { + padding: 4rem !important; +} + +.pt-10 { + padding-top: 4rem !important; +} + +.pr-10 { + padding-right: 4rem !important; +} + +.pb-10 { + padding-bottom: 4rem !important; +} + +.pl-10 { + padding-left: 4rem !important; +} + +.px-10 { + padding-right: 4rem !important; + padding-left: 4rem !important; +} + +.py-10 { + padding-top: 4rem !important; + padding-bottom: 4rem !important; +} + +@media (min-width: 20rem) { + .p-xs-0 { + padding: 0 !important; + } + .pt-xs-0 { + padding-top: 0 !important; + } + .pr-xs-0 { + padding-right: 0 !important; + } + .pb-xs-0 { + padding-bottom: 0 !important; + } + .pl-xs-0 { + padding-left: 0 !important; + } + .px-xs-0 { + padding-right: 0 !important; + padding-left: 0 !important; + } + .py-xs-0 { + padding-top: 0 !important; + padding-bottom: 0 !important; + } + .p-xs-1 { + padding: 0.25rem !important; + } + .pt-xs-1 { + padding-top: 0.25rem !important; + } + .pr-xs-1 { + padding-right: 0.25rem !important; + } + .pb-xs-1 { + padding-bottom: 0.25rem !important; + } + .pl-xs-1 { + padding-left: 0.25rem !important; + } + .px-xs-1 { + padding-right: 0.25rem !important; + padding-left: 0.25rem !important; + } + .py-xs-1 { + padding-top: 0.25rem !important; + padding-bottom: 0.25rem !important; + } + .p-xs-2 { + padding: 0.5rem !important; + } + .pt-xs-2 { + padding-top: 0.5rem !important; + } + .pr-xs-2 { + padding-right: 0.5rem !important; + } + .pb-xs-2 { + padding-bottom: 0.5rem !important; + } + .pl-xs-2 { + padding-left: 0.5rem !important; + } + .px-xs-2 { + padding-right: 0.5rem !important; + padding-left: 0.5rem !important; + } + .py-xs-2 { + padding-top: 0.5rem !important; + padding-bottom: 0.5rem !important; + } + .p-xs-3 { + padding: 0.75rem !important; + } + .pt-xs-3 { + padding-top: 0.75rem !important; + } + .pr-xs-3 { + padding-right: 0.75rem !important; + } + .pb-xs-3 { + padding-bottom: 0.75rem !important; + } + .pl-xs-3 { + padding-left: 0.75rem !important; + } + .px-xs-3 { + padding-right: 0.75rem !important; + padding-left: 0.75rem !important; + } + .py-xs-3 { + padding-top: 0.75rem !important; + padding-bottom: 0.75rem !important; + } + .p-xs-4 { + padding: 1rem !important; + } + .pt-xs-4 { + padding-top: 1rem !important; + } + .pr-xs-4 { + padding-right: 1rem !important; + } + .pb-xs-4 { + padding-bottom: 1rem !important; + } + .pl-xs-4 { + padding-left: 1rem !important; + } + .px-xs-4 { + padding-right: 1rem !important; + padding-left: 1rem !important; + } + .py-xs-4 { + padding-top: 1rem !important; + padding-bottom: 1rem !important; + } + .p-xs-5 { + padding: 1.5rem !important; + } + .pt-xs-5 { + padding-top: 1.5rem !important; + } + .pr-xs-5 { + padding-right: 1.5rem !important; + } + .pb-xs-5 { + padding-bottom: 1.5rem !important; + } + .pl-xs-5 { + padding-left: 1.5rem !important; + } + .px-xs-5 { + padding-right: 1.5rem !important; + padding-left: 1.5rem !important; + } + .py-xs-5 { + padding-top: 1.5rem !important; + padding-bottom: 1.5rem !important; + } + .p-xs-6 { + padding: 2rem !important; + } + .pt-xs-6 { + padding-top: 2rem !important; + } + .pr-xs-6 { + padding-right: 2rem !important; + } + .pb-xs-6 { + padding-bottom: 2rem !important; + } + .pl-xs-6 { + padding-left: 2rem !important; + } + .px-xs-6 { + padding-right: 2rem !important; + padding-left: 2rem !important; + } + .py-xs-6 { + padding-top: 2rem !important; + padding-bottom: 2rem !important; + } + .p-xs-7 { + padding: 2.5rem !important; + } + .pt-xs-7 { + padding-top: 2.5rem !important; + } + .pr-xs-7 { + padding-right: 2.5rem !important; + } + .pb-xs-7 { + padding-bottom: 2.5rem !important; + } + .pl-xs-7 { + padding-left: 2.5rem !important; + } + .px-xs-7 { + padding-right: 2.5rem !important; + padding-left: 2.5rem !important; + } + .py-xs-7 { + padding-top: 2.5rem !important; + padding-bottom: 2.5rem !important; + } + .p-xs-8 { + padding: 3rem !important; + } + .pt-xs-8 { + padding-top: 3rem !important; + } + .pr-xs-8 { + padding-right: 3rem !important; + } + .pb-xs-8 { + padding-bottom: 3rem !important; + } + .pl-xs-8 { + padding-left: 3rem !important; + } + .px-xs-8 { + padding-right: 3rem !important; + padding-left: 3rem !important; + } + .py-xs-8 { + padding-top: 3rem !important; + padding-bottom: 3rem !important; + } + .p-xs-9 { + padding: 3.5rem !important; + } + .pt-xs-9 { + padding-top: 3.5rem !important; + } + .pr-xs-9 { + padding-right: 3.5rem !important; + } + .pb-xs-9 { + padding-bottom: 3.5rem !important; + } + .pl-xs-9 { + padding-left: 3.5rem !important; + } + .px-xs-9 { + padding-right: 3.5rem !important; + padding-left: 3.5rem !important; + } + .py-xs-9 { + padding-top: 3.5rem !important; + padding-bottom: 3.5rem !important; + } + .p-xs-10 { + padding: 4rem !important; + } + .pt-xs-10 { + padding-top: 4rem !important; + } + .pr-xs-10 { + padding-right: 4rem !important; + } + .pb-xs-10 { + padding-bottom: 4rem !important; + } + .pl-xs-10 { + padding-left: 4rem !important; + } + .px-xs-10 { + padding-right: 4rem !important; + padding-left: 4rem !important; + } + .py-xs-10 { + padding-top: 4rem !important; + padding-bottom: 4rem !important; + } +} +@media (min-width: 31.25rem) { + .p-sm-0 { + padding: 0 !important; + } + .pt-sm-0 { + padding-top: 0 !important; + } + .pr-sm-0 { + padding-right: 0 !important; + } + .pb-sm-0 { + padding-bottom: 0 !important; + } + .pl-sm-0 { + padding-left: 0 !important; + } + .px-sm-0 { + padding-right: 0 !important; + padding-left: 0 !important; + } + .py-sm-0 { + padding-top: 0 !important; + padding-bottom: 0 !important; + } + .p-sm-1 { + padding: 0.25rem !important; + } + .pt-sm-1 { + padding-top: 0.25rem !important; + } + .pr-sm-1 { + padding-right: 0.25rem !important; + } + .pb-sm-1 { + padding-bottom: 0.25rem !important; + } + .pl-sm-1 { + padding-left: 0.25rem !important; + } + .px-sm-1 { + padding-right: 0.25rem !important; + padding-left: 0.25rem !important; + } + .py-sm-1 { + padding-top: 0.25rem !important; + padding-bottom: 0.25rem !important; + } + .p-sm-2 { + padding: 0.5rem !important; + } + .pt-sm-2 { + padding-top: 0.5rem !important; + } + .pr-sm-2 { + padding-right: 0.5rem !important; + } + .pb-sm-2 { + padding-bottom: 0.5rem !important; + } + .pl-sm-2 { + padding-left: 0.5rem !important; + } + .px-sm-2 { + padding-right: 0.5rem !important; + padding-left: 0.5rem !important; + } + .py-sm-2 { + padding-top: 0.5rem !important; + padding-bottom: 0.5rem !important; + } + .p-sm-3 { + padding: 0.75rem !important; + } + .pt-sm-3 { + padding-top: 0.75rem !important; + } + .pr-sm-3 { + padding-right: 0.75rem !important; + } + .pb-sm-3 { + padding-bottom: 0.75rem !important; + } + .pl-sm-3 { + padding-left: 0.75rem !important; + } + .px-sm-3 { + padding-right: 0.75rem !important; + padding-left: 0.75rem !important; + } + .py-sm-3 { + padding-top: 0.75rem !important; + padding-bottom: 0.75rem !important; + } + .p-sm-4 { + padding: 1rem !important; + } + .pt-sm-4 { + padding-top: 1rem !important; + } + .pr-sm-4 { + padding-right: 1rem !important; + } + .pb-sm-4 { + padding-bottom: 1rem !important; + } + .pl-sm-4 { + padding-left: 1rem !important; + } + .px-sm-4 { + padding-right: 1rem !important; + padding-left: 1rem !important; + } + .py-sm-4 { + padding-top: 1rem !important; + padding-bottom: 1rem !important; + } + .p-sm-5 { + padding: 1.5rem !important; + } + .pt-sm-5 { + padding-top: 1.5rem !important; + } + .pr-sm-5 { + padding-right: 1.5rem !important; + } + .pb-sm-5 { + padding-bottom: 1.5rem !important; + } + .pl-sm-5 { + padding-left: 1.5rem !important; + } + .px-sm-5 { + padding-right: 1.5rem !important; + padding-left: 1.5rem !important; + } + .py-sm-5 { + padding-top: 1.5rem !important; + padding-bottom: 1.5rem !important; + } + .p-sm-6 { + padding: 2rem !important; + } + .pt-sm-6 { + padding-top: 2rem !important; + } + .pr-sm-6 { + padding-right: 2rem !important; + } + .pb-sm-6 { + padding-bottom: 2rem !important; + } + .pl-sm-6 { + padding-left: 2rem !important; + } + .px-sm-6 { + padding-right: 2rem !important; + padding-left: 2rem !important; + } + .py-sm-6 { + padding-top: 2rem !important; + padding-bottom: 2rem !important; + } + .p-sm-7 { + padding: 2.5rem !important; + } + .pt-sm-7 { + padding-top: 2.5rem !important; + } + .pr-sm-7 { + padding-right: 2.5rem !important; + } + .pb-sm-7 { + padding-bottom: 2.5rem !important; + } + .pl-sm-7 { + padding-left: 2.5rem !important; + } + .px-sm-7 { + padding-right: 2.5rem !important; + padding-left: 2.5rem !important; + } + .py-sm-7 { + padding-top: 2.5rem !important; + padding-bottom: 2.5rem !important; + } + .p-sm-8 { + padding: 3rem !important; + } + .pt-sm-8 { + padding-top: 3rem !important; + } + .pr-sm-8 { + padding-right: 3rem !important; + } + .pb-sm-8 { + padding-bottom: 3rem !important; + } + .pl-sm-8 { + padding-left: 3rem !important; + } + .px-sm-8 { + padding-right: 3rem !important; + padding-left: 3rem !important; + } + .py-sm-8 { + padding-top: 3rem !important; + padding-bottom: 3rem !important; + } + .p-sm-9 { + padding: 3.5rem !important; + } + .pt-sm-9 { + padding-top: 3.5rem !important; + } + .pr-sm-9 { + padding-right: 3.5rem !important; + } + .pb-sm-9 { + padding-bottom: 3.5rem !important; + } + .pl-sm-9 { + padding-left: 3.5rem !important; + } + .px-sm-9 { + padding-right: 3.5rem !important; + padding-left: 3.5rem !important; + } + .py-sm-9 { + padding-top: 3.5rem !important; + padding-bottom: 3.5rem !important; + } + .p-sm-10 { + padding: 4rem !important; + } + .pt-sm-10 { + padding-top: 4rem !important; + } + .pr-sm-10 { + padding-right: 4rem !important; + } + .pb-sm-10 { + padding-bottom: 4rem !important; + } + .pl-sm-10 { + padding-left: 4rem !important; + } + .px-sm-10 { + padding-right: 4rem !important; + padding-left: 4rem !important; + } + .py-sm-10 { + padding-top: 4rem !important; + padding-bottom: 4rem !important; + } +} +@media (min-width: 50rem) { + .p-md-0 { + padding: 0 !important; + } + .pt-md-0 { + padding-top: 0 !important; + } + .pr-md-0 { + padding-right: 0 !important; + } + .pb-md-0 { + padding-bottom: 0 !important; + } + .pl-md-0 { + padding-left: 0 !important; + } + .px-md-0 { + padding-right: 0 !important; + padding-left: 0 !important; + } + .py-md-0 { + padding-top: 0 !important; + padding-bottom: 0 !important; + } + .p-md-1 { + padding: 0.25rem !important; + } + .pt-md-1 { + padding-top: 0.25rem !important; + } + .pr-md-1 { + padding-right: 0.25rem !important; + } + .pb-md-1 { + padding-bottom: 0.25rem !important; + } + .pl-md-1 { + padding-left: 0.25rem !important; + } + .px-md-1 { + padding-right: 0.25rem !important; + padding-left: 0.25rem !important; + } + .py-md-1 { + padding-top: 0.25rem !important; + padding-bottom: 0.25rem !important; + } + .p-md-2 { + padding: 0.5rem !important; + } + .pt-md-2 { + padding-top: 0.5rem !important; + } + .pr-md-2 { + padding-right: 0.5rem !important; + } + .pb-md-2 { + padding-bottom: 0.5rem !important; + } + .pl-md-2 { + padding-left: 0.5rem !important; + } + .px-md-2 { + padding-right: 0.5rem !important; + padding-left: 0.5rem !important; + } + .py-md-2 { + padding-top: 0.5rem !important; + padding-bottom: 0.5rem !important; + } + .p-md-3 { + padding: 0.75rem !important; + } + .pt-md-3 { + padding-top: 0.75rem !important; + } + .pr-md-3 { + padding-right: 0.75rem !important; + } + .pb-md-3 { + padding-bottom: 0.75rem !important; + } + .pl-md-3 { + padding-left: 0.75rem !important; + } + .px-md-3 { + padding-right: 0.75rem !important; + padding-left: 0.75rem !important; + } + .py-md-3 { + padding-top: 0.75rem !important; + padding-bottom: 0.75rem !important; + } + .p-md-4 { + padding: 1rem !important; + } + .pt-md-4 { + padding-top: 1rem !important; + } + .pr-md-4 { + padding-right: 1rem !important; + } + .pb-md-4 { + padding-bottom: 1rem !important; + } + .pl-md-4 { + padding-left: 1rem !important; + } + .px-md-4 { + padding-right: 1rem !important; + padding-left: 1rem !important; + } + .py-md-4 { + padding-top: 1rem !important; + padding-bottom: 1rem !important; + } + .p-md-5 { + padding: 1.5rem !important; + } + .pt-md-5 { + padding-top: 1.5rem !important; + } + .pr-md-5 { + padding-right: 1.5rem !important; + } + .pb-md-5 { + padding-bottom: 1.5rem !important; + } + .pl-md-5 { + padding-left: 1.5rem !important; + } + .px-md-5 { + padding-right: 1.5rem !important; + padding-left: 1.5rem !important; + } + .py-md-5 { + padding-top: 1.5rem !important; + padding-bottom: 1.5rem !important; + } + .p-md-6 { + padding: 2rem !important; + } + .pt-md-6 { + padding-top: 2rem !important; + } + .pr-md-6 { + padding-right: 2rem !important; + } + .pb-md-6 { + padding-bottom: 2rem !important; + } + .pl-md-6 { + padding-left: 2rem !important; + } + .px-md-6 { + padding-right: 2rem !important; + padding-left: 2rem !important; + } + .py-md-6 { + padding-top: 2rem !important; + padding-bottom: 2rem !important; + } + .p-md-7 { + padding: 2.5rem !important; + } + .pt-md-7 { + padding-top: 2.5rem !important; + } + .pr-md-7 { + padding-right: 2.5rem !important; + } + .pb-md-7 { + padding-bottom: 2.5rem !important; + } + .pl-md-7 { + padding-left: 2.5rem !important; + } + .px-md-7 { + padding-right: 2.5rem !important; + padding-left: 2.5rem !important; + } + .py-md-7 { + padding-top: 2.5rem !important; + padding-bottom: 2.5rem !important; + } + .p-md-8 { + padding: 3rem !important; + } + .pt-md-8 { + padding-top: 3rem !important; + } + .pr-md-8 { + padding-right: 3rem !important; + } + .pb-md-8 { + padding-bottom: 3rem !important; + } + .pl-md-8 { + padding-left: 3rem !important; + } + .px-md-8 { + padding-right: 3rem !important; + padding-left: 3rem !important; + } + .py-md-8 { + padding-top: 3rem !important; + padding-bottom: 3rem !important; + } + .p-md-9 { + padding: 3.5rem !important; + } + .pt-md-9 { + padding-top: 3.5rem !important; + } + .pr-md-9 { + padding-right: 3.5rem !important; + } + .pb-md-9 { + padding-bottom: 3.5rem !important; + } + .pl-md-9 { + padding-left: 3.5rem !important; + } + .px-md-9 { + padding-right: 3.5rem !important; + padding-left: 3.5rem !important; + } + .py-md-9 { + padding-top: 3.5rem !important; + padding-bottom: 3.5rem !important; + } + .p-md-10 { + padding: 4rem !important; + } + .pt-md-10 { + padding-top: 4rem !important; + } + .pr-md-10 { + padding-right: 4rem !important; + } + .pb-md-10 { + padding-bottom: 4rem !important; + } + .pl-md-10 { + padding-left: 4rem !important; + } + .px-md-10 { + padding-right: 4rem !important; + padding-left: 4rem !important; + } + .py-md-10 { + padding-top: 4rem !important; + padding-bottom: 4rem !important; + } +} +@media (min-width: 66.5rem) { + .p-lg-0 { + padding: 0 !important; + } + .pt-lg-0 { + padding-top: 0 !important; + } + .pr-lg-0 { + padding-right: 0 !important; + } + .pb-lg-0 { + padding-bottom: 0 !important; + } + .pl-lg-0 { + padding-left: 0 !important; + } + .px-lg-0 { + padding-right: 0 !important; + padding-left: 0 !important; + } + .py-lg-0 { + padding-top: 0 !important; + padding-bottom: 0 !important; + } + .p-lg-1 { + padding: 0.25rem !important; + } + .pt-lg-1 { + padding-top: 0.25rem !important; + } + .pr-lg-1 { + padding-right: 0.25rem !important; + } + .pb-lg-1 { + padding-bottom: 0.25rem !important; + } + .pl-lg-1 { + padding-left: 0.25rem !important; + } + .px-lg-1 { + padding-right: 0.25rem !important; + padding-left: 0.25rem !important; + } + .py-lg-1 { + padding-top: 0.25rem !important; + padding-bottom: 0.25rem !important; + } + .p-lg-2 { + padding: 0.5rem !important; + } + .pt-lg-2 { + padding-top: 0.5rem !important; + } + .pr-lg-2 { + padding-right: 0.5rem !important; + } + .pb-lg-2 { + padding-bottom: 0.5rem !important; + } + .pl-lg-2 { + padding-left: 0.5rem !important; + } + .px-lg-2 { + padding-right: 0.5rem !important; + padding-left: 0.5rem !important; + } + .py-lg-2 { + padding-top: 0.5rem !important; + padding-bottom: 0.5rem !important; + } + .p-lg-3 { + padding: 0.75rem !important; + } + .pt-lg-3 { + padding-top: 0.75rem !important; + } + .pr-lg-3 { + padding-right: 0.75rem !important; + } + .pb-lg-3 { + padding-bottom: 0.75rem !important; + } + .pl-lg-3 { + padding-left: 0.75rem !important; + } + .px-lg-3 { + padding-right: 0.75rem !important; + padding-left: 0.75rem !important; + } + .py-lg-3 { + padding-top: 0.75rem !important; + padding-bottom: 0.75rem !important; + } + .p-lg-4 { + padding: 1rem !important; + } + .pt-lg-4 { + padding-top: 1rem !important; + } + .pr-lg-4 { + padding-right: 1rem !important; + } + .pb-lg-4 { + padding-bottom: 1rem !important; + } + .pl-lg-4 { + padding-left: 1rem !important; + } + .px-lg-4 { + padding-right: 1rem !important; + padding-left: 1rem !important; + } + .py-lg-4 { + padding-top: 1rem !important; + padding-bottom: 1rem !important; + } + .p-lg-5 { + padding: 1.5rem !important; + } + .pt-lg-5 { + padding-top: 1.5rem !important; + } + .pr-lg-5 { + padding-right: 1.5rem !important; + } + .pb-lg-5 { + padding-bottom: 1.5rem !important; + } + .pl-lg-5 { + padding-left: 1.5rem !important; + } + .px-lg-5 { + padding-right: 1.5rem !important; + padding-left: 1.5rem !important; + } + .py-lg-5 { + padding-top: 1.5rem !important; + padding-bottom: 1.5rem !important; + } + .p-lg-6 { + padding: 2rem !important; + } + .pt-lg-6 { + padding-top: 2rem !important; + } + .pr-lg-6 { + padding-right: 2rem !important; + } + .pb-lg-6 { + padding-bottom: 2rem !important; + } + .pl-lg-6 { + padding-left: 2rem !important; + } + .px-lg-6 { + padding-right: 2rem !important; + padding-left: 2rem !important; + } + .py-lg-6 { + padding-top: 2rem !important; + padding-bottom: 2rem !important; + } + .p-lg-7 { + padding: 2.5rem !important; + } + .pt-lg-7 { + padding-top: 2.5rem !important; + } + .pr-lg-7 { + padding-right: 2.5rem !important; + } + .pb-lg-7 { + padding-bottom: 2.5rem !important; + } + .pl-lg-7 { + padding-left: 2.5rem !important; + } + .px-lg-7 { + padding-right: 2.5rem !important; + padding-left: 2.5rem !important; + } + .py-lg-7 { + padding-top: 2.5rem !important; + padding-bottom: 2.5rem !important; + } + .p-lg-8 { + padding: 3rem !important; + } + .pt-lg-8 { + padding-top: 3rem !important; + } + .pr-lg-8 { + padding-right: 3rem !important; + } + .pb-lg-8 { + padding-bottom: 3rem !important; + } + .pl-lg-8 { + padding-left: 3rem !important; + } + .px-lg-8 { + padding-right: 3rem !important; + padding-left: 3rem !important; + } + .py-lg-8 { + padding-top: 3rem !important; + padding-bottom: 3rem !important; + } + .p-lg-9 { + padding: 3.5rem !important; + } + .pt-lg-9 { + padding-top: 3.5rem !important; + } + .pr-lg-9 { + padding-right: 3.5rem !important; + } + .pb-lg-9 { + padding-bottom: 3.5rem !important; + } + .pl-lg-9 { + padding-left: 3.5rem !important; + } + .px-lg-9 { + padding-right: 3.5rem !important; + padding-left: 3.5rem !important; + } + .py-lg-9 { + padding-top: 3.5rem !important; + padding-bottom: 3.5rem !important; + } + .p-lg-10 { + padding: 4rem !important; + } + .pt-lg-10 { + padding-top: 4rem !important; + } + .pr-lg-10 { + padding-right: 4rem !important; + } + .pb-lg-10 { + padding-bottom: 4rem !important; + } + .pl-lg-10 { + padding-left: 4rem !important; + } + .px-lg-10 { + padding-right: 4rem !important; + padding-left: 4rem !important; + } + .py-lg-10 { + padding-top: 4rem !important; + padding-bottom: 4rem !important; + } +} +@media (min-width: 87.5rem) { + .p-xl-0 { + padding: 0 !important; + } + .pt-xl-0 { + padding-top: 0 !important; + } + .pr-xl-0 { + padding-right: 0 !important; + } + .pb-xl-0 { + padding-bottom: 0 !important; + } + .pl-xl-0 { + padding-left: 0 !important; + } + .px-xl-0 { + padding-right: 0 !important; + padding-left: 0 !important; + } + .py-xl-0 { + padding-top: 0 !important; + padding-bottom: 0 !important; + } + .p-xl-1 { + padding: 0.25rem !important; + } + .pt-xl-1 { + padding-top: 0.25rem !important; + } + .pr-xl-1 { + padding-right: 0.25rem !important; + } + .pb-xl-1 { + padding-bottom: 0.25rem !important; + } + .pl-xl-1 { + padding-left: 0.25rem !important; + } + .px-xl-1 { + padding-right: 0.25rem !important; + padding-left: 0.25rem !important; + } + .py-xl-1 { + padding-top: 0.25rem !important; + padding-bottom: 0.25rem !important; + } + .p-xl-2 { + padding: 0.5rem !important; + } + .pt-xl-2 { + padding-top: 0.5rem !important; + } + .pr-xl-2 { + padding-right: 0.5rem !important; + } + .pb-xl-2 { + padding-bottom: 0.5rem !important; + } + .pl-xl-2 { + padding-left: 0.5rem !important; + } + .px-xl-2 { + padding-right: 0.5rem !important; + padding-left: 0.5rem !important; + } + .py-xl-2 { + padding-top: 0.5rem !important; + padding-bottom: 0.5rem !important; + } + .p-xl-3 { + padding: 0.75rem !important; + } + .pt-xl-3 { + padding-top: 0.75rem !important; + } + .pr-xl-3 { + padding-right: 0.75rem !important; + } + .pb-xl-3 { + padding-bottom: 0.75rem !important; + } + .pl-xl-3 { + padding-left: 0.75rem !important; + } + .px-xl-3 { + padding-right: 0.75rem !important; + padding-left: 0.75rem !important; + } + .py-xl-3 { + padding-top: 0.75rem !important; + padding-bottom: 0.75rem !important; + } + .p-xl-4 { + padding: 1rem !important; + } + .pt-xl-4 { + padding-top: 1rem !important; + } + .pr-xl-4 { + padding-right: 1rem !important; + } + .pb-xl-4 { + padding-bottom: 1rem !important; + } + .pl-xl-4 { + padding-left: 1rem !important; + } + .px-xl-4 { + padding-right: 1rem !important; + padding-left: 1rem !important; + } + .py-xl-4 { + padding-top: 1rem !important; + padding-bottom: 1rem !important; + } + .p-xl-5 { + padding: 1.5rem !important; + } + .pt-xl-5 { + padding-top: 1.5rem !important; + } + .pr-xl-5 { + padding-right: 1.5rem !important; + } + .pb-xl-5 { + padding-bottom: 1.5rem !important; + } + .pl-xl-5 { + padding-left: 1.5rem !important; + } + .px-xl-5 { + padding-right: 1.5rem !important; + padding-left: 1.5rem !important; + } + .py-xl-5 { + padding-top: 1.5rem !important; + padding-bottom: 1.5rem !important; + } + .p-xl-6 { + padding: 2rem !important; + } + .pt-xl-6 { + padding-top: 2rem !important; + } + .pr-xl-6 { + padding-right: 2rem !important; + } + .pb-xl-6 { + padding-bottom: 2rem !important; + } + .pl-xl-6 { + padding-left: 2rem !important; + } + .px-xl-6 { + padding-right: 2rem !important; + padding-left: 2rem !important; + } + .py-xl-6 { + padding-top: 2rem !important; + padding-bottom: 2rem !important; + } + .p-xl-7 { + padding: 2.5rem !important; + } + .pt-xl-7 { + padding-top: 2.5rem !important; + } + .pr-xl-7 { + padding-right: 2.5rem !important; + } + .pb-xl-7 { + padding-bottom: 2.5rem !important; + } + .pl-xl-7 { + padding-left: 2.5rem !important; + } + .px-xl-7 { + padding-right: 2.5rem !important; + padding-left: 2.5rem !important; + } + .py-xl-7 { + padding-top: 2.5rem !important; + padding-bottom: 2.5rem !important; + } + .p-xl-8 { + padding: 3rem !important; + } + .pt-xl-8 { + padding-top: 3rem !important; + } + .pr-xl-8 { + padding-right: 3rem !important; + } + .pb-xl-8 { + padding-bottom: 3rem !important; + } + .pl-xl-8 { + padding-left: 3rem !important; + } + .px-xl-8 { + padding-right: 3rem !important; + padding-left: 3rem !important; + } + .py-xl-8 { + padding-top: 3rem !important; + padding-bottom: 3rem !important; + } + .p-xl-9 { + padding: 3.5rem !important; + } + .pt-xl-9 { + padding-top: 3.5rem !important; + } + .pr-xl-9 { + padding-right: 3.5rem !important; + } + .pb-xl-9 { + padding-bottom: 3.5rem !important; + } + .pl-xl-9 { + padding-left: 3.5rem !important; + } + .px-xl-9 { + padding-right: 3.5rem !important; + padding-left: 3.5rem !important; + } + .py-xl-9 { + padding-top: 3.5rem !important; + padding-bottom: 3.5rem !important; + } + .p-xl-10 { + padding: 4rem !important; + } + .pt-xl-10 { + padding-top: 4rem !important; + } + .pr-xl-10 { + padding-right: 4rem !important; + } + .pb-xl-10 { + padding-bottom: 4rem !important; + } + .pl-xl-10 { + padding-left: 4rem !important; + } + .px-xl-10 { + padding-right: 4rem !important; + padding-left: 4rem !important; + } + .py-xl-10 { + padding-top: 4rem !important; + padding-bottom: 4rem !important; + } +} +@media print { + .site-footer, + .site-button, + #edit-this-page, + #back-to-top, + .site-nav, + .main-header { + display: none !important; + } + .side-bar { + width: 100%; + height: auto; + border-right: 0 !important; + } + .site-header { + border-bottom: 1px solid #eeebee; + } + .site-title { + font-size: 1rem !important; + font-weight: 700 !important; + } + .text-small { + font-size: 8pt !important; + } + pre.highlight { + border: 1px solid #eeebee; + } + .main { + max-width: none; + margin-left: 0; + } +} +a.skip-to-main { + left: -999px; + position: absolute; + top: auto; + width: 1px; + height: 1px; + overflow: hidden; + z-index: -999; +} + +a.skip-to-main:focus, +a.skip-to-main:active { + color: #7253ed; + background-color: #fff; + left: auto; + top: auto; + width: 30%; + height: auto; + overflow: auto; + margin: 10px 35%; + padding: 5px; + border-radius: 15px; + border: 4px solid #5e41d0; + text-align: center; + font-size: 1.2em; + z-index: 999; +} + +div.opaque { + background-color: #fff; +} + +/*# sourceMappingURL=just-the-docs-light.css.map */ \ No newline at end of file diff --git a/docs/_site/assets/css/just-the-docs-light.css.map b/docs/_site/assets/css/just-the-docs-light.css.map new file mode 100644 index 00000000..a989a9f1 --- /dev/null +++ b/docs/_site/assets/css/just-the-docs-light.css.map @@ -0,0 +1 @@ +{"version":3,"sourceRoot":"","sources":["../../../../../../../../../C:/Users/peteb/.local/share/gem/ruby/3.2.0/gems/just-the-docs-0.7.0/_sass/vendor/OneLightJekyll/syntax.scss","../../../../../../../../../C:/Users/peteb/.local/share/gem/ruby/3.2.0/gems/just-the-docs-0.7.0/_sass/vendor/normalize.scss/normalize.scss","../../../../../../../../../C:/Users/peteb/.local/share/gem/ruby/3.2.0/gems/just-the-docs-0.7.0/_sass/base.scss","../../../../../../../../../C:/Users/peteb/.local/share/gem/ruby/3.2.0/gems/just-the-docs-0.7.0/_sass/color_schemes/light.scss","../../../../../../../../../C:/Users/peteb/.local/share/gem/ruby/3.2.0/gems/just-the-docs-0.7.0/_sass/support/mixins/_typography.scss","../../../../../../../../../C:/Users/peteb/.local/share/gem/ruby/3.2.0/gems/just-the-docs-0.7.0/_sass/support/mixins/_layout.scss","../../../../../../../../../C:/Users/peteb/.local/share/gem/ruby/3.2.0/gems/just-the-docs-0.7.0/_sass/support/_variables.scss","../../../../../../../../../C:/Users/peteb/.local/share/gem/ruby/3.2.0/gems/just-the-docs-0.7.0/_sass/layout.scss","../../../../../../../../../C:/Users/peteb/.local/share/gem/ruby/3.2.0/gems/just-the-docs-0.7.0/_sass/content.scss","../../../../../../../../../C:/Users/peteb/.local/share/gem/ruby/3.2.0/gems/just-the-docs-0.7.0/_sass/navigation.scss","../../../../../../../../../C:/Users/peteb/.local/share/gem/ruby/3.2.0/gems/just-the-docs-0.7.0/_sass/typography.scss","../../../../../../../../../C:/Users/peteb/.local/share/gem/ruby/3.2.0/gems/just-the-docs-0.7.0/_sass/labels.scss","../../../../../../../../../C:/Users/peteb/.local/share/gem/ruby/3.2.0/gems/just-the-docs-0.7.0/_sass/buttons.scss","../../../../../../../../../C:/Users/peteb/.local/share/gem/ruby/3.2.0/gems/just-the-docs-0.7.0/_sass/support/mixins/_buttons.scss","../../../../../../../../../C:/Users/peteb/.local/share/gem/ruby/3.2.0/gems/just-the-docs-0.7.0/_sass/search.scss","../../../../../../../../../C:/Users/peteb/.local/share/gem/ruby/3.2.0/gems/just-the-docs-0.7.0/_sass/tables.scss","../../../../../../../../../C:/Users/peteb/.local/share/gem/ruby/3.2.0/gems/just-the-docs-0.7.0/_sass/code.scss","../../../../../../../../../C:/Users/peteb/.local/share/gem/ruby/3.2.0/gems/just-the-docs-0.7.0/_sass/utilities/_colors.scss","../../../../../../../../../C:/Users/peteb/.local/share/gem/ruby/3.2.0/gems/just-the-docs-0.7.0/_sass/utilities/_layout.scss","../../../../../../../../../C:/Users/peteb/.local/share/gem/ruby/3.2.0/gems/just-the-docs-0.7.0/_sass/utilities/_typography.scss","../../../../../../../../../C:/Users/peteb/.local/share/gem/ruby/3.2.0/gems/just-the-docs-0.7.0/_sass/utilities/_lists.scss","../../../../../../../../../C:/Users/peteb/.local/share/gem/ruby/3.2.0/gems/just-the-docs-0.7.0/_sass/utilities/_spacing.scss","../../../../../../../../../C:/Users/peteb/.local/share/gem/ruby/3.2.0/gems/just-the-docs-0.7.0/_sass/print.scss","../../../../../../../../../C:/Users/peteb/.local/share/gem/ruby/3.2.0/gems/just-the-docs-0.7.0/_sass/skiptomain.scss","just-the-docs-light.scss"],"names":[],"mappings":";AAEA;AAAA;EAEE;EACA;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;EACA;;;AAEF;EACE;EACA;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;EACA;;;AAEF;EACE;EACA;;;AAEF;EACE;EACA;;;AAEF;EACE;EACA;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AC9MF;AAEA;AAAA;AAGA;AAAA;AAAA;AAAA;AAKA;EACE;EACA;;;AAGF;AAAA;AAGA;AAAA;AAAA;AAIA;EACE;;;AAGF;AAAA;AAAA;AAIA;EACE;;;AAGF;AAAA;AAAA;AAAA;AAKA;EACE;EACA;;;AAGF;AAAA;AAGA;AAAA;AAAA;AAAA;AAKA;EACE;EACA;EACA;;;AAGF;AAAA;AAAA;AAAA;AAKA;EACE;EACA;;;AAGF;AAAA;AAGA;AAAA;AAAA;AAIA;EACE;;;AAGF;AAAA;AAAA;AAAA;AAKA;EACE;EACA;EACA;;;AAGF;AAAA;AAAA;AAIA;AAAA;EAEE;;;AAGF;AAAA;AAAA;AAAA;AAKA;AAAA;AAAA;EAGE;EACA;;;AAGF;AAAA;AAAA;AAIA;EACE;;;AAGF;AAAA;AAAA;AAAA;AAKA;AAAA;EAEE;EACA;EACA;EACA;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;AAAA;AAGA;AAAA;AAAA;AAIA;EACE;;;AAGF;AAAA;AAGA;AAAA;AAAA;AAAA;AAKA;AAAA;AAAA;AAAA;AAAA;EAKE;EACA;EACA;EACA;;;AAGF;AAAA;AAAA;AAAA;AAKA;AAAA;AAEE;EACA;;;AAGF;AAAA;AAAA;AAAA;AAKA;AAAA;AAEE;EACA;;;AAGF;AAAA;AAAA;AAIA;AAAA;AAAA;AAAA;EAIE;;;AAGF;AAAA;AAAA;AAIA;AAAA;AAAA;AAAA;EAIE;EACA;;;AAGF;AAAA;AAAA;AAIA;AAAA;AAAA;AAAA;EAIE;;;AAGF;AAAA;AAAA;AAIA;EACE;;;AAGF;AAAA;AAAA;AAAA;AAAA;AAAA;AAOA;EACE;EACA;EACA;EACA;EACA;EACA;;;AAGF;AAAA;AAAA;AAIA;EACE;;;AAGF;AAAA;AAAA;AAIA;EACE;;;AAGF;AAAA;AAAA;AAAA;AAKA;AAAA;EAEE;EACA;;;AAGF;AAAA;AAAA;AAIA;AAAA;EAEE;;;AAGF;AAAA;AAAA;AAAA;AAKA;EACE;EACA;;;AAGF;AAAA;AAAA;AAIA;EACE;;;AAGF;AAAA;AAAA;AAAA;AAKA;EACE;EACA;;;AAGF;AAAA;AAGA;AAAA;AAAA;AAIA;EACE;;;AAGF;AAAA;AAAA;AAIA;EACE;;;AAGF;AAAA;AAGA;AAAA;AAAA;AAIA;EACE;;;AAGF;AAAA;AAAA;AAIA;EACE;;;AC1VF;EACE,cCJa;;;ADOf;EACE;;;AAGF;EEcE;EFXA;;AGAE;EHHJ;IEiBI;;;;AFXJ;EACE,aIfiB;EJgBjB;EACA,aIbiB;EJcjB,OIUY;EJTZ,kBIOM;EJNN;;;AAGF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAYE;;;AAGF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAOE;EACA;EACA;EACA,aI1CyB;EJ2CzB,OIlBY;;;AJqBd;EACE;EACA;;;AAGF;EACE,OItBW;EJuBX;;;AAGF;EACE;EACA,uBI/BY;EJgCZ;;AAEA;EACE;;;AAIJ;EACE,aIvEiB;EJwEjB;EACA,aIvEiB;;;AJ0EnB;AAAA;EAEE;;;AAGF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;EACA;EACA,kBI/DY;EJgEZ;;;AAIF;EACE;EAGA;EACA;EACA;EACA;;;AK7GF;EACE;EACA;EACA;EACA,kBD6BY;;ADrBV;EEZJ;IAOI;IACA;IACA,ODwFW;ICvFX;IACA;IACA;;;AFAA;EEZJ;IAgBI;IACA,WD+EQ;;;;ADpFR;EESJ;IAEI;IACA,WD6EY;IC5EZ,aDwEW;;;ADrFX;EESJ;IAUI;;;;AAQJ;EFhBE,eCuDK;EDtDL,cCsDK;ECpCL,aDoCK;ECnCL,gBDmCK;;ADlEH;EE2BJ;IFZI,eCqDG;IDpDH,cCoDG;;;ADpEH;EE2BJ;IAOI,aDkCG;ICjCH,gBDiCG;;;;AC7BP;EACE;EACA;EACA,kBDrBY;;ADrBV;EEuCJ;IAMI;IACA;IACA,QD2CY;IC1CZ,kBDjCI;ICkCJ;;;AAGF;EACE;;AFrDA;EEoDF;IAII;;;;AAKN;AAAA;AAAA;EAGE;;AFhEE;EE6DJ;AAAA;AAAA;IAMI,ODiBQ;;;;ACbZ;EACE;;AAEA;EACE;;AF3EA;EEuEJ;IAQI;IACA,aDVG;ICWH,gBDfG;ICgBH;IACA;;;;AAIJ;EACE;EACA,YDCc;ECAd;;AF1FE;EEuFJ;IAMI,QDHY;ICIZ,YDJY;ICKZ;;;;AAIJ;EFxFE,eCuDK;EDtDL,cCsDK;ECoCL;EACA;EACA;EACA;EACA,aDzCK;EC0CL,gBD1CK;EC2CL,ODxFY;EFOZ;;AC3BE;EEmGJ;IFpFI,eCqDG;IDpDH,cCoDG;;;ADpEH;EEmGJ;IHrEI;IACA,aEpCuB;;;ADKvB;EEmGJ;IAaI,aDhDG;ICiDH,gBDjDG;;;;ACgEP;EACE;EACA;EACA,SDjEK;ECkEL;;;AFpIE;EEwIF;IACE;;;AAIJ;EACE;;;AAQF;EACE;;;AASF;EACE;EACA,gBD1FM;EC2FN;;AFnKE;EEgKJ;IAMI;IACA;;;;AAMJ;EFlKE,eCuDK;EDtDL,cCsDK;EC8GL;EACA;EACA;EACA,aDjHK;ECkHL,gBDlHK;ECmHL,ODrKY;EFrBZ;;ACKE;EE6KJ;IF9JI,eCqDG;IDpDH,cCoDG;;;ADpEH;EE6KJ;IH/KI;;;ACEA;EE6KJ;IAYI;IACA;;;;AAIJ;EACE,OD5HK;EC6HL,QD7HK;EC8HL,ODxKW;;;AElCb;EACE,aFEoB;;AEApB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAOE;;AAGF;EACE;EACA;;AAGF;AAAA;EAEE;;AAIA;EACE,YF+CC;;AE3CL;EACE;EACA;;AAEA;EACE;;AAEA;EACE;EACA;EACA;EACA,OFfM;EEgBN;EACA;EJ9BN;;ACHE;EG2BE;IJrBF;;;ACNA;EG2BE;IAUI;;;AAIJ;EACE;;AAGE;EACE;EACA;;AAOV;EACE;;AAGE;EACE;EACA;EACA,OF7CM;EE8CN;;AAMJ;EACE;;AAIJ;EACE;EACA;;AAKF;EACE;;AAGF;EACE;;AAGF;EACE;EACA;;AAGF;AAAA;EAEE;;AAGF;EACE;EACA;EACA;;AAEA;EACE;;AAIJ;EACE;EACA;EACA;;AAmBE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EACE;;AASF;AAAA;AAAA;AAAA;AAAA;AAAA;EAEE;;AAKN;EACE;EACA;EACA,OFnFG;EEoFH;EACA,eFzFG;EE0FH,cF1FG;EE2FH;;AH1JA;EGmJF;IAUI;IACA;;;AAGF;EACE;EACA;EACA;EACA,OF5IO;EE6IP;;AAYF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EACE;;AAIJ;EACE;;AAGF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAOE;EACA;EACA;;AAEA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAKE;;AAGF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EACE;;AAIJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAWE,YF9JG;;;AG3EP;EACE;EACA;EACA;EACA;;AAEA;ELgBA;EKbE;EACA;;AJCA;EILF;ILmBE;;;ACdA;EILF;ILQA;;;ACHE;EILF;ILWE;;;AKDA;EACE;EACA,YH+DC;EG9DD,aHuDC;EGtDD,gBHsDC;EGrDD;EAEE,eH0DD;EGzDC,cHqDD;;ADlEH;EIKA;IAeI,YHgDD;IG/CC;IAEE,eH6CH;IG5CG,cH4CH;;;AGrCD;EACE,OHkCD;EGjCC,QHiCD;EGhCC;;AAGF;EACE;EACA;;AAGF;EAEE;;AASJ;EACE;EAEE;EAGF,OHWC;EGVD,QHUC;EGTD;EACA,OHrCO;;ADzBT;EIqDA;IAYI,OHGD;IGFC,QHED;IGDC;;;AAGF;EACE;;AAQA;EACE;;AAKN;EACE;EACA,cHtBC;EGuBD;;AAEA;EACE;;AAEA;EACE,OH7EI;;AGgFN;EACE,OHjFI;;AGuFR;EAEI;;AAMJ;EACE;;;AAMR;EACE;EACA;EACA;EACA;EACA;ELjIA;;ACKE;EIuHJ;ILzHI;;;ACEA;EIuHJ;IASI;IACA,YH/DG;IGgEH;;EAEA;IACE;;;;AAMJ;EACE;;AAEA;EACE;;AAGE;EACE,OH1HG;;AG6HL;EACE,OH9HG;;;AGuIb;EACE;EACA;ELvKA;;ACKE;EIgKJ;ILlKI;;;AKuKF;EACE;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;;AJjLA;EIgKJ;IAqBI,eHnHG;;;;ADlEH;EI2LJ;IAEI;;;;AAIJ;EACE;EACA,eHlIK;EGmIL;;;AAGF;EACE;EL7MA;;ACKE;EIuMJ;ILzMI;;;AK6MF;EACE;;AAGF;EACE;EACA,cHjJG;EGkJH,aHlJG;EGmJH,OHnMU;EGoMV;;AAIA;EACE;;;ACpON;AAAA;ENwDE;EACA,aEnDyB;EIFzB;;ALOE;EKXJ;AAAA;IN4DI;;;;AMrDJ;AAAA;AAAA;EN+BE;;AC3BE;EKJJ;AAAA;AAAA;INkCI;IACA,aEpCuB;;;;AIO3B;AAAA;ENiBE;;ACnBE;EKEJ;AAAA;INoBI;;;;AMfJ;AAAA;ENZE;EMgBA;EACA;EACA;;ALbE;EKOJ;AAAA;INTI;;;;AMkBJ;EACE;;;AAGF;AAAA;ENjBE;;ACHE;EKoBJ;AAAA;INdI;;;;AMmBJ;AAAA;EN9BE;;ACKE;EKyBJ;AAAA;IN3BI;;;;AMgCJ;ENnCE;;ACKE;EK8BJ;INhCI;;;;AMoCJ;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;ACvDF;AAAA;EAEE;EACA;EACA,cLoEK;EKnEL,aLmEK;EKlEL,OLiBM;EKhBN;EACA;EACA,kBL6BS;EFnCT;EOSA;;ANJE;EMRJ;AAAA;IPMI;;;;AOSJ;EACE,kBL2BU;;;AKxBZ;EACE,kBLcW;;;AKXb;EACE,kBL2BQ;;;AKxBV;EACE,OLFY;EKGZ,kBLkBW;;;AMlDb;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,ON2BW;EM1BX;EACA;EACA;EACA,kBTTkB;ESUlB;EACA,eNyEc;EMxEd,YACE;EAEF;;AAEA;EACE;EACA;EACA;;AAGF;EAEE;;AAGF;EAEE;;AAGF;EAIE;EACA;;AAGF;EAGE;EACA;EACA;;AAGF;EACE;;AAKA;EAEE;EACA;EACA;EACA;EACA;;;AAKN;EACE,ONnCW;EMoCX;EACA;;AAEA;EAIE;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA,YACE;;AAIJ;EAEE;;;AAIJ;ECnGE,OP0BM;EOzBN;EACA;EACA,YACE;;AAGF;EAEE,OPiBI;EOhBJ;EACA;;AAGF;EAGE;EACA;EACA;;AAGF;EACE;;;ADgFJ;ECvGE,OP0BM;EOzBN;EACA;EACA,YACE;;AAGF;EAEE,OPiBI;EOhBJ;EACA;;AAGF;EAGE;EACA;EACA;;AAGF;EACE;;;ADoFJ;EC3GE,OP0BM;EOzBN;EACA;EACA,YACE;;AAGF;EAEE,OPiBI;EOhBJ;EACA;;AAGF;EAGE;EACA;EACA;;AAGF;EACE;;;ADwFJ;EC/GE,OP0BM;EOzBN;EACA;EACA,YACE;;AAGF;EAEE,OPiBI;EOhBJ;EACA;;AAGF;EAGE;EACA;EACA;;AAGF;EACE;;;AD4FJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;;AE3HF;EACE;EACA;EACA;EACA,QRgFM;EQ/EN,SRuEK;EQtEL;;ATME;ESZJ;IASI;IACA;IACA;IACA;IACA;;;;AAIJ;EACE;EACA;EACA,QR8DK;EQ7DL;EACA,eRmEc;EQlEd,YACE;EAEF;;ATdE;ESKJ;IAYI;IACA;IACA,WRwEmB;IQvEnB;IACA;IACA;IACA;;;;AAIJ;EACE;EACA;EACA;EACA;EACA;EACA,ORhBY;EQiBZ,kBRnBM;EQoBN;EACA;EACA;EACA;EACA;;ATvCE;ES2BJ;IAeI;IACA;IACA,kBR7BI;IQ8BJ;;;AAGF;EACE;;AAEA;EACE,OR3BO;;;AQgCb;EACE;EACA;EACA;EACA,cRKK;;ADlEH;ESyDJ;IAOI,cRIG;IQHH;;;AAGF;EACE;EACA;EACA;EACA,ORxDU;;;AQ4Dd;EACE;EACA;EACA;EACA;EACA;EACA;EACA,kBRpEM;EQqEN,4BRPc;EQQd,2BRRc;EQSd,YACE;;ATvFA;ES4EJ;IAeI;IACA,ORDmB;IQEnB;;;;AAIJ;EACE;EACA,eRpCK;EQqCL;EVzFA;;ACXE;ESiGJ;IVnFI;;;ACdA;ESiGJ;IV9FE;;;ACHE;ESiGJ;IV3FI;;;;AUsGJ;EACE;EACA;;;AAGF;EACE;EACA;;AAEA;EAEE,kBX3Ha;;;AW+HjB;EACE;EACA,aR7DK;EQ8DL,gBR9DK;;ADhEH;ES2HJ;IAMI;IACA;IACA,eRnEG;IQoEH;;;;AAIJ;EACE;EACA;EACA;;AAEA;EACE;EV3IF;;ACHE;ES6IF;IVvIE;;;ACNA;ES6IF;IVlJA;;;ACKE;ES6IF;IV/IE;;;AUwJF;EACE,ORrFG;EQsFH,QRtFG;EQuFH,cRzFG;EQ0FH,ORjIS;EQkIT;;AAGF;EACE;;;AAIJ;EACE;EACA;;;AAGF;EACE;EACA;EACA;EACA,OR5JY;EQ6JZ;EACA;EV3LA;;ACaE;ESwKJ;IVlLI;;;;AU4LJ;EACE;EACA,aRpHK;EQqHL,gBRrHK;EQsHL,cRpHK;EQqHL,aRvHK;EQwHL,ORxKY;EQyKZ;EACA,aR9GO;EQ+GP,mBRrKY;EF3BZ;;ACKE;ESkLJ;IVpLI;;;ACEA;ESkLJ;IAaI;IACA;IACA,cRjIG;IQkIH;IACA;;;;AAIJ;EACE,YRzIK;;;AQ4IP;EACE;;;AAGF;EACE;EV7MA;;ACHE;ES+MJ;IVzMI;;;;AU8MJ;EACE;EACA,ORpJK;EQqJL,QRrJK;EQsJL;EACA,ORlJK;EQmJL,QRnJK;EQoJL,kBR5MM;EQ6MN;EACA;EACA,YACE;EAEF;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,YACE;;;AAMF;EACE;EACA;EACA;EACA;EACA;EACA;;AAGF;EACE,QRvLI;EQwLJ;;AThQA;ES8PF;IAKI,ORxKiB;IQyKjB,YACE;;;AAKN;EACE,kBR5PI;;ADfJ;ES0QF;IAII;;;AT9QF;ESkRF;IAEI;;;AAIJ;EACE;;AAGF;EACE;EACA;EACA;EACA,YACE;;ATjSF;ESuSA;IACE;IACA;IACA;;;AAIJ;EACE,aRvOI;;ADxEJ;ES8SF;IAII;;;;AC7TN;EACE;EACA;EACA;EACA,eT0EK;ESzEL;EACA,eTkFc;ESjFd,YACE;;;AAIJ;EACE;EACA;EACA;;;AAGF;AAAA;EXJE;EWQA;EACA;EACA,kBTEM;ESDN;EACA;;AVfE;EUOJ;AAAA;IXDI;;;AWWF;AAAA;EACE;;;AAOE;AAAA;EAEE;;AAGF;EACE,gBTkCD;;;AS3BL;EACE;;;AC9CF;EACE;EACA;EACA,kBVyBU;EUxBV;EACA,eV+EY;;;AU1EhB;EACE,cVkBY;;;AUiCd;AAAA;AAAA;EAGE;EACA,eVMK;EULL,kBVvCY;EUwCZ,eVgBc;EUfd;EACA;EACA;EACA;;AAIA;AAAA;AAAA;EACE,OVLG;EUMH;EACA;EACA;EACA;EACA;EACA,kBVvDU;EUwDV,OV5DU;EU6DV;;AAEA;AAAA;AAAA;EACE,MVhEQ;;AUmEV;AAAA;AAAA;EACE;EACA;EACA;;AAGF;AAAA;AAAA;EACE;;AAMF;AAAA;AAAA;EACE;EACA;;;AASJ;EACE;EACA,SV7CG;EU8CH;EACA;;AAGF;AAAA;EAEE;EACA;EACA;;;AAUJ;EAGE;EACA,eVpEK;;AU2CL;EACE;EACA,SV7CG;EU8CH;EACA;;AAGF;AAAA;EAEE;EACA;EACA;;;AAwBF;AAAA;EAEE;EACA,SVjFG;EUkFH;EACA;;;AAQJ;EACE;EACA;EACA;EACA;;AAEA;AAAA;EZvKA;EY2KE;EACA;EACA,kBVnJU;EUoJV;;AXzKA;EWkKF;AAAA;IZpKE;;;AY8KF;EACE;EACA,eV7GG;EU8GH,cV9GG;;AUiHL;EACE;EACA;;;AAKJ;AAAA;EAEE,SV1HK;EU2HL,eV3HK;EU4HL;EACA;EACA,eVlHc;;AUoHd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAIE;EACA;EACA;EACA;EACA;EACA;EACA;;;AAKJ;EACE;EACA;EACA;;;AAIF;AAAA;EAEE,YVpMY;EUyMV,OV7MU;;;AUkNd;EACE,YV/MY;;;AW/Bd;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAKF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;ACvOF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AbPE;EaiBE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab9BJ;EaiBE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab9BJ;EaiBE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab9BJ;EaiBE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab9BJ;EaiBE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab9BJ;EaiBE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab9BJ;EaiBE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab9BJ;EaiBE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab9BJ;EaiBE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab9BJ;EaiBE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab9BJ;EaiBE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab9BJ;EaiBE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab9BJ;EaiBE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab9BJ;EaiBE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab9BJ;EaiBE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab9BJ;EaiBE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab9BJ;EaiBE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab9BJ;EaiBE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab9BJ;EaiBE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab9BJ;EaiBE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab9BJ;EaiBE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab9BJ;EaiBE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab9BJ;EaiBE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab9BJ;EaiBE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab9BJ;EaiBE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab9BJ;EaiBE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab9BJ;EaiBE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab9BJ;EaiBE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab9BJ;EaiBE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab9BJ;EaiBE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab9BJ;EaiBE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab9BJ;EaiBE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab9BJ;EaiBE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab9BJ;EaiBE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab9BJ;EaiBE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab9BJ;EaiBE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab9BJ;EaiBE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab9BJ;EaiBE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab9BJ;EaiBE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab9BJ;EaiBE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab9BJ;EaiBE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab9BJ;EaiBE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab9BJ;EaiBE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab9BJ;EaiBE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab9BJ;EaiBE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab9BJ;EaiBE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab9BJ;EaiBE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab9BJ;EaiBE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab9BJ;EaiBE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab9BJ;EaiBE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab9BJ;EaiBE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab9BJ;EaiBE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab9BJ;EaiBE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab9BJ;EaiBE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab9BJ;EaiBE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;AAQR;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAKF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;ACjGF;EfDE;;ACaE;EcZJ;IfEI;;;;AeEJ;EfGE;;ACKE;EcRJ;IfMI;;;;AeFJ;EfOE;;ACHE;EcJJ;IfUI;;;;AeNJ;EfWE;;ACXE;EcAJ;IfcI;;;;AeVJ;EfeE;;ACnBE;EcIJ;IfkBI;;;;AedJ;EfmBE;;AC3BE;EcQJ;IfsBI;IACA,aEpCuB;;;;AaiB3B;EfwBE;EACA,aE1CyB;;ADKvB;EcYJ;If4BI;;;;AexBJ;Ef6BE;EACA,aEnDyB;;ADKvB;EcgBJ;IfiCI;;;;Ae7BJ;EfkCE;EACA,aE5DyB;;ADKvB;EcoBJ;IfsCI;;;;AelCJ;EfuCE;EACA,aErEyB;;ADKvB;EcwBJ;If2CI;;;;AevCJ;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE,abxDiB;;;Aa2DnB;EACE,ab1DyB;;;Aa6D3B;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AC/EF;EACE;EACA;EACA;;AAGE;EACE;;;ACLN;EACE;EACA;;;AAQA;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AhBlCA;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AAaN;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AhB7GA;EgBwHE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhB/IJ;EgBwHE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhB/IJ;EgBwHE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhB/IJ;EgBwHE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhB/IJ;EgBwHE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AC3JR;EACE;AAAA;AAAA;AAAA;AAAA;AAAA;IAME;;EAGF;IACE;IACA;IACA;;EAGF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;;EAGF;IACE;;EAGF;IACE;IACA;;;AClCJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;AAAA;EAEE,OjBwBW;EiBvBX,kBjBaM;EiBZN;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;ACtBF;EACE,kBlBsBM","sourcesContent":["// Generated with OneLightJekyll applied to Atom's One Light theme\n\n.highlight,\npre.highlight {\n background: #f9f9f9;\n color: #383942;\n}\n.highlight pre {\n background: #f9f9f9;\n}\n.highlight .hll {\n background: #f9f9f9;\n}\n.highlight .c {\n color: #9fa0a6;\n font-style: italic;\n}\n.highlight .err {\n color: #fff;\n background-color: #e05151;\n}\n.highlight .k {\n color: #a625a4;\n}\n.highlight .l {\n color: #50a04f;\n}\n.highlight .n {\n color: #383942;\n}\n.highlight .o {\n color: #383942;\n}\n.highlight .p {\n color: #383942;\n}\n.highlight .cm {\n color: #9fa0a6;\n font-style: italic;\n}\n.highlight .cp {\n color: #9fa0a6;\n font-style: italic;\n}\n.highlight .c1 {\n color: #9fa0a6;\n font-style: italic;\n}\n.highlight .cs {\n color: #9fa0a6;\n font-style: italic;\n}\n.highlight .ge {\n font-style: italic;\n}\n.highlight .gs {\n font-weight: 700;\n}\n.highlight .kc {\n color: #a625a4;\n}\n.highlight .kd {\n color: #a625a4;\n}\n.highlight .kn {\n color: #a625a4;\n}\n.highlight .kp {\n color: #a625a4;\n}\n.highlight .kr {\n color: #a625a4;\n}\n.highlight .kt {\n color: #a625a4;\n}\n.highlight .ld {\n color: #50a04f;\n}\n.highlight .m {\n color: #b66a00;\n}\n.highlight .s {\n color: #50a04f;\n}\n.highlight .na {\n color: #b66a00;\n}\n.highlight .nb {\n color: #ca7601;\n}\n.highlight .nc {\n color: #ca7601;\n}\n.highlight .no {\n color: #ca7601;\n}\n.highlight .nd {\n color: #ca7601;\n}\n.highlight .ni {\n color: #ca7601;\n}\n.highlight .ne {\n color: #ca7601;\n}\n.highlight .nf {\n color: #383942;\n}\n.highlight .nl {\n color: #ca7601;\n}\n.highlight .nn {\n color: #383942;\n}\n.highlight .nx {\n color: #383942;\n}\n.highlight .py {\n color: #ca7601;\n}\n.highlight .nt {\n color: #e35549;\n}\n.highlight .nv {\n color: #ca7601;\n}\n.highlight .ow {\n font-weight: 700;\n}\n.highlight .w {\n color: #f8f8f2;\n}\n.highlight .mf {\n color: #b66a00;\n}\n.highlight .mh {\n color: #b66a00;\n}\n.highlight .mi {\n color: #b66a00;\n}\n.highlight .mo {\n color: #b66a00;\n}\n.highlight .sb {\n color: #50a04f;\n}\n.highlight .sc {\n color: #50a04f;\n}\n.highlight .sd {\n color: #50a04f;\n}\n.highlight .s2 {\n color: #50a04f;\n}\n.highlight .se {\n color: #50a04f;\n}\n.highlight .sh {\n color: #50a04f;\n}\n.highlight .si {\n color: #50a04f;\n}\n.highlight .sx {\n color: #50a04f;\n}\n.highlight .sr {\n color: #0083bb;\n}\n.highlight .s1 {\n color: #50a04f;\n}\n.highlight .ss {\n color: #0083bb;\n}\n.highlight .bp {\n color: #ca7601;\n}\n.highlight .vc {\n color: #ca7601;\n}\n.highlight .vg {\n color: #ca7601;\n}\n.highlight .vi {\n color: #e35549;\n}\n.highlight .il {\n color: #b66a00;\n}\n.highlight .gu {\n color: #75715e;\n}\n.highlight .gd {\n color: #e05151;\n}\n.highlight .gi {\n color: #43d089;\n}\n.highlight .language-json .w + .s2 {\n color: #e35549;\n}\n.highlight .language-json .kc {\n color: #0083bb;\n}\n","/*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */\n\n/* Document\n ========================================================================== */\n\n/**\n * 1. Correct the line height in all browsers.\n * 2. Prevent adjustments of font size after orientation changes in iOS.\n */\n\nhtml {\n line-height: 1.15; /* 1 */\n -webkit-text-size-adjust: 100%; /* 2 */\n}\n\n/* Sections\n ========================================================================== */\n\n/**\n * Remove the margin in all browsers.\n */\n\nbody {\n margin: 0;\n}\n\n/**\n * Render the `main` element consistently in IE.\n */\n\nmain {\n display: block;\n}\n\n/**\n * Correct the font size and margin on `h1` elements within `section` and\n * `article` contexts in Chrome, Firefox, and Safari.\n */\n\nh1 {\n font-size: 2em;\n margin: 0.67em 0;\n}\n\n/* Grouping content\n ========================================================================== */\n\n/**\n * 1. Add the correct box sizing in Firefox.\n * 2. Show the overflow in Edge and IE.\n */\n\nhr {\n box-sizing: content-box; /* 1 */\n height: 0; /* 1 */\n overflow: visible; /* 2 */\n}\n\n/**\n * 1. Correct the inheritance and scaling of font size in all browsers.\n * 2. Correct the odd `em` font sizing in all browsers.\n */\n\npre {\n font-family: monospace, monospace; /* 1 */\n font-size: 1em; /* 2 */\n}\n\n/* Text-level semantics\n ========================================================================== */\n\n/**\n * Remove the gray background on active links in IE 10.\n */\n\na {\n background-color: transparent;\n}\n\n/**\n * 1. Remove the bottom border in Chrome 57-\n * 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari.\n */\n\nabbr[title] {\n border-bottom: none; /* 1 */\n text-decoration: underline; /* 2 */\n text-decoration: underline dotted; /* 2 */\n}\n\n/**\n * Add the correct font weight in Chrome, Edge, and Safari.\n */\n\nb,\nstrong {\n font-weight: bolder;\n}\n\n/**\n * 1. Correct the inheritance and scaling of font size in all browsers.\n * 2. Correct the odd `em` font sizing in all browsers.\n */\n\ncode,\nkbd,\nsamp {\n font-family: monospace, monospace; /* 1 */\n font-size: 1em; /* 2 */\n}\n\n/**\n * Add the correct font size in all browsers.\n */\n\nsmall {\n font-size: 80%;\n}\n\n/**\n * Prevent `sub` and `sup` elements from affecting the line height in\n * all browsers.\n */\n\nsub,\nsup {\n font-size: 75%;\n line-height: 0;\n position: relative;\n vertical-align: baseline;\n}\n\nsub {\n bottom: -0.25em;\n}\n\nsup {\n top: -0.5em;\n}\n\n/* Embedded content\n ========================================================================== */\n\n/**\n * Remove the border on images inside links in IE 10.\n */\n\nimg {\n border-style: none;\n}\n\n/* Forms\n ========================================================================== */\n\n/**\n * 1. Change the font styles in all browsers.\n * 2. Remove the margin in Firefox and Safari.\n */\n\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n font-family: inherit; /* 1 */\n font-size: 100%; /* 1 */\n line-height: 1.15; /* 1 */\n margin: 0; /* 2 */\n}\n\n/**\n * Show the overflow in IE.\n * 1. Show the overflow in Edge.\n */\n\nbutton,\ninput {\n /* 1 */\n overflow: visible;\n}\n\n/**\n * Remove the inheritance of text transform in Edge, Firefox, and IE.\n * 1. Remove the inheritance of text transform in Firefox.\n */\n\nbutton,\nselect {\n /* 1 */\n text-transform: none;\n}\n\n/**\n * Correct the inability to style clickable types in iOS and Safari.\n */\n\nbutton,\n[type=\"button\"],\n[type=\"reset\"],\n[type=\"submit\"] {\n -webkit-appearance: button;\n}\n\n/**\n * Remove the inner border and padding in Firefox.\n */\n\nbutton::-moz-focus-inner,\n[type=\"button\"]::-moz-focus-inner,\n[type=\"reset\"]::-moz-focus-inner,\n[type=\"submit\"]::-moz-focus-inner {\n border-style: none;\n padding: 0;\n}\n\n/**\n * Restore the focus styles unset by the previous rule.\n */\n\nbutton:-moz-focusring,\n[type=\"button\"]:-moz-focusring,\n[type=\"reset\"]:-moz-focusring,\n[type=\"submit\"]:-moz-focusring {\n outline: 1px dotted ButtonText;\n}\n\n/**\n * Correct the padding in Firefox.\n */\n\nfieldset {\n padding: 0.35em 0.75em 0.625em;\n}\n\n/**\n * 1. Correct the text wrapping in Edge and IE.\n * 2. Correct the color inheritance from `fieldset` elements in IE.\n * 3. Remove the padding so developers are not caught out when they zero out\n * `fieldset` elements in all browsers.\n */\n\nlegend {\n box-sizing: border-box; /* 1 */\n color: inherit; /* 2 */\n display: table; /* 1 */\n max-width: 100%; /* 1 */\n padding: 0; /* 3 */\n white-space: normal; /* 1 */\n}\n\n/**\n * Add the correct vertical alignment in Chrome, Firefox, and Opera.\n */\n\nprogress {\n vertical-align: baseline;\n}\n\n/**\n * Remove the default vertical scrollbar in IE 10+.\n */\n\ntextarea {\n overflow: auto;\n}\n\n/**\n * 1. Add the correct box sizing in IE 10.\n * 2. Remove the padding in IE 10.\n */\n\n[type=\"checkbox\"],\n[type=\"radio\"] {\n box-sizing: border-box; /* 1 */\n padding: 0; /* 2 */\n}\n\n/**\n * Correct the cursor style of increment and decrement buttons in Chrome.\n */\n\n[type=\"number\"]::-webkit-inner-spin-button,\n[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\n\n/**\n * 1. Correct the odd appearance in Chrome and Safari.\n * 2. Correct the outline style in Safari.\n */\n\n[type=\"search\"] {\n -webkit-appearance: textfield; /* 1 */\n outline-offset: -2px; /* 2 */\n}\n\n/**\n * Remove the inner padding in Chrome and Safari on macOS.\n */\n\n[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n/**\n * 1. Correct the inability to style clickable types in iOS and Safari.\n * 2. Change font properties to `inherit` in Safari.\n */\n\n::-webkit-file-upload-button {\n -webkit-appearance: button; /* 1 */\n font: inherit; /* 2 */\n}\n\n/* Interactive\n ========================================================================== */\n\n/*\n * Add the correct display in Edge, IE 10+, and Firefox.\n */\n\ndetails {\n display: block;\n}\n\n/*\n * Add the correct display in all browsers.\n */\n\nsummary {\n display: list-item;\n}\n\n/* Misc\n ========================================================================== */\n\n/**\n * Add the correct display in IE 10+.\n */\n\ntemplate {\n display: none;\n}\n\n/**\n * Add the correct display in IE 10.\n */\n\n[hidden] {\n display: none;\n}\n","// Base element style overrides\n// stylelint-disable selector-no-type, selector-max-type, selector-max-specificity, selector-max-id\n\n:root {\n color-scheme: $color-scheme;\n}\n\n* {\n box-sizing: border-box;\n}\n\nhtml {\n @include fs-4;\n\n scroll-behavior: smooth;\n}\n\nbody {\n font-family: $body-font-family;\n font-size: inherit;\n line-height: $body-line-height;\n color: $body-text-color;\n background-color: $body-background-color;\n overflow-wrap: break-word;\n}\n\nol,\nul,\ndl,\npre,\naddress,\nblockquote,\ntable,\ndiv,\nhr,\nform,\nfieldset,\nnoscript .table-wrapper {\n margin-top: 0;\n}\n\nh1,\nh2,\nh3,\nh4,\nh5,\nh6,\n#toctitle {\n margin-top: 0;\n margin-bottom: 1em;\n font-weight: 500;\n line-height: $body-heading-line-height;\n color: $body-heading-color;\n}\n\np {\n margin-top: 1em;\n margin-bottom: 1em;\n}\n\na {\n color: $link-color;\n text-decoration: none;\n}\n\na:not([class]) {\n text-decoration: underline;\n text-decoration-color: $border-color;\n text-underline-offset: 2px;\n\n &:hover {\n text-decoration-color: rgba($link-color, 0.45);\n }\n}\n\ncode {\n font-family: $mono-font-family;\n font-size: 0.75em;\n line-height: $body-line-height;\n}\n\nfigure,\npre {\n margin: 0;\n}\n\nli {\n margin: 0.25em 0;\n}\n\nimg {\n max-width: 100%;\n height: auto;\n}\n\nhr {\n height: 1px;\n padding: 0;\n margin: $sp-6 0;\n background-color: $border-color;\n border: 0;\n}\n\n// adds a GitHub-style sidebar to blockquotes\nblockquote {\n margin: 10px 0;\n\n // resets user-agent stylesheets for blockquotes\n margin-block-start: 0;\n margin-inline-start: 0;\n padding-left: 1rem;\n border-left: 3px solid $border-color;\n}\n","$color-scheme: light !default;\n$body-background-color: $white !default;\n$body-heading-color: $grey-dk-300 !default;\n$body-text-color: $grey-dk-100 !default;\n$link-color: $purple-000 !default;\n$nav-child-link-color: $grey-dk-100 !default;\n$sidebar-color: $grey-lt-000 !default;\n$base-button-color: #f7f7f7 !default;\n$btn-primary-color: $purple-100 !default;\n$code-background-color: $grey-lt-000 !default;\n$feedback-color: darken($sidebar-color, 3%) !default;\n$table-background-color: $white !default;\n$search-background-color: $white !default;\n$search-result-preview-color: $grey-dk-000 !default;\n\n@import \"./vendor/OneLightJekyll/syntax\";\n","@mixin fs-1 {\n font-size: $font-size-1 !important;\n\n @include mq(sm) {\n font-size: $font-size-1-sm !important;\n }\n}\n\n@mixin fs-2 {\n font-size: $font-size-2 !important;\n\n @include mq(sm) {\n font-size: $font-size-3 !important;\n }\n}\n\n@mixin fs-3 {\n font-size: $font-size-3 !important;\n\n @include mq(sm) {\n font-size: $font-size-4 !important;\n }\n}\n\n@mixin fs-4 {\n font-size: $font-size-4 !important;\n\n @include mq(sm) {\n font-size: $font-size-5 !important;\n }\n}\n\n@mixin fs-5 {\n font-size: $font-size-5 !important;\n\n @include mq(sm) {\n font-size: $font-size-6 !important;\n }\n}\n\n@mixin fs-6 {\n font-size: $font-size-6 !important;\n\n @include mq(sm) {\n font-size: $font-size-7 !important;\n line-height: $body-heading-line-height;\n }\n}\n\n@mixin fs-7 {\n font-size: $font-size-7 !important;\n line-height: $body-heading-line-height;\n\n @include mq(sm) {\n font-size: $font-size-8 !important;\n }\n}\n\n@mixin fs-8 {\n font-size: $font-size-8 !important;\n line-height: $body-heading-line-height;\n\n @include mq(sm) {\n font-size: $font-size-9 !important;\n }\n}\n\n@mixin fs-9 {\n font-size: $font-size-9 !important;\n line-height: $body-heading-line-height;\n\n @include mq(sm) {\n font-size: $font-size-10 !important;\n }\n}\n\n@mixin fs-10 {\n font-size: $font-size-10 !important;\n line-height: $body-heading-line-height;\n\n @include mq(sm) {\n font-size: $font-size-10-sm !important;\n }\n}\n","// Media query\n\n// Media query mixin\n// Usage:\n// @include mq(md) {\n// ..medium and up styles\n// }\n@mixin mq($name) {\n // Retrieves the value from the key\n $value: map-get($media-queries, $name);\n\n // If the key exists in the map\n @if $value {\n // Prints a media query based on the value\n @media (min-width: $value) {\n @content;\n }\n } @else {\n @warn \"No value could be retrieved from `#{$media-query}`. Please make sure it is defined in `$media-queries` map.\";\n }\n}\n\n// Responsive container\n\n@mixin container {\n padding-right: $gutter-spacing-sm;\n padding-left: $gutter-spacing-sm;\n\n @include mq(md) {\n padding-right: $gutter-spacing;\n padding-left: $gutter-spacing;\n }\n}\n","// Typography\n\n// prettier-ignore\n$body-font-family: system-ui, -apple-system, blinkmacsystemfont, \"Segoe UI\",\n roboto, \"Helvetica Neue\", arial, sans-serif, \"Segoe UI Emoji\" !default;\n$mono-font-family: \"SFMono-Regular\", menlo, consolas, monospace !default;\n$root-font-size: 16px !default; // DEPRECATED: previously base font-size for rems\n$body-line-height: 1.4 !default;\n$content-line-height: 1.6 !default;\n$body-heading-line-height: 1.25 !default;\n\n// Font size\n// `-sm` suffix is the size at the small (and above) media query\n\n$font-size-1: 0.5625rem !default;\n$font-size-1-sm: 0.625rem !default;\n$font-size-2: 0.6875rem !default; // h4 - uppercased!, h6 not uppercased, text-small\n$font-size-3: 0.75rem !default; // h5\n$font-size-4: 0.875rem !default;\n$font-size-5: 1rem !default; // h3\n$font-size-6: 1.125rem !default; // h2\n$font-size-7: 1.5rem !default;\n$font-size-8: 2rem !default; // h1\n$font-size-9: 2.25rem !default;\n$font-size-10: 2.625rem !default;\n$font-size-10-sm: 3rem !default;\n\n// Colors\n\n$white: #fff !default;\n$grey-dk-000: #959396 !default;\n$grey-dk-100: #5c5962 !default;\n$grey-dk-200: #44434d !default;\n$grey-dk-250: #302d36 !default;\n$grey-dk-300: #27262b !default;\n$grey-lt-000: #f5f6fa !default;\n$grey-lt-100: #eeebee !default;\n$grey-lt-200: #ecebed !default;\n$grey-lt-300: #e6e1e8 !default;\n$purple-000: #7253ed !default;\n$purple-100: #5e41d0 !default;\n$purple-200: #4e26af !default;\n$purple-300: #381885 !default;\n$blue-000: #2c84fa !default;\n$blue-100: #2869e6 !default;\n$blue-200: #264caf !default;\n$blue-300: #183385 !default;\n$green-000: #41d693 !default;\n$green-100: #11b584 !default;\n$green-200: #009c7b !default;\n$green-300: #026e57 !default;\n$yellow-000: #ffeb82 !default;\n$yellow-100: #fadf50 !default;\n$yellow-200: #f7d12e !default;\n$yellow-300: #e7af06 !default;\n$red-000: #f77e7e !default;\n$red-100: #f96e65 !default;\n$red-200: #e94c4c !default;\n$red-300: #dd2e2e !default;\n\n// Spacing\n\n$spacing-unit: 1rem; // 1rem == 16px\n\n$spacers: (\n sp-0: 0,\n sp-1: $spacing-unit * 0.25,\n sp-2: $spacing-unit * 0.5,\n sp-3: $spacing-unit * 0.75,\n sp-4: $spacing-unit,\n sp-5: $spacing-unit * 1.5,\n sp-6: $spacing-unit * 2,\n sp-7: $spacing-unit * 2.5,\n sp-8: $spacing-unit * 3,\n sp-9: $spacing-unit * 3.5,\n sp-10: $spacing-unit * 4,\n) !default;\n$sp-1: map-get($spacers, sp-1) !default; // 0.25 rem == 4px\n$sp-2: map-get($spacers, sp-2) !default; // 0.5 rem == 8px\n$sp-3: map-get($spacers, sp-3) !default; // 0.75 rem == 12px\n$sp-4: map-get($spacers, sp-4) !default; // 1 rem == 16px\n$sp-5: map-get($spacers, sp-5) !default; // 1.5 rem == 24px\n$sp-6: map-get($spacers, sp-6) !default; // 2 rem == 32px\n$sp-7: map-get($spacers, sp-7) !default; // 2.5 rem == 40px\n$sp-8: map-get($spacers, sp-8) !default; // 3 rem == 48px\n$sp-9: map-get($spacers, sp-9) !default; // 3.5 rem == 56px\n$sp-10: map-get($spacers, sp-10) !default; // 4 rem == 64px\n\n// Borders\n\n$border: 1px solid !default;\n$border-radius: 4px !default;\n$border-color: $grey-lt-100 !default;\n\n// Grid system\n\n$gutter-spacing: $sp-6 !default;\n$gutter-spacing-sm: $sp-4 !default;\n$nav-width: 16.5rem !default;\n$nav-width-md: 15.5rem !default;\n$nav-list-item-height: $sp-6 !default;\n$nav-list-item-height-sm: $sp-8 !default;\n$nav-list-expander-right: true;\n$content-width: 50rem !default;\n$header-height: 3.75rem !default;\n$search-results-width: $content-width - $nav-width !default;\n$transition-duration: 400ms;\n\n// Media queries in pixels\n\n$media-queries: (\n xs: 20rem,\n sm: 31.25rem,\n md: $content-width,\n lg: $content-width + $nav-width,\n xl: 87.5rem,\n) !default;\n","// The basic two column layout\n\n.side-bar {\n z-index: 0;\n display: flex;\n flex-wrap: wrap;\n background-color: $sidebar-color;\n\n @include mq(md) {\n flex-flow: column nowrap;\n position: fixed;\n width: $nav-width-md;\n height: 100%;\n border-right: $border $border-color;\n align-items: flex-end;\n }\n\n @include mq(lg) {\n width: calc((100% - #{$nav-width + $content-width}) / 2 + #{$nav-width});\n min-width: $nav-width;\n }\n}\n\n.main {\n @include mq(md) {\n position: relative;\n max-width: $content-width;\n margin-left: $nav-width-md;\n }\n\n @include mq(lg) {\n // stylelint-disable function-name-case\n // disable for Max(), we want to use the CSS max() function\n margin-left: Max(\n #{$nav-width},\n calc((100% - #{$nav-width + $content-width}) / 2 + #{$nav-width})\n );\n // stylelint-enable function-name-case\n }\n}\n\n.main-content-wrap {\n @include container;\n\n padding-top: $gutter-spacing-sm;\n padding-bottom: $gutter-spacing-sm;\n\n @include mq(md) {\n padding-top: $gutter-spacing;\n padding-bottom: $gutter-spacing;\n }\n}\n\n.main-header {\n z-index: 0;\n display: none;\n background-color: $sidebar-color;\n\n @include mq(md) {\n display: flex;\n justify-content: space-between;\n height: $header-height;\n background-color: $body-background-color;\n border-bottom: $border $border-color;\n }\n\n &.nav-open {\n display: block;\n\n @include mq(md) {\n display: flex;\n }\n }\n}\n\n.site-nav,\n.site-header,\n.site-footer {\n width: 100%;\n\n @include mq(lg) {\n width: $nav-width;\n }\n}\n\n.site-nav {\n display: none;\n\n &.nav-open {\n display: block;\n }\n\n @include mq(md) {\n display: block;\n padding-top: $sp-8;\n padding-bottom: $gutter-spacing-sm;\n overflow-y: auto;\n flex: 1 1 auto;\n }\n}\n\n.site-header {\n display: flex;\n min-height: $header-height;\n align-items: center;\n\n @include mq(md) {\n height: $header-height;\n max-height: $header-height;\n border-bottom: $border $border-color;\n }\n}\n\n.site-title {\n @include container;\n\n flex-grow: 1;\n display: flex;\n height: 100%;\n align-items: center;\n padding-top: $sp-3;\n padding-bottom: $sp-3;\n color: $body-heading-color;\n @include fs-6;\n\n @include mq(md) {\n padding-top: $sp-2;\n padding-bottom: $sp-2;\n }\n}\n\n@if variable-exists(logo) {\n .site-logo {\n width: 100%;\n height: 100%;\n background-image: url($logo);\n background-repeat: no-repeat;\n background-position: left center;\n background-size: contain;\n }\n}\n\n.site-button {\n display: flex;\n height: 100%;\n padding: $gutter-spacing-sm;\n align-items: center;\n}\n\n@include mq(md) {\n .site-header .site-button {\n display: none;\n }\n}\n\n.site-title:hover {\n background-image: linear-gradient(\n -90deg,\n rgba($feedback-color, 1) 0%,\n rgba($feedback-color, 0.8) 80%,\n rgba($feedback-color, 0) 100%\n );\n}\n\n.site-button:hover {\n background-image: linear-gradient(\n -90deg,\n rgba($feedback-color, 1) 0%,\n rgba($feedback-color, 0.8) 100%\n );\n}\n\n// stylelint-disable selector-max-type\n\nbody {\n position: relative;\n padding-bottom: $sp-10;\n overflow-y: scroll;\n\n @include mq(md) {\n position: static;\n padding-bottom: 0;\n }\n}\n\n// stylelint-enable selector-max-type\n\n.site-footer {\n @include container;\n\n position: absolute;\n bottom: 0;\n left: 0;\n padding-top: $sp-4;\n padding-bottom: $sp-4;\n color: $grey-dk-000;\n @include fs-2;\n\n @include mq(md) {\n position: static;\n justify-self: end;\n }\n}\n\n.icon {\n width: $sp-5;\n height: $sp-5;\n color: $link-color;\n}\n","@charset \"UTF-8\";\n\n// Styles for rendered markdown in the .main-content container\n// stylelint-disable selector-no-type, max-nesting-depth, selector-max-compound-selectors, selector-max-type, selector-max-specificity, selector-max-id\n\n.main-content {\n line-height: $content-line-height;\n\n ol,\n ul,\n dl,\n pre,\n address,\n blockquote,\n .table-wrapper {\n margin-top: 0.5em;\n }\n\n a {\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n ul,\n ol {\n padding-left: 1.5em;\n }\n\n li {\n .highlight {\n margin-top: $sp-1;\n }\n }\n\n ol {\n list-style-type: none;\n counter-reset: step-counter;\n\n > li {\n position: relative;\n\n &::before {\n position: absolute;\n top: 0.2em;\n left: -1.6em;\n color: $grey-dk-000;\n content: counter(step-counter);\n counter-increment: step-counter;\n @include fs-3;\n\n @include mq(sm) {\n top: 0.11em;\n }\n }\n\n ol {\n counter-reset: sub-counter;\n\n > li {\n &::before {\n content: counter(sub-counter, lower-alpha);\n counter-increment: sub-counter;\n }\n }\n }\n }\n }\n\n ul {\n list-style: none;\n\n > li {\n &::before {\n position: absolute;\n margin-left: -1.4em;\n color: $grey-dk-000;\n content: \"•\";\n }\n }\n }\n\n .task-list-item {\n &::before {\n content: \"\";\n }\n }\n\n .task-list-item-checkbox {\n margin-right: 0.6em;\n margin-left: -1.4em;\n\n // The same margin-left is used above for ul > li::before\n }\n\n hr + * {\n margin-top: 0;\n }\n\n h1:first-of-type {\n margin-top: 0.5em;\n }\n\n dl {\n display: grid;\n grid-template: auto / 10em 1fr;\n }\n\n dt,\n dd {\n margin: 0.25em 0;\n }\n\n dt {\n grid-column: 1;\n font-weight: 500;\n text-align: right;\n\n &::after {\n content: \":\";\n }\n }\n\n dd {\n grid-column: 2;\n margin-bottom: 0;\n margin-left: 1em;\n\n blockquote,\n div,\n dl,\n dt,\n h1,\n h2,\n h3,\n h4,\n h5,\n h6,\n li,\n ol,\n p,\n pre,\n table,\n ul,\n .table-wrapper {\n &:first-child {\n margin-top: 0;\n }\n }\n }\n\n dd,\n ol,\n ul {\n dl:first-child {\n dt:first-child,\n dd:nth-child(2) {\n margin-top: 0;\n }\n }\n }\n\n .anchor-heading {\n position: absolute;\n right: -$sp-4;\n width: $sp-5;\n height: 100%;\n padding-right: $sp-1;\n padding-left: $sp-1;\n overflow: visible;\n\n @include mq(md) {\n right: auto;\n left: -$sp-5;\n }\n\n svg {\n display: inline-block;\n width: 100%;\n height: 100%;\n color: $link-color;\n visibility: hidden;\n }\n }\n\n .anchor-heading:hover,\n .anchor-heading:focus,\n h1:hover > .anchor-heading,\n h2:hover > .anchor-heading,\n h3:hover > .anchor-heading,\n h4:hover > .anchor-heading,\n h5:hover > .anchor-heading,\n h6:hover > .anchor-heading {\n svg {\n visibility: visible;\n }\n }\n\n summary {\n cursor: pointer;\n }\n\n h1,\n h2,\n h3,\n h4,\n h5,\n h6,\n #toctitle {\n position: relative;\n margin-top: 1.5em;\n margin-bottom: 0.25em;\n\n + table,\n + .table-wrapper,\n + .code-example,\n + .highlighter-rouge,\n + .sectionbody .listingblock {\n margin-top: 1em;\n }\n\n + p:not(.label) {\n margin-top: 0;\n }\n }\n\n > h1:first-child,\n > h2:first-child,\n > h3:first-child,\n > h4:first-child,\n > h5:first-child,\n > h6:first-child,\n > .sect1:first-child > h2,\n > .sect2:first-child > h3,\n > .sect3:first-child > h4,\n > .sect4:first-child > h5,\n > .sect5:first-child > h6 {\n margin-top: $sp-2;\n }\n}\n","// Main nav, breadcrumb, etc...\n// stylelint-disable selector-no-type, max-nesting-depth, selector-max-compound-selectors, selector-max-type, selector-max-specificity\n\n.nav-list {\n padding: 0;\n margin-top: 0;\n margin-bottom: 0;\n list-style: none;\n\n .nav-list-item {\n @include fs-4;\n\n position: relative;\n margin: 0;\n\n @include mq(md) {\n @include fs-3;\n }\n\n .nav-list-link {\n display: block;\n min-height: $nav-list-item-height-sm;\n padding-top: $sp-1;\n padding-bottom: $sp-1;\n line-height: #{$nav-list-item-height-sm - 2 * $sp-1};\n @if $nav-list-expander-right {\n padding-right: $nav-list-item-height-sm;\n padding-left: $gutter-spacing-sm;\n } @else {\n padding-right: $gutter-spacing-sm;\n padding-left: $nav-list-item-height-sm;\n }\n\n @include mq(md) {\n min-height: $nav-list-item-height;\n line-height: #{$nav-list-item-height - 2 * $sp-1};\n @if $nav-list-expander-right {\n padding-right: $nav-list-item-height;\n padding-left: $gutter-spacing;\n } @else {\n padding-right: $gutter-spacing;\n padding-left: $nav-list-item-height;\n }\n }\n\n &.external > svg {\n width: $sp-4;\n height: $sp-4;\n vertical-align: text-bottom;\n }\n\n &.active {\n font-weight: 600;\n text-decoration: none;\n }\n\n &:hover,\n &.active {\n background-image: linear-gradient(\n -90deg,\n rgba($feedback-color, 1) 0%,\n rgba($feedback-color, 0.8) 80%,\n rgba($feedback-color, 0) 100%\n );\n }\n }\n\n .nav-list-expander {\n position: absolute;\n @if $nav-list-expander-right {\n right: 0;\n }\n\n width: $nav-list-item-height-sm;\n height: $nav-list-item-height-sm;\n padding: #{$nav-list-item-height-sm * 0.25};\n color: $link-color;\n\n @include mq(md) {\n width: $nav-list-item-height;\n height: $nav-list-item-height;\n padding: #{$nav-list-item-height * 0.25};\n }\n\n &:hover {\n background-image: linear-gradient(\n -90deg,\n rgba($feedback-color, 1) 0%,\n rgba($feedback-color, 0.8) 100%\n );\n }\n\n @if $nav-list-expander-right {\n svg {\n transform: rotate(90deg);\n }\n }\n }\n\n > .nav-list {\n display: none;\n padding-left: $sp-3;\n list-style: none;\n\n .nav-list-item {\n position: relative;\n\n .nav-list-link {\n color: $nav-child-link-color;\n }\n\n .nav-list-expander {\n color: $nav-child-link-color;\n }\n }\n }\n\n &.active {\n > .nav-list-expander svg {\n @if $nav-list-expander-right {\n transform: rotate(-90deg);\n } @else {\n transform: rotate(90deg);\n }\n }\n\n > .nav-list {\n display: block;\n }\n }\n }\n}\n\n.nav-category {\n padding: $sp-2 $gutter-spacing-sm;\n font-weight: 600;\n text-align: start;\n text-transform: uppercase;\n border-bottom: $border $border-color;\n @include fs-2;\n\n @include mq(md) {\n padding: $sp-2 $gutter-spacing;\n margin-top: $gutter-spacing-sm;\n text-align: start;\n\n &:first-child {\n margin-top: 0;\n }\n }\n}\n\n.nav-list.nav-category-list {\n > .nav-list-item {\n margin: 0;\n\n > .nav-list {\n padding: 0;\n\n > .nav-list-item {\n > .nav-list-link {\n color: $link-color;\n }\n\n > .nav-list-expander {\n color: $link-color;\n }\n }\n }\n }\n}\n\n// Aux nav\n\n.aux-nav {\n height: 100%;\n overflow-x: auto;\n @include fs-2;\n\n .aux-nav-list {\n display: flex;\n height: 100%;\n padding: 0;\n margin: 0;\n list-style: none;\n }\n\n .aux-nav-list-item {\n display: inline-block;\n height: 100%;\n padding: 0;\n margin: 0;\n }\n\n @include mq(md) {\n padding-right: $gutter-spacing-sm;\n }\n}\n\n// Breadcrumb nav\n\n.breadcrumb-nav {\n @include mq(md) {\n margin-top: -$sp-4;\n }\n}\n\n.breadcrumb-nav-list {\n padding-left: 0;\n margin-bottom: $sp-3;\n list-style: none;\n}\n\n.breadcrumb-nav-list-item {\n display: table-cell;\n @include fs-2;\n\n &::before {\n display: none;\n }\n\n &::after {\n display: inline-block;\n margin-right: $sp-2;\n margin-left: $sp-2;\n color: $grey-dk-000;\n content: \"/\";\n }\n\n &:last-child {\n &::after {\n content: \"\";\n }\n }\n}\n","// Typography\n// stylelint-disable selector-no-type, selector-max-type, selector-max-specificity, selector-max-id\n\nh1,\n.text-alpha {\n @include fs-8;\n\n font-weight: 300;\n}\n\nh2,\n.text-beta,\n#toctitle {\n @include fs-6;\n}\n\nh3,\n.text-gamma {\n @include fs-5;\n}\n\nh4,\n.text-delta {\n @include fs-2;\n\n font-weight: 400;\n text-transform: uppercase;\n letter-spacing: 0.1em;\n}\n\nh4 code {\n text-transform: none;\n}\n\nh5,\n.text-epsilon {\n @include fs-3;\n}\n\nh6,\n.text-zeta {\n @include fs-2;\n}\n\n.text-small {\n @include fs-2;\n}\n\n.text-mono {\n font-family: $mono-font-family !important;\n}\n\n.text-left {\n text-align: left !important;\n}\n\n.text-center {\n text-align: center !important;\n}\n\n.text-right {\n text-align: right !important;\n}\n","// Labels (not the form kind)\n\n// this :not() prevents a style clash with Mermaid.js's\n// diagram labels, which also use .label\n// for more, see https://github.com/just-the-docs/just-the-docs/issues/1272\n// and the accompanying PR\n.label:not(g),\n.label-blue:not(g) {\n display: inline-block;\n padding: 0.16em 0.56em;\n margin-right: $sp-2;\n margin-left: $sp-2;\n color: $white;\n text-transform: uppercase;\n vertical-align: middle;\n background-color: $blue-100;\n @include fs-2;\n\n border-radius: 12px;\n}\n\n.label-green:not(g) {\n background-color: $green-200;\n}\n\n.label-purple:not(g) {\n background-color: $purple-100;\n}\n\n.label-red:not(g) {\n background-color: $red-200;\n}\n\n.label-yellow:not(g) {\n color: $grey-dk-200;\n background-color: $yellow-200;\n}\n","// Buttons and things that look like buttons\n// stylelint-disable color-named\n\n.btn {\n display: inline-block;\n box-sizing: border-box;\n padding: 0.3em 1em;\n margin: 0;\n font-family: inherit;\n font-size: inherit;\n font-weight: 500;\n line-height: 1.5;\n color: $link-color;\n text-decoration: none;\n vertical-align: baseline;\n cursor: pointer;\n background-color: $base-button-color;\n border-width: 0;\n border-radius: $border-radius;\n box-shadow:\n 0 1px 2px rgba(0, 0, 0, 0.12),\n 0 3px 10px rgba(0, 0, 0, 0.08);\n appearance: none;\n\n &:focus {\n text-decoration: none;\n outline: none;\n box-shadow: 0 0 0 3px rgba(blue, 0.25);\n }\n\n &:focus:hover,\n &.selected:focus {\n box-shadow: 0 0 0 3px rgba(blue, 0.25);\n }\n\n &:hover,\n &.zeroclipboard-is-hover {\n color: darken($link-color, 2%);\n }\n\n &:hover,\n &:active,\n &.zeroclipboard-is-hover,\n &.zeroclipboard-is-active {\n text-decoration: none;\n background-color: darken($base-button-color, 1%);\n }\n\n &:active,\n &.selected,\n &.zeroclipboard-is-active {\n background-color: darken($base-button-color, 3%);\n background-image: none;\n box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15);\n }\n\n &.selected:hover {\n background-color: darken(#dcdcdc, 5%);\n }\n\n &:disabled,\n &.disabled {\n &,\n &:hover {\n color: rgba(102, 102, 102, 0.5);\n cursor: default;\n background-color: rgba(229, 229, 229, 0.5);\n background-image: none;\n box-shadow: none;\n }\n }\n}\n\n.btn-outline {\n color: $link-color;\n background: transparent;\n box-shadow: inset 0 0 0 2px $grey-lt-300;\n\n &:hover,\n &:active,\n &.zeroclipboard-is-hover,\n &.zeroclipboard-is-active {\n color: darken($link-color, 4%);\n text-decoration: none;\n background-color: transparent;\n box-shadow: inset 0 0 0 3px $grey-lt-300;\n }\n\n &:focus {\n text-decoration: none;\n outline: none;\n box-shadow:\n inset 0 0 0 2px $grey-dk-100,\n 0 0 0 3px rgba(blue, 0.25);\n }\n\n &:focus:hover,\n &.selected:focus {\n box-shadow: inset 0 0 0 2px $grey-dk-100;\n }\n}\n\n.btn-primary {\n @include btn-color($white, $btn-primary-color);\n}\n\n.btn-purple {\n @include btn-color($white, $purple-100);\n}\n\n.btn-blue {\n @include btn-color($white, $blue-000);\n}\n\n.btn-green {\n @include btn-color($white, $green-100);\n}\n\n.btn-reset {\n background: none;\n border: none;\n margin: 0;\n text-align: inherit;\n font: inherit;\n border-radius: 0;\n appearance: none;\n}\n","// Colored button\n\n@mixin btn-color($fg, $bg) {\n color: $fg;\n background-color: darken($bg, 2%);\n background-image: linear-gradient(lighten($bg, 5%), darken($bg, 2%));\n box-shadow:\n 0 1px 3px rgba(0, 0, 0, 0.25),\n 0 4px 10px rgba(0, 0, 0, 0.12);\n\n &:hover,\n &.zeroclipboard-is-hover {\n color: $fg;\n background-color: darken($bg, 4%);\n background-image: linear-gradient((lighten($bg, 2%), darken($bg, 4%)));\n }\n\n &:active,\n &.selected,\n &.zeroclipboard-is-active {\n background-color: darken($bg, 5%);\n background-image: none;\n box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15);\n }\n\n &.selected:hover {\n background-color: darken($bg, 10%);\n }\n}\n","// Search input and autocomplete\n\n.search {\n position: relative;\n z-index: 2;\n flex-grow: 1;\n height: $sp-10;\n padding: $sp-2;\n transition: padding linear #{$transition-duration * 0.5};\n\n @include mq(md) {\n position: relative !important;\n width: auto !important;\n height: 100% !important;\n padding: 0;\n transition: none;\n }\n}\n\n.search-input-wrap {\n position: relative;\n z-index: 1;\n height: $sp-8;\n overflow: hidden;\n border-radius: $border-radius;\n box-shadow:\n 0 1px 2px rgba(0, 0, 0, 0.12),\n 0 3px 10px rgba(0, 0, 0, 0.08);\n transition: height linear #{$transition-duration * 0.5};\n\n @include mq(md) {\n position: absolute;\n width: 100%;\n max-width: $search-results-width;\n height: 100% !important;\n border-radius: 0;\n box-shadow: none;\n transition: width ease $transition-duration;\n }\n}\n\n.search-input {\n position: absolute;\n width: 100%;\n height: 100%;\n padding: $sp-2 $gutter-spacing-sm $sp-2 #{$gutter-spacing-sm + $sp-5};\n font-size: 1rem;\n color: $body-text-color;\n background-color: $search-background-color;\n border-top: 0;\n border-right: 0;\n border-bottom: 0;\n border-left: 0;\n border-radius: 0;\n\n @include mq(md) {\n padding: $sp-2 $gutter-spacing-sm $sp-2 #{$gutter-spacing + $sp-5};\n font-size: 0.875rem;\n background-color: $body-background-color;\n transition: padding-left linear #{$transition-duration * 0.5};\n }\n\n &:focus {\n outline: 0;\n\n + .search-label .search-icon {\n color: $link-color;\n }\n }\n}\n\n.search-label {\n position: absolute;\n display: flex;\n height: 100%;\n padding-left: $gutter-spacing-sm;\n\n @include mq(md) {\n padding-left: $gutter-spacing;\n transition: padding-left linear #{$transition-duration * 0.5};\n }\n\n .search-icon {\n width: #{$sp-4 * 1.2};\n height: #{$sp-4 * 1.2};\n align-self: center;\n color: $grey-dk-000;\n }\n}\n\n.search-results {\n position: absolute;\n left: 0;\n display: none;\n width: 100%;\n max-height: calc(100% - #{$sp-10});\n overflow-y: auto;\n background-color: $search-background-color;\n border-bottom-right-radius: $border-radius;\n border-bottom-left-radius: $border-radius;\n box-shadow:\n 0 1px 2px rgba(0, 0, 0, 0.12),\n 0 3px 10px rgba(0, 0, 0, 0.08);\n\n @include mq(md) {\n top: 100%;\n width: $search-results-width;\n max-height: calc(100vh - 200%) !important;\n }\n}\n\n.search-results-list {\n padding-left: 0;\n margin-bottom: $sp-1;\n list-style: none;\n @include fs-4;\n\n @include mq(md) {\n @include fs-3;\n }\n}\n\n.search-results-list-item {\n padding: 0;\n margin: 0;\n}\n\n.search-result {\n display: block;\n padding: $sp-1 $sp-3;\n\n &:hover,\n &.active {\n background-color: $feedback-color;\n }\n}\n\n.search-result-title {\n display: block;\n padding-top: $sp-2;\n padding-bottom: $sp-2;\n\n @include mq(sm) {\n display: inline-block;\n width: 40%;\n padding-right: $sp-2;\n vertical-align: top;\n }\n}\n\n.search-result-doc {\n display: flex;\n align-items: center;\n word-wrap: break-word;\n\n &.search-result-doc-parent {\n opacity: 0.5;\n @include fs-3;\n\n @include mq(md) {\n @include fs-2;\n }\n }\n\n .search-result-icon {\n width: $sp-4;\n height: $sp-4;\n margin-right: $sp-2;\n color: $link-color;\n flex-shrink: 0;\n }\n\n .search-result-doc-title {\n overflow: auto;\n }\n}\n\n.search-result-section {\n margin-left: #{$sp-4 + $sp-2};\n word-wrap: break-word;\n}\n\n.search-result-rel-url {\n display: block;\n margin-left: #{$sp-4 + $sp-2};\n overflow: hidden;\n color: $search-result-preview-color;\n text-overflow: ellipsis;\n white-space: nowrap;\n @include fs-1;\n}\n\n.search-result-previews {\n display: block;\n padding-top: $sp-2;\n padding-bottom: $sp-2;\n padding-left: $sp-4;\n margin-left: $sp-2;\n color: $search-result-preview-color;\n word-wrap: break-word;\n border-left: $border;\n border-left-color: $border-color;\n @include fs-2;\n\n @include mq(sm) {\n display: inline-block;\n width: 60%;\n padding-left: $sp-2;\n margin-left: 0;\n vertical-align: top;\n }\n}\n\n.search-result-preview + .search-result-preview {\n margin-top: $sp-1;\n}\n\n.search-result-highlight {\n font-weight: bold;\n}\n\n.search-no-result {\n padding: $sp-2 $sp-3;\n @include fs-3;\n}\n\n.search-button {\n position: fixed;\n right: $sp-4;\n bottom: $sp-4;\n display: flex;\n width: $sp-9;\n height: $sp-9;\n background-color: $search-background-color;\n border: 1px solid rgba($link-color, 0.3);\n border-radius: #{$sp-9 * 0.5};\n box-shadow:\n 0 1px 2px rgba(0, 0, 0, 0.12),\n 0 3px 10px rgba(0, 0, 0, 0.08);\n align-items: center;\n justify-content: center;\n}\n\n.search-overlay {\n position: fixed;\n top: 0;\n left: 0;\n z-index: 1;\n width: 0;\n height: 0;\n background-color: rgba(0, 0, 0, 0.3);\n opacity: 0;\n transition:\n opacity ease $transition-duration,\n width 0s $transition-duration,\n height 0s $transition-duration;\n}\n\n.search-active {\n .search {\n position: fixed;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n padding: 0;\n }\n\n .search-input-wrap {\n height: $sp-10;\n border-radius: 0;\n\n @include mq(md) {\n width: $search-results-width;\n box-shadow:\n 0 1px 2px rgba(0, 0, 0, 0.12),\n 0 3px 10px rgba(0, 0, 0, 0.08);\n }\n }\n\n .search-input {\n background-color: $search-background-color;\n\n @include mq(md) {\n padding-left: 2.3rem;\n }\n }\n\n .search-label {\n @include mq(md) {\n padding-left: 0.6rem;\n }\n }\n\n .search-results {\n display: block;\n }\n\n .search-overlay {\n width: 100%;\n height: 100%;\n opacity: 1;\n transition:\n opacity ease $transition-duration,\n width 0s,\n height 0s;\n }\n\n @include mq(md) {\n .main {\n position: fixed;\n right: 0;\n left: 0;\n }\n }\n\n .main-header {\n padding-top: $sp-10;\n\n @include mq(md) {\n padding-top: 0;\n }\n }\n}\n","// Tables\n// stylelint-disable max-nesting-depth, selector-no-type, selector-max-type\n\n.table-wrapper {\n display: block;\n width: 100%;\n max-width: 100%;\n margin-bottom: $sp-5;\n overflow-x: auto;\n border-radius: $border-radius;\n box-shadow:\n 0 1px 2px rgba(0, 0, 0, 0.12),\n 0 3px 10px rgba(0, 0, 0, 0.08);\n}\n\ntable {\n display: table;\n min-width: 100%;\n border-collapse: separate;\n}\n\nth,\ntd {\n @include fs-3;\n\n min-width: 7.5rem;\n padding: $sp-2 $sp-3;\n background-color: $table-background-color;\n border-bottom: $border rgba($border-color, 0.5);\n border-left: $border $border-color;\n\n &:first-of-type {\n border-left: 0;\n }\n}\n\ntbody {\n tr {\n &:last-of-type {\n th,\n td {\n border-bottom: 0;\n }\n\n td {\n padding-bottom: $sp-3;\n }\n }\n }\n}\n\nthead {\n th {\n border-bottom: $border $border-color;\n }\n}\n","// Code and syntax highlighting\n// stylelint-disable selector-no-qualifying-type, declaration-block-semicolon-newline-after,declaration-block-single-line-max-declarations, selector-no-type, selector-max-type, scss/comment-no-empty\n\n// {% raw %}\n\n// This instruction applies to all queues not within 'pre' or 'figure', avoiding 'code' generated by the highlight.\n:not(pre, figure) {\n & > code {\n padding: 0.2em 0.15em;\n font-weight: 400;\n background-color: $code-background-color;\n border: $border $border-color;\n border-radius: $border-radius;\n }\n}\n\n// Avoid appearance of dark border around visited code links in Safari\na:visited code {\n border-color: $border-color;\n}\n\n// Content structure for highlighted code blocks using fences or Liquid\n//\n// ```[LANG]...```, no kramdown line_numbers:\n// div.[language-LANG.]highlighter-rouge > div.highlight > pre.highlight > code\n//\n// ```[LANG]...```, kramdown line_numbers = true:\n// div.[language-LANG.]highlighter-rouge > div.highlight > pre.highlight > code\n// > div.table-wrapper > table.rouge-table > tbody > tr\n// > td.rouge-gutter.gl > pre.lineno\n// | td.rouge-code > pre\n//\n// {% highlight LANG %}...{% endhighlight %}:\n// figure.highlight > pre > code.language-LANG\n//\n// {% highlight LANG linenos %}...{% endhighlight %}:\n// figure.highlight > pre > code.language-LANG\n// > div.table-wrapper > table.rouge-table > tbody > tr\n// > td.gutter.gl > pre.lineno\n// | td.code > pre\n//\n// ----...---- (AsciiDoc)\n// div.listingblock > div.content > pre.rouge.highlight\n//\n// fix_linenos removes the outermost pre when it encloses table.rouge-table\n//\n// See docs/index-test.md for some tests.\n//\n// No kramdown line_numbers: fences and Liquid highlighting look the same.\n// Kramdown line_numbers = true: fences have a wider gutter than with Liquid?\n\n// ```[LANG]...```\n// or in AsciiDoc:\n//\n// ----\n// ...\n// ----\n\n// the code may appear with 3 different types:\n// container \\ case: default case, code with line number, code with html rendering\n// top level: div.highlighter-rouge, figure.highlight, figure.highlight\n// second level: div.highlight, div.table-wrapper, pre.highlight\n// third level: pre.highlight, td.code, absent\n// last level: code, pre, code (optionality)\n// highlighter level: span, span, span\n// the spacing are only in the second level for case 1, 3 and in the third level for case 2\n// in AsciiDoc, there is a parent container that contains optionally a title and the content.\n\n// select top level container\ndiv.highlighter-rouge,\ndiv.listingblock > div.content,\nfigure.highlight {\n margin-top: 0;\n margin-bottom: $sp-3;\n background-color: $code-background-color;\n border-radius: $border-radius;\n box-shadow: none;\n -webkit-overflow-scrolling: touch;\n position: relative;\n padding: 0;\n\n // copy button (or other button)\n // the button appear only when there is a hover on the code or focus on button\n > button {\n width: $sp-3;\n opacity: 0;\n position: absolute;\n top: 0;\n right: 0;\n border: $sp-3 solid $code-background-color;\n background-color: $code-background-color;\n color: $body-text-color;\n box-sizing: content-box;\n\n svg {\n fill: $body-text-color;\n }\n\n &:active {\n text-decoration: none;\n outline: none;\n opacity: 1;\n }\n\n &:focus {\n opacity: 1;\n }\n }\n\n // the button can be seen by doing a simple hover in the code, there is no need to go over the location of the button\n &:hover {\n > button {\n cursor: copy;\n opacity: 1;\n }\n }\n}\n\n// setting the spacing and scrollbar on the second level for the first case\n// remove all space on the second and third level\n// this is a mixin to accommodate for the slightly different structures generated via Markdown vs AsciiDoc\n@mixin scroll-and-spacing($code-div, $pre-select) {\n #{$code-div} {\n overflow-x: auto;\n padding: $sp-3;\n margin: 0;\n border: 0;\n }\n\n #{$pre-select},\n code {\n padding: 0;\n margin: 0;\n border: 0;\n }\n}\n\n// for Markdown\ndiv.highlighter-rouge {\n @include scroll-and-spacing(\"div.highlight\", \"pre.highlight\");\n}\n\n// for AsciiDoc. we also need to fix the margins for its parent container.\ndiv.listingblock {\n @include scroll-and-spacing(\"div.content\", \"div.content > pre\");\n\n margin-top: 0;\n margin-bottom: $sp-3;\n}\n\n// {% highlight LANG %}...{% endhighlight %},\n// {% highlight LANG linenos %}...{% endhighlight %}:\n\n// setting the spacing and scrollbar on the second level for the thirt case\n// the css rule are apply only to the last code enviroment\n// setting the scroolbar\nfigure.highlight {\n pre,\n :not(pre) > code {\n overflow-x: auto;\n padding: $sp-3;\n margin: 0;\n border: 0;\n }\n}\n\n// ```[LANG]...```, kramdown line_numbers = true,\n// {% highlight LANG linenos %}...{% endhighlight %}:\n\n// setting the spacing and scrollbar on the thirt level for the second case\n.highlight .table-wrapper {\n padding: $sp-3 0;\n margin: 0;\n border: 0;\n box-shadow: none;\n\n td,\n pre {\n @include fs-2;\n\n min-width: 0;\n padding: 0;\n background-color: $code-background-color;\n border: 0;\n }\n\n td.gl {\n width: 1em;\n padding-right: $sp-3;\n padding-left: $sp-3;\n }\n\n pre {\n margin: 0;\n line-height: 2;\n }\n}\n\n// Code examples: html render of a code\n.code-example,\n.listingblock > .title {\n padding: $sp-3;\n margin-bottom: $sp-3;\n overflow: auto;\n border: 1px solid $border-color;\n border-radius: $border-radius;\n\n + .highlighter-rouge,\n + .sectionbody .listingblock,\n + .content,\n + figure.highlight {\n position: relative;\n margin-top: -$sp-4;\n border-right: 1px solid $border-color;\n border-bottom: 1px solid $border-color;\n border-left: 1px solid $border-color;\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n }\n}\n\n// Mermaid diagram code blocks should be left unstyled.\ncode.language-mermaid {\n padding: 0;\n background-color: inherit;\n border: 0;\n}\n\n// Override OneDarkJekyll Colors for Code Blocks\n.highlight,\npre.highlight {\n background: $code-background-color; // Code Background\n // For Backwards Compatibility Before $code-linenumber-color was added\n @if variable-exists(code-linenumber-color) {\n color: $code-linenumber-color; // Code Line Numbers\n } @else {\n color: $body-text-color; // Code Line Numbers\n }\n}\n\n// Override OneDarkJekyll Colors for Code Blocks\n.highlight pre {\n background: $code-background-color; // Code Background\n}\n\n// {% endraw %}\n","// Utility classes for colors\n\n// Text colors\n\n.text-grey-dk-000 {\n color: $grey-dk-000 !important;\n}\n\n.text-grey-dk-100 {\n color: $grey-dk-100 !important;\n}\n\n.text-grey-dk-200 {\n color: $grey-dk-200 !important;\n}\n\n.text-grey-dk-250 {\n color: $grey-dk-250 !important;\n}\n\n.text-grey-dk-300 {\n color: $grey-dk-300 !important;\n}\n\n.text-grey-lt-000 {\n color: $grey-lt-000 !important;\n}\n\n.text-grey-lt-100 {\n color: $grey-lt-100 !important;\n}\n\n.text-grey-lt-200 {\n color: $grey-lt-200 !important;\n}\n\n.text-grey-lt-300 {\n color: $grey-lt-300 !important;\n}\n\n.text-blue-000 {\n color: $blue-000 !important;\n}\n\n.text-blue-100 {\n color: $blue-100 !important;\n}\n\n.text-blue-200 {\n color: $blue-200 !important;\n}\n\n.text-blue-300 {\n color: $blue-300 !important;\n}\n\n.text-green-000 {\n color: $green-000 !important;\n}\n\n.text-green-100 {\n color: $green-100 !important;\n}\n\n.text-green-200 {\n color: $green-200 !important;\n}\n\n.text-green-300 {\n color: $green-300 !important;\n}\n\n.text-purple-000 {\n color: $purple-000 !important;\n}\n\n.text-purple-100 {\n color: $purple-100 !important;\n}\n\n.text-purple-200 {\n color: $purple-200 !important;\n}\n\n.text-purple-300 {\n color: $purple-300 !important;\n}\n\n.text-yellow-000 {\n color: $yellow-000 !important;\n}\n\n.text-yellow-100 {\n color: $yellow-100 !important;\n}\n\n.text-yellow-200 {\n color: $yellow-200 !important;\n}\n\n.text-yellow-300 {\n color: $yellow-300 !important;\n}\n\n.text-red-000 {\n color: $red-000 !important;\n}\n\n.text-red-100 {\n color: $red-100 !important;\n}\n\n.text-red-200 {\n color: $red-200 !important;\n}\n\n.text-red-300 {\n color: $red-300 !important;\n}\n\n// Background colors\n\n.bg-grey-dk-000 {\n background-color: $grey-dk-000 !important;\n}\n\n.bg-grey-dk-100 {\n background-color: $grey-dk-100 !important;\n}\n\n.bg-grey-dk-200 {\n background-color: $grey-dk-200 !important;\n}\n\n.bg-grey-dk-250 {\n background-color: $grey-dk-250 !important;\n}\n\n.bg-grey-dk-300 {\n background-color: $grey-dk-300 !important;\n}\n\n.bg-grey-lt-000 {\n background-color: $grey-lt-000 !important;\n}\n\n.bg-grey-lt-100 {\n background-color: $grey-lt-100 !important;\n}\n\n.bg-grey-lt-200 {\n background-color: $grey-lt-200 !important;\n}\n\n.bg-grey-lt-300 {\n background-color: $grey-lt-300 !important;\n}\n\n.bg-blue-000 {\n background-color: $blue-000 !important;\n}\n\n.bg-blue-100 {\n background-color: $blue-100 !important;\n}\n\n.bg-blue-200 {\n background-color: $blue-200 !important;\n}\n\n.bg-blue-300 {\n background-color: $blue-300 !important;\n}\n\n.bg-green-000 {\n background-color: $green-000 !important;\n}\n\n.bg-green-100 {\n background-color: $green-100 !important;\n}\n\n.bg-green-200 {\n background-color: $green-200 !important;\n}\n\n.bg-green-300 {\n background-color: $green-300 !important;\n}\n\n.bg-purple-000 {\n background-color: $purple-000 !important;\n}\n\n.bg-purple-100 {\n background-color: $purple-100 !important;\n}\n\n.bg-purple-200 {\n background-color: $purple-200 !important;\n}\n\n.bg-purple-300 {\n background-color: $purple-300 !important;\n}\n\n.bg-yellow-000 {\n background-color: $yellow-000 !important;\n}\n\n.bg-yellow-100 {\n background-color: $yellow-100 !important;\n}\n\n.bg-yellow-200 {\n background-color: $yellow-200 !important;\n}\n\n.bg-yellow-300 {\n background-color: $yellow-300 !important;\n}\n\n.bg-red-000 {\n background-color: $red-000 !important;\n}\n\n.bg-red-100 {\n background-color: $red-100 !important;\n}\n\n.bg-red-200 {\n background-color: $red-200 !important;\n}\n\n.bg-red-300 {\n background-color: $red-300 !important;\n}\n","// Utility classes for layout\n\n// Display\n\n.d-block {\n display: block !important;\n}\n\n.d-flex {\n display: flex !important;\n}\n\n.d-inline {\n display: inline !important;\n}\n\n.d-inline-block {\n display: inline-block !important;\n}\n\n.d-none {\n display: none !important;\n}\n\n@each $media-query in map-keys($media-queries) {\n @for $i from 1 through length($spacers) {\n @include mq($media-query) {\n $size: #{map-get($spacers, sp-#{$i - 1})};\n $scale: #{$i - 1};\n\n // .d-sm-block, .d-md-none, .d-lg-inline\n .d-#{$media-query}-block {\n display: block !important;\n }\n .d-#{$media-query}-flex {\n display: flex !important;\n }\n .d-#{$media-query}-inline {\n display: inline !important;\n }\n .d-#{$media-query}-inline-block {\n display: inline-block !important;\n }\n .d-#{$media-query}-none {\n display: none !important;\n }\n }\n }\n}\n\n// Horizontal alignment\n\n.float-left {\n float: left !important;\n}\n\n.float-right {\n float: right !important;\n}\n\n.flex-justify-start {\n justify-content: flex-start !important;\n}\n\n.flex-justify-end {\n justify-content: flex-end !important;\n}\n\n.flex-justify-between {\n justify-content: space-between !important;\n}\n\n.flex-justify-around {\n justify-content: space-around !important;\n}\n\n// Vertical alignment\n\n.v-align-baseline {\n vertical-align: baseline !important;\n}\n\n.v-align-bottom {\n vertical-align: bottom !important;\n}\n\n.v-align-middle {\n vertical-align: middle !important;\n}\n\n.v-align-text-bottom {\n vertical-align: text-bottom !important;\n}\n\n.v-align-text-top {\n vertical-align: text-top !important;\n}\n\n.v-align-top {\n vertical-align: top !important;\n}\n","// Utility classes for typography\n\n.fs-1 {\n @include fs-1;\n}\n\n.fs-2 {\n @include fs-2;\n}\n\n.fs-3 {\n @include fs-3;\n}\n\n.fs-4 {\n @include fs-4;\n}\n\n.fs-5 {\n @include fs-5;\n}\n\n.fs-6 {\n @include fs-6;\n}\n\n.fs-7 {\n @include fs-7;\n}\n\n.fs-8 {\n @include fs-8;\n}\n\n.fs-9 {\n @include fs-9;\n}\n\n.fs-10 {\n @include fs-10;\n}\n\n.fw-300 {\n font-weight: 300 !important;\n}\n\n.fw-400 {\n font-weight: 400 !important;\n}\n\n.fw-500 {\n font-weight: 500 !important;\n}\n\n.fw-700 {\n font-weight: 700 !important;\n}\n\n.lh-0 {\n line-height: 0 !important;\n}\n\n.lh-default {\n line-height: $body-line-height;\n}\n\n.lh-tight {\n line-height: $body-heading-line-height;\n}\n\n.ls-5 {\n letter-spacing: 0.05em !important;\n}\n\n.ls-10 {\n letter-spacing: 0.1em !important;\n}\n\n.ls-0 {\n letter-spacing: 0 !important;\n}\n\n.text-uppercase {\n text-transform: uppercase !important;\n}\n","// Utility classes for lists\n\n// stylelint-disable selector-max-type\n\n.list-style-none {\n padding: 0 !important;\n margin: 0 !important;\n list-style: none !important;\n\n li {\n &::before {\n display: none !important;\n }\n }\n}\n","// Utility classes for margins and padding\n\n// stylelint-disable block-opening-brace-space-after, block-opening-brace-space-before\n\n// Margin spacer utilities\n\n.mx-auto {\n margin-right: auto !important;\n margin-left: auto !important;\n}\n\n@for $i from 1 through length($spacers) {\n $size: #{map-get($spacers, sp-#{$i - 1})};\n $scale: #{$i - 1};\n\n // .m-0, .m-1, .m-2...\n .m-#{$scale} {\n margin: #{$size} !important;\n }\n .mt-#{$scale} {\n margin-top: #{$size} !important;\n }\n .mr-#{$scale} {\n margin-right: #{$size} !important;\n }\n .mb-#{$scale} {\n margin-bottom: #{$size} !important;\n }\n .ml-#{$scale} {\n margin-left: #{$size} !important;\n }\n\n .mx-#{$scale} {\n margin-right: #{$size} !important;\n margin-left: #{$size} !important;\n }\n\n .my-#{$scale} {\n margin-top: #{$size} !important;\n margin-bottom: #{$size} !important;\n }\n\n .mxn-#{$scale} {\n margin-right: -#{$size} !important;\n margin-left: -#{$size} !important;\n }\n .mx-#{$scale}-auto {\n margin-right: auto !important;\n margin-left: auto !important;\n }\n}\n\n@each $media-query in map-keys($media-queries) {\n @for $i from 1 through length($spacers) {\n @include mq($media-query) {\n $size: #{map-get($spacers, sp-#{$i - 1})};\n $scale: #{$i - 1};\n\n // .m-sm-0, .m-md-1, .m-lg-2...\n .m-#{$media-query}-#{$scale} {\n margin: #{$size} !important;\n }\n .mt-#{$media-query}-#{$scale} {\n margin-top: #{$size} !important;\n }\n .mr-#{$media-query}-#{$scale} {\n margin-right: #{$size} !important;\n }\n .mb-#{$media-query}-#{$scale} {\n margin-bottom: #{$size} !important;\n }\n .ml-#{$media-query}-#{$scale} {\n margin-left: #{$size} !important;\n }\n\n .mx-#{$media-query}-#{$scale} {\n margin-right: #{$size} !important;\n margin-left: #{$size} !important;\n }\n\n .my-#{$media-query}-#{$scale} {\n margin-top: #{$size} !important;\n margin-bottom: #{$size} !important;\n }\n\n .mxn-#{$media-query}-#{$scale} {\n margin-right: -#{$size} !important;\n margin-left: -#{$size} !important;\n }\n }\n }\n}\n\n// Padding spacer utilities\n\n@for $i from 1 through length($spacers) {\n $size: #{map-get($spacers, sp-#{$i - 1})};\n $scale: #{$i - 1};\n\n // .p-0, .p-1, .p-2...\n .p-#{$scale} {\n padding: #{$size} !important;\n }\n .pt-#{$scale} {\n padding-top: #{$size} !important;\n }\n .pr-#{$scale} {\n padding-right: #{$size} !important;\n }\n .pb-#{$scale} {\n padding-bottom: #{$size} !important;\n }\n .pl-#{$scale} {\n padding-left: #{$size} !important;\n }\n\n .px-#{$scale} {\n padding-right: #{$size} !important;\n padding-left: #{$size} !important;\n }\n\n .py-#{$scale} {\n padding-top: #{$size} !important;\n padding-bottom: #{$size} !important;\n }\n}\n\n@each $media-query in map-keys($media-queries) {\n @include mq($media-query) {\n @for $i from 1 through length($spacers) {\n $size: #{map-get($spacers, sp-#{$i - 1})};\n $scale: #{$i - 1};\n\n // .p-sm-0, .p-md-1, .p-lg-2...\n .p-#{$media-query}-#{$scale} {\n padding: #{$size} !important;\n }\n .pt-#{$media-query}-#{$scale} {\n padding-top: #{$size} !important;\n }\n .pr-#{$media-query}-#{$scale} {\n padding-right: #{$size} !important;\n }\n .pb-#{$media-query}-#{$scale} {\n padding-bottom: #{$size} !important;\n }\n .pl-#{$media-query}-#{$scale} {\n padding-left: #{$size} !important;\n }\n\n .px-#{$media-query}-#{$scale} {\n padding-right: #{$size} !important;\n padding-left: #{$size} !important;\n }\n\n .py-#{$media-query}-#{$scale} {\n padding-top: #{$size} !important;\n padding-bottom: #{$size} !important;\n }\n }\n }\n}\n","// stylelint-disable selector-max-specificity, selector-max-id, selector-max-type, selector-no-qualifying-type\n\n@media print {\n .site-footer,\n .site-button,\n #edit-this-page,\n #back-to-top,\n .site-nav,\n .main-header {\n display: none !important;\n }\n\n .side-bar {\n width: 100%;\n height: auto;\n border-right: 0 !important;\n }\n\n .site-header {\n border-bottom: 1px solid $border-color;\n }\n\n .site-title {\n font-size: 1rem !important;\n font-weight: 700 !important;\n }\n\n .text-small {\n font-size: 8pt !important;\n }\n\n pre.highlight {\n border: 1px solid $border-color;\n }\n\n .main {\n max-width: none;\n margin-left: 0;\n }\n}\n","// Skipnav\n// Skip to main content\n\na.skip-to-main {\n left: -999px;\n position: absolute;\n top: auto;\n width: 1px;\n height: 1px;\n overflow: hidden;\n z-index: -999;\n}\n\na.skip-to-main:focus,\na.skip-to-main:active {\n color: $link-color;\n background-color: $body-background-color;\n left: auto;\n top: auto;\n width: 30%;\n height: auto;\n overflow: auto;\n margin: 10px 35%;\n padding: 5px;\n border-radius: 15px;\n border: 4px solid $btn-primary-color;\n text-align: center;\n font-size: 1.2em;\n z-index: 999;\n}\n","\n@import \"./support/support\";\n@import \"./custom/setup\";\n@import \"./color_schemes/light\";\n\n@import \"./modules\";\ndiv.opaque {\n background-color: $body-background-color;\n}\n@import \"./custom/custom\";\n\n\n"],"file":"just-the-docs-light.css"} \ No newline at end of file diff --git a/docs/_site/assets/js/just-the-docs.js b/docs/_site/assets/js/just-the-docs.js new file mode 100644 index 00000000..c8793754 --- /dev/null +++ b/docs/_site/assets/js/just-the-docs.js @@ -0,0 +1,556 @@ +(function (jtd, undefined) { + +// Event handling + +jtd.addEvent = function(el, type, handler) { + if (el.attachEvent) el.attachEvent('on'+type, handler); else el.addEventListener(type, handler); +} +jtd.removeEvent = function(el, type, handler) { + if (el.detachEvent) el.detachEvent('on'+type, handler); else el.removeEventListener(type, handler); +} +jtd.onReady = function(ready) { + // in case the document is already rendered + if (document.readyState!='loading') ready(); + // modern browsers + else if (document.addEventListener) document.addEventListener('DOMContentLoaded', ready); + // IE <= 8 + else document.attachEvent('onreadystatechange', function(){ + if (document.readyState=='complete') ready(); + }); +} + +// Show/hide mobile menu + +function initNav() { + jtd.addEvent(document, 'click', function(e){ + var target = e.target; + while (target && !(target.classList && target.classList.contains('nav-list-expander'))) { + target = target.parentNode; + } + if (target) { + e.preventDefault(); + target.ariaPressed = target.parentNode.classList.toggle('active'); + } + }); + + const siteNav = document.getElementById('site-nav'); + const mainHeader = document.getElementById('main-header'); + const menuButton = document.getElementById('menu-button'); + + disableHeadStyleSheets(); + + jtd.addEvent(menuButton, 'click', function(e){ + e.preventDefault(); + + if (menuButton.classList.toggle('nav-open')) { + siteNav.classList.add('nav-open'); + mainHeader.classList.add('nav-open'); + menuButton.ariaPressed = true; + } else { + siteNav.classList.remove('nav-open'); + mainHeader.classList.remove('nav-open'); + menuButton.ariaPressed = false; + } + }); +} + +// The element is assumed to include the following stylesheets: +// - a to /assets/css/just-the-docs-head-nav.css, +// with id 'jtd-head-nav-stylesheet' +// - a Config JSON | Windows MIDI Services Skip to main content Link Menu Expand (external link) Document Search Copy Copied

JSON Config File

It’s best to use the Settings application and the transport / processing plugins for Settings to manipulate the file. However, if you edit it by hand, here are some notes.

The File location is Restricted

The JSON configuration files are all stored in %allusersprofile%\Microsoft\MIDI which typically resolves to C:\ProgramData\Microsoft\MIDI. For security reasons, we don’t allow the file to be stored in any other location. However, you can have as many files in that folder as you want, and switch between them as needed.

The default config file is typically named Default.midiconfig.json. The actual name is stored in the registry under HKLM\SOFTWARE\Microsoft\Windows MIDI Services in the CurrentConfig value. This value must not contain any non-filename path characters (no backslashes, colons, etc.).

JSON is Case-Sensitive

JSON is typically case-sensitive for all keys. The Windows.Data.Json parser used by Windows MIDI Services is case-sensitive with no option to ignore case. That includes GUID values. For example, the following two values are not equivalent JSON keys:

"{26FA740D-469C-4D33-BEB1-3885DE7D6DF1}":
+        {
+            "_comment": "KS MIDI (USB etc.)"
+        },
+

and

"{26fa740d-469c-4d33-beb1-3885de7d6df1}":
+        {
+            "_comment": "KS MIDI (USB etc.)"
+        },
+

Schema

The JSON config file is such that each transport owns its own schema within the bucket associated with its class ID (GUID). We do not impose a schema on the transports or other plugins. Therefore there is no formal JSON Schema for this file.

Here’s an example of a bare-bones file, with sections for three different transports.

{
+    "header":
+    {
+        "_comment": "NOTE: All json keys are case-sensitive, including GUIDs.",
+        "product" : "Windows MIDI Services",
+        "fileVersion": 1.0
+    },
+    
+    "endpointTransportPluginSettings":
+    {
+        "{26FA740D-469C-4D33-BEB1-3885DE7D6DF1}":
+        {
+            "_comment": "KS MIDI (USB etc.)"
+        },
+        "{C95DCD1F-CDE3-4C2D-913C-528CB8A4CBE6}":
+        {
+            "_comment": "Network MIDI"
+        },
+        "{8FEAAD91-70E1-4A19-997A-377720A719C1}":
+        {
+            "_comment": "Virtual MIDI"
+        }
+
+    },
+    "endpointProcessingPluginSettings":
+    {
+
+    }
+}
+

Endpoint Properties

The basics of this are identical for each transport. We’ll use KS (USB) as an example

"{26FA740D-469C-4D33-BEB1-3885DE7D6DF1}":
+{
+    "_comment": "KS MIDI (USB etc.)"
+    "SWD: \\\\?\\SWD#MIDISRV#MIDIU_KS_BIDI_6799286025327820155_OUTPIN.0_INPIN.2#{e7cce071-3c03-423f-88d3-f1045d02552b}":
+    {
+        "userSuppliedName" : "Pete's Kontrol S61",
+        "userSuppliedDescription" : "This is my most favorite MIDI 2.0 controller in the whole world!"
+    }
+    ...
+},
+

Of those, the identification method SWD is the most important. This controls how we identify a matching device. In cases where the manufacturer doesn’t supply a unique iSerialNumber in USB, unplugging your device from one USB port and plugging it into another can result in a new Id. Similarly, if you have two or more of the same device, and they do not have unique serial numbers, it can be impossible for Windows to distinguish between them.

Valid values for the identification method prefix

  • SWD: : (The colon and trailing space are required). Use the full Windows Endpoint Device Interface Id. For example \\\\?\\SWD#MIDISRV#MIDIU_KS_BIDI_16024944077548273316_OUTPIN.0_INPIN.2#{e7cce071-3c03-423f-88d3-f1045d02552b}. (Note how the backslashes have to be escaped with additional backslashes.) If the device has an iSerialNumber or you never move it between USB ports, this tends to work fine.
  • (other methods to be added here when we implement them)

Valid properties you can set across all supported endpoints

Property Type Description
userSuppliedName Quoted Text The name you want to use for the endpoint. This will override the name displayed in correctly-coded applications, but won’t necessarily change what you see in Device Manager. These names should be relatively short so they display fully in all/most applications, but meaningful to you.
userSuppliedDescription Quoted Text A text description and/or notes about the endpoint. Applications may or may not use this data
forceSingleClientOnly Boolean true/false (no quotes) Most endpoints are multi-client (more than one application can use them simultaneously) by default. This setting is for forcing an endpoint to be single-client only (a value of true). It’s unusual to need this, but a typical use may be to disable multi-client for a device which has a custom driver which doesn’t gracefully handle multiple client applications at the same time.

Plugin-specific settings

This is not an exhaustive list, because the transport and processing plugins may be created by anyone.

Virtual MIDI

Virtual MIDI includes three different sections inside its transport bucket.

"{8FEAAD91-70E1-4A19-997A-377720A719C1}":
+{
+    "_comment": "Virtual MIDI",
+    "add":
+    {
+    },
+    "update":
+    {
+    },
+    "remove":
+    {
+       
+    }
+
+}
+

For the persistent configuration file, typically “add” is all that is specified, as it doesn’t make sense to update or remove endpoints or routing on service start.

NOTE: This document is not yet complete. We’ll add more details as the schemas are finalized

KS (USB etc) MIDI

TODO: Show how to update endpoint names and provide other properties here

\ No newline at end of file diff --git a/docs/_site/contributors/CONTRIBUTING.md b/docs/_site/contributors/CONTRIBUTING.md new file mode 100644 index 00000000..f7cfa91b --- /dev/null +++ b/docs/_site/contributors/CONTRIBUTING.md @@ -0,0 +1,47 @@ +# Contributing + +This project welcomes contributions and suggestions. Most contributions require you to agree to a Contributor License Agreement (CLA) declaring that you have the right to, and actually do, grant us the rights to use your contribution. For details, visit https://cla.opensource.microsoft.com. + +When you submit a pull request, a CLA bot will automatically determine whether you need to provide a CLA and decorate the PR appropriately (e.g., status check, comment). Simply follow the instructions provided by the bot. You will only need to do this once across all repos using our CLA. + +This project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/). For more information see the [Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/) or contact [opencode@microsoft.com](mailto:opencode@microsoft.com) with any additional questions or comments. + +## Pull Requests and Forks + +We're excited to have others contribute to the APIs, tools, plug-ins, drivers and more! We generally recommend that contributors fork the project they are interested in, and then submit pull requests from their own forks. We'll review the PRs on a regular basis, and accept/decline or request additional information. + +## Forks for other platforms + +You may fork these projects as per the license. However, we highly recommend you consider contributing to the main project rather than spin off a separate and incompatible or competing project targeting Windows. In the end, we want to do what's right for musicians, music creation app / plug-in developers, and music hardware developers. + +**Forking to support other operating systems (including hardware devices) is also allowed and encouraged.** +However, in that case, we again encourage you to consider what we can do together in the primary repo to support the requirements for these other platforms so that we can keep feature level, tool, and API parity, especially as the specifications evolve, or we fix bugs. + +## Contributing image assets + +Any images submitted must have clear license for use that is compatible with the Windows MIDI Services project. We cannot accept icons generated from other work without clear license, including images and fonts. Preference is given to icons/images created specifically for use in this project. Please adhere to the Contributor License Agreement when contributing. If there's any ambiguity, we will not be able to accept the contribution. + +# What do I need to get started? + +Projects generally use the most recent recent versions of [Visual Studio](https://visualstudio.microsoft.com/), [C++/WinRT](https://docs.microsoft.com/windows/uwp/cpp-and-winrt-apis/), Windows 10/11 SDKs, [Windows App SDK](https://github.com/microsoft/WindowsAppSDK), [Windows Community Toolkit](https://github.com/CommunityToolkit/WindowsCommunityToolkit) and [.NET 7 Preview](https://dotnet.microsoft.com/) available at the time of authoring. Specific build requirements will be available in the readme for each sub project. + +Projects are intended to be compiled on Windows, typically the latest release of Windows 11. Cross-compiling from another platform may be appropriate for some forks, but not necessarily for the main API, driver, and other components. Additionally, using toolchains other than Visual Studio are currently not supported for targeting Windows. When in doubt, ask. + +* [Specific Developer on-boarding details here](README-Developer-Onboarding.md) + +# What should I contribute? + +We'd love to have your help on this project, no matter what kind it is. + +* Bug fixes +* Features you want to see implemented +* Transport plug-ins for new or even experimental transports +* Processing plug-ins for MIDI Mapper and similar types of message processing +* Testing and bug reports (especially with different MIDI 1.0 and MIDI 2.0 hardware and software) +* API and user Documentation +* Samples +* Localization to a language you are fluent in + +Testing and bug reports are the most critical, as everyone's setup is different. We want to ensure the project is as bug free and as performant as possible, with a large variety of PCs and peripherals. + +For code, one place to start is by looking at the open issues here in Github, or discussions in the dedicated Discord server. When in doubt, ask the core team. diff --git a/docs/_site/contributors/README-Developer-Onboarding.md b/docs/_site/contributors/README-Developer-Onboarding.md new file mode 100644 index 00000000..969c109b --- /dev/null +++ b/docs/_site/contributors/README-Developer-Onboarding.md @@ -0,0 +1,94 @@ +# General Developer on-boarding + +NOTE: In the future, we may replace this with on-boarding scripts. For now, please use the information in this document. Find something missing or incorrect? Please open an issue. + +Information below is for working directly on the projects in this repo, not for creating your own applications using these components. + +A single developer workstation can be set up with the superset of everything required here, if desired. + +## Basics + +### Visual Studio + +Install the latest version of Visual Studio. Any edition will work (Enterprise, Community, etc.). Many use the Community edition. Preview versions are acceptable and sometimes preferable. + +### Windows SDK + +These projects currently support the latest supported version of Windows 10 as well as all supported versions of Windows 11. + +Install (through Visual Studio) the **latest Windows 10 SDK** and the **Windows 11 SDK(s) required by the projects**. If in doubt, install the latest 2 or 3 Windows 11 SDKs in addition to that Windows 10 SDK. If you do not have the correct SDK version, the projects will not build. + +Note: Do not change the minimum or target Windows SDK version in a project you intend to PR. + +#### How to verify the SDK version used by a project + +Open the project file and look for min and target SDK versions. Versions below are for illustration purposes only. + +C++ Project (.vcxproj) + +```xml +10.0.22621.0 +10.0.17134.0 +``` + +C# Project File (.csproj) + +```xml +net8.0-windows10.0.20348.0 +10.0.20348.0 +10.0.20348.0 +``` + +You'll want to install the SDK versions from the minimum through to the target. + +## Service/API/SDK Development + +The Service, API, and SDK are all written using C++. The API and SDK also use C++/WinRT. + +### Visual Studio Workloads for C++ + +* Desktop development with C++ + +Additional Installs + +* [C++ / WinRT (Restore through NuGet)](https://github.com/microsoft/CsWinRT) + +### Additional Help + +* [C++/WinRT Docs](https://learn.microsoft.com/windows/uwp/cpp-and-winrt-apis/) + +## Tools + +The tools are developed in C# and use WinUI for the user interface. They use C#/WinRT for consuming the WinRT components. + +### Visual Studio Workloads for CSharp + +* .NET desktop Development Workload + +Additional installs + +* [.NET 8.0 Preview SDK](https://dotnet.microsoft.com/download/visual-studio-sdks) + +These packages can be restored from within Visual Studio using the NuGet package manager + +* [C# / WinRT](https://github.com/microsoft/CsWinRT) +* [WinUI 3](https://github.com/microsoft/microsoft-ui-xaml) +* [Community Toolkit](https://github.com/CommunityToolkit) + +(installer extension?) + +## USB MIDI Driver + +The USB MIDI Driver is a kernel-mode driver written in C++ using Visual Studio. + +### Visual Studio Workloads for C++ Driver Development + +Additional Installs + +* [Windows Driver Development Kit](https://learn.microsoft.com/windows-hardware/drivers/download-the-wdk) + +## Docs + +We use Visual Studio Code with the Learn Authoring Pack extension. That includes learn-article-templates, learn-images, learn-linting, learn-markdown, learn-metadata, learn-preview, learn-scaffolding, learn-validation, and learn-yaml. + +* [Marketplace Link for the Learn Authoring Pack](https://marketplace.visualstudio.com/items?itemName=docsmsft.docs-authoring-pack) diff --git a/docs/_site/contributors/README.md b/docs/_site/contributors/README.md new file mode 100644 index 00000000..87ab9f4b --- /dev/null +++ b/docs/_site/contributors/README.md @@ -0,0 +1,9 @@ +# Contributing + +## Legal and other information + +See [Contributing](CONTRIBUTING.md) + +## Developer on-boarding + +See [Developer On-boarding](README-Developer-Onboarding.md) diff --git a/docs/_site/developer-docs/Windows.Devices.Midi2/README.html b/docs/_site/developer-docs/Windows.Devices.Midi2/README.html new file mode 100644 index 00000000..275c2f85 --- /dev/null +++ b/docs/_site/developer-docs/Windows.Devices.Midi2/README.html @@ -0,0 +1 @@ + Windows.Devices.Midi2 API | Windows MIDI Services Skip to main content Link Menu Expand (external link) Document Search Copy Copied

Windows.Devices.Midi2

The Windows.Devices.Midi2 types are documented in these pages.

Typical API workflow:

  1. Create a new session, with an appropriate name. The name will be visible to users and so should be meaningful. Each application may open more than one session at a time (for example, different songs in a DAW, or different tabs in a browser). A single session manages the lifetime of the connections opened through it.
  2. Connect to an endpoint. Typically, you’ll get the endpoint’s id through the enumeration functions.
  3. Wire up a MidiMessageReceived event handler. This is how you will receive incoming messages from the endpoint. Messages are received individually, with one event per message.
  4. Optionally, add any processing plugins. If you want to filter messages or provide multiple “views” into a stream, you can add the appropriate client message processing plugins.
  5. Open the connection. Once the connection is open, you may send and receive messages.

Endpoint Enumeration

Enumeration is how you discover endpoints and get notified of endpoints when they are added, updated, or removed. For the best user experience, keep a MidiEndpointDeviceWatcher running in a background thread so you can monitor device removal, and property updates (name, function blocks, etc.)

Session

Interaction with a MIDI Endpoint always starts with creating a session.

Connections

Once you have a session, you will create one or more connections to send and receive messages.

Clock

The MIDI clock is used for creating timestamps for use in sending MIDI messages.

Messages

MIDI Messages are discrete packets of data of a known length. In the MIDI 2.0 specification, they are known as Universal MIDI Packets. In Windows MIDI Services, even MIDI 1.0 bytestream messages are presented in their equivalent Universal MIDI Packet format. The API includes several classes not only for the messages, but also to help construct and parse them.

Metadata

Function Blocks and Group Terminal Blocks are important types of MIDI 2.0 metadata which describe an endpoint.

Client-Side Processing Plugins

Connections allocate service resources (time and memory), so we recommend applications maintain only a single connection to an endpoint within any session. But because the new endpoint stream-focused approach aggregates what used to be considered ports, we provide processing plugins to parcel out the incoming messages based on criteria set by the application. In this way, an application can have the logical equivalent of several input ports, without the associated resource usage.

Virtual Devices

A virtual device is the mechanism through which app-to-app MIDI works through the API. One application acts as the MIDI Endpoint Device, and other applications connect to it. In addition to the service component, it is implemented in the client API as a type of Client-SIde Processing Plugin

Simple Types

There are several simple or basic types used in Windows MIDI Services. These types provide formatting and validation to help ensure applications display data in similar ways.

Service

The MidiService class is a utility class which provides access to health and status information related to the MidiSrv Service.


Table of contents

\ No newline at end of file diff --git a/docs/_site/developer-docs/Windows.Devices.Midi2/clock/MidiClock.html b/docs/_site/developer-docs/Windows.Devices.Midi2/clock/MidiClock.html new file mode 100644 index 00000000..69d9add9 --- /dev/null +++ b/docs/_site/developer-docs/Windows.Devices.Midi2/clock/MidiClock.html @@ -0,0 +1 @@ + MidiClock | Windows MIDI Services Skip to main content Link Menu Expand (external link) Document Search Copy Copied

MidiClock

The MidiClock is what is used for all timestamps in Windows MIDI Services. Although it is internally backed by QueryPerformanceCounter, we recommend using the MidiClock type directly instead of calling QPC yourself.

Also note that QueryPerformanceCounter technically returns a signed 64 bit integer, but the timestamp values used in Windows MIDI Services are unsigned 64 bit integers. Typically, this is of no practical concern as the tick resolution is currently 100ns and takes tens of thousands of years to wrap around even with a 64 bit signed integer.

Note: The MIDI Clock is unrelated to wall clock time. It is an ever-increasing value of period 1/TimestampFrequency seconds that starts over when the PC is rebooted. To convert to wall clock time, you need to get the MidiClock.Now value at a known time, and then use that as a baseline until the next time you reboot the PC.

You can learn more about high-resolution timestamps in Windows at https://aka.ms/miditimestamp.

Static Properties

Static Property Description
Now Returns the current timestamp
TimestampFrequency Returns the number of timestamp ticks per second. This is calculated the first time it is called, and then cached for future calls.

Static Functions

The static functions are for convenience in calculating offsets to a timestamp, and for converting between units.

Static Function Description
ConvertTimestampToMicroseconds(timestampValue) Converts the provided timestamp to microseconds
ConvertTimestampToMilliseconds(timestampValue) Converts the provided timestamp to milliseconds
ConvertTimestampToSeconds(timestampValue) Converts the provided timestamp to seconds
OffsetTimestampByTicks(timestampValue, offsetTicks) Offsets a given timestamp by the provided (signed) number of ticks
OffsetTimestampByMicroseconds(timestampValue, offsetMicroseconds) Offsets a given timestamp by the provided (signed) number of microseconds
OffsetTimestampByMilliseconds(timestampValue, offsetMilliseconds) Offsets a given timestamp by the provided (signed) number of milliseconds
OffsetTimestampBySeconds(timestampValue, offsetSeconds) Offsets a given timestamp by the provided (signed) number of seconds

IDL

MidiClock IDL

\ No newline at end of file diff --git a/docs/_site/developer-docs/Windows.Devices.Midi2/connections/MidiEndpointConnection.html b/docs/_site/developer-docs/Windows.Devices.Midi2/connections/MidiEndpointConnection.html new file mode 100644 index 00000000..24f71ced --- /dev/null +++ b/docs/_site/developer-docs/Windows.Devices.Midi2/connections/MidiEndpointConnection.html @@ -0,0 +1,66 @@ + MidiEndpointConnection | Windows MIDI Services Skip to main content Link Menu Expand (external link) Document Search Copy Copied

MidiEndpointConnection

The MidiEndpointConnection type represents a single connection to a single endpoint managed by Windows MIDI Services. It is created using the functions of the MidiSession, and is tied to the lifetime of that session.

Connections allocate resources including send/receive buffers, and processing threads. For that reason, a session should generally not open more than one connection to a single endpoint. If you need to partition out messages more easily (by group or channel, for example) the MessageProcessingPlugins collection will help you do that.

To ensure an application is able to wire up processing plugins and event handlers before the connection is active, the connection returned by the MidiSession is not yet open. Once the connection is acquired, the application should assign event handlers, and optionally assign any message processing plugins. Once complete, the application calls the Open() function to connect to the service, create the queues, and begin sending and receiving messages.

Properties

Property Description
ConnectionId The generated GUID which uniquely identifes this connection instance. This is what is provided to the MidiSession when disconnecting an endpoint
EndpointDeviceId The system-wide identifier for the device connection. This is returned through enumeration calls.
Tag You may use this Tag property to hold any additional information you wish to have associated with the connection.
IsOpen True if this connection is currently open. When first created, the connection is not open until the consuming code calls the Open method
Settings Settings used to create this connection.
MessageProcessingPlugins Collection of all message processing plugins which will optionally handle incoming messages.

Static Member Functions

Static Function Description
GetDeviceSelector() Returns the device selector used for enumerating endpoint devices compatible with this API.
SendMessageSucceeded(sendResult) Helper function to decipher the return result of a message sending function to tell if it succeeded.
SendMessageFailed(sendResult) Helper function to decipher the return result of a message sending function to tell if it failed.

Functions

Function Description
Open() Open the connection and start receiving messages. Wire up the message event handler before calling this method.
SendMessagePacket(message) Send an IMidiUniversalPacket-implementing type such as MidiMessage64 or a strongly-typed message class.
SendMessageStruct(timestamp, message, wordCount) Send a fixed-sized MidiMessageStruct containing wordCount valid words. Additional words are ignored.
SendMessageWordArray(timestamp, words, startIndex, wordCount) Note: Some projections will send the entire array as a copy, so this may not be the most effecient way to send messages from your language.
SendMessageWords(timestamp, word0) Send a single 32-bit Universal MIDI Packet as 32-bit words. This is often the most efficient way to send this type of message
SendMessageWords(timestamp, word0, word1) Send a single 64-bit Universal MIDI Packet as 32-bit words. This is often the most efficient way to send this type of message
SendMessageWords(timestamp, word0, word1, word2) Send a single 96-bit Universal MIDI Packet as 32-bit words. This is often the most efficient way to send this type of message
SendMessageWords(timestamp, word0, word1, word2, word3) Send a single 128-bit Universal MIDI Packet as 32-bit words. This is often the most efficient way to send this type of message
SendMessageBuffer(timestamp, buffer, byteOffset, byteLength) Send a single Universal MIDI Packet as bytes from a buffer. The number of bytes sent must match the size read from the first 4 bits of the data starting at the specified offset, and must be laid out correctly with the first byte corresponding to the MSB of the first word of the UMP (the word which contains hte message type). If you want to manage a chunk of buffer memory, the IMemoryBuffer type is the acceptable WinRT approach, and is as close as you get to sending a pointer into a buffer.
AddEndpointProcessingPlugin(plugin) Add an endpoint processing plugin to this connection
RemoveEndpointProcessingPlugin(id) Remove an endpoint processing plugin

Tip: In all the functions which accept a timestamp to schedule the message, you can send a timestamp of 0 (zero) to bypass the scheduler and send the message immediately. Otherwise, the provided timestamp is treated as an absolute time for when the message should be sent from the service. Note that the service-based scheduler (currently based on a std::priority_queue) gets less efficient when there are thousands of messages in it, so it’s recommended that you not schedule too many messages at a time or too far out into the future.

Events

Event Description
MessageReceived(source, args) From IMidiMessageReceivedEventSource. This is the event for receiving MIDI Messages, one at a time.

When processing the MessageReceived event, do so quickly. This event is synchronous. If you need to do long-running processing of incoming messages, add them to your own incoming queue structure and have them processed by another application thread.

Note: Wire up event handlers and add message processing plugins prior to calling Open().

IDL

MidiEndpointConnection IDL

Sample

Here’s an excerpt from the full “API client basics” sample. It shows sending and receiving messages using the two built-in loopback endpoints. For more information on the loopback endpoints, see diagnostics endpoints.

using (var session = MidiSession.CreateSession("API Sample Session"))
+{
+    // get the endpoint Ids. Normally, you'd use enumeration functions to get this
+    // for non-diagnostics endpoints.
+    var endpointAId = MidiEndpointDeviceInformation.DiagnosticsLoopbackAEndpointId;
+    var endpointBId = MidiEndpointDeviceInformation.DiagnosticsLoopbackBEndpointId;
+
+    Console.WriteLine("Connecting to Sender UMP Endpoint: " + endpointAId);
+    Console.WriteLine("Connecting to Receiver UMP Endpoint: " + endpointBId);
+
+    var sendEndpoint = session.CreateEndpointConnection(endpointAId);
+    var receiveEndpoint = session.CreateEndpointConnection(endpointBId);
+
+    void MessageReceivedHandler(object sender, MidiMessageReceivedEventArgs args)
+    {
+        var ump = args.GetMessagePacket();
+
+        Console.WriteLine();
+        Console.WriteLine("Received UMP");
+        Console.WriteLine("- Current Timestamp: " + MidiClock.Now);
+        Console.WriteLine("- UMP Timestamp:     " + ump.Timestamp);
+        Console.WriteLine("- UMP Msg Type:      " + ump.MessageType);
+        Console.WriteLine("- UMP Packet Type:   " + ump.PacketType);
+        Console.WriteLine("- Message:           " + MidiMessageUtility.GetMessageFriendlyNameFromFirstWord(args.PeekFirstWord()));
+
+        if (ump is MidiMessage32)
+        {
+            var ump32 = ump as MidiMessage32;
+
+            if (ump32 != null)
+                Console.WriteLine("- Word 0:            0x{0:X}", ump32.Word0);
+        }
+    };
+
+    // wire up the event handler before opening the endpoint
+    receiveEndpoint.MessageReceived += MessageReceivedHandler;
+
+    Console.WriteLine("Opening endpoint connection");
+
+    receiveEndpoint.Open();
+    sendEndpoint.Open();
+
+    Console.WriteLine("Creating MIDI 1.0 Channel Voice 32-bit UMP...");
+
+    var ump32 = MidiMessageBuilder.BuildMidi1ChannelVoiceMessage(
+        MidiClock.Now, // use current timestamp
+        5,      // group 5
+        Midi1ChannelVoiceMessageStatus.NoteOn,  // 9
+        3,      // channel 3
+        120,    // note 120 - hex 0x78
+        100);   // velocity 100 hex 0x64
+
+    sendEndpoint.SendMessagePacket((IMidiUniversalPacket)ump32);  // could also use the SendWords methods, etc.
+
+    Console.WriteLine(" ** Wait for the message to arrive, and then press enter to cleanup. ** ");
+    Console.ReadLine();
+
+    // you should unregister the event handler as well
+    receiveEndpoint.MessageReceived -= MessageReceivedHandler;
+
+    // not strictly necessary if the session is going out of scope or is in a using block
+    session.DisconnectEndpointConnection(sendEndpoint.ConnectionId);
+    session.DisconnectEndpointConnection(receiveEndpoint.ConnectionId);
+}
+
+
\ No newline at end of file diff --git a/docs/_site/developer-docs/Windows.Devices.Midi2/connections/MidiMessageReceivedEventArgs.html b/docs/_site/developer-docs/Windows.Devices.Midi2/connections/MidiMessageReceivedEventArgs.html new file mode 100644 index 00000000..f36ba02a --- /dev/null +++ b/docs/_site/developer-docs/Windows.Devices.Midi2/connections/MidiMessageReceivedEventArgs.html @@ -0,0 +1 @@ + MidiMessageReceivedEventArgs | Windows MIDI Services Skip to main content Link Menu Expand (external link) Document Search Copy Copied

MidiMessageReceivedEventArgs

This is the main class to use when receving MIDI data from a message source such as a connection or a message processing plugin.

Note: Do not keep a copy of the MidiMessageReceivedEventArgs class, as the data it points to is guaranteed to exist for only the duration of the event handler call for which this instance was an argument.

Properties

Property Description
Timestamp The 64-bit MIDI Clock timestamp set by the service when this message was received
PacketType Type of Universal MIDI Packet. This value can be cast to get the number of valid words in the data. You can use this value to determine which of the FillMessageXX methods would be appropriate to call. For example, if the value is MidiPacketType.UniversalMidiPacket64 you would call FillMessage64
MessageType The type of Universal MIDI Packet Message. This comes from the first 4 bits of the data.

Functions

Function Description
PeekFirstWord() Returns the first word of the message data without removing it.
GetMessagePacket() Returns an IMidiUniversalPacket runtime class representing the data. This requires an allocation.
FillWords(word0, word1, word2, word3) Puts the data in the supplied words and returns the number of valid words to read. If the return value is 2, for example, then only word0 and word1 contain valid data.
FillMessageStruct(message) Fills the provided lightweight structure with the message data. Returns the number of valid words in the updated struct.
FillMessage32(message) Adds the data to the provided MidiMessage32 runtimeclass. The reference behavior is projection-dependent. Returns true if the provided type matches the expected packet type and the data has been written.
FillMessage64(message) Adds the data to the provided MidiMessage64 runtimeclass. The reference behavior is projection-dependent. Returns true if the provided type matches the expected packet type and the data has been written.
FillMessage96(message) Adds the data to the provided MidiMessage96 runtimeclass. The reference behavior is projection-dependent. Returns true if the provided type matches the expected packet type and the data has been written.
FillMessage128(message) Adds the data to the provided MidiMessage128 runtimeclass. The reference behavior is projection-dependent. Returns true if the provided type matches the expected packet type and the data has been written.
FillWordArray(words, startIndex) Writes the data starting at the zero-based startIndex. Some projections pass a copy of all the data, so this may not always be an efficient approach. Returns the number of words written.
FillByteArray(bytes, startIndex) Writes the data starting at the zero-based startIndex. Some projections pass a copy of all the data, so this may not always be an efficient approach. Returns the number of bytes written.
FillBuffer(buffer, byteOffset) Writes the data to the buffer starting at byteOffset. Returns the number of bytes written.

IDL

MidiMessageReceivedEventArgs IDL

\ No newline at end of file diff --git a/docs/_site/developer-docs/Windows.Devices.Midi2/connections/README.html b/docs/_site/developer-docs/Windows.Devices.Midi2/connections/README.html new file mode 100644 index 00000000..450c5b9f --- /dev/null +++ b/docs/_site/developer-docs/Windows.Devices.Midi2/connections/README.html @@ -0,0 +1 @@ + Connections | Windows MIDI Services Skip to main content Link Menu Expand (external link) Document Search Copy Copied

Connection APIs


Table of contents

\ No newline at end of file diff --git a/docs/_site/developer-docs/Windows.Devices.Midi2/enumeration/MidiEndpointDeviceInformation.html b/docs/_site/developer-docs/Windows.Devices.Midi2/enumeration/MidiEndpointDeviceInformation.html new file mode 100644 index 00000000..9f6b2cb5 --- /dev/null +++ b/docs/_site/developer-docs/Windows.Devices.Midi2/enumeration/MidiEndpointDeviceInformation.html @@ -0,0 +1,44 @@ + MidiEndpointDeviceInformation | Windows MIDI Services Skip to main content Link Menu Expand (external link) Document Search Copy Copied

MidiEndpointDeviceInformation

This class is a specialized equivalent of the DeviceInformation WinRT class. It handles requesting all of the additional properties necessary for MIDI devices, and also goes a step further to retrieve parent device information so that applications can display the endpoints and parent devices in context.

We’ve heard from developers that we did not provide sufficient information about devices in the past, so we created this class and the associated properties to remedy that. We also heard that Async calls were a non-starter for most DAW applications, so everything in this class is synchronous.

Note: the MidiEndpointDeviceWatcher is a better way to retrieve devices because you can then keep the watcher open in a background thread, and be notified of property changes, device add/remove, etc.

When displaying endpoint devices to users, you’ll typically want to stick to the defaults: IncludeClientUmpNative | IncludeClientByteStreamNative. You do not want to show the Diagnostic Ping ever, and you typically will not want to show the system-wide Diagnostic Loopback singletons. Finally, you don’t want to show the Virtual Device Responder endpoints because those should be reserved only for the “device” application in app-to-app MIDI.

In-protocol discovered information

When a device is first enumerated by the MIDI Service, if it is a UMP-native device, we will attempt endpoint discover and protocol negotiation. During that, we request all endpoint information and all function block information. The received data is then cached in the device properties so that applications do not need to perform this process themselves.

Properties

Property Source Description
Id Windows The endpoint device interface id
ContainerId Windows The device container
DeviceInstanceId Windows The device instance id without the interface information
Name Various This is the name which should be displayed in any application. It calculates the correct name based on the hierarchy of possible names, including a user-specified name. Always respect the user’s choice here.
TransportSuppliedName Transports The name provided by the driver or the endpoint transport.
EndpointSuppliedName MIDI 2.0 The name provided by MIDI 2.0 endpoint information. This is discovered in-protocol.
UserSuppliedName Configuration The name provided by the user.
ProductInstanceId MIDI 2.0 Property of the same name discovered by MIDI 2.0 in-protocol endpoint information.
SpecificationVersionMajor MIDI 2.0 Discovered UMP version
SpecificationVersionMinor MIDI 2.0 Discovered UMP version
SupportsMidi10Protocol MIDI 2.0 Discovered protocol support
SupportsMidi20Protocol MIDI 2.0 Discovered protocol support
`ConfiguredToReceiveJRTimestamps MIDI 2.0 Note that JR timestamps are handled entirely in the service and are not sent back down to the client.
`ConfiguredToSendJRTimestamps MIDI 2.0 Note that JR timestamps are handled entirely in the service and are not sent back down to the client.
DeviceIdentitySystemExclusiveId MIDI 2.0 Device Identity information
DeviceIdentityDeviceFamilyLsb MIDI 2.0 Device Identity information
DeviceIdentityDeviceFamilyMsb MIDI 2.0 Device Identity information
DeviceIdentityDeviceFamilyModelNumberLsb MIDI 2.0 Device Identity information
DeviceIdentityDeviceFamilyModelNumberMsb MIDI 2.0 Device Identity information
DeviceIdentitySoftwareRevisionLevel MIDI 2.0 Device Identity information
TransportId Windows The Id of the transport abstraction that manages this endpoint
TransportMnemonic Windows A short abbreviation for the transport. This can be used as a transport identifier.
TransportSuppliedSerialNumber Windows iSerialNumber, when available in USB, and other ids from other transports.
ManufacturerName Windows The name of the manufacturer of the device, if available
SupportsMultiClient Windows True if this endpoint supports multi-client use
NativeDataFormat Windows Because the driver and service handle data format translation, it’s not immediately obvious if the device is natively UMP or natively Byte Stream. This property provides that information
GroupTerminalBlocks Windows A collection of Group Terminal Blocks. These are used only in USB. For MIDI 2.0 devices, Function Blocks are preferred.
HasStaticFunctionBlocks MIDI 2.0 True if the function blocks are static. That is, the groups never change.
FunctionBlockCount MIDI 2.0 The number of function blocks the endpoint has declared. Function blocks always start at index zero and go to FunctionBlockCount-1
EndpointPurpose Windows The purpose of the endpoint. This is used primarily for filtering.
Description Configuration An endpoint description which is typically provided by the user
LargeImagePath Configuration The path to a png or jpg image that represents this endpoint. Typically user-supplied.
SmallImagePath Configuration The path to a png or jpg image that represents this endpoint. Typically user-supplied.
RequiresNoteOffTranslation Configuration True if the endpoint requires internal translation of Note On with zero velocity (in the case of MIDI 1.0) to a Note Off message. Typically user-supplied.
RecommendedCCAutomationIntervalMS Configuration Number of milliseconds between automation value changes. This is usually only for old and slow MIDI 1.0 devices that are prone to data flooding. User-supplied.
Properties Windows A collection of all the raw properties.

Static Properties

Static Property Description
DiagnosticsLoopbackAEndpointId Endpoint Id for the diagnostic loopback used for development and support purposes.
DiagnosticsLoopbackBEndpointId Endpoint Id for the diagnostic loopback used for development and support purposes.
EndpointInterfaceClass The class GUID which appears at the end of the Endpoint Ids

Functions

Function Description
GetParentDeviceInformation() Finds and then retrieves the parent DeviceInformation type with appropriate properties.
GetContainerInformation() Gets the device container information and returns its DeviceInformation with appropriate properties
UpdateFromDeviceInformation(deviceInformation) For use by any watcher which must update this object
UpdateFromDeviceInformationUpdate(deviceInformationUpdate) For use by any watcher which must update this object

Static Functions

Static Function Description
CreateFromId(id) Creates a new MidiEndpointDeviceInformation object from the specified id
FindAll() Searches for all endpoint devices and returns a list in the default sort order
FindAll(sortOrder) Searches for all endpoint devices and returns a list in the specified sort order
FindAll(sortOrder, endpointFilter) Searches for all endpoint devices which match the filter, and returns a list in the specified sort order.
DeviceMatchesFilter(deviceInformation, endpointFilter) A helper function to compare a device against the filter.
GetAdditionalPropertiesList() This returns the list of properties which must be requested during enumeration. Typically not needed for applications, as the watcher calls this function

IDL

MidiEndpointDeviceInformation IDL

Sample

What follows is an excerpt of the larger C++/WinRT enumeration sample.

#include "pch.h"
+#include <iostream>
+
+using namespace winrt::Windows::Devices::Midi2;        // API
+
+int main()
+{
+    winrt::init_apartment();
+
+    bool includeDiagnosticsEndpoints = true;
+
+    // enumerate all endpoints. A normal application should enumerate only
+    // IncludeClientByteStreamNative | IncludeClientUmpNative
+    auto endpoints = MidiEndpointDeviceInformation::FindAll(
+        MidiEndpointDeviceInformationSortOrder::Name,
+        MidiEndpointDeviceInformationFilter::IncludeClientByteStreamNative |
+        MidiEndpointDeviceInformationFilter::IncludeClientUmpNative |
+        MidiEndpointDeviceInformationFilter::IncludeDiagnosticLoopback |
+        MidiEndpointDeviceInformationFilter::IncludeVirtualDeviceResponder
+    );
+
+    std::cout << endpoints.Size() << " endpoints returned" << std::endl << std::endl;
+
+    for (auto const& endpoint : endpoints)
+    {
+        std::cout << "Identification" << std::endl;
+        std::cout << "- Name:    " << winrt::to_string(endpoint.Name()) << std::endl;
+        std::cout << "- Id:      " << winrt::to_string(endpoint.Id()) << std::endl;
+
+        std::cout << std::endl << "Endpoint Metadata" << std::endl;
+        std::cout << "- Product Instance Id:    " << winrt::to_string(endpoint.ProductInstanceId()) << std::endl;
+        std::cout << "- Endpoint-supplied Name: " << winrt::to_string(endpoint.EndpointSuppliedName()) << std::endl;
+    
+        std::cout << std::endl << "User-supplied Metadata" << std::endl;
+        std::cout << "- User-supplied Name: " << winrt::to_string(endpoint.UserSuppliedName()) << std::endl;
+        std::cout << "- Description:        " << winrt::to_string(endpoint.Description()) << std::endl;
+        std::cout << "- Small Image Path:   " << winrt::to_string(endpoint.SmallImagePath()) << std::endl;
+        std::cout << "- Large Image Path:   " << winrt::to_string(endpoint.LargeImagePath()) << std::endl;
+
+        // ...
+
+    }
+}
+
\ No newline at end of file diff --git a/docs/_site/developer-docs/Windows.Devices.Midi2/enumeration/MidiEndpointDeviceInformationUpdateEventArgs.html b/docs/_site/developer-docs/Windows.Devices.Midi2/enumeration/MidiEndpointDeviceInformationUpdateEventArgs.html new file mode 100644 index 00000000..92c9d1b5 --- /dev/null +++ b/docs/_site/developer-docs/Windows.Devices.Midi2/enumeration/MidiEndpointDeviceInformationUpdateEventArgs.html @@ -0,0 +1 @@ + MidiEndpointDeviceInformationUpdateEventArgs | Windows MIDI Services Skip to main content Link Menu Expand (external link) Document Search Copy Copied

MidiEndpointDeviceInformationUpdateEventArgs

Represents a notification that endpoint properties have been updated

Functions

| Property | Description | | ————— | ———– | | Id | Id of the endpoint which has been updated | | UpdatedName | True if the name properties have been updated | | UpdatedEndpointInformation | True if the in-protocol endpoint information has been updated | | UpdatedDeviceIdentity | True if the in-protocol device identity information has been updated | | UpdatedStreamConfiguration | True if protocol negotiation changed configuration of the endpoint | | UpdatedFunctionBlocks | True if any function blocks have been updated | | UpdatedUserMetadata | True if any user-supplied metadata fields have been updated | | UpdatedAdditionalCapabilities | True if the additional capabilities have been updated | | DeviceInformationUpdate | The source Windows.Devices.Enumeration.DeviceInformationUpdate` object. |

If none of the UpdatedXX properties are true, then other properties have been updated.

IDL

MidiEndpointDeviceInformationUpdateEventArgs IDL

\ No newline at end of file diff --git a/docs/_site/developer-docs/Windows.Devices.Midi2/enumeration/MidiEndpointDeviceWatcher.html b/docs/_site/developer-docs/Windows.Devices.Midi2/enumeration/MidiEndpointDeviceWatcher.html new file mode 100644 index 00000000..0e3f0d28 --- /dev/null +++ b/docs/_site/developer-docs/Windows.Devices.Midi2/enumeration/MidiEndpointDeviceWatcher.html @@ -0,0 +1 @@ + MidiEndpointDeviceWatcher | Windows MIDI Services Skip to main content Link Menu Expand (external link) Document Search Copy Copied

MidiEndpointDeviceWatcher

WinRT provides a Windows.Devices.Enumeration namespace with a DeviceWatcher class. That class is generic to any type of device, and so requires additional work to use with MIDI devices. Because of that, we’ve wrapped that functionality in the MidiEndpointDeviceWatcher class and the related MidiEndpointDeviceInformation class.

This is the class applications should use when they want to find devices, and also be notified when devices are added or removed, or when properties like function blocks or device names change.

Create a MidiEndpointDeviceWatcher on a background thread, and use the internal list of Endpoints as your source of record for device properties.

Properties

Function Description
Status The current status. See the Windows.Devices.Enumeration.DeviceWatcherStatus enumeration
EnumeratedEndpointDevices The list of enumerated devices. Provided here for convenience so applications do not need to keep their own list of MIDI devices.

Functions

Function Description
Start() Begin device enumeration. Wire up event handlers before calling this function.
Stop() Stop device enumeration.

Static Functions

Static Function Description
CreateWatcher(endpointFilter) Create a watcher which will enumerate devices based on the provided filter

Events

Event Description
Added(source, deviceInformation) A new endpoint has been added.
Removed(source, deviceInformationUpdate) An endpoint has been removed.
Updated(source endpointDeviceInformationUpdate) Properties of an endpoint have been updated. This is much more common than it was with the older MIDI 1.0 APIs due to both in-protocol endpoint information, and user configuration.
EnumerationCompleted(source) Raised when the initial device enumeration has been completed. Devices may still be added or removed after this event, but use this to decide when you have enough information to display an initial list.
Stopped(source) Enumeration has been stopped.

IDL

MidiEndpointDeviceWatcher IDL

\ No newline at end of file diff --git a/docs/_site/developer-docs/Windows.Devices.Midi2/enumeration/README.html b/docs/_site/developer-docs/Windows.Devices.Midi2/enumeration/README.html new file mode 100644 index 00000000..e0066912 --- /dev/null +++ b/docs/_site/developer-docs/Windows.Devices.Midi2/enumeration/README.html @@ -0,0 +1 @@ + Endpoint Enumeration | Windows MIDI Services Skip to main content Link Menu Expand (external link) Document Search Copy Copied \ No newline at end of file diff --git a/docs/_site/developer-docs/Windows.Devices.Midi2/message-utilities/MidiMessageBuilder.html b/docs/_site/developer-docs/Windows.Devices.Midi2/message-utilities/MidiMessageBuilder.html new file mode 100644 index 00000000..27e7a9ea --- /dev/null +++ b/docs/_site/developer-docs/Windows.Devices.Midi2/message-utilities/MidiMessageBuilder.html @@ -0,0 +1 @@ + MidiMessageBuilder | Windows MIDI Services Skip to main content Link Menu Expand (external link) Document Search Copy Copied

MidiMessageBuilder

(In progress)

Functions

Function Description
   
   
   
   

IDL

MidiMessageBuilder IDL

\ No newline at end of file diff --git a/docs/_site/developer-docs/Windows.Devices.Midi2/message-utilities/MidiMessageConverter.html b/docs/_site/developer-docs/Windows.Devices.Midi2/message-utilities/MidiMessageConverter.html new file mode 100644 index 00000000..6567bc22 --- /dev/null +++ b/docs/_site/developer-docs/Windows.Devices.Midi2/message-utilities/MidiMessageConverter.html @@ -0,0 +1 @@ + MidiMessageConverter | Windows MIDI Services Skip to main content Link Menu Expand (external link) Document Search Copy Copied

MidiMessageConverter

(In progress)

Functions

Function Description
   
   
   
   

IDL

MidiMessageConverter IDL

\ No newline at end of file diff --git a/docs/_site/developer-docs/Windows.Devices.Midi2/message-utilities/MidiMessageTranslator.html b/docs/_site/developer-docs/Windows.Devices.Midi2/message-utilities/MidiMessageTranslator.html new file mode 100644 index 00000000..89178794 --- /dev/null +++ b/docs/_site/developer-docs/Windows.Devices.Midi2/message-utilities/MidiMessageTranslator.html @@ -0,0 +1 @@ + MidiMessageTranslator | Windows MIDI Services Skip to main content Link Menu Expand (external link) Document Search Copy Copied

MidiMessageTranslator

(In progress)

Functions

Function Description
   
   
   
   

IDL

MidiMessageTranslator IDL

\ No newline at end of file diff --git a/docs/_site/developer-docs/Windows.Devices.Midi2/message-utilities/MidiMessageUtility.html b/docs/_site/developer-docs/Windows.Devices.Midi2/message-utilities/MidiMessageUtility.html new file mode 100644 index 00000000..32c0c88c --- /dev/null +++ b/docs/_site/developer-docs/Windows.Devices.Midi2/message-utilities/MidiMessageUtility.html @@ -0,0 +1 @@ + MidiMessageUtility | Windows MIDI Services Skip to main content Link Menu Expand (external link) Document Search Copy Copied

MidiMessageUtility

This class contains a number of static helper functions for reading information from Universal MIDI Packets, and also manipulating that information.

In most cases, the calling application needs to do some validation before calling functions which return specific fields. If, for example, the application asks for the Flex Data Status, but doesn’t provide a valid Flex Data message, the function will happily return whatever other data is in the position of that field.

Validation Functions

Function Description
ValidateMessage32MessageType(word0) Validate that the message type field in the word is for a 32-bit UMP
ValidateMessage64MessageType(word0) Validate that the message type field in the word is for a 64-bit UMP
ValidateMessage96MessageType(word0) Validate that the message type field in the word is for a 96-bit UMP
ValidateMessage128MessageType(word0) Validate that the message type field in the word is for a 128-bit UMP

Informational Functions

Function Description
MessageTypeHasGroupField(messageType) Returns true if the message type is known to be one which contains a group field. Valid only for message types known at the type the API was written.
MessageTypeHasChannelField(messageType) Returns true if the message type is known to be one which contains a channel field. Valid only for message types known at the type the API was written.

Field Access Functions

Function Description
GetMessageTypeFromMessageFirstWord(word0) Returns the MidiMessageType for the message
GetPacketTypeFromMessageFirstWord(word0) Returns the MidiPacketType for the message
GetGroupFromMessageFirstWord(word0) Returns the MidiGroup for the message. First check to see if the message type has a group field.
GetChannelFromMessageFirstWord(word0) Returns the MidiChannel for the message. First check to see if the message type has a channel field.
GetStatusFromUtilityMessage(word0) Returns the status byte
GetStatusFromMidi1ChannelVoiceMessage(word0) When provided a MIDI 1.0 channel voice message, returns the Midi1ChannelVoiceMessageStatus for the message.
GetStatusFromMidi2ChannelVoiceMessageFirstWord(word0) When provided a MIDI 2.0 channel voice message, returns the Midi2ChannelVoiceMessageStatus for the message.
GetStatusBankFromFlexDataMessageFirstWord(word0) Returns the status bank byte
GetStatusFromFlexDataMessageFirstWord(word0) Returns the status byte
GetStatusFromSystemCommonMessage(word0) Returns the status byte
GetStatusFromDataMessage64FirstWord(word0) Returns the status byte
GetNumberOfBytesFromDataMessage64FirstWord(word0) Returns the byte count field
GetStatusFromDataMessage128FirstWord(word0) Returns the status byte
GetNumberOfBytesFromDataMessage128FirstWord(word0) Returns the byte count field
GetFormFromStreamMessageFirstWord(word0) Returns the form nibble as a byte
GetStatusFromStreamMessageFirstWord(word0) Returns the status byte

Field Manipulation Functions

Function Description
ReplaceGroupInMessageFirstWord(word0, newGroup) Replaces the group field in word0 and returns the resulting MIDI word
ReplaceChannelInMessageFirstWord(word0, newChannel) Replaces the channel field in word0 and returns the resulting MIDI word

Additional Functions

Function Description
GetMessageFriendlyNameFromFirstWord(UInt32 word0) Returns the localized “Friendly Name” string for a message. For example, this is what is displayed in the console output when you are monitoring an endpoint in verbose mode.

IDL

MidiMessageUtility IDL

\ No newline at end of file diff --git a/docs/_site/developer-docs/Windows.Devices.Midi2/message-utilities/MidiStreamMessageBuilder.html b/docs/_site/developer-docs/Windows.Devices.Midi2/message-utilities/MidiStreamMessageBuilder.html new file mode 100644 index 00000000..1352af89 --- /dev/null +++ b/docs/_site/developer-docs/Windows.Devices.Midi2/message-utilities/MidiStreamMessageBuilder.html @@ -0,0 +1 @@ + MidiStreamMessageBuilder | Windows MIDI Services Skip to main content Link Menu Expand (external link) Document Search Copy Copied

MidiStreamMessageBuilder

(In progress)

Functions

Function Description
   
   
   
   

IDL

MidiStreamMessageBuilder IDL

\ No newline at end of file diff --git a/docs/_site/developer-docs/Windows.Devices.Midi2/message-utilities/README.html b/docs/_site/developer-docs/Windows.Devices.Midi2/message-utilities/README.html new file mode 100644 index 00000000..a6140295 --- /dev/null +++ b/docs/_site/developer-docs/Windows.Devices.Midi2/message-utilities/README.html @@ -0,0 +1 @@ + Message Utilities | Windows MIDI Services Skip to main content Link Menu Expand (external link) Document Search Copy Copied \ No newline at end of file diff --git a/docs/_site/developer-docs/Windows.Devices.Midi2/messages/IMidiUniversalPacket.html b/docs/_site/developer-docs/Windows.Devices.Midi2/messages/IMidiUniversalPacket.html new file mode 100644 index 00000000..5fc55c73 --- /dev/null +++ b/docs/_site/developer-docs/Windows.Devices.Midi2/messages/IMidiUniversalPacket.html @@ -0,0 +1 @@ + IMidiUniversalPacket | Windows MIDI Services Skip to main content Link Menu Expand (external link) Document Search Copy Copied

IMidiUniversalPacket

This interface is implemented by the rich MidiMessageXX runtime class types. It may also be used as the interface for message-specific classes you create yourself.

Property Description
Timestamp 64 bit timestamp set by the receiving transport in the case of incoming messages, or by the sender in the case of outgoing messages
MessageType A MidiMessageType enumeration value which represents the 4 bit MIDI Message type 0x0 - 0xF as defined by the MIDI UMP standard.
PacketType A MidiPacketType enumeration value which can be cast to an int to get the number of 32-bit words in the message packet
Function Description
PeekFirstWord() Provides access to the first word of data, even if the message type and size is not yet known by the API user

IMidiUniversalPacket IDL

\ No newline at end of file diff --git a/docs/_site/developer-docs/Windows.Devices.Midi2/messages/MidiMessage128.html b/docs/_site/developer-docs/Windows.Devices.Midi2/messages/MidiMessage128.html new file mode 100644 index 00000000..2471ca1b --- /dev/null +++ b/docs/_site/developer-docs/Windows.Devices.Midi2/messages/MidiMessage128.html @@ -0,0 +1 @@ + MidiMessage128 | Windows MIDI Services Skip to main content Link Menu Expand (external link) Document Search Copy Copied

MidiMessage128

MidiMessage128 is used for some data messages as well as important “Type F” stream metadata messages.

Includes all functions and properties in IMidiUniversalPacket, as well as:

Property Description
Word0 First 32-bit MIDI word
Word1 Second 32-bit MIDI word
Word2 Third 32-bit MIDI word
Word3 Fourth 32-bit MIDI word
Function Description
MidiMessage128() Default constructor
MidiMessage128(timestamp, word0, word1, word2, word3) Construct a new message with a timestamp and all 32 bit MIDI words

MidiMessage128 IDL

\ No newline at end of file diff --git a/docs/_site/developer-docs/Windows.Devices.Midi2/messages/MidiMessage32.html b/docs/_site/developer-docs/Windows.Devices.Midi2/messages/MidiMessage32.html new file mode 100644 index 00000000..f58a1ad9 --- /dev/null +++ b/docs/_site/developer-docs/Windows.Devices.Midi2/messages/MidiMessage32.html @@ -0,0 +1 @@ + MidiMessage32 | Windows MIDI Services Skip to main content Link Menu Expand (external link) Document Search Copy Copied

MidiMessage32

MidiMessage32 is used for short messages such as utility messages and MIDI 1.0 messages in UMP format.

Includes all functions and properties in IMidiUniversalPacket, as well as:

Property Description
Word0 First 32-bit MIDI word
Function Description
MidiMessage32() Default constructor
MidiMessage32(timestamp, word0) Construct a new message with a timestamp and 32 bit MIDI word

MidiMessage32 IDL

\ No newline at end of file diff --git a/docs/_site/developer-docs/Windows.Devices.Midi2/messages/MidiMessage64.html b/docs/_site/developer-docs/Windows.Devices.Midi2/messages/MidiMessage64.html new file mode 100644 index 00000000..16480726 --- /dev/null +++ b/docs/_site/developer-docs/Windows.Devices.Midi2/messages/MidiMessage64.html @@ -0,0 +1 @@ + MidiMessage64 | Windows MIDI Services Skip to main content Link Menu Expand (external link) Document Search Copy Copied

MidiMessage64

MidiMessage64 is used for some data messages and for MIDI 2.0 Channel Voice messages.

Includes all functions and properties in IMidiUniversalPacket, as well as:

Property Description
Word0 First 32-bit MIDI word
Word1 Second 32-bit MIDI word
Function Description
MidiMessage64() Default constructor
MidiMessage64(timestamp, word0, word1) Construct a new message with a timestamp and all 32 bit MIDI words

MidiMessage64 IDL

\ No newline at end of file diff --git a/docs/_site/developer-docs/Windows.Devices.Midi2/messages/MidiMessage96.html b/docs/_site/developer-docs/Windows.Devices.Midi2/messages/MidiMessage96.html new file mode 100644 index 00000000..53627aaf --- /dev/null +++ b/docs/_site/developer-docs/Windows.Devices.Midi2/messages/MidiMessage96.html @@ -0,0 +1 @@ + MidiMessage96 | Windows MIDI Services Skip to main content Link Menu Expand (external link) Document Search Copy Copied

MidiMessage96

MidiMessage96 is currently unused in the MIDI 2.0 UMP specification.

Includes all functions and properties in IMidiUniversalPacket, as well as:

Property Description
Word0 First 32-bit MIDI word
Word1 Second 32-bit MIDI word
Word2 Third 32-bit MIDI word
Function Description
MidiMessage96() Default constructor
MidiMessage96(timestamp, word0, word1, word2) Construct a new message with a timestamp and all 32 bit MIDI words

MidiMessage96 IDL

\ No newline at end of file diff --git a/docs/_site/developer-docs/Windows.Devices.Midi2/messages/MidiMessageStruct.html b/docs/_site/developer-docs/Windows.Devices.Midi2/messages/MidiMessageStruct.html new file mode 100644 index 00000000..4ebb6303 --- /dev/null +++ b/docs/_site/developer-docs/Windows.Devices.Midi2/messages/MidiMessageStruct.html @@ -0,0 +1 @@ + MidiMessageStruct | Windows MIDI Services Skip to main content Link Menu Expand (external link) Document Search Copy Copied

MidiMessageStruct

MidiMessageStruct is provided for cases where the API consumer wants to have a fixed value type they can use to send and receive messages. In the case of receiving messages, a function which fills the struct will typically return a count of valid words. The MidiMessageStruct struct type is simpler than the other runtime class types and may therefore perform better in some projections and for some uses. Note that this type does not include the timestamp field.

Field Description
Word0 First 32-bit MIDI word
Word1 Second 32-bit MIDI word
Word2 Third 32-bit MIDI word
Word3 Fourth 32-bit MIDI word

MidiMessageStruct IDL

\ No newline at end of file diff --git a/docs/_site/developer-docs/Windows.Devices.Midi2/messages/MidiMessageTypeEnum.html b/docs/_site/developer-docs/Windows.Devices.Midi2/messages/MidiMessageTypeEnum.html new file mode 100644 index 00000000..619071a5 --- /dev/null +++ b/docs/_site/developer-docs/Windows.Devices.Midi2/messages/MidiMessageTypeEnum.html @@ -0,0 +1 @@ + MidiMessageType | Windows MIDI Services Skip to main content Link Menu Expand (external link) Document Search Copy Copied

MidiMessageType Enumeration

The values correspond directly to the “mt” field in the MIDI UMP packet and may be cast as such if trimmed to 4 bits and shifted into place.

Property Value Description
UtilityMessage32 0x0 32-bit utility message
SystemCommon32 0x1 32-bit system common message
Midi1ChannelVoice32 0x2 32-bit MIDI 1.0 channel voice message
DataMessage64 0x3 64-bit data message (including MIDI 1.0 System Exclusive)
Midi2ChannelVoice64 0x4 64-bit MIDI 2.0 channel voice message
DataMessage128 0x5 128-bit Data Message
FutureReserved632 0x6 Reserved for future use by the MIDI standards bodies
FutureReserved732 0x7 Reserved for future use by the MIDI standards bodies
FutureReserved864 0x8 Reserved for future use by the MIDI standards bodies
FutureReserved964 0x9 Reserved for future use by the MIDI standards bodies
FutureReservedA64 0xA Reserved for future use by the MIDI standards bodies
FutureReservedB96 0xB Reserved for future use by the MIDI standards bodies
FutureReservedC96 0xC Reserved for future use by the MIDI standards bodies
FlexData128 0xD 128-bit Flex Data message including song file data messages
FutureReservedE128 0xE Reserved for future use by the MIDI standards bodies
Stream128 0xF 128-bit stream message, including endpoint discovery and function block messages

MidiMessageType IDL

\ No newline at end of file diff --git a/docs/_site/developer-docs/Windows.Devices.Midi2/messages/MidiPacketTypeEnum.html b/docs/_site/developer-docs/Windows.Devices.Midi2/messages/MidiPacketTypeEnum.html new file mode 100644 index 00000000..0258dcb9 --- /dev/null +++ b/docs/_site/developer-docs/Windows.Devices.Midi2/messages/MidiPacketTypeEnum.html @@ -0,0 +1 @@ + MidiPacketType | Windows MIDI Services Skip to main content Link Menu Expand (external link) Document Search Copy Copied

MidiPacketType Enumeration

The values correspond to the number of 32-bit MIDI words in the packet.

Property Value Description
UnknownOrInvalid 0 An invalid zero-length Universal MIDI Packet
UniversalMidiPacket32 1 32-bit (1 word) Universal MIDI Packet
UniversalMidiPacket64 2 64-bit (2 words) Universal MIDI Packet
UniversalMidiPacket96 3 96-bit (3 words) Universal MIDI Packet
UniversalMidiPacket128 4 128-bit (4 words) Universal MIDI Packet

MidiPacketType IDL

\ No newline at end of file diff --git a/docs/_site/developer-docs/Windows.Devices.Midi2/messages/README.html b/docs/_site/developer-docs/Windows.Devices.Midi2/messages/README.html new file mode 100644 index 00000000..251d4892 --- /dev/null +++ b/docs/_site/developer-docs/Windows.Devices.Midi2/messages/README.html @@ -0,0 +1 @@ + Messages | Windows MIDI Services Skip to main content Link Menu Expand (external link) Document Search Copy Copied

Messages

Windows MIDI Services messages are all sent and received in Universal MIDI Packet (UMP) format. a UMP is made up of 1-4 32 bit MIDI words, sized in 32 bit, 64 bit, 96 bit, and 128 bit packets. The first four bits of the packet are the message type, and from that, you can identify the type and size of message which follows.

Words

Several functions operate on one or more 32 bit MIDI words directly. This is efficient for transmission, but may not be convenient for storage or processing.

Rich Types

The rich UMP types are full runtime classes, and so have more overhead than the fixed types or raw words. However, they offer conveniences not offered by the other types, including storage of the timestamp, message and packet type enumerations, and interface-based polymorphism. If your send/receive speed is not super critical, these are often the easiest solution.

If you are familiar with the Windows.Devices.Midi message types, these are the conceptual equivalent in UMP.

For the most part, we do not provide strongly-typed discrete message types (like specific MIDI 2.0 Channel Voice messages or similar) in the API as that is a moving target, and many applications also include their own message creation and processing functions using their own libraries or any of the libraries included on https://midi2.dev. If there’s demand for strongly-typed messages, we may provide them in the future.

Fixed-Size Struct type

In addition to the richer types and raw words, the MidiMessageStruct type offers a fixed 128 bit message which can be used to send or receive any type of MIDI UMP.


Table of contents

\ No newline at end of file diff --git a/docs/_site/developer-docs/Windows.Devices.Midi2/metadata/MidiFunctionBlock.html b/docs/_site/developer-docs/Windows.Devices.Midi2/metadata/MidiFunctionBlock.html new file mode 100644 index 00000000..d7bbdce0 --- /dev/null +++ b/docs/_site/developer-docs/Windows.Devices.Midi2/metadata/MidiFunctionBlock.html @@ -0,0 +1 @@ + MidiFunctionBlock | Windows MIDI Services Skip to main content Link Menu Expand (external link) Document Search Copy Copied

MidiFunctionBlock

The original MIDI 2.0 USB specification includes the concept of a Group Terminal Block. After ratification of that specification, it was found that Group Terminal Blocks were insufficient for two main reasons:

  1. Group Terminal Blocks are USB-specific, and so are not available on other transports like Network or Virtual.
  2. Group Terminal Blocks are static, defined in USB descriptors, and so cannot change during runtime.

Group Terminal Blocks are still available, but function blocks are the preferred approach for defining capapbilities of a device. When both are available, you should use the function block information.

A function block represents a function of a MIDI 2.0 device. A function block may span one or more groups, and if not a static function block, those group numbers may change during operation. For example, a Tone Generator function of a device may need 64 channels to represent its multi-timbral nature. One way it can accomplish this is to declare a function block which spans 4 groups, each of which has 16 channels of data (16x4 = 64).

Function blocks also represent the valid groups for communication with an endpoint. If an endpoint declares 4 function blocks, which together cover only group indexes 0-5, and all of those blocks are marked active, only those groups should be available to users of an application. This helps cut down on clutter caused by always displaying 16 groups.

Function blocks have names which should be displayed to the user along with the group numbers. In the end, the actual addressible entity is the endpoint stream with the group number in the Universal MIDI Packet. But the function block provides context for that group number.

Per the specification, function blocks can span more than one group, and can overlap with each other so that different functions can be available on the same group.

Function blocks are used in the Windwos MIDI Services API in three ways:

  1. A property of a MidiEndpointDeviceInformation object, representing function blocks discovered through endpoint discovery. These function blocks are read-only.
  2. The return value of the AsEquivalentFunctionBlock method of the GroupTerminalBlock class. This is a convenience function. These function blocks are read-only
  3. Provided by the application as part of the device definition for a virtual device in app-to-app MIDI. These function blocks are editable before adding them to the device definition.

Properties

Most properties are 1:1 with the MIDI 2.0 UMP specification section on function blocks. We assemble the name for you and map values to enumerations when possible.

Property Description
IsReadOnly True if this function block should be treated as read-only. If you attempt to assign a value to a property in a read-only function block, the assignment will silently fail.
Number The index of the block 0-31. We use “number” here to be consistent with the specification
Name The assembled name of the function block
IsActive True if this block is active
Direction The direction of the block from the block’s point of view.
UIHint A hint which tells you how this block should be treated in a user interface. This should be considered a “soft filter” for display, not a mechanism to keep blocks completely hidden from a user.
Midi10Connection How to treat this block if it is a MIDI 1.0 connection
FirstGroupIndex Zero-based index of the first group spanned by this block.
GroupCount The number of groups spanned.
MidiCIMessageVersionFormat MIDI CI version format value
MaxSystemExclusive8Streams The maximum number of System Exclusive 8 streams allowed. Please refer to the UMP specification for how to treat this value.

Functions

Function Description
MidiFunctionBlock() Construct an empty function block
IncludesGroup(group) Helper function which returns true if this function exists on the supplied group

IDL

MidiFunctionBlock IDL

\ No newline at end of file diff --git a/docs/_site/developer-docs/Windows.Devices.Midi2/metadata/MidiGroupTerminalBlock.html b/docs/_site/developer-docs/Windows.Devices.Midi2/metadata/MidiGroupTerminalBlock.html new file mode 100644 index 00000000..b5a6bf23 --- /dev/null +++ b/docs/_site/developer-docs/Windows.Devices.Midi2/metadata/MidiGroupTerminalBlock.html @@ -0,0 +1 @@ + MidiGroupTerminalBlock | Windows MIDI Services Skip to main content Link Menu Expand (external link) Document Search Copy Copied

MidiGroupTerminalBlock

A Group Terminal Block is a USB-only feature used to describe the groups on a device. When available, Function Blocks are the preferred mechanism for finding active groups, names, and more, meaning that the Group Terminal Block can typically be ignored in those cases. For more context, please see the documentation for the MidiFunctionBlock type.

Note: In Windows MIDI Services, we translate MIDI 1.0 device “ports” into individual Group Terminal Blocks. Each virtual cable number in the stream, which used to become a separate input or output port, now maps to a group number. For example, a 5 port MIDI 1.0 device will now show up as a single endpoint with 5 Group Terminal Blocks each spanning a single group.

Properties

Property Description
Number Block number
Name Name provided by USB. In the case of MIDI 1.0 devices, when available, this is the iJack string
Direction Direction of the block, from the block’s point of view
Protocol Information about the protocol in use. Note that the Jitter Reduction values here should be ignored. Jitter reduction timestamp handling is negotiated through protocol negotiation, and is entirely handled by the service
FirstGroupIndex The index of the first group spanned by this block
GroupCount The number of groups spanned
MaxDeviceInputBandwidthIn4KBitsPerSecondUnits Please see the USB MIDI 2.0 specification for the actual value for this field.
MaxDeviceOutputBandwidthIn4KBitsPerSecondUnits Please see the USB MIDI 2.0 specification for the actual value for this field.
CalculatedMaxDeviceInputBandwidthBitsPerSecond Bits-per-second calculated value for the MaxDeviceInputBandwidthIn4KBitsPerSecondUnits property
CalculatedMaxDeviceOutputBandwidthBitsPerSecond Bits-per-second calculated value for the MaxDeviceOutputBandwidthIn4KBitsPerSecondUnits property

Functions

Function Description
IncludesGroup(group) Helper function which returns true if this function exists on the supplied group
AsEquivalentFunctionBlock() Helper function which returns a MidiFunctionBlock that is approximately equivalent to this MidiGroupTerminalBlock. This is to enable applications to be able to deal with only a single type of block when showing the metadata

IDL

MidiGroupTerminalBlock IDL

\ No newline at end of file diff --git a/docs/_site/developer-docs/Windows.Devices.Midi2/metadata/README.html b/docs/_site/developer-docs/Windows.Devices.Midi2/metadata/README.html new file mode 100644 index 00000000..b3be7896 --- /dev/null +++ b/docs/_site/developer-docs/Windows.Devices.Midi2/metadata/README.html @@ -0,0 +1 @@ + Metadata | Windows MIDI Services Skip to main content Link Menu Expand (external link) Document Search Copy Copied

Metadata

The Windows Service intercepts (but does not remove from the stream) Endpoint metadata notifications. For example, we’ll intercept Endpoint Name notifications and use those to provide a new endpoint-supplied name for the device. These are cached in the SWD properties for the Endpoint Device.

In addition to the endpoint data, we also capture and store block data. The block data should be used by applications to identify which groups are active and how to display them to the user. For example, you may want to display a function block name including group numbers like “Sequencer (Groups 1, 2, 3)” in a way similar to how you treated ports in the past.

Function Blocks and Group Terminal Blocks are important types of MIDI 2.0 metadata which describe an endpoint and so have their own discrete types.


Table of contents

\ No newline at end of file diff --git a/docs/_site/developer-docs/Windows.Devices.Midi2/processing-plugins/IMidiEndpointMessageProcessingPlugin.html b/docs/_site/developer-docs/Windows.Devices.Midi2/processing-plugins/IMidiEndpointMessageProcessingPlugin.html new file mode 100644 index 00000000..1cf8ae60 --- /dev/null +++ b/docs/_site/developer-docs/Windows.Devices.Midi2/processing-plugins/IMidiEndpointMessageProcessingPlugin.html @@ -0,0 +1 @@ + IMidiEndpointMessageProcessingPlugin | Windows MIDI Services Skip to main content Link Menu Expand (external link) Document Search Copy Copied

IMidiEndpointMessageProcessingPlugin

(In progress)

IDL

IMidiEndpointMessageProcessingPlugin IDL

\ No newline at end of file diff --git a/docs/_site/developer-docs/Windows.Devices.Midi2/processing-plugins/MidiChannelEndpointListener.html b/docs/_site/developer-docs/Windows.Devices.Midi2/processing-plugins/MidiChannelEndpointListener.html new file mode 100644 index 00000000..8f869dd0 --- /dev/null +++ b/docs/_site/developer-docs/Windows.Devices.Midi2/processing-plugins/MidiChannelEndpointListener.html @@ -0,0 +1 @@ + MidiChannelEndpointListener | Windows MIDI Services Skip to main content Link Menu Expand (external link) Document Search Copy Copied

MidiChannelEndpointListener

(In progress)

IDL

MidiChannelEndpointListener IDL

\ No newline at end of file diff --git a/docs/_site/developer-docs/Windows.Devices.Midi2/processing-plugins/MidiGroupEndpointListener.html b/docs/_site/developer-docs/Windows.Devices.Midi2/processing-plugins/MidiGroupEndpointListener.html new file mode 100644 index 00000000..9ba3e347 --- /dev/null +++ b/docs/_site/developer-docs/Windows.Devices.Midi2/processing-plugins/MidiGroupEndpointListener.html @@ -0,0 +1 @@ + MidiGroupEndpointListener | Windows MIDI Services Skip to main content Link Menu Expand (external link) Document Search Copy Copied

MidiGroupEndpointListener

(In progress)

IDL

MidiGroupEndpointListener IDL

\ No newline at end of file diff --git a/docs/_site/developer-docs/Windows.Devices.Midi2/processing-plugins/MidiMessageTypeEndpointListener.html b/docs/_site/developer-docs/Windows.Devices.Midi2/processing-plugins/MidiMessageTypeEndpointListener.html new file mode 100644 index 00000000..7bfa1f46 --- /dev/null +++ b/docs/_site/developer-docs/Windows.Devices.Midi2/processing-plugins/MidiMessageTypeEndpointListener.html @@ -0,0 +1 @@ + MidiMessageTypeEndpointListener | Windows MIDI Services Skip to main content Link Menu Expand (external link) Document Search Copy Copied

MidiMessageTypeEndpointListener

(In progress)

IDL

MidiMessageTypeEndpointListener IDL

\ No newline at end of file diff --git a/docs/_site/developer-docs/Windows.Devices.Midi2/processing-plugins/README.html b/docs/_site/developer-docs/Windows.Devices.Midi2/processing-plugins/README.html new file mode 100644 index 00000000..cfa1ec7b --- /dev/null +++ b/docs/_site/developer-docs/Windows.Devices.Midi2/processing-plugins/README.html @@ -0,0 +1 @@ + Client Plugins | Windows MIDI Services Skip to main content Link Menu Expand (external link) Document Search Copy Copied

Client-side Processing Plugins

Connections allocate service resources (time and memory), so we recommend applications maintain only a single connection to an endpoint within any session. But because the new endpoint stream-focused approach aggregates what used to be considered ports, we provide processing plugins to parcel out the incoming messages based on criteria set by the application. In this way, an application can have the logical equivalent of several input ports, without the associated resource usage.

MIDI 1.0 had the concept of ports. Each port was just a single cable/jack from a MIDI stream exposed by the device. The API and driver were responsible for merging all of the different cables into the single stream for outgoing data, or pulling them apart for incoming data.

In MIDI 2.0, what used to be a Port is now morally equivalent to a Group address in the message data. Instead of speaking to N different enumerated entities for a device, the application speaks to a single bidirectional UMP endpoint which aggregates all of this information, much like the driver did behind the scenes in MIDI 1.0. We recognize that there are cases when the old model of MIDI Ports is more convenient for passing around in a DAW or similar app, particularly for incoming data.

To help, there are plugins which implement IMidiEndpointMessageProcessingPlugin. The API includes a few stock plugins, but developers are free to provide their own.

Listener instances are 1:1 with endpoint connections. We don’t support using the same listener on multiple endpoints.


Table of contents

\ No newline at end of file diff --git a/docs/_site/developer-docs/Windows.Devices.Midi2/service/MidiService.html b/docs/_site/developer-docs/Windows.Devices.Midi2/service/MidiService.html new file mode 100644 index 00000000..b3d519a3 --- /dev/null +++ b/docs/_site/developer-docs/Windows.Devices.Midi2/service/MidiService.html @@ -0,0 +1 @@ + MidiService | Windows MIDI Services Skip to main content Link Menu Expand (external link) Document Search Copy Copied

MidiService

The MidiService class contains a number of static functions which enable working with the service outside of a specific session.

Static Functions

Static Function Description
PingService(pingCount) Send one or more ping messages to the ping endpoint and report on the status and time. Return if the responses are not received in a calculated timeout period.
PingService(pingCount, timeoutMilliseconds) Send one or more ping messages to the ping endpoint and report on the status and time. Return if responses are not received in the specified timeout period.
GetInstalledTransportPlugins() Returns a list of MidiServiceTransportPluginInformation representing all service transport plugins (also called Abstractions)
GetInstalledMessageProcessingPlugins() Returns a list of MidiServiceMessageProcessingPluginInformation objects representing all service message processing plugins (also called Transforms)
GetActiveSessions() Returns a list of MidiSessionInformation detailing all active Windows MIDI Services sessions on this PC.
UpdateRuntimeConfiguration(configurationUpdate) Used by client-side SDK components for some transports and other plugins, and by the MIDI Settings app. The format of the data is dependent upon the target specified in the data. Use with caution. For more information, see the config JSON documentation

A note on the ping process

Pinging the Windows service uses the same mechanism as sending any UMP message. The actual message sent is a prioprietary message. (At the time this was created, there was no standard MIDI 2.0 UMP ping message). The message itself is sent to the diagnostics endpoint in the service, which is implemented like any other transport. Therefore, the speed of the pings here and the success of the ping process is a reasonable indicator of service, cross-process queue, and client API health.

The diagnostic ping endpoint does not understand any other type of message, and should not be used by applications other than through the ping functions here.

The ping does not tell you if a specific transport or device is in a bad state. For example, if a specific USB MIDI device has crashed, this ping message will still work because it is not sent out over USB.

Here’s an example of ping responses through the MIDI console app

A note on updating runtime configuration

In order to foster an open plugin ecosystem, we need a way to get settings and configuration for those plugins up to them in the Windows service. The way we’ve chosen to do that is JSON, because that same JSON, when not transient in nature, can also be saved into the permanent configuration file for the active MIDI setup.

The runtime configuration update should only be used by code which understands exactly what will be done with the data, and can handle the response which is returned. It is not a general API endpoint, but is designed for components which will extend Windows MIDI Services.

IDL

MidiService IDL

\ No newline at end of file diff --git a/docs/_site/developer-docs/Windows.Devices.Midi2/service/MidiServiceMessageProcessingPluginInformation.html b/docs/_site/developer-docs/Windows.Devices.Midi2/service/MidiServiceMessageProcessingPluginInformation.html new file mode 100644 index 00000000..e15b9d47 --- /dev/null +++ b/docs/_site/developer-docs/Windows.Devices.Midi2/service/MidiServiceMessageProcessingPluginInformation.html @@ -0,0 +1 @@ + MidiServiceMessageProcessingPluginInformation | Windows MIDI Services Skip to main content Link Menu Expand (external link) Document Search Copy Copied

MidiServiceMessageProcessingPluginInformation

\ No newline at end of file diff --git a/docs/_site/developer-docs/Windows.Devices.Midi2/service/MidiServicePingResponse.html b/docs/_site/developer-docs/Windows.Devices.Midi2/service/MidiServicePingResponse.html new file mode 100644 index 00000000..5fd3e62d --- /dev/null +++ b/docs/_site/developer-docs/Windows.Devices.Midi2/service/MidiServicePingResponse.html @@ -0,0 +1 @@ + MidiServicePingResponse | Windows MIDI Services Skip to main content Link Menu Expand (external link) Document Search Copy Copied

MidiServicePingResponse

This class represents a single ping message response. This is used to assess health and performance of the Windows service.

Static Functions

Property Description
SourceId Id used to track this ping source connection instance, in the case of multiple applications using the same ping endpoint
Index Index of the ping
ClientSendMidiTimestamp The time the client sent the ping message
ServiceReportedMidiTimestamp The time the service reported receiving the ping message
ClientReceiveMidiTimestamp The time the client received the ping response
ClientDeltaTimestamp The delta between the client sending the message and receiving the response

IDL

MidiServicePingResponse IDL

\ No newline at end of file diff --git a/docs/_site/developer-docs/Windows.Devices.Midi2/service/MidiServicePingResponseSummary.html b/docs/_site/developer-docs/Windows.Devices.Midi2/service/MidiServicePingResponseSummary.html new file mode 100644 index 00000000..07fd7900 --- /dev/null +++ b/docs/_site/developer-docs/Windows.Devices.Midi2/service/MidiServicePingResponseSummary.html @@ -0,0 +1 @@ + MidiServicePingResponseSummary | Windows MIDI Services Skip to main content Link Menu Expand (external link) Document Search Copy Copied

MidiServicePingResponseSummary

This class represents a summary of the ping attempts against the Windows service.

Static Functions

Property Description
Success True if the ping was a success
FailureReason In case of a failure, this includes information about why the failure happened.
TotalPingRoundTripMidiClock The total MIDI Clock time for all ping messages to be sent and received
AveragePingRoundTripMidiClock Calculated average round trip time for ping messages
Responses A list of all the responses for the ping messages

IDL

MidiServicePingResponseSummary IDL

\ No newline at end of file diff --git a/docs/_site/developer-docs/Windows.Devices.Midi2/service/MidiServiceTransportPluginInformation.html b/docs/_site/developer-docs/Windows.Devices.Midi2/service/MidiServiceTransportPluginInformation.html new file mode 100644 index 00000000..0d7e932a --- /dev/null +++ b/docs/_site/developer-docs/Windows.Devices.Midi2/service/MidiServiceTransportPluginInformation.html @@ -0,0 +1 @@ + MidiServiceTransportPluginInformation | Windows MIDI Services Skip to main content Link Menu Expand (external link) Document Search Copy Copied

MidiServiceTransportPluginInformation

\ No newline at end of file diff --git a/docs/_site/developer-docs/Windows.Devices.Midi2/service/MidiSessionConnectionInformation.html b/docs/_site/developer-docs/Windows.Devices.Midi2/service/MidiSessionConnectionInformation.html new file mode 100644 index 00000000..fe28c1d5 --- /dev/null +++ b/docs/_site/developer-docs/Windows.Devices.Midi2/service/MidiSessionConnectionInformation.html @@ -0,0 +1 @@ + MidiSessionConnectionInformation | Windows MIDI Services Skip to main content Link Menu Expand (external link) Document Search Copy Copied

MidiSessionConnectionInformation

This class represents an open connection in a Windows MIDI Services session.

Static Functions

Property Description
EndpointDeviceId The endpoint device id for the connection
InstanceCount The number of instances of this connection which are open in the parent session
EarliestConnectionTime The date and time the first instance of the connection was opened

IDL

MidiSessionConnectionInformation IDL

\ No newline at end of file diff --git a/docs/_site/developer-docs/Windows.Devices.Midi2/service/MidiSessionInformation.html b/docs/_site/developer-docs/Windows.Devices.Midi2/service/MidiSessionInformation.html new file mode 100644 index 00000000..14c74243 --- /dev/null +++ b/docs/_site/developer-docs/Windows.Devices.Midi2/service/MidiSessionInformation.html @@ -0,0 +1 @@ + MidiSessionInformation | Windows MIDI Services Skip to main content Link Menu Expand (external link) Document Search Copy Copied

MidiSessionInformation

This class represents an open Windows MIDI Services session.

Static Functions

Property Description
SessionId The generated internal GUID for the session
ProcessId The process id for the session
ProcessName The process name for the session, captured when the session was created
SessionName The name of the session provided through the API
StartTime The date and time the session was created
Connections A list of MidiSessionConnectionInformation objects detailing the connections currently open for this session

IDL

MidiSessionInformation IDL

\ No newline at end of file diff --git a/docs/_site/developer-docs/Windows.Devices.Midi2/service/README.html b/docs/_site/developer-docs/Windows.Devices.Midi2/service/README.html new file mode 100644 index 00000000..e794af76 --- /dev/null +++ b/docs/_site/developer-docs/Windows.Devices.Midi2/service/README.html @@ -0,0 +1 @@ + Service | Windows MIDI Services Skip to main content Link Menu Expand (external link) Document Search Copy Copied

Service

The MidiService class is a utility class which provides access to health and status information related to the MidiSrv Service.


Table of contents

\ No newline at end of file diff --git a/docs/_site/developer-docs/Windows.Devices.Midi2/session/MidiSession.html b/docs/_site/developer-docs/Windows.Devices.Midi2/session/MidiSession.html new file mode 100644 index 00000000..bbeb6bcf --- /dev/null +++ b/docs/_site/developer-docs/Windows.Devices.Midi2/session/MidiSession.html @@ -0,0 +1,6 @@ + MidiSession | Windows MIDI Services Skip to main content Link Menu Expand (external link) Document Search Copy Copied

MidiSession

Before you can connect to an endpoint, you must start a new MIDI session.

An application may have any number of sessions open. For example, the application may open one session per open project, or one session per tab in the case of a browser. The lifetime of endpoint connections opened through a session are controlled through the session.

Properties

Property Description
Id Generated Id for the session
Name Name for this session. To change the name after creating the session, use the UpdateName() function. This will update the service
Settings The settings used to create this session
IsOpen True if this session is open and ready to use
Connections Map of all endpoint connections created through this session. Disconnecting an endpoint using DisconnectEndpointConnection will remove the connection from this map. The map key is the generated connection GUID that identifies an instance of an endpoint connection

Static Member Functions

The two static functions are factory-pattern methods for creating a new session.

Static Function Description
CreateSession(sessionName) Create and return a new session with the specified name
CreateSession(sessionName, settings) Create and return a new session with the specified name and settings

Functions

Function Description
CreateEndpointConnection(endpointDeviceId) Create a new connection to the specified endpoint device Id
CreateEndpointConnection(endpointDeviceId, options) Create a new connection to the specified endpoint device Id, using the provided connection options
CreateEndpointConnection(endpointDeviceId, options, settings) Create a new connection to the specified endpoint device Id, using the provided connection options and the endpoint-specific settings
CreateVirtualDeviceAndConnection(deviceDefinition) Create the device-side of an app-to-app virtual endpoint. The calling application will perform as a MIDI device, responding to discovery and other MIDI 2.0 protocol messages.
DisconnectEndpointConnection(endpointConnectionId) Cleanly disconnect an endpoint connection and remove it from the connection map
UpdateName(newName) Update the name of this session locally and in the MIDI Service

Note: If you manually close a MidiEndpointConnection using IClosable (or IDisposable), it will not be removed from the MidiSession’s collection of endpoints. Instead, use the DisconnectEndpointConnection method of the session to keep both in sync. For that reason, we do not recommend that you wrap the CreateEndpointConnection calls in a using statement.

IDL

MidiSession IDL

Sample

using (var session = MidiSession.CreateSession("API Sample Session"))
+{
+    ...
+}
+
+
\ No newline at end of file diff --git a/docs/_site/developer-docs/Windows.Devices.Midi2/session/MidiSessionSettings.html b/docs/_site/developer-docs/Windows.Devices.Midi2/session/MidiSessionSettings.html new file mode 100644 index 00000000..c1701546 --- /dev/null +++ b/docs/_site/developer-docs/Windows.Devices.Midi2/session/MidiSessionSettings.html @@ -0,0 +1 @@ + MidiSessionSettings | Windows MIDI Services Skip to main content Link Menu Expand (external link) Document Search Copy Copied

MidiSessionSettings

MidiSessionSettings are currently unused. We are evaluating keeping this in the API.

IDL

MidiSessionSettings IDL

\ No newline at end of file diff --git a/docs/_site/developer-docs/Windows.Devices.Midi2/session/README.html b/docs/_site/developer-docs/Windows.Devices.Midi2/session/README.html new file mode 100644 index 00000000..908b0907 --- /dev/null +++ b/docs/_site/developer-docs/Windows.Devices.Midi2/session/README.html @@ -0,0 +1 @@ + Session | Windows MIDI Services Skip to main content Link Menu Expand (external link) Document Search Copy Copied

Session

Interaction with a MIDI Endpoint always starts with creating a session.


Table of contents

\ No newline at end of file diff --git a/docs/_site/developer-docs/Windows.Devices.Midi2/simple-types/MidiChannel.html b/docs/_site/developer-docs/Windows.Devices.Midi2/simple-types/MidiChannel.html new file mode 100644 index 00000000..4d6fadda --- /dev/null +++ b/docs/_site/developer-docs/Windows.Devices.Midi2/simple-types/MidiChannel.html @@ -0,0 +1 @@ + MidiChannel | Windows MIDI Services Skip to main content Link Menu Expand (external link) Document Search Copy Copied

MidiChannel

The MidiChannel class is used to provide formatting and data validation for MIDI 1.0 and MIDI 2.0 channels.

Properties

Property Description
Index The data value, or channel Index (0-15)
NumberForDisplay The number that should be displayed in any UI. (1-16)

Static Properties

Static Property Description
LabelShort Returns the localized abbreviation. For example, “Ch” in English.
LabelFull Returns the localized full name. For example, “Channel” in English.

Functions

Function Description
MidiChannel() Constructs an empty MidiChannel
MidiChannel(index) Constructs a MidiChannel with the specified index

Static Functions

Static Function Description
IsValidChannelIndex(index) Verifies that the provided index is valid (between 0 and 15)

MidiChannel IDL

\ No newline at end of file diff --git a/docs/_site/developer-docs/Windows.Devices.Midi2/simple-types/MidiGroup.html b/docs/_site/developer-docs/Windows.Devices.Midi2/simple-types/MidiGroup.html new file mode 100644 index 00000000..1a78eff9 --- /dev/null +++ b/docs/_site/developer-docs/Windows.Devices.Midi2/simple-types/MidiGroup.html @@ -0,0 +1 @@ + MidiGroup | Windows MIDI Services Skip to main content Link Menu Expand (external link) Document Search Copy Copied

MidiGroup

The MidiGroup class is used to provide formatting and data validation for UMP (Universal MIDI Packet) groups.

Properties

Property Description
Index The data value, or group Index (0-15)
NumberForDisplay The number that should be displayed in any UI. (1-16)

Static Properties

Static Property Description
LabelShort Returns the localized abbreviation. For example, “Gr” in English.
LabelFull Returns the localized full name. For example, “Group” in English.

Functions

Function Description
MidiGroup() Constructs an empty MidiGroup
MidiGroup(index) Constructs a MidiGroup with the specified index

Static Functions

Static Function Description
IsValidGroupIndex(index) Verifies that the provided index is valid (between 0 and 15)

MidiGroup IDL

\ No newline at end of file diff --git a/docs/_site/developer-docs/Windows.Devices.Midi2/simple-types/MidiUniqueId.html b/docs/_site/developer-docs/Windows.Devices.Midi2/simple-types/MidiUniqueId.html new file mode 100644 index 00000000..837ac6e0 --- /dev/null +++ b/docs/_site/developer-docs/Windows.Devices.Midi2/simple-types/MidiUniqueId.html @@ -0,0 +1 @@ + MidiUniqueId | Windows MIDI Services Skip to main content Link Menu Expand (external link) Document Search Copy Copied

MidiUniqueId

The MidiUniqueId class is used to provide formatting and data validation for MIDI-CI MUID types used in Function Blocks and MIDI CI transactions.

In the specification, Byte1 is the LSB and Byte4 is the MSB. We follow that convention here.

Properties

Property Description
Byte1 The data value for byte 1 of the MUID
Byte2 The data value for byte 2 of the MUID
Byte3 The data value for byte 3 of the MUID
Byte4 The data value for byte 4 of the MUID
As28BitInteger The data value converted to a 28 bit integer
IsBroadcast True if this is the broadcast MUID value
IsReserved True if this is the reserved MUID value

Static Properties

Static Property Description
LabelShort Returns the localized abbreviation.
LabelFull Returns the localized full name.

Functions

Function Description
MidiUniqueId() Constructs an empty MidiUniqueId
MidiUniqueId(integer28bit) Constructs the MidiUniqueId from the given 28 bit integer
MidiUniqueId(byte1, byte2, byte3, byte4) Constructs a MidiUniqueId with the specified bytes

Static Functions

Function Description
CreateBroadcast() Constructs a broadcast MidiUniqueId
CreateRandom() Constructs a random MidiUniqueId

MidiUniqueId IDL

\ No newline at end of file diff --git a/docs/_site/developer-docs/Windows.Devices.Midi2/simple-types/README.html b/docs/_site/developer-docs/Windows.Devices.Midi2/simple-types/README.html new file mode 100644 index 00000000..c90b416e --- /dev/null +++ b/docs/_site/developer-docs/Windows.Devices.Midi2/simple-types/README.html @@ -0,0 +1 @@ + Simple Types | Windows MIDI Services Skip to main content Link Menu Expand (external link) Document Search Copy Copied

Simple Types

There are several simple or basic types used in Windows MIDI Services. These types provide formatting and validation to help ensure applications display data in similar ways.


Table of contents

\ No newline at end of file diff --git a/docs/_site/developer-docs/Windows.Devices.Midi2/virtual-device/MidiStreamConfigurationRequestReceivedEventArgs.html b/docs/_site/developer-docs/Windows.Devices.Midi2/virtual-device/MidiStreamConfigurationRequestReceivedEventArgs.html new file mode 100644 index 00000000..fcebf9ca --- /dev/null +++ b/docs/_site/developer-docs/Windows.Devices.Midi2/virtual-device/MidiStreamConfigurationRequestReceivedEventArgs.html @@ -0,0 +1 @@ + MidiStreamConfigurationRequestReceivedEventArgs | Windows MIDI Services Skip to main content Link Menu Expand (external link) Document Search Copy Copied

MidiStreamConfigurationRequestReceivedEventArgs

(in development)

IDL

MidiStreamConfigurationRequestReceivedEventArgs IDL

\ No newline at end of file diff --git a/docs/_site/developer-docs/Windows.Devices.Midi2/virtual-device/MidiVirtualEndpointDevice.html b/docs/_site/developer-docs/Windows.Devices.Midi2/virtual-device/MidiVirtualEndpointDevice.html new file mode 100644 index 00000000..7d8ad168 --- /dev/null +++ b/docs/_site/developer-docs/Windows.Devices.Midi2/virtual-device/MidiVirtualEndpointDevice.html @@ -0,0 +1 @@ + MidiVirtualEndpointDevice | Windows MIDI Services Skip to main content Link Menu Expand (external link) Document Search Copy Copied

MidiVirtualEndpointDevice

The MidiVirtualEndpointDeviceDefinition class specifies, in an easy to use format, the responses for discovery and protocol negotiation, as well as the properties to use when constructing the device endpoint.

Properties

Property Description
DeviceDefinition The MidiVirtualEndpointDeviceDefinition used to create this device. This should be treated as read-only data.
FunctionBlocks Current list of function blocks for this device.
SuppressHandledMessages True if the protocol messages handled by this class should be filtered out of the incoming message stream

Functions

Function Description
UpdateFunctionBlock Update the properties of a single function block. The number of actual function blocks cannot change after creation (per the UMP specification) but blocks may be marked as active or inactive. Changes here will result in the MIDI 2.0 function block notification messages being sent out.
UpdateEndpointName Update the endpoint name, and send out the appropriate endpoint name notification messages.

Events

Event Description
StreamConfigurationRequestReceived(device, args) Raised when this device receives a Stream Configuration Request UMP message.

IDL

MidiVirtualEndpointDevice IDL

\ No newline at end of file diff --git a/docs/_site/developer-docs/Windows.Devices.Midi2/virtual-device/MidiVirtualEndpointDeviceDefinition.html b/docs/_site/developer-docs/Windows.Devices.Midi2/virtual-device/MidiVirtualEndpointDeviceDefinition.html new file mode 100644 index 00000000..3dbdaf27 --- /dev/null +++ b/docs/_site/developer-docs/Windows.Devices.Midi2/virtual-device/MidiVirtualEndpointDeviceDefinition.html @@ -0,0 +1 @@ + MidiVirtualEndpointDeviceDefinition | Windows MIDI Services Skip to main content Link Menu Expand (external link) Document Search Copy Copied

MidiVirtualEndpointDeviceDefinition

The MidiVirtualEndpointDeviceDefinition class specifies, in an easy to use format, the responses for discovery and protocol negotiation, as well as the properties to use when constructing the device endpoint.

Properties

Property Description
EndpointName Name of the endpoint used for both the device enumeration and for responding to the endpoint name request UMP message
EndpointProductInstanceId The unique identifier for this device. This value is used when creating the device Id, and is also used as the response for endpoint discovery when the id is requested. In general, this value should be kept to less than 32 characters and not include any special characters or symbols
SupportsMidi1ProtocolMessages For endpoint discovery. True if this endpoint supports MIDI 1.0 protocol messages over UMP
SupportsMidi2ProtocolMessages For endpoint discovery. True if this endpoint supports MIDI 2.0 protocol messages over UMP
SupportsReceivingJRTimestamps For endpoint discovery. True if this endpoint supports recieving JR timestamps (typically, you’ll want to set this to false)
SupportsSendingJRTimestamps For endpoint discovery. True if this endpoint supports sending JR timestamps (typically, you’ll want to set this to false)
DeviceManufacturerSystemExclusiveId MIDI 2.0 UMP Device Identity value
DeviceFamilyLsb MIDI 2.0 UMP Device Identity value
DeviceFamilyMsb MIDI 2.0 UMP Device Identity value
DeviceFamilyModelLsb MIDI 2.0 UMP Device Identity value
DeviceFamilyModelMsb MIDI 2.0 UMP Device Identity value
SoftwareRevisionLevel MIDI 2.0 UMP Device Identity value
AreFunctionBlocksStatic True if the function blocks will not change in any way
FunctionBlocks list of function blocks for this device

Functions

Function Description
MidiVirtualEndpointDeviceDefinition() Construct a new device definition

IDL

MidiVirtualEndpointDeviceDefinition IDL

\ No newline at end of file diff --git a/docs/_site/developer-docs/Windows.Devices.Midi2/virtual-device/README.html b/docs/_site/developer-docs/Windows.Devices.Midi2/virtual-device/README.html new file mode 100644 index 00000000..18baa442 --- /dev/null +++ b/docs/_site/developer-docs/Windows.Devices.Midi2/virtual-device/README.html @@ -0,0 +1 @@ + Virtual Devices | Windows MIDI Services Skip to main content Link Menu Expand (external link) Document Search Copy Copied

Virtual Devices

Fully-featured app-to-app MIDI in a MIDI 2.0 world involves connections to a virtual device which must participate in the full MIDI 2.0 protocol, from discovery through protocol negotiation. To support this scenario, the way app-to-app MIDI works in Windows MIDI Services is for an application to define a device and then using the MidiSession, construct that device’s endpoint. Once the device endpoint is opened, Windows MIDI Services will then construct a second application-visible multi-client endpoint which applications will use to talk to the device app.

During that conversation, the service will also handle discovery and protocol negotiation with the virtual device just like it would any physical device.

In addition to the service component, it is implemented in the client API as a type of Client-SIde Processing Plugin


Table of contents

\ No newline at end of file diff --git a/docs/_site/developer-docs/best-practices.html b/docs/_site/developer-docs/best-practices.html new file mode 100644 index 00000000..32839f7d --- /dev/null +++ b/docs/_site/developer-docs/best-practices.html @@ -0,0 +1,5 @@ + Best Practices | Windows MIDI Services Skip to main content Link Menu Expand (external link) Document Search Copy Copied

Best Practices and Performance Optimizations

Here’s a list of best practices and performance optimizations for MIDI API-consuming applications.

Fast transmission of messages

For maximum compatibility across languages, and for safety, WinRT doesn’t allow pointers to be exposed by any properties or as parameters or return types for any function. In addition, the by-value and by-reference semantics for parameters are not always under the control of the API developer.

For those reasons, and to maximize ease of use across a number of languages and use-cases, we have multiple ways to send and receive messages.

You will want to do your own performance testing from your application and scenarios, but in general, the send/receives with the least overhead are those which send/receive individual 32 bit words, a single 128 bit structure, or the IMemoryBuffer. The word and struct methods do pass copies of data, but the amount of data, for most time critical messages, is still 64 bits or less (MIDI 1.0 channel voice messages are 32 bits, MIDI 2.0 channel voice messages are 64 bits).

The IMemoryBuffer approach is a more advanced way to transfer data to and from the API. This wraps a buffer of data which you can reuse between calls, including send/receive, as long as you manage and avoid any potential overlaps. Internally, the COM types used to access this ensures that only pointers are passed into the API. There’s a bit more ceremony to using this approach, so we recommend investing time there only if it better fits your app’s programming model. In addition, because IMemoryBuffer deals with bytes and not 32 bit words, you need to ensure you are correctly copying the data in, following the endianness rules for our internal MIDI 2.0 data representation.

The most flexible, but least performant approach, is to use the IMidiMessage interface and the methods which return strongly typed messages. These do involve additional type allocations either on the part of the caller or in the API code.

Data copies

In the underlying implementation, copying of data is unavoidable in places. Here are the main places where it happens.

When sending messages

  1. The individual WinRT projection for your language may enforce a copy or translation of the data going into the API. This varies. Arrays, in particular, vary here.
  2. The API copies the data (typically a memcpy), regardless of how it is provided, into the cross-process queue for that client endpoint connection. This is shared cross-process memory on Windows. It’s also a circular queue, so we can’t hold onto pointers for long, which is why 4 below operates how it does.
  3. On the service side, the pointers into the buffer are provided to the client connection and the plugins in that chain. No copying here.
  4. There will be copies of the data created if there are any processing plugins which must significantly manipulate the data (each plugin decides how it deals with the data), or if you schedule the message to be sent in the future (see 2 above).
  5. Finally, the messages may be copied when being supplied to the transport. In the case of USB, we make a call into a kernel driver, so have another cross process queue for that which requires we copy data into it to supply it to the driver. In the case of networking, we have to copy the data into the network buffers and transmit. In app-to-app / virtual MIDI, and also the built-in loopback endpoints, we typically just send the same message pointers through the entire process and do not copy any data in the transport.

This code is all quite efficient, and the amount of data in a single message is small, so these happen quite quickly. Nevertheless, we’re always looking at places where we can further optimize, but still retain the flexibility provided by having a Windows Service which processes the messages.

When receiving messages, the process is almost exactly the opposite of sending. There’s no in-bound message scheduling, but there may be data transformations that plugins perform. In addition, endpoints with multiple clients connected do require fanning out those messages into multiple queues, resulting in multiple copies across the different cross-process inbound client connection queues. That is a small price to pay for full multi-client MIDI support.

Displaying connections to your app users

Most apps need to display device and endpoint connection information to their users. Here are some details related to that.

Use the MidiEndpointDeviceWatcher to respond to device changes

MIDI devices come and go based on connecting/disconnecting USB cables, or new network endpoints coming online. In addition, properties like Function Blocks and Endpoint Name are subject to change at any time. Use the MidiEndpointDeviceWatcher class on a background thread to monitor these endpoints, and receive notifications when anything changes. This is a much more robust approach vs simply enumerating a snapshot of devices up-front.

There’s no API or service reason to require a customer to reboot or reload a MIDI DAW or other application to see newly added endpoints.

Don’t include diagnostics endpoints for most apps

Unless the app is a utility / testing app, we recommend you do not display the UMP Loopback Endpoints to the user. These are for diagnostics and testing only. By default, they are excluded during enumeration.

Enable drill-down into Groups (functions)

A single function block may exist on multiple groups, and multiple groups may overlap function blocks. That is the nature of the MIDI 2.0 specification. In most cases, you’ll find that a function is associated with one or more groups and those groups do not span other function blocks.

We recommend that, when displaying a connection to the user, you connect them to the UMP Endpoint, but then enable some sort of drill-down to show the function block names and their associated groups.

SynthCompany Foo Synth 5
+- Synthesizer (Groups 1, 2, 3)
+- Sequencer (Groups 4, 5)
+- MIDI DIN Out (Group 6)
+

Or similar based on the conventions of your application.

Note that a flat list, like what many apps used for MIDI 1.0 ports, is not as reasonable in a MIDI 2.0 world.

Use the Function Block UI Hint to help you decide how to show functions

The UI Hint property of a Function Block was created to give the UI an indication of the intended direction of communication, as a user would see it, for a function block. This shouldn’t necessarily block functions from showing up in a list that contains, for example, input devices, but it may be that you want to prioritize the ones with an appropriate UI hint, and have a “see all” option or similar to display the rest.

Prefer not mixing legacy APIs and Windows MIDI Services in the same session

There’s nothing technically preventing you from using winmm or WinRT MIDI 1.0 in the same application, at the same time as the new API, but there’s also no need to beyond transitioning code. The new API will do everything the old does, plus a lot more. The older APIs don’t have access to a lot of the metadata you’ll need for devices, and in the case of MIDI 2.0 endpoints, will require additional message translation in the service.

Of course, offering a choice between Windows MIDI Services and an older API in your application is perfectly acceptable, based on your use cases, and which versions of the operating systems you need to support.

\ No newline at end of file diff --git a/docs/_site/developer-docs/consuming-midi-api.html b/docs/_site/developer-docs/consuming-midi-api.html new file mode 100644 index 00000000..714eaf7c --- /dev/null +++ b/docs/_site/developer-docs/consuming-midi-api.html @@ -0,0 +1,163 @@ + Consuming the MIDI API | Windows MIDI Services Skip to main content Link Menu Expand (external link) Document Search Copy Copied

Consuming the Windows MIDI Services API

The Windows MIDI Services API is built using C++/WinRT. WinRT, a requirement for modern APIs on Windows, enables desktop applications, regardless of language, to be able to use APIs, SDKs, etc. that we create. The older tools, C++/CX, are arguably simpler to implement in, but because they include proprietary extensions to C++, we decided to go with standards-based C++/WinRT instead.

Prerequisites

To use the API, your application language and tools must be able to work with WinRT metadata and libraries, or the generated projection header file.

  • Visual Studio 2022+ if you are using Visual Studio
  • Windows SDK 10.0.20348 (Install with Visual Studio)
  • Windows 10 22H2, or preferably, the latest version of Windows 11. Our development machines are all running Windows 11.
  • C++ 17 (C++ 20 may work, C++ 14 will not)
  • The NuGet package(s) from the release

Note that there are somewhat hacky ways to get traditional C to work with the COM interfaces, but it is a ton of work for you, and is not a scenario we support. If you find yourself in that situation, I recommend factoring out the MIDI code into its own lib and encapsulating all the C++ calls in there.

NOTE: In the period of time before Windows MIDI Services ships in Windows, you will also need to run the latest Windows 11 Insider Canary build of Windows in order to be able to use the USB MIDI 2.0 driver. Click here to learn more and join the Windows Insider Program.

CPU Architecture: The public GitHub releases currently support Intel/AMD x64 only. Our internal builds and in-box release support x64 as well as Arm64. There is no planned support for Arm(32) or x86. We only support 64 bit applications.

Consuming from C++ with Visual Studio

Add the C++/WinRT Nuget package to your C++ project in Visual Studio. This installs the required tools and build process. See the C++/WinRT FAQ link below for using LLVM/Clang. Note that the Windows MIDI Services team does not provide any support for LLVM/Clang, but we will take PRs as required if we need to change something reasonable to ensure you are successful with those tools, within what C++/WinRT can support.

In your project, set your target and minimum SDK versions to 10.0.20348.0

Download the NuGet package for the Core SDK

  • Until this is published on NuGet.org, you’ll need to set up a local package repository. This is easy to do inside the NuGet Package Manager in Visual Studio. You simply point to a folder. The structure I use in the local clone of the repo is a subfolder of the release folder for all NuGet packages. Specifically D:\peteb\Documents\GitHub\microsoft\midi\build\release\NuGet\

If needed, modify the project file as required (info in the C++/WinRT docs, and you can also look at the sample application code). If you are not using Visual Studio as your toolchain for your project, you may want to pull out the MIDI code into a library in your project which does. It’s not strictly required, but it’s much easier to use C++/WinRT. (If you do not want to do this, you’ll need to manually set up the cppwinrt tools as part of your build process to generate the required Windows.Devices.Midi2.h projection header. After that, you can develop using your normal flow.).

Read through this page, specifically the “If the API is implemented in a Windows Runtime component”.

After that, you reference the types as you would anything else in C++. Only the toolchain is an extra step. What it produces is standard C++. We’re considering what we can do here to possibly eliminate even that step in the future, but it’s required for now.

When in doubt, REbuild your project. C++/WinRT does a lot of code generation for the projections.

Consuming from C# Desktop App

Your project will currently need to target .NET 7 or above. We prefer .NET 8.

Releases will eventually be in the official NuGet.org package source. For now, you can create a local package source and place the NuGet package in there. Then add it to your package sources in the NuGet Package Manager in Visual Studio.

The package contains the .NET (C#) projection for .NET 7 and .NET 8. You will still need to install the C#/WinRT NuGet package in your project because we use other Windows SDK types from Windows.Foundation and more.

Note that other .NET languages (like Visual Basic) may work, but have not been tested.

Consuming from C# UWP

Support for this is not yet in place. We are evaluating the need for UWP support. Our top priority is desktop application support.

Consuming from Rust / RS WinRT

We will provide more information in the future. However, you will follow a similar approach to C++ using windows-rs instead of C++/WinRT. Note that the Rust WinRT tools are newer and are still in active development. Supporting non-Windows SDK winmd files is or will be supported, but is not intuitive at the moment. There is no existing crate for Windows MIDI Services right now.

Consuming from C++ without Visual Studio (using cmake or other tools)

The C++/WinRT tool cppwinrt.exe will generate a standard C++ 17 header file Windows.Devices.Midi2.h which you can pull in and include in your project. The header file projections for WinRT types outside of Windows::Devices::Midi2 are included with the Windows SDK. When we ship Windows MIDI Services in-box in Windows, this API will be projected in the same way as all the others in the Windows SDK.

First, install the Windows SDK. You can get the SDK from the Windows Dev Center

The SDK install includes the cppwinrt.exe tool. For the 10.0.22621.0 version of the SDK, it is found here on my PC: C:\Program Files (x86)\Windows Kits\10\bin\10.0.22621.0\x64 and C:\Program Files (x86)\Windows Kits\10\bin\10.0.22621.0\arm64 . Pick the version appropriate for your development PC architecture.

Normally, all SDK header files, on my PC with the 10.0.22621.0 version of the SDK installed, are located here C:\Program Files (x86)\Windows Kits\10\Include\10.0.22621.0\cppwinrt\winrt

Generating the Projection Headers

The tool produces the header files from from the .winmd file. This file can be found with the developer release of Windows MIDI Services either as a separate download in the release, or by opening the NuGet package (it’s just a zip file) and pulling it from there. The .winmd file is just metadata about the implementation dll.

C:\demos\cppwinrt>dir
+ Volume in drive C has no label.
+ Volume Serial Number is 0AEC-1038
+
+ Directory of C:\demos\cppwinrt
+
+11/09/2023  02:21 PM    <DIR>          .
+11/09/2023  02:20 PM    <DIR>          ..
+11/06/2023  08:48 PM            55,808 Windows.Devices.Midi2.winmd
+               1 File(s)         55,808 bytes
+               2 Dir(s)  32,987,725,824 bytes free
+
+C:\demos\cppwinrt>
+
+C:\demos\cppwinrt>set cppwinrt="C:\Program Files (x86)\Windows Kits\10\bin\10.0.22621.0\x64\cppwinrt.exe"
+
+C:\demos\cppwinrt>%cppwinrt% -input Windows.Devices.Midi2.winmd -reference 10.0.20348.0+ -output .\projection
+
+C:\demos\cppwinrt>dir /s
+ Volume in drive C has no label.
+ Volume Serial Number is 0AEC-1038
+
+ Directory of C:\demos\cppwinrt
+
+11/09/2023  02:26 PM    <DIR>          .
+11/09/2023  02:20 PM    <DIR>          ..
+11/09/2023  02:26 PM    <DIR>          projection
+11/06/2023  08:48 PM            55,808 Windows.Devices.Midi2.winmd
+               1 File(s)         55,808 bytes
+
+ Directory of C:\demos\cppwinrt\projection
+
+11/09/2023  02:26 PM    <DIR>          .
+11/09/2023  02:26 PM    <DIR>          ..
+11/09/2023  02:26 PM    <DIR>          winrt
+               0 File(s)              0 bytes
+
+ Directory of C:\demos\cppwinrt\projection\winrt
+
+11/09/2023  02:26 PM    <DIR>          .
+11/09/2023  02:26 PM    <DIR>          ..
+11/09/2023  02:26 PM    <DIR>          impl
+11/09/2023  02:26 PM           349,214 Windows.Devices.Midi2.h
+               1 File(s)        349,214 bytes
+
+ Directory of C:\demos\cppwinrt\projection\winrt\impl
+
+11/09/2023  02:26 PM    <DIR>          .
+11/09/2023  02:26 PM    <DIR>          ..
+11/09/2023  02:26 PM           155,054 Windows.Devices.Midi2.0.h
+11/09/2023  02:26 PM            22,170 Windows.Devices.Midi2.1.h
+11/09/2023  02:26 PM            26,886 Windows.Devices.Midi2.2.h
+               3 File(s)        204,110 bytes
+
+     Total Files Listed:
+               5 File(s)        609,132 bytes
+              11 Dir(s)  32,988,221,440 bytes free
+
+C:\demos\cppwinrt>
+

The minimum SDK to build against is 10.0.20348.0, to support Windows 10. If you get a “Mismatched C++/WinRT headers” message, you can change the version in the command line to be the version of the SDK you downloaded. Typically, that is not necessary as long as you use the version of cppwinrt.exe from the same SDK root location where you reference the SDK headers from.

Using the Projection

Once you have the header file referenced, you can use the same sample code used in the C++/WinRT examples. Note that the generated projection header takes care of referencing dependencies from the generated files and from the SDK. You will need to ensure that referenced tree of files is part of your build process by having the correct include path for the generated files and the SDK headers. NOTE: don’t use my example below. That is subject to change. Use what is actually generated.

// WARNING: Please don't edit this file. It was generated by C++/WinRT v2.0.220110.5
+
+#pragma once
+#ifndef WINRT_Windows_Devices_Midi2_H
+#define WINRT_Windows_Devices_Midi2_H
+#include "winrt/base.h"
+static_assert(winrt::check_version(CPPWINRT_VERSION, "2.0.220110.5"), "Mismatched C++/WinRT headers.");
+#define CPPWINRT_VERSION "2.0.220110.5"
+#include "winrt/Windows.Devices.h"
+#include "winrt/impl/Windows.Data.Json.2.h"
+#include "winrt/impl/Windows.Devices.Enumeration.2.h"
+#include "winrt/impl/Windows.Devices.Midi.2.h"
+#include "winrt/impl/Windows.Foundation.2.h"
+#include "winrt/impl/Windows.Foundation.Collections.2.h"
+#include "winrt/impl/Windows.Devices.Midi2.2.h"
+...
+

Note: As of the time of this writing, the generated projections are compatible with C++/17. [They are not compatible with C++/20]https://github.com/microsoft/cppwinrt/issues/1322(). This issue is out of the control of the MIDI project.

GCC Support

We haven’t tried it ourselves, but C++/WinRT does appear to be compatible with GCC. See this pull request from 2022.

Consuming from NodeJS / Electron

We are investigating projection support for node.js / Electron. We have a prelimary version working. In that version, the code to enumerate endpoints and then send messages in a loop looks like this:

function createWindow () {
+    const mainWindow = new BrowserWindow({
+      width: 800,
+      height: 600,
+      webPreferences: {
+        preload: path.join(__dirname, 'preload.js')
+      }      
+    })
+  
+    mainWindow.loadFile('index.html')
+
+    // Enumerate endpoints
+    const endpoints = midi2.MidiEndpointDeviceInformation.findAll(
+        midi2.MidiEndpointDeviceInformationSortOrder.name, 
+        midi2.MidiEndpointDeviceInformationFilter.includeDiagnosticLoopback +
+            midi2.MidiEndpointDeviceInformationFilter.includeClientUmpNative +
+            midi2.MidiEndpointDeviceInformationFilter.includeClientByteStreamNative);
+
+
+    console.log(endpoints);
+
+    for (var i = 0; i < endpoints.size; i++)
+    {
+        var endpoint = endpoints.getAt(i);
+
+        console.log(endpoint.id);
+        console.log(endpoint.deviceInstanceId);
+        console.log(endpoint.name);
+        console.log(endpoint.description);
+        console.log(endpoint.transportMnemonic);
+        console.log("------------------------------------------------");
+        console.log("");
+
+    }
+
+    const loopbackAId = midi2.MidiEndpointDeviceInformation.diagnosticsLoopbackAEndpointId;
+    const loopbackBId = midi2.MidiEndpointDeviceInformation.diagnosticsLoopbackBEndpointId;
+
+    // create a new session
+    var session = midi2.MidiSession.createSession("Electron Test Session");
+
+    // connect to loopback A
+    var sendConnection = session.createEndpointConnection(loopbackAId);
+
+    // connection needs to be opened before it is used
+    sendConnection.open();
+
+    // send messages out to that endpoint
+    for (var j = 0; j < 1000; j++)
+    {
+        sendConnection.sendMessageWords(midi2.MidiClock.now, 0x48675309, 0xDEADBEEF);
+    }
+
+    session.close();
+  }
+

You can see it’s very similar to the code for other languages like C# and C++.

Here’s what the output looked like in the initial test. I also had a midi.exe console running and all 1000 messages were received.

C:\demos\node-midi\electron-midi>npm start
+
+> electron-midi@1.0.0 start
+> electron .
+
+
+Windows::Foundation::Collections:IVectorView {
+  __winRtInstance__: true
+}
+\\?\SWD#MIDISRV#MIDIU_DIAG_LOOPBACK_A#{e7cce071-3c03-423f-88d3-f1045d02552b}
+SWD\MIDISRV\MIDIU_DIAG_LOOPBACK_A
+Diagnostics Loopback A
+Diagnostics loopback endpoint. For testing purposes.
+DIAG
+------------------------------------------------
+
+\\?\SWD#MIDISRV#MIDIU_DIAG_LOOPBACK_B#{e7cce071-3c03-423f-88d3-f1045d02552b}
+SWD\MIDISRV\MIDIU_DIAG_LOOPBACK_B
+Diagnostics Loopback B
+Diagnostics loopback endpoint. For testing purposes.
+DIAG
+------------------------------------------------
+
+\\?\SWD#MIDISRV#MIDIU_KS_BIDI_14488056966904779946_OUTPIN.0_INPIN.1#{e7cce071-3c03-423f-88d3-f1045d02552b}
+SWD\MIDISRV\MIDIU_KS_BIDI_14488056966904779946_OUTPIN.0_INPIN.1
+UM-ONE
+
+KS
+------------------------------------------------
+
+
+C:\demos\node-midi\electron-midi>
+

Flutter / Dart

Once the API is in-box on Windows, it will be possible for the projections to be generated by the Flutter/Dart teams, like they do with the Windows SDK today.

Webview2 Hosted / PWA

We are investigating.

Python

Once the API is in the Windows SDK, tools like PyWinRT can be used to create projections.

\ No newline at end of file diff --git a/docs/_site/developer-docs/diagnostic-endpoints.html b/docs/_site/developer-docs/diagnostic-endpoints.html new file mode 100644 index 00000000..6aca6ec7 --- /dev/null +++ b/docs/_site/developer-docs/diagnostic-endpoints.html @@ -0,0 +1,4 @@ + Diagnostics Endpoints | Windows MIDI Services Skip to main content Link Menu Expand (external link) Document Search Copy Copied

MIDI Diagnostic Endpoints

Windows MIDI Services comes with three diagnostic endpoints, two of which are there for application development, testing, and debugging.

Loopbacks A and B

Windows MIDI Services comes with two loopback endpoints which are always present if the Windows service is running. These cannot be turned off by applications or configuration, and so may be relied upon by customer support, unit tests, and more.

The Endpoint Device Ids are available as static members of the MidiEndpointDeviceInformation class

winrt::hstring MidiEndpointDeviceInformation::DiagnosticsLoopbackAEndpointId();
+winrt::hstring MidiEndpointDeviceInformation::DiagnosticsLoopbackBEndpointId();
+

By default, these endpoints are not returned by enumeration calls, because most applications would not want to present them to the user. However, you can include them in the MidiEndpointDeviceInformation::FindAll and MidiEndpointDeviceWatcher::CreateWatcher device filters by using the MidiEndpointDeviceInformationFilter enum value IncludeDiagnosticLoopback if your application has a diagnostic need for them.

MidiEndpointDeviceInformationFilter::IncludeDiagnosticLoopback
+

Diagnostic Loopback Endpoints A and B are cross-wired so that any message sent out on loopback A will come in on loopback B, and any message sent out on B will come in on A. In this way, the loopbacks function as a global app-to-app MIDI implementation for testing.

Note that there is only one instance of each endpoint in the system, so if multiple applications use the loopback, the messages will get mixed together like any other endpoint.

TIP: The Diagnostic Loopback Endpoints are in place for testing and development only. Applications should not present them to users, or use them for communication outside of testing and debugging. Don’t expose the diagnostic loopback endpoints as part of the list of endpoints in a production DAW application.

Special Timestamp Behavior

Normally, an incoming MIDI message will receive a new timestamp when it first arrives from a remote endpoint. In this way, you know exactly when the Windows service first “saw” the message.

The loopback endpoints are special-cased so that they do not alter the original sent timestamp. The entire message and timestamp, is sent back exactly as it is received. If you send a message to a loopback with a timestamp of 0 (send immediately), it will come back with the same 0 timestamp. Similarly, if you specify an actual timestamp, that same timestamp will come back in the received message. The latter can be helpful in unit testing when you need to correlate a sent message with a received message, or you need to verify that the specific timestamp you sent was actually sent.

If you need the more typical timestamp behavior, you can set up app-to-app MIDI virtual endpoints.

Metadata Capture

The Loopback endpoints capture Endpoint and Function Block metadata just like any other endpoint. Because of this, you can change the name of the endpoint through in-protocol messages. If you do that, simply change it back later using the same type of message.

Note: We’re working to purge the endpoint metadata cache on device reconnection or service restart, which would reset those properties and names. Currently, it persists across service and Windows restarts.

Ping

The ping endpoint is not normally returned through any enumeration. It is for internal use only, and should not be used by any applications. It recognizes only one type of proprietary message.

Behavior and implementation of the Ping endpoint is subject to change and should not be relied upon by any code outside of the API.

\ No newline at end of file diff --git a/docs/_site/developer-docs/endpoint-ids.html b/docs/_site/developer-docs/endpoint-ids.html new file mode 100644 index 00000000..1606429d --- /dev/null +++ b/docs/_site/developer-docs/endpoint-ids.html @@ -0,0 +1 @@ + Endpoint Device Ids | Windows MIDI Services Skip to main content Link Menu Expand (external link) Document Search Copy Copied

Endpoint Device Ids

The Endpoint Device Id (also referred to as a Device Id) is the way we identify individual devices and interfaces in Windows.

Example for one of the built-in loopback endpoints: \\?\SWD#MIDISRV#MIDIU_LOOPBACK_A#{e7cce071-3c03-423f-88d3-f1045d02552b}

Part Description
SWD Software device
MIDISRV The name of the enumerator. For Windows MIDI Services, this is the MidiSrv Windows Service
MIDIU_LOOPBACK_A Arbitrary unique identification string provided by the transport. Typically includes a unique identifier.
GUID The interface Id. For Windows MIDI Services, every interface is a bidirectional interface, even if the connected device is MIDI 1.0 with a single unidirectional interface. For MIDI 1.0 devices, you can look at the group terminal blocks to identify active groups/directions. For MIDI 2.0 devices, you can look at the function blocks for the same information and more.

If you look at the device in Device Manager, and look at Details/Device Instance Path, you’ll see all of the information here except for the interface Id. When you enumerate devices through Windows::Devices::Enumeration, the interface Id is included and required.

Tip: Although it was required in the past, we don’t recommend parsing these strings. If there’s information you need about the device which is not contained in the enumerated properties, please let us know and we’ll look into whether or not we can create a custom property to hold that.

\ No newline at end of file diff --git a/docs/_site/developer-docs/faq-programming-languages.html b/docs/_site/developer-docs/faq-programming-languages.html new file mode 100644 index 00000000..fc28eb96 --- /dev/null +++ b/docs/_site/developer-docs/faq-programming-languages.html @@ -0,0 +1 @@ + Programming Languages FAQ | Windows MIDI Services Skip to main content Link Menu Expand (external link) Document Search Copy Copied

Programming Languages and App Models FAQ

This is a developer-focused FAQ.

WinRT

Q: Why is the API and SDK WinRT instead of a set of C headers like classic APIs? Why not use classic COM? A: New APIs for Windows are required to be WinRT, unless there are really good reasons not to be. WinRT is enhanced COM with a richer type system with better support for use by most of the languages and frameworks used to develop Windows applications.

Q: Does the fact that the API and SDK are WinRT mean they are sandboxed? A: No. WinRT is modern COM. The term has been overloaded in the past to also include an app model, Store requirements, and more. In this project, WinRT simply means the implementation flavor with support for projections. It does not impose any sandbox or other restrictions on consuming applications.

Q: Why does the service plugin model use COM instead of WinRT? A: For our runtime discovery-based plugin model, “Classic” COM makes more sense. WinRT components need to be known at compile time.

Q: Why do MIDI namespaces sometimes start with Microsoft instead of Windows? A: Anything targeted for delivery in-box can use Windows.Devices. Anything which is an additional component download for applications, like the SDK, use Microsoft as the top-level namespace as per our conventions.

Projections

Q: Which projections will this project deliver? A: We will start with the basic projections: C++, C# (current .net versions), and JavaScript. We will add more (Rust, for example) as we proceed in development. We want to be as inclusive here as we can reasonably be.

App Models

Q: What is the primary app model the API and SDK are targeting? A: Windows desktop apps of all types including C++, C#, Electron, and more.

Q: Do the API and SDK support UWP Applications? A: During the initial testing rollout, the API is not built into Windows, and so may not be completely compatible with UWP apps. TBD which functions are usable from the UWP sandbox in the future, but we want to support as much as is possible.

Project Implementation Languages

Q: Which languages are used in the project? A: Primarily, the project is C++ and C#.

Q: Why is the API and SDK C++ instead of Rust? A: Rust supports WinRT, including authoring, through the rs/WinRT project. However, Rust does not currently support Arm64EC, which means apps on Arm64 devices which need to load x64 plugins (that is, most DAWs) would not be able to load the SDK into their process. Additionally, modern C++ can be used quite safely, it’s just not “safe by default” like Rust is.

Q: Why is the API and SDK C++ instead of C#/.net? A: The majority of DAWs are written in C++ or similar languages. Although one can create WinRT components from C#, they carry along a runtime and garbage collection which most DAW developers do not want in their process. Additionally, C# does not support Arm64EC.

Q: Why are the apps in C# /.net? A: C# is a great language for applications. Additionally, we want to encourage contributions from our enormous C#/.net development community.

Q: Why is the Windows Service C++ instead of C#, Rust, or something else? A: Early prototypes of the service were in C#, which worked fine for most things, until you got into the kernel data transfer, integration with the PnP stack, and more. The implementation team already knows how to use those features and APIs, with great performance, in C++ based on their work with the audio services in Windows today, so the implementation is in C++.

Q: Why does the driver have reimplementations of features we see in the standard library? A: In kernel mode drivers, the standard library is largely unavailable.

\ No newline at end of file diff --git a/docs/_site/developer-docs/midi2-implementation-details.html b/docs/_site/developer-docs/midi2-implementation-details.html new file mode 100644 index 00000000..13f35e15 --- /dev/null +++ b/docs/_site/developer-docs/midi2-implementation-details.html @@ -0,0 +1 @@ + MIDI 2.0 Implementation Details | Windows MIDI Services Skip to main content Link Menu Expand (external link) Document Search Copy Copied

Implementation Details

Specifications can be funny. As much as the MIDI Association, and all of us in it, try to be very specific and crisp on wording, there’s often room for interpretation. Most of these we work out among the various OS companies under the umbrella of the MIDI Association. But there are others were an approach may just not make sense on one OS or the other. Here are the ones that are Windows-specific, that you should be aware of as a developer.

Of course, the full source code for Windows MIDI Services, including the USB MIDI 2.0 driver, is available in our repo, so you can review it at any time to better understand how a feature or function works.

Discovery and Protocol Negotiation

Windows MIDI Services supports only the UMP-based Endpoint Discovery and Protocol Negotiation. We do not implement the deprecated MIDI-CI equivalents.

In addition, declaring the use of JR Timestamps in a USB MIDI 2.0 Group Terminal Block does not enable JR Timestamps in Windows MIDI Services. Instead, these must be negotiated using UMP-based Endpoint Discovery end Protocol Negotiation

UMP Endpoint Names for native MIDI 2.0 UMP format devices

Although we make all the names available through the Enumeration API, we have an order of precedence we use when providing the recommended Name property value. In order from most preferred to least, we have:

  1. Any user-supplied endpoint name configured through the configuration files (these will be created by the MIDI Settings app in the future)
  2. The name supplied through in-protocol Endpoint Name Notification messages
  3. The name supplied by the transport plugin in the service. This is typically pulled from a device name supplied by the driver, or other transport-specific sources such as network advertising in the case of Network MIDI 2.0.

When we create MIDI 1.0-compatible “ports” for these endpoints, we’ll use the Function Block Names if available and Group Terminal Block names if not.

UMP Endpoint Names for MIDI 1.0 byte stream format devices

The API also creates UMP endpoints for MIDI 1.0 devices. This happens two ways:

  1. If the device is assigned to the USB MIDI 2.0 driver (this is preferred) the driver creates Group Terminal Blocks for each “cable” (a “port” in MIDI 1.0 API speak). In the new driver, we use the iJack names, if provided, to name the Group Terminal Blocks. This is the best way to ensure your endpoint and Group Terminal Block names are correct.
  2. If the device is assigned a third-party driver or the legacy MIDI 1.0 driver (not preferred in most cases), the service creates the Group Terminal Blocks using the same algorithm. However, because much less information is available to the service from the legacy drivers, the name may not be identical.

The precedence for naming is the same as with MIDI 2.0 devices, with the exception of the Endpoint Name Notification, which doesn’t exist in MIDI 1.0.

  1. Any user-supplied endpoint name
  2. The name supplied through in-protocol Endpoint Name Notification messages
  3. The name supplied by the transport plugin in the service. This is typically pulled from a device name supplied by the driver, or other transport-specific sources such as network advertising in the case of Network MIDI 2.0.

iSerialNumber Really Helps

If your device exposes a unique iSerialNumber, that will really help with retaining name and other information across physical USB connects and disconnects. We do our best to retain the correct information if you plug into the same physical port, but when you change ports, a device without an iSerialNumber essentially becomes a new device. This is not unique to Windows, but it’s important enough to mention here. More info and guidance in this blog post.

\ No newline at end of file diff --git a/docs/_site/index.html b/docs/_site/index.html new file mode 100644 index 00000000..c1c106db --- /dev/null +++ b/docs/_site/index.html @@ -0,0 +1 @@ + Windows Midi Services | Windows MIDI Services Skip to main content Link Menu Expand (external link) Document Search Copy Copied

Windows MIDI Services

Source repo and developer releases on GitHub

Discord Server for discussion about this project

Key Features

  • Multi-client by default. Unless an endpoint is configured to not allow shared connections, or there is some issue around multi-client in a third-party driver, any endpoint (including MIDI 1.0 devices) can be used by multiple applications at the same time. So far, in our testing, we haven’t found any USB devices or drivers which cannot be multi-client.
  • Faster. In our testing, we’ve found that the new infrastructure is much faster at sending and receiving messages compared to the older API, even with plugins configured in the service. There are no built-in speed caps or throttling in Windows MIDI Services, even for older USB MIDI 1.0 devices. The driver is not limited USB full-speed, and supports USB 3.x speeds.
  • Lower Jitter. Along with higher speed comes lower jitter. This will vary by transport type (USB vs Network vs Virtual), and the device Windows is talking to, but the jitter is in the low microsecond range even without any compensation.
  • More Deterministic. Speaking of latency compensation, the new API enables timestamp-based message scheduling for outbound messages, and also will soon support Jitter Reduction timestamps for MIDI 2.0 devices which can use them.
  • Extensible. The service has been designed to be extensible by Microsoft and third-parties. New types of transports can be added at any time, including during prototyping of a new transport specification. (We’re working on Network MIDI 2.0, Bluetooth MIDI 1.0 and considering RTP, all using this model.) Similarly, message processing plugins can also be developed by Microsoft or third-parties and used for production and/or prototyping. No kernel driver experience required in most cases.
  • App-to-App and Virtual MIDI. Windows MIDI Services includes virtual / app-to-app MIDI 2.0 to enable lightning fast communication between apps on the PC. We’re also investigating flexible routing between any MIDI endpoints as a future feature.
  • Better tools. We supply the midi.exe Windows MIDI Services Console for developers and power users, or anyone comfortable with the command line. You can use it to monitor endpoints, send and receive messages, send/capture SysEx data and much more. We’ll deliver the MIDI Settings GUI app after our initial release. That app enables renaming devices, configuring your MIDI setup, testing, and more.
  • UMP-Centric. The new API fully embraces MIDI 2.0 and the Universal MIDI Packet format and handles all required translation in the service and driver. This makes the app model simple while ensuring all your existing devices continue to work.
  • Open Source. The source code is open and available to everyone under a permissive license. Not sure how something works? Want to create a transport but aren’t sure how we did it? Want to investigate a bug or contribute a feature? The code is there for you to explore.

Note: Additionally MIDI CI functionality, which does not technically require OS support, will be coming after version 1.0. We intend to add helpers for profiles, property exchange, MUID tracking, and more. In the meantime, applications can send and receive MIDI CI messages without anything in their way, using custom code or third-party libraries. MIDI CI is just MIDI 1.0-compatible SysEx.

API Backwards Compatibility

Our intention is for developers to begin adopting Windows MIDI Services in place of the older WinMM, WinRT, and (deprecated) DirectMusic APIs in their applications. All new MIDI features, transports, and more will be implemented in Windows MIDI Services and the new API. A select number of features, slightly more than their current baseline, will be available to WinMM and WinRT APIs through our backwards-compatibility shims and abstractions, but this is simply to ensure existing applications continue to function on systems using Windows MIDI Services. Please note that we are not providing backwards compatibility to support DirectMusic MIDI APIs.

The existing MIDI APIs on Windows talk (almost) directly to MIDI 1.0 drivers through kernel calls. In Windows MIDI Services, the architecture is built around a central Windows Service, much like our audio system today. It also uses a much faster IO mechanism for communication with the USB driver vs what our MIDI 1.0 API uses today. This provides much more flexibility, including the potential for multi-client use, and good baseline speed with our new class driver. We are working on shims and abstractions which will allow some of the existing MIDI 1.0 APIs to talk to the service rather than directly to the driver.

Here is where we currently stand with planned backwards compatibility. Backwards compatibility for WinMM and WinRT APIs will be a post-1.0 feature, but shortly after that first release.

API What you should expect
Windows MIDI Services This project. 100% of all supported features for MIDI 1.0 and MIDI 2.0, including multi-client. API/SDK uses UMP as its internal data format even for MIDI 1.0 devices. Transports and the service handle translation.
WinMM (Win32 API most apps use today) Access to MIDI 1.0 and most MIDI 2.0 devices, at a MIDI 1.0 compatibility level only. It is possible we will add multi-client support here after our initial release.
WinRT (MIDI API Introduced with Windows 10) Access to MIDI 1.0 and most MIDI 2.0 devices, at a MIDI 1.0 compatibility level only. It is possible we will add multi-client support here after our initial release.
DirectMusic No compatibility planned. Not part of our testing.

Note that we are also investigating and experimenting with how to best incorporate the existing in-box Roland GS / General MIDI Synth into this architecture. It’s likely we will handle it as an additional transport, but we need to test some of the MIDI file players today as many of them make assumptions about which synth index is the GS synth, so this compatibility may come after the initial release.

Resources

Developer Materials

Windows MIDI Services Console app

Advanced Materials

Relevant specifications

These are the updated MIDI 2.0 specifications which apply to this project today.


Table of contents

\ No newline at end of file diff --git a/docs/_site/midi-console.html b/docs/_site/midi-console.html new file mode 100644 index 00000000..13b7d589 --- /dev/null +++ b/docs/_site/midi-console.html @@ -0,0 +1,95 @@ + MIDI Console | Windows MIDI Services Skip to main content Link Menu Expand (external link) Document Search Copy Copied

Windows MIDI Services Console

If you have the midi console installed, you can invoke it from any command prompt using midi. We recommend using Windows Terminal for the best experience.

General Information

Commands vs Options

MIDI Console commands are words with no symbol prefix. For example endpoint or send-message-file. Options are prefixed with two dashes if you use the full word, or a single dash if you use the single-letter abbreviation. For example --help or -h. There is no statement completion built in to the console, but there are some supported abbreviations for commands. These are not yet fully documented but are present in the Program.cs in the console source code.

“Ports” vs “Streams”

In MIDI 1.0, specifically USB MIDI 1.0, a connected device would have a single input and single output stream. Inside that stream are packets of data with virtual cable numbers. Those numbers (16 total at most) identify the “port” the data is going to. Operating systems would then translate those into input and output ports. Those cable numbers were hidden from users.

MIDI 2.0 does not have a concept of a port. Instead, you always work with the stream itself. The group number, which is in the MIDI message now, is the moral equivalent of that cable number.

So where you may have seen a device with 5 input and 5 output ports in the past, you will now see a single bidirectional UMP Endpoint stream with 5 input groups and 5 output groups. We know this can take some getting used to, but it enables us to use MIDI 1.0 devices as though they are MIDI 2.0 devices, and provide a unified API.

Help

Add the option --help or its short version -h to any command to get information and examples for that command.

midi --help
+midi service --help
+midi enumerate --help
+midi enumerate endpoints --help
+

The --help option will always provide the most up-to-date list of commands and options supported by the MIDI Services Console.

Check the MIDI Service Health

The heart of Windows MIDI Services is the Windows Service which processes and routes messages, creates endpoints, and more. The MIDI Services Console app includes a few commands to check the status and health of the service.

Check MIDI Service Status

If you want to verify that the MIDI Service is running, you can check its status using the Service Control Manager, or through the MIDI Console.

midi service status
+midi svc status
+

If you uset the --verbose or -v option, the console will display more information about the service.

midi service status
+midi svc status
+

Ping the Service

If you want to verify that the service is transmitting and receiving messages, you can use the ping command, much like you would

midi service ping
+midi svc ping
+

This command also supports the --verbose or -v option to display the full results of the ping. It also supports a --count or -c parameter for the number of messages you want to send. Finally, the call supports a --timeout or -t parameter to set the timeout in milliseconds before the ping is considered to have failed.

Here are examples of the command with various parameters.

midi service ping --verbose
+midi service ping --verbose --count 20 --timeout 20000
+

Stop / Start / Restart the Service

The MIDI console has three commands for managing the Windows service. These can be useful when developing or debugging service-side plugins. Note that these must be run from an Administrator console session.

midi service stop
+midi service start
+midi service restart
+

See the Current Timestamp and Frequency

If you want to see the MIDI clock we’re using for timestamps and message scheduling, you can use the time command. It will display the current timestamp in ticks, and the number of ticks per second (the resolution)

midi time
+midi clock
+

Enumerate (List) MIDI Entities

A basic operation you may do with the tool is list the major entities (Endpoints and Plugins) in the system.

The enumerate command has the aliases enum and list which may be used instead of the full enumerate command.

Enumerate MIDI UMP Endpoints

The ump-endpoints parameter has the alias endpoints and the alias ump so either may be used with the same results. These commands are all equivalent:

midi enumerate ump-endpoints
+midi enumerate endpoints
+midi enum endpoints
+midi list endpoints
+midi list ump
+

All of the above statements will return a list of all the user-focused UMP endpoints on the system.

Note: There are loopback endpoints A and B that are always available and are built into the service. They are crosswired to each other so that any message sent to A is received on B, and vice versa. They cannot be removed or disabled. Because these are more for support, testing, and developer scenarios, they are not returned from enumeration calls by default. Instead, you would supply the --include-loopback option for the enumeration commands.

Enumerate Classic Byte-stream (MIDI 1.0) Endpoints

This uses the old WinRT API. Its primary reason for existance is so you can see what’s shown to older APIs vs what is shown for the new Windows MIDI Services API. As with the UMP endpoints, the commands have aliases, so the following are all equivalent

midi enumerate bytestream-endpoints
+midi enumerate legacy-endpoints
+midi enum legacy-endpoints
+midi list legacy
+

Enumerate Transport Plugins

TODO: This feature is actively in development.

Enumerate Message Processing Plugins

TODO: This feature is actively in development.

Watch UMP Endpoints for Changes

Enumerating endpoints gives you a snapshot of the list at a moment in time. Watching the endpoints will give you a constantly updating list, which reflects device add/remove as well as property updates. This is useful more for developers, or those who are using tools to modify endpoints and want to verify that the changes were reported.

The watch-endpoints command has the alias watch, so these are equivalent:

midi watch-endpoints
+midi watch
+

Note that only UMP endpoints (or bytestream endpoints converted to UMP by the new USB driver and service) are watched for changes. The older MIDI API is not used here. When you want to stop watching the endpoints for changes, hit the escape key.

Single-Endpoint Commands

There are a number of commands, including those for monitoring and sending messages, which operate on a single endpoint.

In most any command which takes an Endpoint Device Id as a parameter, that parameter is optional. If you leave it out, and the command operates on a single endpoint, you will be prompted with a menu of available endpoints to work with.

If you want to script the commands without requiring any user interaction, provide the endpoint device ID as the first parameter after the endpoint command. For example:

midi endpoint \\?\SWD#MIDISRV#MIDIU_DIAG_LOOPBACK_B#{e7cce071-3c03-423f-88d3-f1045d02552b} properties --verbose
+

Get Detailed Endpoint Properties

In the Device Manager in Windows, you can only see a subset of properties for a device. The same goes with the pnputil utility. It can be useful to see all of the key properties of a MIDI Endpoint. Therefore, we’ve baked property reporting right into the MIDI Services Console.

midi endpoint properties
+

By default, only key properties are displayed. If you want to see the complete list of all properties for the endpoint device, its container, and its parent device, add the --verbose parameter.

midi endpoint properties --verbose
+

As with other endpoint commands, if you provide the endpoint device Id, it will be used. Otherwise, you will be prompted to select an endpoint.

Monitor an Endpoint for Incoming Messages

By default, every UMP Endpoint in Windows MIDI Services is multi-client. That means that more than one application can open a connection to the endpoint and send and/or receive messages. This also makes it possible to monitor all the incoming messages on an endpoint, even when that endpoint is in use by another application.

When run in verbose mode, the monitor will display each message as it arrives. It also displays helpful information about the type of the message, the group and channel when appropriate, the timestap offset (from the previous message if it was received recently), and more. This requires a fairly wide console window to allow formatting each message to take up only a single line. In a narrow window the format will be a bit ugly. We recommend using the Windows Terminal application, which has support for zooming in and out using the mouse wheel, different fonts, and more.

When run without the --verbose option, the monitor displays only key data for the incoming messages.

Default mode:

midi endpoint monitor
+

Verbose mode:

midi endpoint monitor --verbose
+

Saving messages to a file

When monitoring, you also have the option to save the messages to a file. This can be used to capture test data which you will send using the send-message-file command, or for storing something like a System Exclusive dump.

midi endpoint monitor --capture-to-file %USERPROFILE%\Documents\MyMidiCapture.midi2 --annotate-capture --capture-field-delimiter Pipe
+
  • The annotation option puts a comment before each message line, with additional details, including the timestamp.
  • The delimiter option enables you to specify how to delimit the MIDI words in the file. By default, the words are delimitated with spaces.

The file you choose to write to will be appended to if it already exists. Use caution when specifying the file name, so that you don’t corrupt an unrelated file with this MIDI data.

If no file extension is specified, the extension .midi2 will be automatically added to the filename.

When you have completed monitoring an endpoint, hit the escape key to close the connection and the app.

Send a Message from the Command Line

Sending a message to an endpoint is very helpful for testing, but can also be used in automation to, for example, change the current program, or set a MIDI CC value. It would be very easy for a person to build a batch file or PowerShell script which used midi.exe to synchronize different devices, or reset devices to a known state in preparation for a performance.

The message data beyond the message type (first 4 bits) is not pre-validated, so the data can be anything. However, the number of 32 bit words must match the message type per the MIDI 2.0 specification.

Send a single UMP32 message immediately

midi endpoint send-message 0x21234567
+

Send a single UMP64 message ten times

midi endpoint send-message 0x41234567 0xDEADBEEF --count 10
+

Send a single UMP64 message fifteen times, but with a delay of two seconds (2000 milliseconds) in between each message. Delays are in milliseconds because they are there primarily to prevent flooding with older devices.

midi endpoint send-message 0x41234567 0xDEADBEEF --count 15 --pause 2000
+

In general, we recommend sending messages in hexadecimal format (prefix 0x followed by 8 hexadecimal digits)as it is easier to visually inspect the information being sent. The 1-4 MIDI words are in order from left to right, from 1 to 4.

Special debug messages

One thing that can be useful is to send otherwise valid UMP messages where the last word is incremented by 1 for each sent message. This helps to validate that all messages were received by your application, and in the correct order. Note that this requires a message type of at least two words. We don’t recommend sending Type F stream messages as those have the potential to corrupt data. Instead, a Type 4 MIDI 2.0 channel voice message is usually safer.

midi endpoint send-message 0x41234567 0x00000000 --count 10000 --pause 2 --debug-auto-increment
+

When sent, you should see messages where the second word is updated from 0x00000000 through 0x00002710 (decimal 10000). We recommend the pause when sending large numbers of messages because a pause of 0 (“send as fast as possible”) can flood the buffers with more data than the client may be able to retrieve in time and may result in dropped messages. A warning is displayed when that possibility seems likely.

Scheduling messages

NOTE: In current Developer Preview builds, message scheduling is turned off so the timestamp is ignored. Refer to the release notes.

When sending messages, you have two options for timestamps:

--offset-microseconds is used to add a fixed time to each outgoing message so that it is scheduled that far into the future.

Schedule a single UMP64 message 2 seconds from now (2 million microseconds). Offsets are in microseconds to provide more precise control compared to milliseconds.

midi endpoint send-message 0x41234567 0xFEEDF00D --offset-microseconds 2000000
+

You can also specify an absolute timestamp. Typically, this is used to be able to specify a timestamp of 0, which means to bypass any scheduling and send immediately.

midi endpoint send-message 0x41234567 0xFEEDF00D --timestamp 0
+

Of course, you can also use the midi time command to see the current timestamp, and then use that information to pick a future timestamp.

Finally, if you do not specify a timestamp, the current time is used.

Send a File full of Messages

If you want to send a file full of messages, for SysEx or testing, for example, the console has provision for this.

The file needs to have one message per line, with 1-4 32 bit words as appropriate. There are options for delimeter (auto, space, comma, pipe, tab), word format (binary, hex, or decimal) as well as an option to change the group index. The latter is especially important when you have a SysEx file saved from one group and you want to send it on another group. The file name can include system variables which require expansion.

midi endpoint send-message-file %userprofile%\Documents\SysExBank12.txt --new-group-index 5
+

There are a number of options for this command both for the format it is reading, but also for the delay between messages (for older devices) and more. To get an explanation for each, type:

midi endpoint send-message-file --help
+

Here is one of the test files we use. It demonstrates comments, multiple representations for numbers, different delimeters, and more.

# This is a test file for sending UMPs through Windows MIDI Services
+# It uses auto for the field delimiter so we can have different 
+# delimiters on each line. Numeric format for this file is always hex.
+
+# The line above was empty. The next data line is a UMP32
+
+0x22345678
+
+# The messages aren't valid beyond their message type matching the number of words
+
+0xF1345678 0x12345678 0x03263827 0x86753099
+0xF2345678,0x12345678,0x86754321, 0x86753099
+0xF3345678|0x12345678|       0x86754321|0x86753099
+
+0x21345678
+0x42345678 0x12341234
+0x43345677 0x12341235
+0x44345676 0x12341236
+0x45345675 0x12341237
+0x26989898
+
+# The next two lines have different hex formatting
+
+41345678h 12341234h
+22989898h
+F3345678h 12345678h 86754321h 86753099h
+
+
+# The next lines have no hex formatting
+
+41345678 12341234
+22989898
+
+# The next lines have inconsistent hex formatting
+
+41345678 12341234
+0xF2345678 12345678h 86754321 0x86753099
+
+
+
+
+# bunch of empty lines above. And the file ends with a comment
+

Sending Endpoint Metadata Requests

The MIDI Services Console also makes it possible to send some common stream request messages without having to remember their exact format.

Before sending the request, you may want to open another console window or tab with a device watcher active on the connected endpoint. This will tell you when the stored properties are changed. In addition, you may want to have a verbose monitoring tab/window open so you can see the response messages come back.

These are primarily a convenience for developers.

Note that in all the request commands, you may abbreviate request as req

Send a Function Block Request Message

In the command, you may abbreviate function-blocks as fb, functions, function or function-block. The singular versions are available to make the command make more sense when requesting a single block’s data.

Request all function blocks from an endpoint

midi endpoint request function-blocks --all
+

Request a single function block

midi endpoint request function-blocks --function-block-number 3
+

Note that you may abbreviate --function-block-number as -n or as --number

By default, you will request both the info notification and name notification messages. If you want to request only one of them, simply turn the other off. You must request at least one of the two types of messages.

midi endpoint request function-blocks --all --request-name false
+midi endpoint request function-blocks --all --request-info false
+

Send an Endpoint Information Request Message

In the command, you may abbreviate endpoint-metadata as em or metadata.

By default, you will request only the endpoint information notification. To request other types of information, specify the flag for that type, or simply use --all

Request all metadata notification messages

midi endpoint request endpoint-metadata --all
+

Request endpoint info (on by default) and name

midi endpoint request endpoint-metadata --name
+

Request only the name

midi endpoint request endpoint-metadata --name --endpoint-info false
+

Other request types

midi endpoint request endpoint-metadata --device-identity
+midi endpoint request endpoint-metadata --product-instance-id
+midi endpoint request endpoint-metadata --stream-configuration
+

Finally, note that you can provide a UMP version to send with the request. By default, the version is Major 1, Minor 1. The --ump-version-major and --ump-version-minor options are what you want to use here.

Technical Information

The Windows MIDI Services Console app has been developed using C#, .NET 8, the MIT-licensed open source Spectre.Console library, and the Microsoft-developed open source C#/WinRT toolkit.

The console uses the same Windows MIDI Services WinRT APIs available to other desktop applications. Its full source code is available on our Github repo. Pull-requests, feature requests, and bug reports welcome. The project is open source, but we request that instead of forking it to create your own version, you consider contributing to the project.

\ No newline at end of file diff --git a/docs/config-json.md b/docs/config-json.md index c74d5750..9fceff1e 100644 --- a/docs/config-json.md +++ b/docs/config-json.md @@ -1,3 +1,9 @@ +--- +layout: page +title: Config JSON +parent: Windows Midi Services +--- + # JSON Config File It's best to use the Settings application and the transport / processing plugins for Settings to manipulate the file. However, if you edit it by hand, here are some notes. diff --git a/docs/developer-docs/README.md b/docs/developer-docs/README.md deleted file mode 100644 index d7d52990..00000000 --- a/docs/developer-docs/README.md +++ /dev/null @@ -1,22 +0,0 @@ -# Developer Documentation - -## Main API Documentation - -The `Windows.Devices.Midi2` WinRT namespace includes all of the client API types for Windows MIDI Services. - -[Windows.Devices.Midi2](./Windows.Devices.Midi2/) - -Note: This documentation is a work in progress. - -## Other Important Documentation - -| Page | Description | -| ------------- | --------------------- | -| [timestamps.md](./timestamps.md) | Details about Timestamps in Windows MIDI Services | -| [endpoint-ids.md](./endpoint-ids.md) | Behavior and use of the diagnostic loopback and ping endpoints | -| [diagnostic-endpoints.md](./diagnostic-endpoints.md) | Behavior and use of the diagnostic loopback and ping endpoints | -| [midi2-implementation-details.md](./midi2-implementation-details.md) | Any important details where our implementation may interpret the specification in a specific way, or we differ from other implementations | -| [consuming-midi-api.md](./consuming-midi-api.md) | How to build against the API | -| [faq-programming-languages.md](./faq-programming-languages.md) | Information about using Windows MIDI Services API from different programming languages | -| [best-practices.md](./best-practices.md) | Best practices and tips when using the API | - diff --git a/docs/developer-docs/Windows.Devices.Midi2/README.md b/docs/developer-docs/Windows.Devices.Midi2/README.md index ffa13d50..e79cef90 100644 --- a/docs/developer-docs/Windows.Devices.Midi2/README.md +++ b/docs/developer-docs/Windows.Devices.Midi2/README.md @@ -1,3 +1,9 @@ +--- +layout: page +title: Windows.Devices.Midi2 API +has_children: true +--- + # Windows.Devices.Midi2 The Windows.Devices.Midi2 types are documented in these pages. @@ -10,94 +16,42 @@ Typical API workflow: 4. **Optionally, add any processing plugins**. If you want to filter messages or provide multiple "views" into a stream, you can add the appropriate client message processing plugins. 5. **Open the connection**. Once the connection is open, you may send and receive messages. -## Enumeration +## Endpoint Enumeration Enumeration is how you discover endpoints and get notified of endpoints when they are added, updated, or removed. For the best user experience, keep a `MidiEndpointDeviceWatcher` running in a background thread so you can monitor device removal, and property updates (name, function blocks, etc.) -* [Overview](./enumeration/) -* [MidiEndpointDeviceInformation](./enumeration/MidiEndpointDeviceInformation/) -* [MidiEndpointDeviceWatcher](./enumeration/MidiEndpointDeviceWatcher/) -* [MidiEndpointDeviceInformationUpdateEventArgs](./enumeration/MidiEndpointDeviceInformationUpdateEventArgs/) - ## Session Interaction with a MIDI Endpoint always starts with creating a session. -* [Overview](./session/) -* [MidiSession](./session/MidiSession/) -* [MidiSessionSettings](./session/MidiSessionSettings/) - ## Connections Once you have a session, you will create one or more connections to send and receive messages. -* [Overview](./connections/) -* [MidiEndpointConnection](./connections/MidiEndpointConnection/) -* [MidiMessageReceivedEventArgs](./connections/MidiMessageReceivedEventArgs/) - ## Clock The MIDI clock is used for creating timestamps for use in sending MIDI messages. -* [Overview](./clock/) -* [MidiClock](./clock/MidiClock/) - ## Messages MIDI Messages are discrete packets of data of a known length. In the MIDI 2.0 specification, they are known as Universal MIDI Packets. In Windows MIDI Services, even MIDI 1.0 bytestream messages are presented in their equivalent Universal MIDI Packet format. The API includes several classes not only for the messages, but also to help construct and parse them. -* [Overview](./messages/) -* [Midi Message Types](./messages/midi-message-types/) -* [MidiMessageBuilder](./messages/MidiMessageBuilder/) -* [MidiMessageConverter](./messages/MidiMessageConverter/) -* [MidiMessageTranslator](./messages/MidiMessageTranslator/) -* [MidiMessageUtility](./messages/MidiMessageUtility/) -* [MidiStreamMessageBuilder](./messages/MidiStreamMessageBuilder/) - ## Metadata Function Blocks and Group Terminal Blocks are important types of MIDI 2.0 metadata which describe an endpoint. -* [Overview](./metadata/) -* [MidiFunctionBlock](./metadata/MidiFunctionBlock/) -* [MidiGroupTerminalBlock](./metadata/MidiGroupTerminalBlock/) - ## Client-Side Processing Plugins Connections allocate service resources (time and memory), so we recommend applications maintain only a single connection to an endpoint within any session. But because the new endpoint stream-focused approach aggregates what used to be considered ports, we provide processing plugins to parcel out the incoming messages based on criteria set by the application. In this way, an application can have the logical equivalent of several input ports, without the associated resource usage. -* [Overview](./processing-plugins/) -* [MidiChannelEndpointListener](./processing-plugins/MidiChannelEndpointListener/) -* [MidiGroupEndpointListener](./processing-plugins/MidiGroupEndpointListener/) -* [MidiMessageTypeEndpointListener](./processing-plugins/MidiMessageTypeEndpointListener/) - ## Virtual Devices A virtual device is the mechanism through which app-to-app MIDI works through the API. One application acts as the MIDI Endpoint Device, and other applications connect to it. In addition to the service component, it is implemented in the client API as a type of Client-SIde Processing Plugin -* [Overview](./virtual-device/) -* [MidiVirtualEndpointDevice](./virtual-device/MidiVirtualEndpointDevice/) -* [MidiVirtualEndpointDeviceDefinition](./virtual-device/MidiVirtualEndpointDeviceDefinition/) -* [MidiStreamConfigurationRequestReceivedEventArgs](./virtual-device/MidiStreamConfigurationRequestReceivedEventArgs/) - ## Simple Types There are several simple or basic types used in Windows MIDI Services. These types provide formatting and validation to help ensure applications display data in similar ways. -* [Overview](./simple-types/) -* [MidiGroup](./simple-types/MidiGroup/) -* [MidiChannel](./simple-types/MidiChannel/) -* [MidiUniqueId](./simple-types/MidiUniqueId/) - ## Service The MidiService class is a utility class which provides access to health and status information related to the MidiSrv Service. - -* [Overview](./service/) -* [MidiService](./service/MidiService/) -* [MidiServiceMessageProcessingPluginInformation](./service/MidiServiceMessageProcessingPluginInformation/) -* [MidiServiceTransportPluginInformation](./service/MidiServiceTransportPluginInformation/) -* [MidiServicePingResponse](./service/MidiServicePingResponse/) -* [MidiServicePingResponseSummary](./service/MidiServicePingResponseSummary/) -* [MidiSessionInformation](./service/MidiSessionInformation/) -* [MidiSessionConnectionInformation](./service/MidiSessionConnectionInformation/) diff --git a/docs/developer-docs/Windows.Devices.Midi2/clock/MidiClock/README.md b/docs/developer-docs/Windows.Devices.Midi2/clock/MidiClock.md similarity index 50% rename from docs/developer-docs/Windows.Devices.Midi2/clock/MidiClock/README.md rename to docs/developer-docs/Windows.Devices.Midi2/clock/MidiClock.md index 14681a90..65970cad 100644 --- a/docs/developer-docs/Windows.Devices.Midi2/clock/MidiClock/README.md +++ b/docs/developer-docs/Windows.Devices.Midi2/clock/MidiClock.md @@ -1,3 +1,10 @@ +--- +layout: api_page +title: MidiClock +parent: Windows.Devices.Midi2 API +has_children: false +--- + # MidiClock The MidiClock is what is used for all timestamps in Windows MIDI Services. Although it is internally backed by `QueryPerformanceCounter`, we recommend using the MidiClock type directly instead of calling QPC yourself. @@ -6,12 +13,14 @@ Also note that `QueryPerformanceCounter` technically returns a signed 64 bit int > Note: The MIDI Clock is unrelated to wall clock time. It is an ever-increasing value of period 1/`TimestampFrequency` seconds that starts over when the PC is rebooted. To convert to wall clock time, you need to get the `MidiClock.Now` value at a known time, and then use that as a baseline until the next time you reboot the PC. +You can learn more about high-resolution timestamps in Windows at [https://aka.ms/miditimestamp](https://aka.ms/miditimestamp). + ## Static Properties | Static Property | Description | | --------------- | ----------- | -| Now | Returns the current timestamp | -| TimestampFrequency | Returns the number of timestamp ticks per second. This is calculated the first time it is called, and then cached for future calls. | +| `Now` | Returns the current timestamp | +| `TimestampFrequency` | Returns the number of timestamp ticks per second. This is calculated the first time it is called, and then cached for future calls. | ## Static Functions @@ -19,13 +28,13 @@ The static functions are for convenience in calculating offsets to a timestamp, | Static Function | Description | | --------------- | ----------- | -| ConvertTimestampToMicroseconds(timestampValue) | Converts the provided timestamp to microseconds | -| ConvertTimestampToMilliseconds(timestampValue) | Converts the provided timestamp to milliseconds | -| ConvertTimestampToSeconds(timestampValue) | Converts the provided timestamp to seconds | -| OffsetTimestampByTicks(timestampValue, offsetTicks) | Offsets a given timestamp by the provided (signed) number of ticks | -| OffsetTimestampByMicroseconds(timestampValue, offsetMicroseconds) | Offsets a given timestamp by the provided (signed) number of microseconds | -| OffsetTimestampByMilliseconds(timestampValue, offsetMilliseconds) | Offsets a given timestamp by the provided (signed) number of milliseconds | -| OffsetTimestampBySeconds(timestampValue, offsetSeconds) | Offsets a given timestamp by the provided (signed) number of seconds | +| `ConvertTimestampToMicroseconds(timestampValue)` | Converts the provided timestamp to microseconds | +| `ConvertTimestampToMilliseconds(timestampValue)` | Converts the provided timestamp to milliseconds | +| `ConvertTimestampToSeconds(timestampValue)` | Converts the provided timestamp to seconds | +| `OffsetTimestampByTicks(timestampValue, offsetTicks)` | Offsets a given timestamp by the provided (signed) number of ticks | +| `OffsetTimestampByMicroseconds(timestampValue, offsetMicroseconds)` | Offsets a given timestamp by the provided (signed) number of microseconds | +| `OffsetTimestampByMilliseconds(timestampValue, offsetMilliseconds)` | Offsets a given timestamp by the provided (signed) number of milliseconds | +| `OffsetTimestampBySeconds(timestampValue, offsetSeconds)` | Offsets a given timestamp by the provided (signed) number of seconds | ## IDL diff --git a/docs/developer-docs/Windows.Devices.Midi2/clock/README.md b/docs/developer-docs/Windows.Devices.Midi2/clock/README.md deleted file mode 100644 index c2d2eeb1..00000000 --- a/docs/developer-docs/Windows.Devices.Midi2/clock/README.md +++ /dev/null @@ -1,5 +0,0 @@ -# Clock - -The MIDI clock is used for creating timestamps for use in sending MIDI messages. - -* [MidiClock](./MidiClock/) \ No newline at end of file diff --git a/docs/developer-docs/Windows.Devices.Midi2/connections/MidiEndpointConnection.md b/docs/developer-docs/Windows.Devices.Midi2/connections/MidiEndpointConnection.md new file mode 100644 index 00000000..4748eb62 --- /dev/null +++ b/docs/developer-docs/Windows.Devices.Midi2/connections/MidiEndpointConnection.md @@ -0,0 +1,138 @@ +--- +layout: api_page +title: MidiEndpointConnection +parent: Connections +grand_parent: Windows.Devices.Midi2 API +has_children: false +--- + +# MidiEndpointConnection + +The `MidiEndpointConnection` type represents a single connection to a single endpoint managed by Windows MIDI Services. It is created using the functions of the `MidiSession`, and is tied to the lifetime of that session. + +Connections allocate resources including send/receive buffers, and processing threads. For that reason, a session should generally not open more than one connection to a single endpoint. If you need to partition out messages more easily (by group or channel, for example) the `MessageProcessingPlugins` collection will help you do that. + +To ensure an application is able to wire up processing plugins and event handlers before the connection is active, the connection returned by the `MidiSession` is not yet open. Once the connection is acquired, the application should assign event handlers, and optionally assign any message processing plugins. Once complete, the application calls the `Open()` function to connect to the service, create the queues, and begin sending and receiving messages. + +## Properties + +| Property | Description | +| -------- | ----------- | +| `ConnectionId` | The generated GUID which uniquely identifes this connection instance. This is what is provided to the `MidiSession` when disconnecting an endpoint | +| `EndpointDeviceId` | The system-wide identifier for the device connection. This is returned through enumeration calls. | +| `Tag` | You may use this `Tag` property to hold any additional information you wish to have associated with the connection. | +| `IsOpen` | True if this connection is currently open. When first created, the connection is not open until the consuming code calls the `Open` method | +| `Settings` | Settings used to create this connection. | +| `MessageProcessingPlugins` | Collection of all message processing plugins which will optionally handle incoming messages. | + +## Static Member Functions + +| Static Function | Description | +| -------- | ----------- | +| `GetDeviceSelector()` | Returns the device selector used for enumerating endpoint devices compatible with this API. | +| `SendMessageSucceeded(sendResult)` | Helper function to decipher the return result of a message sending function to tell if it succeeded. | +| `SendMessageFailed(sendResult)` | Helper function to decipher the return result of a message sending function to tell if it failed. | + +## Functions + +| Function | Description | +| -------- | ----------- | +| `Open()` | Open the connection and start receiving messages. Wire up the message event handler before calling this method. | +| `SendMessagePacket(message)` | Send an `IMidiUniversalPacket`-implementing type such as `MidiMessage64` or a strongly-typed message class. | +| `SendMessageStruct(timestamp, message, wordCount)` | Send a fixed-sized `MidiMessageStruct` containing `wordCount` valid words. Additional words are ignored. | +| `SendMessageWordArray(timestamp, words, startIndex, wordCount)` | Note: Some projections will send the entire array as a copy, so this may not be the most effecient way to send messages from your language. | +| `SendMessageWords(timestamp, word0)` | Send a single 32-bit Universal MIDI Packet as 32-bit words. This is often the most efficient way to send this type of message | +| `SendMessageWords(timestamp, word0, word1)` | Send a single 64-bit Universal MIDI Packet as 32-bit words. This is often the most efficient way to send this type of message | +| `SendMessageWords(timestamp, word0, word1, word2)` | Send a single 96-bit Universal MIDI Packet as 32-bit words. This is often the most efficient way to send this type of message | +| `SendMessageWords(timestamp, word0, word1, word2, word3)` | Send a single 128-bit Universal MIDI Packet as 32-bit words. This is often the most efficient way to send this type of message | +| `SendMessageBuffer(timestamp, buffer, byteOffset, byteLength)` | Send a single Universal MIDI Packet as bytes from a buffer. The number of bytes sent must match the size read from the first 4 bits of the data starting at the specified offset, and must be laid out correctly with the first byte corresponding to the MSB of the first word of the UMP (the word which contains hte message type). If you want to manage a chunk of buffer memory, the `IMemoryBuffer` type is the acceptable WinRT approach, and is as close as you get to sending a pointer into a buffer. | +| `AddEndpointProcessingPlugin(plugin)` | Add an endpoint processing plugin to this connection | +| `RemoveEndpointProcessingPlugin(id)` | Remove an endpoint processing plugin | + +> Tip: In all the functions which accept a timestamp to schedule the message, **you can send a timestamp of 0 (zero) to bypass the scheduler and send the message immediately**. Otherwise, the provided timestamp is treated as an absolute time for when the message should be sent from the service. Note that the service-based scheduler (currently based on a `std::priority_queue`) gets less efficient when there are thousands of messages in it, so it's recommended that you not schedule too many messages at a time or too far out into the future. + +## Events + +| Event | Description | +| -------- | ----------- | +| `MessageReceived(source, args)` | From `IMidiMessageReceivedEventSource`. This is the event for receiving MIDI Messages, one at a time. | + +When processing the `MessageReceived` event, do so quickly. This event is synchronous. If you need to do long-running processing of incoming messages, add them to your own incoming queue structure and have them processed by another application thread. + +> Note: Wire up event handlers and add message processing plugins prior to calling `Open()`. + +## IDL + +[MidiEndpointConnection IDL](https://github.com/microsoft/MIDI/blob/main/src/api/Client/Midi2Client/MidiEndpointConnection.idl) + +## Sample + +Here's an excerpt from the full "API client basics" sample. It shows sending and receiving messages using the two built-in loopback endpoints. For more information on the loopback endpoints, see [diagnostics endpoints](../../../diagnostic-endpoints.md). + +```cs +using (var session = MidiSession.CreateSession("API Sample Session")) +{ + // get the endpoint Ids. Normally, you'd use enumeration functions to get this + // for non-diagnostics endpoints. + var endpointAId = MidiEndpointDeviceInformation.DiagnosticsLoopbackAEndpointId; + var endpointBId = MidiEndpointDeviceInformation.DiagnosticsLoopbackBEndpointId; + + Console.WriteLine("Connecting to Sender UMP Endpoint: " + endpointAId); + Console.WriteLine("Connecting to Receiver UMP Endpoint: " + endpointBId); + + var sendEndpoint = session.CreateEndpointConnection(endpointAId); + var receiveEndpoint = session.CreateEndpointConnection(endpointBId); + + void MessageReceivedHandler(object sender, MidiMessageReceivedEventArgs args) + { + var ump = args.GetMessagePacket(); + + Console.WriteLine(); + Console.WriteLine("Received UMP"); + Console.WriteLine("- Current Timestamp: " + MidiClock.Now); + Console.WriteLine("- UMP Timestamp: " + ump.Timestamp); + Console.WriteLine("- UMP Msg Type: " + ump.MessageType); + Console.WriteLine("- UMP Packet Type: " + ump.PacketType); + Console.WriteLine("- Message: " + MidiMessageUtility.GetMessageFriendlyNameFromFirstWord(args.PeekFirstWord())); + + if (ump is MidiMessage32) + { + var ump32 = ump as MidiMessage32; + + if (ump32 != null) + Console.WriteLine("- Word 0: 0x{0:X}", ump32.Word0); + } + }; + + // wire up the event handler before opening the endpoint + receiveEndpoint.MessageReceived += MessageReceivedHandler; + + Console.WriteLine("Opening endpoint connection"); + + receiveEndpoint.Open(); + sendEndpoint.Open(); + + Console.WriteLine("Creating MIDI 1.0 Channel Voice 32-bit UMP..."); + + var ump32 = MidiMessageBuilder.BuildMidi1ChannelVoiceMessage( + MidiClock.Now, // use current timestamp + 5, // group 5 + Midi1ChannelVoiceMessageStatus.NoteOn, // 9 + 3, // channel 3 + 120, // note 120 - hex 0x78 + 100); // velocity 100 hex 0x64 + + sendEndpoint.SendMessagePacket((IMidiUniversalPacket)ump32); // could also use the SendWords methods, etc. + + Console.WriteLine(" ** Wait for the message to arrive, and then press enter to cleanup. ** "); + Console.ReadLine(); + + // you should unregister the event handler as well + receiveEndpoint.MessageReceived -= MessageReceivedHandler; + + // not strictly necessary if the session is going out of scope or is in a using block + session.DisconnectEndpointConnection(sendEndpoint.ConnectionId); + session.DisconnectEndpointConnection(receiveEndpoint.ConnectionId); +} + +``` diff --git a/docs/developer-docs/Windows.Devices.Midi2/connections/MidiEndpointConnection/README.md b/docs/developer-docs/Windows.Devices.Midi2/connections/MidiEndpointConnection/README.md deleted file mode 100644 index 5af0b9fb..00000000 --- a/docs/developer-docs/Windows.Devices.Midi2/connections/MidiEndpointConnection/README.md +++ /dev/null @@ -1,56 +0,0 @@ -# MidiEndpointConnection - -The `MidiEndpointConnection` type represents a single connection to a single endpoint managed by Windows MIDI Services. It is created using the functions of the `MidiSession`, and is tied to the lifetime of that session. - -Connections allocate resources including send/receive buffers, and processing threads. For that reason, a session should generally not open more than one connection to a single endpoint. If you need to partition out messages more easily (by group or channel, for example) the `MessageProcessingPlugins` collection will help you do that. - -## Properties - -| Property | Description | -| -------- | ----------- | -| ConnectionId | The generated GUID which uniquely identifes this connection instance. This is what is provided to the `MidiSession` when disconnecting an endpoint | -| EndpointDeviceId | The system-wide identifier for the device connection. This is returned through enumeration calls. | -| Tag | You may use this `Tag` property to hold any additional information you wish to have associated with the connection. | -| IsOpen | True if this connection is currently open. When first created, the connection is not open until the consuming code calls the `Open` method | -| Settings | Settings used to create this connection. | -| MessageProcessingPlugins | Collection of all message processing plugins which will optionally handle incoming messages. | - -## Static Member Functions - -| Static Function | Description | -| -------- | ----------- | -| GetDeviceSelector() | Returns the device selector used for enumerating endpoint devices compatible with this API. | -| SendMessageSucceeded(sendResult) | Helper function to decipher the return result of a message sending function to tell if it succeeded. | -| SendMessageFailed(sendResult) | Helper function to decipher the return result of a message sending function to tell if it failed. | - -## Functions - -| Function | Description | -| -------- | ----------- | -| Open() | Open the connection and start receiving messages. Wire up the message event handler before calling this method. | -| SendMessagePacket(message) | Send an `IMidiUniversalPacket`-implementing type such as `MidiMessage64` or a strongly-typed message class. | -| SendMessageStruct(timestamp, message, wordCount) | Send a fixed-sized `MidiMessageStruct` containing `wordCount` valid words. Additional words are ignored. | -| SendMessageWordArray(timestamp, words, startIndex, wordCount) | Note: Some projections will send the entire array as a copy, so this may not be the most effecient way to send messages from your language. | -| SendMessageWords(timestamp, word0) | Send a single 32-bit Universal MIDI Packet as 32-bit words. This is often the most efficient way to send this type of message | -| SendMessageWords(timestamp, word0, word1) | Send a single 64-bit Universal MIDI Packet as 32-bit words. This is often the most efficient way to send this type of message | -| SendMessageWords(timestamp, word0, word1, word2) | Send a single 96-bit Universal MIDI Packet as 32-bit words. This is often the most efficient way to send this type of message | -| SendMessageWords(timestamp, word0, word1, word2, word3) | Send a single 128-bit Universal MIDI Packet as 32-bit words. This is often the most efficient way to send this type of message | -| SendMessageBuffer(timestamp, buffer, byteOffset, byteLength) | Send a single Universal MIDI Packet as bytes from a buffer. The number of bytes sent must match the size read from the first 4 bits of the data starting at the specified offset, and must be laid out correctly with the first byte corresponding to the MSB of the first word of the UMP (the word which contains hte message type). If you want to manage a chunk of buffer memory, the `IMemoryBuffer` type is the acceptable WinRT approach, and is as close as you get to sending a pointer into a buffer. | -| AddEndpointProcessingPlugin(plugin) | Add an endpoint processing plugin to this connection | -| RemoveEndpointProcessingPlugin(id) | Remove an endpoint processing plugin | - -> Tip: In all the functions which accept a timestamp to schedule the message, **you can send a timestamp of 0 (zero) to bypass the scheduler and send the message immediately**. Otherwise, the provided timestamp is treated as an absolute time for when the message should be sent from the service. Note that the service-based scheduler (currently based on a `std::priority_queue`) gets less efficient when there are thousands of messages in it, so it's recommended that you not schedule too many messages at a time or too far out into the future. - -## Events - -| Event | Description | -| -------- | ----------- | -| MessageReceived(source, args) | From `IMidiMessageReceivedEventSource`. This is the event for receiving MIDI Messages, one at a time. | - -When processing the `MessageReceived` event, do so quickly. This event is synchronous. If you need to do long-running processing of incoming messages, add them to your own incoming queue structure and have them processed by another application thread. - -> Note: Wire up event handlers and add message processing plugins prior to calling `Open()`. - -## IDL - -[MidiEndpointConnection IDL](https://github.com/microsoft/MIDI/blob/main/src/api/Client/Midi2Client/MidiEndpointConnection.idl) diff --git a/docs/developer-docs/Windows.Devices.Midi2/connections/MidiMessageReceivedEventArgs.md b/docs/developer-docs/Windows.Devices.Midi2/connections/MidiMessageReceivedEventArgs.md new file mode 100644 index 00000000..cba6177b --- /dev/null +++ b/docs/developer-docs/Windows.Devices.Midi2/connections/MidiMessageReceivedEventArgs.md @@ -0,0 +1,41 @@ +--- +layout: api_page +title: MidiMessageReceivedEventArgs +parent: Connections +grand_parent: Windows.Devices.Midi2 API +has_children: false +--- + +# MidiMessageReceivedEventArgs + +This is the main class to use when receving MIDI data from a message source such as a connection or a message processing plugin. + +> Note: Do not keep a copy of the `MidiMessageReceivedEventArgs` class, as the data it points to is guaranteed to exist for only the duration of the event handler call for which this instance was an argument. + +## Properties + +| Property | Description | +| -------- | ----------- | +| `Timestamp` | The 64-bit MIDI Clock timestamp set by the service when this message was received | +| `PacketType` | Type of Universal MIDI Packet. This value can be cast to get the number of valid words in the data. You can use this value to determine which of the `FillMessageXX` methods would be appropriate to call. For example, if the value is `MidiPacketType.UniversalMidiPacket64` you would call `FillMessage64` | +| `MessageType` | The type of Universal MIDI Packet Message. This comes from the first 4 bits of the data. | + +## Functions + +| Function | Description | +| -------- | ----------- | +| `PeekFirstWord()` | Returns the first word of the message data without removing it. | +| `GetMessagePacket()` | Returns an `IMidiUniversalPacket` runtime class representing the data. This requires an allocation. | +| `FillWords(word0, word1, word2, word3)` | Puts the data in the supplied words and returns the number of valid words to read. If the return value is 2, for example, then only `word0` and `word1` contain valid data. | +| `FillMessageStruct(message)` | Fills the provided lightweight structure with the message data. Returns the number of valid words in the updated struct. | +| `FillMessage32(message)` | Adds the data to the provided MidiMessage32 runtimeclass. The reference behavior is projection-dependent. Returns true if the provided type matches the expected packet type and the data has been written. | +| `FillMessage64(message)` | Adds the data to the provided MidiMessage64 runtimeclass. The reference behavior is projection-dependent. Returns true if the provided type matches the expected packet type and the data has been written. | +| `FillMessage96(message)` | Adds the data to the provided MidiMessage96 runtimeclass. The reference behavior is projection-dependent. Returns true if the provided type matches the expected packet type and the data has been written. | +| `FillMessage128(message)` | Adds the data to the provided MidiMessage128 runtimeclass. The reference behavior is projection-dependent. Returns true if the provided type matches the expected packet type and the data has been written. | +| `FillWordArray(words, startIndex)`| Writes the data starting at the zero-based `startIndex`. Some projections pass a copy of all the data, so this may not always be an efficient approach. Returns the number of words written. | +| `FillByteArray(bytes, startIndex)`| Writes the data starting at the zero-based `startIndex`. Some projections pass a copy of all the data, so this may not always be an efficient approach. Returns the number of bytes written. | +| `FillBuffer(buffer, byteOffset)`| Writes the data to the buffer starting at byteOffset. Returns the number of bytes written. | + +## IDL + +[MidiMessageReceivedEventArgs IDL](https://github.com/microsoft/MIDI/blob/main/src/api/Client/Midi2Client/MidiMessageReceivedEventArgs.idl) diff --git a/docs/developer-docs/Windows.Devices.Midi2/connections/MidiMessageReceivedEventArgs/README.md b/docs/developer-docs/Windows.Devices.Midi2/connections/MidiMessageReceivedEventArgs/README.md deleted file mode 100644 index f7465119..00000000 --- a/docs/developer-docs/Windows.Devices.Midi2/connections/MidiMessageReceivedEventArgs/README.md +++ /dev/null @@ -1,33 +0,0 @@ -# MidiMessageReceivedEventArgs - -This is the main class to use when receving MIDI data from a message source such as a connection or a message processing plugin. - -> Note: Do not keep a copy of the `MidiMessageReceivedEventArgs` class, as the data it points to is guaranteed to exist for only the duration of the event handler call for which this instance was an argument. - -## Properties - -| Property | Description | -| -------- | ----------- | -| Timestamp | The 64-bit MIDI Clock timestamp set by the service when this message was received | -| PacketType | Type of Universal MIDI Packet. This value can be cast to get the number of valid words in the data. You can use this value to determine which of the `FillMessageXX` methods would be appropriate to call. For example, if the value is `MidiPacketType.UniversalMidiPacket64` you would call `FillMessage64` | -| MessageType | The type of Universal MIDI Packet Message. This comes from the first 4 bits of the data. | - -## Functions - -| Function | Description | -| -------- | ----------- | -| PeekFirstWord() | Returns the first word of the message data without removing it. | -| GetMessagePacket() | Returns an `IMidiUniversalPacket` runtime class representing the data. This requires an allocation. | -| FillWords(word0, word1, word2, word3) | Puts the data in the supplied words and returns the number of valid words to read. If the return value is 2, for example, then only `word0` and `word1` contain valid data. | -| FillMessageStruct(message) | Fills the provided lightweight structure with the message data. Returns the number of valid words in the updated struct. | -| FillMessage32(message) | Adds the data to the provided MidiMessage32 runtimeclass. The reference behavior is projection-dependent. Returns true if the provided type matches the expected packet type and the data has been written. | -| FillMessage64(message) | Adds the data to the provided MidiMessage64 runtimeclass. The reference behavior is projection-dependent. Returns true if the provided type matches the expected packet type and the data has been written. | -| FillMessage96(message) | Adds the data to the provided MidiMessage96 runtimeclass. The reference behavior is projection-dependent. Returns true if the provided type matches the expected packet type and the data has been written. | -| FillMessage128(message) | Adds the data to the provided MidiMessage128 runtimeclass. The reference behavior is projection-dependent. Returns true if the provided type matches the expected packet type and the data has been written. | -| FillWordArray(words, startIndex)| Writes the data starting at the zero-based `startIndex`. Some projections pass a copy of all the data, so this may not always be an efficient approach. Returns the number of words written. | -| FillByteArray(bytes, startIndex)| Writes the data starting at the zero-based `startIndex`. Some projections pass a copy of all the data, so this may not always be an efficient approach. Returns the number of bytes written. | -| FillBuffer(buffer, byteOffset)| Writes the data to the buffer starting at byteOffset. Returns the number of bytes written. | - -## IDL - -[MidiMessageReceivedEventArgs IDL](https://github.com/microsoft/MIDI/blob/main/src/api/Client/Midi2Client/MidiMessageReceivedEventArgs.idl) diff --git a/docs/developer-docs/Windows.Devices.Midi2/connections/README.md b/docs/developer-docs/Windows.Devices.Midi2/connections/README.md index 3d42f74c..7e376fc2 100644 --- a/docs/developer-docs/Windows.Devices.Midi2/connections/README.md +++ b/docs/developer-docs/Windows.Devices.Midi2/connections/README.md @@ -1,7 +1,8 @@ -# Connections +--- +layout: api_page +title: Connections +parent: Windows.Devices.Midi2 API +has_children: true +--- -Once you have a session, you will create one or more connections to send and receive messages. - -* [Overview](./) -* [MidiEndpointConnection](./MidiEndpointConnection/) -* [MidiMessageReceivedEventArgs](./MidiMessageReceivedEventArgs/) \ No newline at end of file +# Connection APIs diff --git a/docs/developer-docs/Windows.Devices.Midi2/enumeration/MidiEndpointDeviceInformation.md b/docs/developer-docs/Windows.Devices.Midi2/enumeration/MidiEndpointDeviceInformation.md new file mode 100644 index 00000000..658b5b84 --- /dev/null +++ b/docs/developer-docs/Windows.Devices.Midi2/enumeration/MidiEndpointDeviceInformation.md @@ -0,0 +1,144 @@ +--- +layout: api_page +title: MidiEndpointDeviceInformation +parent: Endpoint Enumeration +grand_parent: Windows.Devices.Midi2 API +has_children: false +--- + +# MidiEndpointDeviceInformation + +This class is a specialized equivalent of the `DeviceInformation` WinRT class. It handles requesting all of the additional properties necessary for MIDI devices, and also goes a step further to retrieve parent device information so that applications can display the endpoints and parent devices in context. + +We've heard from developers that we did not provide sufficient information about devices in the past, so we created this class and the associated properties to remedy that. We also heard that Async calls were a non-starter for most DAW applications, so everything in this class is synchronous. + +> Note: the MidiEndpointDeviceWatcher is a better way to retrieve devices because you can then keep the watcher open in a background thread, and be notified of property changes, device add/remove, etc. + +When displaying endpoint devices to users, you'll typically want to stick to the defaults: `IncludeClientUmpNative | IncludeClientByteStreamNative`. You do not want to show the Diagnostic Ping ever, and you typically will not want to show the system-wide Diagnostic Loopback singletons. Finally, you don't want to show the Virtual Device Responder endpoints because those should be reserved only for the "device" application in app-to-app MIDI. + +## In-protocol discovered information + +When a device is first enumerated by the MIDI Service, if it is a UMP-native device, we will attempt endpoint discover and protocol negotiation. During that, we request all endpoint information and all function block information. The received data is then cached in the device properties so that applications do not need to perform this process themselves. + +## Properties + +| Property | Source | Description | +| --------------- | ------ | ----------- | +| `Id` | Windows | The endpoint device interface id | +| `ContainerId` | Windows | The device container | +| `DeviceInstanceId` | Windows | The device instance id without the interface information | +| `Name` | Various | This is the name which should be displayed in any application. It calculates the correct name based on the hierarchy of possible names, including a user-specified name. Always respect the user's choice here. | +| `TransportSuppliedName` | Transports | The name provided by the driver or the endpoint transport. | +| `EndpointSuppliedName` | MIDI 2.0 | The name provided by MIDI 2.0 endpoint information. This is discovered in-protocol. | +| `UserSuppliedName` | Configuration | The name provided by the user. | +| `ProductInstanceId` | MIDI 2.0 | Property of the same name discovered by MIDI 2.0 in-protocol endpoint information. | +| `SpecificationVersionMajor` | MIDI 2.0 | Discovered UMP version | +| `SpecificationVersionMinor` | MIDI 2.0 | Discovered UMP version | +| `SupportsMidi10Protocol` | MIDI 2.0 | Discovered protocol support | +| `SupportsMidi20Protocol` | MIDI 2.0 | Discovered protocol support | +| `ConfiguredToReceiveJRTimestamps | MIDI 2.0 | Note that JR timestamps are handled entirely in the service and are not sent back down to the client. | +| `ConfiguredToSendJRTimestamps | MIDI 2.0 | Note that JR timestamps are handled entirely in the service and are not sent back down to the client. | +| `DeviceIdentitySystemExclusiveId` | MIDI 2.0 | Device Identity information +| `DeviceIdentityDeviceFamilyLsb` | MIDI 2.0 | Device Identity information +| `DeviceIdentityDeviceFamilyMsb` | MIDI 2.0 | Device Identity information +| `DeviceIdentityDeviceFamilyModelNumberLsb` | MIDI 2.0 | Device Identity information +| `DeviceIdentityDeviceFamilyModelNumberMsb` | MIDI 2.0 | Device Identity information +| `DeviceIdentitySoftwareRevisionLevel` | MIDI 2.0 | Device Identity information +| `TransportId` | Windows | The Id of the transport abstraction that manages this endpoint | +| `TransportMnemonic` | Windows | A short abbreviation for the transport. This can be used as a transport identifier. | +| `TransportSuppliedSerialNumber` | Windows | iSerialNumber, when available in USB, and other ids from other transports. | +| `ManufacturerName` | Windows | The name of the manufacturer of the device, if available | +| `SupportsMultiClient` | Windows | True if this endpoint supports multi-client use | +| `NativeDataFormat` | Windows | Because the driver and service handle data format translation, it's not immediately obvious if the device is natively UMP or natively Byte Stream. This property provides that information | +| `GroupTerminalBlocks` | Windows | A collection of Group Terminal Blocks. These are used only in USB. For MIDI 2.0 devices, Function Blocks are preferred. | +| `HasStaticFunctionBlocks` | MIDI 2.0 | True if the function blocks are static. That is, the groups never change. | +| `FunctionBlockCount` | MIDI 2.0 | The number of function blocks the endpoint has declared. Function blocks always start at index zero and go to FunctionBlockCount-1 | +| `EndpointPurpose` | Windows | The purpose of the endpoint. This is used primarily for filtering. | +| `Description` | Configuration | An endpoint description which is typically provided by the user | +| `LargeImagePath` | Configuration | The path to a png or jpg image that represents this endpoint. Typically user-supplied. | +| `SmallImagePath` | Configuration | The path to a png or jpg image that represents this endpoint. Typically user-supplied. | +| `RequiresNoteOffTranslation` | Configuration | True if the endpoint requires internal translation of Note On with zero velocity (in the case of MIDI 1.0) to a Note Off message. Typically user-supplied. | +| `RecommendedCCAutomationIntervalMS` | Configuration | Number of milliseconds between automation value changes. This is usually only for old and slow MIDI 1.0 devices that are prone to data flooding. User-supplied. | +| `Properties` | Windows | A collection of all the raw properties. | + +## Static Properties + +| Static Property | Description | +| --------------- | ----------- | +| `DiagnosticsLoopbackAEndpointId` | Endpoint Id for the diagnostic loopback used for development and support purposes. | +| `DiagnosticsLoopbackBEndpointId` | Endpoint Id for the diagnostic loopback used for development and support purposes. | +| `EndpointInterfaceClass` | The class GUID which appears at the end of the Endpoint Ids | + +## Functions + +| Function | Description | +| --------------- | ----------- | +| `GetParentDeviceInformation()` | Finds and then retrieves the parent `DeviceInformation` type with appropriate properties. | +| `GetContainerInformation()` | Gets the device container information and returns its `DeviceInformation` with appropriate properties | +| `UpdateFromDeviceInformation(deviceInformation)` | For use by any watcher which must update this object | +| `UpdateFromDeviceInformationUpdate(deviceInformationUpdate)` | For use by any watcher which must update this object | + +## Static Functions + +| Static Function | Description | +| --------------- | ----------- | +| `CreateFromId(id)` | Creates a new `MidiEndpointDeviceInformation` object from the specified id | +| `FindAll()` | Searches for all endpoint devices and returns a list in the default sort order | +| `FindAll(sortOrder)` | Searches for all endpoint devices and returns a list in the specified sort order | +| `FindAll(sortOrder, endpointFilter)` | Searches for all endpoint devices which match the filter, and returns a list in the specified sort order. | +| `DeviceMatchesFilter(deviceInformation, endpointFilter)` | A helper function to compare a device against the filter. | +| `GetAdditionalPropertiesList()` | This returns the list of properties which must be requested during enumeration. Typically not needed for applications, as the watcher calls this function | + +## IDL + +[MidiEndpointDeviceInformation IDL](https://github.com/microsoft/MIDI/blob/main/src/api/Client/Midi2Client/MidiEndpointDeviceInformation.idl) + +## Sample + +What follows is an excerpt of the larger C++/WinRT enumeration sample. + +```cpp +#include "pch.h" +#include + +using namespace winrt::Windows::Devices::Midi2; // API + +int main() +{ + winrt::init_apartment(); + + bool includeDiagnosticsEndpoints = true; + + // enumerate all endpoints. A normal application should enumerate only + // IncludeClientByteStreamNative | IncludeClientUmpNative + auto endpoints = MidiEndpointDeviceInformation::FindAll( + MidiEndpointDeviceInformationSortOrder::Name, + MidiEndpointDeviceInformationFilter::IncludeClientByteStreamNative | + MidiEndpointDeviceInformationFilter::IncludeClientUmpNative | + MidiEndpointDeviceInformationFilter::IncludeDiagnosticLoopback | + MidiEndpointDeviceInformationFilter::IncludeVirtualDeviceResponder + ); + + std::cout << endpoints.Size() << " endpoints returned" << std::endl << std::endl; + + for (auto const& endpoint : endpoints) + { + std::cout << "Identification" << std::endl; + std::cout << "- Name: " << winrt::to_string(endpoint.Name()) << std::endl; + std::cout << "- Id: " << winrt::to_string(endpoint.Id()) << std::endl; + + std::cout << std::endl << "Endpoint Metadata" << std::endl; + std::cout << "- Product Instance Id: " << winrt::to_string(endpoint.ProductInstanceId()) << std::endl; + std::cout << "- Endpoint-supplied Name: " << winrt::to_string(endpoint.EndpointSuppliedName()) << std::endl; + + std::cout << std::endl << "User-supplied Metadata" << std::endl; + std::cout << "- User-supplied Name: " << winrt::to_string(endpoint.UserSuppliedName()) << std::endl; + std::cout << "- Description: " << winrt::to_string(endpoint.Description()) << std::endl; + std::cout << "- Small Image Path: " << winrt::to_string(endpoint.SmallImagePath()) << std::endl; + std::cout << "- Large Image Path: " << winrt::to_string(endpoint.LargeImagePath()) << std::endl; + + // ... + + } +} +``` \ No newline at end of file diff --git a/docs/developer-docs/Windows.Devices.Midi2/enumeration/MidiEndpointDeviceInformation/README.md b/docs/developer-docs/Windows.Devices.Midi2/enumeration/MidiEndpointDeviceInformation/README.md deleted file mode 100644 index 7945faf7..00000000 --- a/docs/developer-docs/Windows.Devices.Midi2/enumeration/MidiEndpointDeviceInformation/README.md +++ /dev/null @@ -1,86 +0,0 @@ -# MidiEndpointDeviceInformation - -This class is a specialized equivalent of the `DeviceInformation` WinRT class. It handles requesting all of the additional properties necessary for MIDI devices, and also goes a step further to retrieve parent device information so that applications can display the endpoints and parent devices in context. - -We've heard from developers that we did not provide sufficient information about devices in the past, so we created this class and the associated properties to remedy that. We also heard that Async calls were a non-starter for most DAW applications, so everything in this class is synchronous. - -> Note: the MidiEndpointDeviceWatcher is a better way to retrieve devices because you can then keep the watcher open in a background thread, and be notified of property changes, device add/remove, etc. - -When displaying endpoint devices to users, you'll typically want to stick to the defaults: `IncludeClientUmpNative | IncludeClientByteStreamNative`. You do not want to show the Diagnostic Ping ever, and you typically will not want to show the system-wide Diagnostic Loopback singletons. Finally, you don't want to show the Virtual Device Responder endpoints because those should be reserved only for the "device" application in app-to-app MIDI. - -## In-protocol discovered information - -When a device is first enumerated by the MIDI Service, if it is a UMP-native device, we will attempt endpoint discover and protocol negotiation. During that, we request all endpoint information and all function block information. The received data is then cached in the device properties so that applications do not need to perform this process themselves. - -## Properties - -| Property | Source | Description | -| --------------- | ------ | ----------- | -| Id | Windows | The endpoint device interface id | -| ContainerId | Windows | The device container | -| DeviceInstanceId | Windows | The device instance id without the interface information | -| Name | Various | This is the name which should be displayed in any application. It calculates the correct name based on the hierarchy of possible names, including a user-specified name. Always respect the user's choice here. | -| TransportSuppliedName | Transports | The name provided by the driver or the endpoint transport. | -| EndpointSuppliedName | MIDI 2.0 | The name provided by MIDI 2.0 endpoint information. This is discovered in-protocol. | -| UserSuppliedName | Configuration | The name provided by the user. | -| ProductInstanceId | MIDI 2.0 | Property of the same name discovered by MIDI 2.0 in-protocol endpoint information. | -| SpecificationVersionMajor | MIDI 2.0 | Discovered UMP version | -| SpecificationVersionMinor | MIDI 2.0 | Discovered UMP version | -| SupportsMidi10Protocol | MIDI 2.0 | Discovered protocol support | -| SupportsMidi20Protocol | MIDI 2.0 | Discovered protocol support | -| ConfiguredToReceiveJRTimestamps | MIDI 2.0 | Note that JR timestamps are handled entirely in the service and are not sent back down to the client. | -| ConfiguredToSendJRTimestamps | MIDI 2.0 | Note that JR timestamps are handled entirely in the service and are not sent back down to the client. | -| DeviceIdentitySystemExclusiveId | MIDI 2.0 | Device Identity information -| DeviceIdentityDeviceFamilyLsb | MIDI 2.0 | Device Identity information -| DeviceIdentityDeviceFamilyMsb | MIDI 2.0 | Device Identity information -| DeviceIdentityDeviceFamilyModelNumberLsb | MIDI 2.0 | Device Identity information -| DeviceIdentityDeviceFamilyModelNumberMsb | MIDI 2.0 | Device Identity information -| DeviceIdentitySoftwareRevisionLevel | MIDI 2.0 | Device Identity information -| TransportId | Windows | The Id of the transport abstraction that manages this endpoint | -| TransportMnemonic | Windows | A short abbreviation for the transport. This can be used as a transport identifier. | -| TransportSuppliedSerialNumber | Windows | iSerialNumber, when available in USB, and other ids from other transports. | -| ManufacturerName | Windows | The name of the manufacturer of the device, if available | -| SupportsMultiClient | Windows | True if this endpoint supports multi-client use | -| NativeDataFormat | Windows | Because the driver and service handle data format translation, it's not immediately obvious if the device is natively UMP or natively Byte Stream. This property provides that information | -| GroupTerminalBlocks | Windows | A collection of Group Terminal Blocks. These are used only in USB. For MIDI 2.0 devices, Function Blocks are preferred. | -| HasStaticFunctionBlocks | MIDI 2.0 | True if the function blocks are static. That is, the groups never change. | -| FunctionBlockCount | MIDI 2.0 | The number of function blocks the endpoint has declared. Function blocks always start at index zero and go to FunctionBlockCount-1 | -| EndpointPurpose | Windows | The purpose of the endpoint. This is used primarily for filtering. | -| Description | Configuration | An endpoint description which is typically provided by the user | -| LargeImagePath | Configuration | The path to a png or jpg image that represents this endpoint. Typically user-supplied. | -| SmallImagePath | Configuration | The path to a png or jpg image that represents this endpoint. Typically user-supplied. | -| RequiresNoteOffTranslation | Configuration | True if the endpoint requires internal translation of Note On with zero velocity (in the case of MIDI 1.0) to a Note Off message. Typically user-supplied. | -| RecommendedCCAutomationIntervalMS | Configuration | Number of milliseconds between automation value changes. This is usually only for old and slow MIDI 1.0 devices that are prone to data flooding. User-supplied. | -| Properties | Windows | A collection of all the raw properties. | - -## Static Properties - -| Static Property | Description | -| --------------- | ----------- | -| DiagnosticsLoopbackAEndpointId | Endpoint Id for the diagnostic loopback used for development and support purposes. | -| DiagnosticsLoopbackBEndpointId | Endpoint Id for the diagnostic loopback used for development and support purposes. | -| EndpointInterfaceClass | The class GUID which appears at the end of the Endpoint Ids | - -## Functions - -| Function | Description | -| --------------- | ----------- | -| GetParentDeviceInformation() | Finds and then retrieves the parent `DeviceInformation` type with appropriate properties. | -| GetContainerInformation() | Gets the device container information and returns its `DeviceInformation` with appropriate properties | -| UpdateFromDeviceInformation(deviceInformation) | For use by any watcher which must update this object | -| UpdateFromDeviceInformationUpdate(deviceInformationUpdate) | For use by any watcher which must update this object | - -## Static Functions - -| Static Function | Description | -| --------------- | ----------- | -| CreateFromId(id) | Creates a new `MidiEndpointDeviceInformation` object from the specified id | -| FindAll() | Searches for all endpoint devices and returns a list in the default sort order | -| FindAll(sortOrder) | Searches for all endpoint devices and returns a list in the specified sort order | -| FindAll(sortOrder, endpointFilter) | Searches for all endpoint devices which match the filter, and returns a list in the specified sort order. | -| DeviceMatchesFilter(deviceInformation, endpointFilter) | A helper function to compare a device against the filter. | -| GetAdditionalPropertiesList() | This returns the list of properties which must be requested during enumeration. Typically not needed for applications, as the watcher calls this function | - -## IDL - -[MidiEndpointDeviceInformation IDL](https://github.com/microsoft/MIDI/blob/main/src/api/Client/Midi2Client/MidiEndpointDeviceInformation.idl) diff --git a/docs/developer-docs/Windows.Devices.Midi2/enumeration/MidiEndpointDeviceInformationUpdateEventArgs.md b/docs/developer-docs/Windows.Devices.Midi2/enumeration/MidiEndpointDeviceInformationUpdateEventArgs.md new file mode 100644 index 00000000..31641976 --- /dev/null +++ b/docs/developer-docs/Windows.Devices.Midi2/enumeration/MidiEndpointDeviceInformationUpdateEventArgs.md @@ -0,0 +1,32 @@ +--- +layout: api_page +title: MidiEndpointDeviceInformationUpdateEventArgs +parent: Endpoint Enumeration +grand_parent: Windows.Devices.Midi2 API +has_children: false +--- + +# MidiEndpointDeviceInformationUpdateEventArgs + +Represents a notification that endpoint properties have been updated + +## Functions + +| Property | Description | +| --------------- | ----------- | +| `Id | Id of the endpoint which has been updated | +| `UpdatedName` | True if the name properties have been updated | +| `UpdatedEndpointInformation` | True if the in-protocol endpoint information has been updated | +| `UpdatedDeviceIdentity` | True if the in-protocol device identity information has been updated | +| `UpdatedStreamConfiguration` | True if protocol negotiation changed configuration of the endpoint | +| `UpdatedFunctionBlocks` | True if any function blocks have been updated | +| `UpdatedUserMetadata` | True if any user-supplied metadata fields have been updated | +| `UpdatedAdditionalCapabilities` | True if the additional capabilities have been updated | +| `DeviceInformationUpdate` | The source `Windows.Devices.Enumeration.DeviceInformationUpdate` object. | + +If none of the `UpdatedXX` properties are true, then other properties have been updated. + +## IDL + +[MidiEndpointDeviceInformationUpdateEventArgs IDL](https://github.com/microsoft/MIDI/blob/main/src/api/Client/Midi2Client/MidiEndpointDeviceInformationUpdateEventArgs.idl) + diff --git a/docs/developer-docs/Windows.Devices.Midi2/enumeration/MidiEndpointDeviceInformationUpdateEventArgs/README.md b/docs/developer-docs/Windows.Devices.Midi2/enumeration/MidiEndpointDeviceInformationUpdateEventArgs/README.md deleted file mode 100644 index c8efaa72..00000000 --- a/docs/developer-docs/Windows.Devices.Midi2/enumeration/MidiEndpointDeviceInformationUpdateEventArgs/README.md +++ /dev/null @@ -1,24 +0,0 @@ -# MidiEndpointDeviceInformationUpdateEventArgs - -Represents a notification that endpoint properties have been updated - -## Functions - -| Property | Description | -| --------------- | ----------- | -| Id | Id of the endpoint which has been updated | -| UpdatedName | True if the name properties have been updated | -| UpdatedEndpointInformation | True if the in-protocol endpoint information has been updated | -| UpdatedDeviceIdentity | True if the in-protocol device identity information has been updated | -| UpdatedStreamConfiguration | True if protocol negotiation changed configuration of the endpoint | -| UpdatedFunctionBlocks | True if any function blocks have been updated | -| UpdatedUserMetadata | True if any user-supplied metadata fields have been updated | -| UpdatedAdditionalCapabilities | True if the additional capabilities have been updated | -| DeviceInformationUpdate | The source `Windows.Devices.Enumeration.DeviceInformationUpdate` object. | - -If none of the `UpdatedXX` properties are true, then other properties have been updated. - -## IDL - -[MidiEndpointDeviceInformationUpdateEventArgs IDL](https://github.com/microsoft/MIDI/blob/main/src/api/Client/Midi2Client/MidiEndpointDeviceInformationUpdateEventArgs.idl) - diff --git a/docs/developer-docs/Windows.Devices.Midi2/enumeration/MidiEndpointDeviceWatcher.md b/docs/developer-docs/Windows.Devices.Midi2/enumeration/MidiEndpointDeviceWatcher.md new file mode 100644 index 00000000..905078c9 --- /dev/null +++ b/docs/developer-docs/Windows.Devices.Midi2/enumeration/MidiEndpointDeviceWatcher.md @@ -0,0 +1,50 @@ +--- +layout: api_page +title: MidiEndpointDeviceWatcher +parent: Endpoint Enumeration +grand_parent: Windows.Devices.Midi2 API +has_children: false +--- + +# MidiEndpointDeviceWatcher + +WinRT provides a `Windows.Devices.Enumeration` namespace with a `DeviceWatcher` class. That class is generic to any type of device, and so requires additional work to use with MIDI devices. Because of that, we've wrapped that functionality in the `MidiEndpointDeviceWatcher` class and the related `MidiEndpointDeviceInformation` class. + +This is the class applications should use when they want to find devices, and also be notified when devices are added or removed, or when properties like function blocks or device names change. + +Create a MidiEndpointDeviceWatcher on a background thread, and use the internal list of Endpoints as your source of record for device properties. + +## Properties + +| Function | Description | +| --------------- | ----------- | +| `Status` | The current status. See the `Windows.Devices.Enumeration.DeviceWatcherStatus` enumeration | +| `EnumeratedEndpointDevices` | The list of enumerated devices. Provided here for convenience so applications do not need to keep their own list of MIDI devices. | + +## Functions + +| Function | Description | +| --------------- | ----------- | +| `Start()` | Begin device enumeration. Wire up event handlers before calling this function. | +| `Stop()` | Stop device enumeration. | + + +## Static Functions + +| Static Function | Description | +| --------------- | ----------- | +| `CreateWatcher(endpointFilter)` | Create a watcher which will enumerate devices based on the provided filter | + +## Events + +| Event | Description | +| --------------- | ----------- | +| `Added(source, deviceInformation)` | A new endpoint has been added. | +| `Removed(source, deviceInformationUpdate)` | An endpoint has been removed. | +| `Updated(source endpointDeviceInformationUpdate)` | Properties of an endpoint have been updated. This is much more common than it was with the older MIDI 1.0 APIs due to both in-protocol endpoint information, and user configuration. | +| `EnumerationCompleted(source)` | Raised when the initial device enumeration has been completed. Devices may still be added or removed after this event, but use this to decide when you have enough information to display an initial list. | +| `Stopped(source)` | Enumeration has been stopped. | + +## IDL + +[MidiEndpointDeviceWatcher IDL](https://github.com/microsoft/MIDI/blob/main/src/api/Client/Midi2Client/MidiEndpointDeviceWatcher.idl) diff --git a/docs/developer-docs/Windows.Devices.Midi2/enumeration/MidiEndpointDeviceWatcher/README.md b/docs/developer-docs/Windows.Devices.Midi2/enumeration/MidiEndpointDeviceWatcher/README.md deleted file mode 100644 index 73385507..00000000 --- a/docs/developer-docs/Windows.Devices.Midi2/enumeration/MidiEndpointDeviceWatcher/README.md +++ /dev/null @@ -1,42 +0,0 @@ -# MidiEndpointDeviceWatcher - -WinRT provides a `Windows.Devices.Enumeration` namespace with a `DeviceWatcher` class. That class is generic to any type of device, and so requires additional work to use with MIDI devices. Because of that, we've wrapped that functionality in the `MidiEndpointDeviceWatcher` class and the related `MidiEndpointDeviceInformation` class. - -This is the class applications should use when they want to find devices, and also be notified when devices are added or removed, or when properties like function blocks or device names change. - -Create a MidiEndpointDeviceWatcher on a background thread, and use the internal list of Endpoints as your source of record for device properties. - -## Properties - -| Function | Description | -| --------------- | ----------- | -| Status | The current status. See the `Windows.Devices.Enumeration.DeviceWatcherStatus` enumeration | -| EnumeratedEndpointDevices | The list of enumerated devices. Provided here for convenience so applications do not need to keep their own list of MIDI devices. | - -## Functions - -| Function | Description | -| --------------- | ----------- | -| Start() | Begin device enumeration. Wire up event handlers before calling this function. | -| Stop() | Stop device enumeration. | - - -## Static Functions - -| Static Function | Description | -| --------------- | ----------- | -| CreateWatcher(endpointFilter) | Create a watcher which will enumerate devices based on the provided filter | - -## Events - -| Event | Description | -| --------------- | ----------- | -| Added(source, deviceInformation) | A new endpoint has been added. | -| Removed(source, deviceInformationUpdate) | An endpoint has been removed. | -| Updated(source endpointDeviceInformationUpdate) | Properties of an endpoint have been updated. This is much more common than it was with the older MIDI 1.0 APIs due to both in-protocol endpoint information, and user configuration. | -| EnumerationCompleted(source) | Raised when the initial device enumeration has been completed. Devices may still be added or removed after this event, but use this to decide when you have enough information to display an initial list. | -| Stopped(source) | Enumeration has been stopped. | - -## IDL - -[MidiEndpointDeviceWatcher IDL](https://github.com/microsoft/MIDI/blob/main/src/api/Client/Midi2Client/MidiEndpointDeviceWatcher.idl) diff --git a/docs/developer-docs/Windows.Devices.Midi2/enumeration/README.md b/docs/developer-docs/Windows.Devices.Midi2/enumeration/README.md index a578f4fa..335cffd8 100644 --- a/docs/developer-docs/Windows.Devices.Midi2/enumeration/README.md +++ b/docs/developer-docs/Windows.Devices.Midi2/enumeration/README.md @@ -1,7 +1,8 @@ -# Enumeration +--- +layout: api_group_page +title: Endpoint Enumeration +parent: Windows.Devices.Midi2 API +has_children: true +--- -Enumeration is how you discover endpoints and get notified of endpoints when they are added, updated, or removed. For the best user experience, keep a `MidiEndpointDeviceWatcher` running in a background thread so you can monitor device removal, and property updates (name, function blocks, etc.) - -* [MidiEndpointDeviceInformation](./MidiEndpointDeviceInformation/) -* [MidiEndpointDeviceWatcher](./MidiEndpointDeviceWatcher/) -* [MidiEndpointDeviceInformationUpdateEventArgs](./MidiEndpointDeviceInformationUpdateEventArgs/) \ No newline at end of file +# Enumeration APIs diff --git a/docs/developer-docs/Windows.Devices.Midi2/messages/MidiMessageBuilder/README.md b/docs/developer-docs/Windows.Devices.Midi2/message-utilities/MidiMessageBuilder.md similarity index 65% rename from docs/developer-docs/Windows.Devices.Midi2/messages/MidiMessageBuilder/README.md rename to docs/developer-docs/Windows.Devices.Midi2/message-utilities/MidiMessageBuilder.md index 8ea6c7c0..453a9156 100644 --- a/docs/developer-docs/Windows.Devices.Midi2/messages/MidiMessageBuilder/README.md +++ b/docs/developer-docs/Windows.Devices.Midi2/message-utilities/MidiMessageBuilder.md @@ -1,3 +1,11 @@ +--- +layout: api_page +title: MidiMessageBuilder +parent: Message Utilities +grand_parent: Windows.Devices.Midi2 API +has_children: false +--- + # MidiMessageBuilder (In progress) diff --git a/docs/developer-docs/Windows.Devices.Midi2/messages/MidiMessageConverter/README.md b/docs/developer-docs/Windows.Devices.Midi2/message-utilities/MidiMessageConverter.md similarity index 66% rename from docs/developer-docs/Windows.Devices.Midi2/messages/MidiMessageConverter/README.md rename to docs/developer-docs/Windows.Devices.Midi2/message-utilities/MidiMessageConverter.md index da2c8ca2..fb26663b 100644 --- a/docs/developer-docs/Windows.Devices.Midi2/messages/MidiMessageConverter/README.md +++ b/docs/developer-docs/Windows.Devices.Midi2/message-utilities/MidiMessageConverter.md @@ -1,3 +1,11 @@ +--- +layout: api_page +title: MidiMessageConverter +parent: Message Utilities +grand_parent: Windows.Devices.Midi2 API +has_children: false +--- + # MidiMessageConverter (In progress) diff --git a/docs/developer-docs/Windows.Devices.Midi2/messages/MidiMessageTranslator/README.md b/docs/developer-docs/Windows.Devices.Midi2/message-utilities/MidiMessageTranslator.md similarity index 66% rename from docs/developer-docs/Windows.Devices.Midi2/messages/MidiMessageTranslator/README.md rename to docs/developer-docs/Windows.Devices.Midi2/message-utilities/MidiMessageTranslator.md index e7e2bdc4..d6dcc416 100644 --- a/docs/developer-docs/Windows.Devices.Midi2/messages/MidiMessageTranslator/README.md +++ b/docs/developer-docs/Windows.Devices.Midi2/message-utilities/MidiMessageTranslator.md @@ -1,3 +1,11 @@ +--- +layout: api_page +title: MidiMessageTranslator +parent: Message Utilities +grand_parent: Windows.Devices.Midi2 API +has_children: false +--- + # MidiMessageTranslator (In progress) diff --git a/docs/developer-docs/Windows.Devices.Midi2/message-utilities/MidiMessageUtility.md b/docs/developer-docs/Windows.Devices.Midi2/message-utilities/MidiMessageUtility.md new file mode 100644 index 00000000..bd6fa688 --- /dev/null +++ b/docs/developer-docs/Windows.Devices.Midi2/message-utilities/MidiMessageUtility.md @@ -0,0 +1,67 @@ +--- +layout: api_page +title: MidiMessageUtility +parent: Message Utilities +grand_parent: Windows.Devices.Midi2 API +has_children: false +--- + +# MidiMessageUtility + +This class contains a number of static helper functions for reading information from Universal MIDI Packets, and also manipulating that information. + +In most cases, the calling application needs to do some validation before calling functions which return specific fields. If, for example, the application asks for the Flex Data Status, but doesn't provide a valid Flex Data message, the function will happily return whatever other data is in the position of that field. + +## Validation Functions + +| Function | Description | +| --------------- | ----------- | +| `ValidateMessage32MessageType(word0)` | Validate that the message type field in the word is for a 32-bit UMP | +| `ValidateMessage64MessageType(word0)` | Validate that the message type field in the word is for a 64-bit UMP | +| `ValidateMessage96MessageType(word0)` | Validate that the message type field in the word is for a 96-bit UMP | +| `ValidateMessage128MessageType(word0)` | Validate that the message type field in the word is for a 128-bit UMP | + +## Informational Functions + +| Function | Description | +| --------------- | ----------- | +| `MessageTypeHasGroupField(messageType)` | Returns true if the message type is known to be one which contains a group field. Valid only for message types known at the type the API was written. | +| `MessageTypeHasChannelField(messageType)` | Returns true if the message type is known to be one which contains a channel field. Valid only for message types known at the type the API was written. | + +## Field Access Functions + +| Function | Description | +| --------------- | ----------- | +| `GetMessageTypeFromMessageFirstWord(word0)` | Returns the `MidiMessageType` for the message | +| `GetPacketTypeFromMessageFirstWord(word0)` | Returns the `MidiPacketType` for the message | +| `GetGroupFromMessageFirstWord(word0)` | Returns the `MidiGroup` for the message. First check to see if the message type has a group field. | +| `GetChannelFromMessageFirstWord(word0)` | Returns the `MidiChannel` for the message. First check to see if the message type has a channel field. | +| `GetStatusFromUtilityMessage(word0)` | Returns the status byte | +| `GetStatusFromMidi1ChannelVoiceMessage(word0)` | When provided a MIDI 1.0 channel voice message, returns the `Midi1ChannelVoiceMessageStatus` for the message. | +| `GetStatusFromMidi2ChannelVoiceMessageFirstWord(word0)` | When provided a MIDI 2.0 channel voice message, returns the `Midi2ChannelVoiceMessageStatus` for the message. | +| `GetStatusBankFromFlexDataMessageFirstWord(word0)` | Returns the status bank byte | +| `GetStatusFromFlexDataMessageFirstWord(word0)` | Returns the status byte | +| `GetStatusFromSystemCommonMessage(word0)` | Returns the status byte | +| `GetStatusFromDataMessage64FirstWord(word0)` | Returns the status byte | +| `GetNumberOfBytesFromDataMessage64FirstWord(word0)` | Returns the byte count field | +| `GetStatusFromDataMessage128FirstWord(word0)` | Returns the status byte | +| `GetNumberOfBytesFromDataMessage128FirstWord(word0)` | Returns the byte count field | +| `GetFormFromStreamMessageFirstWord(word0)` | Returns the form nibble as a byte | +| `GetStatusFromStreamMessageFirstWord(word0)` | Returns the status byte | + +## Field Manipulation Functions + +| Function | Description | +| --------------- | ----------- | +| `ReplaceGroupInMessageFirstWord(word0, newGroup)` | Replaces the group field in word0 and returns the resulting MIDI word | +| `ReplaceChannelInMessageFirstWord(word0, newChannel)` | Replaces the channel field in word0 and returns the resulting MIDI word | + +## Additional Functions + +| Function | Description | +| --------------- | ----------- | +| `GetMessageFriendlyNameFromFirstWord(UInt32 word0)` | Returns the localized "Friendly Name" string for a message. For example, this is what is displayed in the console output when you are monitoring an endpoint in verbose mode. | + +## IDL + +[MidiMessageUtility IDL](https://github.com/microsoft/MIDI/blob/main/src/api/Client/Midi2Client/MidiMessageUtility.idl) diff --git a/docs/developer-docs/Windows.Devices.Midi2/messages/MidiStreamMessageBuilder/README.md b/docs/developer-docs/Windows.Devices.Midi2/message-utilities/MidiStreamMessageBuilder.md similarity index 66% rename from docs/developer-docs/Windows.Devices.Midi2/messages/MidiStreamMessageBuilder/README.md rename to docs/developer-docs/Windows.Devices.Midi2/message-utilities/MidiStreamMessageBuilder.md index 356c1c24..8b31c247 100644 --- a/docs/developer-docs/Windows.Devices.Midi2/messages/MidiStreamMessageBuilder/README.md +++ b/docs/developer-docs/Windows.Devices.Midi2/message-utilities/MidiStreamMessageBuilder.md @@ -1,3 +1,11 @@ +--- +layout: api_page +title: MidiStreamMessageBuilder +parent: Message Utilities +grand_parent: Windows.Devices.Midi2 API +has_children: false +--- + # MidiStreamMessageBuilder (In progress) diff --git a/docs/developer-docs/Windows.Devices.Midi2/message-utilities/README.md b/docs/developer-docs/Windows.Devices.Midi2/message-utilities/README.md new file mode 100644 index 00000000..2fea3a9b --- /dev/null +++ b/docs/developer-docs/Windows.Devices.Midi2/message-utilities/README.md @@ -0,0 +1,9 @@ +--- +layout: api_group_page +title: Message Utilities +parent: Windows.Devices.Midi2 API +has_children: true +--- + +# Message Utilities + diff --git a/docs/developer-docs/Windows.Devices.Midi2/messages/IMidiUniversalPacket.md b/docs/developer-docs/Windows.Devices.Midi2/messages/IMidiUniversalPacket.md new file mode 100644 index 00000000..120e56c7 --- /dev/null +++ b/docs/developer-docs/Windows.Devices.Midi2/messages/IMidiUniversalPacket.md @@ -0,0 +1,24 @@ +--- +layout: api_page +title: IMidiUniversalPacket +parent: Messages +grand_parent: Windows.Devices.Midi2 API +has_children: false +--- + +# IMidiUniversalPacket + +This interface is implemented by the rich MidiMessageXX runtime class types. It may also be used as the interface for message-specific classes you create yourself. + +| Property | Description | +| -------- | ----------- | +| `Timestamp` | 64 bit timestamp set by the receiving transport in the case of incoming messages, or by the sender in the case of outgoing messages | +| `MessageType` | A [MidiMessageType enumeration value](./MidiMessageTypeEnum.md) which represents the 4 bit MIDI Message type 0x0 - 0xF as defined by the MIDI UMP standard. | +| `PacketType` | A [MidiPacketType enumeration value](./MidiPacketTypeEnum.md) which can be cast to an int to get the number of 32-bit words in the message packet | + +| Function | Description | +| -------- | ----------- | +| `PeekFirstWord()` | Provides access to the first word of data, even if the message type and size is not yet known by the API user | + +[IMidiUniversalPacket IDL](https://github.com/microsoft/MIDI/blob/main/src/api/Client/Midi2Client/IMidiUniversalPacket.idl) + diff --git a/docs/developer-docs/Windows.Devices.Midi2/messages/MidiMessage128.md b/docs/developer-docs/Windows.Devices.Midi2/messages/MidiMessage128.md new file mode 100644 index 00000000..9b6c2cdb --- /dev/null +++ b/docs/developer-docs/Windows.Devices.Midi2/messages/MidiMessage128.md @@ -0,0 +1,27 @@ +--- +layout: api_page +title: MidiMessage128 +parent: Messages +grand_parent: Windows.Devices.Midi2 API +has_children: false +--- + +# MidiMessage128 + +`MidiMessage128` is used for some data messages as well as important "Type F" stream metadata messages. + +Includes all functions and properties in `IMidiUniversalPacket`, as well as: + +| Property | Description | +| -------- | ----------- | +| `Word0` | First 32-bit MIDI word | +| `Word1` | Second 32-bit MIDI word | +| `Word2` | Third 32-bit MIDI word | +| `Word3` | Fourth 32-bit MIDI word | + +| Function | Description | +| -------- | ----------- | +| `MidiMessage128()` | Default constructor | +| `MidiMessage128(timestamp, word0, word1, word2, word3)` | Construct a new message with a timestamp and all 32 bit MIDI words | + +[MidiMessage128 IDL](https://github.com/microsoft/MIDI/blob/main/src/api/Client/Midi2Client/MidiMessage128.idl) diff --git a/docs/developer-docs/Windows.Devices.Midi2/messages/MidiMessage32.md b/docs/developer-docs/Windows.Devices.Midi2/messages/MidiMessage32.md new file mode 100644 index 00000000..ab1382f5 --- /dev/null +++ b/docs/developer-docs/Windows.Devices.Midi2/messages/MidiMessage32.md @@ -0,0 +1,24 @@ +--- +layout: api_page +title: MidiMessage32 +parent: Messages +grand_parent: Windows.Devices.Midi2 API +has_children: false +--- + +# MidiMessage32 + +`MidiMessage32` is used for short messages such as utility messages and MIDI 1.0 messages in UMP format. + +Includes all functions and properties in `IMidiUniversalPacket`, as well as: + +| Property | Description | +| -------- | ----------- | +| `Word0` | First 32-bit MIDI word| + +| Function | Description | +| -------- | ----------- | +| `MidiMessage32()` | Default constructor | +| `MidiMessage32(timestamp, word0)` | Construct a new message with a timestamp and 32 bit MIDI word | + +[MidiMessage32 IDL](https://github.com/microsoft/MIDI/blob/main/src/api/Client/Midi2Client/MidiMessage32.idl) diff --git a/docs/developer-docs/Windows.Devices.Midi2/messages/MidiMessage64.md b/docs/developer-docs/Windows.Devices.Midi2/messages/MidiMessage64.md new file mode 100644 index 00000000..1e454822 --- /dev/null +++ b/docs/developer-docs/Windows.Devices.Midi2/messages/MidiMessage64.md @@ -0,0 +1,26 @@ +--- +layout: api_page +title: MidiMessage64 +parent: Messages +grand_parent: Windows.Devices.Midi2 API +has_children: false +--- + +# MidiMessage64 + +`MidiMessage64` is used for some data messages and for MIDI 2.0 Channel Voice messages. + +Includes all functions and properties in `IMidiUniversalPacket`, as well as: + +| Property | Description | +| -------- | ----------- | +| `Word0` | First 32-bit MIDI word| +| `Word1` | Second 32-bit MIDI word | + +| Function | Description | +| -------- | ----------- | +| `MidiMessage64()` | Default constructor | +| `MidiMessage64(timestamp, word0, word1)` | Construct a new message with a timestamp and all 32 bit MIDI words | + +[MidiMessage64 IDL](https://github.com/microsoft/MIDI/blob/main/src/api/Client/Midi2Client/MidiMessage64.idl) + diff --git a/docs/developer-docs/Windows.Devices.Midi2/messages/MidiMessage96.md b/docs/developer-docs/Windows.Devices.Midi2/messages/MidiMessage96.md new file mode 100644 index 00000000..ec18a959 --- /dev/null +++ b/docs/developer-docs/Windows.Devices.Midi2/messages/MidiMessage96.md @@ -0,0 +1,27 @@ +--- +layout: api_page +title: MidiMessage96 +parent: Messages +grand_parent: Windows.Devices.Midi2 API +has_children: false +--- + +# MidiMessage96 + +`MidiMessage96` is currently unused in the MIDI 2.0 UMP specification. + +Includes all functions and properties in `IMidiUniversalPacket`, as well as: + +| Property | Description | +| -------- | ----------- | +| `Word0` | First 32-bit MIDI word | +| `Word1` | Second 32-bit MIDI word | +| `Word2` | Third 32-bit MIDI word | + +| Function | Description | +| -------- | ----------- | +| `MidiMessage96()` | Default constructor | +| `MidiMessage96(timestamp, word0, word1, word2)` | Construct a new message with a timestamp and all 32 bit MIDI words | + +[MidiMessage96 IDL](https://github.com/microsoft/MIDI/blob/main/src/api/Client/Midi2Client/MidiMessage96.idl) + diff --git a/docs/developer-docs/Windows.Devices.Midi2/messages/MidiMessageStruct.md b/docs/developer-docs/Windows.Devices.Midi2/messages/MidiMessageStruct.md new file mode 100644 index 00000000..611b90f6 --- /dev/null +++ b/docs/developer-docs/Windows.Devices.Midi2/messages/MidiMessageStruct.md @@ -0,0 +1,20 @@ +--- +layout: api_page +title: MidiMessageStruct +parent: Messages +grand_parent: Windows.Devices.Midi2 API +has_children: false +--- + +# MidiMessageStruct + +`MidiMessageStruct` is provided for cases where the API consumer wants to have a fixed value type they can use to send and receive messages. In the case of receiving messages, a function which fills the struct will typically return a count of valid words. The `MidiMessageStruct` struct type is simpler than the other runtime class types and may therefore perform better in some projections and for some uses. Note that this type does not include the timestamp field. + +| Field | Description | +| -------- | ----------- | +| `Word0` | First 32-bit MIDI word | +| `Word1` | Second 32-bit MIDI word | +| `Word2` | Third 32-bit MIDI word | +| `Word3` | Fourth 32-bit MIDI word | + +[MidiMessageStruct IDL](https://github.com/microsoft/MIDI/blob/main/src/api/Client/Midi2Client/MidiMessageStruct.idl) diff --git a/docs/developer-docs/Windows.Devices.Midi2/messages/MidiMessageTypeEnum.md b/docs/developer-docs/Windows.Devices.Midi2/messages/MidiMessageTypeEnum.md new file mode 100644 index 00000000..24261bcb --- /dev/null +++ b/docs/developer-docs/Windows.Devices.Midi2/messages/MidiMessageTypeEnum.md @@ -0,0 +1,32 @@ +--- +layout: api_page +title: MidiMessageType +parent: Messages +grand_parent: Windows.Devices.Midi2 API +has_children: false +--- + +# MidiMessageType Enumeration + +The values correspond directly to the "mt" field in the MIDI UMP packet and may be cast as such if trimmed to 4 bits and shifted into place. + +| Property | Value | Description | +| -------- | ------- | ------ | +| `UtilityMessage32` | `0x0` | 32-bit utility message | +| `SystemCommon32` | `0x1` | 32-bit system common message | +| `Midi1ChannelVoice32` | `0x2` | 32-bit MIDI 1.0 channel voice message | +| `DataMessage64` | `0x3` | 64-bit data message (including MIDI 1.0 System Exclusive) | +| `Midi2ChannelVoice64` | `0x4` | 64-bit MIDI 2.0 channel voice message | +| `DataMessage128` | `0x5` | 128-bit Data Message | +| `FutureReserved632` | `0x6` | Reserved for future use by the MIDI standards bodies | +| `FutureReserved732` | `0x7` | Reserved for future use by the MIDI standards bodies | +| `FutureReserved864` | `0x8` | Reserved for future use by the MIDI standards bodies | +| `FutureReserved964` | `0x9` | Reserved for future use by the MIDI standards bodies | +| `FutureReservedA64` | `0xA` | Reserved for future use by the MIDI standards bodies | +| `FutureReservedB96` | `0xB` | Reserved for future use by the MIDI standards bodies | +| `FutureReservedC96` | `0xC` | Reserved for future use by the MIDI standards bodies | +| `FlexData128` | `0xD` | 128-bit Flex Data message including song file data messages | +| `FutureReservedE128` | `0xE` | Reserved for future use by the MIDI standards bodies | +| `Stream128` | `0xF` | 128-bit stream message, including endpoint discovery and function block messages | + +[MidiMessageType IDL](https://github.com/microsoft/MIDI/blob/main/src/api/Client/Midi2Client/MidiMessageTypeEnum.idl) diff --git a/docs/developer-docs/Windows.Devices.Midi2/messages/MidiMessageUtility/README.md b/docs/developer-docs/Windows.Devices.Midi2/messages/MidiMessageUtility/README.md deleted file mode 100644 index 4c78cedc..00000000 --- a/docs/developer-docs/Windows.Devices.Midi2/messages/MidiMessageUtility/README.md +++ /dev/null @@ -1,16 +0,0 @@ -# MidiMessageUtility - -(In progress) - -## Functions - -| Function | Description | -| --------------- | ----------- | -| | | -| | | -| | | -| | | - -## IDL - -[MidiMessageUtility IDL](https://github.com/microsoft/MIDI/blob/main/src/api/Client/Midi2Client/MidiMessageUtility.idl) diff --git a/docs/developer-docs/Windows.Devices.Midi2/messages/MidiPacketTypeEnum.md b/docs/developer-docs/Windows.Devices.Midi2/messages/MidiPacketTypeEnum.md new file mode 100644 index 00000000..08b8dc73 --- /dev/null +++ b/docs/developer-docs/Windows.Devices.Midi2/messages/MidiPacketTypeEnum.md @@ -0,0 +1,21 @@ +--- +layout: api_page +title: MidiPacketType +parent: Messages +grand_parent: Windows.Devices.Midi2 API +has_children: false +--- + +# MidiPacketType Enumeration + +The values correspond to the number of 32-bit MIDI words in the packet. + +| Property | Value | Description | +| -------- | ------- | ------ | +| `UnknownOrInvalid` | `0` | An invalid zero-length Universal MIDI Packet | +| `UniversalMidiPacket32` | `1` | 32-bit (1 word) Universal MIDI Packet | +| `UniversalMidiPacket64` | `2` | 64-bit (2 words) Universal MIDI Packet | +| `UniversalMidiPacket96` | `3` | 96-bit (3 words) Universal MIDI Packet | +| `UniversalMidiPacket128` | `4` | 128-bit (4 words) Universal MIDI Packet | + +[MidiPacketType IDL](https://github.com/microsoft/MIDI/blob/main/src/api/Client/Midi2Client/MidiPacketTypeEnum.idl) diff --git a/docs/developer-docs/Windows.Devices.Midi2/messages/README.md b/docs/developer-docs/Windows.Devices.Midi2/messages/README.md index f8010bcb..015bca94 100644 --- a/docs/developer-docs/Windows.Devices.Midi2/messages/README.md +++ b/docs/developer-docs/Windows.Devices.Midi2/messages/README.md @@ -1,10 +1,26 @@ +--- +layout: api_group_page +title: Messages +parent: Windows.Devices.Midi2 API +has_children: true +--- + # Messages -MIDI Messages are discrete packets of data of a known length. In the MIDI 2.0 specification, they are known as Universal MIDI Packets. In Windows MIDI Services, even MIDI 1.0 bytestream messages are presented in their equivalent Universal MIDI Packet format. The API includes several classes not only for the messages, but also to help construct and parse them. +Windows MIDI Services messages are all sent and received in Universal MIDI Packet (UMP) format. a UMP is made up of 1-4 32 bit MIDI words, sized in 32 bit, 64 bit, 96 bit, and 128 bit packets. The first four bits of the packet are the message type, and from that, you can identify the type and size of message which follows. + +## Words + +Several functions operate on one or more 32 bit MIDI words directly. This is efficient for transmission, but may not be convenient for storage or processing. + +## Rich Types + +The rich UMP types are full runtime classes, and so have more overhead than the fixed types or raw words. However, they offer conveniences not offered by the other types, including storage of the timestamp, message and packet type enumerations, and interface-based polymorphism. If your send/receive speed is not super critical, these are often the easiest solution. + +If you are familiar with the `Windows.Devices.Midi` message types, these are the conceptual equivalent in UMP. + +For the most part, we do not provide strongly-typed discrete message types (like specific MIDI 2.0 Channel Voice messages or similar) in the API as that is a moving target, and many applications also include their own message creation and processing functions using their own libraries or any of the libraries included on [https://midi2.dev](https://midi2.dev). If there's demand for strongly-typed messages, we may provide them in the future. + +## Fixed-Size Struct type -* [Midi Message Types](./midi-message-types/) -* [MidiMessageBuilder](./MidiMessageBuilder/) -* [MidiMessageConverter](./MidiMessageConverter/) -* [MidiMessageTranslator](./MidiMessageTranslator/) -* [MidiMessageUtility](./MidiMessageUtility/) -* [MidiStreamMessageBuilder](./MidiStreamMessageBuilder/) \ No newline at end of file +In addition to the richer types and raw words, the `MidiMessageStruct` type offers a fixed 128 bit message which can be used to send or receive any type of MIDI UMP. diff --git a/docs/developer-docs/Windows.Devices.Midi2/messages/midi-message-types/MidiMessageTypeEnum.md b/docs/developer-docs/Windows.Devices.Midi2/messages/midi-message-types/MidiMessageTypeEnum.md deleted file mode 100644 index 3d1fc224..00000000 --- a/docs/developer-docs/Windows.Devices.Midi2/messages/midi-message-types/MidiMessageTypeEnum.md +++ /dev/null @@ -1,24 +0,0 @@ -# MIDI Message Type Enumeration - -The values correspond directly to the "mt" field in the MIDI UMP packet and may be cast as such if trimmed to 4 bits and shifted into place. - -| Property | Value | Description | -| -------- | ------- | ------ | -| UtilityMessage32 | 0x0 | 32-bit utility message | -| SystemCommon32 | 0x1 | 32-bit system common message | -| Midi1ChannelVoice32 | 0x2 | 32-bit MIDI 1.0 channel voice message | -| DataMessage64 | 0x3 | 64-bit data message (including MIDI 1.0 System Exclusive) | -| Midi2ChannelVoice64 | 0x4 | 64-bit MIDI 2.0 channel voice message | -| DataMessage128 | 0x5 | 128-bit Data Message | -| FutureReserved632 | 0x6 | Reserved for future use by the MIDI standards bodies | -| FutureReserved732 | 0x7 | Reserved for future use by the MIDI standards bodies | -| FutureReserved864 | 0x8 | Reserved for future use by the MIDI standards bodies | -| FutureReserved964 | 0x9 | Reserved for future use by the MIDI standards bodies | -| FutureReservedA64 | 0xA | Reserved for future use by the MIDI standards bodies | -| FutureReservedB96 | 0xB | Reserved for future use by the MIDI standards bodies | -| FutureReservedC96 | 0xC | Reserved for future use by the MIDI standards bodies | -| FlexData128 | 0xD | 128-bit Flex Data message including song file data messages | -| FutureReservedE128 | 0xE | Reserved for future use by the MIDI standards bodies | -| Stream128 | 0xF | 128-bit stream message, including endpoint discovery and function block messages | - -[IDL](https://github.com/microsoft/MIDI/blob/main/src/api/Client/Midi2Client/MidiMessageTypeEnum.idl) diff --git a/docs/developer-docs/Windows.Devices.Midi2/messages/midi-message-types/MidiPacketTypeEnum.md b/docs/developer-docs/Windows.Devices.Midi2/messages/midi-message-types/MidiPacketTypeEnum.md deleted file mode 100644 index 7d58dc58..00000000 --- a/docs/developer-docs/Windows.Devices.Midi2/messages/midi-message-types/MidiPacketTypeEnum.md +++ /dev/null @@ -1,13 +0,0 @@ -# MIDI Packet Type Enumeration - -The values correspond to the number of 32-bit MIDI words in the packet. - -| Property | Value | Description | -| -------- | ------- | ------ | -| UnknownOrInvalid | 0 | An invalid zero-length Universal MIDI Packet | -| UniversalMidiPacket32 | 1 | 32-bit (1 word) Universal MIDI Packet | -| UniversalMidiPacket64 | 2 | 64-bit (2 words) Universal MIDI Packet | -| UniversalMidiPacket96 | 3 | 96-bit (3 words) Universal MIDI Packet | -| UniversalMidiPacket128 | 4 | 128-bit (4 words) Universal MIDI Packet | - -[IDL](https://github.com/microsoft/MIDI/blob/main/src/api/Client/Midi2Client/MidiPacketTypeEnum.idl) diff --git a/docs/developer-docs/Windows.Devices.Midi2/messages/midi-message-types/README.md b/docs/developer-docs/Windows.Devices.Midi2/messages/midi-message-types/README.md deleted file mode 100644 index 453983d6..00000000 --- a/docs/developer-docs/Windows.Devices.Midi2/messages/midi-message-types/README.md +++ /dev/null @@ -1,120 +0,0 @@ -# MIDI Message Types - -Windows MIDI Services messages are all sent and received in Universal MIDI Packet (UMP) format. a UMP is made up of 1-4 32 bit MIDI words. - -## Words - -Several functions operate on 32 bit MIDI words directly. This is efficient for transmission, but may not be convenient for storage or processing. - -## Rich Types - -The rich UMP types are full runtime classes, and so have more overhead than the fixed types or raw words. However, they offer conveniences not offered by the other types, including storage of the timestamp, message and packet type enumerations, and interface-based polymorphism. If your send/receive speed is not super critical, these are often the easiest solution. - -If you are familiar with the `Windows.Devices.Midi` message types, these are the conceptual equivalent in UMP. - -For the most part, we do not provide strongly-typed discrete message types (like specific MIDI 2.0 Channel Voice messages or similar) in the API as that is a moving target, and many applications also include their own message creation and processing functions using their own libraries or any of the libraries included on [https://midi2.dev](https://midi2.dev). If there's demand for strongly-typed messages, we may provide them in the future. - -### IMidiUniversalPacket - -| Property | Description | -| -------- | ----------- | -| Timestamp | 64 bit timestamp set by the receiving transport in the case of incoming messages, or by the sender in the case of outgoing messages | -| MessageType | A [MidiMessageType enumeration value](./MidiMessageTypeEnum.md) which represents the 4 bit MIDI Message type 0x0 - 0xF as defined by the MIDI UMP standard. | -| PacketType | A [MidiPacketType enumeration value](./MidiPacketTypeEnum.md) which can be cast to an int to get the number of 32-bit words in the message packet | - -| Function | Description | -| -------- | ----------- | -| PeekFirstWord() | Provides access to the first word of data, even if the message type and size is not yet known by the API user | - -[IDL](https://github.com/microsoft/MIDI/blob/main/src/api/Client/Midi2Client/IMidiUniversalPacket.idl) - -### MidiMessage32 - -`MidiMessage32` is used for short messages such as utility messages and MIDI 1.0 messages in UMP format. - -Includes all functions and properties in `IMidiUniversalPacket`, as well as: - -| Property | Description | -| -------- | ----------- | -| Word0 | First 32-bit MIDI word| - -| Function | Description | -| -------- | ----------- | -| MidiMessage32() | Default constructor | -| MidiMessage32(timestamp, word0) | Construct a new message with a timestamp and 32 bit MIDI word | - -[IDL](https://github.com/microsoft/MIDI/blob/main/src/api/Client/Midi2Client/MidiMessage32.idl) - -### MidiMessage64 - -`MidiMessage64` is used for some data messages and for MIDI 2.0 Channel Voice messages. - -Includes all functions and properties in `IMidiUniversalPacket`, as well as: - -| Property | Description | -| -------- | ----------- | -| Word0 | First 32-bit MIDI word| -| Word1 | Second 32-bit MIDI word | - -| Function | Description | -| -------- | ----------- | -| MidiMessage64() | Default constructor | -| MidiMessage64(timestamp, word0, word1) | Construct a new message with a timestamp and all 32 bit MIDI words | - -[IDL](https://github.com/microsoft/MIDI/blob/main/src/api/Client/Midi2Client/MidiMessage64.idl) - -### MidiMessage96 - -`MidiMessage96` is currently unused in the MIDI 2.0 UMP specification. - -Includes all functions and properties in `IMidiUniversalPacket`, as well as: - -| Property | Description | -| -------- | ----------- | -| Word0 | First 32-bit MIDI word | -| Word1 | Second 32-bit MIDI word | -| Word2 | Third 32-bit MIDI word | - -| Function | Description | -| -------- | ----------- | -| MidiMessage96() | Default constructor | -| MidiMessage96(timestamp, word0, word1, word2) | Construct a new message with a timestamp and all 32 bit MIDI words | - -[IDL](https://github.com/microsoft/MIDI/blob/main/src/api/Client/Midi2Client/MidiMessage96.idl) - -### MidiMessage128 - -`MidiMessage128` is used for some data messages as well as important "Type F" stream metadata messages. - -Includes all functions and properties in `IMidiUniversalPacket`, as well as: - -| Property | Description | -| -------- | ----------- | -| Word0 | First 32-bit MIDI word | -| Word1 | Second 32-bit MIDI word | -| Word2 | Third 32-bit MIDI word | -| Word3 | Fourth 32-bit MIDI word | - -| Function | Description | -| -------- | ----------- | -| MidiMessage128() | Default constructor | -| MidiMessage128(timestamp, word0, word1, word2, word3) | Construct a new message with a timestamp and all 32 bit MIDI words | - -[IDL](https://github.com/microsoft/MIDI/blob/main/src/api/Client/Midi2Client/MidiMessage128.idl) - -## Fixed Types - -In addition to working with raw 32 bit words, the API provides a fixed structure type for messages. - -### MidiMessageStruct - -`MidiMessageStruct` is provided for cases where the API consumer wants to have a fixed value type they can use to send and receive messages. In the case of receiving messages, a function which fills the struct will typically return a count of valid words. The `MidiMessageStruct` struct type is simpler than the other runtime class types and may therefore perform better in some projections and for some uses. Note that this type does not include the timestamp field. - -| Field | Description | -| -------- | ----------- | -| Word0 | First 32-bit MIDI word | -| Word1 | Second 32-bit MIDI word | -| Word2 | Third 32-bit MIDI word | -| Word3 | Fourth 32-bit MIDI word | - -[IDL](https://github.com/microsoft/MIDI/blob/main/src/api/Client/Midi2Client/MidiMessageStruct.idl) diff --git a/docs/developer-docs/Windows.Devices.Midi2/metadata/MidiFunctionBlock/README.md b/docs/developer-docs/Windows.Devices.Midi2/metadata/MidiFunctionBlock.md similarity index 67% rename from docs/developer-docs/Windows.Devices.Midi2/metadata/MidiFunctionBlock/README.md rename to docs/developer-docs/Windows.Devices.Midi2/metadata/MidiFunctionBlock.md index 9e945fc6..008862fd 100644 --- a/docs/developer-docs/Windows.Devices.Midi2/metadata/MidiFunctionBlock/README.md +++ b/docs/developer-docs/Windows.Devices.Midi2/metadata/MidiFunctionBlock.md @@ -1,3 +1,11 @@ +--- +layout: api_page +title: MidiFunctionBlock +parent: Metadata +grand_parent: Windows.Devices.Midi2 API +has_children: false +--- + # MidiFunctionBlock The original MIDI 2.0 USB specification includes the concept of a Group Terminal Block. After ratification of that specification, it was found that Group Terminal Blocks were insufficient for two main reasons: @@ -26,24 +34,24 @@ Most properties are 1:1 with the MIDI 2.0 UMP specification section on function | Property | Description | | --------------- | ----------- | -| IsReadOnly | True if this function block should be treated as read-only. If you attempt to assign a value to a property in a read-only function block, the assignment will silently fail. | -| Number | The index of the block 0-31. We use "number" here to be consistent with the specification | -| Name | The assembled name of the function block | -| IsActive | True if this block is active | -| Direction | The direction of the block from the block's point of view. | -| UIHint | A hint which tells you how this block should be treated in a user interface. This should be considered a "soft filter" for display, not a mechanism to keep blocks completely hidden from a user. | -| Midi10Connection | How to treat this block if it is a MIDI 1.0 connection | -| FirstGroupIndex | Zero-based index of the first group spanned by this block. | -| GroupCount | The number of groups spanned. | -| MidiCIMessageVersionFormat | MIDI CI version format value | -| MaxSystemExclusive8Streams | The maximum number of System Exclusive 8 streams allowed. Please refer to the UMP specification for how to treat this value. | +| `IsReadOnly` | True if this function block should be treated as read-only. If you attempt to assign a value to a property in a read-only function block, the assignment will silently fail. | +| `Number` | The index of the block 0-31. We use "number" here to be consistent with the specification | +| `Name` | The assembled name of the function block | +| `IsActive` | True if this block is active | +| `Direction` | The direction of the block from the block's point of view. | +| `UIHint` | A hint which tells you how this block should be treated in a user interface. This should be considered a "soft filter" for display, not a mechanism to keep blocks completely hidden from a user. | +| `Midi10Connection` | How to treat this block if it is a MIDI 1.0 connection | +| `FirstGroupIndex` | Zero-based index of the first group spanned by this block. | +| `GroupCount` | The number of groups spanned. | +| `MidiCIMessageVersionFormat` | MIDI CI version format value | +| `MaxSystemExclusive8Streams` | The maximum number of System Exclusive 8 streams allowed. Please refer to the UMP specification for how to treat this value. | ## Functions | Function | Description | | --------------- | ----------- | -| MidiFunctionBlock() | Construct an empty function block | -| IncludesGroup(group) | Helper function which returns true if this function exists on the supplied group | +| `MidiFunctionBlock()` | Construct an empty function block | +| `IncludesGroup(group)` | Helper function which returns true if this function exists on the supplied group | ## IDL diff --git a/docs/developer-docs/Windows.Devices.Midi2/metadata/MidiGroupTerminalBlock.md b/docs/developer-docs/Windows.Devices.Midi2/metadata/MidiGroupTerminalBlock.md new file mode 100644 index 00000000..55fc39be --- /dev/null +++ b/docs/developer-docs/Windows.Devices.Midi2/metadata/MidiGroupTerminalBlock.md @@ -0,0 +1,39 @@ +--- +layout: api_page +title: MidiGroupTerminalBlock +parent: Metadata +grand_parent: Windows.Devices.Midi2 API +has_children: false +--- + +# MidiGroupTerminalBlock + +A Group Terminal Block is a USB-only feature used to describe the groups on a device. When available, Function Blocks are the preferred mechanism for finding active groups, names, and more, meaning that the Group Terminal Block can typically be ignored in those cases. For more context, please see the documentation for the [MidiFunctionBlock](../MidiFunctionBlock/) type. + +> Note: In Windows MIDI Services, we translate MIDI 1.0 device "ports" into individual Group Terminal Blocks. Each virtual cable number in the stream, which used to become a separate input or output port, now maps to a group number. For example, a 5 port MIDI 1.0 device will now show up as a single endpoint with 5 Group Terminal Blocks each spanning a single group. + +## Properties + +| Property | Description | +| --------------- | ----------- | +| `Number` | Block number | +| `Name` | Name provided by USB. In the case of MIDI 1.0 devices, when available, this is the `iJack` string | +| `Direction` | Direction of the block, from the block's point of view | +| `Protocol` | Information about the protocol in use. Note that the Jitter Reduction values here should be ignored. Jitter reduction timestamp handling is negotiated through protocol negotiation, and is entirely handled by the service | +| `FirstGroupIndex` | The index of the first group spanned by this block | +| `GroupCount` | The number of groups spanned | +| `MaxDeviceInputBandwidthIn4KBitsPerSecondUnits` | Please see the USB MIDI 2.0 specification for the actual value for this field. | +| `MaxDeviceOutputBandwidthIn4KBitsPerSecondUnits` | Please see the USB MIDI 2.0 specification for the actual value for this field. | +| `CalculatedMaxDeviceInputBandwidthBitsPerSecond` | Bits-per-second calculated value for the `MaxDeviceInputBandwidthIn4KBitsPerSecondUnits` property | +| `CalculatedMaxDeviceOutputBandwidthBitsPerSecond` | Bits-per-second calculated value for the `MaxDeviceOutputBandwidthIn4KBitsPerSecondUnits` property | + +## Functions + +| Function | Description | +| --------------- | ----------- | +| `IncludesGroup(group)` | Helper function which returns true if this function exists on the supplied group | +| `AsEquivalentFunctionBlock()` | Helper function which returns a `MidiFunctionBlock` that is approximately equivalent to this `MidiGroupTerminalBlock`. This is to enable applications to be able to deal with only a single type of block when showing the metadata | + +## IDL + +[MidiGroupTerminalBlock IDL](https://github.com/microsoft/MIDI/blob/main/src/api/Client/Midi2Client/MidiGroupTerminalBlock.idl) diff --git a/docs/developer-docs/Windows.Devices.Midi2/metadata/MidiGroupTerminalBlock/README.md b/docs/developer-docs/Windows.Devices.Midi2/metadata/MidiGroupTerminalBlock/README.md deleted file mode 100644 index 757c4c9a..00000000 --- a/docs/developer-docs/Windows.Devices.Midi2/metadata/MidiGroupTerminalBlock/README.md +++ /dev/null @@ -1,31 +0,0 @@ -# MidiGroupTerminalBlock - -A Group Terminal Block is a USB-only feature used to describe the groups on a device. When available, Function Blocks are the preferred mechanism for finding active groups, names, and more, meaning that the Group Terminal Block can typically be ignored in those cases. For more context, please see the documentation for the [MidiFunctionBlock](../MidiFunctionBlock/) type. - -> Note: In Windows MIDI Services, we translate MIDI 1.0 device "ports" into individual Group Terminal Blocks. Each virtual cable number in the stream, which used to become a separate input or output port, now maps to a group number. For example, a 5 port MIDI 1.0 device will now show up as a single endpoint with 5 Group Terminal Blocks each spanning a single group. - -## Properties - -| Property | Description | -| --------------- | ----------- | -| Number | Block number | -| Name | Name provided by USB. In the case of MIDI 1.0 devices, when available, this is the `iJack` string | -| Direction | Direction of the block, from the block's point of view | -| Protocol | Information about the protocol in use. Note that the Jitter Reduction values here should be ignored. Jitter reduction timestamp handling is negotiated through protocol negotiation, and is entirely handled by the service | -| FirstGroupIndex | The index of the first group spanned by this block | -| GroupCount | The number of groups spanned | -| MaxDeviceInputBandwidthIn4KBitsPerSecondUnits | Please see the USB MIDI 2.0 specification for the actual value for this field. | -| MaxDeviceOutputBandwidthIn4KBitsPerSecondUnits | Please see the USB MIDI 2.0 specification for the actual value for this field. | -| CalculatedMaxDeviceInputBandwidthBitsPerSecond | Bits-per-second calculated value for the `MaxDeviceInputBandwidthIn4KBitsPerSecondUnits` property | -| CalculatedMaxDeviceOutputBandwidthBitsPerSecond | Bits-per-second calculated value for the `MaxDeviceOutputBandwidthIn4KBitsPerSecondUnits` property | - -## Functions - -| Function | Description | -| --------------- | ----------- | -| IncludesGroup(group) | Helper function which returns true if this function exists on the supplied group | -| AsEquivalentFunctionBlock() | Helper function which returns a `MidiFunctionBlock` that is approximately equivalent to this `MidiGroupTerminalBlock`. This is to enable applications to be able to deal with only a single type of block when showing the metadata | - -## IDL - -[MidiGroupTerminalBlock IDL](https://github.com/microsoft/MIDI/blob/main/src/api/Client/Midi2Client/MidiGroupTerminalBlock.idl) diff --git a/docs/developer-docs/Windows.Devices.Midi2/metadata/README.md b/docs/developer-docs/Windows.Devices.Midi2/metadata/README.md index 0e6f6350..4deb80d4 100644 --- a/docs/developer-docs/Windows.Devices.Midi2/metadata/README.md +++ b/docs/developer-docs/Windows.Devices.Midi2/metadata/README.md @@ -1,3 +1,10 @@ +--- +layout: api_group_page +title: Metadata +parent: Windows.Devices.Midi2 API +has_children: true +--- + # Metadata The Windows Service intercepts (but does not remove from the stream) Endpoint metadata notifications. For example, we'll intercept Endpoint Name notifications and use those to provide a new endpoint-supplied name for the device. These are cached in the SWD properties for the Endpoint Device. @@ -5,6 +12,3 @@ The Windows Service intercepts (but does not remove from the stream) Endpoint me In addition to the endpoint data, we also capture and store block data. The block data should be used by applications to identify which groups are active and how to display them to the user. For example, you may want to display a function block name including group numbers like "Sequencer (Groups 1, 2, 3)" in a way similar to how you treated ports in the past. Function Blocks and Group Terminal Blocks are important types of MIDI 2.0 metadata which describe an endpoint and so have their own discrete types. - -* [MidiFunctionBlock](./MidiFunctionBlock/) -* [MidiGroupTerminalBlock](./MidiGroupTerminalBlock/) \ No newline at end of file diff --git a/docs/developer-docs/Windows.Devices.Midi2/processing-plugins/IMidiEndpointMessageProcessingPlugin.md b/docs/developer-docs/Windows.Devices.Midi2/processing-plugins/IMidiEndpointMessageProcessingPlugin.md new file mode 100644 index 00000000..088ce6bb --- /dev/null +++ b/docs/developer-docs/Windows.Devices.Midi2/processing-plugins/IMidiEndpointMessageProcessingPlugin.md @@ -0,0 +1,15 @@ +--- +layout: api_page +title: IMidiEndpointMessageProcessingPlugin +parent: Client Plugins +grand_parent: Windows.Devices.Midi2 API +has_children: false +--- + +# IMidiEndpointMessageProcessingPlugin + +(In progress) + +## IDL + +[IMidiEndpointMessageProcessingPlugin IDL](https://github.com/microsoft/MIDI/blob/main/src/api/Client/Midi2Client/IMidiEndpointMessageProcessingPlugin.idl) diff --git a/docs/developer-docs/Windows.Devices.Midi2/processing-plugins/MidiChannelEndpointListener/README.md b/docs/developer-docs/Windows.Devices.Midi2/processing-plugins/MidiChannelEndpointListener.md similarity index 57% rename from docs/developer-docs/Windows.Devices.Midi2/processing-plugins/MidiChannelEndpointListener/README.md rename to docs/developer-docs/Windows.Devices.Midi2/processing-plugins/MidiChannelEndpointListener.md index 2d355db7..ee83c9c0 100644 --- a/docs/developer-docs/Windows.Devices.Midi2/processing-plugins/MidiChannelEndpointListener/README.md +++ b/docs/developer-docs/Windows.Devices.Midi2/processing-plugins/MidiChannelEndpointListener.md @@ -1,3 +1,11 @@ +--- +layout: api_page +title: MidiChannelEndpointListener +parent: Client Plugins +grand_parent: Windows.Devices.Midi2 API +has_children: false +--- + # MidiChannelEndpointListener (In progress) diff --git a/docs/developer-docs/Windows.Devices.Midi2/processing-plugins/MidiGroupEndpointListener/README.md b/docs/developer-docs/Windows.Devices.Midi2/processing-plugins/MidiGroupEndpointListener.md similarity index 56% rename from docs/developer-docs/Windows.Devices.Midi2/processing-plugins/MidiGroupEndpointListener/README.md rename to docs/developer-docs/Windows.Devices.Midi2/processing-plugins/MidiGroupEndpointListener.md index ea1bf7d3..3154b5a1 100644 --- a/docs/developer-docs/Windows.Devices.Midi2/processing-plugins/MidiGroupEndpointListener/README.md +++ b/docs/developer-docs/Windows.Devices.Midi2/processing-plugins/MidiGroupEndpointListener.md @@ -1,3 +1,11 @@ +--- +layout: api_page +title: MidiGroupEndpointListener +parent: Client Plugins +grand_parent: Windows.Devices.Midi2 API +has_children: false +--- + # MidiGroupEndpointListener (In progress) diff --git a/docs/developer-docs/Windows.Devices.Midi2/processing-plugins/MidiMessageTypeEndpointListener/README.md b/docs/developer-docs/Windows.Devices.Midi2/processing-plugins/MidiMessageTypeEndpointListener.md similarity index 57% rename from docs/developer-docs/Windows.Devices.Midi2/processing-plugins/MidiMessageTypeEndpointListener/README.md rename to docs/developer-docs/Windows.Devices.Midi2/processing-plugins/MidiMessageTypeEndpointListener.md index 3b4e090b..334ef717 100644 --- a/docs/developer-docs/Windows.Devices.Midi2/processing-plugins/MidiMessageTypeEndpointListener/README.md +++ b/docs/developer-docs/Windows.Devices.Midi2/processing-plugins/MidiMessageTypeEndpointListener.md @@ -1,3 +1,11 @@ +--- +layout: api_page +title: MidiMessageTypeEndpointListener +parent: Client Plugins +grand_parent: Windows.Devices.Midi2 API +has_children: false +--- + # MidiMessageTypeEndpointListener (In progress) diff --git a/docs/developer-docs/Windows.Devices.Midi2/processing-plugins/README.md b/docs/developer-docs/Windows.Devices.Midi2/processing-plugins/README.md index 7d8fd6ff..9118b581 100644 --- a/docs/developer-docs/Windows.Devices.Midi2/processing-plugins/README.md +++ b/docs/developer-docs/Windows.Devices.Midi2/processing-plugins/README.md @@ -1,3 +1,10 @@ +--- +layout: api_group_page +title: Client Plugins +parent: Windows.Devices.Midi2 API +has_children: true +--- + # Client-side Processing Plugins Connections allocate service resources (time and memory), so we recommend applications maintain only a single connection to an endpoint within any session. But because the new endpoint stream-focused approach aggregates what used to be considered ports, we provide processing plugins to parcel out the incoming messages based on criteria set by the application. In this way, an application can have the logical equivalent of several input ports, without the associated resource usage. @@ -10,6 +17,3 @@ To help, there are plugins which implement `IMidiEndpointMessageProcessingPlugin Listener instances are 1:1 with endpoint connections. We don't support using the same listener on multiple endpoints. -* [MidiChannelEndpointListener](./MidiChannelEndpointListener/) -* [MidiGroupEndpointListener](./MidiGroupEndpointListener/) -* [MidiMessageTypeEndpointListener](./MidiMessageTypeEndpointListener/) \ No newline at end of file diff --git a/docs/developer-docs/Windows.Devices.Midi2/service/MidiService.md b/docs/developer-docs/Windows.Devices.Midi2/service/MidiService.md new file mode 100644 index 00000000..4931b35e --- /dev/null +++ b/docs/developer-docs/Windows.Devices.Midi2/service/MidiService.md @@ -0,0 +1,45 @@ +--- +layout: api_page +title: MidiService +parent: Service +grand_parent: Windows.Devices.Midi2 API +has_children: false +--- + +# MidiService + +The MidiService class contains a number of static functions which enable working with the service outside of a specific session. + +## Static Functions + +| Static Function | Description | +|---|---| +| `PingService(pingCount)` | Send one or more ping messages to the ping endpoint and report on the status and time. Return if the responses are not received in a calculated timeout period. | +| `PingService(pingCount, timeoutMilliseconds)` | Send one or more ping messages to the ping endpoint and report on the status and time. Return if responses are not received in the specified timeout period. | +| `GetInstalledTransportPlugins()` | Returns a list of `MidiServiceTransportPluginInformation` representing all service transport plugins (also called Abstractions) | +| `GetInstalledMessageProcessingPlugins()` | Returns a list of `MidiServiceMessageProcessingPluginInformation` objects representing all service message processing plugins (also called Transforms) | +| `GetActiveSessions()` | Returns a list of `MidiSessionInformation` detailing all active Windows MIDI Services sessions on this PC. | +| `UpdateRuntimeConfiguration(configurationUpdate)` | Used by client-side SDK components for some transports and other plugins, and by the MIDI Settings app. The format of the data is dependent upon the target specified in the data. Use with caution. For more information, see the [config JSON documentation](../../../config-json.md) | + +## A note on the ping process + +Pinging the Windows service uses the same mechanism as sending any UMP message. The actual message sent is a prioprietary message. (At the time this was created, there was no standard MIDI 2.0 UMP ping message). The message itself is sent to the diagnostics endpoint in the service, which is implemented like any other transport. Therefore, the speed of the pings here and the success of the ping process is a reasonable indicator of service, cross-process queue, and client API health. + +The diagnostic ping endpoint does not understand any other type of message, and should not be used by applications other than through the ping functions here. + +The ping does not tell you if a specific transport or device is in a bad state. For example, if a specific USB MIDI device has crashed, this ping message will still work because it is not sent out over USB. + +Here's an example of ping responses through the MIDI console app + +``` +``` + +## A note on updating runtime configuration + +In order to foster an open plugin ecosystem, we need a way to get settings and configuration for those plugins up to them in the Windows service. The way we've chosen to do that is JSON, because that same JSON, when not transient in nature, can also be saved into the permanent configuration file for the active MIDI setup. + +The runtime configuration update should only be used by code which understands exactly what will be done with the data, and can handle the response which is returned. It is not a general API endpoint, but is designed for components which will extend Windows MIDI Services. + +## IDL + +[MidiService IDL](https://github.com/microsoft/MIDI/blob/main/src/api/Client/Midi2Client/MidiService.idl) diff --git a/docs/developer-docs/Windows.Devices.Midi2/service/MidiService/README.md b/docs/developer-docs/Windows.Devices.Midi2/service/MidiService/README.md deleted file mode 100644 index 8eb3c19f..00000000 --- a/docs/developer-docs/Windows.Devices.Midi2/service/MidiService/README.md +++ /dev/null @@ -1,5 +0,0 @@ -# MidiService - -(In progress) - -[IDL](https://github.com/microsoft/MIDI/blob/main/src/api/Client/Midi2Client/MidiService.idl) diff --git a/docs/developer-docs/Windows.Devices.Midi2/service/MidiServiceMessageProcessingPluginInformation.md b/docs/developer-docs/Windows.Devices.Midi2/service/MidiServiceMessageProcessingPluginInformation.md new file mode 100644 index 00000000..91bdeaeb --- /dev/null +++ b/docs/developer-docs/Windows.Devices.Midi2/service/MidiServiceMessageProcessingPluginInformation.md @@ -0,0 +1,10 @@ +--- +layout: api_page +title: MidiServiceMessageProcessingPluginInformation +parent: Service +grand_parent: Windows.Devices.Midi2 API +has_children: false +--- + +# MidiServiceMessageProcessingPluginInformation + diff --git a/docs/developer-docs/Windows.Devices.Midi2/service/MidiServiceMessageProcessingPluginInformation/README.md b/docs/developer-docs/Windows.Devices.Midi2/service/MidiServiceMessageProcessingPluginInformation/README.md deleted file mode 100644 index ca3f6c9c..00000000 --- a/docs/developer-docs/Windows.Devices.Midi2/service/MidiServiceMessageProcessingPluginInformation/README.md +++ /dev/null @@ -1,2 +0,0 @@ -# Section in development - diff --git a/docs/developer-docs/Windows.Devices.Midi2/service/MidiServicePingResponse.md b/docs/developer-docs/Windows.Devices.Midi2/service/MidiServicePingResponse.md new file mode 100644 index 00000000..ef5afaea --- /dev/null +++ b/docs/developer-docs/Windows.Devices.Midi2/service/MidiServicePingResponse.md @@ -0,0 +1,26 @@ +--- +layout: api_page +title: MidiServicePingResponse +parent: Service +grand_parent: Windows.Devices.Midi2 API +has_children: false +--- +# MidiServicePingResponse + +This class represents a single ping message response. This is used to assess health and performance of the Windows service. + +## Static Functions + +| Property | Description | +|---|---| +| `SourceId` | Id used to track this ping source connection instance, in the case of multiple applications using the same ping endpoint | +| `Index` | Index of the ping | +| `ClientSendMidiTimestamp` | The time the client sent the ping message | +| `ServiceReportedMidiTimestamp` | The time the service reported receiving the ping message | +| `ClientReceiveMidiTimestamp` | The time the client received the ping response | +| `ClientDeltaTimestamp` | The delta between the client sending the message and receiving the response | + +## IDL + +[MidiServicePingResponse IDL](https://github.com/microsoft/MIDI/blob/main/src/api/Client/Midi2Client/MidiServicePingResponse.idl) + diff --git a/docs/developer-docs/Windows.Devices.Midi2/service/MidiServicePingResponse/README.md b/docs/developer-docs/Windows.Devices.Midi2/service/MidiServicePingResponse/README.md deleted file mode 100644 index ca3f6c9c..00000000 --- a/docs/developer-docs/Windows.Devices.Midi2/service/MidiServicePingResponse/README.md +++ /dev/null @@ -1,2 +0,0 @@ -# Section in development - diff --git a/docs/developer-docs/Windows.Devices.Midi2/service/MidiServicePingResponseSummary.md b/docs/developer-docs/Windows.Devices.Midi2/service/MidiServicePingResponseSummary.md new file mode 100644 index 00000000..87f3f881 --- /dev/null +++ b/docs/developer-docs/Windows.Devices.Midi2/service/MidiServicePingResponseSummary.md @@ -0,0 +1,26 @@ +--- +layout: api_page +title: MidiServicePingResponseSummary +parent: Service +grand_parent: Windows.Devices.Midi2 API +has_children: false +--- + +# MidiServicePingResponseSummary + +This class represents a summary of the ping attempts against the Windows service. + +## Static Functions + +| Property | Description | +|---|---| +| `Success` | True if the ping was a success | +| `FailureReason` | In case of a failure, this includes information about why the failure happened. | +| `TotalPingRoundTripMidiClock` | The total MIDI Clock time for all ping messages to be sent and received | +| `AveragePingRoundTripMidiClock` | Calculated average round trip time for ping messages | +| `Responses` | A list of all the responses for the ping messages | + +## IDL + +[MidiServicePingResponseSummary IDL](https://github.com/microsoft/MIDI/blob/main/src/api/Client/Midi2Client/MidiServicePingResponseSummary.idl) + diff --git a/docs/developer-docs/Windows.Devices.Midi2/service/MidiServicePingResponseSummary/README.md b/docs/developer-docs/Windows.Devices.Midi2/service/MidiServicePingResponseSummary/README.md deleted file mode 100644 index ca3f6c9c..00000000 --- a/docs/developer-docs/Windows.Devices.Midi2/service/MidiServicePingResponseSummary/README.md +++ /dev/null @@ -1,2 +0,0 @@ -# Section in development - diff --git a/docs/developer-docs/Windows.Devices.Midi2/service/MidiServiceTransportPluginInformation.md b/docs/developer-docs/Windows.Devices.Midi2/service/MidiServiceTransportPluginInformation.md new file mode 100644 index 00000000..cfd85adf --- /dev/null +++ b/docs/developer-docs/Windows.Devices.Midi2/service/MidiServiceTransportPluginInformation.md @@ -0,0 +1,10 @@ +--- +layout: api_page +title: MidiServiceTransportPluginInformation +parent: Service +grand_parent: Windows.Devices.Midi2 API +has_children: false +--- + + +# MidiServiceTransportPluginInformation \ No newline at end of file diff --git a/docs/developer-docs/Windows.Devices.Midi2/service/MidiServiceTransportPluginInformation/README.md b/docs/developer-docs/Windows.Devices.Midi2/service/MidiServiceTransportPluginInformation/README.md deleted file mode 100644 index ca3f6c9c..00000000 --- a/docs/developer-docs/Windows.Devices.Midi2/service/MidiServiceTransportPluginInformation/README.md +++ /dev/null @@ -1,2 +0,0 @@ -# Section in development - diff --git a/docs/developer-docs/Windows.Devices.Midi2/service/MidiSessionConnectionInformation.md b/docs/developer-docs/Windows.Devices.Midi2/service/MidiSessionConnectionInformation.md new file mode 100644 index 00000000..adf0153e --- /dev/null +++ b/docs/developer-docs/Windows.Devices.Midi2/service/MidiSessionConnectionInformation.md @@ -0,0 +1,24 @@ +--- +layout: api_page +title: MidiSessionConnectionInformation +parent: Service +grand_parent: Windows.Devices.Midi2 API +has_children: false +--- + +# MidiSessionConnectionInformation + +This class represents an open connection in a Windows MIDI Services session. + +## Static Functions + +| Property | Description | +|---|---| +| `EndpointDeviceId` | The endpoint device id for the connection | +| `InstanceCount` | The number of instances of this connection which are open in the parent session | +| `EarliestConnectionTime` | The date and time the first instance of the connection was opened | + +## IDL + +[MidiSessionConnectionInformation IDL](https://github.com/microsoft/MIDI/blob/main/src/api/Client/Midi2Client/MidiSessionConnectionInformation.idl) + diff --git a/docs/developer-docs/Windows.Devices.Midi2/service/MidiSessionConnectionInformation/README.md b/docs/developer-docs/Windows.Devices.Midi2/service/MidiSessionConnectionInformation/README.md deleted file mode 100644 index ca3f6c9c..00000000 --- a/docs/developer-docs/Windows.Devices.Midi2/service/MidiSessionConnectionInformation/README.md +++ /dev/null @@ -1,2 +0,0 @@ -# Section in development - diff --git a/docs/developer-docs/Windows.Devices.Midi2/service/MidiSessionInformation.md b/docs/developer-docs/Windows.Devices.Midi2/service/MidiSessionInformation.md new file mode 100644 index 00000000..2a068452 --- /dev/null +++ b/docs/developer-docs/Windows.Devices.Midi2/service/MidiSessionInformation.md @@ -0,0 +1,27 @@ +--- +layout: api_page +title: MidiSessionInformation +parent: Service +grand_parent: Windows.Devices.Midi2 API +has_children: false +--- + +# MidiSessionInformation + +This class represents an open Windows MIDI Services session. + +## Static Functions + +| Property | Description | +|---|---| +| `SessionId` | The generated internal `GUID` for the session | +| `ProcessId` | The process id for the session | +| `ProcessName` | The process name for the session, captured when the session was created | +| `SessionName` | The name of the session provided through the API | +| `StartTime` | The date and time the session was created | +| `Connections` | A list of `MidiSessionConnectionInformation` objects detailing the connections currently open for this session | + +## IDL + +[MidiSessionInformation IDL](https://github.com/microsoft/MIDI/blob/main/src/api/Client/Midi2Client/MidiSessionInformation.idl) + diff --git a/docs/developer-docs/Windows.Devices.Midi2/service/MidiSessionInformation/README.md b/docs/developer-docs/Windows.Devices.Midi2/service/MidiSessionInformation/README.md deleted file mode 100644 index afc8b263..00000000 --- a/docs/developer-docs/Windows.Devices.Midi2/service/MidiSessionInformation/README.md +++ /dev/null @@ -1,5 +0,0 @@ -# MidiSessionInformation - -(In progress) - -[IDL](https://github.com/microsoft/MIDI/blob/main/src/api/Client/Midi2Client/MidiSessionInformation.idl) diff --git a/docs/developer-docs/Windows.Devices.Midi2/service/README.md b/docs/developer-docs/Windows.Devices.Midi2/service/README.md index f62c19e0..9b099aec 100644 --- a/docs/developer-docs/Windows.Devices.Midi2/service/README.md +++ b/docs/developer-docs/Windows.Devices.Midi2/service/README.md @@ -1,11 +1,11 @@ +--- +layout: api_group_page +title: Service +parent: Windows.Devices.Midi2 API +has_children: true +--- + # Service The MidiService class is a utility class which provides access to health and status information related to the MidiSrv Service. -* [MidiService](./MidiService/) -* [MidiServiceMessageProcessingPluginInformation](./MidiServiceMessageProcessingPluginInformation/) -* [MidiServiceTransportPluginInformation](./MidiServiceTransportPluginInformation/) -* [MidiServicePingResponse](./MidiServicePingResponse/) -* [MidiServicePingResponseSummary](./MidiServicePingResponseSummary/) -* [MidiSessionInformation](./MidiSessionInformation/) -* [MidiSessionConnectionInformation](./MidiSessionConnectionInformation/) \ No newline at end of file diff --git a/docs/developer-docs/Windows.Devices.Midi2/session/MidiSession.md b/docs/developer-docs/Windows.Devices.Midi2/session/MidiSession.md new file mode 100644 index 00000000..114a9e92 --- /dev/null +++ b/docs/developer-docs/Windows.Devices.Midi2/session/MidiSession.md @@ -0,0 +1,60 @@ +--- +layout: api_page +title: MidiSession +parent: Session +grand_parent: Windows.Devices.Midi2 API +has_children: false +--- + +# MidiSession + +Before you can connect to an endpoint, you must start a new MIDI session. + +An application may have any number of sessions open. For example, the application may open one session per open project, or one session per tab in the case of a browser. The lifetime of endpoint connections opened through a session are controlled through the session. + +## Properties + +| Property | Description | +| -------- | ----------- | +| `Id` | Generated Id for the session | +| `Name` | Name for this session. To change the name after creating the session, use the `UpdateName()` function. This will update the service | +| `Settings` | The settings used to create this session | +| `IsOpen` | True if this session is open and ready to use | +| `Connections` | Map of all endpoint connections created through this session. Disconnecting an endpoint using `DisconnectEndpointConnection` will remove the connection from this map. The map key is the generated connection GUID that identifies an instance of an endpoint connection | + +## Static Member Functions + +The two static functions are factory-pattern methods for creating a new session. + +| Static Function | Description | +| -------- | ----------- | +| `CreateSession(sessionName)` | Create and return a new session with the specified name | +| `CreateSession(sessionName, settings)` | Create and return a new session with the specified name and settings | + +## Functions + +| Function | Description | +| -------- | ----------- | +| `CreateEndpointConnection(endpointDeviceId)` | Create a new connection to the specified endpoint device Id | +| `CreateEndpointConnection(endpointDeviceId, options)` | Create a new connection to the specified endpoint device Id, using the provided connection options | +| `CreateEndpointConnection(endpointDeviceId, options, settings)` | Create a new connection to the specified endpoint device Id, using the provided connection options and the endpoint-specific settings | +| `CreateVirtualDeviceAndConnection(deviceDefinition)` | Create the device-side of an app-to-app virtual endpoint. The calling application will perform as a MIDI device, responding to discovery and other MIDI 2.0 protocol messages. | +| `DisconnectEndpointConnection(endpointConnectionId)` | Cleanly disconnect an endpoint connection and remove it from the connection map | +| `UpdateName(newName)` | Update the name of this session locally and in the MIDI Service | + +> Note: If you manually close a MidiEndpointConnection using `IClosable` (or `IDisposable`), it will not be removed from the MidiSession's collection of endpoints. Instead, use the `DisconnectEndpointConnection` method of the session to keep both in sync. For that reason, we do not recommend that you wrap the `CreateEndpointConnection` calls in a using statement. + +## IDL + +[MidiSession IDL](https://github.com/microsoft/MIDI/blob/main/src/api/Client/Midi2Client/MidiSession.idl) + +## Sample + +```cs +using (var session = MidiSession.CreateSession("API Sample Session")) +{ + ... +} + +``` + diff --git a/docs/developer-docs/Windows.Devices.Midi2/session/MidiSession/README.md b/docs/developer-docs/Windows.Devices.Midi2/session/MidiSession/README.md deleted file mode 100644 index 89c32537..00000000 --- a/docs/developer-docs/Windows.Devices.Midi2/session/MidiSession/README.md +++ /dev/null @@ -1,41 +0,0 @@ -# MidiSession - -Before you can connect to an endpoint, you must start a new MIDI session. - -An application may have any number of sessions open. For example, the application may open one session per open project, or one session per tab in the case of a browser. The lifetime of endpoint connections opened through a session are controlled through the session. - -## Properties - -| Property | Description | -| -------- | ----------- | -| Id | Generated Id for the session | -| Name | Name for this session. To change the name after creating the session, use the `UpdateName()` function. This will update the service | -| Settings | The settings used to create this session | -| IsOpen | True if this session is open and ready to use | -| Connections | Map of all endpoint connections created through this session. Disconnecting an endpoint using `DisconnectEndpointConnection` will remove the connection from this map. The map key is the generated connection GUID that identifies an instance of an endpoint connection | - -## Static Member Functions - -The two static functions are factory-pattern methods for creating a new session. - -| Static Function | Description | -| -------- | ----------- | -| CreateSession(sessionName) | Create and return a new session with the specified name | -| CreateSession(sessionName, settings) | Create and return a new session with the specified name and settings | - -## Functions - -| Function | Description | -| -------- | ----------- | -| CreateEndpointConnection(endpointDeviceId) | Create a new connection to the specified endpoint device Id | -| CreateEndpointConnection(endpointDeviceId, options) | Create a new connection to the specified endpoint device Id, using the provided connection options | -| CreateEndpointConnection(endpointDeviceId, options, settings) | Create a new connection to the specified endpoint device Id, using the provided connection options and the endpoint-specific settings | -| CreateVirtualDeviceAndConnection(deviceDefinition) | Create the device-side of an app-to-app virtual endpoint. The calling application will perform as a MIDI device, responding to discovery and other MIDI 2.0 protocol messages. | -| DisconnectEndpointConnection(endpointConnectionId) | Cleanly disconnect an endpoint connection and remove it from the connection map | -| UpdateName(newName) | Update the name of this session locally and in the MIDI Service | - -> Note: If you manually close a MidiEndpointConnection using `IClosable` (or `IDisposable`), it will not be removed from the MidiSession's collection of endpoints. Instead, use the `DisconnectEndpointConnection` method of the session to keep both in sync. For that reason, we do not recommend that you wrap the `CreateEndpointConnection` calls in a using statement. - -## IDL - -[MidiSession IDL](https://github.com/microsoft/MIDI/blob/main/src/api/Client/Midi2Client/MidiSession.idl) diff --git a/docs/developer-docs/Windows.Devices.Midi2/session/MidiSessionSettings/README.md b/docs/developer-docs/Windows.Devices.Midi2/session/MidiSessionSettings.md similarity index 64% rename from docs/developer-docs/Windows.Devices.Midi2/session/MidiSessionSettings/README.md rename to docs/developer-docs/Windows.Devices.Midi2/session/MidiSessionSettings.md index 003d006b..31443de9 100644 --- a/docs/developer-docs/Windows.Devices.Midi2/session/MidiSessionSettings/README.md +++ b/docs/developer-docs/Windows.Devices.Midi2/session/MidiSessionSettings.md @@ -1,3 +1,11 @@ +--- +layout: api_page +title: MidiSessionSettings +parent: Session +grand_parent: Windows.Devices.Midi2 API +has_children: false +--- + # MidiSessionSettings MidiSessionSettings are currently unused. We are evaluating keeping this in the API. diff --git a/docs/developer-docs/Windows.Devices.Midi2/session/README.md b/docs/developer-docs/Windows.Devices.Midi2/session/README.md index 0c0a6e0b..26d2fd6d 100644 --- a/docs/developer-docs/Windows.Devices.Midi2/session/README.md +++ b/docs/developer-docs/Windows.Devices.Midi2/session/README.md @@ -1,6 +1,11 @@ +--- +layout: api_group_page +title: Session +parent: Windows.Devices.Midi2 API +has_children: true +--- + # Session Interaction with a MIDI Endpoint always starts with creating a session. -* [MidiSession](./MidiSession/) -* [MidiSessionSettings](./MidiSessionSettings/) \ No newline at end of file diff --git a/docs/developer-docs/Windows.Devices.Midi2/simple-types/MidiChannel.md b/docs/developer-docs/Windows.Devices.Midi2/simple-types/MidiChannel.md new file mode 100644 index 00000000..5f25fdf3 --- /dev/null +++ b/docs/developer-docs/Windows.Devices.Midi2/simple-types/MidiChannel.md @@ -0,0 +1,40 @@ +--- +layout: api_page +title: MidiChannel +parent: Simple Types +grand_parent: Windows.Devices.Midi2 API +has_children: false +--- + +# MidiChannel + +The MidiChannel class is used to provide formatting and data validation for MIDI 1.0 and MIDI 2.0 channels. + +## Properties + +| Property | Description | +| --------------- | ----------- | +| `Index` | The data value, or channel Index (0-15) | +| `NumberForDisplay` | The number that should be displayed in any UI. (1-16) | + +## Static Properties + +| Static Property | Description | +| --------------- | ----------- | +| `LabelShort` | Returns the localized abbreviation. For example, "Ch" in English. | +| `LabelFull` | Returns the localized full name. For example, "Channel" in English. | + +## Functions + +| Function | Description | +| --------------- | ----------- | +| `MidiChannel()` | Constructs an empty `MidiChannel` | +| `MidiChannel(index)` | Constructs a `MidiChannel` with the specified index | + +## Static Functions + +| Static Function | Description | +| --------------- | ----------- | +| `IsValidChannelIndex(index)` | Verifies that the provided index is valid (between 0 and 15) | + +[MidiChannel IDL](https://github.com/microsoft/MIDI/blob/main/src/api/Client/Midi2Client/MidiChannel.idl) diff --git a/docs/developer-docs/Windows.Devices.Midi2/simple-types/MidiChannel/README.md b/docs/developer-docs/Windows.Devices.Midi2/simple-types/MidiChannel/README.md deleted file mode 100644 index 52afd52f..00000000 --- a/docs/developer-docs/Windows.Devices.Midi2/simple-types/MidiChannel/README.md +++ /dev/null @@ -1,32 +0,0 @@ -# MidiChannel - -The MidiChannel class is used to provide formatting and data validation for MIDI 1.0 and MIDI 2.0 channels. - -## Properties - -| Property | Description | -| --------------- | ----------- | -| Index | The data value, or channel Index (0-15) | -| NumberForDisplay | The number that should be displayed in any UI. (1-16) | - -## Static Properties - -| Static Property | Description | -| --------------- | ----------- | -| LabelShort | Returns the localized abbreviation. For example, "Ch" in English. | -| LabelFull | Returns the localized full name. For example, "Channel" in English. | - -## Functions - -| Function | Description | -| --------------- | ----------- | -| MidiChannel() | Constructs an empty `MidiChannel` | -| MidiChannel(index) | Constructs a `MidiChannel` with the specified index | - -## Static Functions - -| Static Function | Description | -| --------------- | ----------- | -| IsValidChannelIndex(index) | Verifies that the provided index is valid (between 0 and 15) | - -[IDL](https://github.com/microsoft/MIDI/blob/main/src/api/Client/Midi2Client/MidiChannel.idl) diff --git a/docs/developer-docs/Windows.Devices.Midi2/simple-types/MidiGroup.md b/docs/developer-docs/Windows.Devices.Midi2/simple-types/MidiGroup.md new file mode 100644 index 00000000..af231668 --- /dev/null +++ b/docs/developer-docs/Windows.Devices.Midi2/simple-types/MidiGroup.md @@ -0,0 +1,40 @@ +--- +layout: api_page +title: MidiGroup +parent: Simple Types +grand_parent: Windows.Devices.Midi2 API +has_children: false +--- + +# MidiGroup + +The `MidiGroup` class is used to provide formatting and data validation for UMP (Universal MIDI Packet) groups. + +## Properties + +| Property | Description | +| --------------- | ----------- | +| `Index` | The data value, or group Index (0-15) | +| `NumberForDisplay` | The number that should be displayed in any UI. (1-16) | + +## Static Properties + +| Static Property | Description | +| --------------- | ----------- | +| `LabelShort` | Returns the localized abbreviation. For example, "Gr" in English. | +| `LabelFull` | Returns the localized full name. For example, "Group" in English. | + +## Functions + +| Function | Description | +| --------------- | ----------- | +| `MidiGroup()` | Constructs an empty `MidiGroup` | +| `MidiGroup(index)` | Constructs a `MidiGroup` with the specified index | + +## Static Functions + +| Static Function | Description | +| --------------- | ----------- | +| `IsValidGroupIndex(index)` | Verifies that the provided index is valid (between 0 and 15) | + +[MidiGroup IDL](https://github.com/microsoft/MIDI/blob/main/src/api/Client/Midi2Client/MidiGroup.idl) diff --git a/docs/developer-docs/Windows.Devices.Midi2/simple-types/MidiGroup/README.md b/docs/developer-docs/Windows.Devices.Midi2/simple-types/MidiGroup/README.md deleted file mode 100644 index fef35657..00000000 --- a/docs/developer-docs/Windows.Devices.Midi2/simple-types/MidiGroup/README.md +++ /dev/null @@ -1,32 +0,0 @@ -# MidiGroup - -The `MidiGroup` class is used to provide formatting and data validation for UMP (Universal MIDI Packet) groups. - -## Properties - -| Property | Description | -| --------------- | ----------- | -| Index | The data value, or group Index (0-15) | -| NumberForDisplay | The number that should be displayed in any UI. (1-16) | - -## Static Properties - -| Static Property | Description | -| --------------- | ----------- | -| LabelShort | Returns the localized abbreviation. For example, "Gr" in English. | -| LabelFull | Returns the localized full name. For example, "Group" in English. | - -## Functions - -| Function | Description | -| --------------- | ----------- | -| MidiGroup() | Constructs an empty `MidiGroup` | -| MidiGroup(index) | Constructs a `MidiGroup` with the specified index | - -## Static Functions - -| Static Function | Description | -| --------------- | ----------- | -| IsValidGroupIndex(index) | Verifies that the provided index is valid (between 0 and 15) | - -[IDL](https://github.com/microsoft/MIDI/blob/main/src/api/Client/Midi2Client/MidiGroup.idl) diff --git a/docs/developer-docs/Windows.Devices.Midi2/simple-types/MidiUniqueId.md b/docs/developer-docs/Windows.Devices.Midi2/simple-types/MidiUniqueId.md new file mode 100644 index 00000000..bad3a001 --- /dev/null +++ b/docs/developer-docs/Windows.Devices.Midi2/simple-types/MidiUniqueId.md @@ -0,0 +1,50 @@ +--- +layout: api_page +title: MidiUniqueId +parent: Simple Types +grand_parent: Windows.Devices.Midi2 API +has_children: false +--- + +# MidiUniqueId + +The `MidiUniqueId` class is used to provide formatting and data validation for MIDI-CI MUID types used in Function Blocks and MIDI CI transactions. + +In the specification, Byte1 is the LSB and Byte4 is the MSB. We follow that convention here. + +## Properties + +| Property | Description | +| --------------- | ----------- | +| `Byte1` | The data value for byte 1 of the MUID | +| `Byte2` | The data value for byte 2 of the MUID | +| `Byte3` | The data value for byte 3 of the MUID | +| `Byte4` | The data value for byte 4 of the MUID | +| `As28BitInteger` | The data value converted to a 28 bit integer | +| `IsBroadcast` | True if this is the broadcast MUID value | +| `IsReserved` | True if this is the reserved MUID value | + +## Static Properties + +| Static Property | Description | +| --------------- | ----------- | +| `LabelShort` | Returns the localized abbreviation. | +| `LabelFull` | Returns the localized full name. | + +## Functions + +| Function | Description | +| --------------- | ----------- | +| `MidiUniqueId()` | Constructs an empty `MidiUniqueId` | +| `MidiUniqueId(integer28bit)` | Constructs the `MidiUniqueId` from the given 28 bit integer | +| `MidiUniqueId(byte1, byte2, byte3, byte4)` | Constructs a `MidiUniqueId` with the specified bytes | + +## Static Functions + +| Function | Description | +| --------------- | ----------- | +| `CreateBroadcast()` | Constructs a broadcast `MidiUniqueId` | +| `CreateRandom()` | Constructs a random `MidiUniqueId` | + + +[MidiUniqueId IDL](https://github.com/microsoft/MIDI/blob/main/src/api/Client/Midi2Client/MidiUniqueId.idl) diff --git a/docs/developer-docs/Windows.Devices.Midi2/simple-types/MidiUniqueId/README.md b/docs/developer-docs/Windows.Devices.Midi2/simple-types/MidiUniqueId/README.md deleted file mode 100644 index bcd3ac2b..00000000 --- a/docs/developer-docs/Windows.Devices.Midi2/simple-types/MidiUniqueId/README.md +++ /dev/null @@ -1,40 +0,0 @@ -# MidiUniqueId - -The `MidiUniqueId` class is used to provide formatting and data validation for MIDI-CI MUID types used in Function Blocks and MIDI CI transactions. - -## Properties - -| Property | Description | -| --------------- | ----------- | -| Byte1 | The data value for byte 1 of the MUID | -| Byte2 | The data value for byte 2 of the MUID | -| Byte3 | The data value for byte 3 of the MUID | -| Byte4 | The data value for byte 4 of the MUID | -| As28BitInteger | The data value converted to a 28 bit integer | -| IsBroadcast | True if this is the broadcast MUID value | -| IsReserved | True if this is the reserved MUID value | - -## Static Properties - -| Static Property | Description | -| --------------- | ----------- | -| LabelShort | Returns the localized abbreviation. | -| LabelFull | Returns the localized full name. | - -## Functions - -| Function | Description | -| --------------- | ----------- | -| MidiUniqueId() | Constructs an empty `MidiUniqueId` | -| MidiUniqueId(integer28bit) | Constructs the `MidiUniqueId` from the given 28 bit integer | -| MidiUniqueId(byte1, byte2, byte3, byte4) | Constructs a `MidiUniqueId` with the specified bytes | - -## Static Functions - -| Function | Description | -| --------------- | ----------- | -| CreateBroadcast() | Constructs a broadcast `MidiUniqueId` | -| CreateRandom() | Constructs a random `MidiUniqueId` | - - -[IDL](https://github.com/microsoft/MIDI/blob/main/src/api/Client/Midi2Client/MidiUniqueId.idl) diff --git a/docs/developer-docs/Windows.Devices.Midi2/simple-types/README.md b/docs/developer-docs/Windows.Devices.Midi2/simple-types/README.md index caf09612..2b2ef734 100644 --- a/docs/developer-docs/Windows.Devices.Midi2/simple-types/README.md +++ b/docs/developer-docs/Windows.Devices.Midi2/simple-types/README.md @@ -1,7 +1,11 @@ +--- +layout: api_group_page +title: Simple Types +parent: Windows.Devices.Midi2 API +has_children: true +--- + # Simple Types There are several simple or basic types used in Windows MIDI Services. These types provide formatting and validation to help ensure applications display data in similar ways. -* [MidiGroup](./MidiGroup/) -* [MidiChannel](./MidiChannel/) -* [MidiUniqueId](./MidiUniqueId/) \ No newline at end of file diff --git a/docs/developer-docs/Windows.Devices.Midi2/virtual-device/MidiStreamConfigurationRequestReceivedEventArgs/README.md b/docs/developer-docs/Windows.Devices.Midi2/virtual-device/MidiStreamConfigurationRequestReceivedEventArgs.md similarity index 60% rename from docs/developer-docs/Windows.Devices.Midi2/virtual-device/MidiStreamConfigurationRequestReceivedEventArgs/README.md rename to docs/developer-docs/Windows.Devices.Midi2/virtual-device/MidiStreamConfigurationRequestReceivedEventArgs.md index 26e90c5b..c9a88ea0 100644 --- a/docs/developer-docs/Windows.Devices.Midi2/virtual-device/MidiStreamConfigurationRequestReceivedEventArgs/README.md +++ b/docs/developer-docs/Windows.Devices.Midi2/virtual-device/MidiStreamConfigurationRequestReceivedEventArgs.md @@ -1,3 +1,11 @@ +--- +layout: api_page +title: MidiStreamConfigurationRequestReceivedEventArgs +parent: Virtual Devices +grand_parent: Windows.Devices.Midi2 API +has_children: false +--- + # MidiStreamConfigurationRequestReceivedEventArgs (in development) diff --git a/docs/developer-docs/Windows.Devices.Midi2/virtual-device/MidiVirtualEndpointDevice.md b/docs/developer-docs/Windows.Devices.Midi2/virtual-device/MidiVirtualEndpointDevice.md new file mode 100644 index 00000000..dd5980dd --- /dev/null +++ b/docs/developer-docs/Windows.Devices.Midi2/virtual-device/MidiVirtualEndpointDevice.md @@ -0,0 +1,36 @@ +--- +layout: api_page +title: MidiVirtualEndpointDevice +parent: Virtual Devices +grand_parent: Windows.Devices.Midi2 API +has_children: false +--- + +# MidiVirtualEndpointDevice + +The `MidiVirtualEndpointDeviceDefinition` class specifies, in an easy to use format, the responses for discovery and protocol negotiation, as well as the properties to use when constructing the device endpoint. + +## Properties + +| Property | Description | +| --------------- | ----------- | +| `DeviceDefinition` | The MidiVirtualEndpointDeviceDefinition used to create this device. This should be treated as read-only data. | +| `FunctionBlocks` | Current list of function blocks for this device. | +| `SuppressHandledMessages` | True if the protocol messages handled by this class should be filtered out of the incoming message stream | + +## Functions + +| Function | Description | +| --------------- | ----------- | +| `UpdateFunctionBlock` | Update the properties of a single function block. The number of actual function blocks cannot change after creation (per the UMP specification) but blocks may be marked as active or inactive. Changes here will result in the MIDI 2.0 function block notification messages being sent out. | +| `UpdateEndpointName` | Update the endpoint name, and send out the appropriate endpoint name notification messages. | + +## Events + +| Event | Description | +| --------------- | ----------- | +| `StreamConfigurationRequestReceived(device, args)` | Raised when this device receives a Stream Configuration Request UMP message. | + +## IDL + +[MidiVirtualEndpointDevice IDL](https://github.com/microsoft/MIDI/blob/main/src/api/Client/Midi2Client/MidiVirtualEndpointDevice.idl) diff --git a/docs/developer-docs/Windows.Devices.Midi2/virtual-device/MidiVirtualEndpointDevice/README.md b/docs/developer-docs/Windows.Devices.Midi2/virtual-device/MidiVirtualEndpointDevice/README.md deleted file mode 100644 index 90fd410b..00000000 --- a/docs/developer-docs/Windows.Devices.Midi2/virtual-device/MidiVirtualEndpointDevice/README.md +++ /dev/null @@ -1,32 +0,0 @@ -# MidiVirtualEndpointDevice - -Fully-featured app-to-app MIDI in a MIDI 2.0 world involves connections to a virtual device which must participate in the full MIDI 2.0 protocol, from discovery through protocol negotiation. To support this scenario, the way app-to-app MIDI works in Windows MIDI Services is for an application to define a device and then using the `MidiSession`, construct that device's endpoint. Once the device endpoint is opened, Windows MIDI Services will then construct a second application-visible multi-client endpoint which applications will use to talk to the device app. - -During that conversation, the service will also handle discovery and protocol negotiation with the virtual device just like it would any physical device. - -The `MidiVirtualEndpointDeviceDefinition` class specifies, in an easy to use format, the responses for discovery and protocol negotiation, as well as the properties to use when constructing the device endpoint. - -## Properties - -| Property | Description | -| --------------- | ----------- | -| DeviceDefinition | The MidiVirtualEndpointDeviceDefinition used to create this device. This should be treated as read-only data. | -| FunctionBlocks | Current list of function blocks for this device. | -| SuppressHandledMessages | True if the protocol messages handled by this class should be filtered out of the incoming message stream | - -## Functions - -| Function | Description | -| --------------- | ----------- | -| UpdateFunctionBlock | Update the properties of a single function block. The number of actual function blocks cannot change after creation (per the UMP specification) but blocks may be marked as active or inactive. Changes here will result in the MIDI 2.0 function block notification messages being sent out. | -| UpdateEndpointName | Update the endpoint name, and send out the appropriate endpoint name notification messages. | - -## Events - -| Event | Description | -| --------------- | ----------- | -| StreamConfigurationRequestReceived(device, args) | Raised when this device receives a Stream Configuration Request UMP message. | - -## IDL - -[MidiVirtualEndpointDevice IDL](https://github.com/microsoft/MIDI/blob/main/src/api/Client/Midi2Client/MidiVirtualEndpointDevice.idl) diff --git a/docs/developer-docs/Windows.Devices.Midi2/virtual-device/MidiVirtualEndpointDeviceDefinition.md b/docs/developer-docs/Windows.Devices.Midi2/virtual-device/MidiVirtualEndpointDeviceDefinition.md new file mode 100644 index 00000000..9b3b5321 --- /dev/null +++ b/docs/developer-docs/Windows.Devices.Midi2/virtual-device/MidiVirtualEndpointDeviceDefinition.md @@ -0,0 +1,41 @@ +--- +layout: api_page +title: MidiVirtualEndpointDeviceDefinition +parent: Virtual Devices +grand_parent: Windows.Devices.Midi2 API +has_children: false +--- + +# MidiVirtualEndpointDeviceDefinition + +The `MidiVirtualEndpointDeviceDefinition` class specifies, in an easy to use format, the responses for discovery and protocol negotiation, as well as the properties to use when constructing the device endpoint. + +## Properties + +| Property | Description | +| --------------- | ----------- | +| `EndpointName` | Name of the endpoint used for both the device enumeration and for responding to the endpoint name request UMP message | +| `EndpointProductInstanceId` | The unique identifier for this device. This value is used when creating the device Id, and is also used as the response for endpoint discovery when the id is requested. In general, this value should be kept to less than 32 characters and not include any special characters or symbols | +| `SupportsMidi1ProtocolMessages` | For endpoint discovery. True if this endpoint supports MIDI 1.0 protocol messages over UMP | +| `SupportsMidi2ProtocolMessages` | For endpoint discovery. True if this endpoint supports MIDI 2.0 protocol messages over UMP | +| `SupportsReceivingJRTimestamps` | For endpoint discovery. True if this endpoint supports recieving JR timestamps (typically, you'll want to set this to false) | +| `SupportsSendingJRTimestamps` | For endpoint discovery. True if this endpoint supports sending JR timestamps (typically, you'll want to set this to false) | +| `DeviceManufacturerSystemExclusiveId` | MIDI 2.0 UMP Device Identity value| +| `DeviceFamilyLsb` | MIDI 2.0 UMP Device Identity value | +| `DeviceFamilyMsb` | MIDI 2.0 UMP Device Identity value | +| `DeviceFamilyModelLsb` | MIDI 2.0 UMP Device Identity value | +| `DeviceFamilyModelMsb` | MIDI 2.0 UMP Device Identity value | +| `SoftwareRevisionLevel` | MIDI 2.0 UMP Device Identity value | +| `AreFunctionBlocksStatic` | True if the function blocks will not change in any way | +| `FunctionBlocks` | list of function blocks for this device | + +## Functions + +| Function | Description | +| --------------- | ----------- | +| `MidiVirtualEndpointDeviceDefinition()` | Construct a new device definition | + + +## IDL + +[MidiVirtualEndpointDeviceDefinition IDL](https://github.com/microsoft/MIDI/blob/main/src/api/Client/Midi2Client/MidiVirtualEndpointDeviceDefinition.idl) diff --git a/docs/developer-docs/Windows.Devices.Midi2/virtual-device/MidiVirtualEndpointDeviceDefinition/README.md b/docs/developer-docs/Windows.Devices.Midi2/virtual-device/MidiVirtualEndpointDeviceDefinition/README.md deleted file mode 100644 index 3fd47630..00000000 --- a/docs/developer-docs/Windows.Devices.Midi2/virtual-device/MidiVirtualEndpointDeviceDefinition/README.md +++ /dev/null @@ -1,37 +0,0 @@ -# MidiVirtualEndpointDeviceDefinition - -Proper app-to-app MIDI in a MIDI 2.0 world involves connections to a virtual device which must participate in the full MIDI 2.0 protocol, from discovery through protocol negotiation. To support this scenario, the way app-to-app MIDI works in Windows MIDI Services is for an application to define a device and then using the `MidiSession`, construct that device's endpoint. Once the device endpoint is opened, Windows MIDI Services will then construct a second application-visible multi-client endpoint which applications will use to talk to the device app. - -During that conversation, the service will also handle discovery and protocol negotiation with the virtual device just like it would any physical device. - -The `MidiVirtualEndpointDeviceDefinition` class specifies, in an easy to use format, the responses for discovery and protocol negotiation, as well as the properties to use when constructing the device endpoint. - -## Properties - -| Property | Description | -| --------------- | ----------- | -| EndpointName | Name of the endpoint used for both the device enumeration and for responding to the endpoint name request UMP message | -| EndpointProductInstanceId | The unique identifier for this device. This value is used when creating the device Id, and is also used as the response for endpoint discovery when the id is requested. In general, this value should be kept to less than 32 characters and not include any special characters or symbols | -| SupportsMidi1ProtocolMessages | For endpoint discovery. True if this endpoint supports MIDI 1.0 protocol messages over UMP | -| SupportsMidi2ProtocolMessages | For endpoint discovery. True if this endpoint supports MIDI 2.0 protocol messages over UMP | -| SupportsReceivingJRTimestamps | For endpoint discovery. True if this endpoint supports recieving JR timestamps (typically, you'll want to set this to false) | -| SupportsSendingJRTimestamps | For endpoint discovery. True if this endpoint supports sending JR timestamps (typically, you'll want to set this to false) | -| DeviceManufacturerSystemExclusiveId | MIDI 2.0 UMP Device Identity value| -| DeviceFamilyLsb | MIDI 2.0 UMP Device Identity value | -| DeviceFamilyMsb | MIDI 2.0 UMP Device Identity value | -| DeviceFamilyModelLsb | MIDI 2.0 UMP Device Identity value | -| DeviceFamilyModelMsb | MIDI 2.0 UMP Device Identity value | -| SoftwareRevisionLevel | MIDI 2.0 UMP Device Identity value | -| AreFunctionBlocksStatic | True if the function blocks will not change in any way | -| FunctionBlocks | list of function blocks for this device | - -## Functions - -| Function | Description | -| --------------- | ----------- | -| MidiVirtualEndpointDeviceDefinition() | Construct a new device definition | - - -## IDL - -[MidiVirtualEndpointDeviceDefinition IDL](https://github.com/microsoft/MIDI/blob/main/src/api/Client/Midi2Client/MidiVirtualEndpointDeviceDefinition.idl) diff --git a/docs/developer-docs/Windows.Devices.Midi2/virtual-device/README.md b/docs/developer-docs/Windows.Devices.Midi2/virtual-device/README.md index ecb0fede..561f0887 100644 --- a/docs/developer-docs/Windows.Devices.Midi2/virtual-device/README.md +++ b/docs/developer-docs/Windows.Devices.Midi2/virtual-device/README.md @@ -1,7 +1,15 @@ +--- +layout: api_group_page +title: Virtual Devices +parent: Windows.Devices.Midi2 API +has_children: true +--- + # Virtual Devices -A virtual device is the mechanism through which app-to-app MIDI works through the API. One application acts as the MIDI Endpoint Device, and other applications connect to it. In addition to the service component, it is implemented in the client API as a type of Client-SIde Processing Plugin +Fully-featured app-to-app MIDI in a MIDI 2.0 world involves connections to a virtual device which must participate in the full MIDI 2.0 protocol, from discovery through protocol negotiation. To support this scenario, the way app-to-app MIDI works in Windows MIDI Services is for an application to define a device and then using the `MidiSession`, construct that device's endpoint. Once the device endpoint is opened, Windows MIDI Services will then construct a second application-visible multi-client endpoint which applications will use to talk to the device app. + +During that conversation, the service will also handle discovery and protocol negotiation with the virtual device just like it would any physical device. + +In addition to the service component, it is implemented in the client API as a type of Client-SIde Processing Plugin -* [MidiVirtualEndpointDevice](./MidiVirtualEndpointDevice/) -* [MidiVirtualEndpointDeviceDefinition](./MidiVirtualEndpointDeviceDefinition/) -* [MidiStreamConfigurationRequestReceivedEventArgs](./MidiStreamConfigurationRequestReceivedEventArgs/) \ No newline at end of file diff --git a/docs/developer-docs/best-practices.md b/docs/developer-docs/best-practices.md index ad34cf14..5cfb24a6 100644 --- a/docs/developer-docs/best-practices.md +++ b/docs/developer-docs/best-practices.md @@ -1,3 +1,10 @@ +--- +layout: page +title: Best Practices +parent: Windows Midi Services +has_children: false +--- + # Best Practices and Performance Optimizations Here's a list of best practices and performance optimizations for MIDI API-consuming applications. diff --git a/docs/developer-docs/consuming-midi-api.md b/docs/developer-docs/consuming-midi-api.md index 8d1d066e..8c9f04d1 100644 --- a/docs/developer-docs/consuming-midi-api.md +++ b/docs/developer-docs/consuming-midi-api.md @@ -1,3 +1,10 @@ +--- +layout: page +title: Consuming the MIDI API +parent: Windows Midi Services +has_children: false +--- + # Consuming the Windows MIDI Services API The Windows MIDI Services API is built using C++/WinRT. WinRT, a requirement for modern APIs on Windows, enables desktop applications, regardless of language, to be able to use APIs, SDKs, etc. that we create. The older tools, C++/CX, are arguably simpler to implement in, but because they include proprietary extensions to C++, we decided to go with standards-based C++/WinRT instead. diff --git a/docs/developer-docs/diagnostic-endpoints.md b/docs/developer-docs/diagnostic-endpoints.md index 69dd3fd0..538bc4a6 100644 --- a/docs/developer-docs/diagnostic-endpoints.md +++ b/docs/developer-docs/diagnostic-endpoints.md @@ -1,3 +1,10 @@ +--- +layout: page +title: Diagnostics Endpoints +parent: Windows Midi Services +has_children: false +--- + # MIDI Diagnostic Endpoints Windows MIDI Services comes with three diagnostic endpoints, two of which are there for application development, testing, and debugging. diff --git a/docs/developer-docs/endpoint-ids.md b/docs/developer-docs/endpoint-ids.md index 2a044548..466fd15c 100644 --- a/docs/developer-docs/endpoint-ids.md +++ b/docs/developer-docs/endpoint-ids.md @@ -1,3 +1,10 @@ +--- +layout: page +title: Endpoint Device Ids +parent: Windows Midi Services +has_children: false +--- + # Endpoint Device Ids The Endpoint Device Id (also referred to as a Device Id) is the way we identify individual devices and interfaces in Windows. diff --git a/docs/developer-docs/faq-programming-languages.md b/docs/developer-docs/faq-programming-languages.md index 9e73cbd5..60e9bdfc 100644 --- a/docs/developer-docs/faq-programming-languages.md +++ b/docs/developer-docs/faq-programming-languages.md @@ -1,3 +1,10 @@ +--- +layout: page +title: Programming Languages FAQ +parent: Windows Midi Services +has_children: false +--- + # Programming Languages and App Models FAQ This is a developer-focused FAQ. diff --git a/docs/developer-docs/midi2-implementation-details.md b/docs/developer-docs/midi2-implementation-details.md index ad8e6e12..473ed88e 100644 --- a/docs/developer-docs/midi2-implementation-details.md +++ b/docs/developer-docs/midi2-implementation-details.md @@ -1,3 +1,10 @@ +--- +layout: page +title: MIDI 2.0 Implementation Details +parent: Windows MIDI Services +has_children: false +--- + # Implementation Details Specifications can be funny. As much as the MIDI Association, and all of us in it, try to be very specific and crisp on wording, there's often room for interpretation. Most of these we work out among the various OS companies under the umbrella of the MIDI Association. But there are others were an approach may just not make sense on one OS or the other. Here are the ones that are Windows-specific, that you should be aware of as a developer. diff --git a/docs/developer-docs/timestamps.md b/docs/developer-docs/timestamps.md deleted file mode 100644 index 7ce08e4c..00000000 --- a/docs/developer-docs/timestamps.md +++ /dev/null @@ -1,16 +0,0 @@ -# MIDI Clock and Timestamps - -## The MidiClock Type - -The Windows::Devices::Midi2::MidiClock type provides access to the system-wide MIDI Timestamp system. Timestamps are high-resultion tick counts which can be converted to offsets in seconds or fractions of seconds, but do not represent a real-world time of day without additional tracking with an external reference clock (`GetSystemTimePreciseAsFileTime`, for example). - - -## High-resolution timestamps - -Windows MIDI Services currently uses the high-resolution 64 bit QueryPerformanceCounter type. - -On most systems, the resolution is 100ns per tick, and so takes around 30,000 years to roll over. You do not need to worry about it wrapping around to zero, instead you can rely on the ticks to increase. - -You can learn more about high-resolution timestamps in Windows at [https://aka.ms/miditimestamp](https://aka.ms/miditimestamp). - -It's unlikely that we will change from QueryPerformanceCounter to another mechanism in the future. But the contract with applications is the MidiClock type. If you want to ensure your applications continue to work across revisions, always use `MidiClock::Now()` to acquire a timestamp, and use the other `MidiClock` methods for calculating ticks per second diff --git a/docs/README.md b/docs/index.md similarity index 98% rename from docs/README.md rename to docs/index.md index 579621ac..08c2a5fb 100644 --- a/docs/README.md +++ b/docs/index.md @@ -1,4 +1,9 @@ -# Microsoft Windows MIDI Services +--- +title: Windows Midi Services +layout: home +has_children: true +--- +# Windows MIDI Services > [Source repo and developer releases on GitHub](https://aka.ms/midirepo) @@ -40,7 +45,7 @@ Note that we are also investigating and experimenting with how to best incorpora ### Developer Materials -* [Get started examples](https://github.com/microsoft/MIDI/blob/main/get-started/README.md) +* [Get started examples](https://github.com/microsoft/MIDI/blob/main/samples/README.md) * [API Documentation](developer-docs/) * [Samples](../samples/) * [Programming Languages FAQ](developer-docs/faq-programming-languages.md) diff --git a/docs/midi-console.md b/docs/midi-console.md index 802edd81..1e434473 100644 --- a/docs/midi-console.md +++ b/docs/midi-console.md @@ -1,3 +1,9 @@ +--- +layout: page +title: MIDI Console +parent: Windows Midi Services +--- + # Windows MIDI Services Console If you have the midi console installed, you can invoke it from any command prompt using `midi`. We recommend using [Windows Terminal](https://aka.ms/terminal) for the best experience. @@ -67,6 +73,16 @@ midi service ping --verbose midi service ping --verbose --count 20 --timeout 20000 ``` +### Stop / Start / Restart the Service + +The MIDI console has three commands for managing the Windows service. These can be useful when developing or debugging service-side plugins. Note that these must be run from an Administrator console session. + +``` +midi service stop +midi service start +midi service restart +``` + ## See the Current Timestamp and Frequency If you want to see the MIDI clock we're using for timestamps and message scheduling, you can use the `time` command. It will display the current timestamp in ticks, and the number of ticks per second (the resolution) diff --git a/samples/cpp-winrt/api-enum-endpoints/api-enum-endpoints-cpp.vcxproj b/samples/cpp-winrt/api-enum-endpoints/api-enum-endpoints-cpp.vcxproj index 22f40044..e7d3db33 100644 --- a/samples/cpp-winrt/api-enum-endpoints/api-enum-endpoints-cpp.vcxproj +++ b/samples/cpp-winrt/api-enum-endpoints/api-enum-endpoints-cpp.vcxproj @@ -1,7 +1,7 @@ - - + + true true @@ -149,16 +149,16 @@ - - + + This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. - - - - + + + + \ No newline at end of file diff --git a/samples/cpp-winrt/api-enum-endpoints/packages.config b/samples/cpp-winrt/api-enum-endpoints/packages.config index 4ec483f0..cc28a191 100644 --- a/samples/cpp-winrt/api-enum-endpoints/packages.config +++ b/samples/cpp-winrt/api-enum-endpoints/packages.config @@ -1,5 +1,5 @@  - - + + \ No newline at end of file diff --git a/samples/csharp-net/api-client-basics-cs/Program.cs b/samples/csharp-net/api-client-basics-cs/Program.cs index ff097cb9..5a64a247 100644 --- a/samples/csharp-net/api-client-basics-cs/Program.cs +++ b/samples/csharp-net/api-client-basics-cs/Program.cs @@ -7,7 +7,8 @@ Console.WriteLine("Creating session"); -using (var session = MidiSession.CreateSession("Sample Session")) +// session implements IDisposable +using (var session = MidiSession.CreateSession("API Sample Session")) { var endpointAId = MidiEndpointDeviceInformation.DiagnosticsLoopbackAEndpointId; var endpointBId = MidiEndpointDeviceInformation.DiagnosticsLoopbackBEndpointId; @@ -16,65 +17,64 @@ Console.WriteLine("Connecting to Receiver UMP Endpoint: " + endpointBId); - using (var sendEndpoint = session.CreateEndpointConnection(endpointAId)) - using (var receiveEndpoint = session.CreateEndpointConnection(endpointBId)) - { - // c# allows local functions. This is nicer than anonymous because we can unregister it by name - void MessageReceivedHandler(object sender, MidiMessageReceivedEventArgs args) - { - var ump = args.GetMessagePacket(); + var sendEndpoint = session.CreateEndpointConnection(endpointAId); + var receiveEndpoint = session.CreateEndpointConnection(endpointBId); - Console.WriteLine(); - Console.WriteLine("Received UMP"); - Console.WriteLine("- Current Timestamp: " + MidiClock.Now); - Console.WriteLine("- UMP Timestamp: " + ump.Timestamp); - Console.WriteLine("- UMP Msg Type: " + ump.MessageType); - Console.WriteLine("- UMP Packet Type: " + ump.PacketType); - Console.WriteLine("- Message: " + MidiMessageUtility.GetMessageFriendlyNameFromFirstWord(args.PeekFirstWord())); - if (ump is MidiMessage32) - { - var ump32 = ump as MidiMessage32; + // c# allows local functions. This is nicer than anonymous because we can unregister it by name + void MessageReceivedHandler(object sender, MidiMessageReceivedEventArgs args) + { + var ump = args.GetMessagePacket(); - if (ump32 != null) - Console.WriteLine("- Word 0: 0x{0:X}", ump32.Word0); - } - }; + Console.WriteLine(); + Console.WriteLine("Received UMP"); + Console.WriteLine("- Current Timestamp: " + MidiClock.Now); + Console.WriteLine("- UMP Timestamp: " + ump.Timestamp); + Console.WriteLine("- UMP Msg Type: " + ump.MessageType); + Console.WriteLine("- UMP Packet Type: " + ump.PacketType); + Console.WriteLine("- Message: " + MidiMessageUtility.GetMessageFriendlyNameFromFirstWord(args.PeekFirstWord())); + + if (ump is MidiMessage32) + { + var ump32 = ump as MidiMessage32; - receiveEndpoint.MessageReceived += MessageReceivedHandler; + if (ump32 != null) + Console.WriteLine("- Word 0: 0x{0:X}", ump32.Word0); + } + }; - Console.WriteLine("Opening endpoint connection"); + receiveEndpoint.MessageReceived += MessageReceivedHandler; - // once you have wired up all your event handlers, added any filters/listeners, etc. - // You can open the connection. Doing this will query the cache for the in-protocol - // endpoint information and function blocks. If not there, it will send out the requests - // which will come back asynchronously with responses. - receiveEndpoint.Open(); - sendEndpoint.Open(); + Console.WriteLine("Opening endpoint connection"); + // once you have wired up all your event handlers, added any filters/listeners, etc. + // You can open the connection. Doing this will query the cache for the in-protocol + // endpoint information and function blocks. If not there, it will send out the requests + // which will come back asynchronously with responses. + receiveEndpoint.Open(); + sendEndpoint.Open(); - Console.WriteLine("Creating MIDI 1.0 Channel Voice 32-bit UMP..."); - var ump32 = MidiMessageBuilder.BuildMidi1ChannelVoiceMessage( - MidiClock.Now, // use current timestamp - 5, // group 5 - Midi1ChannelVoiceMessageStatus.NoteOn, // 9 - 3, // channel 3 - 120, // note 120 - hex 0x78 - 100); // velocity 100 hex 0x64 + Console.WriteLine("Creating MIDI 1.0 Channel Voice 32-bit UMP..."); - sendEndpoint.SendMessagePacket((IMidiUniversalPacket)ump32); // could also use the SendWords methods, etc. + var ump32 = MidiMessageBuilder.BuildMidi1ChannelVoiceMessage( + MidiClock.Now, // use current timestamp + 5, // group 5 + Midi1ChannelVoiceMessageStatus.NoteOn, // 9 + 3, // channel 3 + 120, // note 120 - hex 0x78 + 100); // velocity 100 hex 0x64 - Console.WriteLine(" ** Wait for the message to arrive, and then press enter to cleanup. ** "); - Console.ReadLine(); + sendEndpoint.SendMessagePacket((IMidiUniversalPacket)ump32); // could also use the SendWords methods, etc. - // you should unregister the event handler as well - receiveEndpoint.MessageReceived -= MessageReceivedHandler; + Console.WriteLine(" ** Wait for the message to arrive, and then press enter to cleanup. ** "); + Console.ReadLine(); - // not strictly necessary - session.DisconnectEndpointConnection(sendEndpoint.ConnectionId); - session.DisconnectEndpointConnection(receiveEndpoint.ConnectionId); - } + // you should unregister the event handler as well + receiveEndpoint.MessageReceived -= MessageReceivedHandler; + // not strictly necessary if the session is going out of scope or is in a using block + session.DisconnectEndpointConnection(sendEndpoint.ConnectionId); + session.DisconnectEndpointConnection(receiveEndpoint.ConnectionId); } diff --git a/samples/csharp-net/api-client-basics-cs/api-client-basics-cs.csproj b/samples/csharp-net/api-client-basics-cs/api-client-basics-cs.csproj index 38f92574..0e066d5f 100644 --- a/samples/csharp-net/api-client-basics-cs/api-client-basics-cs.csproj +++ b/samples/csharp-net/api-client-basics-cs/api-client-basics-cs.csproj @@ -10,8 +10,8 @@ - - + + diff --git a/src/api/Client/Midi2Client-Projection/nuget/Windows.Devices.Midi2.nuspec b/src/api/Client/Midi2Client-Projection/nuget/Windows.Devices.Midi2.nuspec index 4a8df98c..3fa37bd7 100644 --- a/src/api/Client/Midi2Client-Projection/nuget/Windows.Devices.Midi2.nuspec +++ b/src/api/Client/Midi2Client-Projection/nuget/Windows.Devices.Midi2.nuspec @@ -2,7 +2,7 @@ Windows.Devices.Midi2 - 1.0.0-preview.3-0142 + 1.0.0-preview.3-0143 Microsoft Corporation Windows MIDI Services API. Minimum package necessary to use Windows MIDI Services from an app on a PC that has Windows MIDI Services installed. MIT diff --git a/src/api/Client/Midi2Client/MidiService.cpp b/src/api/Client/Midi2Client/MidiService.cpp index de034f75..6d1d9e65 100644 --- a/src/api/Client/Midi2Client/MidiService.cpp +++ b/src/api/Client/Midi2Client/MidiService.cpp @@ -159,7 +159,7 @@ namespace winrt::Windows::Devices::Midi2::implementation // send the ping endpoint.SendMessageWords(timestamp, request.Word0, pingSourceId, pingIndex, request.Padding); - Sleep(0); + //Sleep(0); } // Wait for all responses to come in (receivedCount == pingCount). If not all responses come back, report the failure. @@ -193,9 +193,7 @@ namespace winrt::Windows::Devices::Midi2::implementation // unwire the event and close the session. endpoint.MessageReceived(eventRevokeToken); - // not strictly necessary session.DisconnectEndpointConnection(endpoint.ConnectionId()); - session.Close(); return *responseSummary; diff --git a/src/api/Client/Midi2Client/MidiVirtualEndpointDevice.cpp b/src/api/Client/Midi2Client/MidiVirtualEndpointDevice.cpp index 8cacd545..0af916ff 100644 --- a/src/api/Client/Midi2Client/MidiVirtualEndpointDevice.cpp +++ b/src/api/Client/Midi2Client/MidiVirtualEndpointDevice.cpp @@ -272,6 +272,7 @@ namespace winrt::Windows::Devices::Midi2::implementation + m_virtualEndpointDeviceDefinition = definition; } catch (...) diff --git a/src/api/Client/Midi2Client/MidiVirtualEndpointDevice.h b/src/api/Client/Midi2Client/MidiVirtualEndpointDevice.h index c27cd63a..62e1e14d 100644 --- a/src/api/Client/Midi2Client/MidiVirtualEndpointDevice.h +++ b/src/api/Client/Midi2Client/MidiVirtualEndpointDevice.h @@ -58,6 +58,8 @@ namespace winrt::Windows::Devices::Midi2::implementation void UpdateEndpointName(_In_ winrt::hstring const& name) noexcept; + midi2::MidiVirtualEndpointDeviceDefinition DeviceDefinition() { return m_virtualEndpointDeviceDefinition; } + void Initialize(_In_ midi2::IMidiEndpointConnectionSource const& endpointConnection) noexcept; @@ -77,7 +79,7 @@ namespace winrt::Windows::Devices::Midi2::implementation void SendFunctionBlockNameNotificationMessages(_In_ midi2::MidiFunctionBlock const& fb) noexcept; - //midi2::MidiVirtualEndpointDeviceDefinition m_virtualEndpointDeviceDefinition + midi2::MidiVirtualEndpointDeviceDefinition m_virtualEndpointDeviceDefinition{ nullptr }; winrt::guid m_id{ foundation::GuidHelper::CreateNewGuid() }; // plugin id winrt::hstring m_name{}; // plugin name, not the endpointdevice name @@ -99,9 +101,4 @@ namespace winrt::Windows::Devices::Midi2::implementation winrt::event> m_streamConfigurationRequestReceivedEvent; }; } -namespace winrt::Windows::Devices::Midi2::factory_implementation -{ - struct MidiVirtualEndpointDevice : MidiVirtualEndpointDeviceT - { - }; -} + diff --git a/src/api/Client/Midi2Client/MidiVirtualEndpointDevice.idl b/src/api/Client/Midi2Client/MidiVirtualEndpointDevice.idl index 5bbb3513..13a56cfc 100644 --- a/src/api/Client/Midi2Client/MidiVirtualEndpointDevice.idl +++ b/src/api/Client/Midi2Client/MidiVirtualEndpointDevice.idl @@ -27,6 +27,10 @@ namespace Windows.Devices.Midi2 { //MidiVirtualEndpointDevice(); + //String EndpointDeviceId{ get; }; + + MidiVirtualEndpointDeviceDefinition DeviceDefinition{ get; }; + // This is a view because all modifications require sending notifications // out on the endpoint. So the functions do that. IMapView FunctionBlocks{ get; }; diff --git a/src/api/Client/Midi2Client/Windows.Devices.Midi2.vcxproj b/src/api/Client/Midi2Client/Windows.Devices.Midi2.vcxproj index 78072ea1..4c897c80 100644 --- a/src/api/Client/Midi2Client/Windows.Devices.Midi2.vcxproj +++ b/src/api/Client/Midi2Client/Windows.Devices.Midi2.vcxproj @@ -1,6 +1,6 @@ - + Windows.Devices.Midi2 Windows.Devices.Midi2 @@ -558,15 +558,15 @@ - - + + This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. - - - + + + \ No newline at end of file diff --git a/src/api/Client/Midi2Client/Windows.Devices.Midi2.vcxproj.filters b/src/api/Client/Midi2Client/Windows.Devices.Midi2.vcxproj.filters index 53829e31..2da0b4b6 100644 --- a/src/api/Client/Midi2Client/Windows.Devices.Midi2.vcxproj.filters +++ b/src/api/Client/Midi2Client/Windows.Devices.Midi2.vcxproj.filters @@ -159,9 +159,6 @@ API\Enumeration - - API\Service - Internal\Resources @@ -255,9 +252,6 @@ API\Enumeration - - API\Service - Internal\Resources diff --git a/src/api/Client/Midi2Client/packages.config b/src/api/Client/Midi2Client/packages.config index e53a0f12..1b706ca9 100644 --- a/src/api/Client/Midi2Client/packages.config +++ b/src/api/Client/Midi2Client/packages.config @@ -1,5 +1,5 @@  - - + + \ No newline at end of file diff --git a/src/user-tools/midi-console/Midi/Commands/Clock/TimeCommand.cs b/src/user-tools/midi-console/Midi/Commands/Clock/TimeCommand.cs index 9267b745..70f952f0 100644 --- a/src/user-tools/midi-console/Midi/Commands/Clock/TimeCommand.cs +++ b/src/user-tools/midi-console/Midi/Commands/Clock/TimeCommand.cs @@ -47,9 +47,9 @@ public override int Execute(CommandContext context, Settings settings) AnsiConsole.MarkupLine($"Timestamp resolution: [deepskyblue1]{MidiClock.TimestampFrequency.ToString("N0")}[/] ticks per second ([deepskyblue1]{convertedFrequency.ToString("N2")} {units}[/] per tick)"); AnsiConsole.WriteLine(); - AnsiConsole.MarkupLine($"➡️ 10 microseconds: {AnsiMarkupFormatter.FormatTimestamp(MidiClock.OffsetTimestampByMicroseconds(0, 10))} ticks"); - AnsiConsole.MarkupLine($"➡️ 10 milliseconds: {AnsiMarkupFormatter.FormatTimestamp(MidiClock.OffsetTimestampByMilliseconds(0, 10))} ticks"); - AnsiConsole.MarkupLine($"➡️ 2 seconds: {AnsiMarkupFormatter.FormatTimestamp(MidiClock.OffsetTimestampByMilliseconds(0, 2000))} ticks"); + AnsiConsole.MarkupLine($"➡️ 1 microsecond: {AnsiMarkupFormatter.FormatTimestamp(MidiClock.OffsetTimestampByMicroseconds(0, 1))} ticks"); + AnsiConsole.MarkupLine($"➡️ 1 millisecond: {AnsiMarkupFormatter.FormatTimestamp(MidiClock.OffsetTimestampByMilliseconds(0, 1))} ticks"); + AnsiConsole.MarkupLine($"➡️ 1 second: {AnsiMarkupFormatter.FormatTimestamp(MidiClock.OffsetTimestampByMilliseconds(0, 1000))} ticks"); AnsiConsole.WriteLine(); var now = MidiClock.Now; diff --git a/src/user-tools/midi-console/Midi/Commands/Endpoint/EndpointMonitorCommand.cs b/src/user-tools/midi-console/Midi/Commands/Endpoint/EndpointMonitorCommand.cs index 7ef7cf51..587bcfba 100644 --- a/src/user-tools/midi-console/Midi/Commands/Endpoint/EndpointMonitorCommand.cs +++ b/src/user-tools/midi-console/Midi/Commands/Endpoint/EndpointMonitorCommand.cs @@ -196,7 +196,7 @@ public override int Execute(CommandContext context, Settings settings) return (int)MidiConsoleReturnCode.ErrorCreatingSession; } - using var connection = session.CreateEndpointConnection(endpointId); + var connection = session.CreateEndpointConnection(endpointId); if (connection == null) { AnsiConsole.WriteLine(Strings.ErrorUnableToCreateEndpointConnection); diff --git a/src/user-tools/midi-console/Midi/Commands/Endpoint/EndpointSendMessageCommand.cs b/src/user-tools/midi-console/Midi/Commands/Endpoint/EndpointSendMessageCommand.cs index 6925f304..2e182417 100644 --- a/src/user-tools/midi-console/Midi/Commands/Endpoint/EndpointSendMessageCommand.cs +++ b/src/user-tools/midi-console/Midi/Commands/Endpoint/EndpointSendMessageCommand.cs @@ -126,7 +126,7 @@ public override int Execute(CommandContext context, Settings settings) return (int)MidiConsoleReturnCode.ErrorCreatingSession; } - using var connection = session.CreateEndpointConnection(endpointId, bidiOpenOptions); + var connection = session.CreateEndpointConnection(endpointId, bidiOpenOptions); if (connection != null) { openSuccess = connection.Open(); diff --git a/src/user-tools/midi-console/Midi/Commands/Endpoint/EndpointSendMessagesFileCommand.cs b/src/user-tools/midi-console/Midi/Commands/Endpoint/EndpointSendMessagesFileCommand.cs index f85fdf4b..d55a66f0 100644 --- a/src/user-tools/midi-console/Midi/Commands/Endpoint/EndpointSendMessagesFileCommand.cs +++ b/src/user-tools/midi-console/Midi/Commands/Endpoint/EndpointSendMessagesFileCommand.cs @@ -111,7 +111,7 @@ public override int Execute(CommandContext context, Settings settings) return (int)MidiConsoleReturnCode.ErrorCreatingSession; } - using var connection = session.CreateEndpointConnection(endpointId); + var connection = session.CreateEndpointConnection(endpointId); if (connection == null) { AnsiConsole.MarkupLine(AnsiMarkupFormatter.FormatError(Strings.ErrorUnableToCreateEndpointConnection)); diff --git a/src/user-tools/midi-console/Midi/Commands/Service/ServicePingCommand.cs b/src/user-tools/midi-console/Midi/Commands/Service/ServicePingCommand.cs index 0492f7f3..f397c59d 100644 --- a/src/user-tools/midi-console/Midi/Commands/Service/ServicePingCommand.cs +++ b/src/user-tools/midi-console/Midi/Commands/Service/ServicePingCommand.cs @@ -88,16 +88,16 @@ public override int Execute(CommandContext context, Settings settings) // show table of the ping results var table = new Table(); - table.Border(TableBorder.Rounded); - - table.AddColumn(Strings.PingResultTableColumnHeaderPing); - table.AddColumn(Strings.PingResultTableColumnHeaderSendTimestamp); - table.AddColumn(Strings.PingResultTableColumnHeaderServiceTimestamp); - table.AddColumn(Strings.PingResultTableColumnHeaderReceiveTimestamp); - table.AddColumn(Strings.PingResultTableColumnHeaderServiceBreakdown); - table.AddColumn(Strings.PingResultTableColumnHeaderRoundTripTicks); - table.AddColumn(Strings.PingResultTableColumnHeaderRoundTripMicroseconds); - table.AddColumn(Strings.PingResultTableColumnHeaderRoundTripMilliseconds); + AnsiMarkupFormatter.SetTableBorderStyle(table); + + table.AddColumn(AnsiMarkupFormatter.FormatTableColumnHeading(Strings.PingResultTableColumnHeaderPing)); + table.AddColumn(AnsiMarkupFormatter.FormatTableColumnHeading(Strings.PingResultTableColumnHeaderSendTimestamp)); + table.AddColumn(AnsiMarkupFormatter.FormatTableColumnHeading(Strings.PingResultTableColumnHeaderServiceTimestamp)); + table.AddColumn(AnsiMarkupFormatter.FormatTableColumnHeading(Strings.PingResultTableColumnHeaderReceiveTimestamp)); + table.AddColumn(AnsiMarkupFormatter.FormatTableColumnHeading(Strings.PingResultTableColumnHeaderServiceBreakdown)); + table.AddColumn(AnsiMarkupFormatter.FormatTableColumnHeading(Strings.PingResultTableColumnHeaderRoundTripTicks)); + table.AddColumn(AnsiMarkupFormatter.FormatTableColumnHeading(Strings.PingResultTableColumnHeaderRoundTripMicroseconds)); + table.AddColumn(AnsiMarkupFormatter.FormatTableColumnHeading(Strings.PingResultTableColumnHeaderRoundTripMilliseconds)); foreach (var response in pingResult.Responses) diff --git a/src/user-tools/midi-console/Midi/EndpointMessageSender.cs b/src/user-tools/midi-console/Midi/EndpointMessageSender.cs index 1953e989..d1abafc7 100644 --- a/src/user-tools/midi-console/Midi/EndpointMessageSender.cs +++ b/src/user-tools/midi-console/Midi/EndpointMessageSender.cs @@ -68,7 +68,7 @@ public static MidiConsoleReturnCode OpenTemporaryConnectionAndSendMidiMessage(st return MidiConsoleReturnCode.ErrorCreatingSession; } - using var connection = session.CreateEndpointConnection(endpointId); + var connection = session.CreateEndpointConnection(endpointId); if (connection == null) { AnsiConsole.WriteLine(Strings.ErrorUnableToCreateEndpointConnection); diff --git a/src/user-tools/midi-console/Midi/Midi.csproj b/src/user-tools/midi-console/Midi/Midi.csproj index c9246780..cf52f3f1 100644 --- a/src/user-tools/midi-console/Midi/Midi.csproj +++ b/src/user-tools/midi-console/Midi/Midi.csproj @@ -31,7 +31,7 @@ - +