diff --git a/stable b/stable index edf6d96d..73a7527b 120000 --- a/stable +++ b/stable @@ -1 +1 @@ -v0.11.4 \ No newline at end of file +v0.11.5 \ No newline at end of file diff --git a/v0.11 b/v0.11 index edf6d96d..73a7527b 120000 --- a/v0.11 +++ b/v0.11 @@ -1 +1 @@ -v0.11.4 \ No newline at end of file +v0.11.5 \ No newline at end of file diff --git a/v0.11.5/.documenter-siteinfo.json b/v0.11.5/.documenter-siteinfo.json new file mode 100644 index 00000000..32bf8e23 --- /dev/null +++ b/v0.11.5/.documenter-siteinfo.json @@ -0,0 +1 @@ +{"documenter":{"julia_version":"1.10.0","generation_timestamp":"2024-02-02T23:11:32","documenter_version":"1.2.1"}} \ No newline at end of file diff --git a/v0.11.5/assets/documenter.js b/v0.11.5/assets/documenter.js new file mode 100644 index 00000000..f5311607 --- /dev/null +++ b/v0.11.5/assets/documenter.js @@ -0,0 +1,889 @@ +// Generated by Documenter.jl +requirejs.config({ + paths: { + 'highlight-julia': 'https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.8.0/languages/julia.min', + 'headroom': 'https://cdnjs.cloudflare.com/ajax/libs/headroom/0.12.0/headroom.min', + 'jqueryui': 'https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.13.2/jquery-ui.min', + 'minisearch': 'https://cdn.jsdelivr.net/npm/minisearch@6.1.0/dist/umd/index.min', + 'katex-auto-render': 'https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.16.8/contrib/auto-render.min', + 'jquery': 'https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.0/jquery.min', + 'headroom-jquery': 'https://cdnjs.cloudflare.com/ajax/libs/headroom/0.12.0/jQuery.headroom.min', + 'katex': 'https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.16.8/katex.min', + 'highlight': 'https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.8.0/highlight.min', + 'highlight-julia-repl': 'https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.8.0/languages/julia-repl.min', + }, + shim: { + "highlight-julia": { + "deps": [ + "highlight" + ] + }, + "katex-auto-render": { + "deps": [ + "katex" + ] + }, + "headroom-jquery": { + "deps": [ + "jquery", + "headroom" + ] + }, + "highlight-julia-repl": { + "deps": [ + "highlight" + ] + } +} +}); +//////////////////////////////////////////////////////////////////////////////// +require(['jquery', 'katex', 'katex-auto-render'], function($, katex, renderMathInElement) { +$(document).ready(function() { + renderMathInElement( + document.body, + { + "delimiters": [ + { + "left": "$", + "right": "$", + "display": false + }, + { + "left": "$$", + "right": "$$", + "display": true + }, + { + "left": "\\[", + "right": "\\]", + "display": true + } + ] +} + + ); +}) + +}) +//////////////////////////////////////////////////////////////////////////////// +require(['jquery', 'highlight', 'highlight-julia', 'highlight-julia-repl'], function($) { +$(document).ready(function() { + hljs.highlightAll(); +}) + +}) +//////////////////////////////////////////////////////////////////////////////// +require(['jquery'], function($) { + +let timer = 0; +var isExpanded = true; + +$(document).on("click", ".docstring header", function () { + let articleToggleTitle = "Expand docstring"; + + debounce(() => { + if ($(this).siblings("section").is(":visible")) { + $(this) + .find(".docstring-article-toggle-button") + .removeClass("fa-chevron-down") + .addClass("fa-chevron-right"); + } else { + $(this) + .find(".docstring-article-toggle-button") + .removeClass("fa-chevron-right") + .addClass("fa-chevron-down"); + + articleToggleTitle = "Collapse docstring"; + } + + $(this) + .find(".docstring-article-toggle-button") + .prop("title", articleToggleTitle); + $(this).siblings("section").slideToggle(); + }); +}); + +$(document).on("click", ".docs-article-toggle-button", function () { + let articleToggleTitle = "Expand docstring"; + let navArticleToggleTitle = "Expand all docstrings"; + + debounce(() => { + if (isExpanded) { + $(this).removeClass("fa-chevron-up").addClass("fa-chevron-down"); + $(".docstring-article-toggle-button") + .removeClass("fa-chevron-down") + .addClass("fa-chevron-right"); + + isExpanded = false; + + $(".docstring section").slideUp(); + } else { + $(this).removeClass("fa-chevron-down").addClass("fa-chevron-up"); + $(".docstring-article-toggle-button") + .removeClass("fa-chevron-right") + .addClass("fa-chevron-down"); + + isExpanded = true; + articleToggleTitle = "Collapse docstring"; + navArticleToggleTitle = "Collapse all docstrings"; + + $(".docstring section").slideDown(); + } + + $(this).prop("title", navArticleToggleTitle); + $(".docstring-article-toggle-button").prop("title", articleToggleTitle); + }); +}); + +function debounce(callback, timeout = 300) { + if (Date.now() - timer > timeout) { + callback(); + } + + clearTimeout(timer); + + timer = Date.now(); +} + +}) +//////////////////////////////////////////////////////////////////////////////// +require([], function() { +function addCopyButtonCallbacks() { + for (const el of document.getElementsByTagName("pre")) { + const button = document.createElement("button"); + button.classList.add("copy-button", "fa-solid", "fa-copy"); + button.setAttribute("aria-label", "Copy this code block"); + button.setAttribute("title", "Copy"); + + el.appendChild(button); + + const success = function () { + button.classList.add("success", "fa-check"); + button.classList.remove("fa-copy"); + }; + + const failure = function () { + button.classList.add("error", "fa-xmark"); + button.classList.remove("fa-copy"); + }; + + button.addEventListener("click", function () { + copyToClipboard(el.innerText).then(success, failure); + + setTimeout(function () { + button.classList.add("fa-copy"); + button.classList.remove("success", "fa-check", "fa-xmark"); + }, 5000); + }); + } +} + +function copyToClipboard(text) { + // clipboard API is only available in secure contexts + if (window.navigator && window.navigator.clipboard) { + return window.navigator.clipboard.writeText(text); + } else { + return new Promise(function (resolve, reject) { + try { + const el = document.createElement("textarea"); + el.textContent = text; + el.style.position = "fixed"; + el.style.opacity = 0; + document.body.appendChild(el); + el.select(); + document.execCommand("copy"); + + resolve(); + } catch (err) { + reject(err); + } finally { + document.body.removeChild(el); + } + }); + } +} + +if (document.readyState === "loading") { + document.addEventListener("DOMContentLoaded", addCopyButtonCallbacks); +} else { + addCopyButtonCallbacks(); +} + +}) +//////////////////////////////////////////////////////////////////////////////// +require(['jquery', 'headroom', 'headroom-jquery'], function($, Headroom) { + +// Manages the top navigation bar (hides it when the user starts scrolling down on the +// mobile). +window.Headroom = Headroom; // work around buggy module loading? +$(document).ready(function () { + $("#documenter .docs-navbar").headroom({ + tolerance: { up: 10, down: 10 }, + }); +}); + +}) +//////////////////////////////////////////////////////////////////////////////// +require(['jquery', 'minisearch'], function($, minisearch) { + +// In general, most search related things will have "search" as a prefix. +// To get an in-depth about the thought process you can refer: https://hetarth02.hashnode.dev/series/gsoc + +let results = []; +let timer = undefined; + +let data = documenterSearchIndex["docs"].map((x, key) => { + x["id"] = key; // minisearch requires a unique for each object + return x; +}); + +// list below is the lunr 2.1.3 list minus the intersect with names(Base) +// (all, any, get, in, is, only, which) and (do, else, for, let, where, while, with) +// ideally we'd just filter the original list but it's not available as a variable +const stopWords = new Set([ + "a", + "able", + "about", + "across", + "after", + "almost", + "also", + "am", + "among", + "an", + "and", + "are", + "as", + "at", + "be", + "because", + "been", + "but", + "by", + "can", + "cannot", + "could", + "dear", + "did", + "does", + "either", + "ever", + "every", + "from", + "got", + "had", + "has", + "have", + "he", + "her", + "hers", + "him", + "his", + "how", + "however", + "i", + "if", + "into", + "it", + "its", + "just", + "least", + "like", + "likely", + "may", + "me", + "might", + "most", + "must", + "my", + "neither", + "no", + "nor", + "not", + "of", + "off", + "often", + "on", + "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", + "who", + "whom", + "why", + "will", + "would", + "yet", + "you", + "your", +]); + +let index = new minisearch({ + fields: ["title", "text"], // fields to index for full-text search + storeFields: ["location", "title", "text", "category", "page"], // fields to return with search results + processTerm: (term) => { + let word = stopWords.has(term) ? null : term; + if (word) { + // custom trimmer that doesn't strip @ and !, which are used in julia macro and function names + word = word + .replace(/^[^a-zA-Z0-9@!]+/, "") + .replace(/[^a-zA-Z0-9@!]+$/, ""); + } + + return word ?? null; + }, + // add . as a separator, because otherwise "title": "Documenter.Anchors.add!", would not find anything if searching for "add!", only for the entire qualification + tokenize: (string) => string.split(/[\s\-\.]+/), + // options which will be applied during the search + searchOptions: { + boost: { title: 100 }, + fuzzy: 2, + processTerm: (term) => { + let word = stopWords.has(term) ? null : term; + if (word) { + word = word + .replace(/^[^a-zA-Z0-9@!]+/, "") + .replace(/[^a-zA-Z0-9@!]+$/, ""); + } + + return word ?? null; + }, + tokenize: (string) => string.split(/[\s\-\.]+/), + }, +}); + +index.addAll(data); + +let filters = [...new Set(data.map((x) => x.category))]; +var modal_filters = make_modal_body_filters(filters); +var filter_results = []; + +$(document).on("keyup", ".documenter-search-input", function (event) { + // Adding a debounce to prevent disruptions from super-speed typing! + debounce(() => update_search(filter_results), 300); +}); + +$(document).on("click", ".search-filter", function () { + if ($(this).hasClass("search-filter-selected")) { + $(this).removeClass("search-filter-selected"); + } else { + $(this).addClass("search-filter-selected"); + } + + // Adding a debounce to prevent disruptions from crazy clicking! + debounce(() => get_filters(), 300); +}); + +/** + * A debounce function, takes a function and an optional timeout in milliseconds + * + * @function callback + * @param {number} timeout + */ +function debounce(callback, timeout = 300) { + clearTimeout(timer); + timer = setTimeout(callback, timeout); +} + +/** + * Make/Update the search component + * + * @param {string[]} selected_filters + */ +function update_search(selected_filters = []) { + let initial_search_body = ` +
Type something to get started!
+ `; + + let querystring = $(".documenter-search-input").val(); + + if (querystring.trim()) { + results = index.search(querystring, { + filter: (result) => { + // Filtering results + if (selected_filters.length === 0) { + return result.score >= 1; + } else { + return ( + result.score >= 1 && selected_filters.includes(result.category) + ); + } + }, + }); + + let search_result_container = ``; + let search_divider = `
`; + + if (results.length) { + let links = []; + let count = 0; + let search_results = ""; + + results.forEach(function (result) { + if (result.location) { + // Checking for duplication of results for the same page + if (!links.includes(result.location)) { + search_results += make_search_result(result, querystring); + count++; + } + + links.push(result.location); + } + }); + + let result_count = `
${count} result(s)
`; + + search_result_container = ` +
+ ${modal_filters} + ${search_divider} + ${result_count} +
+ ${search_results} +
+
+ `; + } else { + search_result_container = ` +
+ ${modal_filters} + ${search_divider} +
0 result(s)
+
+
No result found!
+ `; + } + + if ($(".search-modal-card-body").hasClass("is-justify-content-center")) { + $(".search-modal-card-body").removeClass("is-justify-content-center"); + } + + $(".search-modal-card-body").html(search_result_container); + } else { + filter_results = []; + modal_filters = make_modal_body_filters(filters, filter_results); + + if (!$(".search-modal-card-body").hasClass("is-justify-content-center")) { + $(".search-modal-card-body").addClass("is-justify-content-center"); + } + + $(".search-modal-card-body").html(initial_search_body); + } +} + +/** + * Make the modal filter html + * + * @param {string[]} filters + * @param {string[]} selected_filters + * @returns string + */ +function make_modal_body_filters(filters, selected_filters = []) { + let str = ``; + + filters.forEach((val) => { + if (selected_filters.includes(val)) { + str += `${val}`; + } else { + str += `${val}`; + } + }); + + let filter_html = ` +
+ Filters: + ${str} +
+ `; + + return filter_html; +} + +/** + * Make the result component given a minisearch result data object and the value of the search input as queryString. + * To view the result object structure, refer: https://lucaong.github.io/minisearch/modules/_minisearch_.html#searchresult + * + * @param {object} result + * @param {string} querystring + * @returns string + */ +function make_search_result(result, querystring) { + let search_divider = `
`; + let display_link = + result.location.slice(Math.max(0), Math.min(50, result.location.length)) + + (result.location.length > 30 ? "..." : ""); // To cut-off the link because it messes with the overflow of the whole div + + if (result.page !== "") { + display_link += ` (${result.page})`; + } + + let textindex = new RegExp(`\\b${querystring}\\b`, "i").exec(result.text); + let text = + textindex !== null + ? result.text.slice( + Math.max(textindex.index - 100, 0), + Math.min( + textindex.index + querystring.length + 100, + result.text.length + ) + ) + : ""; // cut-off text before and after from the match + + let display_result = text.length + ? "..." + + text.replace( + new RegExp(`\\b${querystring}\\b`, "i"), // For first occurrence + '$&' + ) + + "..." + : ""; // highlights the match + + let in_code = false; + if (!["page", "section"].includes(result.category.toLowerCase())) { + in_code = true; + } + + // We encode the full url to escape some special characters which can lead to broken links + let result_div = ` + +
+
${result.title}
+
${result.category}
+
+

+ ${display_result} +

+
+ ${display_link} +
+
+ ${search_divider} + `; + + return result_div; +} + +/** + * Get selected filters, remake the filter html and lastly update the search modal + */ +function get_filters() { + let ele = $(".search-filters .search-filter-selected").get(); + filter_results = ele.map((x) => $(x).text().toLowerCase()); + modal_filters = make_modal_body_filters(filters, filter_results); + update_search(filter_results); +} + +}) +//////////////////////////////////////////////////////////////////////////////// +require(['jquery'], function($) { + +// Modal settings dialog +$(document).ready(function () { + var settings = $("#documenter-settings"); + $("#documenter-settings-button").click(function () { + settings.toggleClass("is-active"); + }); + // Close the dialog if X is clicked + $("#documenter-settings button.delete").click(function () { + settings.removeClass("is-active"); + }); + // Close dialog if ESC is pressed + $(document).keyup(function (e) { + if (e.keyCode == 27) settings.removeClass("is-active"); + }); +}); + +}) +//////////////////////////////////////////////////////////////////////////////// +require(['jquery'], function($) { + +let search_modal_header = ` + +`; + +let initial_search_body = ` +
Type something to get started!
+`; + +let search_modal_footer = ` + +`; + +$(document.body).append( + ` + + ` +); + +document.querySelector(".docs-search-query").addEventListener("click", () => { + openModal(); +}); + +document.querySelector(".close-search-modal").addEventListener("click", () => { + closeModal(); +}); + +$(document).on("click", ".search-result-link", function () { + closeModal(); +}); + +document.addEventListener("keydown", (event) => { + if ((event.ctrlKey || event.metaKey) && event.key === "/") { + openModal(); + } else if (event.key === "Escape") { + closeModal(); + } + + return false; +}); + +// Functions to open and close a modal +function openModal() { + let searchModal = document.querySelector("#search-modal"); + + searchModal.classList.add("is-active"); + document.querySelector(".documenter-search-input").focus(); +} + +function closeModal() { + let searchModal = document.querySelector("#search-modal"); + let initial_search_body = ` +
Type something to get started!
+ `; + + searchModal.classList.remove("is-active"); + document.querySelector(".documenter-search-input").blur(); + + if (!$(".search-modal-card-body").hasClass("is-justify-content-center")) { + $(".search-modal-card-body").addClass("is-justify-content-center"); + } + + $(".documenter-search-input").val(""); + $(".search-modal-card-body").html(initial_search_body); +} + +document + .querySelector("#search-modal .modal-background") + .addEventListener("click", () => { + closeModal(); + }); + +}) +//////////////////////////////////////////////////////////////////////////////// +require(['jquery'], function($) { + +// Manages the showing and hiding of the sidebar. +$(document).ready(function () { + var sidebar = $("#documenter > .docs-sidebar"); + var sidebar_button = $("#documenter-sidebar-button"); + sidebar_button.click(function (ev) { + ev.preventDefault(); + sidebar.toggleClass("visible"); + if (sidebar.hasClass("visible")) { + // Makes sure that the current menu item is visible in the sidebar. + $("#documenter .docs-menu a.is-active").focus(); + } + }); + $("#documenter > .docs-main").bind("click", function (ev) { + if ($(ev.target).is(sidebar_button)) { + return; + } + if (sidebar.hasClass("visible")) { + sidebar.removeClass("visible"); + } + }); +}); + +// Resizes the package name / sitename in the sidebar if it is too wide. +// Inspired by: https://github.com/davatron5000/FitText.js +$(document).ready(function () { + e = $("#documenter .docs-autofit"); + function resize() { + var L = parseInt(e.css("max-width"), 10); + var L0 = e.width(); + if (L0 > L) { + var h0 = parseInt(e.css("font-size"), 10); + e.css("font-size", (L * h0) / L0); + // TODO: make sure it survives resizes? + } + } + // call once and then register events + resize(); + $(window).resize(resize); + $(window).on("orientationchange", resize); +}); + +// Scroll the navigation bar to the currently selected menu item +$(document).ready(function () { + var sidebar = $("#documenter .docs-menu").get(0); + var active = $("#documenter .docs-menu .is-active").get(0); + if (typeof active !== "undefined") { + sidebar.scrollTop = active.offsetTop - sidebar.offsetTop - 15; + } +}); + +}) +//////////////////////////////////////////////////////////////////////////////// +require(['jquery'], function($) { + +// Theme picker setup +$(document).ready(function () { + // onchange callback + $("#documenter-themepicker").change(function themepick_callback(ev) { + var themename = $("#documenter-themepicker option:selected").attr("value"); + if (themename === "auto") { + // set_theme(window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light'); + window.localStorage.removeItem("documenter-theme"); + } else { + // set_theme(themename); + window.localStorage.setItem("documenter-theme", themename); + } + // We re-use the global function from themeswap.js to actually do the swapping. + set_theme_from_local_storage(); + }); + + // Make sure that the themepicker displays the correct theme when the theme is retrieved + // from localStorage + if (typeof window.localStorage !== "undefined") { + var theme = window.localStorage.getItem("documenter-theme"); + if (theme !== null) { + $("#documenter-themepicker option").each(function (i, e) { + e.selected = e.value === theme; + }); + } + } +}); + +}) +//////////////////////////////////////////////////////////////////////////////// +require(['jquery'], function($) { + +// update the version selector with info from the siteinfo.js and ../versions.js files +$(document).ready(function () { + // If the version selector is disabled with DOCUMENTER_VERSION_SELECTOR_DISABLED in the + // siteinfo.js file, we just return immediately and not display the version selector. + if ( + typeof DOCUMENTER_VERSION_SELECTOR_DISABLED === "boolean" && + DOCUMENTER_VERSION_SELECTOR_DISABLED + ) { + return; + } + + var version_selector = $("#documenter .docs-version-selector"); + var version_selector_select = $("#documenter .docs-version-selector select"); + + version_selector_select.change(function (x) { + target_href = version_selector_select + .children("option:selected") + .get(0).value; + window.location.href = target_href; + }); + + // add the current version to the selector based on siteinfo.js, but only if the selector is empty + if ( + typeof DOCUMENTER_CURRENT_VERSION !== "undefined" && + $("#version-selector > option").length == 0 + ) { + var option = $( + "" + ); + version_selector_select.append(option); + } + + if (typeof DOC_VERSIONS !== "undefined") { + var existing_versions = version_selector_select.children("option"); + var existing_versions_texts = existing_versions.map(function (i, x) { + return x.text; + }); + DOC_VERSIONS.forEach(function (each) { + var version_url = documenterBaseURL + "/../" + each + "/"; + var existing_id = $.inArray(each, existing_versions_texts); + // if not already in the version selector, add it as a new option, + // otherwise update the old option with the URL and enable it + if (existing_id == -1) { + var option = $( + "" + ); + version_selector_select.append(option); + } else { + var option = existing_versions[existing_id]; + option.value = version_url; + option.disabled = false; + } + }); + } + + // only show the version selector if the selector has been populated + if (version_selector_select.children("option").length > 0) { + version_selector.toggleClass("visible"); + } +}); + +}) diff --git a/v0.11.5/assets/logo.png b/v0.11.5/assets/logo.png new file mode 100644 index 00000000..3bd85b59 Binary files /dev/null and b/v0.11.5/assets/logo.png differ diff --git a/v0.11.5/assets/themes/documenter-dark.css b/v0.11.5/assets/themes/documenter-dark.css new file mode 100644 index 00000000..9f5449f4 --- /dev/null +++ b/v0.11.5/assets/themes/documenter-dark.css @@ -0,0 +1,7 @@ +html.theme--documenter-dark .pagination-previous,html.theme--documenter-dark .pagination-next,html.theme--documenter-dark .pagination-link,html.theme--documenter-dark .pagination-ellipsis,html.theme--documenter-dark .file-cta,html.theme--documenter-dark .file-name,html.theme--documenter-dark .select select,html.theme--documenter-dark .textarea,html.theme--documenter-dark .input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input,html.theme--documenter-dark .button{-moz-appearance:none;-webkit-appearance:none;align-items:center;border:1px solid transparent;border-radius:.4em;box-shadow:none;display:inline-flex;font-size:1rem;height:2.5em;justify-content:flex-start;line-height:1.5;padding-bottom:calc(0.5em - 1px);padding-left:calc(0.75em - 1px);padding-right:calc(0.75em - 1px);padding-top:calc(0.5em - 1px);position:relative;vertical-align:top}html.theme--documenter-dark .pagination-previous:focus,html.theme--documenter-dark .pagination-next:focus,html.theme--documenter-dark .pagination-link:focus,html.theme--documenter-dark .pagination-ellipsis:focus,html.theme--documenter-dark .file-cta:focus,html.theme--documenter-dark .file-name:focus,html.theme--documenter-dark .select select:focus,html.theme--documenter-dark .textarea:focus,html.theme--documenter-dark .input:focus,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input:focus,html.theme--documenter-dark .button:focus,html.theme--documenter-dark .is-focused.pagination-previous,html.theme--documenter-dark .is-focused.pagination-next,html.theme--documenter-dark .is-focused.pagination-link,html.theme--documenter-dark .is-focused.pagination-ellipsis,html.theme--documenter-dark .is-focused.file-cta,html.theme--documenter-dark .is-focused.file-name,html.theme--documenter-dark .select select.is-focused,html.theme--documenter-dark .is-focused.textarea,html.theme--documenter-dark .is-focused.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-focused,html.theme--documenter-dark .is-focused.button,html.theme--documenter-dark .pagination-previous:active,html.theme--documenter-dark .pagination-next:active,html.theme--documenter-dark .pagination-link:active,html.theme--documenter-dark .pagination-ellipsis:active,html.theme--documenter-dark .file-cta:active,html.theme--documenter-dark .file-name:active,html.theme--documenter-dark .select select:active,html.theme--documenter-dark .textarea:active,html.theme--documenter-dark .input:active,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input:active,html.theme--documenter-dark .button:active,html.theme--documenter-dark .is-active.pagination-previous,html.theme--documenter-dark .is-active.pagination-next,html.theme--documenter-dark .is-active.pagination-link,html.theme--documenter-dark .is-active.pagination-ellipsis,html.theme--documenter-dark .is-active.file-cta,html.theme--documenter-dark .is-active.file-name,html.theme--documenter-dark .select select.is-active,html.theme--documenter-dark .is-active.textarea,html.theme--documenter-dark .is-active.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-active,html.theme--documenter-dark .is-active.button{outline:none}html.theme--documenter-dark .pagination-previous[disabled],html.theme--documenter-dark .pagination-next[disabled],html.theme--documenter-dark .pagination-link[disabled],html.theme--documenter-dark .pagination-ellipsis[disabled],html.theme--documenter-dark .file-cta[disabled],html.theme--documenter-dark .file-name[disabled],html.theme--documenter-dark .select select[disabled],html.theme--documenter-dark .textarea[disabled],html.theme--documenter-dark .input[disabled],html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input[disabled],html.theme--documenter-dark .button[disabled],fieldset[disabled] html.theme--documenter-dark .pagination-previous,html.theme--documenter-dark fieldset[disabled] .pagination-previous,fieldset[disabled] html.theme--documenter-dark .pagination-next,html.theme--documenter-dark fieldset[disabled] .pagination-next,fieldset[disabled] html.theme--documenter-dark .pagination-link,html.theme--documenter-dark fieldset[disabled] .pagination-link,fieldset[disabled] html.theme--documenter-dark .pagination-ellipsis,html.theme--documenter-dark fieldset[disabled] .pagination-ellipsis,fieldset[disabled] html.theme--documenter-dark .file-cta,html.theme--documenter-dark fieldset[disabled] .file-cta,fieldset[disabled] html.theme--documenter-dark .file-name,html.theme--documenter-dark fieldset[disabled] .file-name,fieldset[disabled] html.theme--documenter-dark .select select,fieldset[disabled] html.theme--documenter-dark .textarea,fieldset[disabled] html.theme--documenter-dark .input,fieldset[disabled] html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input,html.theme--documenter-dark fieldset[disabled] .select select,html.theme--documenter-dark .select fieldset[disabled] select,html.theme--documenter-dark fieldset[disabled] .textarea,html.theme--documenter-dark fieldset[disabled] .input,html.theme--documenter-dark fieldset[disabled] #documenter .docs-sidebar form.docs-search>input,html.theme--documenter-dark #documenter .docs-sidebar fieldset[disabled] form.docs-search>input,fieldset[disabled] html.theme--documenter-dark .button,html.theme--documenter-dark fieldset[disabled] .button{cursor:not-allowed}html.theme--documenter-dark .tabs,html.theme--documenter-dark .pagination-previous,html.theme--documenter-dark .pagination-next,html.theme--documenter-dark .pagination-link,html.theme--documenter-dark .pagination-ellipsis,html.theme--documenter-dark .breadcrumb,html.theme--documenter-dark .file,html.theme--documenter-dark .button,.is-unselectable{-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}html.theme--documenter-dark .navbar-link:not(.is-arrowless)::after,html.theme--documenter-dark .select:not(.is-multiple):not(.is-loading)::after{border:3px solid rgba(0,0,0,0);border-radius:2px;border-right:0;border-top:0;content:" ";display:block;height:0.625em;margin-top:-0.4375em;pointer-events:none;position:absolute;top:50%;transform:rotate(-45deg);transform-origin:center;width:0.625em}html.theme--documenter-dark .admonition:not(:last-child),html.theme--documenter-dark .tabs:not(:last-child),html.theme--documenter-dark .pagination:not(:last-child),html.theme--documenter-dark .message:not(:last-child),html.theme--documenter-dark .level:not(:last-child),html.theme--documenter-dark .breadcrumb:not(:last-child),html.theme--documenter-dark .block:not(:last-child),html.theme--documenter-dark .title:not(:last-child),html.theme--documenter-dark .subtitle:not(:last-child),html.theme--documenter-dark .table-container:not(:last-child),html.theme--documenter-dark .table:not(:last-child),html.theme--documenter-dark .progress:not(:last-child),html.theme--documenter-dark .notification:not(:last-child),html.theme--documenter-dark .content:not(:last-child),html.theme--documenter-dark .box:not(:last-child){margin-bottom:1.5rem}html.theme--documenter-dark .modal-close,html.theme--documenter-dark .delete{-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-moz-appearance:none;-webkit-appearance:none;background-color:rgba(10,10,10,0.2);border:none;border-radius:9999px;cursor:pointer;pointer-events:auto;display:inline-block;flex-grow:0;flex-shrink:0;font-size:0;height:20px;max-height:20px;max-width:20px;min-height:20px;min-width:20px;outline:none;position:relative;vertical-align:top;width:20px}html.theme--documenter-dark .modal-close::before,html.theme--documenter-dark .delete::before,html.theme--documenter-dark .modal-close::after,html.theme--documenter-dark .delete::after{background-color:#fff;content:"";display:block;left:50%;position:absolute;top:50%;transform:translateX(-50%) translateY(-50%) rotate(45deg);transform-origin:center center}html.theme--documenter-dark .modal-close::before,html.theme--documenter-dark .delete::before{height:2px;width:50%}html.theme--documenter-dark .modal-close::after,html.theme--documenter-dark .delete::after{height:50%;width:2px}html.theme--documenter-dark .modal-close:hover,html.theme--documenter-dark .delete:hover,html.theme--documenter-dark .modal-close:focus,html.theme--documenter-dark .delete:focus{background-color:rgba(10,10,10,0.3)}html.theme--documenter-dark .modal-close:active,html.theme--documenter-dark .delete:active{background-color:rgba(10,10,10,0.4)}html.theme--documenter-dark .is-small.modal-close,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.modal-close,html.theme--documenter-dark .is-small.delete,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.delete{height:16px;max-height:16px;max-width:16px;min-height:16px;min-width:16px;width:16px}html.theme--documenter-dark .is-medium.modal-close,html.theme--documenter-dark .is-medium.delete{height:24px;max-height:24px;max-width:24px;min-height:24px;min-width:24px;width:24px}html.theme--documenter-dark .is-large.modal-close,html.theme--documenter-dark .is-large.delete{height:32px;max-height:32px;max-width:32px;min-height:32px;min-width:32px;width:32px}html.theme--documenter-dark .control.is-loading::after,html.theme--documenter-dark .select.is-loading::after,html.theme--documenter-dark .loader,html.theme--documenter-dark .button.is-loading::after{animation:spinAround 500ms infinite linear;border:2px solid #dbdee0;border-radius:9999px;border-right-color:transparent;border-top-color:transparent;content:"";display:block;height:1em;position:relative;width:1em}html.theme--documenter-dark .hero-video,html.theme--documenter-dark .modal-background,html.theme--documenter-dark .modal,html.theme--documenter-dark .image.is-square img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-square img,html.theme--documenter-dark .image.is-square .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-square .has-ratio,html.theme--documenter-dark .image.is-1by1 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by1 img,html.theme--documenter-dark .image.is-1by1 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by1 .has-ratio,html.theme--documenter-dark .image.is-5by4 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-5by4 img,html.theme--documenter-dark .image.is-5by4 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-5by4 .has-ratio,html.theme--documenter-dark .image.is-4by3 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-4by3 img,html.theme--documenter-dark .image.is-4by3 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-4by3 .has-ratio,html.theme--documenter-dark .image.is-3by2 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by2 img,html.theme--documenter-dark .image.is-3by2 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by2 .has-ratio,html.theme--documenter-dark .image.is-5by3 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-5by3 img,html.theme--documenter-dark .image.is-5by3 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-5by3 .has-ratio,html.theme--documenter-dark .image.is-16by9 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-16by9 img,html.theme--documenter-dark .image.is-16by9 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-16by9 .has-ratio,html.theme--documenter-dark .image.is-2by1 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-2by1 img,html.theme--documenter-dark .image.is-2by1 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-2by1 .has-ratio,html.theme--documenter-dark .image.is-3by1 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by1 img,html.theme--documenter-dark .image.is-3by1 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by1 .has-ratio,html.theme--documenter-dark .image.is-4by5 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-4by5 img,html.theme--documenter-dark .image.is-4by5 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-4by5 .has-ratio,html.theme--documenter-dark .image.is-3by4 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by4 img,html.theme--documenter-dark .image.is-3by4 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by4 .has-ratio,html.theme--documenter-dark .image.is-2by3 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-2by3 img,html.theme--documenter-dark .image.is-2by3 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-2by3 .has-ratio,html.theme--documenter-dark .image.is-3by5 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by5 img,html.theme--documenter-dark .image.is-3by5 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by5 .has-ratio,html.theme--documenter-dark .image.is-9by16 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-9by16 img,html.theme--documenter-dark .image.is-9by16 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-9by16 .has-ratio,html.theme--documenter-dark .image.is-1by2 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by2 img,html.theme--documenter-dark .image.is-1by2 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by2 .has-ratio,html.theme--documenter-dark .image.is-1by3 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by3 img,html.theme--documenter-dark .image.is-1by3 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by3 .has-ratio,.is-overlay{bottom:0;left:0;position:absolute;right:0;top:0}html.theme--documenter-dark .navbar-burger{-moz-appearance:none;-webkit-appearance:none;appearance:none;background:none;border:none;color:currentColor;font-family:inherit;font-size:1em;margin:0;padding:0}/*! minireset.css v0.0.6 | MIT License | github.com/jgthms/minireset.css */html,body,p,ol,ul,li,dl,dt,dd,blockquote,figure,fieldset,legend,textarea,pre,iframe,hr,h1,h2,h3,h4,h5,h6{margin:0;padding:0}h1,h2,h3,h4,h5,h6{font-size:100%;font-weight:normal}ul{list-style:none}button,input,select,textarea{margin:0}html{box-sizing:border-box}*,*::before,*::after{box-sizing:inherit}img,video{height:auto;max-width:100%}iframe{border:0}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}td:not([align]),th:not([align]){text-align:inherit}.has-text-white{color:#fff !important}a.has-text-white:hover,a.has-text-white:focus{color:#e6e6e6 !important}.has-background-white{background-color:#fff !important}.has-text-black{color:#0a0a0a !important}a.has-text-black:hover,a.has-text-black:focus{color:#000 !important}.has-background-black{background-color:#0a0a0a !important}.has-text-light{color:#ecf0f1 !important}a.has-text-light:hover,a.has-text-light:focus{color:#cfd9db !important}.has-background-light{background-color:#ecf0f1 !important}.has-text-dark{color:#282f2f !important}a.has-text-dark:hover,a.has-text-dark:focus{color:#111414 !important}.has-background-dark{background-color:#282f2f !important}.has-text-primary{color:#375a7f !important}a.has-text-primary:hover,a.has-text-primary:focus{color:#28415b !important}.has-background-primary{background-color:#375a7f !important}.has-text-primary-light{color:#f1f5f9 !important}a.has-text-primary-light:hover,a.has-text-primary-light:focus{color:#cddbe9 !important}.has-background-primary-light{background-color:#f1f5f9 !important}.has-text-primary-dark{color:#4d7eb2 !important}a.has-text-primary-dark:hover,a.has-text-primary-dark:focus{color:#7198c1 !important}.has-background-primary-dark{background-color:#4d7eb2 !important}.has-text-link{color:#1abc9c !important}a.has-text-link:hover,a.has-text-link:focus{color:#148f77 !important}.has-background-link{background-color:#1abc9c !important}.has-text-link-light{color:#edfdf9 !important}a.has-text-link-light:hover,a.has-text-link-light:focus{color:#c0f6ec !important}.has-background-link-light{background-color:#edfdf9 !important}.has-text-link-dark{color:#15987e !important}a.has-text-link-dark:hover,a.has-text-link-dark:focus{color:#1bc5a4 !important}.has-background-link-dark{background-color:#15987e !important}.has-text-info{color:#024c7d !important}a.has-text-info:hover,a.has-text-info:focus{color:#012d4b !important}.has-background-info{background-color:#024c7d !important}.has-text-info-light{color:#ebf7ff !important}a.has-text-info-light:hover,a.has-text-info-light:focus{color:#b9e2fe !important}.has-background-info-light{background-color:#ebf7ff !important}.has-text-info-dark{color:#0e9dfb !important}a.has-text-info-dark:hover,a.has-text-info-dark:focus{color:#40b1fc !important}.has-background-info-dark{background-color:#0e9dfb !important}.has-text-success{color:#008438 !important}a.has-text-success:hover,a.has-text-success:focus{color:#005122 !important}.has-background-success{background-color:#008438 !important}.has-text-success-light{color:#ebfff3 !important}a.has-text-success-light:hover,a.has-text-success-light:focus{color:#b8ffd6 !important}.has-background-success-light{background-color:#ebfff3 !important}.has-text-success-dark{color:#00eb64 !important}a.has-text-success-dark:hover,a.has-text-success-dark:focus{color:#1fff7e !important}.has-background-success-dark{background-color:#00eb64 !important}.has-text-warning{color:#ad8100 !important}a.has-text-warning:hover,a.has-text-warning:focus{color:#7a5b00 !important}.has-background-warning{background-color:#ad8100 !important}.has-text-warning-light{color:#fffaeb !important}a.has-text-warning-light:hover,a.has-text-warning-light:focus{color:#ffedb8 !important}.has-background-warning-light{background-color:#fffaeb !important}.has-text-warning-dark{color:#d19c00 !important}a.has-text-warning-dark:hover,a.has-text-warning-dark:focus{color:#ffbf05 !important}.has-background-warning-dark{background-color:#d19c00 !important}.has-text-danger{color:#9e1b0d !important}a.has-text-danger:hover,a.has-text-danger:focus{color:#6f1309 !important}.has-background-danger{background-color:#9e1b0d !important}.has-text-danger-light{color:#fdeeec !important}a.has-text-danger-light:hover,a.has-text-danger-light:focus{color:#fac3bd !important}.has-background-danger-light{background-color:#fdeeec !important}.has-text-danger-dark{color:#ec311d !important}a.has-text-danger-dark:hover,a.has-text-danger-dark:focus{color:#f05c4c !important}.has-background-danger-dark{background-color:#ec311d !important}.has-text-black-bis{color:#121212 !important}.has-background-black-bis{background-color:#121212 !important}.has-text-black-ter{color:#242424 !important}.has-background-black-ter{background-color:#242424 !important}.has-text-grey-darker{color:#282f2f !important}.has-background-grey-darker{background-color:#282f2f !important}.has-text-grey-dark{color:#343c3d !important}.has-background-grey-dark{background-color:#343c3d !important}.has-text-grey{color:#5e6d6f !important}.has-background-grey{background-color:#5e6d6f !important}.has-text-grey-light{color:#8c9b9d !important}.has-background-grey-light{background-color:#8c9b9d !important}.has-text-grey-lighter{color:#dbdee0 !important}.has-background-grey-lighter{background-color:#dbdee0 !important}.has-text-white-ter{color:#ecf0f1 !important}.has-background-white-ter{background-color:#ecf0f1 !important}.has-text-white-bis{color:#fafafa !important}.has-background-white-bis{background-color:#fafafa !important}.is-flex-direction-row{flex-direction:row !important}.is-flex-direction-row-reverse{flex-direction:row-reverse !important}.is-flex-direction-column{flex-direction:column !important}.is-flex-direction-column-reverse{flex-direction:column-reverse !important}.is-flex-wrap-nowrap{flex-wrap:nowrap !important}.is-flex-wrap-wrap{flex-wrap:wrap !important}.is-flex-wrap-wrap-reverse{flex-wrap:wrap-reverse !important}.is-justify-content-flex-start{justify-content:flex-start !important}.is-justify-content-flex-end{justify-content:flex-end !important}.is-justify-content-center{justify-content:center !important}.is-justify-content-space-between{justify-content:space-between !important}.is-justify-content-space-around{justify-content:space-around !important}.is-justify-content-space-evenly{justify-content:space-evenly !important}.is-justify-content-start{justify-content:start !important}.is-justify-content-end{justify-content:end !important}.is-justify-content-left{justify-content:left !important}.is-justify-content-right{justify-content:right !important}.is-align-content-flex-start{align-content:flex-start !important}.is-align-content-flex-end{align-content:flex-end !important}.is-align-content-center{align-content:center !important}.is-align-content-space-between{align-content:space-between !important}.is-align-content-space-around{align-content:space-around !important}.is-align-content-space-evenly{align-content:space-evenly !important}.is-align-content-stretch{align-content:stretch !important}.is-align-content-start{align-content:start !important}.is-align-content-end{align-content:end !important}.is-align-content-baseline{align-content:baseline !important}.is-align-items-stretch{align-items:stretch !important}.is-align-items-flex-start{align-items:flex-start !important}.is-align-items-flex-end{align-items:flex-end !important}.is-align-items-center{align-items:center !important}.is-align-items-baseline{align-items:baseline !important}.is-align-items-start{align-items:start !important}.is-align-items-end{align-items:end !important}.is-align-items-self-start{align-items:self-start !important}.is-align-items-self-end{align-items:self-end !important}.is-align-self-auto{align-self:auto !important}.is-align-self-flex-start{align-self:flex-start !important}.is-align-self-flex-end{align-self:flex-end !important}.is-align-self-center{align-self:center !important}.is-align-self-baseline{align-self:baseline !important}.is-align-self-stretch{align-self:stretch !important}.is-flex-grow-0{flex-grow:0 !important}.is-flex-grow-1{flex-grow:1 !important}.is-flex-grow-2{flex-grow:2 !important}.is-flex-grow-3{flex-grow:3 !important}.is-flex-grow-4{flex-grow:4 !important}.is-flex-grow-5{flex-grow:5 !important}.is-flex-shrink-0{flex-shrink:0 !important}.is-flex-shrink-1{flex-shrink:1 !important}.is-flex-shrink-2{flex-shrink:2 !important}.is-flex-shrink-3{flex-shrink:3 !important}.is-flex-shrink-4{flex-shrink:4 !important}.is-flex-shrink-5{flex-shrink:5 !important}.is-clearfix::after{clear:both;content:" ";display:table}.is-pulled-left{float:left !important}.is-pulled-right{float:right !important}.is-radiusless{border-radius:0 !important}.is-shadowless{box-shadow:none !important}.is-clickable{cursor:pointer !important;pointer-events:all !important}.is-clipped{overflow:hidden !important}.is-relative{position:relative !important}.is-marginless{margin:0 !important}.is-paddingless{padding:0 !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-left:0 !important;margin-right:0 !important}.my-0{margin-top:0 !important;margin-bottom: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-left:.25rem !important;margin-right:.25rem !important}.my-1{margin-top:.25rem !important;margin-bottom:.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-left:.5rem !important;margin-right:.5rem !important}.my-2{margin-top:.5rem !important;margin-bottom:.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-left:.75rem !important;margin-right:.75rem !important}.my-3{margin-top:.75rem !important;margin-bottom:.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-left:1rem !important;margin-right:1rem !important}.my-4{margin-top:1rem !important;margin-bottom: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-left:1.5rem !important;margin-right:1.5rem !important}.my-5{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.m-6{margin:3rem !important}.mt-6{margin-top:3rem !important}.mr-6{margin-right:3rem !important}.mb-6{margin-bottom:3rem !important}.ml-6{margin-left:3rem !important}.mx-6{margin-left:3rem !important;margin-right:3rem !important}.my-6{margin-top:3rem !important;margin-bottom:3rem !important}.m-auto{margin:auto !important}.mt-auto{margin-top:auto !important}.mr-auto{margin-right:auto !important}.mb-auto{margin-bottom:auto !important}.ml-auto{margin-left:auto !important}.mx-auto{margin-left:auto !important;margin-right:auto !important}.my-auto{margin-top:auto !important;margin-bottom:auto !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-left:0 !important;padding-right: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-left:.25rem !important;padding-right:.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-left:.5rem !important;padding-right:.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-left:.75rem !important;padding-right:.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-left:1rem !important;padding-right: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-left:1.5rem !important;padding-right:1.5rem !important}.py-5{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.p-6{padding:3rem !important}.pt-6{padding-top:3rem !important}.pr-6{padding-right:3rem !important}.pb-6{padding-bottom:3rem !important}.pl-6{padding-left:3rem !important}.px-6{padding-left:3rem !important;padding-right:3rem !important}.py-6{padding-top:3rem !important;padding-bottom:3rem !important}.p-auto{padding:auto !important}.pt-auto{padding-top:auto !important}.pr-auto{padding-right:auto !important}.pb-auto{padding-bottom:auto !important}.pl-auto{padding-left:auto !important}.px-auto{padding-left:auto !important;padding-right:auto !important}.py-auto{padding-top:auto !important;padding-bottom:auto !important}.is-size-1{font-size:3rem !important}.is-size-2{font-size:2.5rem !important}.is-size-3{font-size:2rem !important}.is-size-4{font-size:1.5rem !important}.is-size-5{font-size:1.25rem !important}.is-size-6{font-size:1rem !important}.is-size-7,html.theme--documenter-dark .docstring>section>a.docs-sourcelink{font-size:.75rem !important}@media screen and (max-width: 768px){.is-size-1-mobile{font-size:3rem !important}.is-size-2-mobile{font-size:2.5rem !important}.is-size-3-mobile{font-size:2rem !important}.is-size-4-mobile{font-size:1.5rem !important}.is-size-5-mobile{font-size:1.25rem !important}.is-size-6-mobile{font-size:1rem !important}.is-size-7-mobile{font-size:.75rem !important}}@media screen and (min-width: 769px),print{.is-size-1-tablet{font-size:3rem !important}.is-size-2-tablet{font-size:2.5rem !important}.is-size-3-tablet{font-size:2rem !important}.is-size-4-tablet{font-size:1.5rem !important}.is-size-5-tablet{font-size:1.25rem !important}.is-size-6-tablet{font-size:1rem !important}.is-size-7-tablet{font-size:.75rem !important}}@media screen and (max-width: 1055px){.is-size-1-touch{font-size:3rem !important}.is-size-2-touch{font-size:2.5rem !important}.is-size-3-touch{font-size:2rem !important}.is-size-4-touch{font-size:1.5rem !important}.is-size-5-touch{font-size:1.25rem !important}.is-size-6-touch{font-size:1rem !important}.is-size-7-touch{font-size:.75rem !important}}@media screen and (min-width: 1056px){.is-size-1-desktop{font-size:3rem !important}.is-size-2-desktop{font-size:2.5rem !important}.is-size-3-desktop{font-size:2rem !important}.is-size-4-desktop{font-size:1.5rem !important}.is-size-5-desktop{font-size:1.25rem !important}.is-size-6-desktop{font-size:1rem !important}.is-size-7-desktop{font-size:.75rem !important}}@media screen and (min-width: 1216px){.is-size-1-widescreen{font-size:3rem !important}.is-size-2-widescreen{font-size:2.5rem !important}.is-size-3-widescreen{font-size:2rem !important}.is-size-4-widescreen{font-size:1.5rem !important}.is-size-5-widescreen{font-size:1.25rem !important}.is-size-6-widescreen{font-size:1rem !important}.is-size-7-widescreen{font-size:.75rem !important}}@media screen and (min-width: 1408px){.is-size-1-fullhd{font-size:3rem !important}.is-size-2-fullhd{font-size:2.5rem !important}.is-size-3-fullhd{font-size:2rem !important}.is-size-4-fullhd{font-size:1.5rem !important}.is-size-5-fullhd{font-size:1.25rem !important}.is-size-6-fullhd{font-size:1rem !important}.is-size-7-fullhd{font-size:.75rem !important}}.has-text-centered{text-align:center !important}.has-text-justified{text-align:justify !important}.has-text-left{text-align:left !important}.has-text-right{text-align:right !important}@media screen and (max-width: 768px){.has-text-centered-mobile{text-align:center !important}}@media screen and (min-width: 769px),print{.has-text-centered-tablet{text-align:center !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.has-text-centered-tablet-only{text-align:center !important}}@media screen and (max-width: 1055px){.has-text-centered-touch{text-align:center !important}}@media screen and (min-width: 1056px){.has-text-centered-desktop{text-align:center !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.has-text-centered-desktop-only{text-align:center !important}}@media screen and (min-width: 1216px){.has-text-centered-widescreen{text-align:center !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.has-text-centered-widescreen-only{text-align:center !important}}@media screen and (min-width: 1408px){.has-text-centered-fullhd{text-align:center !important}}@media screen and (max-width: 768px){.has-text-justified-mobile{text-align:justify !important}}@media screen and (min-width: 769px),print{.has-text-justified-tablet{text-align:justify !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.has-text-justified-tablet-only{text-align:justify !important}}@media screen and (max-width: 1055px){.has-text-justified-touch{text-align:justify !important}}@media screen and (min-width: 1056px){.has-text-justified-desktop{text-align:justify !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.has-text-justified-desktop-only{text-align:justify !important}}@media screen and (min-width: 1216px){.has-text-justified-widescreen{text-align:justify !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.has-text-justified-widescreen-only{text-align:justify !important}}@media screen and (min-width: 1408px){.has-text-justified-fullhd{text-align:justify !important}}@media screen and (max-width: 768px){.has-text-left-mobile{text-align:left !important}}@media screen and (min-width: 769px),print{.has-text-left-tablet{text-align:left !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.has-text-left-tablet-only{text-align:left !important}}@media screen and (max-width: 1055px){.has-text-left-touch{text-align:left !important}}@media screen and (min-width: 1056px){.has-text-left-desktop{text-align:left !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.has-text-left-desktop-only{text-align:left !important}}@media screen and (min-width: 1216px){.has-text-left-widescreen{text-align:left !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.has-text-left-widescreen-only{text-align:left !important}}@media screen and (min-width: 1408px){.has-text-left-fullhd{text-align:left !important}}@media screen and (max-width: 768px){.has-text-right-mobile{text-align:right !important}}@media screen and (min-width: 769px),print{.has-text-right-tablet{text-align:right !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.has-text-right-tablet-only{text-align:right !important}}@media screen and (max-width: 1055px){.has-text-right-touch{text-align:right !important}}@media screen and (min-width: 1056px){.has-text-right-desktop{text-align:right !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.has-text-right-desktop-only{text-align:right !important}}@media screen and (min-width: 1216px){.has-text-right-widescreen{text-align:right !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.has-text-right-widescreen-only{text-align:right !important}}@media screen and (min-width: 1408px){.has-text-right-fullhd{text-align:right !important}}.is-capitalized{text-transform:capitalize !important}.is-lowercase{text-transform:lowercase !important}.is-uppercase{text-transform:uppercase !important}.is-italic{font-style:italic !important}.is-underlined{text-decoration:underline !important}.has-text-weight-light{font-weight:300 !important}.has-text-weight-normal{font-weight:400 !important}.has-text-weight-medium{font-weight:500 !important}.has-text-weight-semibold{font-weight:600 !important}.has-text-weight-bold{font-weight:700 !important}.is-family-primary{font-family:"Lato Medium",-apple-system,BlinkMacSystemFont,"Segoe UI","Helvetica Neue","Helvetica","Arial",sans-serif !important}.is-family-secondary{font-family:"Lato Medium",-apple-system,BlinkMacSystemFont,"Segoe UI","Helvetica Neue","Helvetica","Arial",sans-serif !important}.is-family-sans-serif{font-family:"Lato Medium",-apple-system,BlinkMacSystemFont,"Segoe UI","Helvetica Neue","Helvetica","Arial",sans-serif !important}.is-family-monospace{font-family:"JuliaMono","SFMono-Regular","Menlo","Consolas","Liberation Mono","DejaVu Sans Mono",monospace !important}.is-family-code{font-family:"JuliaMono","SFMono-Regular","Menlo","Consolas","Liberation Mono","DejaVu Sans Mono",monospace !important}.is-block{display:block !important}@media screen and (max-width: 768px){.is-block-mobile{display:block !important}}@media screen and (min-width: 769px),print{.is-block-tablet{display:block !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-block-tablet-only{display:block !important}}@media screen and (max-width: 1055px){.is-block-touch{display:block !important}}@media screen and (min-width: 1056px){.is-block-desktop{display:block !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-block-desktop-only{display:block !important}}@media screen and (min-width: 1216px){.is-block-widescreen{display:block !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-block-widescreen-only{display:block !important}}@media screen and (min-width: 1408px){.is-block-fullhd{display:block !important}}.is-flex{display:flex !important}@media screen and (max-width: 768px){.is-flex-mobile{display:flex !important}}@media screen and (min-width: 769px),print{.is-flex-tablet{display:flex !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-flex-tablet-only{display:flex !important}}@media screen and (max-width: 1055px){.is-flex-touch{display:flex !important}}@media screen and (min-width: 1056px){.is-flex-desktop{display:flex !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-flex-desktop-only{display:flex !important}}@media screen and (min-width: 1216px){.is-flex-widescreen{display:flex !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-flex-widescreen-only{display:flex !important}}@media screen and (min-width: 1408px){.is-flex-fullhd{display:flex !important}}.is-inline{display:inline !important}@media screen and (max-width: 768px){.is-inline-mobile{display:inline !important}}@media screen and (min-width: 769px),print{.is-inline-tablet{display:inline !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-inline-tablet-only{display:inline !important}}@media screen and (max-width: 1055px){.is-inline-touch{display:inline !important}}@media screen and (min-width: 1056px){.is-inline-desktop{display:inline !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-inline-desktop-only{display:inline !important}}@media screen and (min-width: 1216px){.is-inline-widescreen{display:inline !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-inline-widescreen-only{display:inline !important}}@media screen and (min-width: 1408px){.is-inline-fullhd{display:inline !important}}.is-inline-block{display:inline-block !important}@media screen and (max-width: 768px){.is-inline-block-mobile{display:inline-block !important}}@media screen and (min-width: 769px),print{.is-inline-block-tablet{display:inline-block !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-inline-block-tablet-only{display:inline-block !important}}@media screen and (max-width: 1055px){.is-inline-block-touch{display:inline-block !important}}@media screen and (min-width: 1056px){.is-inline-block-desktop{display:inline-block !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-inline-block-desktop-only{display:inline-block !important}}@media screen and (min-width: 1216px){.is-inline-block-widescreen{display:inline-block !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-inline-block-widescreen-only{display:inline-block !important}}@media screen and (min-width: 1408px){.is-inline-block-fullhd{display:inline-block !important}}.is-inline-flex{display:inline-flex !important}@media screen and (max-width: 768px){.is-inline-flex-mobile{display:inline-flex !important}}@media screen and (min-width: 769px),print{.is-inline-flex-tablet{display:inline-flex !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-inline-flex-tablet-only{display:inline-flex !important}}@media screen and (max-width: 1055px){.is-inline-flex-touch{display:inline-flex !important}}@media screen and (min-width: 1056px){.is-inline-flex-desktop{display:inline-flex !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-inline-flex-desktop-only{display:inline-flex !important}}@media screen and (min-width: 1216px){.is-inline-flex-widescreen{display:inline-flex !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-inline-flex-widescreen-only{display:inline-flex !important}}@media screen and (min-width: 1408px){.is-inline-flex-fullhd{display:inline-flex !important}}.is-hidden{display:none !important}.is-sr-only{border:none !important;clip:rect(0, 0, 0, 0) !important;height:0.01em !important;overflow:hidden !important;padding:0 !important;position:absolute !important;white-space:nowrap !important;width:0.01em !important}@media screen and (max-width: 768px){.is-hidden-mobile{display:none !important}}@media screen and (min-width: 769px),print{.is-hidden-tablet{display:none !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-hidden-tablet-only{display:none !important}}@media screen and (max-width: 1055px){.is-hidden-touch{display:none !important}}@media screen and (min-width: 1056px){.is-hidden-desktop{display:none !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-hidden-desktop-only{display:none !important}}@media screen and (min-width: 1216px){.is-hidden-widescreen{display:none !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-hidden-widescreen-only{display:none !important}}@media screen and (min-width: 1408px){.is-hidden-fullhd{display:none !important}}.is-invisible{visibility:hidden !important}@media screen and (max-width: 768px){.is-invisible-mobile{visibility:hidden !important}}@media screen and (min-width: 769px),print{.is-invisible-tablet{visibility:hidden !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-invisible-tablet-only{visibility:hidden !important}}@media screen and (max-width: 1055px){.is-invisible-touch{visibility:hidden !important}}@media screen and (min-width: 1056px){.is-invisible-desktop{visibility:hidden !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-invisible-desktop-only{visibility:hidden !important}}@media screen and (min-width: 1216px){.is-invisible-widescreen{visibility:hidden !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-invisible-widescreen-only{visibility:hidden !important}}@media screen and (min-width: 1408px){.is-invisible-fullhd{visibility:hidden !important}}html.theme--documenter-dark{/*! + Theme: a11y-dark + Author: @ericwbailey + Maintainer: @ericwbailey + + Based on the Tomorrow Night Eighties theme: https://github.com/isagalaev/highlight.js/blob/master/src/styles/tomorrow-night-eighties.css +*/}html.theme--documenter-dark html{background-color:#1f2424;font-size:16px;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;min-width:300px;overflow-x:auto;overflow-y:scroll;text-rendering:optimizeLegibility;text-size-adjust:100%}html.theme--documenter-dark article,html.theme--documenter-dark aside,html.theme--documenter-dark figure,html.theme--documenter-dark footer,html.theme--documenter-dark header,html.theme--documenter-dark hgroup,html.theme--documenter-dark section{display:block}html.theme--documenter-dark body,html.theme--documenter-dark button,html.theme--documenter-dark input,html.theme--documenter-dark optgroup,html.theme--documenter-dark select,html.theme--documenter-dark textarea{font-family:"Lato Medium",-apple-system,BlinkMacSystemFont,"Segoe UI","Helvetica Neue","Helvetica","Arial",sans-serif}html.theme--documenter-dark code,html.theme--documenter-dark pre{-moz-osx-font-smoothing:auto;-webkit-font-smoothing:auto;font-family:"JuliaMono","SFMono-Regular","Menlo","Consolas","Liberation Mono","DejaVu Sans Mono",monospace}html.theme--documenter-dark body{color:#fff;font-size:1em;font-weight:400;line-height:1.5}html.theme--documenter-dark a{color:#1abc9c;cursor:pointer;text-decoration:none}html.theme--documenter-dark a strong{color:currentColor}html.theme--documenter-dark a:hover{color:#1dd2af}html.theme--documenter-dark code{background-color:rgba(255,255,255,0.05);color:#ececec;font-size:.875em;font-weight:normal;padding:.1em}html.theme--documenter-dark hr{background-color:#282f2f;border:none;display:block;height:2px;margin:1.5rem 0}html.theme--documenter-dark img{height:auto;max-width:100%}html.theme--documenter-dark input[type="checkbox"],html.theme--documenter-dark input[type="radio"]{vertical-align:baseline}html.theme--documenter-dark small{font-size:.875em}html.theme--documenter-dark span{font-style:inherit;font-weight:inherit}html.theme--documenter-dark strong{color:#f2f2f2;font-weight:700}html.theme--documenter-dark fieldset{border:none}html.theme--documenter-dark pre{-webkit-overflow-scrolling:touch;background-color:#282f2f;color:#fff;font-size:.875em;overflow-x:auto;padding:1.25rem 1.5rem;white-space:pre;word-wrap:normal}html.theme--documenter-dark pre code{background-color:transparent;color:currentColor;font-size:1em;padding:0}html.theme--documenter-dark table td,html.theme--documenter-dark table th{vertical-align:top}html.theme--documenter-dark table td:not([align]),html.theme--documenter-dark table th:not([align]){text-align:inherit}html.theme--documenter-dark table th{color:#f2f2f2}html.theme--documenter-dark .box{background-color:#343c3d;border-radius:8px;box-shadow:none;color:#fff;display:block;padding:1.25rem}html.theme--documenter-dark a.box:hover,html.theme--documenter-dark a.box:focus{box-shadow:0 0.5em 1em -0.125em rgba(10,10,10,0.1),0 0 0 1px #1abc9c}html.theme--documenter-dark a.box:active{box-shadow:inset 0 1px 2px rgba(10,10,10,0.2),0 0 0 1px #1abc9c}html.theme--documenter-dark .button{background-color:#282f2f;border-color:#4c5759;border-width:1px;color:#375a7f;cursor:pointer;justify-content:center;padding-bottom:calc(0.5em - 1px);padding-left:1em;padding-right:1em;padding-top:calc(0.5em - 1px);text-align:center;white-space:nowrap}html.theme--documenter-dark .button strong{color:inherit}html.theme--documenter-dark .button .icon,html.theme--documenter-dark .button .icon.is-small,html.theme--documenter-dark .button #documenter .docs-sidebar form.docs-search>input.icon,html.theme--documenter-dark #documenter .docs-sidebar .button form.docs-search>input.icon,html.theme--documenter-dark .button .icon.is-medium,html.theme--documenter-dark .button .icon.is-large{height:1.5em;width:1.5em}html.theme--documenter-dark .button .icon:first-child:not(:last-child){margin-left:calc(-0.5em - 1px);margin-right:.25em}html.theme--documenter-dark .button .icon:last-child:not(:first-child){margin-left:.25em;margin-right:calc(-0.5em - 1px)}html.theme--documenter-dark .button .icon:first-child:last-child{margin-left:calc(-0.5em - 1px);margin-right:calc(-0.5em - 1px)}html.theme--documenter-dark .button:hover,html.theme--documenter-dark .button.is-hovered{border-color:#8c9b9d;color:#f2f2f2}html.theme--documenter-dark .button:focus,html.theme--documenter-dark .button.is-focused{border-color:#8c9b9d;color:#17a689}html.theme--documenter-dark .button:focus:not(:active),html.theme--documenter-dark .button.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(26,188,156,0.25)}html.theme--documenter-dark .button:active,html.theme--documenter-dark .button.is-active{border-color:#343c3d;color:#f2f2f2}html.theme--documenter-dark .button.is-text{background-color:transparent;border-color:transparent;color:#fff;text-decoration:underline}html.theme--documenter-dark .button.is-text:hover,html.theme--documenter-dark .button.is-text.is-hovered,html.theme--documenter-dark .button.is-text:focus,html.theme--documenter-dark .button.is-text.is-focused{background-color:#282f2f;color:#f2f2f2}html.theme--documenter-dark .button.is-text:active,html.theme--documenter-dark .button.is-text.is-active{background-color:#1d2122;color:#f2f2f2}html.theme--documenter-dark .button.is-text[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-text{background-color:transparent;border-color:transparent;box-shadow:none}html.theme--documenter-dark .button.is-ghost{background:none;border-color:rgba(0,0,0,0);color:#1abc9c;text-decoration:none}html.theme--documenter-dark .button.is-ghost:hover,html.theme--documenter-dark .button.is-ghost.is-hovered{color:#1abc9c;text-decoration:underline}html.theme--documenter-dark .button.is-white{background-color:#fff;border-color:transparent;color:#0a0a0a}html.theme--documenter-dark .button.is-white:hover,html.theme--documenter-dark .button.is-white.is-hovered{background-color:#f9f9f9;border-color:transparent;color:#0a0a0a}html.theme--documenter-dark .button.is-white:focus,html.theme--documenter-dark .button.is-white.is-focused{border-color:transparent;color:#0a0a0a}html.theme--documenter-dark .button.is-white:focus:not(:active),html.theme--documenter-dark .button.is-white.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(255,255,255,0.25)}html.theme--documenter-dark .button.is-white:active,html.theme--documenter-dark .button.is-white.is-active{background-color:#f2f2f2;border-color:transparent;color:#0a0a0a}html.theme--documenter-dark .button.is-white[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-white{background-color:#fff;border-color:#fff;box-shadow:none}html.theme--documenter-dark .button.is-white.is-inverted{background-color:#0a0a0a;color:#fff}html.theme--documenter-dark .button.is-white.is-inverted:hover,html.theme--documenter-dark .button.is-white.is-inverted.is-hovered{background-color:#000}html.theme--documenter-dark .button.is-white.is-inverted[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-white.is-inverted{background-color:#0a0a0a;border-color:transparent;box-shadow:none;color:#fff}html.theme--documenter-dark .button.is-white.is-loading::after{border-color:transparent transparent #0a0a0a #0a0a0a !important}html.theme--documenter-dark .button.is-white.is-outlined{background-color:transparent;border-color:#fff;color:#fff}html.theme--documenter-dark .button.is-white.is-outlined:hover,html.theme--documenter-dark .button.is-white.is-outlined.is-hovered,html.theme--documenter-dark .button.is-white.is-outlined:focus,html.theme--documenter-dark .button.is-white.is-outlined.is-focused{background-color:#fff;border-color:#fff;color:#0a0a0a}html.theme--documenter-dark .button.is-white.is-outlined.is-loading::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-white.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-white.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-white.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-white.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #0a0a0a #0a0a0a !important}html.theme--documenter-dark .button.is-white.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-white.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}html.theme--documenter-dark .button.is-white.is-inverted.is-outlined{background-color:transparent;border-color:#0a0a0a;color:#0a0a0a}html.theme--documenter-dark .button.is-white.is-inverted.is-outlined:hover,html.theme--documenter-dark .button.is-white.is-inverted.is-outlined.is-hovered,html.theme--documenter-dark .button.is-white.is-inverted.is-outlined:focus,html.theme--documenter-dark .button.is-white.is-inverted.is-outlined.is-focused{background-color:#0a0a0a;color:#fff}html.theme--documenter-dark .button.is-white.is-inverted.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-white.is-inverted.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-white.is-inverted.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-white.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-white.is-inverted.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-white.is-inverted.is-outlined{background-color:transparent;border-color:#0a0a0a;box-shadow:none;color:#0a0a0a}html.theme--documenter-dark .button.is-black{background-color:#0a0a0a;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-black:hover,html.theme--documenter-dark .button.is-black.is-hovered{background-color:#040404;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-black:focus,html.theme--documenter-dark .button.is-black.is-focused{border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-black:focus:not(:active),html.theme--documenter-dark .button.is-black.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(10,10,10,0.25)}html.theme--documenter-dark .button.is-black:active,html.theme--documenter-dark .button.is-black.is-active{background-color:#000;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-black[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-black{background-color:#0a0a0a;border-color:#0a0a0a;box-shadow:none}html.theme--documenter-dark .button.is-black.is-inverted{background-color:#fff;color:#0a0a0a}html.theme--documenter-dark .button.is-black.is-inverted:hover,html.theme--documenter-dark .button.is-black.is-inverted.is-hovered{background-color:#f2f2f2}html.theme--documenter-dark .button.is-black.is-inverted[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-black.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#0a0a0a}html.theme--documenter-dark .button.is-black.is-loading::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-black.is-outlined{background-color:transparent;border-color:#0a0a0a;color:#0a0a0a}html.theme--documenter-dark .button.is-black.is-outlined:hover,html.theme--documenter-dark .button.is-black.is-outlined.is-hovered,html.theme--documenter-dark .button.is-black.is-outlined:focus,html.theme--documenter-dark .button.is-black.is-outlined.is-focused{background-color:#0a0a0a;border-color:#0a0a0a;color:#fff}html.theme--documenter-dark .button.is-black.is-outlined.is-loading::after{border-color:transparent transparent #0a0a0a #0a0a0a !important}html.theme--documenter-dark .button.is-black.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-black.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-black.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-black.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-black.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-black.is-outlined{background-color:transparent;border-color:#0a0a0a;box-shadow:none;color:#0a0a0a}html.theme--documenter-dark .button.is-black.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}html.theme--documenter-dark .button.is-black.is-inverted.is-outlined:hover,html.theme--documenter-dark .button.is-black.is-inverted.is-outlined.is-hovered,html.theme--documenter-dark .button.is-black.is-inverted.is-outlined:focus,html.theme--documenter-dark .button.is-black.is-inverted.is-outlined.is-focused{background-color:#fff;color:#0a0a0a}html.theme--documenter-dark .button.is-black.is-inverted.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-black.is-inverted.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-black.is-inverted.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-black.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #0a0a0a #0a0a0a !important}html.theme--documenter-dark .button.is-black.is-inverted.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-black.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}html.theme--documenter-dark .button.is-light{background-color:#ecf0f1;border-color:transparent;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .button.is-light:hover,html.theme--documenter-dark .button.is-light.is-hovered{background-color:#e5eaec;border-color:transparent;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .button.is-light:focus,html.theme--documenter-dark .button.is-light.is-focused{border-color:transparent;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .button.is-light:focus:not(:active),html.theme--documenter-dark .button.is-light.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(236,240,241,0.25)}html.theme--documenter-dark .button.is-light:active,html.theme--documenter-dark .button.is-light.is-active{background-color:#dde4e6;border-color:transparent;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .button.is-light[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-light{background-color:#ecf0f1;border-color:#ecf0f1;box-shadow:none}html.theme--documenter-dark .button.is-light.is-inverted{background-color:rgba(0,0,0,0.7);color:#ecf0f1}html.theme--documenter-dark .button.is-light.is-inverted:hover,html.theme--documenter-dark .button.is-light.is-inverted.is-hovered{background-color:rgba(0,0,0,0.7)}html.theme--documenter-dark .button.is-light.is-inverted[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-light.is-inverted{background-color:rgba(0,0,0,0.7);border-color:transparent;box-shadow:none;color:#ecf0f1}html.theme--documenter-dark .button.is-light.is-loading::after{border-color:transparent transparent rgba(0,0,0,0.7) rgba(0,0,0,0.7) !important}html.theme--documenter-dark .button.is-light.is-outlined{background-color:transparent;border-color:#ecf0f1;color:#ecf0f1}html.theme--documenter-dark .button.is-light.is-outlined:hover,html.theme--documenter-dark .button.is-light.is-outlined.is-hovered,html.theme--documenter-dark .button.is-light.is-outlined:focus,html.theme--documenter-dark .button.is-light.is-outlined.is-focused{background-color:#ecf0f1;border-color:#ecf0f1;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .button.is-light.is-outlined.is-loading::after{border-color:transparent transparent #ecf0f1 #ecf0f1 !important}html.theme--documenter-dark .button.is-light.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-light.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-light.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-light.is-outlined.is-loading.is-focused::after{border-color:transparent transparent rgba(0,0,0,0.7) rgba(0,0,0,0.7) !important}html.theme--documenter-dark .button.is-light.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-light.is-outlined{background-color:transparent;border-color:#ecf0f1;box-shadow:none;color:#ecf0f1}html.theme--documenter-dark .button.is-light.is-inverted.is-outlined{background-color:transparent;border-color:rgba(0,0,0,0.7);color:rgba(0,0,0,0.7)}html.theme--documenter-dark .button.is-light.is-inverted.is-outlined:hover,html.theme--documenter-dark .button.is-light.is-inverted.is-outlined.is-hovered,html.theme--documenter-dark .button.is-light.is-inverted.is-outlined:focus,html.theme--documenter-dark .button.is-light.is-inverted.is-outlined.is-focused{background-color:rgba(0,0,0,0.7);color:#ecf0f1}html.theme--documenter-dark .button.is-light.is-inverted.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-light.is-inverted.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-light.is-inverted.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-light.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #ecf0f1 #ecf0f1 !important}html.theme--documenter-dark .button.is-light.is-inverted.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-light.is-inverted.is-outlined{background-color:transparent;border-color:rgba(0,0,0,0.7);box-shadow:none;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .button.is-dark,html.theme--documenter-dark .content kbd.button{background-color:#282f2f;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-dark:hover,html.theme--documenter-dark .content kbd.button:hover,html.theme--documenter-dark .button.is-dark.is-hovered,html.theme--documenter-dark .content kbd.button.is-hovered{background-color:#232829;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-dark:focus,html.theme--documenter-dark .content kbd.button:focus,html.theme--documenter-dark .button.is-dark.is-focused,html.theme--documenter-dark .content kbd.button.is-focused{border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-dark:focus:not(:active),html.theme--documenter-dark .content kbd.button:focus:not(:active),html.theme--documenter-dark .button.is-dark.is-focused:not(:active),html.theme--documenter-dark .content kbd.button.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(40,47,47,0.25)}html.theme--documenter-dark .button.is-dark:active,html.theme--documenter-dark .content kbd.button:active,html.theme--documenter-dark .button.is-dark.is-active,html.theme--documenter-dark .content kbd.button.is-active{background-color:#1d2122;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-dark[disabled],html.theme--documenter-dark .content kbd.button[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-dark,fieldset[disabled] html.theme--documenter-dark .content kbd.button{background-color:#282f2f;border-color:#282f2f;box-shadow:none}html.theme--documenter-dark .button.is-dark.is-inverted,html.theme--documenter-dark .content kbd.button.is-inverted{background-color:#fff;color:#282f2f}html.theme--documenter-dark .button.is-dark.is-inverted:hover,html.theme--documenter-dark .content kbd.button.is-inverted:hover,html.theme--documenter-dark .button.is-dark.is-inverted.is-hovered,html.theme--documenter-dark .content kbd.button.is-inverted.is-hovered{background-color:#f2f2f2}html.theme--documenter-dark .button.is-dark.is-inverted[disabled],html.theme--documenter-dark .content kbd.button.is-inverted[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-dark.is-inverted,fieldset[disabled] html.theme--documenter-dark .content kbd.button.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#282f2f}html.theme--documenter-dark .button.is-dark.is-loading::after,html.theme--documenter-dark .content kbd.button.is-loading::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-dark.is-outlined,html.theme--documenter-dark .content kbd.button.is-outlined{background-color:transparent;border-color:#282f2f;color:#282f2f}html.theme--documenter-dark .button.is-dark.is-outlined:hover,html.theme--documenter-dark .content kbd.button.is-outlined:hover,html.theme--documenter-dark .button.is-dark.is-outlined.is-hovered,html.theme--documenter-dark .content kbd.button.is-outlined.is-hovered,html.theme--documenter-dark .button.is-dark.is-outlined:focus,html.theme--documenter-dark .content kbd.button.is-outlined:focus,html.theme--documenter-dark .button.is-dark.is-outlined.is-focused,html.theme--documenter-dark .content kbd.button.is-outlined.is-focused{background-color:#282f2f;border-color:#282f2f;color:#fff}html.theme--documenter-dark .button.is-dark.is-outlined.is-loading::after,html.theme--documenter-dark .content kbd.button.is-outlined.is-loading::after{border-color:transparent transparent #282f2f #282f2f !important}html.theme--documenter-dark .button.is-dark.is-outlined.is-loading:hover::after,html.theme--documenter-dark .content kbd.button.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-dark.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .content kbd.button.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-dark.is-outlined.is-loading:focus::after,html.theme--documenter-dark .content kbd.button.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-dark.is-outlined.is-loading.is-focused::after,html.theme--documenter-dark .content kbd.button.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-dark.is-outlined[disabled],html.theme--documenter-dark .content kbd.button.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-dark.is-outlined,fieldset[disabled] html.theme--documenter-dark .content kbd.button.is-outlined{background-color:transparent;border-color:#282f2f;box-shadow:none;color:#282f2f}html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined,html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined:hover,html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined:hover,html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined.is-hovered,html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined.is-hovered,html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined:focus,html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined:focus,html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined.is-focused,html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined.is-focused{background-color:#fff;color:#282f2f}html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined.is-loading:hover::after,html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined.is-loading:focus::after,html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined.is-loading.is-focused::after,html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #282f2f #282f2f !important}html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined[disabled],html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined,fieldset[disabled] html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}html.theme--documenter-dark .button.is-primary,html.theme--documenter-dark .docstring>section>a.button.docs-sourcelink{background-color:#375a7f;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-primary:hover,html.theme--documenter-dark .docstring>section>a.button.docs-sourcelink:hover,html.theme--documenter-dark .button.is-primary.is-hovered,html.theme--documenter-dark .docstring>section>a.button.is-hovered.docs-sourcelink{background-color:#335476;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-primary:focus,html.theme--documenter-dark .docstring>section>a.button.docs-sourcelink:focus,html.theme--documenter-dark .button.is-primary.is-focused,html.theme--documenter-dark .docstring>section>a.button.is-focused.docs-sourcelink{border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-primary:focus:not(:active),html.theme--documenter-dark .docstring>section>a.button.docs-sourcelink:focus:not(:active),html.theme--documenter-dark .button.is-primary.is-focused:not(:active),html.theme--documenter-dark .docstring>section>a.button.is-focused.docs-sourcelink:not(:active){box-shadow:0 0 0 0.125em rgba(55,90,127,0.25)}html.theme--documenter-dark .button.is-primary:active,html.theme--documenter-dark .docstring>section>a.button.docs-sourcelink:active,html.theme--documenter-dark .button.is-primary.is-active,html.theme--documenter-dark .docstring>section>a.button.is-active.docs-sourcelink{background-color:#2f4d6d;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-primary[disabled],html.theme--documenter-dark .docstring>section>a.button.docs-sourcelink[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-primary,fieldset[disabled] html.theme--documenter-dark .docstring>section>a.button.docs-sourcelink{background-color:#375a7f;border-color:#375a7f;box-shadow:none}html.theme--documenter-dark .button.is-primary.is-inverted,html.theme--documenter-dark .docstring>section>a.button.is-inverted.docs-sourcelink{background-color:#fff;color:#375a7f}html.theme--documenter-dark .button.is-primary.is-inverted:hover,html.theme--documenter-dark .docstring>section>a.button.is-inverted.docs-sourcelink:hover,html.theme--documenter-dark .button.is-primary.is-inverted.is-hovered,html.theme--documenter-dark .docstring>section>a.button.is-inverted.is-hovered.docs-sourcelink{background-color:#f2f2f2}html.theme--documenter-dark .button.is-primary.is-inverted[disabled],html.theme--documenter-dark .docstring>section>a.button.is-inverted.docs-sourcelink[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-primary.is-inverted,fieldset[disabled] html.theme--documenter-dark .docstring>section>a.button.is-inverted.docs-sourcelink{background-color:#fff;border-color:transparent;box-shadow:none;color:#375a7f}html.theme--documenter-dark .button.is-primary.is-loading::after,html.theme--documenter-dark .docstring>section>a.button.is-loading.docs-sourcelink::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-primary.is-outlined,html.theme--documenter-dark .docstring>section>a.button.is-outlined.docs-sourcelink{background-color:transparent;border-color:#375a7f;color:#375a7f}html.theme--documenter-dark .button.is-primary.is-outlined:hover,html.theme--documenter-dark .docstring>section>a.button.is-outlined.docs-sourcelink:hover,html.theme--documenter-dark .button.is-primary.is-outlined.is-hovered,html.theme--documenter-dark .docstring>section>a.button.is-outlined.is-hovered.docs-sourcelink,html.theme--documenter-dark .button.is-primary.is-outlined:focus,html.theme--documenter-dark .docstring>section>a.button.is-outlined.docs-sourcelink:focus,html.theme--documenter-dark .button.is-primary.is-outlined.is-focused,html.theme--documenter-dark .docstring>section>a.button.is-outlined.is-focused.docs-sourcelink{background-color:#375a7f;border-color:#375a7f;color:#fff}html.theme--documenter-dark .button.is-primary.is-outlined.is-loading::after,html.theme--documenter-dark .docstring>section>a.button.is-outlined.is-loading.docs-sourcelink::after{border-color:transparent transparent #375a7f #375a7f !important}html.theme--documenter-dark .button.is-primary.is-outlined.is-loading:hover::after,html.theme--documenter-dark .docstring>section>a.button.is-outlined.is-loading.docs-sourcelink:hover::after,html.theme--documenter-dark .button.is-primary.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .docstring>section>a.button.is-outlined.is-loading.is-hovered.docs-sourcelink::after,html.theme--documenter-dark .button.is-primary.is-outlined.is-loading:focus::after,html.theme--documenter-dark .docstring>section>a.button.is-outlined.is-loading.docs-sourcelink:focus::after,html.theme--documenter-dark .button.is-primary.is-outlined.is-loading.is-focused::after,html.theme--documenter-dark .docstring>section>a.button.is-outlined.is-loading.is-focused.docs-sourcelink::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-primary.is-outlined[disabled],html.theme--documenter-dark .docstring>section>a.button.is-outlined.docs-sourcelink[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-primary.is-outlined,fieldset[disabled] html.theme--documenter-dark .docstring>section>a.button.is-outlined.docs-sourcelink{background-color:transparent;border-color:#375a7f;box-shadow:none;color:#375a7f}html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined,html.theme--documenter-dark .docstring>section>a.button.is-inverted.is-outlined.docs-sourcelink{background-color:transparent;border-color:#fff;color:#fff}html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined:hover,html.theme--documenter-dark .docstring>section>a.button.is-inverted.is-outlined.docs-sourcelink:hover,html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined.is-hovered,html.theme--documenter-dark .docstring>section>a.button.is-inverted.is-outlined.is-hovered.docs-sourcelink,html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined:focus,html.theme--documenter-dark .docstring>section>a.button.is-inverted.is-outlined.docs-sourcelink:focus,html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined.is-focused,html.theme--documenter-dark .docstring>section>a.button.is-inverted.is-outlined.is-focused.docs-sourcelink{background-color:#fff;color:#375a7f}html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined.is-loading:hover::after,html.theme--documenter-dark .docstring>section>a.button.is-inverted.is-outlined.is-loading.docs-sourcelink:hover::after,html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .docstring>section>a.button.is-inverted.is-outlined.is-loading.is-hovered.docs-sourcelink::after,html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined.is-loading:focus::after,html.theme--documenter-dark .docstring>section>a.button.is-inverted.is-outlined.is-loading.docs-sourcelink:focus::after,html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined.is-loading.is-focused::after,html.theme--documenter-dark .docstring>section>a.button.is-inverted.is-outlined.is-loading.is-focused.docs-sourcelink::after{border-color:transparent transparent #375a7f #375a7f !important}html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined[disabled],html.theme--documenter-dark .docstring>section>a.button.is-inverted.is-outlined.docs-sourcelink[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined,fieldset[disabled] html.theme--documenter-dark .docstring>section>a.button.is-inverted.is-outlined.docs-sourcelink{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}html.theme--documenter-dark .button.is-primary.is-light,html.theme--documenter-dark .docstring>section>a.button.is-light.docs-sourcelink{background-color:#f1f5f9;color:#4d7eb2}html.theme--documenter-dark .button.is-primary.is-light:hover,html.theme--documenter-dark .docstring>section>a.button.is-light.docs-sourcelink:hover,html.theme--documenter-dark .button.is-primary.is-light.is-hovered,html.theme--documenter-dark .docstring>section>a.button.is-light.is-hovered.docs-sourcelink{background-color:#e8eef5;border-color:transparent;color:#4d7eb2}html.theme--documenter-dark .button.is-primary.is-light:active,html.theme--documenter-dark .docstring>section>a.button.is-light.docs-sourcelink:active,html.theme--documenter-dark .button.is-primary.is-light.is-active,html.theme--documenter-dark .docstring>section>a.button.is-light.is-active.docs-sourcelink{background-color:#dfe8f1;border-color:transparent;color:#4d7eb2}html.theme--documenter-dark .button.is-link{background-color:#1abc9c;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-link:hover,html.theme--documenter-dark .button.is-link.is-hovered{background-color:#18b193;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-link:focus,html.theme--documenter-dark .button.is-link.is-focused{border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-link:focus:not(:active),html.theme--documenter-dark .button.is-link.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(26,188,156,0.25)}html.theme--documenter-dark .button.is-link:active,html.theme--documenter-dark .button.is-link.is-active{background-color:#17a689;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-link[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-link{background-color:#1abc9c;border-color:#1abc9c;box-shadow:none}html.theme--documenter-dark .button.is-link.is-inverted{background-color:#fff;color:#1abc9c}html.theme--documenter-dark .button.is-link.is-inverted:hover,html.theme--documenter-dark .button.is-link.is-inverted.is-hovered{background-color:#f2f2f2}html.theme--documenter-dark .button.is-link.is-inverted[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-link.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#1abc9c}html.theme--documenter-dark .button.is-link.is-loading::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-link.is-outlined{background-color:transparent;border-color:#1abc9c;color:#1abc9c}html.theme--documenter-dark .button.is-link.is-outlined:hover,html.theme--documenter-dark .button.is-link.is-outlined.is-hovered,html.theme--documenter-dark .button.is-link.is-outlined:focus,html.theme--documenter-dark .button.is-link.is-outlined.is-focused{background-color:#1abc9c;border-color:#1abc9c;color:#fff}html.theme--documenter-dark .button.is-link.is-outlined.is-loading::after{border-color:transparent transparent #1abc9c #1abc9c !important}html.theme--documenter-dark .button.is-link.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-link.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-link.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-link.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-link.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-link.is-outlined{background-color:transparent;border-color:#1abc9c;box-shadow:none;color:#1abc9c}html.theme--documenter-dark .button.is-link.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}html.theme--documenter-dark .button.is-link.is-inverted.is-outlined:hover,html.theme--documenter-dark .button.is-link.is-inverted.is-outlined.is-hovered,html.theme--documenter-dark .button.is-link.is-inverted.is-outlined:focus,html.theme--documenter-dark .button.is-link.is-inverted.is-outlined.is-focused{background-color:#fff;color:#1abc9c}html.theme--documenter-dark .button.is-link.is-inverted.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-link.is-inverted.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-link.is-inverted.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-link.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #1abc9c #1abc9c !important}html.theme--documenter-dark .button.is-link.is-inverted.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-link.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}html.theme--documenter-dark .button.is-link.is-light{background-color:#edfdf9;color:#15987e}html.theme--documenter-dark .button.is-link.is-light:hover,html.theme--documenter-dark .button.is-link.is-light.is-hovered{background-color:#e2fbf6;border-color:transparent;color:#15987e}html.theme--documenter-dark .button.is-link.is-light:active,html.theme--documenter-dark .button.is-link.is-light.is-active{background-color:#d7f9f3;border-color:transparent;color:#15987e}html.theme--documenter-dark .button.is-info{background-color:#024c7d;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-info:hover,html.theme--documenter-dark .button.is-info.is-hovered{background-color:#024470;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-info:focus,html.theme--documenter-dark .button.is-info.is-focused{border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-info:focus:not(:active),html.theme--documenter-dark .button.is-info.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(2,76,125,0.25)}html.theme--documenter-dark .button.is-info:active,html.theme--documenter-dark .button.is-info.is-active{background-color:#023d64;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-info[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-info{background-color:#024c7d;border-color:#024c7d;box-shadow:none}html.theme--documenter-dark .button.is-info.is-inverted{background-color:#fff;color:#024c7d}html.theme--documenter-dark .button.is-info.is-inverted:hover,html.theme--documenter-dark .button.is-info.is-inverted.is-hovered{background-color:#f2f2f2}html.theme--documenter-dark .button.is-info.is-inverted[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-info.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#024c7d}html.theme--documenter-dark .button.is-info.is-loading::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-info.is-outlined{background-color:transparent;border-color:#024c7d;color:#024c7d}html.theme--documenter-dark .button.is-info.is-outlined:hover,html.theme--documenter-dark .button.is-info.is-outlined.is-hovered,html.theme--documenter-dark .button.is-info.is-outlined:focus,html.theme--documenter-dark .button.is-info.is-outlined.is-focused{background-color:#024c7d;border-color:#024c7d;color:#fff}html.theme--documenter-dark .button.is-info.is-outlined.is-loading::after{border-color:transparent transparent #024c7d #024c7d !important}html.theme--documenter-dark .button.is-info.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-info.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-info.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-info.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-info.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-info.is-outlined{background-color:transparent;border-color:#024c7d;box-shadow:none;color:#024c7d}html.theme--documenter-dark .button.is-info.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}html.theme--documenter-dark .button.is-info.is-inverted.is-outlined:hover,html.theme--documenter-dark .button.is-info.is-inverted.is-outlined.is-hovered,html.theme--documenter-dark .button.is-info.is-inverted.is-outlined:focus,html.theme--documenter-dark .button.is-info.is-inverted.is-outlined.is-focused{background-color:#fff;color:#024c7d}html.theme--documenter-dark .button.is-info.is-inverted.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-info.is-inverted.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-info.is-inverted.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-info.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #024c7d #024c7d !important}html.theme--documenter-dark .button.is-info.is-inverted.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-info.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}html.theme--documenter-dark .button.is-info.is-light{background-color:#ebf7ff;color:#0e9dfb}html.theme--documenter-dark .button.is-info.is-light:hover,html.theme--documenter-dark .button.is-info.is-light.is-hovered{background-color:#def2fe;border-color:transparent;color:#0e9dfb}html.theme--documenter-dark .button.is-info.is-light:active,html.theme--documenter-dark .button.is-info.is-light.is-active{background-color:#d2edfe;border-color:transparent;color:#0e9dfb}html.theme--documenter-dark .button.is-success{background-color:#008438;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-success:hover,html.theme--documenter-dark .button.is-success.is-hovered{background-color:#073;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-success:focus,html.theme--documenter-dark .button.is-success.is-focused{border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-success:focus:not(:active),html.theme--documenter-dark .button.is-success.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(0,132,56,0.25)}html.theme--documenter-dark .button.is-success:active,html.theme--documenter-dark .button.is-success.is-active{background-color:#006b2d;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-success[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-success{background-color:#008438;border-color:#008438;box-shadow:none}html.theme--documenter-dark .button.is-success.is-inverted{background-color:#fff;color:#008438}html.theme--documenter-dark .button.is-success.is-inverted:hover,html.theme--documenter-dark .button.is-success.is-inverted.is-hovered{background-color:#f2f2f2}html.theme--documenter-dark .button.is-success.is-inverted[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-success.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#008438}html.theme--documenter-dark .button.is-success.is-loading::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-success.is-outlined{background-color:transparent;border-color:#008438;color:#008438}html.theme--documenter-dark .button.is-success.is-outlined:hover,html.theme--documenter-dark .button.is-success.is-outlined.is-hovered,html.theme--documenter-dark .button.is-success.is-outlined:focus,html.theme--documenter-dark .button.is-success.is-outlined.is-focused{background-color:#008438;border-color:#008438;color:#fff}html.theme--documenter-dark .button.is-success.is-outlined.is-loading::after{border-color:transparent transparent #008438 #008438 !important}html.theme--documenter-dark .button.is-success.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-success.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-success.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-success.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-success.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-success.is-outlined{background-color:transparent;border-color:#008438;box-shadow:none;color:#008438}html.theme--documenter-dark .button.is-success.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}html.theme--documenter-dark .button.is-success.is-inverted.is-outlined:hover,html.theme--documenter-dark .button.is-success.is-inverted.is-outlined.is-hovered,html.theme--documenter-dark .button.is-success.is-inverted.is-outlined:focus,html.theme--documenter-dark .button.is-success.is-inverted.is-outlined.is-focused{background-color:#fff;color:#008438}html.theme--documenter-dark .button.is-success.is-inverted.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-success.is-inverted.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-success.is-inverted.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-success.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #008438 #008438 !important}html.theme--documenter-dark .button.is-success.is-inverted.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-success.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}html.theme--documenter-dark .button.is-success.is-light{background-color:#ebfff3;color:#00eb64}html.theme--documenter-dark .button.is-success.is-light:hover,html.theme--documenter-dark .button.is-success.is-light.is-hovered{background-color:#deffec;border-color:transparent;color:#00eb64}html.theme--documenter-dark .button.is-success.is-light:active,html.theme--documenter-dark .button.is-success.is-light.is-active{background-color:#d1ffe5;border-color:transparent;color:#00eb64}html.theme--documenter-dark .button.is-warning{background-color:#ad8100;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-warning:hover,html.theme--documenter-dark .button.is-warning.is-hovered{background-color:#a07700;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-warning:focus,html.theme--documenter-dark .button.is-warning.is-focused{border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-warning:focus:not(:active),html.theme--documenter-dark .button.is-warning.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(173,129,0,0.25)}html.theme--documenter-dark .button.is-warning:active,html.theme--documenter-dark .button.is-warning.is-active{background-color:#946e00;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-warning[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-warning{background-color:#ad8100;border-color:#ad8100;box-shadow:none}html.theme--documenter-dark .button.is-warning.is-inverted{background-color:#fff;color:#ad8100}html.theme--documenter-dark .button.is-warning.is-inverted:hover,html.theme--documenter-dark .button.is-warning.is-inverted.is-hovered{background-color:#f2f2f2}html.theme--documenter-dark .button.is-warning.is-inverted[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-warning.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#ad8100}html.theme--documenter-dark .button.is-warning.is-loading::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-warning.is-outlined{background-color:transparent;border-color:#ad8100;color:#ad8100}html.theme--documenter-dark .button.is-warning.is-outlined:hover,html.theme--documenter-dark .button.is-warning.is-outlined.is-hovered,html.theme--documenter-dark .button.is-warning.is-outlined:focus,html.theme--documenter-dark .button.is-warning.is-outlined.is-focused{background-color:#ad8100;border-color:#ad8100;color:#fff}html.theme--documenter-dark .button.is-warning.is-outlined.is-loading::after{border-color:transparent transparent #ad8100 #ad8100 !important}html.theme--documenter-dark .button.is-warning.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-warning.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-warning.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-warning.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-warning.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-warning.is-outlined{background-color:transparent;border-color:#ad8100;box-shadow:none;color:#ad8100}html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined:hover,html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined.is-hovered,html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined:focus,html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined.is-focused{background-color:#fff;color:#ad8100}html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #ad8100 #ad8100 !important}html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}html.theme--documenter-dark .button.is-warning.is-light{background-color:#fffaeb;color:#d19c00}html.theme--documenter-dark .button.is-warning.is-light:hover,html.theme--documenter-dark .button.is-warning.is-light.is-hovered{background-color:#fff7de;border-color:transparent;color:#d19c00}html.theme--documenter-dark .button.is-warning.is-light:active,html.theme--documenter-dark .button.is-warning.is-light.is-active{background-color:#fff3d1;border-color:transparent;color:#d19c00}html.theme--documenter-dark .button.is-danger{background-color:#9e1b0d;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-danger:hover,html.theme--documenter-dark .button.is-danger.is-hovered{background-color:#92190c;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-danger:focus,html.theme--documenter-dark .button.is-danger.is-focused{border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-danger:focus:not(:active),html.theme--documenter-dark .button.is-danger.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(158,27,13,0.25)}html.theme--documenter-dark .button.is-danger:active,html.theme--documenter-dark .button.is-danger.is-active{background-color:#86170b;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-danger[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-danger{background-color:#9e1b0d;border-color:#9e1b0d;box-shadow:none}html.theme--documenter-dark .button.is-danger.is-inverted{background-color:#fff;color:#9e1b0d}html.theme--documenter-dark .button.is-danger.is-inverted:hover,html.theme--documenter-dark .button.is-danger.is-inverted.is-hovered{background-color:#f2f2f2}html.theme--documenter-dark .button.is-danger.is-inverted[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-danger.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#9e1b0d}html.theme--documenter-dark .button.is-danger.is-loading::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-danger.is-outlined{background-color:transparent;border-color:#9e1b0d;color:#9e1b0d}html.theme--documenter-dark .button.is-danger.is-outlined:hover,html.theme--documenter-dark .button.is-danger.is-outlined.is-hovered,html.theme--documenter-dark .button.is-danger.is-outlined:focus,html.theme--documenter-dark .button.is-danger.is-outlined.is-focused{background-color:#9e1b0d;border-color:#9e1b0d;color:#fff}html.theme--documenter-dark .button.is-danger.is-outlined.is-loading::after{border-color:transparent transparent #9e1b0d #9e1b0d !important}html.theme--documenter-dark .button.is-danger.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-danger.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-danger.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-danger.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-danger.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-danger.is-outlined{background-color:transparent;border-color:#9e1b0d;box-shadow:none;color:#9e1b0d}html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined:hover,html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined.is-hovered,html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined:focus,html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined.is-focused{background-color:#fff;color:#9e1b0d}html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #9e1b0d #9e1b0d !important}html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}html.theme--documenter-dark .button.is-danger.is-light{background-color:#fdeeec;color:#ec311d}html.theme--documenter-dark .button.is-danger.is-light:hover,html.theme--documenter-dark .button.is-danger.is-light.is-hovered{background-color:#fce3e0;border-color:transparent;color:#ec311d}html.theme--documenter-dark .button.is-danger.is-light:active,html.theme--documenter-dark .button.is-danger.is-light.is-active{background-color:#fcd8d5;border-color:transparent;color:#ec311d}html.theme--documenter-dark .button.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.button{font-size:.75rem}html.theme--documenter-dark .button.is-small:not(.is-rounded),html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.button:not(.is-rounded){border-radius:3px}html.theme--documenter-dark .button.is-normal{font-size:1rem}html.theme--documenter-dark .button.is-medium{font-size:1.25rem}html.theme--documenter-dark .button.is-large{font-size:1.5rem}html.theme--documenter-dark .button[disabled],fieldset[disabled] html.theme--documenter-dark .button{background-color:#8c9b9d;border-color:#5e6d6f;box-shadow:none;opacity:.5}html.theme--documenter-dark .button.is-fullwidth{display:flex;width:100%}html.theme--documenter-dark .button.is-loading{color:transparent !important;pointer-events:none}html.theme--documenter-dark .button.is-loading::after{position:absolute;left:calc(50% - (1em * 0.5));top:calc(50% - (1em * 0.5));position:absolute !important}html.theme--documenter-dark .button.is-static{background-color:#282f2f;border-color:#5e6d6f;color:#dbdee0;box-shadow:none;pointer-events:none}html.theme--documenter-dark .button.is-rounded,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.button{border-radius:9999px;padding-left:calc(1em + 0.25em);padding-right:calc(1em + 0.25em)}html.theme--documenter-dark .buttons{align-items:center;display:flex;flex-wrap:wrap;justify-content:flex-start}html.theme--documenter-dark .buttons .button{margin-bottom:0.5rem}html.theme--documenter-dark .buttons .button:not(:last-child):not(.is-fullwidth){margin-right:.5rem}html.theme--documenter-dark .buttons:last-child{margin-bottom:-0.5rem}html.theme--documenter-dark .buttons:not(:last-child){margin-bottom:1rem}html.theme--documenter-dark .buttons.are-small .button:not(.is-normal):not(.is-medium):not(.is-large){font-size:.75rem}html.theme--documenter-dark .buttons.are-small .button:not(.is-normal):not(.is-medium):not(.is-large):not(.is-rounded){border-radius:3px}html.theme--documenter-dark .buttons.are-medium .button:not(.is-small):not(.is-normal):not(.is-large){font-size:1.25rem}html.theme--documenter-dark .buttons.are-large .button:not(.is-small):not(.is-normal):not(.is-medium){font-size:1.5rem}html.theme--documenter-dark .buttons.has-addons .button:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}html.theme--documenter-dark .buttons.has-addons .button:not(:last-child){border-bottom-right-radius:0;border-top-right-radius:0;margin-right:-1px}html.theme--documenter-dark .buttons.has-addons .button:last-child{margin-right:0}html.theme--documenter-dark .buttons.has-addons .button:hover,html.theme--documenter-dark .buttons.has-addons .button.is-hovered{z-index:2}html.theme--documenter-dark .buttons.has-addons .button:focus,html.theme--documenter-dark .buttons.has-addons .button.is-focused,html.theme--documenter-dark .buttons.has-addons .button:active,html.theme--documenter-dark .buttons.has-addons .button.is-active,html.theme--documenter-dark .buttons.has-addons .button.is-selected{z-index:3}html.theme--documenter-dark .buttons.has-addons .button:focus:hover,html.theme--documenter-dark .buttons.has-addons .button.is-focused:hover,html.theme--documenter-dark .buttons.has-addons .button:active:hover,html.theme--documenter-dark .buttons.has-addons .button.is-active:hover,html.theme--documenter-dark .buttons.has-addons .button.is-selected:hover{z-index:4}html.theme--documenter-dark .buttons.has-addons .button.is-expanded{flex-grow:1;flex-shrink:1}html.theme--documenter-dark .buttons.is-centered{justify-content:center}html.theme--documenter-dark .buttons.is-centered:not(.has-addons) .button:not(.is-fullwidth){margin-left:0.25rem;margin-right:0.25rem}html.theme--documenter-dark .buttons.is-right{justify-content:flex-end}html.theme--documenter-dark .buttons.is-right:not(.has-addons) .button:not(.is-fullwidth){margin-left:0.25rem;margin-right:0.25rem}@media screen and (max-width: 768px){html.theme--documenter-dark .button.is-responsive.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-responsive{font-size:.5625rem}html.theme--documenter-dark .button.is-responsive,html.theme--documenter-dark .button.is-responsive.is-normal{font-size:.65625rem}html.theme--documenter-dark .button.is-responsive.is-medium{font-size:.75rem}html.theme--documenter-dark .button.is-responsive.is-large{font-size:1rem}}@media screen and (min-width: 769px) and (max-width: 1055px){html.theme--documenter-dark .button.is-responsive.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-responsive{font-size:.65625rem}html.theme--documenter-dark .button.is-responsive,html.theme--documenter-dark .button.is-responsive.is-normal{font-size:.75rem}html.theme--documenter-dark .button.is-responsive.is-medium{font-size:1rem}html.theme--documenter-dark .button.is-responsive.is-large{font-size:1.25rem}}html.theme--documenter-dark .container{flex-grow:1;margin:0 auto;position:relative;width:auto}html.theme--documenter-dark .container.is-fluid{max-width:none !important;padding-left:32px;padding-right:32px;width:100%}@media screen and (min-width: 1056px){html.theme--documenter-dark .container{max-width:992px}}@media screen and (max-width: 1215px){html.theme--documenter-dark .container.is-widescreen:not(.is-max-desktop){max-width:1152px}}@media screen and (max-width: 1407px){html.theme--documenter-dark .container.is-fullhd:not(.is-max-desktop):not(.is-max-widescreen){max-width:1344px}}@media screen and (min-width: 1216px){html.theme--documenter-dark .container:not(.is-max-desktop){max-width:1152px}}@media screen and (min-width: 1408px){html.theme--documenter-dark .container:not(.is-max-desktop):not(.is-max-widescreen){max-width:1344px}}html.theme--documenter-dark .content li+li{margin-top:0.25em}html.theme--documenter-dark .content p:not(:last-child),html.theme--documenter-dark .content dl:not(:last-child),html.theme--documenter-dark .content ol:not(:last-child),html.theme--documenter-dark .content ul:not(:last-child),html.theme--documenter-dark .content blockquote:not(:last-child),html.theme--documenter-dark .content pre:not(:last-child),html.theme--documenter-dark .content table:not(:last-child){margin-bottom:1em}html.theme--documenter-dark .content h1,html.theme--documenter-dark .content h2,html.theme--documenter-dark .content h3,html.theme--documenter-dark .content h4,html.theme--documenter-dark .content h5,html.theme--documenter-dark .content h6{color:#f2f2f2;font-weight:600;line-height:1.125}html.theme--documenter-dark .content h1{font-size:2em;margin-bottom:0.5em}html.theme--documenter-dark .content h1:not(:first-child){margin-top:1em}html.theme--documenter-dark .content h2{font-size:1.75em;margin-bottom:0.5714em}html.theme--documenter-dark .content h2:not(:first-child){margin-top:1.1428em}html.theme--documenter-dark .content h3{font-size:1.5em;margin-bottom:0.6666em}html.theme--documenter-dark .content h3:not(:first-child){margin-top:1.3333em}html.theme--documenter-dark .content h4{font-size:1.25em;margin-bottom:0.8em}html.theme--documenter-dark .content h5{font-size:1.125em;margin-bottom:0.8888em}html.theme--documenter-dark .content h6{font-size:1em;margin-bottom:1em}html.theme--documenter-dark .content blockquote{background-color:#282f2f;border-left:5px solid #5e6d6f;padding:1.25em 1.5em}html.theme--documenter-dark .content ol{list-style-position:outside;margin-left:2em;margin-top:1em}html.theme--documenter-dark .content ol:not([type]){list-style-type:decimal}html.theme--documenter-dark .content ol.is-lower-alpha:not([type]){list-style-type:lower-alpha}html.theme--documenter-dark .content ol.is-lower-roman:not([type]){list-style-type:lower-roman}html.theme--documenter-dark .content ol.is-upper-alpha:not([type]){list-style-type:upper-alpha}html.theme--documenter-dark .content ol.is-upper-roman:not([type]){list-style-type:upper-roman}html.theme--documenter-dark .content ul{list-style:disc outside;margin-left:2em;margin-top:1em}html.theme--documenter-dark .content ul ul{list-style-type:circle;margin-top:0.5em}html.theme--documenter-dark .content ul ul ul{list-style-type:square}html.theme--documenter-dark .content dd{margin-left:2em}html.theme--documenter-dark .content figure{margin-left:2em;margin-right:2em;text-align:center}html.theme--documenter-dark .content figure:not(:first-child){margin-top:2em}html.theme--documenter-dark .content figure:not(:last-child){margin-bottom:2em}html.theme--documenter-dark .content figure img{display:inline-block}html.theme--documenter-dark .content figure figcaption{font-style:italic}html.theme--documenter-dark .content pre{-webkit-overflow-scrolling:touch;overflow-x:auto;padding:0;white-space:pre;word-wrap:normal}html.theme--documenter-dark .content sup,html.theme--documenter-dark .content sub{font-size:75%}html.theme--documenter-dark .content table{width:100%}html.theme--documenter-dark .content table td,html.theme--documenter-dark .content table th{border:1px solid #5e6d6f;border-width:0 0 1px;padding:0.5em 0.75em;vertical-align:top}html.theme--documenter-dark .content table th{color:#f2f2f2}html.theme--documenter-dark .content table th:not([align]){text-align:inherit}html.theme--documenter-dark .content table thead td,html.theme--documenter-dark .content table thead th{border-width:0 0 2px;color:#f2f2f2}html.theme--documenter-dark .content table tfoot td,html.theme--documenter-dark .content table tfoot th{border-width:2px 0 0;color:#f2f2f2}html.theme--documenter-dark .content table tbody tr:last-child td,html.theme--documenter-dark .content table tbody tr:last-child th{border-bottom-width:0}html.theme--documenter-dark .content .tabs li+li{margin-top:0}html.theme--documenter-dark .content.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.content{font-size:.75rem}html.theme--documenter-dark .content.is-normal{font-size:1rem}html.theme--documenter-dark .content.is-medium{font-size:1.25rem}html.theme--documenter-dark .content.is-large{font-size:1.5rem}html.theme--documenter-dark .icon{align-items:center;display:inline-flex;justify-content:center;height:1.5rem;width:1.5rem}html.theme--documenter-dark .icon.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.icon{height:1rem;width:1rem}html.theme--documenter-dark .icon.is-medium{height:2rem;width:2rem}html.theme--documenter-dark .icon.is-large{height:3rem;width:3rem}html.theme--documenter-dark .icon-text{align-items:flex-start;color:inherit;display:inline-flex;flex-wrap:wrap;line-height:1.5rem;vertical-align:top}html.theme--documenter-dark .icon-text .icon{flex-grow:0;flex-shrink:0}html.theme--documenter-dark .icon-text .icon:not(:last-child){margin-right:.25em}html.theme--documenter-dark .icon-text .icon:not(:first-child){margin-left:.25em}html.theme--documenter-dark div.icon-text{display:flex}html.theme--documenter-dark .image,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img{display:block;position:relative}html.theme--documenter-dark .image img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img img{display:block;height:auto;width:100%}html.theme--documenter-dark .image img.is-rounded,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img img.is-rounded{border-radius:9999px}html.theme--documenter-dark .image.is-fullwidth,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-fullwidth{width:100%}html.theme--documenter-dark .image.is-square img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-square img,html.theme--documenter-dark .image.is-square .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-square .has-ratio,html.theme--documenter-dark .image.is-1by1 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by1 img,html.theme--documenter-dark .image.is-1by1 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by1 .has-ratio,html.theme--documenter-dark .image.is-5by4 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-5by4 img,html.theme--documenter-dark .image.is-5by4 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-5by4 .has-ratio,html.theme--documenter-dark .image.is-4by3 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-4by3 img,html.theme--documenter-dark .image.is-4by3 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-4by3 .has-ratio,html.theme--documenter-dark .image.is-3by2 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by2 img,html.theme--documenter-dark .image.is-3by2 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by2 .has-ratio,html.theme--documenter-dark .image.is-5by3 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-5by3 img,html.theme--documenter-dark .image.is-5by3 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-5by3 .has-ratio,html.theme--documenter-dark .image.is-16by9 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-16by9 img,html.theme--documenter-dark .image.is-16by9 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-16by9 .has-ratio,html.theme--documenter-dark .image.is-2by1 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-2by1 img,html.theme--documenter-dark .image.is-2by1 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-2by1 .has-ratio,html.theme--documenter-dark .image.is-3by1 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by1 img,html.theme--documenter-dark .image.is-3by1 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by1 .has-ratio,html.theme--documenter-dark .image.is-4by5 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-4by5 img,html.theme--documenter-dark .image.is-4by5 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-4by5 .has-ratio,html.theme--documenter-dark .image.is-3by4 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by4 img,html.theme--documenter-dark .image.is-3by4 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by4 .has-ratio,html.theme--documenter-dark .image.is-2by3 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-2by3 img,html.theme--documenter-dark .image.is-2by3 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-2by3 .has-ratio,html.theme--documenter-dark .image.is-3by5 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by5 img,html.theme--documenter-dark .image.is-3by5 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by5 .has-ratio,html.theme--documenter-dark .image.is-9by16 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-9by16 img,html.theme--documenter-dark .image.is-9by16 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-9by16 .has-ratio,html.theme--documenter-dark .image.is-1by2 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by2 img,html.theme--documenter-dark .image.is-1by2 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by2 .has-ratio,html.theme--documenter-dark .image.is-1by3 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by3 img,html.theme--documenter-dark .image.is-1by3 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by3 .has-ratio{height:100%;width:100%}html.theme--documenter-dark .image.is-square,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-square,html.theme--documenter-dark .image.is-1by1,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by1{padding-top:100%}html.theme--documenter-dark .image.is-5by4,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-5by4{padding-top:80%}html.theme--documenter-dark .image.is-4by3,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-4by3{padding-top:75%}html.theme--documenter-dark .image.is-3by2,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by2{padding-top:66.6666%}html.theme--documenter-dark .image.is-5by3,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-5by3{padding-top:60%}html.theme--documenter-dark .image.is-16by9,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-16by9{padding-top:56.25%}html.theme--documenter-dark .image.is-2by1,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-2by1{padding-top:50%}html.theme--documenter-dark .image.is-3by1,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by1{padding-top:33.3333%}html.theme--documenter-dark .image.is-4by5,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-4by5{padding-top:125%}html.theme--documenter-dark .image.is-3by4,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by4{padding-top:133.3333%}html.theme--documenter-dark .image.is-2by3,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-2by3{padding-top:150%}html.theme--documenter-dark .image.is-3by5,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by5{padding-top:166.6666%}html.theme--documenter-dark .image.is-9by16,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-9by16{padding-top:177.7777%}html.theme--documenter-dark .image.is-1by2,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by2{padding-top:200%}html.theme--documenter-dark .image.is-1by3,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by3{padding-top:300%}html.theme--documenter-dark .image.is-16x16,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-16x16{height:16px;width:16px}html.theme--documenter-dark .image.is-24x24,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-24x24{height:24px;width:24px}html.theme--documenter-dark .image.is-32x32,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-32x32{height:32px;width:32px}html.theme--documenter-dark .image.is-48x48,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-48x48{height:48px;width:48px}html.theme--documenter-dark .image.is-64x64,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-64x64{height:64px;width:64px}html.theme--documenter-dark .image.is-96x96,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-96x96{height:96px;width:96px}html.theme--documenter-dark .image.is-128x128,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-128x128{height:128px;width:128px}html.theme--documenter-dark .notification{background-color:#282f2f;border-radius:.4em;position:relative;padding:1.25rem 2.5rem 1.25rem 1.5rem}html.theme--documenter-dark .notification a:not(.button):not(.dropdown-item){color:currentColor;text-decoration:underline}html.theme--documenter-dark .notification strong{color:currentColor}html.theme--documenter-dark .notification code,html.theme--documenter-dark .notification pre{background:#fff}html.theme--documenter-dark .notification pre code{background:transparent}html.theme--documenter-dark .notification>.delete{right:.5rem;position:absolute;top:0.5rem}html.theme--documenter-dark .notification .title,html.theme--documenter-dark .notification .subtitle,html.theme--documenter-dark .notification .content{color:currentColor}html.theme--documenter-dark .notification.is-white{background-color:#fff;color:#0a0a0a}html.theme--documenter-dark .notification.is-black{background-color:#0a0a0a;color:#fff}html.theme--documenter-dark .notification.is-light{background-color:#ecf0f1;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .notification.is-dark,html.theme--documenter-dark .content kbd.notification{background-color:#282f2f;color:#fff}html.theme--documenter-dark .notification.is-primary,html.theme--documenter-dark .docstring>section>a.notification.docs-sourcelink{background-color:#375a7f;color:#fff}html.theme--documenter-dark .notification.is-primary.is-light,html.theme--documenter-dark .docstring>section>a.notification.is-light.docs-sourcelink{background-color:#f1f5f9;color:#4d7eb2}html.theme--documenter-dark .notification.is-link{background-color:#1abc9c;color:#fff}html.theme--documenter-dark .notification.is-link.is-light{background-color:#edfdf9;color:#15987e}html.theme--documenter-dark .notification.is-info{background-color:#024c7d;color:#fff}html.theme--documenter-dark .notification.is-info.is-light{background-color:#ebf7ff;color:#0e9dfb}html.theme--documenter-dark .notification.is-success{background-color:#008438;color:#fff}html.theme--documenter-dark .notification.is-success.is-light{background-color:#ebfff3;color:#00eb64}html.theme--documenter-dark .notification.is-warning{background-color:#ad8100;color:#fff}html.theme--documenter-dark .notification.is-warning.is-light{background-color:#fffaeb;color:#d19c00}html.theme--documenter-dark .notification.is-danger{background-color:#9e1b0d;color:#fff}html.theme--documenter-dark .notification.is-danger.is-light{background-color:#fdeeec;color:#ec311d}html.theme--documenter-dark .progress{-moz-appearance:none;-webkit-appearance:none;border:none;border-radius:9999px;display:block;height:1rem;overflow:hidden;padding:0;width:100%}html.theme--documenter-dark .progress::-webkit-progress-bar{background-color:#343c3d}html.theme--documenter-dark .progress::-webkit-progress-value{background-color:#dbdee0}html.theme--documenter-dark .progress::-moz-progress-bar{background-color:#dbdee0}html.theme--documenter-dark .progress::-ms-fill{background-color:#dbdee0;border:none}html.theme--documenter-dark .progress.is-white::-webkit-progress-value{background-color:#fff}html.theme--documenter-dark .progress.is-white::-moz-progress-bar{background-color:#fff}html.theme--documenter-dark .progress.is-white::-ms-fill{background-color:#fff}html.theme--documenter-dark .progress.is-white:indeterminate{background-image:linear-gradient(to right, #fff 30%, #343c3d 30%)}html.theme--documenter-dark .progress.is-black::-webkit-progress-value{background-color:#0a0a0a}html.theme--documenter-dark .progress.is-black::-moz-progress-bar{background-color:#0a0a0a}html.theme--documenter-dark .progress.is-black::-ms-fill{background-color:#0a0a0a}html.theme--documenter-dark .progress.is-black:indeterminate{background-image:linear-gradient(to right, #0a0a0a 30%, #343c3d 30%)}html.theme--documenter-dark .progress.is-light::-webkit-progress-value{background-color:#ecf0f1}html.theme--documenter-dark .progress.is-light::-moz-progress-bar{background-color:#ecf0f1}html.theme--documenter-dark .progress.is-light::-ms-fill{background-color:#ecf0f1}html.theme--documenter-dark .progress.is-light:indeterminate{background-image:linear-gradient(to right, #ecf0f1 30%, #343c3d 30%)}html.theme--documenter-dark .progress.is-dark::-webkit-progress-value,html.theme--documenter-dark .content kbd.progress::-webkit-progress-value{background-color:#282f2f}html.theme--documenter-dark .progress.is-dark::-moz-progress-bar,html.theme--documenter-dark .content kbd.progress::-moz-progress-bar{background-color:#282f2f}html.theme--documenter-dark .progress.is-dark::-ms-fill,html.theme--documenter-dark .content kbd.progress::-ms-fill{background-color:#282f2f}html.theme--documenter-dark .progress.is-dark:indeterminate,html.theme--documenter-dark .content kbd.progress:indeterminate{background-image:linear-gradient(to right, #282f2f 30%, #343c3d 30%)}html.theme--documenter-dark .progress.is-primary::-webkit-progress-value,html.theme--documenter-dark .docstring>section>a.progress.docs-sourcelink::-webkit-progress-value{background-color:#375a7f}html.theme--documenter-dark .progress.is-primary::-moz-progress-bar,html.theme--documenter-dark .docstring>section>a.progress.docs-sourcelink::-moz-progress-bar{background-color:#375a7f}html.theme--documenter-dark .progress.is-primary::-ms-fill,html.theme--documenter-dark .docstring>section>a.progress.docs-sourcelink::-ms-fill{background-color:#375a7f}html.theme--documenter-dark .progress.is-primary:indeterminate,html.theme--documenter-dark .docstring>section>a.progress.docs-sourcelink:indeterminate{background-image:linear-gradient(to right, #375a7f 30%, #343c3d 30%)}html.theme--documenter-dark .progress.is-link::-webkit-progress-value{background-color:#1abc9c}html.theme--documenter-dark .progress.is-link::-moz-progress-bar{background-color:#1abc9c}html.theme--documenter-dark .progress.is-link::-ms-fill{background-color:#1abc9c}html.theme--documenter-dark .progress.is-link:indeterminate{background-image:linear-gradient(to right, #1abc9c 30%, #343c3d 30%)}html.theme--documenter-dark .progress.is-info::-webkit-progress-value{background-color:#024c7d}html.theme--documenter-dark .progress.is-info::-moz-progress-bar{background-color:#024c7d}html.theme--documenter-dark .progress.is-info::-ms-fill{background-color:#024c7d}html.theme--documenter-dark .progress.is-info:indeterminate{background-image:linear-gradient(to right, #024c7d 30%, #343c3d 30%)}html.theme--documenter-dark .progress.is-success::-webkit-progress-value{background-color:#008438}html.theme--documenter-dark .progress.is-success::-moz-progress-bar{background-color:#008438}html.theme--documenter-dark .progress.is-success::-ms-fill{background-color:#008438}html.theme--documenter-dark .progress.is-success:indeterminate{background-image:linear-gradient(to right, #008438 30%, #343c3d 30%)}html.theme--documenter-dark .progress.is-warning::-webkit-progress-value{background-color:#ad8100}html.theme--documenter-dark .progress.is-warning::-moz-progress-bar{background-color:#ad8100}html.theme--documenter-dark .progress.is-warning::-ms-fill{background-color:#ad8100}html.theme--documenter-dark .progress.is-warning:indeterminate{background-image:linear-gradient(to right, #ad8100 30%, #343c3d 30%)}html.theme--documenter-dark .progress.is-danger::-webkit-progress-value{background-color:#9e1b0d}html.theme--documenter-dark .progress.is-danger::-moz-progress-bar{background-color:#9e1b0d}html.theme--documenter-dark .progress.is-danger::-ms-fill{background-color:#9e1b0d}html.theme--documenter-dark .progress.is-danger:indeterminate{background-image:linear-gradient(to right, #9e1b0d 30%, #343c3d 30%)}html.theme--documenter-dark .progress:indeterminate{animation-duration:1.5s;animation-iteration-count:infinite;animation-name:moveIndeterminate;animation-timing-function:linear;background-color:#343c3d;background-image:linear-gradient(to right, #fff 30%, #343c3d 30%);background-position:top left;background-repeat:no-repeat;background-size:150% 150%}html.theme--documenter-dark .progress:indeterminate::-webkit-progress-bar{background-color:transparent}html.theme--documenter-dark .progress:indeterminate::-moz-progress-bar{background-color:transparent}html.theme--documenter-dark .progress:indeterminate::-ms-fill{animation-name:none}html.theme--documenter-dark .progress.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.progress{height:.75rem}html.theme--documenter-dark .progress.is-medium{height:1.25rem}html.theme--documenter-dark .progress.is-large{height:1.5rem}@keyframes moveIndeterminate{from{background-position:200% 0}to{background-position:-200% 0}}html.theme--documenter-dark .table{background-color:#343c3d;color:#fff}html.theme--documenter-dark .table td,html.theme--documenter-dark .table th{border:1px solid #5e6d6f;border-width:0 0 1px;padding:0.5em 0.75em;vertical-align:top}html.theme--documenter-dark .table td.is-white,html.theme--documenter-dark .table th.is-white{background-color:#fff;border-color:#fff;color:#0a0a0a}html.theme--documenter-dark .table td.is-black,html.theme--documenter-dark .table th.is-black{background-color:#0a0a0a;border-color:#0a0a0a;color:#fff}html.theme--documenter-dark .table td.is-light,html.theme--documenter-dark .table th.is-light{background-color:#ecf0f1;border-color:#ecf0f1;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .table td.is-dark,html.theme--documenter-dark .table th.is-dark{background-color:#282f2f;border-color:#282f2f;color:#fff}html.theme--documenter-dark .table td.is-primary,html.theme--documenter-dark .table th.is-primary{background-color:#375a7f;border-color:#375a7f;color:#fff}html.theme--documenter-dark .table td.is-link,html.theme--documenter-dark .table th.is-link{background-color:#1abc9c;border-color:#1abc9c;color:#fff}html.theme--documenter-dark .table td.is-info,html.theme--documenter-dark .table th.is-info{background-color:#024c7d;border-color:#024c7d;color:#fff}html.theme--documenter-dark .table td.is-success,html.theme--documenter-dark .table th.is-success{background-color:#008438;border-color:#008438;color:#fff}html.theme--documenter-dark .table td.is-warning,html.theme--documenter-dark .table th.is-warning{background-color:#ad8100;border-color:#ad8100;color:#fff}html.theme--documenter-dark .table td.is-danger,html.theme--documenter-dark .table th.is-danger{background-color:#9e1b0d;border-color:#9e1b0d;color:#fff}html.theme--documenter-dark .table td.is-narrow,html.theme--documenter-dark .table th.is-narrow{white-space:nowrap;width:1%}html.theme--documenter-dark .table td.is-selected,html.theme--documenter-dark .table th.is-selected{background-color:#375a7f;color:#fff}html.theme--documenter-dark .table td.is-selected a,html.theme--documenter-dark .table td.is-selected strong,html.theme--documenter-dark .table th.is-selected a,html.theme--documenter-dark .table th.is-selected strong{color:currentColor}html.theme--documenter-dark .table td.is-vcentered,html.theme--documenter-dark .table th.is-vcentered{vertical-align:middle}html.theme--documenter-dark .table th{color:#f2f2f2}html.theme--documenter-dark .table th:not([align]){text-align:left}html.theme--documenter-dark .table tr.is-selected{background-color:#375a7f;color:#fff}html.theme--documenter-dark .table tr.is-selected a,html.theme--documenter-dark .table tr.is-selected strong{color:currentColor}html.theme--documenter-dark .table tr.is-selected td,html.theme--documenter-dark .table tr.is-selected th{border-color:#fff;color:currentColor}html.theme--documenter-dark .table thead{background-color:rgba(0,0,0,0)}html.theme--documenter-dark .table thead td,html.theme--documenter-dark .table thead th{border-width:0 0 2px;color:#f2f2f2}html.theme--documenter-dark .table tfoot{background-color:rgba(0,0,0,0)}html.theme--documenter-dark .table tfoot td,html.theme--documenter-dark .table tfoot th{border-width:2px 0 0;color:#f2f2f2}html.theme--documenter-dark .table tbody{background-color:rgba(0,0,0,0)}html.theme--documenter-dark .table tbody tr:last-child td,html.theme--documenter-dark .table tbody tr:last-child th{border-bottom-width:0}html.theme--documenter-dark .table.is-bordered td,html.theme--documenter-dark .table.is-bordered th{border-width:1px}html.theme--documenter-dark .table.is-bordered tr:last-child td,html.theme--documenter-dark .table.is-bordered tr:last-child th{border-bottom-width:1px}html.theme--documenter-dark .table.is-fullwidth{width:100%}html.theme--documenter-dark .table.is-hoverable tbody tr:not(.is-selected):hover{background-color:#282f2f}html.theme--documenter-dark .table.is-hoverable.is-striped tbody tr:not(.is-selected):hover{background-color:#282f2f}html.theme--documenter-dark .table.is-hoverable.is-striped tbody tr:not(.is-selected):hover:nth-child(even){background-color:#2d3435}html.theme--documenter-dark .table.is-narrow td,html.theme--documenter-dark .table.is-narrow th{padding:0.25em 0.5em}html.theme--documenter-dark .table.is-striped tbody tr:not(.is-selected):nth-child(even){background-color:#282f2f}html.theme--documenter-dark .table-container{-webkit-overflow-scrolling:touch;overflow:auto;overflow-y:hidden;max-width:100%}html.theme--documenter-dark .tags{align-items:center;display:flex;flex-wrap:wrap;justify-content:flex-start}html.theme--documenter-dark .tags .tag,html.theme--documenter-dark .tags .content kbd,html.theme--documenter-dark .content .tags kbd,html.theme--documenter-dark .tags .docstring>section>a.docs-sourcelink{margin-bottom:0.5rem}html.theme--documenter-dark .tags .tag:not(:last-child),html.theme--documenter-dark .tags .content kbd:not(:last-child),html.theme--documenter-dark .content .tags kbd:not(:last-child),html.theme--documenter-dark .tags .docstring>section>a.docs-sourcelink:not(:last-child){margin-right:.5rem}html.theme--documenter-dark .tags:last-child{margin-bottom:-0.5rem}html.theme--documenter-dark .tags:not(:last-child){margin-bottom:1rem}html.theme--documenter-dark .tags.are-medium .tag:not(.is-normal):not(.is-large),html.theme--documenter-dark .tags.are-medium .content kbd:not(.is-normal):not(.is-large),html.theme--documenter-dark .content .tags.are-medium kbd:not(.is-normal):not(.is-large),html.theme--documenter-dark .tags.are-medium .docstring>section>a.docs-sourcelink:not(.is-normal):not(.is-large){font-size:1rem}html.theme--documenter-dark .tags.are-large .tag:not(.is-normal):not(.is-medium),html.theme--documenter-dark .tags.are-large .content kbd:not(.is-normal):not(.is-medium),html.theme--documenter-dark .content .tags.are-large kbd:not(.is-normal):not(.is-medium),html.theme--documenter-dark .tags.are-large .docstring>section>a.docs-sourcelink:not(.is-normal):not(.is-medium){font-size:1.25rem}html.theme--documenter-dark .tags.is-centered{justify-content:center}html.theme--documenter-dark .tags.is-centered .tag,html.theme--documenter-dark .tags.is-centered .content kbd,html.theme--documenter-dark .content .tags.is-centered kbd,html.theme--documenter-dark .tags.is-centered .docstring>section>a.docs-sourcelink{margin-right:0.25rem;margin-left:0.25rem}html.theme--documenter-dark .tags.is-right{justify-content:flex-end}html.theme--documenter-dark .tags.is-right .tag:not(:first-child),html.theme--documenter-dark .tags.is-right .content kbd:not(:first-child),html.theme--documenter-dark .content .tags.is-right kbd:not(:first-child),html.theme--documenter-dark .tags.is-right .docstring>section>a.docs-sourcelink:not(:first-child){margin-left:0.5rem}html.theme--documenter-dark .tags.is-right .tag:not(:last-child),html.theme--documenter-dark .tags.is-right .content kbd:not(:last-child),html.theme--documenter-dark .content .tags.is-right kbd:not(:last-child),html.theme--documenter-dark .tags.is-right .docstring>section>a.docs-sourcelink:not(:last-child){margin-right:0}html.theme--documenter-dark .tags.has-addons .tag,html.theme--documenter-dark .tags.has-addons .content kbd,html.theme--documenter-dark .content .tags.has-addons kbd,html.theme--documenter-dark .tags.has-addons .docstring>section>a.docs-sourcelink{margin-right:0}html.theme--documenter-dark .tags.has-addons .tag:not(:first-child),html.theme--documenter-dark .tags.has-addons .content kbd:not(:first-child),html.theme--documenter-dark .content .tags.has-addons kbd:not(:first-child),html.theme--documenter-dark .tags.has-addons .docstring>section>a.docs-sourcelink:not(:first-child){margin-left:0;border-top-left-radius:0;border-bottom-left-radius:0}html.theme--documenter-dark .tags.has-addons .tag:not(:last-child),html.theme--documenter-dark .tags.has-addons .content kbd:not(:last-child),html.theme--documenter-dark .content .tags.has-addons kbd:not(:last-child),html.theme--documenter-dark .tags.has-addons .docstring>section>a.docs-sourcelink:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}html.theme--documenter-dark .tag:not(body),html.theme--documenter-dark .content kbd:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink:not(body){align-items:center;background-color:#282f2f;border-radius:.4em;color:#fff;display:inline-flex;font-size:.75rem;height:2em;justify-content:center;line-height:1.5;padding-left:0.75em;padding-right:0.75em;white-space:nowrap}html.theme--documenter-dark .tag:not(body) .delete,html.theme--documenter-dark .content kbd:not(body) .delete,html.theme--documenter-dark .docstring>section>a.docs-sourcelink:not(body) .delete{margin-left:.25rem;margin-right:-.375rem}html.theme--documenter-dark .tag.is-white:not(body),html.theme--documenter-dark .content kbd.is-white:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-white:not(body){background-color:#fff;color:#0a0a0a}html.theme--documenter-dark .tag.is-black:not(body),html.theme--documenter-dark .content kbd.is-black:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-black:not(body){background-color:#0a0a0a;color:#fff}html.theme--documenter-dark .tag.is-light:not(body),html.theme--documenter-dark .content kbd.is-light:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-light:not(body){background-color:#ecf0f1;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .tag.is-dark:not(body),html.theme--documenter-dark .content kbd:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-dark:not(body),html.theme--documenter-dark .content .docstring>section>kbd:not(body){background-color:#282f2f;color:#fff}html.theme--documenter-dark .tag.is-primary:not(body),html.theme--documenter-dark .content kbd.is-primary:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink:not(body){background-color:#375a7f;color:#fff}html.theme--documenter-dark .tag.is-primary.is-light:not(body),html.theme--documenter-dark .content kbd.is-primary.is-light:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-light:not(body){background-color:#f1f5f9;color:#4d7eb2}html.theme--documenter-dark .tag.is-link:not(body),html.theme--documenter-dark .content kbd.is-link:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-link:not(body){background-color:#1abc9c;color:#fff}html.theme--documenter-dark .tag.is-link.is-light:not(body),html.theme--documenter-dark .content kbd.is-link.is-light:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-link.is-light:not(body){background-color:#edfdf9;color:#15987e}html.theme--documenter-dark .tag.is-info:not(body),html.theme--documenter-dark .content kbd.is-info:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-info:not(body){background-color:#024c7d;color:#fff}html.theme--documenter-dark .tag.is-info.is-light:not(body),html.theme--documenter-dark .content kbd.is-info.is-light:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-info.is-light:not(body){background-color:#ebf7ff;color:#0e9dfb}html.theme--documenter-dark .tag.is-success:not(body),html.theme--documenter-dark .content kbd.is-success:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-success:not(body){background-color:#008438;color:#fff}html.theme--documenter-dark .tag.is-success.is-light:not(body),html.theme--documenter-dark .content kbd.is-success.is-light:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-success.is-light:not(body){background-color:#ebfff3;color:#00eb64}html.theme--documenter-dark .tag.is-warning:not(body),html.theme--documenter-dark .content kbd.is-warning:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-warning:not(body){background-color:#ad8100;color:#fff}html.theme--documenter-dark .tag.is-warning.is-light:not(body),html.theme--documenter-dark .content kbd.is-warning.is-light:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-warning.is-light:not(body){background-color:#fffaeb;color:#d19c00}html.theme--documenter-dark .tag.is-danger:not(body),html.theme--documenter-dark .content kbd.is-danger:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-danger:not(body){background-color:#9e1b0d;color:#fff}html.theme--documenter-dark .tag.is-danger.is-light:not(body),html.theme--documenter-dark .content kbd.is-danger.is-light:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-danger.is-light:not(body){background-color:#fdeeec;color:#ec311d}html.theme--documenter-dark .tag.is-normal:not(body),html.theme--documenter-dark .content kbd.is-normal:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-normal:not(body){font-size:.75rem}html.theme--documenter-dark .tag.is-medium:not(body),html.theme--documenter-dark .content kbd.is-medium:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-medium:not(body){font-size:1rem}html.theme--documenter-dark .tag.is-large:not(body),html.theme--documenter-dark .content kbd.is-large:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-large:not(body){font-size:1.25rem}html.theme--documenter-dark .tag:not(body) .icon:first-child:not(:last-child),html.theme--documenter-dark .content kbd:not(body) .icon:first-child:not(:last-child),html.theme--documenter-dark .docstring>section>a.docs-sourcelink:not(body) .icon:first-child:not(:last-child){margin-left:-.375em;margin-right:.1875em}html.theme--documenter-dark .tag:not(body) .icon:last-child:not(:first-child),html.theme--documenter-dark .content kbd:not(body) .icon:last-child:not(:first-child),html.theme--documenter-dark .docstring>section>a.docs-sourcelink:not(body) .icon:last-child:not(:first-child){margin-left:.1875em;margin-right:-.375em}html.theme--documenter-dark .tag:not(body) .icon:first-child:last-child,html.theme--documenter-dark .content kbd:not(body) .icon:first-child:last-child,html.theme--documenter-dark .docstring>section>a.docs-sourcelink:not(body) .icon:first-child:last-child{margin-left:-.375em;margin-right:-.375em}html.theme--documenter-dark .tag.is-delete:not(body),html.theme--documenter-dark .content kbd.is-delete:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-delete:not(body){margin-left:1px;padding:0;position:relative;width:2em}html.theme--documenter-dark .tag.is-delete:not(body)::before,html.theme--documenter-dark .content kbd.is-delete:not(body)::before,html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-delete:not(body)::before,html.theme--documenter-dark .tag.is-delete:not(body)::after,html.theme--documenter-dark .content kbd.is-delete:not(body)::after,html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-delete:not(body)::after{background-color:currentColor;content:"";display:block;left:50%;position:absolute;top:50%;transform:translateX(-50%) translateY(-50%) rotate(45deg);transform-origin:center center}html.theme--documenter-dark .tag.is-delete:not(body)::before,html.theme--documenter-dark .content kbd.is-delete:not(body)::before,html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-delete:not(body)::before{height:1px;width:50%}html.theme--documenter-dark .tag.is-delete:not(body)::after,html.theme--documenter-dark .content kbd.is-delete:not(body)::after,html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-delete:not(body)::after{height:50%;width:1px}html.theme--documenter-dark .tag.is-delete:not(body):hover,html.theme--documenter-dark .content kbd.is-delete:not(body):hover,html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-delete:not(body):hover,html.theme--documenter-dark .tag.is-delete:not(body):focus,html.theme--documenter-dark .content kbd.is-delete:not(body):focus,html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-delete:not(body):focus{background-color:#1d2122}html.theme--documenter-dark .tag.is-delete:not(body):active,html.theme--documenter-dark .content kbd.is-delete:not(body):active,html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-delete:not(body):active{background-color:#111414}html.theme--documenter-dark .tag.is-rounded:not(body),html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input:not(body),html.theme--documenter-dark .content kbd.is-rounded:not(body),html.theme--documenter-dark #documenter .docs-sidebar .content form.docs-search>input:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-rounded:not(body){border-radius:9999px}html.theme--documenter-dark a.tag:hover,html.theme--documenter-dark .docstring>section>a.docs-sourcelink:hover{text-decoration:underline}html.theme--documenter-dark .title,html.theme--documenter-dark .subtitle{word-break:break-word}html.theme--documenter-dark .title em,html.theme--documenter-dark .title span,html.theme--documenter-dark .subtitle em,html.theme--documenter-dark .subtitle span{font-weight:inherit}html.theme--documenter-dark .title sub,html.theme--documenter-dark .subtitle sub{font-size:.75em}html.theme--documenter-dark .title sup,html.theme--documenter-dark .subtitle sup{font-size:.75em}html.theme--documenter-dark .title .tag,html.theme--documenter-dark .title .content kbd,html.theme--documenter-dark .content .title kbd,html.theme--documenter-dark .title .docstring>section>a.docs-sourcelink,html.theme--documenter-dark .subtitle .tag,html.theme--documenter-dark .subtitle .content kbd,html.theme--documenter-dark .content .subtitle kbd,html.theme--documenter-dark .subtitle .docstring>section>a.docs-sourcelink{vertical-align:middle}html.theme--documenter-dark .title{color:#fff;font-size:2rem;font-weight:500;line-height:1.125}html.theme--documenter-dark .title strong{color:inherit;font-weight:inherit}html.theme--documenter-dark .title:not(.is-spaced)+.subtitle{margin-top:-1.25rem}html.theme--documenter-dark .title.is-1{font-size:3rem}html.theme--documenter-dark .title.is-2{font-size:2.5rem}html.theme--documenter-dark .title.is-3{font-size:2rem}html.theme--documenter-dark .title.is-4{font-size:1.5rem}html.theme--documenter-dark .title.is-5{font-size:1.25rem}html.theme--documenter-dark .title.is-6{font-size:1rem}html.theme--documenter-dark .title.is-7{font-size:.75rem}html.theme--documenter-dark .subtitle{color:#8c9b9d;font-size:1.25rem;font-weight:400;line-height:1.25}html.theme--documenter-dark .subtitle strong{color:#8c9b9d;font-weight:600}html.theme--documenter-dark .subtitle:not(.is-spaced)+.title{margin-top:-1.25rem}html.theme--documenter-dark .subtitle.is-1{font-size:3rem}html.theme--documenter-dark .subtitle.is-2{font-size:2.5rem}html.theme--documenter-dark .subtitle.is-3{font-size:2rem}html.theme--documenter-dark .subtitle.is-4{font-size:1.5rem}html.theme--documenter-dark .subtitle.is-5{font-size:1.25rem}html.theme--documenter-dark .subtitle.is-6{font-size:1rem}html.theme--documenter-dark .subtitle.is-7{font-size:.75rem}html.theme--documenter-dark .heading{display:block;font-size:11px;letter-spacing:1px;margin-bottom:5px;text-transform:uppercase}html.theme--documenter-dark .number{align-items:center;background-color:#282f2f;border-radius:9999px;display:inline-flex;font-size:1.25rem;height:2em;justify-content:center;margin-right:1.5rem;min-width:2.5em;padding:0.25rem 0.5rem;text-align:center;vertical-align:top}html.theme--documenter-dark .select select,html.theme--documenter-dark .textarea,html.theme--documenter-dark .input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input{background-color:#1f2424;border-color:#5e6d6f;border-radius:.4em;color:#dbdee0}html.theme--documenter-dark .select select::-moz-placeholder,html.theme--documenter-dark .textarea::-moz-placeholder,html.theme--documenter-dark .input::-moz-placeholder,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input::-moz-placeholder{color:#868c98}html.theme--documenter-dark .select select::-webkit-input-placeholder,html.theme--documenter-dark .textarea::-webkit-input-placeholder,html.theme--documenter-dark .input::-webkit-input-placeholder,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input::-webkit-input-placeholder{color:#868c98}html.theme--documenter-dark .select select:-moz-placeholder,html.theme--documenter-dark .textarea:-moz-placeholder,html.theme--documenter-dark .input:-moz-placeholder,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input:-moz-placeholder{color:#868c98}html.theme--documenter-dark .select select:-ms-input-placeholder,html.theme--documenter-dark .textarea:-ms-input-placeholder,html.theme--documenter-dark .input:-ms-input-placeholder,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input:-ms-input-placeholder{color:#868c98}html.theme--documenter-dark .select select:hover,html.theme--documenter-dark .textarea:hover,html.theme--documenter-dark .input:hover,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input:hover,html.theme--documenter-dark .select select.is-hovered,html.theme--documenter-dark .is-hovered.textarea,html.theme--documenter-dark .is-hovered.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-hovered{border-color:#8c9b9d}html.theme--documenter-dark .select select:focus,html.theme--documenter-dark .textarea:focus,html.theme--documenter-dark .input:focus,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input:focus,html.theme--documenter-dark .select select.is-focused,html.theme--documenter-dark .is-focused.textarea,html.theme--documenter-dark .is-focused.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-focused,html.theme--documenter-dark .select select:active,html.theme--documenter-dark .textarea:active,html.theme--documenter-dark .input:active,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input:active,html.theme--documenter-dark .select select.is-active,html.theme--documenter-dark .is-active.textarea,html.theme--documenter-dark .is-active.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-active{border-color:#1abc9c;box-shadow:0 0 0 0.125em rgba(26,188,156,0.25)}html.theme--documenter-dark .select select[disabled],html.theme--documenter-dark .textarea[disabled],html.theme--documenter-dark .input[disabled],html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input[disabled],fieldset[disabled] html.theme--documenter-dark .select select,fieldset[disabled] html.theme--documenter-dark .textarea,fieldset[disabled] html.theme--documenter-dark .input,fieldset[disabled] html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input{background-color:#8c9b9d;border-color:#282f2f;box-shadow:none;color:#fff}html.theme--documenter-dark .select select[disabled]::-moz-placeholder,html.theme--documenter-dark .textarea[disabled]::-moz-placeholder,html.theme--documenter-dark .input[disabled]::-moz-placeholder,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input[disabled]::-moz-placeholder,fieldset[disabled] html.theme--documenter-dark .select select::-moz-placeholder,fieldset[disabled] html.theme--documenter-dark .textarea::-moz-placeholder,fieldset[disabled] html.theme--documenter-dark .input::-moz-placeholder,fieldset[disabled] html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input::-moz-placeholder{color:rgba(255,255,255,0.3)}html.theme--documenter-dark .select select[disabled]::-webkit-input-placeholder,html.theme--documenter-dark .textarea[disabled]::-webkit-input-placeholder,html.theme--documenter-dark .input[disabled]::-webkit-input-placeholder,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input[disabled]::-webkit-input-placeholder,fieldset[disabled] html.theme--documenter-dark .select select::-webkit-input-placeholder,fieldset[disabled] html.theme--documenter-dark .textarea::-webkit-input-placeholder,fieldset[disabled] html.theme--documenter-dark .input::-webkit-input-placeholder,fieldset[disabled] html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input::-webkit-input-placeholder{color:rgba(255,255,255,0.3)}html.theme--documenter-dark .select select[disabled]:-moz-placeholder,html.theme--documenter-dark .textarea[disabled]:-moz-placeholder,html.theme--documenter-dark .input[disabled]:-moz-placeholder,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input[disabled]:-moz-placeholder,fieldset[disabled] html.theme--documenter-dark .select select:-moz-placeholder,fieldset[disabled] html.theme--documenter-dark .textarea:-moz-placeholder,fieldset[disabled] html.theme--documenter-dark .input:-moz-placeholder,fieldset[disabled] html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input:-moz-placeholder{color:rgba(255,255,255,0.3)}html.theme--documenter-dark .select select[disabled]:-ms-input-placeholder,html.theme--documenter-dark .textarea[disabled]:-ms-input-placeholder,html.theme--documenter-dark .input[disabled]:-ms-input-placeholder,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input[disabled]:-ms-input-placeholder,fieldset[disabled] html.theme--documenter-dark .select select:-ms-input-placeholder,fieldset[disabled] html.theme--documenter-dark .textarea:-ms-input-placeholder,fieldset[disabled] html.theme--documenter-dark .input:-ms-input-placeholder,fieldset[disabled] html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input:-ms-input-placeholder{color:rgba(255,255,255,0.3)}html.theme--documenter-dark .textarea,html.theme--documenter-dark .input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input{box-shadow:inset 0 0.0625em 0.125em rgba(10,10,10,0.05);max-width:100%;width:100%}html.theme--documenter-dark .textarea[readonly],html.theme--documenter-dark .input[readonly],html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input[readonly]{box-shadow:none}html.theme--documenter-dark .is-white.textarea,html.theme--documenter-dark .is-white.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-white{border-color:#fff}html.theme--documenter-dark .is-white.textarea:focus,html.theme--documenter-dark .is-white.input:focus,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-white:focus,html.theme--documenter-dark .is-white.is-focused.textarea,html.theme--documenter-dark .is-white.is-focused.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-focused,html.theme--documenter-dark .is-white.textarea:active,html.theme--documenter-dark .is-white.input:active,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-white:active,html.theme--documenter-dark .is-white.is-active.textarea,html.theme--documenter-dark .is-white.is-active.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(255,255,255,0.25)}html.theme--documenter-dark .is-black.textarea,html.theme--documenter-dark .is-black.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-black{border-color:#0a0a0a}html.theme--documenter-dark .is-black.textarea:focus,html.theme--documenter-dark .is-black.input:focus,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-black:focus,html.theme--documenter-dark .is-black.is-focused.textarea,html.theme--documenter-dark .is-black.is-focused.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-focused,html.theme--documenter-dark .is-black.textarea:active,html.theme--documenter-dark .is-black.input:active,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-black:active,html.theme--documenter-dark .is-black.is-active.textarea,html.theme--documenter-dark .is-black.is-active.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(10,10,10,0.25)}html.theme--documenter-dark .is-light.textarea,html.theme--documenter-dark .is-light.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-light{border-color:#ecf0f1}html.theme--documenter-dark .is-light.textarea:focus,html.theme--documenter-dark .is-light.input:focus,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-light:focus,html.theme--documenter-dark .is-light.is-focused.textarea,html.theme--documenter-dark .is-light.is-focused.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-focused,html.theme--documenter-dark .is-light.textarea:active,html.theme--documenter-dark .is-light.input:active,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-light:active,html.theme--documenter-dark .is-light.is-active.textarea,html.theme--documenter-dark .is-light.is-active.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(236,240,241,0.25)}html.theme--documenter-dark .is-dark.textarea,html.theme--documenter-dark .content kbd.textarea,html.theme--documenter-dark .is-dark.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-dark,html.theme--documenter-dark .content kbd.input{border-color:#282f2f}html.theme--documenter-dark .is-dark.textarea:focus,html.theme--documenter-dark .content kbd.textarea:focus,html.theme--documenter-dark .is-dark.input:focus,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-dark:focus,html.theme--documenter-dark .content kbd.input:focus,html.theme--documenter-dark .is-dark.is-focused.textarea,html.theme--documenter-dark .content kbd.is-focused.textarea,html.theme--documenter-dark .is-dark.is-focused.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-focused,html.theme--documenter-dark .content kbd.is-focused.input,html.theme--documenter-dark #documenter .docs-sidebar .content form.docs-search>input.is-focused,html.theme--documenter-dark .is-dark.textarea:active,html.theme--documenter-dark .content kbd.textarea:active,html.theme--documenter-dark .is-dark.input:active,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-dark:active,html.theme--documenter-dark .content kbd.input:active,html.theme--documenter-dark .is-dark.is-active.textarea,html.theme--documenter-dark .content kbd.is-active.textarea,html.theme--documenter-dark .is-dark.is-active.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-active,html.theme--documenter-dark .content kbd.is-active.input,html.theme--documenter-dark #documenter .docs-sidebar .content form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(40,47,47,0.25)}html.theme--documenter-dark .is-primary.textarea,html.theme--documenter-dark .docstring>section>a.textarea.docs-sourcelink,html.theme--documenter-dark .is-primary.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-primary,html.theme--documenter-dark .docstring>section>a.input.docs-sourcelink{border-color:#375a7f}html.theme--documenter-dark .is-primary.textarea:focus,html.theme--documenter-dark .docstring>section>a.textarea.docs-sourcelink:focus,html.theme--documenter-dark .is-primary.input:focus,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-primary:focus,html.theme--documenter-dark .docstring>section>a.input.docs-sourcelink:focus,html.theme--documenter-dark .is-primary.is-focused.textarea,html.theme--documenter-dark .docstring>section>a.is-focused.textarea.docs-sourcelink,html.theme--documenter-dark .is-primary.is-focused.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-focused,html.theme--documenter-dark .docstring>section>a.is-focused.input.docs-sourcelink,html.theme--documenter-dark .is-primary.textarea:active,html.theme--documenter-dark .docstring>section>a.textarea.docs-sourcelink:active,html.theme--documenter-dark .is-primary.input:active,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-primary:active,html.theme--documenter-dark .docstring>section>a.input.docs-sourcelink:active,html.theme--documenter-dark .is-primary.is-active.textarea,html.theme--documenter-dark .docstring>section>a.is-active.textarea.docs-sourcelink,html.theme--documenter-dark .is-primary.is-active.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-active,html.theme--documenter-dark .docstring>section>a.is-active.input.docs-sourcelink{box-shadow:0 0 0 0.125em rgba(55,90,127,0.25)}html.theme--documenter-dark .is-link.textarea,html.theme--documenter-dark .is-link.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-link{border-color:#1abc9c}html.theme--documenter-dark .is-link.textarea:focus,html.theme--documenter-dark .is-link.input:focus,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-link:focus,html.theme--documenter-dark .is-link.is-focused.textarea,html.theme--documenter-dark .is-link.is-focused.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-focused,html.theme--documenter-dark .is-link.textarea:active,html.theme--documenter-dark .is-link.input:active,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-link:active,html.theme--documenter-dark .is-link.is-active.textarea,html.theme--documenter-dark .is-link.is-active.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(26,188,156,0.25)}html.theme--documenter-dark .is-info.textarea,html.theme--documenter-dark .is-info.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-info{border-color:#024c7d}html.theme--documenter-dark .is-info.textarea:focus,html.theme--documenter-dark .is-info.input:focus,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-info:focus,html.theme--documenter-dark .is-info.is-focused.textarea,html.theme--documenter-dark .is-info.is-focused.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-focused,html.theme--documenter-dark .is-info.textarea:active,html.theme--documenter-dark .is-info.input:active,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-info:active,html.theme--documenter-dark .is-info.is-active.textarea,html.theme--documenter-dark .is-info.is-active.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(2,76,125,0.25)}html.theme--documenter-dark .is-success.textarea,html.theme--documenter-dark .is-success.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-success{border-color:#008438}html.theme--documenter-dark .is-success.textarea:focus,html.theme--documenter-dark .is-success.input:focus,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-success:focus,html.theme--documenter-dark .is-success.is-focused.textarea,html.theme--documenter-dark .is-success.is-focused.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-focused,html.theme--documenter-dark .is-success.textarea:active,html.theme--documenter-dark .is-success.input:active,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-success:active,html.theme--documenter-dark .is-success.is-active.textarea,html.theme--documenter-dark .is-success.is-active.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(0,132,56,0.25)}html.theme--documenter-dark .is-warning.textarea,html.theme--documenter-dark .is-warning.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-warning{border-color:#ad8100}html.theme--documenter-dark .is-warning.textarea:focus,html.theme--documenter-dark .is-warning.input:focus,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-warning:focus,html.theme--documenter-dark .is-warning.is-focused.textarea,html.theme--documenter-dark .is-warning.is-focused.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-focused,html.theme--documenter-dark .is-warning.textarea:active,html.theme--documenter-dark .is-warning.input:active,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-warning:active,html.theme--documenter-dark .is-warning.is-active.textarea,html.theme--documenter-dark .is-warning.is-active.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(173,129,0,0.25)}html.theme--documenter-dark .is-danger.textarea,html.theme--documenter-dark .is-danger.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-danger{border-color:#9e1b0d}html.theme--documenter-dark .is-danger.textarea:focus,html.theme--documenter-dark .is-danger.input:focus,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-danger:focus,html.theme--documenter-dark .is-danger.is-focused.textarea,html.theme--documenter-dark .is-danger.is-focused.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-focused,html.theme--documenter-dark .is-danger.textarea:active,html.theme--documenter-dark .is-danger.input:active,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-danger:active,html.theme--documenter-dark .is-danger.is-active.textarea,html.theme--documenter-dark .is-danger.is-active.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(158,27,13,0.25)}html.theme--documenter-dark .is-small.textarea,html.theme--documenter-dark .is-small.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input{border-radius:3px;font-size:.75rem}html.theme--documenter-dark .is-medium.textarea,html.theme--documenter-dark .is-medium.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-medium{font-size:1.25rem}html.theme--documenter-dark .is-large.textarea,html.theme--documenter-dark .is-large.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-large{font-size:1.5rem}html.theme--documenter-dark .is-fullwidth.textarea,html.theme--documenter-dark .is-fullwidth.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-fullwidth{display:block;width:100%}html.theme--documenter-dark .is-inline.textarea,html.theme--documenter-dark .is-inline.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-inline{display:inline;width:auto}html.theme--documenter-dark .input.is-rounded,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input{border-radius:9999px;padding-left:calc(calc(0.75em - 1px) + 0.375em);padding-right:calc(calc(0.75em - 1px) + 0.375em)}html.theme--documenter-dark .input.is-static,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-static{background-color:transparent;border-color:transparent;box-shadow:none;padding-left:0;padding-right:0}html.theme--documenter-dark .textarea{display:block;max-width:100%;min-width:100%;padding:calc(0.75em - 1px);resize:vertical}html.theme--documenter-dark .textarea:not([rows]){max-height:40em;min-height:8em}html.theme--documenter-dark .textarea[rows]{height:initial}html.theme--documenter-dark .textarea.has-fixed-size{resize:none}html.theme--documenter-dark .radio,html.theme--documenter-dark .checkbox{cursor:pointer;display:inline-block;line-height:1.25;position:relative}html.theme--documenter-dark .radio input,html.theme--documenter-dark .checkbox input{cursor:pointer}html.theme--documenter-dark .radio:hover,html.theme--documenter-dark .checkbox:hover{color:#8c9b9d}html.theme--documenter-dark .radio[disabled],html.theme--documenter-dark .checkbox[disabled],fieldset[disabled] html.theme--documenter-dark .radio,fieldset[disabled] html.theme--documenter-dark .checkbox,html.theme--documenter-dark .radio input[disabled],html.theme--documenter-dark .checkbox input[disabled]{color:#fff;cursor:not-allowed}html.theme--documenter-dark .radio+.radio{margin-left:.5em}html.theme--documenter-dark .select{display:inline-block;max-width:100%;position:relative;vertical-align:top}html.theme--documenter-dark .select:not(.is-multiple){height:2.5em}html.theme--documenter-dark .select:not(.is-multiple):not(.is-loading)::after{border-color:#1abc9c;right:1.125em;z-index:4}html.theme--documenter-dark .select.is-rounded select,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.select select{border-radius:9999px;padding-left:1em}html.theme--documenter-dark .select select{cursor:pointer;display:block;font-size:1em;max-width:100%;outline:none}html.theme--documenter-dark .select select::-ms-expand{display:none}html.theme--documenter-dark .select select[disabled]:hover,fieldset[disabled] html.theme--documenter-dark .select select:hover{border-color:#282f2f}html.theme--documenter-dark .select select:not([multiple]){padding-right:2.5em}html.theme--documenter-dark .select select[multiple]{height:auto;padding:0}html.theme--documenter-dark .select select[multiple] option{padding:0.5em 1em}html.theme--documenter-dark .select:not(.is-multiple):not(.is-loading):hover::after{border-color:#8c9b9d}html.theme--documenter-dark .select.is-white:not(:hover)::after{border-color:#fff}html.theme--documenter-dark .select.is-white select{border-color:#fff}html.theme--documenter-dark .select.is-white select:hover,html.theme--documenter-dark .select.is-white select.is-hovered{border-color:#f2f2f2}html.theme--documenter-dark .select.is-white select:focus,html.theme--documenter-dark .select.is-white select.is-focused,html.theme--documenter-dark .select.is-white select:active,html.theme--documenter-dark .select.is-white select.is-active{box-shadow:0 0 0 0.125em rgba(255,255,255,0.25)}html.theme--documenter-dark .select.is-black:not(:hover)::after{border-color:#0a0a0a}html.theme--documenter-dark .select.is-black select{border-color:#0a0a0a}html.theme--documenter-dark .select.is-black select:hover,html.theme--documenter-dark .select.is-black select.is-hovered{border-color:#000}html.theme--documenter-dark .select.is-black select:focus,html.theme--documenter-dark .select.is-black select.is-focused,html.theme--documenter-dark .select.is-black select:active,html.theme--documenter-dark .select.is-black select.is-active{box-shadow:0 0 0 0.125em rgba(10,10,10,0.25)}html.theme--documenter-dark .select.is-light:not(:hover)::after{border-color:#ecf0f1}html.theme--documenter-dark .select.is-light select{border-color:#ecf0f1}html.theme--documenter-dark .select.is-light select:hover,html.theme--documenter-dark .select.is-light select.is-hovered{border-color:#dde4e6}html.theme--documenter-dark .select.is-light select:focus,html.theme--documenter-dark .select.is-light select.is-focused,html.theme--documenter-dark .select.is-light select:active,html.theme--documenter-dark .select.is-light select.is-active{box-shadow:0 0 0 0.125em rgba(236,240,241,0.25)}html.theme--documenter-dark .select.is-dark:not(:hover)::after,html.theme--documenter-dark .content kbd.select:not(:hover)::after{border-color:#282f2f}html.theme--documenter-dark .select.is-dark select,html.theme--documenter-dark .content kbd.select select{border-color:#282f2f}html.theme--documenter-dark .select.is-dark select:hover,html.theme--documenter-dark .content kbd.select select:hover,html.theme--documenter-dark .select.is-dark select.is-hovered,html.theme--documenter-dark .content kbd.select select.is-hovered{border-color:#1d2122}html.theme--documenter-dark .select.is-dark select:focus,html.theme--documenter-dark .content kbd.select select:focus,html.theme--documenter-dark .select.is-dark select.is-focused,html.theme--documenter-dark .content kbd.select select.is-focused,html.theme--documenter-dark .select.is-dark select:active,html.theme--documenter-dark .content kbd.select select:active,html.theme--documenter-dark .select.is-dark select.is-active,html.theme--documenter-dark .content kbd.select select.is-active{box-shadow:0 0 0 0.125em rgba(40,47,47,0.25)}html.theme--documenter-dark .select.is-primary:not(:hover)::after,html.theme--documenter-dark .docstring>section>a.select.docs-sourcelink:not(:hover)::after{border-color:#375a7f}html.theme--documenter-dark .select.is-primary select,html.theme--documenter-dark .docstring>section>a.select.docs-sourcelink select{border-color:#375a7f}html.theme--documenter-dark .select.is-primary select:hover,html.theme--documenter-dark .docstring>section>a.select.docs-sourcelink select:hover,html.theme--documenter-dark .select.is-primary select.is-hovered,html.theme--documenter-dark .docstring>section>a.select.docs-sourcelink select.is-hovered{border-color:#2f4d6d}html.theme--documenter-dark .select.is-primary select:focus,html.theme--documenter-dark .docstring>section>a.select.docs-sourcelink select:focus,html.theme--documenter-dark .select.is-primary select.is-focused,html.theme--documenter-dark .docstring>section>a.select.docs-sourcelink select.is-focused,html.theme--documenter-dark .select.is-primary select:active,html.theme--documenter-dark .docstring>section>a.select.docs-sourcelink select:active,html.theme--documenter-dark .select.is-primary select.is-active,html.theme--documenter-dark .docstring>section>a.select.docs-sourcelink select.is-active{box-shadow:0 0 0 0.125em rgba(55,90,127,0.25)}html.theme--documenter-dark .select.is-link:not(:hover)::after{border-color:#1abc9c}html.theme--documenter-dark .select.is-link select{border-color:#1abc9c}html.theme--documenter-dark .select.is-link select:hover,html.theme--documenter-dark .select.is-link select.is-hovered{border-color:#17a689}html.theme--documenter-dark .select.is-link select:focus,html.theme--documenter-dark .select.is-link select.is-focused,html.theme--documenter-dark .select.is-link select:active,html.theme--documenter-dark .select.is-link select.is-active{box-shadow:0 0 0 0.125em rgba(26,188,156,0.25)}html.theme--documenter-dark .select.is-info:not(:hover)::after{border-color:#024c7d}html.theme--documenter-dark .select.is-info select{border-color:#024c7d}html.theme--documenter-dark .select.is-info select:hover,html.theme--documenter-dark .select.is-info select.is-hovered{border-color:#023d64}html.theme--documenter-dark .select.is-info select:focus,html.theme--documenter-dark .select.is-info select.is-focused,html.theme--documenter-dark .select.is-info select:active,html.theme--documenter-dark .select.is-info select.is-active{box-shadow:0 0 0 0.125em rgba(2,76,125,0.25)}html.theme--documenter-dark .select.is-success:not(:hover)::after{border-color:#008438}html.theme--documenter-dark .select.is-success select{border-color:#008438}html.theme--documenter-dark .select.is-success select:hover,html.theme--documenter-dark .select.is-success select.is-hovered{border-color:#006b2d}html.theme--documenter-dark .select.is-success select:focus,html.theme--documenter-dark .select.is-success select.is-focused,html.theme--documenter-dark .select.is-success select:active,html.theme--documenter-dark .select.is-success select.is-active{box-shadow:0 0 0 0.125em rgba(0,132,56,0.25)}html.theme--documenter-dark .select.is-warning:not(:hover)::after{border-color:#ad8100}html.theme--documenter-dark .select.is-warning select{border-color:#ad8100}html.theme--documenter-dark .select.is-warning select:hover,html.theme--documenter-dark .select.is-warning select.is-hovered{border-color:#946e00}html.theme--documenter-dark .select.is-warning select:focus,html.theme--documenter-dark .select.is-warning select.is-focused,html.theme--documenter-dark .select.is-warning select:active,html.theme--documenter-dark .select.is-warning select.is-active{box-shadow:0 0 0 0.125em rgba(173,129,0,0.25)}html.theme--documenter-dark .select.is-danger:not(:hover)::after{border-color:#9e1b0d}html.theme--documenter-dark .select.is-danger select{border-color:#9e1b0d}html.theme--documenter-dark .select.is-danger select:hover,html.theme--documenter-dark .select.is-danger select.is-hovered{border-color:#86170b}html.theme--documenter-dark .select.is-danger select:focus,html.theme--documenter-dark .select.is-danger select.is-focused,html.theme--documenter-dark .select.is-danger select:active,html.theme--documenter-dark .select.is-danger select.is-active{box-shadow:0 0 0 0.125em rgba(158,27,13,0.25)}html.theme--documenter-dark .select.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.select{border-radius:3px;font-size:.75rem}html.theme--documenter-dark .select.is-medium{font-size:1.25rem}html.theme--documenter-dark .select.is-large{font-size:1.5rem}html.theme--documenter-dark .select.is-disabled::after{border-color:#fff !important;opacity:0.5}html.theme--documenter-dark .select.is-fullwidth{width:100%}html.theme--documenter-dark .select.is-fullwidth select{width:100%}html.theme--documenter-dark .select.is-loading::after{margin-top:0;position:absolute;right:.625em;top:0.625em;transform:none}html.theme--documenter-dark .select.is-loading.is-small:after,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-loading:after{font-size:.75rem}html.theme--documenter-dark .select.is-loading.is-medium:after{font-size:1.25rem}html.theme--documenter-dark .select.is-loading.is-large:after{font-size:1.5rem}html.theme--documenter-dark .file{align-items:stretch;display:flex;justify-content:flex-start;position:relative}html.theme--documenter-dark .file.is-white .file-cta{background-color:#fff;border-color:transparent;color:#0a0a0a}html.theme--documenter-dark .file.is-white:hover .file-cta,html.theme--documenter-dark .file.is-white.is-hovered .file-cta{background-color:#f9f9f9;border-color:transparent;color:#0a0a0a}html.theme--documenter-dark .file.is-white:focus .file-cta,html.theme--documenter-dark .file.is-white.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(255,255,255,0.25);color:#0a0a0a}html.theme--documenter-dark .file.is-white:active .file-cta,html.theme--documenter-dark .file.is-white.is-active .file-cta{background-color:#f2f2f2;border-color:transparent;color:#0a0a0a}html.theme--documenter-dark .file.is-black .file-cta{background-color:#0a0a0a;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-black:hover .file-cta,html.theme--documenter-dark .file.is-black.is-hovered .file-cta{background-color:#040404;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-black:focus .file-cta,html.theme--documenter-dark .file.is-black.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(10,10,10,0.25);color:#fff}html.theme--documenter-dark .file.is-black:active .file-cta,html.theme--documenter-dark .file.is-black.is-active .file-cta{background-color:#000;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-light .file-cta{background-color:#ecf0f1;border-color:transparent;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .file.is-light:hover .file-cta,html.theme--documenter-dark .file.is-light.is-hovered .file-cta{background-color:#e5eaec;border-color:transparent;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .file.is-light:focus .file-cta,html.theme--documenter-dark .file.is-light.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(236,240,241,0.25);color:rgba(0,0,0,0.7)}html.theme--documenter-dark .file.is-light:active .file-cta,html.theme--documenter-dark .file.is-light.is-active .file-cta{background-color:#dde4e6;border-color:transparent;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .file.is-dark .file-cta,html.theme--documenter-dark .content kbd.file .file-cta{background-color:#282f2f;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-dark:hover .file-cta,html.theme--documenter-dark .content kbd.file:hover .file-cta,html.theme--documenter-dark .file.is-dark.is-hovered .file-cta,html.theme--documenter-dark .content kbd.file.is-hovered .file-cta{background-color:#232829;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-dark:focus .file-cta,html.theme--documenter-dark .content kbd.file:focus .file-cta,html.theme--documenter-dark .file.is-dark.is-focused .file-cta,html.theme--documenter-dark .content kbd.file.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(40,47,47,0.25);color:#fff}html.theme--documenter-dark .file.is-dark:active .file-cta,html.theme--documenter-dark .content kbd.file:active .file-cta,html.theme--documenter-dark .file.is-dark.is-active .file-cta,html.theme--documenter-dark .content kbd.file.is-active .file-cta{background-color:#1d2122;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-primary .file-cta,html.theme--documenter-dark .docstring>section>a.file.docs-sourcelink .file-cta{background-color:#375a7f;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-primary:hover .file-cta,html.theme--documenter-dark .docstring>section>a.file.docs-sourcelink:hover .file-cta,html.theme--documenter-dark .file.is-primary.is-hovered .file-cta,html.theme--documenter-dark .docstring>section>a.file.is-hovered.docs-sourcelink .file-cta{background-color:#335476;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-primary:focus .file-cta,html.theme--documenter-dark .docstring>section>a.file.docs-sourcelink:focus .file-cta,html.theme--documenter-dark .file.is-primary.is-focused .file-cta,html.theme--documenter-dark .docstring>section>a.file.is-focused.docs-sourcelink .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(55,90,127,0.25);color:#fff}html.theme--documenter-dark .file.is-primary:active .file-cta,html.theme--documenter-dark .docstring>section>a.file.docs-sourcelink:active .file-cta,html.theme--documenter-dark .file.is-primary.is-active .file-cta,html.theme--documenter-dark .docstring>section>a.file.is-active.docs-sourcelink .file-cta{background-color:#2f4d6d;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-link .file-cta{background-color:#1abc9c;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-link:hover .file-cta,html.theme--documenter-dark .file.is-link.is-hovered .file-cta{background-color:#18b193;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-link:focus .file-cta,html.theme--documenter-dark .file.is-link.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(26,188,156,0.25);color:#fff}html.theme--documenter-dark .file.is-link:active .file-cta,html.theme--documenter-dark .file.is-link.is-active .file-cta{background-color:#17a689;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-info .file-cta{background-color:#024c7d;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-info:hover .file-cta,html.theme--documenter-dark .file.is-info.is-hovered .file-cta{background-color:#024470;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-info:focus .file-cta,html.theme--documenter-dark .file.is-info.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(2,76,125,0.25);color:#fff}html.theme--documenter-dark .file.is-info:active .file-cta,html.theme--documenter-dark .file.is-info.is-active .file-cta{background-color:#023d64;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-success .file-cta{background-color:#008438;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-success:hover .file-cta,html.theme--documenter-dark .file.is-success.is-hovered .file-cta{background-color:#073;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-success:focus .file-cta,html.theme--documenter-dark .file.is-success.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(0,132,56,0.25);color:#fff}html.theme--documenter-dark .file.is-success:active .file-cta,html.theme--documenter-dark .file.is-success.is-active .file-cta{background-color:#006b2d;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-warning .file-cta{background-color:#ad8100;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-warning:hover .file-cta,html.theme--documenter-dark .file.is-warning.is-hovered .file-cta{background-color:#a07700;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-warning:focus .file-cta,html.theme--documenter-dark .file.is-warning.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(173,129,0,0.25);color:#fff}html.theme--documenter-dark .file.is-warning:active .file-cta,html.theme--documenter-dark .file.is-warning.is-active .file-cta{background-color:#946e00;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-danger .file-cta{background-color:#9e1b0d;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-danger:hover .file-cta,html.theme--documenter-dark .file.is-danger.is-hovered .file-cta{background-color:#92190c;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-danger:focus .file-cta,html.theme--documenter-dark .file.is-danger.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(158,27,13,0.25);color:#fff}html.theme--documenter-dark .file.is-danger:active .file-cta,html.theme--documenter-dark .file.is-danger.is-active .file-cta{background-color:#86170b;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.file{font-size:.75rem}html.theme--documenter-dark .file.is-normal{font-size:1rem}html.theme--documenter-dark .file.is-medium{font-size:1.25rem}html.theme--documenter-dark .file.is-medium .file-icon .fa{font-size:21px}html.theme--documenter-dark .file.is-large{font-size:1.5rem}html.theme--documenter-dark .file.is-large .file-icon .fa{font-size:28px}html.theme--documenter-dark .file.has-name .file-cta{border-bottom-right-radius:0;border-top-right-radius:0}html.theme--documenter-dark .file.has-name .file-name{border-bottom-left-radius:0;border-top-left-radius:0}html.theme--documenter-dark .file.has-name.is-empty .file-cta{border-radius:.4em}html.theme--documenter-dark .file.has-name.is-empty .file-name{display:none}html.theme--documenter-dark .file.is-boxed .file-label{flex-direction:column}html.theme--documenter-dark .file.is-boxed .file-cta{flex-direction:column;height:auto;padding:1em 3em}html.theme--documenter-dark .file.is-boxed .file-name{border-width:0 1px 1px}html.theme--documenter-dark .file.is-boxed .file-icon{height:1.5em;width:1.5em}html.theme--documenter-dark .file.is-boxed .file-icon .fa{font-size:21px}html.theme--documenter-dark .file.is-boxed.is-small .file-icon .fa,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-boxed .file-icon .fa{font-size:14px}html.theme--documenter-dark .file.is-boxed.is-medium .file-icon .fa{font-size:28px}html.theme--documenter-dark .file.is-boxed.is-large .file-icon .fa{font-size:35px}html.theme--documenter-dark .file.is-boxed.has-name .file-cta{border-radius:.4em .4em 0 0}html.theme--documenter-dark .file.is-boxed.has-name .file-name{border-radius:0 0 .4em .4em;border-width:0 1px 1px}html.theme--documenter-dark .file.is-centered{justify-content:center}html.theme--documenter-dark .file.is-fullwidth .file-label{width:100%}html.theme--documenter-dark .file.is-fullwidth .file-name{flex-grow:1;max-width:none}html.theme--documenter-dark .file.is-right{justify-content:flex-end}html.theme--documenter-dark .file.is-right .file-cta{border-radius:0 .4em .4em 0}html.theme--documenter-dark .file.is-right .file-name{border-radius:.4em 0 0 .4em;border-width:1px 0 1px 1px;order:-1}html.theme--documenter-dark .file-label{align-items:stretch;display:flex;cursor:pointer;justify-content:flex-start;overflow:hidden;position:relative}html.theme--documenter-dark .file-label:hover .file-cta{background-color:#232829;color:#f2f2f2}html.theme--documenter-dark .file-label:hover .file-name{border-color:#596668}html.theme--documenter-dark .file-label:active .file-cta{background-color:#1d2122;color:#f2f2f2}html.theme--documenter-dark .file-label:active .file-name{border-color:#535f61}html.theme--documenter-dark .file-input{height:100%;left:0;opacity:0;outline:none;position:absolute;top:0;width:100%}html.theme--documenter-dark .file-cta,html.theme--documenter-dark .file-name{border-color:#5e6d6f;border-radius:.4em;font-size:1em;padding-left:1em;padding-right:1em;white-space:nowrap}html.theme--documenter-dark .file-cta{background-color:#282f2f;color:#fff}html.theme--documenter-dark .file-name{border-color:#5e6d6f;border-style:solid;border-width:1px 1px 1px 0;display:block;max-width:16em;overflow:hidden;text-align:inherit;text-overflow:ellipsis}html.theme--documenter-dark .file-icon{align-items:center;display:flex;height:1em;justify-content:center;margin-right:.5em;width:1em}html.theme--documenter-dark .file-icon .fa{font-size:14px}html.theme--documenter-dark .label{color:#f2f2f2;display:block;font-size:1rem;font-weight:700}html.theme--documenter-dark .label:not(:last-child){margin-bottom:0.5em}html.theme--documenter-dark .label.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.label{font-size:.75rem}html.theme--documenter-dark .label.is-medium{font-size:1.25rem}html.theme--documenter-dark .label.is-large{font-size:1.5rem}html.theme--documenter-dark .help{display:block;font-size:.75rem;margin-top:0.25rem}html.theme--documenter-dark .help.is-white{color:#fff}html.theme--documenter-dark .help.is-black{color:#0a0a0a}html.theme--documenter-dark .help.is-light{color:#ecf0f1}html.theme--documenter-dark .help.is-dark,html.theme--documenter-dark .content kbd.help{color:#282f2f}html.theme--documenter-dark .help.is-primary,html.theme--documenter-dark .docstring>section>a.help.docs-sourcelink{color:#375a7f}html.theme--documenter-dark .help.is-link{color:#1abc9c}html.theme--documenter-dark .help.is-info{color:#024c7d}html.theme--documenter-dark .help.is-success{color:#008438}html.theme--documenter-dark .help.is-warning{color:#ad8100}html.theme--documenter-dark .help.is-danger{color:#9e1b0d}html.theme--documenter-dark .field:not(:last-child){margin-bottom:0.75rem}html.theme--documenter-dark .field.has-addons{display:flex;justify-content:flex-start}html.theme--documenter-dark .field.has-addons .control:not(:last-child){margin-right:-1px}html.theme--documenter-dark .field.has-addons .control:not(:first-child):not(:last-child) .button,html.theme--documenter-dark .field.has-addons .control:not(:first-child):not(:last-child) .input,html.theme--documenter-dark .field.has-addons .control:not(:first-child):not(:last-child) #documenter .docs-sidebar form.docs-search>input,html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control:not(:first-child):not(:last-child) form.docs-search>input,html.theme--documenter-dark .field.has-addons .control:not(:first-child):not(:last-child) .select select{border-radius:0}html.theme--documenter-dark .field.has-addons .control:first-child:not(:only-child) .button,html.theme--documenter-dark .field.has-addons .control:first-child:not(:only-child) .input,html.theme--documenter-dark .field.has-addons .control:first-child:not(:only-child) #documenter .docs-sidebar form.docs-search>input,html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control:first-child:not(:only-child) form.docs-search>input,html.theme--documenter-dark .field.has-addons .control:first-child:not(:only-child) .select select{border-bottom-right-radius:0;border-top-right-radius:0}html.theme--documenter-dark .field.has-addons .control:last-child:not(:only-child) .button,html.theme--documenter-dark .field.has-addons .control:last-child:not(:only-child) .input,html.theme--documenter-dark .field.has-addons .control:last-child:not(:only-child) #documenter .docs-sidebar form.docs-search>input,html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control:last-child:not(:only-child) form.docs-search>input,html.theme--documenter-dark .field.has-addons .control:last-child:not(:only-child) .select select{border-bottom-left-radius:0;border-top-left-radius:0}html.theme--documenter-dark .field.has-addons .control .button:not([disabled]):hover,html.theme--documenter-dark .field.has-addons .control .button.is-hovered:not([disabled]),html.theme--documenter-dark .field.has-addons .control .input:not([disabled]):hover,html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search>input:not([disabled]):hover,html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search>input:not([disabled]):hover,html.theme--documenter-dark .field.has-addons .control .input.is-hovered:not([disabled]),html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search>input.is-hovered:not([disabled]),html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search>input.is-hovered:not([disabled]),html.theme--documenter-dark .field.has-addons .control .select select:not([disabled]):hover,html.theme--documenter-dark .field.has-addons .control .select select.is-hovered:not([disabled]){z-index:2}html.theme--documenter-dark .field.has-addons .control .button:not([disabled]):focus,html.theme--documenter-dark .field.has-addons .control .button.is-focused:not([disabled]),html.theme--documenter-dark .field.has-addons .control .button:not([disabled]):active,html.theme--documenter-dark .field.has-addons .control .button.is-active:not([disabled]),html.theme--documenter-dark .field.has-addons .control .input:not([disabled]):focus,html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search>input:not([disabled]):focus,html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search>input:not([disabled]):focus,html.theme--documenter-dark .field.has-addons .control .input.is-focused:not([disabled]),html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search>input.is-focused:not([disabled]),html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search>input.is-focused:not([disabled]),html.theme--documenter-dark .field.has-addons .control .input:not([disabled]):active,html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search>input:not([disabled]):active,html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search>input:not([disabled]):active,html.theme--documenter-dark .field.has-addons .control .input.is-active:not([disabled]),html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search>input.is-active:not([disabled]),html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search>input.is-active:not([disabled]),html.theme--documenter-dark .field.has-addons .control .select select:not([disabled]):focus,html.theme--documenter-dark .field.has-addons .control .select select.is-focused:not([disabled]),html.theme--documenter-dark .field.has-addons .control .select select:not([disabled]):active,html.theme--documenter-dark .field.has-addons .control .select select.is-active:not([disabled]){z-index:3}html.theme--documenter-dark .field.has-addons .control .button:not([disabled]):focus:hover,html.theme--documenter-dark .field.has-addons .control .button.is-focused:not([disabled]):hover,html.theme--documenter-dark .field.has-addons .control .button:not([disabled]):active:hover,html.theme--documenter-dark .field.has-addons .control .button.is-active:not([disabled]):hover,html.theme--documenter-dark .field.has-addons .control .input:not([disabled]):focus:hover,html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search>input:not([disabled]):focus:hover,html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search>input:not([disabled]):focus:hover,html.theme--documenter-dark .field.has-addons .control .input.is-focused:not([disabled]):hover,html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search>input.is-focused:not([disabled]):hover,html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search>input.is-focused:not([disabled]):hover,html.theme--documenter-dark .field.has-addons .control .input:not([disabled]):active:hover,html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search>input:not([disabled]):active:hover,html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search>input:not([disabled]):active:hover,html.theme--documenter-dark .field.has-addons .control .input.is-active:not([disabled]):hover,html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search>input.is-active:not([disabled]):hover,html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search>input.is-active:not([disabled]):hover,html.theme--documenter-dark .field.has-addons .control .select select:not([disabled]):focus:hover,html.theme--documenter-dark .field.has-addons .control .select select.is-focused:not([disabled]):hover,html.theme--documenter-dark .field.has-addons .control .select select:not([disabled]):active:hover,html.theme--documenter-dark .field.has-addons .control .select select.is-active:not([disabled]):hover{z-index:4}html.theme--documenter-dark .field.has-addons .control.is-expanded{flex-grow:1;flex-shrink:1}html.theme--documenter-dark .field.has-addons.has-addons-centered{justify-content:center}html.theme--documenter-dark .field.has-addons.has-addons-right{justify-content:flex-end}html.theme--documenter-dark .field.has-addons.has-addons-fullwidth .control{flex-grow:1;flex-shrink:0}html.theme--documenter-dark .field.is-grouped{display:flex;justify-content:flex-start}html.theme--documenter-dark .field.is-grouped>.control{flex-shrink:0}html.theme--documenter-dark .field.is-grouped>.control:not(:last-child){margin-bottom:0;margin-right:.75rem}html.theme--documenter-dark .field.is-grouped>.control.is-expanded{flex-grow:1;flex-shrink:1}html.theme--documenter-dark .field.is-grouped.is-grouped-centered{justify-content:center}html.theme--documenter-dark .field.is-grouped.is-grouped-right{justify-content:flex-end}html.theme--documenter-dark .field.is-grouped.is-grouped-multiline{flex-wrap:wrap}html.theme--documenter-dark .field.is-grouped.is-grouped-multiline>.control:last-child,html.theme--documenter-dark .field.is-grouped.is-grouped-multiline>.control:not(:last-child){margin-bottom:0.75rem}html.theme--documenter-dark .field.is-grouped.is-grouped-multiline:last-child{margin-bottom:-0.75rem}html.theme--documenter-dark .field.is-grouped.is-grouped-multiline:not(:last-child){margin-bottom:0}@media screen and (min-width: 769px),print{html.theme--documenter-dark .field.is-horizontal{display:flex}}html.theme--documenter-dark .field-label .label{font-size:inherit}@media screen and (max-width: 768px){html.theme--documenter-dark .field-label{margin-bottom:0.5rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .field-label{flex-basis:0;flex-grow:1;flex-shrink:0;margin-right:1.5rem;text-align:right}html.theme--documenter-dark .field-label.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.field-label{font-size:.75rem;padding-top:0.375em}html.theme--documenter-dark .field-label.is-normal{padding-top:0.375em}html.theme--documenter-dark .field-label.is-medium{font-size:1.25rem;padding-top:0.375em}html.theme--documenter-dark .field-label.is-large{font-size:1.5rem;padding-top:0.375em}}html.theme--documenter-dark .field-body .field .field{margin-bottom:0}@media screen and (min-width: 769px),print{html.theme--documenter-dark .field-body{display:flex;flex-basis:0;flex-grow:5;flex-shrink:1}html.theme--documenter-dark .field-body .field{margin-bottom:0}html.theme--documenter-dark .field-body>.field{flex-shrink:1}html.theme--documenter-dark .field-body>.field:not(.is-narrow){flex-grow:1}html.theme--documenter-dark .field-body>.field:not(:last-child){margin-right:.75rem}}html.theme--documenter-dark .control{box-sizing:border-box;clear:both;font-size:1rem;position:relative;text-align:inherit}html.theme--documenter-dark .control.has-icons-left .input:focus~.icon,html.theme--documenter-dark .control.has-icons-left #documenter .docs-sidebar form.docs-search>input:focus~.icon,html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-left form.docs-search>input:focus~.icon,html.theme--documenter-dark .control.has-icons-left .select:focus~.icon,html.theme--documenter-dark .control.has-icons-right .input:focus~.icon,html.theme--documenter-dark .control.has-icons-right #documenter .docs-sidebar form.docs-search>input:focus~.icon,html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-right form.docs-search>input:focus~.icon,html.theme--documenter-dark .control.has-icons-right .select:focus~.icon{color:#282f2f}html.theme--documenter-dark .control.has-icons-left .input.is-small~.icon,html.theme--documenter-dark .control.has-icons-left #documenter .docs-sidebar form.docs-search>input~.icon,html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-left form.docs-search>input~.icon,html.theme--documenter-dark .control.has-icons-left .select.is-small~.icon,html.theme--documenter-dark .control.has-icons-right .input.is-small~.icon,html.theme--documenter-dark .control.has-icons-right #documenter .docs-sidebar form.docs-search>input~.icon,html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-right form.docs-search>input~.icon,html.theme--documenter-dark .control.has-icons-right .select.is-small~.icon{font-size:.75rem}html.theme--documenter-dark .control.has-icons-left .input.is-medium~.icon,html.theme--documenter-dark .control.has-icons-left #documenter .docs-sidebar form.docs-search>input.is-medium~.icon,html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-left form.docs-search>input.is-medium~.icon,html.theme--documenter-dark .control.has-icons-left .select.is-medium~.icon,html.theme--documenter-dark .control.has-icons-right .input.is-medium~.icon,html.theme--documenter-dark .control.has-icons-right #documenter .docs-sidebar form.docs-search>input.is-medium~.icon,html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-right form.docs-search>input.is-medium~.icon,html.theme--documenter-dark .control.has-icons-right .select.is-medium~.icon{font-size:1.25rem}html.theme--documenter-dark .control.has-icons-left .input.is-large~.icon,html.theme--documenter-dark .control.has-icons-left #documenter .docs-sidebar form.docs-search>input.is-large~.icon,html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-left form.docs-search>input.is-large~.icon,html.theme--documenter-dark .control.has-icons-left .select.is-large~.icon,html.theme--documenter-dark .control.has-icons-right .input.is-large~.icon,html.theme--documenter-dark .control.has-icons-right #documenter .docs-sidebar form.docs-search>input.is-large~.icon,html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-right form.docs-search>input.is-large~.icon,html.theme--documenter-dark .control.has-icons-right .select.is-large~.icon{font-size:1.5rem}html.theme--documenter-dark .control.has-icons-left .icon,html.theme--documenter-dark .control.has-icons-right .icon{color:#5e6d6f;height:2.5em;pointer-events:none;position:absolute;top:0;width:2.5em;z-index:4}html.theme--documenter-dark .control.has-icons-left .input,html.theme--documenter-dark .control.has-icons-left #documenter .docs-sidebar form.docs-search>input,html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-left form.docs-search>input,html.theme--documenter-dark .control.has-icons-left .select select{padding-left:2.5em}html.theme--documenter-dark .control.has-icons-left .icon.is-left{left:0}html.theme--documenter-dark .control.has-icons-right .input,html.theme--documenter-dark .control.has-icons-right #documenter .docs-sidebar form.docs-search>input,html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-right form.docs-search>input,html.theme--documenter-dark .control.has-icons-right .select select{padding-right:2.5em}html.theme--documenter-dark .control.has-icons-right .icon.is-right{right:0}html.theme--documenter-dark .control.is-loading::after{position:absolute !important;right:.625em;top:0.625em;z-index:4}html.theme--documenter-dark .control.is-loading.is-small:after,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-loading:after{font-size:.75rem}html.theme--documenter-dark .control.is-loading.is-medium:after{font-size:1.25rem}html.theme--documenter-dark .control.is-loading.is-large:after{font-size:1.5rem}html.theme--documenter-dark .breadcrumb{font-size:1rem;white-space:nowrap}html.theme--documenter-dark .breadcrumb a{align-items:center;color:#1abc9c;display:flex;justify-content:center;padding:0 .75em}html.theme--documenter-dark .breadcrumb a:hover{color:#1dd2af}html.theme--documenter-dark .breadcrumb li{align-items:center;display:flex}html.theme--documenter-dark .breadcrumb li:first-child a{padding-left:0}html.theme--documenter-dark .breadcrumb li.is-active a{color:#f2f2f2;cursor:default;pointer-events:none}html.theme--documenter-dark .breadcrumb li+li::before{color:#8c9b9d;content:"\0002f"}html.theme--documenter-dark .breadcrumb ul,html.theme--documenter-dark .breadcrumb ol{align-items:flex-start;display:flex;flex-wrap:wrap;justify-content:flex-start}html.theme--documenter-dark .breadcrumb .icon:first-child{margin-right:.5em}html.theme--documenter-dark .breadcrumb .icon:last-child{margin-left:.5em}html.theme--documenter-dark .breadcrumb.is-centered ol,html.theme--documenter-dark .breadcrumb.is-centered ul{justify-content:center}html.theme--documenter-dark .breadcrumb.is-right ol,html.theme--documenter-dark .breadcrumb.is-right ul{justify-content:flex-end}html.theme--documenter-dark .breadcrumb.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.breadcrumb{font-size:.75rem}html.theme--documenter-dark .breadcrumb.is-medium{font-size:1.25rem}html.theme--documenter-dark .breadcrumb.is-large{font-size:1.5rem}html.theme--documenter-dark .breadcrumb.has-arrow-separator li+li::before{content:"\02192"}html.theme--documenter-dark .breadcrumb.has-bullet-separator li+li::before{content:"\02022"}html.theme--documenter-dark .breadcrumb.has-dot-separator li+li::before{content:"\000b7"}html.theme--documenter-dark .breadcrumb.has-succeeds-separator li+li::before{content:"\0227B"}html.theme--documenter-dark .card{background-color:#fff;border-radius:.25rem;box-shadow:#171717;color:#fff;max-width:100%;position:relative}html.theme--documenter-dark .card-footer:first-child,html.theme--documenter-dark .card-content:first-child,html.theme--documenter-dark .card-header:first-child{border-top-left-radius:.25rem;border-top-right-radius:.25rem}html.theme--documenter-dark .card-footer:last-child,html.theme--documenter-dark .card-content:last-child,html.theme--documenter-dark .card-header:last-child{border-bottom-left-radius:.25rem;border-bottom-right-radius:.25rem}html.theme--documenter-dark .card-header{background-color:rgba(0,0,0,0);align-items:stretch;box-shadow:0 0.125em 0.25em rgba(10,10,10,0.1);display:flex}html.theme--documenter-dark .card-header-title{align-items:center;color:#f2f2f2;display:flex;flex-grow:1;font-weight:700;padding:0.75rem 1rem}html.theme--documenter-dark .card-header-title.is-centered{justify-content:center}html.theme--documenter-dark .card-header-icon{-moz-appearance:none;-webkit-appearance:none;appearance:none;background:none;border:none;color:currentColor;font-family:inherit;font-size:1em;margin:0;padding:0;align-items:center;cursor:pointer;display:flex;justify-content:center;padding:0.75rem 1rem}html.theme--documenter-dark .card-image{display:block;position:relative}html.theme--documenter-dark .card-image:first-child img{border-top-left-radius:.25rem;border-top-right-radius:.25rem}html.theme--documenter-dark .card-image:last-child img{border-bottom-left-radius:.25rem;border-bottom-right-radius:.25rem}html.theme--documenter-dark .card-content{background-color:rgba(0,0,0,0);padding:1.5rem}html.theme--documenter-dark .card-footer{background-color:rgba(0,0,0,0);border-top:1px solid #ededed;align-items:stretch;display:flex}html.theme--documenter-dark .card-footer-item{align-items:center;display:flex;flex-basis:0;flex-grow:1;flex-shrink:0;justify-content:center;padding:.75rem}html.theme--documenter-dark .card-footer-item:not(:last-child){border-right:1px solid #ededed}html.theme--documenter-dark .card .media:not(:last-child){margin-bottom:1.5rem}html.theme--documenter-dark .dropdown{display:inline-flex;position:relative;vertical-align:top}html.theme--documenter-dark .dropdown.is-active .dropdown-menu,html.theme--documenter-dark .dropdown.is-hoverable:hover .dropdown-menu{display:block}html.theme--documenter-dark .dropdown.is-right .dropdown-menu{left:auto;right:0}html.theme--documenter-dark .dropdown.is-up .dropdown-menu{bottom:100%;padding-bottom:4px;padding-top:initial;top:auto}html.theme--documenter-dark .dropdown-menu{display:none;left:0;min-width:12rem;padding-top:4px;position:absolute;top:100%;z-index:20}html.theme--documenter-dark .dropdown-content{background-color:#282f2f;border-radius:.4em;box-shadow:#171717;padding-bottom:.5rem;padding-top:.5rem}html.theme--documenter-dark .dropdown-item{color:#fff;display:block;font-size:0.875rem;line-height:1.5;padding:0.375rem 1rem;position:relative}html.theme--documenter-dark a.dropdown-item,html.theme--documenter-dark button.dropdown-item{padding-right:3rem;text-align:inherit;white-space:nowrap;width:100%}html.theme--documenter-dark a.dropdown-item:hover,html.theme--documenter-dark button.dropdown-item:hover{background-color:#282f2f;color:#0a0a0a}html.theme--documenter-dark a.dropdown-item.is-active,html.theme--documenter-dark button.dropdown-item.is-active{background-color:#1abc9c;color:#fff}html.theme--documenter-dark .dropdown-divider{background-color:#ededed;border:none;display:block;height:1px;margin:0.5rem 0}html.theme--documenter-dark .level{align-items:center;justify-content:space-between}html.theme--documenter-dark .level code{border-radius:.4em}html.theme--documenter-dark .level img{display:inline-block;vertical-align:top}html.theme--documenter-dark .level.is-mobile{display:flex}html.theme--documenter-dark .level.is-mobile .level-left,html.theme--documenter-dark .level.is-mobile .level-right{display:flex}html.theme--documenter-dark .level.is-mobile .level-left+.level-right{margin-top:0}html.theme--documenter-dark .level.is-mobile .level-item:not(:last-child){margin-bottom:0;margin-right:.75rem}html.theme--documenter-dark .level.is-mobile .level-item:not(.is-narrow){flex-grow:1}@media screen and (min-width: 769px),print{html.theme--documenter-dark .level{display:flex}html.theme--documenter-dark .level>.level-item:not(.is-narrow){flex-grow:1}}html.theme--documenter-dark .level-item{align-items:center;display:flex;flex-basis:auto;flex-grow:0;flex-shrink:0;justify-content:center}html.theme--documenter-dark .level-item .title,html.theme--documenter-dark .level-item .subtitle{margin-bottom:0}@media screen and (max-width: 768px){html.theme--documenter-dark .level-item:not(:last-child){margin-bottom:.75rem}}html.theme--documenter-dark .level-left,html.theme--documenter-dark .level-right{flex-basis:auto;flex-grow:0;flex-shrink:0}html.theme--documenter-dark .level-left .level-item.is-flexible,html.theme--documenter-dark .level-right .level-item.is-flexible{flex-grow:1}@media screen and (min-width: 769px),print{html.theme--documenter-dark .level-left .level-item:not(:last-child),html.theme--documenter-dark .level-right .level-item:not(:last-child){margin-right:.75rem}}html.theme--documenter-dark .level-left{align-items:center;justify-content:flex-start}@media screen and (max-width: 768px){html.theme--documenter-dark .level-left+.level-right{margin-top:1.5rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .level-left{display:flex}}html.theme--documenter-dark .level-right{align-items:center;justify-content:flex-end}@media screen and (min-width: 769px),print{html.theme--documenter-dark .level-right{display:flex}}html.theme--documenter-dark .media{align-items:flex-start;display:flex;text-align:inherit}html.theme--documenter-dark .media .content:not(:last-child){margin-bottom:.75rem}html.theme--documenter-dark .media .media{border-top:1px solid rgba(94,109,111,0.5);display:flex;padding-top:.75rem}html.theme--documenter-dark .media .media .content:not(:last-child),html.theme--documenter-dark .media .media .control:not(:last-child){margin-bottom:.5rem}html.theme--documenter-dark .media .media .media{padding-top:.5rem}html.theme--documenter-dark .media .media .media+.media{margin-top:.5rem}html.theme--documenter-dark .media+.media{border-top:1px solid rgba(94,109,111,0.5);margin-top:1rem;padding-top:1rem}html.theme--documenter-dark .media.is-large+.media{margin-top:1.5rem;padding-top:1.5rem}html.theme--documenter-dark .media-left,html.theme--documenter-dark .media-right{flex-basis:auto;flex-grow:0;flex-shrink:0}html.theme--documenter-dark .media-left{margin-right:1rem}html.theme--documenter-dark .media-right{margin-left:1rem}html.theme--documenter-dark .media-content{flex-basis:auto;flex-grow:1;flex-shrink:1;text-align:inherit}@media screen and (max-width: 768px){html.theme--documenter-dark .media-content{overflow-x:auto}}html.theme--documenter-dark .menu{font-size:1rem}html.theme--documenter-dark .menu.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.menu{font-size:.75rem}html.theme--documenter-dark .menu.is-medium{font-size:1.25rem}html.theme--documenter-dark .menu.is-large{font-size:1.5rem}html.theme--documenter-dark .menu-list{line-height:1.25}html.theme--documenter-dark .menu-list a{border-radius:3px;color:#fff;display:block;padding:0.5em 0.75em}html.theme--documenter-dark .menu-list a:hover{background-color:#282f2f;color:#f2f2f2}html.theme--documenter-dark .menu-list a.is-active{background-color:#1abc9c;color:#fff}html.theme--documenter-dark .menu-list li ul{border-left:1px solid #5e6d6f;margin:.75em;padding-left:.75em}html.theme--documenter-dark .menu-label{color:#fff;font-size:.75em;letter-spacing:.1em;text-transform:uppercase}html.theme--documenter-dark .menu-label:not(:first-child){margin-top:1em}html.theme--documenter-dark .menu-label:not(:last-child){margin-bottom:1em}html.theme--documenter-dark .message{background-color:#282f2f;border-radius:.4em;font-size:1rem}html.theme--documenter-dark .message strong{color:currentColor}html.theme--documenter-dark .message a:not(.button):not(.tag):not(.dropdown-item){color:currentColor;text-decoration:underline}html.theme--documenter-dark .message.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.message{font-size:.75rem}html.theme--documenter-dark .message.is-medium{font-size:1.25rem}html.theme--documenter-dark .message.is-large{font-size:1.5rem}html.theme--documenter-dark .message.is-white{background-color:#fff}html.theme--documenter-dark .message.is-white .message-header{background-color:#fff;color:#0a0a0a}html.theme--documenter-dark .message.is-white .message-body{border-color:#fff}html.theme--documenter-dark .message.is-black{background-color:#fafafa}html.theme--documenter-dark .message.is-black .message-header{background-color:#0a0a0a;color:#fff}html.theme--documenter-dark .message.is-black .message-body{border-color:#0a0a0a}html.theme--documenter-dark .message.is-light{background-color:#f9fafb}html.theme--documenter-dark .message.is-light .message-header{background-color:#ecf0f1;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .message.is-light .message-body{border-color:#ecf0f1}html.theme--documenter-dark .message.is-dark,html.theme--documenter-dark .content kbd.message{background-color:#f9fafa}html.theme--documenter-dark .message.is-dark .message-header,html.theme--documenter-dark .content kbd.message .message-header{background-color:#282f2f;color:#fff}html.theme--documenter-dark .message.is-dark .message-body,html.theme--documenter-dark .content kbd.message .message-body{border-color:#282f2f}html.theme--documenter-dark .message.is-primary,html.theme--documenter-dark .docstring>section>a.message.docs-sourcelink{background-color:#f1f5f9}html.theme--documenter-dark .message.is-primary .message-header,html.theme--documenter-dark .docstring>section>a.message.docs-sourcelink .message-header{background-color:#375a7f;color:#fff}html.theme--documenter-dark .message.is-primary .message-body,html.theme--documenter-dark .docstring>section>a.message.docs-sourcelink .message-body{border-color:#375a7f;color:#4d7eb2}html.theme--documenter-dark .message.is-link{background-color:#edfdf9}html.theme--documenter-dark .message.is-link .message-header{background-color:#1abc9c;color:#fff}html.theme--documenter-dark .message.is-link .message-body{border-color:#1abc9c;color:#15987e}html.theme--documenter-dark .message.is-info{background-color:#ebf7ff}html.theme--documenter-dark .message.is-info .message-header{background-color:#024c7d;color:#fff}html.theme--documenter-dark .message.is-info .message-body{border-color:#024c7d;color:#0e9dfb}html.theme--documenter-dark .message.is-success{background-color:#ebfff3}html.theme--documenter-dark .message.is-success .message-header{background-color:#008438;color:#fff}html.theme--documenter-dark .message.is-success .message-body{border-color:#008438;color:#00eb64}html.theme--documenter-dark .message.is-warning{background-color:#fffaeb}html.theme--documenter-dark .message.is-warning .message-header{background-color:#ad8100;color:#fff}html.theme--documenter-dark .message.is-warning .message-body{border-color:#ad8100;color:#d19c00}html.theme--documenter-dark .message.is-danger{background-color:#fdeeec}html.theme--documenter-dark .message.is-danger .message-header{background-color:#9e1b0d;color:#fff}html.theme--documenter-dark .message.is-danger .message-body{border-color:#9e1b0d;color:#ec311d}html.theme--documenter-dark .message-header{align-items:center;background-color:#fff;border-radius:.4em .4em 0 0;color:rgba(0,0,0,0.7);display:flex;font-weight:700;justify-content:space-between;line-height:1.25;padding:0.75em 1em;position:relative}html.theme--documenter-dark .message-header .delete{flex-grow:0;flex-shrink:0;margin-left:.75em}html.theme--documenter-dark .message-header+.message-body{border-width:0;border-top-left-radius:0;border-top-right-radius:0}html.theme--documenter-dark .message-body{border-color:#5e6d6f;border-radius:.4em;border-style:solid;border-width:0 0 0 4px;color:#fff;padding:1.25em 1.5em}html.theme--documenter-dark .message-body code,html.theme--documenter-dark .message-body pre{background-color:#fff}html.theme--documenter-dark .message-body pre code{background-color:rgba(0,0,0,0)}html.theme--documenter-dark .modal{align-items:center;display:none;flex-direction:column;justify-content:center;overflow:hidden;position:fixed;z-index:40}html.theme--documenter-dark .modal.is-active{display:flex}html.theme--documenter-dark .modal-background{background-color:rgba(10,10,10,0.86)}html.theme--documenter-dark .modal-content,html.theme--documenter-dark .modal-card{margin:0 20px;max-height:calc(100vh - 160px);overflow:auto;position:relative;width:100%}@media screen and (min-width: 769px){html.theme--documenter-dark .modal-content,html.theme--documenter-dark .modal-card{margin:0 auto;max-height:calc(100vh - 40px);width:640px}}html.theme--documenter-dark .modal-close{background:none;height:40px;position:fixed;right:20px;top:20px;width:40px}html.theme--documenter-dark .modal-card{display:flex;flex-direction:column;max-height:calc(100vh - 40px);overflow:hidden;-ms-overflow-y:visible}html.theme--documenter-dark .modal-card-head,html.theme--documenter-dark .modal-card-foot{align-items:center;background-color:#282f2f;display:flex;flex-shrink:0;justify-content:flex-start;padding:20px;position:relative}html.theme--documenter-dark .modal-card-head{border-bottom:1px solid #5e6d6f;border-top-left-radius:8px;border-top-right-radius:8px}html.theme--documenter-dark .modal-card-title{color:#f2f2f2;flex-grow:1;flex-shrink:0;font-size:1.5rem;line-height:1}html.theme--documenter-dark .modal-card-foot{border-bottom-left-radius:8px;border-bottom-right-radius:8px;border-top:1px solid #5e6d6f}html.theme--documenter-dark .modal-card-foot .button:not(:last-child){margin-right:.5em}html.theme--documenter-dark .modal-card-body{-webkit-overflow-scrolling:touch;background-color:#fff;flex-grow:1;flex-shrink:1;overflow:auto;padding:20px}html.theme--documenter-dark .navbar{background-color:#375a7f;min-height:4rem;position:relative;z-index:30}html.theme--documenter-dark .navbar.is-white{background-color:#fff;color:#0a0a0a}html.theme--documenter-dark .navbar.is-white .navbar-brand>.navbar-item,html.theme--documenter-dark .navbar.is-white .navbar-brand .navbar-link{color:#0a0a0a}html.theme--documenter-dark .navbar.is-white .navbar-brand>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-white .navbar-brand>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-white .navbar-brand>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-white .navbar-brand .navbar-link:focus,html.theme--documenter-dark .navbar.is-white .navbar-brand .navbar-link:hover,html.theme--documenter-dark .navbar.is-white .navbar-brand .navbar-link.is-active{background-color:#f2f2f2;color:#0a0a0a}html.theme--documenter-dark .navbar.is-white .navbar-brand .navbar-link::after{border-color:#0a0a0a}html.theme--documenter-dark .navbar.is-white .navbar-burger{color:#0a0a0a}@media screen and (min-width: 1056px){html.theme--documenter-dark .navbar.is-white .navbar-start>.navbar-item,html.theme--documenter-dark .navbar.is-white .navbar-start .navbar-link,html.theme--documenter-dark .navbar.is-white .navbar-end>.navbar-item,html.theme--documenter-dark .navbar.is-white .navbar-end .navbar-link{color:#0a0a0a}html.theme--documenter-dark .navbar.is-white .navbar-start>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-white .navbar-start>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-white .navbar-start>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-white .navbar-start .navbar-link:focus,html.theme--documenter-dark .navbar.is-white .navbar-start .navbar-link:hover,html.theme--documenter-dark .navbar.is-white .navbar-start .navbar-link.is-active,html.theme--documenter-dark .navbar.is-white .navbar-end>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-white .navbar-end>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-white .navbar-end>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-white .navbar-end .navbar-link:focus,html.theme--documenter-dark .navbar.is-white .navbar-end .navbar-link:hover,html.theme--documenter-dark .navbar.is-white .navbar-end .navbar-link.is-active{background-color:#f2f2f2;color:#0a0a0a}html.theme--documenter-dark .navbar.is-white .navbar-start .navbar-link::after,html.theme--documenter-dark .navbar.is-white .navbar-end .navbar-link::after{border-color:#0a0a0a}html.theme--documenter-dark .navbar.is-white .navbar-item.has-dropdown:focus .navbar-link,html.theme--documenter-dark .navbar.is-white .navbar-item.has-dropdown:hover .navbar-link,html.theme--documenter-dark .navbar.is-white .navbar-item.has-dropdown.is-active .navbar-link{background-color:#f2f2f2;color:#0a0a0a}html.theme--documenter-dark .navbar.is-white .navbar-dropdown a.navbar-item.is-active{background-color:#fff;color:#0a0a0a}}html.theme--documenter-dark .navbar.is-black{background-color:#0a0a0a;color:#fff}html.theme--documenter-dark .navbar.is-black .navbar-brand>.navbar-item,html.theme--documenter-dark .navbar.is-black .navbar-brand .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-black .navbar-brand>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-black .navbar-brand>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-black .navbar-brand>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-black .navbar-brand .navbar-link:focus,html.theme--documenter-dark .navbar.is-black .navbar-brand .navbar-link:hover,html.theme--documenter-dark .navbar.is-black .navbar-brand .navbar-link.is-active{background-color:#000;color:#fff}html.theme--documenter-dark .navbar.is-black .navbar-brand .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-black .navbar-burger{color:#fff}@media screen and (min-width: 1056px){html.theme--documenter-dark .navbar.is-black .navbar-start>.navbar-item,html.theme--documenter-dark .navbar.is-black .navbar-start .navbar-link,html.theme--documenter-dark .navbar.is-black .navbar-end>.navbar-item,html.theme--documenter-dark .navbar.is-black .navbar-end .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-black .navbar-start>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-black .navbar-start>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-black .navbar-start>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-black .navbar-start .navbar-link:focus,html.theme--documenter-dark .navbar.is-black .navbar-start .navbar-link:hover,html.theme--documenter-dark .navbar.is-black .navbar-start .navbar-link.is-active,html.theme--documenter-dark .navbar.is-black .navbar-end>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-black .navbar-end>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-black .navbar-end>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-black .navbar-end .navbar-link:focus,html.theme--documenter-dark .navbar.is-black .navbar-end .navbar-link:hover,html.theme--documenter-dark .navbar.is-black .navbar-end .navbar-link.is-active{background-color:#000;color:#fff}html.theme--documenter-dark .navbar.is-black .navbar-start .navbar-link::after,html.theme--documenter-dark .navbar.is-black .navbar-end .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-black .navbar-item.has-dropdown:focus .navbar-link,html.theme--documenter-dark .navbar.is-black .navbar-item.has-dropdown:hover .navbar-link,html.theme--documenter-dark .navbar.is-black .navbar-item.has-dropdown.is-active .navbar-link{background-color:#000;color:#fff}html.theme--documenter-dark .navbar.is-black .navbar-dropdown a.navbar-item.is-active{background-color:#0a0a0a;color:#fff}}html.theme--documenter-dark .navbar.is-light{background-color:#ecf0f1;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .navbar.is-light .navbar-brand>.navbar-item,html.theme--documenter-dark .navbar.is-light .navbar-brand .navbar-link{color:rgba(0,0,0,0.7)}html.theme--documenter-dark .navbar.is-light .navbar-brand>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-light .navbar-brand>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-light .navbar-brand>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-light .navbar-brand .navbar-link:focus,html.theme--documenter-dark .navbar.is-light .navbar-brand .navbar-link:hover,html.theme--documenter-dark .navbar.is-light .navbar-brand .navbar-link.is-active{background-color:#dde4e6;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .navbar.is-light .navbar-brand .navbar-link::after{border-color:rgba(0,0,0,0.7)}html.theme--documenter-dark .navbar.is-light .navbar-burger{color:rgba(0,0,0,0.7)}@media screen and (min-width: 1056px){html.theme--documenter-dark .navbar.is-light .navbar-start>.navbar-item,html.theme--documenter-dark .navbar.is-light .navbar-start .navbar-link,html.theme--documenter-dark .navbar.is-light .navbar-end>.navbar-item,html.theme--documenter-dark .navbar.is-light .navbar-end .navbar-link{color:rgba(0,0,0,0.7)}html.theme--documenter-dark .navbar.is-light .navbar-start>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-light .navbar-start>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-light .navbar-start>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-light .navbar-start .navbar-link:focus,html.theme--documenter-dark .navbar.is-light .navbar-start .navbar-link:hover,html.theme--documenter-dark .navbar.is-light .navbar-start .navbar-link.is-active,html.theme--documenter-dark .navbar.is-light .navbar-end>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-light .navbar-end>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-light .navbar-end>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-light .navbar-end .navbar-link:focus,html.theme--documenter-dark .navbar.is-light .navbar-end .navbar-link:hover,html.theme--documenter-dark .navbar.is-light .navbar-end .navbar-link.is-active{background-color:#dde4e6;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .navbar.is-light .navbar-start .navbar-link::after,html.theme--documenter-dark .navbar.is-light .navbar-end .navbar-link::after{border-color:rgba(0,0,0,0.7)}html.theme--documenter-dark .navbar.is-light .navbar-item.has-dropdown:focus .navbar-link,html.theme--documenter-dark .navbar.is-light .navbar-item.has-dropdown:hover .navbar-link,html.theme--documenter-dark .navbar.is-light .navbar-item.has-dropdown.is-active .navbar-link{background-color:#dde4e6;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .navbar.is-light .navbar-dropdown a.navbar-item.is-active{background-color:#ecf0f1;color:rgba(0,0,0,0.7)}}html.theme--documenter-dark .navbar.is-dark,html.theme--documenter-dark .content kbd.navbar{background-color:#282f2f;color:#fff}html.theme--documenter-dark .navbar.is-dark .navbar-brand>.navbar-item,html.theme--documenter-dark .content kbd.navbar .navbar-brand>.navbar-item,html.theme--documenter-dark .navbar.is-dark .navbar-brand .navbar-link,html.theme--documenter-dark .content kbd.navbar .navbar-brand .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-dark .navbar-brand>a.navbar-item:focus,html.theme--documenter-dark .content kbd.navbar .navbar-brand>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-dark .navbar-brand>a.navbar-item:hover,html.theme--documenter-dark .content kbd.navbar .navbar-brand>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-dark .navbar-brand>a.navbar-item.is-active,html.theme--documenter-dark .content kbd.navbar .navbar-brand>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-dark .navbar-brand .navbar-link:focus,html.theme--documenter-dark .content kbd.navbar .navbar-brand .navbar-link:focus,html.theme--documenter-dark .navbar.is-dark .navbar-brand .navbar-link:hover,html.theme--documenter-dark .content kbd.navbar .navbar-brand .navbar-link:hover,html.theme--documenter-dark .navbar.is-dark .navbar-brand .navbar-link.is-active,html.theme--documenter-dark .content kbd.navbar .navbar-brand .navbar-link.is-active{background-color:#1d2122;color:#fff}html.theme--documenter-dark .navbar.is-dark .navbar-brand .navbar-link::after,html.theme--documenter-dark .content kbd.navbar .navbar-brand .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-dark .navbar-burger,html.theme--documenter-dark .content kbd.navbar .navbar-burger{color:#fff}@media screen and (min-width: 1056px){html.theme--documenter-dark .navbar.is-dark .navbar-start>.navbar-item,html.theme--documenter-dark .content kbd.navbar .navbar-start>.navbar-item,html.theme--documenter-dark .navbar.is-dark .navbar-start .navbar-link,html.theme--documenter-dark .content kbd.navbar .navbar-start .navbar-link,html.theme--documenter-dark .navbar.is-dark .navbar-end>.navbar-item,html.theme--documenter-dark .content kbd.navbar .navbar-end>.navbar-item,html.theme--documenter-dark .navbar.is-dark .navbar-end .navbar-link,html.theme--documenter-dark .content kbd.navbar .navbar-end .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-dark .navbar-start>a.navbar-item:focus,html.theme--documenter-dark .content kbd.navbar .navbar-start>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-dark .navbar-start>a.navbar-item:hover,html.theme--documenter-dark .content kbd.navbar .navbar-start>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-dark .navbar-start>a.navbar-item.is-active,html.theme--documenter-dark .content kbd.navbar .navbar-start>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-dark .navbar-start .navbar-link:focus,html.theme--documenter-dark .content kbd.navbar .navbar-start .navbar-link:focus,html.theme--documenter-dark .navbar.is-dark .navbar-start .navbar-link:hover,html.theme--documenter-dark .content kbd.navbar .navbar-start .navbar-link:hover,html.theme--documenter-dark .navbar.is-dark .navbar-start .navbar-link.is-active,html.theme--documenter-dark .content kbd.navbar .navbar-start .navbar-link.is-active,html.theme--documenter-dark .navbar.is-dark .navbar-end>a.navbar-item:focus,html.theme--documenter-dark .content kbd.navbar .navbar-end>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-dark .navbar-end>a.navbar-item:hover,html.theme--documenter-dark .content kbd.navbar .navbar-end>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-dark .navbar-end>a.navbar-item.is-active,html.theme--documenter-dark .content kbd.navbar .navbar-end>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-dark .navbar-end .navbar-link:focus,html.theme--documenter-dark .content kbd.navbar .navbar-end .navbar-link:focus,html.theme--documenter-dark .navbar.is-dark .navbar-end .navbar-link:hover,html.theme--documenter-dark .content kbd.navbar .navbar-end .navbar-link:hover,html.theme--documenter-dark .navbar.is-dark .navbar-end .navbar-link.is-active,html.theme--documenter-dark .content kbd.navbar .navbar-end .navbar-link.is-active{background-color:#1d2122;color:#fff}html.theme--documenter-dark .navbar.is-dark .navbar-start .navbar-link::after,html.theme--documenter-dark .content kbd.navbar .navbar-start .navbar-link::after,html.theme--documenter-dark .navbar.is-dark .navbar-end .navbar-link::after,html.theme--documenter-dark .content kbd.navbar .navbar-end .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-dark .navbar-item.has-dropdown:focus .navbar-link,html.theme--documenter-dark .content kbd.navbar .navbar-item.has-dropdown:focus .navbar-link,html.theme--documenter-dark .navbar.is-dark .navbar-item.has-dropdown:hover .navbar-link,html.theme--documenter-dark .content kbd.navbar .navbar-item.has-dropdown:hover .navbar-link,html.theme--documenter-dark .navbar.is-dark .navbar-item.has-dropdown.is-active .navbar-link,html.theme--documenter-dark .content kbd.navbar .navbar-item.has-dropdown.is-active .navbar-link{background-color:#1d2122;color:#fff}html.theme--documenter-dark .navbar.is-dark .navbar-dropdown a.navbar-item.is-active,html.theme--documenter-dark .content kbd.navbar .navbar-dropdown a.navbar-item.is-active{background-color:#282f2f;color:#fff}}html.theme--documenter-dark .navbar.is-primary,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink{background-color:#375a7f;color:#fff}html.theme--documenter-dark .navbar.is-primary .navbar-brand>.navbar-item,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-brand>.navbar-item,html.theme--documenter-dark .navbar.is-primary .navbar-brand .navbar-link,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-brand .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-primary .navbar-brand>a.navbar-item:focus,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-brand>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-primary .navbar-brand>a.navbar-item:hover,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-brand>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-primary .navbar-brand>a.navbar-item.is-active,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-brand>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-primary .navbar-brand .navbar-link:focus,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-brand .navbar-link:focus,html.theme--documenter-dark .navbar.is-primary .navbar-brand .navbar-link:hover,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-brand .navbar-link:hover,html.theme--documenter-dark .navbar.is-primary .navbar-brand .navbar-link.is-active,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-brand .navbar-link.is-active{background-color:#2f4d6d;color:#fff}html.theme--documenter-dark .navbar.is-primary .navbar-brand .navbar-link::after,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-brand .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-primary .navbar-burger,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-burger{color:#fff}@media screen and (min-width: 1056px){html.theme--documenter-dark .navbar.is-primary .navbar-start>.navbar-item,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-start>.navbar-item,html.theme--documenter-dark .navbar.is-primary .navbar-start .navbar-link,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-start .navbar-link,html.theme--documenter-dark .navbar.is-primary .navbar-end>.navbar-item,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-end>.navbar-item,html.theme--documenter-dark .navbar.is-primary .navbar-end .navbar-link,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-end .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-primary .navbar-start>a.navbar-item:focus,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-start>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-primary .navbar-start>a.navbar-item:hover,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-start>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-primary .navbar-start>a.navbar-item.is-active,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-start>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-primary .navbar-start .navbar-link:focus,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-start .navbar-link:focus,html.theme--documenter-dark .navbar.is-primary .navbar-start .navbar-link:hover,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-start .navbar-link:hover,html.theme--documenter-dark .navbar.is-primary .navbar-start .navbar-link.is-active,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-start .navbar-link.is-active,html.theme--documenter-dark .navbar.is-primary .navbar-end>a.navbar-item:focus,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-end>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-primary .navbar-end>a.navbar-item:hover,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-end>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-primary .navbar-end>a.navbar-item.is-active,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-end>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-primary .navbar-end .navbar-link:focus,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-end .navbar-link:focus,html.theme--documenter-dark .navbar.is-primary .navbar-end .navbar-link:hover,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-end .navbar-link:hover,html.theme--documenter-dark .navbar.is-primary .navbar-end .navbar-link.is-active,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-end .navbar-link.is-active{background-color:#2f4d6d;color:#fff}html.theme--documenter-dark .navbar.is-primary .navbar-start .navbar-link::after,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-start .navbar-link::after,html.theme--documenter-dark .navbar.is-primary .navbar-end .navbar-link::after,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-end .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-primary .navbar-item.has-dropdown:focus .navbar-link,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-item.has-dropdown:focus .navbar-link,html.theme--documenter-dark .navbar.is-primary .navbar-item.has-dropdown:hover .navbar-link,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-item.has-dropdown:hover .navbar-link,html.theme--documenter-dark .navbar.is-primary .navbar-item.has-dropdown.is-active .navbar-link,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-item.has-dropdown.is-active .navbar-link{background-color:#2f4d6d;color:#fff}html.theme--documenter-dark .navbar.is-primary .navbar-dropdown a.navbar-item.is-active,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-dropdown a.navbar-item.is-active{background-color:#375a7f;color:#fff}}html.theme--documenter-dark .navbar.is-link{background-color:#1abc9c;color:#fff}html.theme--documenter-dark .navbar.is-link .navbar-brand>.navbar-item,html.theme--documenter-dark .navbar.is-link .navbar-brand .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-link .navbar-brand>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-link .navbar-brand>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-link .navbar-brand>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-link .navbar-brand .navbar-link:focus,html.theme--documenter-dark .navbar.is-link .navbar-brand .navbar-link:hover,html.theme--documenter-dark .navbar.is-link .navbar-brand .navbar-link.is-active{background-color:#17a689;color:#fff}html.theme--documenter-dark .navbar.is-link .navbar-brand .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-link .navbar-burger{color:#fff}@media screen and (min-width: 1056px){html.theme--documenter-dark .navbar.is-link .navbar-start>.navbar-item,html.theme--documenter-dark .navbar.is-link .navbar-start .navbar-link,html.theme--documenter-dark .navbar.is-link .navbar-end>.navbar-item,html.theme--documenter-dark .navbar.is-link .navbar-end .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-link .navbar-start>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-link .navbar-start>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-link .navbar-start>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-link .navbar-start .navbar-link:focus,html.theme--documenter-dark .navbar.is-link .navbar-start .navbar-link:hover,html.theme--documenter-dark .navbar.is-link .navbar-start .navbar-link.is-active,html.theme--documenter-dark .navbar.is-link .navbar-end>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-link .navbar-end>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-link .navbar-end>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-link .navbar-end .navbar-link:focus,html.theme--documenter-dark .navbar.is-link .navbar-end .navbar-link:hover,html.theme--documenter-dark .navbar.is-link .navbar-end .navbar-link.is-active{background-color:#17a689;color:#fff}html.theme--documenter-dark .navbar.is-link .navbar-start .navbar-link::after,html.theme--documenter-dark .navbar.is-link .navbar-end .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-link .navbar-item.has-dropdown:focus .navbar-link,html.theme--documenter-dark .navbar.is-link .navbar-item.has-dropdown:hover .navbar-link,html.theme--documenter-dark .navbar.is-link .navbar-item.has-dropdown.is-active .navbar-link{background-color:#17a689;color:#fff}html.theme--documenter-dark .navbar.is-link .navbar-dropdown a.navbar-item.is-active{background-color:#1abc9c;color:#fff}}html.theme--documenter-dark .navbar.is-info{background-color:#024c7d;color:#fff}html.theme--documenter-dark .navbar.is-info .navbar-brand>.navbar-item,html.theme--documenter-dark .navbar.is-info .navbar-brand .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-info .navbar-brand>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-info .navbar-brand>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-info .navbar-brand>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-info .navbar-brand .navbar-link:focus,html.theme--documenter-dark .navbar.is-info .navbar-brand .navbar-link:hover,html.theme--documenter-dark .navbar.is-info .navbar-brand .navbar-link.is-active{background-color:#023d64;color:#fff}html.theme--documenter-dark .navbar.is-info .navbar-brand .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-info .navbar-burger{color:#fff}@media screen and (min-width: 1056px){html.theme--documenter-dark .navbar.is-info .navbar-start>.navbar-item,html.theme--documenter-dark .navbar.is-info .navbar-start .navbar-link,html.theme--documenter-dark .navbar.is-info .navbar-end>.navbar-item,html.theme--documenter-dark .navbar.is-info .navbar-end .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-info .navbar-start>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-info .navbar-start>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-info .navbar-start>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-info .navbar-start .navbar-link:focus,html.theme--documenter-dark .navbar.is-info .navbar-start .navbar-link:hover,html.theme--documenter-dark .navbar.is-info .navbar-start .navbar-link.is-active,html.theme--documenter-dark .navbar.is-info .navbar-end>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-info .navbar-end>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-info .navbar-end>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-info .navbar-end .navbar-link:focus,html.theme--documenter-dark .navbar.is-info .navbar-end .navbar-link:hover,html.theme--documenter-dark .navbar.is-info .navbar-end .navbar-link.is-active{background-color:#023d64;color:#fff}html.theme--documenter-dark .navbar.is-info .navbar-start .navbar-link::after,html.theme--documenter-dark .navbar.is-info .navbar-end .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-info .navbar-item.has-dropdown:focus .navbar-link,html.theme--documenter-dark .navbar.is-info .navbar-item.has-dropdown:hover .navbar-link,html.theme--documenter-dark .navbar.is-info .navbar-item.has-dropdown.is-active .navbar-link{background-color:#023d64;color:#fff}html.theme--documenter-dark .navbar.is-info .navbar-dropdown a.navbar-item.is-active{background-color:#024c7d;color:#fff}}html.theme--documenter-dark .navbar.is-success{background-color:#008438;color:#fff}html.theme--documenter-dark .navbar.is-success .navbar-brand>.navbar-item,html.theme--documenter-dark .navbar.is-success .navbar-brand .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-success .navbar-brand>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-success .navbar-brand>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-success .navbar-brand>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-success .navbar-brand .navbar-link:focus,html.theme--documenter-dark .navbar.is-success .navbar-brand .navbar-link:hover,html.theme--documenter-dark .navbar.is-success .navbar-brand .navbar-link.is-active{background-color:#006b2d;color:#fff}html.theme--documenter-dark .navbar.is-success .navbar-brand .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-success .navbar-burger{color:#fff}@media screen and (min-width: 1056px){html.theme--documenter-dark .navbar.is-success .navbar-start>.navbar-item,html.theme--documenter-dark .navbar.is-success .navbar-start .navbar-link,html.theme--documenter-dark .navbar.is-success .navbar-end>.navbar-item,html.theme--documenter-dark .navbar.is-success .navbar-end .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-success .navbar-start>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-success .navbar-start>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-success .navbar-start>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-success .navbar-start .navbar-link:focus,html.theme--documenter-dark .navbar.is-success .navbar-start .navbar-link:hover,html.theme--documenter-dark .navbar.is-success .navbar-start .navbar-link.is-active,html.theme--documenter-dark .navbar.is-success .navbar-end>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-success .navbar-end>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-success .navbar-end>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-success .navbar-end .navbar-link:focus,html.theme--documenter-dark .navbar.is-success .navbar-end .navbar-link:hover,html.theme--documenter-dark .navbar.is-success .navbar-end .navbar-link.is-active{background-color:#006b2d;color:#fff}html.theme--documenter-dark .navbar.is-success .navbar-start .navbar-link::after,html.theme--documenter-dark .navbar.is-success .navbar-end .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-success .navbar-item.has-dropdown:focus .navbar-link,html.theme--documenter-dark .navbar.is-success .navbar-item.has-dropdown:hover .navbar-link,html.theme--documenter-dark .navbar.is-success .navbar-item.has-dropdown.is-active .navbar-link{background-color:#006b2d;color:#fff}html.theme--documenter-dark .navbar.is-success .navbar-dropdown a.navbar-item.is-active{background-color:#008438;color:#fff}}html.theme--documenter-dark .navbar.is-warning{background-color:#ad8100;color:#fff}html.theme--documenter-dark .navbar.is-warning .navbar-brand>.navbar-item,html.theme--documenter-dark .navbar.is-warning .navbar-brand .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-warning .navbar-brand>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-warning .navbar-brand>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-warning .navbar-brand>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-warning .navbar-brand .navbar-link:focus,html.theme--documenter-dark .navbar.is-warning .navbar-brand .navbar-link:hover,html.theme--documenter-dark .navbar.is-warning .navbar-brand .navbar-link.is-active{background-color:#946e00;color:#fff}html.theme--documenter-dark .navbar.is-warning .navbar-brand .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-warning .navbar-burger{color:#fff}@media screen and (min-width: 1056px){html.theme--documenter-dark .navbar.is-warning .navbar-start>.navbar-item,html.theme--documenter-dark .navbar.is-warning .navbar-start .navbar-link,html.theme--documenter-dark .navbar.is-warning .navbar-end>.navbar-item,html.theme--documenter-dark .navbar.is-warning .navbar-end .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-warning .navbar-start>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-warning .navbar-start>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-warning .navbar-start>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-warning .navbar-start .navbar-link:focus,html.theme--documenter-dark .navbar.is-warning .navbar-start .navbar-link:hover,html.theme--documenter-dark .navbar.is-warning .navbar-start .navbar-link.is-active,html.theme--documenter-dark .navbar.is-warning .navbar-end>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-warning .navbar-end>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-warning .navbar-end>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-warning .navbar-end .navbar-link:focus,html.theme--documenter-dark .navbar.is-warning .navbar-end .navbar-link:hover,html.theme--documenter-dark .navbar.is-warning .navbar-end .navbar-link.is-active{background-color:#946e00;color:#fff}html.theme--documenter-dark .navbar.is-warning .navbar-start .navbar-link::after,html.theme--documenter-dark .navbar.is-warning .navbar-end .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-warning .navbar-item.has-dropdown:focus .navbar-link,html.theme--documenter-dark .navbar.is-warning .navbar-item.has-dropdown:hover .navbar-link,html.theme--documenter-dark .navbar.is-warning .navbar-item.has-dropdown.is-active .navbar-link{background-color:#946e00;color:#fff}html.theme--documenter-dark .navbar.is-warning .navbar-dropdown a.navbar-item.is-active{background-color:#ad8100;color:#fff}}html.theme--documenter-dark .navbar.is-danger{background-color:#9e1b0d;color:#fff}html.theme--documenter-dark .navbar.is-danger .navbar-brand>.navbar-item,html.theme--documenter-dark .navbar.is-danger .navbar-brand .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-danger .navbar-brand>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-danger .navbar-brand>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-danger .navbar-brand>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-danger .navbar-brand .navbar-link:focus,html.theme--documenter-dark .navbar.is-danger .navbar-brand .navbar-link:hover,html.theme--documenter-dark .navbar.is-danger .navbar-brand .navbar-link.is-active{background-color:#86170b;color:#fff}html.theme--documenter-dark .navbar.is-danger .navbar-brand .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-danger .navbar-burger{color:#fff}@media screen and (min-width: 1056px){html.theme--documenter-dark .navbar.is-danger .navbar-start>.navbar-item,html.theme--documenter-dark .navbar.is-danger .navbar-start .navbar-link,html.theme--documenter-dark .navbar.is-danger .navbar-end>.navbar-item,html.theme--documenter-dark .navbar.is-danger .navbar-end .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-danger .navbar-start>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-danger .navbar-start>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-danger .navbar-start>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-danger .navbar-start .navbar-link:focus,html.theme--documenter-dark .navbar.is-danger .navbar-start .navbar-link:hover,html.theme--documenter-dark .navbar.is-danger .navbar-start .navbar-link.is-active,html.theme--documenter-dark .navbar.is-danger .navbar-end>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-danger .navbar-end>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-danger .navbar-end>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-danger .navbar-end .navbar-link:focus,html.theme--documenter-dark .navbar.is-danger .navbar-end .navbar-link:hover,html.theme--documenter-dark .navbar.is-danger .navbar-end .navbar-link.is-active{background-color:#86170b;color:#fff}html.theme--documenter-dark .navbar.is-danger .navbar-start .navbar-link::after,html.theme--documenter-dark .navbar.is-danger .navbar-end .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-danger .navbar-item.has-dropdown:focus .navbar-link,html.theme--documenter-dark .navbar.is-danger .navbar-item.has-dropdown:hover .navbar-link,html.theme--documenter-dark .navbar.is-danger .navbar-item.has-dropdown.is-active .navbar-link{background-color:#86170b;color:#fff}html.theme--documenter-dark .navbar.is-danger .navbar-dropdown a.navbar-item.is-active{background-color:#9e1b0d;color:#fff}}html.theme--documenter-dark .navbar>.container{align-items:stretch;display:flex;min-height:4rem;width:100%}html.theme--documenter-dark .navbar.has-shadow{box-shadow:0 2px 0 0 #282f2f}html.theme--documenter-dark .navbar.is-fixed-bottom,html.theme--documenter-dark .navbar.is-fixed-top{left:0;position:fixed;right:0;z-index:30}html.theme--documenter-dark .navbar.is-fixed-bottom{bottom:0}html.theme--documenter-dark .navbar.is-fixed-bottom.has-shadow{box-shadow:0 -2px 0 0 #282f2f}html.theme--documenter-dark .navbar.is-fixed-top{top:0}html.theme--documenter-dark html.has-navbar-fixed-top,html.theme--documenter-dark body.has-navbar-fixed-top{padding-top:4rem}html.theme--documenter-dark html.has-navbar-fixed-bottom,html.theme--documenter-dark body.has-navbar-fixed-bottom{padding-bottom:4rem}html.theme--documenter-dark .navbar-brand,html.theme--documenter-dark .navbar-tabs{align-items:stretch;display:flex;flex-shrink:0;min-height:4rem}html.theme--documenter-dark .navbar-brand a.navbar-item:focus,html.theme--documenter-dark .navbar-brand a.navbar-item:hover{background-color:transparent}html.theme--documenter-dark .navbar-tabs{-webkit-overflow-scrolling:touch;max-width:100vw;overflow-x:auto;overflow-y:hidden}html.theme--documenter-dark .navbar-burger{color:#fff;-moz-appearance:none;-webkit-appearance:none;appearance:none;background:none;border:none;cursor:pointer;display:block;height:4rem;position:relative;width:4rem;margin-left:auto}html.theme--documenter-dark .navbar-burger span{background-color:currentColor;display:block;height:1px;left:calc(50% - 8px);position:absolute;transform-origin:center;transition-duration:86ms;transition-property:background-color, opacity, transform;transition-timing-function:ease-out;width:16px}html.theme--documenter-dark .navbar-burger span:nth-child(1){top:calc(50% - 6px)}html.theme--documenter-dark .navbar-burger span:nth-child(2){top:calc(50% - 1px)}html.theme--documenter-dark .navbar-burger span:nth-child(3){top:calc(50% + 4px)}html.theme--documenter-dark .navbar-burger:hover{background-color:rgba(0,0,0,0.05)}html.theme--documenter-dark .navbar-burger.is-active span:nth-child(1){transform:translateY(5px) rotate(45deg)}html.theme--documenter-dark .navbar-burger.is-active span:nth-child(2){opacity:0}html.theme--documenter-dark .navbar-burger.is-active span:nth-child(3){transform:translateY(-5px) rotate(-45deg)}html.theme--documenter-dark .navbar-menu{display:none}html.theme--documenter-dark .navbar-item,html.theme--documenter-dark .navbar-link{color:#fff;display:block;line-height:1.5;padding:0.5rem 0.75rem;position:relative}html.theme--documenter-dark .navbar-item .icon:only-child,html.theme--documenter-dark .navbar-link .icon:only-child{margin-left:-0.25rem;margin-right:-0.25rem}html.theme--documenter-dark a.navbar-item,html.theme--documenter-dark .navbar-link{cursor:pointer}html.theme--documenter-dark a.navbar-item:focus,html.theme--documenter-dark a.navbar-item:focus-within,html.theme--documenter-dark a.navbar-item:hover,html.theme--documenter-dark a.navbar-item.is-active,html.theme--documenter-dark .navbar-link:focus,html.theme--documenter-dark .navbar-link:focus-within,html.theme--documenter-dark .navbar-link:hover,html.theme--documenter-dark .navbar-link.is-active{background-color:rgba(0,0,0,0);color:#1abc9c}html.theme--documenter-dark .navbar-item{flex-grow:0;flex-shrink:0}html.theme--documenter-dark .navbar-item img{max-height:1.75rem}html.theme--documenter-dark .navbar-item.has-dropdown{padding:0}html.theme--documenter-dark .navbar-item.is-expanded{flex-grow:1;flex-shrink:1}html.theme--documenter-dark .navbar-item.is-tab{border-bottom:1px solid transparent;min-height:4rem;padding-bottom:calc(0.5rem - 1px)}html.theme--documenter-dark .navbar-item.is-tab:focus,html.theme--documenter-dark .navbar-item.is-tab:hover{background-color:rgba(0,0,0,0);border-bottom-color:#1abc9c}html.theme--documenter-dark .navbar-item.is-tab.is-active{background-color:rgba(0,0,0,0);border-bottom-color:#1abc9c;border-bottom-style:solid;border-bottom-width:3px;color:#1abc9c;padding-bottom:calc(0.5rem - 3px)}html.theme--documenter-dark .navbar-content{flex-grow:1;flex-shrink:1}html.theme--documenter-dark .navbar-link:not(.is-arrowless){padding-right:2.5em}html.theme--documenter-dark .navbar-link:not(.is-arrowless)::after{border-color:#fff;margin-top:-0.375em;right:1.125em}html.theme--documenter-dark .navbar-dropdown{font-size:0.875rem;padding-bottom:0.5rem;padding-top:0.5rem}html.theme--documenter-dark .navbar-dropdown .navbar-item{padding-left:1.5rem;padding-right:1.5rem}html.theme--documenter-dark .navbar-divider{background-color:rgba(0,0,0,0.2);border:none;display:none;height:2px;margin:0.5rem 0}@media screen and (max-width: 1055px){html.theme--documenter-dark .navbar>.container{display:block}html.theme--documenter-dark .navbar-brand .navbar-item,html.theme--documenter-dark .navbar-tabs .navbar-item{align-items:center;display:flex}html.theme--documenter-dark .navbar-link::after{display:none}html.theme--documenter-dark .navbar-menu{background-color:#375a7f;box-shadow:0 8px 16px rgba(10,10,10,0.1);padding:0.5rem 0}html.theme--documenter-dark .navbar-menu.is-active{display:block}html.theme--documenter-dark .navbar.is-fixed-bottom-touch,html.theme--documenter-dark .navbar.is-fixed-top-touch{left:0;position:fixed;right:0;z-index:30}html.theme--documenter-dark .navbar.is-fixed-bottom-touch{bottom:0}html.theme--documenter-dark .navbar.is-fixed-bottom-touch.has-shadow{box-shadow:0 -2px 3px rgba(10,10,10,0.1)}html.theme--documenter-dark .navbar.is-fixed-top-touch{top:0}html.theme--documenter-dark .navbar.is-fixed-top .navbar-menu,html.theme--documenter-dark .navbar.is-fixed-top-touch .navbar-menu{-webkit-overflow-scrolling:touch;max-height:calc(100vh - 4rem);overflow:auto}html.theme--documenter-dark html.has-navbar-fixed-top-touch,html.theme--documenter-dark body.has-navbar-fixed-top-touch{padding-top:4rem}html.theme--documenter-dark html.has-navbar-fixed-bottom-touch,html.theme--documenter-dark body.has-navbar-fixed-bottom-touch{padding-bottom:4rem}}@media screen and (min-width: 1056px){html.theme--documenter-dark .navbar,html.theme--documenter-dark .navbar-menu,html.theme--documenter-dark .navbar-start,html.theme--documenter-dark .navbar-end{align-items:stretch;display:flex}html.theme--documenter-dark .navbar{min-height:4rem}html.theme--documenter-dark .navbar.is-spaced{padding:1rem 2rem}html.theme--documenter-dark .navbar.is-spaced .navbar-start,html.theme--documenter-dark .navbar.is-spaced .navbar-end{align-items:center}html.theme--documenter-dark .navbar.is-spaced a.navbar-item,html.theme--documenter-dark .navbar.is-spaced .navbar-link{border-radius:.4em}html.theme--documenter-dark .navbar.is-transparent a.navbar-item:focus,html.theme--documenter-dark .navbar.is-transparent a.navbar-item:hover,html.theme--documenter-dark .navbar.is-transparent a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-transparent .navbar-link:focus,html.theme--documenter-dark .navbar.is-transparent .navbar-link:hover,html.theme--documenter-dark .navbar.is-transparent .navbar-link.is-active{background-color:transparent !important}html.theme--documenter-dark .navbar.is-transparent .navbar-item.has-dropdown.is-active .navbar-link,html.theme--documenter-dark .navbar.is-transparent .navbar-item.has-dropdown.is-hoverable:focus .navbar-link,html.theme--documenter-dark .navbar.is-transparent .navbar-item.has-dropdown.is-hoverable:focus-within .navbar-link,html.theme--documenter-dark .navbar.is-transparent .navbar-item.has-dropdown.is-hoverable:hover .navbar-link{background-color:transparent !important}html.theme--documenter-dark .navbar.is-transparent .navbar-dropdown a.navbar-item:focus,html.theme--documenter-dark .navbar.is-transparent .navbar-dropdown a.navbar-item:hover{background-color:rgba(0,0,0,0);color:#dbdee0}html.theme--documenter-dark .navbar.is-transparent .navbar-dropdown a.navbar-item.is-active{background-color:rgba(0,0,0,0);color:#1abc9c}html.theme--documenter-dark .navbar-burger{display:none}html.theme--documenter-dark .navbar-item,html.theme--documenter-dark .navbar-link{align-items:center;display:flex}html.theme--documenter-dark .navbar-item.has-dropdown{align-items:stretch}html.theme--documenter-dark .navbar-item.has-dropdown-up .navbar-link::after{transform:rotate(135deg) translate(0.25em, -0.25em)}html.theme--documenter-dark .navbar-item.has-dropdown-up .navbar-dropdown{border-bottom:1px solid rgba(0,0,0,0.2);border-radius:8px 8px 0 0;border-top:none;bottom:100%;box-shadow:0 -8px 8px rgba(10,10,10,0.1);top:auto}html.theme--documenter-dark .navbar-item.is-active .navbar-dropdown,html.theme--documenter-dark .navbar-item.is-hoverable:focus .navbar-dropdown,html.theme--documenter-dark .navbar-item.is-hoverable:focus-within .navbar-dropdown,html.theme--documenter-dark .navbar-item.is-hoverable:hover .navbar-dropdown{display:block}.navbar.is-spaced html.theme--documenter-dark .navbar-item.is-active .navbar-dropdown,html.theme--documenter-dark .navbar-item.is-active .navbar-dropdown.is-boxed,.navbar.is-spaced html.theme--documenter-dark .navbar-item.is-hoverable:focus .navbar-dropdown,html.theme--documenter-dark .navbar-item.is-hoverable:focus .navbar-dropdown.is-boxed,.navbar.is-spaced html.theme--documenter-dark .navbar-item.is-hoverable:focus-within .navbar-dropdown,html.theme--documenter-dark .navbar-item.is-hoverable:focus-within .navbar-dropdown.is-boxed,.navbar.is-spaced html.theme--documenter-dark .navbar-item.is-hoverable:hover .navbar-dropdown,html.theme--documenter-dark .navbar-item.is-hoverable:hover .navbar-dropdown.is-boxed{opacity:1;pointer-events:auto;transform:translateY(0)}html.theme--documenter-dark .navbar-menu{flex-grow:1;flex-shrink:0}html.theme--documenter-dark .navbar-start{justify-content:flex-start;margin-right:auto}html.theme--documenter-dark .navbar-end{justify-content:flex-end;margin-left:auto}html.theme--documenter-dark .navbar-dropdown{background-color:#375a7f;border-bottom-left-radius:8px;border-bottom-right-radius:8px;border-top:1px solid rgba(0,0,0,0.2);box-shadow:0 8px 8px rgba(10,10,10,0.1);display:none;font-size:0.875rem;left:0;min-width:100%;position:absolute;top:100%;z-index:20}html.theme--documenter-dark .navbar-dropdown .navbar-item{padding:0.375rem 1rem;white-space:nowrap}html.theme--documenter-dark .navbar-dropdown a.navbar-item{padding-right:3rem}html.theme--documenter-dark .navbar-dropdown a.navbar-item:focus,html.theme--documenter-dark .navbar-dropdown a.navbar-item:hover{background-color:rgba(0,0,0,0);color:#dbdee0}html.theme--documenter-dark .navbar-dropdown a.navbar-item.is-active{background-color:rgba(0,0,0,0);color:#1abc9c}.navbar.is-spaced html.theme--documenter-dark .navbar-dropdown,html.theme--documenter-dark .navbar-dropdown.is-boxed{border-radius:8px;border-top:none;box-shadow:0 8px 8px rgba(10,10,10,0.1), 0 0 0 1px rgba(10,10,10,0.1);display:block;opacity:0;pointer-events:none;top:calc(100% + (-4px));transform:translateY(-5px);transition-duration:86ms;transition-property:opacity, transform}html.theme--documenter-dark .navbar-dropdown.is-right{left:auto;right:0}html.theme--documenter-dark .navbar-divider{display:block}html.theme--documenter-dark .navbar>.container .navbar-brand,html.theme--documenter-dark .container>.navbar .navbar-brand{margin-left:-.75rem}html.theme--documenter-dark .navbar>.container .navbar-menu,html.theme--documenter-dark .container>.navbar .navbar-menu{margin-right:-.75rem}html.theme--documenter-dark .navbar.is-fixed-bottom-desktop,html.theme--documenter-dark .navbar.is-fixed-top-desktop{left:0;position:fixed;right:0;z-index:30}html.theme--documenter-dark .navbar.is-fixed-bottom-desktop{bottom:0}html.theme--documenter-dark .navbar.is-fixed-bottom-desktop.has-shadow{box-shadow:0 -2px 3px rgba(10,10,10,0.1)}html.theme--documenter-dark .navbar.is-fixed-top-desktop{top:0}html.theme--documenter-dark html.has-navbar-fixed-top-desktop,html.theme--documenter-dark body.has-navbar-fixed-top-desktop{padding-top:4rem}html.theme--documenter-dark html.has-navbar-fixed-bottom-desktop,html.theme--documenter-dark body.has-navbar-fixed-bottom-desktop{padding-bottom:4rem}html.theme--documenter-dark html.has-spaced-navbar-fixed-top,html.theme--documenter-dark body.has-spaced-navbar-fixed-top{padding-top:6rem}html.theme--documenter-dark html.has-spaced-navbar-fixed-bottom,html.theme--documenter-dark body.has-spaced-navbar-fixed-bottom{padding-bottom:6rem}html.theme--documenter-dark a.navbar-item.is-active,html.theme--documenter-dark .navbar-link.is-active{color:#1abc9c}html.theme--documenter-dark a.navbar-item.is-active:not(:focus):not(:hover),html.theme--documenter-dark .navbar-link.is-active:not(:focus):not(:hover){background-color:rgba(0,0,0,0)}html.theme--documenter-dark .navbar-item.has-dropdown:focus .navbar-link,html.theme--documenter-dark .navbar-item.has-dropdown:hover .navbar-link,html.theme--documenter-dark .navbar-item.has-dropdown.is-active .navbar-link{background-color:rgba(0,0,0,0)}}html.theme--documenter-dark .hero.is-fullheight-with-navbar{min-height:calc(100vh - 4rem)}html.theme--documenter-dark .pagination{font-size:1rem;margin:-.25rem}html.theme--documenter-dark .pagination.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.pagination{font-size:.75rem}html.theme--documenter-dark .pagination.is-medium{font-size:1.25rem}html.theme--documenter-dark .pagination.is-large{font-size:1.5rem}html.theme--documenter-dark .pagination.is-rounded .pagination-previous,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.pagination .pagination-previous,html.theme--documenter-dark .pagination.is-rounded .pagination-next,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.pagination .pagination-next{padding-left:1em;padding-right:1em;border-radius:9999px}html.theme--documenter-dark .pagination.is-rounded .pagination-link,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.pagination .pagination-link{border-radius:9999px}html.theme--documenter-dark .pagination,html.theme--documenter-dark .pagination-list{align-items:center;display:flex;justify-content:center;text-align:center}html.theme--documenter-dark .pagination-previous,html.theme--documenter-dark .pagination-next,html.theme--documenter-dark .pagination-link,html.theme--documenter-dark .pagination-ellipsis{font-size:1em;justify-content:center;margin:.25rem;padding-left:.5em;padding-right:.5em;text-align:center}html.theme--documenter-dark .pagination-previous,html.theme--documenter-dark .pagination-next,html.theme--documenter-dark .pagination-link{border-color:#5e6d6f;color:#1abc9c;min-width:2.5em}html.theme--documenter-dark .pagination-previous:hover,html.theme--documenter-dark .pagination-next:hover,html.theme--documenter-dark .pagination-link:hover{border-color:#8c9b9d;color:#1dd2af}html.theme--documenter-dark .pagination-previous:focus,html.theme--documenter-dark .pagination-next:focus,html.theme--documenter-dark .pagination-link:focus{border-color:#8c9b9d}html.theme--documenter-dark .pagination-previous:active,html.theme--documenter-dark .pagination-next:active,html.theme--documenter-dark .pagination-link:active{box-shadow:inset 0 1px 2px rgba(10,10,10,0.2)}html.theme--documenter-dark .pagination-previous[disabled],html.theme--documenter-dark .pagination-previous.is-disabled,html.theme--documenter-dark .pagination-next[disabled],html.theme--documenter-dark .pagination-next.is-disabled,html.theme--documenter-dark .pagination-link[disabled],html.theme--documenter-dark .pagination-link.is-disabled{background-color:#5e6d6f;border-color:#5e6d6f;box-shadow:none;color:#fff;opacity:0.5}html.theme--documenter-dark .pagination-previous,html.theme--documenter-dark .pagination-next{padding-left:.75em;padding-right:.75em;white-space:nowrap}html.theme--documenter-dark .pagination-link.is-current{background-color:#1abc9c;border-color:#1abc9c;color:#fff}html.theme--documenter-dark .pagination-ellipsis{color:#8c9b9d;pointer-events:none}html.theme--documenter-dark .pagination-list{flex-wrap:wrap}html.theme--documenter-dark .pagination-list li{list-style:none}@media screen and (max-width: 768px){html.theme--documenter-dark .pagination{flex-wrap:wrap}html.theme--documenter-dark .pagination-previous,html.theme--documenter-dark .pagination-next{flex-grow:1;flex-shrink:1}html.theme--documenter-dark .pagination-list li{flex-grow:1;flex-shrink:1}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .pagination-list{flex-grow:1;flex-shrink:1;justify-content:flex-start;order:1}html.theme--documenter-dark .pagination-previous,html.theme--documenter-dark .pagination-next,html.theme--documenter-dark .pagination-link,html.theme--documenter-dark .pagination-ellipsis{margin-bottom:0;margin-top:0}html.theme--documenter-dark .pagination-previous{order:2}html.theme--documenter-dark .pagination-next{order:3}html.theme--documenter-dark .pagination{justify-content:space-between;margin-bottom:0;margin-top:0}html.theme--documenter-dark .pagination.is-centered .pagination-previous{order:1}html.theme--documenter-dark .pagination.is-centered .pagination-list{justify-content:center;order:2}html.theme--documenter-dark .pagination.is-centered .pagination-next{order:3}html.theme--documenter-dark .pagination.is-right .pagination-previous{order:1}html.theme--documenter-dark .pagination.is-right .pagination-next{order:2}html.theme--documenter-dark .pagination.is-right .pagination-list{justify-content:flex-end;order:3}}html.theme--documenter-dark .panel{border-radius:8px;box-shadow:#171717;font-size:1rem}html.theme--documenter-dark .panel:not(:last-child){margin-bottom:1.5rem}html.theme--documenter-dark .panel.is-white .panel-heading{background-color:#fff;color:#0a0a0a}html.theme--documenter-dark .panel.is-white .panel-tabs a.is-active{border-bottom-color:#fff}html.theme--documenter-dark .panel.is-white .panel-block.is-active .panel-icon{color:#fff}html.theme--documenter-dark .panel.is-black .panel-heading{background-color:#0a0a0a;color:#fff}html.theme--documenter-dark .panel.is-black .panel-tabs a.is-active{border-bottom-color:#0a0a0a}html.theme--documenter-dark .panel.is-black .panel-block.is-active .panel-icon{color:#0a0a0a}html.theme--documenter-dark .panel.is-light .panel-heading{background-color:#ecf0f1;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .panel.is-light .panel-tabs a.is-active{border-bottom-color:#ecf0f1}html.theme--documenter-dark .panel.is-light .panel-block.is-active .panel-icon{color:#ecf0f1}html.theme--documenter-dark .panel.is-dark .panel-heading,html.theme--documenter-dark .content kbd.panel .panel-heading{background-color:#282f2f;color:#fff}html.theme--documenter-dark .panel.is-dark .panel-tabs a.is-active,html.theme--documenter-dark .content kbd.panel .panel-tabs a.is-active{border-bottom-color:#282f2f}html.theme--documenter-dark .panel.is-dark .panel-block.is-active .panel-icon,html.theme--documenter-dark .content kbd.panel .panel-block.is-active .panel-icon{color:#282f2f}html.theme--documenter-dark .panel.is-primary .panel-heading,html.theme--documenter-dark .docstring>section>a.panel.docs-sourcelink .panel-heading{background-color:#375a7f;color:#fff}html.theme--documenter-dark .panel.is-primary .panel-tabs a.is-active,html.theme--documenter-dark .docstring>section>a.panel.docs-sourcelink .panel-tabs a.is-active{border-bottom-color:#375a7f}html.theme--documenter-dark .panel.is-primary .panel-block.is-active .panel-icon,html.theme--documenter-dark .docstring>section>a.panel.docs-sourcelink .panel-block.is-active .panel-icon{color:#375a7f}html.theme--documenter-dark .panel.is-link .panel-heading{background-color:#1abc9c;color:#fff}html.theme--documenter-dark .panel.is-link .panel-tabs a.is-active{border-bottom-color:#1abc9c}html.theme--documenter-dark .panel.is-link .panel-block.is-active .panel-icon{color:#1abc9c}html.theme--documenter-dark .panel.is-info .panel-heading{background-color:#024c7d;color:#fff}html.theme--documenter-dark .panel.is-info .panel-tabs a.is-active{border-bottom-color:#024c7d}html.theme--documenter-dark .panel.is-info .panel-block.is-active .panel-icon{color:#024c7d}html.theme--documenter-dark .panel.is-success .panel-heading{background-color:#008438;color:#fff}html.theme--documenter-dark .panel.is-success .panel-tabs a.is-active{border-bottom-color:#008438}html.theme--documenter-dark .panel.is-success .panel-block.is-active .panel-icon{color:#008438}html.theme--documenter-dark .panel.is-warning .panel-heading{background-color:#ad8100;color:#fff}html.theme--documenter-dark .panel.is-warning .panel-tabs a.is-active{border-bottom-color:#ad8100}html.theme--documenter-dark .panel.is-warning .panel-block.is-active .panel-icon{color:#ad8100}html.theme--documenter-dark .panel.is-danger .panel-heading{background-color:#9e1b0d;color:#fff}html.theme--documenter-dark .panel.is-danger .panel-tabs a.is-active{border-bottom-color:#9e1b0d}html.theme--documenter-dark .panel.is-danger .panel-block.is-active .panel-icon{color:#9e1b0d}html.theme--documenter-dark .panel-tabs:not(:last-child),html.theme--documenter-dark .panel-block:not(:last-child){border-bottom:1px solid #ededed}html.theme--documenter-dark .panel-heading{background-color:#343c3d;border-radius:8px 8px 0 0;color:#f2f2f2;font-size:1.25em;font-weight:700;line-height:1.25;padding:0.75em 1em}html.theme--documenter-dark .panel-tabs{align-items:flex-end;display:flex;font-size:.875em;justify-content:center}html.theme--documenter-dark .panel-tabs a{border-bottom:1px solid #5e6d6f;margin-bottom:-1px;padding:0.5em}html.theme--documenter-dark .panel-tabs a.is-active{border-bottom-color:#343c3d;color:#17a689}html.theme--documenter-dark .panel-list a{color:#fff}html.theme--documenter-dark .panel-list a:hover{color:#1abc9c}html.theme--documenter-dark .panel-block{align-items:center;color:#f2f2f2;display:flex;justify-content:flex-start;padding:0.5em 0.75em}html.theme--documenter-dark .panel-block input[type="checkbox"]{margin-right:.75em}html.theme--documenter-dark .panel-block>.control{flex-grow:1;flex-shrink:1;width:100%}html.theme--documenter-dark .panel-block.is-wrapped{flex-wrap:wrap}html.theme--documenter-dark .panel-block.is-active{border-left-color:#1abc9c;color:#17a689}html.theme--documenter-dark .panel-block.is-active .panel-icon{color:#1abc9c}html.theme--documenter-dark .panel-block:last-child{border-bottom-left-radius:8px;border-bottom-right-radius:8px}html.theme--documenter-dark a.panel-block,html.theme--documenter-dark label.panel-block{cursor:pointer}html.theme--documenter-dark a.panel-block:hover,html.theme--documenter-dark label.panel-block:hover{background-color:#282f2f}html.theme--documenter-dark .panel-icon{display:inline-block;font-size:14px;height:1em;line-height:1em;text-align:center;vertical-align:top;width:1em;color:#fff;margin-right:.75em}html.theme--documenter-dark .panel-icon .fa{font-size:inherit;line-height:inherit}html.theme--documenter-dark .tabs{-webkit-overflow-scrolling:touch;align-items:stretch;display:flex;font-size:1rem;justify-content:space-between;overflow:hidden;overflow-x:auto;white-space:nowrap}html.theme--documenter-dark .tabs a{align-items:center;border-bottom-color:#5e6d6f;border-bottom-style:solid;border-bottom-width:1px;color:#fff;display:flex;justify-content:center;margin-bottom:-1px;padding:0.5em 1em;vertical-align:top}html.theme--documenter-dark .tabs a:hover{border-bottom-color:#f2f2f2;color:#f2f2f2}html.theme--documenter-dark .tabs li{display:block}html.theme--documenter-dark .tabs li.is-active a{border-bottom-color:#1abc9c;color:#1abc9c}html.theme--documenter-dark .tabs ul{align-items:center;border-bottom-color:#5e6d6f;border-bottom-style:solid;border-bottom-width:1px;display:flex;flex-grow:1;flex-shrink:0;justify-content:flex-start}html.theme--documenter-dark .tabs ul.is-left{padding-right:0.75em}html.theme--documenter-dark .tabs ul.is-center{flex:none;justify-content:center;padding-left:0.75em;padding-right:0.75em}html.theme--documenter-dark .tabs ul.is-right{justify-content:flex-end;padding-left:0.75em}html.theme--documenter-dark .tabs .icon:first-child{margin-right:.5em}html.theme--documenter-dark .tabs .icon:last-child{margin-left:.5em}html.theme--documenter-dark .tabs.is-centered ul{justify-content:center}html.theme--documenter-dark .tabs.is-right ul{justify-content:flex-end}html.theme--documenter-dark .tabs.is-boxed a{border:1px solid transparent;border-radius:.4em .4em 0 0}html.theme--documenter-dark .tabs.is-boxed a:hover{background-color:#282f2f;border-bottom-color:#5e6d6f}html.theme--documenter-dark .tabs.is-boxed li.is-active a{background-color:#fff;border-color:#5e6d6f;border-bottom-color:rgba(0,0,0,0) !important}html.theme--documenter-dark .tabs.is-fullwidth li{flex-grow:1;flex-shrink:0}html.theme--documenter-dark .tabs.is-toggle a{border-color:#5e6d6f;border-style:solid;border-width:1px;margin-bottom:0;position:relative}html.theme--documenter-dark .tabs.is-toggle a:hover{background-color:#282f2f;border-color:#8c9b9d;z-index:2}html.theme--documenter-dark .tabs.is-toggle li+li{margin-left:-1px}html.theme--documenter-dark .tabs.is-toggle li:first-child a{border-top-left-radius:.4em;border-bottom-left-radius:.4em}html.theme--documenter-dark .tabs.is-toggle li:last-child a{border-top-right-radius:.4em;border-bottom-right-radius:.4em}html.theme--documenter-dark .tabs.is-toggle li.is-active a{background-color:#1abc9c;border-color:#1abc9c;color:#fff;z-index:1}html.theme--documenter-dark .tabs.is-toggle ul{border-bottom:none}html.theme--documenter-dark .tabs.is-toggle.is-toggle-rounded li:first-child a{border-bottom-left-radius:9999px;border-top-left-radius:9999px;padding-left:1.25em}html.theme--documenter-dark .tabs.is-toggle.is-toggle-rounded li:last-child a{border-bottom-right-radius:9999px;border-top-right-radius:9999px;padding-right:1.25em}html.theme--documenter-dark .tabs.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.tabs{font-size:.75rem}html.theme--documenter-dark .tabs.is-medium{font-size:1.25rem}html.theme--documenter-dark .tabs.is-large{font-size:1.5rem}html.theme--documenter-dark .column{display:block;flex-basis:0;flex-grow:1;flex-shrink:1;padding:.75rem}.columns.is-mobile>html.theme--documenter-dark .column.is-narrow{flex:none;width:unset}.columns.is-mobile>html.theme--documenter-dark .column.is-full{flex:none;width:100%}.columns.is-mobile>html.theme--documenter-dark .column.is-three-quarters{flex:none;width:75%}.columns.is-mobile>html.theme--documenter-dark .column.is-two-thirds{flex:none;width:66.6666%}.columns.is-mobile>html.theme--documenter-dark .column.is-half{flex:none;width:50%}.columns.is-mobile>html.theme--documenter-dark .column.is-one-third{flex:none;width:33.3333%}.columns.is-mobile>html.theme--documenter-dark .column.is-one-quarter{flex:none;width:25%}.columns.is-mobile>html.theme--documenter-dark .column.is-one-fifth{flex:none;width:20%}.columns.is-mobile>html.theme--documenter-dark .column.is-two-fifths{flex:none;width:40%}.columns.is-mobile>html.theme--documenter-dark .column.is-three-fifths{flex:none;width:60%}.columns.is-mobile>html.theme--documenter-dark .column.is-four-fifths{flex:none;width:80%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-three-quarters{margin-left:75%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-two-thirds{margin-left:66.6666%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-half{margin-left:50%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-one-third{margin-left:33.3333%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-one-quarter{margin-left:25%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-one-fifth{margin-left:20%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-two-fifths{margin-left:40%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-three-fifths{margin-left:60%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-four-fifths{margin-left:80%}.columns.is-mobile>html.theme--documenter-dark .column.is-0{flex:none;width:0%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-0{margin-left:0%}.columns.is-mobile>html.theme--documenter-dark .column.is-1{flex:none;width:8.33333337%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-1{margin-left:8.33333337%}.columns.is-mobile>html.theme--documenter-dark .column.is-2{flex:none;width:16.66666674%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-2{margin-left:16.66666674%}.columns.is-mobile>html.theme--documenter-dark .column.is-3{flex:none;width:25%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-3{margin-left:25%}.columns.is-mobile>html.theme--documenter-dark .column.is-4{flex:none;width:33.33333337%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-4{margin-left:33.33333337%}.columns.is-mobile>html.theme--documenter-dark .column.is-5{flex:none;width:41.66666674%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-5{margin-left:41.66666674%}.columns.is-mobile>html.theme--documenter-dark .column.is-6{flex:none;width:50%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-6{margin-left:50%}.columns.is-mobile>html.theme--documenter-dark .column.is-7{flex:none;width:58.33333337%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-7{margin-left:58.33333337%}.columns.is-mobile>html.theme--documenter-dark .column.is-8{flex:none;width:66.66666674%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-8{margin-left:66.66666674%}.columns.is-mobile>html.theme--documenter-dark .column.is-9{flex:none;width:75%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-9{margin-left:75%}.columns.is-mobile>html.theme--documenter-dark .column.is-10{flex:none;width:83.33333337%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-10{margin-left:83.33333337%}.columns.is-mobile>html.theme--documenter-dark .column.is-11{flex:none;width:91.66666674%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-11{margin-left:91.66666674%}.columns.is-mobile>html.theme--documenter-dark .column.is-12{flex:none;width:100%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-12{margin-left:100%}@media screen and (max-width: 768px){html.theme--documenter-dark .column.is-narrow-mobile{flex:none;width:unset}html.theme--documenter-dark .column.is-full-mobile{flex:none;width:100%}html.theme--documenter-dark .column.is-three-quarters-mobile{flex:none;width:75%}html.theme--documenter-dark .column.is-two-thirds-mobile{flex:none;width:66.6666%}html.theme--documenter-dark .column.is-half-mobile{flex:none;width:50%}html.theme--documenter-dark .column.is-one-third-mobile{flex:none;width:33.3333%}html.theme--documenter-dark .column.is-one-quarter-mobile{flex:none;width:25%}html.theme--documenter-dark .column.is-one-fifth-mobile{flex:none;width:20%}html.theme--documenter-dark .column.is-two-fifths-mobile{flex:none;width:40%}html.theme--documenter-dark .column.is-three-fifths-mobile{flex:none;width:60%}html.theme--documenter-dark .column.is-four-fifths-mobile{flex:none;width:80%}html.theme--documenter-dark .column.is-offset-three-quarters-mobile{margin-left:75%}html.theme--documenter-dark .column.is-offset-two-thirds-mobile{margin-left:66.6666%}html.theme--documenter-dark .column.is-offset-half-mobile{margin-left:50%}html.theme--documenter-dark .column.is-offset-one-third-mobile{margin-left:33.3333%}html.theme--documenter-dark .column.is-offset-one-quarter-mobile{margin-left:25%}html.theme--documenter-dark .column.is-offset-one-fifth-mobile{margin-left:20%}html.theme--documenter-dark .column.is-offset-two-fifths-mobile{margin-left:40%}html.theme--documenter-dark .column.is-offset-three-fifths-mobile{margin-left:60%}html.theme--documenter-dark .column.is-offset-four-fifths-mobile{margin-left:80%}html.theme--documenter-dark .column.is-0-mobile{flex:none;width:0%}html.theme--documenter-dark .column.is-offset-0-mobile{margin-left:0%}html.theme--documenter-dark .column.is-1-mobile{flex:none;width:8.33333337%}html.theme--documenter-dark .column.is-offset-1-mobile{margin-left:8.33333337%}html.theme--documenter-dark .column.is-2-mobile{flex:none;width:16.66666674%}html.theme--documenter-dark .column.is-offset-2-mobile{margin-left:16.66666674%}html.theme--documenter-dark .column.is-3-mobile{flex:none;width:25%}html.theme--documenter-dark .column.is-offset-3-mobile{margin-left:25%}html.theme--documenter-dark .column.is-4-mobile{flex:none;width:33.33333337%}html.theme--documenter-dark .column.is-offset-4-mobile{margin-left:33.33333337%}html.theme--documenter-dark .column.is-5-mobile{flex:none;width:41.66666674%}html.theme--documenter-dark .column.is-offset-5-mobile{margin-left:41.66666674%}html.theme--documenter-dark .column.is-6-mobile{flex:none;width:50%}html.theme--documenter-dark .column.is-offset-6-mobile{margin-left:50%}html.theme--documenter-dark .column.is-7-mobile{flex:none;width:58.33333337%}html.theme--documenter-dark .column.is-offset-7-mobile{margin-left:58.33333337%}html.theme--documenter-dark .column.is-8-mobile{flex:none;width:66.66666674%}html.theme--documenter-dark .column.is-offset-8-mobile{margin-left:66.66666674%}html.theme--documenter-dark .column.is-9-mobile{flex:none;width:75%}html.theme--documenter-dark .column.is-offset-9-mobile{margin-left:75%}html.theme--documenter-dark .column.is-10-mobile{flex:none;width:83.33333337%}html.theme--documenter-dark .column.is-offset-10-mobile{margin-left:83.33333337%}html.theme--documenter-dark .column.is-11-mobile{flex:none;width:91.66666674%}html.theme--documenter-dark .column.is-offset-11-mobile{margin-left:91.66666674%}html.theme--documenter-dark .column.is-12-mobile{flex:none;width:100%}html.theme--documenter-dark .column.is-offset-12-mobile{margin-left:100%}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .column.is-narrow,html.theme--documenter-dark .column.is-narrow-tablet{flex:none;width:unset}html.theme--documenter-dark .column.is-full,html.theme--documenter-dark .column.is-full-tablet{flex:none;width:100%}html.theme--documenter-dark .column.is-three-quarters,html.theme--documenter-dark .column.is-three-quarters-tablet{flex:none;width:75%}html.theme--documenter-dark .column.is-two-thirds,html.theme--documenter-dark .column.is-two-thirds-tablet{flex:none;width:66.6666%}html.theme--documenter-dark .column.is-half,html.theme--documenter-dark .column.is-half-tablet{flex:none;width:50%}html.theme--documenter-dark .column.is-one-third,html.theme--documenter-dark .column.is-one-third-tablet{flex:none;width:33.3333%}html.theme--documenter-dark .column.is-one-quarter,html.theme--documenter-dark .column.is-one-quarter-tablet{flex:none;width:25%}html.theme--documenter-dark .column.is-one-fifth,html.theme--documenter-dark .column.is-one-fifth-tablet{flex:none;width:20%}html.theme--documenter-dark .column.is-two-fifths,html.theme--documenter-dark .column.is-two-fifths-tablet{flex:none;width:40%}html.theme--documenter-dark .column.is-three-fifths,html.theme--documenter-dark .column.is-three-fifths-tablet{flex:none;width:60%}html.theme--documenter-dark .column.is-four-fifths,html.theme--documenter-dark .column.is-four-fifths-tablet{flex:none;width:80%}html.theme--documenter-dark .column.is-offset-three-quarters,html.theme--documenter-dark .column.is-offset-three-quarters-tablet{margin-left:75%}html.theme--documenter-dark .column.is-offset-two-thirds,html.theme--documenter-dark .column.is-offset-two-thirds-tablet{margin-left:66.6666%}html.theme--documenter-dark .column.is-offset-half,html.theme--documenter-dark .column.is-offset-half-tablet{margin-left:50%}html.theme--documenter-dark .column.is-offset-one-third,html.theme--documenter-dark .column.is-offset-one-third-tablet{margin-left:33.3333%}html.theme--documenter-dark .column.is-offset-one-quarter,html.theme--documenter-dark .column.is-offset-one-quarter-tablet{margin-left:25%}html.theme--documenter-dark .column.is-offset-one-fifth,html.theme--documenter-dark .column.is-offset-one-fifth-tablet{margin-left:20%}html.theme--documenter-dark .column.is-offset-two-fifths,html.theme--documenter-dark .column.is-offset-two-fifths-tablet{margin-left:40%}html.theme--documenter-dark .column.is-offset-three-fifths,html.theme--documenter-dark .column.is-offset-three-fifths-tablet{margin-left:60%}html.theme--documenter-dark .column.is-offset-four-fifths,html.theme--documenter-dark .column.is-offset-four-fifths-tablet{margin-left:80%}html.theme--documenter-dark .column.is-0,html.theme--documenter-dark .column.is-0-tablet{flex:none;width:0%}html.theme--documenter-dark .column.is-offset-0,html.theme--documenter-dark .column.is-offset-0-tablet{margin-left:0%}html.theme--documenter-dark .column.is-1,html.theme--documenter-dark .column.is-1-tablet{flex:none;width:8.33333337%}html.theme--documenter-dark .column.is-offset-1,html.theme--documenter-dark .column.is-offset-1-tablet{margin-left:8.33333337%}html.theme--documenter-dark .column.is-2,html.theme--documenter-dark .column.is-2-tablet{flex:none;width:16.66666674%}html.theme--documenter-dark .column.is-offset-2,html.theme--documenter-dark .column.is-offset-2-tablet{margin-left:16.66666674%}html.theme--documenter-dark .column.is-3,html.theme--documenter-dark .column.is-3-tablet{flex:none;width:25%}html.theme--documenter-dark .column.is-offset-3,html.theme--documenter-dark .column.is-offset-3-tablet{margin-left:25%}html.theme--documenter-dark .column.is-4,html.theme--documenter-dark .column.is-4-tablet{flex:none;width:33.33333337%}html.theme--documenter-dark .column.is-offset-4,html.theme--documenter-dark .column.is-offset-4-tablet{margin-left:33.33333337%}html.theme--documenter-dark .column.is-5,html.theme--documenter-dark .column.is-5-tablet{flex:none;width:41.66666674%}html.theme--documenter-dark .column.is-offset-5,html.theme--documenter-dark .column.is-offset-5-tablet{margin-left:41.66666674%}html.theme--documenter-dark .column.is-6,html.theme--documenter-dark .column.is-6-tablet{flex:none;width:50%}html.theme--documenter-dark .column.is-offset-6,html.theme--documenter-dark .column.is-offset-6-tablet{margin-left:50%}html.theme--documenter-dark .column.is-7,html.theme--documenter-dark .column.is-7-tablet{flex:none;width:58.33333337%}html.theme--documenter-dark .column.is-offset-7,html.theme--documenter-dark .column.is-offset-7-tablet{margin-left:58.33333337%}html.theme--documenter-dark .column.is-8,html.theme--documenter-dark .column.is-8-tablet{flex:none;width:66.66666674%}html.theme--documenter-dark .column.is-offset-8,html.theme--documenter-dark .column.is-offset-8-tablet{margin-left:66.66666674%}html.theme--documenter-dark .column.is-9,html.theme--documenter-dark .column.is-9-tablet{flex:none;width:75%}html.theme--documenter-dark .column.is-offset-9,html.theme--documenter-dark .column.is-offset-9-tablet{margin-left:75%}html.theme--documenter-dark .column.is-10,html.theme--documenter-dark .column.is-10-tablet{flex:none;width:83.33333337%}html.theme--documenter-dark .column.is-offset-10,html.theme--documenter-dark .column.is-offset-10-tablet{margin-left:83.33333337%}html.theme--documenter-dark .column.is-11,html.theme--documenter-dark .column.is-11-tablet{flex:none;width:91.66666674%}html.theme--documenter-dark .column.is-offset-11,html.theme--documenter-dark .column.is-offset-11-tablet{margin-left:91.66666674%}html.theme--documenter-dark .column.is-12,html.theme--documenter-dark .column.is-12-tablet{flex:none;width:100%}html.theme--documenter-dark .column.is-offset-12,html.theme--documenter-dark .column.is-offset-12-tablet{margin-left:100%}}@media screen and (max-width: 1055px){html.theme--documenter-dark .column.is-narrow-touch{flex:none;width:unset}html.theme--documenter-dark .column.is-full-touch{flex:none;width:100%}html.theme--documenter-dark .column.is-three-quarters-touch{flex:none;width:75%}html.theme--documenter-dark .column.is-two-thirds-touch{flex:none;width:66.6666%}html.theme--documenter-dark .column.is-half-touch{flex:none;width:50%}html.theme--documenter-dark .column.is-one-third-touch{flex:none;width:33.3333%}html.theme--documenter-dark .column.is-one-quarter-touch{flex:none;width:25%}html.theme--documenter-dark .column.is-one-fifth-touch{flex:none;width:20%}html.theme--documenter-dark .column.is-two-fifths-touch{flex:none;width:40%}html.theme--documenter-dark .column.is-three-fifths-touch{flex:none;width:60%}html.theme--documenter-dark .column.is-four-fifths-touch{flex:none;width:80%}html.theme--documenter-dark .column.is-offset-three-quarters-touch{margin-left:75%}html.theme--documenter-dark .column.is-offset-two-thirds-touch{margin-left:66.6666%}html.theme--documenter-dark .column.is-offset-half-touch{margin-left:50%}html.theme--documenter-dark .column.is-offset-one-third-touch{margin-left:33.3333%}html.theme--documenter-dark .column.is-offset-one-quarter-touch{margin-left:25%}html.theme--documenter-dark .column.is-offset-one-fifth-touch{margin-left:20%}html.theme--documenter-dark .column.is-offset-two-fifths-touch{margin-left:40%}html.theme--documenter-dark .column.is-offset-three-fifths-touch{margin-left:60%}html.theme--documenter-dark .column.is-offset-four-fifths-touch{margin-left:80%}html.theme--documenter-dark .column.is-0-touch{flex:none;width:0%}html.theme--documenter-dark .column.is-offset-0-touch{margin-left:0%}html.theme--documenter-dark .column.is-1-touch{flex:none;width:8.33333337%}html.theme--documenter-dark .column.is-offset-1-touch{margin-left:8.33333337%}html.theme--documenter-dark .column.is-2-touch{flex:none;width:16.66666674%}html.theme--documenter-dark .column.is-offset-2-touch{margin-left:16.66666674%}html.theme--documenter-dark .column.is-3-touch{flex:none;width:25%}html.theme--documenter-dark .column.is-offset-3-touch{margin-left:25%}html.theme--documenter-dark .column.is-4-touch{flex:none;width:33.33333337%}html.theme--documenter-dark .column.is-offset-4-touch{margin-left:33.33333337%}html.theme--documenter-dark .column.is-5-touch{flex:none;width:41.66666674%}html.theme--documenter-dark .column.is-offset-5-touch{margin-left:41.66666674%}html.theme--documenter-dark .column.is-6-touch{flex:none;width:50%}html.theme--documenter-dark .column.is-offset-6-touch{margin-left:50%}html.theme--documenter-dark .column.is-7-touch{flex:none;width:58.33333337%}html.theme--documenter-dark .column.is-offset-7-touch{margin-left:58.33333337%}html.theme--documenter-dark .column.is-8-touch{flex:none;width:66.66666674%}html.theme--documenter-dark .column.is-offset-8-touch{margin-left:66.66666674%}html.theme--documenter-dark .column.is-9-touch{flex:none;width:75%}html.theme--documenter-dark .column.is-offset-9-touch{margin-left:75%}html.theme--documenter-dark .column.is-10-touch{flex:none;width:83.33333337%}html.theme--documenter-dark .column.is-offset-10-touch{margin-left:83.33333337%}html.theme--documenter-dark .column.is-11-touch{flex:none;width:91.66666674%}html.theme--documenter-dark .column.is-offset-11-touch{margin-left:91.66666674%}html.theme--documenter-dark .column.is-12-touch{flex:none;width:100%}html.theme--documenter-dark .column.is-offset-12-touch{margin-left:100%}}@media screen and (min-width: 1056px){html.theme--documenter-dark .column.is-narrow-desktop{flex:none;width:unset}html.theme--documenter-dark .column.is-full-desktop{flex:none;width:100%}html.theme--documenter-dark .column.is-three-quarters-desktop{flex:none;width:75%}html.theme--documenter-dark .column.is-two-thirds-desktop{flex:none;width:66.6666%}html.theme--documenter-dark .column.is-half-desktop{flex:none;width:50%}html.theme--documenter-dark .column.is-one-third-desktop{flex:none;width:33.3333%}html.theme--documenter-dark .column.is-one-quarter-desktop{flex:none;width:25%}html.theme--documenter-dark .column.is-one-fifth-desktop{flex:none;width:20%}html.theme--documenter-dark .column.is-two-fifths-desktop{flex:none;width:40%}html.theme--documenter-dark .column.is-three-fifths-desktop{flex:none;width:60%}html.theme--documenter-dark .column.is-four-fifths-desktop{flex:none;width:80%}html.theme--documenter-dark .column.is-offset-three-quarters-desktop{margin-left:75%}html.theme--documenter-dark .column.is-offset-two-thirds-desktop{margin-left:66.6666%}html.theme--documenter-dark .column.is-offset-half-desktop{margin-left:50%}html.theme--documenter-dark .column.is-offset-one-third-desktop{margin-left:33.3333%}html.theme--documenter-dark .column.is-offset-one-quarter-desktop{margin-left:25%}html.theme--documenter-dark .column.is-offset-one-fifth-desktop{margin-left:20%}html.theme--documenter-dark .column.is-offset-two-fifths-desktop{margin-left:40%}html.theme--documenter-dark .column.is-offset-three-fifths-desktop{margin-left:60%}html.theme--documenter-dark .column.is-offset-four-fifths-desktop{margin-left:80%}html.theme--documenter-dark .column.is-0-desktop{flex:none;width:0%}html.theme--documenter-dark .column.is-offset-0-desktop{margin-left:0%}html.theme--documenter-dark .column.is-1-desktop{flex:none;width:8.33333337%}html.theme--documenter-dark .column.is-offset-1-desktop{margin-left:8.33333337%}html.theme--documenter-dark .column.is-2-desktop{flex:none;width:16.66666674%}html.theme--documenter-dark .column.is-offset-2-desktop{margin-left:16.66666674%}html.theme--documenter-dark .column.is-3-desktop{flex:none;width:25%}html.theme--documenter-dark .column.is-offset-3-desktop{margin-left:25%}html.theme--documenter-dark .column.is-4-desktop{flex:none;width:33.33333337%}html.theme--documenter-dark .column.is-offset-4-desktop{margin-left:33.33333337%}html.theme--documenter-dark .column.is-5-desktop{flex:none;width:41.66666674%}html.theme--documenter-dark .column.is-offset-5-desktop{margin-left:41.66666674%}html.theme--documenter-dark .column.is-6-desktop{flex:none;width:50%}html.theme--documenter-dark .column.is-offset-6-desktop{margin-left:50%}html.theme--documenter-dark .column.is-7-desktop{flex:none;width:58.33333337%}html.theme--documenter-dark .column.is-offset-7-desktop{margin-left:58.33333337%}html.theme--documenter-dark .column.is-8-desktop{flex:none;width:66.66666674%}html.theme--documenter-dark .column.is-offset-8-desktop{margin-left:66.66666674%}html.theme--documenter-dark .column.is-9-desktop{flex:none;width:75%}html.theme--documenter-dark .column.is-offset-9-desktop{margin-left:75%}html.theme--documenter-dark .column.is-10-desktop{flex:none;width:83.33333337%}html.theme--documenter-dark .column.is-offset-10-desktop{margin-left:83.33333337%}html.theme--documenter-dark .column.is-11-desktop{flex:none;width:91.66666674%}html.theme--documenter-dark .column.is-offset-11-desktop{margin-left:91.66666674%}html.theme--documenter-dark .column.is-12-desktop{flex:none;width:100%}html.theme--documenter-dark .column.is-offset-12-desktop{margin-left:100%}}@media screen and (min-width: 1216px){html.theme--documenter-dark .column.is-narrow-widescreen{flex:none;width:unset}html.theme--documenter-dark .column.is-full-widescreen{flex:none;width:100%}html.theme--documenter-dark .column.is-three-quarters-widescreen{flex:none;width:75%}html.theme--documenter-dark .column.is-two-thirds-widescreen{flex:none;width:66.6666%}html.theme--documenter-dark .column.is-half-widescreen{flex:none;width:50%}html.theme--documenter-dark .column.is-one-third-widescreen{flex:none;width:33.3333%}html.theme--documenter-dark .column.is-one-quarter-widescreen{flex:none;width:25%}html.theme--documenter-dark .column.is-one-fifth-widescreen{flex:none;width:20%}html.theme--documenter-dark .column.is-two-fifths-widescreen{flex:none;width:40%}html.theme--documenter-dark .column.is-three-fifths-widescreen{flex:none;width:60%}html.theme--documenter-dark .column.is-four-fifths-widescreen{flex:none;width:80%}html.theme--documenter-dark .column.is-offset-three-quarters-widescreen{margin-left:75%}html.theme--documenter-dark .column.is-offset-two-thirds-widescreen{margin-left:66.6666%}html.theme--documenter-dark .column.is-offset-half-widescreen{margin-left:50%}html.theme--documenter-dark .column.is-offset-one-third-widescreen{margin-left:33.3333%}html.theme--documenter-dark .column.is-offset-one-quarter-widescreen{margin-left:25%}html.theme--documenter-dark .column.is-offset-one-fifth-widescreen{margin-left:20%}html.theme--documenter-dark .column.is-offset-two-fifths-widescreen{margin-left:40%}html.theme--documenter-dark .column.is-offset-three-fifths-widescreen{margin-left:60%}html.theme--documenter-dark .column.is-offset-four-fifths-widescreen{margin-left:80%}html.theme--documenter-dark .column.is-0-widescreen{flex:none;width:0%}html.theme--documenter-dark .column.is-offset-0-widescreen{margin-left:0%}html.theme--documenter-dark .column.is-1-widescreen{flex:none;width:8.33333337%}html.theme--documenter-dark .column.is-offset-1-widescreen{margin-left:8.33333337%}html.theme--documenter-dark .column.is-2-widescreen{flex:none;width:16.66666674%}html.theme--documenter-dark .column.is-offset-2-widescreen{margin-left:16.66666674%}html.theme--documenter-dark .column.is-3-widescreen{flex:none;width:25%}html.theme--documenter-dark .column.is-offset-3-widescreen{margin-left:25%}html.theme--documenter-dark .column.is-4-widescreen{flex:none;width:33.33333337%}html.theme--documenter-dark .column.is-offset-4-widescreen{margin-left:33.33333337%}html.theme--documenter-dark .column.is-5-widescreen{flex:none;width:41.66666674%}html.theme--documenter-dark .column.is-offset-5-widescreen{margin-left:41.66666674%}html.theme--documenter-dark .column.is-6-widescreen{flex:none;width:50%}html.theme--documenter-dark .column.is-offset-6-widescreen{margin-left:50%}html.theme--documenter-dark .column.is-7-widescreen{flex:none;width:58.33333337%}html.theme--documenter-dark .column.is-offset-7-widescreen{margin-left:58.33333337%}html.theme--documenter-dark .column.is-8-widescreen{flex:none;width:66.66666674%}html.theme--documenter-dark .column.is-offset-8-widescreen{margin-left:66.66666674%}html.theme--documenter-dark .column.is-9-widescreen{flex:none;width:75%}html.theme--documenter-dark .column.is-offset-9-widescreen{margin-left:75%}html.theme--documenter-dark .column.is-10-widescreen{flex:none;width:83.33333337%}html.theme--documenter-dark .column.is-offset-10-widescreen{margin-left:83.33333337%}html.theme--documenter-dark .column.is-11-widescreen{flex:none;width:91.66666674%}html.theme--documenter-dark .column.is-offset-11-widescreen{margin-left:91.66666674%}html.theme--documenter-dark .column.is-12-widescreen{flex:none;width:100%}html.theme--documenter-dark .column.is-offset-12-widescreen{margin-left:100%}}@media screen and (min-width: 1408px){html.theme--documenter-dark .column.is-narrow-fullhd{flex:none;width:unset}html.theme--documenter-dark .column.is-full-fullhd{flex:none;width:100%}html.theme--documenter-dark .column.is-three-quarters-fullhd{flex:none;width:75%}html.theme--documenter-dark .column.is-two-thirds-fullhd{flex:none;width:66.6666%}html.theme--documenter-dark .column.is-half-fullhd{flex:none;width:50%}html.theme--documenter-dark .column.is-one-third-fullhd{flex:none;width:33.3333%}html.theme--documenter-dark .column.is-one-quarter-fullhd{flex:none;width:25%}html.theme--documenter-dark .column.is-one-fifth-fullhd{flex:none;width:20%}html.theme--documenter-dark .column.is-two-fifths-fullhd{flex:none;width:40%}html.theme--documenter-dark .column.is-three-fifths-fullhd{flex:none;width:60%}html.theme--documenter-dark .column.is-four-fifths-fullhd{flex:none;width:80%}html.theme--documenter-dark .column.is-offset-three-quarters-fullhd{margin-left:75%}html.theme--documenter-dark .column.is-offset-two-thirds-fullhd{margin-left:66.6666%}html.theme--documenter-dark .column.is-offset-half-fullhd{margin-left:50%}html.theme--documenter-dark .column.is-offset-one-third-fullhd{margin-left:33.3333%}html.theme--documenter-dark .column.is-offset-one-quarter-fullhd{margin-left:25%}html.theme--documenter-dark .column.is-offset-one-fifth-fullhd{margin-left:20%}html.theme--documenter-dark .column.is-offset-two-fifths-fullhd{margin-left:40%}html.theme--documenter-dark .column.is-offset-three-fifths-fullhd{margin-left:60%}html.theme--documenter-dark .column.is-offset-four-fifths-fullhd{margin-left:80%}html.theme--documenter-dark .column.is-0-fullhd{flex:none;width:0%}html.theme--documenter-dark .column.is-offset-0-fullhd{margin-left:0%}html.theme--documenter-dark .column.is-1-fullhd{flex:none;width:8.33333337%}html.theme--documenter-dark .column.is-offset-1-fullhd{margin-left:8.33333337%}html.theme--documenter-dark .column.is-2-fullhd{flex:none;width:16.66666674%}html.theme--documenter-dark .column.is-offset-2-fullhd{margin-left:16.66666674%}html.theme--documenter-dark .column.is-3-fullhd{flex:none;width:25%}html.theme--documenter-dark .column.is-offset-3-fullhd{margin-left:25%}html.theme--documenter-dark .column.is-4-fullhd{flex:none;width:33.33333337%}html.theme--documenter-dark .column.is-offset-4-fullhd{margin-left:33.33333337%}html.theme--documenter-dark .column.is-5-fullhd{flex:none;width:41.66666674%}html.theme--documenter-dark .column.is-offset-5-fullhd{margin-left:41.66666674%}html.theme--documenter-dark .column.is-6-fullhd{flex:none;width:50%}html.theme--documenter-dark .column.is-offset-6-fullhd{margin-left:50%}html.theme--documenter-dark .column.is-7-fullhd{flex:none;width:58.33333337%}html.theme--documenter-dark .column.is-offset-7-fullhd{margin-left:58.33333337%}html.theme--documenter-dark .column.is-8-fullhd{flex:none;width:66.66666674%}html.theme--documenter-dark .column.is-offset-8-fullhd{margin-left:66.66666674%}html.theme--documenter-dark .column.is-9-fullhd{flex:none;width:75%}html.theme--documenter-dark .column.is-offset-9-fullhd{margin-left:75%}html.theme--documenter-dark .column.is-10-fullhd{flex:none;width:83.33333337%}html.theme--documenter-dark .column.is-offset-10-fullhd{margin-left:83.33333337%}html.theme--documenter-dark .column.is-11-fullhd{flex:none;width:91.66666674%}html.theme--documenter-dark .column.is-offset-11-fullhd{margin-left:91.66666674%}html.theme--documenter-dark .column.is-12-fullhd{flex:none;width:100%}html.theme--documenter-dark .column.is-offset-12-fullhd{margin-left:100%}}html.theme--documenter-dark .columns{margin-left:-.75rem;margin-right:-.75rem;margin-top:-.75rem}html.theme--documenter-dark .columns:last-child{margin-bottom:-.75rem}html.theme--documenter-dark .columns:not(:last-child){margin-bottom:calc(1.5rem - .75rem)}html.theme--documenter-dark .columns.is-centered{justify-content:center}html.theme--documenter-dark .columns.is-gapless{margin-left:0;margin-right:0;margin-top:0}html.theme--documenter-dark .columns.is-gapless>.column{margin:0;padding:0 !important}html.theme--documenter-dark .columns.is-gapless:not(:last-child){margin-bottom:1.5rem}html.theme--documenter-dark .columns.is-gapless:last-child{margin-bottom:0}html.theme--documenter-dark .columns.is-mobile{display:flex}html.theme--documenter-dark .columns.is-multiline{flex-wrap:wrap}html.theme--documenter-dark .columns.is-vcentered{align-items:center}@media screen and (min-width: 769px),print{html.theme--documenter-dark .columns:not(.is-desktop){display:flex}}@media screen and (min-width: 1056px){html.theme--documenter-dark .columns.is-desktop{display:flex}}html.theme--documenter-dark .columns.is-variable{--columnGap: 0.75rem;margin-left:calc(-1 * var(--columnGap));margin-right:calc(-1 * var(--columnGap))}html.theme--documenter-dark .columns.is-variable>.column{padding-left:var(--columnGap);padding-right:var(--columnGap)}html.theme--documenter-dark .columns.is-variable.is-0{--columnGap: 0rem}@media screen and (max-width: 768px){html.theme--documenter-dark .columns.is-variable.is-0-mobile{--columnGap: 0rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .columns.is-variable.is-0-tablet{--columnGap: 0rem}}@media screen and (min-width: 769px) and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-0-tablet-only{--columnGap: 0rem}}@media screen and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-0-touch{--columnGap: 0rem}}@media screen and (min-width: 1056px){html.theme--documenter-dark .columns.is-variable.is-0-desktop{--columnGap: 0rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){html.theme--documenter-dark .columns.is-variable.is-0-desktop-only{--columnGap: 0rem}}@media screen and (min-width: 1216px){html.theme--documenter-dark .columns.is-variable.is-0-widescreen{--columnGap: 0rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){html.theme--documenter-dark .columns.is-variable.is-0-widescreen-only{--columnGap: 0rem}}@media screen and (min-width: 1408px){html.theme--documenter-dark .columns.is-variable.is-0-fullhd{--columnGap: 0rem}}html.theme--documenter-dark .columns.is-variable.is-1{--columnGap: .25rem}@media screen and (max-width: 768px){html.theme--documenter-dark .columns.is-variable.is-1-mobile{--columnGap: .25rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .columns.is-variable.is-1-tablet{--columnGap: .25rem}}@media screen and (min-width: 769px) and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-1-tablet-only{--columnGap: .25rem}}@media screen and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-1-touch{--columnGap: .25rem}}@media screen and (min-width: 1056px){html.theme--documenter-dark .columns.is-variable.is-1-desktop{--columnGap: .25rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){html.theme--documenter-dark .columns.is-variable.is-1-desktop-only{--columnGap: .25rem}}@media screen and (min-width: 1216px){html.theme--documenter-dark .columns.is-variable.is-1-widescreen{--columnGap: .25rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){html.theme--documenter-dark .columns.is-variable.is-1-widescreen-only{--columnGap: .25rem}}@media screen and (min-width: 1408px){html.theme--documenter-dark .columns.is-variable.is-1-fullhd{--columnGap: .25rem}}html.theme--documenter-dark .columns.is-variable.is-2{--columnGap: .5rem}@media screen and (max-width: 768px){html.theme--documenter-dark .columns.is-variable.is-2-mobile{--columnGap: .5rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .columns.is-variable.is-2-tablet{--columnGap: .5rem}}@media screen and (min-width: 769px) and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-2-tablet-only{--columnGap: .5rem}}@media screen and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-2-touch{--columnGap: .5rem}}@media screen and (min-width: 1056px){html.theme--documenter-dark .columns.is-variable.is-2-desktop{--columnGap: .5rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){html.theme--documenter-dark .columns.is-variable.is-2-desktop-only{--columnGap: .5rem}}@media screen and (min-width: 1216px){html.theme--documenter-dark .columns.is-variable.is-2-widescreen{--columnGap: .5rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){html.theme--documenter-dark .columns.is-variable.is-2-widescreen-only{--columnGap: .5rem}}@media screen and (min-width: 1408px){html.theme--documenter-dark .columns.is-variable.is-2-fullhd{--columnGap: .5rem}}html.theme--documenter-dark .columns.is-variable.is-3{--columnGap: .75rem}@media screen and (max-width: 768px){html.theme--documenter-dark .columns.is-variable.is-3-mobile{--columnGap: .75rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .columns.is-variable.is-3-tablet{--columnGap: .75rem}}@media screen and (min-width: 769px) and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-3-tablet-only{--columnGap: .75rem}}@media screen and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-3-touch{--columnGap: .75rem}}@media screen and (min-width: 1056px){html.theme--documenter-dark .columns.is-variable.is-3-desktop{--columnGap: .75rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){html.theme--documenter-dark .columns.is-variable.is-3-desktop-only{--columnGap: .75rem}}@media screen and (min-width: 1216px){html.theme--documenter-dark .columns.is-variable.is-3-widescreen{--columnGap: .75rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){html.theme--documenter-dark .columns.is-variable.is-3-widescreen-only{--columnGap: .75rem}}@media screen and (min-width: 1408px){html.theme--documenter-dark .columns.is-variable.is-3-fullhd{--columnGap: .75rem}}html.theme--documenter-dark .columns.is-variable.is-4{--columnGap: 1rem}@media screen and (max-width: 768px){html.theme--documenter-dark .columns.is-variable.is-4-mobile{--columnGap: 1rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .columns.is-variable.is-4-tablet{--columnGap: 1rem}}@media screen and (min-width: 769px) and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-4-tablet-only{--columnGap: 1rem}}@media screen and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-4-touch{--columnGap: 1rem}}@media screen and (min-width: 1056px){html.theme--documenter-dark .columns.is-variable.is-4-desktop{--columnGap: 1rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){html.theme--documenter-dark .columns.is-variable.is-4-desktop-only{--columnGap: 1rem}}@media screen and (min-width: 1216px){html.theme--documenter-dark .columns.is-variable.is-4-widescreen{--columnGap: 1rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){html.theme--documenter-dark .columns.is-variable.is-4-widescreen-only{--columnGap: 1rem}}@media screen and (min-width: 1408px){html.theme--documenter-dark .columns.is-variable.is-4-fullhd{--columnGap: 1rem}}html.theme--documenter-dark .columns.is-variable.is-5{--columnGap: 1.25rem}@media screen and (max-width: 768px){html.theme--documenter-dark .columns.is-variable.is-5-mobile{--columnGap: 1.25rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .columns.is-variable.is-5-tablet{--columnGap: 1.25rem}}@media screen and (min-width: 769px) and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-5-tablet-only{--columnGap: 1.25rem}}@media screen and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-5-touch{--columnGap: 1.25rem}}@media screen and (min-width: 1056px){html.theme--documenter-dark .columns.is-variable.is-5-desktop{--columnGap: 1.25rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){html.theme--documenter-dark .columns.is-variable.is-5-desktop-only{--columnGap: 1.25rem}}@media screen and (min-width: 1216px){html.theme--documenter-dark .columns.is-variable.is-5-widescreen{--columnGap: 1.25rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){html.theme--documenter-dark .columns.is-variable.is-5-widescreen-only{--columnGap: 1.25rem}}@media screen and (min-width: 1408px){html.theme--documenter-dark .columns.is-variable.is-5-fullhd{--columnGap: 1.25rem}}html.theme--documenter-dark .columns.is-variable.is-6{--columnGap: 1.5rem}@media screen and (max-width: 768px){html.theme--documenter-dark .columns.is-variable.is-6-mobile{--columnGap: 1.5rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .columns.is-variable.is-6-tablet{--columnGap: 1.5rem}}@media screen and (min-width: 769px) and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-6-tablet-only{--columnGap: 1.5rem}}@media screen and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-6-touch{--columnGap: 1.5rem}}@media screen and (min-width: 1056px){html.theme--documenter-dark .columns.is-variable.is-6-desktop{--columnGap: 1.5rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){html.theme--documenter-dark .columns.is-variable.is-6-desktop-only{--columnGap: 1.5rem}}@media screen and (min-width: 1216px){html.theme--documenter-dark .columns.is-variable.is-6-widescreen{--columnGap: 1.5rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){html.theme--documenter-dark .columns.is-variable.is-6-widescreen-only{--columnGap: 1.5rem}}@media screen and (min-width: 1408px){html.theme--documenter-dark .columns.is-variable.is-6-fullhd{--columnGap: 1.5rem}}html.theme--documenter-dark .columns.is-variable.is-7{--columnGap: 1.75rem}@media screen and (max-width: 768px){html.theme--documenter-dark .columns.is-variable.is-7-mobile{--columnGap: 1.75rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .columns.is-variable.is-7-tablet{--columnGap: 1.75rem}}@media screen and (min-width: 769px) and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-7-tablet-only{--columnGap: 1.75rem}}@media screen and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-7-touch{--columnGap: 1.75rem}}@media screen and (min-width: 1056px){html.theme--documenter-dark .columns.is-variable.is-7-desktop{--columnGap: 1.75rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){html.theme--documenter-dark .columns.is-variable.is-7-desktop-only{--columnGap: 1.75rem}}@media screen and (min-width: 1216px){html.theme--documenter-dark .columns.is-variable.is-7-widescreen{--columnGap: 1.75rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){html.theme--documenter-dark .columns.is-variable.is-7-widescreen-only{--columnGap: 1.75rem}}@media screen and (min-width: 1408px){html.theme--documenter-dark .columns.is-variable.is-7-fullhd{--columnGap: 1.75rem}}html.theme--documenter-dark .columns.is-variable.is-8{--columnGap: 2rem}@media screen and (max-width: 768px){html.theme--documenter-dark .columns.is-variable.is-8-mobile{--columnGap: 2rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .columns.is-variable.is-8-tablet{--columnGap: 2rem}}@media screen and (min-width: 769px) and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-8-tablet-only{--columnGap: 2rem}}@media screen and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-8-touch{--columnGap: 2rem}}@media screen and (min-width: 1056px){html.theme--documenter-dark .columns.is-variable.is-8-desktop{--columnGap: 2rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){html.theme--documenter-dark .columns.is-variable.is-8-desktop-only{--columnGap: 2rem}}@media screen and (min-width: 1216px){html.theme--documenter-dark .columns.is-variable.is-8-widescreen{--columnGap: 2rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){html.theme--documenter-dark .columns.is-variable.is-8-widescreen-only{--columnGap: 2rem}}@media screen and (min-width: 1408px){html.theme--documenter-dark .columns.is-variable.is-8-fullhd{--columnGap: 2rem}}html.theme--documenter-dark .tile{align-items:stretch;display:block;flex-basis:0;flex-grow:1;flex-shrink:1;min-height:min-content}html.theme--documenter-dark .tile.is-ancestor{margin-left:-.75rem;margin-right:-.75rem;margin-top:-.75rem}html.theme--documenter-dark .tile.is-ancestor:last-child{margin-bottom:-.75rem}html.theme--documenter-dark .tile.is-ancestor:not(:last-child){margin-bottom:.75rem}html.theme--documenter-dark .tile.is-child{margin:0 !important}html.theme--documenter-dark .tile.is-parent{padding:.75rem}html.theme--documenter-dark .tile.is-vertical{flex-direction:column}html.theme--documenter-dark .tile.is-vertical>.tile.is-child:not(:last-child){margin-bottom:1.5rem !important}@media screen and (min-width: 769px),print{html.theme--documenter-dark .tile:not(.is-child){display:flex}html.theme--documenter-dark .tile.is-1{flex:none;width:8.33333337%}html.theme--documenter-dark .tile.is-2{flex:none;width:16.66666674%}html.theme--documenter-dark .tile.is-3{flex:none;width:25%}html.theme--documenter-dark .tile.is-4{flex:none;width:33.33333337%}html.theme--documenter-dark .tile.is-5{flex:none;width:41.66666674%}html.theme--documenter-dark .tile.is-6{flex:none;width:50%}html.theme--documenter-dark .tile.is-7{flex:none;width:58.33333337%}html.theme--documenter-dark .tile.is-8{flex:none;width:66.66666674%}html.theme--documenter-dark .tile.is-9{flex:none;width:75%}html.theme--documenter-dark .tile.is-10{flex:none;width:83.33333337%}html.theme--documenter-dark .tile.is-11{flex:none;width:91.66666674%}html.theme--documenter-dark .tile.is-12{flex:none;width:100%}}html.theme--documenter-dark .hero{align-items:stretch;display:flex;flex-direction:column;justify-content:space-between}html.theme--documenter-dark .hero .navbar{background:none}html.theme--documenter-dark .hero .tabs ul{border-bottom:none}html.theme--documenter-dark .hero.is-white{background-color:#fff;color:#0a0a0a}html.theme--documenter-dark .hero.is-white a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),html.theme--documenter-dark .hero.is-white strong{color:inherit}html.theme--documenter-dark .hero.is-white .title{color:#0a0a0a}html.theme--documenter-dark .hero.is-white .subtitle{color:rgba(10,10,10,0.9)}html.theme--documenter-dark .hero.is-white .subtitle a:not(.button),html.theme--documenter-dark .hero.is-white .subtitle strong{color:#0a0a0a}@media screen and (max-width: 1055px){html.theme--documenter-dark .hero.is-white .navbar-menu{background-color:#fff}}html.theme--documenter-dark .hero.is-white .navbar-item,html.theme--documenter-dark .hero.is-white .navbar-link{color:rgba(10,10,10,0.7)}html.theme--documenter-dark .hero.is-white a.navbar-item:hover,html.theme--documenter-dark .hero.is-white a.navbar-item.is-active,html.theme--documenter-dark .hero.is-white .navbar-link:hover,html.theme--documenter-dark .hero.is-white .navbar-link.is-active{background-color:#f2f2f2;color:#0a0a0a}html.theme--documenter-dark .hero.is-white .tabs a{color:#0a0a0a;opacity:0.9}html.theme--documenter-dark .hero.is-white .tabs a:hover{opacity:1}html.theme--documenter-dark .hero.is-white .tabs li.is-active a{color:#fff !important;opacity:1}html.theme--documenter-dark .hero.is-white .tabs.is-boxed a,html.theme--documenter-dark .hero.is-white .tabs.is-toggle a{color:#0a0a0a}html.theme--documenter-dark .hero.is-white .tabs.is-boxed a:hover,html.theme--documenter-dark .hero.is-white .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}html.theme--documenter-dark .hero.is-white .tabs.is-boxed li.is-active a,html.theme--documenter-dark .hero.is-white .tabs.is-boxed li.is-active a:hover,html.theme--documenter-dark .hero.is-white .tabs.is-toggle li.is-active a,html.theme--documenter-dark .hero.is-white .tabs.is-toggle li.is-active a:hover{background-color:#0a0a0a;border-color:#0a0a0a;color:#fff}html.theme--documenter-dark .hero.is-white.is-bold{background-image:linear-gradient(141deg, #e8e3e4 0%, #fff 71%, #fff 100%)}@media screen and (max-width: 768px){html.theme--documenter-dark .hero.is-white.is-bold .navbar-menu{background-image:linear-gradient(141deg, #e8e3e4 0%, #fff 71%, #fff 100%)}}html.theme--documenter-dark .hero.is-black{background-color:#0a0a0a;color:#fff}html.theme--documenter-dark .hero.is-black a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),html.theme--documenter-dark .hero.is-black strong{color:inherit}html.theme--documenter-dark .hero.is-black .title{color:#fff}html.theme--documenter-dark .hero.is-black .subtitle{color:rgba(255,255,255,0.9)}html.theme--documenter-dark .hero.is-black .subtitle a:not(.button),html.theme--documenter-dark .hero.is-black .subtitle strong{color:#fff}@media screen and (max-width: 1055px){html.theme--documenter-dark .hero.is-black .navbar-menu{background-color:#0a0a0a}}html.theme--documenter-dark .hero.is-black .navbar-item,html.theme--documenter-dark .hero.is-black .navbar-link{color:rgba(255,255,255,0.7)}html.theme--documenter-dark .hero.is-black a.navbar-item:hover,html.theme--documenter-dark .hero.is-black a.navbar-item.is-active,html.theme--documenter-dark .hero.is-black .navbar-link:hover,html.theme--documenter-dark .hero.is-black .navbar-link.is-active{background-color:#000;color:#fff}html.theme--documenter-dark .hero.is-black .tabs a{color:#fff;opacity:0.9}html.theme--documenter-dark .hero.is-black .tabs a:hover{opacity:1}html.theme--documenter-dark .hero.is-black .tabs li.is-active a{color:#0a0a0a !important;opacity:1}html.theme--documenter-dark .hero.is-black .tabs.is-boxed a,html.theme--documenter-dark .hero.is-black .tabs.is-toggle a{color:#fff}html.theme--documenter-dark .hero.is-black .tabs.is-boxed a:hover,html.theme--documenter-dark .hero.is-black .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}html.theme--documenter-dark .hero.is-black .tabs.is-boxed li.is-active a,html.theme--documenter-dark .hero.is-black .tabs.is-boxed li.is-active a:hover,html.theme--documenter-dark .hero.is-black .tabs.is-toggle li.is-active a,html.theme--documenter-dark .hero.is-black .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#0a0a0a}html.theme--documenter-dark .hero.is-black.is-bold{background-image:linear-gradient(141deg, #000 0%, #0a0a0a 71%, #181616 100%)}@media screen and (max-width: 768px){html.theme--documenter-dark .hero.is-black.is-bold .navbar-menu{background-image:linear-gradient(141deg, #000 0%, #0a0a0a 71%, #181616 100%)}}html.theme--documenter-dark .hero.is-light{background-color:#ecf0f1;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .hero.is-light a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),html.theme--documenter-dark .hero.is-light strong{color:inherit}html.theme--documenter-dark .hero.is-light .title{color:rgba(0,0,0,0.7)}html.theme--documenter-dark .hero.is-light .subtitle{color:rgba(0,0,0,0.9)}html.theme--documenter-dark .hero.is-light .subtitle a:not(.button),html.theme--documenter-dark .hero.is-light .subtitle strong{color:rgba(0,0,0,0.7)}@media screen and (max-width: 1055px){html.theme--documenter-dark .hero.is-light .navbar-menu{background-color:#ecf0f1}}html.theme--documenter-dark .hero.is-light .navbar-item,html.theme--documenter-dark .hero.is-light .navbar-link{color:rgba(0,0,0,0.7)}html.theme--documenter-dark .hero.is-light a.navbar-item:hover,html.theme--documenter-dark .hero.is-light a.navbar-item.is-active,html.theme--documenter-dark .hero.is-light .navbar-link:hover,html.theme--documenter-dark .hero.is-light .navbar-link.is-active{background-color:#dde4e6;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .hero.is-light .tabs a{color:rgba(0,0,0,0.7);opacity:0.9}html.theme--documenter-dark .hero.is-light .tabs a:hover{opacity:1}html.theme--documenter-dark .hero.is-light .tabs li.is-active a{color:#ecf0f1 !important;opacity:1}html.theme--documenter-dark .hero.is-light .tabs.is-boxed a,html.theme--documenter-dark .hero.is-light .tabs.is-toggle a{color:rgba(0,0,0,0.7)}html.theme--documenter-dark .hero.is-light .tabs.is-boxed a:hover,html.theme--documenter-dark .hero.is-light .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}html.theme--documenter-dark .hero.is-light .tabs.is-boxed li.is-active a,html.theme--documenter-dark .hero.is-light .tabs.is-boxed li.is-active a:hover,html.theme--documenter-dark .hero.is-light .tabs.is-toggle li.is-active a,html.theme--documenter-dark .hero.is-light .tabs.is-toggle li.is-active a:hover{background-color:rgba(0,0,0,0.7);border-color:rgba(0,0,0,0.7);color:#ecf0f1}html.theme--documenter-dark .hero.is-light.is-bold{background-image:linear-gradient(141deg, #cadfe0 0%, #ecf0f1 71%, #fafbfc 100%)}@media screen and (max-width: 768px){html.theme--documenter-dark .hero.is-light.is-bold .navbar-menu{background-image:linear-gradient(141deg, #cadfe0 0%, #ecf0f1 71%, #fafbfc 100%)}}html.theme--documenter-dark .hero.is-dark,html.theme--documenter-dark .content kbd.hero{background-color:#282f2f;color:#fff}html.theme--documenter-dark .hero.is-dark a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),html.theme--documenter-dark .content kbd.hero a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),html.theme--documenter-dark .hero.is-dark strong,html.theme--documenter-dark .content kbd.hero strong{color:inherit}html.theme--documenter-dark .hero.is-dark .title,html.theme--documenter-dark .content kbd.hero .title{color:#fff}html.theme--documenter-dark .hero.is-dark .subtitle,html.theme--documenter-dark .content kbd.hero .subtitle{color:rgba(255,255,255,0.9)}html.theme--documenter-dark .hero.is-dark .subtitle a:not(.button),html.theme--documenter-dark .content kbd.hero .subtitle a:not(.button),html.theme--documenter-dark .hero.is-dark .subtitle strong,html.theme--documenter-dark .content kbd.hero .subtitle strong{color:#fff}@media screen and (max-width: 1055px){html.theme--documenter-dark .hero.is-dark .navbar-menu,html.theme--documenter-dark .content kbd.hero .navbar-menu{background-color:#282f2f}}html.theme--documenter-dark .hero.is-dark .navbar-item,html.theme--documenter-dark .content kbd.hero .navbar-item,html.theme--documenter-dark .hero.is-dark .navbar-link,html.theme--documenter-dark .content kbd.hero .navbar-link{color:rgba(255,255,255,0.7)}html.theme--documenter-dark .hero.is-dark a.navbar-item:hover,html.theme--documenter-dark .content kbd.hero a.navbar-item:hover,html.theme--documenter-dark .hero.is-dark a.navbar-item.is-active,html.theme--documenter-dark .content kbd.hero a.navbar-item.is-active,html.theme--documenter-dark .hero.is-dark .navbar-link:hover,html.theme--documenter-dark .content kbd.hero .navbar-link:hover,html.theme--documenter-dark .hero.is-dark .navbar-link.is-active,html.theme--documenter-dark .content kbd.hero .navbar-link.is-active{background-color:#1d2122;color:#fff}html.theme--documenter-dark .hero.is-dark .tabs a,html.theme--documenter-dark .content kbd.hero .tabs a{color:#fff;opacity:0.9}html.theme--documenter-dark .hero.is-dark .tabs a:hover,html.theme--documenter-dark .content kbd.hero .tabs a:hover{opacity:1}html.theme--documenter-dark .hero.is-dark .tabs li.is-active a,html.theme--documenter-dark .content kbd.hero .tabs li.is-active a{color:#282f2f !important;opacity:1}html.theme--documenter-dark .hero.is-dark .tabs.is-boxed a,html.theme--documenter-dark .content kbd.hero .tabs.is-boxed a,html.theme--documenter-dark .hero.is-dark .tabs.is-toggle a,html.theme--documenter-dark .content kbd.hero .tabs.is-toggle a{color:#fff}html.theme--documenter-dark .hero.is-dark .tabs.is-boxed a:hover,html.theme--documenter-dark .content kbd.hero .tabs.is-boxed a:hover,html.theme--documenter-dark .hero.is-dark .tabs.is-toggle a:hover,html.theme--documenter-dark .content kbd.hero .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}html.theme--documenter-dark .hero.is-dark .tabs.is-boxed li.is-active a,html.theme--documenter-dark .content kbd.hero .tabs.is-boxed li.is-active a,html.theme--documenter-dark .hero.is-dark .tabs.is-boxed li.is-active a:hover,html.theme--documenter-dark .hero.is-dark .tabs.is-toggle li.is-active a,html.theme--documenter-dark .content kbd.hero .tabs.is-toggle li.is-active a,html.theme--documenter-dark .hero.is-dark .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#282f2f}html.theme--documenter-dark .hero.is-dark.is-bold,html.theme--documenter-dark .content kbd.hero.is-bold{background-image:linear-gradient(141deg, #0f1615 0%, #282f2f 71%, #313c40 100%)}@media screen and (max-width: 768px){html.theme--documenter-dark .hero.is-dark.is-bold .navbar-menu,html.theme--documenter-dark .content kbd.hero.is-bold .navbar-menu{background-image:linear-gradient(141deg, #0f1615 0%, #282f2f 71%, #313c40 100%)}}html.theme--documenter-dark .hero.is-primary,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink{background-color:#375a7f;color:#fff}html.theme--documenter-dark .hero.is-primary a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),html.theme--documenter-dark .hero.is-primary strong,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink strong{color:inherit}html.theme--documenter-dark .hero.is-primary .title,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .title{color:#fff}html.theme--documenter-dark .hero.is-primary .subtitle,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .subtitle{color:rgba(255,255,255,0.9)}html.theme--documenter-dark .hero.is-primary .subtitle a:not(.button),html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .subtitle a:not(.button),html.theme--documenter-dark .hero.is-primary .subtitle strong,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .subtitle strong{color:#fff}@media screen and (max-width: 1055px){html.theme--documenter-dark .hero.is-primary .navbar-menu,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .navbar-menu{background-color:#375a7f}}html.theme--documenter-dark .hero.is-primary .navbar-item,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .navbar-item,html.theme--documenter-dark .hero.is-primary .navbar-link,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .navbar-link{color:rgba(255,255,255,0.7)}html.theme--documenter-dark .hero.is-primary a.navbar-item:hover,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink a.navbar-item:hover,html.theme--documenter-dark .hero.is-primary a.navbar-item.is-active,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink a.navbar-item.is-active,html.theme--documenter-dark .hero.is-primary .navbar-link:hover,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .navbar-link:hover,html.theme--documenter-dark .hero.is-primary .navbar-link.is-active,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .navbar-link.is-active{background-color:#2f4d6d;color:#fff}html.theme--documenter-dark .hero.is-primary .tabs a,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .tabs a{color:#fff;opacity:0.9}html.theme--documenter-dark .hero.is-primary .tabs a:hover,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .tabs a:hover{opacity:1}html.theme--documenter-dark .hero.is-primary .tabs li.is-active a,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .tabs li.is-active a{color:#375a7f !important;opacity:1}html.theme--documenter-dark .hero.is-primary .tabs.is-boxed a,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .tabs.is-boxed a,html.theme--documenter-dark .hero.is-primary .tabs.is-toggle a,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .tabs.is-toggle a{color:#fff}html.theme--documenter-dark .hero.is-primary .tabs.is-boxed a:hover,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .tabs.is-boxed a:hover,html.theme--documenter-dark .hero.is-primary .tabs.is-toggle a:hover,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}html.theme--documenter-dark .hero.is-primary .tabs.is-boxed li.is-active a,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .tabs.is-boxed li.is-active a,html.theme--documenter-dark .hero.is-primary .tabs.is-boxed li.is-active a:hover,html.theme--documenter-dark .hero.is-primary .tabs.is-toggle li.is-active a,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .tabs.is-toggle li.is-active a,html.theme--documenter-dark .hero.is-primary .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#375a7f}html.theme--documenter-dark .hero.is-primary.is-bold,html.theme--documenter-dark .docstring>section>a.hero.is-bold.docs-sourcelink{background-image:linear-gradient(141deg, #214b62 0%, #375a7f 71%, #3a5796 100%)}@media screen and (max-width: 768px){html.theme--documenter-dark .hero.is-primary.is-bold .navbar-menu,html.theme--documenter-dark .docstring>section>a.hero.is-bold.docs-sourcelink .navbar-menu{background-image:linear-gradient(141deg, #214b62 0%, #375a7f 71%, #3a5796 100%)}}html.theme--documenter-dark .hero.is-link{background-color:#1abc9c;color:#fff}html.theme--documenter-dark .hero.is-link a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),html.theme--documenter-dark .hero.is-link strong{color:inherit}html.theme--documenter-dark .hero.is-link .title{color:#fff}html.theme--documenter-dark .hero.is-link .subtitle{color:rgba(255,255,255,0.9)}html.theme--documenter-dark .hero.is-link .subtitle a:not(.button),html.theme--documenter-dark .hero.is-link .subtitle strong{color:#fff}@media screen and (max-width: 1055px){html.theme--documenter-dark .hero.is-link .navbar-menu{background-color:#1abc9c}}html.theme--documenter-dark .hero.is-link .navbar-item,html.theme--documenter-dark .hero.is-link .navbar-link{color:rgba(255,255,255,0.7)}html.theme--documenter-dark .hero.is-link a.navbar-item:hover,html.theme--documenter-dark .hero.is-link a.navbar-item.is-active,html.theme--documenter-dark .hero.is-link .navbar-link:hover,html.theme--documenter-dark .hero.is-link .navbar-link.is-active{background-color:#17a689;color:#fff}html.theme--documenter-dark .hero.is-link .tabs a{color:#fff;opacity:0.9}html.theme--documenter-dark .hero.is-link .tabs a:hover{opacity:1}html.theme--documenter-dark .hero.is-link .tabs li.is-active a{color:#1abc9c !important;opacity:1}html.theme--documenter-dark .hero.is-link .tabs.is-boxed a,html.theme--documenter-dark .hero.is-link .tabs.is-toggle a{color:#fff}html.theme--documenter-dark .hero.is-link .tabs.is-boxed a:hover,html.theme--documenter-dark .hero.is-link .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}html.theme--documenter-dark .hero.is-link .tabs.is-boxed li.is-active a,html.theme--documenter-dark .hero.is-link .tabs.is-boxed li.is-active a:hover,html.theme--documenter-dark .hero.is-link .tabs.is-toggle li.is-active a,html.theme--documenter-dark .hero.is-link .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#1abc9c}html.theme--documenter-dark .hero.is-link.is-bold{background-image:linear-gradient(141deg, #0c9764 0%, #1abc9c 71%, #17d8d2 100%)}@media screen and (max-width: 768px){html.theme--documenter-dark .hero.is-link.is-bold .navbar-menu{background-image:linear-gradient(141deg, #0c9764 0%, #1abc9c 71%, #17d8d2 100%)}}html.theme--documenter-dark .hero.is-info{background-color:#024c7d;color:#fff}html.theme--documenter-dark .hero.is-info a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),html.theme--documenter-dark .hero.is-info strong{color:inherit}html.theme--documenter-dark .hero.is-info .title{color:#fff}html.theme--documenter-dark .hero.is-info .subtitle{color:rgba(255,255,255,0.9)}html.theme--documenter-dark .hero.is-info .subtitle a:not(.button),html.theme--documenter-dark .hero.is-info .subtitle strong{color:#fff}@media screen and (max-width: 1055px){html.theme--documenter-dark .hero.is-info .navbar-menu{background-color:#024c7d}}html.theme--documenter-dark .hero.is-info .navbar-item,html.theme--documenter-dark .hero.is-info .navbar-link{color:rgba(255,255,255,0.7)}html.theme--documenter-dark .hero.is-info a.navbar-item:hover,html.theme--documenter-dark .hero.is-info a.navbar-item.is-active,html.theme--documenter-dark .hero.is-info .navbar-link:hover,html.theme--documenter-dark .hero.is-info .navbar-link.is-active{background-color:#023d64;color:#fff}html.theme--documenter-dark .hero.is-info .tabs a{color:#fff;opacity:0.9}html.theme--documenter-dark .hero.is-info .tabs a:hover{opacity:1}html.theme--documenter-dark .hero.is-info .tabs li.is-active a{color:#024c7d !important;opacity:1}html.theme--documenter-dark .hero.is-info .tabs.is-boxed a,html.theme--documenter-dark .hero.is-info .tabs.is-toggle a{color:#fff}html.theme--documenter-dark .hero.is-info .tabs.is-boxed a:hover,html.theme--documenter-dark .hero.is-info .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}html.theme--documenter-dark .hero.is-info .tabs.is-boxed li.is-active a,html.theme--documenter-dark .hero.is-info .tabs.is-boxed li.is-active a:hover,html.theme--documenter-dark .hero.is-info .tabs.is-toggle li.is-active a,html.theme--documenter-dark .hero.is-info .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#024c7d}html.theme--documenter-dark .hero.is-info.is-bold{background-image:linear-gradient(141deg, #003a4c 0%, #024c7d 71%, #004299 100%)}@media screen and (max-width: 768px){html.theme--documenter-dark .hero.is-info.is-bold .navbar-menu{background-image:linear-gradient(141deg, #003a4c 0%, #024c7d 71%, #004299 100%)}}html.theme--documenter-dark .hero.is-success{background-color:#008438;color:#fff}html.theme--documenter-dark .hero.is-success a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),html.theme--documenter-dark .hero.is-success strong{color:inherit}html.theme--documenter-dark .hero.is-success .title{color:#fff}html.theme--documenter-dark .hero.is-success .subtitle{color:rgba(255,255,255,0.9)}html.theme--documenter-dark .hero.is-success .subtitle a:not(.button),html.theme--documenter-dark .hero.is-success .subtitle strong{color:#fff}@media screen and (max-width: 1055px){html.theme--documenter-dark .hero.is-success .navbar-menu{background-color:#008438}}html.theme--documenter-dark .hero.is-success .navbar-item,html.theme--documenter-dark .hero.is-success .navbar-link{color:rgba(255,255,255,0.7)}html.theme--documenter-dark .hero.is-success a.navbar-item:hover,html.theme--documenter-dark .hero.is-success a.navbar-item.is-active,html.theme--documenter-dark .hero.is-success .navbar-link:hover,html.theme--documenter-dark .hero.is-success .navbar-link.is-active{background-color:#006b2d;color:#fff}html.theme--documenter-dark .hero.is-success .tabs a{color:#fff;opacity:0.9}html.theme--documenter-dark .hero.is-success .tabs a:hover{opacity:1}html.theme--documenter-dark .hero.is-success .tabs li.is-active a{color:#008438 !important;opacity:1}html.theme--documenter-dark .hero.is-success .tabs.is-boxed a,html.theme--documenter-dark .hero.is-success .tabs.is-toggle a{color:#fff}html.theme--documenter-dark .hero.is-success .tabs.is-boxed a:hover,html.theme--documenter-dark .hero.is-success .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}html.theme--documenter-dark .hero.is-success .tabs.is-boxed li.is-active a,html.theme--documenter-dark .hero.is-success .tabs.is-boxed li.is-active a:hover,html.theme--documenter-dark .hero.is-success .tabs.is-toggle li.is-active a,html.theme--documenter-dark .hero.is-success .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#008438}html.theme--documenter-dark .hero.is-success.is-bold{background-image:linear-gradient(141deg, #005115 0%, #008438 71%, #009e5d 100%)}@media screen and (max-width: 768px){html.theme--documenter-dark .hero.is-success.is-bold .navbar-menu{background-image:linear-gradient(141deg, #005115 0%, #008438 71%, #009e5d 100%)}}html.theme--documenter-dark .hero.is-warning{background-color:#ad8100;color:#fff}html.theme--documenter-dark .hero.is-warning a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),html.theme--documenter-dark .hero.is-warning strong{color:inherit}html.theme--documenter-dark .hero.is-warning .title{color:#fff}html.theme--documenter-dark .hero.is-warning .subtitle{color:rgba(255,255,255,0.9)}html.theme--documenter-dark .hero.is-warning .subtitle a:not(.button),html.theme--documenter-dark .hero.is-warning .subtitle strong{color:#fff}@media screen and (max-width: 1055px){html.theme--documenter-dark .hero.is-warning .navbar-menu{background-color:#ad8100}}html.theme--documenter-dark .hero.is-warning .navbar-item,html.theme--documenter-dark .hero.is-warning .navbar-link{color:rgba(255,255,255,0.7)}html.theme--documenter-dark .hero.is-warning a.navbar-item:hover,html.theme--documenter-dark .hero.is-warning a.navbar-item.is-active,html.theme--documenter-dark .hero.is-warning .navbar-link:hover,html.theme--documenter-dark .hero.is-warning .navbar-link.is-active{background-color:#946e00;color:#fff}html.theme--documenter-dark .hero.is-warning .tabs a{color:#fff;opacity:0.9}html.theme--documenter-dark .hero.is-warning .tabs a:hover{opacity:1}html.theme--documenter-dark .hero.is-warning .tabs li.is-active a{color:#ad8100 !important;opacity:1}html.theme--documenter-dark .hero.is-warning .tabs.is-boxed a,html.theme--documenter-dark .hero.is-warning .tabs.is-toggle a{color:#fff}html.theme--documenter-dark .hero.is-warning .tabs.is-boxed a:hover,html.theme--documenter-dark .hero.is-warning .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}html.theme--documenter-dark .hero.is-warning .tabs.is-boxed li.is-active a,html.theme--documenter-dark .hero.is-warning .tabs.is-boxed li.is-active a:hover,html.theme--documenter-dark .hero.is-warning .tabs.is-toggle li.is-active a,html.theme--documenter-dark .hero.is-warning .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#ad8100}html.theme--documenter-dark .hero.is-warning.is-bold{background-image:linear-gradient(141deg, #7a4700 0%, #ad8100 71%, #c7b500 100%)}@media screen and (max-width: 768px){html.theme--documenter-dark .hero.is-warning.is-bold .navbar-menu{background-image:linear-gradient(141deg, #7a4700 0%, #ad8100 71%, #c7b500 100%)}}html.theme--documenter-dark .hero.is-danger{background-color:#9e1b0d;color:#fff}html.theme--documenter-dark .hero.is-danger a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),html.theme--documenter-dark .hero.is-danger strong{color:inherit}html.theme--documenter-dark .hero.is-danger .title{color:#fff}html.theme--documenter-dark .hero.is-danger .subtitle{color:rgba(255,255,255,0.9)}html.theme--documenter-dark .hero.is-danger .subtitle a:not(.button),html.theme--documenter-dark .hero.is-danger .subtitle strong{color:#fff}@media screen and (max-width: 1055px){html.theme--documenter-dark .hero.is-danger .navbar-menu{background-color:#9e1b0d}}html.theme--documenter-dark .hero.is-danger .navbar-item,html.theme--documenter-dark .hero.is-danger .navbar-link{color:rgba(255,255,255,0.7)}html.theme--documenter-dark .hero.is-danger a.navbar-item:hover,html.theme--documenter-dark .hero.is-danger a.navbar-item.is-active,html.theme--documenter-dark .hero.is-danger .navbar-link:hover,html.theme--documenter-dark .hero.is-danger .navbar-link.is-active{background-color:#86170b;color:#fff}html.theme--documenter-dark .hero.is-danger .tabs a{color:#fff;opacity:0.9}html.theme--documenter-dark .hero.is-danger .tabs a:hover{opacity:1}html.theme--documenter-dark .hero.is-danger .tabs li.is-active a{color:#9e1b0d !important;opacity:1}html.theme--documenter-dark .hero.is-danger .tabs.is-boxed a,html.theme--documenter-dark .hero.is-danger .tabs.is-toggle a{color:#fff}html.theme--documenter-dark .hero.is-danger .tabs.is-boxed a:hover,html.theme--documenter-dark .hero.is-danger .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}html.theme--documenter-dark .hero.is-danger .tabs.is-boxed li.is-active a,html.theme--documenter-dark .hero.is-danger .tabs.is-boxed li.is-active a:hover,html.theme--documenter-dark .hero.is-danger .tabs.is-toggle li.is-active a,html.theme--documenter-dark .hero.is-danger .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#9e1b0d}html.theme--documenter-dark .hero.is-danger.is-bold{background-image:linear-gradient(141deg, #75030b 0%, #9e1b0d 71%, #ba380a 100%)}@media screen and (max-width: 768px){html.theme--documenter-dark .hero.is-danger.is-bold .navbar-menu{background-image:linear-gradient(141deg, #75030b 0%, #9e1b0d 71%, #ba380a 100%)}}html.theme--documenter-dark .hero.is-small .hero-body,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.hero .hero-body{padding:1.5rem}@media screen and (min-width: 769px),print{html.theme--documenter-dark .hero.is-medium .hero-body{padding:9rem 4.5rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .hero.is-large .hero-body{padding:18rem 6rem}}html.theme--documenter-dark .hero.is-halfheight .hero-body,html.theme--documenter-dark .hero.is-fullheight .hero-body,html.theme--documenter-dark .hero.is-fullheight-with-navbar .hero-body{align-items:center;display:flex}html.theme--documenter-dark .hero.is-halfheight .hero-body>.container,html.theme--documenter-dark .hero.is-fullheight .hero-body>.container,html.theme--documenter-dark .hero.is-fullheight-with-navbar .hero-body>.container{flex-grow:1;flex-shrink:1}html.theme--documenter-dark .hero.is-halfheight{min-height:50vh}html.theme--documenter-dark .hero.is-fullheight{min-height:100vh}html.theme--documenter-dark .hero-video{overflow:hidden}html.theme--documenter-dark .hero-video video{left:50%;min-height:100%;min-width:100%;position:absolute;top:50%;transform:translate3d(-50%, -50%, 0)}html.theme--documenter-dark .hero-video.is-transparent{opacity:0.3}@media screen and (max-width: 768px){html.theme--documenter-dark .hero-video{display:none}}html.theme--documenter-dark .hero-buttons{margin-top:1.5rem}@media screen and (max-width: 768px){html.theme--documenter-dark .hero-buttons .button{display:flex}html.theme--documenter-dark .hero-buttons .button:not(:last-child){margin-bottom:0.75rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .hero-buttons{display:flex;justify-content:center}html.theme--documenter-dark .hero-buttons .button:not(:last-child){margin-right:1.5rem}}html.theme--documenter-dark .hero-head,html.theme--documenter-dark .hero-foot{flex-grow:0;flex-shrink:0}html.theme--documenter-dark .hero-body{flex-grow:1;flex-shrink:0;padding:3rem 1.5rem}@media screen and (min-width: 769px),print{html.theme--documenter-dark .hero-body{padding:3rem 3rem}}html.theme--documenter-dark .section{padding:3rem 1.5rem}@media screen and (min-width: 1056px){html.theme--documenter-dark .section{padding:3rem 3rem}html.theme--documenter-dark .section.is-medium{padding:9rem 4.5rem}html.theme--documenter-dark .section.is-large{padding:18rem 6rem}}html.theme--documenter-dark .footer{background-color:#282f2f;padding:3rem 1.5rem 6rem}html.theme--documenter-dark hr{height:1px}html.theme--documenter-dark h6{text-transform:uppercase;letter-spacing:0.5px}html.theme--documenter-dark .hero{background-color:#343c3d}html.theme--documenter-dark a{transition:all 200ms ease}html.theme--documenter-dark .button{transition:all 200ms ease;border-width:1px;color:#fff}html.theme--documenter-dark .button.is-active,html.theme--documenter-dark .button.is-focused,html.theme--documenter-dark .button:active,html.theme--documenter-dark .button:focus{box-shadow:0 0 0 2px rgba(140,155,157,0.5)}html.theme--documenter-dark .button.is-white.is-hovered,html.theme--documenter-dark .button.is-white:hover{background-color:#fff}html.theme--documenter-dark .button.is-white.is-active,html.theme--documenter-dark .button.is-white.is-focused,html.theme--documenter-dark .button.is-white:active,html.theme--documenter-dark .button.is-white:focus{border-color:#fff;box-shadow:0 0 0 2px rgba(255,255,255,0.5)}html.theme--documenter-dark .button.is-black.is-hovered,html.theme--documenter-dark .button.is-black:hover{background-color:#1d1d1d}html.theme--documenter-dark .button.is-black.is-active,html.theme--documenter-dark .button.is-black.is-focused,html.theme--documenter-dark .button.is-black:active,html.theme--documenter-dark .button.is-black:focus{border-color:#0a0a0a;box-shadow:0 0 0 2px rgba(10,10,10,0.5)}html.theme--documenter-dark .button.is-light.is-hovered,html.theme--documenter-dark .button.is-light:hover{background-color:#fff}html.theme--documenter-dark .button.is-light.is-active,html.theme--documenter-dark .button.is-light.is-focused,html.theme--documenter-dark .button.is-light:active,html.theme--documenter-dark .button.is-light:focus{border-color:#ecf0f1;box-shadow:0 0 0 2px rgba(236,240,241,0.5)}html.theme--documenter-dark .button.is-dark.is-hovered,html.theme--documenter-dark .content kbd.button.is-hovered,html.theme--documenter-dark .button.is-dark:hover,html.theme--documenter-dark .content kbd.button:hover{background-color:#3a4344}html.theme--documenter-dark .button.is-dark.is-active,html.theme--documenter-dark .content kbd.button.is-active,html.theme--documenter-dark .button.is-dark.is-focused,html.theme--documenter-dark .content kbd.button.is-focused,html.theme--documenter-dark .button.is-dark:active,html.theme--documenter-dark .content kbd.button:active,html.theme--documenter-dark .button.is-dark:focus,html.theme--documenter-dark .content kbd.button:focus{border-color:#282f2f;box-shadow:0 0 0 2px rgba(40,47,47,0.5)}html.theme--documenter-dark .button.is-primary.is-hovered,html.theme--documenter-dark .docstring>section>a.button.is-hovered.docs-sourcelink,html.theme--documenter-dark .button.is-primary:hover,html.theme--documenter-dark .docstring>section>a.button.docs-sourcelink:hover{background-color:#436d9a}html.theme--documenter-dark .button.is-primary.is-active,html.theme--documenter-dark .docstring>section>a.button.is-active.docs-sourcelink,html.theme--documenter-dark .button.is-primary.is-focused,html.theme--documenter-dark .docstring>section>a.button.is-focused.docs-sourcelink,html.theme--documenter-dark .button.is-primary:active,html.theme--documenter-dark .docstring>section>a.button.docs-sourcelink:active,html.theme--documenter-dark .button.is-primary:focus,html.theme--documenter-dark .docstring>section>a.button.docs-sourcelink:focus{border-color:#375a7f;box-shadow:0 0 0 2px rgba(55,90,127,0.5)}html.theme--documenter-dark .button.is-link.is-hovered,html.theme--documenter-dark .button.is-link:hover{background-color:#1fdeb8}html.theme--documenter-dark .button.is-link.is-active,html.theme--documenter-dark .button.is-link.is-focused,html.theme--documenter-dark .button.is-link:active,html.theme--documenter-dark .button.is-link:focus{border-color:#1abc9c;box-shadow:0 0 0 2px rgba(26,188,156,0.5)}html.theme--documenter-dark .button.is-info.is-hovered,html.theme--documenter-dark .button.is-info:hover{background-color:#0363a3}html.theme--documenter-dark .button.is-info.is-active,html.theme--documenter-dark .button.is-info.is-focused,html.theme--documenter-dark .button.is-info:active,html.theme--documenter-dark .button.is-info:focus{border-color:#024c7d;box-shadow:0 0 0 2px rgba(2,76,125,0.5)}html.theme--documenter-dark .button.is-success.is-hovered,html.theme--documenter-dark .button.is-success:hover{background-color:#00aa48}html.theme--documenter-dark .button.is-success.is-active,html.theme--documenter-dark .button.is-success.is-focused,html.theme--documenter-dark .button.is-success:active,html.theme--documenter-dark .button.is-success:focus{border-color:#008438;box-shadow:0 0 0 2px rgba(0,132,56,0.5)}html.theme--documenter-dark .button.is-warning.is-hovered,html.theme--documenter-dark .button.is-warning:hover{background-color:#d39e00}html.theme--documenter-dark .button.is-warning.is-active,html.theme--documenter-dark .button.is-warning.is-focused,html.theme--documenter-dark .button.is-warning:active,html.theme--documenter-dark .button.is-warning:focus{border-color:#ad8100;box-shadow:0 0 0 2px rgba(173,129,0,0.5)}html.theme--documenter-dark .button.is-danger.is-hovered,html.theme--documenter-dark .button.is-danger:hover{background-color:#c12110}html.theme--documenter-dark .button.is-danger.is-active,html.theme--documenter-dark .button.is-danger.is-focused,html.theme--documenter-dark .button.is-danger:active,html.theme--documenter-dark .button.is-danger:focus{border-color:#9e1b0d;box-shadow:0 0 0 2px rgba(158,27,13,0.5)}html.theme--documenter-dark .label{color:#dbdee0}html.theme--documenter-dark .button,html.theme--documenter-dark .control.has-icons-left .icon,html.theme--documenter-dark .control.has-icons-right .icon,html.theme--documenter-dark .input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input,html.theme--documenter-dark .pagination-ellipsis,html.theme--documenter-dark .pagination-link,html.theme--documenter-dark .pagination-next,html.theme--documenter-dark .pagination-previous,html.theme--documenter-dark .select,html.theme--documenter-dark .select select,html.theme--documenter-dark .textarea{height:2.5em}html.theme--documenter-dark .input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input,html.theme--documenter-dark .textarea{transition:all 200ms ease;box-shadow:none;border-width:1px;padding-left:1em;padding-right:1em}html.theme--documenter-dark .select:after,html.theme--documenter-dark .select select{border-width:1px}html.theme--documenter-dark .control.has-addons .button,html.theme--documenter-dark .control.has-addons .input,html.theme--documenter-dark .control.has-addons #documenter .docs-sidebar form.docs-search>input,html.theme--documenter-dark #documenter .docs-sidebar .control.has-addons form.docs-search>input,html.theme--documenter-dark .control.has-addons .select{margin-right:-1px}html.theme--documenter-dark .notification{background-color:#343c3d}html.theme--documenter-dark .card{box-shadow:none;border:1px solid #343c3d;background-color:#282f2f;border-radius:.4em}html.theme--documenter-dark .card .card-image img{border-radius:.4em .4em 0 0}html.theme--documenter-dark .card .card-header{box-shadow:none;background-color:rgba(18,18,18,0.2);border-radius:.4em .4em 0 0}html.theme--documenter-dark .card .card-footer{background-color:rgba(18,18,18,0.2)}html.theme--documenter-dark .card .card-footer,html.theme--documenter-dark .card .card-footer-item{border-width:1px;border-color:#343c3d}html.theme--documenter-dark .notification.is-white a:not(.button){color:#0a0a0a;text-decoration:underline}html.theme--documenter-dark .notification.is-black a:not(.button){color:#fff;text-decoration:underline}html.theme--documenter-dark .notification.is-light a:not(.button){color:rgba(0,0,0,0.7);text-decoration:underline}html.theme--documenter-dark .notification.is-dark a:not(.button),html.theme--documenter-dark .content kbd.notification a:not(.button){color:#fff;text-decoration:underline}html.theme--documenter-dark .notification.is-primary a:not(.button),html.theme--documenter-dark .docstring>section>a.notification.docs-sourcelink a:not(.button){color:#fff;text-decoration:underline}html.theme--documenter-dark .notification.is-link a:not(.button){color:#fff;text-decoration:underline}html.theme--documenter-dark .notification.is-info a:not(.button){color:#fff;text-decoration:underline}html.theme--documenter-dark .notification.is-success a:not(.button){color:#fff;text-decoration:underline}html.theme--documenter-dark .notification.is-warning a:not(.button){color:#fff;text-decoration:underline}html.theme--documenter-dark .notification.is-danger a:not(.button){color:#fff;text-decoration:underline}html.theme--documenter-dark .tag,html.theme--documenter-dark .content kbd,html.theme--documenter-dark .docstring>section>a.docs-sourcelink{border-radius:.4em}html.theme--documenter-dark .menu-list a{transition:all 300ms ease}html.theme--documenter-dark .modal-card-body{background-color:#282f2f}html.theme--documenter-dark .modal-card-foot,html.theme--documenter-dark .modal-card-head{border-color:#343c3d}html.theme--documenter-dark .message-header{font-weight:700;background-color:#343c3d;color:#fff}html.theme--documenter-dark .message-body{border-width:1px;border-color:#343c3d}html.theme--documenter-dark .navbar{border-radius:.4em}html.theme--documenter-dark .navbar.is-transparent{background:none}html.theme--documenter-dark .navbar.is-primary .navbar-dropdown a.navbar-item.is-active,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-dropdown a.navbar-item.is-active{background-color:#1abc9c}@media screen and (max-width: 1055px){html.theme--documenter-dark .navbar .navbar-menu{background-color:#375a7f;border-radius:0 0 .4em .4em}}html.theme--documenter-dark .hero .navbar,html.theme--documenter-dark body>.navbar{border-radius:0}html.theme--documenter-dark .pagination-link,html.theme--documenter-dark .pagination-next,html.theme--documenter-dark .pagination-previous{border-width:1px}html.theme--documenter-dark .panel-block,html.theme--documenter-dark .panel-heading,html.theme--documenter-dark .panel-tabs{border-width:1px}html.theme--documenter-dark .panel-block:first-child,html.theme--documenter-dark .panel-heading:first-child,html.theme--documenter-dark .panel-tabs:first-child{border-top-width:1px}html.theme--documenter-dark .panel-heading{font-weight:700}html.theme--documenter-dark .panel-tabs a{border-width:1px;margin-bottom:-1px}html.theme--documenter-dark .panel-tabs a.is-active{border-bottom-color:#17a689}html.theme--documenter-dark .panel-block:hover{color:#1dd2af}html.theme--documenter-dark .panel-block:hover .panel-icon{color:#1dd2af}html.theme--documenter-dark .panel-block.is-active .panel-icon{color:#17a689}html.theme--documenter-dark .tabs a{border-bottom-width:1px;margin-bottom:-1px}html.theme--documenter-dark .tabs ul{border-bottom-width:1px}html.theme--documenter-dark .tabs.is-boxed a{border-width:1px}html.theme--documenter-dark .tabs.is-boxed li.is-active a{background-color:#1f2424}html.theme--documenter-dark .tabs.is-toggle li a{border-width:1px;margin-bottom:0}html.theme--documenter-dark .tabs.is-toggle li+li{margin-left:-1px}html.theme--documenter-dark .hero.is-white .navbar .navbar-dropdown .navbar-item:hover{background-color:rgba(0,0,0,0)}html.theme--documenter-dark .hero.is-black .navbar .navbar-dropdown .navbar-item:hover{background-color:rgba(0,0,0,0)}html.theme--documenter-dark .hero.is-light .navbar .navbar-dropdown .navbar-item:hover{background-color:rgba(0,0,0,0)}html.theme--documenter-dark .hero.is-dark .navbar .navbar-dropdown .navbar-item:hover,html.theme--documenter-dark .content kbd.hero .navbar .navbar-dropdown .navbar-item:hover{background-color:rgba(0,0,0,0)}html.theme--documenter-dark .hero.is-primary .navbar .navbar-dropdown .navbar-item:hover,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .navbar .navbar-dropdown .navbar-item:hover{background-color:rgba(0,0,0,0)}html.theme--documenter-dark .hero.is-link .navbar .navbar-dropdown .navbar-item:hover{background-color:rgba(0,0,0,0)}html.theme--documenter-dark .hero.is-info .navbar .navbar-dropdown .navbar-item:hover{background-color:rgba(0,0,0,0)}html.theme--documenter-dark .hero.is-success .navbar .navbar-dropdown .navbar-item:hover{background-color:rgba(0,0,0,0)}html.theme--documenter-dark .hero.is-warning .navbar .navbar-dropdown .navbar-item:hover{background-color:rgba(0,0,0,0)}html.theme--documenter-dark .hero.is-danger .navbar .navbar-dropdown .navbar-item:hover{background-color:rgba(0,0,0,0)}html.theme--documenter-dark h1 .docs-heading-anchor,html.theme--documenter-dark h1 .docs-heading-anchor:hover,html.theme--documenter-dark h1 .docs-heading-anchor:visited,html.theme--documenter-dark h2 .docs-heading-anchor,html.theme--documenter-dark h2 .docs-heading-anchor:hover,html.theme--documenter-dark h2 .docs-heading-anchor:visited,html.theme--documenter-dark h3 .docs-heading-anchor,html.theme--documenter-dark h3 .docs-heading-anchor:hover,html.theme--documenter-dark h3 .docs-heading-anchor:visited,html.theme--documenter-dark h4 .docs-heading-anchor,html.theme--documenter-dark h4 .docs-heading-anchor:hover,html.theme--documenter-dark h4 .docs-heading-anchor:visited,html.theme--documenter-dark h5 .docs-heading-anchor,html.theme--documenter-dark h5 .docs-heading-anchor:hover,html.theme--documenter-dark h5 .docs-heading-anchor:visited,html.theme--documenter-dark h6 .docs-heading-anchor,html.theme--documenter-dark h6 .docs-heading-anchor:hover,html.theme--documenter-dark h6 .docs-heading-anchor:visited{color:#f2f2f2}html.theme--documenter-dark h1 .docs-heading-anchor-permalink,html.theme--documenter-dark h2 .docs-heading-anchor-permalink,html.theme--documenter-dark h3 .docs-heading-anchor-permalink,html.theme--documenter-dark h4 .docs-heading-anchor-permalink,html.theme--documenter-dark h5 .docs-heading-anchor-permalink,html.theme--documenter-dark h6 .docs-heading-anchor-permalink{visibility:hidden;vertical-align:middle;margin-left:0.5em;font-size:0.7rem}html.theme--documenter-dark h1 .docs-heading-anchor-permalink::before,html.theme--documenter-dark h2 .docs-heading-anchor-permalink::before,html.theme--documenter-dark h3 .docs-heading-anchor-permalink::before,html.theme--documenter-dark h4 .docs-heading-anchor-permalink::before,html.theme--documenter-dark h5 .docs-heading-anchor-permalink::before,html.theme--documenter-dark h6 .docs-heading-anchor-permalink::before{font-family:"Font Awesome 6 Free";font-weight:900;content:"\f0c1"}html.theme--documenter-dark h1:hover .docs-heading-anchor-permalink,html.theme--documenter-dark h2:hover .docs-heading-anchor-permalink,html.theme--documenter-dark h3:hover .docs-heading-anchor-permalink,html.theme--documenter-dark h4:hover .docs-heading-anchor-permalink,html.theme--documenter-dark h5:hover .docs-heading-anchor-permalink,html.theme--documenter-dark h6:hover .docs-heading-anchor-permalink{visibility:visible}html.theme--documenter-dark .docs-light-only{display:none !important}html.theme--documenter-dark pre{position:relative;overflow:hidden}html.theme--documenter-dark pre code,html.theme--documenter-dark pre code.hljs{padding:0 .75rem !important;overflow:auto;display:block}html.theme--documenter-dark pre code:first-of-type,html.theme--documenter-dark pre code.hljs:first-of-type{padding-top:0.5rem !important}html.theme--documenter-dark pre code:last-of-type,html.theme--documenter-dark pre code.hljs:last-of-type{padding-bottom:0.5rem !important}html.theme--documenter-dark pre .copy-button{opacity:0.2;transition:opacity 0.2s;position:absolute;right:0em;top:0em;padding:0.5em;width:2.5em;height:2.5em;background:transparent;border:none;font-family:"Font Awesome 6 Free";color:#fff;cursor:pointer;text-align:center}html.theme--documenter-dark pre .copy-button:focus,html.theme--documenter-dark pre .copy-button:hover{opacity:1;background:rgba(255,255,255,0.1);color:#1abc9c}html.theme--documenter-dark pre .copy-button.success{color:#259a12;opacity:1}html.theme--documenter-dark pre .copy-button.error{color:#cb3c33;opacity:1}html.theme--documenter-dark pre:hover .copy-button{opacity:1}html.theme--documenter-dark .admonition{background-color:#282f2f;border-style:solid;border-width:1px;border-color:#5e6d6f;border-radius:.4em;font-size:1rem}html.theme--documenter-dark .admonition strong{color:currentColor}html.theme--documenter-dark .admonition.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.admonition{font-size:.75rem}html.theme--documenter-dark .admonition.is-medium{font-size:1.25rem}html.theme--documenter-dark .admonition.is-large{font-size:1.5rem}html.theme--documenter-dark .admonition.is-default{background-color:#282f2f;border-color:#5e6d6f}html.theme--documenter-dark .admonition.is-default>.admonition-header{background-color:#5e6d6f;color:#fff}html.theme--documenter-dark .admonition.is-default>.admonition-body{color:#fff}html.theme--documenter-dark .admonition.is-info{background-color:#282f2f;border-color:#024c7d}html.theme--documenter-dark .admonition.is-info>.admonition-header{background-color:#024c7d;color:#fff}html.theme--documenter-dark .admonition.is-info>.admonition-body{color:#fff}html.theme--documenter-dark .admonition.is-success{background-color:#282f2f;border-color:#008438}html.theme--documenter-dark .admonition.is-success>.admonition-header{background-color:#008438;color:#fff}html.theme--documenter-dark .admonition.is-success>.admonition-body{color:#fff}html.theme--documenter-dark .admonition.is-warning{background-color:#282f2f;border-color:#ad8100}html.theme--documenter-dark .admonition.is-warning>.admonition-header{background-color:#ad8100;color:#fff}html.theme--documenter-dark .admonition.is-warning>.admonition-body{color:#fff}html.theme--documenter-dark .admonition.is-danger{background-color:#282f2f;border-color:#9e1b0d}html.theme--documenter-dark .admonition.is-danger>.admonition-header{background-color:#9e1b0d;color:#fff}html.theme--documenter-dark .admonition.is-danger>.admonition-body{color:#fff}html.theme--documenter-dark .admonition.is-compat{background-color:#282f2f;border-color:#137886}html.theme--documenter-dark .admonition.is-compat>.admonition-header{background-color:#137886;color:#fff}html.theme--documenter-dark .admonition.is-compat>.admonition-body{color:#fff}html.theme--documenter-dark .admonition-header{color:#fff;background-color:#5e6d6f;align-items:center;font-weight:700;justify-content:space-between;line-height:1.25;padding:0.5rem .75rem;position:relative}html.theme--documenter-dark .admonition-header:before{font-family:"Font Awesome 6 Free";font-weight:900;margin-right:.75rem;content:"\f06a"}html.theme--documenter-dark details.admonition.is-details>.admonition-header{list-style:none}html.theme--documenter-dark details.admonition.is-details>.admonition-header:before{font-family:"Font Awesome 6 Free";font-weight:900;content:"\f055"}html.theme--documenter-dark details.admonition.is-details[open]>.admonition-header:before{font-family:"Font Awesome 6 Free";font-weight:900;content:"\f056"}html.theme--documenter-dark .admonition-body{color:#fff;padding:0.5rem .75rem}html.theme--documenter-dark .admonition-body pre{background-color:#282f2f}html.theme--documenter-dark .admonition-body code{background-color:rgba(255,255,255,0.05)}html.theme--documenter-dark .docstring{margin-bottom:1em;background-color:rgba(0,0,0,0);border:1px solid #5e6d6f;box-shadow:none;max-width:100%}html.theme--documenter-dark .docstring>header{cursor:pointer;display:flex;flex-grow:1;align-items:stretch;padding:0.5rem .75rem;background-color:#282f2f;box-shadow:0 0.125em 0.25em rgba(10,10,10,0.1);box-shadow:none;border-bottom:1px solid #5e6d6f;overflow:auto}html.theme--documenter-dark .docstring>header code{background-color:transparent}html.theme--documenter-dark .docstring>header .docstring-article-toggle-button{min-width:1.1rem;padding:0.2rem 0.2rem 0.2rem 0}html.theme--documenter-dark .docstring>header .docstring-binding{margin-right:0.3em}html.theme--documenter-dark .docstring>header .docstring-category{margin-left:0.3em}html.theme--documenter-dark .docstring>section{position:relative;padding:.75rem .75rem;border-bottom:1px solid #5e6d6f}html.theme--documenter-dark .docstring>section:last-child{border-bottom:none}html.theme--documenter-dark .docstring>section>a.docs-sourcelink{transition:opacity 0.3s;opacity:0;position:absolute;right:.375rem;bottom:.375rem}html.theme--documenter-dark .docstring>section>a.docs-sourcelink:focus{opacity:1 !important}html.theme--documenter-dark .docstring:hover>section>a.docs-sourcelink{opacity:0.2}html.theme--documenter-dark .docstring:focus-within>section>a.docs-sourcelink{opacity:0.2}html.theme--documenter-dark .docstring>section:hover a.docs-sourcelink{opacity:1}html.theme--documenter-dark .documenter-example-output{background-color:#1f2424}html.theme--documenter-dark .outdated-warning-overlay{position:fixed;top:0;left:0;right:0;box-shadow:0 0 10px rgba(0,0,0,0.3);z-index:999;background-color:#282f2f;color:#fff;border-bottom:3px solid #9e1b0d;padding:10px 35px;text-align:center;font-size:15px}html.theme--documenter-dark .outdated-warning-overlay .outdated-warning-closer{position:absolute;top:calc(50% - 10px);right:18px;cursor:pointer;width:12px}html.theme--documenter-dark .outdated-warning-overlay a{color:#1abc9c}html.theme--documenter-dark .outdated-warning-overlay a:hover{color:#1dd2af}html.theme--documenter-dark .content pre{border:1px solid #5e6d6f}html.theme--documenter-dark .content code{font-weight:inherit}html.theme--documenter-dark .content a code{color:#1abc9c}html.theme--documenter-dark .content h1 code,html.theme--documenter-dark .content h2 code,html.theme--documenter-dark .content h3 code,html.theme--documenter-dark .content h4 code,html.theme--documenter-dark .content h5 code,html.theme--documenter-dark .content h6 code{color:#f2f2f2}html.theme--documenter-dark .content table{display:block;width:initial;max-width:100%;overflow-x:auto}html.theme--documenter-dark .content blockquote>ul:first-child,html.theme--documenter-dark .content blockquote>ol:first-child,html.theme--documenter-dark .content .admonition-body>ul:first-child,html.theme--documenter-dark .content .admonition-body>ol:first-child{margin-top:0}html.theme--documenter-dark pre,html.theme--documenter-dark code{font-variant-ligatures:no-contextual}html.theme--documenter-dark .breadcrumb a.is-disabled{cursor:default;pointer-events:none}html.theme--documenter-dark .breadcrumb a.is-disabled,html.theme--documenter-dark .breadcrumb a.is-disabled:hover{color:#f2f2f2}html.theme--documenter-dark .hljs{background:initial !important}html.theme--documenter-dark .katex .katex-mathml{top:0;right:0}html.theme--documenter-dark .katex-display,html.theme--documenter-dark mjx-container,html.theme--documenter-dark .MathJax_Display{margin:0.5em 0 !important}html.theme--documenter-dark html{-moz-osx-font-smoothing:auto;-webkit-font-smoothing:auto}html.theme--documenter-dark li.no-marker{list-style:none}html.theme--documenter-dark #documenter .docs-main>article{overflow-wrap:break-word}html.theme--documenter-dark #documenter .docs-main>article .math-container{overflow-x:auto;overflow-y:hidden}@media screen and (min-width: 1056px){html.theme--documenter-dark #documenter .docs-main{max-width:52rem;margin-left:20rem;padding-right:1rem}}@media screen and (max-width: 1055px){html.theme--documenter-dark #documenter .docs-main{width:100%}html.theme--documenter-dark #documenter .docs-main>article{max-width:52rem;margin-left:auto;margin-right:auto;margin-bottom:1rem;padding:0 1rem}html.theme--documenter-dark #documenter .docs-main>header,html.theme--documenter-dark #documenter .docs-main>nav{max-width:100%;width:100%;margin:0}}html.theme--documenter-dark #documenter .docs-main header.docs-navbar{background-color:#1f2424;border-bottom:1px solid #5e6d6f;z-index:2;min-height:4rem;margin-bottom:1rem;display:flex}html.theme--documenter-dark #documenter .docs-main header.docs-navbar .breadcrumb{flex-grow:1;overflow-x:hidden}html.theme--documenter-dark #documenter .docs-main header.docs-navbar .docs-sidebar-button{display:block;font-size:1.5rem;padding-bottom:0.1rem;margin-right:1rem}html.theme--documenter-dark #documenter .docs-main header.docs-navbar .docs-right{display:flex;white-space:nowrap;gap:1rem;align-items:center}html.theme--documenter-dark #documenter .docs-main header.docs-navbar .docs-right .docs-icon,html.theme--documenter-dark #documenter .docs-main header.docs-navbar .docs-right .docs-label{display:inline-block}html.theme--documenter-dark #documenter .docs-main header.docs-navbar .docs-right .docs-label{padding:0;margin-left:0.3em}@media screen and (max-width: 1055px){html.theme--documenter-dark #documenter .docs-main header.docs-navbar .docs-right .docs-navbar-link{margin-left:0.4rem;margin-right:0.4rem}}html.theme--documenter-dark #documenter .docs-main header.docs-navbar>*{margin:auto 0}@media screen and (max-width: 1055px){html.theme--documenter-dark #documenter .docs-main header.docs-navbar{position:sticky;top:0;padding:0 1rem;transition-property:top, box-shadow;-webkit-transition-property:top, box-shadow;transition-duration:0.3s;-webkit-transition-duration:0.3s}html.theme--documenter-dark #documenter .docs-main header.docs-navbar.headroom--not-top{box-shadow:.2rem 0rem .4rem #171717;transition-duration:0.7s;-webkit-transition-duration:0.7s}html.theme--documenter-dark #documenter .docs-main header.docs-navbar.headroom--unpinned.headroom--not-top.headroom--not-bottom{top:-4.5rem;transition-duration:0.7s;-webkit-transition-duration:0.7s}}html.theme--documenter-dark #documenter .docs-main section.footnotes{border-top:1px solid #5e6d6f}html.theme--documenter-dark #documenter .docs-main section.footnotes li .tag:first-child,html.theme--documenter-dark #documenter .docs-main section.footnotes li .docstring>section>a.docs-sourcelink:first-child,html.theme--documenter-dark #documenter .docs-main section.footnotes li .content kbd:first-child,html.theme--documenter-dark .content #documenter .docs-main section.footnotes li kbd:first-child{margin-right:1em;margin-bottom:0.4em}html.theme--documenter-dark #documenter .docs-main .docs-footer{display:flex;flex-wrap:wrap;margin-left:0;margin-right:0;border-top:1px solid #5e6d6f;padding-top:1rem;padding-bottom:1rem}@media screen and (max-width: 1055px){html.theme--documenter-dark #documenter .docs-main .docs-footer{padding-left:1rem;padding-right:1rem}}html.theme--documenter-dark #documenter .docs-main .docs-footer .docs-footer-nextpage,html.theme--documenter-dark #documenter .docs-main .docs-footer .docs-footer-prevpage{flex-grow:1}html.theme--documenter-dark #documenter .docs-main .docs-footer .docs-footer-nextpage{text-align:right}html.theme--documenter-dark #documenter .docs-main .docs-footer .flexbox-break{flex-basis:100%;height:0}html.theme--documenter-dark #documenter .docs-main .docs-footer .footer-message{font-size:0.8em;margin:0.5em auto 0 auto;text-align:center}html.theme--documenter-dark #documenter .docs-sidebar{display:flex;flex-direction:column;color:#fff;background-color:#282f2f;border-right:1px solid #5e6d6f;padding:0;flex:0 0 18rem;z-index:5;font-size:1rem;position:fixed;left:-18rem;width:18rem;height:100%;transition:left 0.3s}html.theme--documenter-dark #documenter .docs-sidebar.visible{left:0;box-shadow:.4rem 0rem .8rem #171717}@media screen and (min-width: 1056px){html.theme--documenter-dark #documenter .docs-sidebar.visible{box-shadow:none}}@media screen and (min-width: 1056px){html.theme--documenter-dark #documenter .docs-sidebar{left:0;top:0}}html.theme--documenter-dark #documenter .docs-sidebar .docs-logo{margin-top:1rem;padding:0 1rem}html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img{max-height:6rem;margin:auto}html.theme--documenter-dark #documenter .docs-sidebar .docs-package-name{flex-shrink:0;font-size:1.5rem;font-weight:700;text-align:center;white-space:nowrap;overflow:hidden;padding:0.5rem 0}html.theme--documenter-dark #documenter .docs-sidebar .docs-package-name .docs-autofit{max-width:16.2rem}html.theme--documenter-dark #documenter .docs-sidebar .docs-package-name a,html.theme--documenter-dark #documenter .docs-sidebar .docs-package-name a:hover{color:#fff}html.theme--documenter-dark #documenter .docs-sidebar .docs-version-selector{border-top:1px solid #5e6d6f;display:none;padding:0.5rem}html.theme--documenter-dark #documenter .docs-sidebar .docs-version-selector.visible{display:flex}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu{flex-grow:1;user-select:none;border-top:1px solid #5e6d6f;padding-bottom:1.5rem}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu>li>.tocitem{font-weight:bold}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu>li li{font-size:.95rem;margin-left:1em;border-left:1px solid #5e6d6f}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu input.collapse-toggle{display:none}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu ul.collapsed{display:none}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu input:checked~ul.collapsed{display:block}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu label.tocitem{display:flex}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu label.tocitem .docs-label{flex-grow:2}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu label.tocitem .docs-chevron{display:inline-block;font-style:normal;font-variant:normal;text-rendering:auto;line-height:1;font-size:.75rem;margin-left:1rem;margin-top:auto;margin-bottom:auto}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu label.tocitem .docs-chevron::before{font-family:"Font Awesome 6 Free";font-weight:900;content:"\f054"}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu input:checked~label.tocitem .docs-chevron::before{content:"\f078"}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu .tocitem{display:block;padding:0.5rem 0.5rem}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu .tocitem,html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu .tocitem:hover{color:#fff;background:#282f2f}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu a.tocitem:hover,html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu label.tocitem:hover{color:#fff;background-color:#32393a}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu li.is-active{border-top:1px solid #5e6d6f;border-bottom:1px solid #5e6d6f;background-color:#1f2424}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu li.is-active .tocitem,html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu li.is-active .tocitem:hover{background-color:#1f2424;color:#fff}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu li.is-active ul.internal .tocitem:hover{background-color:#32393a;color:#fff}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu>li.is-active:first-child{border-top:none}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu ul.internal{margin:0 0.5rem 0.5rem;border-top:1px solid #5e6d6f}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu ul.internal li{font-size:.85rem;border-left:none;margin-left:0;margin-top:0.5rem}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu ul.internal .tocitem{width:100%;padding:0}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu ul.internal .tocitem::before{content:"⚬";margin-right:0.4em}html.theme--documenter-dark #documenter .docs-sidebar form.docs-search{margin:auto;margin-top:0.5rem;margin-bottom:0.5rem}html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input{width:14.4rem}html.theme--documenter-dark #documenter .docs-sidebar #documenter-search-query{color:#868c98;width:14.4rem;box-shadow:inset 0 1px 2px rgba(10,10,10,0.1)}@media screen and (min-width: 1056px){html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu{overflow-y:auto;-webkit-overflow-scroll:touch}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu::-webkit-scrollbar{width:.3rem;background:none}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu::-webkit-scrollbar-thumb{border-radius:5px 0px 0px 5px;background:#3b4445}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu::-webkit-scrollbar-thumb:hover{background:#4e5a5c}}@media screen and (max-width: 1055px){html.theme--documenter-dark #documenter .docs-sidebar{overflow-y:auto;-webkit-overflow-scroll:touch}html.theme--documenter-dark #documenter .docs-sidebar::-webkit-scrollbar{width:.3rem;background:none}html.theme--documenter-dark #documenter .docs-sidebar::-webkit-scrollbar-thumb{border-radius:5px 0px 0px 5px;background:#3b4445}html.theme--documenter-dark #documenter .docs-sidebar::-webkit-scrollbar-thumb:hover{background:#4e5a5c}}html.theme--documenter-dark kbd.search-modal-key-hints{border-radius:0.25rem;border:1px solid rgba(245,245,245,0.6);box-shadow:0 2px 0 1px rgba(245,245,245,0.6);cursor:default;font-size:0.9rem;line-height:1.5;min-width:0.75rem;text-align:center;padding:0.1rem 0.3rem;position:relative;top:-1px}html.theme--documenter-dark .search-min-width-50{min-width:50%}html.theme--documenter-dark .search-min-height-100{min-height:100%}html.theme--documenter-dark .search-modal-card-body{max-height:calc(100vh - 15rem)}html.theme--documenter-dark .search-result-link{border-radius:0.7em;transition:all 300ms}html.theme--documenter-dark .search-result-link:hover,html.theme--documenter-dark .search-result-link:focus{background-color:rgba(0,128,128,0.1)}html.theme--documenter-dark .search-result-link .property-search-result-badge,html.theme--documenter-dark .search-result-link .search-filter{transition:all 300ms}html.theme--documenter-dark .property-search-result-badge,html.theme--documenter-dark .search-filter{padding:0.15em 0.5em;font-size:0.8em;font-style:italic;text-transform:none !important;line-height:1.5;color:#f5f5f5;background-color:rgba(51,65,85,0.501961);border-radius:0.6rem}html.theme--documenter-dark .search-result-link:hover .property-search-result-badge,html.theme--documenter-dark .search-result-link:hover .search-filter,html.theme--documenter-dark .search-result-link:focus .property-search-result-badge,html.theme--documenter-dark .search-result-link:focus .search-filter{color:#333;background-color:#f1f5f9}html.theme--documenter-dark .search-filter{color:#333;background-color:#f5f5f5;transition:all 300ms}html.theme--documenter-dark .search-filter:hover,html.theme--documenter-dark .search-filter:focus{color:#333}html.theme--documenter-dark .search-filter-selected{color:#f5f5f5;background-color:rgba(139,0,139,0.5)}html.theme--documenter-dark .search-filter-selected:hover,html.theme--documenter-dark .search-filter-selected:focus{color:#f5f5f5}html.theme--documenter-dark .search-result-highlight{background-color:#ffdd57;color:black}html.theme--documenter-dark .search-divider{border-bottom:1px solid #5e6d6f}html.theme--documenter-dark .search-result-title{width:85%;color:#f5f5f5}html.theme--documenter-dark .search-result-code-title{font-size:0.875rem;font-family:"JuliaMono","SFMono-Regular","Menlo","Consolas","Liberation Mono","DejaVu Sans Mono",monospace}html.theme--documenter-dark #search-modal .modal-card-body::-webkit-scrollbar,html.theme--documenter-dark #search-modal .filter-tabs::-webkit-scrollbar{height:10px;width:10px;background-color:transparent}html.theme--documenter-dark #search-modal .modal-card-body::-webkit-scrollbar-thumb,html.theme--documenter-dark #search-modal .filter-tabs::-webkit-scrollbar-thumb{background-color:gray;border-radius:1rem}html.theme--documenter-dark #search-modal .modal-card-body::-webkit-scrollbar-track,html.theme--documenter-dark #search-modal .filter-tabs::-webkit-scrollbar-track{-webkit-box-shadow:inset 0 0 6px rgba(0,0,0,0.6);background-color:transparent}html.theme--documenter-dark .w-100{width:100%}html.theme--documenter-dark .gap-2{gap:0.5rem}html.theme--documenter-dark .gap-4{gap:1rem}html.theme--documenter-dark .gap-8{gap:2rem}html.theme--documenter-dark{background-color:#1f2424;font-size:16px;min-width:300px;overflow-x:auto;overflow-y:scroll;text-rendering:optimizeLegibility;text-size-adjust:100%}html.theme--documenter-dark .ansi span.sgr1{font-weight:bolder}html.theme--documenter-dark .ansi span.sgr2{font-weight:lighter}html.theme--documenter-dark .ansi span.sgr3{font-style:italic}html.theme--documenter-dark .ansi span.sgr4{text-decoration:underline}html.theme--documenter-dark .ansi span.sgr7{color:#1f2424;background-color:#fff}html.theme--documenter-dark .ansi span.sgr8{color:transparent}html.theme--documenter-dark .ansi span.sgr8 span{color:transparent}html.theme--documenter-dark .ansi span.sgr9{text-decoration:line-through}html.theme--documenter-dark .ansi span.sgr30{color:#242424}html.theme--documenter-dark .ansi span.sgr31{color:#f6705f}html.theme--documenter-dark .ansi span.sgr32{color:#4fb43a}html.theme--documenter-dark .ansi span.sgr33{color:#f4c72f}html.theme--documenter-dark .ansi span.sgr34{color:#7587f0}html.theme--documenter-dark .ansi span.sgr35{color:#bc89d3}html.theme--documenter-dark .ansi span.sgr36{color:#49b6ca}html.theme--documenter-dark .ansi span.sgr37{color:#b3bdbe}html.theme--documenter-dark .ansi span.sgr40{background-color:#242424}html.theme--documenter-dark .ansi span.sgr41{background-color:#f6705f}html.theme--documenter-dark .ansi span.sgr42{background-color:#4fb43a}html.theme--documenter-dark .ansi span.sgr43{background-color:#f4c72f}html.theme--documenter-dark .ansi span.sgr44{background-color:#7587f0}html.theme--documenter-dark .ansi span.sgr45{background-color:#bc89d3}html.theme--documenter-dark .ansi span.sgr46{background-color:#49b6ca}html.theme--documenter-dark .ansi span.sgr47{background-color:#b3bdbe}html.theme--documenter-dark .ansi span.sgr90{color:#92a0a2}html.theme--documenter-dark .ansi span.sgr91{color:#ff8674}html.theme--documenter-dark .ansi span.sgr92{color:#79d462}html.theme--documenter-dark .ansi span.sgr93{color:#ffe76b}html.theme--documenter-dark .ansi span.sgr94{color:#8a98ff}html.theme--documenter-dark .ansi span.sgr95{color:#d2a4e6}html.theme--documenter-dark .ansi span.sgr96{color:#6bc8db}html.theme--documenter-dark .ansi span.sgr97{color:#ecf0f1}html.theme--documenter-dark .ansi span.sgr100{background-color:#92a0a2}html.theme--documenter-dark .ansi span.sgr101{background-color:#ff8674}html.theme--documenter-dark .ansi span.sgr102{background-color:#79d462}html.theme--documenter-dark .ansi span.sgr103{background-color:#ffe76b}html.theme--documenter-dark .ansi span.sgr104{background-color:#8a98ff}html.theme--documenter-dark .ansi span.sgr105{background-color:#d2a4e6}html.theme--documenter-dark .ansi span.sgr106{background-color:#6bc8db}html.theme--documenter-dark .ansi span.sgr107{background-color:#ecf0f1}html.theme--documenter-dark code.language-julia-repl>span.hljs-meta{color:#4fb43a;font-weight:bolder}html.theme--documenter-dark .hljs{background:#2b2b2b;color:#f8f8f2}html.theme--documenter-dark .hljs-comment,html.theme--documenter-dark .hljs-quote{color:#d4d0ab}html.theme--documenter-dark .hljs-variable,html.theme--documenter-dark .hljs-template-variable,html.theme--documenter-dark .hljs-tag,html.theme--documenter-dark .hljs-name,html.theme--documenter-dark .hljs-selector-id,html.theme--documenter-dark .hljs-selector-class,html.theme--documenter-dark .hljs-regexp,html.theme--documenter-dark .hljs-deletion{color:#ffa07a}html.theme--documenter-dark .hljs-number,html.theme--documenter-dark .hljs-built_in,html.theme--documenter-dark .hljs-literal,html.theme--documenter-dark .hljs-type,html.theme--documenter-dark .hljs-params,html.theme--documenter-dark .hljs-meta,html.theme--documenter-dark .hljs-link{color:#f5ab35}html.theme--documenter-dark .hljs-attribute{color:#ffd700}html.theme--documenter-dark .hljs-string,html.theme--documenter-dark .hljs-symbol,html.theme--documenter-dark .hljs-bullet,html.theme--documenter-dark .hljs-addition{color:#abe338}html.theme--documenter-dark .hljs-title,html.theme--documenter-dark .hljs-section{color:#00e0e0}html.theme--documenter-dark .hljs-keyword,html.theme--documenter-dark .hljs-selector-tag{color:#dcc6e0}html.theme--documenter-dark .hljs-emphasis{font-style:italic}html.theme--documenter-dark .hljs-strong{font-weight:bold}@media screen and (-ms-high-contrast: active){html.theme--documenter-dark .hljs-addition,html.theme--documenter-dark .hljs-attribute,html.theme--documenter-dark .hljs-built_in,html.theme--documenter-dark .hljs-bullet,html.theme--documenter-dark .hljs-comment,html.theme--documenter-dark .hljs-link,html.theme--documenter-dark .hljs-literal,html.theme--documenter-dark .hljs-meta,html.theme--documenter-dark .hljs-number,html.theme--documenter-dark .hljs-params,html.theme--documenter-dark .hljs-string,html.theme--documenter-dark .hljs-symbol,html.theme--documenter-dark .hljs-type,html.theme--documenter-dark .hljs-quote{color:highlight}html.theme--documenter-dark .hljs-keyword,html.theme--documenter-dark .hljs-selector-tag{font-weight:bold}}html.theme--documenter-dark .hljs-subst{color:#f8f8f2}html.theme--documenter-dark .search-result-link{border-radius:0.7em;transition:all 300ms}html.theme--documenter-dark .search-result-link:hover,html.theme--documenter-dark .search-result-link:focus{background-color:rgba(0,128,128,0.1)}html.theme--documenter-dark .search-result-link .property-search-result-badge,html.theme--documenter-dark .search-result-link .search-filter{transition:all 300ms}html.theme--documenter-dark .search-result-link:hover .property-search-result-badge,html.theme--documenter-dark .search-result-link:hover .search-filter,html.theme--documenter-dark .search-result-link:focus .property-search-result-badge,html.theme--documenter-dark .search-result-link:focus .search-filter{color:#333 !important;background-color:#f1f5f9 !important}html.theme--documenter-dark .property-search-result-badge,html.theme--documenter-dark .search-filter{padding:0.15em 0.5em;font-size:0.8em;font-style:italic;text-transform:none !important;line-height:1.5;color:whitesmoke;background-color:#33415580;border-radius:0.6rem}html.theme--documenter-dark .search-result-title{color:whitesmoke}html.theme--documenter-dark .search-result-highlight{background-color:greenyellow;color:black}html.theme--documenter-dark .search-divider{border-bottom:1px solid #5e6d6f50}html.theme--documenter-dark .w-100{width:100%}html.theme--documenter-dark .gap-2{gap:0.5rem}html.theme--documenter-dark .gap-4{gap:1rem} diff --git a/v0.11.5/assets/themes/documenter-light.css b/v0.11.5/assets/themes/documenter-light.css new file mode 100644 index 00000000..2f168c77 --- /dev/null +++ b/v0.11.5/assets/themes/documenter-light.css @@ -0,0 +1,9 @@ +.pagination-previous,.pagination-next,.pagination-link,.pagination-ellipsis,.file-cta,.file-name,.select select,.textarea,.input,#documenter .docs-sidebar form.docs-search>input,.button{-moz-appearance:none;-webkit-appearance:none;align-items:center;border:1px solid transparent;border-radius:4px;box-shadow:none;display:inline-flex;font-size:1rem;height:2.5em;justify-content:flex-start;line-height:1.5;padding-bottom:calc(0.5em - 1px);padding-left:calc(0.75em - 1px);padding-right:calc(0.75em - 1px);padding-top:calc(0.5em - 1px);position:relative;vertical-align:top}.pagination-previous:focus,.pagination-next:focus,.pagination-link:focus,.pagination-ellipsis:focus,.file-cta:focus,.file-name:focus,.select select:focus,.textarea:focus,.input:focus,#documenter .docs-sidebar form.docs-search>input:focus,.button:focus,.is-focused.pagination-previous,.is-focused.pagination-next,.is-focused.pagination-link,.is-focused.pagination-ellipsis,.is-focused.file-cta,.is-focused.file-name,.select select.is-focused,.is-focused.textarea,.is-focused.input,#documenter .docs-sidebar form.docs-search>input.is-focused,.is-focused.button,.pagination-previous:active,.pagination-next:active,.pagination-link:active,.pagination-ellipsis:active,.file-cta:active,.file-name:active,.select select:active,.textarea:active,.input:active,#documenter .docs-sidebar form.docs-search>input:active,.button:active,.is-active.pagination-previous,.is-active.pagination-next,.is-active.pagination-link,.is-active.pagination-ellipsis,.is-active.file-cta,.is-active.file-name,.select select.is-active,.is-active.textarea,.is-active.input,#documenter .docs-sidebar form.docs-search>input.is-active,.is-active.button{outline:none}.pagination-previous[disabled],.pagination-next[disabled],.pagination-link[disabled],.pagination-ellipsis[disabled],.file-cta[disabled],.file-name[disabled],.select select[disabled],.textarea[disabled],.input[disabled],#documenter .docs-sidebar form.docs-search>input[disabled],.button[disabled],fieldset[disabled] .pagination-previous,fieldset[disabled] .pagination-next,fieldset[disabled] .pagination-link,fieldset[disabled] .pagination-ellipsis,fieldset[disabled] .file-cta,fieldset[disabled] .file-name,fieldset[disabled] .select select,.select fieldset[disabled] select,fieldset[disabled] .textarea,fieldset[disabled] .input,fieldset[disabled] #documenter .docs-sidebar form.docs-search>input,#documenter .docs-sidebar fieldset[disabled] form.docs-search>input,fieldset[disabled] .button{cursor:not-allowed}.tabs,.pagination-previous,.pagination-next,.pagination-link,.pagination-ellipsis,.breadcrumb,.file,.button,.is-unselectable{-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.navbar-link:not(.is-arrowless)::after,.select:not(.is-multiple):not(.is-loading)::after{border:3px solid rgba(0,0,0,0);border-radius:2px;border-right:0;border-top:0;content:" ";display:block;height:0.625em;margin-top:-0.4375em;pointer-events:none;position:absolute;top:50%;transform:rotate(-45deg);transform-origin:center;width:0.625em}.admonition:not(:last-child),.tabs:not(:last-child),.pagination:not(:last-child),.message:not(:last-child),.level:not(:last-child),.breadcrumb:not(:last-child),.block:not(:last-child),.title:not(:last-child),.subtitle:not(:last-child),.table-container:not(:last-child),.table:not(:last-child),.progress:not(:last-child),.notification:not(:last-child),.content:not(:last-child),.box:not(:last-child){margin-bottom:1.5rem}.modal-close,.delete{-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-moz-appearance:none;-webkit-appearance:none;background-color:rgba(10,10,10,0.2);border:none;border-radius:9999px;cursor:pointer;pointer-events:auto;display:inline-block;flex-grow:0;flex-shrink:0;font-size:0;height:20px;max-height:20px;max-width:20px;min-height:20px;min-width:20px;outline:none;position:relative;vertical-align:top;width:20px}.modal-close::before,.delete::before,.modal-close::after,.delete::after{background-color:#fff;content:"";display:block;left:50%;position:absolute;top:50%;transform:translateX(-50%) translateY(-50%) rotate(45deg);transform-origin:center center}.modal-close::before,.delete::before{height:2px;width:50%}.modal-close::after,.delete::after{height:50%;width:2px}.modal-close:hover,.delete:hover,.modal-close:focus,.delete:focus{background-color:rgba(10,10,10,0.3)}.modal-close:active,.delete:active{background-color:rgba(10,10,10,0.4)}.is-small.modal-close,#documenter .docs-sidebar form.docs-search>input.modal-close,.is-small.delete,#documenter .docs-sidebar form.docs-search>input.delete{height:16px;max-height:16px;max-width:16px;min-height:16px;min-width:16px;width:16px}.is-medium.modal-close,.is-medium.delete{height:24px;max-height:24px;max-width:24px;min-height:24px;min-width:24px;width:24px}.is-large.modal-close,.is-large.delete{height:32px;max-height:32px;max-width:32px;min-height:32px;min-width:32px;width:32px}.control.is-loading::after,.select.is-loading::after,.loader,.button.is-loading::after{animation:spinAround 500ms infinite linear;border:2px solid #dbdbdb;border-radius:9999px;border-right-color:transparent;border-top-color:transparent;content:"";display:block;height:1em;position:relative;width:1em}.hero-video,.modal-background,.modal,.image.is-square img,#documenter .docs-sidebar .docs-logo>img.is-square img,.image.is-square .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-square .has-ratio,.image.is-1by1 img,#documenter .docs-sidebar .docs-logo>img.is-1by1 img,.image.is-1by1 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-1by1 .has-ratio,.image.is-5by4 img,#documenter .docs-sidebar .docs-logo>img.is-5by4 img,.image.is-5by4 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-5by4 .has-ratio,.image.is-4by3 img,#documenter .docs-sidebar .docs-logo>img.is-4by3 img,.image.is-4by3 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-4by3 .has-ratio,.image.is-3by2 img,#documenter .docs-sidebar .docs-logo>img.is-3by2 img,.image.is-3by2 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-3by2 .has-ratio,.image.is-5by3 img,#documenter .docs-sidebar .docs-logo>img.is-5by3 img,.image.is-5by3 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-5by3 .has-ratio,.image.is-16by9 img,#documenter .docs-sidebar .docs-logo>img.is-16by9 img,.image.is-16by9 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-16by9 .has-ratio,.image.is-2by1 img,#documenter .docs-sidebar .docs-logo>img.is-2by1 img,.image.is-2by1 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-2by1 .has-ratio,.image.is-3by1 img,#documenter .docs-sidebar .docs-logo>img.is-3by1 img,.image.is-3by1 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-3by1 .has-ratio,.image.is-4by5 img,#documenter .docs-sidebar .docs-logo>img.is-4by5 img,.image.is-4by5 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-4by5 .has-ratio,.image.is-3by4 img,#documenter .docs-sidebar .docs-logo>img.is-3by4 img,.image.is-3by4 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-3by4 .has-ratio,.image.is-2by3 img,#documenter .docs-sidebar .docs-logo>img.is-2by3 img,.image.is-2by3 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-2by3 .has-ratio,.image.is-3by5 img,#documenter .docs-sidebar .docs-logo>img.is-3by5 img,.image.is-3by5 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-3by5 .has-ratio,.image.is-9by16 img,#documenter .docs-sidebar .docs-logo>img.is-9by16 img,.image.is-9by16 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-9by16 .has-ratio,.image.is-1by2 img,#documenter .docs-sidebar .docs-logo>img.is-1by2 img,.image.is-1by2 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-1by2 .has-ratio,.image.is-1by3 img,#documenter .docs-sidebar .docs-logo>img.is-1by3 img,.image.is-1by3 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-1by3 .has-ratio,.is-overlay{bottom:0;left:0;position:absolute;right:0;top:0}.navbar-burger{-moz-appearance:none;-webkit-appearance:none;appearance:none;background:none;border:none;color:currentColor;font-family:inherit;font-size:1em;margin:0;padding:0}.has-text-white{color:#fff !important}a.has-text-white:hover,a.has-text-white:focus{color:#e6e6e6 !important}.has-background-white{background-color:#fff !important}.has-text-black{color:#0a0a0a !important}a.has-text-black:hover,a.has-text-black:focus{color:#000 !important}.has-background-black{background-color:#0a0a0a !important}.has-text-light{color:#f5f5f5 !important}a.has-text-light:hover,a.has-text-light:focus{color:#dbdbdb !important}.has-background-light{background-color:#f5f5f5 !important}.has-text-dark{color:#363636 !important}a.has-text-dark:hover,a.has-text-dark:focus{color:#1c1c1c !important}.has-background-dark{background-color:#363636 !important}.has-text-primary{color:#4eb5de !important}a.has-text-primary:hover,a.has-text-primary:focus{color:#27a1d2 !important}.has-background-primary{background-color:#4eb5de !important}.has-text-primary-light{color:#eef8fc !important}a.has-text-primary-light:hover,a.has-text-primary-light:focus{color:#c3e6f4 !important}.has-background-primary-light{background-color:#eef8fc !important}.has-text-primary-dark{color:#1a6d8e !important}a.has-text-primary-dark:hover,a.has-text-primary-dark:focus{color:#228eb9 !important}.has-background-primary-dark{background-color:#1a6d8e !important}.has-text-link{color:#2e63b8 !important}a.has-text-link:hover,a.has-text-link:focus{color:#244d8f !important}.has-background-link{background-color:#2e63b8 !important}.has-text-link-light{color:#eff3fb !important}a.has-text-link-light:hover,a.has-text-link-light:focus{color:#c6d6f1 !important}.has-background-link-light{background-color:#eff3fb !important}.has-text-link-dark{color:#3169c4 !important}a.has-text-link-dark:hover,a.has-text-link-dark:focus{color:#5485d4 !important}.has-background-link-dark{background-color:#3169c4 !important}.has-text-info{color:#209cee !important}a.has-text-info:hover,a.has-text-info:focus{color:#1081cb !important}.has-background-info{background-color:#209cee !important}.has-text-info-light{color:#ecf7fe !important}a.has-text-info-light:hover,a.has-text-info-light:focus{color:#bde2fa !important}.has-background-info-light{background-color:#ecf7fe !important}.has-text-info-dark{color:#0e72b4 !important}a.has-text-info-dark:hover,a.has-text-info-dark:focus{color:#1190e3 !important}.has-background-info-dark{background-color:#0e72b4 !important}.has-text-success{color:#22c35b !important}a.has-text-success:hover,a.has-text-success:focus{color:#1a9847 !important}.has-background-success{background-color:#22c35b !important}.has-text-success-light{color:#eefcf3 !important}a.has-text-success-light:hover,a.has-text-success-light:focus{color:#c2f4d4 !important}.has-background-success-light{background-color:#eefcf3 !important}.has-text-success-dark{color:#198f43 !important}a.has-text-success-dark:hover,a.has-text-success-dark:focus{color:#21bb57 !important}.has-background-success-dark{background-color:#198f43 !important}.has-text-warning{color:#ffdd57 !important}a.has-text-warning:hover,a.has-text-warning:focus{color:#ffd324 !important}.has-background-warning{background-color:#ffdd57 !important}.has-text-warning-light{color:#fffbeb !important}a.has-text-warning-light:hover,a.has-text-warning-light:focus{color:#fff1b8 !important}.has-background-warning-light{background-color:#fffbeb !important}.has-text-warning-dark{color:#947600 !important}a.has-text-warning-dark:hover,a.has-text-warning-dark:focus{color:#c79f00 !important}.has-background-warning-dark{background-color:#947600 !important}.has-text-danger{color:#da0b00 !important}a.has-text-danger:hover,a.has-text-danger:focus{color:#a70800 !important}.has-background-danger{background-color:#da0b00 !important}.has-text-danger-light{color:#ffeceb !important}a.has-text-danger-light:hover,a.has-text-danger-light:focus{color:#ffbbb8 !important}.has-background-danger-light{background-color:#ffeceb !important}.has-text-danger-dark{color:#f50c00 !important}a.has-text-danger-dark:hover,a.has-text-danger-dark:focus{color:#ff3429 !important}.has-background-danger-dark{background-color:#f50c00 !important}.has-text-black-bis{color:#121212 !important}.has-background-black-bis{background-color:#121212 !important}.has-text-black-ter{color:#242424 !important}.has-background-black-ter{background-color:#242424 !important}.has-text-grey-darker{color:#363636 !important}.has-background-grey-darker{background-color:#363636 !important}.has-text-grey-dark{color:#4a4a4a !important}.has-background-grey-dark{background-color:#4a4a4a !important}.has-text-grey{color:#6b6b6b !important}.has-background-grey{background-color:#6b6b6b !important}.has-text-grey-light{color:#b5b5b5 !important}.has-background-grey-light{background-color:#b5b5b5 !important}.has-text-grey-lighter{color:#dbdbdb !important}.has-background-grey-lighter{background-color:#dbdbdb !important}.has-text-white-ter{color:#f5f5f5 !important}.has-background-white-ter{background-color:#f5f5f5 !important}.has-text-white-bis{color:#fafafa !important}.has-background-white-bis{background-color:#fafafa !important}.is-flex-direction-row{flex-direction:row !important}.is-flex-direction-row-reverse{flex-direction:row-reverse !important}.is-flex-direction-column{flex-direction:column !important}.is-flex-direction-column-reverse{flex-direction:column-reverse !important}.is-flex-wrap-nowrap{flex-wrap:nowrap !important}.is-flex-wrap-wrap{flex-wrap:wrap !important}.is-flex-wrap-wrap-reverse{flex-wrap:wrap-reverse !important}.is-justify-content-flex-start{justify-content:flex-start !important}.is-justify-content-flex-end{justify-content:flex-end !important}.is-justify-content-center{justify-content:center !important}.is-justify-content-space-between{justify-content:space-between !important}.is-justify-content-space-around{justify-content:space-around !important}.is-justify-content-space-evenly{justify-content:space-evenly !important}.is-justify-content-start{justify-content:start !important}.is-justify-content-end{justify-content:end !important}.is-justify-content-left{justify-content:left !important}.is-justify-content-right{justify-content:right !important}.is-align-content-flex-start{align-content:flex-start !important}.is-align-content-flex-end{align-content:flex-end !important}.is-align-content-center{align-content:center !important}.is-align-content-space-between{align-content:space-between !important}.is-align-content-space-around{align-content:space-around !important}.is-align-content-space-evenly{align-content:space-evenly !important}.is-align-content-stretch{align-content:stretch !important}.is-align-content-start{align-content:start !important}.is-align-content-end{align-content:end !important}.is-align-content-baseline{align-content:baseline !important}.is-align-items-stretch{align-items:stretch !important}.is-align-items-flex-start{align-items:flex-start !important}.is-align-items-flex-end{align-items:flex-end !important}.is-align-items-center{align-items:center !important}.is-align-items-baseline{align-items:baseline !important}.is-align-items-start{align-items:start !important}.is-align-items-end{align-items:end !important}.is-align-items-self-start{align-items:self-start !important}.is-align-items-self-end{align-items:self-end !important}.is-align-self-auto{align-self:auto !important}.is-align-self-flex-start{align-self:flex-start !important}.is-align-self-flex-end{align-self:flex-end !important}.is-align-self-center{align-self:center !important}.is-align-self-baseline{align-self:baseline !important}.is-align-self-stretch{align-self:stretch !important}.is-flex-grow-0{flex-grow:0 !important}.is-flex-grow-1{flex-grow:1 !important}.is-flex-grow-2{flex-grow:2 !important}.is-flex-grow-3{flex-grow:3 !important}.is-flex-grow-4{flex-grow:4 !important}.is-flex-grow-5{flex-grow:5 !important}.is-flex-shrink-0{flex-shrink:0 !important}.is-flex-shrink-1{flex-shrink:1 !important}.is-flex-shrink-2{flex-shrink:2 !important}.is-flex-shrink-3{flex-shrink:3 !important}.is-flex-shrink-4{flex-shrink:4 !important}.is-flex-shrink-5{flex-shrink:5 !important}.is-clearfix::after{clear:both;content:" ";display:table}.is-pulled-left{float:left !important}.is-pulled-right{float:right !important}.is-radiusless{border-radius:0 !important}.is-shadowless{box-shadow:none !important}.is-clickable{cursor:pointer !important;pointer-events:all !important}.is-clipped{overflow:hidden !important}.is-relative{position:relative !important}.is-marginless{margin:0 !important}.is-paddingless{padding:0 !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-left:0 !important;margin-right:0 !important}.my-0{margin-top:0 !important;margin-bottom: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-left:.25rem !important;margin-right:.25rem !important}.my-1{margin-top:.25rem !important;margin-bottom:.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-left:.5rem !important;margin-right:.5rem !important}.my-2{margin-top:.5rem !important;margin-bottom:.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-left:.75rem !important;margin-right:.75rem !important}.my-3{margin-top:.75rem !important;margin-bottom:.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-left:1rem !important;margin-right:1rem !important}.my-4{margin-top:1rem !important;margin-bottom: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-left:1.5rem !important;margin-right:1.5rem !important}.my-5{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.m-6{margin:3rem !important}.mt-6{margin-top:3rem !important}.mr-6{margin-right:3rem !important}.mb-6{margin-bottom:3rem !important}.ml-6{margin-left:3rem !important}.mx-6{margin-left:3rem !important;margin-right:3rem !important}.my-6{margin-top:3rem !important;margin-bottom:3rem !important}.m-auto{margin:auto !important}.mt-auto{margin-top:auto !important}.mr-auto{margin-right:auto !important}.mb-auto{margin-bottom:auto !important}.ml-auto{margin-left:auto !important}.mx-auto{margin-left:auto !important;margin-right:auto !important}.my-auto{margin-top:auto !important;margin-bottom:auto !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-left:0 !important;padding-right: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-left:.25rem !important;padding-right:.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-left:.5rem !important;padding-right:.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-left:.75rem !important;padding-right:.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-left:1rem !important;padding-right: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-left:1.5rem !important;padding-right:1.5rem !important}.py-5{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.p-6{padding:3rem !important}.pt-6{padding-top:3rem !important}.pr-6{padding-right:3rem !important}.pb-6{padding-bottom:3rem !important}.pl-6{padding-left:3rem !important}.px-6{padding-left:3rem !important;padding-right:3rem !important}.py-6{padding-top:3rem !important;padding-bottom:3rem !important}.p-auto{padding:auto !important}.pt-auto{padding-top:auto !important}.pr-auto{padding-right:auto !important}.pb-auto{padding-bottom:auto !important}.pl-auto{padding-left:auto !important}.px-auto{padding-left:auto !important;padding-right:auto !important}.py-auto{padding-top:auto !important;padding-bottom:auto !important}.is-size-1{font-size:3rem !important}.is-size-2{font-size:2.5rem !important}.is-size-3{font-size:2rem !important}.is-size-4{font-size:1.5rem !important}.is-size-5{font-size:1.25rem !important}.is-size-6{font-size:1rem !important}.is-size-7,.docstring>section>a.docs-sourcelink{font-size:.75rem !important}@media screen and (max-width: 768px){.is-size-1-mobile{font-size:3rem !important}.is-size-2-mobile{font-size:2.5rem !important}.is-size-3-mobile{font-size:2rem !important}.is-size-4-mobile{font-size:1.5rem !important}.is-size-5-mobile{font-size:1.25rem !important}.is-size-6-mobile{font-size:1rem !important}.is-size-7-mobile{font-size:.75rem !important}}@media screen and (min-width: 769px),print{.is-size-1-tablet{font-size:3rem !important}.is-size-2-tablet{font-size:2.5rem !important}.is-size-3-tablet{font-size:2rem !important}.is-size-4-tablet{font-size:1.5rem !important}.is-size-5-tablet{font-size:1.25rem !important}.is-size-6-tablet{font-size:1rem !important}.is-size-7-tablet{font-size:.75rem !important}}@media screen and (max-width: 1055px){.is-size-1-touch{font-size:3rem !important}.is-size-2-touch{font-size:2.5rem !important}.is-size-3-touch{font-size:2rem !important}.is-size-4-touch{font-size:1.5rem !important}.is-size-5-touch{font-size:1.25rem !important}.is-size-6-touch{font-size:1rem !important}.is-size-7-touch{font-size:.75rem !important}}@media screen and (min-width: 1056px){.is-size-1-desktop{font-size:3rem !important}.is-size-2-desktop{font-size:2.5rem !important}.is-size-3-desktop{font-size:2rem !important}.is-size-4-desktop{font-size:1.5rem !important}.is-size-5-desktop{font-size:1.25rem !important}.is-size-6-desktop{font-size:1rem !important}.is-size-7-desktop{font-size:.75rem !important}}@media screen and (min-width: 1216px){.is-size-1-widescreen{font-size:3rem !important}.is-size-2-widescreen{font-size:2.5rem !important}.is-size-3-widescreen{font-size:2rem !important}.is-size-4-widescreen{font-size:1.5rem !important}.is-size-5-widescreen{font-size:1.25rem !important}.is-size-6-widescreen{font-size:1rem !important}.is-size-7-widescreen{font-size:.75rem !important}}@media screen and (min-width: 1408px){.is-size-1-fullhd{font-size:3rem !important}.is-size-2-fullhd{font-size:2.5rem !important}.is-size-3-fullhd{font-size:2rem !important}.is-size-4-fullhd{font-size:1.5rem !important}.is-size-5-fullhd{font-size:1.25rem !important}.is-size-6-fullhd{font-size:1rem !important}.is-size-7-fullhd{font-size:.75rem !important}}.has-text-centered{text-align:center !important}.has-text-justified{text-align:justify !important}.has-text-left{text-align:left !important}.has-text-right{text-align:right !important}@media screen and (max-width: 768px){.has-text-centered-mobile{text-align:center !important}}@media screen and (min-width: 769px),print{.has-text-centered-tablet{text-align:center !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.has-text-centered-tablet-only{text-align:center !important}}@media screen and (max-width: 1055px){.has-text-centered-touch{text-align:center !important}}@media screen and (min-width: 1056px){.has-text-centered-desktop{text-align:center !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.has-text-centered-desktop-only{text-align:center !important}}@media screen and (min-width: 1216px){.has-text-centered-widescreen{text-align:center !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.has-text-centered-widescreen-only{text-align:center !important}}@media screen and (min-width: 1408px){.has-text-centered-fullhd{text-align:center !important}}@media screen and (max-width: 768px){.has-text-justified-mobile{text-align:justify !important}}@media screen and (min-width: 769px),print{.has-text-justified-tablet{text-align:justify !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.has-text-justified-tablet-only{text-align:justify !important}}@media screen and (max-width: 1055px){.has-text-justified-touch{text-align:justify !important}}@media screen and (min-width: 1056px){.has-text-justified-desktop{text-align:justify !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.has-text-justified-desktop-only{text-align:justify !important}}@media screen and (min-width: 1216px){.has-text-justified-widescreen{text-align:justify !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.has-text-justified-widescreen-only{text-align:justify !important}}@media screen and (min-width: 1408px){.has-text-justified-fullhd{text-align:justify !important}}@media screen and (max-width: 768px){.has-text-left-mobile{text-align:left !important}}@media screen and (min-width: 769px),print{.has-text-left-tablet{text-align:left !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.has-text-left-tablet-only{text-align:left !important}}@media screen and (max-width: 1055px){.has-text-left-touch{text-align:left !important}}@media screen and (min-width: 1056px){.has-text-left-desktop{text-align:left !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.has-text-left-desktop-only{text-align:left !important}}@media screen and (min-width: 1216px){.has-text-left-widescreen{text-align:left !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.has-text-left-widescreen-only{text-align:left !important}}@media screen and (min-width: 1408px){.has-text-left-fullhd{text-align:left !important}}@media screen and (max-width: 768px){.has-text-right-mobile{text-align:right !important}}@media screen and (min-width: 769px),print{.has-text-right-tablet{text-align:right !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.has-text-right-tablet-only{text-align:right !important}}@media screen and (max-width: 1055px){.has-text-right-touch{text-align:right !important}}@media screen and (min-width: 1056px){.has-text-right-desktop{text-align:right !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.has-text-right-desktop-only{text-align:right !important}}@media screen and (min-width: 1216px){.has-text-right-widescreen{text-align:right !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.has-text-right-widescreen-only{text-align:right !important}}@media screen and (min-width: 1408px){.has-text-right-fullhd{text-align:right !important}}.is-capitalized{text-transform:capitalize !important}.is-lowercase{text-transform:lowercase !important}.is-uppercase{text-transform:uppercase !important}.is-italic{font-style:italic !important}.is-underlined{text-decoration:underline !important}.has-text-weight-light{font-weight:300 !important}.has-text-weight-normal{font-weight:400 !important}.has-text-weight-medium{font-weight:500 !important}.has-text-weight-semibold{font-weight:600 !important}.has-text-weight-bold{font-weight:700 !important}.is-family-primary{font-family:"Lato Medium",-apple-system,BlinkMacSystemFont,"Segoe UI","Helvetica Neue","Helvetica","Arial",sans-serif !important}.is-family-secondary{font-family:"Lato Medium",-apple-system,BlinkMacSystemFont,"Segoe UI","Helvetica Neue","Helvetica","Arial",sans-serif !important}.is-family-sans-serif{font-family:"Lato Medium",-apple-system,BlinkMacSystemFont,"Segoe UI","Helvetica Neue","Helvetica","Arial",sans-serif !important}.is-family-monospace{font-family:"JuliaMono","SFMono-Regular","Menlo","Consolas","Liberation Mono","DejaVu Sans Mono",monospace !important}.is-family-code{font-family:"JuliaMono","SFMono-Regular","Menlo","Consolas","Liberation Mono","DejaVu Sans Mono",monospace !important}.is-block{display:block !important}@media screen and (max-width: 768px){.is-block-mobile{display:block !important}}@media screen and (min-width: 769px),print{.is-block-tablet{display:block !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-block-tablet-only{display:block !important}}@media screen and (max-width: 1055px){.is-block-touch{display:block !important}}@media screen and (min-width: 1056px){.is-block-desktop{display:block !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-block-desktop-only{display:block !important}}@media screen and (min-width: 1216px){.is-block-widescreen{display:block !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-block-widescreen-only{display:block !important}}@media screen and (min-width: 1408px){.is-block-fullhd{display:block !important}}.is-flex{display:flex !important}@media screen and (max-width: 768px){.is-flex-mobile{display:flex !important}}@media screen and (min-width: 769px),print{.is-flex-tablet{display:flex !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-flex-tablet-only{display:flex !important}}@media screen and (max-width: 1055px){.is-flex-touch{display:flex !important}}@media screen and (min-width: 1056px){.is-flex-desktop{display:flex !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-flex-desktop-only{display:flex !important}}@media screen and (min-width: 1216px){.is-flex-widescreen{display:flex !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-flex-widescreen-only{display:flex !important}}@media screen and (min-width: 1408px){.is-flex-fullhd{display:flex !important}}.is-inline{display:inline !important}@media screen and (max-width: 768px){.is-inline-mobile{display:inline !important}}@media screen and (min-width: 769px),print{.is-inline-tablet{display:inline !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-inline-tablet-only{display:inline !important}}@media screen and (max-width: 1055px){.is-inline-touch{display:inline !important}}@media screen and (min-width: 1056px){.is-inline-desktop{display:inline !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-inline-desktop-only{display:inline !important}}@media screen and (min-width: 1216px){.is-inline-widescreen{display:inline !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-inline-widescreen-only{display:inline !important}}@media screen and (min-width: 1408px){.is-inline-fullhd{display:inline !important}}.is-inline-block{display:inline-block !important}@media screen and (max-width: 768px){.is-inline-block-mobile{display:inline-block !important}}@media screen and (min-width: 769px),print{.is-inline-block-tablet{display:inline-block !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-inline-block-tablet-only{display:inline-block !important}}@media screen and (max-width: 1055px){.is-inline-block-touch{display:inline-block !important}}@media screen and (min-width: 1056px){.is-inline-block-desktop{display:inline-block !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-inline-block-desktop-only{display:inline-block !important}}@media screen and (min-width: 1216px){.is-inline-block-widescreen{display:inline-block !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-inline-block-widescreen-only{display:inline-block !important}}@media screen and (min-width: 1408px){.is-inline-block-fullhd{display:inline-block !important}}.is-inline-flex{display:inline-flex !important}@media screen and (max-width: 768px){.is-inline-flex-mobile{display:inline-flex !important}}@media screen and (min-width: 769px),print{.is-inline-flex-tablet{display:inline-flex !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-inline-flex-tablet-only{display:inline-flex !important}}@media screen and (max-width: 1055px){.is-inline-flex-touch{display:inline-flex !important}}@media screen and (min-width: 1056px){.is-inline-flex-desktop{display:inline-flex !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-inline-flex-desktop-only{display:inline-flex !important}}@media screen and (min-width: 1216px){.is-inline-flex-widescreen{display:inline-flex !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-inline-flex-widescreen-only{display:inline-flex !important}}@media screen and (min-width: 1408px){.is-inline-flex-fullhd{display:inline-flex !important}}.is-hidden{display:none !important}.is-sr-only{border:none !important;clip:rect(0, 0, 0, 0) !important;height:0.01em !important;overflow:hidden !important;padding:0 !important;position:absolute !important;white-space:nowrap !important;width:0.01em !important}@media screen and (max-width: 768px){.is-hidden-mobile{display:none !important}}@media screen and (min-width: 769px),print{.is-hidden-tablet{display:none !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-hidden-tablet-only{display:none !important}}@media screen and (max-width: 1055px){.is-hidden-touch{display:none !important}}@media screen and (min-width: 1056px){.is-hidden-desktop{display:none !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-hidden-desktop-only{display:none !important}}@media screen and (min-width: 1216px){.is-hidden-widescreen{display:none !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-hidden-widescreen-only{display:none !important}}@media screen and (min-width: 1408px){.is-hidden-fullhd{display:none !important}}.is-invisible{visibility:hidden !important}@media screen and (max-width: 768px){.is-invisible-mobile{visibility:hidden !important}}@media screen and (min-width: 769px),print{.is-invisible-tablet{visibility:hidden !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-invisible-tablet-only{visibility:hidden !important}}@media screen and (max-width: 1055px){.is-invisible-touch{visibility:hidden !important}}@media screen and (min-width: 1056px){.is-invisible-desktop{visibility:hidden !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-invisible-desktop-only{visibility:hidden !important}}@media screen and (min-width: 1216px){.is-invisible-widescreen{visibility:hidden !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-invisible-widescreen-only{visibility:hidden !important}}@media screen and (min-width: 1408px){.is-invisible-fullhd{visibility:hidden !important}}/*! minireset.css v0.0.6 | MIT License | github.com/jgthms/minireset.css */html,body,p,ol,ul,li,dl,dt,dd,blockquote,figure,fieldset,legend,textarea,pre,iframe,hr,h1,h2,h3,h4,h5,h6{margin:0;padding:0}h1,h2,h3,h4,h5,h6{font-size:100%;font-weight:normal}ul{list-style:none}button,input,select,textarea{margin:0}html{box-sizing:border-box}*,*::before,*::after{box-sizing:inherit}img,video{height:auto;max-width:100%}iframe{border:0}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}td:not([align]),th:not([align]){text-align:inherit}html{background-color:#fff;font-size:16px;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;min-width:300px;overflow-x:auto;overflow-y:scroll;text-rendering:optimizeLegibility;text-size-adjust:100%}article,aside,figure,footer,header,hgroup,section{display:block}body,button,input,optgroup,select,textarea{font-family:"Lato Medium",-apple-system,BlinkMacSystemFont,"Segoe UI","Helvetica Neue","Helvetica","Arial",sans-serif}code,pre{-moz-osx-font-smoothing:auto;-webkit-font-smoothing:auto;font-family:"JuliaMono","SFMono-Regular","Menlo","Consolas","Liberation Mono","DejaVu Sans Mono",monospace}body{color:#222;font-size:1em;font-weight:400;line-height:1.5}a{color:#2e63b8;cursor:pointer;text-decoration:none}a strong{color:currentColor}a:hover{color:#363636}code{background-color:rgba(0,0,0,0.05);color:#000;font-size:.875em;font-weight:normal;padding:.1em}hr{background-color:#f5f5f5;border:none;display:block;height:2px;margin:1.5rem 0}img{height:auto;max-width:100%}input[type="checkbox"],input[type="radio"]{vertical-align:baseline}small{font-size:.875em}span{font-style:inherit;font-weight:inherit}strong{color:#222;font-weight:700}fieldset{border:none}pre{-webkit-overflow-scrolling:touch;background-color:#f5f5f5;color:#222;font-size:.875em;overflow-x:auto;padding:1.25rem 1.5rem;white-space:pre;word-wrap:normal}pre code{background-color:transparent;color:currentColor;font-size:1em;padding:0}table td,table th{vertical-align:top}table td:not([align]),table th:not([align]){text-align:inherit}table th{color:#222}@keyframes spinAround{from{transform:rotate(0deg)}to{transform:rotate(359deg)}}.box{background-color:#fff;border-radius:6px;box-shadow:#bbb;color:#222;display:block;padding:1.25rem}a.box:hover,a.box:focus{box-shadow:0 0.5em 1em -0.125em rgba(10,10,10,0.1),0 0 0 1px #2e63b8}a.box:active{box-shadow:inset 0 1px 2px rgba(10,10,10,0.2),0 0 0 1px #2e63b8}.button{background-color:#fff;border-color:#dbdbdb;border-width:1px;color:#222;cursor:pointer;justify-content:center;padding-bottom:calc(0.5em - 1px);padding-left:1em;padding-right:1em;padding-top:calc(0.5em - 1px);text-align:center;white-space:nowrap}.button strong{color:inherit}.button .icon,.button .icon.is-small,.button #documenter .docs-sidebar form.docs-search>input.icon,#documenter .docs-sidebar .button form.docs-search>input.icon,.button .icon.is-medium,.button .icon.is-large{height:1.5em;width:1.5em}.button .icon:first-child:not(:last-child){margin-left:calc(-0.5em - 1px);margin-right:.25em}.button .icon:last-child:not(:first-child){margin-left:.25em;margin-right:calc(-0.5em - 1px)}.button .icon:first-child:last-child{margin-left:calc(-0.5em - 1px);margin-right:calc(-0.5em - 1px)}.button:hover,.button.is-hovered{border-color:#b5b5b5;color:#363636}.button:focus,.button.is-focused{border-color:#3c5dcd;color:#363636}.button:focus:not(:active),.button.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(46,99,184,0.25)}.button:active,.button.is-active{border-color:#4a4a4a;color:#363636}.button.is-text{background-color:transparent;border-color:transparent;color:#222;text-decoration:underline}.button.is-text:hover,.button.is-text.is-hovered,.button.is-text:focus,.button.is-text.is-focused{background-color:#f5f5f5;color:#222}.button.is-text:active,.button.is-text.is-active{background-color:#e8e8e8;color:#222}.button.is-text[disabled],fieldset[disabled] .button.is-text{background-color:transparent;border-color:transparent;box-shadow:none}.button.is-ghost{background:none;border-color:rgba(0,0,0,0);color:#2e63b8;text-decoration:none}.button.is-ghost:hover,.button.is-ghost.is-hovered{color:#2e63b8;text-decoration:underline}.button.is-white{background-color:#fff;border-color:transparent;color:#0a0a0a}.button.is-white:hover,.button.is-white.is-hovered{background-color:#f9f9f9;border-color:transparent;color:#0a0a0a}.button.is-white:focus,.button.is-white.is-focused{border-color:transparent;color:#0a0a0a}.button.is-white:focus:not(:active),.button.is-white.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(255,255,255,0.25)}.button.is-white:active,.button.is-white.is-active{background-color:#f2f2f2;border-color:transparent;color:#0a0a0a}.button.is-white[disabled],fieldset[disabled] .button.is-white{background-color:#fff;border-color:#fff;box-shadow:none}.button.is-white.is-inverted{background-color:#0a0a0a;color:#fff}.button.is-white.is-inverted:hover,.button.is-white.is-inverted.is-hovered{background-color:#000}.button.is-white.is-inverted[disabled],fieldset[disabled] .button.is-white.is-inverted{background-color:#0a0a0a;border-color:transparent;box-shadow:none;color:#fff}.button.is-white.is-loading::after{border-color:transparent transparent #0a0a0a #0a0a0a !important}.button.is-white.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-white.is-outlined:hover,.button.is-white.is-outlined.is-hovered,.button.is-white.is-outlined:focus,.button.is-white.is-outlined.is-focused{background-color:#fff;border-color:#fff;color:#0a0a0a}.button.is-white.is-outlined.is-loading::after{border-color:transparent transparent #fff #fff !important}.button.is-white.is-outlined.is-loading:hover::after,.button.is-white.is-outlined.is-loading.is-hovered::after,.button.is-white.is-outlined.is-loading:focus::after,.button.is-white.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #0a0a0a #0a0a0a !important}.button.is-white.is-outlined[disabled],fieldset[disabled] .button.is-white.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-white.is-inverted.is-outlined{background-color:transparent;border-color:#0a0a0a;color:#0a0a0a}.button.is-white.is-inverted.is-outlined:hover,.button.is-white.is-inverted.is-outlined.is-hovered,.button.is-white.is-inverted.is-outlined:focus,.button.is-white.is-inverted.is-outlined.is-focused{background-color:#0a0a0a;color:#fff}.button.is-white.is-inverted.is-outlined.is-loading:hover::after,.button.is-white.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-white.is-inverted.is-outlined.is-loading:focus::after,.button.is-white.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}.button.is-white.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-white.is-inverted.is-outlined{background-color:transparent;border-color:#0a0a0a;box-shadow:none;color:#0a0a0a}.button.is-black{background-color:#0a0a0a;border-color:transparent;color:#fff}.button.is-black:hover,.button.is-black.is-hovered{background-color:#040404;border-color:transparent;color:#fff}.button.is-black:focus,.button.is-black.is-focused{border-color:transparent;color:#fff}.button.is-black:focus:not(:active),.button.is-black.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(10,10,10,0.25)}.button.is-black:active,.button.is-black.is-active{background-color:#000;border-color:transparent;color:#fff}.button.is-black[disabled],fieldset[disabled] .button.is-black{background-color:#0a0a0a;border-color:#0a0a0a;box-shadow:none}.button.is-black.is-inverted{background-color:#fff;color:#0a0a0a}.button.is-black.is-inverted:hover,.button.is-black.is-inverted.is-hovered{background-color:#f2f2f2}.button.is-black.is-inverted[disabled],fieldset[disabled] .button.is-black.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#0a0a0a}.button.is-black.is-loading::after{border-color:transparent transparent #fff #fff !important}.button.is-black.is-outlined{background-color:transparent;border-color:#0a0a0a;color:#0a0a0a}.button.is-black.is-outlined:hover,.button.is-black.is-outlined.is-hovered,.button.is-black.is-outlined:focus,.button.is-black.is-outlined.is-focused{background-color:#0a0a0a;border-color:#0a0a0a;color:#fff}.button.is-black.is-outlined.is-loading::after{border-color:transparent transparent #0a0a0a #0a0a0a !important}.button.is-black.is-outlined.is-loading:hover::after,.button.is-black.is-outlined.is-loading.is-hovered::after,.button.is-black.is-outlined.is-loading:focus::after,.button.is-black.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}.button.is-black.is-outlined[disabled],fieldset[disabled] .button.is-black.is-outlined{background-color:transparent;border-color:#0a0a0a;box-shadow:none;color:#0a0a0a}.button.is-black.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-black.is-inverted.is-outlined:hover,.button.is-black.is-inverted.is-outlined.is-hovered,.button.is-black.is-inverted.is-outlined:focus,.button.is-black.is-inverted.is-outlined.is-focused{background-color:#fff;color:#0a0a0a}.button.is-black.is-inverted.is-outlined.is-loading:hover::after,.button.is-black.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-black.is-inverted.is-outlined.is-loading:focus::after,.button.is-black.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #0a0a0a #0a0a0a !important}.button.is-black.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-black.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-light{background-color:#f5f5f5;border-color:transparent;color:rgba(0,0,0,0.7)}.button.is-light:hover,.button.is-light.is-hovered{background-color:#eee;border-color:transparent;color:rgba(0,0,0,0.7)}.button.is-light:focus,.button.is-light.is-focused{border-color:transparent;color:rgba(0,0,0,0.7)}.button.is-light:focus:not(:active),.button.is-light.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(245,245,245,0.25)}.button.is-light:active,.button.is-light.is-active{background-color:#e8e8e8;border-color:transparent;color:rgba(0,0,0,0.7)}.button.is-light[disabled],fieldset[disabled] .button.is-light{background-color:#f5f5f5;border-color:#f5f5f5;box-shadow:none}.button.is-light.is-inverted{background-color:rgba(0,0,0,0.7);color:#f5f5f5}.button.is-light.is-inverted:hover,.button.is-light.is-inverted.is-hovered{background-color:rgba(0,0,0,0.7)}.button.is-light.is-inverted[disabled],fieldset[disabled] .button.is-light.is-inverted{background-color:rgba(0,0,0,0.7);border-color:transparent;box-shadow:none;color:#f5f5f5}.button.is-light.is-loading::after{border-color:transparent transparent rgba(0,0,0,0.7) rgba(0,0,0,0.7) !important}.button.is-light.is-outlined{background-color:transparent;border-color:#f5f5f5;color:#f5f5f5}.button.is-light.is-outlined:hover,.button.is-light.is-outlined.is-hovered,.button.is-light.is-outlined:focus,.button.is-light.is-outlined.is-focused{background-color:#f5f5f5;border-color:#f5f5f5;color:rgba(0,0,0,0.7)}.button.is-light.is-outlined.is-loading::after{border-color:transparent transparent #f5f5f5 #f5f5f5 !important}.button.is-light.is-outlined.is-loading:hover::after,.button.is-light.is-outlined.is-loading.is-hovered::after,.button.is-light.is-outlined.is-loading:focus::after,.button.is-light.is-outlined.is-loading.is-focused::after{border-color:transparent transparent rgba(0,0,0,0.7) rgba(0,0,0,0.7) !important}.button.is-light.is-outlined[disabled],fieldset[disabled] .button.is-light.is-outlined{background-color:transparent;border-color:#f5f5f5;box-shadow:none;color:#f5f5f5}.button.is-light.is-inverted.is-outlined{background-color:transparent;border-color:rgba(0,0,0,0.7);color:rgba(0,0,0,0.7)}.button.is-light.is-inverted.is-outlined:hover,.button.is-light.is-inverted.is-outlined.is-hovered,.button.is-light.is-inverted.is-outlined:focus,.button.is-light.is-inverted.is-outlined.is-focused{background-color:rgba(0,0,0,0.7);color:#f5f5f5}.button.is-light.is-inverted.is-outlined.is-loading:hover::after,.button.is-light.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-light.is-inverted.is-outlined.is-loading:focus::after,.button.is-light.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #f5f5f5 #f5f5f5 !important}.button.is-light.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-light.is-inverted.is-outlined{background-color:transparent;border-color:rgba(0,0,0,0.7);box-shadow:none;color:rgba(0,0,0,0.7)}.button.is-dark,.content kbd.button{background-color:#363636;border-color:transparent;color:#fff}.button.is-dark:hover,.content kbd.button:hover,.button.is-dark.is-hovered,.content kbd.button.is-hovered{background-color:#2f2f2f;border-color:transparent;color:#fff}.button.is-dark:focus,.content kbd.button:focus,.button.is-dark.is-focused,.content kbd.button.is-focused{border-color:transparent;color:#fff}.button.is-dark:focus:not(:active),.content kbd.button:focus:not(:active),.button.is-dark.is-focused:not(:active),.content kbd.button.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(54,54,54,0.25)}.button.is-dark:active,.content kbd.button:active,.button.is-dark.is-active,.content kbd.button.is-active{background-color:#292929;border-color:transparent;color:#fff}.button.is-dark[disabled],.content kbd.button[disabled],fieldset[disabled] .button.is-dark,fieldset[disabled] .content kbd.button,.content fieldset[disabled] kbd.button{background-color:#363636;border-color:#363636;box-shadow:none}.button.is-dark.is-inverted,.content kbd.button.is-inverted{background-color:#fff;color:#363636}.button.is-dark.is-inverted:hover,.content kbd.button.is-inverted:hover,.button.is-dark.is-inverted.is-hovered,.content kbd.button.is-inverted.is-hovered{background-color:#f2f2f2}.button.is-dark.is-inverted[disabled],.content kbd.button.is-inverted[disabled],fieldset[disabled] .button.is-dark.is-inverted,fieldset[disabled] .content kbd.button.is-inverted,.content fieldset[disabled] kbd.button.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#363636}.button.is-dark.is-loading::after,.content kbd.button.is-loading::after{border-color:transparent transparent #fff #fff !important}.button.is-dark.is-outlined,.content kbd.button.is-outlined{background-color:transparent;border-color:#363636;color:#363636}.button.is-dark.is-outlined:hover,.content kbd.button.is-outlined:hover,.button.is-dark.is-outlined.is-hovered,.content kbd.button.is-outlined.is-hovered,.button.is-dark.is-outlined:focus,.content kbd.button.is-outlined:focus,.button.is-dark.is-outlined.is-focused,.content kbd.button.is-outlined.is-focused{background-color:#363636;border-color:#363636;color:#fff}.button.is-dark.is-outlined.is-loading::after,.content kbd.button.is-outlined.is-loading::after{border-color:transparent transparent #363636 #363636 !important}.button.is-dark.is-outlined.is-loading:hover::after,.content kbd.button.is-outlined.is-loading:hover::after,.button.is-dark.is-outlined.is-loading.is-hovered::after,.content kbd.button.is-outlined.is-loading.is-hovered::after,.button.is-dark.is-outlined.is-loading:focus::after,.content kbd.button.is-outlined.is-loading:focus::after,.button.is-dark.is-outlined.is-loading.is-focused::after,.content kbd.button.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}.button.is-dark.is-outlined[disabled],.content kbd.button.is-outlined[disabled],fieldset[disabled] .button.is-dark.is-outlined,fieldset[disabled] .content kbd.button.is-outlined,.content fieldset[disabled] kbd.button.is-outlined{background-color:transparent;border-color:#363636;box-shadow:none;color:#363636}.button.is-dark.is-inverted.is-outlined,.content kbd.button.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-dark.is-inverted.is-outlined:hover,.content kbd.button.is-inverted.is-outlined:hover,.button.is-dark.is-inverted.is-outlined.is-hovered,.content kbd.button.is-inverted.is-outlined.is-hovered,.button.is-dark.is-inverted.is-outlined:focus,.content kbd.button.is-inverted.is-outlined:focus,.button.is-dark.is-inverted.is-outlined.is-focused,.content kbd.button.is-inverted.is-outlined.is-focused{background-color:#fff;color:#363636}.button.is-dark.is-inverted.is-outlined.is-loading:hover::after,.content kbd.button.is-inverted.is-outlined.is-loading:hover::after,.button.is-dark.is-inverted.is-outlined.is-loading.is-hovered::after,.content kbd.button.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-dark.is-inverted.is-outlined.is-loading:focus::after,.content kbd.button.is-inverted.is-outlined.is-loading:focus::after,.button.is-dark.is-inverted.is-outlined.is-loading.is-focused::after,.content kbd.button.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #363636 #363636 !important}.button.is-dark.is-inverted.is-outlined[disabled],.content kbd.button.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-dark.is-inverted.is-outlined,fieldset[disabled] .content kbd.button.is-inverted.is-outlined,.content fieldset[disabled] kbd.button.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-primary,.docstring>section>a.button.docs-sourcelink{background-color:#4eb5de;border-color:transparent;color:#fff}.button.is-primary:hover,.docstring>section>a.button.docs-sourcelink:hover,.button.is-primary.is-hovered,.docstring>section>a.button.is-hovered.docs-sourcelink{background-color:#43b1dc;border-color:transparent;color:#fff}.button.is-primary:focus,.docstring>section>a.button.docs-sourcelink:focus,.button.is-primary.is-focused,.docstring>section>a.button.is-focused.docs-sourcelink{border-color:transparent;color:#fff}.button.is-primary:focus:not(:active),.docstring>section>a.button.docs-sourcelink:focus:not(:active),.button.is-primary.is-focused:not(:active),.docstring>section>a.button.is-focused.docs-sourcelink:not(:active){box-shadow:0 0 0 0.125em rgba(78,181,222,0.25)}.button.is-primary:active,.docstring>section>a.button.docs-sourcelink:active,.button.is-primary.is-active,.docstring>section>a.button.is-active.docs-sourcelink{background-color:#39acda;border-color:transparent;color:#fff}.button.is-primary[disabled],.docstring>section>a.button.docs-sourcelink[disabled],fieldset[disabled] .button.is-primary,fieldset[disabled] .docstring>section>a.button.docs-sourcelink{background-color:#4eb5de;border-color:#4eb5de;box-shadow:none}.button.is-primary.is-inverted,.docstring>section>a.button.is-inverted.docs-sourcelink{background-color:#fff;color:#4eb5de}.button.is-primary.is-inverted:hover,.docstring>section>a.button.is-inverted.docs-sourcelink:hover,.button.is-primary.is-inverted.is-hovered,.docstring>section>a.button.is-inverted.is-hovered.docs-sourcelink{background-color:#f2f2f2}.button.is-primary.is-inverted[disabled],.docstring>section>a.button.is-inverted.docs-sourcelink[disabled],fieldset[disabled] .button.is-primary.is-inverted,fieldset[disabled] .docstring>section>a.button.is-inverted.docs-sourcelink{background-color:#fff;border-color:transparent;box-shadow:none;color:#4eb5de}.button.is-primary.is-loading::after,.docstring>section>a.button.is-loading.docs-sourcelink::after{border-color:transparent transparent #fff #fff !important}.button.is-primary.is-outlined,.docstring>section>a.button.is-outlined.docs-sourcelink{background-color:transparent;border-color:#4eb5de;color:#4eb5de}.button.is-primary.is-outlined:hover,.docstring>section>a.button.is-outlined.docs-sourcelink:hover,.button.is-primary.is-outlined.is-hovered,.docstring>section>a.button.is-outlined.is-hovered.docs-sourcelink,.button.is-primary.is-outlined:focus,.docstring>section>a.button.is-outlined.docs-sourcelink:focus,.button.is-primary.is-outlined.is-focused,.docstring>section>a.button.is-outlined.is-focused.docs-sourcelink{background-color:#4eb5de;border-color:#4eb5de;color:#fff}.button.is-primary.is-outlined.is-loading::after,.docstring>section>a.button.is-outlined.is-loading.docs-sourcelink::after{border-color:transparent transparent #4eb5de #4eb5de !important}.button.is-primary.is-outlined.is-loading:hover::after,.docstring>section>a.button.is-outlined.is-loading.docs-sourcelink:hover::after,.button.is-primary.is-outlined.is-loading.is-hovered::after,.docstring>section>a.button.is-outlined.is-loading.is-hovered.docs-sourcelink::after,.button.is-primary.is-outlined.is-loading:focus::after,.docstring>section>a.button.is-outlined.is-loading.docs-sourcelink:focus::after,.button.is-primary.is-outlined.is-loading.is-focused::after,.docstring>section>a.button.is-outlined.is-loading.is-focused.docs-sourcelink::after{border-color:transparent transparent #fff #fff !important}.button.is-primary.is-outlined[disabled],.docstring>section>a.button.is-outlined.docs-sourcelink[disabled],fieldset[disabled] .button.is-primary.is-outlined,fieldset[disabled] .docstring>section>a.button.is-outlined.docs-sourcelink{background-color:transparent;border-color:#4eb5de;box-shadow:none;color:#4eb5de}.button.is-primary.is-inverted.is-outlined,.docstring>section>a.button.is-inverted.is-outlined.docs-sourcelink{background-color:transparent;border-color:#fff;color:#fff}.button.is-primary.is-inverted.is-outlined:hover,.docstring>section>a.button.is-inverted.is-outlined.docs-sourcelink:hover,.button.is-primary.is-inverted.is-outlined.is-hovered,.docstring>section>a.button.is-inverted.is-outlined.is-hovered.docs-sourcelink,.button.is-primary.is-inverted.is-outlined:focus,.docstring>section>a.button.is-inverted.is-outlined.docs-sourcelink:focus,.button.is-primary.is-inverted.is-outlined.is-focused,.docstring>section>a.button.is-inverted.is-outlined.is-focused.docs-sourcelink{background-color:#fff;color:#4eb5de}.button.is-primary.is-inverted.is-outlined.is-loading:hover::after,.docstring>section>a.button.is-inverted.is-outlined.is-loading.docs-sourcelink:hover::after,.button.is-primary.is-inverted.is-outlined.is-loading.is-hovered::after,.docstring>section>a.button.is-inverted.is-outlined.is-loading.is-hovered.docs-sourcelink::after,.button.is-primary.is-inverted.is-outlined.is-loading:focus::after,.docstring>section>a.button.is-inverted.is-outlined.is-loading.docs-sourcelink:focus::after,.button.is-primary.is-inverted.is-outlined.is-loading.is-focused::after,.docstring>section>a.button.is-inverted.is-outlined.is-loading.is-focused.docs-sourcelink::after{border-color:transparent transparent #4eb5de #4eb5de !important}.button.is-primary.is-inverted.is-outlined[disabled],.docstring>section>a.button.is-inverted.is-outlined.docs-sourcelink[disabled],fieldset[disabled] .button.is-primary.is-inverted.is-outlined,fieldset[disabled] .docstring>section>a.button.is-inverted.is-outlined.docs-sourcelink{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-primary.is-light,.docstring>section>a.button.is-light.docs-sourcelink{background-color:#eef8fc;color:#1a6d8e}.button.is-primary.is-light:hover,.docstring>section>a.button.is-light.docs-sourcelink:hover,.button.is-primary.is-light.is-hovered,.docstring>section>a.button.is-light.is-hovered.docs-sourcelink{background-color:#e3f3fa;border-color:transparent;color:#1a6d8e}.button.is-primary.is-light:active,.docstring>section>a.button.is-light.docs-sourcelink:active,.button.is-primary.is-light.is-active,.docstring>section>a.button.is-light.is-active.docs-sourcelink{background-color:#d8eff8;border-color:transparent;color:#1a6d8e}.button.is-link{background-color:#2e63b8;border-color:transparent;color:#fff}.button.is-link:hover,.button.is-link.is-hovered{background-color:#2b5eae;border-color:transparent;color:#fff}.button.is-link:focus,.button.is-link.is-focused{border-color:transparent;color:#fff}.button.is-link:focus:not(:active),.button.is-link.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(46,99,184,0.25)}.button.is-link:active,.button.is-link.is-active{background-color:#2958a4;border-color:transparent;color:#fff}.button.is-link[disabled],fieldset[disabled] .button.is-link{background-color:#2e63b8;border-color:#2e63b8;box-shadow:none}.button.is-link.is-inverted{background-color:#fff;color:#2e63b8}.button.is-link.is-inverted:hover,.button.is-link.is-inverted.is-hovered{background-color:#f2f2f2}.button.is-link.is-inverted[disabled],fieldset[disabled] .button.is-link.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#2e63b8}.button.is-link.is-loading::after{border-color:transparent transparent #fff #fff !important}.button.is-link.is-outlined{background-color:transparent;border-color:#2e63b8;color:#2e63b8}.button.is-link.is-outlined:hover,.button.is-link.is-outlined.is-hovered,.button.is-link.is-outlined:focus,.button.is-link.is-outlined.is-focused{background-color:#2e63b8;border-color:#2e63b8;color:#fff}.button.is-link.is-outlined.is-loading::after{border-color:transparent transparent #2e63b8 #2e63b8 !important}.button.is-link.is-outlined.is-loading:hover::after,.button.is-link.is-outlined.is-loading.is-hovered::after,.button.is-link.is-outlined.is-loading:focus::after,.button.is-link.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}.button.is-link.is-outlined[disabled],fieldset[disabled] .button.is-link.is-outlined{background-color:transparent;border-color:#2e63b8;box-shadow:none;color:#2e63b8}.button.is-link.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-link.is-inverted.is-outlined:hover,.button.is-link.is-inverted.is-outlined.is-hovered,.button.is-link.is-inverted.is-outlined:focus,.button.is-link.is-inverted.is-outlined.is-focused{background-color:#fff;color:#2e63b8}.button.is-link.is-inverted.is-outlined.is-loading:hover::after,.button.is-link.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-link.is-inverted.is-outlined.is-loading:focus::after,.button.is-link.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #2e63b8 #2e63b8 !important}.button.is-link.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-link.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-link.is-light{background-color:#eff3fb;color:#3169c4}.button.is-link.is-light:hover,.button.is-link.is-light.is-hovered{background-color:#e4ecf8;border-color:transparent;color:#3169c4}.button.is-link.is-light:active,.button.is-link.is-light.is-active{background-color:#dae5f6;border-color:transparent;color:#3169c4}.button.is-info{background-color:#209cee;border-color:transparent;color:#fff}.button.is-info:hover,.button.is-info.is-hovered{background-color:#1497ed;border-color:transparent;color:#fff}.button.is-info:focus,.button.is-info.is-focused{border-color:transparent;color:#fff}.button.is-info:focus:not(:active),.button.is-info.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(32,156,238,0.25)}.button.is-info:active,.button.is-info.is-active{background-color:#1190e3;border-color:transparent;color:#fff}.button.is-info[disabled],fieldset[disabled] .button.is-info{background-color:#209cee;border-color:#209cee;box-shadow:none}.button.is-info.is-inverted{background-color:#fff;color:#209cee}.button.is-info.is-inverted:hover,.button.is-info.is-inverted.is-hovered{background-color:#f2f2f2}.button.is-info.is-inverted[disabled],fieldset[disabled] .button.is-info.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#209cee}.button.is-info.is-loading::after{border-color:transparent transparent #fff #fff !important}.button.is-info.is-outlined{background-color:transparent;border-color:#209cee;color:#209cee}.button.is-info.is-outlined:hover,.button.is-info.is-outlined.is-hovered,.button.is-info.is-outlined:focus,.button.is-info.is-outlined.is-focused{background-color:#209cee;border-color:#209cee;color:#fff}.button.is-info.is-outlined.is-loading::after{border-color:transparent transparent #209cee #209cee !important}.button.is-info.is-outlined.is-loading:hover::after,.button.is-info.is-outlined.is-loading.is-hovered::after,.button.is-info.is-outlined.is-loading:focus::after,.button.is-info.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}.button.is-info.is-outlined[disabled],fieldset[disabled] .button.is-info.is-outlined{background-color:transparent;border-color:#209cee;box-shadow:none;color:#209cee}.button.is-info.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-info.is-inverted.is-outlined:hover,.button.is-info.is-inverted.is-outlined.is-hovered,.button.is-info.is-inverted.is-outlined:focus,.button.is-info.is-inverted.is-outlined.is-focused{background-color:#fff;color:#209cee}.button.is-info.is-inverted.is-outlined.is-loading:hover::after,.button.is-info.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-info.is-inverted.is-outlined.is-loading:focus::after,.button.is-info.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #209cee #209cee !important}.button.is-info.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-info.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-info.is-light{background-color:#ecf7fe;color:#0e72b4}.button.is-info.is-light:hover,.button.is-info.is-light.is-hovered{background-color:#e0f1fd;border-color:transparent;color:#0e72b4}.button.is-info.is-light:active,.button.is-info.is-light.is-active{background-color:#d4ecfc;border-color:transparent;color:#0e72b4}.button.is-success{background-color:#22c35b;border-color:transparent;color:#fff}.button.is-success:hover,.button.is-success.is-hovered{background-color:#20b856;border-color:transparent;color:#fff}.button.is-success:focus,.button.is-success.is-focused{border-color:transparent;color:#fff}.button.is-success:focus:not(:active),.button.is-success.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(34,195,91,0.25)}.button.is-success:active,.button.is-success.is-active{background-color:#1ead51;border-color:transparent;color:#fff}.button.is-success[disabled],fieldset[disabled] .button.is-success{background-color:#22c35b;border-color:#22c35b;box-shadow:none}.button.is-success.is-inverted{background-color:#fff;color:#22c35b}.button.is-success.is-inverted:hover,.button.is-success.is-inverted.is-hovered{background-color:#f2f2f2}.button.is-success.is-inverted[disabled],fieldset[disabled] .button.is-success.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#22c35b}.button.is-success.is-loading::after{border-color:transparent transparent #fff #fff !important}.button.is-success.is-outlined{background-color:transparent;border-color:#22c35b;color:#22c35b}.button.is-success.is-outlined:hover,.button.is-success.is-outlined.is-hovered,.button.is-success.is-outlined:focus,.button.is-success.is-outlined.is-focused{background-color:#22c35b;border-color:#22c35b;color:#fff}.button.is-success.is-outlined.is-loading::after{border-color:transparent transparent #22c35b #22c35b !important}.button.is-success.is-outlined.is-loading:hover::after,.button.is-success.is-outlined.is-loading.is-hovered::after,.button.is-success.is-outlined.is-loading:focus::after,.button.is-success.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}.button.is-success.is-outlined[disabled],fieldset[disabled] .button.is-success.is-outlined{background-color:transparent;border-color:#22c35b;box-shadow:none;color:#22c35b}.button.is-success.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-success.is-inverted.is-outlined:hover,.button.is-success.is-inverted.is-outlined.is-hovered,.button.is-success.is-inverted.is-outlined:focus,.button.is-success.is-inverted.is-outlined.is-focused{background-color:#fff;color:#22c35b}.button.is-success.is-inverted.is-outlined.is-loading:hover::after,.button.is-success.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-success.is-inverted.is-outlined.is-loading:focus::after,.button.is-success.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #22c35b #22c35b !important}.button.is-success.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-success.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-success.is-light{background-color:#eefcf3;color:#198f43}.button.is-success.is-light:hover,.button.is-success.is-light.is-hovered{background-color:#e3faeb;border-color:transparent;color:#198f43}.button.is-success.is-light:active,.button.is-success.is-light.is-active{background-color:#d8f8e3;border-color:transparent;color:#198f43}.button.is-warning{background-color:#ffdd57;border-color:transparent;color:rgba(0,0,0,0.7)}.button.is-warning:hover,.button.is-warning.is-hovered{background-color:#ffda4a;border-color:transparent;color:rgba(0,0,0,0.7)}.button.is-warning:focus,.button.is-warning.is-focused{border-color:transparent;color:rgba(0,0,0,0.7)}.button.is-warning:focus:not(:active),.button.is-warning.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(255,221,87,0.25)}.button.is-warning:active,.button.is-warning.is-active{background-color:#ffd83e;border-color:transparent;color:rgba(0,0,0,0.7)}.button.is-warning[disabled],fieldset[disabled] .button.is-warning{background-color:#ffdd57;border-color:#ffdd57;box-shadow:none}.button.is-warning.is-inverted{background-color:rgba(0,0,0,0.7);color:#ffdd57}.button.is-warning.is-inverted:hover,.button.is-warning.is-inverted.is-hovered{background-color:rgba(0,0,0,0.7)}.button.is-warning.is-inverted[disabled],fieldset[disabled] .button.is-warning.is-inverted{background-color:rgba(0,0,0,0.7);border-color:transparent;box-shadow:none;color:#ffdd57}.button.is-warning.is-loading::after{border-color:transparent transparent rgba(0,0,0,0.7) rgba(0,0,0,0.7) !important}.button.is-warning.is-outlined{background-color:transparent;border-color:#ffdd57;color:#ffdd57}.button.is-warning.is-outlined:hover,.button.is-warning.is-outlined.is-hovered,.button.is-warning.is-outlined:focus,.button.is-warning.is-outlined.is-focused{background-color:#ffdd57;border-color:#ffdd57;color:rgba(0,0,0,0.7)}.button.is-warning.is-outlined.is-loading::after{border-color:transparent transparent #ffdd57 #ffdd57 !important}.button.is-warning.is-outlined.is-loading:hover::after,.button.is-warning.is-outlined.is-loading.is-hovered::after,.button.is-warning.is-outlined.is-loading:focus::after,.button.is-warning.is-outlined.is-loading.is-focused::after{border-color:transparent transparent rgba(0,0,0,0.7) rgba(0,0,0,0.7) !important}.button.is-warning.is-outlined[disabled],fieldset[disabled] .button.is-warning.is-outlined{background-color:transparent;border-color:#ffdd57;box-shadow:none;color:#ffdd57}.button.is-warning.is-inverted.is-outlined{background-color:transparent;border-color:rgba(0,0,0,0.7);color:rgba(0,0,0,0.7)}.button.is-warning.is-inverted.is-outlined:hover,.button.is-warning.is-inverted.is-outlined.is-hovered,.button.is-warning.is-inverted.is-outlined:focus,.button.is-warning.is-inverted.is-outlined.is-focused{background-color:rgba(0,0,0,0.7);color:#ffdd57}.button.is-warning.is-inverted.is-outlined.is-loading:hover::after,.button.is-warning.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-warning.is-inverted.is-outlined.is-loading:focus::after,.button.is-warning.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #ffdd57 #ffdd57 !important}.button.is-warning.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-warning.is-inverted.is-outlined{background-color:transparent;border-color:rgba(0,0,0,0.7);box-shadow:none;color:rgba(0,0,0,0.7)}.button.is-warning.is-light{background-color:#fffbeb;color:#947600}.button.is-warning.is-light:hover,.button.is-warning.is-light.is-hovered{background-color:#fff8de;border-color:transparent;color:#947600}.button.is-warning.is-light:active,.button.is-warning.is-light.is-active{background-color:#fff6d1;border-color:transparent;color:#947600}.button.is-danger{background-color:#da0b00;border-color:transparent;color:#fff}.button.is-danger:hover,.button.is-danger.is-hovered{background-color:#cd0a00;border-color:transparent;color:#fff}.button.is-danger:focus,.button.is-danger.is-focused{border-color:transparent;color:#fff}.button.is-danger:focus:not(:active),.button.is-danger.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(218,11,0,0.25)}.button.is-danger:active,.button.is-danger.is-active{background-color:#c10a00;border-color:transparent;color:#fff}.button.is-danger[disabled],fieldset[disabled] .button.is-danger{background-color:#da0b00;border-color:#da0b00;box-shadow:none}.button.is-danger.is-inverted{background-color:#fff;color:#da0b00}.button.is-danger.is-inverted:hover,.button.is-danger.is-inverted.is-hovered{background-color:#f2f2f2}.button.is-danger.is-inverted[disabled],fieldset[disabled] .button.is-danger.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#da0b00}.button.is-danger.is-loading::after{border-color:transparent transparent #fff #fff !important}.button.is-danger.is-outlined{background-color:transparent;border-color:#da0b00;color:#da0b00}.button.is-danger.is-outlined:hover,.button.is-danger.is-outlined.is-hovered,.button.is-danger.is-outlined:focus,.button.is-danger.is-outlined.is-focused{background-color:#da0b00;border-color:#da0b00;color:#fff}.button.is-danger.is-outlined.is-loading::after{border-color:transparent transparent #da0b00 #da0b00 !important}.button.is-danger.is-outlined.is-loading:hover::after,.button.is-danger.is-outlined.is-loading.is-hovered::after,.button.is-danger.is-outlined.is-loading:focus::after,.button.is-danger.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}.button.is-danger.is-outlined[disabled],fieldset[disabled] .button.is-danger.is-outlined{background-color:transparent;border-color:#da0b00;box-shadow:none;color:#da0b00}.button.is-danger.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-danger.is-inverted.is-outlined:hover,.button.is-danger.is-inverted.is-outlined.is-hovered,.button.is-danger.is-inverted.is-outlined:focus,.button.is-danger.is-inverted.is-outlined.is-focused{background-color:#fff;color:#da0b00}.button.is-danger.is-inverted.is-outlined.is-loading:hover::after,.button.is-danger.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-danger.is-inverted.is-outlined.is-loading:focus::after,.button.is-danger.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #da0b00 #da0b00 !important}.button.is-danger.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-danger.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-danger.is-light{background-color:#ffeceb;color:#f50c00}.button.is-danger.is-light:hover,.button.is-danger.is-light.is-hovered{background-color:#ffe0de;border-color:transparent;color:#f50c00}.button.is-danger.is-light:active,.button.is-danger.is-light.is-active{background-color:#ffd3d1;border-color:transparent;color:#f50c00}.button.is-small,#documenter .docs-sidebar form.docs-search>input.button{font-size:.75rem}.button.is-small:not(.is-rounded),#documenter .docs-sidebar form.docs-search>input.button:not(.is-rounded){border-radius:2px}.button.is-normal{font-size:1rem}.button.is-medium{font-size:1.25rem}.button.is-large{font-size:1.5rem}.button[disabled],fieldset[disabled] .button{background-color:#fff;border-color:#dbdbdb;box-shadow:none;opacity:.5}.button.is-fullwidth{display:flex;width:100%}.button.is-loading{color:transparent !important;pointer-events:none}.button.is-loading::after{position:absolute;left:calc(50% - (1em * 0.5));top:calc(50% - (1em * 0.5));position:absolute !important}.button.is-static{background-color:#f5f5f5;border-color:#dbdbdb;color:#6b6b6b;box-shadow:none;pointer-events:none}.button.is-rounded,#documenter .docs-sidebar form.docs-search>input.button{border-radius:9999px;padding-left:calc(1em + 0.25em);padding-right:calc(1em + 0.25em)}.buttons{align-items:center;display:flex;flex-wrap:wrap;justify-content:flex-start}.buttons .button{margin-bottom:0.5rem}.buttons .button:not(:last-child):not(.is-fullwidth){margin-right:.5rem}.buttons:last-child{margin-bottom:-0.5rem}.buttons:not(:last-child){margin-bottom:1rem}.buttons.are-small .button:not(.is-normal):not(.is-medium):not(.is-large){font-size:.75rem}.buttons.are-small .button:not(.is-normal):not(.is-medium):not(.is-large):not(.is-rounded){border-radius:2px}.buttons.are-medium .button:not(.is-small):not(.is-normal):not(.is-large){font-size:1.25rem}.buttons.are-large .button:not(.is-small):not(.is-normal):not(.is-medium){font-size:1.5rem}.buttons.has-addons .button:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.buttons.has-addons .button:not(:last-child){border-bottom-right-radius:0;border-top-right-radius:0;margin-right:-1px}.buttons.has-addons .button:last-child{margin-right:0}.buttons.has-addons .button:hover,.buttons.has-addons .button.is-hovered{z-index:2}.buttons.has-addons .button:focus,.buttons.has-addons .button.is-focused,.buttons.has-addons .button:active,.buttons.has-addons .button.is-active,.buttons.has-addons .button.is-selected{z-index:3}.buttons.has-addons .button:focus:hover,.buttons.has-addons .button.is-focused:hover,.buttons.has-addons .button:active:hover,.buttons.has-addons .button.is-active:hover,.buttons.has-addons .button.is-selected:hover{z-index:4}.buttons.has-addons .button.is-expanded{flex-grow:1;flex-shrink:1}.buttons.is-centered{justify-content:center}.buttons.is-centered:not(.has-addons) .button:not(.is-fullwidth){margin-left:0.25rem;margin-right:0.25rem}.buttons.is-right{justify-content:flex-end}.buttons.is-right:not(.has-addons) .button:not(.is-fullwidth){margin-left:0.25rem;margin-right:0.25rem}@media screen and (max-width: 768px){.button.is-responsive.is-small,#documenter .docs-sidebar form.docs-search>input.is-responsive{font-size:.5625rem}.button.is-responsive,.button.is-responsive.is-normal{font-size:.65625rem}.button.is-responsive.is-medium{font-size:.75rem}.button.is-responsive.is-large{font-size:1rem}}@media screen and (min-width: 769px) and (max-width: 1055px){.button.is-responsive.is-small,#documenter .docs-sidebar form.docs-search>input.is-responsive{font-size:.65625rem}.button.is-responsive,.button.is-responsive.is-normal{font-size:.75rem}.button.is-responsive.is-medium{font-size:1rem}.button.is-responsive.is-large{font-size:1.25rem}}.container{flex-grow:1;margin:0 auto;position:relative;width:auto}.container.is-fluid{max-width:none !important;padding-left:32px;padding-right:32px;width:100%}@media screen and (min-width: 1056px){.container{max-width:992px}}@media screen and (max-width: 1215px){.container.is-widescreen:not(.is-max-desktop){max-width:1152px}}@media screen and (max-width: 1407px){.container.is-fullhd:not(.is-max-desktop):not(.is-max-widescreen){max-width:1344px}}@media screen and (min-width: 1216px){.container:not(.is-max-desktop){max-width:1152px}}@media screen and (min-width: 1408px){.container:not(.is-max-desktop):not(.is-max-widescreen){max-width:1344px}}.content li+li{margin-top:0.25em}.content p:not(:last-child),.content dl:not(:last-child),.content ol:not(:last-child),.content ul:not(:last-child),.content blockquote:not(:last-child),.content pre:not(:last-child),.content table:not(:last-child){margin-bottom:1em}.content h1,.content h2,.content h3,.content h4,.content h5,.content h6{color:#222;font-weight:600;line-height:1.125}.content h1{font-size:2em;margin-bottom:0.5em}.content h1:not(:first-child){margin-top:1em}.content h2{font-size:1.75em;margin-bottom:0.5714em}.content h2:not(:first-child){margin-top:1.1428em}.content h3{font-size:1.5em;margin-bottom:0.6666em}.content h3:not(:first-child){margin-top:1.3333em}.content h4{font-size:1.25em;margin-bottom:0.8em}.content h5{font-size:1.125em;margin-bottom:0.8888em}.content h6{font-size:1em;margin-bottom:1em}.content blockquote{background-color:#f5f5f5;border-left:5px solid #dbdbdb;padding:1.25em 1.5em}.content ol{list-style-position:outside;margin-left:2em;margin-top:1em}.content ol:not([type]){list-style-type:decimal}.content ol.is-lower-alpha:not([type]){list-style-type:lower-alpha}.content ol.is-lower-roman:not([type]){list-style-type:lower-roman}.content ol.is-upper-alpha:not([type]){list-style-type:upper-alpha}.content ol.is-upper-roman:not([type]){list-style-type:upper-roman}.content ul{list-style:disc outside;margin-left:2em;margin-top:1em}.content ul ul{list-style-type:circle;margin-top:0.5em}.content ul ul ul{list-style-type:square}.content dd{margin-left:2em}.content figure{margin-left:2em;margin-right:2em;text-align:center}.content figure:not(:first-child){margin-top:2em}.content figure:not(:last-child){margin-bottom:2em}.content figure img{display:inline-block}.content figure figcaption{font-style:italic}.content pre{-webkit-overflow-scrolling:touch;overflow-x:auto;padding:0;white-space:pre;word-wrap:normal}.content sup,.content sub{font-size:75%}.content table{width:100%}.content table td,.content table th{border:1px solid #dbdbdb;border-width:0 0 1px;padding:0.5em 0.75em;vertical-align:top}.content table th{color:#222}.content table th:not([align]){text-align:inherit}.content table thead td,.content table thead th{border-width:0 0 2px;color:#222}.content table tfoot td,.content table tfoot th{border-width:2px 0 0;color:#222}.content table tbody tr:last-child td,.content table tbody tr:last-child th{border-bottom-width:0}.content .tabs li+li{margin-top:0}.content.is-small,#documenter .docs-sidebar form.docs-search>input.content{font-size:.75rem}.content.is-normal{font-size:1rem}.content.is-medium{font-size:1.25rem}.content.is-large{font-size:1.5rem}.icon{align-items:center;display:inline-flex;justify-content:center;height:1.5rem;width:1.5rem}.icon.is-small,#documenter .docs-sidebar form.docs-search>input.icon{height:1rem;width:1rem}.icon.is-medium{height:2rem;width:2rem}.icon.is-large{height:3rem;width:3rem}.icon-text{align-items:flex-start;color:inherit;display:inline-flex;flex-wrap:wrap;line-height:1.5rem;vertical-align:top}.icon-text .icon{flex-grow:0;flex-shrink:0}.icon-text .icon:not(:last-child){margin-right:.25em}.icon-text .icon:not(:first-child){margin-left:.25em}div.icon-text{display:flex}.image,#documenter .docs-sidebar .docs-logo>img{display:block;position:relative}.image img,#documenter .docs-sidebar .docs-logo>img img{display:block;height:auto;width:100%}.image img.is-rounded,#documenter .docs-sidebar .docs-logo>img img.is-rounded{border-radius:9999px}.image.is-fullwidth,#documenter .docs-sidebar .docs-logo>img.is-fullwidth{width:100%}.image.is-square img,#documenter .docs-sidebar .docs-logo>img.is-square img,.image.is-square .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-square .has-ratio,.image.is-1by1 img,#documenter .docs-sidebar .docs-logo>img.is-1by1 img,.image.is-1by1 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-1by1 .has-ratio,.image.is-5by4 img,#documenter .docs-sidebar .docs-logo>img.is-5by4 img,.image.is-5by4 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-5by4 .has-ratio,.image.is-4by3 img,#documenter .docs-sidebar .docs-logo>img.is-4by3 img,.image.is-4by3 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-4by3 .has-ratio,.image.is-3by2 img,#documenter .docs-sidebar .docs-logo>img.is-3by2 img,.image.is-3by2 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-3by2 .has-ratio,.image.is-5by3 img,#documenter .docs-sidebar .docs-logo>img.is-5by3 img,.image.is-5by3 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-5by3 .has-ratio,.image.is-16by9 img,#documenter .docs-sidebar .docs-logo>img.is-16by9 img,.image.is-16by9 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-16by9 .has-ratio,.image.is-2by1 img,#documenter .docs-sidebar .docs-logo>img.is-2by1 img,.image.is-2by1 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-2by1 .has-ratio,.image.is-3by1 img,#documenter .docs-sidebar .docs-logo>img.is-3by1 img,.image.is-3by1 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-3by1 .has-ratio,.image.is-4by5 img,#documenter .docs-sidebar .docs-logo>img.is-4by5 img,.image.is-4by5 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-4by5 .has-ratio,.image.is-3by4 img,#documenter .docs-sidebar .docs-logo>img.is-3by4 img,.image.is-3by4 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-3by4 .has-ratio,.image.is-2by3 img,#documenter .docs-sidebar .docs-logo>img.is-2by3 img,.image.is-2by3 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-2by3 .has-ratio,.image.is-3by5 img,#documenter .docs-sidebar .docs-logo>img.is-3by5 img,.image.is-3by5 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-3by5 .has-ratio,.image.is-9by16 img,#documenter .docs-sidebar .docs-logo>img.is-9by16 img,.image.is-9by16 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-9by16 .has-ratio,.image.is-1by2 img,#documenter .docs-sidebar .docs-logo>img.is-1by2 img,.image.is-1by2 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-1by2 .has-ratio,.image.is-1by3 img,#documenter .docs-sidebar .docs-logo>img.is-1by3 img,.image.is-1by3 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-1by3 .has-ratio{height:100%;width:100%}.image.is-square,#documenter .docs-sidebar .docs-logo>img.is-square,.image.is-1by1,#documenter .docs-sidebar .docs-logo>img.is-1by1{padding-top:100%}.image.is-5by4,#documenter .docs-sidebar .docs-logo>img.is-5by4{padding-top:80%}.image.is-4by3,#documenter .docs-sidebar .docs-logo>img.is-4by3{padding-top:75%}.image.is-3by2,#documenter .docs-sidebar .docs-logo>img.is-3by2{padding-top:66.6666%}.image.is-5by3,#documenter .docs-sidebar .docs-logo>img.is-5by3{padding-top:60%}.image.is-16by9,#documenter .docs-sidebar .docs-logo>img.is-16by9{padding-top:56.25%}.image.is-2by1,#documenter .docs-sidebar .docs-logo>img.is-2by1{padding-top:50%}.image.is-3by1,#documenter .docs-sidebar .docs-logo>img.is-3by1{padding-top:33.3333%}.image.is-4by5,#documenter .docs-sidebar .docs-logo>img.is-4by5{padding-top:125%}.image.is-3by4,#documenter .docs-sidebar .docs-logo>img.is-3by4{padding-top:133.3333%}.image.is-2by3,#documenter .docs-sidebar .docs-logo>img.is-2by3{padding-top:150%}.image.is-3by5,#documenter .docs-sidebar .docs-logo>img.is-3by5{padding-top:166.6666%}.image.is-9by16,#documenter .docs-sidebar .docs-logo>img.is-9by16{padding-top:177.7777%}.image.is-1by2,#documenter .docs-sidebar .docs-logo>img.is-1by2{padding-top:200%}.image.is-1by3,#documenter .docs-sidebar .docs-logo>img.is-1by3{padding-top:300%}.image.is-16x16,#documenter .docs-sidebar .docs-logo>img.is-16x16{height:16px;width:16px}.image.is-24x24,#documenter .docs-sidebar .docs-logo>img.is-24x24{height:24px;width:24px}.image.is-32x32,#documenter .docs-sidebar .docs-logo>img.is-32x32{height:32px;width:32px}.image.is-48x48,#documenter .docs-sidebar .docs-logo>img.is-48x48{height:48px;width:48px}.image.is-64x64,#documenter .docs-sidebar .docs-logo>img.is-64x64{height:64px;width:64px}.image.is-96x96,#documenter .docs-sidebar .docs-logo>img.is-96x96{height:96px;width:96px}.image.is-128x128,#documenter .docs-sidebar .docs-logo>img.is-128x128{height:128px;width:128px}.notification{background-color:#f5f5f5;border-radius:4px;position:relative;padding:1.25rem 2.5rem 1.25rem 1.5rem}.notification a:not(.button):not(.dropdown-item){color:currentColor;text-decoration:underline}.notification strong{color:currentColor}.notification code,.notification pre{background:#fff}.notification pre code{background:transparent}.notification>.delete{right:.5rem;position:absolute;top:0.5rem}.notification .title,.notification .subtitle,.notification .content{color:currentColor}.notification.is-white{background-color:#fff;color:#0a0a0a}.notification.is-black{background-color:#0a0a0a;color:#fff}.notification.is-light{background-color:#f5f5f5;color:rgba(0,0,0,0.7)}.notification.is-dark,.content kbd.notification{background-color:#363636;color:#fff}.notification.is-primary,.docstring>section>a.notification.docs-sourcelink{background-color:#4eb5de;color:#fff}.notification.is-primary.is-light,.docstring>section>a.notification.is-light.docs-sourcelink{background-color:#eef8fc;color:#1a6d8e}.notification.is-link{background-color:#2e63b8;color:#fff}.notification.is-link.is-light{background-color:#eff3fb;color:#3169c4}.notification.is-info{background-color:#209cee;color:#fff}.notification.is-info.is-light{background-color:#ecf7fe;color:#0e72b4}.notification.is-success{background-color:#22c35b;color:#fff}.notification.is-success.is-light{background-color:#eefcf3;color:#198f43}.notification.is-warning{background-color:#ffdd57;color:rgba(0,0,0,0.7)}.notification.is-warning.is-light{background-color:#fffbeb;color:#947600}.notification.is-danger{background-color:#da0b00;color:#fff}.notification.is-danger.is-light{background-color:#ffeceb;color:#f50c00}.progress{-moz-appearance:none;-webkit-appearance:none;border:none;border-radius:9999px;display:block;height:1rem;overflow:hidden;padding:0;width:100%}.progress::-webkit-progress-bar{background-color:#ededed}.progress::-webkit-progress-value{background-color:#222}.progress::-moz-progress-bar{background-color:#222}.progress::-ms-fill{background-color:#222;border:none}.progress.is-white::-webkit-progress-value{background-color:#fff}.progress.is-white::-moz-progress-bar{background-color:#fff}.progress.is-white::-ms-fill{background-color:#fff}.progress.is-white:indeterminate{background-image:linear-gradient(to right, #fff 30%, #ededed 30%)}.progress.is-black::-webkit-progress-value{background-color:#0a0a0a}.progress.is-black::-moz-progress-bar{background-color:#0a0a0a}.progress.is-black::-ms-fill{background-color:#0a0a0a}.progress.is-black:indeterminate{background-image:linear-gradient(to right, #0a0a0a 30%, #ededed 30%)}.progress.is-light::-webkit-progress-value{background-color:#f5f5f5}.progress.is-light::-moz-progress-bar{background-color:#f5f5f5}.progress.is-light::-ms-fill{background-color:#f5f5f5}.progress.is-light:indeterminate{background-image:linear-gradient(to right, #f5f5f5 30%, #ededed 30%)}.progress.is-dark::-webkit-progress-value,.content kbd.progress::-webkit-progress-value{background-color:#363636}.progress.is-dark::-moz-progress-bar,.content kbd.progress::-moz-progress-bar{background-color:#363636}.progress.is-dark::-ms-fill,.content kbd.progress::-ms-fill{background-color:#363636}.progress.is-dark:indeterminate,.content kbd.progress:indeterminate{background-image:linear-gradient(to right, #363636 30%, #ededed 30%)}.progress.is-primary::-webkit-progress-value,.docstring>section>a.progress.docs-sourcelink::-webkit-progress-value{background-color:#4eb5de}.progress.is-primary::-moz-progress-bar,.docstring>section>a.progress.docs-sourcelink::-moz-progress-bar{background-color:#4eb5de}.progress.is-primary::-ms-fill,.docstring>section>a.progress.docs-sourcelink::-ms-fill{background-color:#4eb5de}.progress.is-primary:indeterminate,.docstring>section>a.progress.docs-sourcelink:indeterminate{background-image:linear-gradient(to right, #4eb5de 30%, #ededed 30%)}.progress.is-link::-webkit-progress-value{background-color:#2e63b8}.progress.is-link::-moz-progress-bar{background-color:#2e63b8}.progress.is-link::-ms-fill{background-color:#2e63b8}.progress.is-link:indeterminate{background-image:linear-gradient(to right, #2e63b8 30%, #ededed 30%)}.progress.is-info::-webkit-progress-value{background-color:#209cee}.progress.is-info::-moz-progress-bar{background-color:#209cee}.progress.is-info::-ms-fill{background-color:#209cee}.progress.is-info:indeterminate{background-image:linear-gradient(to right, #209cee 30%, #ededed 30%)}.progress.is-success::-webkit-progress-value{background-color:#22c35b}.progress.is-success::-moz-progress-bar{background-color:#22c35b}.progress.is-success::-ms-fill{background-color:#22c35b}.progress.is-success:indeterminate{background-image:linear-gradient(to right, #22c35b 30%, #ededed 30%)}.progress.is-warning::-webkit-progress-value{background-color:#ffdd57}.progress.is-warning::-moz-progress-bar{background-color:#ffdd57}.progress.is-warning::-ms-fill{background-color:#ffdd57}.progress.is-warning:indeterminate{background-image:linear-gradient(to right, #ffdd57 30%, #ededed 30%)}.progress.is-danger::-webkit-progress-value{background-color:#da0b00}.progress.is-danger::-moz-progress-bar{background-color:#da0b00}.progress.is-danger::-ms-fill{background-color:#da0b00}.progress.is-danger:indeterminate{background-image:linear-gradient(to right, #da0b00 30%, #ededed 30%)}.progress:indeterminate{animation-duration:1.5s;animation-iteration-count:infinite;animation-name:moveIndeterminate;animation-timing-function:linear;background-color:#ededed;background-image:linear-gradient(to right, #222 30%, #ededed 30%);background-position:top left;background-repeat:no-repeat;background-size:150% 150%}.progress:indeterminate::-webkit-progress-bar{background-color:transparent}.progress:indeterminate::-moz-progress-bar{background-color:transparent}.progress:indeterminate::-ms-fill{animation-name:none}.progress.is-small,#documenter .docs-sidebar form.docs-search>input.progress{height:.75rem}.progress.is-medium{height:1.25rem}.progress.is-large{height:1.5rem}@keyframes moveIndeterminate{from{background-position:200% 0}to{background-position:-200% 0}}.table{background-color:#fff;color:#222}.table td,.table th{border:1px solid #dbdbdb;border-width:0 0 1px;padding:0.5em 0.75em;vertical-align:top}.table td.is-white,.table th.is-white{background-color:#fff;border-color:#fff;color:#0a0a0a}.table td.is-black,.table th.is-black{background-color:#0a0a0a;border-color:#0a0a0a;color:#fff}.table td.is-light,.table th.is-light{background-color:#f5f5f5;border-color:#f5f5f5;color:rgba(0,0,0,0.7)}.table td.is-dark,.table th.is-dark{background-color:#363636;border-color:#363636;color:#fff}.table td.is-primary,.table th.is-primary{background-color:#4eb5de;border-color:#4eb5de;color:#fff}.table td.is-link,.table th.is-link{background-color:#2e63b8;border-color:#2e63b8;color:#fff}.table td.is-info,.table th.is-info{background-color:#209cee;border-color:#209cee;color:#fff}.table td.is-success,.table th.is-success{background-color:#22c35b;border-color:#22c35b;color:#fff}.table td.is-warning,.table th.is-warning{background-color:#ffdd57;border-color:#ffdd57;color:rgba(0,0,0,0.7)}.table td.is-danger,.table th.is-danger{background-color:#da0b00;border-color:#da0b00;color:#fff}.table td.is-narrow,.table th.is-narrow{white-space:nowrap;width:1%}.table td.is-selected,.table th.is-selected{background-color:#4eb5de;color:#fff}.table td.is-selected a,.table td.is-selected strong,.table th.is-selected a,.table th.is-selected strong{color:currentColor}.table td.is-vcentered,.table th.is-vcentered{vertical-align:middle}.table th{color:#222}.table th:not([align]){text-align:left}.table tr.is-selected{background-color:#4eb5de;color:#fff}.table tr.is-selected a,.table tr.is-selected strong{color:currentColor}.table tr.is-selected td,.table tr.is-selected th{border-color:#fff;color:currentColor}.table thead{background-color:rgba(0,0,0,0)}.table thead td,.table thead th{border-width:0 0 2px;color:#222}.table tfoot{background-color:rgba(0,0,0,0)}.table tfoot td,.table tfoot th{border-width:2px 0 0;color:#222}.table tbody{background-color:rgba(0,0,0,0)}.table tbody tr:last-child td,.table tbody tr:last-child th{border-bottom-width:0}.table.is-bordered td,.table.is-bordered th{border-width:1px}.table.is-bordered tr:last-child td,.table.is-bordered tr:last-child th{border-bottom-width:1px}.table.is-fullwidth{width:100%}.table.is-hoverable tbody tr:not(.is-selected):hover{background-color:#fafafa}.table.is-hoverable.is-striped tbody tr:not(.is-selected):hover{background-color:#fafafa}.table.is-hoverable.is-striped tbody tr:not(.is-selected):hover:nth-child(even){background-color:#f5f5f5}.table.is-narrow td,.table.is-narrow th{padding:0.25em 0.5em}.table.is-striped tbody tr:not(.is-selected):nth-child(even){background-color:#fafafa}.table-container{-webkit-overflow-scrolling:touch;overflow:auto;overflow-y:hidden;max-width:100%}.tags{align-items:center;display:flex;flex-wrap:wrap;justify-content:flex-start}.tags .tag,.tags .content kbd,.content .tags kbd,.tags .docstring>section>a.docs-sourcelink{margin-bottom:0.5rem}.tags .tag:not(:last-child),.tags .content kbd:not(:last-child),.content .tags kbd:not(:last-child),.tags .docstring>section>a.docs-sourcelink:not(:last-child){margin-right:.5rem}.tags:last-child{margin-bottom:-0.5rem}.tags:not(:last-child){margin-bottom:1rem}.tags.are-medium .tag:not(.is-normal):not(.is-large),.tags.are-medium .content kbd:not(.is-normal):not(.is-large),.content .tags.are-medium kbd:not(.is-normal):not(.is-large),.tags.are-medium .docstring>section>a.docs-sourcelink:not(.is-normal):not(.is-large){font-size:1rem}.tags.are-large .tag:not(.is-normal):not(.is-medium),.tags.are-large .content kbd:not(.is-normal):not(.is-medium),.content .tags.are-large kbd:not(.is-normal):not(.is-medium),.tags.are-large .docstring>section>a.docs-sourcelink:not(.is-normal):not(.is-medium){font-size:1.25rem}.tags.is-centered{justify-content:center}.tags.is-centered .tag,.tags.is-centered .content kbd,.content .tags.is-centered kbd,.tags.is-centered .docstring>section>a.docs-sourcelink{margin-right:0.25rem;margin-left:0.25rem}.tags.is-right{justify-content:flex-end}.tags.is-right .tag:not(:first-child),.tags.is-right .content kbd:not(:first-child),.content .tags.is-right kbd:not(:first-child),.tags.is-right .docstring>section>a.docs-sourcelink:not(:first-child){margin-left:0.5rem}.tags.is-right .tag:not(:last-child),.tags.is-right .content kbd:not(:last-child),.content .tags.is-right kbd:not(:last-child),.tags.is-right .docstring>section>a.docs-sourcelink:not(:last-child){margin-right:0}.tags.has-addons .tag,.tags.has-addons .content kbd,.content .tags.has-addons kbd,.tags.has-addons .docstring>section>a.docs-sourcelink{margin-right:0}.tags.has-addons .tag:not(:first-child),.tags.has-addons .content kbd:not(:first-child),.content .tags.has-addons kbd:not(:first-child),.tags.has-addons .docstring>section>a.docs-sourcelink:not(:first-child){margin-left:0;border-top-left-radius:0;border-bottom-left-radius:0}.tags.has-addons .tag:not(:last-child),.tags.has-addons .content kbd:not(:last-child),.content .tags.has-addons kbd:not(:last-child),.tags.has-addons .docstring>section>a.docs-sourcelink:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.tag:not(body),.content kbd:not(body),.docstring>section>a.docs-sourcelink:not(body){align-items:center;background-color:#f5f5f5;border-radius:4px;color:#222;display:inline-flex;font-size:.75rem;height:2em;justify-content:center;line-height:1.5;padding-left:0.75em;padding-right:0.75em;white-space:nowrap}.tag:not(body) .delete,.content kbd:not(body) .delete,.docstring>section>a.docs-sourcelink:not(body) .delete{margin-left:.25rem;margin-right:-.375rem}.tag.is-white:not(body),.content kbd.is-white:not(body),.docstring>section>a.docs-sourcelink.is-white:not(body){background-color:#fff;color:#0a0a0a}.tag.is-black:not(body),.content kbd.is-black:not(body),.docstring>section>a.docs-sourcelink.is-black:not(body){background-color:#0a0a0a;color:#fff}.tag.is-light:not(body),.content kbd.is-light:not(body),.docstring>section>a.docs-sourcelink.is-light:not(body){background-color:#f5f5f5;color:rgba(0,0,0,0.7)}.tag.is-dark:not(body),.content kbd:not(body),.docstring>section>a.docs-sourcelink.is-dark:not(body),.content .docstring>section>kbd:not(body){background-color:#363636;color:#fff}.tag.is-primary:not(body),.content kbd.is-primary:not(body),.docstring>section>a.docs-sourcelink:not(body){background-color:#4eb5de;color:#fff}.tag.is-primary.is-light:not(body),.content kbd.is-primary.is-light:not(body),.docstring>section>a.docs-sourcelink.is-light:not(body){background-color:#eef8fc;color:#1a6d8e}.tag.is-link:not(body),.content kbd.is-link:not(body),.docstring>section>a.docs-sourcelink.is-link:not(body){background-color:#2e63b8;color:#fff}.tag.is-link.is-light:not(body),.content kbd.is-link.is-light:not(body),.docstring>section>a.docs-sourcelink.is-link.is-light:not(body){background-color:#eff3fb;color:#3169c4}.tag.is-info:not(body),.content kbd.is-info:not(body),.docstring>section>a.docs-sourcelink.is-info:not(body){background-color:#209cee;color:#fff}.tag.is-info.is-light:not(body),.content kbd.is-info.is-light:not(body),.docstring>section>a.docs-sourcelink.is-info.is-light:not(body){background-color:#ecf7fe;color:#0e72b4}.tag.is-success:not(body),.content kbd.is-success:not(body),.docstring>section>a.docs-sourcelink.is-success:not(body){background-color:#22c35b;color:#fff}.tag.is-success.is-light:not(body),.content kbd.is-success.is-light:not(body),.docstring>section>a.docs-sourcelink.is-success.is-light:not(body){background-color:#eefcf3;color:#198f43}.tag.is-warning:not(body),.content kbd.is-warning:not(body),.docstring>section>a.docs-sourcelink.is-warning:not(body){background-color:#ffdd57;color:rgba(0,0,0,0.7)}.tag.is-warning.is-light:not(body),.content kbd.is-warning.is-light:not(body),.docstring>section>a.docs-sourcelink.is-warning.is-light:not(body){background-color:#fffbeb;color:#947600}.tag.is-danger:not(body),.content kbd.is-danger:not(body),.docstring>section>a.docs-sourcelink.is-danger:not(body){background-color:#da0b00;color:#fff}.tag.is-danger.is-light:not(body),.content kbd.is-danger.is-light:not(body),.docstring>section>a.docs-sourcelink.is-danger.is-light:not(body){background-color:#ffeceb;color:#f50c00}.tag.is-normal:not(body),.content kbd.is-normal:not(body),.docstring>section>a.docs-sourcelink.is-normal:not(body){font-size:.75rem}.tag.is-medium:not(body),.content kbd.is-medium:not(body),.docstring>section>a.docs-sourcelink.is-medium:not(body){font-size:1rem}.tag.is-large:not(body),.content kbd.is-large:not(body),.docstring>section>a.docs-sourcelink.is-large:not(body){font-size:1.25rem}.tag:not(body) .icon:first-child:not(:last-child),.content kbd:not(body) .icon:first-child:not(:last-child),.docstring>section>a.docs-sourcelink:not(body) .icon:first-child:not(:last-child){margin-left:-.375em;margin-right:.1875em}.tag:not(body) .icon:last-child:not(:first-child),.content kbd:not(body) .icon:last-child:not(:first-child),.docstring>section>a.docs-sourcelink:not(body) .icon:last-child:not(:first-child){margin-left:.1875em;margin-right:-.375em}.tag:not(body) .icon:first-child:last-child,.content kbd:not(body) .icon:first-child:last-child,.docstring>section>a.docs-sourcelink:not(body) .icon:first-child:last-child{margin-left:-.375em;margin-right:-.375em}.tag.is-delete:not(body),.content kbd.is-delete:not(body),.docstring>section>a.docs-sourcelink.is-delete:not(body){margin-left:1px;padding:0;position:relative;width:2em}.tag.is-delete:not(body)::before,.content kbd.is-delete:not(body)::before,.docstring>section>a.docs-sourcelink.is-delete:not(body)::before,.tag.is-delete:not(body)::after,.content kbd.is-delete:not(body)::after,.docstring>section>a.docs-sourcelink.is-delete:not(body)::after{background-color:currentColor;content:"";display:block;left:50%;position:absolute;top:50%;transform:translateX(-50%) translateY(-50%) rotate(45deg);transform-origin:center center}.tag.is-delete:not(body)::before,.content kbd.is-delete:not(body)::before,.docstring>section>a.docs-sourcelink.is-delete:not(body)::before{height:1px;width:50%}.tag.is-delete:not(body)::after,.content kbd.is-delete:not(body)::after,.docstring>section>a.docs-sourcelink.is-delete:not(body)::after{height:50%;width:1px}.tag.is-delete:not(body):hover,.content kbd.is-delete:not(body):hover,.docstring>section>a.docs-sourcelink.is-delete:not(body):hover,.tag.is-delete:not(body):focus,.content kbd.is-delete:not(body):focus,.docstring>section>a.docs-sourcelink.is-delete:not(body):focus{background-color:#e8e8e8}.tag.is-delete:not(body):active,.content kbd.is-delete:not(body):active,.docstring>section>a.docs-sourcelink.is-delete:not(body):active{background-color:#dbdbdb}.tag.is-rounded:not(body),#documenter .docs-sidebar form.docs-search>input:not(body),.content kbd.is-rounded:not(body),#documenter .docs-sidebar .content form.docs-search>input:not(body),.docstring>section>a.docs-sourcelink.is-rounded:not(body){border-radius:9999px}a.tag:hover,.docstring>section>a.docs-sourcelink:hover{text-decoration:underline}.title,.subtitle{word-break:break-word}.title em,.title span,.subtitle em,.subtitle span{font-weight:inherit}.title sub,.subtitle sub{font-size:.75em}.title sup,.subtitle sup{font-size:.75em}.title .tag,.title .content kbd,.content .title kbd,.title .docstring>section>a.docs-sourcelink,.subtitle .tag,.subtitle .content kbd,.content .subtitle kbd,.subtitle .docstring>section>a.docs-sourcelink{vertical-align:middle}.title{color:#222;font-size:2rem;font-weight:600;line-height:1.125}.title strong{color:inherit;font-weight:inherit}.title:not(.is-spaced)+.subtitle{margin-top:-1.25rem}.title.is-1{font-size:3rem}.title.is-2{font-size:2.5rem}.title.is-3{font-size:2rem}.title.is-4{font-size:1.5rem}.title.is-5{font-size:1.25rem}.title.is-6{font-size:1rem}.title.is-7{font-size:.75rem}.subtitle{color:#222;font-size:1.25rem;font-weight:400;line-height:1.25}.subtitle strong{color:#222;font-weight:600}.subtitle:not(.is-spaced)+.title{margin-top:-1.25rem}.subtitle.is-1{font-size:3rem}.subtitle.is-2{font-size:2.5rem}.subtitle.is-3{font-size:2rem}.subtitle.is-4{font-size:1.5rem}.subtitle.is-5{font-size:1.25rem}.subtitle.is-6{font-size:1rem}.subtitle.is-7{font-size:.75rem}.heading{display:block;font-size:11px;letter-spacing:1px;margin-bottom:5px;text-transform:uppercase}.number{align-items:center;background-color:#f5f5f5;border-radius:9999px;display:inline-flex;font-size:1.25rem;height:2em;justify-content:center;margin-right:1.5rem;min-width:2.5em;padding:0.25rem 0.5rem;text-align:center;vertical-align:top}.select select,.textarea,.input,#documenter .docs-sidebar form.docs-search>input{background-color:#fff;border-color:#dbdbdb;border-radius:4px;color:#222}.select select::-moz-placeholder,.textarea::-moz-placeholder,.input::-moz-placeholder,#documenter .docs-sidebar form.docs-search>input::-moz-placeholder{color:#707070}.select select::-webkit-input-placeholder,.textarea::-webkit-input-placeholder,.input::-webkit-input-placeholder,#documenter .docs-sidebar form.docs-search>input::-webkit-input-placeholder{color:#707070}.select select:-moz-placeholder,.textarea:-moz-placeholder,.input:-moz-placeholder,#documenter .docs-sidebar form.docs-search>input:-moz-placeholder{color:#707070}.select select:-ms-input-placeholder,.textarea:-ms-input-placeholder,.input:-ms-input-placeholder,#documenter .docs-sidebar form.docs-search>input:-ms-input-placeholder{color:#707070}.select select:hover,.textarea:hover,.input:hover,#documenter .docs-sidebar form.docs-search>input:hover,.select select.is-hovered,.is-hovered.textarea,.is-hovered.input,#documenter .docs-sidebar form.docs-search>input.is-hovered{border-color:#b5b5b5}.select select:focus,.textarea:focus,.input:focus,#documenter .docs-sidebar form.docs-search>input:focus,.select select.is-focused,.is-focused.textarea,.is-focused.input,#documenter .docs-sidebar form.docs-search>input.is-focused,.select select:active,.textarea:active,.input:active,#documenter .docs-sidebar form.docs-search>input:active,.select select.is-active,.is-active.textarea,.is-active.input,#documenter .docs-sidebar form.docs-search>input.is-active{border-color:#2e63b8;box-shadow:0 0 0 0.125em rgba(46,99,184,0.25)}.select select[disabled],.textarea[disabled],.input[disabled],#documenter .docs-sidebar form.docs-search>input[disabled],fieldset[disabled] .select select,.select fieldset[disabled] select,fieldset[disabled] .textarea,fieldset[disabled] .input,fieldset[disabled] #documenter .docs-sidebar form.docs-search>input,#documenter .docs-sidebar fieldset[disabled] form.docs-search>input{background-color:#f5f5f5;border-color:#f5f5f5;box-shadow:none;color:#6b6b6b}.select select[disabled]::-moz-placeholder,.textarea[disabled]::-moz-placeholder,.input[disabled]::-moz-placeholder,#documenter .docs-sidebar form.docs-search>input[disabled]::-moz-placeholder,fieldset[disabled] .select select::-moz-placeholder,.select fieldset[disabled] select::-moz-placeholder,fieldset[disabled] .textarea::-moz-placeholder,fieldset[disabled] .input::-moz-placeholder,fieldset[disabled] #documenter .docs-sidebar form.docs-search>input::-moz-placeholder,#documenter .docs-sidebar fieldset[disabled] form.docs-search>input::-moz-placeholder{color:rgba(107,107,107,0.3)}.select select[disabled]::-webkit-input-placeholder,.textarea[disabled]::-webkit-input-placeholder,.input[disabled]::-webkit-input-placeholder,#documenter .docs-sidebar form.docs-search>input[disabled]::-webkit-input-placeholder,fieldset[disabled] .select select::-webkit-input-placeholder,.select fieldset[disabled] select::-webkit-input-placeholder,fieldset[disabled] .textarea::-webkit-input-placeholder,fieldset[disabled] .input::-webkit-input-placeholder,fieldset[disabled] #documenter .docs-sidebar form.docs-search>input::-webkit-input-placeholder,#documenter .docs-sidebar fieldset[disabled] form.docs-search>input::-webkit-input-placeholder{color:rgba(107,107,107,0.3)}.select select[disabled]:-moz-placeholder,.textarea[disabled]:-moz-placeholder,.input[disabled]:-moz-placeholder,#documenter .docs-sidebar form.docs-search>input[disabled]:-moz-placeholder,fieldset[disabled] .select select:-moz-placeholder,.select fieldset[disabled] select:-moz-placeholder,fieldset[disabled] .textarea:-moz-placeholder,fieldset[disabled] .input:-moz-placeholder,fieldset[disabled] #documenter .docs-sidebar form.docs-search>input:-moz-placeholder,#documenter .docs-sidebar fieldset[disabled] form.docs-search>input:-moz-placeholder{color:rgba(107,107,107,0.3)}.select select[disabled]:-ms-input-placeholder,.textarea[disabled]:-ms-input-placeholder,.input[disabled]:-ms-input-placeholder,#documenter .docs-sidebar form.docs-search>input[disabled]:-ms-input-placeholder,fieldset[disabled] .select select:-ms-input-placeholder,.select fieldset[disabled] select:-ms-input-placeholder,fieldset[disabled] .textarea:-ms-input-placeholder,fieldset[disabled] .input:-ms-input-placeholder,fieldset[disabled] #documenter .docs-sidebar form.docs-search>input:-ms-input-placeholder,#documenter .docs-sidebar fieldset[disabled] form.docs-search>input:-ms-input-placeholder{color:rgba(107,107,107,0.3)}.textarea,.input,#documenter .docs-sidebar form.docs-search>input{box-shadow:inset 0 0.0625em 0.125em rgba(10,10,10,0.05);max-width:100%;width:100%}.textarea[readonly],.input[readonly],#documenter .docs-sidebar form.docs-search>input[readonly]{box-shadow:none}.is-white.textarea,.is-white.input,#documenter .docs-sidebar form.docs-search>input.is-white{border-color:#fff}.is-white.textarea:focus,.is-white.input:focus,#documenter .docs-sidebar form.docs-search>input.is-white:focus,.is-white.is-focused.textarea,.is-white.is-focused.input,#documenter .docs-sidebar form.docs-search>input.is-focused,.is-white.textarea:active,.is-white.input:active,#documenter .docs-sidebar form.docs-search>input.is-white:active,.is-white.is-active.textarea,.is-white.is-active.input,#documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(255,255,255,0.25)}.is-black.textarea,.is-black.input,#documenter .docs-sidebar form.docs-search>input.is-black{border-color:#0a0a0a}.is-black.textarea:focus,.is-black.input:focus,#documenter .docs-sidebar form.docs-search>input.is-black:focus,.is-black.is-focused.textarea,.is-black.is-focused.input,#documenter .docs-sidebar form.docs-search>input.is-focused,.is-black.textarea:active,.is-black.input:active,#documenter .docs-sidebar form.docs-search>input.is-black:active,.is-black.is-active.textarea,.is-black.is-active.input,#documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(10,10,10,0.25)}.is-light.textarea,.is-light.input,#documenter .docs-sidebar form.docs-search>input.is-light{border-color:#f5f5f5}.is-light.textarea:focus,.is-light.input:focus,#documenter .docs-sidebar form.docs-search>input.is-light:focus,.is-light.is-focused.textarea,.is-light.is-focused.input,#documenter .docs-sidebar form.docs-search>input.is-focused,.is-light.textarea:active,.is-light.input:active,#documenter .docs-sidebar form.docs-search>input.is-light:active,.is-light.is-active.textarea,.is-light.is-active.input,#documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(245,245,245,0.25)}.is-dark.textarea,.content kbd.textarea,.is-dark.input,#documenter .docs-sidebar form.docs-search>input.is-dark,.content kbd.input{border-color:#363636}.is-dark.textarea:focus,.content kbd.textarea:focus,.is-dark.input:focus,#documenter .docs-sidebar form.docs-search>input.is-dark:focus,.content kbd.input:focus,.is-dark.is-focused.textarea,.content kbd.is-focused.textarea,.is-dark.is-focused.input,#documenter .docs-sidebar form.docs-search>input.is-focused,.content kbd.is-focused.input,#documenter .docs-sidebar .content form.docs-search>input.is-focused,.is-dark.textarea:active,.content kbd.textarea:active,.is-dark.input:active,#documenter .docs-sidebar form.docs-search>input.is-dark:active,.content kbd.input:active,.is-dark.is-active.textarea,.content kbd.is-active.textarea,.is-dark.is-active.input,#documenter .docs-sidebar form.docs-search>input.is-active,.content kbd.is-active.input,#documenter .docs-sidebar .content form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(54,54,54,0.25)}.is-primary.textarea,.docstring>section>a.textarea.docs-sourcelink,.is-primary.input,#documenter .docs-sidebar form.docs-search>input.is-primary,.docstring>section>a.input.docs-sourcelink{border-color:#4eb5de}.is-primary.textarea:focus,.docstring>section>a.textarea.docs-sourcelink:focus,.is-primary.input:focus,#documenter .docs-sidebar form.docs-search>input.is-primary:focus,.docstring>section>a.input.docs-sourcelink:focus,.is-primary.is-focused.textarea,.docstring>section>a.is-focused.textarea.docs-sourcelink,.is-primary.is-focused.input,#documenter .docs-sidebar form.docs-search>input.is-focused,.docstring>section>a.is-focused.input.docs-sourcelink,.is-primary.textarea:active,.docstring>section>a.textarea.docs-sourcelink:active,.is-primary.input:active,#documenter .docs-sidebar form.docs-search>input.is-primary:active,.docstring>section>a.input.docs-sourcelink:active,.is-primary.is-active.textarea,.docstring>section>a.is-active.textarea.docs-sourcelink,.is-primary.is-active.input,#documenter .docs-sidebar form.docs-search>input.is-active,.docstring>section>a.is-active.input.docs-sourcelink{box-shadow:0 0 0 0.125em rgba(78,181,222,0.25)}.is-link.textarea,.is-link.input,#documenter .docs-sidebar form.docs-search>input.is-link{border-color:#2e63b8}.is-link.textarea:focus,.is-link.input:focus,#documenter .docs-sidebar form.docs-search>input.is-link:focus,.is-link.is-focused.textarea,.is-link.is-focused.input,#documenter .docs-sidebar form.docs-search>input.is-focused,.is-link.textarea:active,.is-link.input:active,#documenter .docs-sidebar form.docs-search>input.is-link:active,.is-link.is-active.textarea,.is-link.is-active.input,#documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(46,99,184,0.25)}.is-info.textarea,.is-info.input,#documenter .docs-sidebar form.docs-search>input.is-info{border-color:#209cee}.is-info.textarea:focus,.is-info.input:focus,#documenter .docs-sidebar form.docs-search>input.is-info:focus,.is-info.is-focused.textarea,.is-info.is-focused.input,#documenter .docs-sidebar form.docs-search>input.is-focused,.is-info.textarea:active,.is-info.input:active,#documenter .docs-sidebar form.docs-search>input.is-info:active,.is-info.is-active.textarea,.is-info.is-active.input,#documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(32,156,238,0.25)}.is-success.textarea,.is-success.input,#documenter .docs-sidebar form.docs-search>input.is-success{border-color:#22c35b}.is-success.textarea:focus,.is-success.input:focus,#documenter .docs-sidebar form.docs-search>input.is-success:focus,.is-success.is-focused.textarea,.is-success.is-focused.input,#documenter .docs-sidebar form.docs-search>input.is-focused,.is-success.textarea:active,.is-success.input:active,#documenter .docs-sidebar form.docs-search>input.is-success:active,.is-success.is-active.textarea,.is-success.is-active.input,#documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(34,195,91,0.25)}.is-warning.textarea,.is-warning.input,#documenter .docs-sidebar form.docs-search>input.is-warning{border-color:#ffdd57}.is-warning.textarea:focus,.is-warning.input:focus,#documenter .docs-sidebar form.docs-search>input.is-warning:focus,.is-warning.is-focused.textarea,.is-warning.is-focused.input,#documenter .docs-sidebar form.docs-search>input.is-focused,.is-warning.textarea:active,.is-warning.input:active,#documenter .docs-sidebar form.docs-search>input.is-warning:active,.is-warning.is-active.textarea,.is-warning.is-active.input,#documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(255,221,87,0.25)}.is-danger.textarea,.is-danger.input,#documenter .docs-sidebar form.docs-search>input.is-danger{border-color:#da0b00}.is-danger.textarea:focus,.is-danger.input:focus,#documenter .docs-sidebar form.docs-search>input.is-danger:focus,.is-danger.is-focused.textarea,.is-danger.is-focused.input,#documenter .docs-sidebar form.docs-search>input.is-focused,.is-danger.textarea:active,.is-danger.input:active,#documenter .docs-sidebar form.docs-search>input.is-danger:active,.is-danger.is-active.textarea,.is-danger.is-active.input,#documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(218,11,0,0.25)}.is-small.textarea,.is-small.input,#documenter .docs-sidebar form.docs-search>input{border-radius:2px;font-size:.75rem}.is-medium.textarea,.is-medium.input,#documenter .docs-sidebar form.docs-search>input.is-medium{font-size:1.25rem}.is-large.textarea,.is-large.input,#documenter .docs-sidebar form.docs-search>input.is-large{font-size:1.5rem}.is-fullwidth.textarea,.is-fullwidth.input,#documenter .docs-sidebar form.docs-search>input.is-fullwidth{display:block;width:100%}.is-inline.textarea,.is-inline.input,#documenter .docs-sidebar form.docs-search>input.is-inline{display:inline;width:auto}.input.is-rounded,#documenter .docs-sidebar form.docs-search>input{border-radius:9999px;padding-left:calc(calc(0.75em - 1px) + 0.375em);padding-right:calc(calc(0.75em - 1px) + 0.375em)}.input.is-static,#documenter .docs-sidebar form.docs-search>input.is-static{background-color:transparent;border-color:transparent;box-shadow:none;padding-left:0;padding-right:0}.textarea{display:block;max-width:100%;min-width:100%;padding:calc(0.75em - 1px);resize:vertical}.textarea:not([rows]){max-height:40em;min-height:8em}.textarea[rows]{height:initial}.textarea.has-fixed-size{resize:none}.radio,.checkbox{cursor:pointer;display:inline-block;line-height:1.25;position:relative}.radio input,.checkbox input{cursor:pointer}.radio:hover,.checkbox:hover{color:#222}.radio[disabled],.checkbox[disabled],fieldset[disabled] .radio,fieldset[disabled] .checkbox,.radio input[disabled],.checkbox input[disabled]{color:#6b6b6b;cursor:not-allowed}.radio+.radio{margin-left:.5em}.select{display:inline-block;max-width:100%;position:relative;vertical-align:top}.select:not(.is-multiple){height:2.5em}.select:not(.is-multiple):not(.is-loading)::after{border-color:#2e63b8;right:1.125em;z-index:4}.select.is-rounded select,#documenter .docs-sidebar form.docs-search>input.select select{border-radius:9999px;padding-left:1em}.select select{cursor:pointer;display:block;font-size:1em;max-width:100%;outline:none}.select select::-ms-expand{display:none}.select select[disabled]:hover,fieldset[disabled] .select select:hover{border-color:#f5f5f5}.select select:not([multiple]){padding-right:2.5em}.select select[multiple]{height:auto;padding:0}.select select[multiple] option{padding:0.5em 1em}.select:not(.is-multiple):not(.is-loading):hover::after{border-color:#222}.select.is-white:not(:hover)::after{border-color:#fff}.select.is-white select{border-color:#fff}.select.is-white select:hover,.select.is-white select.is-hovered{border-color:#f2f2f2}.select.is-white select:focus,.select.is-white select.is-focused,.select.is-white select:active,.select.is-white select.is-active{box-shadow:0 0 0 0.125em rgba(255,255,255,0.25)}.select.is-black:not(:hover)::after{border-color:#0a0a0a}.select.is-black select{border-color:#0a0a0a}.select.is-black select:hover,.select.is-black select.is-hovered{border-color:#000}.select.is-black select:focus,.select.is-black select.is-focused,.select.is-black select:active,.select.is-black select.is-active{box-shadow:0 0 0 0.125em rgba(10,10,10,0.25)}.select.is-light:not(:hover)::after{border-color:#f5f5f5}.select.is-light select{border-color:#f5f5f5}.select.is-light select:hover,.select.is-light select.is-hovered{border-color:#e8e8e8}.select.is-light select:focus,.select.is-light select.is-focused,.select.is-light select:active,.select.is-light select.is-active{box-shadow:0 0 0 0.125em rgba(245,245,245,0.25)}.select.is-dark:not(:hover)::after,.content kbd.select:not(:hover)::after{border-color:#363636}.select.is-dark select,.content kbd.select select{border-color:#363636}.select.is-dark select:hover,.content kbd.select select:hover,.select.is-dark select.is-hovered,.content kbd.select select.is-hovered{border-color:#292929}.select.is-dark select:focus,.content kbd.select select:focus,.select.is-dark select.is-focused,.content kbd.select select.is-focused,.select.is-dark select:active,.content kbd.select select:active,.select.is-dark select.is-active,.content kbd.select select.is-active{box-shadow:0 0 0 0.125em rgba(54,54,54,0.25)}.select.is-primary:not(:hover)::after,.docstring>section>a.select.docs-sourcelink:not(:hover)::after{border-color:#4eb5de}.select.is-primary select,.docstring>section>a.select.docs-sourcelink select{border-color:#4eb5de}.select.is-primary select:hover,.docstring>section>a.select.docs-sourcelink select:hover,.select.is-primary select.is-hovered,.docstring>section>a.select.docs-sourcelink select.is-hovered{border-color:#39acda}.select.is-primary select:focus,.docstring>section>a.select.docs-sourcelink select:focus,.select.is-primary select.is-focused,.docstring>section>a.select.docs-sourcelink select.is-focused,.select.is-primary select:active,.docstring>section>a.select.docs-sourcelink select:active,.select.is-primary select.is-active,.docstring>section>a.select.docs-sourcelink select.is-active{box-shadow:0 0 0 0.125em rgba(78,181,222,0.25)}.select.is-link:not(:hover)::after{border-color:#2e63b8}.select.is-link select{border-color:#2e63b8}.select.is-link select:hover,.select.is-link select.is-hovered{border-color:#2958a4}.select.is-link select:focus,.select.is-link select.is-focused,.select.is-link select:active,.select.is-link select.is-active{box-shadow:0 0 0 0.125em rgba(46,99,184,0.25)}.select.is-info:not(:hover)::after{border-color:#209cee}.select.is-info select{border-color:#209cee}.select.is-info select:hover,.select.is-info select.is-hovered{border-color:#1190e3}.select.is-info select:focus,.select.is-info select.is-focused,.select.is-info select:active,.select.is-info select.is-active{box-shadow:0 0 0 0.125em rgba(32,156,238,0.25)}.select.is-success:not(:hover)::after{border-color:#22c35b}.select.is-success select{border-color:#22c35b}.select.is-success select:hover,.select.is-success select.is-hovered{border-color:#1ead51}.select.is-success select:focus,.select.is-success select.is-focused,.select.is-success select:active,.select.is-success select.is-active{box-shadow:0 0 0 0.125em rgba(34,195,91,0.25)}.select.is-warning:not(:hover)::after{border-color:#ffdd57}.select.is-warning select{border-color:#ffdd57}.select.is-warning select:hover,.select.is-warning select.is-hovered{border-color:#ffd83e}.select.is-warning select:focus,.select.is-warning select.is-focused,.select.is-warning select:active,.select.is-warning select.is-active{box-shadow:0 0 0 0.125em rgba(255,221,87,0.25)}.select.is-danger:not(:hover)::after{border-color:#da0b00}.select.is-danger select{border-color:#da0b00}.select.is-danger select:hover,.select.is-danger select.is-hovered{border-color:#c10a00}.select.is-danger select:focus,.select.is-danger select.is-focused,.select.is-danger select:active,.select.is-danger select.is-active{box-shadow:0 0 0 0.125em rgba(218,11,0,0.25)}.select.is-small,#documenter .docs-sidebar form.docs-search>input.select{border-radius:2px;font-size:.75rem}.select.is-medium{font-size:1.25rem}.select.is-large{font-size:1.5rem}.select.is-disabled::after{border-color:#6b6b6b !important;opacity:0.5}.select.is-fullwidth{width:100%}.select.is-fullwidth select{width:100%}.select.is-loading::after{margin-top:0;position:absolute;right:.625em;top:0.625em;transform:none}.select.is-loading.is-small:after,#documenter .docs-sidebar form.docs-search>input.is-loading:after{font-size:.75rem}.select.is-loading.is-medium:after{font-size:1.25rem}.select.is-loading.is-large:after{font-size:1.5rem}.file{align-items:stretch;display:flex;justify-content:flex-start;position:relative}.file.is-white .file-cta{background-color:#fff;border-color:transparent;color:#0a0a0a}.file.is-white:hover .file-cta,.file.is-white.is-hovered .file-cta{background-color:#f9f9f9;border-color:transparent;color:#0a0a0a}.file.is-white:focus .file-cta,.file.is-white.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(255,255,255,0.25);color:#0a0a0a}.file.is-white:active .file-cta,.file.is-white.is-active .file-cta{background-color:#f2f2f2;border-color:transparent;color:#0a0a0a}.file.is-black .file-cta{background-color:#0a0a0a;border-color:transparent;color:#fff}.file.is-black:hover .file-cta,.file.is-black.is-hovered .file-cta{background-color:#040404;border-color:transparent;color:#fff}.file.is-black:focus .file-cta,.file.is-black.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(10,10,10,0.25);color:#fff}.file.is-black:active .file-cta,.file.is-black.is-active .file-cta{background-color:#000;border-color:transparent;color:#fff}.file.is-light .file-cta{background-color:#f5f5f5;border-color:transparent;color:rgba(0,0,0,0.7)}.file.is-light:hover .file-cta,.file.is-light.is-hovered .file-cta{background-color:#eee;border-color:transparent;color:rgba(0,0,0,0.7)}.file.is-light:focus .file-cta,.file.is-light.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(245,245,245,0.25);color:rgba(0,0,0,0.7)}.file.is-light:active .file-cta,.file.is-light.is-active .file-cta{background-color:#e8e8e8;border-color:transparent;color:rgba(0,0,0,0.7)}.file.is-dark .file-cta,.content kbd.file .file-cta{background-color:#363636;border-color:transparent;color:#fff}.file.is-dark:hover .file-cta,.content kbd.file:hover .file-cta,.file.is-dark.is-hovered .file-cta,.content kbd.file.is-hovered .file-cta{background-color:#2f2f2f;border-color:transparent;color:#fff}.file.is-dark:focus .file-cta,.content kbd.file:focus .file-cta,.file.is-dark.is-focused .file-cta,.content kbd.file.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(54,54,54,0.25);color:#fff}.file.is-dark:active .file-cta,.content kbd.file:active .file-cta,.file.is-dark.is-active .file-cta,.content kbd.file.is-active .file-cta{background-color:#292929;border-color:transparent;color:#fff}.file.is-primary .file-cta,.docstring>section>a.file.docs-sourcelink .file-cta{background-color:#4eb5de;border-color:transparent;color:#fff}.file.is-primary:hover .file-cta,.docstring>section>a.file.docs-sourcelink:hover .file-cta,.file.is-primary.is-hovered .file-cta,.docstring>section>a.file.is-hovered.docs-sourcelink .file-cta{background-color:#43b1dc;border-color:transparent;color:#fff}.file.is-primary:focus .file-cta,.docstring>section>a.file.docs-sourcelink:focus .file-cta,.file.is-primary.is-focused .file-cta,.docstring>section>a.file.is-focused.docs-sourcelink .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(78,181,222,0.25);color:#fff}.file.is-primary:active .file-cta,.docstring>section>a.file.docs-sourcelink:active .file-cta,.file.is-primary.is-active .file-cta,.docstring>section>a.file.is-active.docs-sourcelink .file-cta{background-color:#39acda;border-color:transparent;color:#fff}.file.is-link .file-cta{background-color:#2e63b8;border-color:transparent;color:#fff}.file.is-link:hover .file-cta,.file.is-link.is-hovered .file-cta{background-color:#2b5eae;border-color:transparent;color:#fff}.file.is-link:focus .file-cta,.file.is-link.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(46,99,184,0.25);color:#fff}.file.is-link:active .file-cta,.file.is-link.is-active .file-cta{background-color:#2958a4;border-color:transparent;color:#fff}.file.is-info .file-cta{background-color:#209cee;border-color:transparent;color:#fff}.file.is-info:hover .file-cta,.file.is-info.is-hovered .file-cta{background-color:#1497ed;border-color:transparent;color:#fff}.file.is-info:focus .file-cta,.file.is-info.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(32,156,238,0.25);color:#fff}.file.is-info:active .file-cta,.file.is-info.is-active .file-cta{background-color:#1190e3;border-color:transparent;color:#fff}.file.is-success .file-cta{background-color:#22c35b;border-color:transparent;color:#fff}.file.is-success:hover .file-cta,.file.is-success.is-hovered .file-cta{background-color:#20b856;border-color:transparent;color:#fff}.file.is-success:focus .file-cta,.file.is-success.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(34,195,91,0.25);color:#fff}.file.is-success:active .file-cta,.file.is-success.is-active .file-cta{background-color:#1ead51;border-color:transparent;color:#fff}.file.is-warning .file-cta{background-color:#ffdd57;border-color:transparent;color:rgba(0,0,0,0.7)}.file.is-warning:hover .file-cta,.file.is-warning.is-hovered .file-cta{background-color:#ffda4a;border-color:transparent;color:rgba(0,0,0,0.7)}.file.is-warning:focus .file-cta,.file.is-warning.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(255,221,87,0.25);color:rgba(0,0,0,0.7)}.file.is-warning:active .file-cta,.file.is-warning.is-active .file-cta{background-color:#ffd83e;border-color:transparent;color:rgba(0,0,0,0.7)}.file.is-danger .file-cta{background-color:#da0b00;border-color:transparent;color:#fff}.file.is-danger:hover .file-cta,.file.is-danger.is-hovered .file-cta{background-color:#cd0a00;border-color:transparent;color:#fff}.file.is-danger:focus .file-cta,.file.is-danger.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(218,11,0,0.25);color:#fff}.file.is-danger:active .file-cta,.file.is-danger.is-active .file-cta{background-color:#c10a00;border-color:transparent;color:#fff}.file.is-small,#documenter .docs-sidebar form.docs-search>input.file{font-size:.75rem}.file.is-normal{font-size:1rem}.file.is-medium{font-size:1.25rem}.file.is-medium .file-icon .fa{font-size:21px}.file.is-large{font-size:1.5rem}.file.is-large .file-icon .fa{font-size:28px}.file.has-name .file-cta{border-bottom-right-radius:0;border-top-right-radius:0}.file.has-name .file-name{border-bottom-left-radius:0;border-top-left-radius:0}.file.has-name.is-empty .file-cta{border-radius:4px}.file.has-name.is-empty .file-name{display:none}.file.is-boxed .file-label{flex-direction:column}.file.is-boxed .file-cta{flex-direction:column;height:auto;padding:1em 3em}.file.is-boxed .file-name{border-width:0 1px 1px}.file.is-boxed .file-icon{height:1.5em;width:1.5em}.file.is-boxed .file-icon .fa{font-size:21px}.file.is-boxed.is-small .file-icon .fa,#documenter .docs-sidebar form.docs-search>input.is-boxed .file-icon .fa{font-size:14px}.file.is-boxed.is-medium .file-icon .fa{font-size:28px}.file.is-boxed.is-large .file-icon .fa{font-size:35px}.file.is-boxed.has-name .file-cta{border-radius:4px 4px 0 0}.file.is-boxed.has-name .file-name{border-radius:0 0 4px 4px;border-width:0 1px 1px}.file.is-centered{justify-content:center}.file.is-fullwidth .file-label{width:100%}.file.is-fullwidth .file-name{flex-grow:1;max-width:none}.file.is-right{justify-content:flex-end}.file.is-right .file-cta{border-radius:0 4px 4px 0}.file.is-right .file-name{border-radius:4px 0 0 4px;border-width:1px 0 1px 1px;order:-1}.file-label{align-items:stretch;display:flex;cursor:pointer;justify-content:flex-start;overflow:hidden;position:relative}.file-label:hover .file-cta{background-color:#eee;color:#222}.file-label:hover .file-name{border-color:#d5d5d5}.file-label:active .file-cta{background-color:#e8e8e8;color:#222}.file-label:active .file-name{border-color:#cfcfcf}.file-input{height:100%;left:0;opacity:0;outline:none;position:absolute;top:0;width:100%}.file-cta,.file-name{border-color:#dbdbdb;border-radius:4px;font-size:1em;padding-left:1em;padding-right:1em;white-space:nowrap}.file-cta{background-color:#f5f5f5;color:#222}.file-name{border-color:#dbdbdb;border-style:solid;border-width:1px 1px 1px 0;display:block;max-width:16em;overflow:hidden;text-align:inherit;text-overflow:ellipsis}.file-icon{align-items:center;display:flex;height:1em;justify-content:center;margin-right:.5em;width:1em}.file-icon .fa{font-size:14px}.label{color:#222;display:block;font-size:1rem;font-weight:700}.label:not(:last-child){margin-bottom:0.5em}.label.is-small,#documenter .docs-sidebar form.docs-search>input.label{font-size:.75rem}.label.is-medium{font-size:1.25rem}.label.is-large{font-size:1.5rem}.help{display:block;font-size:.75rem;margin-top:0.25rem}.help.is-white{color:#fff}.help.is-black{color:#0a0a0a}.help.is-light{color:#f5f5f5}.help.is-dark,.content kbd.help{color:#363636}.help.is-primary,.docstring>section>a.help.docs-sourcelink{color:#4eb5de}.help.is-link{color:#2e63b8}.help.is-info{color:#209cee}.help.is-success{color:#22c35b}.help.is-warning{color:#ffdd57}.help.is-danger{color:#da0b00}.field:not(:last-child){margin-bottom:0.75rem}.field.has-addons{display:flex;justify-content:flex-start}.field.has-addons .control:not(:last-child){margin-right:-1px}.field.has-addons .control:not(:first-child):not(:last-child) .button,.field.has-addons .control:not(:first-child):not(:last-child) .input,.field.has-addons .control:not(:first-child):not(:last-child) #documenter .docs-sidebar form.docs-search>input,#documenter .docs-sidebar .field.has-addons .control:not(:first-child):not(:last-child) form.docs-search>input,.field.has-addons .control:not(:first-child):not(:last-child) .select select{border-radius:0}.field.has-addons .control:first-child:not(:only-child) .button,.field.has-addons .control:first-child:not(:only-child) .input,.field.has-addons .control:first-child:not(:only-child) #documenter .docs-sidebar form.docs-search>input,#documenter .docs-sidebar .field.has-addons .control:first-child:not(:only-child) form.docs-search>input,.field.has-addons .control:first-child:not(:only-child) .select select{border-bottom-right-radius:0;border-top-right-radius:0}.field.has-addons .control:last-child:not(:only-child) .button,.field.has-addons .control:last-child:not(:only-child) .input,.field.has-addons .control:last-child:not(:only-child) #documenter .docs-sidebar form.docs-search>input,#documenter .docs-sidebar .field.has-addons .control:last-child:not(:only-child) form.docs-search>input,.field.has-addons .control:last-child:not(:only-child) .select select{border-bottom-left-radius:0;border-top-left-radius:0}.field.has-addons .control .button:not([disabled]):hover,.field.has-addons .control .button.is-hovered:not([disabled]),.field.has-addons .control .input:not([disabled]):hover,.field.has-addons .control #documenter .docs-sidebar form.docs-search>input:not([disabled]):hover,#documenter .docs-sidebar .field.has-addons .control form.docs-search>input:not([disabled]):hover,.field.has-addons .control .input.is-hovered:not([disabled]),.field.has-addons .control #documenter .docs-sidebar form.docs-search>input.is-hovered:not([disabled]),#documenter .docs-sidebar .field.has-addons .control form.docs-search>input.is-hovered:not([disabled]),.field.has-addons .control .select select:not([disabled]):hover,.field.has-addons .control .select select.is-hovered:not([disabled]){z-index:2}.field.has-addons .control .button:not([disabled]):focus,.field.has-addons .control .button.is-focused:not([disabled]),.field.has-addons .control .button:not([disabled]):active,.field.has-addons .control .button.is-active:not([disabled]),.field.has-addons .control .input:not([disabled]):focus,.field.has-addons .control #documenter .docs-sidebar form.docs-search>input:not([disabled]):focus,#documenter .docs-sidebar .field.has-addons .control form.docs-search>input:not([disabled]):focus,.field.has-addons .control .input.is-focused:not([disabled]),.field.has-addons .control #documenter .docs-sidebar form.docs-search>input.is-focused:not([disabled]),#documenter .docs-sidebar .field.has-addons .control form.docs-search>input.is-focused:not([disabled]),.field.has-addons .control .input:not([disabled]):active,.field.has-addons .control #documenter .docs-sidebar form.docs-search>input:not([disabled]):active,#documenter .docs-sidebar .field.has-addons .control form.docs-search>input:not([disabled]):active,.field.has-addons .control .input.is-active:not([disabled]),.field.has-addons .control #documenter .docs-sidebar form.docs-search>input.is-active:not([disabled]),#documenter .docs-sidebar .field.has-addons .control form.docs-search>input.is-active:not([disabled]),.field.has-addons .control .select select:not([disabled]):focus,.field.has-addons .control .select select.is-focused:not([disabled]),.field.has-addons .control .select select:not([disabled]):active,.field.has-addons .control .select select.is-active:not([disabled]){z-index:3}.field.has-addons .control .button:not([disabled]):focus:hover,.field.has-addons .control .button.is-focused:not([disabled]):hover,.field.has-addons .control .button:not([disabled]):active:hover,.field.has-addons .control .button.is-active:not([disabled]):hover,.field.has-addons .control .input:not([disabled]):focus:hover,.field.has-addons .control #documenter .docs-sidebar form.docs-search>input:not([disabled]):focus:hover,#documenter .docs-sidebar .field.has-addons .control form.docs-search>input:not([disabled]):focus:hover,.field.has-addons .control .input.is-focused:not([disabled]):hover,.field.has-addons .control #documenter .docs-sidebar form.docs-search>input.is-focused:not([disabled]):hover,#documenter .docs-sidebar .field.has-addons .control form.docs-search>input.is-focused:not([disabled]):hover,.field.has-addons .control .input:not([disabled]):active:hover,.field.has-addons .control #documenter .docs-sidebar form.docs-search>input:not([disabled]):active:hover,#documenter .docs-sidebar .field.has-addons .control form.docs-search>input:not([disabled]):active:hover,.field.has-addons .control .input.is-active:not([disabled]):hover,.field.has-addons .control #documenter .docs-sidebar form.docs-search>input.is-active:not([disabled]):hover,#documenter .docs-sidebar .field.has-addons .control form.docs-search>input.is-active:not([disabled]):hover,.field.has-addons .control .select select:not([disabled]):focus:hover,.field.has-addons .control .select select.is-focused:not([disabled]):hover,.field.has-addons .control .select select:not([disabled]):active:hover,.field.has-addons .control .select select.is-active:not([disabled]):hover{z-index:4}.field.has-addons .control.is-expanded{flex-grow:1;flex-shrink:1}.field.has-addons.has-addons-centered{justify-content:center}.field.has-addons.has-addons-right{justify-content:flex-end}.field.has-addons.has-addons-fullwidth .control{flex-grow:1;flex-shrink:0}.field.is-grouped{display:flex;justify-content:flex-start}.field.is-grouped>.control{flex-shrink:0}.field.is-grouped>.control:not(:last-child){margin-bottom:0;margin-right:.75rem}.field.is-grouped>.control.is-expanded{flex-grow:1;flex-shrink:1}.field.is-grouped.is-grouped-centered{justify-content:center}.field.is-grouped.is-grouped-right{justify-content:flex-end}.field.is-grouped.is-grouped-multiline{flex-wrap:wrap}.field.is-grouped.is-grouped-multiline>.control:last-child,.field.is-grouped.is-grouped-multiline>.control:not(:last-child){margin-bottom:0.75rem}.field.is-grouped.is-grouped-multiline:last-child{margin-bottom:-0.75rem}.field.is-grouped.is-grouped-multiline:not(:last-child){margin-bottom:0}@media screen and (min-width: 769px),print{.field.is-horizontal{display:flex}}.field-label .label{font-size:inherit}@media screen and (max-width: 768px){.field-label{margin-bottom:0.5rem}}@media screen and (min-width: 769px),print{.field-label{flex-basis:0;flex-grow:1;flex-shrink:0;margin-right:1.5rem;text-align:right}.field-label.is-small,#documenter .docs-sidebar form.docs-search>input.field-label{font-size:.75rem;padding-top:0.375em}.field-label.is-normal{padding-top:0.375em}.field-label.is-medium{font-size:1.25rem;padding-top:0.375em}.field-label.is-large{font-size:1.5rem;padding-top:0.375em}}.field-body .field .field{margin-bottom:0}@media screen and (min-width: 769px),print{.field-body{display:flex;flex-basis:0;flex-grow:5;flex-shrink:1}.field-body .field{margin-bottom:0}.field-body>.field{flex-shrink:1}.field-body>.field:not(.is-narrow){flex-grow:1}.field-body>.field:not(:last-child){margin-right:.75rem}}.control{box-sizing:border-box;clear:both;font-size:1rem;position:relative;text-align:inherit}.control.has-icons-left .input:focus~.icon,.control.has-icons-left #documenter .docs-sidebar form.docs-search>input:focus~.icon,#documenter .docs-sidebar .control.has-icons-left form.docs-search>input:focus~.icon,.control.has-icons-left .select:focus~.icon,.control.has-icons-right .input:focus~.icon,.control.has-icons-right #documenter .docs-sidebar form.docs-search>input:focus~.icon,#documenter .docs-sidebar .control.has-icons-right form.docs-search>input:focus~.icon,.control.has-icons-right .select:focus~.icon{color:#222}.control.has-icons-left .input.is-small~.icon,.control.has-icons-left #documenter .docs-sidebar form.docs-search>input~.icon,#documenter .docs-sidebar .control.has-icons-left form.docs-search>input~.icon,.control.has-icons-left .select.is-small~.icon,.control.has-icons-right .input.is-small~.icon,.control.has-icons-right #documenter .docs-sidebar form.docs-search>input~.icon,#documenter .docs-sidebar .control.has-icons-right form.docs-search>input~.icon,.control.has-icons-right .select.is-small~.icon{font-size:.75rem}.control.has-icons-left .input.is-medium~.icon,.control.has-icons-left #documenter .docs-sidebar form.docs-search>input.is-medium~.icon,#documenter .docs-sidebar .control.has-icons-left form.docs-search>input.is-medium~.icon,.control.has-icons-left .select.is-medium~.icon,.control.has-icons-right .input.is-medium~.icon,.control.has-icons-right #documenter .docs-sidebar form.docs-search>input.is-medium~.icon,#documenter .docs-sidebar .control.has-icons-right form.docs-search>input.is-medium~.icon,.control.has-icons-right .select.is-medium~.icon{font-size:1.25rem}.control.has-icons-left .input.is-large~.icon,.control.has-icons-left #documenter .docs-sidebar form.docs-search>input.is-large~.icon,#documenter .docs-sidebar .control.has-icons-left form.docs-search>input.is-large~.icon,.control.has-icons-left .select.is-large~.icon,.control.has-icons-right .input.is-large~.icon,.control.has-icons-right #documenter .docs-sidebar form.docs-search>input.is-large~.icon,#documenter .docs-sidebar .control.has-icons-right form.docs-search>input.is-large~.icon,.control.has-icons-right .select.is-large~.icon{font-size:1.5rem}.control.has-icons-left .icon,.control.has-icons-right .icon{color:#dbdbdb;height:2.5em;pointer-events:none;position:absolute;top:0;width:2.5em;z-index:4}.control.has-icons-left .input,.control.has-icons-left #documenter .docs-sidebar form.docs-search>input,#documenter .docs-sidebar .control.has-icons-left form.docs-search>input,.control.has-icons-left .select select{padding-left:2.5em}.control.has-icons-left .icon.is-left{left:0}.control.has-icons-right .input,.control.has-icons-right #documenter .docs-sidebar form.docs-search>input,#documenter .docs-sidebar .control.has-icons-right form.docs-search>input,.control.has-icons-right .select select{padding-right:2.5em}.control.has-icons-right .icon.is-right{right:0}.control.is-loading::after{position:absolute !important;right:.625em;top:0.625em;z-index:4}.control.is-loading.is-small:after,#documenter .docs-sidebar form.docs-search>input.is-loading:after{font-size:.75rem}.control.is-loading.is-medium:after{font-size:1.25rem}.control.is-loading.is-large:after{font-size:1.5rem}.breadcrumb{font-size:1rem;white-space:nowrap}.breadcrumb a{align-items:center;color:#2e63b8;display:flex;justify-content:center;padding:0 .75em}.breadcrumb a:hover{color:#363636}.breadcrumb li{align-items:center;display:flex}.breadcrumb li:first-child a{padding-left:0}.breadcrumb li.is-active a{color:#222;cursor:default;pointer-events:none}.breadcrumb li+li::before{color:#b5b5b5;content:"\0002f"}.breadcrumb ul,.breadcrumb ol{align-items:flex-start;display:flex;flex-wrap:wrap;justify-content:flex-start}.breadcrumb .icon:first-child{margin-right:.5em}.breadcrumb .icon:last-child{margin-left:.5em}.breadcrumb.is-centered ol,.breadcrumb.is-centered ul{justify-content:center}.breadcrumb.is-right ol,.breadcrumb.is-right ul{justify-content:flex-end}.breadcrumb.is-small,#documenter .docs-sidebar form.docs-search>input.breadcrumb{font-size:.75rem}.breadcrumb.is-medium{font-size:1.25rem}.breadcrumb.is-large{font-size:1.5rem}.breadcrumb.has-arrow-separator li+li::before{content:"\02192"}.breadcrumb.has-bullet-separator li+li::before{content:"\02022"}.breadcrumb.has-dot-separator li+li::before{content:"\000b7"}.breadcrumb.has-succeeds-separator li+li::before{content:"\0227B"}.card{background-color:#fff;border-radius:.25rem;box-shadow:#bbb;color:#222;max-width:100%;position:relative}.card-footer:first-child,.card-content:first-child,.card-header:first-child{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.card-footer:last-child,.card-content:last-child,.card-header:last-child{border-bottom-left-radius:.25rem;border-bottom-right-radius:.25rem}.card-header{background-color:rgba(0,0,0,0);align-items:stretch;box-shadow:0 0.125em 0.25em rgba(10,10,10,0.1);display:flex}.card-header-title{align-items:center;color:#222;display:flex;flex-grow:1;font-weight:700;padding:0.75rem 1rem}.card-header-title.is-centered{justify-content:center}.card-header-icon{-moz-appearance:none;-webkit-appearance:none;appearance:none;background:none;border:none;color:currentColor;font-family:inherit;font-size:1em;margin:0;padding:0;align-items:center;cursor:pointer;display:flex;justify-content:center;padding:0.75rem 1rem}.card-image{display:block;position:relative}.card-image:first-child img{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.card-image:last-child img{border-bottom-left-radius:.25rem;border-bottom-right-radius:.25rem}.card-content{background-color:rgba(0,0,0,0);padding:1.5rem}.card-footer{background-color:rgba(0,0,0,0);border-top:1px solid #ededed;align-items:stretch;display:flex}.card-footer-item{align-items:center;display:flex;flex-basis:0;flex-grow:1;flex-shrink:0;justify-content:center;padding:.75rem}.card-footer-item:not(:last-child){border-right:1px solid #ededed}.card .media:not(:last-child){margin-bottom:1.5rem}.dropdown{display:inline-flex;position:relative;vertical-align:top}.dropdown.is-active .dropdown-menu,.dropdown.is-hoverable:hover .dropdown-menu{display:block}.dropdown.is-right .dropdown-menu{left:auto;right:0}.dropdown.is-up .dropdown-menu{bottom:100%;padding-bottom:4px;padding-top:initial;top:auto}.dropdown-menu{display:none;left:0;min-width:12rem;padding-top:4px;position:absolute;top:100%;z-index:20}.dropdown-content{background-color:#fff;border-radius:4px;box-shadow:#bbb;padding-bottom:.5rem;padding-top:.5rem}.dropdown-item{color:#222;display:block;font-size:0.875rem;line-height:1.5;padding:0.375rem 1rem;position:relative}a.dropdown-item,button.dropdown-item{padding-right:3rem;text-align:inherit;white-space:nowrap;width:100%}a.dropdown-item:hover,button.dropdown-item:hover{background-color:#f5f5f5;color:#0a0a0a}a.dropdown-item.is-active,button.dropdown-item.is-active{background-color:#2e63b8;color:#fff}.dropdown-divider{background-color:#ededed;border:none;display:block;height:1px;margin:0.5rem 0}.level{align-items:center;justify-content:space-between}.level code{border-radius:4px}.level img{display:inline-block;vertical-align:top}.level.is-mobile{display:flex}.level.is-mobile .level-left,.level.is-mobile .level-right{display:flex}.level.is-mobile .level-left+.level-right{margin-top:0}.level.is-mobile .level-item:not(:last-child){margin-bottom:0;margin-right:.75rem}.level.is-mobile .level-item:not(.is-narrow){flex-grow:1}@media screen and (min-width: 769px),print{.level{display:flex}.level>.level-item:not(.is-narrow){flex-grow:1}}.level-item{align-items:center;display:flex;flex-basis:auto;flex-grow:0;flex-shrink:0;justify-content:center}.level-item .title,.level-item .subtitle{margin-bottom:0}@media screen and (max-width: 768px){.level-item:not(:last-child){margin-bottom:.75rem}}.level-left,.level-right{flex-basis:auto;flex-grow:0;flex-shrink:0}.level-left .level-item.is-flexible,.level-right .level-item.is-flexible{flex-grow:1}@media screen and (min-width: 769px),print{.level-left .level-item:not(:last-child),.level-right .level-item:not(:last-child){margin-right:.75rem}}.level-left{align-items:center;justify-content:flex-start}@media screen and (max-width: 768px){.level-left+.level-right{margin-top:1.5rem}}@media screen and (min-width: 769px),print{.level-left{display:flex}}.level-right{align-items:center;justify-content:flex-end}@media screen and (min-width: 769px),print{.level-right{display:flex}}.media{align-items:flex-start;display:flex;text-align:inherit}.media .content:not(:last-child){margin-bottom:.75rem}.media .media{border-top:1px solid rgba(219,219,219,0.5);display:flex;padding-top:.75rem}.media .media .content:not(:last-child),.media .media .control:not(:last-child){margin-bottom:.5rem}.media .media .media{padding-top:.5rem}.media .media .media+.media{margin-top:.5rem}.media+.media{border-top:1px solid rgba(219,219,219,0.5);margin-top:1rem;padding-top:1rem}.media.is-large+.media{margin-top:1.5rem;padding-top:1.5rem}.media-left,.media-right{flex-basis:auto;flex-grow:0;flex-shrink:0}.media-left{margin-right:1rem}.media-right{margin-left:1rem}.media-content{flex-basis:auto;flex-grow:1;flex-shrink:1;text-align:inherit}@media screen and (max-width: 768px){.media-content{overflow-x:auto}}.menu{font-size:1rem}.menu.is-small,#documenter .docs-sidebar form.docs-search>input.menu{font-size:.75rem}.menu.is-medium{font-size:1.25rem}.menu.is-large{font-size:1.5rem}.menu-list{line-height:1.25}.menu-list a{border-radius:2px;color:#222;display:block;padding:0.5em 0.75em}.menu-list a:hover{background-color:#f5f5f5;color:#222}.menu-list a.is-active{background-color:#2e63b8;color:#fff}.menu-list li ul{border-left:1px solid #dbdbdb;margin:.75em;padding-left:.75em}.menu-label{color:#6b6b6b;font-size:.75em;letter-spacing:.1em;text-transform:uppercase}.menu-label:not(:first-child){margin-top:1em}.menu-label:not(:last-child){margin-bottom:1em}.message{background-color:#f5f5f5;border-radius:4px;font-size:1rem}.message strong{color:currentColor}.message a:not(.button):not(.tag):not(.dropdown-item){color:currentColor;text-decoration:underline}.message.is-small,#documenter .docs-sidebar form.docs-search>input.message{font-size:.75rem}.message.is-medium{font-size:1.25rem}.message.is-large{font-size:1.5rem}.message.is-white{background-color:#fff}.message.is-white .message-header{background-color:#fff;color:#0a0a0a}.message.is-white .message-body{border-color:#fff}.message.is-black{background-color:#fafafa}.message.is-black .message-header{background-color:#0a0a0a;color:#fff}.message.is-black .message-body{border-color:#0a0a0a}.message.is-light{background-color:#fafafa}.message.is-light .message-header{background-color:#f5f5f5;color:rgba(0,0,0,0.7)}.message.is-light .message-body{border-color:#f5f5f5}.message.is-dark,.content kbd.message{background-color:#fafafa}.message.is-dark .message-header,.content kbd.message .message-header{background-color:#363636;color:#fff}.message.is-dark .message-body,.content kbd.message .message-body{border-color:#363636}.message.is-primary,.docstring>section>a.message.docs-sourcelink{background-color:#eef8fc}.message.is-primary .message-header,.docstring>section>a.message.docs-sourcelink .message-header{background-color:#4eb5de;color:#fff}.message.is-primary .message-body,.docstring>section>a.message.docs-sourcelink .message-body{border-color:#4eb5de;color:#1a6d8e}.message.is-link{background-color:#eff3fb}.message.is-link .message-header{background-color:#2e63b8;color:#fff}.message.is-link .message-body{border-color:#2e63b8;color:#3169c4}.message.is-info{background-color:#ecf7fe}.message.is-info .message-header{background-color:#209cee;color:#fff}.message.is-info .message-body{border-color:#209cee;color:#0e72b4}.message.is-success{background-color:#eefcf3}.message.is-success .message-header{background-color:#22c35b;color:#fff}.message.is-success .message-body{border-color:#22c35b;color:#198f43}.message.is-warning{background-color:#fffbeb}.message.is-warning .message-header{background-color:#ffdd57;color:rgba(0,0,0,0.7)}.message.is-warning .message-body{border-color:#ffdd57;color:#947600}.message.is-danger{background-color:#ffeceb}.message.is-danger .message-header{background-color:#da0b00;color:#fff}.message.is-danger .message-body{border-color:#da0b00;color:#f50c00}.message-header{align-items:center;background-color:#222;border-radius:4px 4px 0 0;color:#fff;display:flex;font-weight:700;justify-content:space-between;line-height:1.25;padding:0.75em 1em;position:relative}.message-header .delete{flex-grow:0;flex-shrink:0;margin-left:.75em}.message-header+.message-body{border-width:0;border-top-left-radius:0;border-top-right-radius:0}.message-body{border-color:#dbdbdb;border-radius:4px;border-style:solid;border-width:0 0 0 4px;color:#222;padding:1.25em 1.5em}.message-body code,.message-body pre{background-color:#fff}.message-body pre code{background-color:rgba(0,0,0,0)}.modal{align-items:center;display:none;flex-direction:column;justify-content:center;overflow:hidden;position:fixed;z-index:40}.modal.is-active{display:flex}.modal-background{background-color:rgba(10,10,10,0.86)}.modal-content,.modal-card{margin:0 20px;max-height:calc(100vh - 160px);overflow:auto;position:relative;width:100%}@media screen and (min-width: 769px){.modal-content,.modal-card{margin:0 auto;max-height:calc(100vh - 40px);width:640px}}.modal-close{background:none;height:40px;position:fixed;right:20px;top:20px;width:40px}.modal-card{display:flex;flex-direction:column;max-height:calc(100vh - 40px);overflow:hidden;-ms-overflow-y:visible}.modal-card-head,.modal-card-foot{align-items:center;background-color:#f5f5f5;display:flex;flex-shrink:0;justify-content:flex-start;padding:20px;position:relative}.modal-card-head{border-bottom:1px solid #dbdbdb;border-top-left-radius:6px;border-top-right-radius:6px}.modal-card-title{color:#222;flex-grow:1;flex-shrink:0;font-size:1.5rem;line-height:1}.modal-card-foot{border-bottom-left-radius:6px;border-bottom-right-radius:6px;border-top:1px solid #dbdbdb}.modal-card-foot .button:not(:last-child){margin-right:.5em}.modal-card-body{-webkit-overflow-scrolling:touch;background-color:#fff;flex-grow:1;flex-shrink:1;overflow:auto;padding:20px}.navbar{background-color:#fff;min-height:3.25rem;position:relative;z-index:30}.navbar.is-white{background-color:#fff;color:#0a0a0a}.navbar.is-white .navbar-brand>.navbar-item,.navbar.is-white .navbar-brand .navbar-link{color:#0a0a0a}.navbar.is-white .navbar-brand>a.navbar-item:focus,.navbar.is-white .navbar-brand>a.navbar-item:hover,.navbar.is-white .navbar-brand>a.navbar-item.is-active,.navbar.is-white .navbar-brand .navbar-link:focus,.navbar.is-white .navbar-brand .navbar-link:hover,.navbar.is-white .navbar-brand .navbar-link.is-active{background-color:#f2f2f2;color:#0a0a0a}.navbar.is-white .navbar-brand .navbar-link::after{border-color:#0a0a0a}.navbar.is-white .navbar-burger{color:#0a0a0a}@media screen and (min-width: 1056px){.navbar.is-white .navbar-start>.navbar-item,.navbar.is-white .navbar-start .navbar-link,.navbar.is-white .navbar-end>.navbar-item,.navbar.is-white .navbar-end .navbar-link{color:#0a0a0a}.navbar.is-white .navbar-start>a.navbar-item:focus,.navbar.is-white .navbar-start>a.navbar-item:hover,.navbar.is-white .navbar-start>a.navbar-item.is-active,.navbar.is-white .navbar-start .navbar-link:focus,.navbar.is-white .navbar-start .navbar-link:hover,.navbar.is-white .navbar-start .navbar-link.is-active,.navbar.is-white .navbar-end>a.navbar-item:focus,.navbar.is-white .navbar-end>a.navbar-item:hover,.navbar.is-white .navbar-end>a.navbar-item.is-active,.navbar.is-white .navbar-end .navbar-link:focus,.navbar.is-white .navbar-end .navbar-link:hover,.navbar.is-white .navbar-end .navbar-link.is-active{background-color:#f2f2f2;color:#0a0a0a}.navbar.is-white .navbar-start .navbar-link::after,.navbar.is-white .navbar-end .navbar-link::after{border-color:#0a0a0a}.navbar.is-white .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-white .navbar-item.has-dropdown:hover .navbar-link,.navbar.is-white .navbar-item.has-dropdown.is-active .navbar-link{background-color:#f2f2f2;color:#0a0a0a}.navbar.is-white .navbar-dropdown a.navbar-item.is-active{background-color:#fff;color:#0a0a0a}}.navbar.is-black{background-color:#0a0a0a;color:#fff}.navbar.is-black .navbar-brand>.navbar-item,.navbar.is-black .navbar-brand .navbar-link{color:#fff}.navbar.is-black .navbar-brand>a.navbar-item:focus,.navbar.is-black .navbar-brand>a.navbar-item:hover,.navbar.is-black .navbar-brand>a.navbar-item.is-active,.navbar.is-black .navbar-brand .navbar-link:focus,.navbar.is-black .navbar-brand .navbar-link:hover,.navbar.is-black .navbar-brand .navbar-link.is-active{background-color:#000;color:#fff}.navbar.is-black .navbar-brand .navbar-link::after{border-color:#fff}.navbar.is-black .navbar-burger{color:#fff}@media screen and (min-width: 1056px){.navbar.is-black .navbar-start>.navbar-item,.navbar.is-black .navbar-start .navbar-link,.navbar.is-black .navbar-end>.navbar-item,.navbar.is-black .navbar-end .navbar-link{color:#fff}.navbar.is-black .navbar-start>a.navbar-item:focus,.navbar.is-black .navbar-start>a.navbar-item:hover,.navbar.is-black .navbar-start>a.navbar-item.is-active,.navbar.is-black .navbar-start .navbar-link:focus,.navbar.is-black .navbar-start .navbar-link:hover,.navbar.is-black .navbar-start .navbar-link.is-active,.navbar.is-black .navbar-end>a.navbar-item:focus,.navbar.is-black .navbar-end>a.navbar-item:hover,.navbar.is-black .navbar-end>a.navbar-item.is-active,.navbar.is-black .navbar-end .navbar-link:focus,.navbar.is-black .navbar-end .navbar-link:hover,.navbar.is-black .navbar-end .navbar-link.is-active{background-color:#000;color:#fff}.navbar.is-black .navbar-start .navbar-link::after,.navbar.is-black .navbar-end .navbar-link::after{border-color:#fff}.navbar.is-black .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-black .navbar-item.has-dropdown:hover .navbar-link,.navbar.is-black .navbar-item.has-dropdown.is-active .navbar-link{background-color:#000;color:#fff}.navbar.is-black .navbar-dropdown a.navbar-item.is-active{background-color:#0a0a0a;color:#fff}}.navbar.is-light{background-color:#f5f5f5;color:rgba(0,0,0,0.7)}.navbar.is-light .navbar-brand>.navbar-item,.navbar.is-light .navbar-brand .navbar-link{color:rgba(0,0,0,0.7)}.navbar.is-light .navbar-brand>a.navbar-item:focus,.navbar.is-light .navbar-brand>a.navbar-item:hover,.navbar.is-light .navbar-brand>a.navbar-item.is-active,.navbar.is-light .navbar-brand .navbar-link:focus,.navbar.is-light .navbar-brand .navbar-link:hover,.navbar.is-light .navbar-brand .navbar-link.is-active{background-color:#e8e8e8;color:rgba(0,0,0,0.7)}.navbar.is-light .navbar-brand .navbar-link::after{border-color:rgba(0,0,0,0.7)}.navbar.is-light .navbar-burger{color:rgba(0,0,0,0.7)}@media screen and (min-width: 1056px){.navbar.is-light .navbar-start>.navbar-item,.navbar.is-light .navbar-start .navbar-link,.navbar.is-light .navbar-end>.navbar-item,.navbar.is-light .navbar-end .navbar-link{color:rgba(0,0,0,0.7)}.navbar.is-light .navbar-start>a.navbar-item:focus,.navbar.is-light .navbar-start>a.navbar-item:hover,.navbar.is-light .navbar-start>a.navbar-item.is-active,.navbar.is-light .navbar-start .navbar-link:focus,.navbar.is-light .navbar-start .navbar-link:hover,.navbar.is-light .navbar-start .navbar-link.is-active,.navbar.is-light .navbar-end>a.navbar-item:focus,.navbar.is-light .navbar-end>a.navbar-item:hover,.navbar.is-light .navbar-end>a.navbar-item.is-active,.navbar.is-light .navbar-end .navbar-link:focus,.navbar.is-light .navbar-end .navbar-link:hover,.navbar.is-light .navbar-end .navbar-link.is-active{background-color:#e8e8e8;color:rgba(0,0,0,0.7)}.navbar.is-light .navbar-start .navbar-link::after,.navbar.is-light .navbar-end .navbar-link::after{border-color:rgba(0,0,0,0.7)}.navbar.is-light .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-light .navbar-item.has-dropdown:hover .navbar-link,.navbar.is-light .navbar-item.has-dropdown.is-active .navbar-link{background-color:#e8e8e8;color:rgba(0,0,0,0.7)}.navbar.is-light .navbar-dropdown a.navbar-item.is-active{background-color:#f5f5f5;color:rgba(0,0,0,0.7)}}.navbar.is-dark,.content kbd.navbar{background-color:#363636;color:#fff}.navbar.is-dark .navbar-brand>.navbar-item,.content kbd.navbar .navbar-brand>.navbar-item,.navbar.is-dark .navbar-brand .navbar-link,.content kbd.navbar .navbar-brand .navbar-link{color:#fff}.navbar.is-dark .navbar-brand>a.navbar-item:focus,.content kbd.navbar .navbar-brand>a.navbar-item:focus,.navbar.is-dark .navbar-brand>a.navbar-item:hover,.content kbd.navbar .navbar-brand>a.navbar-item:hover,.navbar.is-dark .navbar-brand>a.navbar-item.is-active,.content kbd.navbar .navbar-brand>a.navbar-item.is-active,.navbar.is-dark .navbar-brand .navbar-link:focus,.content kbd.navbar .navbar-brand .navbar-link:focus,.navbar.is-dark .navbar-brand .navbar-link:hover,.content kbd.navbar .navbar-brand .navbar-link:hover,.navbar.is-dark .navbar-brand .navbar-link.is-active,.content kbd.navbar .navbar-brand .navbar-link.is-active{background-color:#292929;color:#fff}.navbar.is-dark .navbar-brand .navbar-link::after,.content kbd.navbar .navbar-brand .navbar-link::after{border-color:#fff}.navbar.is-dark .navbar-burger,.content kbd.navbar .navbar-burger{color:#fff}@media screen and (min-width: 1056px){.navbar.is-dark .navbar-start>.navbar-item,.content kbd.navbar .navbar-start>.navbar-item,.navbar.is-dark .navbar-start .navbar-link,.content kbd.navbar .navbar-start .navbar-link,.navbar.is-dark .navbar-end>.navbar-item,.content kbd.navbar .navbar-end>.navbar-item,.navbar.is-dark .navbar-end .navbar-link,.content kbd.navbar .navbar-end .navbar-link{color:#fff}.navbar.is-dark .navbar-start>a.navbar-item:focus,.content kbd.navbar .navbar-start>a.navbar-item:focus,.navbar.is-dark .navbar-start>a.navbar-item:hover,.content kbd.navbar .navbar-start>a.navbar-item:hover,.navbar.is-dark .navbar-start>a.navbar-item.is-active,.content kbd.navbar .navbar-start>a.navbar-item.is-active,.navbar.is-dark .navbar-start .navbar-link:focus,.content kbd.navbar .navbar-start .navbar-link:focus,.navbar.is-dark .navbar-start .navbar-link:hover,.content kbd.navbar .navbar-start .navbar-link:hover,.navbar.is-dark .navbar-start .navbar-link.is-active,.content kbd.navbar .navbar-start .navbar-link.is-active,.navbar.is-dark .navbar-end>a.navbar-item:focus,.content kbd.navbar .navbar-end>a.navbar-item:focus,.navbar.is-dark .navbar-end>a.navbar-item:hover,.content kbd.navbar .navbar-end>a.navbar-item:hover,.navbar.is-dark .navbar-end>a.navbar-item.is-active,.content kbd.navbar .navbar-end>a.navbar-item.is-active,.navbar.is-dark .navbar-end .navbar-link:focus,.content kbd.navbar .navbar-end .navbar-link:focus,.navbar.is-dark .navbar-end .navbar-link:hover,.content kbd.navbar .navbar-end .navbar-link:hover,.navbar.is-dark .navbar-end .navbar-link.is-active,.content kbd.navbar .navbar-end .navbar-link.is-active{background-color:#292929;color:#fff}.navbar.is-dark .navbar-start .navbar-link::after,.content kbd.navbar .navbar-start .navbar-link::after,.navbar.is-dark .navbar-end .navbar-link::after,.content kbd.navbar .navbar-end .navbar-link::after{border-color:#fff}.navbar.is-dark .navbar-item.has-dropdown:focus .navbar-link,.content kbd.navbar .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-dark .navbar-item.has-dropdown:hover .navbar-link,.content kbd.navbar .navbar-item.has-dropdown:hover .navbar-link,.navbar.is-dark .navbar-item.has-dropdown.is-active .navbar-link,.content kbd.navbar .navbar-item.has-dropdown.is-active .navbar-link{background-color:#292929;color:#fff}.navbar.is-dark .navbar-dropdown a.navbar-item.is-active,.content kbd.navbar .navbar-dropdown a.navbar-item.is-active{background-color:#363636;color:#fff}}.navbar.is-primary,.docstring>section>a.navbar.docs-sourcelink{background-color:#4eb5de;color:#fff}.navbar.is-primary .navbar-brand>.navbar-item,.docstring>section>a.navbar.docs-sourcelink .navbar-brand>.navbar-item,.navbar.is-primary .navbar-brand .navbar-link,.docstring>section>a.navbar.docs-sourcelink .navbar-brand .navbar-link{color:#fff}.navbar.is-primary .navbar-brand>a.navbar-item:focus,.docstring>section>a.navbar.docs-sourcelink .navbar-brand>a.navbar-item:focus,.navbar.is-primary .navbar-brand>a.navbar-item:hover,.docstring>section>a.navbar.docs-sourcelink .navbar-brand>a.navbar-item:hover,.navbar.is-primary .navbar-brand>a.navbar-item.is-active,.docstring>section>a.navbar.docs-sourcelink .navbar-brand>a.navbar-item.is-active,.navbar.is-primary .navbar-brand .navbar-link:focus,.docstring>section>a.navbar.docs-sourcelink .navbar-brand .navbar-link:focus,.navbar.is-primary .navbar-brand .navbar-link:hover,.docstring>section>a.navbar.docs-sourcelink .navbar-brand .navbar-link:hover,.navbar.is-primary .navbar-brand .navbar-link.is-active,.docstring>section>a.navbar.docs-sourcelink .navbar-brand .navbar-link.is-active{background-color:#39acda;color:#fff}.navbar.is-primary .navbar-brand .navbar-link::after,.docstring>section>a.navbar.docs-sourcelink .navbar-brand .navbar-link::after{border-color:#fff}.navbar.is-primary .navbar-burger,.docstring>section>a.navbar.docs-sourcelink .navbar-burger{color:#fff}@media screen and (min-width: 1056px){.navbar.is-primary .navbar-start>.navbar-item,.docstring>section>a.navbar.docs-sourcelink .navbar-start>.navbar-item,.navbar.is-primary .navbar-start .navbar-link,.docstring>section>a.navbar.docs-sourcelink .navbar-start .navbar-link,.navbar.is-primary .navbar-end>.navbar-item,.docstring>section>a.navbar.docs-sourcelink .navbar-end>.navbar-item,.navbar.is-primary .navbar-end .navbar-link,.docstring>section>a.navbar.docs-sourcelink .navbar-end .navbar-link{color:#fff}.navbar.is-primary .navbar-start>a.navbar-item:focus,.docstring>section>a.navbar.docs-sourcelink .navbar-start>a.navbar-item:focus,.navbar.is-primary .navbar-start>a.navbar-item:hover,.docstring>section>a.navbar.docs-sourcelink .navbar-start>a.navbar-item:hover,.navbar.is-primary .navbar-start>a.navbar-item.is-active,.docstring>section>a.navbar.docs-sourcelink .navbar-start>a.navbar-item.is-active,.navbar.is-primary .navbar-start .navbar-link:focus,.docstring>section>a.navbar.docs-sourcelink .navbar-start .navbar-link:focus,.navbar.is-primary .navbar-start .navbar-link:hover,.docstring>section>a.navbar.docs-sourcelink .navbar-start .navbar-link:hover,.navbar.is-primary .navbar-start .navbar-link.is-active,.docstring>section>a.navbar.docs-sourcelink .navbar-start .navbar-link.is-active,.navbar.is-primary .navbar-end>a.navbar-item:focus,.docstring>section>a.navbar.docs-sourcelink .navbar-end>a.navbar-item:focus,.navbar.is-primary .navbar-end>a.navbar-item:hover,.docstring>section>a.navbar.docs-sourcelink .navbar-end>a.navbar-item:hover,.navbar.is-primary .navbar-end>a.navbar-item.is-active,.docstring>section>a.navbar.docs-sourcelink .navbar-end>a.navbar-item.is-active,.navbar.is-primary .navbar-end .navbar-link:focus,.docstring>section>a.navbar.docs-sourcelink .navbar-end .navbar-link:focus,.navbar.is-primary .navbar-end .navbar-link:hover,.docstring>section>a.navbar.docs-sourcelink .navbar-end .navbar-link:hover,.navbar.is-primary .navbar-end .navbar-link.is-active,.docstring>section>a.navbar.docs-sourcelink .navbar-end .navbar-link.is-active{background-color:#39acda;color:#fff}.navbar.is-primary .navbar-start .navbar-link::after,.docstring>section>a.navbar.docs-sourcelink .navbar-start .navbar-link::after,.navbar.is-primary .navbar-end .navbar-link::after,.docstring>section>a.navbar.docs-sourcelink .navbar-end .navbar-link::after{border-color:#fff}.navbar.is-primary .navbar-item.has-dropdown:focus .navbar-link,.docstring>section>a.navbar.docs-sourcelink .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-primary .navbar-item.has-dropdown:hover .navbar-link,.docstring>section>a.navbar.docs-sourcelink .navbar-item.has-dropdown:hover .navbar-link,.navbar.is-primary .navbar-item.has-dropdown.is-active .navbar-link,.docstring>section>a.navbar.docs-sourcelink .navbar-item.has-dropdown.is-active .navbar-link{background-color:#39acda;color:#fff}.navbar.is-primary .navbar-dropdown a.navbar-item.is-active,.docstring>section>a.navbar.docs-sourcelink .navbar-dropdown a.navbar-item.is-active{background-color:#4eb5de;color:#fff}}.navbar.is-link{background-color:#2e63b8;color:#fff}.navbar.is-link .navbar-brand>.navbar-item,.navbar.is-link .navbar-brand .navbar-link{color:#fff}.navbar.is-link .navbar-brand>a.navbar-item:focus,.navbar.is-link .navbar-brand>a.navbar-item:hover,.navbar.is-link .navbar-brand>a.navbar-item.is-active,.navbar.is-link .navbar-brand .navbar-link:focus,.navbar.is-link .navbar-brand .navbar-link:hover,.navbar.is-link .navbar-brand .navbar-link.is-active{background-color:#2958a4;color:#fff}.navbar.is-link .navbar-brand .navbar-link::after{border-color:#fff}.navbar.is-link .navbar-burger{color:#fff}@media screen and (min-width: 1056px){.navbar.is-link .navbar-start>.navbar-item,.navbar.is-link .navbar-start .navbar-link,.navbar.is-link .navbar-end>.navbar-item,.navbar.is-link .navbar-end .navbar-link{color:#fff}.navbar.is-link .navbar-start>a.navbar-item:focus,.navbar.is-link .navbar-start>a.navbar-item:hover,.navbar.is-link .navbar-start>a.navbar-item.is-active,.navbar.is-link .navbar-start .navbar-link:focus,.navbar.is-link .navbar-start .navbar-link:hover,.navbar.is-link .navbar-start .navbar-link.is-active,.navbar.is-link .navbar-end>a.navbar-item:focus,.navbar.is-link .navbar-end>a.navbar-item:hover,.navbar.is-link .navbar-end>a.navbar-item.is-active,.navbar.is-link .navbar-end .navbar-link:focus,.navbar.is-link .navbar-end .navbar-link:hover,.navbar.is-link .navbar-end .navbar-link.is-active{background-color:#2958a4;color:#fff}.navbar.is-link .navbar-start .navbar-link::after,.navbar.is-link .navbar-end .navbar-link::after{border-color:#fff}.navbar.is-link .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-link .navbar-item.has-dropdown:hover .navbar-link,.navbar.is-link .navbar-item.has-dropdown.is-active .navbar-link{background-color:#2958a4;color:#fff}.navbar.is-link .navbar-dropdown a.navbar-item.is-active{background-color:#2e63b8;color:#fff}}.navbar.is-info{background-color:#209cee;color:#fff}.navbar.is-info .navbar-brand>.navbar-item,.navbar.is-info .navbar-brand .navbar-link{color:#fff}.navbar.is-info .navbar-brand>a.navbar-item:focus,.navbar.is-info .navbar-brand>a.navbar-item:hover,.navbar.is-info .navbar-brand>a.navbar-item.is-active,.navbar.is-info .navbar-brand .navbar-link:focus,.navbar.is-info .navbar-brand .navbar-link:hover,.navbar.is-info .navbar-brand .navbar-link.is-active{background-color:#1190e3;color:#fff}.navbar.is-info .navbar-brand .navbar-link::after{border-color:#fff}.navbar.is-info .navbar-burger{color:#fff}@media screen and (min-width: 1056px){.navbar.is-info .navbar-start>.navbar-item,.navbar.is-info .navbar-start .navbar-link,.navbar.is-info .navbar-end>.navbar-item,.navbar.is-info .navbar-end .navbar-link{color:#fff}.navbar.is-info .navbar-start>a.navbar-item:focus,.navbar.is-info .navbar-start>a.navbar-item:hover,.navbar.is-info .navbar-start>a.navbar-item.is-active,.navbar.is-info .navbar-start .navbar-link:focus,.navbar.is-info .navbar-start .navbar-link:hover,.navbar.is-info .navbar-start .navbar-link.is-active,.navbar.is-info .navbar-end>a.navbar-item:focus,.navbar.is-info .navbar-end>a.navbar-item:hover,.navbar.is-info .navbar-end>a.navbar-item.is-active,.navbar.is-info .navbar-end .navbar-link:focus,.navbar.is-info .navbar-end .navbar-link:hover,.navbar.is-info .navbar-end .navbar-link.is-active{background-color:#1190e3;color:#fff}.navbar.is-info .navbar-start .navbar-link::after,.navbar.is-info .navbar-end .navbar-link::after{border-color:#fff}.navbar.is-info .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-info .navbar-item.has-dropdown:hover .navbar-link,.navbar.is-info .navbar-item.has-dropdown.is-active .navbar-link{background-color:#1190e3;color:#fff}.navbar.is-info .navbar-dropdown a.navbar-item.is-active{background-color:#209cee;color:#fff}}.navbar.is-success{background-color:#22c35b;color:#fff}.navbar.is-success .navbar-brand>.navbar-item,.navbar.is-success .navbar-brand .navbar-link{color:#fff}.navbar.is-success .navbar-brand>a.navbar-item:focus,.navbar.is-success .navbar-brand>a.navbar-item:hover,.navbar.is-success .navbar-brand>a.navbar-item.is-active,.navbar.is-success .navbar-brand .navbar-link:focus,.navbar.is-success .navbar-brand .navbar-link:hover,.navbar.is-success .navbar-brand .navbar-link.is-active{background-color:#1ead51;color:#fff}.navbar.is-success .navbar-brand .navbar-link::after{border-color:#fff}.navbar.is-success .navbar-burger{color:#fff}@media screen and (min-width: 1056px){.navbar.is-success .navbar-start>.navbar-item,.navbar.is-success .navbar-start .navbar-link,.navbar.is-success .navbar-end>.navbar-item,.navbar.is-success .navbar-end .navbar-link{color:#fff}.navbar.is-success .navbar-start>a.navbar-item:focus,.navbar.is-success .navbar-start>a.navbar-item:hover,.navbar.is-success .navbar-start>a.navbar-item.is-active,.navbar.is-success .navbar-start .navbar-link:focus,.navbar.is-success .navbar-start .navbar-link:hover,.navbar.is-success .navbar-start .navbar-link.is-active,.navbar.is-success .navbar-end>a.navbar-item:focus,.navbar.is-success .navbar-end>a.navbar-item:hover,.navbar.is-success .navbar-end>a.navbar-item.is-active,.navbar.is-success .navbar-end .navbar-link:focus,.navbar.is-success .navbar-end .navbar-link:hover,.navbar.is-success .navbar-end .navbar-link.is-active{background-color:#1ead51;color:#fff}.navbar.is-success .navbar-start .navbar-link::after,.navbar.is-success .navbar-end .navbar-link::after{border-color:#fff}.navbar.is-success .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-success .navbar-item.has-dropdown:hover .navbar-link,.navbar.is-success .navbar-item.has-dropdown.is-active .navbar-link{background-color:#1ead51;color:#fff}.navbar.is-success .navbar-dropdown a.navbar-item.is-active{background-color:#22c35b;color:#fff}}.navbar.is-warning{background-color:#ffdd57;color:rgba(0,0,0,0.7)}.navbar.is-warning .navbar-brand>.navbar-item,.navbar.is-warning .navbar-brand .navbar-link{color:rgba(0,0,0,0.7)}.navbar.is-warning .navbar-brand>a.navbar-item:focus,.navbar.is-warning .navbar-brand>a.navbar-item:hover,.navbar.is-warning .navbar-brand>a.navbar-item.is-active,.navbar.is-warning .navbar-brand .navbar-link:focus,.navbar.is-warning .navbar-brand .navbar-link:hover,.navbar.is-warning .navbar-brand .navbar-link.is-active{background-color:#ffd83e;color:rgba(0,0,0,0.7)}.navbar.is-warning .navbar-brand .navbar-link::after{border-color:rgba(0,0,0,0.7)}.navbar.is-warning .navbar-burger{color:rgba(0,0,0,0.7)}@media screen and (min-width: 1056px){.navbar.is-warning .navbar-start>.navbar-item,.navbar.is-warning .navbar-start .navbar-link,.navbar.is-warning .navbar-end>.navbar-item,.navbar.is-warning .navbar-end .navbar-link{color:rgba(0,0,0,0.7)}.navbar.is-warning .navbar-start>a.navbar-item:focus,.navbar.is-warning .navbar-start>a.navbar-item:hover,.navbar.is-warning .navbar-start>a.navbar-item.is-active,.navbar.is-warning .navbar-start .navbar-link:focus,.navbar.is-warning .navbar-start .navbar-link:hover,.navbar.is-warning .navbar-start .navbar-link.is-active,.navbar.is-warning .navbar-end>a.navbar-item:focus,.navbar.is-warning .navbar-end>a.navbar-item:hover,.navbar.is-warning .navbar-end>a.navbar-item.is-active,.navbar.is-warning .navbar-end .navbar-link:focus,.navbar.is-warning .navbar-end .navbar-link:hover,.navbar.is-warning .navbar-end .navbar-link.is-active{background-color:#ffd83e;color:rgba(0,0,0,0.7)}.navbar.is-warning .navbar-start .navbar-link::after,.navbar.is-warning .navbar-end .navbar-link::after{border-color:rgba(0,0,0,0.7)}.navbar.is-warning .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-warning .navbar-item.has-dropdown:hover .navbar-link,.navbar.is-warning .navbar-item.has-dropdown.is-active .navbar-link{background-color:#ffd83e;color:rgba(0,0,0,0.7)}.navbar.is-warning .navbar-dropdown a.navbar-item.is-active{background-color:#ffdd57;color:rgba(0,0,0,0.7)}}.navbar.is-danger{background-color:#da0b00;color:#fff}.navbar.is-danger .navbar-brand>.navbar-item,.navbar.is-danger .navbar-brand .navbar-link{color:#fff}.navbar.is-danger .navbar-brand>a.navbar-item:focus,.navbar.is-danger .navbar-brand>a.navbar-item:hover,.navbar.is-danger .navbar-brand>a.navbar-item.is-active,.navbar.is-danger .navbar-brand .navbar-link:focus,.navbar.is-danger .navbar-brand .navbar-link:hover,.navbar.is-danger .navbar-brand .navbar-link.is-active{background-color:#c10a00;color:#fff}.navbar.is-danger .navbar-brand .navbar-link::after{border-color:#fff}.navbar.is-danger .navbar-burger{color:#fff}@media screen and (min-width: 1056px){.navbar.is-danger .navbar-start>.navbar-item,.navbar.is-danger .navbar-start .navbar-link,.navbar.is-danger .navbar-end>.navbar-item,.navbar.is-danger .navbar-end .navbar-link{color:#fff}.navbar.is-danger .navbar-start>a.navbar-item:focus,.navbar.is-danger .navbar-start>a.navbar-item:hover,.navbar.is-danger .navbar-start>a.navbar-item.is-active,.navbar.is-danger .navbar-start .navbar-link:focus,.navbar.is-danger .navbar-start .navbar-link:hover,.navbar.is-danger .navbar-start .navbar-link.is-active,.navbar.is-danger .navbar-end>a.navbar-item:focus,.navbar.is-danger .navbar-end>a.navbar-item:hover,.navbar.is-danger .navbar-end>a.navbar-item.is-active,.navbar.is-danger .navbar-end .navbar-link:focus,.navbar.is-danger .navbar-end .navbar-link:hover,.navbar.is-danger .navbar-end .navbar-link.is-active{background-color:#c10a00;color:#fff}.navbar.is-danger .navbar-start .navbar-link::after,.navbar.is-danger .navbar-end .navbar-link::after{border-color:#fff}.navbar.is-danger .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-danger .navbar-item.has-dropdown:hover .navbar-link,.navbar.is-danger .navbar-item.has-dropdown.is-active .navbar-link{background-color:#c10a00;color:#fff}.navbar.is-danger .navbar-dropdown a.navbar-item.is-active{background-color:#da0b00;color:#fff}}.navbar>.container{align-items:stretch;display:flex;min-height:3.25rem;width:100%}.navbar.has-shadow{box-shadow:0 2px 0 0 #f5f5f5}.navbar.is-fixed-bottom,.navbar.is-fixed-top{left:0;position:fixed;right:0;z-index:30}.navbar.is-fixed-bottom{bottom:0}.navbar.is-fixed-bottom.has-shadow{box-shadow:0 -2px 0 0 #f5f5f5}.navbar.is-fixed-top{top:0}html.has-navbar-fixed-top,body.has-navbar-fixed-top{padding-top:3.25rem}html.has-navbar-fixed-bottom,body.has-navbar-fixed-bottom{padding-bottom:3.25rem}.navbar-brand,.navbar-tabs{align-items:stretch;display:flex;flex-shrink:0;min-height:3.25rem}.navbar-brand a.navbar-item:focus,.navbar-brand a.navbar-item:hover{background-color:transparent}.navbar-tabs{-webkit-overflow-scrolling:touch;max-width:100vw;overflow-x:auto;overflow-y:hidden}.navbar-burger{color:#222;-moz-appearance:none;-webkit-appearance:none;appearance:none;background:none;border:none;cursor:pointer;display:block;height:3.25rem;position:relative;width:3.25rem;margin-left:auto}.navbar-burger span{background-color:currentColor;display:block;height:1px;left:calc(50% - 8px);position:absolute;transform-origin:center;transition-duration:86ms;transition-property:background-color, opacity, transform;transition-timing-function:ease-out;width:16px}.navbar-burger span:nth-child(1){top:calc(50% - 6px)}.navbar-burger span:nth-child(2){top:calc(50% - 1px)}.navbar-burger span:nth-child(3){top:calc(50% + 4px)}.navbar-burger:hover{background-color:rgba(0,0,0,0.05)}.navbar-burger.is-active span:nth-child(1){transform:translateY(5px) rotate(45deg)}.navbar-burger.is-active span:nth-child(2){opacity:0}.navbar-burger.is-active span:nth-child(3){transform:translateY(-5px) rotate(-45deg)}.navbar-menu{display:none}.navbar-item,.navbar-link{color:#222;display:block;line-height:1.5;padding:0.5rem 0.75rem;position:relative}.navbar-item .icon:only-child,.navbar-link .icon:only-child{margin-left:-0.25rem;margin-right:-0.25rem}a.navbar-item,.navbar-link{cursor:pointer}a.navbar-item:focus,a.navbar-item:focus-within,a.navbar-item:hover,a.navbar-item.is-active,.navbar-link:focus,.navbar-link:focus-within,.navbar-link:hover,.navbar-link.is-active{background-color:#fafafa;color:#2e63b8}.navbar-item{flex-grow:0;flex-shrink:0}.navbar-item img{max-height:1.75rem}.navbar-item.has-dropdown{padding:0}.navbar-item.is-expanded{flex-grow:1;flex-shrink:1}.navbar-item.is-tab{border-bottom:1px solid transparent;min-height:3.25rem;padding-bottom:calc(0.5rem - 1px)}.navbar-item.is-tab:focus,.navbar-item.is-tab:hover{background-color:rgba(0,0,0,0);border-bottom-color:#2e63b8}.navbar-item.is-tab.is-active{background-color:rgba(0,0,0,0);border-bottom-color:#2e63b8;border-bottom-style:solid;border-bottom-width:3px;color:#2e63b8;padding-bottom:calc(0.5rem - 3px)}.navbar-content{flex-grow:1;flex-shrink:1}.navbar-link:not(.is-arrowless){padding-right:2.5em}.navbar-link:not(.is-arrowless)::after{border-color:#2e63b8;margin-top:-0.375em;right:1.125em}.navbar-dropdown{font-size:0.875rem;padding-bottom:0.5rem;padding-top:0.5rem}.navbar-dropdown .navbar-item{padding-left:1.5rem;padding-right:1.5rem}.navbar-divider{background-color:#f5f5f5;border:none;display:none;height:2px;margin:0.5rem 0}@media screen and (max-width: 1055px){.navbar>.container{display:block}.navbar-brand .navbar-item,.navbar-tabs .navbar-item{align-items:center;display:flex}.navbar-link::after{display:none}.navbar-menu{background-color:#fff;box-shadow:0 8px 16px rgba(10,10,10,0.1);padding:0.5rem 0}.navbar-menu.is-active{display:block}.navbar.is-fixed-bottom-touch,.navbar.is-fixed-top-touch{left:0;position:fixed;right:0;z-index:30}.navbar.is-fixed-bottom-touch{bottom:0}.navbar.is-fixed-bottom-touch.has-shadow{box-shadow:0 -2px 3px rgba(10,10,10,0.1)}.navbar.is-fixed-top-touch{top:0}.navbar.is-fixed-top .navbar-menu,.navbar.is-fixed-top-touch .navbar-menu{-webkit-overflow-scrolling:touch;max-height:calc(100vh - 3.25rem);overflow:auto}html.has-navbar-fixed-top-touch,body.has-navbar-fixed-top-touch{padding-top:3.25rem}html.has-navbar-fixed-bottom-touch,body.has-navbar-fixed-bottom-touch{padding-bottom:3.25rem}}@media screen and (min-width: 1056px){.navbar,.navbar-menu,.navbar-start,.navbar-end{align-items:stretch;display:flex}.navbar{min-height:3.25rem}.navbar.is-spaced{padding:1rem 2rem}.navbar.is-spaced .navbar-start,.navbar.is-spaced .navbar-end{align-items:center}.navbar.is-spaced a.navbar-item,.navbar.is-spaced .navbar-link{border-radius:4px}.navbar.is-transparent a.navbar-item:focus,.navbar.is-transparent a.navbar-item:hover,.navbar.is-transparent a.navbar-item.is-active,.navbar.is-transparent .navbar-link:focus,.navbar.is-transparent .navbar-link:hover,.navbar.is-transparent .navbar-link.is-active{background-color:transparent !important}.navbar.is-transparent .navbar-item.has-dropdown.is-active .navbar-link,.navbar.is-transparent .navbar-item.has-dropdown.is-hoverable:focus .navbar-link,.navbar.is-transparent .navbar-item.has-dropdown.is-hoverable:focus-within .navbar-link,.navbar.is-transparent .navbar-item.has-dropdown.is-hoverable:hover .navbar-link{background-color:transparent !important}.navbar.is-transparent .navbar-dropdown a.navbar-item:focus,.navbar.is-transparent .navbar-dropdown a.navbar-item:hover{background-color:#f5f5f5;color:#0a0a0a}.navbar.is-transparent .navbar-dropdown a.navbar-item.is-active{background-color:#f5f5f5;color:#2e63b8}.navbar-burger{display:none}.navbar-item,.navbar-link{align-items:center;display:flex}.navbar-item.has-dropdown{align-items:stretch}.navbar-item.has-dropdown-up .navbar-link::after{transform:rotate(135deg) translate(0.25em, -0.25em)}.navbar-item.has-dropdown-up .navbar-dropdown{border-bottom:2px solid #dbdbdb;border-radius:6px 6px 0 0;border-top:none;bottom:100%;box-shadow:0 -8px 8px rgba(10,10,10,0.1);top:auto}.navbar-item.is-active .navbar-dropdown,.navbar-item.is-hoverable:focus .navbar-dropdown,.navbar-item.is-hoverable:focus-within .navbar-dropdown,.navbar-item.is-hoverable:hover .navbar-dropdown{display:block}.navbar.is-spaced .navbar-item.is-active .navbar-dropdown,.navbar-item.is-active .navbar-dropdown.is-boxed,.navbar.is-spaced .navbar-item.is-hoverable:focus .navbar-dropdown,.navbar-item.is-hoverable:focus .navbar-dropdown.is-boxed,.navbar.is-spaced .navbar-item.is-hoverable:focus-within .navbar-dropdown,.navbar-item.is-hoverable:focus-within .navbar-dropdown.is-boxed,.navbar.is-spaced .navbar-item.is-hoverable:hover .navbar-dropdown,.navbar-item.is-hoverable:hover .navbar-dropdown.is-boxed{opacity:1;pointer-events:auto;transform:translateY(0)}.navbar-menu{flex-grow:1;flex-shrink:0}.navbar-start{justify-content:flex-start;margin-right:auto}.navbar-end{justify-content:flex-end;margin-left:auto}.navbar-dropdown{background-color:#fff;border-bottom-left-radius:6px;border-bottom-right-radius:6px;border-top:2px solid #dbdbdb;box-shadow:0 8px 8px rgba(10,10,10,0.1);display:none;font-size:0.875rem;left:0;min-width:100%;position:absolute;top:100%;z-index:20}.navbar-dropdown .navbar-item{padding:0.375rem 1rem;white-space:nowrap}.navbar-dropdown a.navbar-item{padding-right:3rem}.navbar-dropdown a.navbar-item:focus,.navbar-dropdown a.navbar-item:hover{background-color:#f5f5f5;color:#0a0a0a}.navbar-dropdown a.navbar-item.is-active{background-color:#f5f5f5;color:#2e63b8}.navbar.is-spaced .navbar-dropdown,.navbar-dropdown.is-boxed{border-radius:6px;border-top:none;box-shadow:0 8px 8px rgba(10,10,10,0.1), 0 0 0 1px rgba(10,10,10,0.1);display:block;opacity:0;pointer-events:none;top:calc(100% + (-4px));transform:translateY(-5px);transition-duration:86ms;transition-property:opacity, transform}.navbar-dropdown.is-right{left:auto;right:0}.navbar-divider{display:block}.navbar>.container .navbar-brand,.container>.navbar .navbar-brand{margin-left:-.75rem}.navbar>.container .navbar-menu,.container>.navbar .navbar-menu{margin-right:-.75rem}.navbar.is-fixed-bottom-desktop,.navbar.is-fixed-top-desktop{left:0;position:fixed;right:0;z-index:30}.navbar.is-fixed-bottom-desktop{bottom:0}.navbar.is-fixed-bottom-desktop.has-shadow{box-shadow:0 -2px 3px rgba(10,10,10,0.1)}.navbar.is-fixed-top-desktop{top:0}html.has-navbar-fixed-top-desktop,body.has-navbar-fixed-top-desktop{padding-top:3.25rem}html.has-navbar-fixed-bottom-desktop,body.has-navbar-fixed-bottom-desktop{padding-bottom:3.25rem}html.has-spaced-navbar-fixed-top,body.has-spaced-navbar-fixed-top{padding-top:5.25rem}html.has-spaced-navbar-fixed-bottom,body.has-spaced-navbar-fixed-bottom{padding-bottom:5.25rem}a.navbar-item.is-active,.navbar-link.is-active{color:#0a0a0a}a.navbar-item.is-active:not(:focus):not(:hover),.navbar-link.is-active:not(:focus):not(:hover){background-color:rgba(0,0,0,0)}.navbar-item.has-dropdown:focus .navbar-link,.navbar-item.has-dropdown:hover .navbar-link,.navbar-item.has-dropdown.is-active .navbar-link{background-color:#fafafa}}.hero.is-fullheight-with-navbar{min-height:calc(100vh - 3.25rem)}.pagination{font-size:1rem;margin:-.25rem}.pagination.is-small,#documenter .docs-sidebar form.docs-search>input.pagination{font-size:.75rem}.pagination.is-medium{font-size:1.25rem}.pagination.is-large{font-size:1.5rem}.pagination.is-rounded .pagination-previous,#documenter .docs-sidebar form.docs-search>input.pagination .pagination-previous,.pagination.is-rounded .pagination-next,#documenter .docs-sidebar form.docs-search>input.pagination .pagination-next{padding-left:1em;padding-right:1em;border-radius:9999px}.pagination.is-rounded .pagination-link,#documenter .docs-sidebar form.docs-search>input.pagination .pagination-link{border-radius:9999px}.pagination,.pagination-list{align-items:center;display:flex;justify-content:center;text-align:center}.pagination-previous,.pagination-next,.pagination-link,.pagination-ellipsis{font-size:1em;justify-content:center;margin:.25rem;padding-left:.5em;padding-right:.5em;text-align:center}.pagination-previous,.pagination-next,.pagination-link{border-color:#dbdbdb;color:#222;min-width:2.5em}.pagination-previous:hover,.pagination-next:hover,.pagination-link:hover{border-color:#b5b5b5;color:#363636}.pagination-previous:focus,.pagination-next:focus,.pagination-link:focus{border-color:#3c5dcd}.pagination-previous:active,.pagination-next:active,.pagination-link:active{box-shadow:inset 0 1px 2px rgba(10,10,10,0.2)}.pagination-previous[disabled],.pagination-previous.is-disabled,.pagination-next[disabled],.pagination-next.is-disabled,.pagination-link[disabled],.pagination-link.is-disabled{background-color:#dbdbdb;border-color:#dbdbdb;box-shadow:none;color:#6b6b6b;opacity:0.5}.pagination-previous,.pagination-next{padding-left:.75em;padding-right:.75em;white-space:nowrap}.pagination-link.is-current{background-color:#2e63b8;border-color:#2e63b8;color:#fff}.pagination-ellipsis{color:#b5b5b5;pointer-events:none}.pagination-list{flex-wrap:wrap}.pagination-list li{list-style:none}@media screen and (max-width: 768px){.pagination{flex-wrap:wrap}.pagination-previous,.pagination-next{flex-grow:1;flex-shrink:1}.pagination-list li{flex-grow:1;flex-shrink:1}}@media screen and (min-width: 769px),print{.pagination-list{flex-grow:1;flex-shrink:1;justify-content:flex-start;order:1}.pagination-previous,.pagination-next,.pagination-link,.pagination-ellipsis{margin-bottom:0;margin-top:0}.pagination-previous{order:2}.pagination-next{order:3}.pagination{justify-content:space-between;margin-bottom:0;margin-top:0}.pagination.is-centered .pagination-previous{order:1}.pagination.is-centered .pagination-list{justify-content:center;order:2}.pagination.is-centered .pagination-next{order:3}.pagination.is-right .pagination-previous{order:1}.pagination.is-right .pagination-next{order:2}.pagination.is-right .pagination-list{justify-content:flex-end;order:3}}.panel{border-radius:6px;box-shadow:#bbb;font-size:1rem}.panel:not(:last-child){margin-bottom:1.5rem}.panel.is-white .panel-heading{background-color:#fff;color:#0a0a0a}.panel.is-white .panel-tabs a.is-active{border-bottom-color:#fff}.panel.is-white .panel-block.is-active .panel-icon{color:#fff}.panel.is-black .panel-heading{background-color:#0a0a0a;color:#fff}.panel.is-black .panel-tabs a.is-active{border-bottom-color:#0a0a0a}.panel.is-black .panel-block.is-active .panel-icon{color:#0a0a0a}.panel.is-light .panel-heading{background-color:#f5f5f5;color:rgba(0,0,0,0.7)}.panel.is-light .panel-tabs a.is-active{border-bottom-color:#f5f5f5}.panel.is-light .panel-block.is-active .panel-icon{color:#f5f5f5}.panel.is-dark .panel-heading,.content kbd.panel .panel-heading{background-color:#363636;color:#fff}.panel.is-dark .panel-tabs a.is-active,.content kbd.panel .panel-tabs a.is-active{border-bottom-color:#363636}.panel.is-dark .panel-block.is-active .panel-icon,.content kbd.panel .panel-block.is-active .panel-icon{color:#363636}.panel.is-primary .panel-heading,.docstring>section>a.panel.docs-sourcelink .panel-heading{background-color:#4eb5de;color:#fff}.panel.is-primary .panel-tabs a.is-active,.docstring>section>a.panel.docs-sourcelink .panel-tabs a.is-active{border-bottom-color:#4eb5de}.panel.is-primary .panel-block.is-active .panel-icon,.docstring>section>a.panel.docs-sourcelink .panel-block.is-active .panel-icon{color:#4eb5de}.panel.is-link .panel-heading{background-color:#2e63b8;color:#fff}.panel.is-link .panel-tabs a.is-active{border-bottom-color:#2e63b8}.panel.is-link .panel-block.is-active .panel-icon{color:#2e63b8}.panel.is-info .panel-heading{background-color:#209cee;color:#fff}.panel.is-info .panel-tabs a.is-active{border-bottom-color:#209cee}.panel.is-info .panel-block.is-active .panel-icon{color:#209cee}.panel.is-success .panel-heading{background-color:#22c35b;color:#fff}.panel.is-success .panel-tabs a.is-active{border-bottom-color:#22c35b}.panel.is-success .panel-block.is-active .panel-icon{color:#22c35b}.panel.is-warning .panel-heading{background-color:#ffdd57;color:rgba(0,0,0,0.7)}.panel.is-warning .panel-tabs a.is-active{border-bottom-color:#ffdd57}.panel.is-warning .panel-block.is-active .panel-icon{color:#ffdd57}.panel.is-danger .panel-heading{background-color:#da0b00;color:#fff}.panel.is-danger .panel-tabs a.is-active{border-bottom-color:#da0b00}.panel.is-danger .panel-block.is-active .panel-icon{color:#da0b00}.panel-tabs:not(:last-child),.panel-block:not(:last-child){border-bottom:1px solid #ededed}.panel-heading{background-color:#ededed;border-radius:6px 6px 0 0;color:#222;font-size:1.25em;font-weight:700;line-height:1.25;padding:0.75em 1em}.panel-tabs{align-items:flex-end;display:flex;font-size:.875em;justify-content:center}.panel-tabs a{border-bottom:1px solid #dbdbdb;margin-bottom:-1px;padding:0.5em}.panel-tabs a.is-active{border-bottom-color:#4a4a4a;color:#363636}.panel-list a{color:#222}.panel-list a:hover{color:#2e63b8}.panel-block{align-items:center;color:#222;display:flex;justify-content:flex-start;padding:0.5em 0.75em}.panel-block input[type="checkbox"]{margin-right:.75em}.panel-block>.control{flex-grow:1;flex-shrink:1;width:100%}.panel-block.is-wrapped{flex-wrap:wrap}.panel-block.is-active{border-left-color:#2e63b8;color:#363636}.panel-block.is-active .panel-icon{color:#2e63b8}.panel-block:last-child{border-bottom-left-radius:6px;border-bottom-right-radius:6px}a.panel-block,label.panel-block{cursor:pointer}a.panel-block:hover,label.panel-block:hover{background-color:#f5f5f5}.panel-icon{display:inline-block;font-size:14px;height:1em;line-height:1em;text-align:center;vertical-align:top;width:1em;color:#6b6b6b;margin-right:.75em}.panel-icon .fa{font-size:inherit;line-height:inherit}.tabs{-webkit-overflow-scrolling:touch;align-items:stretch;display:flex;font-size:1rem;justify-content:space-between;overflow:hidden;overflow-x:auto;white-space:nowrap}.tabs a{align-items:center;border-bottom-color:#dbdbdb;border-bottom-style:solid;border-bottom-width:1px;color:#222;display:flex;justify-content:center;margin-bottom:-1px;padding:0.5em 1em;vertical-align:top}.tabs a:hover{border-bottom-color:#222;color:#222}.tabs li{display:block}.tabs li.is-active a{border-bottom-color:#2e63b8;color:#2e63b8}.tabs ul{align-items:center;border-bottom-color:#dbdbdb;border-bottom-style:solid;border-bottom-width:1px;display:flex;flex-grow:1;flex-shrink:0;justify-content:flex-start}.tabs ul.is-left{padding-right:0.75em}.tabs ul.is-center{flex:none;justify-content:center;padding-left:0.75em;padding-right:0.75em}.tabs ul.is-right{justify-content:flex-end;padding-left:0.75em}.tabs .icon:first-child{margin-right:.5em}.tabs .icon:last-child{margin-left:.5em}.tabs.is-centered ul{justify-content:center}.tabs.is-right ul{justify-content:flex-end}.tabs.is-boxed a{border:1px solid transparent;border-radius:4px 4px 0 0}.tabs.is-boxed a:hover{background-color:#f5f5f5;border-bottom-color:#dbdbdb}.tabs.is-boxed li.is-active a{background-color:#fff;border-color:#dbdbdb;border-bottom-color:rgba(0,0,0,0) !important}.tabs.is-fullwidth li{flex-grow:1;flex-shrink:0}.tabs.is-toggle a{border-color:#dbdbdb;border-style:solid;border-width:1px;margin-bottom:0;position:relative}.tabs.is-toggle a:hover{background-color:#f5f5f5;border-color:#b5b5b5;z-index:2}.tabs.is-toggle li+li{margin-left:-1px}.tabs.is-toggle li:first-child a{border-top-left-radius:4px;border-bottom-left-radius:4px}.tabs.is-toggle li:last-child a{border-top-right-radius:4px;border-bottom-right-radius:4px}.tabs.is-toggle li.is-active a{background-color:#2e63b8;border-color:#2e63b8;color:#fff;z-index:1}.tabs.is-toggle ul{border-bottom:none}.tabs.is-toggle.is-toggle-rounded li:first-child a{border-bottom-left-radius:9999px;border-top-left-radius:9999px;padding-left:1.25em}.tabs.is-toggle.is-toggle-rounded li:last-child a{border-bottom-right-radius:9999px;border-top-right-radius:9999px;padding-right:1.25em}.tabs.is-small,#documenter .docs-sidebar form.docs-search>input.tabs{font-size:.75rem}.tabs.is-medium{font-size:1.25rem}.tabs.is-large{font-size:1.5rem}.column{display:block;flex-basis:0;flex-grow:1;flex-shrink:1;padding:.75rem}.columns.is-mobile>.column.is-narrow{flex:none;width:unset}.columns.is-mobile>.column.is-full{flex:none;width:100%}.columns.is-mobile>.column.is-three-quarters{flex:none;width:75%}.columns.is-mobile>.column.is-two-thirds{flex:none;width:66.6666%}.columns.is-mobile>.column.is-half{flex:none;width:50%}.columns.is-mobile>.column.is-one-third{flex:none;width:33.3333%}.columns.is-mobile>.column.is-one-quarter{flex:none;width:25%}.columns.is-mobile>.column.is-one-fifth{flex:none;width:20%}.columns.is-mobile>.column.is-two-fifths{flex:none;width:40%}.columns.is-mobile>.column.is-three-fifths{flex:none;width:60%}.columns.is-mobile>.column.is-four-fifths{flex:none;width:80%}.columns.is-mobile>.column.is-offset-three-quarters{margin-left:75%}.columns.is-mobile>.column.is-offset-two-thirds{margin-left:66.6666%}.columns.is-mobile>.column.is-offset-half{margin-left:50%}.columns.is-mobile>.column.is-offset-one-third{margin-left:33.3333%}.columns.is-mobile>.column.is-offset-one-quarter{margin-left:25%}.columns.is-mobile>.column.is-offset-one-fifth{margin-left:20%}.columns.is-mobile>.column.is-offset-two-fifths{margin-left:40%}.columns.is-mobile>.column.is-offset-three-fifths{margin-left:60%}.columns.is-mobile>.column.is-offset-four-fifths{margin-left:80%}.columns.is-mobile>.column.is-0{flex:none;width:0%}.columns.is-mobile>.column.is-offset-0{margin-left:0%}.columns.is-mobile>.column.is-1{flex:none;width:8.33333337%}.columns.is-mobile>.column.is-offset-1{margin-left:8.33333337%}.columns.is-mobile>.column.is-2{flex:none;width:16.66666674%}.columns.is-mobile>.column.is-offset-2{margin-left:16.66666674%}.columns.is-mobile>.column.is-3{flex:none;width:25%}.columns.is-mobile>.column.is-offset-3{margin-left:25%}.columns.is-mobile>.column.is-4{flex:none;width:33.33333337%}.columns.is-mobile>.column.is-offset-4{margin-left:33.33333337%}.columns.is-mobile>.column.is-5{flex:none;width:41.66666674%}.columns.is-mobile>.column.is-offset-5{margin-left:41.66666674%}.columns.is-mobile>.column.is-6{flex:none;width:50%}.columns.is-mobile>.column.is-offset-6{margin-left:50%}.columns.is-mobile>.column.is-7{flex:none;width:58.33333337%}.columns.is-mobile>.column.is-offset-7{margin-left:58.33333337%}.columns.is-mobile>.column.is-8{flex:none;width:66.66666674%}.columns.is-mobile>.column.is-offset-8{margin-left:66.66666674%}.columns.is-mobile>.column.is-9{flex:none;width:75%}.columns.is-mobile>.column.is-offset-9{margin-left:75%}.columns.is-mobile>.column.is-10{flex:none;width:83.33333337%}.columns.is-mobile>.column.is-offset-10{margin-left:83.33333337%}.columns.is-mobile>.column.is-11{flex:none;width:91.66666674%}.columns.is-mobile>.column.is-offset-11{margin-left:91.66666674%}.columns.is-mobile>.column.is-12{flex:none;width:100%}.columns.is-mobile>.column.is-offset-12{margin-left:100%}@media screen and (max-width: 768px){.column.is-narrow-mobile{flex:none;width:unset}.column.is-full-mobile{flex:none;width:100%}.column.is-three-quarters-mobile{flex:none;width:75%}.column.is-two-thirds-mobile{flex:none;width:66.6666%}.column.is-half-mobile{flex:none;width:50%}.column.is-one-third-mobile{flex:none;width:33.3333%}.column.is-one-quarter-mobile{flex:none;width:25%}.column.is-one-fifth-mobile{flex:none;width:20%}.column.is-two-fifths-mobile{flex:none;width:40%}.column.is-three-fifths-mobile{flex:none;width:60%}.column.is-four-fifths-mobile{flex:none;width:80%}.column.is-offset-three-quarters-mobile{margin-left:75%}.column.is-offset-two-thirds-mobile{margin-left:66.6666%}.column.is-offset-half-mobile{margin-left:50%}.column.is-offset-one-third-mobile{margin-left:33.3333%}.column.is-offset-one-quarter-mobile{margin-left:25%}.column.is-offset-one-fifth-mobile{margin-left:20%}.column.is-offset-two-fifths-mobile{margin-left:40%}.column.is-offset-three-fifths-mobile{margin-left:60%}.column.is-offset-four-fifths-mobile{margin-left:80%}.column.is-0-mobile{flex:none;width:0%}.column.is-offset-0-mobile{margin-left:0%}.column.is-1-mobile{flex:none;width:8.33333337%}.column.is-offset-1-mobile{margin-left:8.33333337%}.column.is-2-mobile{flex:none;width:16.66666674%}.column.is-offset-2-mobile{margin-left:16.66666674%}.column.is-3-mobile{flex:none;width:25%}.column.is-offset-3-mobile{margin-left:25%}.column.is-4-mobile{flex:none;width:33.33333337%}.column.is-offset-4-mobile{margin-left:33.33333337%}.column.is-5-mobile{flex:none;width:41.66666674%}.column.is-offset-5-mobile{margin-left:41.66666674%}.column.is-6-mobile{flex:none;width:50%}.column.is-offset-6-mobile{margin-left:50%}.column.is-7-mobile{flex:none;width:58.33333337%}.column.is-offset-7-mobile{margin-left:58.33333337%}.column.is-8-mobile{flex:none;width:66.66666674%}.column.is-offset-8-mobile{margin-left:66.66666674%}.column.is-9-mobile{flex:none;width:75%}.column.is-offset-9-mobile{margin-left:75%}.column.is-10-mobile{flex:none;width:83.33333337%}.column.is-offset-10-mobile{margin-left:83.33333337%}.column.is-11-mobile{flex:none;width:91.66666674%}.column.is-offset-11-mobile{margin-left:91.66666674%}.column.is-12-mobile{flex:none;width:100%}.column.is-offset-12-mobile{margin-left:100%}}@media screen and (min-width: 769px),print{.column.is-narrow,.column.is-narrow-tablet{flex:none;width:unset}.column.is-full,.column.is-full-tablet{flex:none;width:100%}.column.is-three-quarters,.column.is-three-quarters-tablet{flex:none;width:75%}.column.is-two-thirds,.column.is-two-thirds-tablet{flex:none;width:66.6666%}.column.is-half,.column.is-half-tablet{flex:none;width:50%}.column.is-one-third,.column.is-one-third-tablet{flex:none;width:33.3333%}.column.is-one-quarter,.column.is-one-quarter-tablet{flex:none;width:25%}.column.is-one-fifth,.column.is-one-fifth-tablet{flex:none;width:20%}.column.is-two-fifths,.column.is-two-fifths-tablet{flex:none;width:40%}.column.is-three-fifths,.column.is-three-fifths-tablet{flex:none;width:60%}.column.is-four-fifths,.column.is-four-fifths-tablet{flex:none;width:80%}.column.is-offset-three-quarters,.column.is-offset-three-quarters-tablet{margin-left:75%}.column.is-offset-two-thirds,.column.is-offset-two-thirds-tablet{margin-left:66.6666%}.column.is-offset-half,.column.is-offset-half-tablet{margin-left:50%}.column.is-offset-one-third,.column.is-offset-one-third-tablet{margin-left:33.3333%}.column.is-offset-one-quarter,.column.is-offset-one-quarter-tablet{margin-left:25%}.column.is-offset-one-fifth,.column.is-offset-one-fifth-tablet{margin-left:20%}.column.is-offset-two-fifths,.column.is-offset-two-fifths-tablet{margin-left:40%}.column.is-offset-three-fifths,.column.is-offset-three-fifths-tablet{margin-left:60%}.column.is-offset-four-fifths,.column.is-offset-four-fifths-tablet{margin-left:80%}.column.is-0,.column.is-0-tablet{flex:none;width:0%}.column.is-offset-0,.column.is-offset-0-tablet{margin-left:0%}.column.is-1,.column.is-1-tablet{flex:none;width:8.33333337%}.column.is-offset-1,.column.is-offset-1-tablet{margin-left:8.33333337%}.column.is-2,.column.is-2-tablet{flex:none;width:16.66666674%}.column.is-offset-2,.column.is-offset-2-tablet{margin-left:16.66666674%}.column.is-3,.column.is-3-tablet{flex:none;width:25%}.column.is-offset-3,.column.is-offset-3-tablet{margin-left:25%}.column.is-4,.column.is-4-tablet{flex:none;width:33.33333337%}.column.is-offset-4,.column.is-offset-4-tablet{margin-left:33.33333337%}.column.is-5,.column.is-5-tablet{flex:none;width:41.66666674%}.column.is-offset-5,.column.is-offset-5-tablet{margin-left:41.66666674%}.column.is-6,.column.is-6-tablet{flex:none;width:50%}.column.is-offset-6,.column.is-offset-6-tablet{margin-left:50%}.column.is-7,.column.is-7-tablet{flex:none;width:58.33333337%}.column.is-offset-7,.column.is-offset-7-tablet{margin-left:58.33333337%}.column.is-8,.column.is-8-tablet{flex:none;width:66.66666674%}.column.is-offset-8,.column.is-offset-8-tablet{margin-left:66.66666674%}.column.is-9,.column.is-9-tablet{flex:none;width:75%}.column.is-offset-9,.column.is-offset-9-tablet{margin-left:75%}.column.is-10,.column.is-10-tablet{flex:none;width:83.33333337%}.column.is-offset-10,.column.is-offset-10-tablet{margin-left:83.33333337%}.column.is-11,.column.is-11-tablet{flex:none;width:91.66666674%}.column.is-offset-11,.column.is-offset-11-tablet{margin-left:91.66666674%}.column.is-12,.column.is-12-tablet{flex:none;width:100%}.column.is-offset-12,.column.is-offset-12-tablet{margin-left:100%}}@media screen and (max-width: 1055px){.column.is-narrow-touch{flex:none;width:unset}.column.is-full-touch{flex:none;width:100%}.column.is-three-quarters-touch{flex:none;width:75%}.column.is-two-thirds-touch{flex:none;width:66.6666%}.column.is-half-touch{flex:none;width:50%}.column.is-one-third-touch{flex:none;width:33.3333%}.column.is-one-quarter-touch{flex:none;width:25%}.column.is-one-fifth-touch{flex:none;width:20%}.column.is-two-fifths-touch{flex:none;width:40%}.column.is-three-fifths-touch{flex:none;width:60%}.column.is-four-fifths-touch{flex:none;width:80%}.column.is-offset-three-quarters-touch{margin-left:75%}.column.is-offset-two-thirds-touch{margin-left:66.6666%}.column.is-offset-half-touch{margin-left:50%}.column.is-offset-one-third-touch{margin-left:33.3333%}.column.is-offset-one-quarter-touch{margin-left:25%}.column.is-offset-one-fifth-touch{margin-left:20%}.column.is-offset-two-fifths-touch{margin-left:40%}.column.is-offset-three-fifths-touch{margin-left:60%}.column.is-offset-four-fifths-touch{margin-left:80%}.column.is-0-touch{flex:none;width:0%}.column.is-offset-0-touch{margin-left:0%}.column.is-1-touch{flex:none;width:8.33333337%}.column.is-offset-1-touch{margin-left:8.33333337%}.column.is-2-touch{flex:none;width:16.66666674%}.column.is-offset-2-touch{margin-left:16.66666674%}.column.is-3-touch{flex:none;width:25%}.column.is-offset-3-touch{margin-left:25%}.column.is-4-touch{flex:none;width:33.33333337%}.column.is-offset-4-touch{margin-left:33.33333337%}.column.is-5-touch{flex:none;width:41.66666674%}.column.is-offset-5-touch{margin-left:41.66666674%}.column.is-6-touch{flex:none;width:50%}.column.is-offset-6-touch{margin-left:50%}.column.is-7-touch{flex:none;width:58.33333337%}.column.is-offset-7-touch{margin-left:58.33333337%}.column.is-8-touch{flex:none;width:66.66666674%}.column.is-offset-8-touch{margin-left:66.66666674%}.column.is-9-touch{flex:none;width:75%}.column.is-offset-9-touch{margin-left:75%}.column.is-10-touch{flex:none;width:83.33333337%}.column.is-offset-10-touch{margin-left:83.33333337%}.column.is-11-touch{flex:none;width:91.66666674%}.column.is-offset-11-touch{margin-left:91.66666674%}.column.is-12-touch{flex:none;width:100%}.column.is-offset-12-touch{margin-left:100%}}@media screen and (min-width: 1056px){.column.is-narrow-desktop{flex:none;width:unset}.column.is-full-desktop{flex:none;width:100%}.column.is-three-quarters-desktop{flex:none;width:75%}.column.is-two-thirds-desktop{flex:none;width:66.6666%}.column.is-half-desktop{flex:none;width:50%}.column.is-one-third-desktop{flex:none;width:33.3333%}.column.is-one-quarter-desktop{flex:none;width:25%}.column.is-one-fifth-desktop{flex:none;width:20%}.column.is-two-fifths-desktop{flex:none;width:40%}.column.is-three-fifths-desktop{flex:none;width:60%}.column.is-four-fifths-desktop{flex:none;width:80%}.column.is-offset-three-quarters-desktop{margin-left:75%}.column.is-offset-two-thirds-desktop{margin-left:66.6666%}.column.is-offset-half-desktop{margin-left:50%}.column.is-offset-one-third-desktop{margin-left:33.3333%}.column.is-offset-one-quarter-desktop{margin-left:25%}.column.is-offset-one-fifth-desktop{margin-left:20%}.column.is-offset-two-fifths-desktop{margin-left:40%}.column.is-offset-three-fifths-desktop{margin-left:60%}.column.is-offset-four-fifths-desktop{margin-left:80%}.column.is-0-desktop{flex:none;width:0%}.column.is-offset-0-desktop{margin-left:0%}.column.is-1-desktop{flex:none;width:8.33333337%}.column.is-offset-1-desktop{margin-left:8.33333337%}.column.is-2-desktop{flex:none;width:16.66666674%}.column.is-offset-2-desktop{margin-left:16.66666674%}.column.is-3-desktop{flex:none;width:25%}.column.is-offset-3-desktop{margin-left:25%}.column.is-4-desktop{flex:none;width:33.33333337%}.column.is-offset-4-desktop{margin-left:33.33333337%}.column.is-5-desktop{flex:none;width:41.66666674%}.column.is-offset-5-desktop{margin-left:41.66666674%}.column.is-6-desktop{flex:none;width:50%}.column.is-offset-6-desktop{margin-left:50%}.column.is-7-desktop{flex:none;width:58.33333337%}.column.is-offset-7-desktop{margin-left:58.33333337%}.column.is-8-desktop{flex:none;width:66.66666674%}.column.is-offset-8-desktop{margin-left:66.66666674%}.column.is-9-desktop{flex:none;width:75%}.column.is-offset-9-desktop{margin-left:75%}.column.is-10-desktop{flex:none;width:83.33333337%}.column.is-offset-10-desktop{margin-left:83.33333337%}.column.is-11-desktop{flex:none;width:91.66666674%}.column.is-offset-11-desktop{margin-left:91.66666674%}.column.is-12-desktop{flex:none;width:100%}.column.is-offset-12-desktop{margin-left:100%}}@media screen and (min-width: 1216px){.column.is-narrow-widescreen{flex:none;width:unset}.column.is-full-widescreen{flex:none;width:100%}.column.is-three-quarters-widescreen{flex:none;width:75%}.column.is-two-thirds-widescreen{flex:none;width:66.6666%}.column.is-half-widescreen{flex:none;width:50%}.column.is-one-third-widescreen{flex:none;width:33.3333%}.column.is-one-quarter-widescreen{flex:none;width:25%}.column.is-one-fifth-widescreen{flex:none;width:20%}.column.is-two-fifths-widescreen{flex:none;width:40%}.column.is-three-fifths-widescreen{flex:none;width:60%}.column.is-four-fifths-widescreen{flex:none;width:80%}.column.is-offset-three-quarters-widescreen{margin-left:75%}.column.is-offset-two-thirds-widescreen{margin-left:66.6666%}.column.is-offset-half-widescreen{margin-left:50%}.column.is-offset-one-third-widescreen{margin-left:33.3333%}.column.is-offset-one-quarter-widescreen{margin-left:25%}.column.is-offset-one-fifth-widescreen{margin-left:20%}.column.is-offset-two-fifths-widescreen{margin-left:40%}.column.is-offset-three-fifths-widescreen{margin-left:60%}.column.is-offset-four-fifths-widescreen{margin-left:80%}.column.is-0-widescreen{flex:none;width:0%}.column.is-offset-0-widescreen{margin-left:0%}.column.is-1-widescreen{flex:none;width:8.33333337%}.column.is-offset-1-widescreen{margin-left:8.33333337%}.column.is-2-widescreen{flex:none;width:16.66666674%}.column.is-offset-2-widescreen{margin-left:16.66666674%}.column.is-3-widescreen{flex:none;width:25%}.column.is-offset-3-widescreen{margin-left:25%}.column.is-4-widescreen{flex:none;width:33.33333337%}.column.is-offset-4-widescreen{margin-left:33.33333337%}.column.is-5-widescreen{flex:none;width:41.66666674%}.column.is-offset-5-widescreen{margin-left:41.66666674%}.column.is-6-widescreen{flex:none;width:50%}.column.is-offset-6-widescreen{margin-left:50%}.column.is-7-widescreen{flex:none;width:58.33333337%}.column.is-offset-7-widescreen{margin-left:58.33333337%}.column.is-8-widescreen{flex:none;width:66.66666674%}.column.is-offset-8-widescreen{margin-left:66.66666674%}.column.is-9-widescreen{flex:none;width:75%}.column.is-offset-9-widescreen{margin-left:75%}.column.is-10-widescreen{flex:none;width:83.33333337%}.column.is-offset-10-widescreen{margin-left:83.33333337%}.column.is-11-widescreen{flex:none;width:91.66666674%}.column.is-offset-11-widescreen{margin-left:91.66666674%}.column.is-12-widescreen{flex:none;width:100%}.column.is-offset-12-widescreen{margin-left:100%}}@media screen and (min-width: 1408px){.column.is-narrow-fullhd{flex:none;width:unset}.column.is-full-fullhd{flex:none;width:100%}.column.is-three-quarters-fullhd{flex:none;width:75%}.column.is-two-thirds-fullhd{flex:none;width:66.6666%}.column.is-half-fullhd{flex:none;width:50%}.column.is-one-third-fullhd{flex:none;width:33.3333%}.column.is-one-quarter-fullhd{flex:none;width:25%}.column.is-one-fifth-fullhd{flex:none;width:20%}.column.is-two-fifths-fullhd{flex:none;width:40%}.column.is-three-fifths-fullhd{flex:none;width:60%}.column.is-four-fifths-fullhd{flex:none;width:80%}.column.is-offset-three-quarters-fullhd{margin-left:75%}.column.is-offset-two-thirds-fullhd{margin-left:66.6666%}.column.is-offset-half-fullhd{margin-left:50%}.column.is-offset-one-third-fullhd{margin-left:33.3333%}.column.is-offset-one-quarter-fullhd{margin-left:25%}.column.is-offset-one-fifth-fullhd{margin-left:20%}.column.is-offset-two-fifths-fullhd{margin-left:40%}.column.is-offset-three-fifths-fullhd{margin-left:60%}.column.is-offset-four-fifths-fullhd{margin-left:80%}.column.is-0-fullhd{flex:none;width:0%}.column.is-offset-0-fullhd{margin-left:0%}.column.is-1-fullhd{flex:none;width:8.33333337%}.column.is-offset-1-fullhd{margin-left:8.33333337%}.column.is-2-fullhd{flex:none;width:16.66666674%}.column.is-offset-2-fullhd{margin-left:16.66666674%}.column.is-3-fullhd{flex:none;width:25%}.column.is-offset-3-fullhd{margin-left:25%}.column.is-4-fullhd{flex:none;width:33.33333337%}.column.is-offset-4-fullhd{margin-left:33.33333337%}.column.is-5-fullhd{flex:none;width:41.66666674%}.column.is-offset-5-fullhd{margin-left:41.66666674%}.column.is-6-fullhd{flex:none;width:50%}.column.is-offset-6-fullhd{margin-left:50%}.column.is-7-fullhd{flex:none;width:58.33333337%}.column.is-offset-7-fullhd{margin-left:58.33333337%}.column.is-8-fullhd{flex:none;width:66.66666674%}.column.is-offset-8-fullhd{margin-left:66.66666674%}.column.is-9-fullhd{flex:none;width:75%}.column.is-offset-9-fullhd{margin-left:75%}.column.is-10-fullhd{flex:none;width:83.33333337%}.column.is-offset-10-fullhd{margin-left:83.33333337%}.column.is-11-fullhd{flex:none;width:91.66666674%}.column.is-offset-11-fullhd{margin-left:91.66666674%}.column.is-12-fullhd{flex:none;width:100%}.column.is-offset-12-fullhd{margin-left:100%}}.columns{margin-left:-.75rem;margin-right:-.75rem;margin-top:-.75rem}.columns:last-child{margin-bottom:-.75rem}.columns:not(:last-child){margin-bottom:calc(1.5rem - .75rem)}.columns.is-centered{justify-content:center}.columns.is-gapless{margin-left:0;margin-right:0;margin-top:0}.columns.is-gapless>.column{margin:0;padding:0 !important}.columns.is-gapless:not(:last-child){margin-bottom:1.5rem}.columns.is-gapless:last-child{margin-bottom:0}.columns.is-mobile{display:flex}.columns.is-multiline{flex-wrap:wrap}.columns.is-vcentered{align-items:center}@media screen and (min-width: 769px),print{.columns:not(.is-desktop){display:flex}}@media screen and (min-width: 1056px){.columns.is-desktop{display:flex}}.columns.is-variable{--columnGap: 0.75rem;margin-left:calc(-1 * var(--columnGap));margin-right:calc(-1 * var(--columnGap))}.columns.is-variable>.column{padding-left:var(--columnGap);padding-right:var(--columnGap)}.columns.is-variable.is-0{--columnGap: 0rem}@media screen and (max-width: 768px){.columns.is-variable.is-0-mobile{--columnGap: 0rem}}@media screen and (min-width: 769px),print{.columns.is-variable.is-0-tablet{--columnGap: 0rem}}@media screen and (min-width: 769px) and (max-width: 1055px){.columns.is-variable.is-0-tablet-only{--columnGap: 0rem}}@media screen and (max-width: 1055px){.columns.is-variable.is-0-touch{--columnGap: 0rem}}@media screen and (min-width: 1056px){.columns.is-variable.is-0-desktop{--columnGap: 0rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){.columns.is-variable.is-0-desktop-only{--columnGap: 0rem}}@media screen and (min-width: 1216px){.columns.is-variable.is-0-widescreen{--columnGap: 0rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){.columns.is-variable.is-0-widescreen-only{--columnGap: 0rem}}@media screen and (min-width: 1408px){.columns.is-variable.is-0-fullhd{--columnGap: 0rem}}.columns.is-variable.is-1{--columnGap: .25rem}@media screen and (max-width: 768px){.columns.is-variable.is-1-mobile{--columnGap: .25rem}}@media screen and (min-width: 769px),print{.columns.is-variable.is-1-tablet{--columnGap: .25rem}}@media screen and (min-width: 769px) and (max-width: 1055px){.columns.is-variable.is-1-tablet-only{--columnGap: .25rem}}@media screen and (max-width: 1055px){.columns.is-variable.is-1-touch{--columnGap: .25rem}}@media screen and (min-width: 1056px){.columns.is-variable.is-1-desktop{--columnGap: .25rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){.columns.is-variable.is-1-desktop-only{--columnGap: .25rem}}@media screen and (min-width: 1216px){.columns.is-variable.is-1-widescreen{--columnGap: .25rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){.columns.is-variable.is-1-widescreen-only{--columnGap: .25rem}}@media screen and (min-width: 1408px){.columns.is-variable.is-1-fullhd{--columnGap: .25rem}}.columns.is-variable.is-2{--columnGap: .5rem}@media screen and (max-width: 768px){.columns.is-variable.is-2-mobile{--columnGap: .5rem}}@media screen and (min-width: 769px),print{.columns.is-variable.is-2-tablet{--columnGap: .5rem}}@media screen and (min-width: 769px) and (max-width: 1055px){.columns.is-variable.is-2-tablet-only{--columnGap: .5rem}}@media screen and (max-width: 1055px){.columns.is-variable.is-2-touch{--columnGap: .5rem}}@media screen and (min-width: 1056px){.columns.is-variable.is-2-desktop{--columnGap: .5rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){.columns.is-variable.is-2-desktop-only{--columnGap: .5rem}}@media screen and (min-width: 1216px){.columns.is-variable.is-2-widescreen{--columnGap: .5rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){.columns.is-variable.is-2-widescreen-only{--columnGap: .5rem}}@media screen and (min-width: 1408px){.columns.is-variable.is-2-fullhd{--columnGap: .5rem}}.columns.is-variable.is-3{--columnGap: .75rem}@media screen and (max-width: 768px){.columns.is-variable.is-3-mobile{--columnGap: .75rem}}@media screen and (min-width: 769px),print{.columns.is-variable.is-3-tablet{--columnGap: .75rem}}@media screen and (min-width: 769px) and (max-width: 1055px){.columns.is-variable.is-3-tablet-only{--columnGap: .75rem}}@media screen and (max-width: 1055px){.columns.is-variable.is-3-touch{--columnGap: .75rem}}@media screen and (min-width: 1056px){.columns.is-variable.is-3-desktop{--columnGap: .75rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){.columns.is-variable.is-3-desktop-only{--columnGap: .75rem}}@media screen and (min-width: 1216px){.columns.is-variable.is-3-widescreen{--columnGap: .75rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){.columns.is-variable.is-3-widescreen-only{--columnGap: .75rem}}@media screen and (min-width: 1408px){.columns.is-variable.is-3-fullhd{--columnGap: .75rem}}.columns.is-variable.is-4{--columnGap: 1rem}@media screen and (max-width: 768px){.columns.is-variable.is-4-mobile{--columnGap: 1rem}}@media screen and (min-width: 769px),print{.columns.is-variable.is-4-tablet{--columnGap: 1rem}}@media screen and (min-width: 769px) and (max-width: 1055px){.columns.is-variable.is-4-tablet-only{--columnGap: 1rem}}@media screen and (max-width: 1055px){.columns.is-variable.is-4-touch{--columnGap: 1rem}}@media screen and (min-width: 1056px){.columns.is-variable.is-4-desktop{--columnGap: 1rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){.columns.is-variable.is-4-desktop-only{--columnGap: 1rem}}@media screen and (min-width: 1216px){.columns.is-variable.is-4-widescreen{--columnGap: 1rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){.columns.is-variable.is-4-widescreen-only{--columnGap: 1rem}}@media screen and (min-width: 1408px){.columns.is-variable.is-4-fullhd{--columnGap: 1rem}}.columns.is-variable.is-5{--columnGap: 1.25rem}@media screen and (max-width: 768px){.columns.is-variable.is-5-mobile{--columnGap: 1.25rem}}@media screen and (min-width: 769px),print{.columns.is-variable.is-5-tablet{--columnGap: 1.25rem}}@media screen and (min-width: 769px) and (max-width: 1055px){.columns.is-variable.is-5-tablet-only{--columnGap: 1.25rem}}@media screen and (max-width: 1055px){.columns.is-variable.is-5-touch{--columnGap: 1.25rem}}@media screen and (min-width: 1056px){.columns.is-variable.is-5-desktop{--columnGap: 1.25rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){.columns.is-variable.is-5-desktop-only{--columnGap: 1.25rem}}@media screen and (min-width: 1216px){.columns.is-variable.is-5-widescreen{--columnGap: 1.25rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){.columns.is-variable.is-5-widescreen-only{--columnGap: 1.25rem}}@media screen and (min-width: 1408px){.columns.is-variable.is-5-fullhd{--columnGap: 1.25rem}}.columns.is-variable.is-6{--columnGap: 1.5rem}@media screen and (max-width: 768px){.columns.is-variable.is-6-mobile{--columnGap: 1.5rem}}@media screen and (min-width: 769px),print{.columns.is-variable.is-6-tablet{--columnGap: 1.5rem}}@media screen and (min-width: 769px) and (max-width: 1055px){.columns.is-variable.is-6-tablet-only{--columnGap: 1.5rem}}@media screen and (max-width: 1055px){.columns.is-variable.is-6-touch{--columnGap: 1.5rem}}@media screen and (min-width: 1056px){.columns.is-variable.is-6-desktop{--columnGap: 1.5rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){.columns.is-variable.is-6-desktop-only{--columnGap: 1.5rem}}@media screen and (min-width: 1216px){.columns.is-variable.is-6-widescreen{--columnGap: 1.5rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){.columns.is-variable.is-6-widescreen-only{--columnGap: 1.5rem}}@media screen and (min-width: 1408px){.columns.is-variable.is-6-fullhd{--columnGap: 1.5rem}}.columns.is-variable.is-7{--columnGap: 1.75rem}@media screen and (max-width: 768px){.columns.is-variable.is-7-mobile{--columnGap: 1.75rem}}@media screen and (min-width: 769px),print{.columns.is-variable.is-7-tablet{--columnGap: 1.75rem}}@media screen and (min-width: 769px) and (max-width: 1055px){.columns.is-variable.is-7-tablet-only{--columnGap: 1.75rem}}@media screen and (max-width: 1055px){.columns.is-variable.is-7-touch{--columnGap: 1.75rem}}@media screen and (min-width: 1056px){.columns.is-variable.is-7-desktop{--columnGap: 1.75rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){.columns.is-variable.is-7-desktop-only{--columnGap: 1.75rem}}@media screen and (min-width: 1216px){.columns.is-variable.is-7-widescreen{--columnGap: 1.75rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){.columns.is-variable.is-7-widescreen-only{--columnGap: 1.75rem}}@media screen and (min-width: 1408px){.columns.is-variable.is-7-fullhd{--columnGap: 1.75rem}}.columns.is-variable.is-8{--columnGap: 2rem}@media screen and (max-width: 768px){.columns.is-variable.is-8-mobile{--columnGap: 2rem}}@media screen and (min-width: 769px),print{.columns.is-variable.is-8-tablet{--columnGap: 2rem}}@media screen and (min-width: 769px) and (max-width: 1055px){.columns.is-variable.is-8-tablet-only{--columnGap: 2rem}}@media screen and (max-width: 1055px){.columns.is-variable.is-8-touch{--columnGap: 2rem}}@media screen and (min-width: 1056px){.columns.is-variable.is-8-desktop{--columnGap: 2rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){.columns.is-variable.is-8-desktop-only{--columnGap: 2rem}}@media screen and (min-width: 1216px){.columns.is-variable.is-8-widescreen{--columnGap: 2rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){.columns.is-variable.is-8-widescreen-only{--columnGap: 2rem}}@media screen and (min-width: 1408px){.columns.is-variable.is-8-fullhd{--columnGap: 2rem}}.tile{align-items:stretch;display:block;flex-basis:0;flex-grow:1;flex-shrink:1;min-height:min-content}.tile.is-ancestor{margin-left:-.75rem;margin-right:-.75rem;margin-top:-.75rem}.tile.is-ancestor:last-child{margin-bottom:-.75rem}.tile.is-ancestor:not(:last-child){margin-bottom:.75rem}.tile.is-child{margin:0 !important}.tile.is-parent{padding:.75rem}.tile.is-vertical{flex-direction:column}.tile.is-vertical>.tile.is-child:not(:last-child){margin-bottom:1.5rem !important}@media screen and (min-width: 769px),print{.tile:not(.is-child){display:flex}.tile.is-1{flex:none;width:8.33333337%}.tile.is-2{flex:none;width:16.66666674%}.tile.is-3{flex:none;width:25%}.tile.is-4{flex:none;width:33.33333337%}.tile.is-5{flex:none;width:41.66666674%}.tile.is-6{flex:none;width:50%}.tile.is-7{flex:none;width:58.33333337%}.tile.is-8{flex:none;width:66.66666674%}.tile.is-9{flex:none;width:75%}.tile.is-10{flex:none;width:83.33333337%}.tile.is-11{flex:none;width:91.66666674%}.tile.is-12{flex:none;width:100%}}.hero{align-items:stretch;display:flex;flex-direction:column;justify-content:space-between}.hero .navbar{background:none}.hero .tabs ul{border-bottom:none}.hero.is-white{background-color:#fff;color:#0a0a0a}.hero.is-white a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-white strong{color:inherit}.hero.is-white .title{color:#0a0a0a}.hero.is-white .subtitle{color:rgba(10,10,10,0.9)}.hero.is-white .subtitle a:not(.button),.hero.is-white .subtitle strong{color:#0a0a0a}@media screen and (max-width: 1055px){.hero.is-white .navbar-menu{background-color:#fff}}.hero.is-white .navbar-item,.hero.is-white .navbar-link{color:rgba(10,10,10,0.7)}.hero.is-white a.navbar-item:hover,.hero.is-white a.navbar-item.is-active,.hero.is-white .navbar-link:hover,.hero.is-white .navbar-link.is-active{background-color:#f2f2f2;color:#0a0a0a}.hero.is-white .tabs a{color:#0a0a0a;opacity:0.9}.hero.is-white .tabs a:hover{opacity:1}.hero.is-white .tabs li.is-active a{color:#fff !important;opacity:1}.hero.is-white .tabs.is-boxed a,.hero.is-white .tabs.is-toggle a{color:#0a0a0a}.hero.is-white .tabs.is-boxed a:hover,.hero.is-white .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}.hero.is-white .tabs.is-boxed li.is-active a,.hero.is-white .tabs.is-boxed li.is-active a:hover,.hero.is-white .tabs.is-toggle li.is-active a,.hero.is-white .tabs.is-toggle li.is-active a:hover{background-color:#0a0a0a;border-color:#0a0a0a;color:#fff}.hero.is-white.is-bold{background-image:linear-gradient(141deg, #e8e3e4 0%, #fff 71%, #fff 100%)}@media screen and (max-width: 768px){.hero.is-white.is-bold .navbar-menu{background-image:linear-gradient(141deg, #e8e3e4 0%, #fff 71%, #fff 100%)}}.hero.is-black{background-color:#0a0a0a;color:#fff}.hero.is-black a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-black strong{color:inherit}.hero.is-black .title{color:#fff}.hero.is-black .subtitle{color:rgba(255,255,255,0.9)}.hero.is-black .subtitle a:not(.button),.hero.is-black .subtitle strong{color:#fff}@media screen and (max-width: 1055px){.hero.is-black .navbar-menu{background-color:#0a0a0a}}.hero.is-black .navbar-item,.hero.is-black .navbar-link{color:rgba(255,255,255,0.7)}.hero.is-black a.navbar-item:hover,.hero.is-black a.navbar-item.is-active,.hero.is-black .navbar-link:hover,.hero.is-black .navbar-link.is-active{background-color:#000;color:#fff}.hero.is-black .tabs a{color:#fff;opacity:0.9}.hero.is-black .tabs a:hover{opacity:1}.hero.is-black .tabs li.is-active a{color:#0a0a0a !important;opacity:1}.hero.is-black .tabs.is-boxed a,.hero.is-black .tabs.is-toggle a{color:#fff}.hero.is-black .tabs.is-boxed a:hover,.hero.is-black .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}.hero.is-black .tabs.is-boxed li.is-active a,.hero.is-black .tabs.is-boxed li.is-active a:hover,.hero.is-black .tabs.is-toggle li.is-active a,.hero.is-black .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#0a0a0a}.hero.is-black.is-bold{background-image:linear-gradient(141deg, #000 0%, #0a0a0a 71%, #181616 100%)}@media screen and (max-width: 768px){.hero.is-black.is-bold .navbar-menu{background-image:linear-gradient(141deg, #000 0%, #0a0a0a 71%, #181616 100%)}}.hero.is-light{background-color:#f5f5f5;color:rgba(0,0,0,0.7)}.hero.is-light a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-light strong{color:inherit}.hero.is-light .title{color:rgba(0,0,0,0.7)}.hero.is-light .subtitle{color:rgba(0,0,0,0.9)}.hero.is-light .subtitle a:not(.button),.hero.is-light .subtitle strong{color:rgba(0,0,0,0.7)}@media screen and (max-width: 1055px){.hero.is-light .navbar-menu{background-color:#f5f5f5}}.hero.is-light .navbar-item,.hero.is-light .navbar-link{color:rgba(0,0,0,0.7)}.hero.is-light a.navbar-item:hover,.hero.is-light a.navbar-item.is-active,.hero.is-light .navbar-link:hover,.hero.is-light .navbar-link.is-active{background-color:#e8e8e8;color:rgba(0,0,0,0.7)}.hero.is-light .tabs a{color:rgba(0,0,0,0.7);opacity:0.9}.hero.is-light .tabs a:hover{opacity:1}.hero.is-light .tabs li.is-active a{color:#f5f5f5 !important;opacity:1}.hero.is-light .tabs.is-boxed a,.hero.is-light .tabs.is-toggle a{color:rgba(0,0,0,0.7)}.hero.is-light .tabs.is-boxed a:hover,.hero.is-light .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}.hero.is-light .tabs.is-boxed li.is-active a,.hero.is-light .tabs.is-boxed li.is-active a:hover,.hero.is-light .tabs.is-toggle li.is-active a,.hero.is-light .tabs.is-toggle li.is-active a:hover{background-color:rgba(0,0,0,0.7);border-color:rgba(0,0,0,0.7);color:#f5f5f5}.hero.is-light.is-bold{background-image:linear-gradient(141deg, #dfd8d9 0%, #f5f5f5 71%, #fff 100%)}@media screen and (max-width: 768px){.hero.is-light.is-bold .navbar-menu{background-image:linear-gradient(141deg, #dfd8d9 0%, #f5f5f5 71%, #fff 100%)}}.hero.is-dark,.content kbd.hero{background-color:#363636;color:#fff}.hero.is-dark a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.content kbd.hero a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-dark strong,.content kbd.hero strong{color:inherit}.hero.is-dark .title,.content kbd.hero .title{color:#fff}.hero.is-dark .subtitle,.content kbd.hero .subtitle{color:rgba(255,255,255,0.9)}.hero.is-dark .subtitle a:not(.button),.content kbd.hero .subtitle a:not(.button),.hero.is-dark .subtitle strong,.content kbd.hero .subtitle strong{color:#fff}@media screen and (max-width: 1055px){.hero.is-dark .navbar-menu,.content kbd.hero .navbar-menu{background-color:#363636}}.hero.is-dark .navbar-item,.content kbd.hero .navbar-item,.hero.is-dark .navbar-link,.content kbd.hero .navbar-link{color:rgba(255,255,255,0.7)}.hero.is-dark a.navbar-item:hover,.content kbd.hero a.navbar-item:hover,.hero.is-dark a.navbar-item.is-active,.content kbd.hero a.navbar-item.is-active,.hero.is-dark .navbar-link:hover,.content kbd.hero .navbar-link:hover,.hero.is-dark .navbar-link.is-active,.content kbd.hero .navbar-link.is-active{background-color:#292929;color:#fff}.hero.is-dark .tabs a,.content kbd.hero .tabs a{color:#fff;opacity:0.9}.hero.is-dark .tabs a:hover,.content kbd.hero .tabs a:hover{opacity:1}.hero.is-dark .tabs li.is-active a,.content kbd.hero .tabs li.is-active a{color:#363636 !important;opacity:1}.hero.is-dark .tabs.is-boxed a,.content kbd.hero .tabs.is-boxed a,.hero.is-dark .tabs.is-toggle a,.content kbd.hero .tabs.is-toggle a{color:#fff}.hero.is-dark .tabs.is-boxed a:hover,.content kbd.hero .tabs.is-boxed a:hover,.hero.is-dark .tabs.is-toggle a:hover,.content kbd.hero .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}.hero.is-dark .tabs.is-boxed li.is-active a,.content kbd.hero .tabs.is-boxed li.is-active a,.hero.is-dark .tabs.is-boxed li.is-active a:hover,.hero.is-dark .tabs.is-toggle li.is-active a,.content kbd.hero .tabs.is-toggle li.is-active a,.hero.is-dark .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#363636}.hero.is-dark.is-bold,.content kbd.hero.is-bold{background-image:linear-gradient(141deg, #1f191a 0%, #363636 71%, #46403f 100%)}@media screen and (max-width: 768px){.hero.is-dark.is-bold .navbar-menu,.content kbd.hero.is-bold .navbar-menu{background-image:linear-gradient(141deg, #1f191a 0%, #363636 71%, #46403f 100%)}}.hero.is-primary,.docstring>section>a.hero.docs-sourcelink{background-color:#4eb5de;color:#fff}.hero.is-primary a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.docstring>section>a.hero.docs-sourcelink a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-primary strong,.docstring>section>a.hero.docs-sourcelink strong{color:inherit}.hero.is-primary .title,.docstring>section>a.hero.docs-sourcelink .title{color:#fff}.hero.is-primary .subtitle,.docstring>section>a.hero.docs-sourcelink .subtitle{color:rgba(255,255,255,0.9)}.hero.is-primary .subtitle a:not(.button),.docstring>section>a.hero.docs-sourcelink .subtitle a:not(.button),.hero.is-primary .subtitle strong,.docstring>section>a.hero.docs-sourcelink .subtitle strong{color:#fff}@media screen and (max-width: 1055px){.hero.is-primary .navbar-menu,.docstring>section>a.hero.docs-sourcelink .navbar-menu{background-color:#4eb5de}}.hero.is-primary .navbar-item,.docstring>section>a.hero.docs-sourcelink .navbar-item,.hero.is-primary .navbar-link,.docstring>section>a.hero.docs-sourcelink .navbar-link{color:rgba(255,255,255,0.7)}.hero.is-primary a.navbar-item:hover,.docstring>section>a.hero.docs-sourcelink a.navbar-item:hover,.hero.is-primary a.navbar-item.is-active,.docstring>section>a.hero.docs-sourcelink a.navbar-item.is-active,.hero.is-primary .navbar-link:hover,.docstring>section>a.hero.docs-sourcelink .navbar-link:hover,.hero.is-primary .navbar-link.is-active,.docstring>section>a.hero.docs-sourcelink .navbar-link.is-active{background-color:#39acda;color:#fff}.hero.is-primary .tabs a,.docstring>section>a.hero.docs-sourcelink .tabs a{color:#fff;opacity:0.9}.hero.is-primary .tabs a:hover,.docstring>section>a.hero.docs-sourcelink .tabs a:hover{opacity:1}.hero.is-primary .tabs li.is-active a,.docstring>section>a.hero.docs-sourcelink .tabs li.is-active a{color:#4eb5de !important;opacity:1}.hero.is-primary .tabs.is-boxed a,.docstring>section>a.hero.docs-sourcelink .tabs.is-boxed a,.hero.is-primary .tabs.is-toggle a,.docstring>section>a.hero.docs-sourcelink .tabs.is-toggle a{color:#fff}.hero.is-primary .tabs.is-boxed a:hover,.docstring>section>a.hero.docs-sourcelink .tabs.is-boxed a:hover,.hero.is-primary .tabs.is-toggle a:hover,.docstring>section>a.hero.docs-sourcelink .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}.hero.is-primary .tabs.is-boxed li.is-active a,.docstring>section>a.hero.docs-sourcelink .tabs.is-boxed li.is-active a,.hero.is-primary .tabs.is-boxed li.is-active a:hover,.hero.is-primary .tabs.is-toggle li.is-active a,.docstring>section>a.hero.docs-sourcelink .tabs.is-toggle li.is-active a,.hero.is-primary .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#4eb5de}.hero.is-primary.is-bold,.docstring>section>a.hero.is-bold.docs-sourcelink{background-image:linear-gradient(141deg, #1bc7de 0%, #4eb5de 71%, #5fa9e7 100%)}@media screen and (max-width: 768px){.hero.is-primary.is-bold .navbar-menu,.docstring>section>a.hero.is-bold.docs-sourcelink .navbar-menu{background-image:linear-gradient(141deg, #1bc7de 0%, #4eb5de 71%, #5fa9e7 100%)}}.hero.is-link{background-color:#2e63b8;color:#fff}.hero.is-link a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-link strong{color:inherit}.hero.is-link .title{color:#fff}.hero.is-link .subtitle{color:rgba(255,255,255,0.9)}.hero.is-link .subtitle a:not(.button),.hero.is-link .subtitle strong{color:#fff}@media screen and (max-width: 1055px){.hero.is-link .navbar-menu{background-color:#2e63b8}}.hero.is-link .navbar-item,.hero.is-link .navbar-link{color:rgba(255,255,255,0.7)}.hero.is-link a.navbar-item:hover,.hero.is-link a.navbar-item.is-active,.hero.is-link .navbar-link:hover,.hero.is-link .navbar-link.is-active{background-color:#2958a4;color:#fff}.hero.is-link .tabs a{color:#fff;opacity:0.9}.hero.is-link .tabs a:hover{opacity:1}.hero.is-link .tabs li.is-active a{color:#2e63b8 !important;opacity:1}.hero.is-link .tabs.is-boxed a,.hero.is-link .tabs.is-toggle a{color:#fff}.hero.is-link .tabs.is-boxed a:hover,.hero.is-link .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}.hero.is-link .tabs.is-boxed li.is-active a,.hero.is-link .tabs.is-boxed li.is-active a:hover,.hero.is-link .tabs.is-toggle li.is-active a,.hero.is-link .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#2e63b8}.hero.is-link.is-bold{background-image:linear-gradient(141deg, #1b6098 0%, #2e63b8 71%, #2d51d2 100%)}@media screen and (max-width: 768px){.hero.is-link.is-bold .navbar-menu{background-image:linear-gradient(141deg, #1b6098 0%, #2e63b8 71%, #2d51d2 100%)}}.hero.is-info{background-color:#209cee;color:#fff}.hero.is-info a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-info strong{color:inherit}.hero.is-info .title{color:#fff}.hero.is-info .subtitle{color:rgba(255,255,255,0.9)}.hero.is-info .subtitle a:not(.button),.hero.is-info .subtitle strong{color:#fff}@media screen and (max-width: 1055px){.hero.is-info .navbar-menu{background-color:#209cee}}.hero.is-info .navbar-item,.hero.is-info .navbar-link{color:rgba(255,255,255,0.7)}.hero.is-info a.navbar-item:hover,.hero.is-info a.navbar-item.is-active,.hero.is-info .navbar-link:hover,.hero.is-info .navbar-link.is-active{background-color:#1190e3;color:#fff}.hero.is-info .tabs a{color:#fff;opacity:0.9}.hero.is-info .tabs a:hover{opacity:1}.hero.is-info .tabs li.is-active a{color:#209cee !important;opacity:1}.hero.is-info .tabs.is-boxed a,.hero.is-info .tabs.is-toggle a{color:#fff}.hero.is-info .tabs.is-boxed a:hover,.hero.is-info .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}.hero.is-info .tabs.is-boxed li.is-active a,.hero.is-info .tabs.is-boxed li.is-active a:hover,.hero.is-info .tabs.is-toggle li.is-active a,.hero.is-info .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#209cee}.hero.is-info.is-bold{background-image:linear-gradient(141deg, #05a6d6 0%, #209cee 71%, #3287f5 100%)}@media screen and (max-width: 768px){.hero.is-info.is-bold .navbar-menu{background-image:linear-gradient(141deg, #05a6d6 0%, #209cee 71%, #3287f5 100%)}}.hero.is-success{background-color:#22c35b;color:#fff}.hero.is-success a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-success strong{color:inherit}.hero.is-success .title{color:#fff}.hero.is-success .subtitle{color:rgba(255,255,255,0.9)}.hero.is-success .subtitle a:not(.button),.hero.is-success .subtitle strong{color:#fff}@media screen and (max-width: 1055px){.hero.is-success .navbar-menu{background-color:#22c35b}}.hero.is-success .navbar-item,.hero.is-success .navbar-link{color:rgba(255,255,255,0.7)}.hero.is-success a.navbar-item:hover,.hero.is-success a.navbar-item.is-active,.hero.is-success .navbar-link:hover,.hero.is-success .navbar-link.is-active{background-color:#1ead51;color:#fff}.hero.is-success .tabs a{color:#fff;opacity:0.9}.hero.is-success .tabs a:hover{opacity:1}.hero.is-success .tabs li.is-active a{color:#22c35b !important;opacity:1}.hero.is-success .tabs.is-boxed a,.hero.is-success .tabs.is-toggle a{color:#fff}.hero.is-success .tabs.is-boxed a:hover,.hero.is-success .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}.hero.is-success .tabs.is-boxed li.is-active a,.hero.is-success .tabs.is-boxed li.is-active a:hover,.hero.is-success .tabs.is-toggle li.is-active a,.hero.is-success .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#22c35b}.hero.is-success.is-bold{background-image:linear-gradient(141deg, #12a02c 0%, #22c35b 71%, #1fdf83 100%)}@media screen and (max-width: 768px){.hero.is-success.is-bold .navbar-menu{background-image:linear-gradient(141deg, #12a02c 0%, #22c35b 71%, #1fdf83 100%)}}.hero.is-warning{background-color:#ffdd57;color:rgba(0,0,0,0.7)}.hero.is-warning a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-warning strong{color:inherit}.hero.is-warning .title{color:rgba(0,0,0,0.7)}.hero.is-warning .subtitle{color:rgba(0,0,0,0.9)}.hero.is-warning .subtitle a:not(.button),.hero.is-warning .subtitle strong{color:rgba(0,0,0,0.7)}@media screen and (max-width: 1055px){.hero.is-warning .navbar-menu{background-color:#ffdd57}}.hero.is-warning .navbar-item,.hero.is-warning .navbar-link{color:rgba(0,0,0,0.7)}.hero.is-warning a.navbar-item:hover,.hero.is-warning a.navbar-item.is-active,.hero.is-warning .navbar-link:hover,.hero.is-warning .navbar-link.is-active{background-color:#ffd83e;color:rgba(0,0,0,0.7)}.hero.is-warning .tabs a{color:rgba(0,0,0,0.7);opacity:0.9}.hero.is-warning .tabs a:hover{opacity:1}.hero.is-warning .tabs li.is-active a{color:#ffdd57 !important;opacity:1}.hero.is-warning .tabs.is-boxed a,.hero.is-warning .tabs.is-toggle a{color:rgba(0,0,0,0.7)}.hero.is-warning .tabs.is-boxed a:hover,.hero.is-warning .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}.hero.is-warning .tabs.is-boxed li.is-active a,.hero.is-warning .tabs.is-boxed li.is-active a:hover,.hero.is-warning .tabs.is-toggle li.is-active a,.hero.is-warning .tabs.is-toggle li.is-active a:hover{background-color:rgba(0,0,0,0.7);border-color:rgba(0,0,0,0.7);color:#ffdd57}.hero.is-warning.is-bold{background-image:linear-gradient(141deg, #ffae24 0%, #ffdd57 71%, #fffa71 100%)}@media screen and (max-width: 768px){.hero.is-warning.is-bold .navbar-menu{background-image:linear-gradient(141deg, #ffae24 0%, #ffdd57 71%, #fffa71 100%)}}.hero.is-danger{background-color:#da0b00;color:#fff}.hero.is-danger a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-danger strong{color:inherit}.hero.is-danger .title{color:#fff}.hero.is-danger .subtitle{color:rgba(255,255,255,0.9)}.hero.is-danger .subtitle a:not(.button),.hero.is-danger .subtitle strong{color:#fff}@media screen and (max-width: 1055px){.hero.is-danger .navbar-menu{background-color:#da0b00}}.hero.is-danger .navbar-item,.hero.is-danger .navbar-link{color:rgba(255,255,255,0.7)}.hero.is-danger a.navbar-item:hover,.hero.is-danger a.navbar-item.is-active,.hero.is-danger .navbar-link:hover,.hero.is-danger .navbar-link.is-active{background-color:#c10a00;color:#fff}.hero.is-danger .tabs a{color:#fff;opacity:0.9}.hero.is-danger .tabs a:hover{opacity:1}.hero.is-danger .tabs li.is-active a{color:#da0b00 !important;opacity:1}.hero.is-danger .tabs.is-boxed a,.hero.is-danger .tabs.is-toggle a{color:#fff}.hero.is-danger .tabs.is-boxed a:hover,.hero.is-danger .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}.hero.is-danger .tabs.is-boxed li.is-active a,.hero.is-danger .tabs.is-boxed li.is-active a:hover,.hero.is-danger .tabs.is-toggle li.is-active a,.hero.is-danger .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#da0b00}.hero.is-danger.is-bold{background-image:linear-gradient(141deg, #a70013 0%, #da0b00 71%, #f43500 100%)}@media screen and (max-width: 768px){.hero.is-danger.is-bold .navbar-menu{background-image:linear-gradient(141deg, #a70013 0%, #da0b00 71%, #f43500 100%)}}.hero.is-small .hero-body,#documenter .docs-sidebar form.docs-search>input.hero .hero-body{padding:1.5rem}@media screen and (min-width: 769px),print{.hero.is-medium .hero-body{padding:9rem 4.5rem}}@media screen and (min-width: 769px),print{.hero.is-large .hero-body{padding:18rem 6rem}}.hero.is-halfheight .hero-body,.hero.is-fullheight .hero-body,.hero.is-fullheight-with-navbar .hero-body{align-items:center;display:flex}.hero.is-halfheight .hero-body>.container,.hero.is-fullheight .hero-body>.container,.hero.is-fullheight-with-navbar .hero-body>.container{flex-grow:1;flex-shrink:1}.hero.is-halfheight{min-height:50vh}.hero.is-fullheight{min-height:100vh}.hero-video{overflow:hidden}.hero-video video{left:50%;min-height:100%;min-width:100%;position:absolute;top:50%;transform:translate3d(-50%, -50%, 0)}.hero-video.is-transparent{opacity:0.3}@media screen and (max-width: 768px){.hero-video{display:none}}.hero-buttons{margin-top:1.5rem}@media screen and (max-width: 768px){.hero-buttons .button{display:flex}.hero-buttons .button:not(:last-child){margin-bottom:0.75rem}}@media screen and (min-width: 769px),print{.hero-buttons{display:flex;justify-content:center}.hero-buttons .button:not(:last-child){margin-right:1.5rem}}.hero-head,.hero-foot{flex-grow:0;flex-shrink:0}.hero-body{flex-grow:1;flex-shrink:0;padding:3rem 1.5rem}@media screen and (min-width: 769px),print{.hero-body{padding:3rem 3rem}}.section{padding:3rem 1.5rem}@media screen and (min-width: 1056px){.section{padding:3rem 3rem}.section.is-medium{padding:9rem 4.5rem}.section.is-large{padding:18rem 6rem}}.footer{background-color:#fafafa;padding:3rem 1.5rem 6rem}h1 .docs-heading-anchor,h1 .docs-heading-anchor:hover,h1 .docs-heading-anchor:visited,h2 .docs-heading-anchor,h2 .docs-heading-anchor:hover,h2 .docs-heading-anchor:visited,h3 .docs-heading-anchor,h3 .docs-heading-anchor:hover,h3 .docs-heading-anchor:visited,h4 .docs-heading-anchor,h4 .docs-heading-anchor:hover,h4 .docs-heading-anchor:visited,h5 .docs-heading-anchor,h5 .docs-heading-anchor:hover,h5 .docs-heading-anchor:visited,h6 .docs-heading-anchor,h6 .docs-heading-anchor:hover,h6 .docs-heading-anchor:visited{color:#222}h1 .docs-heading-anchor-permalink,h2 .docs-heading-anchor-permalink,h3 .docs-heading-anchor-permalink,h4 .docs-heading-anchor-permalink,h5 .docs-heading-anchor-permalink,h6 .docs-heading-anchor-permalink{visibility:hidden;vertical-align:middle;margin-left:0.5em;font-size:0.7rem}h1 .docs-heading-anchor-permalink::before,h2 .docs-heading-anchor-permalink::before,h3 .docs-heading-anchor-permalink::before,h4 .docs-heading-anchor-permalink::before,h5 .docs-heading-anchor-permalink::before,h6 .docs-heading-anchor-permalink::before{font-family:"Font Awesome 6 Free";font-weight:900;content:"\f0c1"}h1:hover .docs-heading-anchor-permalink,h2:hover .docs-heading-anchor-permalink,h3:hover .docs-heading-anchor-permalink,h4:hover .docs-heading-anchor-permalink,h5:hover .docs-heading-anchor-permalink,h6:hover .docs-heading-anchor-permalink{visibility:visible}.docs-dark-only{display:none !important}pre{position:relative;overflow:hidden}pre code,pre code.hljs{padding:0 .75rem !important;overflow:auto;display:block}pre code:first-of-type,pre code.hljs:first-of-type{padding-top:0.5rem !important}pre code:last-of-type,pre code.hljs:last-of-type{padding-bottom:0.5rem !important}pre .copy-button{opacity:0.2;transition:opacity 0.2s;position:absolute;right:0em;top:0em;padding:0.5em;width:2.5em;height:2.5em;background:transparent;border:none;font-family:"Font Awesome 6 Free";color:#222;cursor:pointer;text-align:center}pre .copy-button:focus,pre .copy-button:hover{opacity:1;background:rgba(34,34,34,0.1);color:#2e63b8}pre .copy-button.success{color:#259a12;opacity:1}pre .copy-button.error{color:#cb3c33;opacity:1}pre:hover .copy-button{opacity:1}.admonition{background-color:#b5b5b5;border-style:solid;border-width:1px;border-color:#363636;border-radius:4px;font-size:1rem}.admonition strong{color:currentColor}.admonition.is-small,#documenter .docs-sidebar form.docs-search>input.admonition{font-size:.75rem}.admonition.is-medium{font-size:1.25rem}.admonition.is-large{font-size:1.5rem}.admonition.is-default{background-color:#b5b5b5;border-color:#363636}.admonition.is-default>.admonition-header{background-color:#363636;color:#fff}.admonition.is-default>.admonition-body{color:#fff}.admonition.is-info{background-color:#def0fc;border-color:#209cee}.admonition.is-info>.admonition-header{background-color:#209cee;color:#fff}.admonition.is-info>.admonition-body{color:rgba(0,0,0,0.7)}.admonition.is-success{background-color:#bdf4d1;border-color:#22c35b}.admonition.is-success>.admonition-header{background-color:#22c35b;color:#fff}.admonition.is-success>.admonition-body{color:rgba(0,0,0,0.7)}.admonition.is-warning{background-color:#fff3c5;border-color:#ffdd57}.admonition.is-warning>.admonition-header{background-color:#ffdd57;color:rgba(0,0,0,0.7)}.admonition.is-warning>.admonition-body{color:rgba(0,0,0,0.7)}.admonition.is-danger{background-color:#ffaba7;border-color:#da0b00}.admonition.is-danger>.admonition-header{background-color:#da0b00;color:#fff}.admonition.is-danger>.admonition-body{color:rgba(0,0,0,0.7)}.admonition.is-compat{background-color:#bdeff5;border-color:#1db5c9}.admonition.is-compat>.admonition-header{background-color:#1db5c9;color:#fff}.admonition.is-compat>.admonition-body{color:rgba(0,0,0,0.7)}.admonition-header{color:#fff;background-color:#363636;align-items:center;font-weight:700;justify-content:space-between;line-height:1.25;padding:0.5rem .75rem;position:relative}.admonition-header:before{font-family:"Font Awesome 6 Free";font-weight:900;margin-right:.75rem;content:"\f06a"}details.admonition.is-details>.admonition-header{list-style:none}details.admonition.is-details>.admonition-header:before{font-family:"Font Awesome 6 Free";font-weight:900;content:"\f055"}details.admonition.is-details[open]>.admonition-header:before{font-family:"Font Awesome 6 Free";font-weight:900;content:"\f056"}.admonition-body{color:#222;padding:0.5rem .75rem}.admonition-body pre{background-color:#f5f5f5}.admonition-body code{background-color:rgba(0,0,0,0.05)}.docstring{margin-bottom:1em;background-color:rgba(0,0,0,0);border:1px solid #dbdbdb;box-shadow:2px 2px 3px rgba(10,10,10,0.1);max-width:100%}.docstring>header{cursor:pointer;display:flex;flex-grow:1;align-items:stretch;padding:0.5rem .75rem;background-color:#f5f5f5;box-shadow:0 0.125em 0.25em rgba(10,10,10,0.1);box-shadow:none;border-bottom:1px solid #dbdbdb;overflow:auto}.docstring>header code{background-color:transparent}.docstring>header .docstring-article-toggle-button{min-width:1.1rem;padding:0.2rem 0.2rem 0.2rem 0}.docstring>header .docstring-binding{margin-right:0.3em}.docstring>header .docstring-category{margin-left:0.3em}.docstring>section{position:relative;padding:.75rem .75rem;border-bottom:1px solid #dbdbdb}.docstring>section:last-child{border-bottom:none}.docstring>section>a.docs-sourcelink{transition:opacity 0.3s;opacity:0;position:absolute;right:.375rem;bottom:.375rem}.docstring>section>a.docs-sourcelink:focus{opacity:1 !important}.docstring:hover>section>a.docs-sourcelink{opacity:0.2}.docstring:focus-within>section>a.docs-sourcelink{opacity:0.2}.docstring>section:hover a.docs-sourcelink{opacity:1}.documenter-example-output{background-color:#fff}.outdated-warning-overlay{position:fixed;top:0;left:0;right:0;box-shadow:0 0 10px rgba(0,0,0,0.3);z-index:999;background-color:#ffaba7;color:rgba(0,0,0,0.7);border-bottom:3px solid #da0b00;padding:10px 35px;text-align:center;font-size:15px}.outdated-warning-overlay .outdated-warning-closer{position:absolute;top:calc(50% - 10px);right:18px;cursor:pointer;width:12px}.outdated-warning-overlay a{color:#2e63b8}.outdated-warning-overlay a:hover{color:#363636}.content pre{border:1px solid #dbdbdb}.content code{font-weight:inherit}.content a code{color:#2e63b8}.content h1 code,.content h2 code,.content h3 code,.content h4 code,.content h5 code,.content h6 code{color:#222}.content table{display:block;width:initial;max-width:100%;overflow-x:auto}.content blockquote>ul:first-child,.content blockquote>ol:first-child,.content .admonition-body>ul:first-child,.content .admonition-body>ol:first-child{margin-top:0}pre,code{font-variant-ligatures:no-contextual}.breadcrumb a.is-disabled{cursor:default;pointer-events:none}.breadcrumb a.is-disabled,.breadcrumb a.is-disabled:hover{color:#222}.hljs{background:initial !important}.katex .katex-mathml{top:0;right:0}.katex-display,mjx-container,.MathJax_Display{margin:0.5em 0 !important}html{-moz-osx-font-smoothing:auto;-webkit-font-smoothing:auto}li.no-marker{list-style:none}#documenter .docs-main>article{overflow-wrap:break-word}#documenter .docs-main>article .math-container{overflow-x:auto;overflow-y:hidden}@media screen and (min-width: 1056px){#documenter .docs-main{max-width:52rem;margin-left:20rem;padding-right:1rem}}@media screen and (max-width: 1055px){#documenter .docs-main{width:100%}#documenter .docs-main>article{max-width:52rem;margin-left:auto;margin-right:auto;margin-bottom:1rem;padding:0 1rem}#documenter .docs-main>header,#documenter .docs-main>nav{max-width:100%;width:100%;margin:0}}#documenter .docs-main header.docs-navbar{background-color:#fff;border-bottom:1px solid #dbdbdb;z-index:2;min-height:4rem;margin-bottom:1rem;display:flex}#documenter .docs-main header.docs-navbar .breadcrumb{flex-grow:1;overflow-x:hidden}#documenter .docs-main header.docs-navbar .docs-sidebar-button{display:block;font-size:1.5rem;padding-bottom:0.1rem;margin-right:1rem}#documenter .docs-main header.docs-navbar .docs-right{display:flex;white-space:nowrap;gap:1rem;align-items:center}#documenter .docs-main header.docs-navbar .docs-right .docs-icon,#documenter .docs-main header.docs-navbar .docs-right .docs-label{display:inline-block}#documenter .docs-main header.docs-navbar .docs-right .docs-label{padding:0;margin-left:0.3em}@media screen and (max-width: 1055px){#documenter .docs-main header.docs-navbar .docs-right .docs-navbar-link{margin-left:0.4rem;margin-right:0.4rem}}#documenter .docs-main header.docs-navbar>*{margin:auto 0}@media screen and (max-width: 1055px){#documenter .docs-main header.docs-navbar{position:sticky;top:0;padding:0 1rem;transition-property:top, box-shadow;-webkit-transition-property:top, box-shadow;transition-duration:0.3s;-webkit-transition-duration:0.3s}#documenter .docs-main header.docs-navbar.headroom--not-top{box-shadow:.2rem 0rem .4rem #bbb;transition-duration:0.7s;-webkit-transition-duration:0.7s}#documenter .docs-main header.docs-navbar.headroom--unpinned.headroom--not-top.headroom--not-bottom{top:-4.5rem;transition-duration:0.7s;-webkit-transition-duration:0.7s}}#documenter .docs-main section.footnotes{border-top:1px solid #dbdbdb}#documenter .docs-main section.footnotes li .tag:first-child,#documenter .docs-main section.footnotes li .docstring>section>a.docs-sourcelink:first-child,#documenter .docs-main section.footnotes li .content kbd:first-child,.content #documenter .docs-main section.footnotes li kbd:first-child{margin-right:1em;margin-bottom:0.4em}#documenter .docs-main .docs-footer{display:flex;flex-wrap:wrap;margin-left:0;margin-right:0;border-top:1px solid #dbdbdb;padding-top:1rem;padding-bottom:1rem}@media screen and (max-width: 1055px){#documenter .docs-main .docs-footer{padding-left:1rem;padding-right:1rem}}#documenter .docs-main .docs-footer .docs-footer-nextpage,#documenter .docs-main .docs-footer .docs-footer-prevpage{flex-grow:1}#documenter .docs-main .docs-footer .docs-footer-nextpage{text-align:right}#documenter .docs-main .docs-footer .flexbox-break{flex-basis:100%;height:0}#documenter .docs-main .docs-footer .footer-message{font-size:0.8em;margin:0.5em auto 0 auto;text-align:center}#documenter .docs-sidebar{display:flex;flex-direction:column;color:#0a0a0a;background-color:#f5f5f5;border-right:1px solid #dbdbdb;padding:0;flex:0 0 18rem;z-index:5;font-size:1rem;position:fixed;left:-18rem;width:18rem;height:100%;transition:left 0.3s}#documenter .docs-sidebar.visible{left:0;box-shadow:.4rem 0rem .8rem #bbb}@media screen and (min-width: 1056px){#documenter .docs-sidebar.visible{box-shadow:none}}@media screen and (min-width: 1056px){#documenter .docs-sidebar{left:0;top:0}}#documenter .docs-sidebar .docs-logo{margin-top:1rem;padding:0 1rem}#documenter .docs-sidebar .docs-logo>img{max-height:6rem;margin:auto}#documenter .docs-sidebar .docs-package-name{flex-shrink:0;font-size:1.5rem;font-weight:700;text-align:center;white-space:nowrap;overflow:hidden;padding:0.5rem 0}#documenter .docs-sidebar .docs-package-name .docs-autofit{max-width:16.2rem}#documenter .docs-sidebar .docs-package-name a,#documenter .docs-sidebar .docs-package-name a:hover{color:#0a0a0a}#documenter .docs-sidebar .docs-version-selector{border-top:1px solid #dbdbdb;display:none;padding:0.5rem}#documenter .docs-sidebar .docs-version-selector.visible{display:flex}#documenter .docs-sidebar ul.docs-menu{flex-grow:1;user-select:none;border-top:1px solid #dbdbdb;padding-bottom:1.5rem}#documenter .docs-sidebar ul.docs-menu>li>.tocitem{font-weight:bold}#documenter .docs-sidebar ul.docs-menu>li li{font-size:.95rem;margin-left:1em;border-left:1px solid #dbdbdb}#documenter .docs-sidebar ul.docs-menu input.collapse-toggle{display:none}#documenter .docs-sidebar ul.docs-menu ul.collapsed{display:none}#documenter .docs-sidebar ul.docs-menu input:checked~ul.collapsed{display:block}#documenter .docs-sidebar ul.docs-menu label.tocitem{display:flex}#documenter .docs-sidebar ul.docs-menu label.tocitem .docs-label{flex-grow:2}#documenter .docs-sidebar ul.docs-menu label.tocitem .docs-chevron{display:inline-block;font-style:normal;font-variant:normal;text-rendering:auto;line-height:1;font-size:.75rem;margin-left:1rem;margin-top:auto;margin-bottom:auto}#documenter .docs-sidebar ul.docs-menu label.tocitem .docs-chevron::before{font-family:"Font Awesome 6 Free";font-weight:900;content:"\f054"}#documenter .docs-sidebar ul.docs-menu input:checked~label.tocitem .docs-chevron::before{content:"\f078"}#documenter .docs-sidebar ul.docs-menu .tocitem{display:block;padding:0.5rem 0.5rem}#documenter .docs-sidebar ul.docs-menu .tocitem,#documenter .docs-sidebar ul.docs-menu .tocitem:hover{color:#0a0a0a;background:#f5f5f5}#documenter .docs-sidebar ul.docs-menu a.tocitem:hover,#documenter .docs-sidebar ul.docs-menu label.tocitem:hover{color:#0a0a0a;background-color:#ebebeb}#documenter .docs-sidebar ul.docs-menu li.is-active{border-top:1px solid #dbdbdb;border-bottom:1px solid #dbdbdb;background-color:#fff}#documenter .docs-sidebar ul.docs-menu li.is-active .tocitem,#documenter .docs-sidebar ul.docs-menu li.is-active .tocitem:hover{background-color:#fff;color:#0a0a0a}#documenter .docs-sidebar ul.docs-menu li.is-active ul.internal .tocitem:hover{background-color:#ebebeb;color:#0a0a0a}#documenter .docs-sidebar ul.docs-menu>li.is-active:first-child{border-top:none}#documenter .docs-sidebar ul.docs-menu ul.internal{margin:0 0.5rem 0.5rem;border-top:1px solid #dbdbdb}#documenter .docs-sidebar ul.docs-menu ul.internal li{font-size:.85rem;border-left:none;margin-left:0;margin-top:0.5rem}#documenter .docs-sidebar ul.docs-menu ul.internal .tocitem{width:100%;padding:0}#documenter .docs-sidebar ul.docs-menu ul.internal .tocitem::before{content:"⚬";margin-right:0.4em}#documenter .docs-sidebar form.docs-search{margin:auto;margin-top:0.5rem;margin-bottom:0.5rem}#documenter .docs-sidebar form.docs-search>input{width:14.4rem}#documenter .docs-sidebar #documenter-search-query{color:#707070;width:14.4rem;box-shadow:inset 0 1px 2px rgba(10,10,10,0.1)}@media screen and (min-width: 1056px){#documenter .docs-sidebar ul.docs-menu{overflow-y:auto;-webkit-overflow-scroll:touch}#documenter .docs-sidebar ul.docs-menu::-webkit-scrollbar{width:.3rem;background:none}#documenter .docs-sidebar ul.docs-menu::-webkit-scrollbar-thumb{border-radius:5px 0px 0px 5px;background:#e0e0e0}#documenter .docs-sidebar ul.docs-menu::-webkit-scrollbar-thumb:hover{background:#ccc}}@media screen and (max-width: 1055px){#documenter .docs-sidebar{overflow-y:auto;-webkit-overflow-scroll:touch}#documenter .docs-sidebar::-webkit-scrollbar{width:.3rem;background:none}#documenter .docs-sidebar::-webkit-scrollbar-thumb{border-radius:5px 0px 0px 5px;background:#e0e0e0}#documenter .docs-sidebar::-webkit-scrollbar-thumb:hover{background:#ccc}}kbd.search-modal-key-hints{border-radius:0.25rem;border:1px solid rgba(0,0,0,0.6);box-shadow:0 2px 0 1px rgba(0,0,0,0.6);cursor:default;font-size:0.9rem;line-height:1.5;min-width:0.75rem;text-align:center;padding:0.1rem 0.3rem;position:relative;top:-1px}.search-min-width-50{min-width:50%}.search-min-height-100{min-height:100%}.search-modal-card-body{max-height:calc(100vh - 15rem)}.search-result-link{border-radius:0.7em;transition:all 300ms}.search-result-link:hover,.search-result-link:focus{background-color:rgba(0,128,128,0.1)}.search-result-link .property-search-result-badge,.search-result-link .search-filter{transition:all 300ms}.property-search-result-badge,.search-filter{padding:0.15em 0.5em;font-size:0.8em;font-style:italic;text-transform:none !important;line-height:1.5;color:#f5f5f5;background-color:rgba(51,65,85,0.501961);border-radius:0.6rem}.search-result-link:hover .property-search-result-badge,.search-result-link:hover .search-filter,.search-result-link:focus .property-search-result-badge,.search-result-link:focus .search-filter{color:#f1f5f9;background-color:#333}.search-filter{color:#333;background-color:#f5f5f5;transition:all 300ms}.search-filter:hover,.search-filter:focus{color:#333}.search-filter-selected{color:#f5f5f5;background-color:rgba(139,0,139,0.5)}.search-filter-selected:hover,.search-filter-selected:focus{color:#f5f5f5}.search-result-highlight{background-color:#ffdd57;color:black}.search-divider{border-bottom:1px solid #dbdbdb}.search-result-title{width:85%;color:#333}.search-result-code-title{font-size:0.875rem;font-family:"JuliaMono","SFMono-Regular","Menlo","Consolas","Liberation Mono","DejaVu Sans Mono",monospace}#search-modal .modal-card-body::-webkit-scrollbar,#search-modal .filter-tabs::-webkit-scrollbar{height:10px;width:10px;background-color:transparent}#search-modal .modal-card-body::-webkit-scrollbar-thumb,#search-modal .filter-tabs::-webkit-scrollbar-thumb{background-color:gray;border-radius:1rem}#search-modal .modal-card-body::-webkit-scrollbar-track,#search-modal .filter-tabs::-webkit-scrollbar-track{-webkit-box-shadow:inset 0 0 6px rgba(0,0,0,0.6);background-color:transparent}.w-100{width:100%}.gap-2{gap:0.5rem}.gap-4{gap:1rem}.gap-8{gap:2rem}.ansi span.sgr1{font-weight:bolder}.ansi span.sgr2{font-weight:lighter}.ansi span.sgr3{font-style:italic}.ansi span.sgr4{text-decoration:underline}.ansi span.sgr7{color:#fff;background-color:#222}.ansi span.sgr8{color:transparent}.ansi span.sgr8 span{color:transparent}.ansi span.sgr9{text-decoration:line-through}.ansi span.sgr30{color:#242424}.ansi span.sgr31{color:#a7201f}.ansi span.sgr32{color:#066f00}.ansi span.sgr33{color:#856b00}.ansi span.sgr34{color:#2149b0}.ansi span.sgr35{color:#7d4498}.ansi span.sgr36{color:#007989}.ansi span.sgr37{color:gray}.ansi span.sgr40{background-color:#242424}.ansi span.sgr41{background-color:#a7201f}.ansi span.sgr42{background-color:#066f00}.ansi span.sgr43{background-color:#856b00}.ansi span.sgr44{background-color:#2149b0}.ansi span.sgr45{background-color:#7d4498}.ansi span.sgr46{background-color:#007989}.ansi span.sgr47{background-color:gray}.ansi span.sgr90{color:#616161}.ansi span.sgr91{color:#cb3c33}.ansi span.sgr92{color:#0e8300}.ansi span.sgr93{color:#a98800}.ansi span.sgr94{color:#3c5dcd}.ansi span.sgr95{color:#9256af}.ansi span.sgr96{color:#008fa3}.ansi span.sgr97{color:#f5f5f5}.ansi span.sgr100{background-color:#616161}.ansi span.sgr101{background-color:#cb3c33}.ansi span.sgr102{background-color:#0e8300}.ansi span.sgr103{background-color:#a98800}.ansi span.sgr104{background-color:#3c5dcd}.ansi span.sgr105{background-color:#9256af}.ansi span.sgr106{background-color:#008fa3}.ansi span.sgr107{background-color:#f5f5f5}code.language-julia-repl>span.hljs-meta{color:#066f00;font-weight:bolder}/*! + Theme: Default + Description: Original highlight.js style + Author: (c) Ivan Sagalaev + Maintainer: @highlightjs/core-team + Website: https://highlightjs.org/ + License: see project LICENSE + Touched: 2021 +*/pre code.hljs{display:block;overflow-x:auto;padding:1em}code.hljs{padding:3px 5px}.hljs{background:#F3F3F3;color:#444}.hljs-comment{color:#697070}.hljs-tag,.hljs-punctuation{color:#444a}.hljs-tag .hljs-name,.hljs-tag .hljs-attr{color:#444}.hljs-keyword,.hljs-attribute,.hljs-selector-tag,.hljs-meta .hljs-keyword,.hljs-doctag,.hljs-name{font-weight:bold}.hljs-type,.hljs-string,.hljs-number,.hljs-selector-id,.hljs-selector-class,.hljs-quote,.hljs-template-tag,.hljs-deletion{color:#880000}.hljs-title,.hljs-section{color:#880000;font-weight:bold}.hljs-regexp,.hljs-symbol,.hljs-variable,.hljs-template-variable,.hljs-link,.hljs-selector-attr,.hljs-operator,.hljs-selector-pseudo{color:#ab5656}.hljs-literal{color:#695}.hljs-built_in,.hljs-bullet,.hljs-code,.hljs-addition{color:#397300}.hljs-meta{color:#1f7199}.hljs-meta .hljs-string{color:#38a}.hljs-emphasis{font-style:italic}.hljs-strong{font-weight:bold}.gap-4{gap:1rem} diff --git a/v0.11.5/assets/themeswap.js b/v0.11.5/assets/themeswap.js new file mode 100644 index 00000000..9f5eebe6 --- /dev/null +++ b/v0.11.5/assets/themeswap.js @@ -0,0 +1,84 @@ +// Small function to quickly swap out themes. Gets put into the tag.. +function set_theme_from_local_storage() { + // Initialize the theme to null, which means default + var theme = null; + // If the browser supports the localstorage and is not disabled then try to get the + // documenter theme + if (window.localStorage != null) { + // Get the user-picked theme from localStorage. May be `null`, which means the default + // theme. + theme = window.localStorage.getItem("documenter-theme"); + } + // Check if the users preference is for dark color scheme + var darkPreference = + window.matchMedia("(prefers-color-scheme: dark)").matches === true; + // Initialize a few variables for the loop: + // + // - active: will contain the index of the theme that should be active. Note that there + // is no guarantee that localStorage contains sane values. If `active` stays `null` + // we either could not find the theme or it is the default (primary) theme anyway. + // Either way, we then need to stick to the primary theme. + // + // - disabled: style sheets that should be disabled (i.e. all the theme style sheets + // that are not the currently active theme) + var active = null; + var disabled = []; + var primaryLightTheme = null; + var primaryDarkTheme = null; + for (var i = 0; i < document.styleSheets.length; i++) { + var ss = document.styleSheets[i]; + // The tag of each style sheet is expected to have a data-theme-name attribute + // which must contain the name of the theme. The names in localStorage much match this. + var themename = ss.ownerNode.getAttribute("data-theme-name"); + // attribute not set => non-theme stylesheet => ignore + if (themename === null) continue; + // To distinguish the default (primary) theme, it needs to have the data-theme-primary + // attribute set. + if (ss.ownerNode.getAttribute("data-theme-primary") !== null) { + primaryLightTheme = themename; + } + // Check if the theme is primary dark theme so that we could store its name in darkTheme + if (ss.ownerNode.getAttribute("data-theme-primary-dark") !== null) { + primaryDarkTheme = themename; + } + // If we find a matching theme (and it's not the default), we'll set active to non-null + if (themename === theme) active = i; + // Store the style sheets of inactive themes so that we could disable them + if (themename !== theme) disabled.push(ss); + } + var activeTheme = null; + if (active !== null) { + // If we did find an active theme, we'll (1) add the theme--$(theme) class to + document.getElementsByTagName("html")[0].className = "theme--" + theme; + activeTheme = theme; + } else { + // If we did _not_ find an active theme, then we need to fall back to the primary theme + // which can either be dark or light, depending on the user's OS preference. + var activeTheme = darkPreference ? primaryDarkTheme : primaryLightTheme; + // In case it somehow happens that the relevant primary theme was not found in the + // preceding loop, we abort without doing anything. + if (activeTheme === null) { + console.error("Unable to determine primary theme."); + return; + } + // When switching to the primary light theme, then we must not have a class name + // for the tag. That's only for non-primary or the primary dark theme. + if (darkPreference) { + document.getElementsByTagName("html")[0].className = + "theme--" + activeTheme; + } else { + document.getElementsByTagName("html")[0].className = ""; + } + } + for (var i = 0; i < document.styleSheets.length; i++) { + var ss = document.styleSheets[i]; + // The tag of each style sheet is expected to have a data-theme-name attribute + // which must contain the name of the theme. The names in localStorage much match this. + var themename = ss.ownerNode.getAttribute("data-theme-name"); + // attribute not set => non-theme stylesheet => ignore + if (themename === null) continue; + // we'll disable all the stylesheets, except for the active one + ss.disabled = !(themename == activeTheme); + } +} +set_theme_from_local_storage(); diff --git a/v0.11.5/assets/warner.js b/v0.11.5/assets/warner.js new file mode 100644 index 00000000..3f6f5d00 --- /dev/null +++ b/v0.11.5/assets/warner.js @@ -0,0 +1,52 @@ +function maybeAddWarning() { + // DOCUMENTER_NEWEST is defined in versions.js, DOCUMENTER_CURRENT_VERSION and DOCUMENTER_STABLE + // in siteinfo.js. + // If either of these are undefined something went horribly wrong, so we abort. + if ( + window.DOCUMENTER_NEWEST === undefined || + window.DOCUMENTER_CURRENT_VERSION === undefined || + window.DOCUMENTER_STABLE === undefined + ) { + return; + } + + // Current version is not a version number, so we can't tell if it's the newest version. Abort. + if (!/v(\d+\.)*\d+/.test(window.DOCUMENTER_CURRENT_VERSION)) { + return; + } + + // Current version is newest version, so no need to add a warning. + if (window.DOCUMENTER_NEWEST === window.DOCUMENTER_CURRENT_VERSION) { + return; + } + + // Add a noindex meta tag (unless one exists) so that search engines don't index this version of the docs. + if (document.body.querySelector('meta[name="robots"]') === null) { + const meta = document.createElement("meta"); + meta.name = "robots"; + meta.content = "noindex"; + + document.getElementsByTagName("head")[0].appendChild(meta); + } + + const div = document.createElement("div"); + div.classList.add("outdated-warning-overlay"); + const closer = document.createElement("button"); + closer.classList.add("outdated-warning-closer", "delete"); + closer.addEventListener("click", function () { + document.body.removeChild(div); + }); + const href = window.documenterBaseURL + "/../" + window.DOCUMENTER_STABLE; + div.innerHTML = + 'This documentation is not for the latest stable release, but for either the development version or an older release.
Click here to go to the documentation for the latest stable release.'; + div.appendChild(closer); + document.body.appendChild(div); +} + +if (document.readyState === "loading") { + document.addEventListener("DOMContentLoaded", maybeAddWarning); +} else { + maybeAddWarning(); +} diff --git a/v0.11.5/benchmark/index.html b/v0.11.5/benchmark/index.html new file mode 100644 index 00000000..142079a1 --- /dev/null +++ b/v0.11.5/benchmark/index.html @@ -0,0 +1,2 @@ + +Benchmarks · Vlasiator.jl

Benchmarks

The test file information are listed below:

IndexFilenameNumber of CellsDimensionAMRPublic
11d_single.vlsv201NoYes
2bulk.2d.vlsv6,3001NoYes
32d_double.vlsv51,2002NoYes
42d_AFC.vlsv4,612,5002NoYes
53d_EGI.vlsv3,966,5803YesNo

Access to the public data can be found from vlsv_data.

Note

The numbers shown here are comparisons between Analysator v0.9 and Vlasiator.jl v0.9.32 running Python 3.6.9/3.9.7 and Julia 1.8.3 with the scripts perf.jl and perf.py. The timings are collected from a i5-10210U @ 1.6GHz CPU with 16 GB RAM if not specified.

  • Loading meta data[1]
File IndexJulia [ms]Python [ms]Ratio
10.181.196.6
20.511.663.1
32.333.111.3
45062770.5
55492830.5
  • Reading DCCRG grid variables
File IndexJulia [ms]Python [ms]Ratio
10.0040.0717
20.02[2]0.084
30.17[2]0.211.2
420[2]231.1
511[2]111.0
  • Reading field solver grid variables[3]
File IndexSizeJulia [s]Julia, mmap [s]Python [s]Ratio
56.2 GiB Float32188567
  • Plotting 2D density contours on a uniform mesh (no GUI)
File IndexJulia [s]Python [s]Ratio
40.55.411
  • Plotting 2D density slices from a 3D AMR mesh (no GUI)
File IndexJulia [s][4]Python [s]Ratio
50.53.16.2
  • Static virtual satellite tracking from 3D AMR data (26G per frame, 32 MB Cell IDs) on a cluster[5]
FramesJulia, 1 thread [s]Julia, 2 threads [s]Python [s]
84545341220
  • 1See the issue about sorting. The performance of EzXML is also not ideal: we may need to find a better XML parser in Julia.
  • 2Vlasiator.jl can be faster if there is no conversion from Float64 to Float32. See Precision.
  • 3The field solver grid is a regular Cartesian grid at the finest refinement level introduced after Vlasiator 5. Therefore fsgrid variables are quite large for 3D AMR runs: with limited memory (e.g. 16 GB RAM) you may encounter out-of-memory issues when reading fg_b more than once. In Vlasiator.jl, we provide the option usemmap=true for reading large arrays –- see Memory for more.
  • 4The first time execution will be slower due to JIT compilation (which is excluded in the timing here). This is known as "Time-To-First-X" in the Julia community.
  • 5University of Helsinki cluster Vorna with Intel Xeon E5-2697 @ 2.70GHz.
diff --git a/v0.11.5/contributing/index.html b/v0.11.5/contributing/index.html new file mode 100644 index 00000000..3e4d113c --- /dev/null +++ b/v0.11.5/contributing/index.html @@ -0,0 +1,3 @@ + +Contributing · Vlasiator.jl

Contributing

  • Try to explain your contribution with simple language.
  • References are always welcome.
  • Follow the coding standards in the source.

Reporting issues

If you are experiencing issues or have discovered a bug, please report it on GitHub. To make the resolution process easier, please include the version of Julia and Vlasiator.jl in your writeup. These can be found with two commands:

julia> versioninfo()
+julia> using Pkg; Pkg.status()

Feature requests

If you have suggestions of improvement or algorithms that you would like to see implemented in Vlasiator.jl, please open an issue on GitHub. Suggestions as well as feature requests are very welcome.

Code contribution

If you have code that you would like to contribute to Vlasiator.jl, that is awesome! Please open an issue before you create the pull request on GitHub so that we make sure your idea is aligned with our goals for the project.

After your idea is discussed and revised by maintainers, please get the development version of the project by typing the following in the package manager:

] activate @dev

This will create a fresh environment called @dev where you can play with the project components without compromising your normal user environment.

] dev Vlasiator

This will clone all the project components in your ~/.julia folder so that you can modify it and submit a pull request on GitHub later. Don't hesitate to ask questions. We are looking forward to your contributions.

diff --git a/v0.11.5/democards/gridtheme.css b/v0.11.5/democards/gridtheme.css new file mode 100644 index 00000000..4d02fc84 --- /dev/null +++ b/v0.11.5/democards/gridtheme.css @@ -0,0 +1,59 @@ +.grid-card-section { + display: flex; + flex-direction: row; + flex-wrap: wrap; + align-content: space-between; +} + +.grid-card:hover{ + box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.4), 0 6px 20px 0 rgba(0, 0, 0, 0.1); +} + +.grid-card { + width: 210px; + max-height: 400px; + margin: 10px 15px; + box-shadow: 0 4px 8px 0 rgba(0,0,0,0.2); + transition: 0.3s; + border-radius: 5px; +} + +.grid-card-text { + padding: 0 15px; +} + +.grid-card-cover img { + width: 100%; +} + +.grid-card-cover { + width: 200px; + height: 220px; + padding: 5px; + box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.2); + transition: 0.3s; + border-radius: 5px; + display:block; + margin:auto; +} + +.grid-card-cover .grid-card-description { + opacity: 0; + z-index: -1; + position: absolute; + top: 25%; + left: 140%; + width: 100%; + transform: translate(-50%, -50%); + padding: 10px; + border-radius: 5px; + background: rgba(0, 0, 0, 0.8); + color: #fff; + text-align: center; + font-size: 14px; +} + +.grid-card-cover:hover .grid-card-description{ + z-index: 3; + opacity: 1; +} diff --git a/v0.11.5/examples/covers/demo_2dplot_pyplot.png b/v0.11.5/examples/covers/demo_2dplot_pyplot.png new file mode 100644 index 00000000..18f31c6d Binary files /dev/null and b/v0.11.5/examples/covers/demo_2dplot_pyplot.png differ diff --git a/v0.11.5/examples/covers/demo_3dcuts_pyplot.png b/v0.11.5/examples/covers/demo_3dcuts_pyplot.png new file mode 100644 index 00000000..5c31cbb6 Binary files /dev/null and b/v0.11.5/examples/covers/demo_3dcuts_pyplot.png differ diff --git a/v0.11.5/examples/covers/demo_mesh_pyplot.png b/v0.11.5/examples/covers/demo_mesh_pyplot.png new file mode 100644 index 00000000..9694b554 Binary files /dev/null and b/v0.11.5/examples/covers/demo_mesh_pyplot.png differ diff --git a/v0.11.5/examples/covers/demo_vdf_pyplot.png b/v0.11.5/examples/covers/demo_vdf_pyplot.png new file mode 100644 index 00000000..66a2a1e2 Binary files /dev/null and b/v0.11.5/examples/covers/demo_vdf_pyplot.png differ diff --git a/v0.11.5/examples/covers/democards_logo.svg b/v0.11.5/examples/covers/democards_logo.svg new file mode 100644 index 00000000..caaa936c --- /dev/null +++ b/v0.11.5/examples/covers/democards_logo.svg @@ -0,0 +1,47 @@ + + + + + Produced by OmniGraffle 7.7.1 + 2019-08-23 08:34:14 +0000 + + + square + + + diff --git a/v0.11.5/examples/index.html b/v0.11.5/examples/index.html new file mode 100644 index 00000000..fbac64d6 --- /dev/null +++ b/v0.11.5/examples/index.html @@ -0,0 +1,174 @@ + +Examples · Vlasiator.jl

Examples

This section contains thorough examples for using Vlasiator.jl.


Postprocess

+
+

This demo shows how to convert VLSV to VTK

card-cover-image

+ +
+
+

This demo shows how to extract data for a virtual satellite

card-cover-image

+ +
+
+

This demo shows how to extract data for virtual satellites

card-cover-image

+ +
+
+

This demo shows how to extract data for virtual satellites

card-cover-image

+ +
+
+

This demo shows how to extract EM fields on a selected 2D slice

card-cover-image

+ +
+
+

This demo shows how to extract variables along a line across multiple frames

card-cover-image

+ +
+
+

This demo shows how to extract logfile.txt information

card-cover-image

+ +
+
+

This demo shows how to find X-points in 2D

card-cover-image

+ +
+
+

This demo shows how to extract variables along the magnetopause

card-cover-image

+ +
+
+

This demo shows how to identify EMIC and mirror modes

card-cover-image

+ +
+
+

This demo shows how to search for waves

card-cover-image

+ +
+
+

This demo shows how to track waves and plot the dispersion relation

card-cover-image

+ +
+
+

This demo shows how to find X&#x2F;O-points

card-cover-image

+ +
+
+

This demo shows how to find X-points in 2D

card-cover-image

+ +

Visualization

+
+

This demo shows how to create animation for 1D plots

card-cover-image

+ +
+
+

This demo shows how to generate complex plots with multi-processing

card-cover-image

+ +
+
+

This demo shows how to generate complex plots

card-cover-image

+ +
+
+

This demo shows how to generate 2D colored contour animation

card-cover-image

+ +
+
+

This demo shows how to generate 2D colored contours with multi-processing

card-cover-image

+ +
+
+

This demo shows how to share colorbar between subplots

card-cover-image

+ +
+
+

This demo shows how to generate 2D colored contours

card-cover-image

+ +
+
+

This demo shows how to plot 2D colored contour with streamlines

card-cover-image

+ +
+
+

This demo shows how to plot 2D colored contour with streamlines and levels

card-cover-image

+ +
+
+

This demo shows how to plot 2D colored contour slices for 3D data

card-cover-image

+ +
+
+

This demo shows how to plot field lines with multi-processing

card-cover-image

+ +
+
+

This demo shows how to plot field lines with handpicked seeds.

card-cover-image

+ +
+
+

This demo shows how to extract the bow shock location and save into file

card-cover-image

+ +
+
+

This demo shows how to extract the bow shock location and plot

card-cover-image

+ +
+
+

This demo shows how to extract difference between grids

card-cover-image

+ +
+
+

This demo shows how to plot energy spectrum at a fixed point

card-cover-image

+ +
+
+

This demo shows how to trace streamlines in a 2D field

card-cover-image

+ +
+
+

This demo shows how to trace streamlines in a 3D field

card-cover-image

+ +
+
+

This demo shows how to extract variables along a line with multi-processing

card-cover-image

+ +
+
+

This demo shows how to extract a variable along a line

card-cover-image

+ +
+
+

This demo shows how to plot variable along a line

card-cover-image

+ +
+
+

This demo shows how to plot variables along a line

card-cover-image

+ +
+
+

This demo shows how to plot mesh

card-cover-image

+ +
+
+

This demo shows how to plot across nodes

card-cover-image

+ +
+
+

This demo shows how to extract poynting flux on a subdomain

card-cover-image

+ +
+
+

This demo shows how to plot pressure tensor

card-cover-image

+ +
+
+

This demo shows how to plot velocity distribution function

card-cover-image

+ +
+
+

This demo shows how to plot velocity distribution functions

card-cover-image

+ +
+
+

This demo shows how to plot vector components

card-cover-image

+ +

diff --git a/v0.11.5/examples/postprocess/demo_convert2vti/index.html b/v0.11.5/examples/postprocess/demo_convert2vti/index.html new file mode 100644 index 00000000..1a84339a --- /dev/null +++ b/v0.11.5/examples/postprocess/demo_convert2vti/index.html @@ -0,0 +1,9 @@ + +Converting to VTK · Vlasiator.jl

Converting to VTK

Author Update time

To convert VLSV time series files to VTK image files using multithreads,

using Vlasiator
+
+files = filter(endswith(".vlsv"), readdir())
+
+Threads.@threads for file in files
+   @info file, Threads.threadid()
+   write_vtk(file; vti=true)
+end

This page was generated using DemoCards.jl.

diff --git a/v0.11.5/examples/postprocess/demo_em_extract_slice/index.html b/v0.11.5/examples/postprocess/demo_em_extract_slice/index.html new file mode 100644 index 00000000..8bcb1b29 --- /dev/null +++ b/v0.11.5/examples/postprocess/demo_em_extract_slice/index.html @@ -0,0 +1,94 @@ + +Extract EM fields on a slice · Vlasiator.jl

Extract EM fields on a slice

Author Update time

To save Epar, Eperp, B in a selected slice region from 3D VLSV outputs,

using Vlasiator
+using JLD2: jldsave
+using StaticArrays
+using LinearAlgebra: norm
+
+function getvars(meta::MetaVLSV, pArgs::Vlasiator.PlotArgs, normal::Symbol, range1, range2)
+   (;origin, idlist, indexlist) = pArgs
+
+   B = readvariable(meta, "vg_b_vol")
+
+   Bout = @views refineslice(meta, idlist, B[:,indexlist], normal)[:, range1, range2]
+
+   ncells = meta.ncells .* 2^meta.maxamr
+   if normal == :x
+      dir = 1
+   elseif normal == :y
+      dir = 2
+   elseif normal == :z
+      dir = 3
+   else
+      @error "Unknown normal direction $normal"
+   end
+
+   sliceratio = (origin - meta.coordmin[dir]) / (meta.coordmax[dir] - meta.coordmin[dir])
+   0.0 ≤ sliceratio ≤ 1.0 || error("slice plane index out of bound!")
+   # Find the cut plane index for each refinement level
+   icut = floor(Int, sliceratio*ncells[dir]) + 1
+
+   E = readvariable(meta, "fg_e", true, true)
+
+   E = if normal == :x
+      E[:,icut,range1,range2]
+   elseif normal == :y
+      E[:,range1,icut,range2]
+   elseif normal == :z
+      E[:,range1,range2,icut]
+   end
+
+   n2D = meta["n"][indexlist]
+
+   n = refineslice(meta, idlist, n2D, normal)[range1, range2]
+
+   v2D = meta["proton/vg_v"][:,indexlist]
+   v = @views refineslice(meta, idlist, v2D, normal)[:, range1, range2]
+
+   p2D = meta["P"][indexlist]
+   p = refineslice(meta, idlist, p2D, normal)[range1, range2]
+
+   E, Bout, n, v, p
+end
+
+function main()
+   # Parameters
+   directory = "/home/hongyang/runs/3D/EGI/bulk/dense_cold_hall1e5_afterRestart374/"
+   outdir = "EM/"
+   outfile = "EM.jld2"
+
+   files = filter(contains(r"^bulk.*\.vlsv$"), readdir(directory))
+   # Only orthogonal slices are supported
+   normal = :y # (:x, :y, :z)
+   origin = 0.0
+   var = "e"
+   axisunit = EARTH
+
+   meta = load(files[1])
+
+   pArgs = Vlasiator.set_args(meta, var, axisunit; normal, origin)
+
+   x1, x2 = Vlasiator.get_axis(pArgs)
+
+   extent = [-23., 12., -10., 10.]
+
+   range1, range2 =
+      searchsortedfirst(x1, extent[1]):searchsortedlast(x1, extent[2]),
+      searchsortedfirst(x2, extent[3]):searchsortedlast(x2, extent[4])
+
+   E = zeros(Float32, 3, length(range1), length(range2), length(files))
+   B = zeros(Float32, 3, length(range1), length(range2), length(files))
+   n = zeros(Float32, length(range1), length(range2), length(files))
+   v = zeros(Float32, 3, length(range1), length(range2), length(files))
+   p = zeros(Float32, length(range1), length(range2), length(files))
+
+   for i in eachindex(files)
+      meta = load(files[i])
+      E[:,:,:,i], B[:,:,:,i], n[:,:,i], v[:,:,:,i], p[:,:,i] =
+         getvars(meta, pArgs, normal, range1, range2)
+   end
+
+   # Save into binary file
+   jldsave(outdir*outfile; E, B, n, v, p)
+end
+
+main()

This page was generated using DemoCards.jl.

diff --git a/v0.11.5/examples/postprocess/demo_lineextracting_mt/index.html b/v0.11.5/examples/postprocess/demo_lineextracting_mt/index.html new file mode 100644 index 00000000..eb0b0fd0 --- /dev/null +++ b/v0.11.5/examples/postprocess/demo_lineextracting_mt/index.html @@ -0,0 +1,46 @@ + +Extract variables along a line · Vlasiator.jl

Extract variables along a line

Author Update time

To extract variables along a line across multiple frames using multithreads,

using Vlasiator
+using JLD2: jldsave
+
+function main()
+   files = filter(contains(r"^bulk.*\.vlsv$"), readdir())
+   nfile = length(files)
+   # Define end points of the line in Earth radius
+   x1, x2 = 6.0, 20.0
+   point1 = [x1, 0, 0] .* Vlasiator.RE
+   point2 = [x2, 0, 0] .* Vlasiator.RE
+   # Extract cell info along the line
+   cellids, distances, coords =
+      load(files[1]) do meta
+         getcellinline(meta, point1, point2)
+      end
+   # WARNING: this may not be exact due to round-off errors in output time stamps!
+   t = let tstart = load(files[1]).time, tend = load(files[end]).time
+      range(round(tstart,digits=1), round(tend, digits=1), length=nfile)
+   end
+
+   n = zeros(Float32, length(cellids), nfile)
+   v = zeros(Float32, 3, length(cellids), nfile)
+   p = zeros(Float32, 6, length(cellids), nfile)
+   b = similar(v)
+   e = similar(v)
+
+   Threads.@threads for i in eachindex(files)
+      println("i = $i/$nfile, file = $(files[i])")
+      local meta = load(files[i])
+
+      n[:,i] = readvariable(meta, "proton/vg_rho", cellids)
+      v[:,:,i] = readvariable(meta, "proton/vg_v", cellids)
+      p[1:3,:,i] = readvariable(meta, "proton/vg_ptensor_diagonal", cellids)
+      p[4:6,:,i] = readvariable(meta, "proton/vg_ptensor_offdiagonal", cellids)
+      b[:,:,i] = readvariable(meta, "vg_b_vol", cellids)
+      e[:,:,i] = readvariable(meta, "vg_e_vol", cellids)
+   end
+
+   # Save into binary file
+   jldsave("vars_sun_earth_line.jld2"; x1, x2, t, n, v, p, b, e)
+
+   println("Line extraction finished!")
+end
+
+main()

This page was generated using DemoCards.jl.

diff --git a/v0.11.5/examples/postprocess/demo_log/index.html b/v0.11.5/examples/postprocess/demo_log/index.html new file mode 100644 index 00000000..cf51b8bd --- /dev/null +++ b/v0.11.5/examples/postprocess/demo_log/index.html @@ -0,0 +1,14 @@ + +Log tracking · Vlasiator.jl

Log tracking

Author Update time

This is an example of extracting log file timing information and visualize them.

using Vlasiator, Dates, Plots
+
+# plotly is nice for scanning through data interactively
+plotly()
+
+const file = "logfile.txt"
+
+timestamps, speed = readlog(file)
+
+scatter(timestamps, speed,
+   markershape=:circle,
+   #yaxis=:log10,
+   xlabel="Time", ylabel="Time per simulated second [s]")

This page was generated using DemoCards.jl.

diff --git a/v0.11.5/examples/postprocess/demo_magnetopause_2d_mt/index.html b/v0.11.5/examples/postprocess/demo_magnetopause_2d_mt/index.html new file mode 100644 index 00000000..70d65123 --- /dev/null +++ b/v0.11.5/examples/postprocess/demo_magnetopause_2d_mt/index.html @@ -0,0 +1,66 @@ + +Extract variables along the magnetopause · Vlasiator.jl

Extract variables along the magnetopause

Author Update time

This demo shows how to extract variables along the magnetopause defined by Bz == 0 from multiple frames.

Usage:

julia -t 4 demo_magnetopause_2d_mt.jl

or

JULIA_NUM_THREADS=4 julia demo_magnetopause_2d_mt.jl
using Vlasiator
+using Vlasiator: RE # Earth radius, [m]
+using JLD2: jldsave
+
+"""
+    extract_magnetopause_var(files; zmin=-4RE, zmax=4RE, verbose=true)
+
+Extract variables on the magnetopause defined by ``B_z = 0``.
+"""
+function extract_magnetopause_var(files; zmin=-4RE, zmax=4RE, verbose=true)
+   nfiles = length(files)
+
+   verbose && println("Number of files: $nfiles")
+
+   meta = load(files[1])
+
+   x = LinRange{Float32}(meta.coordmin[1], meta.coordmax[1], meta.ncells[1])
+   z = LinRange{Float32}(meta.coordmin[3], meta.coordmax[3], meta.ncells[3])
+
+   z_range = let zmin_ = searchsortedfirst(z, zmin), zmax_ = searchsortedlast(z, zmax)
+      zmin_:zmax_
+   end
+
+   x_crossing = zeros(Float32, length(z_range))
+   z_crossing = z[z_range]
+
+   cellids = Vector{Int}(undef, length(z_range))
+
+   x_crossings = zeros(length(z_range), nfiles)
+   v = zeros(3, length(z_range), nfiles)
+   ey = zeros(length(z_range), nfiles)
+
+   Threads.@threads for ifile in eachindex(files)
+      verbose && println("$(files[ifile]) on thread $(Threads.threadid())")
+      meta = load(files[ifile])
+
+      # Obtain thermal temperature
+      b = meta["vg_b_vol"]
+      b = reshape(b, 3, meta.ncells[1], meta.ncells[3])
+
+      # Extract the last point from right to left which fulfills Bz < 0
+      for (i,k) in enumerate(z_range) # scan in z direction
+         ind_ = findlast(>(0), @view b[3,:,k]) + 1 # count from upstream
+         isnothing(ind_) && (ind_ = 1) # if not found then set to 1
+         x_crossing[i] = x[ind_]
+      end
+
+      cellids = [ getcell(meta, [x_crossing[i], 0, z_crossing[i]])
+         for i in eachindex(x_crossing, z_crossing) ]
+
+      x_crossings[:,ifile] = x_crossing
+      v[:,:,ifile] = readvariable(meta, "proton/vg_v", cellids)
+      ey[:,ifile] = readvariable(meta, "vg_e_vol", cellids)[2,:]
+   end
+
+   z_crossing, x_crossings, v, ey
+end
+
+######
+
+files = filter(contains(r"^bulk.*\.vlsv$"), readdir())
+
+@time z,x,v,ey = extract_magnetopause_var(files)
+
+jldsave("magnetopause.jld2"; z,x,v,ey)

This page was generated using DemoCards.jl.

diff --git a/v0.11.5/examples/postprocess/demo_pointextracting/index.html b/v0.11.5/examples/postprocess/demo_pointextracting/index.html new file mode 100644 index 00000000..8a80492c --- /dev/null +++ b/v0.11.5/examples/postprocess/demo_pointextracting/index.html @@ -0,0 +1,81 @@ + +Virtual satellite · Vlasiator.jl

Virtual satellite

Author Update time

This demo shows how to extract data for a virtual satellite. Outputs are stored in CSV format for sharing data.

Usage:

julia -t nthreads demo_virtual_satellite.jl

or

JULIA_NUM_THREADS=nthreads julia demo_virtual_satellite.jl
using DelimitedFiles, Vlasiator, DataFrames
+using Vlasiator: RE # Earth radius [m]
+
+function extract_vars(files, loc)
+   nfiles = length(files)
+   # variables to be extracted
+   t   = zeros(Float32, nfiles)
+   rho = zeros(Float32, nfiles)
+   v   = zeros(Float32, 3, nfiles)
+   p   = zeros(Float32, nfiles)
+   b   = zeros(Float32, 3, nfiles)
+   e   = zeros(Float32, 3, nfiles)
+
+   id = load(files[1]) do meta
+      getcell(meta, loc)
+   end
+
+   # Extract data from each frame
+   Threads.@threads for i = eachindex(files)
+      meta = load(files[i])
+      t[i] = meta.time
+      rho[i] = readvariable(meta, "proton/vg_rho", id)[1]
+      v[:,i] = readvariable(meta, "proton/vg_v", id)
+      p[i] = readvariable(meta, "vg_pressure", id)[1]
+      b[:,i] = readvariable(meta, "vg_b_vol", id)
+      e[:,i] = readvariable(meta, "vg_e_vol", id)
+   end
+
+   df = DataFrame(t = t, rho = rho, v = v, p = p, b = b, e = e)
+   # Save into text file
+   writedlm("satellite.csv", Iterators.flatten(([names(df)], eachrow(df))), ',')
+end
+
+#####
+
+files = filter(contains(r"^bulk.*\.vlsv$"), readdir())
+
+# virtual satellite location
+const loc = Float64[12, 0, 0] .* RE
+
+println("Number of files: $(length(files))")
+println("Extracting location: $loc")
+println("Running with $(Threads.nthreads()) threads...")
+
+@time extract_vars(files, loc)
+
+println("Virtual satellite extraction done!")
+
+## Visualization
+#=
+using PyPlot, DelimitedFiles
+
+data = readdlm("satellite.csv", ','; header=true)
+
+fig, ax = subplots(figsize=(8,10), 5,1, sharex=true, constrained_layout=true)
+
+ax[1].plot(data[1][:,1], data[1][:,2] ./ 1e6, label="density")
+ax[2].plot(data[1][:,1], data[1][:,3] ./ 1e3, label="vx")
+ax[2].plot(data[1][:,1], data[1][:,4] ./ 1e3, label="vy")
+ax[3].plot(data[1][:,1], data[1][:,5] .* 1e9, label="p")
+ax[4].plot(data[1][:,1], data[1][:,6] .* 1e9, label="bz")
+ax[5].plot(data[1][:,1], data[1][:,7] .* 1e3, label="ex")
+ax[5].plot(data[1][:,1], data[1][:,8] .* 1e3, label="ey")
+
+for a in ax
+   a.grid(true)
+   a.legend()
+end
+
+ax[1].set_ylabel("density [amu/cc]", fontsize=14)
+ax[2].set_ylabel("velocity [km/s]", fontsize=14)
+ax[3].set_ylabel("pressure [nPa]", fontsize=14)
+ax[4].set_ylabel("magnetic field [nT]", fontsize=14)
+ax[5].set_ylabel("electric field [mV/m]", fontsize=14)
+ax[5].set_xlabel("time [s]", fontsize=14)
+
+fig.suptitle("Density Pulse Run, location = [12, 0, 0]", fontsize="xx-large")
+
+savefig("virtual_satellite.png", bbox_inches="tight")
+=#

This page was generated using DemoCards.jl.

diff --git a/v0.11.5/examples/postprocess/demo_pointsextracting/index.html b/v0.11.5/examples/postprocess/demo_pointsextracting/index.html new file mode 100644 index 00000000..8d443f00 --- /dev/null +++ b/v0.11.5/examples/postprocess/demo_pointsextracting/index.html @@ -0,0 +1,54 @@ + +Virtual satellites · Vlasiator.jl

Virtual satellites

Author Update time

This demo shows how to extract data for virtual satellites at multiple locations. Outputs are stored in binary format for sharing within Julia.

Usage:

julia -t nthreads demo_pointsextracting.jl

or

JULIA_NUM_THREADS=nthreads julia demo_pointsextracting.jl
using Vlasiator
+using Vlasiator: RE # Earth radius, [m]
+using JLD2: jldsave
+
+function extract_vars(files, locations)
+   nfiles = length(files)
+   nlocs = length(locations)
+   # variables to be extracted
+   t   = zeros(Float32, nfiles)
+   rho = zeros(Float32, nlocs, nfiles)
+   v   = zeros(Float32, 3, nlocs, nfiles)
+   p   = zeros(Float32, nlocs, nfiles)
+   b   = zeros(Float32, 3, nlocs, nfiles)
+   e   = zeros(Float32, 3, nlocs, nfiles)
+
+   ids = Vector{Int}(undef, nlocs)
+   load(files[1]) do meta
+      for iloc in eachindex(locations)
+         ids[iloc] = getcell(meta, locations[iloc])
+      end
+   end
+
+   # Extract data from each frame
+   Threads.@threads for i = eachindex(files)
+      meta = load(files[i])
+      t[i] = meta.time
+      rho[:,i] = readvariable(meta, "proton/vg_rho", ids)
+      v[:,:,i] = readvariable(meta, "proton/vg_v",   ids)
+      p[  :,i] = readvariable(meta, "vg_pressure",   ids)
+      b[:,:,i] = readvariable(meta, "vg_b_vol",      ids)
+      e[:,:,i] = readvariable(meta, "vg_e_vol",      ids)
+   end
+
+   # Save into binary file
+   jldsave("satellites.jld2"; locations, t, rho, v, p, b, e)
+end
+
+#####
+
+files = filter(contains(r"^bulk.*\.vlsv$"), readdir())
+
+# virtual satellite locations
+const locations = [[7RE, 0, 0], [9RE, 0, 0], [11RE, 0, 0], [12RE, 0, 0],
+   [13RE, 0, 0], [14RE, 0, 0], [15RE, 0, 0], [16RE, 0, 0], [17RE, 0, 0],
+   [29.3RE, 0, 0]]
+
+println("Number of files: $(length(files))")
+println("Number of virtual satellites: $(length(locations))")
+println("Running with $(Threads.nthreads()) threads...")
+
+@time extract_vars(files, locations)
+
+println("Virtual satellite extraction done!")

This page was generated using DemoCards.jl.

diff --git a/v0.11.5/examples/postprocess/demo_pointsextracting_2d_uniform/index.html b/v0.11.5/examples/postprocess/demo_pointsextracting_2d_uniform/index.html new file mode 100644 index 00000000..98bda710 --- /dev/null +++ b/v0.11.5/examples/postprocess/demo_pointsextracting_2d_uniform/index.html @@ -0,0 +1,74 @@ + +Virtual satellites · Vlasiator.jl

Virtual satellites

Author Update time

This demo shows how to extract data for virtual satellites at uniformly sampled locations on a 2D plane. Outputs are stored in binary format for sharing within Julia.

using Vlasiator
+using JLD2: jldsave
+
+"Select cells in 2D `meta` with uniform distance `dx`."
+function sample(meta, dx)
+   dcell = floor(Int, dx ÷ meta.dcoord[1])
+
+   cellid = sort(collect(keys(meta.celldict)))
+   cellid = reshape(cellid, meta.ncells[1], meta.ncells[2])
+   cellid_select = cellid[1+dcell:dcell:end-dcell, 1+dcell:dcell:end-dcell]
+end
+
+function extract_vars(files, dx)
+   nfiles = length(files)
+
+   meta = load(files[1])
+   ids = sample(meta, dx)
+   locations = [getcellcoordinates(meta, id) for id in ids]
+
+   nsize = size(ids)
+   println("Number of virtual satellites: $(length(ids))")
+
+   # variables to be extracted
+   t   = zeros(Float32, nfiles)
+   rho = zeros(Float32, nfiles, nsize[1], nsize[2])
+   vx  = zeros(Float32, nfiles, nsize[1], nsize[2])
+   vy  = zeros(Float32, nfiles, nsize[1], nsize[2])
+   vz  = zeros(Float32, nfiles, nsize[1], nsize[2])
+   p   = zeros(Float32, nfiles, nsize[1], nsize[2])
+   bx  = zeros(Float32, nfiles, nsize[1], nsize[2])
+   by  = zeros(Float32, nfiles, nsize[1], nsize[2])
+   bz  = zeros(Float32, nfiles, nsize[1], nsize[2])
+   ex  = zeros(Float32, nfiles, nsize[1], nsize[2])
+   ey  = zeros(Float32, nfiles, nsize[1], nsize[2])
+   ez  = zeros(Float32, nfiles, nsize[1], nsize[2])
+
+   # Extract data from each frame
+   for i = eachindex(files)
+      meta = load(files[i])
+      t[i] = meta.time
+      rho[i,:,:] = readvariable(meta, "proton/vg_rho", ids)
+      v = readvariable(meta, "proton/vg_v", ids)
+      vx[i,:,:] = v[1,:]
+      vy[i,:,:] = v[2,:]
+      vz[i,:,:] = v[3,:]
+      p[i,:,:] = readvariable(meta, "vg_pressure", ids)
+      b = readvariable(meta, "vg_b_vol", ids)
+      bx[i,:,:] = b[1,:]
+      by[i,:,:] = b[2,:]
+      bz[i,:,:] = b[3,:]
+      e = readvariable(meta, "vg_e_vol", ids)
+      ex[i,:,:] = e[1,:]
+      ey[i,:,:] = e[2,:]
+      ez[i,:,:] = e[3,:]
+   end
+
+   # Save into binary file
+   jldsave("satellites_uniform_sampled.jld2";
+      locations, t, rho, vx, vy, vz, p, bx, by, bz, ex, ey, ez)
+end
+
+#####
+
+files = filter(contains(r"^bulk.*\.vlsv$"), readdir())
+
+const dx = 5RE # uniform sampling distance [m]
+
+println("Number of files: $(length(files))")
+println("Running with $(Threads.nthreads()) threads...")
+
+@time extract_vars(files, dx)
+
+println("Virtual satellite extraction done!")

This page was generated using DemoCards.jl.

diff --git a/v0.11.5/examples/postprocess/demo_wave_satellite_mt/index.html b/v0.11.5/examples/postprocess/demo_wave_satellite_mt/index.html new file mode 100644 index 00000000..d611e902 --- /dev/null +++ b/v0.11.5/examples/postprocess/demo_wave_satellite_mt/index.html @@ -0,0 +1,217 @@ + +Identify EMIC and mirror modes · Vlasiator.jl

Identify EMIC and mirror modes

Author Update time

This demo shows how to identify EMIC and mirror modes in two frequency bands from single satellite data. For EMIC mode we check δB⟂ vs. δv⟂; for mirror mode we check δB∥ vs. δn. The moving box window size is decided empirically.

Usage:

julia -t 4 demo_wave_satellite_mt.jl

or

JULIA_NUM_THREADS=4 julia demo_wave_satellite_mt.jl
using Statistics: mean
+using LinearAlgebra: ⋅, normalize!, norm
+using DSP, PyPlot
+using Vlasiator
+using Vlasiator: μ₀, mᵢ, RE
+using Polyester
+
+"Extract variables at `loc` from VLSV `files`."
+function extract_vars(files, loc)
+   nfiles = length(files)
+
+   t = zeros(Float32, nfiles)
+   n = zeros(Float32, nfiles)
+   v = zeros(Float32, 3, nfiles)
+   b = zeros(Float32, 3, nfiles)
+   e = zeros(Float32, 3, nfiles)
+
+   id = load(files[1]) do meta
+      getcell(meta, loc)
+   end
+
+   # Extract data from each frame
+   @batch for i = eachindex(files)
+      meta = load(files[i])
+      t[i] = meta.time
+      n[i] = readvariable(meta, "proton/vg_rho", id)[1]
+      v[:,i] = readvariable(meta, "proton/vg_v", id)
+      b[:,i] = readvariable(meta, "vg_b_vol", id)
+      e[:,i] = readvariable(meta, "vg_e_vol", id)
+   end
+
+   t, n, v, e, b
+end
+
+function moving_average(g::AbstractVector{<:AbstractFloat}, n::Int)
+   nbackward = div(n,2)
+   nforward = isodd(n) ? nbackward : nbackward - 1
+   len = length(g)
+   g_avg = similar(g)
+   @inbounds @batch for i = 1:len
+      lo = max(1, i - nbackward)
+      hi = min(len, i + nforward)
+      g_avg[i] = mean(@view g[lo:hi])
+   end
+   g_avg
+end
+
+function moving_average(g::AbstractMatrix{<:AbstractFloat}, n::Int)
+   nbackward = div(n,2)
+   nforward = isodd(n) ? nbackward : nbackward - 1
+   len = size(g,2)
+   g_avg = similar(g)
+   for icomp = axes(g,1)
+      @inbounds @batch for i = 1:len
+         lo = max(1, i - nbackward)
+         hi = min(len, i + nforward)
+         g_avg[icomp,i] = mean(@view g[icomp, lo:hi])
+      end
+   end
+   g_avg
+end
+
+function detrend(v::AbstractVector{<:AbstractFloat}; nbox=length(v)÷12)
+   v̄ = moving_average(v, nbox)
+   dv = v .- v̄
+end
+
+function detrend(v::AbstractMatrix{<:AbstractFloat}; nbox=size(v,2)÷12)
+   v̄ = similar(v)
+   for i in axes(v,1)
+      v̄[i,:] = @views moving_average(v[i,:], nbox)
+   end
+   dv = v .- v̄
+end
+
+function align_yaxis(ax1, ax2)
+   y_lims = [ax.get_ylim() for ax in [ax1, ax2]]
+
+   # normalize both axes
+   y_mags = ntuple(i -> y_lims[i][2] - y_lims[i][1], Val(2))
+   y_lims_normalized = ntuple(i -> y_lims[i] ./ y_mags[i], Val(2))
+
+   # find combined range
+   y_new_lims_normalized = (min(y_lims_normalized[1][1],y_lims_normalized[2][1]),
+      max(y_lims_normalized[1][2], y_lims_normalized[2][2]))
+
+   # denormalize combined range to get new axes
+   new_lim1 = y_new_lims_normalized .* y_mags[1]
+   new_lim2 = y_new_lims_normalized .* y_mags[2]
+   ax1.set_ylim(new_lim1)
+   ax2.set_ylim(new_lim2)
+   return
+end
+
+function main()
+   files = filter(contains(r"^bulk.*\.vlsv$"), readdir())
+
+   # virtual satellite location
+   loc = [12Vlasiator.RE, 0, 0]
+
+   nbox = 40 # moving box size, [# of indices]
+   fs = 2.0 # sampling rate, [Hz]
+
+   println("Running with $(Threads.nthreads()) threads...")
+   println("Number of files: $(length(files))")
+   println("Extracting location: $loc [m]")
+   println("Sampling rate: $fs [Hz]")
+   println("Moving box window size: $(nbox / fs) [s]")
+
+   t, n, v, e, b = extract_vars(files, loc)
+
+   bmag = [hypot(b[1,i], b[2,i], b[3,i]) for i in eachindex(n)]
+
+   # Detrend before filtering to remove the lowest frequency changes
+   dn = detrend(n; nbox)
+   dbmag = detrend(bmag; nbox)
+
+   n̄ = moving_average(n, nbox)
+   b̄mag = moving_average(bmag, nbox)
+
+   v̄a = @. b̄mag / sqrt(μ₀ * mᵢ * n̄)
+
+   dv = detrend(v; nbox) # [m/s]
+   db = detrend(b; nbox) # [T]
+
+   # Decompose into parallel and perpendicular vector components
+   b̂₀ = moving_average(b, nbox)
+   for i in axes(b̂₀, 2)
+      normalize!(@view b̂₀[:,i])
+   end
+
+   # δB∥
+   db_par = [db[:,i] ⋅ b̂₀[:,i] for i in axes(db, 2)]
+   # δB⟂
+   db_perp = [norm(db[:,i] .- db_par[i] .* b̂₀[:,i]) for i in axes(db, 2)]
+   # δv∥
+   dv_par = [dv[:,i] ⋅ b̂₀[:,i] for i in axes(dv, 2)]
+   # δv⟂
+   dv_perp = [norm(dv[:,i] .- dv_par[i] .* b̂₀[:,i]) for i in axes(dv, 2)]
+
+   designmethod = Butterworth(5)
+
+   responsetype = Highpass(0.1; fs)
+   dn_high = filtfilt(digitalfilter(responsetype, designmethod), dn)
+   dbpar_high = filtfilt(digitalfilter(responsetype, designmethod), db_par)
+   dbperp_high = filtfilt(digitalfilter(responsetype, designmethod), db_perp)
+   dvperp_high = filtfilt(digitalfilter(responsetype, designmethod), dv_perp)
+
+   responsetype = Bandpass(0.02, 0.067; fs)
+   dn_low = filtfilt(digitalfilter(responsetype, designmethod), dn)
+   dbpar_low = filtfilt(digitalfilter(responsetype, designmethod), db_par)
+
+   color1 = "tab:blue"
+   color2 = "tab:red"
+
+   fig, axs = plt.subplots(3, 1; figsize=(13, 9), sharex=true, constrained_layout=true)
+
+   fig.suptitle("Virtual satellite at $(string(round.(loc./RE, digits=2))) "*L"R_E";
+      fontsize="x-large")
+
+   axs[1].plot(t, dn_low ./ n̄, color1, label=L"\delta n, 0.02-0.067\, Hz")
+   ax12 = axs[1].twinx()
+   ax12.plot(t, dbpar_low ./ b̄mag, color=color2, label=L"\delta B, 0.02-0.067\, Hz")
+
+   axs[2].plot(t, (dn_high ./ n̄), color1, label=L"\delta n, 0.1-1.0\, Hz")
+   ax22 = axs[2].twinx()
+   ax22.plot(t, (dbpar_high ./ b̄mag), color=color2, label=L"\delta B, 0.1-1.0\, Hz")
+
+   axs[3].plot(t, dvperp_high ./ v̄a, color1, label=L"\delta v_\perp, 0.1-1.0\, Hz")
+   ax32 = axs[3].twinx()
+   ax32.plot(t, dbperp_high ./ b̄mag, color=color2, label=L"\delta B, 0.1-1.0\, Hz")
+
+   axs[3].set_xlabel("time [s]"; fontsize="large")
+
+   n_str = (L"\delta n /n", L"\delta n / n", L"\delta v_\perp / V_A")
+
+   for (i, a) in enumerate(axs)
+      a.hlines(0.0, t[1], t[end]; colors="k", linestyle="dashed", alpha=0.3)
+      a.tick_params(axis="y", labelcolor=color1)
+      a.xaxis.set_minor_locator(matplotlib.ticker.AutoMinorLocator())
+      a.yaxis.set_minor_locator(matplotlib.ticker.AutoMinorLocator())
+      a.grid(true)
+      a.set_ylabel(n_str[i], color=color1, fontsize=14)
+   end
+
+   axtwin = (ax12, ax22, ax32)
+   b_str = ( L"\delta B_\parallel / B_0", L"\delta B_\parallel / B_0", L"\delta B_\perp / B_0")
+
+   for (i, a) in enumerate(axtwin)
+      a.tick_params(axis="y", labelcolor=color2)
+      a.yaxis.set_minor_locator(matplotlib.ticker.AutoMinorLocator())
+      a.set_ylabel(b_str[i], color=color2, fontsize="large")
+      align_yaxis(axs[i], a)
+   end
+
+   AnchoredText = matplotlib.offsetbox.AnchoredText
+
+   at = AnchoredText(
+      "[0.02, 0.067] Hz band", prop=Dict("size"=>"medium"), frameon=true, loc="lower left")
+   at.patch.set_boxstyle("round,pad=0.,rounding_size=0.2")
+   axs[1].add_artist(at)
+
+   at = AnchoredText(
+      "[0.1, 1.0] Hz band", prop=Dict("size"=>"medium"), frameon=true, loc="lower left")
+   at.patch.set_boxstyle("round,pad=0.,rounding_size=0.2")
+   axs[2].add_artist(at)
+
+   at = AnchoredText(
+      "[0.1, 1.0] Hz band", prop=Dict("size"=>"medium"), frameon=true, loc="lower left")
+   at.patch.set_boxstyle("round,pad=0.,rounding_size=0.2")
+   axs[3].add_artist(at)
+
+   savefig("virtual_satellite_wave.png"; dpi=300)
+end
+
+main()

This page was generated using DemoCards.jl.

diff --git a/v0.11.5/examples/postprocess/demo_wave_search_mt/index.html b/v0.11.5/examples/postprocess/demo_wave_search_mt/index.html new file mode 100644 index 00000000..b7377429 --- /dev/null +++ b/v0.11.5/examples/postprocess/demo_wave_search_mt/index.html @@ -0,0 +1,163 @@ + +Search waves · Vlasiator.jl

Search waves

Author Update time

This demo shows how to search for wave-like structures and plot spatial-temporal distributions.

Procedures:

  1. Extract variables in all cells from all snapshots.
  2. For each cell and time interval, count time-series local peaks.
  3. Plot the peak occurrence frequencies across the whole domain as an indicator for waves.
Note
  1. When dealing with multiple variables, it is recommended to handle one variable at a

time through the whole process due to memory considerations. With large number of frame counts, the current procedure is still memory-consuming.

  1. It assumes uniform sampling in time.
  2. Peak-finding is threaded, but plotting is still serial.

Usage:

julia -t 4 demo_wave_search_mt.jl

or

JULIA_NUM_THREADS=4 julia demo_wave_search_mt.jl
using Vlasiator, PyPlot, LaTeXStrings
+
+"Extract time series variable"
+function extract_var(files, ncells, varname, component=0)
+   nfiles = length(files)
+   var = zeros(Float32, ncells[1], ncells[2], nfiles)
+
+   # Extract data from each frame
+   if component == 0 # scalar
+      Threads.@threads for i = eachindex(files)
+         meta = load(files[i])
+         var[:,:,i] = meta[varname]
+      end
+   else # vector component
+      Threads.@threads for i = eachindex(files)
+         meta = load(files[i])
+         var[:,:,i] = meta[varname][component,:]
+      end
+   end
+
+   return var
+end
+
+"Count local maxima of vector `y` with moving box length `n`."
+function countpeaks(y, n; interval=1)
+   maxs = Int[]
+   if interval == 1
+      for i in 2:length(y)-1
+         if y[i-1] < y[i] > y[i+1]
+            push!(maxs, i)
+         end
+      end
+   elseif interval == 2
+      for i in 3:length(y)-2
+         if y[i-2] ≤ y[i-1] < y[i] > y[i+1] ≥ y[i+2]
+            push!(maxs, i)
+         end
+      end
+   elseif interval == 3
+      for i in 4:length(y)-3
+         if y[i-3] ≤ y[i-2] ≤ y[i-1] < y[i] > y[i+1] ≥ y[i+2] > y[i+3]
+            push!(maxs, i)
+         end
+      end
+   else
+      error("interval = $interval not implemented!")
+   end
+   nCounts = zeros(Int, length(y)-n+1)
+   nCounts[1] = count(i->(1 ≤ i ≤ n), maxs)
+   for i in 1:length(y)-n
+      nCounts[i+1] = nCounts[i]
+      if i ∈ maxs
+         nCounts[i+1] -= 1
+      end
+      if i+n-1 ∈ maxs
+         nCounts[i+1] += 1
+      end
+   end
+   nCounts
+end
+
+"Check wave-like occurrence frequencies within box length `n` of output interval `dt`."
+function checkwaves_sma(var, dt=0.5, n::Int=size(var,3); interval=1)
+   nPeaks = zeros(Int, size(var,3)-n+1, size(var,1), size(var,2))
+
+   Threads.@threads for j in axes(var, 2)
+      for i in axes(var, 1)
+         var_series = @view var[i,j,:]
+         nPeaks[:,i,j] = countpeaks(var_series, n; interval)
+      end
+   end
+   nPeaks ./ (n*dt)
+end
+
+function plot_dist(files, varnames, varnames_print, components, Δt, nboxlength;
+   interval=1, nplotstride=1)
+   @assert nboxlength ≥ 3 && isodd(nboxlength) "Expect odd box length ≥ 3!"
+   if (local nfiles = length(files)) < nboxlength
+      @warn "Set moving box length to the number of files..."
+      nboxlength = nfiles
+   end
+   local x, y, tStart, tEnd, ncells
+   let RE = Vlasiator.RE
+      meta = load(files[1])
+      tStart = meta.time
+      ncells = meta.ncells
+      x = LinRange{Float32}(meta.coordmin[1]/RE, meta.coordmax[1]/RE, meta.ncells[1])
+      y = LinRange{Float32}(meta.coordmin[2]/RE, meta.coordmax[2]/RE, meta.ncells[2])
+      meta = load(files[end])
+      tEnd = meta.time
+   end
+
+   fig, ax = plt.subplots(figsize=(16,9))
+   fontsize = 14
+   vmin, vmax = 0.0, 0.5
+   levels = matplotlib.ticker.MaxNLocator(nbins=255).tick_values(vmin, vmax)
+   norm = matplotlib.colors.BoundaryNorm(levels, ncolors=256, clip=true)
+   ticks = range(vmin, vmax, length=11)
+
+   fakedata = zeros(Float32, length(x), length(y))
+   im = ax.pcolormesh(y, x, fakedata; norm)
+
+   ax.set_aspect("equal")
+   ax.set_xlabel(L"y [$R_E$]"; fontsize, weight="black")
+   ax.set_ylabel(L"x [$R_E$]"; fontsize, weight="black")
+   ax.xaxis.set_minor_locator(matplotlib.ticker.AutoMinorLocator())
+   ax.yaxis.set_minor_locator(matplotlib.ticker.AutoMinorLocator())
+   ax.grid(true, color="grey", linestyle="-")
+
+   cb = fig.colorbar(im; ax, ticks, pad=0.02)
+   cb.ax.set_ylabel("Frequency of local maxima occurrence, [#/s]"; fontsize)
+
+   for i in eachindex(varnames)
+      outdir = "../out/$(lowercase(varnames_print[i]))"
+      !isdir(outdir) && mkdir(outdir)
+      length(filter(contains(r"^spatial.*\.png$"), readdir(outdir))) ==
+         length(files) - nboxlength + 1 && continue
+
+      # Obtain time series data
+      var = extract_var(files, ncells, varnames[i], components[i])
+      # Count local peak occuring frequencies at each location
+      fPeaks = checkwaves_sma(var, Δt, nboxlength; interval)
+
+      for it in 1:nplotstride:size(fPeaks,1) # Iterate over time
+         outname = joinpath(outdir,
+            "spatial_perturbation_distribution_$(lpad(it, 4, '0')).png")
+         isfile(outname) && continue
+         # Update plot
+         im.set_array(fPeaks[it,:,:])
+         ax.set_title("$(varnames_print[i]) Perturbation Detection, "*
+            "t = $(round(tStart+(it-1)*Δt, digits=1)) ~ "*
+            "$(round(tStart+(it+nboxlength-1)*Δt, digits=1))s";
+            fontsize, fontweight="bold")
+
+         savefig(outname, bbox_inches="tight")
+      end
+   end
+end
+
+function main()
+   varnames = ["proton/vg_rho", "vg_pressure", "proton/vg_v", "proton/vg_v", "vg_b_vol",
+      "vg_e_vol", "vg_e_vol"]
+   varnames_print = ["Density", "Thermal Pressure", "Vx", "Vy", "Bz", "Ex", "Ey"]
+   components = [0, 0, 1, 2, 3, 1, 2] # 0: scalar; 1: x, 2: y, 3: z
+   Δt = 0.5                           # output time interval [s]
+   nboxlength = 101                   # moving box average length
+   interval = 2                       # local peak gap minimal interval
+   nplotstride = 50                   # plot intervals in frames
+   dir = "./" # data directory
+
+   files = filter(contains(r"^bulk.*\.vlsv$"), readdir(dir))
+
+   println("Total number of snapshots: $(length(files))")
+   println("Running with $(Threads.nthreads()) threads...")
+
+   @time plot_dist(files, varnames, varnames_print, components, Δt, nboxlength;
+      interval, nplotstride)
+
+   println("Virtual satellite extraction done!")
+end
+
+main()

This page was generated using DemoCards.jl.

diff --git a/v0.11.5/examples/postprocess/demo_wave_tracing_mt/index.html b/v0.11.5/examples/postprocess/demo_wave_tracing_mt/index.html new file mode 100644 index 00000000..2a1ace80 --- /dev/null +++ b/v0.11.5/examples/postprocess/demo_wave_tracing_mt/index.html @@ -0,0 +1,404 @@ + +Track waves · Vlasiator.jl

Track waves

Author Update time

This demo shows how to track wave and plot the dispersion relation On a equatorial plane, B ∥ ẑ, we can choose an arbitrary line in-plane. On a meridional plane, B is in-plane, we can find a local line region ∥ B and ⟂ B.

Currently it only works on a equatorial plane.

Usage:

julia -t 4 demo_wave_tracing_mt.jl

or

JULIA_NUM_THREADS=4 julia demo_wave_tracing_mt.jl
using Vlasiator, VlasiatorPyPlot
+using Vlasiator: qᵢ, μ₀, c, mᵢ, ϵ₀, RE
+using DSP, FFTW, ImageFiltering, Interpolations
+using Statistics: mean
+using LinearAlgebra
+
+## Types
+
+struct Variables
+   varnames::Vector{String}
+   varnames_print::Vector{String}
+   components::Vector{Int}
+end
+
+## Methods
+
+ispolar(meta::MetaVLSV) = findfirst(==(1), meta.ncells) == 2
+
+"Extract `component` of variable `varname` at `cellids` from `files`."
+function extract_var(files, varname, cellids, distances, component=0)
+   sample_loc = range(distances[1], distances[end], length=length(distances))
+
+   var = zeros(length(distances), length(files))
+
+   Threads.@threads for i in eachindex(files)
+      meta = load(files[i])
+      if component == 0
+         var_line = readvariable(meta, varname, cellids)[:]
+      else
+         var_line = readvariable(meta, varname, cellids)[component,:]
+      end
+      #TODO: do we need high order interpolations?
+      interp_linear = LinearInterpolation(distances, var_line)
+      var_line_resample = interp_linear.(sample_loc)
+      var_line_smooth = imfilter(var_line_resample, Kernel.gaussian((3,)))
+
+      var[:,i] = var_line_smooth
+   end
+   var
+end
+
+"CFL constrained normalized frequency."
+dispersion_CFL(k, dx, dt, di, ωci) = dx/dt * abs(k) /(di * ωci)
+
+"Normalized frequency of fast magnetosonic waves along angle `θ` with Doppler shift."
+function dispersion_fast_perp(k, θ, vS, vA, v, di, ωci)
+   ω = zeros(length(k))
+
+   turnindex = findfirst(>=(0), k)
+
+   vbulkpar = v[1]*cos(θ) + v[2]*sin(θ)
+
+   dv1 =  √(vS^2 + vA^2) + vbulkpar # propagate along +θ direction
+   dv2 = -√(vS^2 + vA^2) + vbulkpar # propagate along -θ direction
+
+   if dv1 < 0; dv1 = 0.0; end
+   if dv2 > 0; dv2 = 0.0; end
+
+   for i in 1:turnindex-1
+      ω[i] = dv2*k[i] /(di * ωci)
+   end
+
+   for i in turnindex:length(k)
+      ω[i] = dv1*k[i] /(di * ωci)
+   end
+   ω
+end
+
+"Normalized frequency of bulk flow along tilted angle `θ`."
+function dispersion_bulk_flow(k, θ, v, di, ωci)
+   ω = zeros(length(k))
+   turnindex = findfirst(>=(0), k)
+   vbulkpar = v[1]*cos(θ) + v[2]*sin(θ)
+   irange = vbulkpar > 0 ? (turnindex:length(k)) : (1:turnindex)
+   for i in irange # otherwise 0
+      ω[i] = vbulkpar*k[i] /(di * ωci)
+   end
+   ω
+end
+
+"Return the index in sorted `vec` with value closest to `x`."
+function searchsortednearest(vec, x)
+   idx = searchsortedfirst(vec, x)
+   if idx == 1
+      return idx
+   elseif idx > length(vec)
+      return length(vec)
+   elseif vec[idx] == x
+      return idx
+   elseif abs(vec[idx]-x) < abs(vec[idx-1]-x)
+      return idx
+   else
+      return idx-1
+   end
+end
+
+"Obtain fast mode and bulk speed along line `angle` w.r.t. x-axis for cell ID `cid` in
+`meta`."
+function getCharacteristicSpeeds(meta, cid, angle)
+   n = readvariable(meta, "proton/vg_rho", cid)
+   B = readvariable(meta, "vg_b_vol", cid)
+   p = readvariable(meta, "vg_pressure", cid)
+   v = readvariable(meta, "proton/vg_v", cid)
+
+   Bmag = norm.(eachcol(B))
+
+   vA  = @. Bmag / √(μ₀ * n * mᵢ)        # Alfven speed, [m/s]
+   vS  = @. √(γ * p / (n * mᵢ))          # sonic speed, [m/s]
+
+   vFast = @. √(vA^2 + vS^2)
+   vBulk = @. v[1,:]*cos(angle) + v[2,:]*sin(angle)
+
+   vFast, vBulk
+end
+
+"Trace along line with `angle` w.r.t. x-axis at possible wave speeds."
+function tracewave(xstart, angle, files, dtfile, t, cellids, distances)
+
+   x1 = zeros(length(t)); x1[1] = xstart
+   x2 = copy(x1)
+   x3 = copy(x1)
+
+   tfile = let
+      tfilefirst = getproperty(load(files[1]), :time)
+      tfilelast = getproperty(load(files[end]), :time)
+      tfilefirst:dtfile:tfilelast
+   end
+
+   ifile = 1 # file index tracker
+
+   dt = t[2] - t[1] # timestep
+
+   for it in eachindex(t)[1:end-1]
+      # Find the closest output saving time to t[it], 0th order interpolation
+      for i = ifile:length(tfile)
+         if abs(tfile[i] - t[it]) < 0.5*dtfile
+            ifile = i
+            break
+         end
+      end
+      meta = load(files[ifile])
+      # Find the closest cell to the wave location
+      cid = let
+         c1 = searchsortednearest(distances, x1[it])
+         c2 = searchsortednearest(distances, x2[it])
+         c3 = searchsortednearest(distances, x3[it])
+         cellids[c1], cellids[c2], cellids[c3]
+      end
+      vFast, vBulk = getCharacteristicSpeeds(meta, cid, angle)
+      x1[it+1] = x1[it] + dt * vBulk[1]
+      x2[it+1] = x2[it] + dt * (vBulk[2] + vFast[2])
+      x3[it+1] = x3[it] + dt * (vBulk[3] - vFast[3])
+   end
+
+   x1, x2, x3
+end
+
+"Evaluate the average quantities at `cellids` at the middle of `files`."
+function estimate_meanstates(files, cellids)
+   # Select the snapshot in the middle
+   nfile = length(files)
+   meta = load(files[nfile÷2+1])
+
+   n = readvariable(meta, "proton/vg_rho", cellids)
+   v = readvariable(meta, "proton/vg_v", cellids)
+   p = readvariable(meta, "vg_pressure", cellids)
+
+   if hasvariable(meta, "vg_b_vol")
+      B = readvariable(meta, "vg_b_vol", cellids)
+   elseif hasvariable(meta, "fg_b")
+      B = readvariable(meta, "fg_b", cellids)
+   else
+      B = readvariable(meta, "b", cellids)
+   end
+
+   vperp = @view v[1:2,:]
+   vpar = @view v[3,:]
+
+   # Obtain average states
+   n̄ = mean(n)
+   p̄ = mean(p)
+   v̄par = mean(vpar)
+   v̄perp = @views [mean(vperp[1,:]), mean(vperp[2,:])]
+
+   # Characteristic parameters
+   Bnorm = @views abs(mean(B[3,:]))
+   di  = √(mᵢ*ϵ₀/(n̄))*c/qᵢ               # ion inertial length, [m]
+   ωci = qᵢ*Bnorm/mᵢ                     # [/s]
+   v̄A  = Bnorm / √(μ₀ * n̄ * mᵢ)          # Alfven speed, [m/s]
+   v̄S  = √(γ * p̄ / (n̄ * mᵢ))             # sonic speed, [m/s]
+
+   println("--------------------------------------------------")
+   println("* Average states along the line at the middle snapshot")
+   println("Density               : ", rpad(round(n̄/1e6; digits=2), 8), "amu/cc")
+   println("Pressure              : ", rpad(round(p̄*1e9; digits=3), 8), "nPa")
+   println("Parallel velocity     : ", rpad(round(v̄par/1e3; digits=2), 8), "km/s")
+   println("Perpendicular velocity: ", rpad(round.(v̄perp/1e3; digits=2), 8), "km/s")
+   println("Flow angle            : ", rpad(round(atand(v̄perp[2], v̄perp[1]); digits=2), 8),
+      "degrees")
+   println("Ion inertial length   : ", rpad(round(di/1e3; digits=2), 8), "km")
+   println("Gyrofrequency         : ", rpad(round(ωci; digits=2), 8), "Hz")
+   println("Alfven speed          : ", rpad(round(v̄A/1e3; digits=2), 8), "km/s")
+   println("Sonic speed           : ", rpad(round(v̄S/1e3; digits=2), 8), "km/s")
+   println("--------------------------------------------------")
+
+   di, ωci, v̄A, v̄S, v̄perp
+end
+
+"Plot the process of wave checks."
+function plot_dispersion(files, vars, cellids, distances, coords, meanstates, dtfile, Δt,
+   outdir)
+
+   # Parameters
+   nfile = length(files)
+   npoints = length(cellids)
+   nt = nfile ÷ 2 + 1
+
+   varnames = vars.varnames
+   varnames_print = vars.varnames_print
+   components = vars.components
+
+   di, ωci, v̄A, v̄S, v̄perp = meanstates
+
+   tfile1st = load(files[1]).time
+   # Output timestamps
+   t = [dtfile * ifile + tfile1st for ifile in 0:nfile-1]
+   # Selected line tilted angle ∈ [-π, π]
+   θ = atan(coords[2,end] - coords[2,1], coords[1,end] - coords[1,1])
+   # Sample width, [m]
+   dx = norm(coords[:,end] .- coords[:,1]) /(npoints - 1)
+   println("spatial resolution: ", round(dx/1e3; digits=2), " km")
+
+   # Trace wave along the line in a space-time domain
+   twave = let
+      tstart = 400.0
+      tend = 430.0
+      tstart:200Δt:tend
+   end
+   xwave = tracewave(distances[npoints÷2+1], θ, files, dtfile, twave, cellids, distances)
+
+   twave2 = let
+      tstart = 600.0
+      tend = 630.0
+      tstart:200Δt:tend
+   end
+   xwave2 = tracewave(distances[npoints÷2+1], θ, files, dtfile, twave2, cellids, distances)
+
+   # Dispersion plotting ranges
+   kmin = -π / dx * di         # minimum wave number
+   kmax =  π / dx * di         # maximum wave number
+   ωmin = 0                    # minimum angular frequency
+   ωmax = π / dtfile / ωci     # maximum angular frequency
+
+   # Only the 1st quadrature
+   krange = range(kmin, kmax, length=npoints)
+   ωrange = range(ωmin, ωmax, length=nt)
+
+   axisunit = EARTH
+
+   # Precalculated lines
+   ωCFL = dispersion_CFL.(krange, dx, Δt, di, ωci)
+   ωfast = dispersion_fast_perp(krange, θ, v̄S, v̄A, v̄perp, di, ωci)
+   ωbulk = dispersion_bulk_flow(krange, θ, v̄perp, di, ωci)
+   # Window filtering for avoiding spectral leakage
+   window = hanning(npoints) * hanning(nfile)'
+
+   meta = load(files[end])
+
+   for i in eachindex(varnames)
+      println("variable name: ", varnames[i])
+      var = extract_var(files, varnames[i], cellids, distances, components[i])
+
+      # 2DFFT
+      F̃ = window .* var |> fft |> fftshift
+
+      # Visualization
+      fig = figure(figsize=(12,12), constrained_layout=false)
+      ax = [subplot(221), subplot(223), subplot(222), subplot(224, projection="3d")]
+
+      dispersion = reverse!(abs.(F̃.*F̃)[:, end-nt+1:end]', dims=1)
+      im1 = ax[1].pcolormesh(krange, ωrange, dispersion, norm=matplotlib.colors.LogNorm())
+
+      ax[1].plot([krange[1], 0.0, krange[end]], [ωCFL[1], 0.0, ωCFL[end]], "--",
+         linewidth=1.0, color="k", label="CFL Condition")
+      ax[1].plot(krange, ωfast, "--",
+         linewidth=1.2, color="#d62728", label="Fast Mode")
+      ax[1].plot(krange, ωbulk, "--",
+         linewidth=1.2, color="#9467bd", label="Flow Speed")
+
+      ax[1].set_xlim(kmin, kmax)
+      ax[1].set_ylim(ωmin, ωmax)
+
+      cb = colorbar(im1; ax=ax[1])
+      cb.ax.tick_params(direction="in")
+      ax[1].legend(;fontsize="x-small")
+      ax[1].set_xlabel(L"$k_\perp \cdot d_i$")
+      ax[1].set_ylabel(L"$\omega/\Omega_{ci}$")
+      ax[1].set_title(L"$k_\perp$ angle w.r.t. x = %$θ")
+
+      im2 = ax[2].pcolormesh((distances .+ coords[1,1])./RE, t, var')
+
+      ax[2].plot((xwave[1] .+ coords[1,1])./RE, twave, ".--",
+         color="#d62728", label=L"$V_{bulk}$")
+      ax[2].plot((xwave[2] .+ coords[1,1])./RE, twave, ".--",
+         color="#9467bd",  label=L"$V_{bulk} + V_{fast}$")
+      ax[2].plot((xwave[3] .+ coords[1,1])./RE, twave, ".--",
+         color="#ff7f0e", label=L"$V_{bulk} - V_{fast}$")
+
+      ax[2].plot((xwave2[1] .+ coords[1,1])./RE, twave2, ".--",
+         color="#d62728")
+      ax[2].plot((xwave2[2] .+ coords[1,1])./RE, twave2, ".--",
+         color="#9467bd")
+      ax[2].plot((xwave2[3] .+ coords[1,1])./RE, twave2, ".--",
+         color="#ff7f0e")
+
+      cb = colorbar(im2; ax=ax[2])
+      cb.ax.tick_params(direction="in")
+
+      ax[2].set_xlim(coords[1,1]/RE, coords[1,end]/RE)
+
+      ax[2].legend(loc="upper center", bbox_to_anchor=(0.5, -0.13),
+         fancybox=true, shadow=true, ncol=3)
+      ax[2].set_xlabel(L"x [$R_E$]")
+      ax[2].set_ylabel(L"time [s]")
+      ax[2].set_title("$(varnames_print[i])_$(components[i])")
+
+      pArgs = Vlasiator.set_args(meta, varnames[i], axisunit; normal=:none)
+      x, y = Vlasiator.get_axis(pArgs)
+      data = Vlasiator.prep2d(meta, varnames[i], components[i])'
+      cnorm, cticks = set_colorbar(Linear, -Inf, Inf, data)
+      cmesh = ax[3].pcolormesh(x, y, data, norm=cnorm)
+
+      ax[3].set_xlabel(pArgs.strx)
+      ax[3].set_ylabel(pArgs.stry)
+      ax[3].set_aspect(1)
+
+      cb = colorbar(cmesh; ax=ax[3], ticks=cticks, fraction=0.046, pad=0.04)
+      cb.ax.set_ylabel(pArgs.cb_title)
+      cb.ax.tick_params(direction="in")
+
+      @views ax[3].scatter(coords[1,:]./RE, coords[2,:]./RE; s=0.2, color="k")
+
+      xCoord = (distances .+ coords[1,1])./RE
+      # meshgrid
+      X = [x for _ in t, x in xCoord]
+      Y = [y for y in t, _ in xCoord]
+
+      ax[4].view_init(elev=40., azim=-30.)
+      ax[4].plot_surface(X, Y, var', cmap=matplotlib.cm.turbo, antialiased=false)
+
+      ax[4].set_xlabel(L"x [$R_E$]"; fontsize="small")
+      ax[4].set_ylabel("time [s]"; fontsize="small")
+      #ax[4].set_zlabel(pArgs.cb_title)
+      ax[4].tick_params(labelsize="small")
+
+      outname = "dispersion_$(varnames_print[i])_$(components[i]).png"
+      savefig(joinpath(outdir, outname), bbox_inches="tight")
+      close(fig)
+   end
+
+end
+
+function main()
+   outdir = "../out/"
+   γ = 5 / 3
+
+   xStart = [10.0, 0.0, 0.0].*RE
+   xEnd   = [13.3, 0.0, 0.0].*RE
+
+   varnames = ["proton/vg_rho", "vg_b_vol", "vg_e_vol", "vg_pressure"]
+   varnames_print = ["rho", "b", "e", "p"]
+   components = [0, 3, 1, 0] # 0 for scalar, 1-3 for vector components
+
+   dir = "../run_rho2_bz-5_timevarying_startfrom300s"
+   files = filter(contains(r"^bulk.*\.vlsv$"), readdir(dir))
+
+   vars = Variables(varnames, varnames_print, components)
+
+   dtfile = 0.5                          # output interval, [s]
+   Δt   = 0.0147176                      # discrete time step from runlog, [s]
+
+   meta = load(files[1])
+
+   if ispolar(meta) # polar plane
+      @error "not implemented!"
+   end
+
+   cellids, distances, coords = getcellinline(meta, xStart, xEnd)
+
+   meanstates = estimate_meanstates(files, cellids)
+
+   println("number of extracted points: ", length(cellids))
+   println("xStart: ", xStart)
+   println("xEnd: ", xEnd)
+   tbegin = load(files[1]).time
+   tend = load(files[end]).time
+   println("time from $tbegin to $tend s")
+
+   @time plot_dispersion(files, vars, cellids, distances, coords, meanstates, dtfile, Δt,
+      outdir)
+end
+
+main()

This page was generated using DemoCards.jl.

diff --git a/v0.11.5/examples/postprocess/demo_x_o_points/index.html b/v0.11.5/examples/postprocess/demo_x_o_points/index.html new file mode 100644 index 00000000..c94e1979 --- /dev/null +++ b/v0.11.5/examples/postprocess/demo_x_o_points/index.html @@ -0,0 +1,51 @@ + +Find X- and O-points · Vlasiator.jl

Find X- and O-points

Author Update time

This demo shows how to find X-points and O-points in a 2D magnetic reconnection configuration. Here we assume a X-Z meridional plane.

Note
  1. The input B field domain matters for computing the flux function, but I don't know

why there are differences.

  1. In identifying the X-points and O-points, we currently provide two methods: method 1

needs to set the relative tolerance, while method 2 does not.

using VlasiatorPyPlot
+
+function main()
+   file = "bulk.0001657.vlsv"
+   meta = load(file)
+
+   ndims(meta) != 2 && @error "Flux function only works for 2D simulations!"
+
+   meta.ncells[3] == 1 && @error "equatorial plane, no reconnection!"
+
+   b = meta["vg_b_vol"]
+   b = reshape(b, 3, meta.ncells[1], meta.ncells[3])
+   dx = [meta.dcoord[1], meta.dcoord[3]]
+
+   x = LinRange(meta.coordmin[1], meta.coordmax[1], meta.ncells[1]) ./ Vlasiator.RE
+   z = LinRange(meta.coordmin[3], meta.coordmax[3], meta.ncells[3]) ./ Vlasiator.RE
+
+   xmin_ = searchsortedfirst(x, 7.0)
+   xmax_ = searchsortedlast(x, 9.5)
+   zmin_ = searchsortedfirst(z, -5.0)
+   zmax_ = searchsortedlast(z, 5.0)
+
+   # meshgrid for plotting
+   X = [a for a in x[xmin_:xmax_], _ in z[zmin_:zmax_]]
+   Z = [b for _ in x[xmin_:xmax_], b in z[zmin_:zmax_]]
+
+   flux = compute_flux_function(view(b,:,xmin_:xmax_,zmin_:zmax_), dx)
+
+   fig, ax = plt.subplots(subplot_kw=Dict("projection"=>"3d"))
+
+   ax.plot_surface(X, Z, flux;
+      cmap=matplotlib.cm.turbo,
+      linewidth=0, antialiased=false)
+
+   indices_x, indices_o = find_reconnection_points(flux; retol=1e-4, method=2)
+
+   fig, ax = subplots(figsize=(6,10), constrained_layout=true)
+
+   pcolormesh(meta, "proton/vg_v", ax;
+      comp=:z, extent=[5, 10, -7.5, 7.5],
+      cmap=matplotlib.cm.RdBu_r)
+   s1 = ax.scatter(x[indices_x[1,:].+xmin_.-1], z[indices_x[2,:].+zmin_.-1];
+      s=50, marker="x", color="tab:gray")
+   s2 = ax.scatter(x[indices_o[1,:].+xmin_.-1], z[indices_o[2,:].+zmin_.-1];
+      s=12, marker="o", color="tab:brown")
+
+   ax.legend([s1, s2], ["X-point", "O-point"])
+end
+
+main()

This page was generated using DemoCards.jl.

diff --git a/v0.11.5/examples/postprocess/demo_x_points_extracting/index.html b/v0.11.5/examples/postprocess/demo_x_points_extracting/index.html new file mode 100644 index 00000000..5bf5213a --- /dev/null +++ b/v0.11.5/examples/postprocess/demo_x_points_extracting/index.html @@ -0,0 +1,54 @@ + +Find X-points in 2D · Vlasiator.jl

Find X-points in 2D

Author Update time

This example shows how to find X-points in a 2D magnetic reconnection configuration and save the coordinates as well as extracted reconnection rate Ey from multiple outputs. Here we assume a X-Z plane.

using JLD2: jldsave
+using Vlasiator, ProgressMeter
+
+function main()
+   files = filter(contains(r"^bulk.*\.vlsv$"), readdir())
+
+   nG = 2 # number of ghost cells
+
+   x, z, dx = load(files[1]) do meta
+      LinRange(meta.coordmin[1], meta.coordmax[1], meta.ncells[1]) ./ Vlasiator.RE,
+      LinRange(meta.coordmin[3], meta.coordmax[3], meta.ncells[3]) ./ Vlasiator.RE,
+      [meta.dcoord[1], meta.dcoord[3]]
+   end
+
+   xmin_ = searchsortedfirst(x, 7.0)
+   xmax_ = searchsortedlast(x, 9.0)
+   zmin_ = searchsortedfirst(z, -4.0)
+   zmax_ = searchsortedlast(z, 4.0)
+
+   x_points_x = Vector{Vector{eltype(x)}}(undef, 0)
+   x_points_z = similar(x_points_x)
+
+   @showprogress 5 "Finding X-points..." for ifile in eachindex(files)
+      meta = load(files[ifile])
+      b = meta["vg_b_vol"]
+      b = reshape(b, 3, meta.ncells[1], meta.ncells[3])
+
+      flux = compute_flux_function(b, dx, nG)
+      indices_x, _ = find_reconnection_points(flux[xmin_:xmax_,zmin_:zmax_], 5e-3)
+
+      push!(x_points_x, x[indices_x[1,:].+xmin_.-1])
+      push!(x_points_z, z[indices_x[2,:].+zmin_.-1])
+   end
+
+   ## Extract Ey at X-points
+   ey = Vector{Vector{Float32}}(undef, 0)
+
+   for it in eachindex(x_points_x)
+      meta = load(files[it])
+      ids = Vector{Int}(undef, length(x_points_x[it]))
+      for ip in eachindex(x_points_x[it])
+         loc = [x_points_x[it][ip], 0.0, x_points_z[it][ip]] .* Vlasiator.RE
+         ids[ip] = getcell(meta, loc)
+      end
+      ey_now = readvariable(meta, "vg_e_vol", ids)[2,:]
+      push!(ey, ey_now)
+   end
+
+   # save
+   jldsave("x_point_locations.jld2"; x_points_x, x_points_z, ey)
+end
+
+main()

This page was generated using DemoCards.jl.

diff --git a/v0.11.5/examples/visualization/demo_1d2d_mp_pyplot/index.html b/v0.11.5/examples/visualization/demo_1d2d_mp_pyplot/index.html new file mode 100644 index 00000000..b0b68050 --- /dev/null +++ b/v0.11.5/examples/visualization/demo_1d2d_mp_pyplot/index.html @@ -0,0 +1,268 @@ + +Combined plots with multi-processing · Vlasiator.jl

Combined plots with multi-processing

Author Update time

This is an example for generating combined 1D/2D plots across multiple frames with multi-processing. To run on a single node,

julia -p $ncores demo_1d2d_mp_pyplot.jl
using Distributed
+@everywhere using Vlasiator, VlasiatorPyPlot, Printf, LaTeXStrings
+
+@assert matplotlib.__version__ ≥ "3.4" "Require Matplotlib version 3.4+ to use subfigure!"
+
+@everywhere struct Varminmax{T}
+   "Density, [amu/cc]"
+   ρmin::T
+   ρmax::T
+   "Velocity, [km/s]"
+   vmin::T
+   vmax::T
+   "Pressure, [nPa]"
+   pmin::T
+   pmax::T
+   "Magnetic field, [nT]"
+   bmin::T
+   bmax::T
+   "Electric field, [nT]"
+   emin::T
+   emax::T
+end
+
+@everywhere function init_figure(loc, norms, ticks, pArgs1, varminmax)
+   fig = plt.figure(myid(), constrained_layout=true, figsize=(12, 7.2))
+   subfigs = fig.subfigures(1, 2, wspace=0.01, width_ratios=[2,1])
+
+   axsL = subfigs[1].subplots(5, 1, sharex=true)
+   axsR = subfigs[2].subplots(2, 1, sharex=true)
+
+   # Set line plots' axes
+   axsL[end].set_xlim(loc[1], loc[end])
+
+   (;ρmin, ρmax, vmin, vmax, pmin, pmax, bmin, bmax, emin, emax) = varminmax
+
+   axsL[1].set_ylim(ρmin, ρmax)
+   axsL[2].set_ylim(vmin, vmax)
+   axsL[3].set_ylim(pmin, pmax)
+   axsL[4].set_ylim(bmin, bmax)
+   axsL[5].set_ylim(emin, emax)
+   for ax in axsL
+      ax.xaxis.set_minor_locator(matplotlib.ticker.AutoMinorLocator())
+      ax.yaxis.set_minor_locator(matplotlib.ticker.AutoMinorLocator())
+      ax.grid(true)
+   end
+
+   axsL[end].set_xlabel(L"x [$R_E$]"; fontsize=14)
+   axsL[1].set_ylabel("n [amu/cc]";   fontsize=14)
+   axsL[2].set_ylabel("V [km/s]";     fontsize=14)
+   axsL[3].set_ylabel("P [nPa]";      fontsize=14)
+   axsL[4].set_ylabel("B [nT]";       fontsize=14)
+   axsL[5].set_ylabel("E [mV/m]";     fontsize=14)
+
+   fakeline = loc
+   l1 = axsL[1].plot(loc, fakeline, label="Proton density", color="#1f77b4")
+   l2 = axsL[2].plot(loc, fakeline, label="Vx",             color="#1f77b4")
+   l3 = axsL[2].plot(loc, fakeline, label="Vy",             color="#ff7f0e")
+   l4 = axsL[2].plot(loc, fakeline, label="Vz",             color="#2ca02c")
+   l5 = axsL[3].plot(loc, fakeline, label="Ram",            color="#1f77b4")
+   l6 = axsL[3].plot(loc, fakeline, label="Thermal",        color="#ff7f0e")
+   l7 = axsL[4].plot(loc, fakeline, label="Bx",             color="#1f77b4")
+   l8 = axsL[4].plot(loc, fakeline, label="By",             color="#ff7f0e")
+   l9 = axsL[4].plot(loc, fakeline, label="Bz",             color="#2ca02c")
+   l10= axsL[5].plot(loc, fakeline, label="Ex",             color="#1f77b4")
+   l11= axsL[5].plot(loc, fakeline, label="Ey",             color="#ff7f0e")
+   l12= axsL[5].plot(loc, fakeline, label="Ez",             color="#2ca02c")
+
+   ls = (l1, l2, l3, l4, l5, l6, l7, l8, l9, l10, l11, l12)
+
+   axsL[2].legend(;loc="lower left",  ncol=3, frameon=false, fontsize=12)
+   axsL[3].legend(;loc="upper right", ncol=2, frameon=false, fontsize=12)
+   axsL[4].legend(;loc="upper right", ncol=3, frameon=false, fontsize=12)
+   axsL[5].legend(;loc="lower right", ncol=3, frameon=false, fontsize=12)
+
+   vl1 = axsL[1].vlines(loc[1], ρmin, ρmax; colors="r", linestyle="dashed", alpha=0.5)
+   vl2 = axsL[2].vlines(loc[1], vmin, vmax; colors="r", linestyle="dashed", alpha=0.5)
+   vl3 = axsL[3].vlines(loc[1], pmin, pmax; colors="r", linestyle="dashed", alpha=0.5)
+   vl4 = axsL[4].vlines(loc[1], bmin, bmax; colors="r", linestyle="dashed", alpha=0.5)
+   vl5 = axsL[5].vlines(loc[1], emin, emax; colors="r", linestyle="dashed", alpha=0.5)
+
+   hl2 = axsL[2].hlines(0.0, loc[1], loc[end]; colors="k", linestyle="dashed", alpha=0.2)
+   hl4 = axsL[4].hlines(0.0, loc[1], loc[end]; colors="k", linestyle="dashed", alpha=0.2)
+   hl5 = axsL[5].hlines(0.0, loc[1], loc[end]; colors="k", linestyle="dashed", alpha=0.2)
+
+   vlines = (vl1, vl2, vl3, vl4, vl5)
+
+   for ax in axsR
+      ax.set_aspect("equal")
+
+      # Set border line widths
+      for loc in ("left", "bottom", "right", "top")
+         edge = get(ax.spines, loc, nothing)
+         edge.set_linewidth(2.0)
+      end
+      ax.xaxis.set_tick_params(width=2.0, length=3)
+      ax.yaxis.set_tick_params(width=2.0, length=3)
+      ax.xaxis.set_minor_locator(matplotlib.ticker.AutoMinorLocator())
+      ax.yaxis.set_minor_locator(matplotlib.ticker.AutoMinorLocator())
+
+      ax.set_ylabel(pArgs1.stry; fontsize=14)
+   end
+
+   axsR[2].set_xlabel(pArgs1.strx; fontsize=14)
+
+   axsR[1].set_title("Alfvén speed", fontsize=14)
+   axsR[2].set_title("Sound speed", fontsize=14)
+
+   x, y = Vlasiator.get_axis(pArgs1)
+   fakedata = fill(NaN32, length(y), length(x))
+
+   c1 = axsR[1].pcolormesh(x, y, fakedata, norm=norms[1], cmap=matplotlib.cm.turbo)
+   c2 = axsR[2].pcolormesh(x, y, fakedata, norm=norms[2], cmap=matplotlib.cm.turbo)
+
+   rInner = 31.8e6 # [m]
+   circle1 = plt.Circle((0, 0), rInner/Vlasiator.RE, facecolor="w", edgecolor="tab:purple")
+   circle2 = plt.Circle((0, 0), rInner/Vlasiator.RE, facecolor="w", edgecolor="tab:purple")
+   axsR[1].add_patch(circle1)
+   axsR[2].add_patch(circle2)
+
+   im_ratio = length(y)/length(x)
+   fraction = 0.046 * im_ratio
+
+   cb1 = colorbar(c1; ax=axsR[1], ticks=ticks[1], fraction, pad=0.02, extend="max")
+   cb1.ax.set_ylabel("[km/s]"; fontsize=14)
+
+   cb2 = colorbar(c2; ax=axsR[2], ticks=ticks[2], fraction, pad=0.02, extend="max")
+   cb2.ax.set_ylabel("[km/s]"; fontsize=14)
+
+   fig.suptitle("Density Pulse Run", fontsize="x-large")
+
+   cs = (c1, c2)
+
+   return fig, subfigs, ls, vlines, cs
+end
+
+@everywhere function update_vline(h, x)
+   seg_old = h.get_segments()
+   ymin = seg_old[1][1, 2]
+   ymax = seg_old[1][2, 2]
+
+   seg_new = [[x ymin; x ymax]]
+
+   h.set_segments(seg_new)
+end
+
+@everywhere function update_plot!(subfigs, ls, vlines, cs, outdir, file, cellids, loc)
+   isfile(outdir*file[end-8:end-5]*".png") && return
+
+   println("file = $(basename(file))")
+   meta = load(file)
+
+   rho = readvariable(meta, "proton/vg_rho", cellids) |> vec
+   v = readvariable(meta, "proton/vg_v", cellids)
+   p = readvariable(meta, "vg_pressure", cellids) .* 1f9 |> vec # [nPa]
+
+   vmag2 = sum(x -> x*x, v, dims=1) |> vec
+   pram = rho .* Vlasiator.mᵢ .* vmag2 .* 1f9 # [nPa]
+
+   b = readvariable(meta, "vg_b_vol", cellids) .* 1f9 #[nT]
+   e = readvariable(meta, "vg_e_vol", cellids) .* 1f3 #[mV/m]
+
+   ls[1][1].set_ydata(rho ./ 1f6)
+   ls[2][1].set_ydata(@views v[1,:] ./ 1f3)
+   ls[3][1].set_ydata(@views v[2,:] ./ 1f3)
+   ls[4][1].set_ydata(@views v[3,:] ./ 1f3)
+   ls[5][1].set_ydata(pram)
+   ls[6][1].set_ydata(p)
+   ls[7][1].set_ydata(@view b[1,:])
+   ls[8][1].set_ydata(@view b[2,:])
+   ls[9][1].set_ydata(@view b[3,:])
+   ls[10][1].set_ydata(@view e[1,:])
+   ls[11][1].set_ydata(@view e[2,:])
+   ls[12][1].set_ydata(@view e[3,:])
+
+   imagnetopause_ = findfirst(<(0.0), @views b[3,:])
+   for vline in vlines
+      update_vline(vline, loc[imagnetopause_])
+   end
+
+   str_title = @sprintf "Sun-Earth line, t= %4.1fs" meta.time
+   subfigs[1].suptitle(str_title, fontsize="x-large")
+
+   data = Vlasiator.prep2d(meta, "VA", :z)'
+   cs[1].set_array(data ./ 1f3)
+
+   data = Vlasiator.prep2d(meta, "VS", :z)'
+   cs[2].set_array(data ./ 1f3)
+
+   savefig(outdir*file[end-8:end-5]*".png", bbox_inches="tight")
+   return
+end
+
+function make_jobs(files)
+   for f in files
+       put!(jobs, f)
+   end
+end
+
+@everywhere function do_work(jobs, status,
+   outdir, loc, norms, ticks, pArgs1, cellids, varminmax)
+
+   fig, subfigs, ls, vlines, cs = init_figure(loc, norms, ticks, pArgs1, varminmax)
+   while true
+      file = take!(jobs)
+      update_plot!(subfigs, ls, vlines, cs, outdir, file, cellids, loc)
+      put!(status, true)
+   end
+   close(fig)
+end
+
+################################################################################
+files = filter(contains(r"^bulk.*\.vlsv$"), readdir())
+
+nfile = length(files)
+# Set output directory
+const outdir = "1d2d/"
+
+# Set contour plots' axes
+axisunit = EARTH
+# Upper/lower limits for each variable
+ρmin, ρmax = 0.0, 14.0     # [amu/cc]
+vmin, vmax = -620.0, 150.0 # [km/s]
+pmin, pmax = 0.0, 2.8      # [nPa]
+bmin, bmax = -60.0, 60.0   # [nT]
+emin, emax = -8.0, 8.0     # [mV/m]
+vamin, vamax = 50.0, 600.0 # [km/s]
+vsmin, vsmax = 50.0, 600.0 # [km/s]
+
+varminmax = Varminmax(ρmin, ρmax, vmin, vmax, pmin, pmax, bmin, bmax, emin, emax)
+
+meta = load(files[1])
+
+pArgs1 = Vlasiator.set_args(meta, "VA", axisunit; normal=:none)
+norm1, ticks1 = set_colorbar(Linear, vamin, vamax)
+norm2, ticks2 = set_colorbar(Linear, vsmin, vsmax)
+
+const norms = (norm1, norm2)
+const ticks = (ticks1, ticks2)
+
+const jobs   = RemoteChannel(()->Channel{String}(nfile))
+const status = RemoteChannel(()->Channel{Bool}(nworkers()))
+
+xmin, xmax = 7.0, 17.0 # Earth radii
+point1 = [xmin, 0, 0] .* Vlasiator.RE
+point2 = [xmax, 0, 0] .* Vlasiator.RE
+
+meta = load(files[1])
+cellids, _, _ = getcellinline(meta, point1, point2)
+loc = range(xmin, xmax, length=length(cellids))
+
+println("Total number of files: $nfile")
+println("Running with $(nworkers()) workers...")
+
+@async make_jobs(files) # Feed the jobs channel with all files to process.
+
+@sync for p in workers()
+   @async remote_do(do_work, p, jobs, status,
+      outdir, loc, norms, ticks, pArgs1, cellids, varminmax)
+end
+
+let n = nfile
+   t = @elapsed while n > 0 # wait for all jobs to complete
+      take!(status)
+      n -= 1
+   end
+   println("Finished in $(round(t, digits=2))s.")
+end

This page was generated using DemoCards.jl.

diff --git a/v0.11.5/examples/visualization/demo_1d2d_pyplot/index.html b/v0.11.5/examples/visualization/demo_1d2d_pyplot/index.html new file mode 100644 index 00000000..c2af719b --- /dev/null +++ b/v0.11.5/examples/visualization/demo_1d2d_pyplot/index.html @@ -0,0 +1,240 @@ + +Combined plots · Vlasiator.jl

Combined plots

Author Update time

To generate combined 1D/2D plots across multiple frames,

using Vlasiator, VlasiatorPyPlot, Printf, LaTeXStrings
+using Vlasiator: set_args, prep2d
+
+@assert VERSION ≥ v"1.7.0" "Compatible with Julia v1.7+!"
+@assert matplotlib.__version__ >= "3.4" "Require Matplotlib version 3.4+ to use subfigure!"
+
+
+struct Varminmax{T}
+   "Density, [amu/cc]"
+   ρmin::T
+   ρmax::T
+   "Velocity, [km/s]"
+   vmin::T
+   vmax::T
+   "Pressure, [nPa]"
+   pmin::T
+   pmax::T
+   "Magnetic field, [nT]"
+   bmin::T
+   bmax::T
+   "Electric field, [nT]"
+   emin::T
+   emax::T
+   "Alfven speed, [km/s]"
+   vamin::T
+   vamax::T
+   "Sonic speed, [km/s]"
+   vsmin::T
+   vsmax::T
+end
+
+function init_figure(varminmax, loc, pArgs)
+   (; ρmin, ρmax, vmin, vmax, pmin, pmax, bmin, bmax, emin, emax,
+      vamin, vamax, vsmin, vsmax) = varminmax
+
+   fig = plt.figure(constrained_layout=true, figsize=(12, 7.2))
+   subfigs = fig.subfigures(1, 2, wspace=0.01, width_ratios=[2,1])
+
+   axsL = subfigs[1].subplots(5, 1, sharex=true)
+   axsR = subfigs[2].subplots(2, 1, sharex=true)
+
+   # Set line plots' axes
+   axsL[end].set_xlim(loc[1], loc[end])
+
+   axsL[1].set_ylim(ρmin, ρmax)
+   axsL[2].set_ylim(vmin, vmax)
+   axsL[3].set_ylim(pmin, pmax)
+   axsL[4].set_ylim(bmin, bmax)
+   axsL[5].set_ylim(emin, emax)
+   for ax in axsL
+      ax.xaxis.set_minor_locator(matplotlib.ticker.AutoMinorLocator())
+      ax.yaxis.set_minor_locator(matplotlib.ticker.AutoMinorLocator())
+      ax.grid(true)
+   end
+
+   axsL[end].set_xlabel(L"x [$R_E$]"; fontsize=14)
+   axsL[1].set_ylabel("n [amu/cc]";   fontsize=14)
+   axsL[2].set_ylabel("V [km/s]";     fontsize=14)
+   axsL[3].set_ylabel("P [nPa]";      fontsize=14)
+   axsL[4].set_ylabel("B [nT]";       fontsize=14)
+   axsL[5].set_ylabel("E [mV/m]";     fontsize=14)
+
+   fakeline = loc
+   l1 = axsL[1].plot(loc, fakeline, label="Proton density", color="#1f77b4")
+   l2 = axsL[2].plot(loc, fakeline, label="Vx",             color="#1f77b4")
+   l3 = axsL[2].plot(loc, fakeline, label="Vy",             color="#ff7f0e")
+   l4 = axsL[2].plot(loc, fakeline, label="Vz",             color="#2ca02c")
+   l5 = axsL[3].plot(loc, fakeline, label="Ram",            color="#1f77b4")
+   l6 = axsL[3].plot(loc, fakeline, label="Thermal",        color="#ff7f0e")
+   l7 = axsL[4].plot(loc, fakeline, label="Bx",             color="#1f77b4")
+   l8 = axsL[4].plot(loc, fakeline, label="By",             color="#ff7f0e")
+   l9 = axsL[4].plot(loc, fakeline, label="Bz",             color="#2ca02c")
+   l10= axsL[5].plot(loc, fakeline, label="Ex",             color="#1f77b4")
+   l11= axsL[5].plot(loc, fakeline, label="Ey",             color="#ff7f0e")
+   l12= axsL[5].plot(loc, fakeline, label="Ez",             color="#2ca02c")
+
+   ls = (l1, l2, l3, l4, l5, l6, l7, l8, l9, l10, l11, l12)
+
+   axsL[2].legend(;loc="lower left",  ncol=3, frameon=false, fontsize=12)
+   axsL[3].legend(;loc="upper left",  ncol=2, frameon=false, fontsize=12)
+   axsL[4].legend(;loc="upper right", ncol=3, frameon=false, fontsize=12)
+   axsL[5].legend(;loc="lower right", ncol=3, frameon=false, fontsize=12)
+
+   vl1 = axsL[1].vlines(loc[1], ρmin, ρmax; colors="r", linestyle="dashed", alpha=0.5)
+   vl2 = axsL[2].vlines(loc[1], vmin, vmax; colors="r", linestyle="dashed", alpha=0.5)
+   vl3 = axsL[3].vlines(loc[1], pmin, pmax; colors="r", linestyle="dashed", alpha=0.5)
+   vl4 = axsL[4].vlines(loc[1], bmin, bmax; colors="r", linestyle="dashed", alpha=0.5)
+   vl5 = axsL[5].vlines(loc[1], emin, emax; colors="r", linestyle="dashed", alpha=0.5)
+
+   hl2 = axsL[2].hlines(0.0, loc[1], loc[end]; colors="k", linestyle="dashed", alpha=0.2)
+   hl4 = axsL[4].hlines(0.0, loc[1], loc[end]; colors="k", linestyle="dashed", alpha=0.2)
+   hl5 = axsL[5].hlines(0.0, loc[1], loc[end]; colors="k", linestyle="dashed", alpha=0.2)
+
+   vlines = (vl1, vl2, vl3, vl4, vl5)
+
+   for ax in axsR
+      ax.set_aspect("equal")
+
+      # Set border line widths
+      for loc in ("left", "bottom", "right", "top")
+         edge = get(ax.spines, loc, nothing)
+         edge.set_linewidth(2.0)
+      end
+      ax.xaxis.set_tick_params(width=2.0, length=3)
+      ax.yaxis.set_tick_params(width=2.0, length=3)
+      ax.xaxis.set_minor_locator(matplotlib.ticker.AutoMinorLocator())
+      ax.yaxis.set_minor_locator(matplotlib.ticker.AutoMinorLocator())
+
+      ax.set_ylabel(L"Y [$R_E$]"; fontsize=14)
+   end
+
+   axsR[2].set_xlabel(L"X [$R_E$]"; fontsize=14)
+
+   axsR[1].set_title("Alfven speed", fontsize=14)
+   axsR[2].set_title("Sound speed", fontsize=14)
+
+   x, y = Vlasiator.get_axis(pArgs)
+   fakedata = fill(NaN32, length(y), length(x))
+
+   cnorm1, cticks1 = set_colorbar(Linear, vamin, vamax)
+   cnorm2, cticks2 = set_colorbar(Linear, vsmin, vsmax)
+   cmap = matplotlib.cm.turbo
+
+   c1 = axsR[1].pcolormesh(x, y, fakedata; norm=cnorm1, cmap)
+   c2 = axsR[2].pcolormesh(x, y, fakedata; norm=cnorm2, cmap)
+
+   rInner = 31.8e6 # [m]
+   circle1 = plt.Circle((0, 0), rInner/Vlasiator.RE, color="w")
+   circle2 = plt.Circle((0, 0), rInner/Vlasiator.RE, color="w")
+   axsR[1].add_patch(circle1)
+   axsR[2].add_patch(circle2)
+
+   cb1 = colorbar(c1; ax=axsR[1], ticks=cticks1, fraction=0.046, pad=0.04, extend="max")
+   cb1.ax.set_ylabel("[km/s]"; fontsize=14)
+
+   cb2 = colorbar(c2; ax=axsR[2], ticks=cticks2, fraction=0.046, pad=0.04)
+   cb2.ax.set_ylabel("[km/s]"; fontsize=14)
+
+   #fig.suptitle("Density Pulse Run", fontsize="xx-large")
+
+   cs = (c1, c2)
+
+   return fig, subfigs, ls, vlines, cs
+end
+
+
+"Update frame."
+function update_plot!(plotargs, outdir, file)
+   isfile(outdir*file[end-8:end-5]*".png") && return
+
+   fig, subfigs, ls, vlines, cs = plotargs
+
+   meta = load(file)
+
+   p_extract = readvariable(meta, "vg_pressure", cellids) .* 1f9 |> vec # [nPa]
+   rho_extract = readvariable(meta, "proton/vg_rho", cellids) |> vec
+   v_extract = readvariable(meta, "proton/vg_v", cellids)
+   vmag2_extract = sum(x -> x*x, v_extract, dims=1) |> vec
+   pram_extract = rho_extract .* Vlasiator.mᵢ .* vmag2_extract .* 1f9 # [nPa]
+
+   bz = readvariable(meta, "vg_b_vol", cellids)[3,:] .* 1f9 #[nT]
+
+   ls[1][1].set_ydata(rho_extract ./ 1f6)
+   ls[2][1].set_ydata(v_extract[1,:] ./ 1f3)
+   ls[3][1].set_ydata(pram_extract)
+   ls[4][1].set_ydata(p_extract)
+   ls[5][1].set_ydata(bz)
+
+   imagnetopause_ = findfirst(<(0.0), bz)
+   for vline in vlines
+      update_vline(vline, loc[imagnetopause_])
+   end
+
+   str_title = @sprintf "Sun-Earth line, t= %4.1fs" meta.time
+   subfigs[1].suptitle(str_title, fontsize=14)
+
+   data = prep2d(meta, "VA", :z)'
+   cs[1].update(Dict("array" => data ./ 1e3))
+
+   data = prep2d(meta, "VS", :z)'
+   cs[2].update(Dict("array" => data ./ 1e3))
+
+   savefig(outdir*file[end-8:end-5]*".png", bbox_inches="tight", dpi=100)
+   return
+end
+
+function update_vline(h, x)
+   seg_old = h.get_segments()
+   ymin = seg_old[1][1, 2]
+   ymax = seg_old[1][2, 2]
+
+   seg_new = [[x ymin; x ymax]]
+
+   h.set_segments(seg_new)
+end
+
+####### Main
+
+files = filter(contains(r"^bulk.*\.vlsv$"), readdir())
+nfile = length(files)
+# Set output directory
+const outdir = "out/"
+
+meta = load(files[1])
+
+const x1, x2 = 7.0, 18.0 # Earth radii
+const point1 = [x1, 0, 0] .* Vlasiator.RE
+const point2 = [x2, 0, 0] .* Vlasiator.RE
+
+cellids, distances, coords = getcellinline(meta, point1, point2)
+
+loc = range(x1, x2, length=length(cellids))
+
+pArgs = set_args(meta, "fakename", RE; normal=:none)
+
+# Upper/lower limits for each variable
+ρmin, ρmax = 0.0, 10.0     # [amu/cc]
+vmin, vmax = -640.0, 100.0 # [km/s]
+pmin, pmax = 0.0, 1.82     # [nPa]
+bmin, bmax = -25.0, 60.0   # [nT]
+emin, emax = -5.0, 5.0     # [mV/m]
+vamin, vamax = 0.0, 250.0  # [km/s]
+vsmin, vsmax = 0.0, 400.0  # [km/s]
+
+varminmax =
+   Varminmax(ρmin, ρmax, vmin, vmax, pmin, pmax, bmin, bmax, emin, emax,
+   vamin, vamax, vsmin, vsmax)
+
+
+plotargs = init_figure(varminmax, loc, pArgs)
+
+# Loop over snapshots
+for (i, file) in enumerate(files)
+   println("i = $i/$nfile, file = $(basename(file))")
+   update_plot!(plotargs, outdir, file)
+end
+
+close(plotargs[1])
+println("Finished!")

This page was generated using DemoCards.jl.

diff --git a/v0.11.5/examples/visualization/demo_1d_animation_pyplot/index.html b/v0.11.5/examples/visualization/demo_1d_animation_pyplot/index.html new file mode 100644 index 00000000..77330f9b --- /dev/null +++ b/v0.11.5/examples/visualization/demo_1d_animation_pyplot/index.html @@ -0,0 +1,36 @@ + +1D animation · Vlasiator.jl

1D animation

Author Update time

This example demonstrates 1D plot animation. ffmpeg is required to be installed for saving into mp4.

using Vlasiator, VlasiatorPyPlot, Printf
+using PyCall
+@pyimport matplotlib.animation as anim
+
+files = filter(contains(r"^bulk.*\.vlsv$"), readdir())
+# Choose plotting variable
+const var = "proton/vg_rho"
+const comp = 0 # component of vector, if used
+
+fig = plt.figure(constrained_layout=true)
+# Fix axis limits according to data range
+ax = plt.axes(xlim=(-10, 10), ylim=(0, 4))
+
+line, = ax.plot([], [], lw=3, marker="*")
+
+function animate(i::Int, files::Vector{String}, var::String, comp::Int, ax, line)
+   meta = load(files[i+1])
+   x = LinRange(meta.coordmin[1], meta.coordmax[1], meta.ncells[1])
+   d = readvariable(meta, var)
+   y = ndims(d) == 1 ? d : d[comp,:]
+   line.set_data(x, y)
+
+   t = readparameter(meta, "time")
+   str_title = @sprintf "t = %4.1fs, var = %s" t var
+   ax.set_title(str_title)
+
+   return (line,)
+end
+
+# https://matplotlib.org/stable/api/_as_gen/matplotlib.animation.FuncAnimation.html
+out = anim.FuncAnimation(fig, animate, fargs=(files, var, comp, ax, line),
+   frames=length(files), blit=true,
+   repeat_delay=1000, interval=200)
+# Make sure ffmpeg is available!
+out.save("line.mp4", writer="ffmpeg", fps=30)

This page was generated using DemoCards.jl.

diff --git a/v0.11.5/examples/visualization/demo_2d_animation_pyplot/index.html b/v0.11.5/examples/visualization/demo_2d_animation_pyplot/index.html new file mode 100644 index 00000000..4199304f --- /dev/null +++ b/v0.11.5/examples/visualization/demo_2d_animation_pyplot/index.html @@ -0,0 +1,54 @@ + +2D contour plot animation · Vlasiator.jl

2D contour plot animation

Author Update time

This example shows how to plot 2D colored contours with pcolormesh. ffmpeg is required to be installed for saving into mp4.

using Vlasiator, VlasiatorPyPlot, Printf
+using PyCall
+@pyimport matplotlib.animation as anim
+
+files = filter(contains(r"^bulk.*\.vlsv$"), readdir())
+const var = "proton/vg_rho"
+const comp = 0 # vector component for plotting (if applicable)
+
+fig = plt.figure(figsize=(6.4,5.1), constrained_layout=true)
+
+ax = plt.axes()
+
+const axisunit = EARTH
+const colorscale = Log
+const addcolorbar = true
+# Choose colormap
+const cmap = matplotlib.cm.turbo
+# Set data plotting range
+const vmin = 7.0e4
+const vmax = 2.5e6
+
+meta = load(files[1])
+
+pArgs = Vlasiator.set_args(meta, var, axisunit; normal=:none)
+
+norm, ticks = set_colorbar(colorscale, vmin, vmax)
+
+c = let
+   x1, x2 = Vlasiator.get_axis(pArgs)
+   fakedata = zeros(Float32, length(x2), length(x1))
+   ax.pcolormesh(x1, x2, fakedata; norm, cmap)
+end
+
+VlasiatorPyPlot.set_plot(c, ax, pArgs, ticks, addcolorbar)
+
+function animate(i::Int, files::Vector{String}, var::String, comp::Int, c)
+   meta = load(files[i+1])
+   t = readparameter(meta, "time")
+   data = Vlasiator.prep2d(meta, var, comp)'
+   c.set_array(data)
+
+   str_title = @sprintf "t= %4.1fs" t
+   ax.set_title(str_title, fontweight="bold")
+
+   return (c,)
+end
+
+# https://matplotlib.org/stable/api/_as_gen/matplotlib.animation.FuncAnimation.html
+out = anim.FuncAnimation(fig, animate, fargs=(files, var, comp, c),
+   frames=length(files), blit=true,
+   repeat_delay=1000, interval=50)
+# Make sure ffmpeg is available!
+out.save("contour.mp4", writer="ffmpeg", fps=30)

This page was generated using DemoCards.jl.

diff --git a/v0.11.5/examples/visualization/demo_2d_colorbar/index.html b/v0.11.5/examples/visualization/demo_2d_colorbar/index.html new file mode 100644 index 00000000..fd4b5e68 --- /dev/null +++ b/v0.11.5/examples/visualization/demo_2d_colorbar/index.html @@ -0,0 +1,43 @@ + +Shared colorbar · Vlasiator.jl

Shared colorbar

Author Update time

This script shows how to share the same colorbar for multiple contour plots.

using Vlasiator, VlasiatorPyPlot
+
+file = "bulk.vlsv"
+
+meta = load(file)
+
+pArgs = Vlasiator.set_args(meta, "fg_e", SI; normal=:none)
+
+x1, x2 = Vlasiator.get_axis(pArgs)
+
+norm = matplotlib.colors.CenteredNorm()
+
+fig, axs = plt.subplots(1, 3, sharex=true, sharey=true, constrained_layout=true,
+   figsize=(12,5))
+
+data = Vlasiator.prep2d(meta, "Ehallx", 1)'
+c = axs[1].pcolormesh(x1, x2, data; norm)
+
+data = Vlasiator.prep2d(meta, "Ehally", 2)'
+c = axs[2].pcolormesh(x1, x2, data; norm)
+
+data = Vlasiator.prep2d(meta, "Ehallz", 3)'
+c = axs[3].pcolormesh(x1, x2, data; norm)
+
+for ax in axs
+   ax.axis("scaled")
+end
+
+for i in 1:3
+   axs[i].set_xlabel("x", fontsize=14)
+end
+for i in 1:1
+   axs[i].set_ylabel("z", fontsize=14)
+end
+
+axs[1].set_title(L"$E_{hall,x}$", fontsize=16)
+axs[2].set_title(L"$E_{hall,y}$", fontsize=16)
+axs[3].set_title(L"$E_{hall,z}$", fontsize=16)
+
+fig.colorbar(c, ax=axs[:])
+
+savefig("Ehall.png", bbox_inches="tight")

This page was generated using DemoCards.jl.

diff --git a/v0.11.5/examples/visualization/demo_2d_mp_pyplot/index.html b/v0.11.5/examples/visualization/demo_2d_mp_pyplot/index.html new file mode 100644 index 00000000..a1219277 --- /dev/null +++ b/v0.11.5/examples/visualization/demo_2d_mp_pyplot/index.html @@ -0,0 +1,178 @@ + +2D contour plots with multi-processing · Vlasiator.jl

2D contour plots with multi-processing

Author Update time

This demo shows how to generate 2D colored contours with multi-processing. To run on a single node,

julia -p $ncores demo_2d_mp_pyplot.jl
using Distributed, ParallelDataTransfer
+@everywhere using Vlasiator, VlasiatorPyPlot, Printf, LaTeXStrings
+
+@everywhere function init_figure(cmaps, norms, ticks, pArgs1, extent)
+   fig, axs = plt.subplots(2, 3; num=myid(),
+      figsize=(13.5, 9.5), sharex=true, sharey=true, constrained_layout=true)
+
+   for ax in axs
+      ax.set_aspect("equal")
+      # Set border line widths
+      for loc in ("left", "bottom", "right", "top")
+         edge = get(ax.spines, loc, nothing)
+         edge.set_linewidth(2.0)
+      end
+      ax.xaxis.set_tick_params(width=2.0, length=3)
+      ax.yaxis.set_tick_params(width=2.0, length=3)
+      ax.xaxis.set_minor_locator(matplotlib.ticker.AutoMinorLocator())
+      ax.yaxis.set_minor_locator(matplotlib.ticker.AutoMinorLocator())
+   end
+
+   for ax in axs[end,:]
+      ax.set_xlabel(pArgs1.strx; fontsize)
+   end
+   for ax in axs[:,1]
+      ax.set_ylabel(pArgs1.stry; fontsize)
+   end
+
+   titles = ("Density", "Pth", "Vx", "Bz", "Vz", "E")
+
+   for (ax, title) in zip(axs, titles)
+      ax.set_title(title; fontsize)
+   end
+
+   x1, x2 = Vlasiator.get_axis(pArgs1)
+
+   range1 = searchsortedfirst(x1, extent[1]):searchsortedlast(x1, extent[2])
+   range2 = searchsortedfirst(x2, extent[3]):searchsortedlast(x2, extent[4])
+
+   fakedata = zeros(Float32, length(range2), length(range1))
+
+   c1 = axs[1,1].pcolormesh(x1[range1], x2[range2], fakedata;
+      norm=norms[1], cmap=cmaps[1])
+   c2 = axs[1,2].pcolormesh(x1[range1], x2[range2], fakedata;
+      norm=norms[2], cmap=cmaps[2])
+   c3 = axs[1,3].pcolormesh(x1[range1], x2[range2], fakedata;
+      norm=norms[3], cmap=cmaps[2])
+   c4 = axs[2,1].pcolormesh(x1[range1], x2[range2], fakedata;
+      norm=norms[4], cmap=cmaps[1])
+   c5 = axs[2,2].pcolormesh(x1[range1], x2[range2], fakedata;
+      norm=norms[5], cmap=cmaps[2])
+   c6 = axs[2,3].pcolormesh(x1[range1], x2[range2], fakedata;
+      norm=norms[6], cmap=cmaps[1])
+
+   cs = (c1, c2, c3, c4, c5, c6)
+
+   format = matplotlib.ticker.FormatStrFormatter("%.1f")
+
+   cb1 = colorbar(c1; ax=axs[1,1], ticks=ticks[1], format)
+   cb2 = colorbar(c2; ax=axs[1,2], ticks=ticks[2])
+   cb3 = colorbar(c3; ax=axs[1,3], ticks=ticks[3])
+   cb4 = colorbar(c4; ax=axs[2,1], ticks=ticks[4], format)
+   cb5 = colorbar(c5; ax=axs[2,2], ticks=ticks[5], format, extend="both")
+   cb6 = colorbar(c6; ax=axs[2,3], ticks=ticks[6], extend="max")
+
+   ylabels = ("[amu/cc]", "[km/s]", "[km/s]", "[nPa]", "[nT]", "[mV/m]")
+
+   for (i, cb) in enumerate((cb1, cb2, cb3, cb4, cb5, cb6))
+      cb.ax.set_ylabel(ylabels[i]; fontsize)
+      cb.outline.set_linewidth(1.0)
+   end
+
+   return fig, cs, range1, range2
+end
+
+@everywhere function update_plot!(fig, cs, range1, range2, outdir, file)
+   isfile(outdir*file[end-8:end-5]*".png") && return
+
+   println("file = $file")
+   meta = load(file)
+
+   data = Vlasiator.prep2d(meta, "proton/vg_rho", :mag)'
+   cs[1].set_array(data[range2,range1] ./ 1f6)
+
+   data = Vlasiator.prep2d(meta, "proton/vg_v", :x)'
+   cs[2].set_array(data[range2,range1] ./ 1f3)
+
+   data = Vlasiator.prep2d(meta, "proton/vg_v", :z)'
+   cs[3].set_array(data[range2,range1] ./ 1f3)
+
+   data = Vlasiator.prep2d(meta, "vg_pressure", :mag)'
+   cs[4].set_array(data[range2,range1] .* 1f9)
+
+   data = Vlasiator.prep2d(meta, "vg_b_vol", :z)'
+   cs[5].set_array(data[range2,range1] .* 1f9)
+
+   data = Vlasiator.prep2d(meta, "vg_e_vol", :mag)'
+   cs[6].set_array(data[range2,range1] .* 1f3)
+
+   str_title = @sprintf "Density pulse run, t= %4.1fs" meta.time
+   fig.suptitle(str_title; fontsize="xx-large")
+
+   savefig(outdir*file[end-8:end-5]*".png", bbox_inches="tight")
+end
+
+function make_jobs(files)
+   for f in files
+       put!(jobs, f)
+   end
+end
+
+@everywhere function do_work(jobs, status, outdir, cmaps, norms, ticks, pArgs1, extent)
+   fig, cs, range1, range2 = init_figure(cmaps, norms, ticks, pArgs1, extent)
+   while true
+      file = take!(jobs)
+      update_plot!(fig, cs, range1, range2, outdir, file)
+      put!(status, true)
+   end
+   close(fig)
+end
+
+################################################################################
+files = filter(contains(r"^bulk.*\.vlsv$"), readdir())
+
+nfile = length(files)
+# Set output directory
+const outdir = "contour/"
+
+# Set colormaps for continuous and divergent data
+const cmaps = (matplotlib.cm.turbo, matplotlib.cm.RdBu_r)
+const axisunit = EARTH
+const extent = [0., 20., -20., 20.] # [RE], default: [-Inf32, Inf32, -Inf32, Inf32]
+
+# Plotting range for each variable
+const ρmin, ρmax   = 0.1, 15.0     # [amu/cc]
+const vxmin, vxmax = -650.0, 650.0 # [km/s]
+const vzmin, vzmax = -500.0, 500.0 # [km/s]
+const pmin, pmax   = 0.0, 3.6      # [nPa]
+const bmin, bmax   = -60.0, 60.    # [nT]
+const emin, emax   = 0.0, 20.      # [mV/m]
+
+meta = load(files[1])
+
+pArgs1 = Vlasiator.set_args(meta, "proton/vg_rho", axisunit; normal=:none)
+
+norm1, ticks1 = set_colorbar(Linear, ρmin, ρmax)
+norm2, ticks2 = set_colorbar(Linear, vxmin, vxmax)
+norm3, ticks3 = set_colorbar(Linear, vzmin, vzmax)
+norm4, ticks4 = set_colorbar(Linear, pmin, pmax)
+norm5, ticks5 = set_colorbar(Linear, bmin, bmax)
+norm6, ticks6 = set_colorbar(Linear, emin, emax)
+
+const norms = (norm1, norm2, norm3, norm4, norm5, norm6)
+const ticks = (ticks1, ticks2, ticks3, ticks4, ticks5, ticks6)
+
+const jobs   = RemoteChannel(()->Channel{String}(nfile))
+const status = RemoteChannel(()->Channel{Bool}(nworkers()))
+
+@broadcast begin
+   const fontsize = "x-large"
+end
+
+println("Total number of files: $nfile")
+println("Running with $(nworkers()) workers...")
+
+@async make_jobs(files) # Feed the jobs channel with all files to process.
+
+@sync for p in workers()
+   @async remote_do(do_work, p, jobs, status, outdir, cmaps, norms, ticks, pArgs1, extent)
+end
+
+let n = nfile
+   t = @elapsed while n > 0 # wait for all jobs to complete
+      take!(status)
+      n -= 1
+   end
+   println("Finished in $(round(t, digits=2))s.")
+end

This page was generated using DemoCards.jl.

diff --git a/v0.11.5/examples/visualization/demo_2dcontourseries_pyplot/index.html b/v0.11.5/examples/visualization/demo_2dcontourseries_pyplot/index.html new file mode 100644 index 00000000..d249b5dd --- /dev/null +++ b/v0.11.5/examples/visualization/demo_2dcontourseries_pyplot/index.html @@ -0,0 +1,52 @@ + +2D contour plots · Vlasiator.jl

2D contour plots

Author Update time

This script creates contours from a series of input files with a fixed color range. Combined with ffmpeg, we can easily make animations from data.

using Vlasiator, VlasiatorPyPlot, Printf
+
+files = filter(contains(r"^bulk.*\.vlsv$"), readdir())
+nfile = length(files)
+# Set output directory
+const outdir = "out/"
+
+meta = load(files[1])
+const varname = "proton/vg_rho"
+
+fig, ax = plt.subplots()
+
+const comp = :z # vector component for plotting (if applicable)
+const axisunit = EARTH
+const colorscale = Log
+const addcolorbar = true
+# Choose colormap
+const cmap = matplotlib.cm.turbo
+# Set data plotting range
+const vmin = 7.0e4
+const vmax = 2.5e6
+
+pArgs = Vlasiator.set_args(meta, varname, axisunit; normal=:none)
+
+x1, x2 = Vlasiator.get_axis(pArgs)
+
+norm, ticks = set_colorbar(colorscale, vmin, vmax)
+
+fakedata = zeros(Float32, length(x2), length(x1))
+
+c = ax.pcolormesh(x1, x2, fakedata; norm, cmap)
+
+VlasiatorPyPlot.set_plot(c, ax, pArgs, ticks, addcolorbar)
+
+for (i, file) in enumerate(files)
+   @info "$i out of $nfile"
+   local meta = load(file)
+
+   var = meta[varname]
+   t = readparameter(meta, "time")
+
+   data = Vlasiator.prep2d(meta, varname, comp)'
+   c.set_array(data)
+
+   str_title = @sprintf "t= %4.1fs" t
+   ax.set_title(str_title)
+
+   savefig(outdir*lpad(i, 4, '0')*".png", bbox_inches="tight", dpi=100)
+end
+
+close()

This page was generated using DemoCards.jl.

diff --git a/v0.11.5/examples/visualization/demo_2dplot_plots/index.html b/v0.11.5/examples/visualization/demo_2dplot_plots/index.html new file mode 100644 index 00000000..28b5cf3c --- /dev/null +++ b/v0.11.5/examples/visualization/demo_2dplot_plots/index.html @@ -0,0 +1,25 @@ + +2D contour plot with streamlines · Vlasiator.jl

2D contour plot with streamlines

Author Update time

This demos shows how to reading 2D simulation data, zoom-in to a region of interest, and add streamlines on top of colored mesh.

using Vlasiator, Plots
+
+file = "bulk.0000501.vlsv"
+nameρ = "rho"
+nameV = "rho_v"
+
+boxcoords = Float64[0, 20, -15, 15]
+
+meta = load(file)
+
+heatmap(meta, nameρ,
+   xlim=(boxcoords[1], boxcoords[2]),
+   ylim=(boxcoords[3], boxcoords[4]),
+   aspect_ratio=:equal,
+   c=:turbo)
+
+#=
+# Attributes can be modified afterwards, but it's slower.
+heatmap(meta, nameρ, c=:turbo)
+xlims!(boxcoords[1], boxcoords[2])
+ylims!(boxcoords[3], boxcoords[4])
+=#
+
+streamplot(meta, nameV, comp="xy", color="w", density=2.0)

This page was generated using DemoCards.jl.

diff --git a/v0.11.5/examples/visualization/demo_2dplot_pyplot/index.html b/v0.11.5/examples/visualization/demo_2dplot_pyplot/index.html new file mode 100644 index 00000000..b1cdea2e --- /dev/null +++ b/v0.11.5/examples/visualization/demo_2dplot_pyplot/index.html @@ -0,0 +1,43 @@ + +2D contour plot with streamlines and levels · Vlasiator.jl

2D contour plot with streamlines and levels

Author Update time

This demo shows how to plot 2D colored contour in a region of interest with streamlines and levels.

using VlasiatorPyPlot
+using Vlasiator: RE
+
+function main(file::String, varname::String)
+   meta = load(file)
+
+   fig, ax = plt.subplots(1,1; figsize=(8,6), constrained_layout=true)
+
+   pcolormesh(meta, varname, ax)
+   streamplot(meta, "rho_v", ax; comp="xy", color="w", density=2.0)
+
+   cbar = ax.collections[end].colorbar
+   boxcoords = Float64[0, 20, -15, 15]
+   ax.set_xlim([boxcoords[1],boxcoords[2]])
+   ax.set_ylim([boxcoords[3],boxcoords[4]])
+
+   # Contour line at a specific level
+   pArgs = Vlasiator.set_args(meta, varname, EARTH)
+   x, y = Vlasiator.get_axis(pArgs)
+   data = Vlasiator.prep2d(meta, varname)'
+   CS = plt.contour(x, y, data, levels = [1e7],
+                    colors=("k",),linestyles=("-",),linewidths=(0.5,))
+
+   # Add a rectangular box region
+   boxrange = (250:299, 200:249)
+
+   x = LinRange(meta.coordmin[1], meta.coordmax[1], meta.ncells[1])
+   y = LinRange(meta.coordmin[2], meta.coordmax[2], meta.ncells[2])
+   # Construct the patch
+   rect = matplotlib.patches.Rectangle((x[boxrange[1][1]]/RE, y[boxrange[2][1]]/RE),
+      (x[boxrange[1][end]] - x[boxrange[1][1]])/RE,
+      (y[boxrange[2][end]] - y[boxrange[2][1]])/RE,
+      linewidth=1, edgecolor="r", facecolor="none")
+
+   ax.add_patch(rect)
+end
+
+
+file = "bulk.0000501.vlsv"
+nameρ = "rho"
+
+main(file, nameρ)

This page was generated using DemoCards.jl.

diff --git a/v0.11.5/examples/visualization/demo_3dcuts_pyplot/index.html b/v0.11.5/examples/visualization/demo_3dcuts_pyplot/index.html new file mode 100644 index 00000000..32cbd3d7 --- /dev/null +++ b/v0.11.5/examples/visualization/demo_3dcuts_pyplot/index.html @@ -0,0 +1,36 @@ + +Orthogonal slices · Vlasiator.jl

Orthogonal slices

Author Update time

This demo shows how to plot 2D colored contour slices for 3D data.

using VlasiatorPyPlot, PyCall
+
+axes_grid1 = pyimport("mpl_toolkits.axes_grid1")
+ImageGrid = axes_grid1.ImageGrid
+
+file = "bulk1.0001000.vlsv"
+nameρ = "proton/vg_rho"
+colorscale = Log
+addcolorbar = false
+
+meta = load(file)
+
+# normal cuts in the x,y,z directions
+fig = plt.figure(figsize=(12, 4))
+grid = ImageGrid(fig, 111,
+                 nrows_ncols=(1, 3),
+                 axes_pad=0.85,
+                 cbar_mode="single",
+                 cbar_location="right",
+                 cbar_pad=0.1,
+                 label_mode="all"
+                 )
+
+c1 = pcolormesh(meta, nameρ, grid[1]; normal=:x, addcolorbar, colorscale)
+c2 = pcolormesh(meta, nameρ, grid[2]; normal=:y, addcolorbar, colorscale)
+c3 = pcolormesh(meta, nameρ, grid[3]; normal=:z, addcolorbar, colorscale)
+
+cb = fig.colorbar(c3, cax=grid.cbar_axes[1])
+datainfo = readvariablemeta(meta, nameρ)
+
+cb_title_str = datainfo.variableLaTeX
+cb_title_str *= ",["*datainfo.unitLaTeX*"]"
+cb_title = cb.ax.set_title(cb_title_str, fontsize=14, fontweight="bold")
+
+plt.savefig("test.png", bbox_inches="tight")

This page was generated using DemoCards.jl.

diff --git a/v0.11.5/examples/visualization/demo_B_fieldline_mp_pyplot/index.html b/v0.11.5/examples/visualization/demo_B_fieldline_mp_pyplot/index.html new file mode 100644 index 00000000..938cbabd --- /dev/null +++ b/v0.11.5/examples/visualization/demo_B_fieldline_mp_pyplot/index.html @@ -0,0 +1,165 @@ + +Field lines with customized seeds via multi-processing · Vlasiator.jl

Field lines with customized seeds via multi-processing

Author Update time

This demo shows how to plot field lines with handpicked seeds via multi-processing. To run on a single node,

julia -p $ncores demo_fieldline_mp_pyplot.jl
using Distributed, ParallelDataTransfer
+@everywhere using Vlasiator, VlasiatorPyPlot, PyCall, Printf, LaTeXStrings, FieldTracer
+@everywhere using Vlasiator: RE
+
+function generate_seeds(coordmin, coordmax, dim_, nseeds)
+   seeds = Matrix{Float64}(undef, 2, nseeds)
+   for i in 1:nseeds
+      seeds[1,i] = coordmin[dim_[1]] +
+         (coordmax[dim_[1]] - coordmin[dim_[1]]) / nseeds * (i - 1)
+      seeds[2,i] = -20RE
+   end
+   seeds
+end
+
+@everywhere function init_figure(pArgs, norm, ticks, seeds, extent)
+   fig, ax = plt.subplots(1, 1; num=myid(),
+      figsize=(6, 8), constrained_layout=true)
+
+   fontsize = "x-large"
+
+   ax.set_aspect("equal")
+   # Set border line widths
+   for loc in ("left", "bottom", "right", "top")
+      edge = get(ax.spines, loc, nothing)
+      edge.set_linewidth(2.0)
+   end
+   ax.xaxis.set_tick_params(width=2.0, length=3)
+   ax.yaxis.set_tick_params(width=2.0, length=3)
+   ax.xaxis.set_minor_locator(matplotlib.ticker.AutoMinorLocator())
+   ax.yaxis.set_minor_locator(matplotlib.ticker.AutoMinorLocator())
+
+   ax.set_xlabel(pArgs.strx; fontsize)
+   ax.set_ylabel(pArgs.stry; fontsize)
+
+   ax.set_title("Density"; fontsize)
+
+   x1, x2 = Vlasiator.get_axis(pArgs)
+
+   range1 = searchsortedfirst(x1, extent[1]):searchsortedlast(x1, extent[2])
+   range2 = searchsortedfirst(x2, extent[3]):searchsortedlast(x2, extent[4])
+
+   fakedata = zeros(Float32, length(range2), length(range1))
+   c = ax.pcolormesh(x1[range1], x2[range2], fakedata; norm, cmap=matplotlib.cm.turbo)
+
+   format = matplotlib.ticker.FormatStrFormatter("%.1f")
+   cb1 = colorbar(c; ax, ticks, format)
+   cb1.ax.set_ylabel("[amu/cc]"; fontsize)
+   cb1.outline.set_linewidth(1.0)
+
+   fakeline = [0.0, 1.0]
+   ls = [ax.plot(fakeline, fakeline,  color="w") for _ in 1:size(seeds,2)]
+
+   return fig, ax, c, ls, range1, range2
+end
+
+@everywhere function update_plot!(ax, c, ls, range1, range2, dim_, seeds, grid1, grid2,
+   outdir, file)
+   isfile(outdir*file[end-8:end-5]*".png") && return
+
+   println("file = $file")
+   meta = load(file)
+
+   data = Vlasiator.prep2d(meta, "proton/vg_rho", :mag)'
+   c.set_array(data[range2,range1] ./ 1f6)
+
+   str_title = @sprintf "Density pulse run, t= %4.1fs" meta.time
+   ax.set_title(str_title; fontsize="x-large")
+
+   b = meta["vg_b_vol"]
+   b1 = reshape(b[dim_[1],:], meta.ncells[dim_[1]], meta.ncells[dim_[2]])
+   b2 = reshape(b[dim_[2],:], meta.ncells[dim_[1]], meta.ncells[dim_[2]])
+   # Find existing arrow annotations
+   annotations = [child for child in ax.get_children() if
+      pybuiltin(:isinstance)(child, matplotlib.text.Annotation)]
+   # Remove existing arrows
+   for a in annotations
+      a.remove()
+   end
+   # Add new arrows along field lines
+   for i in axes(seeds,2)
+      startx, starty = seeds[:,i]
+      x1, y1 = trace(b1, b2, startx, starty, grid1, grid2;
+         ds=0.5, maxstep=4000, gridtype="ndgrid")
+      x1 ./= RE
+      y1 ./= RE
+      if length(x1) < 5; continue; end
+      ls[i][1].set_xdata(x1)
+      ls[i][1].set_ydata(y1)
+      add_arrow(ls[i][1])
+   end
+
+   savefig(outdir*file[end-8:end-5]*".png", bbox_inches="tight")
+end
+
+function make_jobs(files)
+   for f in files
+       put!(jobs, f)
+   end
+end
+
+@everywhere function do_work(jobs, status,
+   outdir, pArgs, norm, ticks, grid1, grid2, dim_, seeds, extent)
+
+   fig, ax, c, ls, range1, range2 = init_figure(pArgs, norm, ticks, seeds, extent)
+
+   while true
+      file = take!(jobs)
+      update_plot!(ax, c, ls, range1, range2, dim_, seeds, grid1, grid2, outdir, file)
+      put!(status, true)
+   end
+   close(fig)
+end
+
+################################################################################
+files = filter(contains(r"^bulk.*\.vlsv$"), readdir())
+
+nfile = length(files)
+# Set output directory
+const outdir = "out/"
+
+const jobs   = RemoteChannel(()->Channel{String}(nfile))
+const status = RemoteChannel(()->Channel{Bool}(nworkers()))
+
+const axisunit = EARTH # contour plot axes unit
+const extent = [0., 20., -20., 20.] # [RE], default: [-Inf32, Inf32, -Inf32, Inf32]
+
+# Upper/lower limits for each variable
+const ρmin, ρmax = 0.0, 11.0      # [amu/cc]
+
+meta = load(files[1])
+# Construct pieces for plotting
+pArgs = Vlasiator.set_args(meta, "proton/vg_rho", axisunit; normal=:none)
+norm, ticks = set_colorbar(Linear, ρmin, ρmax)
+
+# Mark spatial dimensions
+const dim_ = pArgs.stry[1] == 'Z' ? (1,3) : (1,2)
+
+(;coordmin, coordmax, ncells) = meta
+
+# Generate regular Cartesian range
+grid1 = range(coordmin[dim_[1]], coordmax[dim_[1]], length=ncells[dim_[1]])
+grid2 = range(coordmin[dim_[2]], coordmax[dim_[2]], length=ncells[dim_[2]])
+# Generate seeds for in-plane field line tracing
+const nseeds = 10
+seeds = generate_seeds(coordmin, coordmax, dim_, nseeds)
+
+
+println("Total number of files: $nfile")
+println("Running with $(nworkers()) workers...")
+
+@async make_jobs(files) # Feed the jobs channel with all files to process.
+
+@sync for p in workers()
+   @async remote_do(do_work, p, jobs, status,
+      outdir, pArgs, norm, ticks, grid1, grid2, dim_, seeds, extent)
+end
+
+let n = nfile
+   t = @elapsed while n > 0 # wait for all jobs to complete
+      take!(status)
+      n -= 1
+   end
+   println("Finished in $(round(t, digits=2))s.")
+end

This page was generated using DemoCards.jl.

diff --git a/v0.11.5/examples/visualization/demo_B_fieldline_pyplot/index.html b/v0.11.5/examples/visualization/demo_B_fieldline_pyplot/index.html new file mode 100644 index 00000000..47d000c4 --- /dev/null +++ b/v0.11.5/examples/visualization/demo_B_fieldline_pyplot/index.html @@ -0,0 +1,67 @@ + +Field lines with customized seeds · Vlasiator.jl

Field lines with customized seeds

Author Update time

This demo shows how to plot field lines with handpicked seeds.

using VlasiatorPyPlot, FieldTracer
+using Vlasiator: RE # Earth radius, [m]
+
+function main()
+   file = "../../bulk.0000999.vlsv"
+   meta = load(file)
+   (;coordmin, coordmax, ncells) = meta
+   pcolormesh(meta, "proton/vg_rho", colorscale=Linear)
+
+   dim_ =
+      if ncells[2] == 1
+         (1,3)
+      elseif ncells[3] == 1
+         (1,2)
+      else
+         @error "Not implemented for ncells = $ncells."
+      end
+
+   # NonAMR Cartesian mesh
+   grid1 = range(coordmin[dim_[1]], coordmax[dim_[1]], length=ncells[dim_[1]])
+   grid2 = range(coordmin[dim_[2]], coordmax[dim_[2]], length=ncells[dim_[2]])
+
+   ns1 = 14 # number of seeding points on the dayside
+   ns2 = 10 # number of seeding points on the nightside
+   ns4 = 4  # number of seeding points in the polar region
+   seeds = Matrix{Float64}(undef, 2, ns1+2*ns2+2*ns4)
+
+   for i in 1:ns1
+      seeds[1,i] = coordmax[dim_[1]] / ns1 * (i - 1)
+      seeds[2,i] = 0.0
+   end
+
+   for i in 1:ns2
+      seeds[1,ns1+i] = -10RE
+      seeds[2,ns1+i] = coordmin[dim_[2]] +
+         (coordmax[dim_[2]] - coordmin[dim_[2]]) / ns2 * (i - 1)
+      seeds[1,ns1+ns2+i] = -30RE
+      seeds[2,ns1+ns2+i] = coordmin[dim_[2]] +
+         (coordmax[dim_[2]] - coordmin[dim_[2]]) / ns2 * (i - 1)
+   end
+
+   for i in 1:ns4
+      seeds[1,ns1+2*ns2+i] = -20RE + 10RE*(i - 1)
+      seeds[2,ns1+2*ns2+i] = 30RE
+      seeds[1,ns1+2*ns2+ns4+i] = -20RE + 10RE*(i - 1)
+      seeds[2,ns1+2*ns2+ns4+i] = -30RE
+   end
+
+   b = meta["vg_b_vol"]
+   b1 = reshape(b[dim_[1],:], ncells[dim_[1]], ncells[dim_[2]])
+   b2 = reshape(b[dim_[2],:], ncells[dim_[1]], ncells[dim_[2]])
+
+   for i = axes(seeds,2)
+      startx, starty = seeds[:,i]
+      x1, y1 = trace(b1, b2, startx, starty, grid1, grid2;
+         ds=0.5, maxstep=3000, gridtype="ndgrid")
+      x1 ./= RE
+      y1 ./= RE
+      if length(x1) < 5; continue; end
+      line = plot(x1, y1, color="w")
+      add_arrow(line[1])
+   end
+
+end
+
+main()

This page was generated using DemoCards.jl.

diff --git a/v0.11.5/examples/visualization/demo_bowshock_2d_mt/index.html b/v0.11.5/examples/visualization/demo_bowshock_2d_mt/index.html new file mode 100644 index 00000000..fe3fc978 --- /dev/null +++ b/v0.11.5/examples/visualization/demo_bowshock_2d_mt/index.html @@ -0,0 +1,51 @@ + +Extracting bow shock location · Vlasiator.jl

Extracting bow shock location

Author Update time

This demo shows how to extract the bow shock location from 2D equatorial run outputs and save into file. To run in multi-threading mode,

julia -t nthreads demo_bowshock_2d_mt.jl

or alternatively

JULIA_NUM_THREADS=$nthreads julia demo_bowshock_2d_mt.jl
using Vlasiator
+using Vlasiator: RE # Earth radius, [m]
+using JLD2: jldsave
+
+# Upstream solar wind temperature
+const Tsw = 0.5e6 #[K]
+
+function extract_bowshock_position(files; verbose=true)
+   nfiles = length(files)
+
+   verbose && println("Number of files: $nfiles")
+
+   meta = load(files[1])
+
+   x = LinRange{Float32}(meta.coordmin[1], meta.coordmax[1], meta.ncells[1])
+   y = LinRange{Float32}(meta.coordmin[2], meta.coordmax[2], meta.ncells[2])
+
+   close(meta.fid)
+
+   # Only extract bow shock location near the front between y = ±20RE
+   ymin_ = findlast(<(-20RE), y)
+   ymax_ = findfirst(>(20RE), y)
+
+   x_crossing = zeros(Float32, ymax_-ymin_+1, nfiles)
+   y_crossing = y[ymin_:ymax_]
+
+   Threads.@threads for ifile = 1:nfiles
+      verbose && println("$(files[ifile]) on thread $(Threads.threadid())")
+      f = load(files[ifile])
+      # Obtain thermal temperature
+      T = f["T"]
+      close(f.fid)
+      T = reshape(T, f.ncells[1], f.ncells[2])
+      # Extract bow shock location from the 1st point which fulfills
+      # the threshold: T > 4 * Tsw
+      for (i,j) in enumerate(ymin_:ymax_) # scan in y direction
+         ind_ = findlast(>(4*Tsw), @view T[:,j]) # count from upstream
+         x_crossing[i,ifile] = x[ind_]
+      end
+   end
+
+   return x_crossing, y_crossing
+end
+
+#####
+files = filter(contains(r"^bulk.*\.vlsv$"), readdir())
+
+@time x_crossing, y_crossing = extract_bowshock_position(files)
+
+jldsave("example.jld2"; x_crossing, y_crossing)

This page was generated using DemoCards.jl.

diff --git a/v0.11.5/examples/visualization/demo_bowshock_2dlocation/index.html b/v0.11.5/examples/visualization/demo_bowshock_2dlocation/index.html new file mode 100644 index 00000000..74af6418 --- /dev/null +++ b/v0.11.5/examples/visualization/demo_bowshock_2dlocation/index.html @@ -0,0 +1,31 @@ + +Extracting bow shock location · Vlasiator.jl

Extracting bow shock location

Author Author Update time

This demo shows how to extract the bow shock location from a 2D equatorial run and plot.

using Vlasiator, PyPlot
+
+# Upstream solar wind temperature
+const Tsw = 0.5e6 #[K]
+
+const file = "bulk.0001347.vlsv"
+meta = load(file)
+# NonAMR
+const x = LinRange{Float32}(meta.coordmin[1], meta.coordmax[1], meta.ncells[1])
+const y = LinRange{Float32}(meta.coordmin[2], meta.coordmax[2], meta.ncells[2])
+
+# Obtain thermal temperature
+T = meta["T"]
+T = reshape(T, meta.ncells[1], meta.ncells[2])
+
+const x_crossing = zeros(Float32, meta.ncells[2])
+const y_crossing = y
+
+# Extract bow shock location from the 1st point which fulfills the threshold: T > 4 * Tsw
+# Note: this won't work if the bow shock does not cover the whole domain y extension!
+for j in 1:meta.ncells[2] # scan in y direction
+   ind_ = findlast(>(4*Tsw), @view T[:,j]) # count from upstream
+   x_crossing[j] = x[ind_]
+end
+
+# Julia is column-major, while Python is row-major
+imshow(T', extent=(x[1], x[end], y[1], y[end]), origin="lower", cmap=plt.get_cmap("ocean"))
+plot(x_crossing, y_crossing, "r")
+axis("scaled")
+savefig("bs_temp_test.png")

This page was generated using DemoCards.jl.

diff --git a/v0.11.5/examples/visualization/demo_diff_extracting/index.html b/v0.11.5/examples/visualization/demo_diff_extracting/index.html new file mode 100644 index 00000000..b7568048 --- /dev/null +++ b/v0.11.5/examples/visualization/demo_diff_extracting/index.html @@ -0,0 +1,57 @@ + +Extracting differences between FsGrid and DCCRG variables · Vlasiator.jl

Extracting differences between FsGrid and DCCRG variables

Author Update time

This demos shows how to extract differences between FsGrid and DCCRG variables from 3D data.

using Vlasiator, PyPlot
+import Vlasiator: RE
+
+function main()
+   directory = "./"
+   file = "bulk1.0001284.vlsv"
+   # Box range for variation diff extraction
+   extent = [0.0, 12.0, -7.0, 7.0] # default [-Inf, Inf, -Inf, Inf]
+
+   normal = :y
+   origin = 0.0
+   axisunit = EARTH
+   comp = 2
+
+   meta = load(directory*file)
+
+   pArgs = Vlasiator.set_args(meta, "fg_e", axisunit; normal, origin)
+   e_fg = Vlasiator.prep2dslice(meta, "fg_e", normal, comp, pArgs)
+
+   pArgs = Vlasiator.set_args(meta, "vg_e_vol", axisunit; normal, origin)
+   e_vg = Vlasiator.prep2dslice(meta, "vg_e_vol", normal, comp, pArgs)
+
+   x1, x2 = Vlasiator.get_axis(pArgs)
+
+   range1, range2 =
+      if axisunit == EARTH
+         searchsortedfirst(x1, extent[1]):searchsortedlast(x1, extent[2]),
+         searchsortedfirst(x2, extent[3]):searchsortedlast(x2, extent[4])
+      else
+         searchsortedfirst(x1, extent[1]):searchsortedlast(x1, extent[2]),
+         searchsortedfirst(x2, extent[3]):searchsortedlast(x2, extent[4])
+      end
+
+   ## Visualization
+   fig, ax = plt.subplots()
+
+   diff = (e_fg[range1,range2] - e_vg[range1,range2])'
+
+   c = ax.pcolormesh(x1[range1], x2[range2], diff,
+      norm=matplotlib.colors.CenteredNorm(),
+      cmap=matplotlib.cm.RdBu_r)
+
+   if comp == 1
+      fig.colorbar(c; ax, label="E_fg_x - E_vg_x [V/m]")
+   elseif comp == 2
+      fig.colorbar(c; ax, label="E_fg_y - E_vg_y [V/m]")
+   elseif comp == 3
+      fig.colorbar(c; ax, label="E_fg_z - E_vg_z [V/m]")
+   end
+
+   ax.set_title(file)
+
+   #savefig("test_diff.png")
+end
+
+main()

This page was generated using DemoCards.jl.

diff --git a/v0.11.5/examples/visualization/demo_energy_spectrum/index.html b/v0.11.5/examples/visualization/demo_energy_spectrum/index.html new file mode 100644 index 00000000..dba18e12 --- /dev/null +++ b/v0.11.5/examples/visualization/demo_energy_spectrum/index.html @@ -0,0 +1,52 @@ + +Energy spectrum at a fixed point · Vlasiator.jl

Energy spectrum at a fixed point

Author Update time

This demo shows how to plot energy spectrum of oscillations at a fixed point.

using FFTW, JLD2, CurveFit, PyPlot
+using Vlasiator: RE
+
+function main()
+   file = "satellites_uniform_sampled.jld2"
+   data = JLD2.load(file)
+
+   nSatellite = length(data["t"])
+   nI, nJ = size(data["rho"])[2:3]
+
+   t = data["t"]
+   # Select spatial point
+   i, j = 5, 5
+   var = data["rho"][:,i,j]
+
+   dt = t[2] - t[1] # uniform sample interval [s]
+   Fs = 1 / dt      # sample frequency, [Hz]
+   Fn = Fs / 2      # Nyquist frequency, [Hz]
+
+   ## Frequency calculation
+   nPoints = length(var)
+   nFFT = nPoints
+   df = Fs / nFFT
+   freq_fullrange = -Fn:df:Fn
+
+   freq = freq_fullrange[(nPoints ÷ 2 + 1):end-1]
+
+   var_freq = fft(var)
+   var_power = abs.(fftshift(var_freq))[(nPoints ÷ 2 + 1):end]
+
+   # k is the exponential coefficient
+   a, k = @views power_fit(freq[10:end], var_power[10:end])
+
+   figure(figsize=(6,8))
+   loglog(freq, var_power)
+   axis("scaled")
+
+   min_power, max_power = extrema(@view var_power[10:end])
+   xlim(freq[8], Fs)
+   ylim(min_power * 0.75, max_power * 2.0)
+
+   xlabel("Frequency [Hz]"; fontsize=14)
+   ylabel("Power Density "; fontsize=14)
+   title(string(round.(data["locations"][i,j]./RE, digits=1))*"Re"; fontsize=14)
+
+   loglog(freq[10:end], a.*freq[10:end].^k, label="k = $(round(k, digits=1))")
+
+   legend()
+end
+
+main()

This page was generated using DemoCards.jl.

diff --git a/v0.11.5/examples/visualization/demo_field_tracing_2d/index.html b/v0.11.5/examples/visualization/demo_field_tracing_2d/index.html new file mode 100644 index 00000000..056fe1d5 --- /dev/null +++ b/v0.11.5/examples/visualization/demo_field_tracing_2d/index.html @@ -0,0 +1,34 @@ + +Tracing field lines in 2D · Vlasiator.jl

Tracing field lines in 2D

Author Update time

This demo shows how to trace streamlines in a 2D uniform field.

using VlasiatorPyPlot, FieldTracer
+using Vlasiator: RE # Earth radius, [m]
+
+function main()
+   file = "bulk.0000501.vlsv"
+   nameρ = "rho"
+   nameV = "rho_v"
+
+   meta = load(file)
+
+   pcolormesh(meta, nameρ)
+
+   v = readvariable(meta, nameV)
+   vx = reshape(v[1,:], meta.ncells[1], meta.ncells[2])
+   vy = reshape(v[2,:], meta.ncells[1], meta.ncells[2])
+   # tracing starting point
+   xstart, ystart = 12RE, 0RE
+   # regular Cartesian mesh
+   x = range(meta.coordmin[1], meta.coordmax[1], length=meta.ncells[1])
+   y = range(meta.coordmin[2], meta.coordmax[2], length=meta.ncells[2])
+
+   # RK4 scheme by default
+   x1, y1 = trace2d(vx, vy, xstart, ystart, x, y;
+      ds=0.5, maxstep=3000, gridType="ndgrid")
+   x1 ./= RE
+   y1 ./= RE
+
+   plot(x1, y1)
+
+   streamplot(meta, nameV, comp="xy", color="w", density=1.0)
+end
+
+main()

This page was generated using DemoCards.jl.

diff --git a/v0.11.5/examples/visualization/demo_field_tracing_3d/index.html b/v0.11.5/examples/visualization/demo_field_tracing_3d/index.html new file mode 100644 index 00000000..52bf62be --- /dev/null +++ b/v0.11.5/examples/visualization/demo_field_tracing_3d/index.html @@ -0,0 +1,71 @@ + +Tracing field lines in 3D · Vlasiator.jl

Tracing field lines in 3D

Author Update time

This demo shows how to trace along a field line and extract variables from 3D AMR grid.

Warning

This is a proof of concept, which is memory-bound in 3D and may be quite inefficient!

using Vlasiator, FieldTracer, PyPlot
+using StaticArrays
+using Vlasiator: RE
+
+function get_cell_along_B(meta::MetaVLSV, seed::Vector{T};
+   ds::Float64=0.2, maxstep::Int=20000, direction::String="both") where T
+   B = Vlasiator.fillmesh(meta, ["vg_b_vol"]; maxamronly=true)[1][1][1]
+
+   nx, ny, nz = size(B)[2:4]
+
+   xrange = LinRange(meta.coordmin[1], meta.coordmax[1], nx)
+   yrange = LinRange(meta.coordmin[2], meta.coordmax[2], ny)
+   zrange = LinRange(meta.coordmin[3], meta.coordmax[3], nz)
+
+   bx = @view B[1,:,:,:]
+   by = @view B[2,:,:,:]
+   bz = @view B[3,:,:,:]
+   xs, ys, zs = seed
+
+   x, y, z = trace(bx, by, bz, xs, ys, zs, xrange, yrange, zrange; ds, maxstep, direction)
+
+   cellids = [getcell(meta, SVector(x[1], y[1], z[1]))]
+
+   for i in eachindex(x)[2:end]
+      cellidnew = getcell(meta, SVector(x[i], y[i], z[i]))
+      if cellidnew != cellids[end]
+         push!(cellids, cellidnew)
+      end
+   end
+
+   cellids
+end
+
+function main()
+   file = "bulk1.0001000.vlsv"
+   meta = load(file)
+
+   seed = [-5.0, 0., 3.5] .* RE
+   # For EGI, ds=1.0 is between 1-2 steps per finest cell.
+   cellids = get_cell_along_B(meta, seed; ds=1.0, maxstep=100, direction="backward")
+
+   #n = readvariable(meta, "proton/vg_rho", cellids)
+   #v = readvariable(meta, "proton/vg_v", cellids)
+   #E = readvariable(meta, "fg_e", cellids) # Not available for now!
+
+   x = zeros(Float64, length(cellids))
+   y = zeros(Float64, length(cellids))
+   z = zeros(Float64, length(cellids))
+
+   for i in eachindex(cellids)
+      coords = getcellcoordinates(meta, cellids[i])
+      x[i], y[i], z[i] = coords
+   end
+
+   fig = plt.figure()
+   ax = fig.add_subplot(projection="3d")
+
+   ax.set_xlabel("x [RE]")
+   ax.set_ylabel("y [RE]")
+   ax.set_zlabel("z [RE]")
+
+   ax.set_box_aspect([1,1,1])
+   ax.set_xlim3d([-20.0, -5.0])
+   ax.set_ylim3d([0.0, 0.5])
+   ax.set_zlim3d([-2.0, 3.0])
+
+   ax.plot3D(x./RE, y./RE, z./RE)
+end
+
+main()

This page was generated using DemoCards.jl.

diff --git a/v0.11.5/examples/visualization/demo_lineextracting_mp_pyplot/index.html b/v0.11.5/examples/visualization/demo_lineextracting_mp_pyplot/index.html new file mode 100644 index 00000000..844e0cf9 --- /dev/null +++ b/v0.11.5/examples/visualization/demo_lineextracting_mp_pyplot/index.html @@ -0,0 +1,143 @@ + +Extracting variables along a line with multi-processing · Vlasiator.jl

Extracting variables along a line with multi-processing

Author Update time

This demos shows how to extract multiple variables alone a line across multiple frames with multi-processing.

Tip

This can be made faster by updating the data without deleting the lines.

Usage:

julia -p $ncores demo_vars_extracting_mp.jl
using Distributed, ParallelDataTransfer
+using Vlasiator: RE
+@everywhere using Vlasiator, PyPlot, Printf
+
+@everywhere function init_figure(x1, x2)
+   fig, axs = plt.subplots(4, 1; num=myid(),
+      figsize=(10, 15), sharex=true, constrained_layout=true)
+
+   axs[end].set_xlim(x1, x2)
+
+   axs[1].set_ylim(ρmin, ρmax)
+   axs[2].set_ylim(vmin, vmax)
+   axs[3].set_ylim(pmin, pmax)
+   axs[4].set_ylim(bmin, bmax)
+   for ax in axs
+      ax.xaxis.set_minor_locator(matplotlib.ticker.AutoMinorLocator())
+      ax.yaxis.set_minor_locator(matplotlib.ticker.AutoMinorLocator())
+      ax.grid(true)
+   end
+
+   axs[end].set_xlabel("x [RE]"; fontsize)
+   axs[1].set_ylabel("Density [amu/cc]"; fontsize)
+   axs[2].set_ylabel("Velocity [km/s]"; fontsize)
+   axs[3].set_ylabel("Pressure [nPa]"; fontsize)
+   axs[4].set_ylabel("Magnetic field [nT]"; fontsize)
+   return fig, axs
+end
+
+@everywhere function process(axs, file, cellids)
+   isfile("out/"*file[end-8:end-5]*".png") && return
+
+   println("file = $file")
+   meta = load(file)
+
+   p_extract = readvariable(meta, "vg_pressure", cellids) .* 1e9 |> vec # [nPa]
+   rho_extract = readvariable(meta, "proton/vg_rho", cellids) |> vec
+   v_extract = readvariable(meta, "proton/vg_v", cellids)
+   vmag2_extract = sum(x -> x*x, v_extract, dims=1) |> vec
+   pram_extract = rho_extract .* Vlasiator.mᵢ .* vmag2_extract .* 1e9 # [nPa]
+
+   bz = readvariable(meta, "vg_b_vol", cellids)[3,:] .* 1e9 #[nT]
+
+   imagnetopause_ = findfirst(<(0.0), bz)
+
+   axs[1].plot(loc, rho_extract ./ 1e6, label="Proton density", color="#1f77b4")
+   vl1 = axs[1].vlines(loc[imagnetopause_], ρmin, ρmax;
+      colors="r", linestyle="dashed", alpha=0.5)
+
+   axs[2].plot(loc, v_extract[1,:] ./ 1e3, label="Vx", color="#1f77b4")
+   vl2 = axs[2].vlines(loc[imagnetopause_], vmin, vmax;
+      colors="r", linestyle="dashed", alpha=0.5)
+
+   axs[3].plot(loc, pram_extract, label="Ram", color="#1f77b4")
+   axs[3].plot(loc, p_extract, label="Thermal", color="#ff7f0e")
+   vl3 = axs[3].vlines(loc[imagnetopause_], pmin, pmax;
+      colors="r", linestyle="dashed", alpha=0.5)
+
+   axs[4].plot(loc, bz, label="Bz", color="#1f77b4")
+   hl4 = axs[4].hlines(0.0, loc[1], loc[end], colors="k", linestyle="dashed", alpha=0.2)
+   vl4 = axs[4].vlines(loc[imagnetopause_], bmin, bmax;
+       colors="r", linestyle="dashed", alpha=0.5)
+
+   str_title = @sprintf "t= %4.1fs" meta.time
+   axs[1].set_title(str_title; fontsize)
+
+   axs[2].legend(;loc="upper right", fontsize)
+   axs[3].legend(;loc="upper left",  fontsize)
+   axs[4].legend(;loc="upper right", fontsize)
+
+   savefig("out/"*file[end-8:end-5]*".png", bbox_inches="tight")
+
+   for ax in axs
+      for line in ax.get_lines()
+         line.remove()
+      end
+   end
+   for line in (vl1, vl2, vl3, vl4, hl4)
+      line.remove()
+   end
+   return
+end
+
+function make_jobs(files)
+   for f in files
+       put!(jobs, f)
+   end
+end
+
+@everywhere function do_work(jobs, results)
+   fig, axs = init_figure(x1, x2)
+   while true
+      file = take!(jobs)
+      process(axs, file, cellids)
+      put!(results, true)
+   end
+   close(fig)
+end
+
+################################################################################
+files = filter(contains(r"^bulk.*\.vlsv$"), readdir())
+nfile = length(files)
+
+const x1, x2 = 8.0, 29.0
+const point1 = [x1, 0, 0] .* RE
+const point2 = [x2, 0, 0] .* RE
+
+meta = load(files[1])
+cellids, _, _ = getcellinline(meta, point1, point2)
+close(meta.fid)
+
+passobj(1, workers(), [:x1, :x2, :cellids])
+
+@broadcast begin
+   const loc = range(x1, x2, length=length(cellids))
+
+   const ρmin, ρmax = 0.0, 10.0     # [amu/cc]
+   const vmin, vmax = -640.0, 0.0   # [km/s]
+   const pmin, pmax = 0.0, 1.82     # [nPa]
+   const bmin, bmax = -25.0, 60.0   # [nT]
+
+   const fontsize = 14
+end
+
+const jobs    = RemoteChannel(()->Channel{String}(nfile))
+const results = RemoteChannel(()->Channel{Bool}(nworkers()))
+
+println("Total number of files: $nfile")
+println("Running with $(nworkers()) workers...")
+
+@async make_jobs(files) # Feed the jobs channel with all files to process.
+
+@sync for p in workers()
+   @async remote_do(do_work, p, jobs, results)
+end
+
+let n = nfile
+   t = @elapsed while n > 0 # wait for all jobs to complete
+      take!(results)
+      n -= 1
+   end
+   println("Finished in $(round(t, digits=2))s.")
+end

This page was generated using DemoCards.jl.

diff --git a/v0.11.5/examples/visualization/demo_lineextracting_pyplot/index.html b/v0.11.5/examples/visualization/demo_lineextracting_pyplot/index.html new file mode 100644 index 00000000..3cd43b23 --- /dev/null +++ b/v0.11.5/examples/visualization/demo_lineextracting_pyplot/index.html @@ -0,0 +1,105 @@ + +Plotting variables along a line · Vlasiator.jl

Plotting variables along a line

Author Update time

This demo shows how to plot variables along a line.

using Vlasiator, PyPlot, Printf
+using Vlasiator: RE # Earth radius [m]
+
+function main()
+   files = filter(contains(r"^bulk.*\.vlsv$"), readdir())
+   nfiles = length(files)
+
+   x1, x2 = 8.0, 29.0
+   point1 = [x1, 0, 0] .* RE
+   point2 = [x2, 0, 0] .* RE
+
+   cellids, distances, coords =
+      let meta = load(files[1])
+         getcellinline(meta, point1, point2)
+      end
+
+   loc = range(x1, x2, length=length(cellids))
+
+   ρmin, ρmax = 0.0, 10.0     # [amu/cc]
+   vmin, vmax = -640.0, 0.0   # [km/s]
+   pmin, pmax = 0.0, 1.82     # [nPa]
+   bmin, bmax = -25.0, 60.0   # [nT]
+
+   fontsize = 14
+
+   fig, axs = plt.subplots(4, 1, figsize=(10, 15), sharex=true, constrained_layout=true)
+
+   axs[end].set_xlim(x1, x2)
+
+   axs[1].set_ylim(ρmin, ρmax)
+   axs[2].set_ylim(vmin, vmax)
+   axs[3].set_ylim(pmin, pmax)
+   axs[4].set_ylim(bmin, bmax)
+   for ax in axs
+      ax.xaxis.set_minor_locator(matplotlib.ticker.AutoMinorLocator())
+      ax.yaxis.set_minor_locator(matplotlib.ticker.AutoMinorLocator())
+      ax.grid(true)
+   end
+
+   axs[end].set_xlabel("x [Re]"; fontsize)
+   axs[1].set_ylabel("Density [amu/cc]"; fontsize)
+   axs[2].set_ylabel("Velocity [km/s]"; fontsize)
+   axs[3].set_ylabel("Pressure [nPa]"; fontsize)
+   axs[4].set_ylabel("Magnetic field [nT]"; fontsize)
+
+   # Loop over snapshots
+   for (i, file) in enumerate(files)
+      isfile("out/"*file[end-8:end-5]*".png") && continue
+
+      println("i = $i/$nfiles, file = $file")
+      meta = load(file)
+
+      p_extract = readvariable(meta, "P", cellids) .* 1e9 |> vec # [nPa]
+      rho_extract = readvariable(meta, "proton/vg_rho", cellids) |> vec
+      v_extract = readvariable(meta, "proton/vg_v", cellids)
+      vmag2_extract = sum(x -> x*x, v_extract, dims=1) |> vec
+      pram_extract = rho_extract .* Vlasiator.mᵢ .* vmag2_extract .* 1e9 # [nPa]
+
+      bz = readvariable(meta, "vg_b_vol", cellids)[3,:] .* 1e9 #[nT]
+
+      imagnetopause_ = findfirst(<(0.0), bz)
+
+      axs[1].plot(loc, rho_extract ./ 1e6, label="Proton density", color="#1f77b4")
+      vl1 = axs[1].vlines(loc[imagnetopause_], ρmin, ρmax;
+         colors="r", linestyle="dashed", alpha=0.5)
+
+      axs[2].plot(loc, v_extract[1,:] ./ 1e3, label="Vx", color="#1f77b4")
+      vl2 = axs[2].vlines(loc[imagnetopause_], vmin, vmax;
+         colors="r", linestyle="dashed", alpha=0.5)
+
+      axs[3].plot(loc, pram_extract, label="Ram", color="#1f77b4")
+      axs[3].plot(loc, p_extract, label="Thermal", color="#ff7f0e")
+      vl3 = axs[3].vlines(loc[imagnetopause_], pmin, pmax;
+         colors="r", linestyle="dashed", alpha=0.5)
+
+      axs[4].plot(loc, bz, label="Bz", color="#1f77b4")
+      hl4 = axs[4].hlines(0.0, loc[1], loc[end], colors="k", linestyle="dashed", alpha=0.2)
+      vl4 = axs[4].vlines(loc[imagnetopause_], bmin, bmax;
+          colors="r", linestyle="dashed", alpha=0.5)
+
+      str_title = @sprintf "t= %4.1fs" meta.time
+      axs[1].set_title(str_title; fontsize)
+
+      axs[2].legend(;loc="upper right", fontsize)
+      axs[3].legend(;loc="upper left",  fontsize)
+      axs[4].legend(;loc="upper right", fontsize)
+
+      savefig("out/"*file[end-8:end-5]*".png", bbox_inches="tight")
+
+      for ax in axs
+         for line in ax.get_lines()
+            line.remove()
+         end
+      end
+      for line in (vl1, vl2, vl3, vl4, hl4)
+         line.remove()
+      end
+   end
+
+   close(fig)
+   println("Finished!")
+end
+
+main()

This page was generated using DemoCards.jl.

diff --git a/v0.11.5/examples/visualization/demo_lineextracting_pyplot_basic1/index.html b/v0.11.5/examples/visualization/demo_lineextracting_pyplot_basic1/index.html new file mode 100644 index 00000000..fd544e22 --- /dev/null +++ b/v0.11.5/examples/visualization/demo_lineextracting_pyplot_basic1/index.html @@ -0,0 +1,74 @@ + +Extracting variable along a line · Vlasiator.jl

Extracting variable along a line

Author Update time

This demo shows how to extract data alone a line across frames.

Tip

This can be made faster by updating the data without deleting the lines.

using Vlasiator, PyPlot, Printf
+using Vlasiator: RE # Earth radius, [m]
+
+function main()
+   files = filter(contains(r"^bulk.*\.vlsv$"), readdir())
+
+   point1 = [0e8, 0, 0]
+   point2 = [1.9e8, 0, 0]
+
+   cellids, distances, coords =
+      let meta = load(files[1])
+         getcellinline(meta, point1, point2)
+      end
+
+   # time density temperature vx
+   inputs = [
+   0.0 2.0e6 1.0e5 -5.0e5;
+   99.0 2.0e6 1.0e5 -5.0e5;
+   100.0 2.0e6 1.0e5 -8.0e5;
+   200.0 2.0e6 1.0e5 -8.0e5;
+   201.0 1.0e6 1.0e5 -8.0e5;
+   499.0 1.0e6 1.0e5 -8.0e5;
+   500.0 2.0e6 1.0e5 -5.0e5]
+
+   ndigits = 4
+
+   lim_rho = [0.0, 4.0e6]
+   lim_v   = [-2e5, 10e5]
+
+   fig, ax = plt.subplots(2,1, figsize=(12,5))
+
+   for (i, file) in enumerate(files)
+      fileout = lpad(i, ndigits, '0')*".png"
+
+      meta = load(file)
+      rho = readvariable(meta, "proton/vg_rho", cellids)
+      v = readvariable(meta, "proton/vg_v", cellids)
+      vx = Vector{Float64}(undef, size(v,1))
+
+      for k in axes(v,1)
+         vx[k] = v[k][1]
+      end
+
+      t = readparameter(meta, "time")
+
+      ax[1].plot(coords[1,:] ./ RE, rho, label="rho")
+      ax[1].set_ylim(lim_rho)
+      ax[1].legend()
+      ax[1].minorticks_on()
+
+      ax[2].plot(coords[1,:] ./ RE, abs.(vx), label="vx")
+      ax[2].set_ylim(lim_v)
+      ax[2].legend()
+      ax[2].minorticks_on()
+
+      xlabel("X")
+
+      j = searchsortedfirst(inputs[:,1], t) - 1
+      if j == 0; j = 1; end
+      str_title =
+         @sprintf "t=%4.1fs, rho=%4.1f/cc, vx=%4.1fkm/s" t inputs[j,2]/1e6 inputs[j,4]/1e3
+      fig.suptitle(str_title, fontsize=14)
+
+      savefig(fileout, bbox_inches="tight")
+
+      ax[1].cla()
+      ax[2].cla()
+   end
+
+   close(fig)
+end
+
+main()

This page was generated using DemoCards.jl.

diff --git a/v0.11.5/examples/visualization/demo_lineextracting_pyplot_basic2/index.html b/v0.11.5/examples/visualization/demo_lineextracting_pyplot_basic2/index.html new file mode 100644 index 00000000..43dedae5 --- /dev/null +++ b/v0.11.5/examples/visualization/demo_lineextracting_pyplot_basic2/index.html @@ -0,0 +1,52 @@ + +Plotting variable along a line · Vlasiator.jl

Plotting variable along a line

Author Update time

This demo shows how to plot pressure along a line across multiple frames.

using Vlasiator, PyPlot, Printf
+using Vlasiator: RE # Earth radius [m]
+
+function main()
+   files = filter(contains(r"^bulk.*\.vlsv$"), readdir())
+   nfile = length(files)
+
+   x1, x2 = 8.0, 29.0
+   point1 = [x1, 0, 0] .* RE
+   point2 = [x2, 0, 0] .* RE
+
+   cellids, distances, coords =
+      load(files[1]) do meta
+         getcellinline(meta, point1, point2)
+      end
+
+   fig, ax = plt.subplots(figsize=(8, 4.8))
+
+   for (i, file) in enumerate(files)
+      println("i = $i/$nfile, file = $file")
+      meta = load(file)
+
+      p_extract = readvariable(meta, "vg_pressure", cellids) .* 1e9 |> vec # [nPa]
+      rho_extract = readvariable(meta, "proton/vg_rho", cellids) |> vec
+      v_extract = readvariable(meta, "proton/vg_v", cellids)
+      vmag2_extract = sum(x -> x*x, v_extract, dims=1) |> vec
+      pram_extract = rho_extract .* Vlasiator.mᵢ .* vmag2_extract .* 1e9 # [nPa]
+      loc = range(x1, x2, length=length(rho_extract))
+
+      ax.plot(loc, pram_extract, label="ram")
+      ax.plot(loc, p_extract, label="thermal")
+
+      ax.set_xlim(x1, x2)
+      ax.set_ylim(0.0, 1.8)
+      ax.xaxis.set_minor_locator(matplotlib.ticker.AutoMinorLocator())
+      grid(true)
+
+      xlabel("x [Re]", fontsize=14)
+      ylabel("Pressure [nPa]", fontsize=14)
+      str_title = @sprintf "t= %4.1fs" meta.time
+      title(str_title, fontsize=14)
+      legend(loc="upper left", fontsize=14)
+      savefig("out/"*meta.name[end-8:end-5]*".png", bbox_inches="tight")
+      ax.cla()
+   end
+
+   close(fig)
+   println("plot finished!")
+end
+
+main()

This page was generated using DemoCards.jl.

diff --git a/v0.11.5/examples/visualization/demo_mesh_pyplot/index.html b/v0.11.5/examples/visualization/demo_mesh_pyplot/index.html new file mode 100644 index 00000000..16b15c1d --- /dev/null +++ b/v0.11.5/examples/visualization/demo_mesh_pyplot/index.html @@ -0,0 +1,16 @@ + +Plotting mesh · Vlasiator.jl

Plotting mesh

Author Update time

This demo shows how to plot mesh. The cell centers are represented by the markers.

using VlasiatorPyPlot
+
+const file = "test/data/bulk.amr.vlsv"
+meta = load(file)
+# 3D mesh
+fig = plt.figure()
+ax = fig.add_subplot(projection="3d")
+
+plotmesh(meta, marker="+")
+
+# 2D mesh
+fig = plt.figure()
+
+pcolormesh(meta, "proton/vg_rho"; axisunit=SI)
+plotmesh(meta, projection="y"; color="w")

This page was generated using DemoCards.jl.

diff --git a/v0.11.5/examples/visualization/demo_mp_progressbar/index.html b/v0.11.5/examples/visualization/demo_mp_progressbar/index.html new file mode 100644 index 00000000..549042c9 --- /dev/null +++ b/v0.11.5/examples/visualization/demo_mp_progressbar/index.html @@ -0,0 +1,239 @@ + +Plotting with multi-nodes · Vlasiator.jl

Plotting with multi-nodes

Author Update time

This demos shows how to plot complex figures with more than one node using ClusterManagers. A progress bar is added for tracking.

Usage:

sbatch job.slurm
# Sample Slurm job script
+#!/bin/bash -l
+# -*- mode: julia -*-
+#SBATCH --nodes=2
+#SBATCH --ntasks-per-node=1
+#SBATCH --time=00:03:00
+#SBATCH --mem-per-cpu=2G
+#SBATCH --partition=test
+#SBATCH --output=%x_%j.log
+#SBATCH --job-name=pmap
+
+julia demo_mp_progressbar.jl
using Distributed, ProgressMeter
+using Vlasiator: RE # Earth radius [m]
+using ClusterManagers
+addprocs(SlurmManager(parse(Int, ENV["SLURM_NTASKS"])),
+   partition=ENV["SLURM_JOB_PARTITION"],
+   time="00:03:00", # No environment variable for time limit
+   mem_per_cpu=ENV["SLURM_MEM_PER_CPU"])
+
+@everywhere begin
+   using ParallelDataTransfer
+   using Vlasiator, VlasiatorPyPlot, Printf, LaTeXStrings
+   using Vlasiator: set_args, prep2d
+end
+
+@assert matplotlib.__version__ ≥ "3.4" "Require Matplotlib version 3.4+ to use subfigure!"
+
+@everywhere function init_figure(x1, x2)
+   fig = plt.figure(myid(), constrained_layout=true, figsize=(12, 12))
+   subfigs = fig.subfigures(1, 2, wspace=0.05)
+
+   axsL = subfigs[1].subplots(4, 1, sharex=true)
+   axsR = subfigs[2].subplots(2, 1, sharex=true, sharey=true)
+
+   # Set line plots' axes
+   axsL[end].set_xlim(x1, x2)
+
+   axsL[1].set_ylim(ρmin, ρmax)
+   axsL[2].set_ylim(vmin, vmax)
+   axsL[3].set_ylim(pmin, pmax)
+   axsL[4].set_ylim(bmin, bmax)
+   for ax in axsL
+      ax.xaxis.set_minor_locator(matplotlib.ticker.AutoMinorLocator())
+      ax.yaxis.set_minor_locator(matplotlib.ticker.AutoMinorLocator())
+      ax.grid(true)
+   end
+
+   axsL[end].set_xlabel(L"x [$R_E$]"; fontsize)
+   axsL[1].set_ylabel("Density [amu/cc]";    fontsize)
+   axsL[2].set_ylabel("Velocity [km/s]";     fontsize)
+   axsL[3].set_ylabel("Pressure [nPa]";      fontsize)
+   axsL[4].set_ylabel("Magnetic field [nT]"; fontsize)
+
+   fakeline = loc
+   l1 = axsL[1].plot(loc, fakeline, label="Proton density", color="#1f77b4")
+   l2 = axsL[2].plot(loc, fakeline, label="Vx",             color="#1f77b4")
+   l3 = axsL[3].plot(loc, fakeline, label="Ram",            color="#1f77b4")
+   l4 = axsL[3].plot(loc, fakeline, label="Thermal",        color="#ff7f0e")
+   l5 = axsL[4].plot(loc, fakeline, label="Bz",             color="#1f77b4")
+
+   ls = (l1, l2, l3, l4, l5)
+
+   axsL[2].legend(;loc="upper right", fontsize)
+   axsL[3].legend(;loc="lower right", fontsize)
+   axsL[4].legend(;loc="upper right", fontsize)
+
+   vl1 = axsL[1].vlines(loc[imagnetopause_], ρmin, ρmax;
+      colors="r", linestyle="dashed", alpha=0.5)
+
+   vl2 = axsL[2].vlines(loc[imagnetopause_], vmin, vmax;
+      colors="r", linestyle="dashed", alpha=0.5)
+
+   vl3 = axsL[3].vlines(loc[imagnetopause_], pmin, pmax;
+      colors="r", linestyle="dashed", alpha=0.5)
+
+   vl4 = axsL[4].vlines(loc[imagnetopause_], bmin, bmax;
+       colors="r", linestyle="dashed", alpha=0.5)
+   hl4 = axsL[4].hlines(0.0, loc[1], loc[end]; colors="k", linestyle="dashed", alpha=0.2)
+
+   vlines = (vl1, vl2, vl3, vl4)
+
+   for ax in axsR
+      ax.set_aspect("equal")
+
+      # Set border line widths
+      for loc in ("left", "bottom", "right", "top")
+         edge = get(ax.spines, loc, nothing)
+         edge.set_linewidth(2.0)
+      end
+      ax.xaxis.set_tick_params(width=2.0, length=3)
+      ax.yaxis.set_tick_params(width=2.0, length=3)
+      ax.xaxis.set_minor_locator(matplotlib.ticker.AutoMinorLocator())
+      ax.yaxis.set_minor_locator(matplotlib.ticker.AutoMinorLocator())
+
+      ax.set_ylabel(L"Y [$R_E$]"; fontsize)
+   end
+
+   axsR[2].set_xlabel(L"X [$R_E$]"; fontsize)
+
+   axsR[1].set_title("Alfven speed", fontsize="x-large")
+   axsR[2].set_title("Sound speed", fontsize="x-large")
+
+   x, y = Vlasiator.get_axis(pArgs1)
+
+   fakedata = zeros(Float32, length(y), length(x))
+
+   c1 = axsR[1].pcolormesh(x, y, fakedata, norm=cnorm1, cmap=cmap)
+   c2 = axsR[2].pcolormesh(x, y, fakedata, norm=cnorm2, cmap=cmap)
+
+   cb1 = colorbar(c1; ax=axsR[1], ticks=cticks1, fraction=0.046, pad=0.04)
+   cb2 = colorbar(c2; ax=axsR[2], ticks=cticks2, fraction=0.046, pad=0.04)
+
+   cs = (c1, c2)
+
+   for cb in (cb1, cb2)
+      cb.ax.set_ylabel("[km/s]"; fontsize)
+      cb.outline.set_linewidth(1.0)
+   end
+
+   fig.suptitle("Density Pulse Run", fontsize="xx-large")
+
+   return fig, subfigs, ls, vlines, cs
+end
+
+function update_vline(h, x)
+   seg_old = h.get_segments()
+   ymin = seg_old[1][1, 2]
+   ymax = seg_old[1][2, 2]
+
+   seg_new = [[[x, ymin] [x, ymax]]]
+
+   h.set_segments(seg_new)
+end
+
+@everywhere function process(subfigs, ls, vlines, cs, file, cellids)
+   isfile("../out/"*file[end-8:end-5]*".png") && return
+
+   println("file = $(basename(file))")
+   meta = load(file)
+
+   p_extract = readvariable(meta, "vg_pressure", cellids) .* 1e9 |> vec # [nPa]
+   rho_extract = readvariable(meta, "proton/vg_rho", cellids) |> vec
+   v_extract = readvariable(meta, "proton/vg_v", cellids)
+   vmag2_extract = sum(x -> x*x, v_extract, dims=1) |> vec
+   pram_extract = rho_extract .* Vlasiator.mᵢ .* vmag2_extract .* 1e9 # [nPa]
+
+   bz = readvariable(meta, "vg_b_vol", cellids)[3,:] .* 1e9 #[nT]
+
+   ls[1][1].set_ydata(rho_extract ./ 1e6)
+   ls[2][1].set_ydata(v_extract[1,:] ./ 1e3)
+   ls[3][1].set_ydata(pram_extract)
+   ls[4][1].set_ydata(p_extract)
+   ls[5][1].set_ydata(bz)
+
+   imagnetopause_ = findfirst(<(0.0), bz)
+   for vline in vlines
+      update_vline(vline, loc[imagnetopause_])
+   end
+
+   str_title = @sprintf "Sun-Earth line, t= %4.1fs" meta.time
+   subfigs[1].suptitle(str_title, fontsize="x-large")
+
+   data = prep2d(meta, "VA")'
+   cs[1].set_array(data ./ 1e3)
+
+   data = prep2d(meta, "VS")'
+   cs[2].set_array(data ./ 1e3)
+
+   savefig("../out/"*file[end-8:end-5]*".png", bbox_inches="tight")
+   return
+end
+
+## Parameters
+
+dir = "mydatadir"
+files = filter(contains(r"^bulk.*\.vlsv$"), readdir(dir))
+nfiles = length(files)
+
+const p = Progress(nfiles; showspeed=true)
+const channel = RemoteChannel(()->Channel{Bool}(), 1)
+
+@passobj 1 workers() files
+
+@broadcast begin # on all workers
+   const isinit = true
+   # Set contour plots' axes and colorbars
+   const cmap = matplotlib.cm.turbo
+   colorscale = Linear
+   axisunit = EARTH
+
+   # Upper/lower limits for each variable
+   const ρmin, ρmax = 0.0, 10.0     # [amu/cc]
+   const vmin, vmax = -640.0, 0.0   # [km/s]
+   const pmin, pmax = 0.0, 1.82     # [nPa]
+   const bmin, bmax = -25.0, 60.0   # [nT]
+   const vamin, vamax = 0.0, 250.0  # [km/s]
+   const vsmin, vsmax = 30.0, 350.0 # [km/s]
+
+   meta = load(files[1])
+
+   const pArgs1 = set_args(meta, "VA", axisunit; normal=:none)
+   const cnorm1, cticks1 = set_colorbar(colorscale, vamin, vamax)
+   const cnorm2, cticks2 = set_colorbar(colorscale, vsmin, vsmax)
+
+   const fontsize = 14
+end
+
+const x1, x2 = 8.0, 29.0
+const point1 = [x1, 0, 0] .* RE
+const point2 = [x2, 0, 0] .* RE
+
+meta = load(files[1])
+cellids, _, _ = getcellinline(meta, point1, point2)
+passobj(1, workers(), [:x1, :x2, :cellids])
+@broadcast const loc = range(x1, x2, length=length(cellids))
+
+## Execution
+
+@broadcast begin
+   # initialize figure, axes, lines, and contours
+   fig, subfigs, ls, vlines, cs = init_figure(x1, x2)
+end
+
+@sync begin # start two tasks which will be synced in the very end
+   # the first task updates the progress bar
+   @async while take!(channel)
+      next!(p)
+   end
+
+   # the second task does the computation
+   @async begin
+      pmap(1:nfiles) do i
+         process(subfigs, ls, vlines, cs, files[i], cellids)
+         put!(channel, true) # trigger a progress bar update
+      end
+      put!(channel, false) # this tells the printing task to finish
+   end
+end

This page was generated using DemoCards.jl.

diff --git a/v0.11.5/examples/visualization/demo_poynting_mt_pyplot/index.html b/v0.11.5/examples/visualization/demo_poynting_mt_pyplot/index.html new file mode 100644 index 00000000..58d86781 --- /dev/null +++ b/v0.11.5/examples/visualization/demo_poynting_mt_pyplot/index.html @@ -0,0 +1,272 @@ + +Poynting flux · Vlasiator.jl

Poynting flux

Author Update time

This demo shows how to extract the Poynting flux on a subdomain from 2D and plot.

Usage:

julia -t 4 demo_poynting_mt_pyplot.jl

or

JULIA_NUM_THREADS=4 julia demo_poynting_mt_pyplot.jl
using Statistics: mean, normalize
+using LinearAlgebra: ×, ⋅
+using Vlasiator
+using Vlasiator: μ₀, prep2d, prep2dslice
+using DSP, Polyester, Printf, PyPlot
+
+"""
+    extract_EM(files, range1, range2, pArgs, ndim=2; normal=:y, verbose=true)
+
+Extract time-series of EM fields from `files` within `range1` in the 1st dim and `range1` in
+the 2nd dim.
+"""
+function extract_EM(files, range1, range2, pArgs, ndim=2; normal=:y, verbose=true)
+   @assert ndim ∈ (2,3) "Only support extracting EM fields from 2D/3D runs."
+   nfile = length(files)
+   e = zeros(Float32, 3, length(range1), length(range2), nfile)
+   b = zeros(Float32, 3, length(range1), length(range2), nfile)
+
+   if ndim == 2
+      @batch for i in eachindex(files)
+         verbose && println("i = $i/$nfile, file = $(files[i])")
+         meta = load(files[i])
+
+         e[1,:,:,i] = prep2d(meta, "vg_e_vol", 1)[range1, range2]
+         e[2,:,:,i] = prep2d(meta, "vg_e_vol", 2)[range1, range2]
+         e[3,:,:,i] = prep2d(meta, "vg_e_vol", 3)[range1, range2]
+         b[1,:,:,i] = prep2d(meta, "vg_b_vol", 1)[range1, range2]
+         b[2,:,:,i] = prep2d(meta, "vg_b_vol", 2)[range1, range2]
+         b[3,:,:,i] = prep2d(meta, "vg_b_vol", 3)[range1, range2]
+      end
+   else
+      @batch for i in eachindex(files)
+         verbose && println("i = $i/$nfile, file = $(files[i])")
+         meta = load(files[i])
+
+         e[1,:,:,i] = prep2dslice(meta, "vg_e_vol", normal, 1, pArgs)[range1, range2]
+         e[2,:,:,i] = prep2dslice(meta, "vg_e_vol", normal, 2, pArgs)[range1, range2]
+         e[3,:,:,i] = prep2dslice(meta, "vg_e_vol", normal, 3, pArgs)[range1, range2]
+         b[1,:,:,i] = prep2dslice(meta, "vg_b_vol", normal, 1, pArgs)[range1, range2]
+         b[2,:,:,i] = prep2dslice(meta, "vg_b_vol", normal, 2, pArgs)[range1, range2]
+         b[3,:,:,i] = prep2dslice(meta, "vg_b_vol", normal, 3, pArgs)[range1, range2]
+      end
+   end
+   e, b
+end
+
+"Moving box average of vector `g` with box size `n`."
+function moving_average(g::AbstractVector{<:AbstractFloat}, n::Int)
+   nbackward = div(n,2)
+   nforward = isodd(n) ? div(n,2) : div(n,2) - 1
+   len = length(g)
+   g_avg = similar(g)
+   @inbounds @batch for i = 1:len
+       lo = max(1, i - nbackward)
+       hi = min(len, i + nforward)
+       g_avg[i] = mean(@view g[lo:hi])
+   end
+   g_avg
+end
+
+"Extract the perturbation from vector `v` with moving box size `nbox`."
+function detrend(v::AbstractVector{<:AbstractFloat}; nbox=length(v)÷12)
+   v̄ = moving_average(v, nbox)
+   dv = v .- v̄
+end
+
+"Extract the perturbation from 4D array `v` along the last dim with moving box size `nbox`."
+function detrend(v::AbstractArray{<:AbstractFloat}; nbox=size(v,4)÷12)
+   v̄ = similar(v)
+   for idim = 1:3
+      for j in axes(v, 3), i in axes(v, 2)
+         v̄[idim,i,j,:] = @views moving_average(v[idim,i,j,:], nbox)
+      end
+   end
+   dv = v .- v̄
+   dv, v̄
+end
+
+"Band pass filter for vector field `var`."
+function band_pass_filter(var, responsetype, designmethod)
+
+   filter = digitalfilter(responsetype, designmethod)
+
+   var_filtered = zeros(eltype(var), size(var,4), 3, size(var,2), size(var,3))
+
+   for idim = 1:3
+      for j in axes(var, 3), i in axes(var, 2)
+         var_filtered[:,idim,i,j] = filtfilt(filter, var[idim,i,j,:])
+      end
+   end
+   var_filtered
+end
+
+"""
+    calc_poynting(de, db, b̄, it)
+
+Return full Poynting vector, also parallel and perpendicular Poynting vector components to
+the magnetic field. The perpendicular components are in-plane.
+"""
+function calc_poynting(de, db, b̄, it)
+
+   s = zeros(3, size(de,3), size(de,4))
+   # parallel and perpendicular Poynting vector magnitudes
+   s_par  = zeros(size(de,3), size(de,4))
+   s_perp = zeros(size(de,3), size(de,4))
+
+   @views for j in axes(de,4), i in axes(de,3)
+      # Poynting vector = dE × dB
+      s[:,i,j] = de[it,:,i,j] × db[it,:,i,j] / μ₀
+
+      # Transform into parallel and perpendicular direction w.r.t. B
+      b̂ = normalize(b̄[:,i,j,it])
+      s_par[i,j] = s[:,i,j] ⋅ b̂
+      #s_perp[i,j] = norm(s[:,i,j] .- s_par[i,j] .* b̂)
+      # in-plane perpendicular component only
+      s_perp[i,j] = sqrt((s[1,i,j] - s_par[i,j]*b̂[1])^2 + (s[3,i,j] - s_par[i,j]*b̂[3])^2)
+   end
+
+   s, s_par, s_perp
+end
+
+"Output figures of Poynting vectors for each snapshot."
+function plot_poynting(de_filtered, db_filtered, b̄, x1, x2, frequency_range)
+
+   nt = size(de_filtered, 1)
+
+   norm1 = let
+      sparmax = frequency_range == "high" ? 5e-7 : 1e-5
+      sparmin = -sparmax
+      levels = matplotlib.ticker.MaxNLocator(nbins=255).tick_values(sparmin, sparmax)
+      matplotlib.colors.BoundaryNorm(levels, ncolors=256, clip=true)
+   end
+
+   norm2 = let
+      sperpmax = frequency_range == "high" ? 5e-7 : 1e-5
+      sperpmin = 0.0
+      levels = matplotlib.ticker.MaxNLocator(nbins=255).tick_values(sperpmin, sperpmax)
+      matplotlib.colors.BoundaryNorm(levels, ncolors=256, clip=true)
+   end
+
+   stride = 10 # number of strides for quivers
+
+   s, s_par, s_perp = calc_poynting(de_filtered, db_filtered, b̄, 1)
+
+
+   fig, axs = plt.subplots(1, 2; figsize=(11,6), sharex=true, sharey=true,
+      constrained_layout=true)
+
+   axs[1].set_title(L"S_\parallel"; fontsize="large")
+   axs[2].set_title(L"S_\perp"; fontsize="large")
+
+   for ax in axs
+      ax.set_aspect("equal")
+      ax.set_xlabel(L"x1 [R_E]"; fontsize="large")
+      ax.set_ylabel(L"x2 [R_E]"; fontsize="large")
+   end
+
+   c1 = axs[1].pcolormesh(x1, x2, s_par';
+      cmap=matplotlib.cm.RdBu_r,
+      shading="nearest",
+      norm=norm1,
+      )
+
+   cb1 = colorbar(c1; ax=axs[1], extend="both")
+   cb1.ax.set_ylabel(L"[W/m^2]"; fontsize="large")
+
+   c2 = axs[2].pcolormesh(x1, x2, s_perp';
+      cmap=matplotlib.cm.turbo,
+      shading="nearest",
+      norm=norm2,
+      )
+
+   cb2 = colorbar(c2; ax=axs[2], extend="max")
+   cb2.ax.set_ylabel(L"[W/m^2]"; fontsize="large")
+
+   s1 = @views (s[1,:,:] ./ hypot.(s[1,:,:], s[3,:,:]))[1:stride:end, 1:stride:end]'
+   s2 = @views (s[3,:,:] ./ hypot.(s[1,:,:], s[3,:,:]))[1:stride:end, 1:stride:end]'
+
+   q = axs[1].quiver(x1[1:stride:end], x2[1:stride:end], s1, s2; color="k")
+
+   b1 = @views (b̄[1,:,:,1] ./ hypot.(b̄[1,:,:,1], b̄[3,:,:,1]))[1:stride:end, 1:stride:end]'
+   b2 = @views (b̄[3,:,:,1] ./ hypot.(b̄[1,:,:,1], b̄[3,:,:,1]))[1:stride:end, 1:stride:end]'
+
+   qb = axs[1].quiver(x1[1:stride:end], x2[1:stride:end], b1, b2; color="tab:purple")
+
+   if frequency_range == "high"
+      fig.suptitle("t = $(t[1]) s, [0.1, 1.0] Hz";
+         fontsize="xx-large")
+   else
+      fig.suptitle("t = $(t[1]) s, [$(responsetype.w1), $(responsetype.w2)] Hz";
+         fontsize="xx-large")
+   end
+
+   for it = 1:nt
+      @info "it = $it"
+      local s, s_par, s_perp
+      outname = "poynting/poynting_$(lpad(it, 4, '0'))_band$frequency_range.png"
+      isfile(outname) && continue
+      s, s_par, s_perp = calc_poynting(de_filtered, db_filtered, b̄, it)
+
+      c1.set_array(s_par')
+      c2.set_array(s_perp')
+
+      ŝx = @views @. s[1,:,:] / hypot(s[1,:,:], s[3,:,:])
+      ŝz = @views @. s[3,:,:] / hypot(s[1,:,:], s[3,:,:])
+
+      q.set_UVC(ŝx[1:stride:end, 1:stride:end]', ŝz[1:stride:end, 1:stride:end]')
+
+      b̂x = @views @. b̄[1,:,:,it] / hypot(b̄[1,:,:,it], b̄[3,:,:,it])
+      b̂z = @views @. b̄[3,:,:,it] / hypot(b̄[1,:,:,it], b̄[3,:,:,it])
+
+      qb.set_UVC(b̂x[1:stride:end, 1:stride:end]', b̂z[1:stride:end, 1:stride:end]')
+
+      if frequency_range == "high"
+         fig.suptitle("t = $(t[it]) s, [0.1, 1.0] Hz";
+            fontsize="xx-large")
+      else
+         fig.suptitle("t = $(t[it]) s, [$(responsetype.w1), $(responsetype.w2)] Hz";
+            fontsize="xx-large")
+      end
+      savefig(outname; dpi=300, bbox_inches="tight")
+   end
+end
+
+########## Main
+
+files = filter(contains(r"^bulk.*\.vlsv$"), readdir())
+nfile = length(files)
+
+const frequency_range = "low" # filtered frequency range ∈ ("low", "high")
+const extent = [6., 16., -7., 7.] # [RE], default: [-Inf32, Inf32, -Inf32, Inf32]
+const normal = :none # plane normal direction for 3D data, (:none, :x, :y, :z)
+const fs = 2.0 # sampling frequency, [Hz]
+
+# WARNING: t may not be exact due to round-off errors in output time stamps!
+ndim, pArgs, t, range1, range2 = let meta = load(files[1])
+   pArgs = Vlasiator.set_args(meta, "vg_e_vol", EARTH; normal=:none)
+   x1, x2 = Vlasiator.get_axis(pArgs)
+
+   tstart = meta.time
+   tend = load(files[end]).time
+
+   ndims(meta), pArgs,
+   range(round(tstart,digits=1), round(tend, digits=1), length=nfile),
+   searchsortedfirst(x1, extent[1]):searchsortedlast(x1, extent[2]),
+   searchsortedfirst(x2, extent[3]):searchsortedlast(x2, extent[4])
+end
+
+@assert ndim == 3 "3D not working yet!"
+
+e, b = extract_EM(files, range1, range2, pArgs, ndim; normal, verbose=true)
+
+designmethod = Butterworth(5)
+if frequency_range == "high"
+   responsetype = Highpass(0.1; fs)
+   nbox = 40
+elseif frequency_range == "low"
+   responsetype = Bandpass(0.02, 0.067; fs)
+   nbox = 200
+end
+
+de, _ = detrend(e; nbox)
+db, b̄ = detrend(b; nbox)
+
+de_filtered = band_pass_filter(de, responsetype, designmethod)
+db_filtered = band_pass_filter(db, responsetype, designmethod)
+
+x1 = range(extent[1], extent[2], length=length(range1))
+x2 = range(extent[3], extent[4], length=length(range2))
+
+plot_poynting(de_filtered, db_filtered, b̄, x1, x2, frequency_range)

This page was generated using DemoCards.jl.

diff --git a/v0.11.5/examples/visualization/demo_tensor_pyplot/index.html b/v0.11.5/examples/visualization/demo_tensor_pyplot/index.html new file mode 100644 index 00000000..e3040c0b --- /dev/null +++ b/v0.11.5/examples/visualization/demo_tensor_pyplot/index.html @@ -0,0 +1,72 @@ + +Pressure tensor · Vlasiator.jl

Pressure tensor

Author Update time

This demo shows how to plot the pressure tensor from one snapshot.

using Vlasiator, VlasiatorPyPlot, LaTeXStrings, Printf
+
+function main()
+   file = "bulk.0001582.vlsv"
+
+   axisunit = EARTH
+   colorscale = Linear
+   cmap = matplotlib.cm.turbo
+
+   vars = ["proton/vg_ptensor_diagonal", "proton/vg_ptensor_offdiagonal"]
+
+   #####
+   meta = load(file)
+
+   pArgs1 = Vlasiator.set_args(meta, vars[1], axisunit; normal=:none)
+   pArgs2 = Vlasiator.set_args(meta, vars[2], axisunit; normal=:none)
+
+   x, y = Vlasiator.get_axis(pArgs1)
+   # [nPa]
+   pxx = Vlasiator.prep2d(meta, vars[1], :x)' .* 1e9
+   pyy = Vlasiator.prep2d(meta, vars[1], :y)' .* 1e9
+   pzz = Vlasiator.prep2d(meta, vars[1], :z)' .* 1e9
+   pyz = Vlasiator.prep2d(meta, vars[2], :1)' .* 1e9
+   pxz = Vlasiator.prep2d(meta, vars[2], :2)' .* 1e9
+   pxy = Vlasiator.prep2d(meta, vars[2], :3)' .* 1e9
+
+   P = (pxx, pyy, pzz, pyz, pxz, pxy)
+   P_str = ("Pxx", "Pyy", "Pzz", "Pyz", "Pxz", "Pxy")
+
+   vmin = minimum(minimum.(P))
+   vmax = maximum(maximum.(P))
+
+   cnorm1, cticks1 = set_colorbar(colorscale, vmin, vmax)
+
+   fig, axs = subplots(3,2,
+      figsize=(6, 12), sharex=true, sharey=true, constrained_layout=true)
+
+   c1 = axs[1].pcolormesh(x, y, pxx; norm=cnorm1, cmap)
+
+   for i in eachindex(axs)[2:end]
+      axs[i].pcolormesh(x, y, P[i]; norm=cnorm1, cmap)
+   end
+
+   for (i, ax) in enumerate(axs)
+      ax.set_aspect("equal")
+      ax.xaxis.set_minor_locator(matplotlib.ticker.AutoMinorLocator())
+      ax.yaxis.set_minor_locator(matplotlib.ticker.AutoMinorLocator())
+      ax.set_title(P_str[i])
+   end
+
+   for ax in axs[3,:]
+      ax.set_xlabel(L"x [$R_E$]")
+   end
+
+   for ax in axs[:,1]
+      ax.set_ylabel(L"y [$R_E$]")
+   end
+
+   # One colorbar for all subplots
+   cb1 = colorbar(c1; ax=axs, ticks=cticks1, fraction=0.046, pad=0.04)
+   cb1.ax.set_ylabel("[nPa]")
+   cb1.outline.set_linewidth(1.0)
+
+   str_title = @sprintf "Pressure Tensor at t = %4.1fs" meta.time
+
+   fig.suptitle(str_title, fontsize="xx-large")
+
+   savefig("ptensor.png", bbox_inches="tight")
+end
+
+main()

This page was generated using DemoCards.jl.

diff --git a/v0.11.5/examples/visualization/demo_vdf_pyplot/index.html b/v0.11.5/examples/visualization/demo_vdf_pyplot/index.html new file mode 100644 index 00000000..141cddaf --- /dev/null +++ b/v0.11.5/examples/visualization/demo_vdf_pyplot/index.html @@ -0,0 +1,32 @@ + +VDF · Vlasiator.jl

VDF

Author Update time

This demo shows how to plot the phase space density (i.e. velocity distribution function) near a given spatial location.

using VlasiatorPyPlot
+using Vlasiator: RE # Earth radius [m]
+
+function main()
+   file = "bulk.0001347.vlsv"
+   meta = load(file)
+   species = "proton"
+
+   coordinates = [0.0, 0.0, 0.0]
+
+   vdfslice(meta, coordinates; verbose=true)
+
+   # Show the spatial distribution of cells with saved VDF
+   init_cellswithVDF!(meta, species)
+   locations = [getcellcoordinates(meta, cid) for cid in meta.meshes[species].cellwithVDF]
+
+   xcell = zeros(size(locations))
+   ycell = similar(xcell)
+
+   for i in eachindex(locations)
+      xcell[i] = locations[i][1] / RE
+      ycell[i] = locations[i][2] / RE
+   end
+
+   figure()
+   pcolormesh(meta, "vg_pressure", colorscale=Linear)
+   ax = plt.gca()
+   ax.scatter(xcell, ycell, marker="+", color="w")
+end
+
+main()

This page was generated using DemoCards.jl.

diff --git a/v0.11.5/examples/visualization/demo_vdfs_pyplot/index.html b/v0.11.5/examples/visualization/demo_vdfs_pyplot/index.html new file mode 100644 index 00000000..e7decf26 --- /dev/null +++ b/v0.11.5/examples/visualization/demo_vdfs_pyplot/index.html @@ -0,0 +1,56 @@ + +VDFs along a line · Vlasiator.jl

VDFs along a line

Author Update time

This demo shows how to plot velocity distribution functions along a line.

using VlasiatorPyPlot, JLD2
+using Vlasiator: RE # Earth radius [m]
+
+function main()
+   ## Plot velocity space distributions
+   xloc = range(7.0, 10.0, step=2.35)
+   yloc = range(-0.0, 5.0, step=2.35)
+   zloc = 0.0
+
+   CIs = CartesianIndices((1:length(xloc), 1:length(yloc)))
+
+   fig, axs = plt.subplots(length(xloc), length(yloc), sharex=true, sharey=true)
+
+   for i in CIs
+      loc = RE .* [xloc[i[1]], yloc[i[2]], zloc]
+      vdfslice(meta, loc, axs[i]; verbose=false)
+   end
+
+   for a in axs[end,:] a.set_xlabel("vx [km/s]") end
+   for a in axs[:  ,1] a.set_ylabel("vy [km/s]") end
+
+   ## Subtract data of cells with VDF
+
+   file = "test/data/bulk.1d.vlsv"
+   meta = load(file)
+   species = "proton"
+
+   init_cellswithVDF!(meta, species)
+   cells = meta.meshes[species].cellwithVDF
+
+   ρ = zeros(Float64, size(cells))
+   v = zeros(Float64, 3, size(cells)...)
+   p = zeros(Float64, size(cells))
+
+   vsize = meta.meshes["proton"].vblocksize .* meta.meshes["proton"].vblocks
+   vcellids = [Int[] for _ in cells]
+   vcellf = [Float64[] for _ in cells]
+
+   for (i, cell) in enumerate(cells)
+      ρ[i] = readvariable(meta, "proton/vg_rho", cell)[1]
+      v[i] = readvariable(meta, "proton/vg_v", cell)[1]
+      p[i] = readvariable(meta, "vg_pressure", cell)[1]
+
+      vcellids[i], vcellf[i] = readvcells(meta, cell)
+   end
+
+   jldopen("example.jld2", "a+") do file
+      file["file1/density"] = ρ
+      file["file1/velocity"] = v
+      file["file1/pressure"] = p
+      file["file1/VDF"] = vcellf
+   end
+end
+
+main()

This page was generated using DemoCards.jl.

diff --git a/v0.11.5/examples/visualization/demo_vector_pyplot/index.html b/v0.11.5/examples/visualization/demo_vector_pyplot/index.html new file mode 100644 index 00000000..b0205600 --- /dev/null +++ b/v0.11.5/examples/visualization/demo_vector_pyplot/index.html @@ -0,0 +1,68 @@ + +Vector components · Vlasiator.jl

Vector components

Author Update time

This demo shows how to plot the components of a vector from one snapshot.

using Vlasiator, VlasiatorPyPlot, LaTeXStrings, Printf
+
+function main()
+   file = "/wrk/group/spacephysics/vlasiator/2D/ABA/bulk/bulk.0001000.vlsv"
+
+   axisunit = EARTH
+   colorscale = Linear
+   cmap = matplotlib.cm.RdBu
+
+   var = "B_vol"
+
+   #####
+   meta = load(file)
+
+   pArgs = Vlasiator.set_args(meta, var, axisunit; normal=:none)
+
+   x, y = Vlasiator.get_axis(pArgs)
+
+   B = meta["B_vol"] # [T]
+   bx = @views B[1,:].*1e9
+   bx = reshape(bx, meta.ncells[1], meta.ncells[2])
+   by = @views B[2,:].*1e9
+   by = reshape(by, meta.ncells[1], meta.ncells[2])
+   bz = @views B[3,:].*1e9
+   bz = reshape(bz, meta.ncells[1], meta.ncells[2])
+
+   V = (bx, by, bz)
+   V_str = ("Bx", "By", "Bz")
+
+   # Symmetric range for diverging colormap
+   vmin = minimum(minimum.(V))
+   vmax = -vmin
+
+   cnorm1, cticks1 = set_colorbar(colorscale, vmin, vmax)
+
+   fig, axs = subplots(1,3,
+      figsize=(10, 4), sharex=true, sharey=true, constrained_layout=true)
+
+   c1 = axs[1].pcolormesh(x, y, V[1]'; norm=cnorm1, cmap)
+
+   for i in eachindex(axs)[2:end]
+      axs[i].pcolormesh(x, y, V[i]'; norm=cnorm1, cmap)
+   end
+
+   for (i, ax) in enumerate(axs)
+      ax.set_aspect("equal")
+      ax.xaxis.set_minor_locator(matplotlib.ticker.AutoMinorLocator())
+      ax.yaxis.set_minor_locator(matplotlib.ticker.AutoMinorLocator())
+      ax.set_title(V_str[i])
+      ax.set_xlabel(L"x [$R_E$]")
+   end
+
+   axs[1].set_ylabel(L"y [$R_E$]")
+
+   # One colorbar for all subplots
+   cb1 = colorbar(c1; ax=axs, ticks=cticks1, fraction=0.046, pad=0.04)
+   cb1.ax.set_ylabel("[nT]")
+   cb1.outline.set_linewidth(1.0)
+
+   str_title = @sprintf "B at t = %4.1fs" meta.time
+
+   fig.suptitle(str_title, fontsize="xx-large")
+
+   savefig("Bvector.png", bbox_inches="tight")
+end
+
+main()

This page was generated using DemoCards.jl.

diff --git a/v0.11.5/figures/3D_paraview_2slices.png b/v0.11.5/figures/3D_paraview_2slices.png new file mode 100644 index 00000000..83d93102 Binary files /dev/null and b/v0.11.5/figures/3D_paraview_2slices.png differ diff --git a/v0.11.5/figures/3D_paraview_slice.png b/v0.11.5/figures/3D_paraview_slice.png new file mode 100644 index 00000000..790de9ae Binary files /dev/null and b/v0.11.5/figures/3D_paraview_slice.png differ diff --git a/v0.11.5/figures/3slices_makie.png b/v0.11.5/figures/3slices_makie.png new file mode 100644 index 00000000..eae738a9 Binary files /dev/null and b/v0.11.5/figures/3slices_makie.png differ diff --git a/v0.11.5/figures/VDF_slice.png b/v0.11.5/figures/VDF_slice.png new file mode 100644 index 00000000..d82b84bb Binary files /dev/null and b/v0.11.5/figures/VDF_slice.png differ diff --git a/v0.11.5/figures/VDF_slices.png b/v0.11.5/figures/VDF_slices.png new file mode 100644 index 00000000..d3ee0853 Binary files /dev/null and b/v0.11.5/figures/VDF_slices.png differ diff --git a/v0.11.5/figures/VDF_volume.png b/v0.11.5/figures/VDF_volume.png new file mode 100644 index 00000000..8300b480 Binary files /dev/null and b/v0.11.5/figures/VDF_volume.png differ diff --git a/v0.11.5/figures/XY_contours_makie.png b/v0.11.5/figures/XY_contours_makie.png new file mode 100644 index 00000000..48e5ab07 Binary files /dev/null and b/v0.11.5/figures/XY_contours_makie.png differ diff --git a/v0.11.5/figures/isosurface_bz=0_makie.png b/v0.11.5/figures/isosurface_bz=0_makie.png new file mode 100644 index 00000000..b1d2995b Binary files /dev/null and b/v0.11.5/figures/isosurface_bz=0_makie.png differ diff --git a/v0.11.5/figures/logo_fancy_black.png b/v0.11.5/figures/logo_fancy_black.png new file mode 100644 index 00000000..1c2cd163 Binary files /dev/null and b/v0.11.5/figures/logo_fancy_black.png differ diff --git a/v0.11.5/figures/magnetosphere_earth_proton_density_2D.png b/v0.11.5/figures/magnetosphere_earth_proton_density_2D.png new file mode 100644 index 00000000..18f31c6d Binary files /dev/null and b/v0.11.5/figures/magnetosphere_earth_proton_density_2D.png differ diff --git a/v0.11.5/figures/magnetosphere_earth_proton_density_2D_bx_bz.png b/v0.11.5/figures/magnetosphere_earth_proton_density_2D_bx_bz.png new file mode 100644 index 00000000..5ee8815f Binary files /dev/null and b/v0.11.5/figures/magnetosphere_earth_proton_density_2D_bx_bz.png differ diff --git a/v0.11.5/figures/magnetosphere_earth_proton_density_3cuts.png b/v0.11.5/figures/magnetosphere_earth_proton_density_3cuts.png new file mode 100644 index 00000000..5c31cbb6 Binary files /dev/null and b/v0.11.5/figures/magnetosphere_earth_proton_density_3cuts.png differ diff --git a/v0.11.5/figures/magnetosphere_earth_proton_density_ycut.png b/v0.11.5/figures/magnetosphere_earth_proton_density_ycut.png new file mode 100644 index 00000000..49b21293 Binary files /dev/null and b/v0.11.5/figures/magnetosphere_earth_proton_density_ycut.png differ diff --git a/v0.11.5/figures/mesh.png b/v0.11.5/figures/mesh.png new file mode 100644 index 00000000..9694b554 Binary files /dev/null and b/v0.11.5/figures/mesh.png differ diff --git a/v0.11.5/figures/phase_space_distribution.png b/v0.11.5/figures/phase_space_distribution.png new file mode 100644 index 00000000..66a2a1e2 Binary files /dev/null and b/v0.11.5/figures/phase_space_distribution.png differ diff --git a/v0.11.5/figures/slice_interactive.png b/v0.11.5/figures/slice_interactive.png new file mode 100644 index 00000000..d2dd77e4 Binary files /dev/null and b/v0.11.5/figures/slice_interactive.png differ diff --git a/v0.11.5/gallery/index.html b/v0.11.5/gallery/index.html new file mode 100644 index 00000000..3bd3d93e --- /dev/null +++ b/v0.11.5/gallery/index.html @@ -0,0 +1,2 @@ + +Gallery · Vlasiator.jl

Gallery

PyPlot

  • Proton density in a laminar flow with points denoting cell centers. demo

  • Proton density of Earth's magnetosphere in the meridional cut from 2D simulation, with fieldlines through fixed seeding points. demo

  • Proton density of Earth's magnetosphere in the meridional plane from 3D simulation.

  • Proton density of Earth's magnetosphere in the equatorial plane from 2D simulation, zoomed in to the magnetosheath and foreshock region, with streamlines and density contour at 10 amu/cc. demo

  • Proton density of Earth's magnetosphere in the normal cut planes from 3D simulation. demo

  • Proton phase space distribution projected onto the X-Z plane. demo

Makie

Demos can be found in the Usage section of VlasiatorMakie.

  • Various colored contours from 2D equatorial run

  • Interactive proton density slice from 3D AMR run

  • Three orthogonal slices of proton density from 3D AMR run

  • Isosurface of Bz = 0 from 3D AMR run

  • Proton phase space distribution projected onto the X-Z plane

  • Interactive proton phase space distribution in the three orthogonal planes

  • Proton phase space distribution

ParaView

VLSV files can be converted to the structured VTK format, and then visualized in ParaView.

  • 2D slice contour of density in the meriodional plane with streamlines

  • 2D slices of density viewing from upstream

diff --git a/v0.11.5/index.html b/v0.11.5/index.html new file mode 100644 index 00000000..85c45de9 --- /dev/null +++ b/v0.11.5/index.html @@ -0,0 +1,7 @@ + +Home · Vlasiator.jl

Vlasiator.jl

Vlasiator.jl is a data processing and analyzing tool for the numerical model for collisionless ion-kinetic plasma physics Vlasiator. This lightweight package is built upon its sister in Python Analysator and carefully designed for performance, capability and ease of use. It can be easily integrated with external packages like FieldTracer.jl and TestParticle.jl to do all kinds of in-depth analysis.

Vlasiator.jl contains the following features:

  • Reading VLSV format data.
  • Calculating derived quantities from raw VLSV outputs.
  • Extracting quantities at a given point/line/plane/box.
  • Plotting 1D curves/2D cuts of saved/derived variables and phase space distributions.
  • Analyzing velocity distribution functions.
  • Appending DCCRG arrays to VLSV files.
  • Converting selected domain and variables from VLSV into VTK format for data analysis and visualization in ParaView and VisIt.
  • Monitoring Vlasiator run log files.
Warning

This package mostly aims at supporting Vlasiator 5.0+. Older versions of Vlasiator has different naming standards for outputs, and is not guaranteed to work. The full naming standards are described in the analysator wiki page.

What is Vlasiator

Vlasiator solves the Vlasov–Maxwell system of equations for ions while assuming massless electrons under quasi-neutrality. The fundamental description of charged particle motion in an electromagnetic field is given by the Vlasov equation

\[\frac{\partial f_\alpha}{\partial t} + \mathbf{v}\cdot\frac{\partial f_\alpha}{\partial \mathbf{r}} + \frac{q_\alpha}{m_\alpha}(\mathbf{E}+\mathbf{v}\times\mathbf{B})\cdot \frac{\partial f_\alpha}{\partial \mathbf{v}} = 0\]

where $\alpha$ denotes the particle species, $\mathbf{r}$ and $\mathbf{v}$ are the spatial and velocity coordinates, $f_\alpha(\mathbf{r},\mathbf{v},t)$ is the six-dimensional phase-space density of a particle species with mass $m_\alpha$ and charge $q_\alpha$, and acceleration $\mathbf{a}$ is given by the Lorentz force with $\mathbf{E}$ and $\mathbf{B}$ are the electric and magnetic field, respectively.

The zeroth and first moments of plasma, ion density $n_\alpha$ and velocity $\mathbf{u}_\alpha$, are obtained as integrals of the ion velocity distribution function

\[\begin{aligned} +n_\alpha &= \int f_\alpha(\mathbf{r},\mathbf{v},t)\mathrm{d}\mathbf{v} \\ +\mathbf{u}_\alpha &= \frac{1}{n_\alpha}\int \mathbf{v}f_\alpha(\mathbf{r},\mathbf{v},t)\mathrm{d}\mathbf{v} +\end{aligned}\]

The magnetic field is updated using Faraday's law:

\[\nabla \times \mathbf{E} = -\frac{\partial \mathbf{B}}{\partial t}\]

and the electric field is given by the generalized Ohm's law:

\[\mathbf{E} = -\sum_\alpha\mathbf{u}_\alpha \times\mathbf{B} + \frac{1}{\sum_\alpha n_\alpha q_\alpha}\mathbf{j}\times\mathbf{B} - \frac{1}{\sum_\alpha n_\alpha q_\alpha}\nabla\cdot\overleftrightarrow{P}_e + \eta \mathbf{j}\]

The four terms on the right-handed side are the convection term, the Hall term, the electron pressure gradient term, and the resistive term, respectively. The total current density $\mathbf{j}$ is obtained from Ampère's law where the displacement current has been neglected:

\[\nabla\times\mathbf{B} = \mu_0 \mathbf{j}\]

Finally, by determining the electron pressure tensor by using an appropriate equation of state, the evolution of the system can be followed in time. For example, let $\overleftrightarrow{P}_e = p_e \overleftrightarrow{I}$ where $p_e$ is the isotropic scalar electron pressure. In an isothermal process,

\[p_e = n_e k_B T_e\]

where $n_e \approx n_i$ and $T_e$ is a constant. In an adiabatic process with index $\gamma$,

\[p_e / n_e^\gamma = \text{const.}\]

The different processes can be generalized into the polytropic process:

\[p_e / n_e^n = \text{const.}\]

When the ideal gas law applies, the polytropic index $n=1$ for an isothermal process, and $n=\gamma$ for an adiabatic process.

For more details, please refer to Vlasov methods in space physics and astrophysics.

Getting started

To install,

julia> ]
+pkg> add Vlasiator

You can then use the package via

julia> using Vlasiator

Visualization

  • PyPlot

If you aim at using Matplotlib, besides adding PyPlot and the Vlasiator specific wrapper VlasiatorPyPlot, you should also link to a preinstalled Python version by setting the environment variable and building the PyCall package

ENV["PYTHON"]="your python executable"
+Pkg.build("PyCall")

If ENV["PYTHON"] = "" before building, a private Python distribution will be installed via Miniconda. Details are described in automated matplotlib installation.

  • Makie

You can add Makie.jl and VlasiatorMakie.jl through the pkg manger. The sub-package VlasiatorMakie provides user recipes for Makie.

  • Plots

Add Plots.jl through the pkg manager. Built-in user recipes for Plots are provided.

Author

This module is written by Hongyang Zhou. For citing Vlasiator.jl, please refer to DOI.

diff --git a/v0.11.5/internal/index.html b/v0.11.5/internal/index.html new file mode 100644 index 00000000..fedc3abd --- /dev/null +++ b/v0.11.5/internal/index.html @@ -0,0 +1,28 @@ + +API Reference · Vlasiator.jl

Internal

Public APIs

Vlasiator.check_plasma_characteristicsMethod
check_plasma_characteristics(n, v, T, B)

Display characteristic plasma parameters given density n, bulk velocity v, temperature T, and magnetic field strength B in SI units.

source
Vlasiator.compute_flux_functionMethod
compute_flux_function(b::AbstractArray{T,N}, Δ::Vector{T}, nG::Int=2) where {T,N}

Calculate the 2D magnetic flux function ψ from the magnetic field b and discrete steps Δ. nG is the number of ghost cells along each dimension in the vector field. ψ is defined as $\psi = \int B_x dz = - \int B_z dx$ from $\mathbf{B} = \hat{y}\times\nabla\psi$ in the X-Z plane and Y is the out-of-plane direction. This is strictly true if B is divergence-free and the guide field By is constant. However, numerically there will be errors. The current implementation calculates ψ by integrating along -z boundary first, and then going along z. Reference: Flux function

source
Vlasiator.extractsatMethod
extractsat(files::AbstractVector{String}, var::String, cid::Int)

Multi-threaded extraction of var at a fixed cell ID cid from files. This assumes that files come from the same grid structure.

source
Vlasiator.find_reconnection_pointsMethod
find_reconnection_points(ψ::Array{T,2}; retol::Float64=1e-4,
+   method::Int=1) -> indices_x, indices_o

Find X-point and O-point indices in 2D magnetic field topology from flux function ψ. The current implementation does not work for the 3 layers near the boundary.

Keywords

  • retol=1e-1: determines the relative tolerance of the ratio w.r.t. |∇ψ|² to accept a gradient as 0.
  • method=1: method 1 compute the cell-centered 1st and 2nd order derivatives and check the Hessian matrix; method 2 check the flux function at each point against its 8 neighbors, which is more deterministic.
source
Vlasiator.getKLdivergenceMethod
getKLdivergence(meta, VDF; species="proton")
+getKLdivergence(meta, vcellids, vcellf; species="proton")

Obtain the KL-divergence ∫ f*log(f/g)dv, where f is the VDF from Vlasiator and g is the analytical Maxwellian distribution that generates the same density as f. The value ranges from [0, +∞], with 0 meaning perfect Maxwellian. Usually the values are quite small. Alternatively, one can pass original vcellids and vcellf directly.

source
Vlasiator.getcellMethod
getcell(meta::MetaVLSV, location:::AbstractVector{<:AbstractFloat}) -> Int

Return cell ID containing the given spatial location in meter, excluding domain boundaries. Only accept 3D location.

source
Vlasiator.getcellinlineMethod
getcellinline(meta, point1::Vector, point2::Vector) -> cellids, distances, coords

Returns cell IDs, distances and coordinates for every cell in a line between two given points point1 and point2. TODO: preallocation?

source
Vlasiator.getdensityMethod
getdensity(meta, VDF; species="proton")
+getdensity(meta, vcellf; species="proton")
+getdensity(vmesh::VMeshInfo, vcellf)

Get density from VDF of species associated with meta, n = ∫ f(r,v) dV. Alternatively, one can directly pass vcellids as original indices of nonzero VDFs and vcellf as their corresponding values.

source
Vlasiator.getheatfluxvectorMethod
getheatfluxvector(meta, VDF; species="proton")
+getheatfluxvector(meta, vcellids, vcellf; species="proton")
+getheatfluxvector(vmesh::VMeshInfo, vcellids, vcellf)

Get heat flux vector (3 components) of species from VDF associated with meta, qᵢ = m/2 * ∫ (v - u)²(v - u)ᵢ * f(r,v) dV. Alternatively, one can directly pass vcellids, vcellf, as in getdensity.

source
Vlasiator.getlevelMethod
getlevel(meta::MetaVLSV, cid::Int) -> Int

Return the AMR level of a given cell ID cid.

Warning

This function does not check if the VLSV file of meta actually contains cid; it may be shadowed by refined children.

source
Vlasiator.getmaxwellianityMethod
getmaxwellianity(meta, VDF; species="proton")
+getmaxwellianity(meta, vcellids, vcellf; species="proton")

Obtain the Maxwellian similarity factor -log(1/(2n) * ∫ |f - g| dv), where f is the VDF from Vlasiator and g is the analytical Maxwellian distribution that generates the same density as f. The value ranges from [0, +∞], with 0 meaning not Maxwellian-distributed at all, and +∞ a perfect Maxwellian distribution. Alternatively, one can pass original vcellids and vcellf directly.

source
Vlasiator.getnearestcellwithvdfFunction
getnearestcellwithvdf(meta, id::Int, species::String="proton") -> Int

Find the nearest spatial cell with VDF saved for species of a given cell id associated with meta.

source
Vlasiator.getpressureMethod
getpressure(meta, VDF; species="proton")
+getpressure(meta, vcellids, vcellf; species="proton")
+getpressure(vmesh::VMeshInfo, vcellids, vcellf)

Get pressure tensor (6 components: Pxx, Pyy, Pzz, Pyz, Pzx, Pxy) of species from VDF associated with meta, pᵢⱼ = m * ∫ (v - u)ᵢ(v - u)ⱼ * f(r,v) dV. Alternatively, one can directly pass vcellids, vcellf, as in getdensity.

source
Vlasiator.getsiblingsMethod
getsiblings(meta::MetaVLSV, cid::Int) -> Vector{Int}

Return sibling cells of a given cid, including itself.

source
Vlasiator.getslicecellMethod
getslicecell(meta, sliceoffset, dir, minCoord, maxCoord) -> idlist, indexlist

Find the cell IDs idlist which are needed to plot a 2d cut through of a 3d mesh, in a direction dir at sliceoffset, and the indexlist, which is a mapping from original order to the cut plane and can be used to select data onto the plane.

source
Vlasiator.getvcellcoordinatesMethod
getvcellcoordinates(meta::MetaVLSV, vcellids::Vector; species="proton")

Return velocity cells' coordinates of species and vcellids.

source
Vlasiator.getvelocityMethod
getvelocity(meta, VDF; species="proton")
+getvelocity(meta, vcellids, vcellf; species="proton")
+getvelocity(vmesh::VMeshInfo, vcellids, vcellf)

Get bulk velocity from VDF of species, u = ∫ v * f(r,v) dV / n. Alternatively, one can directly pass vcellids, vcellf, as in getdensity.

source
Vlasiator.hasparameterMethod
hasparameter(meta::MetaVLSV, param::String) -> Bool

Check if the VLSV file contains a certain parameter param.

source
Vlasiator.hasvariableMethod
hasvariable(meta::MetaVLSV, var::String) -> Bool

Check if the VLSV file associated with meta contains a variable var.

source
Vlasiator.issameFunction
issame(file1, file2, tol=1e-4; strict=true, verbose=false) -> Bool

Check if two VLSV files file1 and file2 are approximately identical, under relative tolerance tol. If strict=true, the file size difference should be less than 1%.

source
Vlasiator.loadMethod
load(file::AbstractString)) -> MetaVLSV

Generate a MetaVLSV object from file of VLSV format.

source
Vlasiator.readlogMethod
readlog(file::AbstractString)

Read the run log file, check the iteration status and return the timestamps (exluding the last) as well as the model running speed in physical seconds per simulated seconds.

source
Vlasiator.readparameterMethod
readparameter(meta::MetaVLSV, param::String)

Return the parameter value from the VLSV file associated with meta.

source
Vlasiator.readvariableFunction
readvariable(meta::MetaVLSV, var::String, sorted::Bool=true, usemmap::Bool=false) -> Array

Return variable value of var from the VLSV file associated with meta. By default for DCCRG variables are sorted by cell ID. usemmap decides whether to use memory-mapped IO, which is especially useful for large arrays.

source
Vlasiator.readvariableMethod
readvariable(meta::MetaVLSV, var::String, cid::Int) -> Array

Read variable var in cell cid associated with meta.

source
Vlasiator.readvariableMethod
readvariable(meta::MetaVLSV, var::String, ids::Vector{Int}) -> Array

Read variable var in a collection of cells ids associated with meta. if ids is empty, return the whole sorted array of var.

source
Vlasiator.readvcellsMethod
readvcells(meta::MetaVLSV, cid::Int; species="proton") -> vcellids, vcellf

Read velocity cells of species from a spatial cell of ID cid associated with meta, and return a map of velocity cell ids vcellids and corresponding value vcellf.

source
Vlasiator.refinesliceMethod
refineslice(meta, idlist::Vector{Int}, data::AbstractVector, normal::Symbol) -> Vector
+refineslice(meta, idlist::Vector{Int}, data::AbstractMatrix, normal::Symbol) -> Matrix
+refineslice(meta, idlist::Vector{Int}, data::AbstractArray, dir::Int)

Generate data on the finest refinement level given cellids idlist and variable data on the slice perpendicular to normal. If data is 2D, then the first dimension is treated as vector components.

source
Vlasiator.vdfvolumeFunction
vdfvolume(meta, location; species="proton", unit=SI, flimit=-1.0, verbose=false)

Meshscatter plot of VDFs in 3D.

source
Vlasiator.vizFunction
viz(meta, var; args)

Visualize Vlasiator output var in meta with various options:

Keyword arguments

  • axisunit - unit of axis of type AxisUnit
  • colorscale - scale of colormap of type ColorScale
  • normal - slice normal direction
  • vmin - minimum color value
  • vmax - maximum color value
  • comp - selection of vector components

Notes

  • This function will only work in the presence of a Makie.jl backend via package extensions in Julia v1.9 or later versions of the language.
source
Vlasiator.viz!Function
viz!(meta, var; args)

Visualize Meshes.jl object in an existing scene with options forwarded to viz.

source
Vlasiator.vlslicesFunction
vlslices(meta::MetaVLSV, var; axisunit=SI, comp=0, origin=[0.0, 0.0, 0.0])

Three orthogonal slices of var from meta.

source
Vlasiator.write_vlsvMethod
write_vlsv(filein, fileout, newvars::Vector{Tuple{Vector, String, VarInfo}};
+   force=false)

Generate a new VLSV fileout based on filein, with newvars added. force=true overwrites the existing fileout.

source
Vlasiator.write_vtkMethod
write_vtk(meta::MetaVLSV; kwargs...)
+write_vtk(file::AbstractString; kwargs...)

Convert VLSV file to VTK format.

Keywords

  • vars::Vector{String}=[""]: select which variables to convert.
  • ascii::Bool=false: output stored in ASCII or compressed binary format.
  • maxamronly::Bool=false: generate image files on the highest refinement level only.
  • box::Vector: selected box range in 3D.
  • outdir::String="": output directory.
  • verbose::Bool=false: display logs during conversion.
source

PyPlot Wrapper APIs

VlasiatorPyPlot has been moved to a standalone package in a subdirectory.

Private APIs

Base.ndimsMethod
ndims(meta::MetaVLSV) -> Int

Return the simulation spatial dimension of VLSV data.

source
Vlasiator.curlMethod
curl(A::AbstractArray{T,N}, dx:Union{Vector{U}, NTuple{3,U}}) where {T,N,U}

Calculate 2nd order cell-centered ∇×A where A is a 4D array of size (3, nx, ny, nz) and dx is a vector of grid intervals in each dimension.

source
Vlasiator.divergenceMethod
divergence(A::AbstractArray{T,N}, dx::Vector{U}=ones(T, 3)) where {T,N,U}

Calculate 2nd order cell-centered ∇⋅A where A is a 4D array of size (3, nx, ny, nz) and dx is a vector of grid intervals in each dimension.

source
Vlasiator.divergence2dMethod
divergence2d(A::AbstractArray{T,N}, dx::AbstractFloat) where {T,N}

Calculate 2nd order cell-centered ∇⋅A where A is a 4D array of size (3, nx, ny, nz) and dx is the uniform grid interval in each dimension. One of the dimension must be 1.

source
Vlasiator.downsample_fgMethod
downsample_fg(meta::MetaVLSV, v_fg::Array)
+downsample_fg(meta::MetaVLSV, var::String)

Downsample a field solver array v_fg to the spatial grid associated with meta.

source
Vlasiator.fillmeshMethod
fillmesh(meta::MetaVLSV, vars::Vector{String};
+   skipghosttype=true, maxamronly=false, verbose=false) -> celldata, vtkGhostType

Fill the DCCRG mesh with quantity of vars on all refinement levels.

Return arguments

  • celldata::Vector{Vector{Array}}: data for each variable on each AMR level.
  • vtkGhostType::Array{UInt8}: cell status (to be completed!).
source
Vlasiator.getRotationMatrixMethod
getRotationMatrix(e1::Matrix, e2::Matrix) -> SMatrix{3,3}

Obtain the rotation matrix from orthgonal base vectors e1 to e2, such that a vector $\mathbf{u}_1$ in e1 can be expressed as $\mathbf{u}_1 = M\cdot \mathbf{u}_2$, where $M$ is the rotation matrix and $\mathbf{u}_2$ is the same vector in e2.

Example

e1 = [1.0 0.0 0.0; 0.0 1.0 0.0; 0.0 0.0 1.0]
+e2 = [0.0 1.0 0.0; 1.0 0.0 0.0; 0.0 0.0 1.0]
+R = getRotationMatrix(e1, e2)
source
Vlasiator.getRotationMatrixMethod
getRotationMatrix(axis::AbstractVector, angle::Real) --> SMatrix{3,3}

Create a rotation matrix for rotating a 3D vector around a unit axis by an angle in radians. Reference: Rotation matrix from axis and angle

Example

using LinearAlgebra
+v = [-0.5, 1.0, 1.0]
+v̂ = normalize(v)
+θ = deg2rad(-74)
+R = getRotationMatrix(v̂, θ)
source
Vlasiator.get_axisMethod
get_axis(axisunit::AxisUnit, plotrange::NTuple{4,<:Real}, sizes::NTuple{2,<:Integer})
+get_axis(pArgs::PlotArgs)

Return x and y ranges for 2D.

source
Vlasiator.get_fg_array_cellMethod
get_fg_array_cell(meta::MetaVLSV, v_fg::Array, cid::Int)

Return a subarray of the field solver grid array, corresponding to the fsgrid covered by the spatial cell ID cid.

source
Vlasiator.get_fg_indices_subvolumeFunction
get_fg_indices_subvolume(meta::MetaVLSV, lower, upper, tol::Float64=1e-3)

Get indices for subarray of fsgrid variables, in a cuboid defined by lower and upper vertices. This is used for mapping a set of fsgrid cells to a given DCCRG cell. Shift the corners (lower, upper) inward by a distance controlled by tol. If direct low-inclusive behaviour is required, tol shall be set to 0.

source
Vlasiator.getdata2dMethod
getdata2d(meta::MetaVLSV, var::String)

Return 2d scalar/vector data. Nonpublic since it won't work with DCCRG AMR.

source
Vlasiator.gradientMethod
gradient(A::AbstractArray{T,N}, dx::Vector{U}) where {T,N,U}

Calculate 2nd order cell-centered ∇A where A is a scalar array and dx is a vector of grid intervals in each dimension.

Warning

The current implementation has issues at the boundary if gradient is taken multiple times.

source
Vlasiator.prep1dMethod
prep1d(meta::MetaVLSV, var::String; i1::Int=0, i2::Int=0, comp::Int=0) -> Array

Obtain a 1D slice from 2D meta of var. i1 is the index for the first dimension, and i2 is the index for the second dimension; only one of them is needed. Use comp to select vector components.

source
Vlasiator.prep2dFunction
prep2d(meta::MetaVLSV, var::String, comp::Union{Symbol, Int}=0) -> Array

Obtain data from meta of var for 2D plotting. Use comp to select vector components.

source
Vlasiator.prep2dsliceMethod
prep2dslice(meta::MetaVLSV, var::String, normal, comp, pArgs::PlotArgs)

Return data of var on a uniform 2D mesh on the finest AMR level. Use normal to select the plane orientation, and comp to select the component of a vector.

source
Vlasiator.prep_vdfMethod
prep_vdf(meta::MetaVLSV, location::AbstractVector; kwargs...)

Return the cell velocities v1, v2, bin ranges r1, r2, cell VDF values fweight, and strings of labels and titles for VDF plots.

Keywords

  • unit::AxisUnit: location unit in SI, EARTH.
  • unitv::String: velocity unit in ("km/s", "m/s").
  • limits::Vector{Real}: velocity space range given in [xmin, xmax, ymin, ymax].
  • slicetype: symbol for choosing the slice type from :xy, :xz, :yz, :bperp, :bpar1, :bpar2.
  • center: symbol for setting the reference frame from :bulk, :peak.
  • vslicethick: setting the velocity space slice thickness in the normal direction. If set to 0, the whole distribution along the normal direction is projected onto a plane. Currently this is only meaningful when center is set such that a range near the bulk/peak normal velocity is selected.
  • weight::Symbol: choosing distribution weights from phase space density or particle flux between :particle and :flux.
  • flimit: minimum VDF threshold for plotting.
  • verbose: display the selection process.
source
Vlasiator.read_variable_as_fgMethod
read_variable_as_fg(meta::MetaVLSV, var::String)

Interpolate DCCRG variable var to field solver grid size. This is an alternative method to fillmesh, but not optimized for performance.

source
Vlasiator.reconstructMethod
reconstruct(vmesh::VMeshInfo, vcellids::Vector{Int32}, vcellf::Vector{<:AbstractFloat})

Reconstruct the full VDFs in 3D. vcellids are raw indices of nonzero VDFs ordered by blocks, and vcellf are the corresponding values in each cell.

source
Vlasiator.reorderMethod
reorder(vmesh::VMeshInfo, vcellids::Vector{Int32}) -> vcellids_origin

Reorder vblock-organized VDF indexes into x–>y–>z indexes. vcellids are raw indices of nonzero VDFs ordered by blocks.

source
Vlasiator.rotateTensorToVectorZMethod
rotateTensorToVectorZ(tensor::AbstractMatrix, vector::AbstractVector) -> SMatrix{3,3}

Rotate tensor with a rotation matrix that aligns the 3rd direction with vector, which is equivalent to change the basis from (i,j,k) to (i′,j′,k′) where k′ ∥ vector. Reference: Tensor rotation

source
Vlasiator.save_imageFunction
save_image(meta::MetaVLSV, file, vars, data, vtkGhostType, level,
+   ascii=false, append=true, box=[-Inf, Inf, -Inf, Inf, -Inf, Inf])

Save data of name vars at AMR level into VTK image file of name file.

Arguments

  • file::String: output file name.
  • vars::Vector{String}: variable names to be saved.
  • data::Vector{Vector{Array}}: data for all the variables on each refinement level.
  • vtkGhostType::Array{UInt8}: array for visibility control.
  • level::Int: refinement level (0-based).
  • ascii::Bool=false: save output in ASCII or binary format.
  • append::Bool=true: determines whether to append data at the end of file or do in-block writing.
  • box::Vector: selected box range in 3D.
source
Vlasiator.set_argsMethod
set_args(meta::MetaVLSV, var::String, axisunit::AxisUnit;
+   normal::Symbol=:none, origin=0.0)

Set plot-related arguments of var in axisunit. normal and origin are used for 2D slices of 3D data.

source
Vlasiator.set_limMethod
set_lim(vmin, vmax, data, colorscale=Linear)

Set colormap limits vmin, vmax for data under scale colorscale.

source
diff --git a/v0.11.5/log/index.html b/v0.11.5/log/index.html new file mode 100644 index 00000000..20ae30ce --- /dev/null +++ b/v0.11.5/log/index.html @@ -0,0 +1,6 @@ + +FAQ · Vlasiator.jl

FAQ

Test Data

If you don't have VLSV data at hand, Vlasiator.jl provides some test data for you to begin with.

using LazyArtifacts
+
+rootpath = artifact"testdata"
+files = joinpath.(rootpath, ("bulk.1d.vlsv", "bulk.2d.vlsv", "bulk.amr.vlsv"))

These are also used in the standard test. These will be automatically downloaded from vlsv_data if you run the package test locally.

Performance

The VLSV loader inherits the basic structure from Analysator and is redesigned for performance.

  • For general data reading, a dictionary is constructed for cell IDs and orderings for O(1) timings.
  • It is faster to read a bunch of cell IDs together, if possible, than to read each cell one-by-one.
  • Specific methods are provided for targeted tasks that are much faster than the generic approaches. For instance, extractsat for multi-frame static satellite extraction can be more than 10x faster than first reading the metadata and then extracting variables for each frame.

For development, it is recommended to use PkgBenchmark.jl to run the test suite:

using PkgBenchmark, Vlasiator
+results = benchmarkpkg(Vlasiator)

or if you want to compare the current status of the package against a different git version

judge(Vlasiator, "97e3dca6b2474d7bdc5b62b5bf98ecf070516e5e")

To export results to Markdown,

export_markdown("testresult", results)

See more in the PkgBenchmark manual.

Precision

For post-processing and data analysis purposes, it makes less sense to stick to double precisions, so we mostly use Float32 in Vlasiator.jl for numerical arrays. Several exceptions are:

  • physical constants are defined in Float64, since single precision only resolves up to ±3.4E+38, and it may go out of bound in the middle of calculation (e.g. plasma frequency).

Int vs. UInt

Integers but not unsigned integers shall be used for indexing, even though unsigned integers are tempting.

Memory

Vlasiator output files can be large. If we have limited memory relative to the file size, Vlasiator.jl provide direct hard disk mapping through mmap in Julia. With this mechanism you never need to worry about unable to process data with small free memory. Besides, we found that proper usage of mmap can also speed up reading and reduce memory comsumption. However, without reinterpret we may encounter the alignment issue!

Parallelism

The current design choice is to achieve optimal serial performance per file, and apply parallel processing across individual files. In most common cases, the time it takes for post-processing one snapshot is reasonably short, but the number of snapshots are large. Julia's built-in support for all kinds of parallelism paradigm (multithreading, multiprocessing, channel) and external support from packages (MPI.jl, Polyester.jl) can be relatively easily incorported to make the whole workflow parallel.

  • multi-threading with @threads (recommended when working within one node)
  • multi-processing with pmap
  • multi-processing with RemoteChannel
  • ClusterManagers for multi-node jobs

See more in the examples.

VTK

VLSV is just an uncompressed binary format. If we convert VLSV to VTK through write_vtk, the generated VTK files, even the highest resolution one with every coarse cell mapping to the finest level, can be several times smaller than the original VLSV file.

One drawback of this conversion is that it cannot deal with phase space outputs, i.e. VDFs.

diff --git a/v0.11.5/manual/index.html b/v0.11.5/manual/index.html new file mode 100644 index 00000000..0610d732 --- /dev/null +++ b/v0.11.5/manual/index.html @@ -0,0 +1,96 @@ + +User Guide · Vlasiator.jl

Manual

Here we demonstrate some basic usages of processing Vlasiator output. A quick self-contained demo is shown with Pluto. For complete description of the arguments, please refer to the API documents or type ?function_name to display help message in the REPL.

Common physical constants

A bunch of physical constants are predefined in Vlasiator.jl. To use them, you need to import explicitly, e.g. using Vlasiator: RE or prepend the module name like Vlasiator.RE.

Physical constantValueMeaning
qₑ-1.60217662e-19electron charge, [C]
mₑ9.10938356e-31electron mass, [kg]
qᵢ1.60217662e-19proton mass, [C]
mᵢ1.673557546e-27proton mass, [kg]
c299792458.speed of light, [m/s]
μ₀4π*1e-7Vacuum permeability, [H/m]
ϵ₀1/(c^2*μ₀)Vacuum permittivity, [F/m]
kB1.38064852e-23Boltzmann constant, [m²kg/(s²K)]
RE6.371e6Earth radius, [m]

Loading VLSV data

A quick way to obtain small test data can be found in F&Q. Larger open-access data can be found from the references in Vlasiator publications, e.g. Takahashi+ 2020. In this tutorial we are using the 2D test file bulk.2d.vlsv from vlsv_data if not specified.

  • Read meta data
file = "bulk.2d.vlsv"
+meta = load(file)

The VLSV meta data contains information of file name, variable names, ordinary cell ID list, mesh sizes, species, and velocity cell structures. It is often the first argument for methods defined in Vlasiator.jl.

  • Read parameter

For convenience we support the do-block syntax that automatically closes the file stream.

t = load(file) do meta
+   readparameter(meta, "time")
+end
  • Read variable meta data
readvariablemeta(meta, "proton/vg_rho")

A list of utility functions has been implemented for checking variable status. See here for the full list.

  • Read variable
data = meta["CellID"]
+# Or equivalently
+data = readvariable(meta, "CellID")

The variable reading is designed for cells, which takes cell ID(s) as the 3rd argument if specified. The same interface works for both DCCRG grid (for storing cell centered quantities like plasma moments) and FS grid (for storing field solver related quantities on a uniform high resolution mesh) variables. By default the returned DCCRG variable array is sorted by cell IDs. If in any case you want the original unsorted version as being stored in the file, use readvariable(meta, var, false).

  • Get variable at a given location
loc = [2.0, 0.0, 0.0]
+id = getcell(meta, loc)
+readvariable(meta, "CellID", id)
  • Get variable along a line between two points
using Vlasiator: RE # Earth radii
+point1 = [12RE, 0, 0]
+point2 = [15RE, 0, 0]
+cellids, distances, coords = getcellinline(meta, point1, point2)
+var_extract = readvariable(meta, "VA", cellids)
  • Extract variable at a static cell ID from a sequence of files under the same grid
files = ["bulk.2d.vlsv"]
+var = "CellID"
+id = 1
+extractsat(files, var, id)
  • Downsample field solver variable to DCCRG grid
Vlasiator.downsample_fg(meta, "fg_e")
  • Upsample DCCRG variable to field solver grid
data = Vlasiator.read_variable_as_fg(meta, "proton/vg_rho")
+# Equivalent to the above, but faster
+data = let
+   tmp = Vlasiator.fillmesh(meta, ["proton/vg_rho"]; maxamronly=true)[1][1][1]
+   reshape(tmp, size(tmp)[2:end])
+end

This is useful when corresponding DCCRG variables are not saved, or a uniform mesh is required for further analysis.

  • Compare VLSV files

One may want to check if two vlsv files are identical. This is tricky because

  1. the structure of VLSV format does not guarantee the writing order in parallel processing;
  2. numerical error accumulates with floating point representation, especially with fastmath option.

The issame method does not check quantities that are related to the MPI writing sequence: for some reasons, even file sizes may vary depending on the number of MPI processes!

issame(file1, file2)

There is an optional third argument to issame for setting the relative difference tolerance, with default being 1e-4. In practice relative difference works better for "large" numbers, and absolute difference works better for "small" numbers.

Computing derived quantities

Vlasiator.jl is capable of computing plasma moments and some predefined derived quantities and saving them directly into VLSV files. To avoid confusion about variable names, the conventions are

  • raw quantities are all lowercases;
  • all predefined derived variable names start with a capital letter;
  • exceptions are for aliases (e.g. "n").

To obtain a derived quantity, use either a key of string or symbol,

beta = meta["Beta"]
+VA = meta[:VA]

Here is a full list of available quantities[1]:

Derived variable nameMeaningRequired variable[2]
Bmagmagnetic field magnitudevg_b_vol
Emagelectric field magnitudevg_e_vol
Vmagbulk speedvg_v
Bhatunit magnetic fieldvg_b_vol
VSsound speedvg_ptensor_diagonal; vg_rho
VAAlfvén speedvg_rho; Bmag
MAAlfvén Mach numberVmag; VA
MSSonic Mach numberVmag; VS
Epar$\mathbf{E}_\parallel$vg_e_vol; Bhat
Eperp$\mathbf{E}_\perp$vg_e_vol; Bhat
Vparbulk velocity $\parallel\mathbf{B}$vg_v; vg_b_vol
Vperpbulk velocity $\perp \mathbf{B}$vg_v; vg_b_vol
Vthproton thermal velocityP; vg_rho
Pscalar thermal pressurevg_ptensor_diagonal
Pparpressure $\parallel\mathbf{B}$vg_ptensor_diagonal; vg_b_vol
Pperppressure $\perp \mathbf{B}$vg_ptensor_offdiagonal; vg_b_vol
Tscalar temperatureP; vg_rho
Tpartemperature $\parallel\mathbf{B}$vg_rho; vg_ptensor_diagonal; vg_b_vol
Tperptemperature $\perp \mathbf{B}$vg_rho; vg_ptensor_offdiagonal; vg_b_vol
Tanisotropy$T_\perp / T_\parallel$Tpar; Tperp
Jcurrent densityvg_b_vol
Jpar$j_\parallel$vg_b_vol
Jperp$j_\perp$vg_b_vol
Protatedpressure tensor with $\widehat{z} \parallel \mathbf{B}$vg_b_vol; vg_ptensor_diagonal; vg_ptensor_offdiagonal
Panisotropy$P_\perp / P_\parallel$ptensor; B
Pramdynamic ram pressurevg_rho; Vmag
Pbmagnetic pressurevg_b_vol
PoyntingPoynting fluxE; B
Betaplasma $\beta$, $P / P_B$P; vg_b_vol
BetaStarmodified $\beta$, $(P+P_{ram})/P_B$P; Pram; vg_b_vol
IonInertialproton inertial lengthvg_rho
Larmorproton Larmor radiusVth; Bmag
Gyroperiodproton gyroperiodBmag
PlasmaPeriodplasma oscillation periodvg_rho
Gyrofrequencyproton gyro-frequencyBmag
Omegapplasma frequency (proton)vg_rho
MagneticTensionmagnetic tension forcevg_b_vol
nproton number densityvg_rho

which can also be found as keys of dictionary in vlsvvariables.jl.

Note

In Vlasiator, the cells inside the inner boundary (which is usually a sphere/circle) are filled with zero density values. This is then used to identify the inner boundary for all other quantities. Therefore, if you are manipulating directly on data, make sure that the nonsense values inside the inner boundary are excluded. One way to do this can be found in vlsvvariables.jl.

Velocity space moments

We can also calculate plasma moments from the saved VLSV velocity space distributions.

meta = load("bulk.1d.vlsv")
+cellid = 5
+# VDF cell indexes and values, with sparsity
+vcellids, vcellf = readvcells(meta, cellid; species="proton")
+
+getdensity(meta, vcellf)
+
+getvelocity(meta, vcellids, vcellf)
+# pressure tensor components Pxx, Pyy, Pzz, Pyz, Pzx, Pxy
+getpressure(meta, vcellids, vcellf)
+# heat flux components qⱼⱼᵢ
+getheatfluxvector(meta, vcellids, vcellf)

To obtain the original ordering of velocity cells,

vcellids_original = Vlasiator.reorder(meta.meshes["proton"], vcellids)

Non-Maxwellianity represents the deviation from a Maxwellian distribution. Currently we have implemented a monitor quantity named "Maxwellianity", which is defined as $-ln \big[ 1/(2n) \int |f(v) - g(v)| dv \big]$, where n is the density, f(vᵢ) is the actual VDF value at velocity cell i, and g(vᵢ) is the analytical Maxwellian (or strictly speaking, normal) distribution with the same density, bulk velocity and scalar pressure as f.

getmaxwellianity(meta, vcellids, vcellf)

The value ranges from [0, +∞], with 0 meaning not Maxwellian-distributed at all, and +∞ a perfect Maxwellian distribution. An alternative measure is the KL-divergence borrowed from statistics, where we select the reference distribution g to be again a Maxwellian derived from the actual distribution f:

getKLdivergence(meta, vcellids, vcellf)

In this case, 0 indicates perfect Maxwellian while +∞ indicates largest deviation. There is no unique definition of non-Maxwellianity, and we are still trying to see which one works better for describing plasma behaviors.

Sometimes it may be useful to recover the full 3D array of VDFs:

f = Vlasiator.reconstruct(meta.meshes["proton"], vcellids, vcellf)

However, usually in practice there would be only about 1% nonzero values. The moments and maxwellianity calculations above all have an alternative form of using reconstructed VDFs as inputs.

Plotting

Vlasiator.jl does not include any plotting library as explicit dependency, but it offers plotting recipes/wrappers once the target plotting package is used.

Currently PyPlot provides the most complete and fine-tuned plotting capabilities. Plotting with PyPlot by accepting MetaVLSV as the first argument is supported via VlasiatorPyPlot. Plots is a collection of plotting libraries with a uniform frontend, but it lacks fine-tuned supports and consistent APIs between different backends. Makie, a native Julia plotting library, is also supported via package extension after Julia 1.9 and a package VlasiatorMakie.jl before Julia 1.9. Without generating an system image from PackageCompiler, it would take ~20s for the first plot on Julia 1.9. However, Makie has made nice progress in layouts, widgets, docs, and all the tiny things, which makes it a strong candidate for the de facto plotting library in the future.

More examples of customized plots can be found in the repository.

PyPlot Backend

To trigger Matplotlib plotting that supports MetaVLSV, using VlasiatorPyPlot. All the functions with identical names as in Matplotlib accept all possible keyword arguments supported by Matplotlib, e.g. font width, font size, colormap, etc. For detailed adjustment of plots, please refer to the Matplotlib documentation for details.

Warning

The method call to certain axes is not dispatched, e.g. ax.plot; as an alternative, one needs to pass ax as the third argument to the functions, e.g. plot(meta, "rho", ax). See Matplotlib's two interfaces for the history of the interfaces.

  • Scalar colored contour from 2D simulation
pcolormesh(meta, "n")
  • Vector z-component colored contour from 2D simulation in a manually set range
pcolormesh(meta, "n", comp=:z, colorscale=Log, axisunit=EARTH, vmin=1e6, vmax=2e6)
  • Vz colored contour from 2D simulation with prescribed colormap
pcolormesh(meta, "proton/vg_v", comp=:z, colorscale=Linear, cmap=matplotlib.cm.RdBu_r)
  • Derived quantity colored contour from 2D simulation (as long as the input variable is in the predefined dictionary)
pcolormesh(meta, "Bmag", comp=:z, colorscale=Linear, axisunit=SI)
  • Streamline from 2D simulation
streamplot(meta, "proton/vg_v", comp="xy")
  • Quiver from 2D simulation
quiver(meta, "proton/vg_v", comp="xy")

The comp option is used to specify the two vector components.

You can choose to use a linear/log/symlog color scale by setting keyword colorscale to Linear, Log, or SymLog, plot vector components by setting keyword op to :x, :y, :z, 1, 2, 3, 0 or :mag, and set axisunit to EARTH or SI etc.

  • Mesh denoted by cell centers
plotmesh(meta; projection="z", color="k")
  • Cut slice colored contour from 3D simulation
meta = load("bulk.amr.vlsv")
+pcolormesh(meta, "proton/vg_rho", normal=:y, origin=0.0)
  • Velocity distribution slice plot near a given spatial location
meta = load("bulk.1d.vlsv")
+coordinates = [0.0, 0.0, 0.0]
+vdfslice(meta, coordinates)
  • Quick interactive REPL-based function for data inspection
pui(meta)

Or pass filename directly like pui(file).

Note

This is an experimental feature. We plan to have GUI-based plotting support in the future.

For a full list available optional arguments, please refer to the doc for each method

Plots Backend

To trigger Plots.jl plotting, using Plots. This backend supports all available attributes provided by Plots.jl. By default it uses GR, but many other plotting libraries are also supported.

  • Scaler colored contour from 2D simulation
var = "n"
+heatmap(meta, var, aspect_ratio=:equal, c=:turbo)
  • Scaler colored contour with lines from 2D simulation
var = "n"
+contourf(meta, var)
  • VDF projected slice in a normal direction
meta = load("bulk.1d.vlsv")
+location = [0.0, 0.0, 0.0]
+vdfslice(meta, location)

Makie Backend

Makie plotting is supported via package extension after Julia 1.9. The extension is automatically loaded when both Vlasiator and one of the Makie backends (e.g. GLMakie, CairoMakie). Before Julia 1.9, a standalone package VlasiatorMakie.jl is designed for plotting with Makie. To trigger Makie plotting with OpenGL, using VlasiatorMakie, GLMakie.

You can either use intrinsic Makie plotting methods like

lines(meta, var)   # 1D
+heatmap(meta, var) # 2D

or use full recipes for quick inspection of data

  • 2D slices of 3D AMR data
vlslice(meta, var; normal=:x)
  • Orthognal slices of 3D AMR data
vlslices(meta, var)
  • 2D slice of VDFs at a spatial cell
fig, ax = vdfslice(meta, location)
+fig
  • Orthognal slices of VDFs at a spatial cell
vdfslices(meta, location)
  • 3D scatter of VDFs at a spatial cell
fig, ax = vdfvolume(meta, location)
+fig

The interactive plots are available through the OpenGL backend of Makie GLMakie. For noninteractive high fidelity plots, we can also use the Cairo backend of Makie CairoMakie. Other options can be found at Makie Ecosystem.

using Vlasiator, GLMakie
+
+file = "bulk.2d.vlsv"
+meta = load(file)
+
+heatmap(meta, "proton/vg_rho")

3D isosurface:

fig = volume(meta, "fg_b", EARTH, 3; algorithm=:iso, isovalue=0.0, isorange=1e-9)

Single figure contour plot:

fig = Figure(size=(700, 600), fontsize=18)
+ga = fig[1,1] = GridLayout()
+ax = Axis(fig[1,1],
+   aspect = DataAspect(),
+   title = "t = $(round(meta.time, digits=1))s",
+   xlabel = L"x [$R_E$]",
+   ylabel = L"y [$R_E$]"
+)
+hmap = heatmap!(meta, "proton/vg_rho", colormap=:turbo)
+cbar = Colorbar(fig, hmap, label=L"$\rho$ [amu/cc]", width=13,
+                ticksize=13, tickalign=1, height=Relative(1))
+fig[1,2] = cbar
+colgap!(ga, 1)

Multi-figure contour plots:

fig = Figure(size=(1100, 800), fontsize=18)
+
+axes = []
+v_str = ["CellID", "proton/vg_rho", "proton/vg_v",
+   "vg_pressure", "vg_b_vol", "vg_e_vol"]
+c_str = ["", L"$\rho$ [amu/cc]", "[m/s]", "[Pa]", "[T]", "[V/m]"]
+c = 1
+
+for i in 1:2, j in 1:2:5
+   ax = Axis(fig[i,j], aspect=DataAspect(),
+      xgridvisible=false, ygridvisible=false,
+      title = v_str[c],
+      xlabel = L"x [$R_E$]",
+      ylabel = L"y [$R_E$]")
+   hmap = heatmap!(meta, v_str[c], colormap=:turbo)
+   cbar = Colorbar(fig, hmap, label=c_str[c], width=13,
+                ticksize=13, tickalign=1, height=Relative(1))
+   fig[i, j+1] = cbar
+   c += 1
+   push!(axes, ax) # just in case you need them later.
+end
+
+fig[0, :] = Label(fig, "t = $(round(meta.time, digits=1))s")

Adjusting axis limits:

location = [0, 0, 0]
+fig = vdfslice(meta, location)
+xlims!(fig.content[1], -1000, 1000)
+ylims!(fig.content[1], -1000, 1000)
+limits!(fig.content[1], 0, 10, 0, 10) # xmin, xmax, ymin, ymax

Saving figure:

fig = vdfvolume(meta, location)
+save("output.png", fig)

The resolution is a property of the Figure object returned from the function.

Appending to VLSV

We are able to compute derived quantities from an original VLSV file and generate a new VLSV output with new quantities included.

meta = load("bulk.1d.vlsv")
+vmag = readvariable(meta, "Vmag")
+pa = readvariable(meta, "Panisotropy")
+vars = Vector{Tuple{VecOrMat, String, VarInfo}}(undef, 0)
+using LaTeXStrings
+push!(vars, (vmag, "vmag", VarInfo("m/s", L"$\mathrm{m}/mathrm{s}$", L"$V$", "")))
+push!(vars, (pa, "panisotropy", VarInfo("", "", "", "")))
+
+write_vlsv("bulk.1d.vlsv", "bulk.1d_new.vlsv", vars)
Note

Writing new FsGrid variables is not supported. All quantities from the original file is maintained.

Converting to VTK

We can convert VLSV files into VTK format. Since DCCRG is Cartesian based with uniform spacing, each level of mesh refinement corresponds to a VTK image file, and the cell refinement relationships are stored in vtkGhostType as well as the vthb file.

To convert a VLSV file into VTK,

write_vtk(file)

This function accepts either string of file names or MetaVLSV.

To see the full list of options, please refer to the documentation in API Reference. Example usage can be found here.

Warning

As of ParaView 5.9.1, there are display issues with VTKOverlappingAMR. However, we can read the generated image files directly. There is also an keyword argument for write_vtk called maxamronly: when it is set to true, then only the image file at the highest refinement level is generated. This part is experimental and subject to change in the future.

Tracking log files

The runtime performance per iteration can be monitored through log files:

file = "logfile.txt"
+timestamps, speed = readlog(file)

Here is a live demo.

Examples

More examples are provided about

  • Plotting with PyPlot
  • Plotting with Plots
  • Extracing variable along a line
  • Field line tracing
  • Simulation log file tracking
  • Converting VLSV to VTK format
  • Parallel post-processing
  • Finding X-points and O-points in 2D reconnections

Feel free to check those out and try on your data!

  • 1For species specific variables, you need to add the species name at the front, separated by a slash. For example, the proton bulk velocity is a string proton/vg_v.
  • 2If a required variable exists in the VLSV file, we try to use it directly instead of calculating from other variables. The interpolated FS grid variables onto DCCRG grid are preferred over original FS grid variables.
diff --git a/v0.11.5/python/index.html b/v0.11.5/python/index.html new file mode 100644 index 00000000..0d469827 --- /dev/null +++ b/v0.11.5/python/index.html @@ -0,0 +1,23 @@ + +Calling from Python · Vlasiator.jl

Interoperability Between Julia and Python

There are currently two ways to call Julia from Python and vice versa, which are described below. When converting from Julia to Python, there are two most important differences:

  1. Julia is column-major, while Python is row-major.
  2. Julia adopts by default 1-based indexing, while Python adopts 0-based indexing.

JuliaCall

Vlasiator.jl can be called from Python via JuliaCall. JuliaCall will link to the first Julia version in the system path. If Vlasiator.jl has been installed, we can use it directly; otherwise we need to state it in the juliacalldeps.json file.

from juliacall import Main as jl
+jl.seval("using Vlasiator")
+file = "bulk.1d.vlsv"
+meta = jl.load(file)

Matplotlib can then be used to visualize the data.

from matplotlib import pyplot as plt
+import numpy as np
+rho = jl.readvariable(meta, "proton/vg_rho")
+x = np.arange(meta.coordmin[0], meta.coordmax[0], meta.dcoord[0])
+plt.plot(x, rho)
+plt.show()
Warn

There is an issue that JuliaCall may decide to check pkg installation every time for a new session. We need to first make sure that PythonCall is installed in Julia; then make sure your PYTHONPATH is properly set. See this issue for more information.

PyJulia

Vlasiator.jl can also be called from Python with the aid of PyJulia. Following the installation steps described in the manual[1], and then inside Python REPL:

# Handling initialization issue for Conda
+from julia.api import Julia
+jl = Julia(compiled_modules=False)
+
+from julia import Vlasiator
+file = "bulk1.0001000.vlsv"
+meta = Vlasiator.load(file)
+var = "proton/vg_rho"
+data = Vlasiator.readvariable(meta, var)

To run a Julia script in Python,

# Handling initialization issue for Conda
+from julia.api import Julia
+jl = Julia(compiled_modules=False)
+jl.eval('include("examples/demo_2dplot_pyplot.jl")')
+import matplotlib.pyplot as plt
+plt.show()
Note

This approach is for you to have a taste of the package with a Python frontend. The workaround shown above for handling the static python libraries makes it slow for regular use. An alternative solution would be creating system images, but as of Julia 1.6 the user experience is not smooth. For better integrated experience with its full power, it is recommended to use the package inside Julia.

  • 1For Debian-based Linux distributions, it gets a little bit tricky. Please refer to Troubleshooting for details.
diff --git a/v0.11.5/search_index.js b/v0.11.5/search_index.js new file mode 100644 index 00000000..2df5a3dc --- /dev/null +++ b/v0.11.5/search_index.js @@ -0,0 +1,3 @@ +var documenterSearchIndex = {"docs": +[{"location":"examples/postprocess/demo_em_extract_slice/","page":"Extract EM fields on a slice","title":"Extract EM fields on a slice","text":"EditURL = \"/home/runner/work/Vlasiator.jl/Vlasiator.jl/docs/examples/postprocess/demo_em_extract_slice.md\"","category":"page"},{"location":"examples/postprocess/demo_em_extract_slice/#demo_em_slice","page":"Extract EM fields on a slice","title":"Extract EM fields on a slice","text":"","category":"section"},{"location":"examples/postprocess/demo_em_extract_slice/","page":"Extract EM fields on a slice","title":"Extract EM fields on a slice","text":"(Image: Author) (Image: Update time)","category":"page"},{"location":"examples/postprocess/demo_em_extract_slice/","page":"Extract EM fields on a slice","title":"Extract EM fields on a slice","text":"To save Epar, Eperp, B in a selected slice region from 3D VLSV outputs,","category":"page"},{"location":"examples/postprocess/demo_em_extract_slice/","page":"Extract EM fields on a slice","title":"Extract EM fields on a slice","text":"using Vlasiator\nusing JLD2: jldsave\nusing StaticArrays\nusing LinearAlgebra: norm\n\nfunction getvars(meta::MetaVLSV, pArgs::Vlasiator.PlotArgs, normal::Symbol, range1, range2)\n (;origin, idlist, indexlist) = pArgs\n\n B = readvariable(meta, \"vg_b_vol\")\n\n Bout = @views refineslice(meta, idlist, B[:,indexlist], normal)[:, range1, range2]\n\n ncells = meta.ncells .* 2^meta.maxamr\n if normal == :x\n dir = 1\n elseif normal == :y\n dir = 2\n elseif normal == :z\n dir = 3\n else\n @error \"Unknown normal direction $normal\"\n end\n\n sliceratio = (origin - meta.coordmin[dir]) / (meta.coordmax[dir] - meta.coordmin[dir])\n 0.0 ≤ sliceratio ≤ 1.0 || error(\"slice plane index out of bound!\")\n # Find the cut plane index for each refinement level\n icut = floor(Int, sliceratio*ncells[dir]) + 1\n\n E = readvariable(meta, \"fg_e\", true, true)\n\n E = if normal == :x\n E[:,icut,range1,range2]\n elseif normal == :y\n E[:,range1,icut,range2]\n elseif normal == :z\n E[:,range1,range2,icut]\n end\n\n n2D = meta[\"n\"][indexlist]\n\n n = refineslice(meta, idlist, n2D, normal)[range1, range2]\n\n v2D = meta[\"proton/vg_v\"][:,indexlist]\n v = @views refineslice(meta, idlist, v2D, normal)[:, range1, range2]\n\n p2D = meta[\"P\"][indexlist]\n p = refineslice(meta, idlist, p2D, normal)[range1, range2]\n\n E, Bout, n, v, p\nend\n\nfunction main()\n # Parameters\n directory = \"/home/hongyang/runs/3D/EGI/bulk/dense_cold_hall1e5_afterRestart374/\"\n outdir = \"EM/\"\n outfile = \"EM.jld2\"\n\n files = filter(contains(r\"^bulk.*\\.vlsv$\"), readdir(directory))\n # Only orthogonal slices are supported\n normal = :y # (:x, :y, :z)\n origin = 0.0\n var = \"e\"\n axisunit = EARTH\n\n meta = load(files[1])\n\n pArgs = Vlasiator.set_args(meta, var, axisunit; normal, origin)\n\n x1, x2 = Vlasiator.get_axis(pArgs)\n\n extent = [-23., 12., -10., 10.]\n\n range1, range2 =\n searchsortedfirst(x1, extent[1]):searchsortedlast(x1, extent[2]),\n searchsortedfirst(x2, extent[3]):searchsortedlast(x2, extent[4])\n\n E = zeros(Float32, 3, length(range1), length(range2), length(files))\n B = zeros(Float32, 3, length(range1), length(range2), length(files))\n n = zeros(Float32, length(range1), length(range2), length(files))\n v = zeros(Float32, 3, length(range1), length(range2), length(files))\n p = zeros(Float32, length(range1), length(range2), length(files))\n\n for i in eachindex(files)\n meta = load(files[i])\n E[:,:,:,i], B[:,:,:,i], n[:,:,i], v[:,:,:,i], p[:,:,i] =\n getvars(meta, pArgs, normal, range1, range2)\n end\n\n # Save into binary file\n jldsave(outdir*outfile; E, B, n, v, p)\nend\n\nmain()","category":"page"},{"location":"examples/postprocess/demo_em_extract_slice/","page":"Extract EM fields on a slice","title":"Extract EM fields on a slice","text":"","category":"page"},{"location":"examples/postprocess/demo_em_extract_slice/","page":"Extract EM fields on a slice","title":"Extract EM fields on a slice","text":"This page was generated using DemoCards.jl.","category":"page"},{"location":"examples/visualization/demo_2dplot_pyplot/","page":"2D contour plot with streamlines and levels","title":"2D contour plot with streamlines and levels","text":"EditURL = \"/home/runner/work/Vlasiator.jl/Vlasiator.jl/docs/examples/visualization/demo_2dplot_pyplot.md\"","category":"page"},{"location":"examples/visualization/demo_2dplot_pyplot/#demo_2d_contour_streamline_levels","page":"2D contour plot with streamlines and levels","title":"2D contour plot with streamlines and levels","text":"","category":"section"},{"location":"examples/visualization/demo_2dplot_pyplot/","page":"2D contour plot with streamlines and levels","title":"2D contour plot with streamlines and levels","text":"(Image: Author) (Image: Update time)","category":"page"},{"location":"examples/visualization/demo_2dplot_pyplot/","page":"2D contour plot with streamlines and levels","title":"2D contour plot with streamlines and levels","text":"This demo shows how to plot 2D colored contour in a region of interest with streamlines and levels.","category":"page"},{"location":"examples/visualization/demo_2dplot_pyplot/","page":"2D contour plot with streamlines and levels","title":"2D contour plot with streamlines and levels","text":"using VlasiatorPyPlot\nusing Vlasiator: RE\n\nfunction main(file::String, varname::String)\n meta = load(file)\n\n fig, ax = plt.subplots(1,1; figsize=(8,6), constrained_layout=true)\n\n pcolormesh(meta, varname, ax)\n streamplot(meta, \"rho_v\", ax; comp=\"xy\", color=\"w\", density=2.0)\n\n cbar = ax.collections[end].colorbar\n boxcoords = Float64[0, 20, -15, 15]\n ax.set_xlim([boxcoords[1],boxcoords[2]])\n ax.set_ylim([boxcoords[3],boxcoords[4]])\n\n # Contour line at a specific level\n pArgs = Vlasiator.set_args(meta, varname, EARTH)\n x, y = Vlasiator.get_axis(pArgs)\n data = Vlasiator.prep2d(meta, varname)'\n CS = plt.contour(x, y, data, levels = [1e7],\n colors=(\"k\",),linestyles=(\"-\",),linewidths=(0.5,))\n\n # Add a rectangular box region\n boxrange = (250:299, 200:249)\n\n x = LinRange(meta.coordmin[1], meta.coordmax[1], meta.ncells[1])\n y = LinRange(meta.coordmin[2], meta.coordmax[2], meta.ncells[2])\n # Construct the patch\n rect = matplotlib.patches.Rectangle((x[boxrange[1][1]]/RE, y[boxrange[2][1]]/RE),\n (x[boxrange[1][end]] - x[boxrange[1][1]])/RE,\n (y[boxrange[2][end]] - y[boxrange[2][1]])/RE,\n linewidth=1, edgecolor=\"r\", facecolor=\"none\")\n\n ax.add_patch(rect)\nend\n\n\nfile = \"bulk.0000501.vlsv\"\nnameρ = \"rho\"\n\nmain(file, nameρ)","category":"page"},{"location":"examples/visualization/demo_2dplot_pyplot/","page":"2D contour plot with streamlines and levels","title":"2D contour plot with streamlines and levels","text":"","category":"page"},{"location":"examples/visualization/demo_2dplot_pyplot/","page":"2D contour plot with streamlines and levels","title":"2D contour plot with streamlines and levels","text":"This page was generated using DemoCards.jl.","category":"page"},{"location":"examples/visualization/demo_energy_spectrum/","page":"Energy spectrum at a fixed point","title":"Energy spectrum at a fixed point","text":"EditURL = \"/home/runner/work/Vlasiator.jl/Vlasiator.jl/docs/examples/visualization/demo_energy_spectrum.md\"","category":"page"},{"location":"examples/visualization/demo_energy_spectrum/#demo_energy_spectrum","page":"Energy spectrum at a fixed point","title":"Energy spectrum at a fixed point","text":"","category":"section"},{"location":"examples/visualization/demo_energy_spectrum/","page":"Energy spectrum at a fixed point","title":"Energy spectrum at a fixed point","text":"(Image: Author) (Image: Update time)","category":"page"},{"location":"examples/visualization/demo_energy_spectrum/","page":"Energy spectrum at a fixed point","title":"Energy spectrum at a fixed point","text":"This demo shows how to plot energy spectrum of oscillations at a fixed point.","category":"page"},{"location":"examples/visualization/demo_energy_spectrum/","page":"Energy spectrum at a fixed point","title":"Energy spectrum at a fixed point","text":"using FFTW, JLD2, CurveFit, PyPlot\nusing Vlasiator: RE\n\nfunction main()\n file = \"satellites_uniform_sampled.jld2\"\n data = JLD2.load(file)\n\n nSatellite = length(data[\"t\"])\n nI, nJ = size(data[\"rho\"])[2:3]\n\n t = data[\"t\"]\n # Select spatial point\n i, j = 5, 5\n var = data[\"rho\"][:,i,j]\n\n dt = t[2] - t[1] # uniform sample interval [s]\n Fs = 1 / dt # sample frequency, [Hz]\n Fn = Fs / 2 # Nyquist frequency, [Hz]\n\n ## Frequency calculation\n nPoints = length(var)\n nFFT = nPoints\n df = Fs / nFFT\n freq_fullrange = -Fn:df:Fn\n\n freq = freq_fullrange[(nPoints ÷ 2 + 1):end-1]\n\n var_freq = fft(var)\n var_power = abs.(fftshift(var_freq))[(nPoints ÷ 2 + 1):end]\n\n # k is the exponential coefficient\n a, k = @views power_fit(freq[10:end], var_power[10:end])\n\n figure(figsize=(6,8))\n loglog(freq, var_power)\n axis(\"scaled\")\n\n min_power, max_power = extrema(@view var_power[10:end])\n xlim(freq[8], Fs)\n ylim(min_power * 0.75, max_power * 2.0)\n\n xlabel(\"Frequency [Hz]\"; fontsize=14)\n ylabel(\"Power Density \"; fontsize=14)\n title(string(round.(data[\"locations\"][i,j]./RE, digits=1))*\"Re\"; fontsize=14)\n\n loglog(freq[10:end], a.*freq[10:end].^k, label=\"k = $(round(k, digits=1))\")\n\n legend()\nend\n\nmain()","category":"page"},{"location":"examples/visualization/demo_energy_spectrum/","page":"Energy spectrum at a fixed point","title":"Energy spectrum at a fixed point","text":"","category":"page"},{"location":"examples/visualization/demo_energy_spectrum/","page":"Energy spectrum at a fixed point","title":"Energy spectrum at a fixed point","text":"This page was generated using DemoCards.jl.","category":"page"},{"location":"examples/postprocess/demo_wave_tracing_mt/","page":"Track waves","title":"Track waves","text":"EditURL = \"/home/runner/work/Vlasiator.jl/Vlasiator.jl/docs/examples/postprocess/demo_wave_tracing_mt.md\"","category":"page"},{"location":"examples/postprocess/demo_wave_tracing_mt/#demo_track_waves","page":"Track waves","title":"Track waves","text":"","category":"section"},{"location":"examples/postprocess/demo_wave_tracing_mt/","page":"Track waves","title":"Track waves","text":"(Image: Author) (Image: Update time)","category":"page"},{"location":"examples/postprocess/demo_wave_tracing_mt/","page":"Track waves","title":"Track waves","text":"This demo shows how to track wave and plot the dispersion relation On a equatorial plane, B ∥ ẑ, we can choose an arbitrary line in-plane. On a meridional plane, B is in-plane, we can find a local line region ∥ B and ⟂ B.","category":"page"},{"location":"examples/postprocess/demo_wave_tracing_mt/","page":"Track waves","title":"Track waves","text":"Currently it only works on a equatorial plane.","category":"page"},{"location":"examples/postprocess/demo_wave_tracing_mt/","page":"Track waves","title":"Track waves","text":"Usage:","category":"page"},{"location":"examples/postprocess/demo_wave_tracing_mt/","page":"Track waves","title":"Track waves","text":"julia -t 4 demo_wave_tracing_mt.jl","category":"page"},{"location":"examples/postprocess/demo_wave_tracing_mt/","page":"Track waves","title":"Track waves","text":"or","category":"page"},{"location":"examples/postprocess/demo_wave_tracing_mt/","page":"Track waves","title":"Track waves","text":"JULIA_NUM_THREADS=4 julia demo_wave_tracing_mt.jl","category":"page"},{"location":"examples/postprocess/demo_wave_tracing_mt/","page":"Track waves","title":"Track waves","text":"using Vlasiator, VlasiatorPyPlot\nusing Vlasiator: qᵢ, μ₀, c, mᵢ, ϵ₀, RE\nusing DSP, FFTW, ImageFiltering, Interpolations\nusing Statistics: mean\nusing LinearAlgebra\n\n## Types\n\nstruct Variables\n varnames::Vector{String}\n varnames_print::Vector{String}\n components::Vector{Int}\nend\n\n## Methods\n\nispolar(meta::MetaVLSV) = findfirst(==(1), meta.ncells) == 2\n\n\"Extract `component` of variable `varname` at `cellids` from `files`.\"\nfunction extract_var(files, varname, cellids, distances, component=0)\n sample_loc = range(distances[1], distances[end], length=length(distances))\n\n var = zeros(length(distances), length(files))\n\n Threads.@threads for i in eachindex(files)\n meta = load(files[i])\n if component == 0\n var_line = readvariable(meta, varname, cellids)[:]\n else\n var_line = readvariable(meta, varname, cellids)[component,:]\n end\n #TODO: do we need high order interpolations?\n interp_linear = LinearInterpolation(distances, var_line)\n var_line_resample = interp_linear.(sample_loc)\n var_line_smooth = imfilter(var_line_resample, Kernel.gaussian((3,)))\n\n var[:,i] = var_line_smooth\n end\n var\nend\n\n\"CFL constrained normalized frequency.\"\ndispersion_CFL(k, dx, dt, di, ωci) = dx/dt * abs(k) /(di * ωci)\n\n\"Normalized frequency of fast magnetosonic waves along angle `θ` with Doppler shift.\"\nfunction dispersion_fast_perp(k, θ, vS, vA, v, di, ωci)\n ω = zeros(length(k))\n\n turnindex = findfirst(>=(0), k)\n\n vbulkpar = v[1]*cos(θ) + v[2]*sin(θ)\n\n dv1 = √(vS^2 + vA^2) + vbulkpar # propagate along +θ direction\n dv2 = -√(vS^2 + vA^2) + vbulkpar # propagate along -θ direction\n\n if dv1 < 0; dv1 = 0.0; end\n if dv2 > 0; dv2 = 0.0; end\n\n for i in 1:turnindex-1\n ω[i] = dv2*k[i] /(di * ωci)\n end\n\n for i in turnindex:length(k)\n ω[i] = dv1*k[i] /(di * ωci)\n end\n ω\nend\n\n\"Normalized frequency of bulk flow along tilted angle `θ`.\"\nfunction dispersion_bulk_flow(k, θ, v, di, ωci)\n ω = zeros(length(k))\n turnindex = findfirst(>=(0), k)\n vbulkpar = v[1]*cos(θ) + v[2]*sin(θ)\n irange = vbulkpar > 0 ? (turnindex:length(k)) : (1:turnindex)\n for i in irange # otherwise 0\n ω[i] = vbulkpar*k[i] /(di * ωci)\n end\n ω\nend\n\n\"Return the index in sorted `vec` with value closest to `x`.\"\nfunction searchsortednearest(vec, x)\n idx = searchsortedfirst(vec, x)\n if idx == 1\n return idx\n elseif idx > length(vec)\n return length(vec)\n elseif vec[idx] == x\n return idx\n elseif abs(vec[idx]-x) < abs(vec[idx-1]-x)\n return idx\n else\n return idx-1\n end\nend\n\n\"Obtain fast mode and bulk speed along line `angle` w.r.t. x-axis for cell ID `cid` in\n`meta`.\"\nfunction getCharacteristicSpeeds(meta, cid, angle)\n n = readvariable(meta, \"proton/vg_rho\", cid)\n B = readvariable(meta, \"vg_b_vol\", cid)\n p = readvariable(meta, \"vg_pressure\", cid)\n v = readvariable(meta, \"proton/vg_v\", cid)\n\n Bmag = norm.(eachcol(B))\n\n vA = @. Bmag / √(μ₀ * n * mᵢ) # Alfven speed, [m/s]\n vS = @. √(γ * p / (n * mᵢ)) # sonic speed, [m/s]\n\n vFast = @. √(vA^2 + vS^2)\n vBulk = @. v[1,:]*cos(angle) + v[2,:]*sin(angle)\n\n vFast, vBulk\nend\n\n\"Trace along line with `angle` w.r.t. x-axis at possible wave speeds.\"\nfunction tracewave(xstart, angle, files, dtfile, t, cellids, distances)\n\n x1 = zeros(length(t)); x1[1] = xstart\n x2 = copy(x1)\n x3 = copy(x1)\n\n tfile = let\n tfilefirst = getproperty(load(files[1]), :time)\n tfilelast = getproperty(load(files[end]), :time)\n tfilefirst:dtfile:tfilelast\n end\n\n ifile = 1 # file index tracker\n\n dt = t[2] - t[1] # timestep\n\n for it in eachindex(t)[1:end-1]\n # Find the closest output saving time to t[it], 0th order interpolation\n for i = ifile:length(tfile)\n if abs(tfile[i] - t[it]) < 0.5*dtfile\n ifile = i\n break\n end\n end\n meta = load(files[ifile])\n # Find the closest cell to the wave location\n cid = let\n c1 = searchsortednearest(distances, x1[it])\n c2 = searchsortednearest(distances, x2[it])\n c3 = searchsortednearest(distances, x3[it])\n cellids[c1], cellids[c2], cellids[c3]\n end\n vFast, vBulk = getCharacteristicSpeeds(meta, cid, angle)\n x1[it+1] = x1[it] + dt * vBulk[1]\n x2[it+1] = x2[it] + dt * (vBulk[2] + vFast[2])\n x3[it+1] = x3[it] + dt * (vBulk[3] - vFast[3])\n end\n\n x1, x2, x3\nend\n\n\"Evaluate the average quantities at `cellids` at the middle of `files`.\"\nfunction estimate_meanstates(files, cellids)\n # Select the snapshot in the middle\n nfile = length(files)\n meta = load(files[nfile÷2+1])\n\n n = readvariable(meta, \"proton/vg_rho\", cellids)\n v = readvariable(meta, \"proton/vg_v\", cellids)\n p = readvariable(meta, \"vg_pressure\", cellids)\n\n if hasvariable(meta, \"vg_b_vol\")\n B = readvariable(meta, \"vg_b_vol\", cellids)\n elseif hasvariable(meta, \"fg_b\")\n B = readvariable(meta, \"fg_b\", cellids)\n else\n B = readvariable(meta, \"b\", cellids)\n end\n\n vperp = @view v[1:2,:]\n vpar = @view v[3,:]\n\n # Obtain average states\n n̄ = mean(n)\n p̄ = mean(p)\n v̄par = mean(vpar)\n v̄perp = @views [mean(vperp[1,:]), mean(vperp[2,:])]\n\n # Characteristic parameters\n Bnorm = @views abs(mean(B[3,:]))\n di = √(mᵢ*ϵ₀/(n̄))*c/qᵢ # ion inertial length, [m]\n ωci = qᵢ*Bnorm/mᵢ # [/s]\n v̄A = Bnorm / √(μ₀ * n̄ * mᵢ) # Alfven speed, [m/s]\n v̄S = √(γ * p̄ / (n̄ * mᵢ)) # sonic speed, [m/s]\n\n println(\"--------------------------------------------------\")\n println(\"* Average states along the line at the middle snapshot\")\n println(\"Density : \", rpad(round(n̄/1e6; digits=2), 8), \"amu/cc\")\n println(\"Pressure : \", rpad(round(p̄*1e9; digits=3), 8), \"nPa\")\n println(\"Parallel velocity : \", rpad(round(v̄par/1e3; digits=2), 8), \"km/s\")\n println(\"Perpendicular velocity: \", rpad(round.(v̄perp/1e3; digits=2), 8), \"km/s\")\n println(\"Flow angle : \", rpad(round(atand(v̄perp[2], v̄perp[1]); digits=2), 8),\n \"degrees\")\n println(\"Ion inertial length : \", rpad(round(di/1e3; digits=2), 8), \"km\")\n println(\"Gyrofrequency : \", rpad(round(ωci; digits=2), 8), \"Hz\")\n println(\"Alfven speed : \", rpad(round(v̄A/1e3; digits=2), 8), \"km/s\")\n println(\"Sonic speed : \", rpad(round(v̄S/1e3; digits=2), 8), \"km/s\")\n println(\"--------------------------------------------------\")\n\n di, ωci, v̄A, v̄S, v̄perp\nend\n\n\"Plot the process of wave checks.\"\nfunction plot_dispersion(files, vars, cellids, distances, coords, meanstates, dtfile, Δt,\n outdir)\n\n # Parameters\n nfile = length(files)\n npoints = length(cellids)\n nt = nfile ÷ 2 + 1\n\n varnames = vars.varnames\n varnames_print = vars.varnames_print\n components = vars.components\n\n di, ωci, v̄A, v̄S, v̄perp = meanstates\n\n tfile1st = load(files[1]).time\n # Output timestamps\n t = [dtfile * ifile + tfile1st for ifile in 0:nfile-1]\n # Selected line tilted angle ∈ [-π, π]\n θ = atan(coords[2,end] - coords[2,1], coords[1,end] - coords[1,1])\n # Sample width, [m]\n dx = norm(coords[:,end] .- coords[:,1]) /(npoints - 1)\n println(\"spatial resolution: \", round(dx/1e3; digits=2), \" km\")\n\n # Trace wave along the line in a space-time domain\n twave = let\n tstart = 400.0\n tend = 430.0\n tstart:200Δt:tend\n end\n xwave = tracewave(distances[npoints÷2+1], θ, files, dtfile, twave, cellids, distances)\n\n twave2 = let\n tstart = 600.0\n tend = 630.0\n tstart:200Δt:tend\n end\n xwave2 = tracewave(distances[npoints÷2+1], θ, files, dtfile, twave2, cellids, distances)\n\n # Dispersion plotting ranges\n kmin = -π / dx * di # minimum wave number\n kmax = π / dx * di # maximum wave number\n ωmin = 0 # minimum angular frequency\n ωmax = π / dtfile / ωci # maximum angular frequency\n\n # Only the 1st quadrature\n krange = range(kmin, kmax, length=npoints)\n ωrange = range(ωmin, ωmax, length=nt)\n\n axisunit = EARTH\n\n # Precalculated lines\n ωCFL = dispersion_CFL.(krange, dx, Δt, di, ωci)\n ωfast = dispersion_fast_perp(krange, θ, v̄S, v̄A, v̄perp, di, ωci)\n ωbulk = dispersion_bulk_flow(krange, θ, v̄perp, di, ωci)\n # Window filtering for avoiding spectral leakage\n window = hanning(npoints) * hanning(nfile)'\n\n meta = load(files[end])\n\n for i in eachindex(varnames)\n println(\"variable name: \", varnames[i])\n var = extract_var(files, varnames[i], cellids, distances, components[i])\n\n # 2DFFT\n F̃ = window .* var |> fft |> fftshift\n\n # Visualization\n fig = figure(figsize=(12,12), constrained_layout=false)\n ax = [subplot(221), subplot(223), subplot(222), subplot(224, projection=\"3d\")]\n\n dispersion = reverse!(abs.(F̃.*F̃)[:, end-nt+1:end]', dims=1)\n im1 = ax[1].pcolormesh(krange, ωrange, dispersion, norm=matplotlib.colors.LogNorm())\n\n ax[1].plot([krange[1], 0.0, krange[end]], [ωCFL[1], 0.0, ωCFL[end]], \"--\",\n linewidth=1.0, color=\"k\", label=\"CFL Condition\")\n ax[1].plot(krange, ωfast, \"--\",\n linewidth=1.2, color=\"#d62728\", label=\"Fast Mode\")\n ax[1].plot(krange, ωbulk, \"--\",\n linewidth=1.2, color=\"#9467bd\", label=\"Flow Speed\")\n\n ax[1].set_xlim(kmin, kmax)\n ax[1].set_ylim(ωmin, ωmax)\n\n cb = colorbar(im1; ax=ax[1])\n cb.ax.tick_params(direction=\"in\")\n ax[1].legend(;fontsize=\"x-small\")\n ax[1].set_xlabel(L\"$k_\\perp \\cdot d_i$\")\n ax[1].set_ylabel(L\"$\\omega/\\Omega_{ci}$\")\n ax[1].set_title(L\"$k_\\perp$ angle w.r.t. x = %$θ\")\n\n im2 = ax[2].pcolormesh((distances .+ coords[1,1])./RE, t, var')\n\n ax[2].plot((xwave[1] .+ coords[1,1])./RE, twave, \".--\",\n color=\"#d62728\", label=L\"$V_{bulk}$\")\n ax[2].plot((xwave[2] .+ coords[1,1])./RE, twave, \".--\",\n color=\"#9467bd\", label=L\"$V_{bulk} + V_{fast}$\")\n ax[2].plot((xwave[3] .+ coords[1,1])./RE, twave, \".--\",\n color=\"#ff7f0e\", label=L\"$V_{bulk} - V_{fast}$\")\n\n ax[2].plot((xwave2[1] .+ coords[1,1])./RE, twave2, \".--\",\n color=\"#d62728\")\n ax[2].plot((xwave2[2] .+ coords[1,1])./RE, twave2, \".--\",\n color=\"#9467bd\")\n ax[2].plot((xwave2[3] .+ coords[1,1])./RE, twave2, \".--\",\n color=\"#ff7f0e\")\n\n cb = colorbar(im2; ax=ax[2])\n cb.ax.tick_params(direction=\"in\")\n\n ax[2].set_xlim(coords[1,1]/RE, coords[1,end]/RE)\n\n ax[2].legend(loc=\"upper center\", bbox_to_anchor=(0.5, -0.13),\n fancybox=true, shadow=true, ncol=3)\n ax[2].set_xlabel(L\"x [$R_E$]\")\n ax[2].set_ylabel(L\"time [s]\")\n ax[2].set_title(\"$(varnames_print[i])_$(components[i])\")\n\n pArgs = Vlasiator.set_args(meta, varnames[i], axisunit; normal=:none)\n x, y = Vlasiator.get_axis(pArgs)\n data = Vlasiator.prep2d(meta, varnames[i], components[i])'\n cnorm, cticks = set_colorbar(Linear, -Inf, Inf, data)\n cmesh = ax[3].pcolormesh(x, y, data, norm=cnorm)\n\n ax[3].set_xlabel(pArgs.strx)\n ax[3].set_ylabel(pArgs.stry)\n ax[3].set_aspect(1)\n\n cb = colorbar(cmesh; ax=ax[3], ticks=cticks, fraction=0.046, pad=0.04)\n cb.ax.set_ylabel(pArgs.cb_title)\n cb.ax.tick_params(direction=\"in\")\n\n @views ax[3].scatter(coords[1,:]./RE, coords[2,:]./RE; s=0.2, color=\"k\")\n\n xCoord = (distances .+ coords[1,1])./RE\n # meshgrid\n X = [x for _ in t, x in xCoord]\n Y = [y for y in t, _ in xCoord]\n\n ax[4].view_init(elev=40., azim=-30.)\n ax[4].plot_surface(X, Y, var', cmap=matplotlib.cm.turbo, antialiased=false)\n\n ax[4].set_xlabel(L\"x [$R_E$]\"; fontsize=\"small\")\n ax[4].set_ylabel(\"time [s]\"; fontsize=\"small\")\n #ax[4].set_zlabel(pArgs.cb_title)\n ax[4].tick_params(labelsize=\"small\")\n\n outname = \"dispersion_$(varnames_print[i])_$(components[i]).png\"\n savefig(joinpath(outdir, outname), bbox_inches=\"tight\")\n close(fig)\n end\n\nend\n\nfunction main()\n outdir = \"../out/\"\n γ = 5 / 3\n\n xStart = [10.0, 0.0, 0.0].*RE\n xEnd = [13.3, 0.0, 0.0].*RE\n\n varnames = [\"proton/vg_rho\", \"vg_b_vol\", \"vg_e_vol\", \"vg_pressure\"]\n varnames_print = [\"rho\", \"b\", \"e\", \"p\"]\n components = [0, 3, 1, 0] # 0 for scalar, 1-3 for vector components\n\n dir = \"../run_rho2_bz-5_timevarying_startfrom300s\"\n files = filter(contains(r\"^bulk.*\\.vlsv$\"), readdir(dir))\n\n vars = Variables(varnames, varnames_print, components)\n\n dtfile = 0.5 # output interval, [s]\n Δt = 0.0147176 # discrete time step from runlog, [s]\n\n meta = load(files[1])\n\n if ispolar(meta) # polar plane\n @error \"not implemented!\"\n end\n\n cellids, distances, coords = getcellinline(meta, xStart, xEnd)\n\n meanstates = estimate_meanstates(files, cellids)\n\n println(\"number of extracted points: \", length(cellids))\n println(\"xStart: \", xStart)\n println(\"xEnd: \", xEnd)\n tbegin = load(files[1]).time\n tend = load(files[end]).time\n println(\"time from $tbegin to $tend s\")\n\n @time plot_dispersion(files, vars, cellids, distances, coords, meanstates, dtfile, Δt,\n outdir)\nend\n\nmain()","category":"page"},{"location":"examples/postprocess/demo_wave_tracing_mt/","page":"Track waves","title":"Track waves","text":"","category":"page"},{"location":"examples/postprocess/demo_wave_tracing_mt/","page":"Track waves","title":"Track waves","text":"This page was generated using DemoCards.jl.","category":"page"},{"location":"examples/postprocess/demo_pointextracting/","page":"Virtual satellite","title":"Virtual satellite","text":"EditURL = \"/home/runner/work/Vlasiator.jl/Vlasiator.jl/docs/examples/postprocess/demo_pointextracting.md\"","category":"page"},{"location":"examples/postprocess/demo_pointextracting/#demo_virtual_sat","page":"Virtual satellite","title":"Virtual satellite","text":"","category":"section"},{"location":"examples/postprocess/demo_pointextracting/","page":"Virtual satellite","title":"Virtual satellite","text":"(Image: Author) (Image: Update time)","category":"page"},{"location":"examples/postprocess/demo_pointextracting/","page":"Virtual satellite","title":"Virtual satellite","text":"This demo shows how to extract data for a virtual satellite. Outputs are stored in CSV format for sharing data.","category":"page"},{"location":"examples/postprocess/demo_pointextracting/","page":"Virtual satellite","title":"Virtual satellite","text":"Usage:","category":"page"},{"location":"examples/postprocess/demo_pointextracting/","page":"Virtual satellite","title":"Virtual satellite","text":"julia -t nthreads demo_virtual_satellite.jl","category":"page"},{"location":"examples/postprocess/demo_pointextracting/","page":"Virtual satellite","title":"Virtual satellite","text":"or","category":"page"},{"location":"examples/postprocess/demo_pointextracting/","page":"Virtual satellite","title":"Virtual satellite","text":"JULIA_NUM_THREADS=nthreads julia demo_virtual_satellite.jl","category":"page"},{"location":"examples/postprocess/demo_pointextracting/","page":"Virtual satellite","title":"Virtual satellite","text":"using DelimitedFiles, Vlasiator, DataFrames\nusing Vlasiator: RE # Earth radius [m]\n\nfunction extract_vars(files, loc)\n nfiles = length(files)\n # variables to be extracted\n t = zeros(Float32, nfiles)\n rho = zeros(Float32, nfiles)\n v = zeros(Float32, 3, nfiles)\n p = zeros(Float32, nfiles)\n b = zeros(Float32, 3, nfiles)\n e = zeros(Float32, 3, nfiles)\n\n id = load(files[1]) do meta\n getcell(meta, loc)\n end\n\n # Extract data from each frame\n Threads.@threads for i = eachindex(files)\n meta = load(files[i])\n t[i] = meta.time\n rho[i] = readvariable(meta, \"proton/vg_rho\", id)[1]\n v[:,i] = readvariable(meta, \"proton/vg_v\", id)\n p[i] = readvariable(meta, \"vg_pressure\", id)[1]\n b[:,i] = readvariable(meta, \"vg_b_vol\", id)\n e[:,i] = readvariable(meta, \"vg_e_vol\", id)\n end\n\n df = DataFrame(t = t, rho = rho, v = v, p = p, b = b, e = e)\n # Save into text file\n writedlm(\"satellite.csv\", Iterators.flatten(([names(df)], eachrow(df))), ',')\nend\n\n#####\n\nfiles = filter(contains(r\"^bulk.*\\.vlsv$\"), readdir())\n\n# virtual satellite location\nconst loc = Float64[12, 0, 0] .* RE\n\nprintln(\"Number of files: $(length(files))\")\nprintln(\"Extracting location: $loc\")\nprintln(\"Running with $(Threads.nthreads()) threads...\")\n\n@time extract_vars(files, loc)\n\nprintln(\"Virtual satellite extraction done!\")\n\n## Visualization\n#=\nusing PyPlot, DelimitedFiles\n\ndata = readdlm(\"satellite.csv\", ','; header=true)\n\nfig, ax = subplots(figsize=(8,10), 5,1, sharex=true, constrained_layout=true)\n\nax[1].plot(data[1][:,1], data[1][:,2] ./ 1e6, label=\"density\")\nax[2].plot(data[1][:,1], data[1][:,3] ./ 1e3, label=\"vx\")\nax[2].plot(data[1][:,1], data[1][:,4] ./ 1e3, label=\"vy\")\nax[3].plot(data[1][:,1], data[1][:,5] .* 1e9, label=\"p\")\nax[4].plot(data[1][:,1], data[1][:,6] .* 1e9, label=\"bz\")\nax[5].plot(data[1][:,1], data[1][:,7] .* 1e3, label=\"ex\")\nax[5].plot(data[1][:,1], data[1][:,8] .* 1e3, label=\"ey\")\n\nfor a in ax\n a.grid(true)\n a.legend()\nend\n\nax[1].set_ylabel(\"density [amu/cc]\", fontsize=14)\nax[2].set_ylabel(\"velocity [km/s]\", fontsize=14)\nax[3].set_ylabel(\"pressure [nPa]\", fontsize=14)\nax[4].set_ylabel(\"magnetic field [nT]\", fontsize=14)\nax[5].set_ylabel(\"electric field [mV/m]\", fontsize=14)\nax[5].set_xlabel(\"time [s]\", fontsize=14)\n\nfig.suptitle(\"Density Pulse Run, location = [12, 0, 0]\", fontsize=\"xx-large\")\n\nsavefig(\"virtual_satellite.png\", bbox_inches=\"tight\")\n=#","category":"page"},{"location":"examples/postprocess/demo_pointextracting/","page":"Virtual satellite","title":"Virtual satellite","text":"","category":"page"},{"location":"examples/postprocess/demo_pointextracting/","page":"Virtual satellite","title":"Virtual satellite","text":"This page was generated using DemoCards.jl.","category":"page"},{"location":"examples/postprocess/demo_pointsextracting_2d_uniform/","page":"Virtual satellites","title":"Virtual satellites","text":"EditURL = \"/home/runner/work/Vlasiator.jl/Vlasiator.jl/docs/examples/postprocess/demo_pointsextracting_2d_uniform.md\"","category":"page"},{"location":"examples/postprocess/demo_pointsextracting_2d_uniform/#demo_2d_virtual_sats","page":"Virtual satellites","title":"Virtual satellites","text":"","category":"section"},{"location":"examples/postprocess/demo_pointsextracting_2d_uniform/","page":"Virtual satellites","title":"Virtual satellites","text":"(Image: Author) (Image: Update time)","category":"page"},{"location":"examples/postprocess/demo_pointsextracting_2d_uniform/","page":"Virtual satellites","title":"Virtual satellites","text":"This demo shows how to extract data for virtual satellites at uniformly sampled locations on a 2D plane. Outputs are stored in binary format for sharing within Julia.","category":"page"},{"location":"examples/postprocess/demo_pointsextracting_2d_uniform/","page":"Virtual satellites","title":"Virtual satellites","text":"using Vlasiator\nusing JLD2: jldsave\n\n\"Select cells in 2D `meta` with uniform distance `dx`.\"\nfunction sample(meta, dx)\n dcell = floor(Int, dx ÷ meta.dcoord[1])\n\n cellid = sort(collect(keys(meta.celldict)))\n cellid = reshape(cellid, meta.ncells[1], meta.ncells[2])\n cellid_select = cellid[1+dcell:dcell:end-dcell, 1+dcell:dcell:end-dcell]\nend\n\nfunction extract_vars(files, dx)\n nfiles = length(files)\n\n meta = load(files[1])\n ids = sample(meta, dx)\n locations = [getcellcoordinates(meta, id) for id in ids]\n\n nsize = size(ids)\n println(\"Number of virtual satellites: $(length(ids))\")\n\n # variables to be extracted\n t = zeros(Float32, nfiles)\n rho = zeros(Float32, nfiles, nsize[1], nsize[2])\n vx = zeros(Float32, nfiles, nsize[1], nsize[2])\n vy = zeros(Float32, nfiles, nsize[1], nsize[2])\n vz = zeros(Float32, nfiles, nsize[1], nsize[2])\n p = zeros(Float32, nfiles, nsize[1], nsize[2])\n bx = zeros(Float32, nfiles, nsize[1], nsize[2])\n by = zeros(Float32, nfiles, nsize[1], nsize[2])\n bz = zeros(Float32, nfiles, nsize[1], nsize[2])\n ex = zeros(Float32, nfiles, nsize[1], nsize[2])\n ey = zeros(Float32, nfiles, nsize[1], nsize[2])\n ez = zeros(Float32, nfiles, nsize[1], nsize[2])\n\n # Extract data from each frame\n for i = eachindex(files)\n meta = load(files[i])\n t[i] = meta.time\n rho[i,:,:] = readvariable(meta, \"proton/vg_rho\", ids)\n v = readvariable(meta, \"proton/vg_v\", ids)\n vx[i,:,:] = v[1,:]\n vy[i,:,:] = v[2,:]\n vz[i,:,:] = v[3,:]\n p[i,:,:] = readvariable(meta, \"vg_pressure\", ids)\n b = readvariable(meta, \"vg_b_vol\", ids)\n bx[i,:,:] = b[1,:]\n by[i,:,:] = b[2,:]\n bz[i,:,:] = b[3,:]\n e = readvariable(meta, \"vg_e_vol\", ids)\n ex[i,:,:] = e[1,:]\n ey[i,:,:] = e[2,:]\n ez[i,:,:] = e[3,:]\n end\n\n # Save into binary file\n jldsave(\"satellites_uniform_sampled.jld2\";\n locations, t, rho, vx, vy, vz, p, bx, by, bz, ex, ey, ez)\nend\n\n#####\n\nfiles = filter(contains(r\"^bulk.*\\.vlsv$\"), readdir())\n\nconst dx = 5RE # uniform sampling distance [m]\n\nprintln(\"Number of files: $(length(files))\")\nprintln(\"Running with $(Threads.nthreads()) threads...\")\n\n@time extract_vars(files, dx)\n\nprintln(\"Virtual satellite extraction done!\")","category":"page"},{"location":"examples/postprocess/demo_pointsextracting_2d_uniform/","page":"Virtual satellites","title":"Virtual satellites","text":"","category":"page"},{"location":"examples/postprocess/demo_pointsextracting_2d_uniform/","page":"Virtual satellites","title":"Virtual satellites","text":"This page was generated using DemoCards.jl.","category":"page"},{"location":"examples/visualization/demo_bowshock_2dlocation/","page":"Extracting bow shock location","title":"Extracting bow shock location","text":"EditURL = \"/home/runner/work/Vlasiator.jl/Vlasiator.jl/docs/examples/visualization/demo_bowshock_2dlocation.md\"","category":"page"},{"location":"examples/visualization/demo_bowshock_2dlocation/#demo_2d_bowshock","page":"Extracting bow shock location","title":"Extracting bow shock location","text":"","category":"section"},{"location":"examples/visualization/demo_bowshock_2dlocation/","page":"Extracting bow shock location","title":"Extracting bow shock location","text":"(Image: Author) (Image: Author) (Image: Update time)","category":"page"},{"location":"examples/visualization/demo_bowshock_2dlocation/","page":"Extracting bow shock location","title":"Extracting bow shock location","text":"This demo shows how to extract the bow shock location from a 2D equatorial run and plot.","category":"page"},{"location":"examples/visualization/demo_bowshock_2dlocation/","page":"Extracting bow shock location","title":"Extracting bow shock location","text":"using Vlasiator, PyPlot\n\n# Upstream solar wind temperature\nconst Tsw = 0.5e6 #[K]\n\nconst file = \"bulk.0001347.vlsv\"\nmeta = load(file)\n# NonAMR\nconst x = LinRange{Float32}(meta.coordmin[1], meta.coordmax[1], meta.ncells[1])\nconst y = LinRange{Float32}(meta.coordmin[2], meta.coordmax[2], meta.ncells[2])\n\n# Obtain thermal temperature\nT = meta[\"T\"]\nT = reshape(T, meta.ncells[1], meta.ncells[2])\n\nconst x_crossing = zeros(Float32, meta.ncells[2])\nconst y_crossing = y\n\n# Extract bow shock location from the 1st point which fulfills the threshold: T > 4 * Tsw\n# Note: this won't work if the bow shock does not cover the whole domain y extension!\nfor j in 1:meta.ncells[2] # scan in y direction\n ind_ = findlast(>(4*Tsw), @view T[:,j]) # count from upstream\n x_crossing[j] = x[ind_]\nend\n\n# Julia is column-major, while Python is row-major\nimshow(T', extent=(x[1], x[end], y[1], y[end]), origin=\"lower\", cmap=plt.get_cmap(\"ocean\"))\nplot(x_crossing, y_crossing, \"r\")\naxis(\"scaled\")\nsavefig(\"bs_temp_test.png\")","category":"page"},{"location":"examples/visualization/demo_bowshock_2dlocation/","page":"Extracting bow shock location","title":"Extracting bow shock location","text":"","category":"page"},{"location":"examples/visualization/demo_bowshock_2dlocation/","page":"Extracting bow shock location","title":"Extracting bow shock location","text":"This page was generated using DemoCards.jl.","category":"page"},{"location":"examples/visualization/demo_vdfs_pyplot/","page":"VDFs along a line","title":"VDFs along a line","text":"EditURL = \"/home/runner/work/Vlasiator.jl/Vlasiator.jl/docs/examples/visualization/demo_vdfs_pyplot.md\"","category":"page"},{"location":"examples/visualization/demo_vdfs_pyplot/#demo_vdfs","page":"VDFs along a line","title":"VDFs along a line","text":"","category":"section"},{"location":"examples/visualization/demo_vdfs_pyplot/","page":"VDFs along a line","title":"VDFs along a line","text":"(Image: Author) (Image: Update time)","category":"page"},{"location":"examples/visualization/demo_vdfs_pyplot/","page":"VDFs along a line","title":"VDFs along a line","text":"This demo shows how to plot velocity distribution functions along a line.","category":"page"},{"location":"examples/visualization/demo_vdfs_pyplot/","page":"VDFs along a line","title":"VDFs along a line","text":"using VlasiatorPyPlot, JLD2\nusing Vlasiator: RE # Earth radius [m]\n\nfunction main()\n ## Plot velocity space distributions\n xloc = range(7.0, 10.0, step=2.35)\n yloc = range(-0.0, 5.0, step=2.35)\n zloc = 0.0\n\n CIs = CartesianIndices((1:length(xloc), 1:length(yloc)))\n\n fig, axs = plt.subplots(length(xloc), length(yloc), sharex=true, sharey=true)\n\n for i in CIs\n loc = RE .* [xloc[i[1]], yloc[i[2]], zloc]\n vdfslice(meta, loc, axs[i]; verbose=false)\n end\n\n for a in axs[end,:] a.set_xlabel(\"vx [km/s]\") end\n for a in axs[: ,1] a.set_ylabel(\"vy [km/s]\") end\n\n ## Subtract data of cells with VDF\n\n file = \"test/data/bulk.1d.vlsv\"\n meta = load(file)\n species = \"proton\"\n\n init_cellswithVDF!(meta, species)\n cells = meta.meshes[species].cellwithVDF\n\n ρ = zeros(Float64, size(cells))\n v = zeros(Float64, 3, size(cells)...)\n p = zeros(Float64, size(cells))\n\n vsize = meta.meshes[\"proton\"].vblocksize .* meta.meshes[\"proton\"].vblocks\n vcellids = [Int[] for _ in cells]\n vcellf = [Float64[] for _ in cells]\n\n for (i, cell) in enumerate(cells)\n ρ[i] = readvariable(meta, \"proton/vg_rho\", cell)[1]\n v[i] = readvariable(meta, \"proton/vg_v\", cell)[1]\n p[i] = readvariable(meta, \"vg_pressure\", cell)[1]\n\n vcellids[i], vcellf[i] = readvcells(meta, cell)\n end\n\n jldopen(\"example.jld2\", \"a+\") do file\n file[\"file1/density\"] = ρ\n file[\"file1/velocity\"] = v\n file[\"file1/pressure\"] = p\n file[\"file1/VDF\"] = vcellf\n end\nend\n\nmain()","category":"page"},{"location":"examples/visualization/demo_vdfs_pyplot/","page":"VDFs along a line","title":"VDFs along a line","text":"","category":"page"},{"location":"examples/visualization/demo_vdfs_pyplot/","page":"VDFs along a line","title":"VDFs along a line","text":"This page was generated using DemoCards.jl.","category":"page"},{"location":"examples/postprocess/demo_x_points_extracting/","page":"Find X-points in 2D","title":"Find X-points in 2D","text":"EditURL = \"/home/runner/work/Vlasiator.jl/Vlasiator.jl/docs/examples/postprocess/demo_x_points_extracting.md\"","category":"page"},{"location":"examples/postprocess/demo_x_points_extracting/#demo_xpoints","page":"Find X-points in 2D","title":"Find X-points in 2D","text":"","category":"section"},{"location":"examples/postprocess/demo_x_points_extracting/","page":"Find X-points in 2D","title":"Find X-points in 2D","text":"(Image: Author) (Image: Update time)","category":"page"},{"location":"examples/postprocess/demo_x_points_extracting/","page":"Find X-points in 2D","title":"Find X-points in 2D","text":"This example shows how to find X-points in a 2D magnetic reconnection configuration and save the coordinates as well as extracted reconnection rate Ey from multiple outputs. Here we assume a X-Z plane.","category":"page"},{"location":"examples/postprocess/demo_x_points_extracting/","page":"Find X-points in 2D","title":"Find X-points in 2D","text":"using JLD2: jldsave\nusing Vlasiator, ProgressMeter\n\nfunction main()\n files = filter(contains(r\"^bulk.*\\.vlsv$\"), readdir())\n\n nG = 2 # number of ghost cells\n\n x, z, dx = load(files[1]) do meta\n LinRange(meta.coordmin[1], meta.coordmax[1], meta.ncells[1]) ./ Vlasiator.RE,\n LinRange(meta.coordmin[3], meta.coordmax[3], meta.ncells[3]) ./ Vlasiator.RE,\n [meta.dcoord[1], meta.dcoord[3]]\n end\n\n xmin_ = searchsortedfirst(x, 7.0)\n xmax_ = searchsortedlast(x, 9.0)\n zmin_ = searchsortedfirst(z, -4.0)\n zmax_ = searchsortedlast(z, 4.0)\n\n x_points_x = Vector{Vector{eltype(x)}}(undef, 0)\n x_points_z = similar(x_points_x)\n\n @showprogress 5 \"Finding X-points...\" for ifile in eachindex(files)\n meta = load(files[ifile])\n b = meta[\"vg_b_vol\"]\n b = reshape(b, 3, meta.ncells[1], meta.ncells[3])\n\n flux = compute_flux_function(b, dx, nG)\n indices_x, _ = find_reconnection_points(flux[xmin_:xmax_,zmin_:zmax_], 5e-3)\n\n push!(x_points_x, x[indices_x[1,:].+xmin_.-1])\n push!(x_points_z, z[indices_x[2,:].+zmin_.-1])\n end\n\n ## Extract Ey at X-points\n ey = Vector{Vector{Float32}}(undef, 0)\n\n for it in eachindex(x_points_x)\n meta = load(files[it])\n ids = Vector{Int}(undef, length(x_points_x[it]))\n for ip in eachindex(x_points_x[it])\n loc = [x_points_x[it][ip], 0.0, x_points_z[it][ip]] .* Vlasiator.RE\n ids[ip] = getcell(meta, loc)\n end\n ey_now = readvariable(meta, \"vg_e_vol\", ids)[2,:]\n push!(ey, ey_now)\n end\n\n # save\n jldsave(\"x_point_locations.jld2\"; x_points_x, x_points_z, ey)\nend\n\nmain()","category":"page"},{"location":"examples/postprocess/demo_x_points_extracting/","page":"Find X-points in 2D","title":"Find X-points in 2D","text":"","category":"page"},{"location":"examples/postprocess/demo_x_points_extracting/","page":"Find X-points in 2D","title":"Find X-points in 2D","text":"This page was generated using DemoCards.jl.","category":"page"},{"location":"internal/#Internal","page":"API Reference","title":"Internal","text":"","category":"section"},{"location":"internal/#Public-APIs","page":"API Reference","title":"Public APIs","text":"","category":"section"},{"location":"internal/","page":"API Reference","title":"API Reference","text":"Modules = [Vlasiator]\nPrivate = false\nOrder = [:constant, :type, :function]","category":"page"},{"location":"internal/#Vlasiator.MetaVLSV","page":"API Reference","title":"Vlasiator.MetaVLSV","text":"VLSV meta data.\n\n\n\n\n\n","category":"type"},{"location":"internal/#Vlasiator.VarInfo","page":"API Reference","title":"Vlasiator.VarInfo","text":"Variable information from the VLSV footer.\n\n\n\n\n\n","category":"type"},{"location":"internal/#Vlasiator.check_plasma_characteristics-NTuple{4, Any}","page":"API Reference","title":"Vlasiator.check_plasma_characteristics","text":"check_plasma_characteristics(n, v, T, B)\n\nDisplay characteristic plasma parameters given density n, bulk velocity v, temperature T, and magnetic field strength B in SI units.\n\n\n\n\n\n","category":"method"},{"location":"internal/#Vlasiator.compute_flux_function-Union{Tuple{N}, Tuple{T}, Tuple{AbstractArray{T, N}, Vector{T}}, Tuple{AbstractArray{T, N}, Vector{T}, Int64}} where {T, N}","page":"API Reference","title":"Vlasiator.compute_flux_function","text":"compute_flux_function(b::AbstractArray{T,N}, Δ::Vector{T}, nG::Int=2) where {T,N}\n\nCalculate the 2D magnetic flux function ψ from the magnetic field b and discrete steps Δ. nG is the number of ghost cells along each dimension in the vector field. ψ is defined as psi = int B_x dz = - int B_z dx from mathbfB = hatytimesnablapsi in the X-Z plane and Y is the out-of-plane direction. This is strictly true if B is divergence-free and the guide field By is constant. However, numerically there will be errors. The current implementation calculates ψ by integrating along -z boundary first, and then going along z. Reference: Flux function\n\n\n\n\n\n","category":"method"},{"location":"internal/#Vlasiator.extractsat-Tuple{AbstractVector{String}, String, Int64}","page":"API Reference","title":"Vlasiator.extractsat","text":"extractsat(files::AbstractVector{String}, var::String, cid::Int)\n\nMulti-threaded extraction of var at a fixed cell ID cid from files. This assumes that files come from the same grid structure.\n\n\n\n\n\n","category":"method"},{"location":"internal/#Vlasiator.find_reconnection_points-Union{Tuple{Matrix{T}}, Tuple{T}} where T","page":"API Reference","title":"Vlasiator.find_reconnection_points","text":"find_reconnection_points(ψ::Array{T,2}; retol::Float64=1e-4,\n method::Int=1) -> indices_x, indices_o\n\nFind X-point and O-point indices in 2D magnetic field topology from flux function ψ. The current implementation does not work for the 3 layers near the boundary.\n\nKeywords\n\nretol=1e-1: determines the relative tolerance of the ratio w.r.t. |∇ψ|² to accept a gradient as 0.\nmethod=1: method 1 compute the cell-centered 1st and 2nd order derivatives and check the Hessian matrix; method 2 check the flux function at each point against its 8 neighbors, which is more deterministic.\n\n\n\n\n\n","category":"method"},{"location":"internal/#Vlasiator.getKLdivergence-Tuple{MetaVLSV, Array{<:AbstractFloat}}","page":"API Reference","title":"Vlasiator.getKLdivergence","text":"getKLdivergence(meta, VDF; species=\"proton\")\ngetKLdivergence(meta, vcellids, vcellf; species=\"proton\")\n\nObtain the KL-divergence ∫ f*log(f/g)dv, where f is the VDF from Vlasiator and g is the analytical Maxwellian distribution that generates the same density as f. The value ranges from [0, +∞], with 0 meaning perfect Maxwellian. Usually the values are quite small. Alternatively, one can pass original vcellids and vcellf directly.\n\n\n\n\n\n","category":"method"},{"location":"internal/#Vlasiator.getcell-Tuple{MetaVLSV, AbstractVector{<:AbstractFloat}}","page":"API Reference","title":"Vlasiator.getcell","text":"getcell(meta::MetaVLSV, location:::AbstractVector{<:AbstractFloat}) -> Int\n\nReturn cell ID containing the given spatial location in meter, excluding domain boundaries. Only accept 3D location.\n\n\n\n\n\n","category":"method"},{"location":"internal/#Vlasiator.getcellcoordinates-Tuple{MetaVLSV, Int64}","page":"API Reference","title":"Vlasiator.getcellcoordinates","text":"getcellcoordinates(meta::MetaVLSV, cid::Int) -> SVector{3,Float64}\n\nReturn a given cell's spatial coordinates.\n\n\n\n\n\n","category":"method"},{"location":"internal/#Vlasiator.getcellinline-Union{Tuple{T}, Tuple{MetaVLSV, Vector{T}, Vector{T}}} where T","page":"API Reference","title":"Vlasiator.getcellinline","text":"getcellinline(meta, point1::Vector, point2::Vector) -> cellids, distances, coords\n\nReturns cell IDs, distances and coordinates for every cell in a line between two given points point1 and point2. TODO: preallocation?\n\n\n\n\n\n","category":"method"},{"location":"internal/#Vlasiator.getchildren-Tuple{MetaVLSV, Int64}","page":"API Reference","title":"Vlasiator.getchildren","text":"getchildren(meta::MetaVLSV, cid::Int) -> Vector{Int}\n\nReturn direct children of cid.\n\n\n\n\n\n","category":"method"},{"location":"internal/#Vlasiator.getdensity-Union{Tuple{T}, Tuple{MetaVLSV, Array{T}}} where T<:AbstractFloat","page":"API Reference","title":"Vlasiator.getdensity","text":"getdensity(meta, VDF; species=\"proton\")\ngetdensity(meta, vcellf; species=\"proton\")\ngetdensity(vmesh::VMeshInfo, vcellf)\n\nGet density from VDF of species associated with meta, n = ∫ f(r,v) dV. Alternatively, one can directly pass vcellids as original indices of nonzero VDFs and vcellf as their corresponding values.\n\n\n\n\n\n","category":"method"},{"location":"internal/#Vlasiator.getheatfluxvector-Union{Tuple{T}, Tuple{MetaVLSV, Array{T}}} where T<:AbstractFloat","page":"API Reference","title":"Vlasiator.getheatfluxvector","text":"getheatfluxvector(meta, VDF; species=\"proton\")\ngetheatfluxvector(meta, vcellids, vcellf; species=\"proton\")\ngetheatfluxvector(vmesh::VMeshInfo, vcellids, vcellf)\n\nGet heat flux vector (3 components) of species from VDF associated with meta, qᵢ = m/2 * ∫ (v - u)²(v - u)ᵢ * f(r,v) dV. Alternatively, one can directly pass vcellids, vcellf, as in getdensity.\n\n\n\n\n\n","category":"method"},{"location":"internal/#Vlasiator.getlevel-Tuple{MetaVLSV, Int64}","page":"API Reference","title":"Vlasiator.getlevel","text":"getlevel(meta::MetaVLSV, cid::Int) -> Int\n\nReturn the AMR level of a given cell ID cid.\n\nwarning: Warning\nThis function does not check if the VLSV file of meta actually contains cid; it may be shadowed by refined children.\n\n\n\n\n\n","category":"method"},{"location":"internal/#Vlasiator.getmaxwellianity-Tuple{MetaVLSV, Array{<:AbstractFloat}}","page":"API Reference","title":"Vlasiator.getmaxwellianity","text":"getmaxwellianity(meta, VDF; species=\"proton\")\ngetmaxwellianity(meta, vcellids, vcellf; species=\"proton\")\n\nObtain the Maxwellian similarity factor -log(1/(2n) * ∫ |f - g| dv), where f is the VDF from Vlasiator and g is the analytical Maxwellian distribution that generates the same density as f. The value ranges from [0, +∞], with 0 meaning not Maxwellian-distributed at all, and +∞ a perfect Maxwellian distribution. Alternatively, one can pass original vcellids and vcellf directly.\n\n\n\n\n\n","category":"method"},{"location":"internal/#Vlasiator.getnearestcellwithvdf","page":"API Reference","title":"Vlasiator.getnearestcellwithvdf","text":"getnearestcellwithvdf(meta, id::Int, species::String=\"proton\") -> Int\n\nFind the nearest spatial cell with VDF saved for species of a given cell id associated with meta.\n\n\n\n\n\n","category":"function"},{"location":"internal/#Vlasiator.getparent-Tuple{MetaVLSV, Int64}","page":"API Reference","title":"Vlasiator.getparent","text":"getparent(meta::MetaVLSV, cid::Int) -> Int\n\nReturn the parent cell ID of given child cid.\n\n\n\n\n\n","category":"method"},{"location":"internal/#Vlasiator.getpressure-Union{Tuple{T}, Tuple{MetaVLSV, Array{T}}} where T<:AbstractFloat","page":"API Reference","title":"Vlasiator.getpressure","text":"getpressure(meta, VDF; species=\"proton\")\ngetpressure(meta, vcellids, vcellf; species=\"proton\")\ngetpressure(vmesh::VMeshInfo, vcellids, vcellf)\n\nGet pressure tensor (6 components: Pxx, Pyy, Pzz, Pyz, Pzx, Pxy) of species from VDF associated with meta, pᵢⱼ = m * ∫ (v - u)ᵢ(v - u)ⱼ * f(r,v) dV. Alternatively, one can directly pass vcellids, vcellf, as in getdensity.\n\n\n\n\n\n","category":"method"},{"location":"internal/#Vlasiator.getsiblings-Tuple{MetaVLSV, Int64}","page":"API Reference","title":"Vlasiator.getsiblings","text":"getsiblings(meta::MetaVLSV, cid::Int) -> Vector{Int}\n\nReturn sibling cells of a given cid, including itself.\n\n\n\n\n\n","category":"method"},{"location":"internal/#Vlasiator.getslicecell-Tuple{MetaVLSV, Float64, Int64, Float64, Float64}","page":"API Reference","title":"Vlasiator.getslicecell","text":"getslicecell(meta, sliceoffset, dir, minCoord, maxCoord) -> idlist, indexlist\n\nFind the cell IDs idlist which are needed to plot a 2d cut through of a 3d mesh, in a direction dir at sliceoffset, and the indexlist, which is a mapping from original order to the cut plane and can be used to select data onto the plane.\n\n\n\n\n\n","category":"method"},{"location":"internal/#Vlasiator.getvcellcoordinates-Tuple{MetaVLSV, Vector{Int32}}","page":"API Reference","title":"Vlasiator.getvcellcoordinates","text":"getvcellcoordinates(meta::MetaVLSV, vcellids::Vector; species=\"proton\")\n\nReturn velocity cells' coordinates of species and vcellids.\n\n\n\n\n\n","category":"method"},{"location":"internal/#Vlasiator.getvelocity-Union{Tuple{T}, Tuple{MetaVLSV, Array{T}}} where T<:AbstractFloat","page":"API Reference","title":"Vlasiator.getvelocity","text":"getvelocity(meta, VDF; species=\"proton\")\ngetvelocity(meta, vcellids, vcellf; species=\"proton\")\ngetvelocity(vmesh::VMeshInfo, vcellids, vcellf)\n\nGet bulk velocity from VDF of species, u = ∫ v * f(r,v) dV / n. Alternatively, one can directly pass vcellids, vcellf, as in getdensity.\n\n\n\n\n\n","category":"method"},{"location":"internal/#Vlasiator.hasname-Tuple{SubArray{XML.Node, 1, Vector{XML.Node}, Tuple{UnitRange{Int64}}, true}, String}","page":"API Reference","title":"Vlasiator.hasname","text":"Check if the XML nodes ns contain a node of name.\n\n\n\n\n\n","category":"method"},{"location":"internal/#Vlasiator.hasparameter-Tuple{MetaVLSV, String}","page":"API Reference","title":"Vlasiator.hasparameter","text":"hasparameter(meta::MetaVLSV, param::String) -> Bool\n\nCheck if the VLSV file contains a certain parameter param.\n\n\n\n\n\n","category":"method"},{"location":"internal/#Vlasiator.hasvariable-Tuple{MetaVLSV, String}","page":"API Reference","title":"Vlasiator.hasvariable","text":"hasvariable(meta::MetaVLSV, var::String) -> Bool\n\nCheck if the VLSV file associated with meta contains a variable var.\n\n\n\n\n\n","category":"method"},{"location":"internal/#Vlasiator.isparent-Tuple{MetaVLSV, Int64}","page":"API Reference","title":"Vlasiator.isparent","text":"isparent(meta::MetaVLSV, cid::Int) -> Bool\n\nCheck if cid is a parent cell.\n\n\n\n\n\n","category":"method"},{"location":"internal/#Vlasiator.issame","page":"API Reference","title":"Vlasiator.issame","text":"issame(file1, file2, tol=1e-4; strict=true, verbose=false) -> Bool\n\nCheck if two VLSV files file1 and file2 are approximately identical, under relative tolerance tol. If strict=true, the file size difference should be less than 1%.\n\n\n\n\n\n","category":"function"},{"location":"internal/#Vlasiator.load-Tuple{AbstractString}","page":"API Reference","title":"Vlasiator.load","text":"load(file::AbstractString)) -> MetaVLSV\n\nGenerate a MetaVLSV object from file of VLSV format.\n\n\n\n\n\n","category":"method"},{"location":"internal/#Vlasiator.readlog-Tuple{AbstractString}","page":"API Reference","title":"Vlasiator.readlog","text":"readlog(file::AbstractString)\n\nRead the run log file, check the iteration status and return the timestamps (exluding the last) as well as the model running speed in physical seconds per simulated seconds.\n\n\n\n\n\n","category":"method"},{"location":"internal/#Vlasiator.readparameter-Tuple{MetaVLSV, String}","page":"API Reference","title":"Vlasiator.readparameter","text":"readparameter(meta::MetaVLSV, param::String)\n\nReturn the parameter value from the VLSV file associated with meta.\n\n\n\n\n\n","category":"method"},{"location":"internal/#Vlasiator.readvariable","page":"API Reference","title":"Vlasiator.readvariable","text":"readvariable(meta::MetaVLSV, var::String, sorted::Bool=true, usemmap::Bool=false) -> Array\n\nReturn variable value of var from the VLSV file associated with meta. By default for DCCRG variables are sorted by cell ID. usemmap decides whether to use memory-mapped IO, which is especially useful for large arrays.\n\n\n\n\n\n","category":"function"},{"location":"internal/#Vlasiator.readvariable-Tuple{MetaVLSV, String, Int64}","page":"API Reference","title":"Vlasiator.readvariable","text":"readvariable(meta::MetaVLSV, var::String, cid::Int) -> Array\n\nRead variable var in cell cid associated with meta.\n\n\n\n\n\n","category":"method"},{"location":"internal/#Vlasiator.readvariable-Tuple{MetaVLSV, String, Vector{Int64}}","page":"API Reference","title":"Vlasiator.readvariable","text":"readvariable(meta::MetaVLSV, var::String, ids::Vector{Int}) -> Array\n\nRead variable var in a collection of cells ids associated with meta. if ids is empty, return the whole sorted array of var.\n\n\n\n\n\n","category":"method"},{"location":"internal/#Vlasiator.readvariablemeta-Tuple{MetaVLSV, String}","page":"API Reference","title":"Vlasiator.readvariablemeta","text":"readvariablemeta(meta, var) -> VarInfo\n\nReturn VarInfo of var in the VLSV file associated with meta.\n\n\n\n\n\n","category":"method"},{"location":"internal/#Vlasiator.readvcells-Tuple{MetaVLSV, Int64}","page":"API Reference","title":"Vlasiator.readvcells","text":"readvcells(meta::MetaVLSV, cid::Int; species=\"proton\") -> vcellids, vcellf\n\nRead velocity cells of species from a spatial cell of ID cid associated with meta, and return a map of velocity cell ids vcellids and corresponding value vcellf.\n\n\n\n\n\n","category":"method"},{"location":"internal/#Vlasiator.refineslice-Tuple{MetaVLSV, Vector{Int64}, AbstractVector, Symbol}","page":"API Reference","title":"Vlasiator.refineslice","text":"refineslice(meta, idlist::Vector{Int}, data::AbstractVector, normal::Symbol) -> Vector\nrefineslice(meta, idlist::Vector{Int}, data::AbstractMatrix, normal::Symbol) -> Matrix\nrefineslice(meta, idlist::Vector{Int}, data::AbstractArray, dir::Int)\n\nGenerate data on the finest refinement level given cellids idlist and variable data on the slice perpendicular to normal. If data is 2D, then the first dimension is treated as vector components.\n\n\n\n\n\n","category":"method"},{"location":"internal/#Vlasiator.vdfvolume","page":"API Reference","title":"Vlasiator.vdfvolume","text":"vdfvolume(meta, location; species=\"proton\", unit=SI, flimit=-1.0, verbose=false)\n\nMeshscatter plot of VDFs in 3D.\n\n\n\n\n\n","category":"function"},{"location":"internal/#Vlasiator.viz","page":"API Reference","title":"Vlasiator.viz","text":"viz(meta, var; args)\n\nVisualize Vlasiator output var in meta with various options:\n\nKeyword arguments\n\naxisunit - unit of axis of type AxisUnit\ncolorscale - scale of colormap of type ColorScale\nnormal - slice normal direction\nvmin - minimum color value\nvmax - maximum color value\ncomp - selection of vector components\n\nNotes\n\nThis function will only work in the presence of a Makie.jl backend via package extensions in Julia v1.9 or later versions of the language.\n\n\n\n\n\n","category":"function"},{"location":"internal/#Vlasiator.viz!","page":"API Reference","title":"Vlasiator.viz!","text":"viz!(meta, var; args)\n\nVisualize Meshes.jl object in an existing scene with options forwarded to viz.\n\n\n\n\n\n","category":"function"},{"location":"internal/#Vlasiator.vlslices","page":"API Reference","title":"Vlasiator.vlslices","text":"vlslices(meta::MetaVLSV, var; axisunit=SI, comp=0, origin=[0.0, 0.0, 0.0])\n\nThree orthogonal slices of var from meta.\n\n\n\n\n\n","category":"function"},{"location":"internal/#Vlasiator.write_vlsv-Tuple{AbstractString, AbstractString, Vector{Tuple{VecOrMat, String, VarInfo}}}","page":"API Reference","title":"Vlasiator.write_vlsv","text":"write_vlsv(filein, fileout, newvars::Vector{Tuple{Vector, String, VarInfo}};\n force=false)\n\nGenerate a new VLSV fileout based on filein, with newvars added. force=true overwrites the existing fileout.\n\n\n\n\n\n","category":"method"},{"location":"internal/#Vlasiator.write_vtk-Tuple{MetaVLSV}","page":"API Reference","title":"Vlasiator.write_vtk","text":"write_vtk(meta::MetaVLSV; kwargs...)\nwrite_vtk(file::AbstractString; kwargs...)\n\nConvert VLSV file to VTK format.\n\nKeywords\n\nvars::Vector{String}=[\"\"]: select which variables to convert.\nascii::Bool=false: output stored in ASCII or compressed binary format.\nmaxamronly::Bool=false: generate image files on the highest refinement level only.\nbox::Vector: selected box range in 3D.\noutdir::String=\"\": output directory.\nverbose::Bool=false: display logs during conversion.\n\n\n\n\n\n","category":"method"},{"location":"internal/#PyPlot-Wrapper-APIs","page":"API Reference","title":"PyPlot Wrapper APIs","text":"","category":"section"},{"location":"internal/","page":"API Reference","title":"API Reference","text":"VlasiatorPyPlot has been moved to a standalone package in a subdirectory.","category":"page"},{"location":"internal/#Private-APIs","page":"API Reference","title":"Private APIs","text":"","category":"section"},{"location":"internal/","page":"API Reference","title":"API Reference","text":"Modules = [Vlasiator]\nPublic = false","category":"page"},{"location":"internal/#Vlasiator.AxisUnit","page":"API Reference","title":"Vlasiator.AxisUnit","text":"Axis unit type. Currently supported: SI, EARTH.\n\n\n\n\n\n","category":"type"},{"location":"internal/#Vlasiator.ColorScale","page":"API Reference","title":"Vlasiator.ColorScale","text":"Color scales type for 2D plots. Currently supported: Log, Linear, SymLog.\n\n\n\n\n\n","category":"type"},{"location":"internal/#Vlasiator.PlotArgs","page":"API Reference","title":"Vlasiator.PlotArgs","text":"Plotting arguments.\n\n\n\n\n\n","category":"type"},{"location":"internal/#Base.isopen-Tuple{MetaVLSV}","page":"API Reference","title":"Base.isopen","text":"Determine whether meta is not yet closed.\n\n\n\n\n\n","category":"method"},{"location":"internal/#Base.ndims-Tuple{MetaVLSV}","page":"API Reference","title":"Base.ndims","text":"ndims(meta::MetaVLSV) -> Int\n\nReturn the simulation spatial dimension of VLSV data.\n\n\n\n\n\n","category":"method"},{"location":"internal/#Base.size-Tuple{MetaVLSV}","page":"API Reference","title":"Base.size","text":"File size in bytes.\n\n\n\n\n\n","category":"method"},{"location":"internal/#Vlasiator.curl-Union{Tuple{U}, Tuple{N}, Tuple{T}, Tuple{AbstractArray{T, N}, Union{Vector{U}, Tuple{U, U, U}}}} where {T, N, U}","page":"API Reference","title":"Vlasiator.curl","text":"curl(A::AbstractArray{T,N}, dx:Union{Vector{U}, NTuple{3,U}}) where {T,N,U}\n\nCalculate 2nd order cell-centered ∇×A where A is a 4D array of size (3, nx, ny, nz) and dx is a vector of grid intervals in each dimension.\n\n\n\n\n\n","category":"method"},{"location":"internal/#Vlasiator.divergence-Union{Tuple{AbstractArray{T, N}}, Tuple{U}, Tuple{N}, Tuple{T}, Tuple{AbstractArray{T, N}, Vector{U}}} where {T, N, U}","page":"API Reference","title":"Vlasiator.divergence","text":"divergence(A::AbstractArray{T,N}, dx::Vector{U}=ones(T, 3)) where {T,N,U}\n\nCalculate 2nd order cell-centered ∇⋅A where A is a 4D array of size (3, nx, ny, nz) and dx is a vector of grid intervals in each dimension.\n\n\n\n\n\n","category":"method"},{"location":"internal/#Vlasiator.divergence2d-Union{Tuple{N}, Tuple{T}, Tuple{AbstractArray{T, N}, AbstractFloat}} where {T, N}","page":"API Reference","title":"Vlasiator.divergence2d","text":"divergence2d(A::AbstractArray{T,N}, dx::AbstractFloat) where {T,N}\n\nCalculate 2nd order cell-centered ∇⋅A where A is a 4D array of size (3, nx, ny, nz) and dx is the uniform grid interval in each dimension. One of the dimension must be 1.\n\n\n\n\n\n","category":"method"},{"location":"internal/#Vlasiator.downsample_fg-Tuple{MetaVLSV, Array}","page":"API Reference","title":"Vlasiator.downsample_fg","text":"downsample_fg(meta::MetaVLSV, v_fg::Array)\ndownsample_fg(meta::MetaVLSV, var::String)\n\nDownsample a field solver array v_fg to the spatial grid associated with meta.\n\n\n\n\n\n","category":"method"},{"location":"internal/#Vlasiator.downsample_fg_cell-Tuple{MetaVLSV, Array, Int64}","page":"API Reference","title":"Vlasiator.downsample_fg_cell","text":"Return a field solver grid subarray contained inside spatial cell cid.\n\n\n\n\n\n","category":"method"},{"location":"internal/#Vlasiator.fillmesh-Tuple{MetaVLSV, Vector{String}}","page":"API Reference","title":"Vlasiator.fillmesh","text":"fillmesh(meta::MetaVLSV, vars::Vector{String};\n skipghosttype=true, maxamronly=false, verbose=false) -> celldata, vtkGhostType\n\nFill the DCCRG mesh with quantity of vars on all refinement levels.\n\nReturn arguments\n\ncelldata::Vector{Vector{Array}}: data for each variable on each AMR level.\nvtkGhostType::Array{UInt8}: cell status (to be completed!).\n\n\n\n\n\n","category":"method"},{"location":"internal/#Vlasiator.findindex-Tuple{Int32, Tuple{Int64, Int64, Int64}, Tuple{Int64, Int64, Int64}, Int64, Tuple{Int64, Int64, Int64}, Int64, Int64}","page":"API Reference","title":"Vlasiator.findindex","text":"Get the original vcell index without blocks from raw vcell index i (0-based).\n\n\n\n\n\n","category":"method"},{"location":"internal/#Vlasiator.get1stcell-Tuple{Int64, Int64}","page":"API Reference","title":"Vlasiator.get1stcell","text":"Return the first cell ID on mylevel given ncells on this level.\n\n\n\n\n\n","category":"method"},{"location":"internal/#Vlasiator.getDomainDecomposition-Tuple{Any, Any}","page":"API Reference","title":"Vlasiator.getDomainDecomposition","text":"getDomainDecomposition(globalsize, nprocs)\n\nObtain decomposition of this grid over the given number of processors. Reference: fsgrid.hpp\n\n\n\n\n\n","category":"method"},{"location":"internal/#Vlasiator.getObjInfo-Tuple{Vector{XML.Node}, String, String, String}","page":"API Reference","title":"Vlasiator.getObjInfo","text":"General inquiry of element tag with tagname and attr.\n\n\n\n\n\n","category":"method"},{"location":"internal/#Vlasiator.getRotationMatrix-Tuple{AbstractMatrix, AbstractMatrix}","page":"API Reference","title":"Vlasiator.getRotationMatrix","text":"getRotationMatrix(e1::Matrix, e2::Matrix) -> SMatrix{3,3}\n\nObtain the rotation matrix from orthgonal base vectors e1 to e2, such that a vector mathbfu_1 in e1 can be expressed as mathbfu_1 = Mcdot mathbfu_2, where M is the rotation matrix and mathbfu_2 is the same vector in e2.\n\nExample\n\ne1 = [1.0 0.0 0.0; 0.0 1.0 0.0; 0.0 0.0 1.0]\ne2 = [0.0 1.0 0.0; 1.0 0.0 0.0; 0.0 0.0 1.0]\nR = getRotationMatrix(e1, e2)\n\n\n\n\n\n","category":"method"},{"location":"internal/#Vlasiator.getRotationMatrix-Tuple{AbstractVector{<:AbstractFloat}, Real}","page":"API Reference","title":"Vlasiator.getRotationMatrix","text":"getRotationMatrix(axis::AbstractVector, angle::Real) --> SMatrix{3,3}\n\nCreate a rotation matrix for rotating a 3D vector around a unit axis by an angle in radians. Reference: Rotation matrix from axis and angle\n\nExample\n\nusing LinearAlgebra\nv = [-0.5, 1.0, 1.0]\nv̂ = normalize(v)\nθ = deg2rad(-74)\nR = getRotationMatrix(v̂, θ)\n\n\n\n\n\n","category":"method"},{"location":"internal/#Vlasiator.get_axis-Tuple{Vlasiator.AxisUnit, NTuple{4, var\"#s180\"} where var\"#s180\"<:Real, Tuple{var\"#s179\", var\"#s179\"} where var\"#s179\"<:Integer}","page":"API Reference","title":"Vlasiator.get_axis","text":"get_axis(axisunit::AxisUnit, plotrange::NTuple{4,<:Real}, sizes::NTuple{2,<:Integer})\nget_axis(pArgs::PlotArgs)\n\nReturn x and y ranges for 2D.\n\n\n\n\n\n","category":"method"},{"location":"internal/#Vlasiator.get_fg_array_cell-Tuple{MetaVLSV, Array, Int64}","page":"API Reference","title":"Vlasiator.get_fg_array_cell","text":"get_fg_array_cell(meta::MetaVLSV, v_fg::Array, cid::Int)\n\nReturn a subarray of the field solver grid array, corresponding to the fsgrid covered by the spatial cell ID cid.\n\n\n\n\n\n","category":"method"},{"location":"internal/#Vlasiator.get_fg_indices-Tuple{MetaVLSV, StaticArraysCore.SVector{3, Float64}}","page":"API Reference","title":"Vlasiator.get_fg_indices","text":"Return the field solver grid cell indexes containing coords (low-inclusive).\n\n\n\n\n\n","category":"method"},{"location":"internal/#Vlasiator.get_fg_indices_cell-Tuple{MetaVLSV, Int64}","page":"API Reference","title":"Vlasiator.get_fg_indices_cell","text":"Returns a slice tuple of fsgrid indices that are contained in the spatial cell cid.\n\n\n\n\n\n","category":"method"},{"location":"internal/#Vlasiator.get_fg_indices_subvolume","page":"API Reference","title":"Vlasiator.get_fg_indices_subvolume","text":"get_fg_indices_subvolume(meta::MetaVLSV, lower, upper, tol::Float64=1e-3)\n\nGet indices for subarray of fsgrid variables, in a cuboid defined by lower and upper vertices. This is used for mapping a set of fsgrid cells to a given DCCRG cell. Shift the corners (lower, upper) inward by a distance controlled by tol. If direct low-inclusive behaviour is required, tol shall be set to 0.\n\n\n\n\n\n","category":"function"},{"location":"internal/#Vlasiator.getdata2d-Tuple{MetaVLSV, String}","page":"API Reference","title":"Vlasiator.getdata2d","text":"getdata2d(meta::MetaVLSV, var::String)\n\nReturn 2d scalar/vector data. Nonpublic since it won't work with DCCRG AMR.\n\n\n\n\n\n","category":"method"},{"location":"internal/#Vlasiator.getfooter-Tuple{IOStream}","page":"API Reference","title":"Vlasiator.getfooter","text":"Return the XML footer of opened VLSV file.\n\n\n\n\n\n","category":"method"},{"location":"internal/#Vlasiator.getindexes-NTuple{5, Int64}","page":"API Reference","title":"Vlasiator.getindexes","text":"Compute x, y and z index of cell id on a given refinement level ilevel(0-based).\n\n\n\n\n\n","category":"method"},{"location":"internal/#Vlasiator.getindexes-Tuple{Int64, Int64, Int64, Int64, AbstractVector{Int64}}","page":"API Reference","title":"Vlasiator.getindexes","text":"Compute x, y and z indexes of all cell ids on the given refinement level (0-based).\n\n\n\n\n\n","category":"method"},{"location":"internal/#Vlasiator.getmaxrefinement-Tuple{Vector{Int64}, Tuple{Int64, Int64, Int64}}","page":"API Reference","title":"Vlasiator.getmaxrefinement","text":"Get maximum refinement level, assuming 3D grid and dichotomy method.\n\n\n\n\n\n","category":"method"},{"location":"internal/#Vlasiator.gradient-Union{Tuple{U}, Tuple{N}, Tuple{T}, Tuple{AbstractArray{T, N}, Vector{U}}} where {T, N, U}","page":"API Reference","title":"Vlasiator.gradient","text":"gradient(A::AbstractArray{T,N}, dx::Vector{U}) where {T,N,U}\n\nCalculate 2nd order cell-centered ∇A where A is a scalar array and dx is a vector of grid intervals in each dimension.\n\nwarning: Warning\nThe current implementation has issues at the boundary if gradient is taken multiple times.\n\n\n\n\n\n","category":"method"},{"location":"internal/#Vlasiator.init_cellswithVDF!-Tuple{MetaVLSV, String}","page":"API Reference","title":"Vlasiator.init_cellswithVDF!","text":"Lazily initialize arrays of cell ID with VDF and number of vblock per cell.\n\n\n\n\n\n","category":"method"},{"location":"internal/#Vlasiator.isextrema-Tuple{Any}","page":"API Reference","title":"Vlasiator.isextrema","text":"Check if the center point in a 3x3 matrix ψ is an extrema point.\n\n\n\n\n\n","category":"method"},{"location":"internal/#Vlasiator.issaddle-Tuple{Any}","page":"API Reference","title":"Vlasiator.issaddle","text":"Check if the center point in a 3x3 matrix ψ is a saddle point.\n\n\n\n\n\n","category":"method"},{"location":"internal/#Vlasiator.prep1d-Tuple{MetaVLSV, String}","page":"API Reference","title":"Vlasiator.prep1d","text":"prep1d(meta::MetaVLSV, var::String; i1::Int=0, i2::Int=0, comp::Int=0) -> Array\n\nObtain a 1D slice from 2D meta of var. i1 is the index for the first dimension, and i2 is the index for the second dimension; only one of them is needed. Use comp to select vector components.\n\n\n\n\n\n","category":"method"},{"location":"internal/#Vlasiator.prep2d","page":"API Reference","title":"Vlasiator.prep2d","text":"prep2d(meta::MetaVLSV, var::String, comp::Union{Symbol, Int}=0) -> Array\n\nObtain data from meta of var for 2D plotting. Use comp to select vector components.\n\n\n\n\n\n","category":"function"},{"location":"internal/#Vlasiator.prep2dslice-Tuple{MetaVLSV, String, Symbol, Union{Int64, Symbol}, Vlasiator.PlotArgs}","page":"API Reference","title":"Vlasiator.prep2dslice","text":"prep2dslice(meta::MetaVLSV, var::String, normal, comp, pArgs::PlotArgs)\n\nReturn data of var on a uniform 2D mesh on the finest AMR level. Use normal to select the plane orientation, and comp to select the component of a vector.\n\n\n\n\n\n","category":"method"},{"location":"internal/#Vlasiator.prep_vdf-Tuple{MetaVLSV, AbstractVector}","page":"API Reference","title":"Vlasiator.prep_vdf","text":"prep_vdf(meta::MetaVLSV, location::AbstractVector; kwargs...)\n\nReturn the cell velocities v1, v2, bin ranges r1, r2, cell VDF values fweight, and strings of labels and titles for VDF plots.\n\nKeywords\n\nunit::AxisUnit: location unit in SI, EARTH.\nunitv::String: velocity unit in (\"km/s\", \"m/s\").\nlimits::Vector{Real}: velocity space range given in [xmin, xmax, ymin, ymax].\nslicetype: symbol for choosing the slice type from :xy, :xz, :yz, :bperp, :bpar1, :bpar2.\ncenter: symbol for setting the reference frame from :bulk, :peak.\nvslicethick: setting the velocity space slice thickness in the normal direction. If set to 0, the whole distribution along the normal direction is projected onto a plane. Currently this is only meaningful when center is set such that a range near the bulk/peak normal velocity is selected.\nweight::Symbol: choosing distribution weights from phase space density or particle flux between :particle and :flux.\nflimit: minimum VDF threshold for plotting.\nverbose: display the selection process.\n\n\n\n\n\n","category":"method"},{"location":"internal/#Vlasiator.read_variable_as_fg-Tuple{MetaVLSV, String}","page":"API Reference","title":"Vlasiator.read_variable_as_fg","text":"read_variable_as_fg(meta::MetaVLSV, var::String)\n\nInterpolate DCCRG variable var to field solver grid size. This is an alternative method to fillmesh, but not optimized for performance.\n\n\n\n\n\n","category":"method"},{"location":"internal/#Vlasiator.readmesh-Tuple{IOStream, Vector{XML.Node}}","page":"API Reference","title":"Vlasiator.readmesh","text":"Return spatial mesh information.\n\n\n\n\n\n","category":"method"},{"location":"internal/#Vlasiator.readvector-Union{Tuple{T}, Tuple{IOStream, Type{T}, Int64, Int64, Int64, Val{false}}} where T","page":"API Reference","title":"Vlasiator.readvector","text":"Return vector of name from the VLSV file associated with stream fid.\n\n\n\n\n\n","category":"method"},{"location":"internal/#Vlasiator.readvmesh-Tuple{IOStream, Vector{XML.Node}, String}","page":"API Reference","title":"Vlasiator.readvmesh","text":"Return velocity mesh information.\n\n\n\n\n\n","category":"method"},{"location":"internal/#Vlasiator.reconstruct-Tuple{Vlasiator.VMeshInfo, Vector{Int32}, Vector{<:AbstractFloat}}","page":"API Reference","title":"Vlasiator.reconstruct","text":"reconstruct(vmesh::VMeshInfo, vcellids::Vector{Int32}, vcellf::Vector{<:AbstractFloat})\n\nReconstruct the full VDFs in 3D. vcellids are raw indices of nonzero VDFs ordered by blocks, and vcellf are the corresponding values in each cell.\n\n\n\n\n\n","category":"method"},{"location":"internal/#Vlasiator.reorder-Tuple{Vlasiator.VMeshInfo, Vector{Int32}}","page":"API Reference","title":"Vlasiator.reorder","text":"reorder(vmesh::VMeshInfo, vcellids::Vector{Int32}) -> vcellids_origin\n\nReorder vblock-organized VDF indexes into x–>y–>z indexes. vcellids are raw indices of nonzero VDFs ordered by blocks.\n\n\n\n\n\n","category":"method"},{"location":"internal/#Vlasiator.rotateTensorToVectorZ-Union{Tuple{T}, Tuple{AbstractMatrix{T}, AbstractVector{T}}} where T","page":"API Reference","title":"Vlasiator.rotateTensorToVectorZ","text":"rotateTensorToVectorZ(tensor::AbstractMatrix, vector::AbstractVector) -> SMatrix{3,3}\n\nRotate tensor with a rotation matrix that aligns the 3rd direction with vector, which is equivalent to change the basis from (i,j,k) to (i′,j′,k′) where k′ ∥ vector. Reference: Tensor rotation\n\n\n\n\n\n","category":"method"},{"location":"internal/#Vlasiator.save_image","page":"API Reference","title":"Vlasiator.save_image","text":"save_image(meta::MetaVLSV, file, vars, data, vtkGhostType, level,\n ascii=false, append=true, box=[-Inf, Inf, -Inf, Inf, -Inf, Inf])\n\nSave data of name vars at AMR level into VTK image file of name file.\n\nArguments\n\nfile::String: output file name.\nvars::Vector{String}: variable names to be saved.\ndata::Vector{Vector{Array}}: data for all the variables on each refinement level.\nvtkGhostType::Array{UInt8}: array for visibility control.\nlevel::Int: refinement level (0-based).\nascii::Bool=false: save output in ASCII or binary format.\nappend::Bool=true: determines whether to append data at the end of file or do in-block writing.\nbox::Vector: selected box range in 3D.\n\n\n\n\n\n","category":"function"},{"location":"internal/#Vlasiator.set_args-Tuple{MetaVLSV, String, Vlasiator.AxisUnit}","page":"API Reference","title":"Vlasiator.set_args","text":"set_args(meta::MetaVLSV, var::String, axisunit::AxisUnit;\n normal::Symbol=:none, origin=0.0)\n\nSet plot-related arguments of var in axisunit. normal and origin are used for 2D slices of 3D data.\n\n\n\n\n\n","category":"method"},{"location":"internal/#Vlasiator.set_lim-Union{Tuple{T}, Tuple{T, T, Any}, Tuple{T, T, Any, Vlasiator.ColorScale}} where T","page":"API Reference","title":"Vlasiator.set_lim","text":"set_lim(vmin, vmax, data, colorscale=Linear)\n\nSet colormap limits vmin, vmax for data under scale colorscale.\n\n\n\n\n\n","category":"method"},{"location":"internal/#Vlasiator.upsample_fsgrid_subarray!-Union{Tuple{T}, Tuple{MetaVLSV, Any, Int64, Array{T, 4}}} where T","page":"API Reference","title":"Vlasiator.upsample_fsgrid_subarray!","text":"Set the elements of the fsgrid array to the value of corresponding cell ID cid.\n\n\n\n\n\n","category":"method"},{"location":"examples/visualization/demo_B_fieldline_pyplot/","page":"Field lines with customized seeds","title":"Field lines with customized seeds","text":"EditURL = \"/home/runner/work/Vlasiator.jl/Vlasiator.jl/docs/examples/visualization/demo_B_fieldline_pyplot.md\"","category":"page"},{"location":"examples/visualization/demo_B_fieldline_pyplot/#demo_2d_fieldlines","page":"Field lines with customized seeds","title":"Field lines with customized seeds","text":"","category":"section"},{"location":"examples/visualization/demo_B_fieldline_pyplot/","page":"Field lines with customized seeds","title":"Field lines with customized seeds","text":"(Image: Author) (Image: Update time)","category":"page"},{"location":"examples/visualization/demo_B_fieldline_pyplot/","page":"Field lines with customized seeds","title":"Field lines with customized seeds","text":"This demo shows how to plot field lines with handpicked seeds.","category":"page"},{"location":"examples/visualization/demo_B_fieldline_pyplot/","page":"Field lines with customized seeds","title":"Field lines with customized seeds","text":"using VlasiatorPyPlot, FieldTracer\nusing Vlasiator: RE # Earth radius, [m]\n\nfunction main()\n file = \"../../bulk.0000999.vlsv\"\n meta = load(file)\n (;coordmin, coordmax, ncells) = meta\n pcolormesh(meta, \"proton/vg_rho\", colorscale=Linear)\n\n dim_ =\n if ncells[2] == 1\n (1,3)\n elseif ncells[3] == 1\n (1,2)\n else\n @error \"Not implemented for ncells = $ncells.\"\n end\n\n # NonAMR Cartesian mesh\n grid1 = range(coordmin[dim_[1]], coordmax[dim_[1]], length=ncells[dim_[1]])\n grid2 = range(coordmin[dim_[2]], coordmax[dim_[2]], length=ncells[dim_[2]])\n\n ns1 = 14 # number of seeding points on the dayside\n ns2 = 10 # number of seeding points on the nightside\n ns4 = 4 # number of seeding points in the polar region\n seeds = Matrix{Float64}(undef, 2, ns1+2*ns2+2*ns4)\n\n for i in 1:ns1\n seeds[1,i] = coordmax[dim_[1]] / ns1 * (i - 1)\n seeds[2,i] = 0.0\n end\n\n for i in 1:ns2\n seeds[1,ns1+i] = -10RE\n seeds[2,ns1+i] = coordmin[dim_[2]] +\n (coordmax[dim_[2]] - coordmin[dim_[2]]) / ns2 * (i - 1)\n seeds[1,ns1+ns2+i] = -30RE\n seeds[2,ns1+ns2+i] = coordmin[dim_[2]] +\n (coordmax[dim_[2]] - coordmin[dim_[2]]) / ns2 * (i - 1)\n end\n\n for i in 1:ns4\n seeds[1,ns1+2*ns2+i] = -20RE + 10RE*(i - 1)\n seeds[2,ns1+2*ns2+i] = 30RE\n seeds[1,ns1+2*ns2+ns4+i] = -20RE + 10RE*(i - 1)\n seeds[2,ns1+2*ns2+ns4+i] = -30RE\n end\n\n b = meta[\"vg_b_vol\"]\n b1 = reshape(b[dim_[1],:], ncells[dim_[1]], ncells[dim_[2]])\n b2 = reshape(b[dim_[2],:], ncells[dim_[1]], ncells[dim_[2]])\n\n for i = axes(seeds,2)\n startx, starty = seeds[:,i]\n x1, y1 = trace(b1, b2, startx, starty, grid1, grid2;\n ds=0.5, maxstep=3000, gridtype=\"ndgrid\")\n x1 ./= RE\n y1 ./= RE\n if length(x1) < 5; continue; end\n line = plot(x1, y1, color=\"w\")\n add_arrow(line[1])\n end\n\nend\n\nmain()","category":"page"},{"location":"examples/visualization/demo_B_fieldline_pyplot/","page":"Field lines with customized seeds","title":"Field lines with customized seeds","text":"","category":"page"},{"location":"examples/visualization/demo_B_fieldline_pyplot/","page":"Field lines with customized seeds","title":"Field lines with customized seeds","text":"This page was generated using DemoCards.jl.","category":"page"},{"location":"examples/visualization/demo_field_tracing_2d/","page":"Tracing field lines in 2D","title":"Tracing field lines in 2D","text":"EditURL = \"/home/runner/work/Vlasiator.jl/Vlasiator.jl/docs/examples/visualization/demo_field_tracing_2d.md\"","category":"page"},{"location":"examples/visualization/demo_field_tracing_2d/#demo_2d_trace","page":"Tracing field lines in 2D","title":"Tracing field lines in 2D","text":"","category":"section"},{"location":"examples/visualization/demo_field_tracing_2d/","page":"Tracing field lines in 2D","title":"Tracing field lines in 2D","text":"(Image: Author) (Image: Update time)","category":"page"},{"location":"examples/visualization/demo_field_tracing_2d/","page":"Tracing field lines in 2D","title":"Tracing field lines in 2D","text":"This demo shows how to trace streamlines in a 2D uniform field.","category":"page"},{"location":"examples/visualization/demo_field_tracing_2d/","page":"Tracing field lines in 2D","title":"Tracing field lines in 2D","text":"using VlasiatorPyPlot, FieldTracer\nusing Vlasiator: RE # Earth radius, [m]\n\nfunction main()\n file = \"bulk.0000501.vlsv\"\n nameρ = \"rho\"\n nameV = \"rho_v\"\n\n meta = load(file)\n\n pcolormesh(meta, nameρ)\n\n v = readvariable(meta, nameV)\n vx = reshape(v[1,:], meta.ncells[1], meta.ncells[2])\n vy = reshape(v[2,:], meta.ncells[1], meta.ncells[2])\n # tracing starting point\n xstart, ystart = 12RE, 0RE\n # regular Cartesian mesh\n x = range(meta.coordmin[1], meta.coordmax[1], length=meta.ncells[1])\n y = range(meta.coordmin[2], meta.coordmax[2], length=meta.ncells[2])\n\n # RK4 scheme by default\n x1, y1 = trace2d(vx, vy, xstart, ystart, x, y;\n ds=0.5, maxstep=3000, gridType=\"ndgrid\")\n x1 ./= RE\n y1 ./= RE\n\n plot(x1, y1)\n\n streamplot(meta, nameV, comp=\"xy\", color=\"w\", density=1.0)\nend\n\nmain()","category":"page"},{"location":"examples/visualization/demo_field_tracing_2d/","page":"Tracing field lines in 2D","title":"Tracing field lines in 2D","text":"","category":"page"},{"location":"examples/visualization/demo_field_tracing_2d/","page":"Tracing field lines in 2D","title":"Tracing field lines in 2D","text":"This page was generated using DemoCards.jl.","category":"page"},{"location":"examples/visualization/demo_lineextracting_mp_pyplot/","page":"Extracting variables along a line with multi-processing","title":"Extracting variables along a line with multi-processing","text":"EditURL = \"/home/runner/work/Vlasiator.jl/Vlasiator.jl/docs/examples/visualization/demo_lineextracting_mp_pyplot.md\"","category":"page"},{"location":"examples/visualization/demo_lineextracting_mp_pyplot/#demo_line_extract_mp","page":"Extracting variables along a line with multi-processing","title":"Extracting variables along a line with multi-processing","text":"","category":"section"},{"location":"examples/visualization/demo_lineextracting_mp_pyplot/","page":"Extracting variables along a line with multi-processing","title":"Extracting variables along a line with multi-processing","text":"(Image: Author) (Image: Update time)","category":"page"},{"location":"examples/visualization/demo_lineextracting_mp_pyplot/","page":"Extracting variables along a line with multi-processing","title":"Extracting variables along a line with multi-processing","text":"This demos shows how to extract multiple variables alone a line across multiple frames with multi-processing.","category":"page"},{"location":"examples/visualization/demo_lineextracting_mp_pyplot/","page":"Extracting variables along a line with multi-processing","title":"Extracting variables along a line with multi-processing","text":"tip: Tip\nThis can be made faster by updating the data without deleting the lines.","category":"page"},{"location":"examples/visualization/demo_lineextracting_mp_pyplot/","page":"Extracting variables along a line with multi-processing","title":"Extracting variables along a line with multi-processing","text":"Usage:","category":"page"},{"location":"examples/visualization/demo_lineextracting_mp_pyplot/","page":"Extracting variables along a line with multi-processing","title":"Extracting variables along a line with multi-processing","text":"julia -p $ncores demo_vars_extracting_mp.jl","category":"page"},{"location":"examples/visualization/demo_lineextracting_mp_pyplot/","page":"Extracting variables along a line with multi-processing","title":"Extracting variables along a line with multi-processing","text":"using Distributed, ParallelDataTransfer\nusing Vlasiator: RE\n@everywhere using Vlasiator, PyPlot, Printf\n\n@everywhere function init_figure(x1, x2)\n fig, axs = plt.subplots(4, 1; num=myid(),\n figsize=(10, 15), sharex=true, constrained_layout=true)\n\n axs[end].set_xlim(x1, x2)\n\n axs[1].set_ylim(ρmin, ρmax)\n axs[2].set_ylim(vmin, vmax)\n axs[3].set_ylim(pmin, pmax)\n axs[4].set_ylim(bmin, bmax)\n for ax in axs\n ax.xaxis.set_minor_locator(matplotlib.ticker.AutoMinorLocator())\n ax.yaxis.set_minor_locator(matplotlib.ticker.AutoMinorLocator())\n ax.grid(true)\n end\n\n axs[end].set_xlabel(\"x [RE]\"; fontsize)\n axs[1].set_ylabel(\"Density [amu/cc]\"; fontsize)\n axs[2].set_ylabel(\"Velocity [km/s]\"; fontsize)\n axs[3].set_ylabel(\"Pressure [nPa]\"; fontsize)\n axs[4].set_ylabel(\"Magnetic field [nT]\"; fontsize)\n return fig, axs\nend\n\n@everywhere function process(axs, file, cellids)\n isfile(\"out/\"*file[end-8:end-5]*\".png\") && return\n\n println(\"file = $file\")\n meta = load(file)\n\n p_extract = readvariable(meta, \"vg_pressure\", cellids) .* 1e9 |> vec # [nPa]\n rho_extract = readvariable(meta, \"proton/vg_rho\", cellids) |> vec\n v_extract = readvariable(meta, \"proton/vg_v\", cellids)\n vmag2_extract = sum(x -> x*x, v_extract, dims=1) |> vec\n pram_extract = rho_extract .* Vlasiator.mᵢ .* vmag2_extract .* 1e9 # [nPa]\n\n bz = readvariable(meta, \"vg_b_vol\", cellids)[3,:] .* 1e9 #[nT]\n\n imagnetopause_ = findfirst(<(0.0), bz)\n\n axs[1].plot(loc, rho_extract ./ 1e6, label=\"Proton density\", color=\"#1f77b4\")\n vl1 = axs[1].vlines(loc[imagnetopause_], ρmin, ρmax;\n colors=\"r\", linestyle=\"dashed\", alpha=0.5)\n\n axs[2].plot(loc, v_extract[1,:] ./ 1e3, label=\"Vx\", color=\"#1f77b4\")\n vl2 = axs[2].vlines(loc[imagnetopause_], vmin, vmax;\n colors=\"r\", linestyle=\"dashed\", alpha=0.5)\n\n axs[3].plot(loc, pram_extract, label=\"Ram\", color=\"#1f77b4\")\n axs[3].plot(loc, p_extract, label=\"Thermal\", color=\"#ff7f0e\")\n vl3 = axs[3].vlines(loc[imagnetopause_], pmin, pmax;\n colors=\"r\", linestyle=\"dashed\", alpha=0.5)\n\n axs[4].plot(loc, bz, label=\"Bz\", color=\"#1f77b4\")\n hl4 = axs[4].hlines(0.0, loc[1], loc[end], colors=\"k\", linestyle=\"dashed\", alpha=0.2)\n vl4 = axs[4].vlines(loc[imagnetopause_], bmin, bmax;\n colors=\"r\", linestyle=\"dashed\", alpha=0.5)\n\n str_title = @sprintf \"t= %4.1fs\" meta.time\n axs[1].set_title(str_title; fontsize)\n\n axs[2].legend(;loc=\"upper right\", fontsize)\n axs[3].legend(;loc=\"upper left\", fontsize)\n axs[4].legend(;loc=\"upper right\", fontsize)\n\n savefig(\"out/\"*file[end-8:end-5]*\".png\", bbox_inches=\"tight\")\n\n for ax in axs\n for line in ax.get_lines()\n line.remove()\n end\n end\n for line in (vl1, vl2, vl3, vl4, hl4)\n line.remove()\n end\n return\nend\n\nfunction make_jobs(files)\n for f in files\n put!(jobs, f)\n end\nend\n\n@everywhere function do_work(jobs, results)\n fig, axs = init_figure(x1, x2)\n while true\n file = take!(jobs)\n process(axs, file, cellids)\n put!(results, true)\n end\n close(fig)\nend\n\n################################################################################\nfiles = filter(contains(r\"^bulk.*\\.vlsv$\"), readdir())\nnfile = length(files)\n\nconst x1, x2 = 8.0, 29.0\nconst point1 = [x1, 0, 0] .* RE\nconst point2 = [x2, 0, 0] .* RE\n\nmeta = load(files[1])\ncellids, _, _ = getcellinline(meta, point1, point2)\nclose(meta.fid)\n\npassobj(1, workers(), [:x1, :x2, :cellids])\n\n@broadcast begin\n const loc = range(x1, x2, length=length(cellids))\n\n const ρmin, ρmax = 0.0, 10.0 # [amu/cc]\n const vmin, vmax = -640.0, 0.0 # [km/s]\n const pmin, pmax = 0.0, 1.82 # [nPa]\n const bmin, bmax = -25.0, 60.0 # [nT]\n\n const fontsize = 14\nend\n\nconst jobs = RemoteChannel(()->Channel{String}(nfile))\nconst results = RemoteChannel(()->Channel{Bool}(nworkers()))\n\nprintln(\"Total number of files: $nfile\")\nprintln(\"Running with $(nworkers()) workers...\")\n\n@async make_jobs(files) # Feed the jobs channel with all files to process.\n\n@sync for p in workers()\n @async remote_do(do_work, p, jobs, results)\nend\n\nlet n = nfile\n t = @elapsed while n > 0 # wait for all jobs to complete\n take!(results)\n n -= 1\n end\n println(\"Finished in $(round(t, digits=2))s.\")\nend","category":"page"},{"location":"examples/visualization/demo_lineextracting_mp_pyplot/","page":"Extracting variables along a line with multi-processing","title":"Extracting variables along a line with multi-processing","text":"","category":"page"},{"location":"examples/visualization/demo_lineextracting_mp_pyplot/","page":"Extracting variables along a line with multi-processing","title":"Extracting variables along a line with multi-processing","text":"This page was generated using DemoCards.jl.","category":"page"},{"location":"examples/postprocess/demo_lineextracting_mt/","page":"Extract variables along a line","title":"Extract variables along a line","text":"EditURL = \"/home/runner/work/Vlasiator.jl/Vlasiator.jl/docs/examples/postprocess/demo_lineextracting_mt.md\"","category":"page"},{"location":"examples/postprocess/demo_lineextracting_mt/#demo_extractline","page":"Extract variables along a line","title":"Extract variables along a line","text":"","category":"section"},{"location":"examples/postprocess/demo_lineextracting_mt/","page":"Extract variables along a line","title":"Extract variables along a line","text":"(Image: Author) (Image: Update time)","category":"page"},{"location":"examples/postprocess/demo_lineextracting_mt/","page":"Extract variables along a line","title":"Extract variables along a line","text":"To extract variables along a line across multiple frames using multithreads,","category":"page"},{"location":"examples/postprocess/demo_lineextracting_mt/","page":"Extract variables along a line","title":"Extract variables along a line","text":"using Vlasiator\nusing JLD2: jldsave\n\nfunction main()\n files = filter(contains(r\"^bulk.*\\.vlsv$\"), readdir())\n nfile = length(files)\n # Define end points of the line in Earth radius\n x1, x2 = 6.0, 20.0\n point1 = [x1, 0, 0] .* Vlasiator.RE\n point2 = [x2, 0, 0] .* Vlasiator.RE\n # Extract cell info along the line\n cellids, distances, coords =\n load(files[1]) do meta\n getcellinline(meta, point1, point2)\n end\n # WARNING: this may not be exact due to round-off errors in output time stamps!\n t = let tstart = load(files[1]).time, tend = load(files[end]).time\n range(round(tstart,digits=1), round(tend, digits=1), length=nfile)\n end\n\n n = zeros(Float32, length(cellids), nfile)\n v = zeros(Float32, 3, length(cellids), nfile)\n p = zeros(Float32, 6, length(cellids), nfile)\n b = similar(v)\n e = similar(v)\n\n Threads.@threads for i in eachindex(files)\n println(\"i = $i/$nfile, file = $(files[i])\")\n local meta = load(files[i])\n\n n[:,i] = readvariable(meta, \"proton/vg_rho\", cellids)\n v[:,:,i] = readvariable(meta, \"proton/vg_v\", cellids)\n p[1:3,:,i] = readvariable(meta, \"proton/vg_ptensor_diagonal\", cellids)\n p[4:6,:,i] = readvariable(meta, \"proton/vg_ptensor_offdiagonal\", cellids)\n b[:,:,i] = readvariable(meta, \"vg_b_vol\", cellids)\n e[:,:,i] = readvariable(meta, \"vg_e_vol\", cellids)\n end\n\n # Save into binary file\n jldsave(\"vars_sun_earth_line.jld2\"; x1, x2, t, n, v, p, b, e)\n\n println(\"Line extraction finished!\")\nend\n\nmain()","category":"page"},{"location":"examples/postprocess/demo_lineextracting_mt/","page":"Extract variables along a line","title":"Extract variables along a line","text":"","category":"page"},{"location":"examples/postprocess/demo_lineextracting_mt/","page":"Extract variables along a line","title":"Extract variables along a line","text":"This page was generated using DemoCards.jl.","category":"page"},{"location":"examples/postprocess/demo_x_o_points/","page":"Find X- and O-points","title":"Find X- and O-points","text":"EditURL = \"/home/runner/work/Vlasiator.jl/Vlasiator.jl/docs/examples/postprocess/demo_x_o_points.md\"","category":"page"},{"location":"examples/postprocess/demo_x_o_points/#demo_x_o_points","page":"Find X- and O-points","title":"Find X- and O-points","text":"","category":"section"},{"location":"examples/postprocess/demo_x_o_points/","page":"Find X- and O-points","title":"Find X- and O-points","text":"(Image: Author) (Image: Update time)","category":"page"},{"location":"examples/postprocess/demo_x_o_points/","page":"Find X- and O-points","title":"Find X- and O-points","text":"This demo shows how to find X-points and O-points in a 2D magnetic reconnection configuration. Here we assume a X-Z meridional plane.","category":"page"},{"location":"examples/postprocess/demo_x_o_points/","page":"Find X- and O-points","title":"Find X- and O-points","text":"note: Note\nThe input B field domain matters for computing the flux function, but I don't knowwhy there are differences.In identifying the X-points and O-points, we currently provide two methods: method 1needs to set the relative tolerance, while method 2 does not.","category":"page"},{"location":"examples/postprocess/demo_x_o_points/","page":"Find X- and O-points","title":"Find X- and O-points","text":"using VlasiatorPyPlot\n\nfunction main()\n file = \"bulk.0001657.vlsv\"\n meta = load(file)\n\n ndims(meta) != 2 && @error \"Flux function only works for 2D simulations!\"\n\n meta.ncells[3] == 1 && @error \"equatorial plane, no reconnection!\"\n\n b = meta[\"vg_b_vol\"]\n b = reshape(b, 3, meta.ncells[1], meta.ncells[3])\n dx = [meta.dcoord[1], meta.dcoord[3]]\n\n x = LinRange(meta.coordmin[1], meta.coordmax[1], meta.ncells[1]) ./ Vlasiator.RE\n z = LinRange(meta.coordmin[3], meta.coordmax[3], meta.ncells[3]) ./ Vlasiator.RE\n\n xmin_ = searchsortedfirst(x, 7.0)\n xmax_ = searchsortedlast(x, 9.5)\n zmin_ = searchsortedfirst(z, -5.0)\n zmax_ = searchsortedlast(z, 5.0)\n\n # meshgrid for plotting\n X = [a for a in x[xmin_:xmax_], _ in z[zmin_:zmax_]]\n Z = [b for _ in x[xmin_:xmax_], b in z[zmin_:zmax_]]\n\n flux = compute_flux_function(view(b,:,xmin_:xmax_,zmin_:zmax_), dx)\n\n fig, ax = plt.subplots(subplot_kw=Dict(\"projection\"=>\"3d\"))\n\n ax.plot_surface(X, Z, flux;\n cmap=matplotlib.cm.turbo,\n linewidth=0, antialiased=false)\n\n indices_x, indices_o = find_reconnection_points(flux; retol=1e-4, method=2)\n\n fig, ax = subplots(figsize=(6,10), constrained_layout=true)\n\n pcolormesh(meta, \"proton/vg_v\", ax;\n comp=:z, extent=[5, 10, -7.5, 7.5],\n cmap=matplotlib.cm.RdBu_r)\n s1 = ax.scatter(x[indices_x[1,:].+xmin_.-1], z[indices_x[2,:].+zmin_.-1];\n s=50, marker=\"x\", color=\"tab:gray\")\n s2 = ax.scatter(x[indices_o[1,:].+xmin_.-1], z[indices_o[2,:].+zmin_.-1];\n s=12, marker=\"o\", color=\"tab:brown\")\n\n ax.legend([s1, s2], [\"X-point\", \"O-point\"])\nend\n\nmain()","category":"page"},{"location":"examples/postprocess/demo_x_o_points/","page":"Find X- and O-points","title":"Find X- and O-points","text":"","category":"page"},{"location":"examples/postprocess/demo_x_o_points/","page":"Find X- and O-points","title":"Find X- and O-points","text":"This page was generated using DemoCards.jl.","category":"page"},{"location":"examples/visualization/demo_1d_animation_pyplot/","page":"1D animation","title":"1D animation","text":"EditURL = \"/home/runner/work/Vlasiator.jl/Vlasiator.jl/docs/examples/visualization/demo_1d_animation_pyplot.md\"","category":"page"},{"location":"examples/visualization/demo_1d_animation_pyplot/#demo_1d_animation","page":"1D animation","title":"1D animation","text":"","category":"section"},{"location":"examples/visualization/demo_1d_animation_pyplot/","page":"1D animation","title":"1D animation","text":"(Image: Author) (Image: Update time)","category":"page"},{"location":"examples/visualization/demo_1d_animation_pyplot/","page":"1D animation","title":"1D animation","text":"This example demonstrates 1D plot animation. ffmpeg is required to be installed for saving into mp4.","category":"page"},{"location":"examples/visualization/demo_1d_animation_pyplot/","page":"1D animation","title":"1D animation","text":"using Vlasiator, VlasiatorPyPlot, Printf\nusing PyCall\n@pyimport matplotlib.animation as anim\n\nfiles = filter(contains(r\"^bulk.*\\.vlsv$\"), readdir())\n# Choose plotting variable\nconst var = \"proton/vg_rho\"\nconst comp = 0 # component of vector, if used\n\nfig = plt.figure(constrained_layout=true)\n# Fix axis limits according to data range\nax = plt.axes(xlim=(-10, 10), ylim=(0, 4))\n\nline, = ax.plot([], [], lw=3, marker=\"*\")\n\nfunction animate(i::Int, files::Vector{String}, var::String, comp::Int, ax, line)\n meta = load(files[i+1])\n x = LinRange(meta.coordmin[1], meta.coordmax[1], meta.ncells[1])\n d = readvariable(meta, var)\n y = ndims(d) == 1 ? d : d[comp,:]\n line.set_data(x, y)\n\n t = readparameter(meta, \"time\")\n str_title = @sprintf \"t = %4.1fs, var = %s\" t var\n ax.set_title(str_title)\n\n return (line,)\nend\n\n# https://matplotlib.org/stable/api/_as_gen/matplotlib.animation.FuncAnimation.html\nout = anim.FuncAnimation(fig, animate, fargs=(files, var, comp, ax, line),\n frames=length(files), blit=true,\n repeat_delay=1000, interval=200)\n# Make sure ffmpeg is available!\nout.save(\"line.mp4\", writer=\"ffmpeg\", fps=30)","category":"page"},{"location":"examples/visualization/demo_1d_animation_pyplot/","page":"1D animation","title":"1D animation","text":"","category":"page"},{"location":"examples/visualization/demo_1d_animation_pyplot/","page":"1D animation","title":"1D animation","text":"This page was generated using DemoCards.jl.","category":"page"},{"location":"examples/visualization/demo_field_tracing_3d/","page":"Tracing field lines in 3D","title":"Tracing field lines in 3D","text":"EditURL = \"/home/runner/work/Vlasiator.jl/Vlasiator.jl/docs/examples/visualization/demo_field_tracing_3d.md\"","category":"page"},{"location":"examples/visualization/demo_field_tracing_3d/#demo_3d_trace","page":"Tracing field lines in 3D","title":"Tracing field lines in 3D","text":"","category":"section"},{"location":"examples/visualization/demo_field_tracing_3d/","page":"Tracing field lines in 3D","title":"Tracing field lines in 3D","text":"(Image: Author) (Image: Update time)","category":"page"},{"location":"examples/visualization/demo_field_tracing_3d/","page":"Tracing field lines in 3D","title":"Tracing field lines in 3D","text":"This demo shows how to trace along a field line and extract variables from 3D AMR grid.","category":"page"},{"location":"examples/visualization/demo_field_tracing_3d/","page":"Tracing field lines in 3D","title":"Tracing field lines in 3D","text":"warning: Warning\nThis is a proof of concept, which is memory-bound in 3D and may be quite inefficient!","category":"page"},{"location":"examples/visualization/demo_field_tracing_3d/","page":"Tracing field lines in 3D","title":"Tracing field lines in 3D","text":"using Vlasiator, FieldTracer, PyPlot\nusing StaticArrays\nusing Vlasiator: RE\n\nfunction get_cell_along_B(meta::MetaVLSV, seed::Vector{T};\n ds::Float64=0.2, maxstep::Int=20000, direction::String=\"both\") where T\n B = Vlasiator.fillmesh(meta, [\"vg_b_vol\"]; maxamronly=true)[1][1][1]\n\n nx, ny, nz = size(B)[2:4]\n\n xrange = LinRange(meta.coordmin[1], meta.coordmax[1], nx)\n yrange = LinRange(meta.coordmin[2], meta.coordmax[2], ny)\n zrange = LinRange(meta.coordmin[3], meta.coordmax[3], nz)\n\n bx = @view B[1,:,:,:]\n by = @view B[2,:,:,:]\n bz = @view B[3,:,:,:]\n xs, ys, zs = seed\n\n x, y, z = trace(bx, by, bz, xs, ys, zs, xrange, yrange, zrange; ds, maxstep, direction)\n\n cellids = [getcell(meta, SVector(x[1], y[1], z[1]))]\n\n for i in eachindex(x)[2:end]\n cellidnew = getcell(meta, SVector(x[i], y[i], z[i]))\n if cellidnew != cellids[end]\n push!(cellids, cellidnew)\n end\n end\n\n cellids\nend\n\nfunction main()\n file = \"bulk1.0001000.vlsv\"\n meta = load(file)\n\n seed = [-5.0, 0., 3.5] .* RE\n # For EGI, ds=1.0 is between 1-2 steps per finest cell.\n cellids = get_cell_along_B(meta, seed; ds=1.0, maxstep=100, direction=\"backward\")\n\n #n = readvariable(meta, \"proton/vg_rho\", cellids)\n #v = readvariable(meta, \"proton/vg_v\", cellids)\n #E = readvariable(meta, \"fg_e\", cellids) # Not available for now!\n\n x = zeros(Float64, length(cellids))\n y = zeros(Float64, length(cellids))\n z = zeros(Float64, length(cellids))\n\n for i in eachindex(cellids)\n coords = getcellcoordinates(meta, cellids[i])\n x[i], y[i], z[i] = coords\n end\n\n fig = plt.figure()\n ax = fig.add_subplot(projection=\"3d\")\n\n ax.set_xlabel(\"x [RE]\")\n ax.set_ylabel(\"y [RE]\")\n ax.set_zlabel(\"z [RE]\")\n\n ax.set_box_aspect([1,1,1])\n ax.set_xlim3d([-20.0, -5.0])\n ax.set_ylim3d([0.0, 0.5])\n ax.set_zlim3d([-2.0, 3.0])\n\n ax.plot3D(x./RE, y./RE, z./RE)\nend\n\nmain()","category":"page"},{"location":"examples/visualization/demo_field_tracing_3d/","page":"Tracing field lines in 3D","title":"Tracing field lines in 3D","text":"","category":"page"},{"location":"examples/visualization/demo_field_tracing_3d/","page":"Tracing field lines in 3D","title":"Tracing field lines in 3D","text":"This page was generated using DemoCards.jl.","category":"page"},{"location":"examples/visualization/demo_lineextracting_pyplot_basic1/","page":"Extracting variable along a line","title":"Extracting variable along a line","text":"EditURL = \"/home/runner/work/Vlasiator.jl/Vlasiator.jl/docs/examples/visualization/demo_lineextracting_pyplot_basic1.md\"","category":"page"},{"location":"examples/visualization/demo_lineextracting_pyplot_basic1/#demo_line_extract","page":"Extracting variable along a line","title":"Extracting variable along a line","text":"","category":"section"},{"location":"examples/visualization/demo_lineextracting_pyplot_basic1/","page":"Extracting variable along a line","title":"Extracting variable along a line","text":"(Image: Author) (Image: Update time)","category":"page"},{"location":"examples/visualization/demo_lineextracting_pyplot_basic1/","page":"Extracting variable along a line","title":"Extracting variable along a line","text":"This demo shows how to extract data alone a line across frames.","category":"page"},{"location":"examples/visualization/demo_lineextracting_pyplot_basic1/","page":"Extracting variable along a line","title":"Extracting variable along a line","text":"tip: Tip\nThis can be made faster by updating the data without deleting the lines.","category":"page"},{"location":"examples/visualization/demo_lineextracting_pyplot_basic1/","page":"Extracting variable along a line","title":"Extracting variable along a line","text":"using Vlasiator, PyPlot, Printf\nusing Vlasiator: RE # Earth radius, [m]\n\nfunction main()\n files = filter(contains(r\"^bulk.*\\.vlsv$\"), readdir())\n\n point1 = [0e8, 0, 0]\n point2 = [1.9e8, 0, 0]\n\n cellids, distances, coords =\n let meta = load(files[1])\n getcellinline(meta, point1, point2)\n end\n\n # time density temperature vx\n inputs = [\n 0.0 2.0e6 1.0e5 -5.0e5;\n 99.0 2.0e6 1.0e5 -5.0e5;\n 100.0 2.0e6 1.0e5 -8.0e5;\n 200.0 2.0e6 1.0e5 -8.0e5;\n 201.0 1.0e6 1.0e5 -8.0e5;\n 499.0 1.0e6 1.0e5 -8.0e5;\n 500.0 2.0e6 1.0e5 -5.0e5]\n\n ndigits = 4\n\n lim_rho = [0.0, 4.0e6]\n lim_v = [-2e5, 10e5]\n\n fig, ax = plt.subplots(2,1, figsize=(12,5))\n\n for (i, file) in enumerate(files)\n fileout = lpad(i, ndigits, '0')*\".png\"\n\n meta = load(file)\n rho = readvariable(meta, \"proton/vg_rho\", cellids)\n v = readvariable(meta, \"proton/vg_v\", cellids)\n vx = Vector{Float64}(undef, size(v,1))\n\n for k in axes(v,1)\n vx[k] = v[k][1]\n end\n\n t = readparameter(meta, \"time\")\n\n ax[1].plot(coords[1,:] ./ RE, rho, label=\"rho\")\n ax[1].set_ylim(lim_rho)\n ax[1].legend()\n ax[1].minorticks_on()\n\n ax[2].plot(coords[1,:] ./ RE, abs.(vx), label=\"vx\")\n ax[2].set_ylim(lim_v)\n ax[2].legend()\n ax[2].minorticks_on()\n\n xlabel(\"X\")\n\n j = searchsortedfirst(inputs[:,1], t) - 1\n if j == 0; j = 1; end\n str_title =\n @sprintf \"t=%4.1fs, rho=%4.1f/cc, vx=%4.1fkm/s\" t inputs[j,2]/1e6 inputs[j,4]/1e3\n fig.suptitle(str_title, fontsize=14)\n\n savefig(fileout, bbox_inches=\"tight\")\n\n ax[1].cla()\n ax[2].cla()\n end\n\n close(fig)\nend\n\nmain()","category":"page"},{"location":"examples/visualization/demo_lineextracting_pyplot_basic1/","page":"Extracting variable along a line","title":"Extracting variable along a line","text":"","category":"page"},{"location":"examples/visualization/demo_lineextracting_pyplot_basic1/","page":"Extracting variable along a line","title":"Extracting variable along a line","text":"This page was generated using DemoCards.jl.","category":"page"},{"location":"manual/#Manual","page":"User Guide","title":"Manual","text":"","category":"section"},{"location":"manual/","page":"User Guide","title":"User Guide","text":"Here we demonstrate some basic usages of processing Vlasiator output. A quick self-contained demo is shown with Pluto. For complete description of the arguments, please refer to the API documents or type ?function_name to display help message in the REPL.","category":"page"},{"location":"manual/#Common-physical-constants","page":"User Guide","title":"Common physical constants","text":"","category":"section"},{"location":"manual/","page":"User Guide","title":"User Guide","text":"A bunch of physical constants are predefined in Vlasiator.jl. To use them, you need to import explicitly, e.g. using Vlasiator: RE or prepend the module name like Vlasiator.RE.","category":"page"},{"location":"manual/","page":"User Guide","title":"User Guide","text":"Physical constant Value Meaning\nqₑ -1.60217662e-19 electron charge, [C]\nmₑ 9.10938356e-31 electron mass, [kg]\nqᵢ 1.60217662e-19 proton mass, [C]\nmᵢ 1.673557546e-27 proton mass, [kg]\nc 299792458. speed of light, [m/s]\nμ₀ 4π*1e-7 Vacuum permeability, [H/m]\nϵ₀ 1/(c^2*μ₀) Vacuum permittivity, [F/m]\nkB 1.38064852e-23 Boltzmann constant, [m²kg/(s²K)]\nRE 6.371e6 Earth radius, [m]","category":"page"},{"location":"manual/#Loading-VLSV-data","page":"User Guide","title":"Loading VLSV data","text":"","category":"section"},{"location":"manual/","page":"User Guide","title":"User Guide","text":"A quick way to obtain small test data can be found in F&Q. Larger open-access data can be found from the references in Vlasiator publications, e.g. Takahashi+ 2020. In this tutorial we are using the 2D test file bulk.2d.vlsv from vlsv_data if not specified.","category":"page"},{"location":"manual/","page":"User Guide","title":"User Guide","text":"Read meta data","category":"page"},{"location":"manual/","page":"User Guide","title":"User Guide","text":"file = \"bulk.2d.vlsv\"\nmeta = load(file)","category":"page"},{"location":"manual/","page":"User Guide","title":"User Guide","text":"The VLSV meta data contains information of file name, variable names, ordinary cell ID list, mesh sizes, species, and velocity cell structures. It is often the first argument for methods defined in Vlasiator.jl.","category":"page"},{"location":"manual/","page":"User Guide","title":"User Guide","text":"Read parameter","category":"page"},{"location":"manual/","page":"User Guide","title":"User Guide","text":"For convenience we support the do-block syntax that automatically closes the file stream.","category":"page"},{"location":"manual/","page":"User Guide","title":"User Guide","text":"t = load(file) do meta\n readparameter(meta, \"time\")\nend","category":"page"},{"location":"manual/","page":"User Guide","title":"User Guide","text":"Read variable meta data","category":"page"},{"location":"manual/","page":"User Guide","title":"User Guide","text":"readvariablemeta(meta, \"proton/vg_rho\")","category":"page"},{"location":"manual/","page":"User Guide","title":"User Guide","text":"A list of utility functions has been implemented for checking variable status. See here for the full list.","category":"page"},{"location":"manual/","page":"User Guide","title":"User Guide","text":"Read variable","category":"page"},{"location":"manual/","page":"User Guide","title":"User Guide","text":"data = meta[\"CellID\"]\n# Or equivalently\ndata = readvariable(meta, \"CellID\")","category":"page"},{"location":"manual/","page":"User Guide","title":"User Guide","text":"The variable reading is designed for cells, which takes cell ID(s) as the 3rd argument if specified. The same interface works for both DCCRG grid (for storing cell centered quantities like plasma moments) and FS grid (for storing field solver related quantities on a uniform high resolution mesh) variables. By default the returned DCCRG variable array is sorted by cell IDs. If in any case you want the original unsorted version as being stored in the file, use readvariable(meta, var, false).","category":"page"},{"location":"manual/","page":"User Guide","title":"User Guide","text":"Get variable at a given location","category":"page"},{"location":"manual/","page":"User Guide","title":"User Guide","text":"loc = [2.0, 0.0, 0.0]\nid = getcell(meta, loc)\nreadvariable(meta, \"CellID\", id)","category":"page"},{"location":"manual/","page":"User Guide","title":"User Guide","text":"Get variable along a line between two points","category":"page"},{"location":"manual/","page":"User Guide","title":"User Guide","text":"using Vlasiator: RE # Earth radii\npoint1 = [12RE, 0, 0]\npoint2 = [15RE, 0, 0]\ncellids, distances, coords = getcellinline(meta, point1, point2)\nvar_extract = readvariable(meta, \"VA\", cellids)","category":"page"},{"location":"manual/","page":"User Guide","title":"User Guide","text":"Extract variable at a static cell ID from a sequence of files under the same grid","category":"page"},{"location":"manual/","page":"User Guide","title":"User Guide","text":"files = [\"bulk.2d.vlsv\"]\nvar = \"CellID\"\nid = 1\nextractsat(files, var, id)","category":"page"},{"location":"manual/","page":"User Guide","title":"User Guide","text":"Downsample field solver variable to DCCRG grid","category":"page"},{"location":"manual/","page":"User Guide","title":"User Guide","text":"Vlasiator.downsample_fg(meta, \"fg_e\")","category":"page"},{"location":"manual/","page":"User Guide","title":"User Guide","text":"Upsample DCCRG variable to field solver grid","category":"page"},{"location":"manual/","page":"User Guide","title":"User Guide","text":"data = Vlasiator.read_variable_as_fg(meta, \"proton/vg_rho\")\n# Equivalent to the above, but faster\ndata = let\n tmp = Vlasiator.fillmesh(meta, [\"proton/vg_rho\"]; maxamronly=true)[1][1][1]\n reshape(tmp, size(tmp)[2:end])\nend","category":"page"},{"location":"manual/","page":"User Guide","title":"User Guide","text":"This is useful when corresponding DCCRG variables are not saved, or a uniform mesh is required for further analysis.","category":"page"},{"location":"manual/","page":"User Guide","title":"User Guide","text":"Compare VLSV files","category":"page"},{"location":"manual/","page":"User Guide","title":"User Guide","text":"One may want to check if two vlsv files are identical. This is tricky because","category":"page"},{"location":"manual/","page":"User Guide","title":"User Guide","text":"the structure of VLSV format does not guarantee the writing order in parallel processing;\nnumerical error accumulates with floating point representation, especially with fastmath option.","category":"page"},{"location":"manual/","page":"User Guide","title":"User Guide","text":"The issame method does not check quantities that are related to the MPI writing sequence: for some reasons, even file sizes may vary depending on the number of MPI processes!","category":"page"},{"location":"manual/","page":"User Guide","title":"User Guide","text":"issame(file1, file2)","category":"page"},{"location":"manual/","page":"User Guide","title":"User Guide","text":"There is an optional third argument to issame for setting the relative difference tolerance, with default being 1e-4. In practice relative difference works better for \"large\" numbers, and absolute difference works better for \"small\" numbers.","category":"page"},{"location":"manual/#Computing-derived-quantities","page":"User Guide","title":"Computing derived quantities","text":"","category":"section"},{"location":"manual/","page":"User Guide","title":"User Guide","text":"Vlasiator.jl is capable of computing plasma moments and some predefined derived quantities and saving them directly into VLSV files. To avoid confusion about variable names, the conventions are","category":"page"},{"location":"manual/","page":"User Guide","title":"User Guide","text":"raw quantities are all lowercases;\nall predefined derived variable names start with a capital letter;\nexceptions are for aliases (e.g. \"n\").","category":"page"},{"location":"manual/","page":"User Guide","title":"User Guide","text":"To obtain a derived quantity, use either a key of string or symbol,","category":"page"},{"location":"manual/","page":"User Guide","title":"User Guide","text":"beta = meta[\"Beta\"]\nVA = meta[:VA]","category":"page"},{"location":"manual/","page":"User Guide","title":"User Guide","text":"Here is a full list of available quantities[1]:","category":"page"},{"location":"manual/","page":"User Guide","title":"User Guide","text":"Derived variable name Meaning Required variable[2]\nBmag magnetic field magnitude vg_b_vol\nEmag electric field magnitude vg_e_vol\nVmag bulk speed vg_v\nBhat unit magnetic field vg_b_vol\nVS sound speed vg_ptensor_diagonal; vg_rho\nVA Alfvén speed vg_rho; Bmag\nMA Alfvén Mach number Vmag; VA\nMS Sonic Mach number Vmag; VS\nEpar mathbfE_parallel vg_e_vol; Bhat\nEperp mathbfE_perp vg_e_vol; Bhat\nVpar bulk velocity parallelmathbfB vg_v; vg_b_vol\nVperp bulk velocity perp mathbfB vg_v; vg_b_vol\nVth proton thermal velocity P; vg_rho\nP scalar thermal pressure vg_ptensor_diagonal\nPpar pressure parallelmathbfB vg_ptensor_diagonal; vg_b_vol\nPperp pressure perp mathbfB vg_ptensor_offdiagonal; vg_b_vol\nT scalar temperature P; vg_rho\nTpar temperature parallelmathbfB vg_rho; vg_ptensor_diagonal; vg_b_vol\nTperp temperature perp mathbfB vg_rho; vg_ptensor_offdiagonal; vg_b_vol\nTanisotropy T_perp T_parallel Tpar; Tperp\nJ current density vg_b_vol\nJpar j_parallel vg_b_vol\nJperp j_perp vg_b_vol\nProtated pressure tensor with widehatz parallel mathbfB vg_b_vol; vg_ptensor_diagonal; vg_ptensor_offdiagonal\nPanisotropy P_perp P_parallel ptensor; B\nPram dynamic ram pressure vg_rho; Vmag\nPb magnetic pressure vg_b_vol\nPoynting Poynting flux E; B\nBeta plasma beta, P P_B P; vg_b_vol\nBetaStar modified beta, (P+P_ram)P_B P; Pram; vg_b_vol\nIonInertial proton inertial length vg_rho\nLarmor proton Larmor radius Vth; Bmag\nGyroperiod proton gyroperiod Bmag\nPlasmaPeriod plasma oscillation period vg_rho\nGyrofrequency proton gyro-frequency Bmag\nOmegap plasma frequency (proton) vg_rho\nMagneticTension magnetic tension force vg_b_vol\nn proton number density vg_rho","category":"page"},{"location":"manual/","page":"User Guide","title":"User Guide","text":"which can also be found as keys of dictionary in vlsvvariables.jl.","category":"page"},{"location":"manual/","page":"User Guide","title":"User Guide","text":"[1]: For species specific variables, you need to add the species name at the front, separated by a slash. For example, the proton bulk velocity is a string proton/vg_v.","category":"page"},{"location":"manual/","page":"User Guide","title":"User Guide","text":"[2]: If a required variable exists in the VLSV file, we try to use it directly instead of calculating from other variables. The interpolated FS grid variables onto DCCRG grid are preferred over original FS grid variables.","category":"page"},{"location":"manual/","page":"User Guide","title":"User Guide","text":"note: Note\nIn Vlasiator, the cells inside the inner boundary (which is usually a sphere/circle) are filled with zero density values. This is then used to identify the inner boundary for all other quantities. Therefore, if you are manipulating directly on data, make sure that the nonsense values inside the inner boundary are excluded. One way to do this can be found in vlsvvariables.jl.","category":"page"},{"location":"manual/#Velocity-space-moments","page":"User Guide","title":"Velocity space moments","text":"","category":"section"},{"location":"manual/","page":"User Guide","title":"User Guide","text":"We can also calculate plasma moments from the saved VLSV velocity space distributions.","category":"page"},{"location":"manual/","page":"User Guide","title":"User Guide","text":"meta = load(\"bulk.1d.vlsv\")\ncellid = 5\n# VDF cell indexes and values, with sparsity\nvcellids, vcellf = readvcells(meta, cellid; species=\"proton\")\n\ngetdensity(meta, vcellf)\n\ngetvelocity(meta, vcellids, vcellf)\n# pressure tensor components Pxx, Pyy, Pzz, Pyz, Pzx, Pxy\ngetpressure(meta, vcellids, vcellf)\n# heat flux components qⱼⱼᵢ\ngetheatfluxvector(meta, vcellids, vcellf)","category":"page"},{"location":"manual/","page":"User Guide","title":"User Guide","text":"To obtain the original ordering of velocity cells,","category":"page"},{"location":"manual/","page":"User Guide","title":"User Guide","text":"vcellids_original = Vlasiator.reorder(meta.meshes[\"proton\"], vcellids)","category":"page"},{"location":"manual/","page":"User Guide","title":"User Guide","text":"Non-Maxwellianity represents the deviation from a Maxwellian distribution. Currently we have implemented a monitor quantity named \"Maxwellianity\", which is defined as -ln big 1(2n) int f(v) - g(v) dv big, where n is the density, f(vᵢ) is the actual VDF value at velocity cell i, and g(vᵢ) is the analytical Maxwellian (or strictly speaking, normal) distribution with the same density, bulk velocity and scalar pressure as f.","category":"page"},{"location":"manual/","page":"User Guide","title":"User Guide","text":"getmaxwellianity(meta, vcellids, vcellf)","category":"page"},{"location":"manual/","page":"User Guide","title":"User Guide","text":"The value ranges from [0, +∞], with 0 meaning not Maxwellian-distributed at all, and +∞ a perfect Maxwellian distribution. An alternative measure is the KL-divergence borrowed from statistics, where we select the reference distribution g to be again a Maxwellian derived from the actual distribution f:","category":"page"},{"location":"manual/","page":"User Guide","title":"User Guide","text":"getKLdivergence(meta, vcellids, vcellf)","category":"page"},{"location":"manual/","page":"User Guide","title":"User Guide","text":"In this case, 0 indicates perfect Maxwellian while +∞ indicates largest deviation. There is no unique definition of non-Maxwellianity, and we are still trying to see which one works better for describing plasma behaviors.","category":"page"},{"location":"manual/","page":"User Guide","title":"User Guide","text":"Sometimes it may be useful to recover the full 3D array of VDFs:","category":"page"},{"location":"manual/","page":"User Guide","title":"User Guide","text":"f = Vlasiator.reconstruct(meta.meshes[\"proton\"], vcellids, vcellf)","category":"page"},{"location":"manual/","page":"User Guide","title":"User Guide","text":"However, usually in practice there would be only about 1% nonzero values. The moments and maxwellianity calculations above all have an alternative form of using reconstructed VDFs as inputs.","category":"page"},{"location":"manual/#Plotting","page":"User Guide","title":"Plotting","text":"","category":"section"},{"location":"manual/","page":"User Guide","title":"User Guide","text":"Vlasiator.jl does not include any plotting library as explicit dependency, but it offers plotting recipes/wrappers once the target plotting package is used.","category":"page"},{"location":"manual/","page":"User Guide","title":"User Guide","text":"Currently PyPlot provides the most complete and fine-tuned plotting capabilities. Plotting with PyPlot by accepting MetaVLSV as the first argument is supported via VlasiatorPyPlot. Plots is a collection of plotting libraries with a uniform frontend, but it lacks fine-tuned supports and consistent APIs between different backends. Makie, a native Julia plotting library, is also supported via package extension after Julia 1.9 and a package VlasiatorMakie.jl before Julia 1.9. Without generating an system image from PackageCompiler, it would take ~20s for the first plot on Julia 1.9. However, Makie has made nice progress in layouts, widgets, docs, and all the tiny things, which makes it a strong candidate for the de facto plotting library in the future.","category":"page"},{"location":"manual/","page":"User Guide","title":"User Guide","text":"More examples of customized plots can be found in the repository.","category":"page"},{"location":"manual/#PyPlot-Backend","page":"User Guide","title":"PyPlot Backend","text":"","category":"section"},{"location":"manual/","page":"User Guide","title":"User Guide","text":"To trigger Matplotlib plotting that supports MetaVLSV, using VlasiatorPyPlot. All the functions with identical names as in Matplotlib accept all possible keyword arguments supported by Matplotlib, e.g. font width, font size, colormap, etc. For detailed adjustment of plots, please refer to the Matplotlib documentation for details.","category":"page"},{"location":"manual/","page":"User Guide","title":"User Guide","text":"warning: Warning\nThe method call to certain axes is not dispatched, e.g. ax.plot; as an alternative, one needs to pass ax as the third argument to the functions, e.g. plot(meta, \"rho\", ax). See Matplotlib's two interfaces for the history of the interfaces.","category":"page"},{"location":"manual/","page":"User Guide","title":"User Guide","text":"Scalar colored contour from 2D simulation","category":"page"},{"location":"manual/","page":"User Guide","title":"User Guide","text":"pcolormesh(meta, \"n\")","category":"page"},{"location":"manual/","page":"User Guide","title":"User Guide","text":"Vector z-component colored contour from 2D simulation in a manually set range","category":"page"},{"location":"manual/","page":"User Guide","title":"User Guide","text":"pcolormesh(meta, \"n\", comp=:z, colorscale=Log, axisunit=EARTH, vmin=1e6, vmax=2e6)","category":"page"},{"location":"manual/","page":"User Guide","title":"User Guide","text":"Vz colored contour from 2D simulation with prescribed colormap","category":"page"},{"location":"manual/","page":"User Guide","title":"User Guide","text":"pcolormesh(meta, \"proton/vg_v\", comp=:z, colorscale=Linear, cmap=matplotlib.cm.RdBu_r)","category":"page"},{"location":"manual/","page":"User Guide","title":"User Guide","text":"Derived quantity colored contour from 2D simulation (as long as the input variable is in the predefined dictionary)","category":"page"},{"location":"manual/","page":"User Guide","title":"User Guide","text":"pcolormesh(meta, \"Bmag\", comp=:z, colorscale=Linear, axisunit=SI)","category":"page"},{"location":"manual/","page":"User Guide","title":"User Guide","text":"Streamline from 2D simulation","category":"page"},{"location":"manual/","page":"User Guide","title":"User Guide","text":"streamplot(meta, \"proton/vg_v\", comp=\"xy\")","category":"page"},{"location":"manual/","page":"User Guide","title":"User Guide","text":"Quiver from 2D simulation","category":"page"},{"location":"manual/","page":"User Guide","title":"User Guide","text":"quiver(meta, \"proton/vg_v\", comp=\"xy\")","category":"page"},{"location":"manual/","page":"User Guide","title":"User Guide","text":"The comp option is used to specify the two vector components.","category":"page"},{"location":"manual/","page":"User Guide","title":"User Guide","text":"You can choose to use a linear/log/symlog color scale by setting keyword colorscale to Linear, Log, or SymLog, plot vector components by setting keyword op to :x, :y, :z, 1, 2, 3, 0 or :mag, and set axisunit to EARTH or SI etc.","category":"page"},{"location":"manual/","page":"User Guide","title":"User Guide","text":"Mesh denoted by cell centers","category":"page"},{"location":"manual/","page":"User Guide","title":"User Guide","text":"plotmesh(meta; projection=\"z\", color=\"k\")","category":"page"},{"location":"manual/","page":"User Guide","title":"User Guide","text":"Cut slice colored contour from 3D simulation","category":"page"},{"location":"manual/","page":"User Guide","title":"User Guide","text":"meta = load(\"bulk.amr.vlsv\")\npcolormesh(meta, \"proton/vg_rho\", normal=:y, origin=0.0)","category":"page"},{"location":"manual/","page":"User Guide","title":"User Guide","text":"Velocity distribution slice plot near a given spatial location","category":"page"},{"location":"manual/","page":"User Guide","title":"User Guide","text":"meta = load(\"bulk.1d.vlsv\")\ncoordinates = [0.0, 0.0, 0.0]\nvdfslice(meta, coordinates)","category":"page"},{"location":"manual/","page":"User Guide","title":"User Guide","text":"Quick interactive REPL-based function for data inspection","category":"page"},{"location":"manual/","page":"User Guide","title":"User Guide","text":"pui(meta)","category":"page"},{"location":"manual/","page":"User Guide","title":"User Guide","text":"Or pass filename directly like pui(file).","category":"page"},{"location":"manual/","page":"User Guide","title":"User Guide","text":"note: Note\nThis is an experimental feature. We plan to have GUI-based plotting support in the future.","category":"page"},{"location":"manual/","page":"User Guide","title":"User Guide","text":"For a full list available optional arguments, please refer to the doc for each method","category":"page"},{"location":"manual/#Plots-Backend","page":"User Guide","title":"Plots Backend","text":"","category":"section"},{"location":"manual/","page":"User Guide","title":"User Guide","text":"To trigger Plots.jl plotting, using Plots. This backend supports all available attributes provided by Plots.jl. By default it uses GR, but many other plotting libraries are also supported.","category":"page"},{"location":"manual/","page":"User Guide","title":"User Guide","text":"Scaler colored contour from 2D simulation","category":"page"},{"location":"manual/","page":"User Guide","title":"User Guide","text":"var = \"n\"\nheatmap(meta, var, aspect_ratio=:equal, c=:turbo)","category":"page"},{"location":"manual/","page":"User Guide","title":"User Guide","text":"Scaler colored contour with lines from 2D simulation","category":"page"},{"location":"manual/","page":"User Guide","title":"User Guide","text":"var = \"n\"\ncontourf(meta, var)","category":"page"},{"location":"manual/","page":"User Guide","title":"User Guide","text":"VDF projected slice in a normal direction","category":"page"},{"location":"manual/","page":"User Guide","title":"User Guide","text":"meta = load(\"bulk.1d.vlsv\")\nlocation = [0.0, 0.0, 0.0]\nvdfslice(meta, location)","category":"page"},{"location":"manual/#Makie-Backend","page":"User Guide","title":"Makie Backend","text":"","category":"section"},{"location":"manual/","page":"User Guide","title":"User Guide","text":"Makie plotting is supported via package extension after Julia 1.9. The extension is automatically loaded when both Vlasiator and one of the Makie backends (e.g. GLMakie, CairoMakie). Before Julia 1.9, a standalone package VlasiatorMakie.jl is designed for plotting with Makie. To trigger Makie plotting with OpenGL, using VlasiatorMakie, GLMakie.","category":"page"},{"location":"manual/","page":"User Guide","title":"User Guide","text":"You can either use intrinsic Makie plotting methods like","category":"page"},{"location":"manual/","page":"User Guide","title":"User Guide","text":"lines(meta, var) # 1D\nheatmap(meta, var) # 2D","category":"page"},{"location":"manual/","page":"User Guide","title":"User Guide","text":"or use full recipes for quick inspection of data","category":"page"},{"location":"manual/","page":"User Guide","title":"User Guide","text":"2D slices of 3D AMR data","category":"page"},{"location":"manual/","page":"User Guide","title":"User Guide","text":"vlslice(meta, var; normal=:x)","category":"page"},{"location":"manual/","page":"User Guide","title":"User Guide","text":"Orthognal slices of 3D AMR data","category":"page"},{"location":"manual/","page":"User Guide","title":"User Guide","text":"vlslices(meta, var)","category":"page"},{"location":"manual/","page":"User Guide","title":"User Guide","text":"2D slice of VDFs at a spatial cell","category":"page"},{"location":"manual/","page":"User Guide","title":"User Guide","text":"fig, ax = vdfslice(meta, location)\nfig","category":"page"},{"location":"manual/","page":"User Guide","title":"User Guide","text":"Orthognal slices of VDFs at a spatial cell","category":"page"},{"location":"manual/","page":"User Guide","title":"User Guide","text":"vdfslices(meta, location)","category":"page"},{"location":"manual/","page":"User Guide","title":"User Guide","text":"3D scatter of VDFs at a spatial cell","category":"page"},{"location":"manual/","page":"User Guide","title":"User Guide","text":"fig, ax = vdfvolume(meta, location)\nfig","category":"page"},{"location":"manual/","page":"User Guide","title":"User Guide","text":"The interactive plots are available through the OpenGL backend of Makie GLMakie. For noninteractive high fidelity plots, we can also use the Cairo backend of Makie CairoMakie. Other options can be found at Makie Ecosystem.","category":"page"},{"location":"manual/","page":"User Guide","title":"User Guide","text":"using Vlasiator, GLMakie\n\nfile = \"bulk.2d.vlsv\"\nmeta = load(file)\n\nheatmap(meta, \"proton/vg_rho\")","category":"page"},{"location":"manual/","page":"User Guide","title":"User Guide","text":"3D isosurface:","category":"page"},{"location":"manual/","page":"User Guide","title":"User Guide","text":"fig = volume(meta, \"fg_b\", EARTH, 3; algorithm=:iso, isovalue=0.0, isorange=1e-9)","category":"page"},{"location":"manual/","page":"User Guide","title":"User Guide","text":"Single figure contour plot:","category":"page"},{"location":"manual/","page":"User Guide","title":"User Guide","text":"fig = Figure(size=(700, 600), fontsize=18)\nga = fig[1,1] = GridLayout()\nax = Axis(fig[1,1],\n aspect = DataAspect(),\n title = \"t = $(round(meta.time, digits=1))s\",\n xlabel = L\"x [$R_E$]\",\n ylabel = L\"y [$R_E$]\"\n)\nhmap = heatmap!(meta, \"proton/vg_rho\", colormap=:turbo)\ncbar = Colorbar(fig, hmap, label=L\"$\\rho$ [amu/cc]\", width=13,\n ticksize=13, tickalign=1, height=Relative(1))\nfig[1,2] = cbar\ncolgap!(ga, 1)","category":"page"},{"location":"manual/","page":"User Guide","title":"User Guide","text":"Multi-figure contour plots:","category":"page"},{"location":"manual/","page":"User Guide","title":"User Guide","text":"fig = Figure(size=(1100, 800), fontsize=18)\n\naxes = []\nv_str = [\"CellID\", \"proton/vg_rho\", \"proton/vg_v\",\n \"vg_pressure\", \"vg_b_vol\", \"vg_e_vol\"]\nc_str = [\"\", L\"$\\rho$ [amu/cc]\", \"[m/s]\", \"[Pa]\", \"[T]\", \"[V/m]\"]\nc = 1\n\nfor i in 1:2, j in 1:2:5\n ax = Axis(fig[i,j], aspect=DataAspect(),\n xgridvisible=false, ygridvisible=false,\n title = v_str[c],\n xlabel = L\"x [$R_E$]\",\n ylabel = L\"y [$R_E$]\")\n hmap = heatmap!(meta, v_str[c], colormap=:turbo)\n cbar = Colorbar(fig, hmap, label=c_str[c], width=13,\n ticksize=13, tickalign=1, height=Relative(1))\n fig[i, j+1] = cbar\n c += 1\n push!(axes, ax) # just in case you need them later.\nend\n\nfig[0, :] = Label(fig, \"t = $(round(meta.time, digits=1))s\")","category":"page"},{"location":"manual/","page":"User Guide","title":"User Guide","text":"Adjusting axis limits:","category":"page"},{"location":"manual/","page":"User Guide","title":"User Guide","text":"location = [0, 0, 0]\nfig = vdfslice(meta, location)\nxlims!(fig.content[1], -1000, 1000)\nylims!(fig.content[1], -1000, 1000)\nlimits!(fig.content[1], 0, 10, 0, 10) # xmin, xmax, ymin, ymax","category":"page"},{"location":"manual/","page":"User Guide","title":"User Guide","text":"Saving figure:","category":"page"},{"location":"manual/","page":"User Guide","title":"User Guide","text":"fig = vdfvolume(meta, location)\nsave(\"output.png\", fig)","category":"page"},{"location":"manual/","page":"User Guide","title":"User Guide","text":"The resolution is a property of the Figure object returned from the function.","category":"page"},{"location":"manual/#Appending-to-VLSV","page":"User Guide","title":"Appending to VLSV","text":"","category":"section"},{"location":"manual/","page":"User Guide","title":"User Guide","text":"We are able to compute derived quantities from an original VLSV file and generate a new VLSV output with new quantities included.","category":"page"},{"location":"manual/","page":"User Guide","title":"User Guide","text":"meta = load(\"bulk.1d.vlsv\")\nvmag = readvariable(meta, \"Vmag\")\npa = readvariable(meta, \"Panisotropy\")\nvars = Vector{Tuple{VecOrMat, String, VarInfo}}(undef, 0)\nusing LaTeXStrings\npush!(vars, (vmag, \"vmag\", VarInfo(\"m/s\", L\"$\\mathrm{m}/mathrm{s}$\", L\"$V$\", \"\")))\npush!(vars, (pa, \"panisotropy\", VarInfo(\"\", \"\", \"\", \"\")))\n\nwrite_vlsv(\"bulk.1d.vlsv\", \"bulk.1d_new.vlsv\", vars)","category":"page"},{"location":"manual/","page":"User Guide","title":"User Guide","text":"note: Note\nWriting new FsGrid variables is not supported. All quantities from the original file is maintained.","category":"page"},{"location":"manual/#Converting-to-VTK","page":"User Guide","title":"Converting to VTK","text":"","category":"section"},{"location":"manual/","page":"User Guide","title":"User Guide","text":"We can convert VLSV files into VTK format. Since DCCRG is Cartesian based with uniform spacing, each level of mesh refinement corresponds to a VTK image file, and the cell refinement relationships are stored in vtkGhostType as well as the vthb file.","category":"page"},{"location":"manual/","page":"User Guide","title":"User Guide","text":"To convert a VLSV file into VTK,","category":"page"},{"location":"manual/","page":"User Guide","title":"User Guide","text":"write_vtk(file)","category":"page"},{"location":"manual/","page":"User Guide","title":"User Guide","text":"This function accepts either string of file names or MetaVLSV.","category":"page"},{"location":"manual/","page":"User Guide","title":"User Guide","text":"To see the full list of options, please refer to the documentation in API Reference. Example usage can be found here.","category":"page"},{"location":"manual/","page":"User Guide","title":"User Guide","text":"warning: Warning\nAs of ParaView 5.9.1, there are display issues with VTKOverlappingAMR. However, we can read the generated image files directly. There is also an keyword argument for write_vtk called maxamronly: when it is set to true, then only the image file at the highest refinement level is generated. This part is experimental and subject to change in the future.","category":"page"},{"location":"manual/#Tracking-log-files","page":"User Guide","title":"Tracking log files","text":"","category":"section"},{"location":"manual/","page":"User Guide","title":"User Guide","text":"The runtime performance per iteration can be monitored through log files:","category":"page"},{"location":"manual/","page":"User Guide","title":"User Guide","text":"file = \"logfile.txt\"\ntimestamps, speed = readlog(file)","category":"page"},{"location":"manual/","page":"User Guide","title":"User Guide","text":"Here is a live demo.","category":"page"},{"location":"manual/#Examples","page":"User Guide","title":"Examples","text":"","category":"section"},{"location":"manual/","page":"User Guide","title":"User Guide","text":"More examples are provided about","category":"page"},{"location":"manual/","page":"User Guide","title":"User Guide","text":"Plotting with PyPlot\nPlotting with Plots\nExtracing variable along a line\nField line tracing\nSimulation log file tracking\nConverting VLSV to VTK format\nParallel post-processing\nFinding X-points and O-points in 2D reconnections","category":"page"},{"location":"manual/","page":"User Guide","title":"User Guide","text":"Feel free to check those out and try on your data!","category":"page"},{"location":"examples/visualization/demo_2dcontourseries_pyplot/","page":"2D contour plots","title":"2D contour plots","text":"EditURL = \"/home/runner/work/Vlasiator.jl/Vlasiator.jl/docs/examples/visualization/demo_2dcontourseries_pyplot.md\"","category":"page"},{"location":"examples/visualization/demo_2dcontourseries_pyplot/#demo_2d_contour","page":"2D contour plots","title":"2D contour plots","text":"","category":"section"},{"location":"examples/visualization/demo_2dcontourseries_pyplot/","page":"2D contour plots","title":"2D contour plots","text":"(Image: Author) (Image: Update time)","category":"page"},{"location":"examples/visualization/demo_2dcontourseries_pyplot/","page":"2D contour plots","title":"2D contour plots","text":"This script creates contours from a series of input files with a fixed color range. Combined with ffmpeg, we can easily make animations from data.","category":"page"},{"location":"examples/visualization/demo_2dcontourseries_pyplot/","page":"2D contour plots","title":"2D contour plots","text":"using Vlasiator, VlasiatorPyPlot, Printf\n\nfiles = filter(contains(r\"^bulk.*\\.vlsv$\"), readdir())\nnfile = length(files)\n# Set output directory\nconst outdir = \"out/\"\n\nmeta = load(files[1])\nconst varname = \"proton/vg_rho\"\n\nfig, ax = plt.subplots()\n\nconst comp = :z # vector component for plotting (if applicable)\nconst axisunit = EARTH\nconst colorscale = Log\nconst addcolorbar = true\n# Choose colormap\nconst cmap = matplotlib.cm.turbo\n# Set data plotting range\nconst vmin = 7.0e4\nconst vmax = 2.5e6\n\npArgs = Vlasiator.set_args(meta, varname, axisunit; normal=:none)\n\nx1, x2 = Vlasiator.get_axis(pArgs)\n\nnorm, ticks = set_colorbar(colorscale, vmin, vmax)\n\nfakedata = zeros(Float32, length(x2), length(x1))\n\nc = ax.pcolormesh(x1, x2, fakedata; norm, cmap)\n\nVlasiatorPyPlot.set_plot(c, ax, pArgs, ticks, addcolorbar)\n\nfor (i, file) in enumerate(files)\n @info \"$i out of $nfile\"\n local meta = load(file)\n\n var = meta[varname]\n t = readparameter(meta, \"time\")\n\n data = Vlasiator.prep2d(meta, varname, comp)'\n c.set_array(data)\n\n str_title = @sprintf \"t= %4.1fs\" t\n ax.set_title(str_title)\n\n savefig(outdir*lpad(i, 4, '0')*\".png\", bbox_inches=\"tight\", dpi=100)\nend\n\nclose()","category":"page"},{"location":"examples/visualization/demo_2dcontourseries_pyplot/","page":"2D contour plots","title":"2D contour plots","text":"","category":"page"},{"location":"examples/visualization/demo_2dcontourseries_pyplot/","page":"2D contour plots","title":"2D contour plots","text":"This page was generated using DemoCards.jl.","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"EditURL = \"/home/runner/work/Vlasiator.jl/Vlasiator.jl/docs/examples/index.md\"","category":"page"},{"location":"examples/#examples","page":"Examples","title":"Examples","text":"","category":"section"},{"location":"examples/","page":"Examples","title":"Examples","text":"This section contains thorough examples for using Vlasiator.jl.","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"","category":"page"},{"location":"examples/#Postprocess","page":"Examples","title":"Postprocess","text":"","category":"section"},{"location":"examples/","page":"Examples","title":"Examples","text":"
","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"
\n
\n
","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"This demo shows how to convert VLSV to VTK","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"
","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"(Image: card-cover-image)","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"
\n
","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"Converting to VTK","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"
\n
","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"
\n
\n
","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"This demo shows how to extract data for a virtual satellite","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"
","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"(Image: card-cover-image)","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"
\n
","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"Virtual satellite","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"
\n
","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"
\n
\n
","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"This demo shows how to extract data for virtual satellites","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"
","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"(Image: card-cover-image)","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"
\n
","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"Virtual satellites","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"
\n
","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"
\n
\n
","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"This demo shows how to extract data for virtual satellites","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"
","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"(Image: card-cover-image)","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"
\n
","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"Virtual satellites","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"
\n
","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"
\n
\n
","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"This demo shows how to extract EM fields on a selected 2D slice","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"
","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"(Image: card-cover-image)","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"
\n
","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"Extract EM fields on a slice","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"
\n
","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"
\n
\n
","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"This demo shows how to extract variables along a line across multiple frames","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"
","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"(Image: card-cover-image)","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"
\n
","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"Extract variables along a line","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"
\n
","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"
\n
\n
","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"This demo shows how to extract logfile.txt information","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"
","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"(Image: card-cover-image)","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"
\n
","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"Log tracking","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"
\n
","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"
\n
\n
","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"This demo shows how to find X-points in 2D","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"
","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"(Image: card-cover-image)","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"
\n
","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"Find X-points in 2D","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"
\n
","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"
\n
\n
","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"This demo shows how to extract variables along the magnetopause","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"
","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"(Image: card-cover-image)","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"
\n
","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"Extract variables along the magnetopause","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"
\n
","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"
\n
\n
","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"This demo shows how to identify EMIC and mirror modes","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"
","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"(Image: card-cover-image)","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"
\n
","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"Identify EMIC and mirror modes","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"
\n
","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"
\n
\n
","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"This demo shows how to search for waves","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"
","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"(Image: card-cover-image)","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"
\n
","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"Search waves","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"
\n
","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"
\n
\n
","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"This demo shows how to track waves and plot the dispersion relation","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"
","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"(Image: card-cover-image)","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"
\n
","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"Track waves","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"
\n
","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"
\n
\n
","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"This demo shows how to find X/O-points","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"
","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"(Image: card-cover-image)","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"
\n
","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"Find X- and O-points","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"
\n
","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"
\n
\n
","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"This demo shows how to find X-points in 2D","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"
","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"(Image: card-cover-image)","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"
\n
","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"Find X-points in 2D","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"
\n
","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"
","category":"page"},{"location":"examples/#Visualization","page":"Examples","title":"Visualization","text":"","category":"section"},{"location":"examples/","page":"Examples","title":"Examples","text":"
","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"
\n
\n
","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"This demo shows how to create animation for 1D plots","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"
","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"(Image: card-cover-image)","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"
\n
","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"1D animation","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"
\n
","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"
\n
\n
","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"This demo shows how to generate complex plots with multi-processing","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"
","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"(Image: card-cover-image)","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"
\n
","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"Combined plots with multi-processing","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"
\n
","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"
\n
\n
","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"This demo shows how to generate complex plots","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"
","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"(Image: card-cover-image)","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"
\n
","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"Combined plots","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"
\n
","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"
\n
\n
","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"This demo shows how to generate 2D colored contour animation","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"
","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"(Image: card-cover-image)","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"
\n
","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"2D contour plot animation","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"
\n
","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"
\n
\n
","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"This demo shows how to generate 2D colored contours with multi-processing","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"
","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"(Image: card-cover-image)","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"
\n
","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"2D contour plots with multi-processing","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"
\n
","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"
\n
\n
","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"This demo shows how to share colorbar between subplots","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"
","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"(Image: card-cover-image)","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"
\n
","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"Shared colorbar","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"
\n
","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"
\n
\n
","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"This demo shows how to generate 2D colored contours","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"
","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"(Image: card-cover-image)","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"
\n
","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"2D contour plots","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"
\n
","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"
\n
\n
","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"This demo shows how to plot 2D colored contour with streamlines","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"
","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"(Image: card-cover-image)","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"
\n
","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"2D contour plot with streamlines","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"
\n
","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"
\n
\n
","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"This demo shows how to plot 2D colored contour with streamlines and levels","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"
","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"(Image: card-cover-image)","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"
\n
","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"2D contour plot with streamlines and levels","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"
\n
","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"
\n
\n
","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"This demo shows how to plot 2D colored contour slices for 3D data","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"
","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"(Image: card-cover-image)","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"
\n
","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"Orthogonal slices","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"
\n
","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"
\n
\n
","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"This demo shows how to plot field lines with multi-processing","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"
","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"(Image: card-cover-image)","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"
\n
","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"Field lines with customized seeds via multi-processing","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"
\n
","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"
\n
\n
","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"This demo shows how to plot field lines with handpicked seeds.","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"
","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"(Image: card-cover-image)","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"
\n
","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"Field lines with customized seeds","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"
\n
","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"
\n
\n
","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"This demo shows how to extract the bow shock location and save into file","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"
","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"(Image: card-cover-image)","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"
\n
","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"Extracting bow shock location","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"
\n
","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"
\n
\n
","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"This demo shows how to extract the bow shock location and plot","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"
","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"(Image: card-cover-image)","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"
\n
","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"Extracting bow shock location","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"
\n
","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"
\n
\n
","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"This demo shows how to extract difference between grids","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"
","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"(Image: card-cover-image)","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"
\n
","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"Extracting differences between FsGrid and DCCRG variables","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"
\n
","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"
\n
\n
","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"This demo shows how to plot energy spectrum at a fixed point","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"
","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"(Image: card-cover-image)","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"
\n
","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"Energy spectrum at a fixed point","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"
\n
","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"
\n
\n
","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"This demo shows how to trace streamlines in a 2D field","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"
","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"(Image: card-cover-image)","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"
\n
","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"Tracing field lines in 2D","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"
\n
","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"
\n
\n
","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"This demo shows how to trace streamlines in a 3D field","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"
","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"(Image: card-cover-image)","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"
\n
","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"Tracing field lines in 3D","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"
\n
","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"
\n
\n
","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"This demo shows how to extract variables along a line with multi-processing","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"
","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"(Image: card-cover-image)","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"
\n
","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"Extracting variables along a line with multi-processing","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"
\n
","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"
\n
\n
","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"This demo shows how to extract a variable along a line","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"
","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"(Image: card-cover-image)","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"
\n
","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"Extracting variable along a line","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"
\n
","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"
\n
\n
","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"This demo shows how to plot variable along a line","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"
","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"(Image: card-cover-image)","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"
\n
","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"Plotting variable along a line","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"
\n
","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"
\n
\n
","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"This demo shows how to plot variables along a line","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"
","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"(Image: card-cover-image)","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"
\n
","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"Plotting variables along a line","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"
\n
","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"
\n
\n
","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"This demo shows how to plot mesh","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"
","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"(Image: card-cover-image)","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"
\n
","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"Plotting mesh","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"
\n
","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"
\n
\n
","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"This demo shows how to plot across nodes","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"
","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"(Image: card-cover-image)","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"
\n
","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"Plotting with multi-nodes","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"
\n
","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"
\n
\n
","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"This demo shows how to extract poynting flux on a subdomain","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"
","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"(Image: card-cover-image)","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"
\n
","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"Poynting flux","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"
\n
","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"
\n
\n
","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"This demo shows how to plot pressure tensor","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"
","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"(Image: card-cover-image)","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"
\n
","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"Pressure tensor","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"
\n
","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"
\n
\n
","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"This demo shows how to plot velocity distribution function","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"
","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"(Image: card-cover-image)","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"
\n
","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"VDF","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"
\n
","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"
\n
\n
","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"This demo shows how to plot velocity distribution functions","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"
","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"(Image: card-cover-image)","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"
\n
","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"VDFs along a line","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"
\n
","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"
\n
\n
","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"This demo shows how to plot vector components","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"
","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"(Image: card-cover-image)","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"
\n
","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"Vector components","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"
\n
","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"
","category":"page"},{"location":"examples/","page":"Examples","title":"Examples","text":"","category":"page"},{"location":"examples/postprocess/demo_wave_satellite_mt/","page":"Identify EMIC and mirror modes","title":"Identify EMIC and mirror modes","text":"EditURL = \"/home/runner/work/Vlasiator.jl/Vlasiator.jl/docs/examples/postprocess/demo_wave_satellite_mt.md\"","category":"page"},{"location":"examples/postprocess/demo_wave_satellite_mt/#demo_identify_EMIC_mirror","page":"Identify EMIC and mirror modes","title":"Identify EMIC and mirror modes","text":"","category":"section"},{"location":"examples/postprocess/demo_wave_satellite_mt/","page":"Identify EMIC and mirror modes","title":"Identify EMIC and mirror modes","text":"(Image: Author) (Image: Update time)","category":"page"},{"location":"examples/postprocess/demo_wave_satellite_mt/","page":"Identify EMIC and mirror modes","title":"Identify EMIC and mirror modes","text":"This demo shows how to identify EMIC and mirror modes in two frequency bands from single satellite data. For EMIC mode we check δB⟂ vs. δv⟂; for mirror mode we check δB∥ vs. δn. The moving box window size is decided empirically.","category":"page"},{"location":"examples/postprocess/demo_wave_satellite_mt/","page":"Identify EMIC and mirror modes","title":"Identify EMIC and mirror modes","text":"Usage:","category":"page"},{"location":"examples/postprocess/demo_wave_satellite_mt/","page":"Identify EMIC and mirror modes","title":"Identify EMIC and mirror modes","text":"julia -t 4 demo_wave_satellite_mt.jl","category":"page"},{"location":"examples/postprocess/demo_wave_satellite_mt/","page":"Identify EMIC and mirror modes","title":"Identify EMIC and mirror modes","text":"or","category":"page"},{"location":"examples/postprocess/demo_wave_satellite_mt/","page":"Identify EMIC and mirror modes","title":"Identify EMIC and mirror modes","text":"JULIA_NUM_THREADS=4 julia demo_wave_satellite_mt.jl","category":"page"},{"location":"examples/postprocess/demo_wave_satellite_mt/","page":"Identify EMIC and mirror modes","title":"Identify EMIC and mirror modes","text":"using Statistics: mean\nusing LinearAlgebra: ⋅, normalize!, norm\nusing DSP, PyPlot\nusing Vlasiator\nusing Vlasiator: μ₀, mᵢ, RE\nusing Polyester\n\n\"Extract variables at `loc` from VLSV `files`.\"\nfunction extract_vars(files, loc)\n nfiles = length(files)\n\n t = zeros(Float32, nfiles)\n n = zeros(Float32, nfiles)\n v = zeros(Float32, 3, nfiles)\n b = zeros(Float32, 3, nfiles)\n e = zeros(Float32, 3, nfiles)\n\n id = load(files[1]) do meta\n getcell(meta, loc)\n end\n\n # Extract data from each frame\n @batch for i = eachindex(files)\n meta = load(files[i])\n t[i] = meta.time\n n[i] = readvariable(meta, \"proton/vg_rho\", id)[1]\n v[:,i] = readvariable(meta, \"proton/vg_v\", id)\n b[:,i] = readvariable(meta, \"vg_b_vol\", id)\n e[:,i] = readvariable(meta, \"vg_e_vol\", id)\n end\n\n t, n, v, e, b\nend\n\nfunction moving_average(g::AbstractVector{<:AbstractFloat}, n::Int)\n nbackward = div(n,2)\n nforward = isodd(n) ? nbackward : nbackward - 1\n len = length(g)\n g_avg = similar(g)\n @inbounds @batch for i = 1:len\n lo = max(1, i - nbackward)\n hi = min(len, i + nforward)\n g_avg[i] = mean(@view g[lo:hi])\n end\n g_avg\nend\n\nfunction moving_average(g::AbstractMatrix{<:AbstractFloat}, n::Int)\n nbackward = div(n,2)\n nforward = isodd(n) ? nbackward : nbackward - 1\n len = size(g,2)\n g_avg = similar(g)\n for icomp = axes(g,1)\n @inbounds @batch for i = 1:len\n lo = max(1, i - nbackward)\n hi = min(len, i + nforward)\n g_avg[icomp,i] = mean(@view g[icomp, lo:hi])\n end\n end\n g_avg\nend\n\nfunction detrend(v::AbstractVector{<:AbstractFloat}; nbox=length(v)÷12)\n v̄ = moving_average(v, nbox)\n dv = v .- v̄\nend\n\nfunction detrend(v::AbstractMatrix{<:AbstractFloat}; nbox=size(v,2)÷12)\n v̄ = similar(v)\n for i in axes(v,1)\n v̄[i,:] = @views moving_average(v[i,:], nbox)\n end\n dv = v .- v̄\nend\n\nfunction align_yaxis(ax1, ax2)\n y_lims = [ax.get_ylim() for ax in [ax1, ax2]]\n\n # normalize both axes\n y_mags = ntuple(i -> y_lims[i][2] - y_lims[i][1], Val(2))\n y_lims_normalized = ntuple(i -> y_lims[i] ./ y_mags[i], Val(2))\n\n # find combined range\n y_new_lims_normalized = (min(y_lims_normalized[1][1],y_lims_normalized[2][1]),\n max(y_lims_normalized[1][2], y_lims_normalized[2][2]))\n\n # denormalize combined range to get new axes\n new_lim1 = y_new_lims_normalized .* y_mags[1]\n new_lim2 = y_new_lims_normalized .* y_mags[2]\n ax1.set_ylim(new_lim1)\n ax2.set_ylim(new_lim2)\n return\nend\n\nfunction main()\n files = filter(contains(r\"^bulk.*\\.vlsv$\"), readdir())\n\n # virtual satellite location\n loc = [12Vlasiator.RE, 0, 0]\n\n nbox = 40 # moving box size, [# of indices]\n fs = 2.0 # sampling rate, [Hz]\n\n println(\"Running with $(Threads.nthreads()) threads...\")\n println(\"Number of files: $(length(files))\")\n println(\"Extracting location: $loc [m]\")\n println(\"Sampling rate: $fs [Hz]\")\n println(\"Moving box window size: $(nbox / fs) [s]\")\n\n t, n, v, e, b = extract_vars(files, loc)\n\n bmag = [hypot(b[1,i], b[2,i], b[3,i]) for i in eachindex(n)]\n\n # Detrend before filtering to remove the lowest frequency changes\n dn = detrend(n; nbox)\n dbmag = detrend(bmag; nbox)\n\n n̄ = moving_average(n, nbox)\n b̄mag = moving_average(bmag, nbox)\n\n v̄a = @. b̄mag / sqrt(μ₀ * mᵢ * n̄)\n\n dv = detrend(v; nbox) # [m/s]\n db = detrend(b; nbox) # [T]\n\n # Decompose into parallel and perpendicular vector components\n b̂₀ = moving_average(b, nbox)\n for i in axes(b̂₀, 2)\n normalize!(@view b̂₀[:,i])\n end\n\n # δB∥\n db_par = [db[:,i] ⋅ b̂₀[:,i] for i in axes(db, 2)]\n # δB⟂\n db_perp = [norm(db[:,i] .- db_par[i] .* b̂₀[:,i]) for i in axes(db, 2)]\n # δv∥\n dv_par = [dv[:,i] ⋅ b̂₀[:,i] for i in axes(dv, 2)]\n # δv⟂\n dv_perp = [norm(dv[:,i] .- dv_par[i] .* b̂₀[:,i]) for i in axes(dv, 2)]\n\n designmethod = Butterworth(5)\n\n responsetype = Highpass(0.1; fs)\n dn_high = filtfilt(digitalfilter(responsetype, designmethod), dn)\n dbpar_high = filtfilt(digitalfilter(responsetype, designmethod), db_par)\n dbperp_high = filtfilt(digitalfilter(responsetype, designmethod), db_perp)\n dvperp_high = filtfilt(digitalfilter(responsetype, designmethod), dv_perp)\n\n responsetype = Bandpass(0.02, 0.067; fs)\n dn_low = filtfilt(digitalfilter(responsetype, designmethod), dn)\n dbpar_low = filtfilt(digitalfilter(responsetype, designmethod), db_par)\n\n color1 = \"tab:blue\"\n color2 = \"tab:red\"\n\n fig, axs = plt.subplots(3, 1; figsize=(13, 9), sharex=true, constrained_layout=true)\n\n fig.suptitle(\"Virtual satellite at $(string(round.(loc./RE, digits=2))) \"*L\"R_E\";\n fontsize=\"x-large\")\n\n axs[1].plot(t, dn_low ./ n̄, color1, label=L\"\\delta n, 0.02-0.067\\, Hz\")\n ax12 = axs[1].twinx()\n ax12.plot(t, dbpar_low ./ b̄mag, color=color2, label=L\"\\delta B, 0.02-0.067\\, Hz\")\n\n axs[2].plot(t, (dn_high ./ n̄), color1, label=L\"\\delta n, 0.1-1.0\\, Hz\")\n ax22 = axs[2].twinx()\n ax22.plot(t, (dbpar_high ./ b̄mag), color=color2, label=L\"\\delta B, 0.1-1.0\\, Hz\")\n\n axs[3].plot(t, dvperp_high ./ v̄a, color1, label=L\"\\delta v_\\perp, 0.1-1.0\\, Hz\")\n ax32 = axs[3].twinx()\n ax32.plot(t, dbperp_high ./ b̄mag, color=color2, label=L\"\\delta B, 0.1-1.0\\, Hz\")\n\n axs[3].set_xlabel(\"time [s]\"; fontsize=\"large\")\n\n n_str = (L\"\\delta n /n\", L\"\\delta n / n\", L\"\\delta v_\\perp / V_A\")\n\n for (i, a) in enumerate(axs)\n a.hlines(0.0, t[1], t[end]; colors=\"k\", linestyle=\"dashed\", alpha=0.3)\n a.tick_params(axis=\"y\", labelcolor=color1)\n a.xaxis.set_minor_locator(matplotlib.ticker.AutoMinorLocator())\n a.yaxis.set_minor_locator(matplotlib.ticker.AutoMinorLocator())\n a.grid(true)\n a.set_ylabel(n_str[i], color=color1, fontsize=14)\n end\n\n axtwin = (ax12, ax22, ax32)\n b_str = ( L\"\\delta B_\\parallel / B_0\", L\"\\delta B_\\parallel / B_0\", L\"\\delta B_\\perp / B_0\")\n\n for (i, a) in enumerate(axtwin)\n a.tick_params(axis=\"y\", labelcolor=color2)\n a.yaxis.set_minor_locator(matplotlib.ticker.AutoMinorLocator())\n a.set_ylabel(b_str[i], color=color2, fontsize=\"large\")\n align_yaxis(axs[i], a)\n end\n\n AnchoredText = matplotlib.offsetbox.AnchoredText\n\n at = AnchoredText(\n \"[0.02, 0.067] Hz band\", prop=Dict(\"size\"=>\"medium\"), frameon=true, loc=\"lower left\")\n at.patch.set_boxstyle(\"round,pad=0.,rounding_size=0.2\")\n axs[1].add_artist(at)\n\n at = AnchoredText(\n \"[0.1, 1.0] Hz band\", prop=Dict(\"size\"=>\"medium\"), frameon=true, loc=\"lower left\")\n at.patch.set_boxstyle(\"round,pad=0.,rounding_size=0.2\")\n axs[2].add_artist(at)\n\n at = AnchoredText(\n \"[0.1, 1.0] Hz band\", prop=Dict(\"size\"=>\"medium\"), frameon=true, loc=\"lower left\")\n at.patch.set_boxstyle(\"round,pad=0.,rounding_size=0.2\")\n axs[3].add_artist(at)\n\n savefig(\"virtual_satellite_wave.png\"; dpi=300)\nend\n\nmain()","category":"page"},{"location":"examples/postprocess/demo_wave_satellite_mt/","page":"Identify EMIC and mirror modes","title":"Identify EMIC and mirror modes","text":"","category":"page"},{"location":"examples/postprocess/demo_wave_satellite_mt/","page":"Identify EMIC and mirror modes","title":"Identify EMIC and mirror modes","text":"This page was generated using DemoCards.jl.","category":"page"},{"location":"examples/visualization/demo_2dplot_plots/","page":"2D contour plot with streamlines","title":"2D contour plot with streamlines","text":"EditURL = \"/home/runner/work/Vlasiator.jl/Vlasiator.jl/docs/examples/visualization/demo_2dplot_plots.md\"","category":"page"},{"location":"examples/visualization/demo_2dplot_plots/#demo_2d_contour_streamline","page":"2D contour plot with streamlines","title":"2D contour plot with streamlines","text":"","category":"section"},{"location":"examples/visualization/demo_2dplot_plots/","page":"2D contour plot with streamlines","title":"2D contour plot with streamlines","text":"(Image: Author) (Image: Update time)","category":"page"},{"location":"examples/visualization/demo_2dplot_plots/","page":"2D contour plot with streamlines","title":"2D contour plot with streamlines","text":"This demos shows how to reading 2D simulation data, zoom-in to a region of interest, and add streamlines on top of colored mesh.","category":"page"},{"location":"examples/visualization/demo_2dplot_plots/","page":"2D contour plot with streamlines","title":"2D contour plot with streamlines","text":"using Vlasiator, Plots\n\nfile = \"bulk.0000501.vlsv\"\nnameρ = \"rho\"\nnameV = \"rho_v\"\n\nboxcoords = Float64[0, 20, -15, 15]\n\nmeta = load(file)\n\nheatmap(meta, nameρ,\n xlim=(boxcoords[1], boxcoords[2]),\n ylim=(boxcoords[3], boxcoords[4]),\n aspect_ratio=:equal,\n c=:turbo)\n\n#=\n# Attributes can be modified afterwards, but it's slower.\nheatmap(meta, nameρ, c=:turbo)\nxlims!(boxcoords[1], boxcoords[2])\nylims!(boxcoords[3], boxcoords[4])\n=#\n\nstreamplot(meta, nameV, comp=\"xy\", color=\"w\", density=2.0)","category":"page"},{"location":"examples/visualization/demo_2dplot_plots/","page":"2D contour plot with streamlines","title":"2D contour plot with streamlines","text":"","category":"page"},{"location":"examples/visualization/demo_2dplot_plots/","page":"2D contour plot with streamlines","title":"2D contour plot with streamlines","text":"This page was generated using DemoCards.jl.","category":"page"},{"location":"examples/visualization/demo_3dcuts_pyplot/","page":"Orthogonal slices","title":"Orthogonal slices","text":"EditURL = \"/home/runner/work/Vlasiator.jl/Vlasiator.jl/docs/examples/visualization/demo_3dcuts_pyplot.md\"","category":"page"},{"location":"examples/visualization/demo_3dcuts_pyplot/#demo_3d_cuts","page":"Orthogonal slices","title":"Orthogonal slices","text":"","category":"section"},{"location":"examples/visualization/demo_3dcuts_pyplot/","page":"Orthogonal slices","title":"Orthogonal slices","text":"(Image: Author) (Image: Update time)","category":"page"},{"location":"examples/visualization/demo_3dcuts_pyplot/","page":"Orthogonal slices","title":"Orthogonal slices","text":"This demo shows how to plot 2D colored contour slices for 3D data.","category":"page"},{"location":"examples/visualization/demo_3dcuts_pyplot/","page":"Orthogonal slices","title":"Orthogonal slices","text":"using VlasiatorPyPlot, PyCall\n\naxes_grid1 = pyimport(\"mpl_toolkits.axes_grid1\")\nImageGrid = axes_grid1.ImageGrid\n\nfile = \"bulk1.0001000.vlsv\"\nnameρ = \"proton/vg_rho\"\ncolorscale = Log\naddcolorbar = false\n\nmeta = load(file)\n\n# normal cuts in the x,y,z directions\nfig = plt.figure(figsize=(12, 4))\ngrid = ImageGrid(fig, 111,\n nrows_ncols=(1, 3),\n axes_pad=0.85,\n cbar_mode=\"single\",\n cbar_location=\"right\",\n cbar_pad=0.1,\n label_mode=\"all\"\n )\n\nc1 = pcolormesh(meta, nameρ, grid[1]; normal=:x, addcolorbar, colorscale)\nc2 = pcolormesh(meta, nameρ, grid[2]; normal=:y, addcolorbar, colorscale)\nc3 = pcolormesh(meta, nameρ, grid[3]; normal=:z, addcolorbar, colorscale)\n\ncb = fig.colorbar(c3, cax=grid.cbar_axes[1])\ndatainfo = readvariablemeta(meta, nameρ)\n\ncb_title_str = datainfo.variableLaTeX\ncb_title_str *= \",[\"*datainfo.unitLaTeX*\"]\"\ncb_title = cb.ax.set_title(cb_title_str, fontsize=14, fontweight=\"bold\")\n\nplt.savefig(\"test.png\", bbox_inches=\"tight\")","category":"page"},{"location":"examples/visualization/demo_3dcuts_pyplot/","page":"Orthogonal slices","title":"Orthogonal slices","text":"","category":"page"},{"location":"examples/visualization/demo_3dcuts_pyplot/","page":"Orthogonal slices","title":"Orthogonal slices","text":"This page was generated using DemoCards.jl.","category":"page"},{"location":"examples/visualization/demo_mp_progressbar/","page":"Plotting with multi-nodes","title":"Plotting with multi-nodes","text":"EditURL = \"/home/runner/work/Vlasiator.jl/Vlasiator.jl/docs/examples/visualization/demo_mp_progressbar.md\"","category":"page"},{"location":"examples/visualization/demo_mp_progressbar/#demo_plot_multinode","page":"Plotting with multi-nodes","title":"Plotting with multi-nodes","text":"","category":"section"},{"location":"examples/visualization/demo_mp_progressbar/","page":"Plotting with multi-nodes","title":"Plotting with multi-nodes","text":"(Image: Author) (Image: Update time)","category":"page"},{"location":"examples/visualization/demo_mp_progressbar/","page":"Plotting with multi-nodes","title":"Plotting with multi-nodes","text":"This demos shows how to plot complex figures with more than one node using ClusterManagers. A progress bar is added for tracking.","category":"page"},{"location":"examples/visualization/demo_mp_progressbar/","page":"Plotting with multi-nodes","title":"Plotting with multi-nodes","text":"Usage:","category":"page"},{"location":"examples/visualization/demo_mp_progressbar/","page":"Plotting with multi-nodes","title":"Plotting with multi-nodes","text":"sbatch job.slurm","category":"page"},{"location":"examples/visualization/demo_mp_progressbar/","page":"Plotting with multi-nodes","title":"Plotting with multi-nodes","text":"# Sample Slurm job script\n#!/bin/bash -l\n# -*- mode: julia -*-\n#SBATCH --nodes=2\n#SBATCH --ntasks-per-node=1\n#SBATCH --time=00:03:00\n#SBATCH --mem-per-cpu=2G\n#SBATCH --partition=test\n#SBATCH --output=%x_%j.log\n#SBATCH --job-name=pmap\n\njulia demo_mp_progressbar.jl","category":"page"},{"location":"examples/visualization/demo_mp_progressbar/","page":"Plotting with multi-nodes","title":"Plotting with multi-nodes","text":"using Distributed, ProgressMeter\nusing Vlasiator: RE # Earth radius [m]\nusing ClusterManagers\naddprocs(SlurmManager(parse(Int, ENV[\"SLURM_NTASKS\"])),\n partition=ENV[\"SLURM_JOB_PARTITION\"],\n time=\"00:03:00\", # No environment variable for time limit\n mem_per_cpu=ENV[\"SLURM_MEM_PER_CPU\"])\n\n@everywhere begin\n using ParallelDataTransfer\n using Vlasiator, VlasiatorPyPlot, Printf, LaTeXStrings\n using Vlasiator: set_args, prep2d\nend\n\n@assert matplotlib.__version__ ≥ \"3.4\" \"Require Matplotlib version 3.4+ to use subfigure!\"\n\n@everywhere function init_figure(x1, x2)\n fig = plt.figure(myid(), constrained_layout=true, figsize=(12, 12))\n subfigs = fig.subfigures(1, 2, wspace=0.05)\n\n axsL = subfigs[1].subplots(4, 1, sharex=true)\n axsR = subfigs[2].subplots(2, 1, sharex=true, sharey=true)\n\n # Set line plots' axes\n axsL[end].set_xlim(x1, x2)\n\n axsL[1].set_ylim(ρmin, ρmax)\n axsL[2].set_ylim(vmin, vmax)\n axsL[3].set_ylim(pmin, pmax)\n axsL[4].set_ylim(bmin, bmax)\n for ax in axsL\n ax.xaxis.set_minor_locator(matplotlib.ticker.AutoMinorLocator())\n ax.yaxis.set_minor_locator(matplotlib.ticker.AutoMinorLocator())\n ax.grid(true)\n end\n\n axsL[end].set_xlabel(L\"x [$R_E$]\"; fontsize)\n axsL[1].set_ylabel(\"Density [amu/cc]\"; fontsize)\n axsL[2].set_ylabel(\"Velocity [km/s]\"; fontsize)\n axsL[3].set_ylabel(\"Pressure [nPa]\"; fontsize)\n axsL[4].set_ylabel(\"Magnetic field [nT]\"; fontsize)\n\n fakeline = loc\n l1 = axsL[1].plot(loc, fakeline, label=\"Proton density\", color=\"#1f77b4\")\n l2 = axsL[2].plot(loc, fakeline, label=\"Vx\", color=\"#1f77b4\")\n l3 = axsL[3].plot(loc, fakeline, label=\"Ram\", color=\"#1f77b4\")\n l4 = axsL[3].plot(loc, fakeline, label=\"Thermal\", color=\"#ff7f0e\")\n l5 = axsL[4].plot(loc, fakeline, label=\"Bz\", color=\"#1f77b4\")\n\n ls = (l1, l2, l3, l4, l5)\n\n axsL[2].legend(;loc=\"upper right\", fontsize)\n axsL[3].legend(;loc=\"lower right\", fontsize)\n axsL[4].legend(;loc=\"upper right\", fontsize)\n\n vl1 = axsL[1].vlines(loc[imagnetopause_], ρmin, ρmax;\n colors=\"r\", linestyle=\"dashed\", alpha=0.5)\n\n vl2 = axsL[2].vlines(loc[imagnetopause_], vmin, vmax;\n colors=\"r\", linestyle=\"dashed\", alpha=0.5)\n\n vl3 = axsL[3].vlines(loc[imagnetopause_], pmin, pmax;\n colors=\"r\", linestyle=\"dashed\", alpha=0.5)\n\n vl4 = axsL[4].vlines(loc[imagnetopause_], bmin, bmax;\n colors=\"r\", linestyle=\"dashed\", alpha=0.5)\n hl4 = axsL[4].hlines(0.0, loc[1], loc[end]; colors=\"k\", linestyle=\"dashed\", alpha=0.2)\n\n vlines = (vl1, vl2, vl3, vl4)\n\n for ax in axsR\n ax.set_aspect(\"equal\")\n\n # Set border line widths\n for loc in (\"left\", \"bottom\", \"right\", \"top\")\n edge = get(ax.spines, loc, nothing)\n edge.set_linewidth(2.0)\n end\n ax.xaxis.set_tick_params(width=2.0, length=3)\n ax.yaxis.set_tick_params(width=2.0, length=3)\n ax.xaxis.set_minor_locator(matplotlib.ticker.AutoMinorLocator())\n ax.yaxis.set_minor_locator(matplotlib.ticker.AutoMinorLocator())\n\n ax.set_ylabel(L\"Y [$R_E$]\"; fontsize)\n end\n\n axsR[2].set_xlabel(L\"X [$R_E$]\"; fontsize)\n\n axsR[1].set_title(\"Alfven speed\", fontsize=\"x-large\")\n axsR[2].set_title(\"Sound speed\", fontsize=\"x-large\")\n\n x, y = Vlasiator.get_axis(pArgs1)\n\n fakedata = zeros(Float32, length(y), length(x))\n\n c1 = axsR[1].pcolormesh(x, y, fakedata, norm=cnorm1, cmap=cmap)\n c2 = axsR[2].pcolormesh(x, y, fakedata, norm=cnorm2, cmap=cmap)\n\n cb1 = colorbar(c1; ax=axsR[1], ticks=cticks1, fraction=0.046, pad=0.04)\n cb2 = colorbar(c2; ax=axsR[2], ticks=cticks2, fraction=0.046, pad=0.04)\n\n cs = (c1, c2)\n\n for cb in (cb1, cb2)\n cb.ax.set_ylabel(\"[km/s]\"; fontsize)\n cb.outline.set_linewidth(1.0)\n end\n\n fig.suptitle(\"Density Pulse Run\", fontsize=\"xx-large\")\n\n return fig, subfigs, ls, vlines, cs\nend\n\nfunction update_vline(h, x)\n seg_old = h.get_segments()\n ymin = seg_old[1][1, 2]\n ymax = seg_old[1][2, 2]\n\n seg_new = [[[x, ymin] [x, ymax]]]\n\n h.set_segments(seg_new)\nend\n\n@everywhere function process(subfigs, ls, vlines, cs, file, cellids)\n isfile(\"../out/\"*file[end-8:end-5]*\".png\") && return\n\n println(\"file = $(basename(file))\")\n meta = load(file)\n\n p_extract = readvariable(meta, \"vg_pressure\", cellids) .* 1e9 |> vec # [nPa]\n rho_extract = readvariable(meta, \"proton/vg_rho\", cellids) |> vec\n v_extract = readvariable(meta, \"proton/vg_v\", cellids)\n vmag2_extract = sum(x -> x*x, v_extract, dims=1) |> vec\n pram_extract = rho_extract .* Vlasiator.mᵢ .* vmag2_extract .* 1e9 # [nPa]\n\n bz = readvariable(meta, \"vg_b_vol\", cellids)[3,:] .* 1e9 #[nT]\n\n ls[1][1].set_ydata(rho_extract ./ 1e6)\n ls[2][1].set_ydata(v_extract[1,:] ./ 1e3)\n ls[3][1].set_ydata(pram_extract)\n ls[4][1].set_ydata(p_extract)\n ls[5][1].set_ydata(bz)\n\n imagnetopause_ = findfirst(<(0.0), bz)\n for vline in vlines\n update_vline(vline, loc[imagnetopause_])\n end\n\n str_title = @sprintf \"Sun-Earth line, t= %4.1fs\" meta.time\n subfigs[1].suptitle(str_title, fontsize=\"x-large\")\n\n data = prep2d(meta, \"VA\")'\n cs[1].set_array(data ./ 1e3)\n\n data = prep2d(meta, \"VS\")'\n cs[2].set_array(data ./ 1e3)\n\n savefig(\"../out/\"*file[end-8:end-5]*\".png\", bbox_inches=\"tight\")\n return\nend\n\n## Parameters\n\ndir = \"mydatadir\"\nfiles = filter(contains(r\"^bulk.*\\.vlsv$\"), readdir(dir))\nnfiles = length(files)\n\nconst p = Progress(nfiles; showspeed=true)\nconst channel = RemoteChannel(()->Channel{Bool}(), 1)\n\n@passobj 1 workers() files\n\n@broadcast begin # on all workers\n const isinit = true\n # Set contour plots' axes and colorbars\n const cmap = matplotlib.cm.turbo\n colorscale = Linear\n axisunit = EARTH\n\n # Upper/lower limits for each variable\n const ρmin, ρmax = 0.0, 10.0 # [amu/cc]\n const vmin, vmax = -640.0, 0.0 # [km/s]\n const pmin, pmax = 0.0, 1.82 # [nPa]\n const bmin, bmax = -25.0, 60.0 # [nT]\n const vamin, vamax = 0.0, 250.0 # [km/s]\n const vsmin, vsmax = 30.0, 350.0 # [km/s]\n\n meta = load(files[1])\n\n const pArgs1 = set_args(meta, \"VA\", axisunit; normal=:none)\n const cnorm1, cticks1 = set_colorbar(colorscale, vamin, vamax)\n const cnorm2, cticks2 = set_colorbar(colorscale, vsmin, vsmax)\n\n const fontsize = 14\nend\n\nconst x1, x2 = 8.0, 29.0\nconst point1 = [x1, 0, 0] .* RE\nconst point2 = [x2, 0, 0] .* RE\n\nmeta = load(files[1])\ncellids, _, _ = getcellinline(meta, point1, point2)\npassobj(1, workers(), [:x1, :x2, :cellids])\n@broadcast const loc = range(x1, x2, length=length(cellids))\n\n## Execution\n\n@broadcast begin\n # initialize figure, axes, lines, and contours\n fig, subfigs, ls, vlines, cs = init_figure(x1, x2)\nend\n\n@sync begin # start two tasks which will be synced in the very end\n # the first task updates the progress bar\n @async while take!(channel)\n next!(p)\n end\n\n # the second task does the computation\n @async begin\n pmap(1:nfiles) do i\n process(subfigs, ls, vlines, cs, files[i], cellids)\n put!(channel, true) # trigger a progress bar update\n end\n put!(channel, false) # this tells the printing task to finish\n end\nend","category":"page"},{"location":"examples/visualization/demo_mp_progressbar/","page":"Plotting with multi-nodes","title":"Plotting with multi-nodes","text":"","category":"page"},{"location":"examples/visualization/demo_mp_progressbar/","page":"Plotting with multi-nodes","title":"Plotting with multi-nodes","text":"This page was generated using DemoCards.jl.","category":"page"},{"location":"examples/visualization/demo_mesh_pyplot/","page":"Plotting mesh","title":"Plotting mesh","text":"EditURL = \"/home/runner/work/Vlasiator.jl/Vlasiator.jl/docs/examples/visualization/demo_mesh_pyplot.md\"","category":"page"},{"location":"examples/visualization/demo_mesh_pyplot/#demo_plot_mesh","page":"Plotting mesh","title":"Plotting mesh","text":"","category":"section"},{"location":"examples/visualization/demo_mesh_pyplot/","page":"Plotting mesh","title":"Plotting mesh","text":"(Image: Author) (Image: Update time)","category":"page"},{"location":"examples/visualization/demo_mesh_pyplot/","page":"Plotting mesh","title":"Plotting mesh","text":"This demo shows how to plot mesh. The cell centers are represented by the markers.","category":"page"},{"location":"examples/visualization/demo_mesh_pyplot/","page":"Plotting mesh","title":"Plotting mesh","text":"using VlasiatorPyPlot\n\nconst file = \"test/data/bulk.amr.vlsv\"\nmeta = load(file)\n# 3D mesh\nfig = plt.figure()\nax = fig.add_subplot(projection=\"3d\")\n\nplotmesh(meta, marker=\"+\")\n\n# 2D mesh\nfig = plt.figure()\n\npcolormesh(meta, \"proton/vg_rho\"; axisunit=SI)\nplotmesh(meta, projection=\"y\"; color=\"w\")","category":"page"},{"location":"examples/visualization/demo_mesh_pyplot/","page":"Plotting mesh","title":"Plotting mesh","text":"","category":"page"},{"location":"examples/visualization/demo_mesh_pyplot/","page":"Plotting mesh","title":"Plotting mesh","text":"This page was generated using DemoCards.jl.","category":"page"},{"location":"examples/visualization/demo_poynting_mt_pyplot/","page":"Poynting flux","title":"Poynting flux","text":"EditURL = \"/home/runner/work/Vlasiator.jl/Vlasiator.jl/docs/examples/visualization/demo_poynting_mt_pyplot.md\"","category":"page"},{"location":"examples/visualization/demo_poynting_mt_pyplot/#demo_poynting","page":"Poynting flux","title":"Poynting flux","text":"","category":"section"},{"location":"examples/visualization/demo_poynting_mt_pyplot/","page":"Poynting flux","title":"Poynting flux","text":"(Image: Author) (Image: Update time)","category":"page"},{"location":"examples/visualization/demo_poynting_mt_pyplot/","page":"Poynting flux","title":"Poynting flux","text":"This demo shows how to extract the Poynting flux on a subdomain from 2D and plot.","category":"page"},{"location":"examples/visualization/demo_poynting_mt_pyplot/","page":"Poynting flux","title":"Poynting flux","text":"Usage:","category":"page"},{"location":"examples/visualization/demo_poynting_mt_pyplot/","page":"Poynting flux","title":"Poynting flux","text":"julia -t 4 demo_poynting_mt_pyplot.jl","category":"page"},{"location":"examples/visualization/demo_poynting_mt_pyplot/","page":"Poynting flux","title":"Poynting flux","text":"or","category":"page"},{"location":"examples/visualization/demo_poynting_mt_pyplot/","page":"Poynting flux","title":"Poynting flux","text":"JULIA_NUM_THREADS=4 julia demo_poynting_mt_pyplot.jl","category":"page"},{"location":"examples/visualization/demo_poynting_mt_pyplot/","page":"Poynting flux","title":"Poynting flux","text":"using Statistics: mean, normalize\nusing LinearAlgebra: ×, ⋅\nusing Vlasiator\nusing Vlasiator: μ₀, prep2d, prep2dslice\nusing DSP, Polyester, Printf, PyPlot\n\n\"\"\"\n extract_EM(files, range1, range2, pArgs, ndim=2; normal=:y, verbose=true)\n\nExtract time-series of EM fields from `files` within `range1` in the 1st dim and `range1` in\nthe 2nd dim.\n\"\"\"\nfunction extract_EM(files, range1, range2, pArgs, ndim=2; normal=:y, verbose=true)\n @assert ndim ∈ (2,3) \"Only support extracting EM fields from 2D/3D runs.\"\n nfile = length(files)\n e = zeros(Float32, 3, length(range1), length(range2), nfile)\n b = zeros(Float32, 3, length(range1), length(range2), nfile)\n\n if ndim == 2\n @batch for i in eachindex(files)\n verbose && println(\"i = $i/$nfile, file = $(files[i])\")\n meta = load(files[i])\n\n e[1,:,:,i] = prep2d(meta, \"vg_e_vol\", 1)[range1, range2]\n e[2,:,:,i] = prep2d(meta, \"vg_e_vol\", 2)[range1, range2]\n e[3,:,:,i] = prep2d(meta, \"vg_e_vol\", 3)[range1, range2]\n b[1,:,:,i] = prep2d(meta, \"vg_b_vol\", 1)[range1, range2]\n b[2,:,:,i] = prep2d(meta, \"vg_b_vol\", 2)[range1, range2]\n b[3,:,:,i] = prep2d(meta, \"vg_b_vol\", 3)[range1, range2]\n end\n else\n @batch for i in eachindex(files)\n verbose && println(\"i = $i/$nfile, file = $(files[i])\")\n meta = load(files[i])\n\n e[1,:,:,i] = prep2dslice(meta, \"vg_e_vol\", normal, 1, pArgs)[range1, range2]\n e[2,:,:,i] = prep2dslice(meta, \"vg_e_vol\", normal, 2, pArgs)[range1, range2]\n e[3,:,:,i] = prep2dslice(meta, \"vg_e_vol\", normal, 3, pArgs)[range1, range2]\n b[1,:,:,i] = prep2dslice(meta, \"vg_b_vol\", normal, 1, pArgs)[range1, range2]\n b[2,:,:,i] = prep2dslice(meta, \"vg_b_vol\", normal, 2, pArgs)[range1, range2]\n b[3,:,:,i] = prep2dslice(meta, \"vg_b_vol\", normal, 3, pArgs)[range1, range2]\n end\n end\n e, b\nend\n\n\"Moving box average of vector `g` with box size `n`.\"\nfunction moving_average(g::AbstractVector{<:AbstractFloat}, n::Int)\n nbackward = div(n,2)\n nforward = isodd(n) ? div(n,2) : div(n,2) - 1\n len = length(g)\n g_avg = similar(g)\n @inbounds @batch for i = 1:len\n lo = max(1, i - nbackward)\n hi = min(len, i + nforward)\n g_avg[i] = mean(@view g[lo:hi])\n end\n g_avg\nend\n\n\"Extract the perturbation from vector `v` with moving box size `nbox`.\"\nfunction detrend(v::AbstractVector{<:AbstractFloat}; nbox=length(v)÷12)\n v̄ = moving_average(v, nbox)\n dv = v .- v̄\nend\n\n\"Extract the perturbation from 4D array `v` along the last dim with moving box size `nbox`.\"\nfunction detrend(v::AbstractArray{<:AbstractFloat}; nbox=size(v,4)÷12)\n v̄ = similar(v)\n for idim = 1:3\n for j in axes(v, 3), i in axes(v, 2)\n v̄[idim,i,j,:] = @views moving_average(v[idim,i,j,:], nbox)\n end\n end\n dv = v .- v̄\n dv, v̄\nend\n\n\"Band pass filter for vector field `var`.\"\nfunction band_pass_filter(var, responsetype, designmethod)\n\n filter = digitalfilter(responsetype, designmethod)\n\n var_filtered = zeros(eltype(var), size(var,4), 3, size(var,2), size(var,3))\n\n for idim = 1:3\n for j in axes(var, 3), i in axes(var, 2)\n var_filtered[:,idim,i,j] = filtfilt(filter, var[idim,i,j,:])\n end\n end\n var_filtered\nend\n\n\"\"\"\n calc_poynting(de, db, b̄, it)\n\nReturn full Poynting vector, also parallel and perpendicular Poynting vector components to\nthe magnetic field. The perpendicular components are in-plane.\n\"\"\"\nfunction calc_poynting(de, db, b̄, it)\n\n s = zeros(3, size(de,3), size(de,4))\n # parallel and perpendicular Poynting vector magnitudes\n s_par = zeros(size(de,3), size(de,4))\n s_perp = zeros(size(de,3), size(de,4))\n\n @views for j in axes(de,4), i in axes(de,3)\n # Poynting vector = dE × dB\n s[:,i,j] = de[it,:,i,j] × db[it,:,i,j] / μ₀\n\n # Transform into parallel and perpendicular direction w.r.t. B\n b̂ = normalize(b̄[:,i,j,it])\n s_par[i,j] = s[:,i,j] ⋅ b̂\n #s_perp[i,j] = norm(s[:,i,j] .- s_par[i,j] .* b̂)\n # in-plane perpendicular component only\n s_perp[i,j] = sqrt((s[1,i,j] - s_par[i,j]*b̂[1])^2 + (s[3,i,j] - s_par[i,j]*b̂[3])^2)\n end\n\n s, s_par, s_perp\nend\n\n\"Output figures of Poynting vectors for each snapshot.\"\nfunction plot_poynting(de_filtered, db_filtered, b̄, x1, x2, frequency_range)\n\n nt = size(de_filtered, 1)\n\n norm1 = let\n sparmax = frequency_range == \"high\" ? 5e-7 : 1e-5\n sparmin = -sparmax\n levels = matplotlib.ticker.MaxNLocator(nbins=255).tick_values(sparmin, sparmax)\n matplotlib.colors.BoundaryNorm(levels, ncolors=256, clip=true)\n end\n\n norm2 = let\n sperpmax = frequency_range == \"high\" ? 5e-7 : 1e-5\n sperpmin = 0.0\n levels = matplotlib.ticker.MaxNLocator(nbins=255).tick_values(sperpmin, sperpmax)\n matplotlib.colors.BoundaryNorm(levels, ncolors=256, clip=true)\n end\n\n stride = 10 # number of strides for quivers\n\n s, s_par, s_perp = calc_poynting(de_filtered, db_filtered, b̄, 1)\n\n\n fig, axs = plt.subplots(1, 2; figsize=(11,6), sharex=true, sharey=true,\n constrained_layout=true)\n\n axs[1].set_title(L\"S_\\parallel\"; fontsize=\"large\")\n axs[2].set_title(L\"S_\\perp\"; fontsize=\"large\")\n\n for ax in axs\n ax.set_aspect(\"equal\")\n ax.set_xlabel(L\"x1 [R_E]\"; fontsize=\"large\")\n ax.set_ylabel(L\"x2 [R_E]\"; fontsize=\"large\")\n end\n\n c1 = axs[1].pcolormesh(x1, x2, s_par';\n cmap=matplotlib.cm.RdBu_r,\n shading=\"nearest\",\n norm=norm1,\n )\n\n cb1 = colorbar(c1; ax=axs[1], extend=\"both\")\n cb1.ax.set_ylabel(L\"[W/m^2]\"; fontsize=\"large\")\n\n c2 = axs[2].pcolormesh(x1, x2, s_perp';\n cmap=matplotlib.cm.turbo,\n shading=\"nearest\",\n norm=norm2,\n )\n\n cb2 = colorbar(c2; ax=axs[2], extend=\"max\")\n cb2.ax.set_ylabel(L\"[W/m^2]\"; fontsize=\"large\")\n\n s1 = @views (s[1,:,:] ./ hypot.(s[1,:,:], s[3,:,:]))[1:stride:end, 1:stride:end]'\n s2 = @views (s[3,:,:] ./ hypot.(s[1,:,:], s[3,:,:]))[1:stride:end, 1:stride:end]'\n\n q = axs[1].quiver(x1[1:stride:end], x2[1:stride:end], s1, s2; color=\"k\")\n\n b1 = @views (b̄[1,:,:,1] ./ hypot.(b̄[1,:,:,1], b̄[3,:,:,1]))[1:stride:end, 1:stride:end]'\n b2 = @views (b̄[3,:,:,1] ./ hypot.(b̄[1,:,:,1], b̄[3,:,:,1]))[1:stride:end, 1:stride:end]'\n\n qb = axs[1].quiver(x1[1:stride:end], x2[1:stride:end], b1, b2; color=\"tab:purple\")\n\n if frequency_range == \"high\"\n fig.suptitle(\"t = $(t[1]) s, [0.1, 1.0] Hz\";\n fontsize=\"xx-large\")\n else\n fig.suptitle(\"t = $(t[1]) s, [$(responsetype.w1), $(responsetype.w2)] Hz\";\n fontsize=\"xx-large\")\n end\n\n for it = 1:nt\n @info \"it = $it\"\n local s, s_par, s_perp\n outname = \"poynting/poynting_$(lpad(it, 4, '0'))_band$frequency_range.png\"\n isfile(outname) && continue\n s, s_par, s_perp = calc_poynting(de_filtered, db_filtered, b̄, it)\n\n c1.set_array(s_par')\n c2.set_array(s_perp')\n\n ŝx = @views @. s[1,:,:] / hypot(s[1,:,:], s[3,:,:])\n ŝz = @views @. s[3,:,:] / hypot(s[1,:,:], s[3,:,:])\n\n q.set_UVC(ŝx[1:stride:end, 1:stride:end]', ŝz[1:stride:end, 1:stride:end]')\n\n b̂x = @views @. b̄[1,:,:,it] / hypot(b̄[1,:,:,it], b̄[3,:,:,it])\n b̂z = @views @. b̄[3,:,:,it] / hypot(b̄[1,:,:,it], b̄[3,:,:,it])\n\n qb.set_UVC(b̂x[1:stride:end, 1:stride:end]', b̂z[1:stride:end, 1:stride:end]')\n\n if frequency_range == \"high\"\n fig.suptitle(\"t = $(t[it]) s, [0.1, 1.0] Hz\";\n fontsize=\"xx-large\")\n else\n fig.suptitle(\"t = $(t[it]) s, [$(responsetype.w1), $(responsetype.w2)] Hz\";\n fontsize=\"xx-large\")\n end\n savefig(outname; dpi=300, bbox_inches=\"tight\")\n end\nend\n\n########## Main\n\nfiles = filter(contains(r\"^bulk.*\\.vlsv$\"), readdir())\nnfile = length(files)\n\nconst frequency_range = \"low\" # filtered frequency range ∈ (\"low\", \"high\")\nconst extent = [6., 16., -7., 7.] # [RE], default: [-Inf32, Inf32, -Inf32, Inf32]\nconst normal = :none # plane normal direction for 3D data, (:none, :x, :y, :z)\nconst fs = 2.0 # sampling frequency, [Hz]\n\n# WARNING: t may not be exact due to round-off errors in output time stamps!\nndim, pArgs, t, range1, range2 = let meta = load(files[1])\n pArgs = Vlasiator.set_args(meta, \"vg_e_vol\", EARTH; normal=:none)\n x1, x2 = Vlasiator.get_axis(pArgs)\n\n tstart = meta.time\n tend = load(files[end]).time\n\n ndims(meta), pArgs,\n range(round(tstart,digits=1), round(tend, digits=1), length=nfile),\n searchsortedfirst(x1, extent[1]):searchsortedlast(x1, extent[2]),\n searchsortedfirst(x2, extent[3]):searchsortedlast(x2, extent[4])\nend\n\n@assert ndim == 3 \"3D not working yet!\"\n\ne, b = extract_EM(files, range1, range2, pArgs, ndim; normal, verbose=true)\n\ndesignmethod = Butterworth(5)\nif frequency_range == \"high\"\n responsetype = Highpass(0.1; fs)\n nbox = 40\nelseif frequency_range == \"low\"\n responsetype = Bandpass(0.02, 0.067; fs)\n nbox = 200\nend\n\nde, _ = detrend(e; nbox)\ndb, b̄ = detrend(b; nbox)\n\nde_filtered = band_pass_filter(de, responsetype, designmethod)\ndb_filtered = band_pass_filter(db, responsetype, designmethod)\n\nx1 = range(extent[1], extent[2], length=length(range1))\nx2 = range(extent[3], extent[4], length=length(range2))\n\nplot_poynting(de_filtered, db_filtered, b̄, x1, x2, frequency_range)","category":"page"},{"location":"examples/visualization/demo_poynting_mt_pyplot/","page":"Poynting flux","title":"Poynting flux","text":"","category":"page"},{"location":"examples/visualization/demo_poynting_mt_pyplot/","page":"Poynting flux","title":"Poynting flux","text":"This page was generated using DemoCards.jl.","category":"page"},{"location":"examples/visualization/demo_tensor_pyplot/","page":"Pressure tensor","title":"Pressure tensor","text":"EditURL = \"/home/runner/work/Vlasiator.jl/Vlasiator.jl/docs/examples/visualization/demo_tensor_pyplot.md\"","category":"page"},{"location":"examples/visualization/demo_tensor_pyplot/#demo_tensor","page":"Pressure tensor","title":"Pressure tensor","text":"","category":"section"},{"location":"examples/visualization/demo_tensor_pyplot/","page":"Pressure tensor","title":"Pressure tensor","text":"(Image: Author) (Image: Update time)","category":"page"},{"location":"examples/visualization/demo_tensor_pyplot/","page":"Pressure tensor","title":"Pressure tensor","text":"This demo shows how to plot the pressure tensor from one snapshot.","category":"page"},{"location":"examples/visualization/demo_tensor_pyplot/","page":"Pressure tensor","title":"Pressure tensor","text":"using Vlasiator, VlasiatorPyPlot, LaTeXStrings, Printf\n\nfunction main()\n file = \"bulk.0001582.vlsv\"\n\n axisunit = EARTH\n colorscale = Linear\n cmap = matplotlib.cm.turbo\n\n vars = [\"proton/vg_ptensor_diagonal\", \"proton/vg_ptensor_offdiagonal\"]\n\n #####\n meta = load(file)\n\n pArgs1 = Vlasiator.set_args(meta, vars[1], axisunit; normal=:none)\n pArgs2 = Vlasiator.set_args(meta, vars[2], axisunit; normal=:none)\n\n x, y = Vlasiator.get_axis(pArgs1)\n # [nPa]\n pxx = Vlasiator.prep2d(meta, vars[1], :x)' .* 1e9\n pyy = Vlasiator.prep2d(meta, vars[1], :y)' .* 1e9\n pzz = Vlasiator.prep2d(meta, vars[1], :z)' .* 1e9\n pyz = Vlasiator.prep2d(meta, vars[2], :1)' .* 1e9\n pxz = Vlasiator.prep2d(meta, vars[2], :2)' .* 1e9\n pxy = Vlasiator.prep2d(meta, vars[2], :3)' .* 1e9\n\n P = (pxx, pyy, pzz, pyz, pxz, pxy)\n P_str = (\"Pxx\", \"Pyy\", \"Pzz\", \"Pyz\", \"Pxz\", \"Pxy\")\n\n vmin = minimum(minimum.(P))\n vmax = maximum(maximum.(P))\n\n cnorm1, cticks1 = set_colorbar(colorscale, vmin, vmax)\n\n fig, axs = subplots(3,2,\n figsize=(6, 12), sharex=true, sharey=true, constrained_layout=true)\n\n c1 = axs[1].pcolormesh(x, y, pxx; norm=cnorm1, cmap)\n\n for i in eachindex(axs)[2:end]\n axs[i].pcolormesh(x, y, P[i]; norm=cnorm1, cmap)\n end\n\n for (i, ax) in enumerate(axs)\n ax.set_aspect(\"equal\")\n ax.xaxis.set_minor_locator(matplotlib.ticker.AutoMinorLocator())\n ax.yaxis.set_minor_locator(matplotlib.ticker.AutoMinorLocator())\n ax.set_title(P_str[i])\n end\n\n for ax in axs[3,:]\n ax.set_xlabel(L\"x [$R_E$]\")\n end\n\n for ax in axs[:,1]\n ax.set_ylabel(L\"y [$R_E$]\")\n end\n\n # One colorbar for all subplots\n cb1 = colorbar(c1; ax=axs, ticks=cticks1, fraction=0.046, pad=0.04)\n cb1.ax.set_ylabel(\"[nPa]\")\n cb1.outline.set_linewidth(1.0)\n\n str_title = @sprintf \"Pressure Tensor at t = %4.1fs\" meta.time\n\n fig.suptitle(str_title, fontsize=\"xx-large\")\n\n savefig(\"ptensor.png\", bbox_inches=\"tight\")\nend\n\nmain()","category":"page"},{"location":"examples/visualization/demo_tensor_pyplot/","page":"Pressure tensor","title":"Pressure tensor","text":"","category":"page"},{"location":"examples/visualization/demo_tensor_pyplot/","page":"Pressure tensor","title":"Pressure tensor","text":"This page was generated using DemoCards.jl.","category":"page"},{"location":"python/#Interoperability-Between-Julia-and-Python","page":"Calling from Python","title":"Interoperability Between Julia and Python","text":"","category":"section"},{"location":"python/","page":"Calling from Python","title":"Calling from Python","text":"There are currently two ways to call Julia from Python and vice versa, which are described below. When converting from Julia to Python, there are two most important differences:","category":"page"},{"location":"python/","page":"Calling from Python","title":"Calling from Python","text":"Julia is column-major, while Python is row-major.\nJulia adopts by default 1-based indexing, while Python adopts 0-based indexing.","category":"page"},{"location":"python/#JuliaCall","page":"Calling from Python","title":"JuliaCall","text":"","category":"section"},{"location":"python/","page":"Calling from Python","title":"Calling from Python","text":"Vlasiator.jl can be called from Python via JuliaCall. JuliaCall will link to the first Julia version in the system path. If Vlasiator.jl has been installed, we can use it directly; otherwise we need to state it in the juliacalldeps.json file.","category":"page"},{"location":"python/","page":"Calling from Python","title":"Calling from Python","text":"from juliacall import Main as jl\njl.seval(\"using Vlasiator\")\nfile = \"bulk.1d.vlsv\"\nmeta = jl.load(file)","category":"page"},{"location":"python/","page":"Calling from Python","title":"Calling from Python","text":"Matplotlib can then be used to visualize the data.","category":"page"},{"location":"python/","page":"Calling from Python","title":"Calling from Python","text":"from matplotlib import pyplot as plt\nimport numpy as np\nrho = jl.readvariable(meta, \"proton/vg_rho\")\nx = np.arange(meta.coordmin[0], meta.coordmax[0], meta.dcoord[0])\nplt.plot(x, rho)\nplt.show()","category":"page"},{"location":"python/","page":"Calling from Python","title":"Calling from Python","text":"warn: Warn\nThere is an issue that JuliaCall may decide to check pkg installation every time for a new session. We need to first make sure that PythonCall is installed in Julia; then make sure your PYTHONPATH is properly set. See this issue for more information.","category":"page"},{"location":"python/#PyJulia","page":"Calling from Python","title":"PyJulia","text":"","category":"section"},{"location":"python/","page":"Calling from Python","title":"Calling from Python","text":"Vlasiator.jl can also be called from Python with the aid of PyJulia. Following the installation steps described in the manual[1], and then inside Python REPL:","category":"page"},{"location":"python/","page":"Calling from Python","title":"Calling from Python","text":"# Handling initialization issue for Conda\nfrom julia.api import Julia\njl = Julia(compiled_modules=False)\n\nfrom julia import Vlasiator\nfile = \"bulk1.0001000.vlsv\"\nmeta = Vlasiator.load(file)\nvar = \"proton/vg_rho\"\ndata = Vlasiator.readvariable(meta, var)","category":"page"},{"location":"python/","page":"Calling from Python","title":"Calling from Python","text":"To run a Julia script in Python,","category":"page"},{"location":"python/","page":"Calling from Python","title":"Calling from Python","text":"# Handling initialization issue for Conda\nfrom julia.api import Julia\njl = Julia(compiled_modules=False)\njl.eval('include(\"examples/demo_2dplot_pyplot.jl\")')\nimport matplotlib.pyplot as plt\nplt.show()","category":"page"},{"location":"python/","page":"Calling from Python","title":"Calling from Python","text":"note: Note\nThis approach is for you to have a taste of the package with a Python frontend. The workaround shown above for handling the static python libraries makes it slow for regular use. An alternative solution would be creating system images, but as of Julia 1.6 the user experience is not smooth. For better integrated experience with its full power, it is recommended to use the package inside Julia.","category":"page"},{"location":"python/","page":"Calling from Python","title":"Calling from Python","text":"[1]: For Debian-based Linux distributions, it gets a little bit tricky. Please refer to Troubleshooting for details.","category":"page"},{"location":"examples/postprocess/demo_wave_search_mt/","page":"Search waves","title":"Search waves","text":"EditURL = \"/home/runner/work/Vlasiator.jl/Vlasiator.jl/docs/examples/postprocess/demo_wave_search_mt.md\"","category":"page"},{"location":"examples/postprocess/demo_wave_search_mt/#demo_search_waves","page":"Search waves","title":"Search waves","text":"","category":"section"},{"location":"examples/postprocess/demo_wave_search_mt/","page":"Search waves","title":"Search waves","text":"(Image: Author) (Image: Update time)","category":"page"},{"location":"examples/postprocess/demo_wave_search_mt/","page":"Search waves","title":"Search waves","text":"This demo shows how to search for wave-like structures and plot spatial-temporal distributions.","category":"page"},{"location":"examples/postprocess/demo_wave_search_mt/","page":"Search waves","title":"Search waves","text":"Procedures:","category":"page"},{"location":"examples/postprocess/demo_wave_search_mt/","page":"Search waves","title":"Search waves","text":"Extract variables in all cells from all snapshots.\nFor each cell and time interval, count time-series local peaks.\nPlot the peak occurrence frequencies across the whole domain as an indicator for waves.","category":"page"},{"location":"examples/postprocess/demo_wave_search_mt/","page":"Search waves","title":"Search waves","text":"note: Note\nWhen dealing with multiple variables, it is recommended to handle one variable at atime through the whole process due to memory considerations. With large number of frame counts, the current procedure is still memory-consuming.It assumes uniform sampling in time.\nPeak-finding is threaded, but plotting is still serial.","category":"page"},{"location":"examples/postprocess/demo_wave_search_mt/","page":"Search waves","title":"Search waves","text":"Usage:","category":"page"},{"location":"examples/postprocess/demo_wave_search_mt/","page":"Search waves","title":"Search waves","text":"julia -t 4 demo_wave_search_mt.jl","category":"page"},{"location":"examples/postprocess/demo_wave_search_mt/","page":"Search waves","title":"Search waves","text":"or","category":"page"},{"location":"examples/postprocess/demo_wave_search_mt/","page":"Search waves","title":"Search waves","text":"JULIA_NUM_THREADS=4 julia demo_wave_search_mt.jl","category":"page"},{"location":"examples/postprocess/demo_wave_search_mt/","page":"Search waves","title":"Search waves","text":"using Vlasiator, PyPlot, LaTeXStrings\n\n\"Extract time series variable\"\nfunction extract_var(files, ncells, varname, component=0)\n nfiles = length(files)\n var = zeros(Float32, ncells[1], ncells[2], nfiles)\n\n # Extract data from each frame\n if component == 0 # scalar\n Threads.@threads for i = eachindex(files)\n meta = load(files[i])\n var[:,:,i] = meta[varname]\n end\n else # vector component\n Threads.@threads for i = eachindex(files)\n meta = load(files[i])\n var[:,:,i] = meta[varname][component,:]\n end\n end\n\n return var\nend\n\n\"Count local maxima of vector `y` with moving box length `n`.\"\nfunction countpeaks(y, n; interval=1)\n maxs = Int[]\n if interval == 1\n for i in 2:length(y)-1\n if y[i-1] < y[i] > y[i+1]\n push!(maxs, i)\n end\n end\n elseif interval == 2\n for i in 3:length(y)-2\n if y[i-2] ≤ y[i-1] < y[i] > y[i+1] ≥ y[i+2]\n push!(maxs, i)\n end\n end\n elseif interval == 3\n for i in 4:length(y)-3\n if y[i-3] ≤ y[i-2] ≤ y[i-1] < y[i] > y[i+1] ≥ y[i+2] > y[i+3]\n push!(maxs, i)\n end\n end\n else\n error(\"interval = $interval not implemented!\")\n end\n nCounts = zeros(Int, length(y)-n+1)\n nCounts[1] = count(i->(1 ≤ i ≤ n), maxs)\n for i in 1:length(y)-n\n nCounts[i+1] = nCounts[i]\n if i ∈ maxs\n nCounts[i+1] -= 1\n end\n if i+n-1 ∈ maxs\n nCounts[i+1] += 1\n end\n end\n nCounts\nend\n\n\"Check wave-like occurrence frequencies within box length `n` of output interval `dt`.\"\nfunction checkwaves_sma(var, dt=0.5, n::Int=size(var,3); interval=1)\n nPeaks = zeros(Int, size(var,3)-n+1, size(var,1), size(var,2))\n\n Threads.@threads for j in axes(var, 2)\n for i in axes(var, 1)\n var_series = @view var[i,j,:]\n nPeaks[:,i,j] = countpeaks(var_series, n; interval)\n end\n end\n nPeaks ./ (n*dt)\nend\n\nfunction plot_dist(files, varnames, varnames_print, components, Δt, nboxlength;\n interval=1, nplotstride=1)\n @assert nboxlength ≥ 3 && isodd(nboxlength) \"Expect odd box length ≥ 3!\"\n if (local nfiles = length(files)) < nboxlength\n @warn \"Set moving box length to the number of files...\"\n nboxlength = nfiles\n end\n local x, y, tStart, tEnd, ncells\n let RE = Vlasiator.RE\n meta = load(files[1])\n tStart = meta.time\n ncells = meta.ncells\n x = LinRange{Float32}(meta.coordmin[1]/RE, meta.coordmax[1]/RE, meta.ncells[1])\n y = LinRange{Float32}(meta.coordmin[2]/RE, meta.coordmax[2]/RE, meta.ncells[2])\n meta = load(files[end])\n tEnd = meta.time\n end\n\n fig, ax = plt.subplots(figsize=(16,9))\n fontsize = 14\n vmin, vmax = 0.0, 0.5\n levels = matplotlib.ticker.MaxNLocator(nbins=255).tick_values(vmin, vmax)\n norm = matplotlib.colors.BoundaryNorm(levels, ncolors=256, clip=true)\n ticks = range(vmin, vmax, length=11)\n\n fakedata = zeros(Float32, length(x), length(y))\n im = ax.pcolormesh(y, x, fakedata; norm)\n\n ax.set_aspect(\"equal\")\n ax.set_xlabel(L\"y [$R_E$]\"; fontsize, weight=\"black\")\n ax.set_ylabel(L\"x [$R_E$]\"; fontsize, weight=\"black\")\n ax.xaxis.set_minor_locator(matplotlib.ticker.AutoMinorLocator())\n ax.yaxis.set_minor_locator(matplotlib.ticker.AutoMinorLocator())\n ax.grid(true, color=\"grey\", linestyle=\"-\")\n\n cb = fig.colorbar(im; ax, ticks, pad=0.02)\n cb.ax.set_ylabel(\"Frequency of local maxima occurrence, [#/s]\"; fontsize)\n\n for i in eachindex(varnames)\n outdir = \"../out/$(lowercase(varnames_print[i]))\"\n !isdir(outdir) && mkdir(outdir)\n length(filter(contains(r\"^spatial.*\\.png$\"), readdir(outdir))) ==\n length(files) - nboxlength + 1 && continue\n\n # Obtain time series data\n var = extract_var(files, ncells, varnames[i], components[i])\n # Count local peak occuring frequencies at each location\n fPeaks = checkwaves_sma(var, Δt, nboxlength; interval)\n\n for it in 1:nplotstride:size(fPeaks,1) # Iterate over time\n outname = joinpath(outdir,\n \"spatial_perturbation_distribution_$(lpad(it, 4, '0')).png\")\n isfile(outname) && continue\n # Update plot\n im.set_array(fPeaks[it,:,:])\n ax.set_title(\"$(varnames_print[i]) Perturbation Detection, \"*\n \"t = $(round(tStart+(it-1)*Δt, digits=1)) ~ \"*\n \"$(round(tStart+(it+nboxlength-1)*Δt, digits=1))s\";\n fontsize, fontweight=\"bold\")\n\n savefig(outname, bbox_inches=\"tight\")\n end\n end\nend\n\nfunction main()\n varnames = [\"proton/vg_rho\", \"vg_pressure\", \"proton/vg_v\", \"proton/vg_v\", \"vg_b_vol\",\n \"vg_e_vol\", \"vg_e_vol\"]\n varnames_print = [\"Density\", \"Thermal Pressure\", \"Vx\", \"Vy\", \"Bz\", \"Ex\", \"Ey\"]\n components = [0, 0, 1, 2, 3, 1, 2] # 0: scalar; 1: x, 2: y, 3: z\n Δt = 0.5 # output time interval [s]\n nboxlength = 101 # moving box average length\n interval = 2 # local peak gap minimal interval\n nplotstride = 50 # plot intervals in frames\n dir = \"./\" # data directory\n\n files = filter(contains(r\"^bulk.*\\.vlsv$\"), readdir(dir))\n\n println(\"Total number of snapshots: $(length(files))\")\n println(\"Running with $(Threads.nthreads()) threads...\")\n\n @time plot_dist(files, varnames, varnames_print, components, Δt, nboxlength;\n interval, nplotstride)\n\n println(\"Virtual satellite extraction done!\")\nend\n\nmain()","category":"page"},{"location":"examples/postprocess/demo_wave_search_mt/","page":"Search waves","title":"Search waves","text":"","category":"page"},{"location":"examples/postprocess/demo_wave_search_mt/","page":"Search waves","title":"Search waves","text":"This page was generated using DemoCards.jl.","category":"page"},{"location":"","page":"Home","title":"Home","text":"CurrentModule = Vlasiator","category":"page"},{"location":"#Vlasiator.jl","page":"Home","title":"Vlasiator.jl","text":"","category":"section"},{"location":"","page":"Home","title":"Home","text":"Vlasiator.jl is a data processing and analyzing tool for the numerical model for collisionless ion-kinetic plasma physics Vlasiator. This lightweight package is built upon its sister in Python Analysator and carefully designed for performance, capability and ease of use. It can be easily integrated with external packages like FieldTracer.jl and TestParticle.jl to do all kinds of in-depth analysis.","category":"page"},{"location":"","page":"Home","title":"Home","text":"Vlasiator.jl contains the following features:","category":"page"},{"location":"","page":"Home","title":"Home","text":"Reading VLSV format data.\nCalculating derived quantities from raw VLSV outputs.\nExtracting quantities at a given point/line/plane/box.\nPlotting 1D curves/2D cuts of saved/derived variables and phase space distributions.\nAnalyzing velocity distribution functions.\nAppending DCCRG arrays to VLSV files.\nConverting selected domain and variables from VLSV into VTK format for data analysis and visualization in ParaView and VisIt.\nMonitoring Vlasiator run log files.","category":"page"},{"location":"","page":"Home","title":"Home","text":"warning: Warning\nThis package mostly aims at supporting Vlasiator 5.0+. Older versions of Vlasiator has different naming standards for outputs, and is not guaranteed to work. The full naming standards are described in the analysator wiki page.","category":"page"},{"location":"#What-is-Vlasiator","page":"Home","title":"What is Vlasiator","text":"","category":"section"},{"location":"","page":"Home","title":"Home","text":"Vlasiator solves the Vlasov–Maxwell system of equations for ions while assuming massless electrons under quasi-neutrality. The fundamental description of charged particle motion in an electromagnetic field is given by the Vlasov equation","category":"page"},{"location":"","page":"Home","title":"Home","text":"fracpartial f_alphapartial t + mathbfvcdotfracpartial f_alphapartial mathbfr + fracq_alpham_alpha(mathbfE+mathbfvtimesmathbfB)cdot fracpartial f_alphapartial mathbfv = 0","category":"page"},{"location":"","page":"Home","title":"Home","text":"where alpha denotes the particle species, mathbfr and mathbfv are the spatial and velocity coordinates, f_alpha(mathbfrmathbfvt) is the six-dimensional phase-space density of a particle species with mass m_alpha and charge q_alpha, and acceleration mathbfa is given by the Lorentz force with mathbfE and mathbfB are the electric and magnetic field, respectively.","category":"page"},{"location":"","page":"Home","title":"Home","text":"The zeroth and first moments of plasma, ion density n_alpha and velocity mathbfu_alpha, are obtained as integrals of the ion velocity distribution function","category":"page"},{"location":"","page":"Home","title":"Home","text":"beginaligned\nn_alpha = int f_alpha(mathbfrmathbfvt)mathrmdmathbfv \nmathbfu_alpha = frac1n_alphaint mathbfvf_alpha(mathbfrmathbfvt)mathrmdmathbfv\nendaligned","category":"page"},{"location":"","page":"Home","title":"Home","text":"The magnetic field is updated using Faraday's law:","category":"page"},{"location":"","page":"Home","title":"Home","text":"nabla times mathbfE = -fracpartial mathbfBpartial t","category":"page"},{"location":"","page":"Home","title":"Home","text":"and the electric field is given by the generalized Ohm's law:","category":"page"},{"location":"","page":"Home","title":"Home","text":"mathbfE = -sum_alphamathbfu_alpha timesmathbfB + frac1sum_alpha n_alpha q_alphamathbfjtimesmathbfB - frac1sum_alpha n_alpha q_alphanablacdotoverleftrightarrowP_e + eta mathbfj","category":"page"},{"location":"","page":"Home","title":"Home","text":"The four terms on the right-handed side are the convection term, the Hall term, the electron pressure gradient term, and the resistive term, respectively. The total current density mathbfj is obtained from Ampère's law where the displacement current has been neglected:","category":"page"},{"location":"","page":"Home","title":"Home","text":"nablatimesmathbfB = mu_0 mathbfj","category":"page"},{"location":"","page":"Home","title":"Home","text":"Finally, by determining the electron pressure tensor by using an appropriate equation of state, the evolution of the system can be followed in time. For example, let overleftrightarrowP_e = p_e overleftrightarrowI where p_e is the isotropic scalar electron pressure. In an isothermal process,","category":"page"},{"location":"","page":"Home","title":"Home","text":"p_e = n_e k_B T_e","category":"page"},{"location":"","page":"Home","title":"Home","text":"where n_e approx n_i and T_e is a constant. In an adiabatic process with index gamma,","category":"page"},{"location":"","page":"Home","title":"Home","text":"p_e n_e^gamma = textconst","category":"page"},{"location":"","page":"Home","title":"Home","text":"The different processes can be generalized into the polytropic process:","category":"page"},{"location":"","page":"Home","title":"Home","text":"p_e n_e^n = textconst","category":"page"},{"location":"","page":"Home","title":"Home","text":"When the ideal gas law applies, the polytropic index n=1 for an isothermal process, and n=gamma for an adiabatic process.","category":"page"},{"location":"","page":"Home","title":"Home","text":"For more details, please refer to Vlasov methods in space physics and astrophysics.","category":"page"},{"location":"#Getting-started","page":"Home","title":"Getting started","text":"","category":"section"},{"location":"","page":"Home","title":"Home","text":"To install,","category":"page"},{"location":"","page":"Home","title":"Home","text":"julia> ]\npkg> add Vlasiator","category":"page"},{"location":"","page":"Home","title":"Home","text":"You can then use the package via","category":"page"},{"location":"","page":"Home","title":"Home","text":"julia> using Vlasiator","category":"page"},{"location":"#Visualization","page":"Home","title":"Visualization","text":"","category":"section"},{"location":"","page":"Home","title":"Home","text":"PyPlot","category":"page"},{"location":"","page":"Home","title":"Home","text":"If you aim at using Matplotlib, besides adding PyPlot and the Vlasiator specific wrapper VlasiatorPyPlot, you should also link to a preinstalled Python version by setting the environment variable and building the PyCall package","category":"page"},{"location":"","page":"Home","title":"Home","text":"ENV[\"PYTHON\"]=\"your python executable\"\nPkg.build(\"PyCall\")","category":"page"},{"location":"","page":"Home","title":"Home","text":"If ENV[\"PYTHON\"] = \"\" before building, a private Python distribution will be installed via Miniconda. Details are described in automated matplotlib installation.","category":"page"},{"location":"","page":"Home","title":"Home","text":"Makie","category":"page"},{"location":"","page":"Home","title":"Home","text":"You can add Makie.jl and VlasiatorMakie.jl through the pkg manger. The sub-package VlasiatorMakie provides user recipes for Makie.","category":"page"},{"location":"","page":"Home","title":"Home","text":"Plots","category":"page"},{"location":"","page":"Home","title":"Home","text":"Add Plots.jl through the pkg manager. Built-in user recipes for Plots are provided.","category":"page"},{"location":"#Author","page":"Home","title":"Author","text":"","category":"section"},{"location":"","page":"Home","title":"Home","text":"This module is written by Hongyang Zhou. For citing Vlasiator.jl, please refer to (Image: DOI).","category":"page"},{"location":"contributing/#Contributing","page":"Contributing","title":"Contributing","text":"","category":"section"},{"location":"contributing/","page":"Contributing","title":"Contributing","text":"Try to explain your contribution with simple language.\nReferences are always welcome.\nFollow the coding standards in the source.","category":"page"},{"location":"contributing/#Reporting-issues","page":"Contributing","title":"Reporting issues","text":"","category":"section"},{"location":"contributing/","page":"Contributing","title":"Contributing","text":"If you are experiencing issues or have discovered a bug, please report it on GitHub. To make the resolution process easier, please include the version of Julia and Vlasiator.jl in your writeup. These can be found with two commands:","category":"page"},{"location":"contributing/","page":"Contributing","title":"Contributing","text":"julia> versioninfo()\njulia> using Pkg; Pkg.status()","category":"page"},{"location":"contributing/#Feature-requests","page":"Contributing","title":"Feature requests","text":"","category":"section"},{"location":"contributing/","page":"Contributing","title":"Contributing","text":"If you have suggestions of improvement or algorithms that you would like to see implemented in Vlasiator.jl, please open an issue on GitHub. Suggestions as well as feature requests are very welcome.","category":"page"},{"location":"contributing/#Code-contribution","page":"Contributing","title":"Code contribution","text":"","category":"section"},{"location":"contributing/","page":"Contributing","title":"Contributing","text":"If you have code that you would like to contribute to Vlasiator.jl, that is awesome! Please open an issue before you create the pull request on GitHub so that we make sure your idea is aligned with our goals for the project.","category":"page"},{"location":"contributing/","page":"Contributing","title":"Contributing","text":"After your idea is discussed and revised by maintainers, please get the development version of the project by typing the following in the package manager:","category":"page"},{"location":"contributing/","page":"Contributing","title":"Contributing","text":"] activate @dev","category":"page"},{"location":"contributing/","page":"Contributing","title":"Contributing","text":"This will create a fresh environment called @dev where you can play with the project components without compromising your normal user environment.","category":"page"},{"location":"contributing/","page":"Contributing","title":"Contributing","text":"] dev Vlasiator","category":"page"},{"location":"contributing/","page":"Contributing","title":"Contributing","text":"This will clone all the project components in your ~/.julia folder so that you can modify it and submit a pull request on GitHub later. Don't hesitate to ask questions. We are looking forward to your contributions.","category":"page"},{"location":"examples/postprocess/demo_magnetopause_2d_mt/","page":"Extract variables along the magnetopause","title":"Extract variables along the magnetopause","text":"EditURL = \"/home/runner/work/Vlasiator.jl/Vlasiator.jl/docs/examples/postprocess/demo_magnetopause_2d_mt.md\"","category":"page"},{"location":"examples/postprocess/demo_magnetopause_2d_mt/#demo_extract_magnetopause","page":"Extract variables along the magnetopause","title":"Extract variables along the magnetopause","text":"","category":"section"},{"location":"examples/postprocess/demo_magnetopause_2d_mt/","page":"Extract variables along the magnetopause","title":"Extract variables along the magnetopause","text":"(Image: Author) (Image: Update time)","category":"page"},{"location":"examples/postprocess/demo_magnetopause_2d_mt/","page":"Extract variables along the magnetopause","title":"Extract variables along the magnetopause","text":"This demo shows how to extract variables along the magnetopause defined by Bz == 0 from multiple frames.","category":"page"},{"location":"examples/postprocess/demo_magnetopause_2d_mt/","page":"Extract variables along the magnetopause","title":"Extract variables along the magnetopause","text":"Usage:","category":"page"},{"location":"examples/postprocess/demo_magnetopause_2d_mt/","page":"Extract variables along the magnetopause","title":"Extract variables along the magnetopause","text":"julia -t 4 demo_magnetopause_2d_mt.jl","category":"page"},{"location":"examples/postprocess/demo_magnetopause_2d_mt/","page":"Extract variables along the magnetopause","title":"Extract variables along the magnetopause","text":"or","category":"page"},{"location":"examples/postprocess/demo_magnetopause_2d_mt/","page":"Extract variables along the magnetopause","title":"Extract variables along the magnetopause","text":"JULIA_NUM_THREADS=4 julia demo_magnetopause_2d_mt.jl","category":"page"},{"location":"examples/postprocess/demo_magnetopause_2d_mt/","page":"Extract variables along the magnetopause","title":"Extract variables along the magnetopause","text":"using Vlasiator\nusing Vlasiator: RE # Earth radius, [m]\nusing JLD2: jldsave\n\n\"\"\"\n extract_magnetopause_var(files; zmin=-4RE, zmax=4RE, verbose=true)\n\nExtract variables on the magnetopause defined by ``B_z = 0``.\n\"\"\"\nfunction extract_magnetopause_var(files; zmin=-4RE, zmax=4RE, verbose=true)\n nfiles = length(files)\n\n verbose && println(\"Number of files: $nfiles\")\n\n meta = load(files[1])\n\n x = LinRange{Float32}(meta.coordmin[1], meta.coordmax[1], meta.ncells[1])\n z = LinRange{Float32}(meta.coordmin[3], meta.coordmax[3], meta.ncells[3])\n\n z_range = let zmin_ = searchsortedfirst(z, zmin), zmax_ = searchsortedlast(z, zmax)\n zmin_:zmax_\n end\n\n x_crossing = zeros(Float32, length(z_range))\n z_crossing = z[z_range]\n\n cellids = Vector{Int}(undef, length(z_range))\n\n x_crossings = zeros(length(z_range), nfiles)\n v = zeros(3, length(z_range), nfiles)\n ey = zeros(length(z_range), nfiles)\n\n Threads.@threads for ifile in eachindex(files)\n verbose && println(\"$(files[ifile]) on thread $(Threads.threadid())\")\n meta = load(files[ifile])\n\n # Obtain thermal temperature\n b = meta[\"vg_b_vol\"]\n b = reshape(b, 3, meta.ncells[1], meta.ncells[3])\n\n # Extract the last point from right to left which fulfills Bz < 0\n for (i,k) in enumerate(z_range) # scan in z direction\n ind_ = findlast(>(0), @view b[3,:,k]) + 1 # count from upstream\n isnothing(ind_) && (ind_ = 1) # if not found then set to 1\n x_crossing[i] = x[ind_]\n end\n\n cellids = [ getcell(meta, [x_crossing[i], 0, z_crossing[i]])\n for i in eachindex(x_crossing, z_crossing) ]\n\n x_crossings[:,ifile] = x_crossing\n v[:,:,ifile] = readvariable(meta, \"proton/vg_v\", cellids)\n ey[:,ifile] = readvariable(meta, \"vg_e_vol\", cellids)[2,:]\n end\n\n z_crossing, x_crossings, v, ey\nend\n\n######\n\nfiles = filter(contains(r\"^bulk.*\\.vlsv$\"), readdir())\n\n@time z,x,v,ey = extract_magnetopause_var(files)\n\njldsave(\"magnetopause.jld2\"; z,x,v,ey)","category":"page"},{"location":"examples/postprocess/demo_magnetopause_2d_mt/","page":"Extract variables along the magnetopause","title":"Extract variables along the magnetopause","text":"","category":"page"},{"location":"examples/postprocess/demo_magnetopause_2d_mt/","page":"Extract variables along the magnetopause","title":"Extract variables along the magnetopause","text":"This page was generated using DemoCards.jl.","category":"page"},{"location":"examples/visualization/demo_2d_colorbar/","page":"Shared colorbar","title":"Shared colorbar","text":"EditURL = \"/home/runner/work/Vlasiator.jl/Vlasiator.jl/docs/examples/visualization/demo_2d_colorbar.md\"","category":"page"},{"location":"examples/visualization/demo_2d_colorbar/#demo_2d_contour_share_colorbar","page":"Shared colorbar","title":"Shared colorbar","text":"","category":"section"},{"location":"examples/visualization/demo_2d_colorbar/","page":"Shared colorbar","title":"Shared colorbar","text":"(Image: Author) (Image: Update time)","category":"page"},{"location":"examples/visualization/demo_2d_colorbar/","page":"Shared colorbar","title":"Shared colorbar","text":"This script shows how to share the same colorbar for multiple contour plots.","category":"page"},{"location":"examples/visualization/demo_2d_colorbar/","page":"Shared colorbar","title":"Shared colorbar","text":"using Vlasiator, VlasiatorPyPlot\n\nfile = \"bulk.vlsv\"\n\nmeta = load(file)\n\npArgs = Vlasiator.set_args(meta, \"fg_e\", SI; normal=:none)\n\nx1, x2 = Vlasiator.get_axis(pArgs)\n\nnorm = matplotlib.colors.CenteredNorm()\n\nfig, axs = plt.subplots(1, 3, sharex=true, sharey=true, constrained_layout=true,\n figsize=(12,5))\n\ndata = Vlasiator.prep2d(meta, \"Ehallx\", 1)'\nc = axs[1].pcolormesh(x1, x2, data; norm)\n\ndata = Vlasiator.prep2d(meta, \"Ehally\", 2)'\nc = axs[2].pcolormesh(x1, x2, data; norm)\n\ndata = Vlasiator.prep2d(meta, \"Ehallz\", 3)'\nc = axs[3].pcolormesh(x1, x2, data; norm)\n\nfor ax in axs\n ax.axis(\"scaled\")\nend\n\nfor i in 1:3\n axs[i].set_xlabel(\"x\", fontsize=14)\nend\nfor i in 1:1\n axs[i].set_ylabel(\"z\", fontsize=14)\nend\n\naxs[1].set_title(L\"$E_{hall,x}$\", fontsize=16)\naxs[2].set_title(L\"$E_{hall,y}$\", fontsize=16)\naxs[3].set_title(L\"$E_{hall,z}$\", fontsize=16)\n\nfig.colorbar(c, ax=axs[:])\n\nsavefig(\"Ehall.png\", bbox_inches=\"tight\")","category":"page"},{"location":"examples/visualization/demo_2d_colorbar/","page":"Shared colorbar","title":"Shared colorbar","text":"","category":"page"},{"location":"examples/visualization/demo_2d_colorbar/","page":"Shared colorbar","title":"Shared colorbar","text":"This page was generated using DemoCards.jl.","category":"page"},{"location":"examples/postprocess/demo_log/","page":"Log tracking","title":"Log tracking","text":"EditURL = \"/home/runner/work/Vlasiator.jl/Vlasiator.jl/docs/examples/postprocess/demo_log.md\"","category":"page"},{"location":"examples/postprocess/demo_log/#demo_log","page":"Log tracking","title":"Log tracking","text":"","category":"section"},{"location":"examples/postprocess/demo_log/","page":"Log tracking","title":"Log tracking","text":"(Image: Author) (Image: Update time)","category":"page"},{"location":"examples/postprocess/demo_log/","page":"Log tracking","title":"Log tracking","text":"This is an example of extracting log file timing information and visualize them.","category":"page"},{"location":"examples/postprocess/demo_log/","page":"Log tracking","title":"Log tracking","text":"using Vlasiator, Dates, Plots\n\n# plotly is nice for scanning through data interactively\nplotly()\n\nconst file = \"logfile.txt\"\n\ntimestamps, speed = readlog(file)\n\nscatter(timestamps, speed,\n markershape=:circle,\n #yaxis=:log10,\n xlabel=\"Time\", ylabel=\"Time per simulated second [s]\")","category":"page"},{"location":"examples/postprocess/demo_log/","page":"Log tracking","title":"Log tracking","text":"","category":"page"},{"location":"examples/postprocess/demo_log/","page":"Log tracking","title":"Log tracking","text":"This page was generated using DemoCards.jl.","category":"page"},{"location":"examples/visualization/demo_lineextracting_pyplot/","page":"Plotting variables along a line","title":"Plotting variables along a line","text":"EditURL = \"/home/runner/work/Vlasiator.jl/Vlasiator.jl/docs/examples/visualization/demo_lineextracting_pyplot.md\"","category":"page"},{"location":"examples/visualization/demo_lineextracting_pyplot/#demo_plot_line2","page":"Plotting variables along a line","title":"Plotting variables along a line","text":"","category":"section"},{"location":"examples/visualization/demo_lineextracting_pyplot/","page":"Plotting variables along a line","title":"Plotting variables along a line","text":"(Image: Author) (Image: Update time)","category":"page"},{"location":"examples/visualization/demo_lineextracting_pyplot/","page":"Plotting variables along a line","title":"Plotting variables along a line","text":"This demo shows how to plot variables along a line.","category":"page"},{"location":"examples/visualization/demo_lineextracting_pyplot/","page":"Plotting variables along a line","title":"Plotting variables along a line","text":"using Vlasiator, PyPlot, Printf\nusing Vlasiator: RE # Earth radius [m]\n\nfunction main()\n files = filter(contains(r\"^bulk.*\\.vlsv$\"), readdir())\n nfiles = length(files)\n\n x1, x2 = 8.0, 29.0\n point1 = [x1, 0, 0] .* RE\n point2 = [x2, 0, 0] .* RE\n\n cellids, distances, coords =\n let meta = load(files[1])\n getcellinline(meta, point1, point2)\n end\n\n loc = range(x1, x2, length=length(cellids))\n\n ρmin, ρmax = 0.0, 10.0 # [amu/cc]\n vmin, vmax = -640.0, 0.0 # [km/s]\n pmin, pmax = 0.0, 1.82 # [nPa]\n bmin, bmax = -25.0, 60.0 # [nT]\n\n fontsize = 14\n\n fig, axs = plt.subplots(4, 1, figsize=(10, 15), sharex=true, constrained_layout=true)\n\n axs[end].set_xlim(x1, x2)\n\n axs[1].set_ylim(ρmin, ρmax)\n axs[2].set_ylim(vmin, vmax)\n axs[3].set_ylim(pmin, pmax)\n axs[4].set_ylim(bmin, bmax)\n for ax in axs\n ax.xaxis.set_minor_locator(matplotlib.ticker.AutoMinorLocator())\n ax.yaxis.set_minor_locator(matplotlib.ticker.AutoMinorLocator())\n ax.grid(true)\n end\n\n axs[end].set_xlabel(\"x [Re]\"; fontsize)\n axs[1].set_ylabel(\"Density [amu/cc]\"; fontsize)\n axs[2].set_ylabel(\"Velocity [km/s]\"; fontsize)\n axs[3].set_ylabel(\"Pressure [nPa]\"; fontsize)\n axs[4].set_ylabel(\"Magnetic field [nT]\"; fontsize)\n\n # Loop over snapshots\n for (i, file) in enumerate(files)\n isfile(\"out/\"*file[end-8:end-5]*\".png\") && continue\n\n println(\"i = $i/$nfiles, file = $file\")\n meta = load(file)\n\n p_extract = readvariable(meta, \"P\", cellids) .* 1e9 |> vec # [nPa]\n rho_extract = readvariable(meta, \"proton/vg_rho\", cellids) |> vec\n v_extract = readvariable(meta, \"proton/vg_v\", cellids)\n vmag2_extract = sum(x -> x*x, v_extract, dims=1) |> vec\n pram_extract = rho_extract .* Vlasiator.mᵢ .* vmag2_extract .* 1e9 # [nPa]\n\n bz = readvariable(meta, \"vg_b_vol\", cellids)[3,:] .* 1e9 #[nT]\n\n imagnetopause_ = findfirst(<(0.0), bz)\n\n axs[1].plot(loc, rho_extract ./ 1e6, label=\"Proton density\", color=\"#1f77b4\")\n vl1 = axs[1].vlines(loc[imagnetopause_], ρmin, ρmax;\n colors=\"r\", linestyle=\"dashed\", alpha=0.5)\n\n axs[2].plot(loc, v_extract[1,:] ./ 1e3, label=\"Vx\", color=\"#1f77b4\")\n vl2 = axs[2].vlines(loc[imagnetopause_], vmin, vmax;\n colors=\"r\", linestyle=\"dashed\", alpha=0.5)\n\n axs[3].plot(loc, pram_extract, label=\"Ram\", color=\"#1f77b4\")\n axs[3].plot(loc, p_extract, label=\"Thermal\", color=\"#ff7f0e\")\n vl3 = axs[3].vlines(loc[imagnetopause_], pmin, pmax;\n colors=\"r\", linestyle=\"dashed\", alpha=0.5)\n\n axs[4].plot(loc, bz, label=\"Bz\", color=\"#1f77b4\")\n hl4 = axs[4].hlines(0.0, loc[1], loc[end], colors=\"k\", linestyle=\"dashed\", alpha=0.2)\n vl4 = axs[4].vlines(loc[imagnetopause_], bmin, bmax;\n colors=\"r\", linestyle=\"dashed\", alpha=0.5)\n\n str_title = @sprintf \"t= %4.1fs\" meta.time\n axs[1].set_title(str_title; fontsize)\n\n axs[2].legend(;loc=\"upper right\", fontsize)\n axs[3].legend(;loc=\"upper left\", fontsize)\n axs[4].legend(;loc=\"upper right\", fontsize)\n\n savefig(\"out/\"*file[end-8:end-5]*\".png\", bbox_inches=\"tight\")\n\n for ax in axs\n for line in ax.get_lines()\n line.remove()\n end\n end\n for line in (vl1, vl2, vl3, vl4, hl4)\n line.remove()\n end\n end\n\n close(fig)\n println(\"Finished!\")\nend\n\nmain()","category":"page"},{"location":"examples/visualization/demo_lineextracting_pyplot/","page":"Plotting variables along a line","title":"Plotting variables along a line","text":"","category":"page"},{"location":"examples/visualization/demo_lineextracting_pyplot/","page":"Plotting variables along a line","title":"Plotting variables along a line","text":"This page was generated using DemoCards.jl.","category":"page"},{"location":"examples/visualization/demo_bowshock_2d_mt/","page":"Extracting bow shock location","title":"Extracting bow shock location","text":"EditURL = \"/home/runner/work/Vlasiator.jl/Vlasiator.jl/docs/examples/visualization/demo_bowshock_2d_mt.md\"","category":"page"},{"location":"examples/visualization/demo_bowshock_2d_mt/#demo_2d_bowshock_mt","page":"Extracting bow shock location","title":"Extracting bow shock location","text":"","category":"section"},{"location":"examples/visualization/demo_bowshock_2d_mt/","page":"Extracting bow shock location","title":"Extracting bow shock location","text":"(Image: Author) (Image: Update time)","category":"page"},{"location":"examples/visualization/demo_bowshock_2d_mt/","page":"Extracting bow shock location","title":"Extracting bow shock location","text":"This demo shows how to extract the bow shock location from 2D equatorial run outputs and save into file. To run in multi-threading mode,","category":"page"},{"location":"examples/visualization/demo_bowshock_2d_mt/","page":"Extracting bow shock location","title":"Extracting bow shock location","text":"julia -t nthreads demo_bowshock_2d_mt.jl","category":"page"},{"location":"examples/visualization/demo_bowshock_2d_mt/","page":"Extracting bow shock location","title":"Extracting bow shock location","text":"or alternatively","category":"page"},{"location":"examples/visualization/demo_bowshock_2d_mt/","page":"Extracting bow shock location","title":"Extracting bow shock location","text":"JULIA_NUM_THREADS=$nthreads julia demo_bowshock_2d_mt.jl","category":"page"},{"location":"examples/visualization/demo_bowshock_2d_mt/","page":"Extracting bow shock location","title":"Extracting bow shock location","text":"using Vlasiator\nusing Vlasiator: RE # Earth radius, [m]\nusing JLD2: jldsave\n\n# Upstream solar wind temperature\nconst Tsw = 0.5e6 #[K]\n\nfunction extract_bowshock_position(files; verbose=true)\n nfiles = length(files)\n\n verbose && println(\"Number of files: $nfiles\")\n\n meta = load(files[1])\n\n x = LinRange{Float32}(meta.coordmin[1], meta.coordmax[1], meta.ncells[1])\n y = LinRange{Float32}(meta.coordmin[2], meta.coordmax[2], meta.ncells[2])\n\n close(meta.fid)\n\n # Only extract bow shock location near the front between y = ±20RE\n ymin_ = findlast(<(-20RE), y)\n ymax_ = findfirst(>(20RE), y)\n\n x_crossing = zeros(Float32, ymax_-ymin_+1, nfiles)\n y_crossing = y[ymin_:ymax_]\n\n Threads.@threads for ifile = 1:nfiles\n verbose && println(\"$(files[ifile]) on thread $(Threads.threadid())\")\n f = load(files[ifile])\n # Obtain thermal temperature\n T = f[\"T\"]\n close(f.fid)\n T = reshape(T, f.ncells[1], f.ncells[2])\n # Extract bow shock location from the 1st point which fulfills\n # the threshold: T > 4 * Tsw\n for (i,j) in enumerate(ymin_:ymax_) # scan in y direction\n ind_ = findlast(>(4*Tsw), @view T[:,j]) # count from upstream\n x_crossing[i,ifile] = x[ind_]\n end\n end\n\n return x_crossing, y_crossing\nend\n\n#####\nfiles = filter(contains(r\"^bulk.*\\.vlsv$\"), readdir())\n\n@time x_crossing, y_crossing = extract_bowshock_position(files)\n\njldsave(\"example.jld2\"; x_crossing, y_crossing)","category":"page"},{"location":"examples/visualization/demo_bowshock_2d_mt/","page":"Extracting bow shock location","title":"Extracting bow shock location","text":"","category":"page"},{"location":"examples/visualization/demo_bowshock_2d_mt/","page":"Extracting bow shock location","title":"Extracting bow shock location","text":"This page was generated using DemoCards.jl.","category":"page"},{"location":"examples/visualization/demo_vdf_pyplot/","page":"VDF","title":"VDF","text":"EditURL = \"/home/runner/work/Vlasiator.jl/Vlasiator.jl/docs/examples/visualization/demo_vdf_pyplot.md\"","category":"page"},{"location":"examples/visualization/demo_vdf_pyplot/#demo_vdf","page":"VDF","title":"VDF","text":"","category":"section"},{"location":"examples/visualization/demo_vdf_pyplot/","page":"VDF","title":"VDF","text":"(Image: Author) (Image: Update time)","category":"page"},{"location":"examples/visualization/demo_vdf_pyplot/","page":"VDF","title":"VDF","text":"This demo shows how to plot the phase space density (i.e. velocity distribution function) near a given spatial location.","category":"page"},{"location":"examples/visualization/demo_vdf_pyplot/","page":"VDF","title":"VDF","text":"using VlasiatorPyPlot\nusing Vlasiator: RE # Earth radius [m]\n\nfunction main()\n file = \"bulk.0001347.vlsv\"\n meta = load(file)\n species = \"proton\"\n\n coordinates = [0.0, 0.0, 0.0]\n\n vdfslice(meta, coordinates; verbose=true)\n\n # Show the spatial distribution of cells with saved VDF\n init_cellswithVDF!(meta, species)\n locations = [getcellcoordinates(meta, cid) for cid in meta.meshes[species].cellwithVDF]\n\n xcell = zeros(size(locations))\n ycell = similar(xcell)\n\n for i in eachindex(locations)\n xcell[i] = locations[i][1] / RE\n ycell[i] = locations[i][2] / RE\n end\n\n figure()\n pcolormesh(meta, \"vg_pressure\", colorscale=Linear)\n ax = plt.gca()\n ax.scatter(xcell, ycell, marker=\"+\", color=\"w\")\nend\n\nmain()","category":"page"},{"location":"examples/visualization/demo_vdf_pyplot/","page":"VDF","title":"VDF","text":"","category":"page"},{"location":"examples/visualization/demo_vdf_pyplot/","page":"VDF","title":"VDF","text":"This page was generated using DemoCards.jl.","category":"page"},{"location":"examples/visualization/demo_diff_extracting/","page":"Extracting differences between FsGrid and DCCRG variables","title":"Extracting differences between FsGrid and DCCRG variables","text":"EditURL = \"/home/runner/work/Vlasiator.jl/Vlasiator.jl/docs/examples/visualization/demo_diff_extracting.md\"","category":"page"},{"location":"examples/visualization/demo_diff_extracting/#demo_3d_grid_diff","page":"Extracting differences between FsGrid and DCCRG variables","title":"Extracting differences between FsGrid and DCCRG variables","text":"","category":"section"},{"location":"examples/visualization/demo_diff_extracting/","page":"Extracting differences between FsGrid and DCCRG variables","title":"Extracting differences between FsGrid and DCCRG variables","text":"(Image: Author) (Image: Update time)","category":"page"},{"location":"examples/visualization/demo_diff_extracting/","page":"Extracting differences between FsGrid and DCCRG variables","title":"Extracting differences between FsGrid and DCCRG variables","text":"This demos shows how to extract differences between FsGrid and DCCRG variables from 3D data.","category":"page"},{"location":"examples/visualization/demo_diff_extracting/","page":"Extracting differences between FsGrid and DCCRG variables","title":"Extracting differences between FsGrid and DCCRG variables","text":"using Vlasiator, PyPlot\nimport Vlasiator: RE\n\nfunction main()\n directory = \"./\"\n file = \"bulk1.0001284.vlsv\"\n # Box range for variation diff extraction\n extent = [0.0, 12.0, -7.0, 7.0] # default [-Inf, Inf, -Inf, Inf]\n\n normal = :y\n origin = 0.0\n axisunit = EARTH\n comp = 2\n\n meta = load(directory*file)\n\n pArgs = Vlasiator.set_args(meta, \"fg_e\", axisunit; normal, origin)\n e_fg = Vlasiator.prep2dslice(meta, \"fg_e\", normal, comp, pArgs)\n\n pArgs = Vlasiator.set_args(meta, \"vg_e_vol\", axisunit; normal, origin)\n e_vg = Vlasiator.prep2dslice(meta, \"vg_e_vol\", normal, comp, pArgs)\n\n x1, x2 = Vlasiator.get_axis(pArgs)\n\n range1, range2 =\n if axisunit == EARTH\n searchsortedfirst(x1, extent[1]):searchsortedlast(x1, extent[2]),\n searchsortedfirst(x2, extent[3]):searchsortedlast(x2, extent[4])\n else\n searchsortedfirst(x1, extent[1]):searchsortedlast(x1, extent[2]),\n searchsortedfirst(x2, extent[3]):searchsortedlast(x2, extent[4])\n end\n\n ## Visualization\n fig, ax = plt.subplots()\n\n diff = (e_fg[range1,range2] - e_vg[range1,range2])'\n\n c = ax.pcolormesh(x1[range1], x2[range2], diff,\n norm=matplotlib.colors.CenteredNorm(),\n cmap=matplotlib.cm.RdBu_r)\n\n if comp == 1\n fig.colorbar(c; ax, label=\"E_fg_x - E_vg_x [V/m]\")\n elseif comp == 2\n fig.colorbar(c; ax, label=\"E_fg_y - E_vg_y [V/m]\")\n elseif comp == 3\n fig.colorbar(c; ax, label=\"E_fg_z - E_vg_z [V/m]\")\n end\n\n ax.set_title(file)\n\n #savefig(\"test_diff.png\")\nend\n\nmain()","category":"page"},{"location":"examples/visualization/demo_diff_extracting/","page":"Extracting differences between FsGrid and DCCRG variables","title":"Extracting differences between FsGrid and DCCRG variables","text":"","category":"page"},{"location":"examples/visualization/demo_diff_extracting/","page":"Extracting differences between FsGrid and DCCRG variables","title":"Extracting differences between FsGrid and DCCRG variables","text":"This page was generated using DemoCards.jl.","category":"page"},{"location":"log/#FAQ","page":"FAQ","title":"FAQ","text":"","category":"section"},{"location":"log/#Test-Data","page":"FAQ","title":"Test Data","text":"","category":"section"},{"location":"log/","page":"FAQ","title":"FAQ","text":"If you don't have VLSV data at hand, Vlasiator.jl provides some test data for you to begin with.","category":"page"},{"location":"log/","page":"FAQ","title":"FAQ","text":"using LazyArtifacts\n\nrootpath = artifact\"testdata\"\nfiles = joinpath.(rootpath, (\"bulk.1d.vlsv\", \"bulk.2d.vlsv\", \"bulk.amr.vlsv\"))","category":"page"},{"location":"log/","page":"FAQ","title":"FAQ","text":"These are also used in the standard test. These will be automatically downloaded from vlsv_data if you run the package test locally.","category":"page"},{"location":"log/#Performance","page":"FAQ","title":"Performance","text":"","category":"section"},{"location":"log/","page":"FAQ","title":"FAQ","text":"The VLSV loader inherits the basic structure from Analysator and is redesigned for performance.","category":"page"},{"location":"log/","page":"FAQ","title":"FAQ","text":"For general data reading, a dictionary is constructed for cell IDs and orderings for O(1) timings.\nIt is faster to read a bunch of cell IDs together, if possible, than to read each cell one-by-one.\nSpecific methods are provided for targeted tasks that are much faster than the generic approaches. For instance, extractsat for multi-frame static satellite extraction can be more than 10x faster than first reading the metadata and then extracting variables for each frame.","category":"page"},{"location":"log/","page":"FAQ","title":"FAQ","text":"For development, it is recommended to use PkgBenchmark.jl to run the test suite:","category":"page"},{"location":"log/","page":"FAQ","title":"FAQ","text":"using PkgBenchmark, Vlasiator\nresults = benchmarkpkg(Vlasiator)","category":"page"},{"location":"log/","page":"FAQ","title":"FAQ","text":"or if you want to compare the current status of the package against a different git version","category":"page"},{"location":"log/","page":"FAQ","title":"FAQ","text":"judge(Vlasiator, \"97e3dca6b2474d7bdc5b62b5bf98ecf070516e5e\")","category":"page"},{"location":"log/","page":"FAQ","title":"FAQ","text":"To export results to Markdown,","category":"page"},{"location":"log/","page":"FAQ","title":"FAQ","text":"export_markdown(\"testresult\", results)","category":"page"},{"location":"log/","page":"FAQ","title":"FAQ","text":"See more in the PkgBenchmark manual.","category":"page"},{"location":"log/#Precision","page":"FAQ","title":"Precision","text":"","category":"section"},{"location":"log/","page":"FAQ","title":"FAQ","text":"For post-processing and data analysis purposes, it makes less sense to stick to double precisions, so we mostly use Float32 in Vlasiator.jl for numerical arrays. Several exceptions are:","category":"page"},{"location":"log/","page":"FAQ","title":"FAQ","text":"physical constants are defined in Float64, since single precision only resolves up to ±3.4E+38, and it may go out of bound in the middle of calculation (e.g. plasma frequency).","category":"page"},{"location":"log/#Int-vs.-UInt","page":"FAQ","title":"Int vs. UInt","text":"","category":"section"},{"location":"log/","page":"FAQ","title":"FAQ","text":"Integers but not unsigned integers shall be used for indexing, even though unsigned integers are tempting.","category":"page"},{"location":"log/#Memory","page":"FAQ","title":"Memory","text":"","category":"section"},{"location":"log/","page":"FAQ","title":"FAQ","text":"Vlasiator output files can be large. If we have limited memory relative to the file size, Vlasiator.jl provide direct hard disk mapping through mmap in Julia. With this mechanism you never need to worry about unable to process data with small free memory. Besides, we found that proper usage of mmap can also speed up reading and reduce memory comsumption. However, without reinterpret we may encounter the alignment issue!","category":"page"},{"location":"log/#Parallelism","page":"FAQ","title":"Parallelism","text":"","category":"section"},{"location":"log/","page":"FAQ","title":"FAQ","text":"The current design choice is to achieve optimal serial performance per file, and apply parallel processing across individual files. In most common cases, the time it takes for post-processing one snapshot is reasonably short, but the number of snapshots are large. Julia's built-in support for all kinds of parallelism paradigm (multithreading, multiprocessing, channel) and external support from packages (MPI.jl, Polyester.jl) can be relatively easily incorported to make the whole workflow parallel.","category":"page"},{"location":"log/","page":"FAQ","title":"FAQ","text":"multi-threading with @threads (recommended when working within one node)\nmulti-processing with pmap\nmulti-processing with RemoteChannel\nClusterManagers for multi-node jobs","category":"page"},{"location":"log/","page":"FAQ","title":"FAQ","text":"See more in the examples.","category":"page"},{"location":"log/#VTK","page":"FAQ","title":"VTK","text":"","category":"section"},{"location":"log/","page":"FAQ","title":"FAQ","text":"VLSV is just an uncompressed binary format. If we convert VLSV to VTK through write_vtk, the generated VTK files, even the highest resolution one with every coarse cell mapping to the finest level, can be several times smaller than the original VLSV file.","category":"page"},{"location":"log/","page":"FAQ","title":"FAQ","text":"One drawback of this conversion is that it cannot deal with phase space outputs, i.e. VDFs.","category":"page"},{"location":"examples/visualization/demo_1d2d_mp_pyplot/","page":"Combined plots with multi-processing","title":"Combined plots with multi-processing","text":"EditURL = \"/home/runner/work/Vlasiator.jl/Vlasiator.jl/docs/examples/visualization/demo_1d2d_mp_pyplot.md\"","category":"page"},{"location":"examples/visualization/demo_1d2d_mp_pyplot/#demo_1d2d_mp","page":"Combined plots with multi-processing","title":"Combined plots with multi-processing","text":"","category":"section"},{"location":"examples/visualization/demo_1d2d_mp_pyplot/","page":"Combined plots with multi-processing","title":"Combined plots with multi-processing","text":"(Image: Author) (Image: Update time)","category":"page"},{"location":"examples/visualization/demo_1d2d_mp_pyplot/","page":"Combined plots with multi-processing","title":"Combined plots with multi-processing","text":"This is an example for generating combined 1D/2D plots across multiple frames with multi-processing. To run on a single node,","category":"page"},{"location":"examples/visualization/demo_1d2d_mp_pyplot/","page":"Combined plots with multi-processing","title":"Combined plots with multi-processing","text":"julia -p $ncores demo_1d2d_mp_pyplot.jl","category":"page"},{"location":"examples/visualization/demo_1d2d_mp_pyplot/","page":"Combined plots with multi-processing","title":"Combined plots with multi-processing","text":"using Distributed\n@everywhere using Vlasiator, VlasiatorPyPlot, Printf, LaTeXStrings\n\n@assert matplotlib.__version__ ≥ \"3.4\" \"Require Matplotlib version 3.4+ to use subfigure!\"\n\n@everywhere struct Varminmax{T}\n \"Density, [amu/cc]\"\n ρmin::T\n ρmax::T\n \"Velocity, [km/s]\"\n vmin::T\n vmax::T\n \"Pressure, [nPa]\"\n pmin::T\n pmax::T\n \"Magnetic field, [nT]\"\n bmin::T\n bmax::T\n \"Electric field, [nT]\"\n emin::T\n emax::T\nend\n\n@everywhere function init_figure(loc, norms, ticks, pArgs1, varminmax)\n fig = plt.figure(myid(), constrained_layout=true, figsize=(12, 7.2))\n subfigs = fig.subfigures(1, 2, wspace=0.01, width_ratios=[2,1])\n\n axsL = subfigs[1].subplots(5, 1, sharex=true)\n axsR = subfigs[2].subplots(2, 1, sharex=true)\n\n # Set line plots' axes\n axsL[end].set_xlim(loc[1], loc[end])\n\n (;ρmin, ρmax, vmin, vmax, pmin, pmax, bmin, bmax, emin, emax) = varminmax\n\n axsL[1].set_ylim(ρmin, ρmax)\n axsL[2].set_ylim(vmin, vmax)\n axsL[3].set_ylim(pmin, pmax)\n axsL[4].set_ylim(bmin, bmax)\n axsL[5].set_ylim(emin, emax)\n for ax in axsL\n ax.xaxis.set_minor_locator(matplotlib.ticker.AutoMinorLocator())\n ax.yaxis.set_minor_locator(matplotlib.ticker.AutoMinorLocator())\n ax.grid(true)\n end\n\n axsL[end].set_xlabel(L\"x [$R_E$]\"; fontsize=14)\n axsL[1].set_ylabel(\"n [amu/cc]\"; fontsize=14)\n axsL[2].set_ylabel(\"V [km/s]\"; fontsize=14)\n axsL[3].set_ylabel(\"P [nPa]\"; fontsize=14)\n axsL[4].set_ylabel(\"B [nT]\"; fontsize=14)\n axsL[5].set_ylabel(\"E [mV/m]\"; fontsize=14)\n\n fakeline = loc\n l1 = axsL[1].plot(loc, fakeline, label=\"Proton density\", color=\"#1f77b4\")\n l2 = axsL[2].plot(loc, fakeline, label=\"Vx\", color=\"#1f77b4\")\n l3 = axsL[2].plot(loc, fakeline, label=\"Vy\", color=\"#ff7f0e\")\n l4 = axsL[2].plot(loc, fakeline, label=\"Vz\", color=\"#2ca02c\")\n l5 = axsL[3].plot(loc, fakeline, label=\"Ram\", color=\"#1f77b4\")\n l6 = axsL[3].plot(loc, fakeline, label=\"Thermal\", color=\"#ff7f0e\")\n l7 = axsL[4].plot(loc, fakeline, label=\"Bx\", color=\"#1f77b4\")\n l8 = axsL[4].plot(loc, fakeline, label=\"By\", color=\"#ff7f0e\")\n l9 = axsL[4].plot(loc, fakeline, label=\"Bz\", color=\"#2ca02c\")\n l10= axsL[5].plot(loc, fakeline, label=\"Ex\", color=\"#1f77b4\")\n l11= axsL[5].plot(loc, fakeline, label=\"Ey\", color=\"#ff7f0e\")\n l12= axsL[5].plot(loc, fakeline, label=\"Ez\", color=\"#2ca02c\")\n\n ls = (l1, l2, l3, l4, l5, l6, l7, l8, l9, l10, l11, l12)\n\n axsL[2].legend(;loc=\"lower left\", ncol=3, frameon=false, fontsize=12)\n axsL[3].legend(;loc=\"upper right\", ncol=2, frameon=false, fontsize=12)\n axsL[4].legend(;loc=\"upper right\", ncol=3, frameon=false, fontsize=12)\n axsL[5].legend(;loc=\"lower right\", ncol=3, frameon=false, fontsize=12)\n\n vl1 = axsL[1].vlines(loc[1], ρmin, ρmax; colors=\"r\", linestyle=\"dashed\", alpha=0.5)\n vl2 = axsL[2].vlines(loc[1], vmin, vmax; colors=\"r\", linestyle=\"dashed\", alpha=0.5)\n vl3 = axsL[3].vlines(loc[1], pmin, pmax; colors=\"r\", linestyle=\"dashed\", alpha=0.5)\n vl4 = axsL[4].vlines(loc[1], bmin, bmax; colors=\"r\", linestyle=\"dashed\", alpha=0.5)\n vl5 = axsL[5].vlines(loc[1], emin, emax; colors=\"r\", linestyle=\"dashed\", alpha=0.5)\n\n hl2 = axsL[2].hlines(0.0, loc[1], loc[end]; colors=\"k\", linestyle=\"dashed\", alpha=0.2)\n hl4 = axsL[4].hlines(0.0, loc[1], loc[end]; colors=\"k\", linestyle=\"dashed\", alpha=0.2)\n hl5 = axsL[5].hlines(0.0, loc[1], loc[end]; colors=\"k\", linestyle=\"dashed\", alpha=0.2)\n\n vlines = (vl1, vl2, vl3, vl4, vl5)\n\n for ax in axsR\n ax.set_aspect(\"equal\")\n\n # Set border line widths\n for loc in (\"left\", \"bottom\", \"right\", \"top\")\n edge = get(ax.spines, loc, nothing)\n edge.set_linewidth(2.0)\n end\n ax.xaxis.set_tick_params(width=2.0, length=3)\n ax.yaxis.set_tick_params(width=2.0, length=3)\n ax.xaxis.set_minor_locator(matplotlib.ticker.AutoMinorLocator())\n ax.yaxis.set_minor_locator(matplotlib.ticker.AutoMinorLocator())\n\n ax.set_ylabel(pArgs1.stry; fontsize=14)\n end\n\n axsR[2].set_xlabel(pArgs1.strx; fontsize=14)\n\n axsR[1].set_title(\"Alfvén speed\", fontsize=14)\n axsR[2].set_title(\"Sound speed\", fontsize=14)\n\n x, y = Vlasiator.get_axis(pArgs1)\n fakedata = fill(NaN32, length(y), length(x))\n\n c1 = axsR[1].pcolormesh(x, y, fakedata, norm=norms[1], cmap=matplotlib.cm.turbo)\n c2 = axsR[2].pcolormesh(x, y, fakedata, norm=norms[2], cmap=matplotlib.cm.turbo)\n\n rInner = 31.8e6 # [m]\n circle1 = plt.Circle((0, 0), rInner/Vlasiator.RE, facecolor=\"w\", edgecolor=\"tab:purple\")\n circle2 = plt.Circle((0, 0), rInner/Vlasiator.RE, facecolor=\"w\", edgecolor=\"tab:purple\")\n axsR[1].add_patch(circle1)\n axsR[2].add_patch(circle2)\n\n im_ratio = length(y)/length(x)\n fraction = 0.046 * im_ratio\n\n cb1 = colorbar(c1; ax=axsR[1], ticks=ticks[1], fraction, pad=0.02, extend=\"max\")\n cb1.ax.set_ylabel(\"[km/s]\"; fontsize=14)\n\n cb2 = colorbar(c2; ax=axsR[2], ticks=ticks[2], fraction, pad=0.02, extend=\"max\")\n cb2.ax.set_ylabel(\"[km/s]\"; fontsize=14)\n\n fig.suptitle(\"Density Pulse Run\", fontsize=\"x-large\")\n\n cs = (c1, c2)\n\n return fig, subfigs, ls, vlines, cs\nend\n\n@everywhere function update_vline(h, x)\n seg_old = h.get_segments()\n ymin = seg_old[1][1, 2]\n ymax = seg_old[1][2, 2]\n\n seg_new = [[x ymin; x ymax]]\n\n h.set_segments(seg_new)\nend\n\n@everywhere function update_plot!(subfigs, ls, vlines, cs, outdir, file, cellids, loc)\n isfile(outdir*file[end-8:end-5]*\".png\") && return\n\n println(\"file = $(basename(file))\")\n meta = load(file)\n\n rho = readvariable(meta, \"proton/vg_rho\", cellids) |> vec\n v = readvariable(meta, \"proton/vg_v\", cellids)\n p = readvariable(meta, \"vg_pressure\", cellids) .* 1f9 |> vec # [nPa]\n\n vmag2 = sum(x -> x*x, v, dims=1) |> vec\n pram = rho .* Vlasiator.mᵢ .* vmag2 .* 1f9 # [nPa]\n\n b = readvariable(meta, \"vg_b_vol\", cellids) .* 1f9 #[nT]\n e = readvariable(meta, \"vg_e_vol\", cellids) .* 1f3 #[mV/m]\n\n ls[1][1].set_ydata(rho ./ 1f6)\n ls[2][1].set_ydata(@views v[1,:] ./ 1f3)\n ls[3][1].set_ydata(@views v[2,:] ./ 1f3)\n ls[4][1].set_ydata(@views v[3,:] ./ 1f3)\n ls[5][1].set_ydata(pram)\n ls[6][1].set_ydata(p)\n ls[7][1].set_ydata(@view b[1,:])\n ls[8][1].set_ydata(@view b[2,:])\n ls[9][1].set_ydata(@view b[3,:])\n ls[10][1].set_ydata(@view e[1,:])\n ls[11][1].set_ydata(@view e[2,:])\n ls[12][1].set_ydata(@view e[3,:])\n\n imagnetopause_ = findfirst(<(0.0), @views b[3,:])\n for vline in vlines\n update_vline(vline, loc[imagnetopause_])\n end\n\n str_title = @sprintf \"Sun-Earth line, t= %4.1fs\" meta.time\n subfigs[1].suptitle(str_title, fontsize=\"x-large\")\n\n data = Vlasiator.prep2d(meta, \"VA\", :z)'\n cs[1].set_array(data ./ 1f3)\n\n data = Vlasiator.prep2d(meta, \"VS\", :z)'\n cs[2].set_array(data ./ 1f3)\n\n savefig(outdir*file[end-8:end-5]*\".png\", bbox_inches=\"tight\")\n return\nend\n\nfunction make_jobs(files)\n for f in files\n put!(jobs, f)\n end\nend\n\n@everywhere function do_work(jobs, status,\n outdir, loc, norms, ticks, pArgs1, cellids, varminmax)\n\n fig, subfigs, ls, vlines, cs = init_figure(loc, norms, ticks, pArgs1, varminmax)\n while true\n file = take!(jobs)\n update_plot!(subfigs, ls, vlines, cs, outdir, file, cellids, loc)\n put!(status, true)\n end\n close(fig)\nend\n\n################################################################################\nfiles = filter(contains(r\"^bulk.*\\.vlsv$\"), readdir())\n\nnfile = length(files)\n# Set output directory\nconst outdir = \"1d2d/\"\n\n# Set contour plots' axes\naxisunit = EARTH\n# Upper/lower limits for each variable\nρmin, ρmax = 0.0, 14.0 # [amu/cc]\nvmin, vmax = -620.0, 150.0 # [km/s]\npmin, pmax = 0.0, 2.8 # [nPa]\nbmin, bmax = -60.0, 60.0 # [nT]\nemin, emax = -8.0, 8.0 # [mV/m]\nvamin, vamax = 50.0, 600.0 # [km/s]\nvsmin, vsmax = 50.0, 600.0 # [km/s]\n\nvarminmax = Varminmax(ρmin, ρmax, vmin, vmax, pmin, pmax, bmin, bmax, emin, emax)\n\nmeta = load(files[1])\n\npArgs1 = Vlasiator.set_args(meta, \"VA\", axisunit; normal=:none)\nnorm1, ticks1 = set_colorbar(Linear, vamin, vamax)\nnorm2, ticks2 = set_colorbar(Linear, vsmin, vsmax)\n\nconst norms = (norm1, norm2)\nconst ticks = (ticks1, ticks2)\n\nconst jobs = RemoteChannel(()->Channel{String}(nfile))\nconst status = RemoteChannel(()->Channel{Bool}(nworkers()))\n\nxmin, xmax = 7.0, 17.0 # Earth radii\npoint1 = [xmin, 0, 0] .* Vlasiator.RE\npoint2 = [xmax, 0, 0] .* Vlasiator.RE\n\nmeta = load(files[1])\ncellids, _, _ = getcellinline(meta, point1, point2)\nloc = range(xmin, xmax, length=length(cellids))\n\nprintln(\"Total number of files: $nfile\")\nprintln(\"Running with $(nworkers()) workers...\")\n\n@async make_jobs(files) # Feed the jobs channel with all files to process.\n\n@sync for p in workers()\n @async remote_do(do_work, p, jobs, status,\n outdir, loc, norms, ticks, pArgs1, cellids, varminmax)\nend\n\nlet n = nfile\n t = @elapsed while n > 0 # wait for all jobs to complete\n take!(status)\n n -= 1\n end\n println(\"Finished in $(round(t, digits=2))s.\")\nend","category":"page"},{"location":"examples/visualization/demo_1d2d_mp_pyplot/","page":"Combined plots with multi-processing","title":"Combined plots with multi-processing","text":"","category":"page"},{"location":"examples/visualization/demo_1d2d_mp_pyplot/","page":"Combined plots with multi-processing","title":"Combined plots with multi-processing","text":"This page was generated using DemoCards.jl.","category":"page"},{"location":"examples/postprocess/demo_pointsextracting/","page":"Virtual satellites","title":"Virtual satellites","text":"EditURL = \"/home/runner/work/Vlasiator.jl/Vlasiator.jl/docs/examples/postprocess/demo_pointsextracting.md\"","category":"page"},{"location":"examples/postprocess/demo_pointsextracting/#demo_virtual_sats","page":"Virtual satellites","title":"Virtual satellites","text":"","category":"section"},{"location":"examples/postprocess/demo_pointsextracting/","page":"Virtual satellites","title":"Virtual satellites","text":"(Image: Author) (Image: Update time)","category":"page"},{"location":"examples/postprocess/demo_pointsextracting/","page":"Virtual satellites","title":"Virtual satellites","text":"This demo shows how to extract data for virtual satellites at multiple locations. Outputs are stored in binary format for sharing within Julia.","category":"page"},{"location":"examples/postprocess/demo_pointsextracting/","page":"Virtual satellites","title":"Virtual satellites","text":"Usage:","category":"page"},{"location":"examples/postprocess/demo_pointsextracting/","page":"Virtual satellites","title":"Virtual satellites","text":"julia -t nthreads demo_pointsextracting.jl","category":"page"},{"location":"examples/postprocess/demo_pointsextracting/","page":"Virtual satellites","title":"Virtual satellites","text":"or","category":"page"},{"location":"examples/postprocess/demo_pointsextracting/","page":"Virtual satellites","title":"Virtual satellites","text":"JULIA_NUM_THREADS=nthreads julia demo_pointsextracting.jl","category":"page"},{"location":"examples/postprocess/demo_pointsextracting/","page":"Virtual satellites","title":"Virtual satellites","text":"using Vlasiator\nusing Vlasiator: RE # Earth radius, [m]\nusing JLD2: jldsave\n\nfunction extract_vars(files, locations)\n nfiles = length(files)\n nlocs = length(locations)\n # variables to be extracted\n t = zeros(Float32, nfiles)\n rho = zeros(Float32, nlocs, nfiles)\n v = zeros(Float32, 3, nlocs, nfiles)\n p = zeros(Float32, nlocs, nfiles)\n b = zeros(Float32, 3, nlocs, nfiles)\n e = zeros(Float32, 3, nlocs, nfiles)\n\n ids = Vector{Int}(undef, nlocs)\n load(files[1]) do meta\n for iloc in eachindex(locations)\n ids[iloc] = getcell(meta, locations[iloc])\n end\n end\n\n # Extract data from each frame\n Threads.@threads for i = eachindex(files)\n meta = load(files[i])\n t[i] = meta.time\n rho[:,i] = readvariable(meta, \"proton/vg_rho\", ids)\n v[:,:,i] = readvariable(meta, \"proton/vg_v\", ids)\n p[ :,i] = readvariable(meta, \"vg_pressure\", ids)\n b[:,:,i] = readvariable(meta, \"vg_b_vol\", ids)\n e[:,:,i] = readvariable(meta, \"vg_e_vol\", ids)\n end\n\n # Save into binary file\n jldsave(\"satellites.jld2\"; locations, t, rho, v, p, b, e)\nend\n\n#####\n\nfiles = filter(contains(r\"^bulk.*\\.vlsv$\"), readdir())\n\n# virtual satellite locations\nconst locations = [[7RE, 0, 0], [9RE, 0, 0], [11RE, 0, 0], [12RE, 0, 0],\n [13RE, 0, 0], [14RE, 0, 0], [15RE, 0, 0], [16RE, 0, 0], [17RE, 0, 0],\n [29.3RE, 0, 0]]\n\nprintln(\"Number of files: $(length(files))\")\nprintln(\"Number of virtual satellites: $(length(locations))\")\nprintln(\"Running with $(Threads.nthreads()) threads...\")\n\n@time extract_vars(files, locations)\n\nprintln(\"Virtual satellite extraction done!\")","category":"page"},{"location":"examples/postprocess/demo_pointsextracting/","page":"Virtual satellites","title":"Virtual satellites","text":"","category":"page"},{"location":"examples/postprocess/demo_pointsextracting/","page":"Virtual satellites","title":"Virtual satellites","text":"This page was generated using DemoCards.jl.","category":"page"},{"location":"examples/postprocess/demo_convert2vti/","page":"Converting to VTK","title":"Converting to VTK","text":"EditURL = \"/home/runner/work/Vlasiator.jl/Vlasiator.jl/docs/examples/postprocess/demo_convert2vti.md\"","category":"page"},{"location":"examples/postprocess/demo_convert2vti/#demo_convertvtk","page":"Converting to VTK","title":"Converting to VTK","text":"","category":"section"},{"location":"examples/postprocess/demo_convert2vti/","page":"Converting to VTK","title":"Converting to VTK","text":"(Image: Author) (Image: Update time)","category":"page"},{"location":"examples/postprocess/demo_convert2vti/","page":"Converting to VTK","title":"Converting to VTK","text":"To convert VLSV time series files to VTK image files using multithreads,","category":"page"},{"location":"examples/postprocess/demo_convert2vti/","page":"Converting to VTK","title":"Converting to VTK","text":"using Vlasiator\n\nfiles = filter(endswith(\".vlsv\"), readdir())\n\nThreads.@threads for file in files\n @info file, Threads.threadid()\n write_vtk(file; vti=true)\nend","category":"page"},{"location":"examples/postprocess/demo_convert2vti/","page":"Converting to VTK","title":"Converting to VTK","text":"","category":"page"},{"location":"examples/postprocess/demo_convert2vti/","page":"Converting to VTK","title":"Converting to VTK","text":"This page was generated using DemoCards.jl.","category":"page"},{"location":"examples/visualization/demo_2d_mp_pyplot/","page":"2D contour plots with multi-processing","title":"2D contour plots with multi-processing","text":"EditURL = \"/home/runner/work/Vlasiator.jl/Vlasiator.jl/docs/examples/visualization/demo_2d_mp_pyplot.md\"","category":"page"},{"location":"examples/visualization/demo_2d_mp_pyplot/#demo_2d_contour_mp","page":"2D contour plots with multi-processing","title":"2D contour plots with multi-processing","text":"","category":"section"},{"location":"examples/visualization/demo_2d_mp_pyplot/","page":"2D contour plots with multi-processing","title":"2D contour plots with multi-processing","text":"(Image: Author) (Image: Update time)","category":"page"},{"location":"examples/visualization/demo_2d_mp_pyplot/","page":"2D contour plots with multi-processing","title":"2D contour plots with multi-processing","text":"This demo shows how to generate 2D colored contours with multi-processing. To run on a single node,","category":"page"},{"location":"examples/visualization/demo_2d_mp_pyplot/","page":"2D contour plots with multi-processing","title":"2D contour plots with multi-processing","text":"julia -p $ncores demo_2d_mp_pyplot.jl","category":"page"},{"location":"examples/visualization/demo_2d_mp_pyplot/","page":"2D contour plots with multi-processing","title":"2D contour plots with multi-processing","text":"using Distributed, ParallelDataTransfer\n@everywhere using Vlasiator, VlasiatorPyPlot, Printf, LaTeXStrings\n\n@everywhere function init_figure(cmaps, norms, ticks, pArgs1, extent)\n fig, axs = plt.subplots(2, 3; num=myid(),\n figsize=(13.5, 9.5), sharex=true, sharey=true, constrained_layout=true)\n\n for ax in axs\n ax.set_aspect(\"equal\")\n # Set border line widths\n for loc in (\"left\", \"bottom\", \"right\", \"top\")\n edge = get(ax.spines, loc, nothing)\n edge.set_linewidth(2.0)\n end\n ax.xaxis.set_tick_params(width=2.0, length=3)\n ax.yaxis.set_tick_params(width=2.0, length=3)\n ax.xaxis.set_minor_locator(matplotlib.ticker.AutoMinorLocator())\n ax.yaxis.set_minor_locator(matplotlib.ticker.AutoMinorLocator())\n end\n\n for ax in axs[end,:]\n ax.set_xlabel(pArgs1.strx; fontsize)\n end\n for ax in axs[:,1]\n ax.set_ylabel(pArgs1.stry; fontsize)\n end\n\n titles = (\"Density\", \"Pth\", \"Vx\", \"Bz\", \"Vz\", \"E\")\n\n for (ax, title) in zip(axs, titles)\n ax.set_title(title; fontsize)\n end\n\n x1, x2 = Vlasiator.get_axis(pArgs1)\n\n range1 = searchsortedfirst(x1, extent[1]):searchsortedlast(x1, extent[2])\n range2 = searchsortedfirst(x2, extent[3]):searchsortedlast(x2, extent[4])\n\n fakedata = zeros(Float32, length(range2), length(range1))\n\n c1 = axs[1,1].pcolormesh(x1[range1], x2[range2], fakedata;\n norm=norms[1], cmap=cmaps[1])\n c2 = axs[1,2].pcolormesh(x1[range1], x2[range2], fakedata;\n norm=norms[2], cmap=cmaps[2])\n c3 = axs[1,3].pcolormesh(x1[range1], x2[range2], fakedata;\n norm=norms[3], cmap=cmaps[2])\n c4 = axs[2,1].pcolormesh(x1[range1], x2[range2], fakedata;\n norm=norms[4], cmap=cmaps[1])\n c5 = axs[2,2].pcolormesh(x1[range1], x2[range2], fakedata;\n norm=norms[5], cmap=cmaps[2])\n c6 = axs[2,3].pcolormesh(x1[range1], x2[range2], fakedata;\n norm=norms[6], cmap=cmaps[1])\n\n cs = (c1, c2, c3, c4, c5, c6)\n\n format = matplotlib.ticker.FormatStrFormatter(\"%.1f\")\n\n cb1 = colorbar(c1; ax=axs[1,1], ticks=ticks[1], format)\n cb2 = colorbar(c2; ax=axs[1,2], ticks=ticks[2])\n cb3 = colorbar(c3; ax=axs[1,3], ticks=ticks[3])\n cb4 = colorbar(c4; ax=axs[2,1], ticks=ticks[4], format)\n cb5 = colorbar(c5; ax=axs[2,2], ticks=ticks[5], format, extend=\"both\")\n cb6 = colorbar(c6; ax=axs[2,3], ticks=ticks[6], extend=\"max\")\n\n ylabels = (\"[amu/cc]\", \"[km/s]\", \"[km/s]\", \"[nPa]\", \"[nT]\", \"[mV/m]\")\n\n for (i, cb) in enumerate((cb1, cb2, cb3, cb4, cb5, cb6))\n cb.ax.set_ylabel(ylabels[i]; fontsize)\n cb.outline.set_linewidth(1.0)\n end\n\n return fig, cs, range1, range2\nend\n\n@everywhere function update_plot!(fig, cs, range1, range2, outdir, file)\n isfile(outdir*file[end-8:end-5]*\".png\") && return\n\n println(\"file = $file\")\n meta = load(file)\n\n data = Vlasiator.prep2d(meta, \"proton/vg_rho\", :mag)'\n cs[1].set_array(data[range2,range1] ./ 1f6)\n\n data = Vlasiator.prep2d(meta, \"proton/vg_v\", :x)'\n cs[2].set_array(data[range2,range1] ./ 1f3)\n\n data = Vlasiator.prep2d(meta, \"proton/vg_v\", :z)'\n cs[3].set_array(data[range2,range1] ./ 1f3)\n\n data = Vlasiator.prep2d(meta, \"vg_pressure\", :mag)'\n cs[4].set_array(data[range2,range1] .* 1f9)\n\n data = Vlasiator.prep2d(meta, \"vg_b_vol\", :z)'\n cs[5].set_array(data[range2,range1] .* 1f9)\n\n data = Vlasiator.prep2d(meta, \"vg_e_vol\", :mag)'\n cs[6].set_array(data[range2,range1] .* 1f3)\n\n str_title = @sprintf \"Density pulse run, t= %4.1fs\" meta.time\n fig.suptitle(str_title; fontsize=\"xx-large\")\n\n savefig(outdir*file[end-8:end-5]*\".png\", bbox_inches=\"tight\")\nend\n\nfunction make_jobs(files)\n for f in files\n put!(jobs, f)\n end\nend\n\n@everywhere function do_work(jobs, status, outdir, cmaps, norms, ticks, pArgs1, extent)\n fig, cs, range1, range2 = init_figure(cmaps, norms, ticks, pArgs1, extent)\n while true\n file = take!(jobs)\n update_plot!(fig, cs, range1, range2, outdir, file)\n put!(status, true)\n end\n close(fig)\nend\n\n################################################################################\nfiles = filter(contains(r\"^bulk.*\\.vlsv$\"), readdir())\n\nnfile = length(files)\n# Set output directory\nconst outdir = \"contour/\"\n\n# Set colormaps for continuous and divergent data\nconst cmaps = (matplotlib.cm.turbo, matplotlib.cm.RdBu_r)\nconst axisunit = EARTH\nconst extent = [0., 20., -20., 20.] # [RE], default: [-Inf32, Inf32, -Inf32, Inf32]\n\n# Plotting range for each variable\nconst ρmin, ρmax = 0.1, 15.0 # [amu/cc]\nconst vxmin, vxmax = -650.0, 650.0 # [km/s]\nconst vzmin, vzmax = -500.0, 500.0 # [km/s]\nconst pmin, pmax = 0.0, 3.6 # [nPa]\nconst bmin, bmax = -60.0, 60. # [nT]\nconst emin, emax = 0.0, 20. # [mV/m]\n\nmeta = load(files[1])\n\npArgs1 = Vlasiator.set_args(meta, \"proton/vg_rho\", axisunit; normal=:none)\n\nnorm1, ticks1 = set_colorbar(Linear, ρmin, ρmax)\nnorm2, ticks2 = set_colorbar(Linear, vxmin, vxmax)\nnorm3, ticks3 = set_colorbar(Linear, vzmin, vzmax)\nnorm4, ticks4 = set_colorbar(Linear, pmin, pmax)\nnorm5, ticks5 = set_colorbar(Linear, bmin, bmax)\nnorm6, ticks6 = set_colorbar(Linear, emin, emax)\n\nconst norms = (norm1, norm2, norm3, norm4, norm5, norm6)\nconst ticks = (ticks1, ticks2, ticks3, ticks4, ticks5, ticks6)\n\nconst jobs = RemoteChannel(()->Channel{String}(nfile))\nconst status = RemoteChannel(()->Channel{Bool}(nworkers()))\n\n@broadcast begin\n const fontsize = \"x-large\"\nend\n\nprintln(\"Total number of files: $nfile\")\nprintln(\"Running with $(nworkers()) workers...\")\n\n@async make_jobs(files) # Feed the jobs channel with all files to process.\n\n@sync for p in workers()\n @async remote_do(do_work, p, jobs, status, outdir, cmaps, norms, ticks, pArgs1, extent)\nend\n\nlet n = nfile\n t = @elapsed while n > 0 # wait for all jobs to complete\n take!(status)\n n -= 1\n end\n println(\"Finished in $(round(t, digits=2))s.\")\nend","category":"page"},{"location":"examples/visualization/demo_2d_mp_pyplot/","page":"2D contour plots with multi-processing","title":"2D contour plots with multi-processing","text":"","category":"page"},{"location":"examples/visualization/demo_2d_mp_pyplot/","page":"2D contour plots with multi-processing","title":"2D contour plots with multi-processing","text":"This page was generated using DemoCards.jl.","category":"page"},{"location":"examples/visualization/demo_2d_animation_pyplot/","page":"2D contour plot animation","title":"2D contour plot animation","text":"EditURL = \"/home/runner/work/Vlasiator.jl/Vlasiator.jl/docs/examples/visualization/demo_2d_animation_pyplot.md\"","category":"page"},{"location":"examples/visualization/demo_2d_animation_pyplot/#demo_2d_contour_animation","page":"2D contour plot animation","title":"2D contour plot animation","text":"","category":"section"},{"location":"examples/visualization/demo_2d_animation_pyplot/","page":"2D contour plot animation","title":"2D contour plot animation","text":"(Image: Author) (Image: Update time)","category":"page"},{"location":"examples/visualization/demo_2d_animation_pyplot/","page":"2D contour plot animation","title":"2D contour plot animation","text":"This example shows how to plot 2D colored contours with pcolormesh. ffmpeg is required to be installed for saving into mp4.","category":"page"},{"location":"examples/visualization/demo_2d_animation_pyplot/","page":"2D contour plot animation","title":"2D contour plot animation","text":"using Vlasiator, VlasiatorPyPlot, Printf\nusing PyCall\n@pyimport matplotlib.animation as anim\n\nfiles = filter(contains(r\"^bulk.*\\.vlsv$\"), readdir())\nconst var = \"proton/vg_rho\"\nconst comp = 0 # vector component for plotting (if applicable)\n\nfig = plt.figure(figsize=(6.4,5.1), constrained_layout=true)\n\nax = plt.axes()\n\nconst axisunit = EARTH\nconst colorscale = Log\nconst addcolorbar = true\n# Choose colormap\nconst cmap = matplotlib.cm.turbo\n# Set data plotting range\nconst vmin = 7.0e4\nconst vmax = 2.5e6\n\nmeta = load(files[1])\n\npArgs = Vlasiator.set_args(meta, var, axisunit; normal=:none)\n\nnorm, ticks = set_colorbar(colorscale, vmin, vmax)\n\nc = let\n x1, x2 = Vlasiator.get_axis(pArgs)\n fakedata = zeros(Float32, length(x2), length(x1))\n ax.pcolormesh(x1, x2, fakedata; norm, cmap)\nend\n\nVlasiatorPyPlot.set_plot(c, ax, pArgs, ticks, addcolorbar)\n\nfunction animate(i::Int, files::Vector{String}, var::String, comp::Int, c)\n meta = load(files[i+1])\n t = readparameter(meta, \"time\")\n data = Vlasiator.prep2d(meta, var, comp)'\n c.set_array(data)\n\n str_title = @sprintf \"t= %4.1fs\" t\n ax.set_title(str_title, fontweight=\"bold\")\n\n return (c,)\nend\n\n# https://matplotlib.org/stable/api/_as_gen/matplotlib.animation.FuncAnimation.html\nout = anim.FuncAnimation(fig, animate, fargs=(files, var, comp, c),\n frames=length(files), blit=true,\n repeat_delay=1000, interval=50)\n# Make sure ffmpeg is available!\nout.save(\"contour.mp4\", writer=\"ffmpeg\", fps=30)","category":"page"},{"location":"examples/visualization/demo_2d_animation_pyplot/","page":"2D contour plot animation","title":"2D contour plot animation","text":"","category":"page"},{"location":"examples/visualization/demo_2d_animation_pyplot/","page":"2D contour plot animation","title":"2D contour plot animation","text":"This page was generated using DemoCards.jl.","category":"page"},{"location":"examples/visualization/demo_1d2d_pyplot/","page":"Combined plots","title":"Combined plots","text":"EditURL = \"/home/runner/work/Vlasiator.jl/Vlasiator.jl/docs/examples/visualization/demo_1d2d_pyplot.md\"","category":"page"},{"location":"examples/visualization/demo_1d2d_pyplot/#demo_1d2d","page":"Combined plots","title":"Combined plots","text":"","category":"section"},{"location":"examples/visualization/demo_1d2d_pyplot/","page":"Combined plots","title":"Combined plots","text":"(Image: Author) (Image: Update time)","category":"page"},{"location":"examples/visualization/demo_1d2d_pyplot/","page":"Combined plots","title":"Combined plots","text":"To generate combined 1D/2D plots across multiple frames,","category":"page"},{"location":"examples/visualization/demo_1d2d_pyplot/","page":"Combined plots","title":"Combined plots","text":"using Vlasiator, VlasiatorPyPlot, Printf, LaTeXStrings\nusing Vlasiator: set_args, prep2d\n\n@assert VERSION ≥ v\"1.7.0\" \"Compatible with Julia v1.7+!\"\n@assert matplotlib.__version__ >= \"3.4\" \"Require Matplotlib version 3.4+ to use subfigure!\"\n\n\nstruct Varminmax{T}\n \"Density, [amu/cc]\"\n ρmin::T\n ρmax::T\n \"Velocity, [km/s]\"\n vmin::T\n vmax::T\n \"Pressure, [nPa]\"\n pmin::T\n pmax::T\n \"Magnetic field, [nT]\"\n bmin::T\n bmax::T\n \"Electric field, [nT]\"\n emin::T\n emax::T\n \"Alfven speed, [km/s]\"\n vamin::T\n vamax::T\n \"Sonic speed, [km/s]\"\n vsmin::T\n vsmax::T\nend\n\nfunction init_figure(varminmax, loc, pArgs)\n (; ρmin, ρmax, vmin, vmax, pmin, pmax, bmin, bmax, emin, emax,\n vamin, vamax, vsmin, vsmax) = varminmax\n\n fig = plt.figure(constrained_layout=true, figsize=(12, 7.2))\n subfigs = fig.subfigures(1, 2, wspace=0.01, width_ratios=[2,1])\n\n axsL = subfigs[1].subplots(5, 1, sharex=true)\n axsR = subfigs[2].subplots(2, 1, sharex=true)\n\n # Set line plots' axes\n axsL[end].set_xlim(loc[1], loc[end])\n\n axsL[1].set_ylim(ρmin, ρmax)\n axsL[2].set_ylim(vmin, vmax)\n axsL[3].set_ylim(pmin, pmax)\n axsL[4].set_ylim(bmin, bmax)\n axsL[5].set_ylim(emin, emax)\n for ax in axsL\n ax.xaxis.set_minor_locator(matplotlib.ticker.AutoMinorLocator())\n ax.yaxis.set_minor_locator(matplotlib.ticker.AutoMinorLocator())\n ax.grid(true)\n end\n\n axsL[end].set_xlabel(L\"x [$R_E$]\"; fontsize=14)\n axsL[1].set_ylabel(\"n [amu/cc]\"; fontsize=14)\n axsL[2].set_ylabel(\"V [km/s]\"; fontsize=14)\n axsL[3].set_ylabel(\"P [nPa]\"; fontsize=14)\n axsL[4].set_ylabel(\"B [nT]\"; fontsize=14)\n axsL[5].set_ylabel(\"E [mV/m]\"; fontsize=14)\n\n fakeline = loc\n l1 = axsL[1].plot(loc, fakeline, label=\"Proton density\", color=\"#1f77b4\")\n l2 = axsL[2].plot(loc, fakeline, label=\"Vx\", color=\"#1f77b4\")\n l3 = axsL[2].plot(loc, fakeline, label=\"Vy\", color=\"#ff7f0e\")\n l4 = axsL[2].plot(loc, fakeline, label=\"Vz\", color=\"#2ca02c\")\n l5 = axsL[3].plot(loc, fakeline, label=\"Ram\", color=\"#1f77b4\")\n l6 = axsL[3].plot(loc, fakeline, label=\"Thermal\", color=\"#ff7f0e\")\n l7 = axsL[4].plot(loc, fakeline, label=\"Bx\", color=\"#1f77b4\")\n l8 = axsL[4].plot(loc, fakeline, label=\"By\", color=\"#ff7f0e\")\n l9 = axsL[4].plot(loc, fakeline, label=\"Bz\", color=\"#2ca02c\")\n l10= axsL[5].plot(loc, fakeline, label=\"Ex\", color=\"#1f77b4\")\n l11= axsL[5].plot(loc, fakeline, label=\"Ey\", color=\"#ff7f0e\")\n l12= axsL[5].plot(loc, fakeline, label=\"Ez\", color=\"#2ca02c\")\n\n ls = (l1, l2, l3, l4, l5, l6, l7, l8, l9, l10, l11, l12)\n\n axsL[2].legend(;loc=\"lower left\", ncol=3, frameon=false, fontsize=12)\n axsL[3].legend(;loc=\"upper left\", ncol=2, frameon=false, fontsize=12)\n axsL[4].legend(;loc=\"upper right\", ncol=3, frameon=false, fontsize=12)\n axsL[5].legend(;loc=\"lower right\", ncol=3, frameon=false, fontsize=12)\n\n vl1 = axsL[1].vlines(loc[1], ρmin, ρmax; colors=\"r\", linestyle=\"dashed\", alpha=0.5)\n vl2 = axsL[2].vlines(loc[1], vmin, vmax; colors=\"r\", linestyle=\"dashed\", alpha=0.5)\n vl3 = axsL[3].vlines(loc[1], pmin, pmax; colors=\"r\", linestyle=\"dashed\", alpha=0.5)\n vl4 = axsL[4].vlines(loc[1], bmin, bmax; colors=\"r\", linestyle=\"dashed\", alpha=0.5)\n vl5 = axsL[5].vlines(loc[1], emin, emax; colors=\"r\", linestyle=\"dashed\", alpha=0.5)\n\n hl2 = axsL[2].hlines(0.0, loc[1], loc[end]; colors=\"k\", linestyle=\"dashed\", alpha=0.2)\n hl4 = axsL[4].hlines(0.0, loc[1], loc[end]; colors=\"k\", linestyle=\"dashed\", alpha=0.2)\n hl5 = axsL[5].hlines(0.0, loc[1], loc[end]; colors=\"k\", linestyle=\"dashed\", alpha=0.2)\n\n vlines = (vl1, vl2, vl3, vl4, vl5)\n\n for ax in axsR\n ax.set_aspect(\"equal\")\n\n # Set border line widths\n for loc in (\"left\", \"bottom\", \"right\", \"top\")\n edge = get(ax.spines, loc, nothing)\n edge.set_linewidth(2.0)\n end\n ax.xaxis.set_tick_params(width=2.0, length=3)\n ax.yaxis.set_tick_params(width=2.0, length=3)\n ax.xaxis.set_minor_locator(matplotlib.ticker.AutoMinorLocator())\n ax.yaxis.set_minor_locator(matplotlib.ticker.AutoMinorLocator())\n\n ax.set_ylabel(L\"Y [$R_E$]\"; fontsize=14)\n end\n\n axsR[2].set_xlabel(L\"X [$R_E$]\"; fontsize=14)\n\n axsR[1].set_title(\"Alfven speed\", fontsize=14)\n axsR[2].set_title(\"Sound speed\", fontsize=14)\n\n x, y = Vlasiator.get_axis(pArgs)\n fakedata = fill(NaN32, length(y), length(x))\n\n cnorm1, cticks1 = set_colorbar(Linear, vamin, vamax)\n cnorm2, cticks2 = set_colorbar(Linear, vsmin, vsmax)\n cmap = matplotlib.cm.turbo\n\n c1 = axsR[1].pcolormesh(x, y, fakedata; norm=cnorm1, cmap)\n c2 = axsR[2].pcolormesh(x, y, fakedata; norm=cnorm2, cmap)\n\n rInner = 31.8e6 # [m]\n circle1 = plt.Circle((0, 0), rInner/Vlasiator.RE, color=\"w\")\n circle2 = plt.Circle((0, 0), rInner/Vlasiator.RE, color=\"w\")\n axsR[1].add_patch(circle1)\n axsR[2].add_patch(circle2)\n\n cb1 = colorbar(c1; ax=axsR[1], ticks=cticks1, fraction=0.046, pad=0.04, extend=\"max\")\n cb1.ax.set_ylabel(\"[km/s]\"; fontsize=14)\n\n cb2 = colorbar(c2; ax=axsR[2], ticks=cticks2, fraction=0.046, pad=0.04)\n cb2.ax.set_ylabel(\"[km/s]\"; fontsize=14)\n\n #fig.suptitle(\"Density Pulse Run\", fontsize=\"xx-large\")\n\n cs = (c1, c2)\n\n return fig, subfigs, ls, vlines, cs\nend\n\n\n\"Update frame.\"\nfunction update_plot!(plotargs, outdir, file)\n isfile(outdir*file[end-8:end-5]*\".png\") && return\n\n fig, subfigs, ls, vlines, cs = plotargs\n\n meta = load(file)\n\n p_extract = readvariable(meta, \"vg_pressure\", cellids) .* 1f9 |> vec # [nPa]\n rho_extract = readvariable(meta, \"proton/vg_rho\", cellids) |> vec\n v_extract = readvariable(meta, \"proton/vg_v\", cellids)\n vmag2_extract = sum(x -> x*x, v_extract, dims=1) |> vec\n pram_extract = rho_extract .* Vlasiator.mᵢ .* vmag2_extract .* 1f9 # [nPa]\n\n bz = readvariable(meta, \"vg_b_vol\", cellids)[3,:] .* 1f9 #[nT]\n\n ls[1][1].set_ydata(rho_extract ./ 1f6)\n ls[2][1].set_ydata(v_extract[1,:] ./ 1f3)\n ls[3][1].set_ydata(pram_extract)\n ls[4][1].set_ydata(p_extract)\n ls[5][1].set_ydata(bz)\n\n imagnetopause_ = findfirst(<(0.0), bz)\n for vline in vlines\n update_vline(vline, loc[imagnetopause_])\n end\n\n str_title = @sprintf \"Sun-Earth line, t= %4.1fs\" meta.time\n subfigs[1].suptitle(str_title, fontsize=14)\n\n data = prep2d(meta, \"VA\", :z)'\n cs[1].update(Dict(\"array\" => data ./ 1e3))\n\n data = prep2d(meta, \"VS\", :z)'\n cs[2].update(Dict(\"array\" => data ./ 1e3))\n\n savefig(outdir*file[end-8:end-5]*\".png\", bbox_inches=\"tight\", dpi=100)\n return\nend\n\nfunction update_vline(h, x)\n seg_old = h.get_segments()\n ymin = seg_old[1][1, 2]\n ymax = seg_old[1][2, 2]\n\n seg_new = [[x ymin; x ymax]]\n\n h.set_segments(seg_new)\nend\n\n####### Main\n\nfiles = filter(contains(r\"^bulk.*\\.vlsv$\"), readdir())\nnfile = length(files)\n# Set output directory\nconst outdir = \"out/\"\n\nmeta = load(files[1])\n\nconst x1, x2 = 7.0, 18.0 # Earth radii\nconst point1 = [x1, 0, 0] .* Vlasiator.RE\nconst point2 = [x2, 0, 0] .* Vlasiator.RE\n\ncellids, distances, coords = getcellinline(meta, point1, point2)\n\nloc = range(x1, x2, length=length(cellids))\n\npArgs = set_args(meta, \"fakename\", RE; normal=:none)\n\n# Upper/lower limits for each variable\nρmin, ρmax = 0.0, 10.0 # [amu/cc]\nvmin, vmax = -640.0, 100.0 # [km/s]\npmin, pmax = 0.0, 1.82 # [nPa]\nbmin, bmax = -25.0, 60.0 # [nT]\nemin, emax = -5.0, 5.0 # [mV/m]\nvamin, vamax = 0.0, 250.0 # [km/s]\nvsmin, vsmax = 0.0, 400.0 # [km/s]\n\nvarminmax =\n Varminmax(ρmin, ρmax, vmin, vmax, pmin, pmax, bmin, bmax, emin, emax,\n vamin, vamax, vsmin, vsmax)\n\n\nplotargs = init_figure(varminmax, loc, pArgs)\n\n# Loop over snapshots\nfor (i, file) in enumerate(files)\n println(\"i = $i/$nfile, file = $(basename(file))\")\n update_plot!(plotargs, outdir, file)\nend\n\nclose(plotargs[1])\nprintln(\"Finished!\")","category":"page"},{"location":"examples/visualization/demo_1d2d_pyplot/","page":"Combined plots","title":"Combined plots","text":"","category":"page"},{"location":"examples/visualization/demo_1d2d_pyplot/","page":"Combined plots","title":"Combined plots","text":"This page was generated using DemoCards.jl.","category":"page"},{"location":"gallery/#Gallery","page":"Gallery","title":"Gallery","text":"","category":"section"},{"location":"gallery/#PyPlot","page":"Gallery","title":"PyPlot","text":"","category":"section"},{"location":"gallery/","page":"Gallery","title":"Gallery","text":"Proton density in a laminar flow with points denoting cell centers. demo","category":"page"},{"location":"gallery/","page":"Gallery","title":"Gallery","text":"(Image: )","category":"page"},{"location":"gallery/","page":"Gallery","title":"Gallery","text":"Proton density of Earth's magnetosphere in the meridional cut from 2D simulation, with fieldlines through fixed seeding points. demo","category":"page"},{"location":"gallery/","page":"Gallery","title":"Gallery","text":"(Image: )","category":"page"},{"location":"gallery/","page":"Gallery","title":"Gallery","text":"Proton density of Earth's magnetosphere in the meridional plane from 3D simulation.","category":"page"},{"location":"gallery/","page":"Gallery","title":"Gallery","text":"(Image: )","category":"page"},{"location":"gallery/","page":"Gallery","title":"Gallery","text":"Proton density of Earth's magnetosphere in the equatorial plane from 2D simulation, zoomed in to the magnetosheath and foreshock region, with streamlines and density contour at 10 amu/cc. demo","category":"page"},{"location":"gallery/","page":"Gallery","title":"Gallery","text":"(Image: )","category":"page"},{"location":"gallery/","page":"Gallery","title":"Gallery","text":"Proton density of Earth's magnetosphere in the normal cut planes from 3D simulation. demo","category":"page"},{"location":"gallery/","page":"Gallery","title":"Gallery","text":"(Image: )","category":"page"},{"location":"gallery/","page":"Gallery","title":"Gallery","text":"Proton phase space distribution projected onto the X-Z plane. demo","category":"page"},{"location":"gallery/","page":"Gallery","title":"Gallery","text":"(Image: )","category":"page"},{"location":"gallery/#Makie","page":"Gallery","title":"Makie","text":"","category":"section"},{"location":"gallery/","page":"Gallery","title":"Gallery","text":"Demos can be found in the Usage section of VlasiatorMakie.","category":"page"},{"location":"gallery/","page":"Gallery","title":"Gallery","text":"Various colored contours from 2D equatorial run","category":"page"},{"location":"gallery/","page":"Gallery","title":"Gallery","text":"(Image: )","category":"page"},{"location":"gallery/","page":"Gallery","title":"Gallery","text":"Interactive proton density slice from 3D AMR run","category":"page"},{"location":"gallery/","page":"Gallery","title":"Gallery","text":"(Image: )","category":"page"},{"location":"gallery/","page":"Gallery","title":"Gallery","text":"Three orthogonal slices of proton density from 3D AMR run","category":"page"},{"location":"gallery/","page":"Gallery","title":"Gallery","text":"(Image: )","category":"page"},{"location":"gallery/","page":"Gallery","title":"Gallery","text":"Isosurface of Bz = 0 from 3D AMR run","category":"page"},{"location":"gallery/","page":"Gallery","title":"Gallery","text":"(Image: )","category":"page"},{"location":"gallery/","page":"Gallery","title":"Gallery","text":"Proton phase space distribution projected onto the X-Z plane","category":"page"},{"location":"gallery/","page":"Gallery","title":"Gallery","text":"(Image: )","category":"page"},{"location":"gallery/","page":"Gallery","title":"Gallery","text":"Interactive proton phase space distribution in the three orthogonal planes","category":"page"},{"location":"gallery/","page":"Gallery","title":"Gallery","text":"(Image: )","category":"page"},{"location":"gallery/","page":"Gallery","title":"Gallery","text":"Proton phase space distribution","category":"page"},{"location":"gallery/","page":"Gallery","title":"Gallery","text":"(Image: )","category":"page"},{"location":"gallery/#ParaView","page":"Gallery","title":"ParaView","text":"","category":"section"},{"location":"gallery/","page":"Gallery","title":"Gallery","text":"VLSV files can be converted to the structured VTK format, and then visualized in ParaView.","category":"page"},{"location":"gallery/","page":"Gallery","title":"Gallery","text":"2D slice contour of density in the meriodional plane with streamlines","category":"page"},{"location":"gallery/","page":"Gallery","title":"Gallery","text":"(Image: )","category":"page"},{"location":"gallery/","page":"Gallery","title":"Gallery","text":"2D slices of density viewing from upstream","category":"page"},{"location":"gallery/","page":"Gallery","title":"Gallery","text":"(Image: )","category":"page"},{"location":"examples/visualization/demo_B_fieldline_mp_pyplot/","page":"Field lines with customized seeds via multi-processing","title":"Field lines with customized seeds via multi-processing","text":"EditURL = \"/home/runner/work/Vlasiator.jl/Vlasiator.jl/docs/examples/visualization/demo_B_fieldline_mp_pyplot.md\"","category":"page"},{"location":"examples/visualization/demo_B_fieldline_mp_pyplot/#demo_2d_fieldlines_mp","page":"Field lines with customized seeds via multi-processing","title":"Field lines with customized seeds via multi-processing","text":"","category":"section"},{"location":"examples/visualization/demo_B_fieldline_mp_pyplot/","page":"Field lines with customized seeds via multi-processing","title":"Field lines with customized seeds via multi-processing","text":"(Image: Author) (Image: Update time)","category":"page"},{"location":"examples/visualization/demo_B_fieldline_mp_pyplot/","page":"Field lines with customized seeds via multi-processing","title":"Field lines with customized seeds via multi-processing","text":"This demo shows how to plot field lines with handpicked seeds via multi-processing. To run on a single node,","category":"page"},{"location":"examples/visualization/demo_B_fieldline_mp_pyplot/","page":"Field lines with customized seeds via multi-processing","title":"Field lines with customized seeds via multi-processing","text":"julia -p $ncores demo_fieldline_mp_pyplot.jl","category":"page"},{"location":"examples/visualization/demo_B_fieldline_mp_pyplot/","page":"Field lines with customized seeds via multi-processing","title":"Field lines with customized seeds via multi-processing","text":"using Distributed, ParallelDataTransfer\n@everywhere using Vlasiator, VlasiatorPyPlot, PyCall, Printf, LaTeXStrings, FieldTracer\n@everywhere using Vlasiator: RE\n\nfunction generate_seeds(coordmin, coordmax, dim_, nseeds)\n seeds = Matrix{Float64}(undef, 2, nseeds)\n for i in 1:nseeds\n seeds[1,i] = coordmin[dim_[1]] +\n (coordmax[dim_[1]] - coordmin[dim_[1]]) / nseeds * (i - 1)\n seeds[2,i] = -20RE\n end\n seeds\nend\n\n@everywhere function init_figure(pArgs, norm, ticks, seeds, extent)\n fig, ax = plt.subplots(1, 1; num=myid(),\n figsize=(6, 8), constrained_layout=true)\n\n fontsize = \"x-large\"\n\n ax.set_aspect(\"equal\")\n # Set border line widths\n for loc in (\"left\", \"bottom\", \"right\", \"top\")\n edge = get(ax.spines, loc, nothing)\n edge.set_linewidth(2.0)\n end\n ax.xaxis.set_tick_params(width=2.0, length=3)\n ax.yaxis.set_tick_params(width=2.0, length=3)\n ax.xaxis.set_minor_locator(matplotlib.ticker.AutoMinorLocator())\n ax.yaxis.set_minor_locator(matplotlib.ticker.AutoMinorLocator())\n\n ax.set_xlabel(pArgs.strx; fontsize)\n ax.set_ylabel(pArgs.stry; fontsize)\n\n ax.set_title(\"Density\"; fontsize)\n\n x1, x2 = Vlasiator.get_axis(pArgs)\n\n range1 = searchsortedfirst(x1, extent[1]):searchsortedlast(x1, extent[2])\n range2 = searchsortedfirst(x2, extent[3]):searchsortedlast(x2, extent[4])\n\n fakedata = zeros(Float32, length(range2), length(range1))\n c = ax.pcolormesh(x1[range1], x2[range2], fakedata; norm, cmap=matplotlib.cm.turbo)\n\n format = matplotlib.ticker.FormatStrFormatter(\"%.1f\")\n cb1 = colorbar(c; ax, ticks, format)\n cb1.ax.set_ylabel(\"[amu/cc]\"; fontsize)\n cb1.outline.set_linewidth(1.0)\n\n fakeline = [0.0, 1.0]\n ls = [ax.plot(fakeline, fakeline, color=\"w\") for _ in 1:size(seeds,2)]\n\n return fig, ax, c, ls, range1, range2\nend\n\n@everywhere function update_plot!(ax, c, ls, range1, range2, dim_, seeds, grid1, grid2,\n outdir, file)\n isfile(outdir*file[end-8:end-5]*\".png\") && return\n\n println(\"file = $file\")\n meta = load(file)\n\n data = Vlasiator.prep2d(meta, \"proton/vg_rho\", :mag)'\n c.set_array(data[range2,range1] ./ 1f6)\n\n str_title = @sprintf \"Density pulse run, t= %4.1fs\" meta.time\n ax.set_title(str_title; fontsize=\"x-large\")\n\n b = meta[\"vg_b_vol\"]\n b1 = reshape(b[dim_[1],:], meta.ncells[dim_[1]], meta.ncells[dim_[2]])\n b2 = reshape(b[dim_[2],:], meta.ncells[dim_[1]], meta.ncells[dim_[2]])\n # Find existing arrow annotations\n annotations = [child for child in ax.get_children() if\n pybuiltin(:isinstance)(child, matplotlib.text.Annotation)]\n # Remove existing arrows\n for a in annotations\n a.remove()\n end\n # Add new arrows along field lines\n for i in axes(seeds,2)\n startx, starty = seeds[:,i]\n x1, y1 = trace(b1, b2, startx, starty, grid1, grid2;\n ds=0.5, maxstep=4000, gridtype=\"ndgrid\")\n x1 ./= RE\n y1 ./= RE\n if length(x1) < 5; continue; end\n ls[i][1].set_xdata(x1)\n ls[i][1].set_ydata(y1)\n add_arrow(ls[i][1])\n end\n\n savefig(outdir*file[end-8:end-5]*\".png\", bbox_inches=\"tight\")\nend\n\nfunction make_jobs(files)\n for f in files\n put!(jobs, f)\n end\nend\n\n@everywhere function do_work(jobs, status,\n outdir, pArgs, norm, ticks, grid1, grid2, dim_, seeds, extent)\n\n fig, ax, c, ls, range1, range2 = init_figure(pArgs, norm, ticks, seeds, extent)\n\n while true\n file = take!(jobs)\n update_plot!(ax, c, ls, range1, range2, dim_, seeds, grid1, grid2, outdir, file)\n put!(status, true)\n end\n close(fig)\nend\n\n################################################################################\nfiles = filter(contains(r\"^bulk.*\\.vlsv$\"), readdir())\n\nnfile = length(files)\n# Set output directory\nconst outdir = \"out/\"\n\nconst jobs = RemoteChannel(()->Channel{String}(nfile))\nconst status = RemoteChannel(()->Channel{Bool}(nworkers()))\n\nconst axisunit = EARTH # contour plot axes unit\nconst extent = [0., 20., -20., 20.] # [RE], default: [-Inf32, Inf32, -Inf32, Inf32]\n\n# Upper/lower limits for each variable\nconst ρmin, ρmax = 0.0, 11.0 # [amu/cc]\n\nmeta = load(files[1])\n# Construct pieces for plotting\npArgs = Vlasiator.set_args(meta, \"proton/vg_rho\", axisunit; normal=:none)\nnorm, ticks = set_colorbar(Linear, ρmin, ρmax)\n\n# Mark spatial dimensions\nconst dim_ = pArgs.stry[1] == 'Z' ? (1,3) : (1,2)\n\n(;coordmin, coordmax, ncells) = meta\n\n# Generate regular Cartesian range\ngrid1 = range(coordmin[dim_[1]], coordmax[dim_[1]], length=ncells[dim_[1]])\ngrid2 = range(coordmin[dim_[2]], coordmax[dim_[2]], length=ncells[dim_[2]])\n# Generate seeds for in-plane field line tracing\nconst nseeds = 10\nseeds = generate_seeds(coordmin, coordmax, dim_, nseeds)\n\n\nprintln(\"Total number of files: $nfile\")\nprintln(\"Running with $(nworkers()) workers...\")\n\n@async make_jobs(files) # Feed the jobs channel with all files to process.\n\n@sync for p in workers()\n @async remote_do(do_work, p, jobs, status,\n outdir, pArgs, norm, ticks, grid1, grid2, dim_, seeds, extent)\nend\n\nlet n = nfile\n t = @elapsed while n > 0 # wait for all jobs to complete\n take!(status)\n n -= 1\n end\n println(\"Finished in $(round(t, digits=2))s.\")\nend","category":"page"},{"location":"examples/visualization/demo_B_fieldline_mp_pyplot/","page":"Field lines with customized seeds via multi-processing","title":"Field lines with customized seeds via multi-processing","text":"","category":"page"},{"location":"examples/visualization/demo_B_fieldline_mp_pyplot/","page":"Field lines with customized seeds via multi-processing","title":"Field lines with customized seeds via multi-processing","text":"This page was generated using DemoCards.jl.","category":"page"},{"location":"benchmark/#Benchmarks","page":"Benchmarks","title":"Benchmarks","text":"","category":"section"},{"location":"benchmark/","page":"Benchmarks","title":"Benchmarks","text":"The test file information are listed below:","category":"page"},{"location":"benchmark/","page":"Benchmarks","title":"Benchmarks","text":"Index Filename Number of Cells Dimension AMR Public\n1 1d_single.vlsv 20 1 No Yes\n2 bulk.2d.vlsv 6,300 1 No Yes\n3 2d_double.vlsv 51,200 2 No Yes\n4 2d_AFC.vlsv 4,612,500 2 No Yes\n5 3d_EGI.vlsv 3,966,580 3 Yes No","category":"page"},{"location":"benchmark/","page":"Benchmarks","title":"Benchmarks","text":"Access to the public data can be found from vlsv_data.","category":"page"},{"location":"benchmark/","page":"Benchmarks","title":"Benchmarks","text":"note: Note\nThe numbers shown here are comparisons between Analysator v0.9 and Vlasiator.jl v0.9.32 running Python 3.6.9/3.9.7 and Julia 1.8.3 with the scripts perf.jl and perf.py. The timings are collected from a i5-10210U @ 1.6GHz CPU with 16 GB RAM if not specified.","category":"page"},{"location":"benchmark/","page":"Benchmarks","title":"Benchmarks","text":"Loading meta data[1]","category":"page"},{"location":"benchmark/","page":"Benchmarks","title":"Benchmarks","text":"File Index Julia [ms] Python [ms] Ratio\n1 0.18 1.19 6.6\n2 0.51 1.66 3.1\n3 2.33 3.11 1.3\n4 506 277 0.5\n5 549 283 0.5","category":"page"},{"location":"benchmark/","page":"Benchmarks","title":"Benchmarks","text":"[1]: See the issue about sorting. The performance of EzXML is also not ideal: we may need to find a better XML parser in Julia.","category":"page"},{"location":"benchmark/","page":"Benchmarks","title":"Benchmarks","text":"Reading DCCRG grid variables","category":"page"},{"location":"benchmark/","page":"Benchmarks","title":"Benchmarks","text":"File Index Julia [ms] Python [ms] Ratio\n1 0.004 0.07 17\n2 0.02[2] 0.08 4\n3 0.17[2] 0.21 1.2\n4 20[2] 23 1.1\n5 11[2] 11 1.0","category":"page"},{"location":"benchmark/","page":"Benchmarks","title":"Benchmarks","text":"[2]: Vlasiator.jl can be faster if there is no conversion from Float64 to Float32. See Precision.","category":"page"},{"location":"benchmark/","page":"Benchmarks","title":"Benchmarks","text":"Reading field solver grid variables[3]","category":"page"},{"location":"benchmark/","page":"Benchmarks","title":"Benchmarks","text":"File Index Size Julia [s] Julia, mmap [s] Python [s] Ratio\n5 6.2 GiB Float32 18 8 56 7","category":"page"},{"location":"benchmark/","page":"Benchmarks","title":"Benchmarks","text":"[3]: The field solver grid is a regular Cartesian grid at the finest refinement level introduced after Vlasiator 5. Therefore fsgrid variables are quite large for 3D AMR runs: with limited memory (e.g. 16 GB RAM) you may encounter out-of-memory issues when reading fg_b more than once. In Vlasiator.jl, we provide the option usemmap=true for reading large arrays –- see Memory for more.","category":"page"},{"location":"benchmark/","page":"Benchmarks","title":"Benchmarks","text":"Plotting 2D density contours on a uniform mesh (no GUI)","category":"page"},{"location":"benchmark/","page":"Benchmarks","title":"Benchmarks","text":"File Index Julia [s] Python [s] Ratio\n4 0.5 5.4 11","category":"page"},{"location":"benchmark/","page":"Benchmarks","title":"Benchmarks","text":"Plotting 2D density slices from a 3D AMR mesh (no GUI)","category":"page"},{"location":"benchmark/","page":"Benchmarks","title":"Benchmarks","text":"File Index Julia [s][4] Python [s] Ratio\n5 0.5 3.1 6.2","category":"page"},{"location":"benchmark/","page":"Benchmarks","title":"Benchmarks","text":"[4]: The first time execution will be slower due to JIT compilation (which is excluded in the timing here). This is known as \"Time-To-First-X\" in the Julia community.","category":"page"},{"location":"benchmark/","page":"Benchmarks","title":"Benchmarks","text":"Static virtual satellite tracking from 3D AMR data (26G per frame, 32 MB Cell IDs) on a cluster[5]","category":"page"},{"location":"benchmark/","page":"Benchmarks","title":"Benchmarks","text":"Frames Julia, 1 thread [s] Julia, 2 threads [s] Python [s]\n845 45 34 1220","category":"page"},{"location":"benchmark/","page":"Benchmarks","title":"Benchmarks","text":"[5]: University of Helsinki cluster Vorna with Intel Xeon E5-2697 @ 2.70GHz.","category":"page"},{"location":"examples/visualization/demo_lineextracting_pyplot_basic2/","page":"Plotting variable along a line","title":"Plotting variable along a line","text":"EditURL = \"/home/runner/work/Vlasiator.jl/Vlasiator.jl/docs/examples/visualization/demo_lineextracting_pyplot_basic2.md\"","category":"page"},{"location":"examples/visualization/demo_lineextracting_pyplot_basic2/#demo_plot_line","page":"Plotting variable along a line","title":"Plotting variable along a line","text":"","category":"section"},{"location":"examples/visualization/demo_lineextracting_pyplot_basic2/","page":"Plotting variable along a line","title":"Plotting variable along a line","text":"(Image: Author) (Image: Update time)","category":"page"},{"location":"examples/visualization/demo_lineextracting_pyplot_basic2/","page":"Plotting variable along a line","title":"Plotting variable along a line","text":"This demo shows how to plot pressure along a line across multiple frames.","category":"page"},{"location":"examples/visualization/demo_lineextracting_pyplot_basic2/","page":"Plotting variable along a line","title":"Plotting variable along a line","text":"using Vlasiator, PyPlot, Printf\nusing Vlasiator: RE # Earth radius [m]\n\nfunction main()\n files = filter(contains(r\"^bulk.*\\.vlsv$\"), readdir())\n nfile = length(files)\n\n x1, x2 = 8.0, 29.0\n point1 = [x1, 0, 0] .* RE\n point2 = [x2, 0, 0] .* RE\n\n cellids, distances, coords =\n load(files[1]) do meta\n getcellinline(meta, point1, point2)\n end\n\n fig, ax = plt.subplots(figsize=(8, 4.8))\n\n for (i, file) in enumerate(files)\n println(\"i = $i/$nfile, file = $file\")\n meta = load(file)\n\n p_extract = readvariable(meta, \"vg_pressure\", cellids) .* 1e9 |> vec # [nPa]\n rho_extract = readvariable(meta, \"proton/vg_rho\", cellids) |> vec\n v_extract = readvariable(meta, \"proton/vg_v\", cellids)\n vmag2_extract = sum(x -> x*x, v_extract, dims=1) |> vec\n pram_extract = rho_extract .* Vlasiator.mᵢ .* vmag2_extract .* 1e9 # [nPa]\n loc = range(x1, x2, length=length(rho_extract))\n\n ax.plot(loc, pram_extract, label=\"ram\")\n ax.plot(loc, p_extract, label=\"thermal\")\n\n ax.set_xlim(x1, x2)\n ax.set_ylim(0.0, 1.8)\n ax.xaxis.set_minor_locator(matplotlib.ticker.AutoMinorLocator())\n grid(true)\n\n xlabel(\"x [Re]\", fontsize=14)\n ylabel(\"Pressure [nPa]\", fontsize=14)\n str_title = @sprintf \"t= %4.1fs\" meta.time\n title(str_title, fontsize=14)\n legend(loc=\"upper left\", fontsize=14)\n savefig(\"out/\"*meta.name[end-8:end-5]*\".png\", bbox_inches=\"tight\")\n ax.cla()\n end\n\n close(fig)\n println(\"plot finished!\")\nend\n\nmain()","category":"page"},{"location":"examples/visualization/demo_lineextracting_pyplot_basic2/","page":"Plotting variable along a line","title":"Plotting variable along a line","text":"","category":"page"},{"location":"examples/visualization/demo_lineextracting_pyplot_basic2/","page":"Plotting variable along a line","title":"Plotting variable along a line","text":"This page was generated using DemoCards.jl.","category":"page"},{"location":"examples/visualization/demo_vector_pyplot/","page":"Vector components","title":"Vector components","text":"EditURL = \"/home/runner/work/Vlasiator.jl/Vlasiator.jl/docs/examples/visualization/demo_vector_pyplot.md\"","category":"page"},{"location":"examples/visualization/demo_vector_pyplot/#demo_vector_comps","page":"Vector components","title":"Vector components","text":"","category":"section"},{"location":"examples/visualization/demo_vector_pyplot/","page":"Vector components","title":"Vector components","text":"(Image: Author) (Image: Update time)","category":"page"},{"location":"examples/visualization/demo_vector_pyplot/","page":"Vector components","title":"Vector components","text":"This demo shows how to plot the components of a vector from one snapshot.","category":"page"},{"location":"examples/visualization/demo_vector_pyplot/","page":"Vector components","title":"Vector components","text":"using Vlasiator, VlasiatorPyPlot, LaTeXStrings, Printf\n\nfunction main()\n file = \"/wrk/group/spacephysics/vlasiator/2D/ABA/bulk/bulk.0001000.vlsv\"\n\n axisunit = EARTH\n colorscale = Linear\n cmap = matplotlib.cm.RdBu\n\n var = \"B_vol\"\n\n #####\n meta = load(file)\n\n pArgs = Vlasiator.set_args(meta, var, axisunit; normal=:none)\n\n x, y = Vlasiator.get_axis(pArgs)\n\n B = meta[\"B_vol\"] # [T]\n bx = @views B[1,:].*1e9\n bx = reshape(bx, meta.ncells[1], meta.ncells[2])\n by = @views B[2,:].*1e9\n by = reshape(by, meta.ncells[1], meta.ncells[2])\n bz = @views B[3,:].*1e9\n bz = reshape(bz, meta.ncells[1], meta.ncells[2])\n\n V = (bx, by, bz)\n V_str = (\"Bx\", \"By\", \"Bz\")\n\n # Symmetric range for diverging colormap\n vmin = minimum(minimum.(V))\n vmax = -vmin\n\n cnorm1, cticks1 = set_colorbar(colorscale, vmin, vmax)\n\n fig, axs = subplots(1,3,\n figsize=(10, 4), sharex=true, sharey=true, constrained_layout=true)\n\n c1 = axs[1].pcolormesh(x, y, V[1]'; norm=cnorm1, cmap)\n\n for i in eachindex(axs)[2:end]\n axs[i].pcolormesh(x, y, V[i]'; norm=cnorm1, cmap)\n end\n\n for (i, ax) in enumerate(axs)\n ax.set_aspect(\"equal\")\n ax.xaxis.set_minor_locator(matplotlib.ticker.AutoMinorLocator())\n ax.yaxis.set_minor_locator(matplotlib.ticker.AutoMinorLocator())\n ax.set_title(V_str[i])\n ax.set_xlabel(L\"x [$R_E$]\")\n end\n\n axs[1].set_ylabel(L\"y [$R_E$]\")\n\n # One colorbar for all subplots\n cb1 = colorbar(c1; ax=axs, ticks=cticks1, fraction=0.046, pad=0.04)\n cb1.ax.set_ylabel(\"[nT]\")\n cb1.outline.set_linewidth(1.0)\n\n str_title = @sprintf \"B at t = %4.1fs\" meta.time\n\n fig.suptitle(str_title, fontsize=\"xx-large\")\n\n savefig(\"Bvector.png\", bbox_inches=\"tight\")\nend\n\nmain()","category":"page"},{"location":"examples/visualization/demo_vector_pyplot/","page":"Vector components","title":"Vector components","text":"","category":"page"},{"location":"examples/visualization/demo_vector_pyplot/","page":"Vector components","title":"Vector components","text":"This page was generated using DemoCards.jl.","category":"page"}] +} diff --git a/v0.11.5/siteinfo.js b/v0.11.5/siteinfo.js new file mode 100644 index 00000000..0bba6808 --- /dev/null +++ b/v0.11.5/siteinfo.js @@ -0,0 +1 @@ +var DOCUMENTER_CURRENT_VERSION = "v0.11.5"; diff --git a/versions.js b/versions.js index 03f72a16..fd4ddb0e 100644 --- a/versions.js +++ b/versions.js @@ -13,5 +13,5 @@ var DOC_VERSIONS = [ "v0.1", "dev", ]; -var DOCUMENTER_NEWEST = "v0.11.4"; +var DOCUMENTER_NEWEST = "v0.11.5"; var DOCUMENTER_STABLE = "stable";