From 0a1b64d30daf0712653e6291073eaa1e1aa521e8 Mon Sep 17 00:00:00 2001 From: Vanessa Sochat Date: Sat, 23 Feb 2019 17:57:34 -0500 Subject: [PATCH 1/6] Trying again, with -s so its signed. Signed-off-by: Vanessa Sochat --- _config.yml | 32 + _includes/head.html | 26 + _includes/nav.html | 44 + _layouts/about.html | 5 + _layouts/default.html | 78 + _layouts/home.html | 5 + _layouts/page.html | 5 + _layouts/post.html | 5 + assets/css/just-the-docs.css | 6727 +++++++++++++++++++++++++ assets/images/just-the-docs.png | Bin 0 -> 20992 bytes assets/images/search.svg | 1 + assets/js/just-the-docs.js | 177 + assets/js/search-data.json | 12 + assets/js/vendor/lunr.min.js | 6 + docs/about.md | 46 + docs/contributing/contributing.md | 99 + docs/introduction/container-images.md | 253 + docs/introduction/digests.md | 71 + docs/introduction/distribution.md | 34 + docs/introduction/introduction.md | 59 + docs/introduction/oci-types.md | 149 + index.md | 30 + 22 files changed, 7864 insertions(+) create mode 100644 _config.yml create mode 100644 _includes/head.html create mode 100644 _includes/nav.html create mode 100644 _layouts/about.html create mode 100644 _layouts/default.html create mode 100644 _layouts/home.html create mode 100644 _layouts/page.html create mode 100644 _layouts/post.html create mode 100644 assets/css/just-the-docs.css create mode 100644 assets/images/just-the-docs.png create mode 100644 assets/images/search.svg create mode 100644 assets/js/just-the-docs.js create mode 100644 assets/js/search-data.json create mode 100644 assets/js/vendor/lunr.min.js create mode 100644 docs/about.md create mode 100644 docs/contributing/contributing.md create mode 100644 docs/introduction/container-images.md create mode 100644 docs/introduction/digests.md create mode 100644 docs/introduction/distribution.md create mode 100644 docs/introduction/introduction.md create mode 100644 docs/introduction/oci-types.md create mode 100644 index.md diff --git a/_config.yml b/_config.yml new file mode 100644 index 0000000..6b15337 --- /dev/null +++ b/_config.yml @@ -0,0 +1,32 @@ +# Welcome to Jekyll! +# +# This config file is meant for settings that affect your whole site, values +# which you are expected to set up once and rarely edit after that. If you find +# yourself editing these this file very often, consider using Jekyll's data files +# feature for the data you need to update frequently. +# +# For technical reasons, this file is *NOT* reloaded automatically when you use +# 'jekyll serve'. If you change this file, please restart the server process. + +# Site settings +# These are used to personalize your new site. If you look in the HTML files, +# you will see them accessed via {{ site.title }}, {{ site.github_repo }}, and so on. +# You can create any custom variable you would like, and they will be accessible +# in the templates via {{ site.myvariable }}. +title: OpenContainers +description: Open containers man pages +baseurl: "/org/" # the subpath of your site, e.g. /blog +# url: "" # the base hostname & protocol for your site, e.g. http://example.com + +repo: https://www.github.com/opencontainers/org + +permalink: pretty +exclude: + - "*.gem" + - "Gemfile" + - "Gemfile.lock" + +# Aux links for the upper right navigation +aux_links: + "OpenContainers on GitHub": + - "//github.com/opencontainers" diff --git a/_includes/head.html b/_includes/head.html new file mode 100644 index 0000000..fa5dee7 --- /dev/null +++ b/_includes/head.html @@ -0,0 +1,26 @@ + + + + {% if page.description %} + + {% endif %} + + {{ page.title }} - {{ site.title }} + + + {% if site.ga_tracking != nil %} + + + {% endif %} + + {% if site.search_enabled != nil %} + + {% endif %} + + + + diff --git a/_includes/nav.html b/_includes/nav.html new file mode 100644 index 0000000..2c4bf1e --- /dev/null +++ b/_includes/nav.html @@ -0,0 +1,44 @@ + diff --git a/_layouts/about.html b/_layouts/about.html new file mode 100644 index 0000000..5e71126 --- /dev/null +++ b/_layouts/about.html @@ -0,0 +1,5 @@ +--- +layout: default +--- + +{{ content }} diff --git a/_layouts/default.html b/_layouts/default.html new file mode 100644 index 0000000..06662ee --- /dev/null +++ b/_layouts/default.html @@ -0,0 +1,78 @@ + + + +{% include head.html %} + + +
+ +
+ +
+ {% unless page.url == "/" %} + {% if page.parent %} + + {% endif %} + {% endunless %} +
+ {{ content }} + + {% if page.has_children == true and page.has_toc != false %} +
+

Table of contents

+ {% assign children_list = site.pages | sort:"nav_order" %} +
    + {% for child in children_list %} + {% if child.parent == page.title and child.title != page.title %} +
  • + {{ child.title }} +
  • + {% endif %} + {% endfor %} +
+ {% endif %} +
+
+
+
+ + + diff --git a/_layouts/home.html b/_layouts/home.html new file mode 100644 index 0000000..5e71126 --- /dev/null +++ b/_layouts/home.html @@ -0,0 +1,5 @@ +--- +layout: default +--- + +{{ content }} diff --git a/_layouts/page.html b/_layouts/page.html new file mode 100644 index 0000000..5e71126 --- /dev/null +++ b/_layouts/page.html @@ -0,0 +1,5 @@ +--- +layout: default +--- + +{{ content }} diff --git a/_layouts/post.html b/_layouts/post.html new file mode 100644 index 0000000..5e71126 --- /dev/null +++ b/_layouts/post.html @@ -0,0 +1,5 @@ +--- +layout: default +--- + +{{ content }} diff --git a/assets/css/just-the-docs.css b/assets/css/just-the-docs.css new file mode 100644 index 0000000..30ee353 --- /dev/null +++ b/assets/css/just-the-docs.css @@ -0,0 +1,6727 @@ +/*! normalize.scss v0.1.0 | MIT License | based on git.io/normalize */ + +html { + font-family: sans-serif; + -ms-text-size-adjust: 100%; + -webkit-text-size-adjust: 100% +} + +body { + margin: 0 +} + +article, +aside, +details, +figcaption, +figure, +footer, +header, +hgroup, +main, +menu, +nav, +section, +summary { + display: block +} + +audio, +canvas, +progress, +video { + display: inline-block; + vertical-align: baseline +} + +audio:not([controls]) { + display: none; + height: 0 +} + +[hidden], +template { + display: none +} + +a { + background-color: transparent +} + +a:active, +a:hover { + outline: 0 +} + +abbr[title] { + border-bottom: 1px dotted +} + +b, +strong { + font-weight: bold +} + +dfn { + font-style: italic +} + +h1 { + font-size: 2em; + margin: 0.67em 0 +} + +mark { + background: #ff0; + color: #000 +} + +small { + font-size: 80% +} + +sub, +sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline +} + +sup { + top: -0.5em +} + +sub { + bottom: -0.25em +} + +img { + border: 0 +} + +svg:not(:root) { + overflow: hidden +} + +figure { + margin: 1em 40px +} + +hr { + -moz-box-sizing: content-box; + box-sizing: content-box; + height: 0 +} + +pre { + overflow: auto +} + +code, +kbd, +pre, +samp { + font-family: monospace, monospace; + font-size: 1em +} + +button, +input, +optgroup, +select, +textarea { + color: inherit; + font: inherit; + margin: 0 +} + +button { + overflow: visible +} + +button, +select { + text-transform: none +} + +button, +html input[type="button"], +input[type="reset"], +input[type="submit"] { + -webkit-appearance: button; + cursor: pointer +} + +button[disabled], +html input[disabled] { + cursor: default +} + +button::-moz-focus-inner, +input::-moz-focus-inner { + border: 0; + padding: 0 +} + +input { + line-height: normal +} + +input[type="checkbox"], +input[type="radio"] { + box-sizing: border-box; + padding: 0 +} + +input[type="number"]::-webkit-inner-spin-button, +input[type="number"]::-webkit-outer-spin-button { + height: auto +} + +input[type="search"] { + -webkit-appearance: textfield; + -moz-box-sizing: content-box; + -webkit-box-sizing: content-box; + box-sizing: content-box +} + +input[type="search"]::-webkit-search-cancel-button, +input[type="search"]::-webkit-search-decoration { + -webkit-appearance: none +} + +fieldset { + border: 1px solid #c0c0c0; + margin: 0 2px; + padding: 0.35em 0.625em 0.75em +} + +legend { + border: 0; + padding: 0 +} + +textarea { + overflow: auto +} + +optgroup { + font-weight: bold +} + +table { + border-collapse: collapse; + border-spacing: 0 +} + +td, +th { + padding: 0 +} + +* { + box-sizing: border-box +} + +::selection { + color: #fff; + background: #474eb5 +} + +html { + font-size: 14px !important +} + +@media (min-width: 31.25rem) { + html { + font-size: 16px !important + } +} + +body { + font-family: -apple-system, BlinkMacSystemFont, "helvetica neue", helvetica, roboto, noto, "segoe ui", arial, sans-serif; + font-size: inherit; + line-height: 1.4; + color: #5c5962; + background-color: #fff +} + +p, +h1, +h2, +h3, +h4, +h5, +h6, +ol, +ul, +pre, +address, +blockquote, +dl, +div, +fieldset, +form, +hr, +noscript, +table { + margin-top: 0 +} + +h1, +h2, +h3, +h4, +h5, +h6 { + margin-top: 1.2em; + margin-bottom: 0.8em; + font-weight: 500; + line-height: 1.15; + color: #27262b +} + +p { + margin-bottom: 1em +} + +a { + color: #474eb5; + text-decoration: none +} + +a:not([class]) { + text-decoration: none; + background-image: linear-gradient(#eeebee 0%, #eeebee 100%); + background-repeat: repeat-x; + background-position: 0 100%; + background-size: 1px 1px +} + +a:not([class]):hover { + background-image: linear-gradient(rgba(114, 83, 237, 0.45) 0%, rgba(114, 83, 237, 0.45) 100%); + background-size: 1px 1px +} + +code { + font-family: "SFMono-Regular", Menlo, Consolas, Monospace; + font-size: 12px; + line-height: 1.4 +} + +figure { + 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 +} + +@media (min-width: 46.25rem) { + .page-wrap { + position: absolute; + top: 0; + left: 0; + display: flex; + width: 100%; + height: 100%; + overflow-x: hidden; + overflow-y: hidden + } +} + +.side-bar { + z-index: 100; + display: flex; + flex-wrap: wrap; + padding-top: 1rem; + padding-bottom: 1rem; + background-color: #f5f6fa +} + +@media (min-width: 46.25rem) { + .side-bar { + flex-wrap: nowrap; + position: absolute; + width: 248px; + height: 100%; + padding-top: 4rem; + padding-bottom: 0; + flex-direction: column; + border-right: 1px solid #eeebee; + align-items: flex-end + } +} + +@media (min-width: 70rem) { + .side-bar { + width: calc((100% - 1032px) / 2 + 232px); + min-width: 232px + } +} + +@media (min-width: 46.25rem) { + .main-content-wrap { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + min-height: 600px; + -webkit-overflow-scrolling: touch; + overflow-x: hidden; + overflow-y: scroll + } +} + +.main-content { + padding-top: 1rem; + padding-right: 1rem; + padding-left: 1rem +} + +@media (min-width: 46.25rem) { + .main-content { + padding-right: 2rem; + padding-left: 2rem + } +} + +@media (min-width: 46.25rem) { + .main-content { + position: relative; + max-width: 800px; + padding-top: 2rem; + padding-bottom: 2rem; + padding-left: 3rem; + margin-left: 232px + } +} + +@media (min-width: 70rem) { + .main-content { + padding-left: 2rem; + margin-left: calc((100% - 1032px) / 2 + 232px) + } +} + +.js-main-content:focus { + outline: none +} + +.page-header { + background-color: #f5f6fa +} + +@media (min-width: 46.25rem) { + .page-header { + background-color: #fff + } +} + +.page-header .main-content { + padding-top: 0 +} + +@media (min-width: 46.25rem) { + .page-header .main-content { + display: flex; + justify-content: flex-end; + height: 60px; + padding-top: 1rem; + padding-bottom: 1rem; + border-bottom: 1px solid #eeebee + } +} + +.navigation, +.site-title, +.site-footer { + padding-right: 1rem; + padding-left: 1rem; + width: 100% +} + +@media (min-width: 46.25rem) { + .navigation, + .site-title, + .site-footer { + padding-right: 2rem; + padding-left: 2rem + } +} + +@media (min-width: 70rem) { + .navigation, + .site-title, + .site-footer { + width: 264px + } +} + +@media (min-width: 46.25rem) { + .navigation { + padding-top: 3rem; + overflow-y: auto; + flex: 1 1 auto + } +} + +body { + position: relative; + padding-bottom: 4rem +} + +@media (min-width: 46.25rem) { + body { + position: static; + padding-bottom: 0 + } +} + +.site-footer { + position: absolute; + bottom: 0; + padding-top: 1rem; + padding-bottom: 1rem +} + +@media (min-width: 46.25rem) { + .site-footer { + position: static; + align-self: flex-end; + justify-self: end; + background-color: #f5f6fa + } +} + +.page-content a { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap +} + +.page-content ul, +.page-content ol { + padding-left: 1.5em +} + +.page-content ol { + list-style-type: none; + counter-reset: step-counter +} + +.page-content ol>li { + position: relative +} + +.page-content ol>li::before { + position: absolute; + top: 0.2em; + left: -1.6em; + color: #959396; + content: counter(step-counter); + counter-increment: step-counter; + font-size: 12px !important +} + +@media (min-width: 31.25rem) { + .page-content ol>li::before { + font-size: 14px !important + } +} + +@media (min-width: 31.25rem) { + .page-content ol>li::before { + top: 0.11em + } +} + +.page-content ol>li ol { + counter-reset: sub-counter +} + +.page-content ol>li ol li::before { + content: counter(sub-counter, lower-alpha); + counter-increment: sub-counter +} + +.page-content ul { + list-style: none +} + +.page-content ul>li::before { + position: absolute; + margin-left: -1.4em; + color: #959396; + content: "•" +} + +.page-content .task-list { + padding-left: 0 +} + +.page-content .task-list-item { + display: flex; + align-items: center +} + +.page-content .task-list-item::before { + content: "" +} + +.page-content .task-list-item-checkbox { + margin-right: 0.6em +} + +.page-content hr+* { + margin-top: 0 +} + +.page-content h1:first-of-type { + margin-top: 0.5em +} + +.page-content dl { + display: grid; + grid-template-columns: max-content 1fr +} + +.page-content dt, +.page-content dd { + margin: 0.25em 0 +} + +.page-content dt { + text-align: right +} + +.page-content dt::after { + content: ":" +} + +.page-content dd { + margin-left: 1em; + font-weight: 500 +} + +.site-title { + display: block; + flex: 1 1 auto; + color: #27262b; + background-color: #f5f6fa +} + +@media (min-width: 46.25rem) { + .site-title { + position: absolute; + top: 0; + right: 0; + z-index: 101; + height: 60px; + padding-top: 1rem; + border-bottom: 1px solid #eeebee + } +} + +.navigation-list { + padding: 0; + margin-top: 1rem; + margin-bottom: 0; + list-style: none +} + +@media (min-width: 46.25rem) { + .navigation-list { + margin-top: 0 + } +} + +.navigation-list-child-list { + padding-left: .75rem; + list-style: none +} + +.navigation-list-child-list .navigation-list-link { + color: #5c5962 +} + +.navigation-list-child-list .navigation-list-item { + position: relative +} + +.navigation-list-child-list .navigation-list-item::before { + position: absolute; + margin-top: 0.3em; + margin-left: -0.8em; + color: rgba(92, 89, 98, 0.3); + content: "- " +} + +.navigation-list-child-list .navigation-list-item.active::before { + color: #5c5962 +} + +.navigation-list-item { + font-size: 14px !important; + margin: 0 +} + +@media (min-width: 31.25rem) { + .navigation-list-item { + font-size: 16px !important + } +} + +@media (min-width: 46.25rem) { + .navigation-list-item { + font-size: 12px !important + } +} + +@media (min-width: 46.25rem) and (min-width: 31.25rem) { + .navigation-list-item { + font-size: 14px !important + } +} + +.navigation-list-item .navigation-list-child-list { + display: none +} + +.navigation-list-item.active .navigation-list-child-list { + display: block +} + +.navigation-list-link { + display: block; + padding-top: .25rem; + padding-bottom: .25rem +} + +.navigation-list-link.active { + font-weight: 600; + color: #27262b; + text-decoration: none +} + +.main-nav, +.aux-nav { + display: none +} + +.main-nav.nav-open, +.aux-nav.nav-open { + display: block +} + +@media (min-width: 46.25rem) { + .main-nav, + .aux-nav { + display: block + } +} + +.navigation-list-toggle { + position: absolute; + right: 1rem +} + +@media (min-width: 46.25rem) { + .navigation-list-toggle { + display: none !important + } +} + +@media (min-width: 46.25rem) { + .breadcrumb-nav { + margin-top: -1rem + } +} + +.breadcrumb-nav-list { + padding-left: 0; + margin-bottom: .75rem; + list-style: none +} + +.breadcrumb-nav-list-item { + display: table-cell; + font-size: 11px !important +} + +@media (min-width: 31.25rem) { + .breadcrumb-nav-list-item { + font-size: 12px !important + } +} + +.breadcrumb-nav-list-item::before { + display: none +} + +.breadcrumb-nav-list-item::after { + display: inline-block; + margin-right: .5rem; + margin-left: .5rem; + color: #959396; + content: "/" +} + +.breadcrumb-nav-list-item:last-child::after { + content: "" +} + +h1, +.text-alpha { + font-size: 32px !important; + font-weight: 300 +} + +@media (min-width: 31.25rem) { + h1, + .text-alpha { + font-size: 36px !important + } +} + +h2, +.text-beta { + font-size: 18px !important +} + +@media (min-width: 31.25rem) { + h2, + .text-beta { + font-size: 24px !important + } +} + +h3, +.text-gamma { + font-size: 16px !important +} + +@media (min-width: 31.25rem) { + h3, + .text-gamma { + font-size: 18px !important + } +} + +h4, +.text-delta { + font-size: 11px !important; + font-weight: 300; + text-transform: uppercase; + letter-spacing: 0.1em +} + +@media (min-width: 31.25rem) { + h4, + .text-delta { + font-size: 12px !important + } +} + +h5, +.text-epsilon { + font-size: 12px !important; + color: #44434d +} + +@media (min-width: 31.25rem) { + h5, + .text-epsilon { + font-size: 14px !important + } +} + +h6, +.text-zeta { + font-size: 11px !important; + color: #44434d +} + +@media (min-width: 31.25rem) { + h6, + .text-zeta { + font-size: 12px !important + } +} + +li .highlight { + margin-top: .5rem +} + +.text-small { + font-size: 11px !important +} + +@media (min-width: 31.25rem) { + .text-small { + font-size: 12px !important + } +} + +.text-mono { + font-family: "SFMono-Regular", Menlo, Consolas, Monospace !important +} + +.text-center { + text-align: center !important +} + +.label, +.label-blue { + display: inline-block; + padding-top: 0.16em; + padding-right: 0.42em; + padding-bottom: 0.16em; + padding-left: 0.42em; + margin-right: .25rem; + margin-left: .25rem; + color: #fff; + text-transform: uppercase; + vertical-align: middle; + background-color: #2869e6; + font-size: 11px !important +} + +@media (min-width: 31.25rem) { + .label, + .label-blue { + font-size: 12px !important + } +} + +.label-green { + background-color: #009c7b +} + +.label-purple { + background-color: #5e41d0 +} + +.label-red { + background-color: #e94c4c +} + +.label-yellow { + color: #44434d; + background-color: #f7d12e +} + +.btn { + display: inline-block; + box-sizing: border-box; + padding-top: 0.3em; + padding-right: 1em; + padding-bottom: 0.3em; + padding-left: 1em; + margin: 0; + font-family: inherit; + font-size: inherit; + font-weight: 500; + line-height: 1.5; + color: #474eb5; + text-decoration: none; + vertical-align: baseline; + cursor: pointer; + background-color: #f7f7f7; + border-width: 0; + border-radius: 3px; + 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: #474eb5; + 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 +} + +.search { + position: relative; + z-index: 99; + display: none; + flex-grow: 1; + padding: .5rem; + margin-bottom: .75rem; + background-color: #fff; + border-radius: 3px; + box-shadow: 0 1px 2px rgba(0, 0, 0, 0.07), 0 3px 10px rgba(0, 0, 0, 0.05) +} + +@media (min-width: 46.25rem) { + .search { + display: block; + padding-top: .25rem; + padding-right: 0; + padding-bottom: 0; + padding-left: 0; + margin-bottom: 0; + background-color: transparent; + box-shadow: none + } +} + +.search.nav-open { + display: block +} + +.search-results-wrap { + display: none +} + +.search-results-wrap.active { + position: absolute; + top: .25rem; + z-index: 100; + display: block; + width: 300px; + margin-top: 2rem; + background: #fff; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.07), 0 4px 14px rgba(0, 0, 0, 0.05) +} + +.search-input-wrap { + display: flex; + background-color: #fff +} + +.search-input { + width: 100%; + padding-top: .25rem; + padding-bottom: .25rem; + background-color: #fff; + border-top: 0; + border-right: 0; + border-bottom: 0; + border-left: 0; + order: 2; + font-size: 16px !important +} + +.search-input:focus { + outline: 0; + box-shadow: none +} + +.search-input:focus+.search-icon { + fill: #474eb5 +} + +@media (min-width: 31.25rem) { + .search-input { + font-size: 18px !important + } +} + +@media (min-width: 31.25rem) { + .search-input { + font-size: 12px !important + } +} + +@media (min-width: 31.25rem) and (min-width: 31.25rem) { + .search-input { + font-size: 14px !important + } +} + +@media (min-width: 46.25rem) { + .search-input { + font-size: 11px !important + } +} + +@media (min-width: 46.25rem) and (min-width: 31.25rem) { + .search-input { + font-size: 12px !important + } +} + +.search-icon { + align-self: center; + margin-right: .5rem; + fill: #959396; + order: 1 +} + +.search-results-list { + padding-left: 0; + margin-top: .25rem; + margin-bottom: .25rem; + list-style: none; + font-size: 12px !important +} + +@media (min-width: 31.25rem) { + .search-results-list { + font-size: 14px !important + } +} + +.search-results-list-item { + padding: 0; + margin: 0 +} + +.search-results-link { + display: block; + padding-top: .25rem; + padding-right: .75rem; + padding-bottom: .25rem; + padding-left: .75rem +} + +.search-results-link:hover { + color: #27262b; + background-color: #fafafa +} + +table { + display: block; + width: 100%; + max-width: 100%; + margin-bottom: 1.5rem; + overflow-x: auto; + border-collapse: separate; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.07), 0 4px 14px rgba(0, 0, 0, 0.05) +} + +@media (min-width: 31.25rem) { + table { + display: table + } +} + +th, +td { + font-size: 12px !important; + min-width: 120px; + padding-top: .5rem; + padding-right: .75rem; + padding-bottom: .5rem; + padding-left: .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: 14px !important + } +} + +th:first-of-type, +td:first-of-type { + border-left: 0 +} + +thead tr:first-of-type th:first-of-type, +thead tr:first-of-type td:first-of-type, +tbody:first-child tr:first-of-type th:first-of-type, +tbody:first-child tr:first-of-type td:first-of-type { + border-top-left-radius: 4px +} + +thead tr:first-of-type th:last-of-type, +thead tr:first-of-type td:last-of-type, +tbody:first-child tr:first-of-type th:last-of-type, +tbody:first-child tr:first-of-type td:last-of-type { + border-top-right-radius: 4px +} + +tbody tr:last-of-type th, +tbody tr:last-of-type td { + border-bottom: 0 +} + +tbody tr:last-of-type th:first-of-type, +tbody tr:last-of-type td:first-of-type { + border-bottom-left-radius: 4px +} + +tbody tr:last-of-type th:last-of-type, +tbody tr:last-of-type td:last-of-type { + border-bottom-right-radius: 4px +} + +thead th { + border-bottom: 1px solid #eeebee +} + +code { + padding: 0.2em 0.15em; + font-weight: 400; + background-color: #f5f6fa; + border: 1px solid #eeebee; + border-radius: 4px +} + +pre.highlight { + padding: .75rem; + margin-bottom: 0; + -webkit-overflow-scrolling: touch; + background-color: #f5f6fa +} + +pre.highlight code { + padding: 0; + border: 0 +} + +.highlighter-rouge { + margin-bottom: .75rem; + overflow: hidden; + border-radius: 4px +} + +.highlight .c { + color: #586e75 +} + +.highlight .err { + color: #93a1a1 +} + +.highlight .g { + color: #93a1a1 +} + +.highlight .k { + color: #859900 +} + +.highlight .l { + color: #93a1a1 +} + +.highlight .n { + color: #93a1a1 +} + +.highlight .o { + color: #859900 +} + +.highlight .x { + color: #cb4b16 +} + +.highlight .p { + color: #93a1a1 +} + +.highlight .cm { + color: #586e75 +} + +.highlight .cp { + color: #859900 +} + +.highlight .c1 { + color: #586e75 +} + +.highlight .cs { + color: #859900 +} + +.highlight .gd { + color: #2aa198 +} + +.highlight .ge { + font-style: italic; + color: #93a1a1 +} + +.highlight .gr { + color: #dc322f +} + +.highlight .gh { + color: #cb4b16 +} + +.highlight .gi { + color: #859900 +} + +.highlight .go { + color: #93a1a1 +} + +.highlight .gp { + color: #93a1a1 +} + +.highlight .gs { + font-weight: bold; + color: #93a1a1 +} + +.highlight .gu { + color: #cb4b16 +} + +.highlight .gt { + color: #93a1a1 +} + +.highlight .kc { + color: #cb4b16 +} + +.highlight .kd { + color: #268bd2 +} + +.highlight .kn { + color: #859900 +} + +.highlight .kp { + color: #859900 +} + +.highlight .kr { + color: #268bd2 +} + +.highlight .kt { + color: #dc322f +} + +.highlight .ld { + color: #93a1a1 +} + +.highlight .m { + color: #2aa198 +} + +.highlight .s { + color: #2aa198 +} + +.highlight .na { + color: #93a1a1 +} + +.highlight .nb { + color: #b58900 +} + +.highlight .nc { + color: #268bd2 +} + +.highlight .no { + color: #cb4b16 +} + +.highlight .nd { + color: #268bd2 +} + +.highlight .ni { + color: #cb4b16 +} + +.highlight .ne { + color: #cb4b16 +} + +.highlight .nf { + color: #268bd2 +} + +.highlight .nl { + color: #93a1a1 +} + +.highlight .nn { + color: #93a1a1 +} + +.highlight .nx { + color: #555 +} + +.highlight .py { + color: #93a1a1 +} + +.highlight .nt { + color: #268bd2 +} + +.highlight .nv { + color: #268bd2 +} + +.highlight .ow { + color: #859900 +} + +.highlight .w { + color: #93a1a1 +} + +.highlight .mf { + color: #2aa198 +} + +.highlight .mh { + color: #2aa198 +} + +.highlight .mi { + color: #2aa198 +} + +.highlight .mo { + color: #2aa198 +} + +.highlight .sb { + color: #586e75 +} + +.highlight .sc { + color: #2aa198 +} + +.highlight .sd { + color: #93a1a1 +} + +.highlight .s2 { + color: #2aa198 +} + +.highlight .se { + color: #cb4b16 +} + +.highlight .sh { + color: #93a1a1 +} + +.highlight .si { + color: #2aa198 +} + +.highlight .sx { + color: #2aa198 +} + +.highlight .sr { + color: #dc322f +} + +.highlight .s1 { + color: #2aa198 +} + +.highlight .ss { + color: #2aa198 +} + +.highlight .bp { + color: #268bd2 +} + +.highlight .vc { + color: #268bd2 +} + +.highlight .vg { + color: #268bd2 +} + +.highlight .vi { + color: #268bd2 +} + +.highlight .il { + color: #2aa198 +} + +.code-example { + padding: .75rem; + margin-bottom: .75rem; + overflow: auto; + border: 1px solid #eeebee; + border-radius: 4px +} + +.code-example+.highlighter-rouge, +.code-example+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 +} + +.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: #474eb5 !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: #474eb5 !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: 46.25rem) { + .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: 46.25rem) { + .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: 46.25rem) { + .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: 46.25rem) { + .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: 46.25rem) { + .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: 46.25rem) { + .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: 46.25rem) { + .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: 46.25rem) { + .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: 46.25rem) { + .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: 46.25rem) { + .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: 46.25rem) { + .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: 70rem) { + .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: 70rem) { + .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: 70rem) { + .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: 70rem) { + .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: 70rem) { + .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: 70rem) { + .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: 70rem) { + .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: 70rem) { + .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: 70rem) { + .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: 70rem) { + .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: 70rem) { + .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 + } +} + +.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: 9px !important +} + +@media (min-width: 31.25rem) { + .fs-1 { + font-size: 10px !important + } +} + +.fs-2 { + font-size: 11px !important +} + +@media (min-width: 31.25rem) { + .fs-2 { + font-size: 12px !important + } +} + +.fs-3 { + font-size: 12px !important +} + +@media (min-width: 31.25rem) { + .fs-3 { + font-size: 14px !important + } +} + +.fs-4 { + font-size: 14px !important +} + +@media (min-width: 31.25rem) { + .fs-4 { + font-size: 16px !important + } +} + +.fs-5 { + font-size: 16px !important +} + +@media (min-width: 31.25rem) { + .fs-5 { + font-size: 18px !important + } +} + +.fs-6 { + font-size: 18px !important +} + +@media (min-width: 31.25rem) { + .fs-6 { + font-size: 24px !important + } +} + +.fs-7 { + font-size: 24px !important +} + +@media (min-width: 31.25rem) { + .fs-7 { + font-size: 32px !important + } +} + +.fs-8 { + font-size: 32px !important +} + +@media (min-width: 31.25rem) { + .fs-8 { + font-size: 36px !important + } +} + +.fs-9 { + font-size: 36px !important +} + +@media (min-width: 31.25rem) { + .fs-9 { + font-size: 42px !important + } +} + +.fs-10 { + font-size: 42px !important +} + +@media (min-width: 31.25rem) { + .fs-10 { + font-size: 48px !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.15 +} + +.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 +} + +.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 +} + +.m-1 { + margin: .25rem !important +} + +.mt-1 { + margin-top: .25rem !important +} + +.mr-1 { + margin-right: .25rem !important +} + +.mb-1 { + margin-bottom: .25rem !important +} + +.ml-1 { + margin-left: .25rem !important +} + +.mx-1 { + margin-right: .25rem !important; + margin-left: .25rem !important +} + +.my-1 { + margin-top: .25rem !important; + margin-bottom: .25rem !important +} + +.mxn-1 { + margin-right: -.25rem !important; + margin-left: -.25rem !important +} + +.m-2 { + margin: .5rem !important +} + +.mt-2 { + margin-top: .5rem !important +} + +.mr-2 { + margin-right: .5rem !important +} + +.mb-2 { + margin-bottom: .5rem !important +} + +.ml-2 { + margin-left: .5rem !important +} + +.mx-2 { + margin-right: .5rem !important; + margin-left: .5rem !important +} + +.my-2 { + margin-top: .5rem !important; + margin-bottom: .5rem !important +} + +.mxn-2 { + margin-right: -.5rem !important; + margin-left: -.5rem !important +} + +.m-3 { + margin: .75rem !important +} + +.mt-3 { + margin-top: .75rem !important +} + +.mr-3 { + margin-right: .75rem !important +} + +.mb-3 { + margin-bottom: .75rem !important +} + +.ml-3 { + margin-left: .75rem !important +} + +.mx-3 { + margin-right: .75rem !important; + margin-left: .75rem !important +} + +.my-3 { + margin-top: .75rem !important; + margin-bottom: .75rem !important +} + +.mxn-3 { + margin-right: -.75rem !important; + margin-left: -.75rem !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 +} + +.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 +} + +.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 +} + +.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 +} + +.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 +} + +.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 +} + +.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-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: .25rem !important + } + .mt-xs-1 { + margin-top: .25rem !important + } + .mr-xs-1 { + margin-right: .25rem !important + } + .mb-xs-1 { + margin-bottom: .25rem !important + } + .ml-xs-1 { + margin-left: .25rem !important + } + .mx-xs-1 { + margin-right: .25rem !important; + margin-left: .25rem !important + } + .my-xs-1 { + margin-top: .25rem !important; + margin-bottom: .25rem !important + } + .mxn-xs-1 { + margin-right: -.25rem !important; + margin-left: -.25rem !important + } +} + +@media (min-width: 20rem) { + .m-xs-2 { + margin: .5rem !important + } + .mt-xs-2 { + margin-top: .5rem !important + } + .mr-xs-2 { + margin-right: .5rem !important + } + .mb-xs-2 { + margin-bottom: .5rem !important + } + .ml-xs-2 { + margin-left: .5rem !important + } + .mx-xs-2 { + margin-right: .5rem !important; + margin-left: .5rem !important + } + .my-xs-2 { + margin-top: .5rem !important; + margin-bottom: .5rem !important + } + .mxn-xs-2 { + margin-right: -.5rem !important; + margin-left: -.5rem !important + } +} + +@media (min-width: 20rem) { + .m-xs-3 { + margin: .75rem !important + } + .mt-xs-3 { + margin-top: .75rem !important + } + .mr-xs-3 { + margin-right: .75rem !important + } + .mb-xs-3 { + margin-bottom: .75rem !important + } + .ml-xs-3 { + margin-left: .75rem !important + } + .mx-xs-3 { + margin-right: .75rem !important; + margin-left: .75rem !important + } + .my-xs-3 { + margin-top: .75rem !important; + margin-bottom: .75rem !important + } + .mxn-xs-3 { + margin-right: -.75rem !important; + margin-left: -.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: .25rem !important + } + .mt-sm-1 { + margin-top: .25rem !important + } + .mr-sm-1 { + margin-right: .25rem !important + } + .mb-sm-1 { + margin-bottom: .25rem !important + } + .ml-sm-1 { + margin-left: .25rem !important + } + .mx-sm-1 { + margin-right: .25rem !important; + margin-left: .25rem !important + } + .my-sm-1 { + margin-top: .25rem !important; + margin-bottom: .25rem !important + } + .mxn-sm-1 { + margin-right: -.25rem !important; + margin-left: -.25rem !important + } +} + +@media (min-width: 31.25rem) { + .m-sm-2 { + margin: .5rem !important + } + .mt-sm-2 { + margin-top: .5rem !important + } + .mr-sm-2 { + margin-right: .5rem !important + } + .mb-sm-2 { + margin-bottom: .5rem !important + } + .ml-sm-2 { + margin-left: .5rem !important + } + .mx-sm-2 { + margin-right: .5rem !important; + margin-left: .5rem !important + } + .my-sm-2 { + margin-top: .5rem !important; + margin-bottom: .5rem !important + } + .mxn-sm-2 { + margin-right: -.5rem !important; + margin-left: -.5rem !important + } +} + +@media (min-width: 31.25rem) { + .m-sm-3 { + margin: .75rem !important + } + .mt-sm-3 { + margin-top: .75rem !important + } + .mr-sm-3 { + margin-right: .75rem !important + } + .mb-sm-3 { + margin-bottom: .75rem !important + } + .ml-sm-3 { + margin-left: .75rem !important + } + .mx-sm-3 { + margin-right: .75rem !important; + margin-left: .75rem !important + } + .my-sm-3 { + margin-top: .75rem !important; + margin-bottom: .75rem !important + } + .mxn-sm-3 { + margin-right: -.75rem !important; + margin-left: -.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: 46.25rem) { + .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: 46.25rem) { + .m-md-1 { + margin: .25rem !important + } + .mt-md-1 { + margin-top: .25rem !important + } + .mr-md-1 { + margin-right: .25rem !important + } + .mb-md-1 { + margin-bottom: .25rem !important + } + .ml-md-1 { + margin-left: .25rem !important + } + .mx-md-1 { + margin-right: .25rem !important; + margin-left: .25rem !important + } + .my-md-1 { + margin-top: .25rem !important; + margin-bottom: .25rem !important + } + .mxn-md-1 { + margin-right: -.25rem !important; + margin-left: -.25rem !important + } +} + +@media (min-width: 46.25rem) { + .m-md-2 { + margin: .5rem !important + } + .mt-md-2 { + margin-top: .5rem !important + } + .mr-md-2 { + margin-right: .5rem !important + } + .mb-md-2 { + margin-bottom: .5rem !important + } + .ml-md-2 { + margin-left: .5rem !important + } + .mx-md-2 { + margin-right: .5rem !important; + margin-left: .5rem !important + } + .my-md-2 { + margin-top: .5rem !important; + margin-bottom: .5rem !important + } + .mxn-md-2 { + margin-right: -.5rem !important; + margin-left: -.5rem !important + } +} + +@media (min-width: 46.25rem) { + .m-md-3 { + margin: .75rem !important + } + .mt-md-3 { + margin-top: .75rem !important + } + .mr-md-3 { + margin-right: .75rem !important + } + .mb-md-3 { + margin-bottom: .75rem !important + } + .ml-md-3 { + margin-left: .75rem !important + } + .mx-md-3 { + margin-right: .75rem !important; + margin-left: .75rem !important + } + .my-md-3 { + margin-top: .75rem !important; + margin-bottom: .75rem !important + } + .mxn-md-3 { + margin-right: -.75rem !important; + margin-left: -.75rem !important + } +} + +@media (min-width: 46.25rem) { + .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: 46.25rem) { + .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: 46.25rem) { + .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: 46.25rem) { + .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: 46.25rem) { + .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: 46.25rem) { + .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: 46.25rem) { + .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: 70rem) { + .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: 70rem) { + .m-lg-1 { + margin: .25rem !important + } + .mt-lg-1 { + margin-top: .25rem !important + } + .mr-lg-1 { + margin-right: .25rem !important + } + .mb-lg-1 { + margin-bottom: .25rem !important + } + .ml-lg-1 { + margin-left: .25rem !important + } + .mx-lg-1 { + margin-right: .25rem !important; + margin-left: .25rem !important + } + .my-lg-1 { + margin-top: .25rem !important; + margin-bottom: .25rem !important + } + .mxn-lg-1 { + margin-right: -.25rem !important; + margin-left: -.25rem !important + } +} + +@media (min-width: 70rem) { + .m-lg-2 { + margin: .5rem !important + } + .mt-lg-2 { + margin-top: .5rem !important + } + .mr-lg-2 { + margin-right: .5rem !important + } + .mb-lg-2 { + margin-bottom: .5rem !important + } + .ml-lg-2 { + margin-left: .5rem !important + } + .mx-lg-2 { + margin-right: .5rem !important; + margin-left: .5rem !important + } + .my-lg-2 { + margin-top: .5rem !important; + margin-bottom: .5rem !important + } + .mxn-lg-2 { + margin-right: -.5rem !important; + margin-left: -.5rem !important + } +} + +@media (min-width: 70rem) { + .m-lg-3 { + margin: .75rem !important + } + .mt-lg-3 { + margin-top: .75rem !important + } + .mr-lg-3 { + margin-right: .75rem !important + } + .mb-lg-3 { + margin-bottom: .75rem !important + } + .ml-lg-3 { + margin-left: .75rem !important + } + .mx-lg-3 { + margin-right: .75rem !important; + margin-left: .75rem !important + } + .my-lg-3 { + margin-top: .75rem !important; + margin-bottom: .75rem !important + } + .mxn-lg-3 { + margin-right: -.75rem !important; + margin-left: -.75rem !important + } +} + +@media (min-width: 70rem) { + .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: 70rem) { + .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: 70rem) { + .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: 70rem) { + .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: 70rem) { + .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: 70rem) { + .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: 70rem) { + .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: .25rem !important + } + .mt-xl-1 { + margin-top: .25rem !important + } + .mr-xl-1 { + margin-right: .25rem !important + } + .mb-xl-1 { + margin-bottom: .25rem !important + } + .ml-xl-1 { + margin-left: .25rem !important + } + .mx-xl-1 { + margin-right: .25rem !important; + margin-left: .25rem !important + } + .my-xl-1 { + margin-top: .25rem !important; + margin-bottom: .25rem !important + } + .mxn-xl-1 { + margin-right: -.25rem !important; + margin-left: -.25rem !important + } +} + +@media (min-width: 87.5rem) { + .m-xl-2 { + margin: .5rem !important + } + .mt-xl-2 { + margin-top: .5rem !important + } + .mr-xl-2 { + margin-right: .5rem !important + } + .mb-xl-2 { + margin-bottom: .5rem !important + } + .ml-xl-2 { + margin-left: .5rem !important + } + .mx-xl-2 { + margin-right: .5rem !important; + margin-left: .5rem !important + } + .my-xl-2 { + margin-top: .5rem !important; + margin-bottom: .5rem !important + } + .mxn-xl-2 { + margin-right: -.5rem !important; + margin-left: -.5rem !important + } +} + +@media (min-width: 87.5rem) { + .m-xl-3 { + margin: .75rem !important + } + .mt-xl-3 { + margin-top: .75rem !important + } + .mr-xl-3 { + margin-right: .75rem !important + } + .mb-xl-3 { + margin-bottom: .75rem !important + } + .ml-xl-3 { + margin-left: .75rem !important + } + .mx-xl-3 { + margin-right: .75rem !important; + margin-left: .75rem !important + } + .my-xl-3 { + margin-top: .75rem !important; + margin-bottom: .75rem !important + } + .mxn-xl-3 { + margin-right: -.75rem !important; + margin-left: -.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: .25rem !important +} + +.pt-1 { + padding-top: .25rem !important +} + +.pr-1 { + padding-right: .25rem !important +} + +.pb-1 { + padding-bottom: .25rem !important +} + +.pl-1 { + padding-left: .25rem !important +} + +.px-1 { + padding-right: .25rem !important; + padding-left: .25rem !important +} + +.py-1 { + padding-top: .25rem !important; + padding-bottom: .25rem !important +} + +.p-2 { + padding: .5rem !important +} + +.pt-2 { + padding-top: .5rem !important +} + +.pr-2 { + padding-right: .5rem !important +} + +.pb-2 { + padding-bottom: .5rem !important +} + +.pl-2 { + padding-left: .5rem !important +} + +.px-2 { + padding-right: .5rem !important; + padding-left: .5rem !important +} + +.py-2 { + padding-top: .5rem !important; + padding-bottom: .5rem !important +} + +.p-3 { + padding: .75rem !important +} + +.pt-3 { + padding-top: .75rem !important +} + +.pr-3 { + padding-right: .75rem !important +} + +.pb-3 { + padding-bottom: .75rem !important +} + +.pl-3 { + padding-left: .75rem !important +} + +.px-3 { + padding-right: .75rem !important; + padding-left: .75rem !important +} + +.py-3 { + padding-top: .75rem !important; + padding-bottom: .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: .25rem !important + } + .pt-xs-1 { + padding-top: .25rem !important + } + .pr-xs-1 { + padding-right: .25rem !important + } + .pb-xs-1 { + padding-bottom: .25rem !important + } + .pl-xs-1 { + padding-left: .25rem !important + } + .px-xs-1 { + padding-right: .25rem !important; + padding-left: .25rem !important + } + .py-xs-1 { + padding-top: .25rem !important; + padding-bottom: .25rem !important + } + .p-xs-2 { + padding: .5rem !important + } + .pt-xs-2 { + padding-top: .5rem !important + } + .pr-xs-2 { + padding-right: .5rem !important + } + .pb-xs-2 { + padding-bottom: .5rem !important + } + .pl-xs-2 { + padding-left: .5rem !important + } + .px-xs-2 { + padding-right: .5rem !important; + padding-left: .5rem !important + } + .py-xs-2 { + padding-top: .5rem !important; + padding-bottom: .5rem !important + } + .p-xs-3 { + padding: .75rem !important + } + .pt-xs-3 { + padding-top: .75rem !important + } + .pr-xs-3 { + padding-right: .75rem !important + } + .pb-xs-3 { + padding-bottom: .75rem !important + } + .pl-xs-3 { + padding-left: .75rem !important + } + .px-xs-3 { + padding-right: .75rem !important; + padding-left: .75rem !important + } + .py-xs-3 { + padding-top: .75rem !important; + padding-bottom: .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: .25rem !important + } + .pt-sm-1 { + padding-top: .25rem !important + } + .pr-sm-1 { + padding-right: .25rem !important + } + .pb-sm-1 { + padding-bottom: .25rem !important + } + .pl-sm-1 { + padding-left: .25rem !important + } + .px-sm-1 { + padding-right: .25rem !important; + padding-left: .25rem !important + } + .py-sm-1 { + padding-top: .25rem !important; + padding-bottom: .25rem !important + } + .p-sm-2 { + padding: .5rem !important + } + .pt-sm-2 { + padding-top: .5rem !important + } + .pr-sm-2 { + padding-right: .5rem !important + } + .pb-sm-2 { + padding-bottom: .5rem !important + } + .pl-sm-2 { + padding-left: .5rem !important + } + .px-sm-2 { + padding-right: .5rem !important; + padding-left: .5rem !important + } + .py-sm-2 { + padding-top: .5rem !important; + padding-bottom: .5rem !important + } + .p-sm-3 { + padding: .75rem !important + } + .pt-sm-3 { + padding-top: .75rem !important + } + .pr-sm-3 { + padding-right: .75rem !important + } + .pb-sm-3 { + padding-bottom: .75rem !important + } + .pl-sm-3 { + padding-left: .75rem !important + } + .px-sm-3 { + padding-right: .75rem !important; + padding-left: .75rem !important + } + .py-sm-3 { + padding-top: .75rem !important; + padding-bottom: .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: 46.25rem) { + .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: .25rem !important + } + .pt-md-1 { + padding-top: .25rem !important + } + .pr-md-1 { + padding-right: .25rem !important + } + .pb-md-1 { + padding-bottom: .25rem !important + } + .pl-md-1 { + padding-left: .25rem !important + } + .px-md-1 { + padding-right: .25rem !important; + padding-left: .25rem !important + } + .py-md-1 { + padding-top: .25rem !important; + padding-bottom: .25rem !important + } + .p-md-2 { + padding: .5rem !important + } + .pt-md-2 { + padding-top: .5rem !important + } + .pr-md-2 { + padding-right: .5rem !important + } + .pb-md-2 { + padding-bottom: .5rem !important + } + .pl-md-2 { + padding-left: .5rem !important + } + .px-md-2 { + padding-right: .5rem !important; + padding-left: .5rem !important + } + .py-md-2 { + padding-top: .5rem !important; + padding-bottom: .5rem !important + } + .p-md-3 { + padding: .75rem !important + } + .pt-md-3 { + padding-top: .75rem !important + } + .pr-md-3 { + padding-right: .75rem !important + } + .pb-md-3 { + padding-bottom: .75rem !important + } + .pl-md-3 { + padding-left: .75rem !important + } + .px-md-3 { + padding-right: .75rem !important; + padding-left: .75rem !important + } + .py-md-3 { + padding-top: .75rem !important; + padding-bottom: .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: 70rem) { + .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: .25rem !important + } + .pt-lg-1 { + padding-top: .25rem !important + } + .pr-lg-1 { + padding-right: .25rem !important + } + .pb-lg-1 { + padding-bottom: .25rem !important + } + .pl-lg-1 { + padding-left: .25rem !important + } + .px-lg-1 { + padding-right: .25rem !important; + padding-left: .25rem !important + } + .py-lg-1 { + padding-top: .25rem !important; + padding-bottom: .25rem !important + } + .p-lg-2 { + padding: .5rem !important + } + .pt-lg-2 { + padding-top: .5rem !important + } + .pr-lg-2 { + padding-right: .5rem !important + } + .pb-lg-2 { + padding-bottom: .5rem !important + } + .pl-lg-2 { + padding-left: .5rem !important + } + .px-lg-2 { + padding-right: .5rem !important; + padding-left: .5rem !important + } + .py-lg-2 { + padding-top: .5rem !important; + padding-bottom: .5rem !important + } + .p-lg-3 { + padding: .75rem !important + } + .pt-lg-3 { + padding-top: .75rem !important + } + .pr-lg-3 { + padding-right: .75rem !important + } + .pb-lg-3 { + padding-bottom: .75rem !important + } + .pl-lg-3 { + padding-left: .75rem !important + } + .px-lg-3 { + padding-right: .75rem !important; + padding-left: .75rem !important + } + .py-lg-3 { + padding-top: .75rem !important; + padding-bottom: .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: .25rem !important + } + .pt-xl-1 { + padding-top: .25rem !important + } + .pr-xl-1 { + padding-right: .25rem !important + } + .pb-xl-1 { + padding-bottom: .25rem !important + } + .pl-xl-1 { + padding-left: .25rem !important + } + .px-xl-1 { + padding-right: .25rem !important; + padding-left: .25rem !important + } + .py-xl-1 { + padding-top: .25rem !important; + padding-bottom: .25rem !important + } + .p-xl-2 { + padding: .5rem !important + } + .pt-xl-2 { + padding-top: .5rem !important + } + .pr-xl-2 { + padding-right: .5rem !important + } + .pb-xl-2 { + padding-bottom: .5rem !important + } + .pl-xl-2 { + padding-left: .5rem !important + } + .px-xl-2 { + padding-right: .5rem !important; + padding-left: .5rem !important + } + .py-xl-2 { + padding-top: .5rem !important; + padding-bottom: .5rem !important + } + .p-xl-3 { + padding: .75rem !important + } + .pt-xl-3 { + padding-top: .75rem !important + } + .pr-xl-3 { + padding-right: .75rem !important + } + .pb-xl-3 { + padding-bottom: .75rem !important + } + .pl-xl-3 { + padding-left: .75rem !important + } + .px-xl-3 { + padding-right: .75rem !important; + padding-left: .75rem !important + } + .py-xl-3 { + padding-top: .75rem !important; + padding-bottom: .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 + } +} diff --git a/assets/images/just-the-docs.png b/assets/images/just-the-docs.png new file mode 100644 index 0000000000000000000000000000000000000000..81c33065f2794814cbe1a53791d8bc4bfbb91cb1 GIT binary patch literal 20992 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 z %e4Th^)+U*Xm9<_F_r%u5Z{!kJ+k>*(cDoOCo>sadqR}XcE!-Q?0Gd+XD1SH5% zQx_FvaGi48=&RSb?++IWSJwels3$Y0K}C{gbJY;Id2KfF?l?IMVHo&p9z0T#^Gno2 z?zSQ7=ZmXeDyBz-H(&cLT0F)#x4?cv4Il(1d17GEFhA4sG%R^FP+*I>lV&sqS1g z+y_4IpM!liS%8GnlFJBupa6i)msB@!GLAZ}iSyro?=RbADvCk(t5RxhhG=(-9ahzp zvwXcoWsf-~%+sa+^qNx;;2q%b4Tw`Wp2ORYe1R>WBBdFIS-M~#6DnR}vY?|-z{ zvIstDX7|FF$w^5S$8D|6Yk>O1!G2`y|A#l`>|f$Zi3K1frQepx{mWwk#L`c5ik*LX zuOtniePQ2qqW=;D#{jPt*)KeW`Ii`A`3evT=q{yXf7|cisx;@=2(ldWjau*7J=?L3?s#2zew2my7(j!yhSNCybal1F%tI-< zM9B6%FnCXRfB3B>OYcV6ik|7&LcURhGiIE*iB?l3i-C?kAS>dMw+c0)nSHy-z$cTZ#ViYB38@QCPr?f0!E>P z>S>fMrbO%;dn-NCH`*!?Ue5D_a|YsDNnd&RTTiWpG5M*D-?=rYHvuSzi{X@04A z5?U1yu>M_P*;t!>Me_TY(1wGCIZxdz}GJ~X~bHXOZ;;0j-jRW+b!yWj-vx^gLJzYdcP^t=gRIR=fY`_G(zHRNGOWINy2GiiYlLUwDJTvmlL)IjV z2)WiAFkg#6z>X$=Cxo~+cElCY8CtcC2n(Et^GDiSqf>;`Vy1O2H8!tp)(Vm5cLVDe zw+{1|qlP>GPl2-bdTWDE=MHl(<0uZR-FLV5FQ1l{{nYYk1y2fOf@Xii=gVtm=Od6^nZh@jC3?n>Xv^_$$nV9`sV zi&sdyf$nt?&tYEA2fqQAHTlB^<^pdfD-+_BFDzbFmOySj#G1tM>8(Igo-v99O01ztMxqO>N$}`Nz&( z!VCk#r6{D%-2pzBixYs+3+BJQz5L@fIDGY<+@oDT!e8CtjNj=F*3}*c)1sfrt&sn7 zAw0kDc;xWiAHuQVAh6hgx;ie#pxQ&QugT!6hq^8vq|jKrtIgH7<=^9e)}&L1G?ZT* z`90gdFje0pGTHZ{^z~eOk^A{YK;w58ukSUvJc{F4luwsn0LAkCBQaXXt9~HAUWuOO z@JdZBK{%I(G+Dg%h0Gt*ioU2cgp<{q$#_!Bm661AWiF`gh}}i6t2c$cm!R-CUegis zxhnzxpjq>gbCMJd_M>oX z@2W|~ikBxv`T5a#WLZVPXqT%gZb@Z$p$RStqjXf6RO=S?fx#ZI5y?@s_jq36e*C`k z7!7pe!d+3GnO>i1LaV;}m5~I?tH0aR`b!&6%)T=n$fWvv0^sl@IhxAicjON2AP&kxuv0CJ_0X(UriT6iZ_dgX)MLvu7{lYGOFS{^K?z$Ut-C6?g#&A zKk(l<4xWFzI~_^#}iV8g5_&vqT3MkF1;+>@5pv(Z%zqinF=Y z`KQ@&j!p<`fi)$4HkDSa*vSg;UH>Sxs(&B3#!p&xDXGBuQn|%gg;EUr)Fn*tyh$B( zNp!uoZy`X?S%^F2oI%A$qy`@u6`f>b{UaNFJkMZDPPrP>c&a{rD={|vdxm}Dgz+-= z2yb+7acJjG$d0;V_}%l?N#C;KeZ0b2kSCZkuTk%O!8SsoC^(_{%WG>2S2*n+eR{cW zm4kUBL)6k{n3foR+DBe<6BKE*WtY=&Cx5yhca}>6z{yPB@iO7Hh&tGf0lnIv6NoYJ z)i_Aiw}ioID#QmU(_OFk4F$ombn-C)T~;LVC1ClJZ^UKvr?sT$+8-e<2tmFZze*YGGMup}hohvB_zp)pmhg>mcC{$M9x(~FNe#Z_?#NDADl zX++a#Jn&UI*RY<6h(gu+9}Zw+RB5DfW3)l0k}q<%?tx4w_WSr z5@v{}nsXsRUv)bC_TwmJ>cz&n=hurfd7>a*k3WefQ{=9Pc3bh}_dL5x#vWywHUXhC zZ*F{YzTtHSB*1P?n{*B_t=T)>K4eR|%_M-%Z9^qMw?7dd4fc)L4i5#fB7T@txW;{i zW}P?K`u)@0BsHF|I3|=&JKhUoX9M(PEYDFyGulvE7ZiWl`*`_C{XK;>J|2=2zh5xjyM#TgYYmG&{*rUY%O_@q2NKT) z6$m;}2?l_4^_KKAC{A7GoxWpUpAYbIM+NOBN#+XYn`tXg4bL#)XWPDCF%a;ar%Rqc zj5=(v-jax)rjLDD#?`)F+h(4|XIa~_)$}-b@^?S=-5cmRVXOHOVYb7GN+9P(X+^m{ zTT0>y+8#GeG2b+{FZ#KOWb;P2-$l^G&(#%Go|74aGud`&&*y>PH)wf+Iw;gNVUt3E zCoJ7ug*cyjgwrC_REnB7vK;vCes?I%bR0NKarrB=`n%5h%(#sETe|u6mPF;UEYOLr z!uiB}!Co&r1NO=&(_t^Mbv7f@_JIt@DybgjZ^?&M>N9E9PHo5G7Xj36w}I>UOmiWh zv4Q-+?L;c9gx$`zyXkwBToL7D0W;t6)D(aEvYa2lGJcZi(=u7ndpCUXzf1DhKw2Ja zWP#ksze{#qV98$VI!*GQ_y3S>|KIzECf#YGZv;No6yO#HP~q| zx-%0C5MWx{1*l^33KgaF99+eQyK37*0mJha4RtTUWbb!#lk)c4R03=j39Q8Lh6qD7 zhxU}d`KCN0Z@v@4$Bvy9UWd7*?H5pA!%utm4tqKl=h}x(AwKk@b>vpJ$`P2nxIp@G z7_spCo|%R`tAvwjJdA1t2E1bcb;S?r3d*0QmGE5-g56? zuyXc_^z?TjnOkv7z=UZ`^G2T`R!d@?m^a&b%^Jwz8YlTALWG<#B>8Qg-d%=?wt*xU z=Zc6W%&ap9&_Os28Wx7+qq)USE%v6!yZ`qfz?VrunY7a^;jbc#NY>Qsa zpFxF_c)*JTJT4AzSUf}05NMZd+4E(d5Dt(ScqyrB_^5xmI3UpFwUk6c8GSVG*3kF| zV!d)B&+ca8Q8xy`9uld%)v!U1_ocAwpPf)M|5HoFl(Hu*<1&l{+sW{OFUDsx@Hv}g zsCb=TPv3QEi}vFE30cLRWimw-dDsO4eJ3yTX3U`B^eJ&^&d2_N?uu{3237P)^t-s_|I zr_tBz`?!N|l_&1MgLeE@fK#=$kry>TXdTTB6@sEpxH}PJh`=`r`a?f4P{4cbAee9jdiZ*NHu*SW{LLlvuE#Fw$Pq>~#qIG%yMWf*s>#C(L< zKN#iO->CrCoO9VM;=hx<3HoCKB<;SKXoo_CJt8^?SZTg=g-%~OyQ$=<_b_a|ez{n4 z$;OxUGy8x^MVTU+v+iOd(zo(O6`fh+bnsKmF8v$IVqDHzZn<`&vC$twGhZy~joN@; zCdW3eAf10Co`)Un=r?}rg%?vWs>mCOWVjSX$Ggs_7`CBAxt_(c8;{`bL@QPr)p$z3 z{!o#|gJ4oI5V_Gc;x*4tI8fthCePH<$NajnoVEOp`PUJ3;9mL4p+;;L3G|kQoxP_6 zJyFY!4UBNSxX_4Teiu4i^xgY3T+F$rjIXDh`e&vcY4h+zl5UR6C3fdCY{1I!MfZl?$dC#U2W5x7op9DxnYWapT(Z=lPm@r{d(NHqLTJO=3}uinc-~t7W?K7 zK1Gb**?Z{QwHLoY3z{x4tN>OmDRK|Jc#uXL3UUBmQ3k(X3VWeqh7uBG(NKYH@^#k{ z593hXp-(|HSv-fjp_!qgK!widUdTsIqQTpsE2;|57jZnYu1DAC2AN4^im|&}xPqYk zV8~+X&wL@BcdJH+ZnqB-!0x-hX3I$`$!BnqDO( zJDk{fceXl2>1AHe>$|ibw;d~?RBO>Yl`IOIk{{?6);(_JqY9;rcniB>mb~40uKZLC zYf)0;S8&sMMxCFox4~^i+oPX|>@6wG;zpJDMBSjE1oG7z46L8G-jP*(!gtxxGn!zX zmDQWEQkQyC6=#-%y4>R#h#8O`Z1l9Q5;h_XqL*C8K|@&&@X}Y6IpKf*oz)pQlnc`j z@VwCLV;GC?b~}?MaeTKJ1FMo}Iqw~m17ZI`tZDcp-VJJY_+}P-X@?6{iQ9ZF6T9u0 z9|h8sY>K!#d$h-2VE;)p3$hR7R>~9Qe>DqNV=cqN=$Drwy6xO9OrUN%Xxa7rQLJ|i zQ|tuDm7gtczD}nJpPL40BuJ{bawB@q&}ns+t|^ z%rl0|&+`ryKM+Yb-|vh_-DLIWL}Os0zi&Q8TipLncnm+(dStj!qFPmsA6U^Maa>Lj zxLY2~)nD|*hf$?whm#T@?G!MVPwL2>qTQdOQ9VMTWAAEnwup%70z@7Ur$q(%rhbkhtbF5!DOO@N%tV5*WYsuL8g6uy|7 z{h%}B17s-4xS2&bB^;0N+06Kq^gt=t?SMR+1t3>sZR$S}hM=JX=@4P)dKc7qRzVlC zK-d}r#3wpx4vW%x2`K*jY${%sqtg?>-5wv`!U>8{|1rTJ2K0!_F$riiJi)<}w#!J^ z@Y6VmgM&i>!Y5c2*w}XE0RpY(*El#x$S#CD^5MJbx*dlfIq)k{FCM5b3_z>S_8{`5 z;i(Rul*el84UDxdh#FK|bYky(p!U=NUQC4d8A^y$8_MQbcIMQg3i>R20fX6;>er!a z{s;bu3D`FCy_$XoG<#wp-SLIoM@iM-Dl6Rt`~aYV+du)b*5#iFLI%*@ujU#lRM%>> z<+*;Wmn8*aF-;T@heDJ^?PolSt6N0P{lC}TqG6W>#uPB=%>HKoKPUC2x_qo}Yzu|rtSIMn_6N2#{ zg5a~quO7s=Ib&ytLZOyVRM`fv^&=nJ$cPI#0i8XWPNNyQLo>)o=g^XJ`fO)9^GjK1 z&%@6x0g=#fo=$`mBPK=A&2fWLCN_~>+|KN2WJT!7gTcQlBB_s<_DhYYRqHp(&wuh? zS`(T)6?hnE7l5d4PhSfk8SV1gTo7md+v+qKd2#3L|4ZeWXEmDPQNkb!A+onK=L!L? zvcPc$nAXAMcp5AeI&6_<= zyHp9AY5F&qv&~=xzToaZ`lmb%prfQWSOB;Ap*A`#_ojq zEqf5TVh~je1sFS{0qV^V7EBcMQHX<>Q>w%>&R3G*j;l3pYn!9w_isP6lmhq1;0zcB zlNPm=&f@~NZs2?G6gC8L+odvHz|)c)`uxq{SJ~w{a*TkF0LA|Z58-nx6qJoyIgr(WgXXP9Y;sMwc*QKF zdLz0jXny&nm-M{r-h%{}fE^gf+QAHrQ@z@2ibLd-g2V4MDsMu zt<&#a9`oqc(^J!Mc7J`P2i$xF1}~wbydnylT3+Es+HuE;Q*um1;QmC;UC_g&5UZhr zJ|||~21ThCH#vv*e0Apsz>imN7qEezsiwubmK~QXc#u#};-^Ulb)*iuLv52ti6wm7 zxA*EKeQ!H94gl#f757((ro+az!{KLoZl_V&C(vBVhoD7=>K?zr3Ml9a=_X!yTw^on zx3mQxWPH;-v^RpbRCm@!M{~l5Xgjda;PX;T7SCsh3hbAfK$2_V$UYxcR`3Dh0@=%Grxs+1_>@>$y;l{@gr^mT2V;V=i}*7g0t zdg%Vr;hF)r{ri%@)oFFfm4(AK`-en_NP=H+Z{vdr?ED+@fEEmjq;@2# z*AiR~(u!znC*HJ5kB!zZt)}6NF1AwJ+lmVASsMHi^*;k7iyT1z=|3qHMfpQRQzxFA zm|h6nyuqw*8g#eEn0arKR{MpB(-%bKV!~p%j%IY3Ngz6wHr8LHo*Ve)aw_Rz>G}ka z?~=_&$m5o^4LgZ6rtB&)aP+%0y{OXTCWe!PLW@ho&WoFNA9s|&!6MA`F>Tv<=zX6WrQ=`=IOo}<5!77u9 zSf-AO`a1qRqXWAEA}g;p?m9;7;QLpxMlX(}bq8PC4R}(#ht6uMOsF0K-%>*{*4;yL z0WuI)bDpBZ#anw_GO<)VB6HaQh|2f4?q}|_P8QP$bUhku&Myav<)3YJ4 z%)kezX~*S8!0tcE3pjGX8EzC2f)0m1`7r*uVr;@327(Z=d3=Ji9R%0ni0N@ZB493X8#JH zUZ)ZW63Jp0XKl!+WaQR?3S7)5l<74-Uy={(+D&`HCbz_Ij(SPi&o@fG71nHoMQL^> zM?`GSGybs3KCi!aDO*I8aj315%m zwIb5GA|rpqev`GstcZp z(3t%Z36@ep{UGB+N!fmybQq*YL^N8npt@gbx44)R*hmoZ`$?qRV!b{maMP2qh(~Zk zqP7yX=+CVpi&|I)1Y&JWQW8J~WDXBKTywKrQ@q7X2sl?@Hf^N8VUjwLG|45Ub;nLU z$akT(@ZP2w+6K0>&vN@D*xp%_jiQ7k*Rcbaa{lhP7dGiNXx4Yo7Wz&e08=}#4%mxG z!_xgARGLQM#(A2#qy9=BYx3A*VksBzAZ}!NT*VBLcp3{0(0|^FUBmV>i;X*119_r zd-8u)5Bc-*hLVN^*bwfq=CY8-*t9p78wQ`k_k-qPb z*4m#Sxxpmm%UQU!mNQ?Q>5?D~DYBisi%YWfzg5-VXP)fq?9F0w zNST_INj&|soc4FI{J+9eW|i{vYA@?=@~XWp>2&Q5IR|L(atI*MzW@nS|1NArpdf+9sV(wm8jqVKO52R`E|m-7{-5hTYHB)ml=3@& zT&hEKgVBFE{Q03}%UbUqjJ9bL0R#>dDA_djflaXm0R$o=p!JX0!09U$Ow=yMP{f76oJwU$arlwgAUEX51W@u*+7C#K3_pkGEA<>?hqZ zCf%_uO*78(jrpo9E<37ptx+=q2*h208K$_8F#SWI9|4(p$pnY3yhO5j*^1T+9X|G1c&LyA2Oy{X3#E{Z?(O+=P~|A009KT2#_#^(PCc&A}$b|kWtnseK(P;o)R3k za_PKErKAlm4&1hU=?&+cd&bmYjg}-*Pn5Df>P7&8_z7@Yf%uInJsLy-hfgc;XZdvW zV=p!47o4^F^(Tm2mu`-n^Xd|1%z3h9=pa6A`fZxi3iQjuMg#^;fHh2mMo+^ClvY4y zQI^Yji5AF3WhF^^_W9Db7QNb^e}2)k67?tLWTT(!+ST(x->BfSGN;OkL2IMe8zM#k zfl>>QFqK-E`VlCTKyV2UdBcB95~X`RFLAFV1g&LiI?~NN{q)nF(t!oRPjHPoKfUD? zqs<2-aXPismz;?-9Kj<{VFDyf6*k~>H$DQAAgz%_%!}kijZa9Dv~c+FhNqr*;)$;K z^sxLrdE;>9ozimfqnes#9~oS;Pm-q-z)0 zc|%PX*`c(|YRJW2cmK4@SN=B}rMF0Ov_UTZx=Mb3+0*8wnueOCGBdKH$hIhc5P@aO zo?9im1V6XRkCJP6O>8c+BOcrkKmY**5I_I{1Q0+V?gIZGs%`UV2FoSA00000NkvXXu0mjf2eu-h literal 0 HcmV?d00001 diff --git a/assets/images/search.svg b/assets/images/search.svg new file mode 100644 index 0000000..421ca4d --- /dev/null +++ b/assets/images/search.svg @@ -0,0 +1 @@ +Search diff --git a/assets/js/just-the-docs.js b/assets/js/just-the-docs.js new file mode 100644 index 0000000..50e4e13 --- /dev/null +++ b/assets/js/just-the-docs.js @@ -0,0 +1,177 @@ +// Event handling + +function addEvent(el, type, handler) { + if (el.attachEvent) el.attachEvent('on'+type, handler); else el.addEventListener(type, handler); +} +function removeEvent(el, type, handler) { + if (el.detachEvent) el.detachEvent('on'+type, handler); else el.removeEventListener(type, handler); +} + +// Show/hide mobile menu + +function toggleNav(){ + const nav = document.querySelector('.js-main-nav'); + const auxNav = document.querySelector('.js-aux-nav'); + const navTrigger = document.querySelector('.js-main-nav-trigger'); + const search = document.querySelector('.js-search'); + + addEvent(navTrigger, 'click', function(){ + var text = navTrigger.innerText; + var textToggle = navTrigger.getAttribute('data-text-toggle'); + + nav.classList.toggle('nav-open'); + auxNav.classList.toggle('nav-open'); + navTrigger.classList.toggle('nav-open'); + search.classList.toggle('nav-open'); + navTrigger.innerText = textToggle; + navTrigger.setAttribute('data-text-toggle', text); + textToggle = text; + }) +} + +// Site search + +function initSearch() { + var index = lunr(function () { + this.ref('id'); + this.field('title', { boost: 20 }); + this.field('content', { boost: 10 }); + this.field('url'); + }); + + // Get the generated search_data.json file so lunr.js can search it locally. + + sc = document.getElementsByTagName("script"); + source = ''; + + for(idx = 0; idx < sc.length; idx++) + { + s = sc.item(idx); + + if(s.src && s.src.match(/just-the-docs\.js$/)) + { source = s.src; } + } + + jsPath = source.replace('just-the-docs.js', ''); + + jsonPath = jsPath + 'search-data.json'; + + var request = new XMLHttpRequest(); + request.open('GET', jsonPath, true); + + request.onload = function() { + if (request.status >= 200 && request.status < 400) { + // Success! + var data = JSON.parse(request.responseText); + var keys = Object.keys(data); + + for(var i in data) { + index.add({ + id: data[i].id, + title: data[i].title, + content: data[i].content, + url: data[i].url + }); + } + searchResults(data); + } else { + // We reached our target server, but it returned an error + console.log('Error loading ajax request. Request status:' + request.status); + } + }; + + request.onerror = function() { + // There was a connection error of some sort + console.log('There was a connection error'); + }; + + request.send(); + + function searchResults(dataStore) { + var searchInput = document.querySelector('.js-search-input'); + var searchResults = document.querySelector('.js-search-results'); + var store = dataStore; + + function hideResults() { + searchResults.innerHTML = ''; + searchResults.classList.remove('active'); + } + + addEvent(searchInput, 'keyup', function(e){ + var query = this.value; + + searchResults.innerHTML = ''; + searchResults.classList.remove('active'); + + if (query === '') { + hideResults(); + } else { + var results = index.search(query); + + if (results.length > 0) { + searchResults.classList.add('active'); + var resultsList = document.createElement('ul'); + searchResults.appendChild(resultsList); + + for (var i in results) { + var resultsListItem = document.createElement('li'); + var resultsLink = document.createElement('a'); + var resultsUrlDesc = document.createElement('span'); + var resultsUrl = store[results[i].ref].url; + var resultsRelUrl = store[results[i].ref].relUrl; + var resultsTitle = store[results[i].ref].title; + + resultsLink.setAttribute('href', resultsUrl); + resultsLink.innerText = resultsTitle; + resultsUrlDesc.innerText = resultsRelUrl; + + resultsList.classList.add('search-results-list'); + resultsListItem.classList.add('search-results-list-item'); + resultsLink.classList.add('search-results-link'); + resultsUrlDesc.classList.add('fs-2','text-grey-dk-000','d-block'); + + resultsList.appendChild(resultsListItem); + resultsListItem.appendChild(resultsLink); + resultsLink.appendChild(resultsUrlDesc); + } + } + + // When esc key is pressed, hide the results and clear the field + if (e.keyCode == 27) { + hideResults(); + searchInput.value = ''; + } + } + }); + + addEvent(searchInput, 'blur', function(){ + setTimeout(function(){ hideResults() }, 300); + }); + } +} + +function pageFocus() { + var mainContent = document.querySelector('.js-main-content'); + mainContent.focus(); + console.log(mainContent) +} + + +// Document ready + +function ready(){ + toggleNav(); + pageFocus(); + if (typeof lunr !== 'undefined') { + initSearch(); + } +} + +// 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(); +}); diff --git a/assets/js/search-data.json b/assets/js/search-data.json new file mode 100644 index 0000000..49cbc9d --- /dev/null +++ b/assets/js/search-data.json @@ -0,0 +1,12 @@ +--- +--- +{ + {% for page in site.html_pages %}{% if page.search_exclude != true %}"{{ forloop.index0 }}": { + "id": "{{ forloop.index0 }}", + "title": "{{ page.title | replace: '&', '&' }}", + "content": "{{ page.content | markdownify | strip_html | escape_once | remove: 'Table of contents' | remove: '```' | remove: '---' | replace: '\', ' ' | normalize_whitespace }}", + "url": "{{ page.url | absolute_url }}", + "relUrl": "{{ page.url }}" + }{% unless forloop.last %},{% endunless %} + {% endif %}{% endfor %} +} diff --git a/assets/js/vendor/lunr.min.js b/assets/js/vendor/lunr.min.js new file mode 100644 index 0000000..9960ccd --- /dev/null +++ b/assets/js/vendor/lunr.min.js @@ -0,0 +1,6 @@ +/** + * lunr - http://lunrjs.com - A bit like Solr, but much smaller and not as bright - 1.0.0 + * Copyright (C) 2017 Oliver Nightingale + * @license MIT + */ +!function(){var t=function(e){var n=new t.Index;return n.pipeline.add(t.trimmer,t.stopWordFilter,t.stemmer),e&&e.call(n,n),n};t.version="1.0.0",t.utils={},t.utils.warn=function(t){return function(e){t.console&&console.warn&&console.warn(e)}}(this),t.utils.asString=function(t){return void 0===t||null===t?"":t.toString()},t.EventEmitter=function(){this.events={}},t.EventEmitter.prototype.addListener=function(){var t=Array.prototype.slice.call(arguments),e=t.pop(),n=t;if("function"!=typeof e)throw new TypeError("last argument must be a function");n.forEach(function(t){this.hasHandler(t)||(this.events[t]=[]),this.events[t].push(e)},this)},t.EventEmitter.prototype.removeListener=function(t,e){if(this.hasHandler(t)){var n=this.events[t].indexOf(e);this.events[t].splice(n,1),this.events[t].length||delete this.events[t]}},t.EventEmitter.prototype.emit=function(t){if(this.hasHandler(t)){var e=Array.prototype.slice.call(arguments,1);this.events[t].forEach(function(t){t.apply(void 0,e)})}},t.EventEmitter.prototype.hasHandler=function(t){return t in this.events},t.tokenizer=function(e){return arguments.length&&null!=e&&void 0!=e?Array.isArray(e)?e.map(function(e){return t.utils.asString(e).toLowerCase()}):e.toString().trim().toLowerCase().split(t.tokenizer.separator):[]},t.tokenizer.separator=/[\s\-]+/,t.tokenizer.load=function(t){var e=this.registeredFunctions[t];if(!e)throw new Error("Cannot load un-registered function: "+t);return e},t.tokenizer.label="default",t.tokenizer.registeredFunctions={"default":t.tokenizer},t.tokenizer.registerFunction=function(e,n){n in this.registeredFunctions&&t.utils.warn("Overwriting existing tokenizer: "+n),e.label=n,this.registeredFunctions[n]=e},t.Pipeline=function(){this._stack=[]},t.Pipeline.registeredFunctions={},t.Pipeline.registerFunction=function(e,n){n in this.registeredFunctions&&t.utils.warn("Overwriting existing registered function: "+n),e.label=n,t.Pipeline.registeredFunctions[e.label]=e},t.Pipeline.warnIfFunctionNotRegistered=function(e){var n=e.label&&e.label in this.registeredFunctions;n||t.utils.warn("Function is not registered with pipeline. This may cause problems when serialising the index.\n",e)},t.Pipeline.load=function(e){var n=new t.Pipeline;return e.forEach(function(e){var i=t.Pipeline.registeredFunctions[e];if(!i)throw new Error("Cannot load un-registered function: "+e);n.add(i)}),n},t.Pipeline.prototype.add=function(){var e=Array.prototype.slice.call(arguments);e.forEach(function(e){t.Pipeline.warnIfFunctionNotRegistered(e),this._stack.push(e)},this)},t.Pipeline.prototype.after=function(e,n){t.Pipeline.warnIfFunctionNotRegistered(n);var i=this._stack.indexOf(e);if(-1==i)throw new Error("Cannot find existingFn");i+=1,this._stack.splice(i,0,n)},t.Pipeline.prototype.before=function(e,n){t.Pipeline.warnIfFunctionNotRegistered(n);var i=this._stack.indexOf(e);if(-1==i)throw new Error("Cannot find existingFn");this._stack.splice(i,0,n)},t.Pipeline.prototype.remove=function(t){var e=this._stack.indexOf(t);-1!=e&&this._stack.splice(e,1)},t.Pipeline.prototype.run=function(t){for(var e=[],n=t.length,i=this._stack.length,r=0;n>r;r++){for(var o=t[r],s=0;i>s&&(o=this._stack[s](o,r,t),void 0!==o&&""!==o);s++);void 0!==o&&""!==o&&e.push(o)}return e},t.Pipeline.prototype.reset=function(){this._stack=[]},t.Pipeline.prototype.toJSON=function(){return this._stack.map(function(e){return t.Pipeline.warnIfFunctionNotRegistered(e),e.label})},t.Vector=function(){this._magnitude=null,this.list=void 0,this.length=0},t.Vector.Node=function(t,e,n){this.idx=t,this.val=e,this.next=n},t.Vector.prototype.insert=function(e,n){this._magnitude=void 0;var i=this.list;if(!i)return this.list=new t.Vector.Node(e,n,i),this.length++;if(en.idx?n=n.next:(i+=e.val*n.val,e=e.next,n=n.next);return i},t.Vector.prototype.similarity=function(t){return this.dot(t)/(this.magnitude()*t.magnitude())},t.SortedSet=function(){this.length=0,this.elements=[]},t.SortedSet.load=function(t){var e=new this;return e.elements=t,e.length=t.length,e},t.SortedSet.prototype.add=function(){var t,e;for(t=0;t1;){if(o===t)return r;t>o&&(e=r),o>t&&(n=r),i=n-e,r=e+Math.floor(i/2),o=this.elements[r]}return o===t?r:-1},t.SortedSet.prototype.locationFor=function(t){for(var e=0,n=this.elements.length,i=n-e,r=e+Math.floor(i/2),o=this.elements[r];i>1;)t>o&&(e=r),o>t&&(n=r),i=n-e,r=e+Math.floor(i/2),o=this.elements[r];return o>t?r:t>o?r+1:void 0},t.SortedSet.prototype.intersect=function(e){for(var n=new t.SortedSet,i=0,r=0,o=this.length,s=e.length,a=this.elements,h=e.elements;;){if(i>o-1||r>s-1)break;a[i]!==h[r]?a[i]h[r]&&r++:(n.add(a[i]),i++,r++)}return n},t.SortedSet.prototype.clone=function(){var e=new t.SortedSet;return e.elements=this.toArray(),e.length=e.elements.length,e},t.SortedSet.prototype.union=function(t){var e,n,i;this.length>=t.length?(e=this,n=t):(e=t,n=this),i=e.clone();for(var r=0,o=n.toArray();rp;p++)c[p]===a&&d++;h+=d/f*l.boost}}this.tokenStore.add(a,{ref:o,tf:h})}n&&this.eventEmitter.emit("add",e,this)},t.Index.prototype.remove=function(t,e){var n=t[this._ref],e=void 0===e?!0:e;if(this.documentStore.has(n)){var i=this.documentStore.get(n);this.documentStore.remove(n),i.forEach(function(t){this.tokenStore.remove(t,n)},this),e&&this.eventEmitter.emit("remove",t,this)}},t.Index.prototype.update=function(t,e){var e=void 0===e?!0:e;this.remove(t,!1),this.add(t,!1),e&&this.eventEmitter.emit("update",t,this)},t.Index.prototype.idf=function(t){var e="@"+t;if(Object.prototype.hasOwnProperty.call(this._idfCache,e))return this._idfCache[e];var n=this.tokenStore.count(t),i=1;return n>0&&(i=1+Math.log(this.documentStore.length/n)),this._idfCache[e]=i},t.Index.prototype.search=function(e){var n=this.pipeline.run(this.tokenizerFn(e)),i=new t.Vector,r=[],o=this._fields.reduce(function(t,e){return t+e.boost},0),s=n.some(function(t){return this.tokenStore.has(t)},this);if(!s)return[];n.forEach(function(e,n,s){var a=1/s.length*this._fields.length*o,h=this,u=this.tokenStore.expand(e).reduce(function(n,r){var o=h.corpusTokens.indexOf(r),s=h.idf(r),u=1,l=new t.SortedSet;if(r!==e){var c=Math.max(3,r.length-e.length);u=1/Math.log(c)}o>-1&&i.insert(o,a*s*u);for(var f=h.tokenStore.get(r),d=Object.keys(f),p=d.length,v=0;p>v;v++)l.add(f[d[v]].ref);return n.union(l)},new t.SortedSet);r.push(u)},this);var a=r.reduce(function(t,e){return t.intersect(e)});return a.map(function(t){return{ref:t,score:i.similarity(this.documentVector(t))}},this).sort(function(t,e){return e.score-t.score})},t.Index.prototype.documentVector=function(e){for(var n=this.documentStore.get(e),i=n.length,r=new t.Vector,o=0;i>o;o++){var s=n.elements[o],a=this.tokenStore.get(s)[e].tf,h=this.idf(s);r.insert(this.corpusTokens.indexOf(s),a*h)}return r},t.Index.prototype.toJSON=function(){return{version:t.version,fields:this._fields,ref:this._ref,tokenizer:this.tokenizerFn.label,documentStore:this.documentStore.toJSON(),tokenStore:this.tokenStore.toJSON(),corpusTokens:this.corpusTokens.toJSON(),pipeline:this.pipeline.toJSON()}},t.Index.prototype.use=function(t){var e=Array.prototype.slice.call(arguments,1);e.unshift(this),t.apply(this,e)},t.Store=function(){this.store={},this.length=0},t.Store.load=function(e){var n=new this;return n.length=e.length,n.store=Object.keys(e.store).reduce(function(n,i){return n[i]=t.SortedSet.load(e.store[i]),n},{}),n},t.Store.prototype.set=function(t,e){this.has(t)||this.length++,this.store[t]=e},t.Store.prototype.get=function(t){return this.store[t]},t.Store.prototype.has=function(t){return t in this.store},t.Store.prototype.remove=function(t){this.has(t)&&(delete this.store[t],this.length--)},t.Store.prototype.toJSON=function(){return{store:this.store,length:this.length}},t.stemmer=function(){var t={ational:"ate",tional:"tion",enci:"ence",anci:"ance",izer:"ize",bli:"ble",alli:"al",entli:"ent",eli:"e",ousli:"ous",ization:"ize",ation:"ate",ator:"ate",alism:"al",iveness:"ive",fulness:"ful",ousness:"ous",aliti:"al",iviti:"ive",biliti:"ble",logi:"log"},e={icate:"ic",ative:"",alize:"al",iciti:"ic",ical:"ic",ful:"",ness:""},n="[^aeiou]",i="[aeiouy]",r=n+"[^aeiouy]*",o=i+"[aeiou]*",s="^("+r+")?"+o+r,a="^("+r+")?"+o+r+"("+o+")?$",h="^("+r+")?"+o+r+o+r,u="^("+r+")?"+i,l=new RegExp(s),c=new RegExp(h),f=new RegExp(a),d=new RegExp(u),p=/^(.+?)(ss|i)es$/,v=/^(.+?)([^s])s$/,g=/^(.+?)eed$/,m=/^(.+?)(ed|ing)$/,y=/.$/,S=/(at|bl|iz)$/,w=new RegExp("([^aeiouylsz])\\1$"),k=new RegExp("^"+r+i+"[^aeiouwxy]$"),x=/^(.+?[^aeiou])y$/,b=/^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/,E=/^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/,F=/^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/,_=/^(.+?)(s|t)(ion)$/,z=/^(.+?)e$/,O=/ll$/,P=new RegExp("^"+r+i+"[^aeiouwxy]$"),T=function(n){var i,r,o,s,a,h,u;if(n.length<3)return n;if(o=n.substr(0,1),"y"==o&&(n=o.toUpperCase()+n.substr(1)),s=p,a=v,s.test(n)?n=n.replace(s,"$1$2"):a.test(n)&&(n=n.replace(a,"$1$2")),s=g,a=m,s.test(n)){var T=s.exec(n);s=l,s.test(T[1])&&(s=y,n=n.replace(s,""))}else if(a.test(n)){var T=a.exec(n);i=T[1],a=d,a.test(i)&&(n=i,a=S,h=w,u=k,a.test(n)?n+="e":h.test(n)?(s=y,n=n.replace(s,"")):u.test(n)&&(n+="e"))}if(s=x,s.test(n)){var T=s.exec(n);i=T[1],n=i+"i"}if(s=b,s.test(n)){var T=s.exec(n);i=T[1],r=T[2],s=l,s.test(i)&&(n=i+t[r])}if(s=E,s.test(n)){var T=s.exec(n);i=T[1],r=T[2],s=l,s.test(i)&&(n=i+e[r])}if(s=F,a=_,s.test(n)){var T=s.exec(n);i=T[1],s=c,s.test(i)&&(n=i)}else if(a.test(n)){var T=a.exec(n);i=T[1]+T[2],a=c,a.test(i)&&(n=i)}if(s=z,s.test(n)){var T=s.exec(n);i=T[1],s=c,a=f,h=P,(s.test(i)||a.test(i)&&!h.test(i))&&(n=i)}return s=O,a=c,s.test(n)&&a.test(n)&&(s=y,n=n.replace(s,"")),"y"==o&&(n=o.toLowerCase()+n.substr(1)),n};return T}(),t.Pipeline.registerFunction(t.stemmer,"stemmer"),t.generateStopWordFilter=function(t){var e=t.reduce(function(t,e){return t[e]=e,t},{});return function(t){return t&&e[t]!==t?t:void 0}},t.stopWordFilter=t.generateStopWordFilter(["a","able","about","across","after","all","almost","also","am","among","an","and","any","are","as","at","be","because","been","but","by","can","cannot","could","dear","did","do","does","either","else","ever","every","for","from","get","got","had","has","have","he","her","hers","him","his","how","however","i","if","in","into","is","it","its","just","least","let","like","likely","may","me","might","most","must","my","neither","no","nor","not","of","off","often","on","only","or","other","our","own","rather","said","say","says","she","should","since","so","some","than","that","the","their","them","then","there","these","they","this","tis","to","too","twas","us","wants","was","we","were","what","when","where","which","while","who","whom","why","will","with","would","yet","you","your"]),t.Pipeline.registerFunction(t.stopWordFilter,"stopWordFilter"),t.trimmer=function(t){return t.replace(/^\W+/,"").replace(/\W+$/,"")},t.Pipeline.registerFunction(t.trimmer,"trimmer"),t.TokenStore=function(){this.root={docs:{}},this.length=0},t.TokenStore.load=function(t){var e=new this;return e.root=t.root,e.length=t.length,e},t.TokenStore.prototype.add=function(t,e,n){var n=n||this.root,i=t.charAt(0),r=t.slice(1);return i in n||(n[i]={docs:{}}),0===r.length?(n[i].docs[e.ref]=e,void(this.length+=1)):this.add(r,e,n[i])},t.TokenStore.prototype.has=function(t){if(!t)return!1;for(var e=this.root,n=0;n Where do I go from here? + +Now that you've learned a little about OCI, we suggest that you start with our introductory material. + +[Introduction]({{ site.baseurl }}introduction){: .btn .btn-primary .fs-5 .mb-4 .mb-md-0 .mr-2 } diff --git a/docs/contributing/contributing.md b/docs/contributing/contributing.md new file mode 100644 index 0000000..4f8dbf8 --- /dev/null +++ b/docs/contributing/contributing.md @@ -0,0 +1,99 @@ +--- +layout: default +title: Contributing +nav_order: 4 +has_children: true +permalink: /contributing +--- + +# Contributing +{: .no_toc } + +## Table of contents +{: .no_toc .text-delta } + +1. TOC +{:toc} + +--- + +# Open Containers Initiative Contributions + +Before you are ready to contribute, make sure that you understand: + + 1. What are the different OCI specifications, on an abstract level? + 2. What are applied usage examples of the specifications? + 3. How do I ask for help or clarification? + +You can have a gentle introduction to containers [here]({{ site.baseurl }}introduction/container-images/), and +read about the OCI types [here]({{ site.baseurl }}introduction/oci-types/). + +## Kinds of contribution? + +When you understand what a container is, and what the goals are behind each of the specifications +provided by OCI, you are then in the right mindset to contribute. Generally, you might fit into one of the following scenarios: + + 1. **Definition** You have a goal or need that is not addressed by a specification. + 2. **Documentation** An idea or concept is not explained enough for you to use it. + 3. **Feature Request** You have a new idea for an extension to a specification. + +To serve these various contribution use cases, we have an [issue tracker](https://www.github.com/vsoch/oci-contribution/issues) with templates to guide you through the contribution process. +Each contribution request, whether it be asking a question or a feature, will happen via +discussion on the issue board. The final decision for a request might result in the opening of new +issues on other [opencontainers](https://www.github.com/opencontainers) boards, per the +collaborative discussion and decision of those involved. + +We have provided several templates to help guide you in your question, issue, or feature request. [Open an issue](https://www.github.com/vsoch/oci-contribution/issues) to get started with the process. +Now let's walk through what interactions and discussions on the issue tracker might look like. + +## How do I Contribute? + +### 1. Develop an Idea + +You are on this page in first place, and reading about how to contribute, because you found a hole that isn't addressed by the specification, or have an idea for an extension to make it better. The first thing you should do is grab your computer, go to a comfortable working spot, and write. What is your use case or need? How did you try to use current software that implements OCI (and how did it fail?) Tell your problem like a story. It will be easier for experts and non-experts alike to follow your train of thought, and understand the issue you are trying to address. If you fail to capture their understanding off the bat you will have a very hard time getting support for change. + +### 2. Discussion + +Once you've written up your idea, post it to the [issue tracker](https://www.github.com/vsoch/oci-contribution/issues). You might also [post to the development list](https://groups.google.com/a/opencontainers.org/forum/#!forum/dev) to capture people's attention, and point them to your issue. Why would you want to use the issue tracker in combination with the list? The issue tracker will allow you to keep a clean record of progress. You can easily link to code you are working on, and the discussion. It's a central place for *all the things*. +The mailing list is important for reach and perspective. You can challenge others +that have different use cases for interaction with containers to give feedback on your idea. + +### 3. Support and Action + +Once discussion starts to die down, it's important to try and synthesize the content discussed into a concrete action. The maintainers will likely be doing this without thinking about it. For example: + + - *Documentation Action* if there is functionality you thought was missing and it actually existed? This calls for an improvement to the documentation. The maintainer can assign issues to developers to address your concern, and ask for your feedback. + - *Show Me Action*: The most likely result of you wanting a new thing will be a request for a dummy implementation. It doesn't need to be perfect, but you must *show* that your idea has feet, and solves the problem that you stated. + - *Feature Request Action* It could be that your idea was succinct and strong, and a new feature is called for development. This likely will result in one or more developers (including you!) coming up with a plan of action. This is less likely an option, because changes to the specifications tend to be more conservative. + +Generally, you will want to find support for your action, whether it be advice or actual help from others in the list. We do this step before detailed feedback in the case that your idea doesn't need furter investigation (already solved or being worked on, for example). What should never happen is anything that goes against the [code of conduct](https://github.com/opencontainers/org/blob/master/code-of-conduct.md). You should not be put down, ridiculed for your ideas, or otherwise have someone treat you poorly. + +### 4. Detailed Feedback + +After you've posted your idea to the list, I can almost guarantee you someone else will be interested or +excited to give you feedback. The list (or a Github issue) itself isn't really the place to hash out the details. +Your final post on the discussion might be to share a link to a more formal write up of your idea. You +probably already have it written into a document, and it makes sense +to share this writeup with others for feedback (Google Docs, GitHub markdown, etc.). How long should you +get feedback? This is up to you. Make sure to give others credit and thanks for their contribution. If it's +on GitHub, use an AUTHORS.md file. If it's a Google Doc, allow collaborators to write their name in a section, +if desired. It's important to stress that the idea is a group effort. At this point, since you have others' +attention, you might want to consider creating a working group to continue progress on your idea. +What is a working group? It can be a small email list, a group of contributors subscribed to a common +repository, or a slack channel. It's basically a way to communicate, and that way should be your preferred method(s). + +### 5. Implementation + +Great! You now have created the idea, posted to the list, and you are tracking progress on the GitHub issue tracker. Here is the fun (and challenging) part. You need to *show* that your idea has feet. This comes +down to a dummy implementation that, paired with your writeup, can tag team to convince others of your idea. +This step will likely require several iterations. When you present your work to the OCI maintainers again, you need to stress the following points: + + 1. Restate the problem, and what you couldn't previously do to lead to your idea + 2. Show them what is now improved, and possible, with your approach. + 3. Be transparent about limitations. Ask again for feedback and help to address them. + +### 6. Contribution to OCI + +Given a strong idea, a proof of concept, and support, the discussion might next move to +how the idea can be integrated with OCI, or it could serve as a tool to supplement it. +This final stage is the least established, and will vary depending on the proposal. diff --git a/docs/introduction/container-images.md b/docs/introduction/container-images.md new file mode 100644 index 0000000..3592929 --- /dev/null +++ b/docs/introduction/container-images.md @@ -0,0 +1,253 @@ +--- +layout: default +title: Container Images +nav_order: 2 +parent: Introduction +--- + +# Introduction to Containers + +A container is a portable encapsulation of an environment. It's a +way for you to package an entire operating system, libraries, and +dependencies in a package that you can move and run anywhere. +That is the quick and dirty definition, but today we are going +to delive a little more into what this actually means. + +{: .no_toc } + +## Table of contents +{: .no_toc .text-delta } + +1. TOC +{:toc} + +--- + +## Container Basics + +### What problems do containers solve? + + +#### Reproducibility +{: .no_toc } + +We have differences in environments, hardware, and even security, and this makes sharing of applications challenging, leading to the commonality of the phrase above. A *reproducible* workflow that uses containers helps us get around this problem, and (hopefully) reduce the frequency of uttering this phrase _But it ran on my computer!_ + +#### Portability +{: .no_toc } + +The ability to easily move a container from one machine to another is easily afforded by the fact that many container formats are variations on a compressed filesystem. If you wanted to share your entire computer, right now, you would have a hard time doing that. + +#### Development Environments +{: .no_toc } + +It used to be the case that to develop a simple model - view - control application with some application, database, and web server, you would need to install and run the components on your host. It would be very challenging to work on multiple projects at once. Containers are essential for developers because +they allow us to spin up an entire set of components for a specific development environment, and then bring it +down just as easily. + +#### Continuous Integration +{: .no_toc } + +The same is true for testing, You can easily test across operating systems without leaving a single host. + +#### Flexible +{: .no_toc } + +The technologies that we use must be flexible to change. The resources +that we invest in are ephemeral, and change is unavoidable. For a concrete example. let's say you are running +a complex (containerized) application on a cloud provider. The costs of the provider changes, and you need to do a quick switch! Since your application is containerized, you can easily change providers. You can +swap out a component and not run things when you don't need to. You aren't forced becoming locked into a cloud vendor. You are a free container whale! + +#### Isolation +{: .no_toc } + +While the level of isolation can vary based on the container technology, containers generally allow you +to isolate an application or component from your host. This is incredibly useful if you have packages +with conflicting dependencies that need to run on the same host. + +## Virtualization +{: .no_toc } + +You might be familiar with the idea of a [virtual machine](https://en.wikipedia.org/wiki/Virtual_machine) (VM), which was, for some of us, our first foray into virtualization. In a bucket: + + - A hypervisor is based on emulating hardware. + - When we emulate hardware, this is called virtualization. + +While the term "virtual machine" is used in different contexts and can spawn much disagreement about +its definition, for the time being let's abstractly talk about the differences between *containers* and +*hypervisors*. The biggest difference was already stated - **hypervisor emulation is based on emulating hardware**. With this kind of technology, we take a machine and it emulates virtual hardware, and then bring up +another operating system on top of that hardware. There is a nice slide to show [hypervisor based virutualization here](https://www.slideshare.net/Docker/introduction-to-docker-2017/18). + +Containers are about virtualizing the subsystems of the operating system itself. We take services that the operating system provides (networking, filesystem, etc.) and provide them in a way that is virtuaizable. This means that I can bring up different copies of an operating system on the same kernel. We are using features of the kernel. So you can think containers as building on the level of the kernel, and this is different from hypervisors that build one level down, and try to emulate the hardware. + + - Containers: have a **single** kernels running underneath them + - Hypervisors: have **multiple** kernels + +A cool result of this, given that you have a single kernel, is that if you fix or update that kernel, all the "guests" running off it also get patched. + +For memory, a hypervisor can only see pages. It doesn't know what each guest is doing. With a container, under a single kernel the single kernel can see all objects and usage inside each container to make resource decisions. For this reason the resource decisions are made much more efficient. + +### What is a virtual machine? + +Now we can tell you that a virtual machine runs on a hypervisor, and we have a hardware layer, an entire +entire operating system, and then libraries and applications on top of it. A VM is a very needy fellow: + + - Each VM requires CPU, storage, memory, and an entire operating system + - More VMs == more resources! + - Portability is not guaranteed + +The need to allocate more system resources makes them a lot fatter and less portable than containers. +For a ballpark comparison, a hypervisor image is typically gigabytes, and a container can be in the order of megabytes. You've probably heard people talk about containers and use terms like "lightweight" and "efficient." +I found a nice slide to show the differences [here](https://www.slideshare.net/Docker/introduction-to-docker-2017/22). + +### Linux Container API + +So if containers are so great, why did they only "become a thing" around 2014? +It's because the linux containers API is pretty compiicated. Containers in linux are controlled by +a Kernel API, and I found a good summary and diagram in the talk [here](https://www.youtube.com/watch?v=YsYzMPptB-k#t=18m10s) picture at 18 minutes, 10 seconds. There is quite some (people-based) history behind +the underlying API. Watch the same [talk a bit later](https://www.youtube.com/watch?v=YsYzMPptB-k#t=24m45s) for another useful picture. Generally, there are two components under discussion: + + - *cgroups*: controls resources within the kernel (io, cpu, devices, memory, network). There is something called a "freezer" that you put a bunch of processes into and put them to sleep without worrying about resources between them. + - *namespaces*: provide a pure isolation layer inside the kernel. Most of the time, resources only belong to a single one, for example: + - networking devices go in networking namespaces + - ipc namespace for messages between containers + - mount namespace for filesystem tree + - pid namespace - init in linux needs to be running as pid 1 it isolates the process tree between containers + - UTS namespace because each container needs a separate hostname, + - User namespace is important for "pretending to be root" without being root.) + +In early containers, you could break from a container and become root on the host. This is bad, very bad. +These core components are the same for all systems! They are unfortuntately very complex. + +A fun history fact (and maybe you already figured this about because you watched the video links above!). These two things (cgroups and namespaces) were developed by different open source groups. This came from an agreement at a conference in 2011 called the [Kernel Summit](https://lwn.net/Articles/KernelSummit2011/), literally a bunch of people sitting in a room that had both developed technologies they wanted added to the linux kernel, and had to go through component by component and argue their case for their thing. At the end we did get a single cohesive thing, but it had these very two different cgroups and namespaces. + +For the applied amount us, the definitions of "namespaces" and "cgroups" is not satisfactory. +I don't get it, show me! For a typical Linux OS (the example shown below is Ubuntu 16.04), +these ideas map to folders on your computer, and +the APIs generally work to create and modify content here, and dictate rules (permissions) +for interactions. + +**Where are the namespaces?** + +Here are the namespaces: + +``` +$ ls -l /proc/self/ns/ +total 0 +lrwxrwxrwx 1 vanessa vanessa 0 Sep 11 12:42 cgroup -> cgroup:[4026531835] +lrwxrwxrwx 1 vanessa vanessa 0 Sep 11 12:42 ipc -> ipc:[4026531839] +lrwxrwxrwx 1 vanessa vanessa 0 Sep 11 12:42 mnt -> mnt:[4026531840] +lrwxrwxrwx 1 vanessa vanessa 0 Sep 11 12:42 net -> net:[4026532009] +lrwxrwxrwx 1 vanessa vanessa 0 Sep 11 12:42 pid -> pid:[4026531836] +lrwxrwxrwx 1 vanessa vanessa 0 Sep 11 12:42 pid_for_children -> pid:[4026531836] +lrwxrwxrwx 1 vanessa vanessa 0 Sep 11 12:42 user -> user:[4026531837] +lrwxrwxrwx 1 vanessa vanessa 0 Sep 11 12:42 uts -> uts:[4026531838] +``` + +**Where are the cgroups?** + +Here! Each cgroup is separately mountable. + +```bash +ls -l /sys/fs/cgroup +total 0 +dr-xr-xr-x 6 root root 0 Aug 29 15:00 blkio +lrwxrwxrwx 1 root root 11 Aug 29 15:00 cpu -> cpu,cpuacct +lrwxrwxrwx 1 root root 11 Aug 29 15:00 cpuacct -> cpu,cpuacct +dr-xr-xr-x 6 root root 0 Aug 29 15:00 cpu,cpuacct +dr-xr-xr-x 3 root root 0 Aug 29 15:00 cpuset +dr-xr-xr-x 6 root root 0 Aug 29 15:00 devices +dr-xr-xr-x 3 root root 0 Aug 29 15:00 freezer +dr-xr-xr-x 3 root root 0 Aug 29 15:00 hugetlb +dr-xr-xr-x 6 root root 0 Aug 29 15:00 memory +lrwxrwxrwx 1 root root 16 Aug 29 15:00 net_cls -> net_cls,net_prio +dr-xr-xr-x 3 root root 0 Aug 29 15:00 net_cls,net_prio +lrwxrwxrwx 1 root root 16 Aug 29 15:00 net_prio -> net_cls,net_prio +dr-xr-xr-x 3 root root 0 Aug 29 15:00 perf_event +dr-xr-xr-x 6 root root 0 Aug 29 15:00 pids +dr-xr-xr-x 2 root root 0 Aug 29 15:00 rdma +dr-xr-xr-x 6 root root 0 Aug 29 15:00 systemd +``` + +Each of these is a folder, and the simplest one is "freezer." The way we control cgroups is via file system calls. +So, to make a cgroup called "test" I create a directory called test. +To move a process as a task into a cgroup, I can echo it there. + +## Containers + +Everything that claims to be a container technology is basically orchestrating +this cgroup and namespace system. You can draw boxes on your powerpoint, call containers +"packages" or "encapsulated environments" or what not - a container technology is just +some software to stick it's boogery fingers into these system APIs. Containers: + + - are encapsulations of an environment + - have their own process namespace + - the main container on the host is still associated with one process, and when you start that process the set within the container might kick off, and when you kill it the container's processes are also killed. + + +### Container Namespaces + +Akin to the namespaces on your host, a container also has its own namespace? +Here it is helpful to think of a container like a little packaged +environment, one that you can actually shell into like you would a server. When I shell +inside the container I find that it has its own little process namespace. + +### Container Cgroups + +A cgroup is a "control group" and it's exactly that - a feature of the kernel +that lets you allocate permissions for resources. So, for example, I might allocate +a particular amount of memory, or CPU time, or network bandwidth to a set of tasks, +these processes (point to processes) that are running on my computer. What else can we +do? We can monitor them, reconfigure them, and even deny them access to resources. +So these containers also have their own set of cgroups. + +## What about a container image? + +The words "container" and "image" are sometimes used synonymously, but are subtly two +different things. The image is a binary sitting on your filesystem of actual stuff in +some frozen state. In docker you start from a bunch of compressed archives put together, +and some other container formats have specialized compressed filesystems as images. +A really good metaphor I like to use is that the image is the filesystem / binary that +you might have sitting somewhere, and the container is the instance of that binary. Just +like a class has instances of it, an image has instances, and we call them containers. + + +## Example Interactions + +Let's give a concrete example of how you might use a container. Let's say you are a +scientist, and a life changing paper just came out that describes how to estimate +an optimal cheese eating time based on measured properties of the cheese. You've been +collecting cheeses for decades, you can easily collect the metrics needed, and you just +need the software. + +### 1. You find container images in a registry +{: .no-toc } + +Thankfully, the publishes also released a container in a registry (such as [Docker Hub](https://hub.docker.com/)) +and you can: + + 1. Install the Docker daemon to interact with Docker containers + 2. Pull the container to your local machine + 3. Run the container with your input parameters + +That would it, and truly that easy! + +### 2. You want to change the cheese algorithm +{: .no-toc } + +Uhoh, the scientist calculated the relationship between the moisture content of cheese +completely wrong, and you need to modify his code and then write your own paper to refute his +claims. Dry cheese like cheddar deserves just as high of a rating! In this case, you would: + + 1. Install the Docker daemon to interact with Docker containers + 2. Find the container recipe (build specification), a Dockerfile, and modify his code + 3. Build and run your new container + +And you could equally publish your container and findings. This is a good example +of how containers support reproducible science. + +Resources: + + - [VMWare: Ben Corrie Sr. Staff Engineer](https://www.vmware.com/solutions/cloud-native-apps.html) + - [RedHat: Control Groups](https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/6/html/resource_management_guide/ch01) + - [Beginners Guide to Containers Technology](https://www.youtube.com/watch?v=YsYzMPptB-k) diff --git a/docs/introduction/digests.md b/docs/introduction/digests.md new file mode 100644 index 0000000..3eec11c --- /dev/null +++ b/docs/introduction/digests.md @@ -0,0 +1,71 @@ +--- +layout: default +title: Content Addressability +nav_order: 4 +parent: Introduction +--- + +# Content Addressability + +Content addressability is important so that you can ask for what you want. When you +are asking for (pulling) a container from a registry, the registry (if it's not +a crappy one) should provide [content addressable storage](https://en.wikipedia.org/wiki/Content-addressable_storage) to ensure that you get *exactly* what you are requesting. + +## Unique Resource Identifiers + +How do we ask for containers? We ask for a unique resource identifier (uri) which +broadly comes in this form: + +``` +//:@ +``` + +The example above is given in a familiar format for many users - one where we have a server +(the registry) with some higher level project or organization (project), and under this +project some set of container names that have different versions (tags and digets). Some +might clump the entire first address into a general tag, the "namespace": + +``` +:@ +``` + +For our purposes, let's use language to describe a concrete example of a repository on Docker Hub (the registry): + +``` +//:@ +``` + + - *registry*: is usually a server running software with an API to interact with to pull images. Docker Hub is our registry in this example. + - *organization*: is part of the namespace, and is the (more humanly interpretable) portion of the address. + - *repository* is the specific container. On Docker Hub this might come from a user pushing containers directly, or an automated build from a connected webhook. + +Let's make this example more specific. Here [is the busybox](https://hub.docker.com/_/busybox) +container on Docker Hub. I want to pull it! I might be tempted to do this: + +```bash +$ Using default tag: latest +latest: Pulling from library/busybox +697743189b6d: Pull complete +Digest: sha256:061ca9704a714ee3e8b80523ec720c64f6209ad3f97c0ff7cb9ec7d19f15149f +Status: Downloaded newer image for busybox:latest +``` + +That's great, and I ultimately get a specific tag (the default is "latest" and the +digest of my container is shown) but if I wanted to pull the container again, and I did +it in the same fashion? Well, take a look at the changes to "latest" (it was updated +recently) and [you'll see](https://hub.docker.com/_/busybox?tab=tags) that I'd likely get a different container. + +A (slightly) better interaction might have been asking for a particular tag: + +```bash +$ docker pull busybox:1.30.1 +1.30.1: Pulling from library/busybox +Digest: sha256:061ca9704a714ee3e8b80523ec720c64f6209ad3f97c0ff7cb9ec7d19f15149f +Status: Downloaded newer image for busybox:1.30.1 +``` + +But really, the best idea is to pull based on the exact address, or digest. + +```bash +$ docker pull busybox@sha256:061ca9704a714ee3e8b80523ec720c64f6209ad3f97c0ff7cb9ec7d19f15149f +``` diff --git a/docs/introduction/distribution.md b/docs/introduction/distribution.md new file mode 100644 index 0000000..320a2fe --- /dev/null +++ b/docs/introduction/distribution.md @@ -0,0 +1,34 @@ +--- +layout: default +title: Distributing Container Images +nav_order: 5 +parent: Introduction +--- + +# Distributing Container Images +{:.no_toc} + +## Table of contents +{: .no_toc .text-delta } + +1. TOC +{:toc} + +--- + +[Distribution](https://www.merriam-webster.com/dictionary/distribution): + +> _the action of sharing something out among a number of recipients. + +Distribution, or sharing of container images, is just as important as building +them in the first place. If you can't easily distribute your container, we lose +a [lot of the benefits]({{ site.baseurl }}docs/introduction/container-images/#what-problems-do-containers-solve) we outlined in the first place. + +Generally, you can think of distribution as having different components. I should be able to easily: + + - *share*: the container images that I create, across hosts, institutions, and time zones. + - *search*: I should be able to find the container that I'm looking for. + - *obtain*: If I find a container, and given I have permission to do so, I should be able to get it + - *verify*: that the container I requested is the one that I wanted, and not some malicious entity. + +Generally, a distribution comes down to a strategy that includes software, servers, and databases to fulfill these goals. The [distribution specification](https://github.com/opencontainers/distribution-spec/blob/master/spec.md) helps to outline a lot of the interactions to make this possible. diff --git a/docs/introduction/introduction.md b/docs/introduction/introduction.md new file mode 100644 index 0000000..77c1818 --- /dev/null +++ b/docs/introduction/introduction.md @@ -0,0 +1,59 @@ +--- +layout: default +title: Introduction +nav_order: 3 +has_children: true +permalink: /introduction +--- + +# Introduction +{: .no_toc } + +## Table of contents +{: .no_toc .text-delta } + +1. TOC +{:toc} + +--- + +If you are looking for a gentle introduction to containers and the Open Containers +Initiative, you've come to the right place! + +## Containers + +A container is generally an encapsulated environment that is created from one or more binaries (images) to provide some form of isolation. Read more about [containers here]({{ site.baseurl }}docs/introduction/container-images/) + +## What is OCI? + +OCI stands for the "Open Containers Initiative" and encompasses a group of people and a set of +specifications for describing container formats and interactions. For more information about +OCI, see [About Open Containers]({{ site.baseurl }}about/). + +## OCI Specification Types + +What is a runtime? A container image? A distribution? These are different *types* that each +come with specifications for how a container is built, or interacted with. To give you a +good understanding of OCI Types, let's talk about the goals of [OCI types]({{ site.baseurl }}docs/introduction/oci-types/). When you understand +the goals of each one, this puts you in a position to understand how they are used, why they are used, +and how you can contribute. + +## Content Addressability + +How does somebody find your house to mail a letter? They have an address, or a unique +identifier for the location of your house. Containers are no different - we can calculate +hashes of their content called _digests_ and then use these addresses as unique identifiers +to reference the containers. Read more about [Content Addressability]({{ site.baseurl }}docs/introduction/digests/) here. + +## Distributing Container Images + +Let's say I have a container on my host. How do I get it to you? How can you be sure +that your containers are safe if your laptop crashes? The task of distributing containers +offers an entire new space of challenges. Read about +[distributing container images here]({{ site.baseurl }}docs/introduction/distribution/) + + +You made it to the bottom! Now that have an understanding of containers and the specifications, you should +next read about how to contribute. + +[Contributing]({{ site.baseurl }}contributing){: .btn .btn-primary .fs-5 .mb-4 .mb-md-0 .mr-2 } diff --git a/docs/introduction/oci-types.md b/docs/introduction/oci-types.md new file mode 100644 index 0000000..7b940fa --- /dev/null +++ b/docs/introduction/oci-types.md @@ -0,0 +1,149 @@ +--- +layout: default +title: OCI Types +nav_order: 3 +parent: Introduction +--- + +# Specification Types +{:.no_toc} + +1. TOC +{:toc} + +--- + +## Understanding How Specifications Meet Goals + +The core of OCI are the specifications for container images, registries (called "distributions") +and runtime. Let's step back and talk about what this actually means. If you are a developer, as +we discuss these specifications, think about them in the context of answering these questions: + + - How would I want to use this to solve a particular problem? + - Where might I have seen this in the wild, and not realized it's a part of OCI? + +Specific examples will be given to help guide your thinking. + +### The Image Specification + +The [image specification](https://github.com/opencontainers/image-spec/blob/master/spec.md) generally is a grouping of things to describe a container image. While there is a definition for a [filesystem](https://github.com/opencontainers/image-spec/blob/master/layer.md) and [configuration](https://github.com/opencontainers/image-spec/blob/master/config.md), the most general entity to describe is the image manifest: + +#### Manifest + +The [manifest](https://github.com/opencontainers/image-spec/blob/master/manifest.md) comes down to a json blob of properties for the container such as contents (in Docker, we refer to image layers since the image is a bunch of .tar.gz assembled at runtime), annotations, and a unique identifier for a configuration object. For example, here is a json dump that describes a Docker container: + +``` +{ + "schemaVersion": 2, + "config": { + "mediaType": "application/vnd.oci.image.config.v1+json", + "size": 7023, + "digest": "sha256:b5b2b2c507a0944348e0303114d8d93aaaa081732b86451d9bce1f432a537bc7" + }, + "layers": [ + { + "mediaType": "application/vnd.oci.image.layer.v1.tar+gzip", + "size": 32654, + "digest": "sha256:9834876dcfb05cb167a5c24953eba58c4ac89b1adf57f28f2f9d09af107ee8f0" + }, + { + "mediaType": "application/vnd.oci.image.layer.v1.tar+gzip", + "size": 16724, + "digest": "sha256:3c3a4604a545cdc127456d94e421cd355bca5b528f4a9c1905b15da2eb4a4c6b" + }, + { + "mediaType": "application/vnd.oci.image.layer.v1.tar+gzip", + "size": 73109, + "digest": "sha256:ec4b8955958665577945c89419d1af06b5f7636b4ac3da7f12184802ad867736" + } + ], + "annotations": { + "com.example.key1": "value1", + "com.example.key2": "value2" + } +} +``` + +**Where would I find an image manifest?** + +An image manifest would be served by a registry, and would help the user to obtain the content (in the example above, the .tar.gz layers assembled at runtime to create the image). + +**What would I do with the image manifest?** + +The manifest helps you to download image layers. I might query the registry API to find the image manifest for an image I'm interested in, get back this json blob, and then use the client to pull the image layers (the digests). Depending on the design of the registry, there would be another endpoint that I know to query with the blob digests to actually download them. + +**What are the annotations for?** + +Annotations are key value pairs of metadata to describe the image of interest. They are fairly flexible to allow for the registry and user to use as they see fit. + +**How would I want to use this to solve a particular problem?** + +The image manifest definition should be able to describe some kind of content blobs for an +application like a registry. + +**Where might I have seen this in the wild?** + +An image manifest is what you see delivered by the [Docker registry]() to get metadata +for a particular [container tag](https://docs.docker.com/engine/reference/commandline/manifest/). + + +### The Distribution Specification + +The [distribution specification](https://github.com/opencontainers/distribution-spec/blob/master/spec.md) +describes the API that might be used by a registry to distribute images. This means actions like pull, push, along with how images are named, and errors are presented. You can think of the distribution specification +as a collection of endpoints served by a registry to communicate with. Do you want a manifest? Use +the manifest endpoint: + +``` +GET /v2//manifests/ +``` + +Do you want to upload a blob? There is an endpoint to POST to for that: + +``` +POST /v2//blobs/uploads/ +``` + +**Where would I find a distribution specification?** + +An implementation of this specification would be found with a container registry that +implements the OCI standard. For example, Docker Hub implements the specification. A +developer could also roll their own registry (such as [this one](https://github.com/atlaskerr/stori)) +that implements it. + +**What would I do with the distribution specification?** + +The specification outlines a method of interaction. If you are writing a client, for example, these +are the endpoints that the client would use. If you are creating a new registry that you wanted +to conform to OCI, these are the API endpoints you would implement. + +**How might I contribute to the distribution specification?** + +Generally, since the goals are to move (push and pull) images, and provide endpoints for a client, +if you are designing a registry or a client and find that you are missing some key function of an +endpoint, or information provided by an endpoint, you might want to suggest a change to the specification. + +### The Runtime Specification + +The [runtime specification](https://github.com/opencontainers/runtime-spec/blob/master/spec.md) is another +description of an interaction, but this time it's with a container binary. Specifically, this means +the execution environment, configuration, and lifecycle of a container. + +**What do you mean by execution environment?** + +What is the host operating system of your computer, Windows? Linux? These are different execution environments that come with different rules and standards for generating (what feels like) the same running container. If you look at the [runtime specification](https://github.com/opencontainers/runtime-spec/blob/master/spec.md) entry page, you'll actually find that there is a different specification file for each base operating system. + +**Why do we need runtime specifications?** + +As a user, you expect a container run on a Windows machine to generally feel like and act the same +as a container run on a Linux host. The runtime specifications are catered toward this goal, with different +configuration files (called config.json) to drive the creation, execution enviroinment, and actions +for the container. + +**How might I contribute?** + +You might have an entirely different operating system or technology that you want to explore running containers on, in which case you would want to contribute a new specification. You might find that there is an ambiguity or bug for one runtime, and ask a question about how to work on it. + +What are you waiting for? We want to hear from you! + +[Contribute]({{ site.baseurl }}docs/contribute/){: .btn .btn-primary .fs-5 .mb-4 .mb-md-0 .mr-2 } diff --git a/index.md b/index.md new file mode 100644 index 0000000..fed3df5 --- /dev/null +++ b/index.md @@ -0,0 +1,30 @@ +--- +layout: default +title: Open Containers +nav_order: 1 +permalink: / +--- + +# The Open Container Initiative + +Welcome to the Open Containers Initiative documentation site! The Open Container +Initiative cares about open, industry standards for container technology. +Broadly, technology encompasses two prominent ideas: + + - *formats*: What exactly *is* a container? + - *interaction*: How do we run, create, pull, or otherwise interact with a container? + +## What will I find here? + +This is a collection of introductory material to help you to understand containers, +the specifications that were created to support them, and finally, how +you can contribute to OCI. + + - [About Open Containers]({{ site.baseurl }}about) + - [Introductory Material]({{ site.baseurl }}introduction) + - [Contributing]({{ site.baseurl }}contributing) + + +{: .fs-6 .fw-300 } + +--- From 11a9430648fb3d32b92f5aefcb367650aa38a63a Mon Sep 17 00:00:00 2001 From: Vanessa Sochat Date: Mon, 25 Feb 2019 15:14:30 -0500 Subject: [PATCH 2/6] fixing up typos and other small errors Signed-off-by: Vanessa Sochat --- docs/about.md | 2 +- docs/contributing/contributing.md | 4 ++-- docs/introduction/distribution.md | 6 +++--- docs/introduction/introduction.md | 2 +- docs/introduction/oci-types.md | 2 +- index.md | 4 ++-- 6 files changed, 10 insertions(+), 10 deletions(-) diff --git a/docs/about.md b/docs/about.md index 4a5a3eb..7974b24 100644 --- a/docs/about.md +++ b/docs/about.md @@ -7,7 +7,7 @@ nav_order: 2 ## About OCI -The Open Containers initiative was established in June 2015 by +The Open Containers Initiative was established in June 2015 by [Docker](https://en.wikipedia.org/wiki/Docker_(software)), one of the many early leaders of the container industry that provided an intuitive API to interact with [linux containers](https://en.wikipedia.org/wiki/Container_(virtualization)). diff --git a/docs/contributing/contributing.md b/docs/contributing/contributing.md index 4f8dbf8..7f56eb0 100644 --- a/docs/contributing/contributing.md +++ b/docs/contributing/contributing.md @@ -66,12 +66,12 @@ Once discussion starts to die down, it's important to try and synthesize the con - *Show Me Action*: The most likely result of you wanting a new thing will be a request for a dummy implementation. It doesn't need to be perfect, but you must *show* that your idea has feet, and solves the problem that you stated. - *Feature Request Action* It could be that your idea was succinct and strong, and a new feature is called for development. This likely will result in one or more developers (including you!) coming up with a plan of action. This is less likely an option, because changes to the specifications tend to be more conservative. -Generally, you will want to find support for your action, whether it be advice or actual help from others in the list. We do this step before detailed feedback in the case that your idea doesn't need furter investigation (already solved or being worked on, for example). What should never happen is anything that goes against the [code of conduct](https://github.com/opencontainers/org/blob/master/code-of-conduct.md). You should not be put down, ridiculed for your ideas, or otherwise have someone treat you poorly. +Generally, you will want to find support for your action, whether it be advice or actual help from others in the list. We do this step before detailed feedback in the case that your idea doesn't need further investigation (already solved or being worked on, for example). What should never happen is anything that goes against the [code of conduct](https://github.com/opencontainers/org/blob/master/code-of-conduct.md). You should not be put down, ridiculed for your ideas, or otherwise have someone treat you poorly. ### 4. Detailed Feedback After you've posted your idea to the list, I can almost guarantee you someone else will be interested or -excited to give you feedback. The list (or a Github issue) itself isn't really the place to hash out the details. +excited to give you feedback. The list (or a GitHub issue) itself isn't really the place to hash out the details. Your final post on the discussion might be to share a link to a more formal write up of your idea. You probably already have it written into a document, and it makes sense to share this writeup with others for feedback (Google Docs, GitHub markdown, etc.). How long should you diff --git a/docs/introduction/distribution.md b/docs/introduction/distribution.md index 320a2fe..42435d0 100644 --- a/docs/introduction/distribution.md +++ b/docs/introduction/distribution.md @@ -18,11 +18,11 @@ parent: Introduction [Distribution](https://www.merriam-webster.com/dictionary/distribution): -> _the action of sharing something out among a number of recipients. +> _the action of sharing something out among a number of recipients._ Distribution, or sharing of container images, is just as important as building -them in the first place. If you can't easily distribute your container, we lose -a [lot of the benefits]({{ site.baseurl }}docs/introduction/container-images/#what-problems-do-containers-solve) we outlined in the first place. +them in the first place. If you can't easily distribute your container, you lose +a [lot of the benefits]({{ site.baseurl }}docs/introduction/container-images/#what-problems-do-containers-solve) that we outlined in the first place. Generally, you can think of distribution as having different components. I should be able to easily: diff --git a/docs/introduction/introduction.md b/docs/introduction/introduction.md index 77c1818..5d136fb 100644 --- a/docs/introduction/introduction.md +++ b/docs/introduction/introduction.md @@ -22,7 +22,7 @@ Initiative, you've come to the right place! ## Containers -A container is generally an encapsulated environment that is created from one or more binaries (images) to provide some form of isolation. Read more about [containers here]({{ site.baseurl }}docs/introduction/container-images/) +A container is generally an encapsulated environment that is created from one or more binaries (images) to provide some form of isolation. Read more about [containers here]({{ site.baseurl }}docs/introduction/container-images/). ## What is OCI? diff --git a/docs/introduction/oci-types.md b/docs/introduction/oci-types.md index 7b940fa..30b01be 100644 --- a/docs/introduction/oci-types.md +++ b/docs/introduction/oci-types.md @@ -15,7 +15,7 @@ parent: Introduction ## Understanding How Specifications Meet Goals -The core of OCI are the specifications for container images, registries (called "distributions") +The core of OCI are the specifications for container images, registries (for the distribution of containers) and runtime. Let's step back and talk about what this actually means. If you are a developer, as we discuss these specifications, think about them in the context of answering these questions: diff --git a/index.md b/index.md index fed3df5..5752378 100644 --- a/index.md +++ b/index.md @@ -7,7 +7,7 @@ permalink: / # The Open Container Initiative -Welcome to the Open Containers Initiative documentation site! The Open Container +Welcome to the Open Container Initiative (OCI) documentation site! The Open Container Initiative cares about open, industry standards for container technology. Broadly, technology encompasses two prominent ideas: @@ -20,7 +20,7 @@ This is a collection of introductory material to help you to understand containe the specifications that were created to support them, and finally, how you can contribute to OCI. - - [About Open Containers]({{ site.baseurl }}about) + - [About the Open Container Initiative]({{ site.baseurl }}about) - [Introductory Material]({{ site.baseurl }}introduction) - [Contributing]({{ site.baseurl }}contributing) From 60a6abe08c00ffe10c22c87cbf3a82bb021f2236 Mon Sep 17 00:00:00 2001 From: Vanessa Sochat Date: Mon, 25 Feb 2019 16:59:14 -0500 Subject: [PATCH 3/6] Open Containers -> Open Container Signed-off-by: Vanessa Sochat --- README.md | 2 +- docs/about.md | 2 +- docs/contributing/contributing.md | 2 +- docs/introduction/introduction.md | 6 +++--- index.md | 2 +- 5 files changed, 7 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 860083e..c288de6 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # org -Centralized documents and information for the Open Containers Initiative (OCI) organization and projects. +Centralized documents and information for the Open Container Initiative (OCI) organization and projects. ## Charter diff --git a/docs/about.md b/docs/about.md index 7974b24..9672c57 100644 --- a/docs/about.md +++ b/docs/about.md @@ -7,7 +7,7 @@ nav_order: 2 ## About OCI -The Open Containers Initiative was established in June 2015 by +The Open Container Initiative was established in June 2015 by [Docker](https://en.wikipedia.org/wiki/Docker_(software)), one of the many early leaders of the container industry that provided an intuitive API to interact with [linux containers](https://en.wikipedia.org/wiki/Container_(virtualization)). diff --git a/docs/contributing/contributing.md b/docs/contributing/contributing.md index 7f56eb0..12e1b95 100644 --- a/docs/contributing/contributing.md +++ b/docs/contributing/contributing.md @@ -17,7 +17,7 @@ permalink: /contributing --- -# Open Containers Initiative Contributions +# Open Container Initiative Contributions Before you are ready to contribute, make sure that you understand: diff --git a/docs/introduction/introduction.md b/docs/introduction/introduction.md index 5d136fb..e5bda4c 100644 --- a/docs/introduction/introduction.md +++ b/docs/introduction/introduction.md @@ -17,7 +17,7 @@ permalink: /introduction --- -If you are looking for a gentle introduction to containers and the Open Containers +If you are looking for a gentle introduction to containers and the Open Container Initiative, you've come to the right place! ## Containers @@ -26,9 +26,9 @@ A container is generally an encapsulated environment that is created from one or ## What is OCI? -OCI stands for the "Open Containers Initiative" and encompasses a group of people and a set of +OCI stands for the "Open Container Initiative" and encompasses a group of people and a set of specifications for describing container formats and interactions. For more information about -OCI, see [About Open Containers]({{ site.baseurl }}about/). +OCI, see [About the Open Container Initiative]({{ site.baseurl }}about/). ## OCI Specification Types diff --git a/index.md b/index.md index 5752378..d2cf73d 100644 --- a/index.md +++ b/index.md @@ -1,6 +1,6 @@ --- layout: default -title: Open Containers +title: The Open Container Initiative nav_order: 1 permalink: / --- From 902d3c97e4b0718c5ab8374c3f67e982700032ad Mon Sep 17 00:00:00 2001 From: Vanessa Sochat Date: Tue, 26 Feb 2019 09:47:19 -0500 Subject: [PATCH 4/6] reorganizing security.md into folder, contributing into .github Signed-off-by: Vanessa Sochat --- code-of-conduct.md => .github/CODE_OF_CONDUCT.md | 0 README.md | 2 +- security.md => security/README.md | 0 3 files changed, 1 insertion(+), 1 deletion(-) rename code-of-conduct.md => .github/CODE_OF_CONDUCT.md (100%) rename security.md => security/README.md (100%) diff --git a/code-of-conduct.md b/.github/CODE_OF_CONDUCT.md similarity index 100% rename from code-of-conduct.md rename to .github/CODE_OF_CONDUCT.md diff --git a/README.md b/README.md index c288de6..e5ee30c 100644 --- a/README.md +++ b/README.md @@ -30,7 +30,7 @@ The [TOB](https://github.com/opencontainers/tob) is responsible for managing con ## Security -See [the security doc](./security.md) for reporting process and disclosure communications. +See [the security docs](./security/) for reporting process and disclosure communications. ## License diff --git a/security.md b/security/README.md similarity index 100% rename from security.md rename to security/README.md From 05916a47bebfa6263ce5e12702f050aac7e8c866 Mon Sep 17 00:00:00 2001 From: Vanessa Sochat Date: Tue, 26 Feb 2019 09:58:28 -0500 Subject: [PATCH 5/6] fixing up container images history page Signed-off-by: Vanessa Sochat --- docs/introduction/container-images.md | 31 ++++++++++++--------------- 1 file changed, 14 insertions(+), 17 deletions(-) diff --git a/docs/introduction/container-images.md b/docs/introduction/container-images.md index 3592929..03847b4 100644 --- a/docs/introduction/container-images.md +++ b/docs/introduction/container-images.md @@ -103,19 +103,19 @@ I found a nice slide to show the differences [here](https://www.slideshare.net/D ### Linux Container API So if containers are so great, why did they only "become a thing" around 2014? -It's because the linux containers API is pretty compiicated. Containers in linux are controlled by -a Kernel API, and I found a good summary and diagram in the talk [here](https://www.youtube.com/watch?v=YsYzMPptB-k#t=18m10s) picture at 18 minutes, 10 seconds. There is quite some (people-based) history behind -the underlying API. Watch the same [talk a bit later](https://www.youtube.com/watch?v=YsYzMPptB-k#t=24m45s) for another useful picture. Generally, there are two components under discussion: +The short answer is that Docker came along and gave us "mere mortals" an ecosystem for building, pushing, pulling and +running containers. This was the first API that simplified the complexity of underlying components: cgroups and namespaces. - *cgroups*: controls resources within the kernel (io, cpu, devices, memory, network). There is something called a "freezer" that you put a bunch of processes into and put them to sleep without worrying about resources between them. - *namespaces*: provide a pure isolation layer inside the kernel. Most of the time, resources only belong to a single one, for example: - - networking devices go in networking namespaces - - ipc namespace for messages between containers - - mount namespace for filesystem tree - - pid namespace - init in linux needs to be running as pid 1 it isolates the process tree between containers - - UTS namespace because each container needs a separate hostname, - - User namespace is important for "pretending to be root" without being root.) - + - networking devices go in networking namespaces + - ipc namespace for messages between containers + - mount namespace for filesystem tree + - pid namespace - init in linux needs to be running as pid 1 it isolates the process tree between containers + - UTS namespace because each container needs a separate hostname, + - User namespace is important for "pretending to be root" without being root.) + +For those interested, there is a good talk about the history of the API development [here](https://www.youtube.com/watch?v=YsYzMPptB-k#t=18m10s). In early containers, you could break from a container and become root on the host. This is bad, very bad. These core components are the same for all systems! They are unfortuntately very complex. @@ -204,13 +204,10 @@ So these containers also have their own set of cgroups. ## What about a container image? The words "container" and "image" are sometimes used synonymously, but are subtly two -different things. The image is a binary sitting on your filesystem of actual stuff in -some frozen state. In docker you start from a bunch of compressed archives put together, -and some other container formats have specialized compressed filesystems as images. -A really good metaphor I like to use is that the image is the filesystem / binary that -you might have sitting somewhere, and the container is the instance of that binary. Just -like a class has instances of it, an image has instances, and we call them containers. - +different things. You can think of a container image as a template, and a container +is one or more running instances of that template. In more concrete terms, the image +is some binary sitting on your filesystem that is ready to instantiate to create +an isolated, encapsulated environment. ## Example Interactions From 8a1fad9212ffa746dd7e57bd3b3f09610be8173a Mon Sep 17 00:00:00 2001 From: Vanessa Sochat Date: Tue, 26 Feb 2019 14:40:44 -0500 Subject: [PATCH 6/6] moving examples for namespaces and cgroups, adding link to runtime-spec repo Signed-off-by: Vanessa Sochat --- docs/introduction/container-images.md | 55 +-------------------------- 1 file changed, 2 insertions(+), 53 deletions(-) diff --git a/docs/introduction/container-images.md b/docs/introduction/container-images.md index 03847b4..5f691d4 100644 --- a/docs/introduction/container-images.md +++ b/docs/introduction/container-images.md @@ -119,59 +119,8 @@ For those interested, there is a good talk about the history of the API developm In early containers, you could break from a container and become root on the host. This is bad, very bad. These core components are the same for all systems! They are unfortuntately very complex. -A fun history fact (and maybe you already figured this about because you watched the video links above!). These two things (cgroups and namespaces) were developed by different open source groups. This came from an agreement at a conference in 2011 called the [Kernel Summit](https://lwn.net/Articles/KernelSummit2011/), literally a bunch of people sitting in a room that had both developed technologies they wanted added to the linux kernel, and had to go through component by component and argue their case for their thing. At the end we did get a single cohesive thing, but it had these very two different cgroups and namespaces. - -For the applied amount us, the definitions of "namespaces" and "cgroups" is not satisfactory. -I don't get it, show me! For a typical Linux OS (the example shown below is Ubuntu 16.04), -these ideas map to folders on your computer, and -the APIs generally work to create and modify content here, and dictate rules (permissions) -for interactions. - -**Where are the namespaces?** - -Here are the namespaces: - -``` -$ ls -l /proc/self/ns/ -total 0 -lrwxrwxrwx 1 vanessa vanessa 0 Sep 11 12:42 cgroup -> cgroup:[4026531835] -lrwxrwxrwx 1 vanessa vanessa 0 Sep 11 12:42 ipc -> ipc:[4026531839] -lrwxrwxrwx 1 vanessa vanessa 0 Sep 11 12:42 mnt -> mnt:[4026531840] -lrwxrwxrwx 1 vanessa vanessa 0 Sep 11 12:42 net -> net:[4026532009] -lrwxrwxrwx 1 vanessa vanessa 0 Sep 11 12:42 pid -> pid:[4026531836] -lrwxrwxrwx 1 vanessa vanessa 0 Sep 11 12:42 pid_for_children -> pid:[4026531836] -lrwxrwxrwx 1 vanessa vanessa 0 Sep 11 12:42 user -> user:[4026531837] -lrwxrwxrwx 1 vanessa vanessa 0 Sep 11 12:42 uts -> uts:[4026531838] -``` - -**Where are the cgroups?** - -Here! Each cgroup is separately mountable. - -```bash -ls -l /sys/fs/cgroup -total 0 -dr-xr-xr-x 6 root root 0 Aug 29 15:00 blkio -lrwxrwxrwx 1 root root 11 Aug 29 15:00 cpu -> cpu,cpuacct -lrwxrwxrwx 1 root root 11 Aug 29 15:00 cpuacct -> cpu,cpuacct -dr-xr-xr-x 6 root root 0 Aug 29 15:00 cpu,cpuacct -dr-xr-xr-x 3 root root 0 Aug 29 15:00 cpuset -dr-xr-xr-x 6 root root 0 Aug 29 15:00 devices -dr-xr-xr-x 3 root root 0 Aug 29 15:00 freezer -dr-xr-xr-x 3 root root 0 Aug 29 15:00 hugetlb -dr-xr-xr-x 6 root root 0 Aug 29 15:00 memory -lrwxrwxrwx 1 root root 16 Aug 29 15:00 net_cls -> net_cls,net_prio -dr-xr-xr-x 3 root root 0 Aug 29 15:00 net_cls,net_prio -lrwxrwxrwx 1 root root 16 Aug 29 15:00 net_prio -> net_cls,net_prio -dr-xr-xr-x 3 root root 0 Aug 29 15:00 perf_event -dr-xr-xr-x 6 root root 0 Aug 29 15:00 pids -dr-xr-xr-x 2 root root 0 Aug 29 15:00 rdma -dr-xr-xr-x 6 root root 0 Aug 29 15:00 systemd -``` - -Each of these is a folder, and the simplest one is "freezer." The way we control cgroups is via file system calls. -So, to make a cgroup called "test" I create a directory called test. -To move a process as a task into a cgroup, I can echo it there. +A fun history fact (and maybe you already figured this about because you watched the video links above!). These two things (cgroups and namespaces) were developed by different open source groups. This came from an agreement at a conference in 2011 called the [Kernel Summit](https://lwn.net/Articles/KernelSummit2011/), literally a bunch of people sitting in a room that had both developed technologies they wanted added to the linux kernel, and had to go through component by component and argue their case for their thing. At the end we did get a single cohesive thing, but it had these very two different cgroups and namespaces. If you are interested in learning about platform specific +runtime differences, see the [runtime-spec](https://github.com/opencontainers/runtime-spec/blob/master/implementations.md) repository. ## Containers