From 36c2a41e6cfa43b47b165d1ed6da3f4242d951d0 Mon Sep 17 00:00:00 2001 From: <> Date: Fri, 20 Oct 2023 19:02:33 +0000 Subject: [PATCH] Deployed 1d9cd37 with MkDocs version: 1.5.3 --- 404.html | 24 +- about/index.html | 24 +- assets/javascripts/lunr/min/lunr.el.min.js | 1 + assets/stylesheets/main.35e1ed30.min.css | 1 + assets/stylesheets/main.35e1ed30.min.css.map | 1 + assets/stylesheets/main.6a10b989.min.css | 1 - assets/stylesheets/main.6a10b989.min.css.map | 1 - cloud_glossary/index.html | 24 +- contact/index.html | 24 +- exercises/azure_portal_walkthrough/index.html | 24 +- exercises/azure_vm_walkthrough/index.html | 24 +- .../azure_windows_vm_walkthrough/index.html | 24 +- exercises/exercise_budget_alert/index.html | 24 +- .../index.html | 24 +- .../index.html | 26 +- .../exercise_windows_filestorage/index.html | 1313 +++++++++++++++++ exercises/storage_pricing_exercise/index.html | 26 +- index.html | 24 +- projects/index.html | 24 +- references/index.html | 24 +- search/search_index.json | 2 +- sessions/01_introduction/index.html | 24 +- sessions/02_how_to_cloud/index.html | 24 +- sessions/03_cloud_storage/index.html | 39 +- sitemap.xml.gz | Bin 127 -> 127 bytes topics/azure_cloud_cost_basics/index.html | 24 +- topics/azure_organization/index.html | 24 +- topics/azure_tags/index.html | 24 +- topics/index.html | 24 +- .../index.html | 24 +- topics/intro_to_cloud_interfaces/index.html | 24 +- .../index.html | 24 +- .../index.html | 24 +- 33 files changed, 1875 insertions(+), 64 deletions(-) create mode 100644 assets/javascripts/lunr/min/lunr.el.min.js create mode 100644 assets/stylesheets/main.35e1ed30.min.css create mode 100644 assets/stylesheets/main.35e1ed30.min.css.map delete mode 100644 assets/stylesheets/main.6a10b989.min.css delete mode 100644 assets/stylesheets/main.6a10b989.min.css.map create mode 100644 exercises/exercise_windows_filestorage/index.html diff --git a/404.html b/404.html index 372c256..8af23bd 100644 --- a/404.html +++ b/404.html @@ -12,7 +12,7 @@ - + @@ -20,7 +20,7 @@ - + @@ -439,6 +439,26 @@ +
  • + + + + + Exercise: Using File Storage with Windows VM + + + + +
  • + + + + + + + + +
  • diff --git a/about/index.html b/about/index.html index 71a6930..ada14b6 100644 --- a/about/index.html +++ b/about/index.html @@ -16,7 +16,7 @@ - + @@ -24,7 +24,7 @@ - + @@ -516,6 +516,26 @@ +
  • + + + + + Exercise: Using File Storage with Windows VM + + + + +
  • + + + + + + + + +
  • diff --git a/assets/javascripts/lunr/min/lunr.el.min.js b/assets/javascripts/lunr/min/lunr.el.min.js new file mode 100644 index 0000000..ace017b --- /dev/null +++ b/assets/javascripts/lunr/min/lunr.el.min.js @@ -0,0 +1 @@ +!function(e,t){"function"==typeof define&&define.amd?define(t):"object"==typeof exports?module.exports=t():t()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.el=function(){this.pipeline.reset(),void 0===this.searchPipeline&&this.pipeline.add(e.el.trimmer,e.el.normilizer),this.pipeline.add(e.el.stopWordFilter,e.el.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.el.stemmer))},e.el.wordCharacters="A-Za-zΑαΒβΓγΔδΕεΖζΗηΘθΙιΚκΛλΜμΝνΞξΟοΠπΡρΣσςΤτΥυΦφΧχΨψΩωΆάΈέΉήΊίΌόΎύΏώΪΐΫΰΐΰ",e.el.trimmer=e.trimmerSupport.generateTrimmer(e.el.wordCharacters),e.Pipeline.registerFunction(e.el.trimmer,"trimmer-el"),e.el.stemmer=function(){function e(e){return s.test(e)}function t(e){return/[ΑΕΗΙΟΥΩ]$/.test(e)}function r(e){return/[ΑΕΗΙΟΩ]$/.test(e)}function n(n){var s=n;if(n.length<3)return s;if(!e(n))return s;if(i.indexOf(n)>=0)return s;var u=new RegExp("(.*)("+Object.keys(l).join("|")+")$"),o=u.exec(s);return null!==o&&(s=o[1]+l[o[2]]),null!==(o=/^(.+?)(ΑΔΕΣ|ΑΔΩΝ)$/.exec(s))&&(s=o[1],/(ΟΚ|ΜΑΜ|ΜΑΝ|ΜΠΑΜΠ|ΠΑΤΕΡ|ΓΙΑΓΙ|ΝΤΑΝΤ|ΚΥΡ|ΘΕΙ|ΠΕΘΕΡ|ΜΟΥΣΑΜ|ΚΑΠΛΑΜ|ΠΑΡ|ΨΑΡ|ΤΖΟΥΡ|ΤΑΜΠΟΥΡ|ΓΑΛΑΤ|ΦΑΦΛΑΤ)$/.test(o[1])||(s+="ΑΔ")),null!==(o=/^(.+?)(ΕΔΕΣ|ΕΔΩΝ)$/.exec(s))&&(s=o[1],/(ΟΠ|ΙΠ|ΕΜΠ|ΥΠ|ΓΗΠ|ΔΑΠ|ΚΡΑΣΠ|ΜΙΛ)$/.test(o[1])&&(s+="ΕΔ")),null!==(o=/^(.+?)(ΟΥΔΕΣ|ΟΥΔΩΝ)$/.exec(s))&&(s=o[1],/(ΑΡΚ|ΚΑΛΙΑΚ|ΠΕΤΑΛ|ΛΙΧ|ΠΛΕΞ|ΣΚ|Σ|ΦΛ|ΦΡ|ΒΕΛ|ΛΟΥΛ|ΧΝ|ΣΠ|ΤΡΑΓ|ΦΕ)$/.test(o[1])&&(s+="ΟΥΔ")),null!==(o=/^(.+?)(ΕΩΣ|ΕΩΝ|ΕΑΣ|ΕΑ)$/.exec(s))&&(s=o[1],/^(Θ|Δ|ΕΛ|ΓΑΛ|Ν|Π|ΙΔ|ΠΑΡ|ΣΤΕΡ|ΟΡΦ|ΑΝΔΡ|ΑΝΤΡ)$/.test(o[1])&&(s+="Ε")),null!==(o=/^(.+?)(ΕΙΟ|ΕΙΟΣ|ΕΙΟΙ|ΕΙΑ|ΕΙΑΣ|ΕΙΕΣ|ΕΙΟΥ|ΕΙΟΥΣ|ΕΙΩΝ)$/.exec(s))&&o[1].length>4&&(s=o[1]),null!==(o=/^(.+?)(ΙΟΥΣ|ΙΑΣ|ΙΕΣ|ΙΟΣ|ΙΟΥ|ΙΟΙ|ΙΩΝ|ΙΟΝ|ΙΑ|ΙΟ)$/.exec(s))&&(s=o[1],(t(s)||s.length<2||/^(ΑΓ|ΑΓΓΕΛ|ΑΓΡ|ΑΕΡ|ΑΘΛ|ΑΚΟΥΣ|ΑΞ|ΑΣ|Β|ΒΙΒΛ|ΒΥΤ|Γ|ΓΙΑΓ|ΓΩΝ|Δ|ΔΑΝ|ΔΗΛ|ΔΗΜ|ΔΟΚΙΜ|ΕΛ|ΖΑΧΑΡ|ΗΛ|ΗΠ|ΙΔ|ΙΣΚ|ΙΣΤ|ΙΟΝ|ΙΩΝ|ΚΙΜΩΛ|ΚΟΛΟΝ|ΚΟΡ|ΚΤΗΡ|ΚΥΡ|ΛΑΓ|ΛΟΓ|ΜΑΓ|ΜΠΑΝ|ΜΠΡ|ΝΑΥΤ|ΝΟΤ|ΟΠΑΛ|ΟΞ|ΟΡ|ΟΣ|ΠΑΝΑΓ|ΠΑΤΡ|ΠΗΛ|ΠΗΝ|ΠΛΑΙΣ|ΠΟΝΤ|ΡΑΔ|ΡΟΔ|ΣΚ|ΣΚΟΡΠ|ΣΟΥΝ|ΣΠΑΝ|ΣΤΑΔ|ΣΥΡ|ΤΗΛ|ΤΙΜ|ΤΟΚ|ΤΟΠ|ΤΡΟΧ|ΦΙΛ|ΦΩΤ|Χ|ΧΙΛ|ΧΡΩΜ|ΧΩΡ)$/.test(o[1]))&&(s+="Ι"),/^(ΠΑΛ)$/.test(o[1])&&(s+="ΑΙ")),null!==(o=/^(.+?)(ΙΚΟΣ|ΙΚΟΝ|ΙΚΕΙΣ|ΙΚΟΙ|ΙΚΕΣ|ΙΚΟΥΣ|ΙΚΗ|ΙΚΗΣ|ΙΚΟ|ΙΚΑ|ΙΚΟΥ|ΙΚΩΝ|ΙΚΩΣ)$/.exec(s))&&(s=o[1],(t(s)||/^(ΑΔ|ΑΛ|ΑΜΑΝ|ΑΜΕΡ|ΑΜΜΟΧΑΛ|ΑΝΗΘ|ΑΝΤΙΔ|ΑΠΛ|ΑΤΤ|ΑΦΡ|ΒΑΣ|ΒΡΩΜ|ΓΕΝ|ΓΕΡ|Δ|ΔΙΚΑΝ|ΔΥΤ|ΕΙΔ|ΕΝΔ|ΕΞΩΔ|ΗΘ|ΘΕΤ|ΚΑΛΛΙΝ|ΚΑΛΠ|ΚΑΤΑΔ|ΚΟΥΖΙΝ|ΚΡ|ΚΩΔ|ΛΟΓ|Μ|ΜΕΡ|ΜΟΝΑΔ|ΜΟΥΛ|ΜΟΥΣ|ΜΠΑΓΙΑΤ|ΜΠΑΝ|ΜΠΟΛ|ΜΠΟΣ|ΜΥΣΤ|Ν|ΝΙΤ|ΞΙΚ|ΟΠΤ|ΠΑΝ|ΠΕΤΣ|ΠΙΚΑΝΤ|ΠΙΤΣ|ΠΛΑΣΤ|ΠΛΙΑΤΣ|ΠΟΝΤ|ΠΟΣΤΕΛΝ|ΠΡΩΤΟΔ|ΣΕΡΤ|ΣΗΜΑΝΤ|ΣΤΑΤ|ΣΥΝΑΔ|ΣΥΝΟΜΗΛ|ΤΕΛ|ΤΕΧΝ|ΤΡΟΠ|ΤΣΑΜ|ΥΠΟΔ|Φ|ΦΙΛΟΝ|ΦΥΛΟΔ|ΦΥΣ|ΧΑΣ)$/.test(o[1])||/(ΦΟΙΝ)$/.test(o[1]))&&(s+="ΙΚ")),"ΑΓΑΜΕ"===s&&(s="ΑΓΑΜ"),null!==(o=/^(.+?)(ΑΓΑΜΕ|ΗΣΑΜΕ|ΟΥΣΑΜΕ|ΗΚΑΜΕ|ΗΘΗΚΑΜΕ)$/.exec(s))&&(s=o[1]),null!==(o=/^(.+?)(ΑΜΕ)$/.exec(s))&&(s=o[1],/^(ΑΝΑΠ|ΑΠΟΘ|ΑΠΟΚ|ΑΠΟΣΤ|ΒΟΥΒ|ΞΕΘ|ΟΥΛ|ΠΕΘ|ΠΙΚΡ|ΠΟΤ|ΣΙΧ|Χ)$/.test(o[1])&&(s+="ΑΜ")),null!==(o=/^(.+?)(ΑΓΑΝΕ|ΗΣΑΝΕ|ΟΥΣΑΝΕ|ΙΟΝΤΑΝΕ|ΙΟΤΑΝΕ|ΙΟΥΝΤΑΝΕ|ΟΝΤΑΝΕ|ΟΤΑΝΕ|ΟΥΝΤΑΝΕ|ΗΚΑΝΕ|ΗΘΗΚΑΝΕ)$/.exec(s))&&(s=o[1],/^(ΤΡ|ΤΣ)$/.test(o[1])&&(s+="ΑΓΑΝ")),null!==(o=/^(.+?)(ΑΝΕ)$/.exec(s))&&(s=o[1],(r(s)||/^(ΒΕΤΕΡ|ΒΟΥΛΚ|ΒΡΑΧΜ|Γ|ΔΡΑΔΟΥΜ|Θ|ΚΑΛΠΟΥΖ|ΚΑΣΤΕΛ|ΚΟΡΜΟΡ|ΛΑΟΠΛ|ΜΩΑΜΕΘ|Μ|ΜΟΥΣΟΥΛΜΑΝ|ΟΥΛ|Π|ΠΕΛΕΚ|ΠΛ|ΠΟΛΙΣ|ΠΟΡΤΟΛ|ΣΑΡΑΚΑΤΣ|ΣΟΥΛΤ|ΤΣΑΡΛΑΤ|ΟΡΦ|ΤΣΙΓΓ|ΤΣΟΠ|ΦΩΤΟΣΤΕΦ|Χ|ΨΥΧΟΠΛ|ΑΓ|ΟΡΦ|ΓΑΛ|ΓΕΡ|ΔΕΚ|ΔΙΠΛ|ΑΜΕΡΙΚΑΝ|ΟΥΡ|ΠΙΘ|ΠΟΥΡΙΤ|Σ|ΖΩΝΤ|ΙΚ|ΚΑΣΤ|ΚΟΠ|ΛΙΧ|ΛΟΥΘΗΡ|ΜΑΙΝΤ|ΜΕΛ|ΣΙΓ|ΣΠ|ΣΤΕΓ|ΤΡΑΓ|ΤΣΑΓ|Φ|ΕΡ|ΑΔΑΠ|ΑΘΙΓΓ|ΑΜΗΧ|ΑΝΙΚ|ΑΝΟΡΓ|ΑΠΗΓ|ΑΠΙΘ|ΑΤΣΙΓΓ|ΒΑΣ|ΒΑΣΚ|ΒΑΘΥΓΑΛ|ΒΙΟΜΗΧ|ΒΡΑΧΥΚ|ΔΙΑΤ|ΔΙΑΦ|ΕΝΟΡΓ|ΘΥΣ|ΚΑΠΝΟΒΙΟΜΗΧ|ΚΑΤΑΓΑΛ|ΚΛΙΒ|ΚΟΙΛΑΡΦ|ΛΙΒ|ΜΕΓΛΟΒΙΟΜΗΧ|ΜΙΚΡΟΒΙΟΜΗΧ|ΝΤΑΒ|ΞΗΡΟΚΛΙΒ|ΟΛΙΓΟΔΑΜ|ΟΛΟΓΑΛ|ΠΕΝΤΑΡΦ|ΠΕΡΗΦ|ΠΕΡΙΤΡ|ΠΛΑΤ|ΠΟΛΥΔΑΠ|ΠΟΛΥΜΗΧ|ΣΤΕΦ|ΤΑΒ|ΤΕΤ|ΥΠΕΡΗΦ|ΥΠΟΚΟΠ|ΧΑΜΗΛΟΔΑΠ|ΨΗΛΟΤΑΒ)$/.test(o[1]))&&(s+="ΑΝ")),null!==(o=/^(.+?)(ΗΣΕΤΕ)$/.exec(s))&&(s=o[1]),null!==(o=/^(.+?)(ΕΤΕ)$/.exec(s))&&(s=o[1],(r(s)||/(ΟΔ|ΑΙΡ|ΦΟΡ|ΤΑΘ|ΔΙΑΘ|ΣΧ|ΕΝΔ|ΕΥΡ|ΤΙΘ|ΥΠΕΡΘ|ΡΑΘ|ΕΝΘ|ΡΟΘ|ΣΘ|ΠΥΡ|ΑΙΝ|ΣΥΝΔ|ΣΥΝ|ΣΥΝΘ|ΧΩΡ|ΠΟΝ|ΒΡ|ΚΑΘ|ΕΥΘ|ΕΚΘ|ΝΕΤ|ΡΟΝ|ΑΡΚ|ΒΑΡ|ΒΟΛ|ΩΦΕΛ)$/.test(o[1])||/^(ΑΒΑΡ|ΒΕΝ|ΕΝΑΡ|ΑΒΡ|ΑΔ|ΑΘ|ΑΝ|ΑΠΛ|ΒΑΡΟΝ|ΝΤΡ|ΣΚ|ΚΟΠ|ΜΠΟΡ|ΝΙΦ|ΠΑΓ|ΠΑΡΑΚΑΛ|ΣΕΡΠ|ΣΚΕΛ|ΣΥΡΦ|ΤΟΚ|Υ|Δ|ΕΜ|ΘΑΡΡ|Θ)$/.test(o[1]))&&(s+="ΕΤ")),null!==(o=/^(.+?)(ΟΝΤΑΣ|ΩΝΤΑΣ)$/.exec(s))&&(s=o[1],/^ΑΡΧ$/.test(o[1])&&(s+="ΟΝΤ"),/ΚΡΕ$/.test(o[1])&&(s+="ΩΝΤ")),null!==(o=/^(.+?)(ΟΜΑΣΤΕ|ΙΟΜΑΣΤΕ)$/.exec(s))&&(s=o[1],/^ΟΝ$/.test(o[1])&&(s+="ΟΜΑΣΤ")),null!==(o=/^(.+?)(ΙΕΣΤΕ)$/.exec(s))&&(s=o[1],/^(Π|ΑΠ|ΣΥΜΠ|ΑΣΥΜΠ|ΑΚΑΤΑΠ|ΑΜΕΤΑΜΦ)$/.test(o[1])&&(s+="ΙΕΣΤ")),null!==(o=/^(.+?)(ΕΣΤΕ)$/.exec(s))&&(s=o[1],/^(ΑΛ|ΑΡ|ΕΚΤΕΛ|Ζ|Μ|Ξ|ΠΑΡΑΚΑΛ|ΠΡΟ|ΝΙΣ)$/.test(o[1])&&(s+="ΕΣΤ")),null!==(o=/^(.+?)(ΗΘΗΚΑ|ΗΘΗΚΕΣ|ΗΘΗΚΕ)$/.exec(s))&&(s=o[1]),null!==(o=/^(.+?)(ΗΚΑ|ΗΚΕΣ|ΗΚΕ)$/.exec(s))&&(s=o[1],(/(ΣΚΩΛ|ΣΚΟΥΛ|ΝΑΡΘ|ΣΦ|ΟΘ|ΠΙΘ)$/.test(o[1])||/^(ΔΙΑΘ|Θ|ΠΑΡΑΚΑΤΑΘ|ΠΡΟΣΘ|ΣΥΝΘ)$/.test(o[1]))&&(s+="ΗΚ")),null!==(o=/^(.+?)(ΟΥΣΑ|ΟΥΣΕΣ|ΟΥΣΕ)$/.exec(s))&&(s=o[1],(t(s)||/^(ΦΑΡΜΑΚ|ΧΑΔ|ΑΓΚ|ΑΝΑΡΡ|ΒΡΟΜ|ΕΚΛΙΠ|ΛΑΜΠΙΔ|ΛΕΧ|Μ|ΠΑΤ|Ρ|Λ|ΜΕΔ|ΜΕΣΑΖ|ΥΠΟΤΕΙΝ|ΑΜ|ΑΙΘ|ΑΝΗΚ|ΔΕΣΠΟΖ|ΕΝΔΙΑΦΕΡ)$/.test(o[1])||/(ΠΟΔΑΡ|ΒΛΕΠ|ΠΑΝΤΑΧ|ΦΡΥΔ|ΜΑΝΤΙΛ|ΜΑΛΛ|ΚΥΜΑΤ|ΛΑΧ|ΛΗΓ|ΦΑΓ|ΟΜ|ΠΡΩΤ)$/.test(o[1]))&&(s+="ΟΥΣ")),null!==(o=/^(.+?)(ΑΓΑ|ΑΓΕΣ|ΑΓΕ)$/.exec(s))&&(s=o[1],(/^(ΑΒΑΣΤ|ΠΟΛΥΦ|ΑΔΗΦ|ΠΑΜΦ|Ρ|ΑΣΠ|ΑΦ|ΑΜΑΛ|ΑΜΑΛΛΙ|ΑΝΥΣΤ|ΑΠΕΡ|ΑΣΠΑΡ|ΑΧΑΡ|ΔΕΡΒΕΝ|ΔΡΟΣΟΠ|ΞΕΦ|ΝΕΟΠ|ΝΟΜΟΤ|ΟΛΟΠ|ΟΜΟΤ|ΠΡΟΣΤ|ΠΡΟΣΩΠΟΠ|ΣΥΜΠ|ΣΥΝΤ|Τ|ΥΠΟΤ|ΧΑΡ|ΑΕΙΠ|ΑΙΜΟΣΤ|ΑΝΥΠ|ΑΠΟΤ|ΑΡΤΙΠ|ΔΙΑΤ|ΕΝ|ΕΠΙΤ|ΚΡΟΚΑΛΟΠ|ΣΙΔΗΡΟΠ|Λ|ΝΑΥ|ΟΥΛΑΜ|ΟΥΡ|Π|ΤΡ|Μ)$/.test(o[1])||/(ΟΦ|ΠΕΛ|ΧΟΡΤ|ΛΛ|ΣΦ|ΡΠ|ΦΡ|ΠΡ|ΛΟΧ|ΣΜΗΝ)$/.test(o[1])&&!/^(ΨΟΦ|ΝΑΥΛΟΧ)$/.test(o[1])||/(ΚΟΛΛ)$/.test(o[1]))&&(s+="ΑΓ")),null!==(o=/^(.+?)(ΗΣΕ|ΗΣΟΥ|ΗΣΑ)$/.exec(s))&&(s=o[1],/^(Ν|ΧΕΡΣΟΝ|ΔΩΔΕΚΑΝ|ΕΡΗΜΟΝ|ΜΕΓΑΛΟΝ|ΕΠΤΑΝ|Ι)$/.test(o[1])&&(s+="ΗΣ")),null!==(o=/^(.+?)(ΗΣΤΕ)$/.exec(s))&&(s=o[1],/^(ΑΣΒ|ΣΒ|ΑΧΡ|ΧΡ|ΑΠΛ|ΑΕΙΜΝ|ΔΥΣΧΡ|ΕΥΧΡ|ΚΟΙΝΟΧΡ|ΠΑΛΙΜΨ)$/.test(o[1])&&(s+="ΗΣΤ")),null!==(o=/^(.+?)(ΟΥΝΕ|ΗΣΟΥΝΕ|ΗΘΟΥΝΕ)$/.exec(s))&&(s=o[1],/^(Ν|Ρ|ΣΠΙ|ΣΤΡΑΒΟΜΟΥΤΣ|ΚΑΚΟΜΟΥΤΣ|ΕΞΩΝ)$/.test(o[1])&&(s+="ΟΥΝ")),null!==(o=/^(.+?)(ΟΥΜΕ|ΗΣΟΥΜΕ|ΗΘΟΥΜΕ)$/.exec(s))&&(s=o[1],/^(ΠΑΡΑΣΟΥΣ|Φ|Χ|ΩΡΙΟΠΛ|ΑΖ|ΑΛΛΟΣΟΥΣ|ΑΣΟΥΣ)$/.test(o[1])&&(s+="ΟΥΜ")),null!=(o=/^(.+?)(ΜΑΤΟΙ|ΜΑΤΟΥΣ|ΜΑΤΟ|ΜΑΤΑ|ΜΑΤΩΣ|ΜΑΤΩΝ|ΜΑΤΟΣ|ΜΑΤΕΣ|ΜΑΤΗ|ΜΑΤΗΣ|ΜΑΤΟΥ)$/.exec(s))&&(s=o[1]+"Μ",/^(ΓΡΑΜ)$/.test(o[1])?s+="Α":/^(ΓΕ|ΣΤΑ)$/.test(o[1])&&(s+="ΑΤ")),null!==(o=/^(.+?)(ΟΥΑ)$/.exec(s))&&(s=o[1]+"ΟΥ"),n.length===s.length&&null!==(o=/^(.+?)(Α|ΑΓΑΤΕ|ΑΓΑΝ|ΑΕΙ|ΑΜΑΙ|ΑΝ|ΑΣ|ΑΣΑΙ|ΑΤΑΙ|ΑΩ|Ε|ΕΙ|ΕΙΣ|ΕΙΤΕ|ΕΣΑΙ|ΕΣ|ΕΤΑΙ|Ι|ΙΕΜΑΙ|ΙΕΜΑΣΤΕ|ΙΕΤΑΙ|ΙΕΣΑΙ|ΙΕΣΑΣΤΕ|ΙΟΜΑΣΤΑΝ|ΙΟΜΟΥΝ|ΙΟΜΟΥΝΑ|ΙΟΝΤΑΝ|ΙΟΝΤΟΥΣΑΝ|ΙΟΣΑΣΤΑΝ|ΙΟΣΑΣΤΕ|ΙΟΣΟΥΝ|ΙΟΣΟΥΝΑ|ΙΟΤΑΝ|ΙΟΥΜΑ|ΙΟΥΜΑΣΤΕ|ΙΟΥΝΤΑΙ|ΙΟΥΝΤΑΝ|Η|ΗΔΕΣ|ΗΔΩΝ|ΗΘΕΙ|ΗΘΕΙΣ|ΗΘΕΙΤΕ|ΗΘΗΚΑΤΕ|ΗΘΗΚΑΝ|ΗΘΟΥΝ|ΗΘΩ|ΗΚΑΤΕ|ΗΚΑΝ|ΗΣ|ΗΣΑΝ|ΗΣΑΤΕ|ΗΣΕΙ|ΗΣΕΣ|ΗΣΟΥΝ|ΗΣΩ|Ο|ΟΙ|ΟΜΑΙ|ΟΜΑΣΤΑΝ|ΟΜΟΥΝ|ΟΜΟΥΝΑ|ΟΝΤΑΙ|ΟΝΤΑΝ|ΟΝΤΟΥΣΑΝ|ΟΣ|ΟΣΑΣΤΑΝ|ΟΣΑΣΤΕ|ΟΣΟΥΝ|ΟΣΟΥΝΑ|ΟΤΑΝ|ΟΥ|ΟΥΜΑΙ|ΟΥΜΑΣΤΕ|ΟΥΝ|ΟΥΝΤΑΙ|ΟΥΝΤΑΝ|ΟΥΣ|ΟΥΣΑΝ|ΟΥΣΑΤΕ|Υ||ΥΑ|ΥΣ|Ω|ΩΝ|ΟΙΣ)$/.exec(s))&&(s=o[1]),null!=(o=/^(.+?)(ΕΣΤΕΡ|ΕΣΤΑΤ|ΟΤΕΡ|ΟΤΑΤ|ΥΤΕΡ|ΥΤΑΤ|ΩΤΕΡ|ΩΤΑΤ)$/.exec(s))&&(/^(ΕΞ|ΕΣ|ΑΝ|ΚΑΤ|Κ|ΠΡ)$/.test(o[1])||(s=o[1]),/^(ΚΑ|Μ|ΕΛΕ|ΛΕ|ΔΕ)$/.test(o[1])&&(s+="ΥΤ")),s}var l={"ΦΑΓΙΑ":"ΦΑ","ΦΑΓΙΟΥ":"ΦΑ","ΦΑΓΙΩΝ":"ΦΑ","ΣΚΑΓΙΑ":"ΣΚΑ","ΣΚΑΓΙΟΥ":"ΣΚΑ","ΣΚΑΓΙΩΝ":"ΣΚΑ","ΣΟΓΙΟΥ":"ΣΟ","ΣΟΓΙΑ":"ΣΟ","ΣΟΓΙΩΝ":"ΣΟ","ΤΑΤΟΓΙΑ":"ΤΑΤΟ","ΤΑΤΟΓΙΟΥ":"ΤΑΤΟ","ΤΑΤΟΓΙΩΝ":"ΤΑΤΟ","ΚΡΕΑΣ":"ΚΡΕ","ΚΡΕΑΤΟΣ":"ΚΡΕ","ΚΡΕΑΤΑ":"ΚΡΕ","ΚΡΕΑΤΩΝ":"ΚΡΕ","ΠΕΡΑΣ":"ΠΕΡ","ΠΕΡΑΤΟΣ":"ΠΕΡ","ΠΕΡΑΤΑ":"ΠΕΡ","ΠΕΡΑΤΩΝ":"ΠΕΡ","ΤΕΡΑΣ":"ΤΕΡ","ΤΕΡΑΤΟΣ":"ΤΕΡ","ΤΕΡΑΤΑ":"ΤΕΡ","ΤΕΡΑΤΩΝ":"ΤΕΡ","ΦΩΣ":"ΦΩ","ΦΩΤΟΣ":"ΦΩ","ΦΩΤΑ":"ΦΩ","ΦΩΤΩΝ":"ΦΩ","ΚΑΘΕΣΤΩΣ":"ΚΑΘΕΣΤ","ΚΑΘΕΣΤΩΤΟΣ":"ΚΑΘΕΣΤ","ΚΑΘΕΣΤΩΤΑ":"ΚΑΘΕΣΤ","ΚΑΘΕΣΤΩΤΩΝ":"ΚΑΘΕΣΤ","ΓΕΓΟΝΟΣ":"ΓΕΓΟΝ","ΓΕΓΟΝΟΤΟΣ":"ΓΕΓΟΝ","ΓΕΓΟΝΟΤΑ":"ΓΕΓΟΝ","ΓΕΓΟΝΟΤΩΝ":"ΓΕΓΟΝ","ΕΥΑ":"ΕΥ"},i=["ΑΚΡΙΒΩΣ","ΑΛΑ","ΑΛΛΑ","ΑΛΛΙΩΣ","ΑΛΛΟΤΕ","ΑΜΑ","ΑΝΩ","ΑΝΑ","ΑΝΑΜΕΣΑ","ΑΝΑΜΕΤΑΞΥ","ΑΝΕΥ","ΑΝΤΙ","ΑΝΤΙΠΕΡΑ","ΑΝΤΙΟ","ΑΞΑΦΝΑ","ΑΠΟ","ΑΠΟΨΕ","ΑΡΑ","ΑΡΑΓΕ","ΑΥΡΙΟ","ΑΦΟΙ","ΑΦΟΥ","ΑΦΟΤΟΥ","ΒΡΕ","ΓΕΙΑ","ΓΙΑ","ΓΙΑΤΙ","ΓΡΑΜΜΑ","ΔΕΗ","ΔΕΝ","ΔΗΛΑΔΗ","ΔΙΧΩΣ","ΔΥΟ","ΕΑΝ","ΕΓΩ","ΕΔΩ","ΕΔΑ","ΕΙΘΕ","ΕΙΜΑΙ","ΕΙΜΑΣΤΕ","ΕΙΣΑΙ","ΕΙΣΑΣΤΕ","ΕΙΝΑΙ","ΕΙΣΤΕ","ΕΙΤΕ","ΕΚΕΙ","ΕΚΟ","ΕΛΑ","ΕΜΑΣ","ΕΜΕΙΣ","ΕΝΤΕΛΩΣ","ΕΝΤΟΣ","ΕΝΤΩΜΕΤΑΞΥ","ΕΝΩ","ΕΞΙ","ΕΞΙΣΟΥ","ΕΞΗΣ","ΕΞΩ","ΕΟΚ","ΕΠΑΝΩ","ΕΠΕΙΔΗ","ΕΠΕΙΤΑ","ΕΠΙ","ΕΠΙΣΗΣ","ΕΠΟΜΕΝΩΣ","ΕΠΤΑ","ΕΣΑΣ","ΕΣΕΙΣ","ΕΣΤΩ","ΕΣΥ","ΕΣΩ","ΕΤΣΙ","ΕΥΓΕ","ΕΦΕ","ΕΦΕΞΗΣ","ΕΧΤΕΣ","ΕΩΣ","ΗΔΗ","ΗΜΙ","ΗΠΑ","ΗΤΟΙ","ΘΕΣ","ΙΔΙΩΣ","ΙΔΗ","ΙΚΑ","ΙΣΩΣ","ΚΑΘΕ","ΚΑΘΕΤΙ","ΚΑΘΟΛΟΥ","ΚΑΘΩΣ","ΚΑΙ","ΚΑΝ","ΚΑΠΟΤΕ","ΚΑΠΟΥ","ΚΑΤΑ","ΚΑΤΙ","ΚΑΤΟΠΙΝ","ΚΑΤΩ","ΚΕΙ","ΚΙΧ","ΚΚΕ","ΚΟΛΑΝ","ΚΥΡΙΩΣ","ΚΩΣ","ΜΑΚΑΡΙ","ΜΑΛΙΣΤΑ","ΜΑΛΛΟΝ","ΜΑΙ","ΜΑΟ","ΜΑΟΥΣ","ΜΑΣ","ΜΕΘΑΥΡΙΟ","ΜΕΣ","ΜΕΣΑ","ΜΕΤΑ","ΜΕΤΑΞΥ","ΜΕΧΡΙ","ΜΗΔΕ","ΜΗΝ","ΜΗΠΩΣ","ΜΗΤΕ","ΜΙΑ","ΜΙΑΣ","ΜΙΣ","ΜΜΕ","ΜΟΛΟΝΟΤΙ","ΜΟΥ","ΜΠΑ","ΜΠΑΣ","ΜΠΟΥΦΑΝ","ΜΠΡΟΣ","ΝΑΙ","ΝΕΣ","ΝΤΑ","ΝΤΕ","ΞΑΝΑ","ΟΗΕ","ΟΚΤΩ","ΟΜΩΣ","ΟΝΕ","ΟΠΑ","ΟΠΟΥ","ΟΠΩΣ","ΟΣΟ","ΟΤΑΝ","ΟΤΕ","ΟΤΙ","ΟΥΤΕ","ΟΧΙ","ΠΑΛΙ","ΠΑΝ","ΠΑΝΟ","ΠΑΝΤΟΤΕ","ΠΑΝΤΟΥ","ΠΑΝΤΩΣ","ΠΑΝΩ","ΠΑΡΑ","ΠΕΡΑ","ΠΕΡΙ","ΠΕΡΙΠΟΥ","ΠΙΑ","ΠΙΟ","ΠΙΣΩ","ΠΛΑΙ","ΠΛΕΟΝ","ΠΛΗΝ","ΠΟΤΕ","ΠΟΥ","ΠΡΟ","ΠΡΟΣ","ΠΡΟΧΤΕΣ","ΠΡΟΧΘΕΣ","ΡΟΔΙ","ΠΩΣ","ΣΑΙ","ΣΑΣ","ΣΑΝ","ΣΕΙΣ","ΣΙΑ","ΣΚΙ","ΣΟΙ","ΣΟΥ","ΣΡΙ","ΣΥΝ","ΣΥΝΑΜΑ","ΣΧΕΔΟΝ","ΤΑΔΕ","ΤΑΞΙ","ΤΑΧΑ","ΤΕΙ","ΤΗΝ","ΤΗΣ","ΤΙΠΟΤΑ","ΤΙΠΟΤΕ","ΤΙΣ","ΤΟΝ","ΤΟΤΕ","ΤΟΥ","ΤΟΥΣ","ΤΣΑ","ΤΣΕ","ΤΣΙ","ΤΣΟΥ","ΤΩΝ","ΥΠΟ","ΥΠΟΨΗ","ΥΠΟΨΙΝ","ΥΣΤΕΡΑ","ΦΕΤΟΣ","ΦΙΣ","ΦΠΑ","ΧΑΦ","ΧΘΕΣ","ΧΤΕΣ","ΧΩΡΙΣ","ΩΣ","ΩΣΑΝ","ΩΣΟΤΟΥ","ΩΣΠΟΥ","ΩΣΤΕ","ΩΣΤΟΣΟ"],s=new RegExp("^[ΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩ]+$");return function(e){return"function"==typeof e.update?e.update(function(e){return n(e.toUpperCase()).toLowerCase()}):n(e.toUpperCase()).toLowerCase()}}(),e.Pipeline.registerFunction(e.el.stemmer,"stemmer-el"),e.el.stopWordFilter=e.generateStopWordFilter("αλλα αν αντι απο αυτα αυτεσ αυτη αυτο αυτοι αυτοσ αυτουσ αυτων για δε δεν εαν ειμαι ειμαστε ειναι εισαι ειστε εκεινα εκεινεσ εκεινη εκεινο εκεινοι εκεινοσ εκεινουσ εκεινων ενω επι η θα ισωσ κ και κατα κι μα με μετα μη μην να ο οι ομωσ οπωσ οσο οτι παρα ποια ποιεσ ποιο ποιοι ποιοσ ποιουσ ποιων που προσ πωσ σε στη στην στο στον τα την τησ το τον τοτε του των ωσ".split(" ")),e.Pipeline.registerFunction(e.el.stopWordFilter,"stopWordFilter-el"),e.el.normilizer=function(){var e={"Ά":"Α","ά":"α","Έ":"Ε","έ":"ε","Ή":"Η","ή":"η","Ί":"Ι","ί":"ι","Ό":"Ο","ο":"ο","Ύ":"Υ","ύ":"υ","Ώ":"Ω","ώ":"ω","Ϊ":"Ι","ϊ":"ι","Ϋ":"Υ","ϋ":"υ","ΐ":"ι","ΰ":"υ"};return function(t){if("function"==typeof t.update)return t.update(function(t){for(var r="",n=0;n');--md-typeset-table-sort-icon--asc:url('data:image/svg+xml;charset=utf-8,');--md-typeset-table-sort-icon--desc:url('data:image/svg+xml;charset=utf-8,')}.md-typeset{-webkit-print-color-adjust:exact;color-adjust:exact;font-size:.8rem;line-height:1.6}@media print{.md-typeset{font-size:.68rem}}.md-typeset blockquote,.md-typeset dl,.md-typeset figure,.md-typeset ol,.md-typeset pre,.md-typeset ul{margin-bottom:1em;margin-top:1em}.md-typeset h1{color:var(--md-default-fg-color--light);font-size:2em;line-height:1.3;margin:0 0 1.25em}.md-typeset h1,.md-typeset h2{font-weight:300;letter-spacing:-.01em}.md-typeset h2{font-size:1.5625em;line-height:1.4;margin:1.6em 0 .64em}.md-typeset h3{font-size:1.25em;font-weight:400;letter-spacing:-.01em;line-height:1.5;margin:1.6em 0 .8em}.md-typeset h2+h3{margin-top:.8em}.md-typeset h4{font-weight:700;letter-spacing:-.01em;margin:1em 0}.md-typeset h5,.md-typeset h6{color:var(--md-default-fg-color--light);font-size:.8em;font-weight:700;letter-spacing:-.01em;margin:1.25em 0}.md-typeset h5{text-transform:uppercase}.md-typeset hr{border-bottom:.05rem solid var(--md-default-fg-color--lightest);display:flow-root;margin:1.5em 0}.md-typeset a{color:var(--md-typeset-a-color);word-break:break-word}.md-typeset a,.md-typeset a:before{transition:color 125ms}.md-typeset a:focus,.md-typeset a:hover{color:var(--md-accent-fg-color)}.md-typeset a:focus code,.md-typeset a:hover code{background-color:var(--md-accent-fg-color--transparent)}.md-typeset a code{color:currentcolor;transition:background-color 125ms}.md-typeset a.focus-visible{outline-color:var(--md-accent-fg-color);outline-offset:.2rem}.md-typeset code,.md-typeset kbd,.md-typeset pre{color:var(--md-code-fg-color);direction:ltr;font-variant-ligatures:none}@media print{.md-typeset code,.md-typeset kbd,.md-typeset pre{white-space:pre-wrap}}.md-typeset code{background-color:var(--md-code-bg-color);border-radius:.1rem;-webkit-box-decoration-break:clone;box-decoration-break:clone;font-size:.85em;padding:0 .2941176471em;word-break:break-word}.md-typeset code:not(.focus-visible){-webkit-tap-highlight-color:transparent;outline:none}.md-typeset pre{display:flow-root;line-height:1.4;position:relative}.md-typeset pre>code{-webkit-box-decoration-break:slice;box-decoration-break:slice;box-shadow:none;display:block;margin:0;outline-color:var(--md-accent-fg-color);overflow:auto;padding:.7720588235em 1.1764705882em;scrollbar-color:var(--md-default-fg-color--lighter) #0000;scrollbar-width:thin;touch-action:auto;word-break:normal}.md-typeset pre>code:hover{scrollbar-color:var(--md-accent-fg-color) #0000}.md-typeset pre>code::-webkit-scrollbar{height:.2rem;width:.2rem}.md-typeset pre>code::-webkit-scrollbar-thumb{background-color:var(--md-default-fg-color--lighter)}.md-typeset pre>code::-webkit-scrollbar-thumb:hover{background-color:var(--md-accent-fg-color)}.md-typeset kbd{background-color:var(--md-typeset-kbd-color);border-radius:.1rem;box-shadow:0 .1rem 0 .05rem var(--md-typeset-kbd-border-color),0 .1rem 0 var(--md-typeset-kbd-border-color),0 -.1rem .2rem var(--md-typeset-kbd-accent-color) inset;color:var(--md-default-fg-color);display:inline-block;font-size:.75em;padding:0 .6666666667em;vertical-align:text-top;word-break:break-word}.md-typeset mark{background-color:var(--md-typeset-mark-color);-webkit-box-decoration-break:clone;box-decoration-break:clone;color:inherit;word-break:break-word}.md-typeset abbr{border-bottom:.05rem dotted var(--md-default-fg-color--light);cursor:help;text-decoration:none}@media (hover:none){.md-typeset abbr[title]:focus:after,.md-typeset abbr[title]:hover:after{background-color:var(--md-default-fg-color);border-radius:.1rem;box-shadow:var(--md-shadow-z3);color:var(--md-default-bg-color);content:attr(title);font-size:.7rem;left:.8rem;margin-top:2em;padding:.2rem .3rem;position:absolute;right:.8rem}}.md-typeset small{opacity:.75}[dir=ltr] .md-typeset sub,[dir=ltr] .md-typeset sup{margin-left:.078125em}[dir=rtl] .md-typeset sub,[dir=rtl] .md-typeset sup{margin-right:.078125em}[dir=ltr] .md-typeset blockquote{padding-left:.6rem}[dir=rtl] .md-typeset blockquote{padding-right:.6rem}[dir=ltr] .md-typeset blockquote{border-left:.2rem solid var(--md-default-fg-color--lighter)}[dir=rtl] .md-typeset blockquote{border-right:.2rem solid var(--md-default-fg-color--lighter)}.md-typeset blockquote{color:var(--md-default-fg-color--light);margin-left:0;margin-right:0}.md-typeset ul{list-style-type:disc}[dir=ltr] .md-typeset ol,[dir=ltr] .md-typeset ul{margin-left:.625em}[dir=rtl] .md-typeset ol,[dir=rtl] .md-typeset ul{margin-right:.625em}.md-typeset ol,.md-typeset ul{padding:0}.md-typeset ol:not([hidden]),.md-typeset ul:not([hidden]){display:flow-root}.md-typeset ol ol,.md-typeset ul ol{list-style-type:lower-alpha}.md-typeset ol ol ol,.md-typeset ul ol ol{list-style-type:lower-roman}[dir=ltr] .md-typeset ol li,[dir=ltr] .md-typeset ul li{margin-left:1.25em}[dir=rtl] .md-typeset ol li,[dir=rtl] .md-typeset ul li{margin-right:1.25em}.md-typeset ol li,.md-typeset ul li{margin-bottom:.5em}.md-typeset ol li blockquote,.md-typeset ol li p,.md-typeset ul li blockquote,.md-typeset ul li p{margin:.5em 0}.md-typeset ol li:last-child,.md-typeset ul li:last-child{margin-bottom:0}[dir=ltr] .md-typeset ol li ol,[dir=ltr] .md-typeset ol li ul,[dir=ltr] .md-typeset ul li ol,[dir=ltr] .md-typeset ul li ul{margin-left:.625em}[dir=rtl] .md-typeset ol li ol,[dir=rtl] .md-typeset ol li ul,[dir=rtl] .md-typeset ul li ol,[dir=rtl] .md-typeset ul li ul{margin-right:.625em}.md-typeset ol li ol,.md-typeset ol li ul,.md-typeset ul li ol,.md-typeset ul li ul{margin-bottom:.5em;margin-top:.5em}[dir=ltr] .md-typeset dd{margin-left:1.875em}[dir=rtl] .md-typeset dd{margin-right:1.875em}.md-typeset dd{margin-bottom:1.5em;margin-top:1em}.md-typeset img,.md-typeset svg,.md-typeset video{height:auto;max-width:100%}.md-typeset img[align=left]{margin:1em 1em 1em 0}.md-typeset img[align=right]{margin:1em 0 1em 1em}.md-typeset img[align]:only-child{margin-top:0}.md-typeset figure{display:flow-root;margin:1em auto;max-width:100%;text-align:center;width:-webkit-fit-content;width:-moz-fit-content;width:fit-content}.md-typeset figure img{display:block}.md-typeset figcaption{font-style:italic;margin:1em auto;max-width:24rem}.md-typeset iframe{max-width:100%}.md-typeset table:not([class]){background-color:var(--md-default-bg-color);border:.05rem solid var(--md-typeset-table-color);border-radius:.1rem;display:inline-block;font-size:.64rem;max-width:100%;overflow:auto;touch-action:auto}@media print{.md-typeset table:not([class]){display:table}}.md-typeset table:not([class])+*{margin-top:1.5em}.md-typeset table:not([class]) td>:first-child,.md-typeset table:not([class]) th>:first-child{margin-top:0}.md-typeset table:not([class]) td>:last-child,.md-typeset table:not([class]) th>:last-child{margin-bottom:0}.md-typeset table:not([class]) td:not([align]),.md-typeset table:not([class]) th:not([align]){text-align:left}[dir=rtl] .md-typeset table:not([class]) td:not([align]),[dir=rtl] .md-typeset table:not([class]) th:not([align]){text-align:right}.md-typeset table:not([class]) th{font-weight:700;min-width:5rem;padding:.9375em 1.25em;vertical-align:top}.md-typeset table:not([class]) td{border-top:.05rem solid var(--md-typeset-table-color);padding:.9375em 1.25em;vertical-align:top}.md-typeset table:not([class]) tbody tr{transition:background-color 125ms}.md-typeset table:not([class]) tbody tr:hover{background-color:var(--md-typeset-table-color--light);box-shadow:0 .05rem 0 var(--md-default-bg-color) inset}.md-typeset table:not([class]) a{word-break:normal}.md-typeset table th[role=columnheader]{cursor:pointer}[dir=ltr] .md-typeset table th[role=columnheader]:after{margin-left:.5em}[dir=rtl] .md-typeset table th[role=columnheader]:after{margin-right:.5em}.md-typeset table th[role=columnheader]:after{content:"";display:inline-block;height:1.2em;-webkit-mask-image:var(--md-typeset-table-sort-icon);mask-image:var(--md-typeset-table-sort-icon);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;transition:background-color 125ms;vertical-align:text-bottom;width:1.2em}.md-typeset table th[role=columnheader]:hover:after{background-color:var(--md-default-fg-color--lighter)}.md-typeset table th[role=columnheader][aria-sort=ascending]:after{background-color:var(--md-default-fg-color--light);-webkit-mask-image:var(--md-typeset-table-sort-icon--asc);mask-image:var(--md-typeset-table-sort-icon--asc)}.md-typeset table th[role=columnheader][aria-sort=descending]:after{background-color:var(--md-default-fg-color--light);-webkit-mask-image:var(--md-typeset-table-sort-icon--desc);mask-image:var(--md-typeset-table-sort-icon--desc)}.md-typeset__scrollwrap{margin:1em -.8rem;overflow-x:auto;touch-action:auto}.md-typeset__table{display:inline-block;margin-bottom:.5em;padding:0 .8rem}@media print{.md-typeset__table{display:block}}html .md-typeset__table table{display:table;margin:0;overflow:hidden;width:100%}@media screen and (max-width:44.984375em){.md-content__inner>pre{margin:1em -.8rem}.md-content__inner>pre code{border-radius:0}}.md-typeset .md-author{display:block;flex-shrink:0;height:1.6rem;overflow:hidden;position:relative;transition:color 125ms,transform 125ms;width:1.6rem}.md-typeset .md-author img{border-radius:100%;display:block}.md-typeset .md-author--more{background:var(--md-default-fg-color--lightest);color:var(--md-default-fg-color--lighter);font-size:.6rem;font-weight:700;line-height:1.6rem;text-align:center}.md-typeset .md-author--long{height:2.4rem;width:2.4rem}.md-typeset a.md-author{transform:scale(1)}.md-typeset a.md-author img{filter:grayscale(100%) opacity(75%);transition:filter 125ms}.md-typeset a.md-author:focus,.md-typeset a.md-author:hover{transform:scale(1.1);z-index:1}.md-typeset a.md-author:focus img,.md-typeset a.md-author:hover img{filter:grayscale(0)}.md-banner{background-color:var(--md-footer-bg-color);color:var(--md-footer-fg-color);overflow:auto}@media print{.md-banner{display:none}}.md-banner--warning{background-color:var(--md-warning-bg-color);color:var(--md-warning-fg-color)}.md-banner__inner{font-size:.7rem;margin:.6rem auto;padding:0 .8rem}[dir=ltr] .md-banner__button{float:right}[dir=rtl] .md-banner__button{float:left}.md-banner__button{color:inherit;cursor:pointer;transition:opacity .25s}.no-js .md-banner__button{display:none}.md-banner__button:hover{opacity:.7}html{font-size:125%;height:100%;overflow-x:hidden}@media screen and (min-width:100em){html{font-size:137.5%}}@media screen and (min-width:125em){html{font-size:150%}}body{background-color:var(--md-default-bg-color);display:flex;flex-direction:column;font-size:.5rem;min-height:100%;position:relative;width:100%}@media print{body{display:block}}@media screen and (max-width:59.984375em){body[data-md-scrolllock]{position:fixed}}.md-grid{margin-left:auto;margin-right:auto;max-width:61rem}.md-container{display:flex;flex-direction:column;flex-grow:1}@media print{.md-container{display:block}}.md-main{flex-grow:1}.md-main__inner{display:flex;height:100%;margin-top:1.5rem}.md-ellipsis{overflow:hidden;text-overflow:ellipsis}.md-toggle{display:none}.md-option{height:0;opacity:0;position:absolute;width:0}.md-option:checked+label:not([hidden]){display:block}.md-option.focus-visible+label{outline-color:var(--md-accent-fg-color);outline-style:auto}.md-skip{background-color:var(--md-default-fg-color);border-radius:.1rem;color:var(--md-default-bg-color);font-size:.64rem;margin:.5rem;opacity:0;outline-color:var(--md-accent-fg-color);padding:.3rem .5rem;position:fixed;transform:translateY(.4rem);z-index:-1}.md-skip:focus{opacity:1;transform:translateY(0);transition:transform .25s cubic-bezier(.4,0,.2,1),opacity 175ms 75ms;z-index:10}@page{margin:25mm}:root{--md-clipboard-icon:url('data:image/svg+xml;charset=utf-8,')}.md-clipboard{border-radius:.1rem;color:var(--md-default-fg-color--lightest);cursor:pointer;height:1.5em;outline-color:var(--md-accent-fg-color);outline-offset:.1rem;position:absolute;right:.5em;top:.5em;transition:color .25s;width:1.5em;z-index:1}@media print{.md-clipboard{display:none}}.md-clipboard:not(.focus-visible){-webkit-tap-highlight-color:transparent;outline:none}:hover>.md-clipboard{color:var(--md-default-fg-color--light)}.md-clipboard:focus,.md-clipboard:hover{color:var(--md-accent-fg-color)}.md-clipboard:after{background-color:currentcolor;content:"";display:block;height:1.125em;margin:0 auto;-webkit-mask-image:var(--md-clipboard-icon);mask-image:var(--md-clipboard-icon);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;width:1.125em}.md-clipboard--inline{cursor:pointer}.md-clipboard--inline code{transition:color .25s,background-color .25s}.md-clipboard--inline:focus code,.md-clipboard--inline:hover code{background-color:var(--md-accent-fg-color--transparent);color:var(--md-accent-fg-color)}@keyframes consent{0%{opacity:0;transform:translateY(100%)}to{opacity:1;transform:translateY(0)}}@keyframes overlay{0%{opacity:0}to{opacity:1}}.md-consent__overlay{animation:overlay .25s both;-webkit-backdrop-filter:blur(.1rem);backdrop-filter:blur(.1rem);background-color:#0000008a;height:100%;opacity:1;position:fixed;top:0;width:100%;z-index:5}.md-consent__inner{animation:consent .5s cubic-bezier(.1,.7,.1,1) both;background-color:var(--md-default-bg-color);border:0;border-radius:.1rem;bottom:0;box-shadow:0 0 .2rem #0000001a,0 .2rem .4rem #0003;max-height:100%;overflow:auto;padding:0;position:fixed;width:100%;z-index:5}.md-consent__form{padding:.8rem}.md-consent__settings{display:none;margin:1em 0}input:checked+.md-consent__settings{display:block}.md-consent__controls{margin-bottom:.8rem}.md-typeset .md-consent__controls .md-button{display:inline}@media screen and (max-width:44.984375em){.md-typeset .md-consent__controls .md-button{display:block;margin-top:.4rem;text-align:center;width:100%}}.md-consent label{cursor:pointer}.md-content{flex-grow:1;min-width:0}.md-content__inner{margin:0 .8rem 1.2rem;padding-top:.6rem}@media screen and (min-width:76.25em){[dir=ltr] .md-sidebar--primary:not([hidden])~.md-content>.md-content__inner{margin-left:1.2rem}[dir=ltr] .md-sidebar--secondary:not([hidden])~.md-content>.md-content__inner,[dir=rtl] .md-sidebar--primary:not([hidden])~.md-content>.md-content__inner{margin-right:1.2rem}[dir=rtl] .md-sidebar--secondary:not([hidden])~.md-content>.md-content__inner{margin-left:1.2rem}}.md-content__inner:before{content:"";display:block;height:.4rem}.md-content__inner>:last-child{margin-bottom:0}[dir=ltr] .md-content__button{float:right}[dir=rtl] .md-content__button{float:left}[dir=ltr] .md-content__button{margin-left:.4rem}[dir=rtl] .md-content__button{margin-right:.4rem}.md-content__button{margin:.4rem 0;padding:0}@media print{.md-content__button{display:none}}.md-typeset .md-content__button{color:var(--md-default-fg-color--lighter)}.md-content__button svg{display:inline;vertical-align:top}[dir=rtl] .md-content__button svg{transform:scaleX(-1)}[dir=ltr] .md-dialog{right:.8rem}[dir=rtl] .md-dialog{left:.8rem}.md-dialog{background-color:var(--md-default-fg-color);border-radius:.1rem;bottom:.8rem;box-shadow:var(--md-shadow-z3);min-width:11.1rem;opacity:0;padding:.4rem .6rem;pointer-events:none;position:fixed;transform:translateY(100%);transition:transform 0ms .4s,opacity .4s;z-index:4}@media print{.md-dialog{display:none}}.md-dialog--active{opacity:1;pointer-events:auto;transform:translateY(0);transition:transform .4s cubic-bezier(.075,.85,.175,1),opacity .4s}.md-dialog__inner{color:var(--md-default-bg-color);font-size:.7rem}.md-feedback{margin:2em 0 1em;text-align:center}.md-feedback fieldset{border:none;margin:0;padding:0}.md-feedback__title{font-weight:700;margin:1em auto}.md-feedback__inner{position:relative}.md-feedback__list{align-content:baseline;display:flex;flex-wrap:wrap;justify-content:center;position:relative}.md-feedback__list:hover .md-icon:not(:disabled){color:var(--md-default-fg-color--lighter)}:disabled .md-feedback__list{min-height:1.8rem}.md-feedback__icon{color:var(--md-default-fg-color--light);cursor:pointer;flex-shrink:0;margin:0 .1rem;transition:color 125ms}.md-feedback__icon:not(:disabled).md-icon:hover{color:var(--md-accent-fg-color)}.md-feedback__icon:disabled{color:var(--md-default-fg-color--lightest);pointer-events:none}.md-feedback__note{opacity:0;position:relative;transform:translateY(.4rem);transition:transform .4s cubic-bezier(.1,.7,.1,1),opacity .15s}.md-feedback__note>*{margin:0 auto;max-width:16rem}:disabled .md-feedback__note{opacity:1;transform:translateY(0)}.md-footer{background-color:var(--md-footer-bg-color);color:var(--md-footer-fg-color)}@media print{.md-footer{display:none}}.md-footer__inner{justify-content:space-between;overflow:auto;padding:.2rem}.md-footer__inner:not([hidden]){display:flex}.md-footer__link{align-items:end;display:flex;flex-grow:0.01;margin-bottom:.4rem;margin-top:1rem;max-width:100%;outline-color:var(--md-accent-fg-color);overflow:hidden;transition:opacity .25s}.md-footer__link:focus,.md-footer__link:hover{opacity:.7}[dir=rtl] .md-footer__link svg{transform:scaleX(-1)}@media screen and (max-width:44.984375em){.md-footer__link--prev{flex-shrink:0}.md-footer__link--prev .md-footer__title{display:none}}[dir=ltr] .md-footer__link--next{margin-left:auto}[dir=rtl] .md-footer__link--next{margin-right:auto}.md-footer__link--next{text-align:right}[dir=rtl] .md-footer__link--next{text-align:left}.md-footer__title{flex-grow:1;font-size:.9rem;margin-bottom:.7rem;max-width:calc(100% - 2.4rem);padding:0 1rem;white-space:nowrap}.md-footer__button{margin:.2rem;padding:.4rem}.md-footer__direction{font-size:.64rem;opacity:.7}.md-footer-meta{background-color:var(--md-footer-bg-color--dark)}.md-footer-meta__inner{display:flex;flex-wrap:wrap;justify-content:space-between;padding:.2rem}html .md-footer-meta.md-typeset a{color:var(--md-footer-fg-color--light)}html .md-footer-meta.md-typeset a:focus,html .md-footer-meta.md-typeset a:hover{color:var(--md-footer-fg-color)}.md-copyright{color:var(--md-footer-fg-color--lighter);font-size:.64rem;margin:auto .6rem;padding:.4rem 0;width:100%}@media screen and (min-width:45em){.md-copyright{width:auto}}.md-copyright__highlight{color:var(--md-footer-fg-color--light)}.md-social{display:inline-flex;gap:.2rem;margin:0 .4rem;padding:.2rem 0 .6rem}@media screen and (min-width:45em){.md-social{padding:.6rem 0}}.md-social__link{display:inline-block;height:1.6rem;text-align:center;width:1.6rem}.md-social__link:before{line-height:1.9}.md-social__link svg{fill:currentcolor;max-height:.8rem;vertical-align:-25%}.md-typeset .md-button{border:.1rem solid;border-radius:.1rem;color:var(--md-primary-fg-color);cursor:pointer;display:inline-block;font-weight:700;padding:.625em 2em;transition:color 125ms,background-color 125ms,border-color 125ms}.md-typeset .md-button--primary{background-color:var(--md-primary-fg-color);border-color:var(--md-primary-fg-color);color:var(--md-primary-bg-color)}.md-typeset .md-button:focus,.md-typeset .md-button:hover{background-color:var(--md-accent-fg-color);border-color:var(--md-accent-fg-color);color:var(--md-accent-bg-color)}[dir=ltr] .md-typeset .md-input{border-top-left-radius:.1rem}[dir=ltr] .md-typeset .md-input,[dir=rtl] .md-typeset .md-input{border-top-right-radius:.1rem}[dir=rtl] .md-typeset .md-input{border-top-left-radius:.1rem}.md-typeset .md-input{border-bottom:.1rem solid var(--md-default-fg-color--lighter);box-shadow:var(--md-shadow-z1);font-size:.8rem;height:1.8rem;padding:0 .6rem;transition:border .25s,box-shadow .25s}.md-typeset .md-input:focus,.md-typeset .md-input:hover{border-bottom-color:var(--md-accent-fg-color);box-shadow:var(--md-shadow-z2)}.md-typeset .md-input--stretch{width:100%}.md-header{background-color:var(--md-primary-fg-color);box-shadow:0 0 .2rem #0000,0 .2rem .4rem #0000;color:var(--md-primary-bg-color);display:block;left:0;position:sticky;right:0;top:0;z-index:4}@media print{.md-header{display:none}}.md-header[hidden]{transform:translateY(-100%);transition:transform .25s cubic-bezier(.8,0,.6,1),box-shadow .25s}.md-header--shadow{box-shadow:0 0 .2rem #0000001a,0 .2rem .4rem #0003;transition:transform .25s cubic-bezier(.1,.7,.1,1),box-shadow .25s}.md-header__inner{align-items:center;display:flex;padding:0 .2rem}.md-header__button{color:currentcolor;cursor:pointer;margin:.2rem;outline-color:var(--md-accent-fg-color);padding:.4rem;position:relative;transition:opacity .25s;vertical-align:middle;z-index:1}.md-header__button:hover{opacity:.7}.md-header__button:not([hidden]){display:inline-block}.md-header__button:not(.focus-visible){-webkit-tap-highlight-color:transparent;outline:none}.md-header__button.md-logo{margin:.2rem;padding:.4rem}@media screen and (max-width:76.234375em){.md-header__button.md-logo{display:none}}.md-header__button.md-logo img,.md-header__button.md-logo svg{fill:currentcolor;display:block;height:1.2rem;width:auto}@media screen and (min-width:60em){.md-header__button[for=__search]{display:none}}.no-js .md-header__button[for=__search]{display:none}[dir=rtl] .md-header__button[for=__search] svg{transform:scaleX(-1)}@media screen and (min-width:76.25em){.md-header__button[for=__drawer]{display:none}}.md-header__topic{display:flex;max-width:100%;position:absolute;transition:transform .4s cubic-bezier(.1,.7,.1,1),opacity .15s;white-space:nowrap}.md-header__topic+.md-header__topic{opacity:0;pointer-events:none;transform:translateX(1.25rem);transition:transform .4s cubic-bezier(1,.7,.1,.1),opacity .15s;z-index:-1}[dir=rtl] .md-header__topic+.md-header__topic{transform:translateX(-1.25rem)}.md-header__topic:first-child{font-weight:700}[dir=ltr] .md-header__title{margin-left:1rem}[dir=rtl] .md-header__title{margin-right:1rem}[dir=ltr] .md-header__title{margin-right:.4rem}[dir=rtl] .md-header__title{margin-left:.4rem}.md-header__title{flex-grow:1;font-size:.9rem;height:2.4rem;line-height:2.4rem}.md-header__title--active .md-header__topic{opacity:0;pointer-events:none;transform:translateX(-1.25rem);transition:transform .4s cubic-bezier(1,.7,.1,.1),opacity .15s;z-index:-1}[dir=rtl] .md-header__title--active .md-header__topic{transform:translateX(1.25rem)}.md-header__title--active .md-header__topic+.md-header__topic{opacity:1;pointer-events:auto;transform:translateX(0);transition:transform .4s cubic-bezier(.1,.7,.1,1),opacity .15s;z-index:0}.md-header__title>.md-header__ellipsis{height:100%;position:relative;width:100%}.md-header__option{display:flex;flex-shrink:0;max-width:100%;transition:max-width 0ms .25s,opacity .25s .25s;white-space:nowrap}[data-md-toggle=search]:checked~.md-header .md-header__option{max-width:0;opacity:0;transition:max-width 0ms,opacity 0ms}.md-header__option>input{bottom:0}.md-header__source{display:none}@media screen and (min-width:60em){[dir=ltr] .md-header__source{margin-left:1rem}[dir=rtl] .md-header__source{margin-right:1rem}.md-header__source{display:block;max-width:11.7rem;width:11.7rem}}@media screen and (min-width:76.25em){[dir=ltr] .md-header__source{margin-left:1.4rem}[dir=rtl] .md-header__source{margin-right:1.4rem}}.md-meta{color:var(--md-default-fg-color--light);font-size:.7rem;line-height:1.3}.md-meta__list{display:inline-flex;flex-wrap:wrap;list-style:none;margin:0;padding:0}.md-meta__item:not(:last-child):after{content:"·";margin-left:.2rem;margin-right:.2rem}.md-meta__link{color:var(--md-typeset-a-color)}.md-meta__link:focus,.md-meta__link:hover{color:var(--md-accent-fg-color)}.md-draft{background-color:#ff1744;border-radius:.125em;color:#fff;display:inline-block;font-weight:700;padding-left:.5714285714em;padding-right:.5714285714em}:root{--md-nav-icon--prev:url('data:image/svg+xml;charset=utf-8,');--md-nav-icon--next:url('data:image/svg+xml;charset=utf-8,');--md-toc-icon:url('data:image/svg+xml;charset=utf-8,')}.md-nav{font-size:.7rem;line-height:1.3}.md-nav__title{color:var(--md-default-fg-color--light);display:block;font-weight:700;overflow:hidden;padding:0 .6rem;text-overflow:ellipsis}.md-nav__title .md-nav__button{display:none}.md-nav__title .md-nav__button img{height:100%;width:auto}.md-nav__title .md-nav__button.md-logo img,.md-nav__title .md-nav__button.md-logo svg{fill:currentcolor;display:block;height:2.4rem;max-width:100%;object-fit:contain;width:auto}.md-nav__list{list-style:none;margin:0;padding:0}.md-nav__link{align-items:flex-start;display:flex;gap:.4rem;margin-top:.625em;scroll-snap-align:start;transition:color 125ms}.md-nav__link--passed{color:var(--md-default-fg-color--light)}.md-nav__item .md-nav__link--active,.md-nav__item .md-nav__link--active code{color:var(--md-typeset-a-color)}.md-nav__link .md-ellipsis{position:relative}[dir=ltr] .md-nav__link .md-icon:last-child{margin-left:auto}[dir=rtl] .md-nav__link .md-icon:last-child{margin-right:auto}.md-nav__link svg{fill:currentcolor;flex-shrink:0;height:1.3em}.md-nav__link[for]:focus,.md-nav__link[for]:hover,.md-nav__link[href]:focus,.md-nav__link[href]:hover{color:var(--md-accent-fg-color);cursor:pointer}.md-nav__link.focus-visible{outline-color:var(--md-accent-fg-color);outline-offset:.2rem}.md-nav--primary .md-nav__link[for=__toc]{display:none}.md-nav--primary .md-nav__link[for=__toc] .md-icon:after{background-color:currentcolor;display:block;height:100%;-webkit-mask-image:var(--md-toc-icon);mask-image:var(--md-toc-icon);width:100%}.md-nav--primary .md-nav__link[for=__toc]~.md-nav{display:none}.md-nav__container>.md-nav__link{margin-top:0}.md-nav__container>.md-nav__link:first-child{flex-grow:1;min-width:0}.md-nav__icon{flex-shrink:0}.md-nav__source{display:none}@media screen and (max-width:76.234375em){.md-nav--primary,.md-nav--primary .md-nav{background-color:var(--md-default-bg-color);display:flex;flex-direction:column;height:100%;left:0;position:absolute;right:0;top:0;z-index:1}.md-nav--primary .md-nav__item,.md-nav--primary .md-nav__title{font-size:.8rem;line-height:1.5}.md-nav--primary .md-nav__title{background-color:var(--md-default-fg-color--lightest);color:var(--md-default-fg-color--light);cursor:pointer;height:5.6rem;line-height:2.4rem;padding:3rem .8rem .2rem;position:relative;white-space:nowrap}[dir=ltr] .md-nav--primary .md-nav__title .md-nav__icon{left:.4rem}[dir=rtl] .md-nav--primary .md-nav__title .md-nav__icon{right:.4rem}.md-nav--primary .md-nav__title .md-nav__icon{display:block;height:1.2rem;margin:.2rem;position:absolute;top:.4rem;width:1.2rem}.md-nav--primary .md-nav__title .md-nav__icon:after{background-color:currentcolor;content:"";display:block;height:100%;-webkit-mask-image:var(--md-nav-icon--prev);mask-image:var(--md-nav-icon--prev);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;width:100%}.md-nav--primary .md-nav__title~.md-nav__list{background-color:var(--md-default-bg-color);box-shadow:0 .05rem 0 var(--md-default-fg-color--lightest) inset;overflow-y:auto;scroll-snap-type:y mandatory;touch-action:pan-y}.md-nav--primary .md-nav__title~.md-nav__list>:first-child{border-top:0}.md-nav--primary .md-nav__title[for=__drawer]{background-color:var(--md-primary-fg-color);color:var(--md-primary-bg-color);font-weight:700}.md-nav--primary .md-nav__title .md-logo{display:block;left:.2rem;margin:.2rem;padding:.4rem;position:absolute;right:.2rem;top:.2rem}.md-nav--primary .md-nav__list{flex:1}.md-nav--primary .md-nav__item{border-top:.05rem solid var(--md-default-fg-color--lightest)}.md-nav--primary .md-nav__item--active>.md-nav__link{color:var(--md-typeset-a-color)}.md-nav--primary .md-nav__item--active>.md-nav__link:focus,.md-nav--primary .md-nav__item--active>.md-nav__link:hover{color:var(--md-accent-fg-color)}.md-nav--primary .md-nav__link{margin-top:0;padding:.6rem .8rem}.md-nav--primary .md-nav__link svg{margin-top:.1em}.md-nav--primary .md-nav__link>.md-nav__link{padding:0}[dir=ltr] .md-nav--primary .md-nav__link .md-nav__icon{margin-right:-.2rem}[dir=rtl] .md-nav--primary .md-nav__link .md-nav__icon{margin-left:-.2rem}.md-nav--primary .md-nav__link .md-nav__icon{font-size:1.2rem;height:1.2rem;width:1.2rem}.md-nav--primary .md-nav__link .md-nav__icon:after{background-color:currentcolor;content:"";display:block;height:100%;-webkit-mask-image:var(--md-nav-icon--next);mask-image:var(--md-nav-icon--next);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;width:100%}[dir=rtl] .md-nav--primary .md-nav__icon:after{transform:scale(-1)}.md-nav--primary .md-nav--secondary .md-nav{background-color:initial;position:static}[dir=ltr] .md-nav--primary .md-nav--secondary .md-nav .md-nav__link{padding-left:1.4rem}[dir=rtl] .md-nav--primary .md-nav--secondary .md-nav .md-nav__link{padding-right:1.4rem}[dir=ltr] .md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav__link{padding-left:2rem}[dir=rtl] .md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav__link{padding-right:2rem}[dir=ltr] .md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav .md-nav__link{padding-left:2.6rem}[dir=rtl] .md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav .md-nav__link{padding-right:2.6rem}[dir=ltr] .md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav .md-nav .md-nav__link{padding-left:3.2rem}[dir=rtl] .md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav .md-nav .md-nav__link{padding-right:3.2rem}.md-nav--secondary{background-color:initial}.md-nav__toggle~.md-nav{display:flex;opacity:0;transform:translateX(100%);transition:transform .25s cubic-bezier(.8,0,.6,1),opacity 125ms 50ms}[dir=rtl] .md-nav__toggle~.md-nav{transform:translateX(-100%)}.md-nav__toggle:checked~.md-nav{opacity:1;transform:translateX(0);transition:transform .25s cubic-bezier(.4,0,.2,1),opacity 125ms 125ms}.md-nav__toggle:checked~.md-nav>.md-nav__list{-webkit-backface-visibility:hidden;backface-visibility:hidden}}@media screen and (max-width:59.984375em){.md-nav--primary .md-nav__link[for=__toc]{display:flex}.md-nav--primary .md-nav__link[for=__toc] .md-icon:after{content:""}.md-nav--primary .md-nav__link[for=__toc]+.md-nav__link{display:none}.md-nav--primary .md-nav__link[for=__toc]~.md-nav{display:flex}.md-nav__source{background-color:var(--md-primary-fg-color--dark);color:var(--md-primary-bg-color);display:block;padding:0 .2rem}}@media screen and (min-width:60em) and (max-width:76.234375em){.md-nav--integrated .md-nav__link[for=__toc]{display:flex}.md-nav--integrated .md-nav__link[for=__toc] .md-icon:after{content:""}.md-nav--integrated .md-nav__link[for=__toc]+.md-nav__link{display:none}.md-nav--integrated .md-nav__link[for=__toc]~.md-nav{display:flex}}@media screen and (min-width:60em){.md-nav{margin-bottom:-.4rem}.md-nav--secondary .md-nav__title{background:var(--md-default-bg-color);box-shadow:0 0 .4rem .4rem var(--md-default-bg-color);position:sticky;top:0;z-index:1}.md-nav--secondary .md-nav__title[for=__toc]{scroll-snap-align:start}.md-nav--secondary .md-nav__title .md-nav__icon{display:none}[dir=ltr] .md-nav--secondary .md-nav__list{padding-left:.6rem}[dir=rtl] .md-nav--secondary .md-nav__list{padding-right:.6rem}.md-nav--secondary .md-nav__list{padding-bottom:.4rem}[dir=ltr] .md-nav--secondary .md-nav__item>.md-nav__link{margin-right:.4rem}[dir=rtl] .md-nav--secondary .md-nav__item>.md-nav__link{margin-left:.4rem}}@media screen and (min-width:76.25em){.md-nav{margin-bottom:-.4rem;transition:max-height .25s cubic-bezier(.86,0,.07,1)}.md-nav--primary .md-nav__title{background:var(--md-default-bg-color);box-shadow:0 0 .4rem .4rem var(--md-default-bg-color);position:sticky;top:0;z-index:1}.md-nav--primary .md-nav__title[for=__drawer]{scroll-snap-align:start}.md-nav--primary .md-nav__title .md-nav__icon{display:none}[dir=ltr] .md-nav--primary .md-nav__list{padding-left:.6rem}[dir=rtl] .md-nav--primary .md-nav__list{padding-right:.6rem}.md-nav--primary .md-nav__list{padding-bottom:.4rem}[dir=ltr] .md-nav--primary .md-nav__item>.md-nav__link{margin-right:.4rem}[dir=rtl] .md-nav--primary .md-nav__item>.md-nav__link{margin-left:.4rem}.md-nav__toggle~.md-nav{display:grid;grid-template-rows:0fr;opacity:0;transition:grid-template-rows .25s cubic-bezier(.86,0,.07,1),opacity .25s,visibility 0ms .25s;visibility:collapse}.md-nav__toggle~.md-nav>.md-nav__list{overflow:hidden}.md-nav__toggle:checked~.md-nav,.md-nav__toggle:indeterminate~.md-nav{grid-template-rows:1fr;opacity:1;transition:grid-template-rows .25s cubic-bezier(.86,0,.07,1),opacity .15s .1s,visibility 0ms;visibility:visible}.md-nav__item--nested>.md-nav>.md-nav__title{display:none}.md-nav__item--section{display:block;margin:1.25em 0}.md-nav__item--section:last-child{margin-bottom:0}.md-nav__item--section>.md-nav__link{font-weight:700}.md-nav__item--section>.md-nav__link[for]{color:var(--md-default-fg-color--light)}.md-nav__item--section>.md-nav__link:not(.md-nav__container){pointer-events:none}.md-nav__item--section>.md-nav__link .md-icon,.md-nav__item--section>.md-nav__link>[for]{display:none}[dir=ltr] .md-nav__item--section>.md-nav{margin-left:-.6rem}[dir=rtl] .md-nav__item--section>.md-nav{margin-right:-.6rem}.md-nav__item--section>.md-nav{display:block;opacity:1;visibility:visible}.md-nav__item--section>.md-nav>.md-nav__list>.md-nav__item{padding:0}.md-nav__icon{border-radius:100%;height:.9rem;transition:background-color .25s;width:.9rem}.md-nav__icon:hover{background-color:var(--md-accent-fg-color--transparent)}.md-nav__icon:after{background-color:currentcolor;border-radius:100%;content:"";display:inline-block;height:100%;-webkit-mask-image:var(--md-nav-icon--next);mask-image:var(--md-nav-icon--next);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;transition:transform .25s;vertical-align:-.1rem;width:100%}[dir=rtl] .md-nav__icon:after{transform:rotate(180deg)}.md-nav__item--nested .md-nav__toggle:checked~.md-nav__link .md-nav__icon:after,.md-nav__item--nested .md-nav__toggle:indeterminate~.md-nav__link .md-nav__icon:after{transform:rotate(90deg)}.md-nav--lifted>.md-nav__list>.md-nav__item,.md-nav--lifted>.md-nav__title{display:none}.md-nav--lifted>.md-nav__list>.md-nav__item--active{display:block}.md-nav--lifted>.md-nav__list>.md-nav__item--active>.md-nav__link{background:var(--md-default-bg-color);box-shadow:0 0 .4rem .4rem var(--md-default-bg-color);margin-top:0;position:sticky;top:0;z-index:1}.md-nav--lifted>.md-nav__list>.md-nav__item--active>.md-nav__link:not(.md-nav__container){pointer-events:none}.md-nav--lifted>.md-nav__list>.md-nav__item--active.md-nav__item--section{margin:0}[dir=ltr] .md-nav--lifted>.md-nav__list>.md-nav__item>.md-nav{margin-left:-.6rem}[dir=rtl] .md-nav--lifted>.md-nav__list>.md-nav__item>.md-nav{margin-right:-.6rem}.md-nav--lifted>.md-nav__list>.md-nav__item>[for]{color:var(--md-default-fg-color--light)}.md-nav--lifted .md-nav[data-md-level="1"]{grid-template-rows:1fr;opacity:1;visibility:visible}.md-nav--integrated>.md-nav__list>.md-nav__item--active:not(.md-nav__item--nested){padding:0 .6rem}.md-nav--integrated>.md-nav__list>.md-nav__item--active:not(.md-nav__item--nested)>.md-nav__link{padding:0}[dir=ltr] .md-nav--integrated>.md-nav__list>.md-nav__item--active .md-nav--secondary{border-left:.05rem solid var(--md-primary-fg-color)}[dir=rtl] .md-nav--integrated>.md-nav__list>.md-nav__item--active .md-nav--secondary{border-right:.05rem solid var(--md-primary-fg-color)}.md-nav--integrated>.md-nav__list>.md-nav__item--active .md-nav--secondary{display:block;margin-bottom:1.25em;opacity:1;visibility:visible}.md-nav--integrated>.md-nav__list>.md-nav__item--active .md-nav--secondary>.md-nav__list{overflow:visible;padding-bottom:0}.md-nav--integrated>.md-nav__list>.md-nav__item--active .md-nav--secondary>.md-nav__title{display:none}}.md-pagination{font-size:.8rem;font-weight:700;gap:.4rem}.md-pagination,.md-pagination>*{align-items:center;display:flex;justify-content:center}.md-pagination>*{border-radius:.2rem;height:1.8rem;min-width:1.8rem;text-align:center}.md-pagination__current{background-color:var(--md-default-fg-color--lightest);color:var(--md-default-fg-color--light)}.md-pagination__link{transition:color 125ms,background-color 125ms}.md-pagination__link:focus,.md-pagination__link:hover{background-color:var(--md-accent-fg-color--transparent);color:var(--md-accent-fg-color)}.md-pagination__link:focus svg,.md-pagination__link:hover svg{color:var(--md-accent-fg-color)}.md-pagination__link.focus-visible{outline-color:var(--md-accent-fg-color);outline-offset:.2rem}.md-pagination__link svg{fill:currentcolor;color:var(--md-default-fg-color--lighter);display:block;max-height:100%;width:1.2rem}.md-post__back{border-bottom:.05rem solid var(--md-default-fg-color--lightest);margin-bottom:1.2rem;padding-bottom:1.2rem}@media screen and (max-width:76.234375em){.md-post__back{display:none}}[dir=rtl] .md-post__back svg{transform:scaleX(-1)}.md-post__authors{display:flex;flex-direction:column;gap:.6rem;margin:0 .6rem 1.2rem}.md-post .md-post__meta a{transition:color 125ms}.md-post .md-post__meta a:focus,.md-post .md-post__meta a:hover{color:var(--md-accent-fg-color)}.md-post__title{color:var(--md-default-fg-color--light);font-weight:700}.md-post--excerpt{margin-bottom:3.2rem}.md-post--excerpt .md-post__header{align-items:center;display:flex;gap:.6rem;min-height:1.6rem}.md-post--excerpt .md-post__authors{align-items:center;display:inline-flex;flex-direction:row;gap:.2rem;margin:0;min-height:2.4rem}[dir=ltr] .md-post--excerpt .md-post__meta .md-meta__list{margin-right:.4rem}[dir=rtl] .md-post--excerpt .md-post__meta .md-meta__list{margin-left:.4rem}.md-post--excerpt .md-post__content>:first-child{--md-scroll-margin:6rem;margin-top:0}.md-post>.md-nav--secondary{margin:1em 0}.md-profile{align-items:center;display:flex;font-size:.7rem;gap:.6rem;line-height:1.4;width:100%}.md-profile__description{flex-grow:1}.md-content--post{display:flex}@media screen and (max-width:76.234375em){.md-content--post{flex-flow:column-reverse}}.md-content--post>.md-content__inner{min-width:0}@media screen and (min-width:76.25em){[dir=ltr] .md-content--post>.md-content__inner{margin-left:1.2rem}[dir=rtl] .md-content--post>.md-content__inner{margin-right:1.2rem}}@media screen and (max-width:76.234375em){.md-sidebar.md-sidebar--post{padding:0;position:static;width:100%}.md-sidebar.md-sidebar--post .md-sidebar__scrollwrap{overflow:visible}.md-sidebar.md-sidebar--post .md-sidebar__inner{padding:0}.md-sidebar.md-sidebar--post .md-post__meta{margin-left:.6rem;margin-right:.6rem}.md-sidebar.md-sidebar--post .md-nav__item{border:none;display:inline}.md-sidebar.md-sidebar--post .md-nav__list{display:inline-flex;flex-wrap:wrap;gap:.6rem;padding-bottom:.6rem;padding-top:.6rem}.md-sidebar.md-sidebar--post .md-nav__link{padding:0}.md-sidebar.md-sidebar--post .md-nav{height:auto;margin-bottom:0;position:static}}:root{--md-progress-value:0;--md-progress-delay:400ms}.md-progress{background:var(--md-primary-bg-color);height:.075rem;opacity:min(clamp(0,var(--md-progress-value),1),clamp(0,100 - var(--md-progress-value),1));position:fixed;top:0;transform:scaleX(calc(var(--md-progress-value)*1%));transform-origin:left;transition:transform .5s cubic-bezier(.19,1,.22,1),opacity .25s var(--md-progress-delay);width:100%;z-index:4}:root{--md-search-result-icon:url('data:image/svg+xml;charset=utf-8,')}.md-search{position:relative}@media screen and (min-width:60em){.md-search{padding:.2rem 0}}.no-js .md-search{display:none}.md-search__overlay{opacity:0;z-index:1}@media screen and (max-width:59.984375em){[dir=ltr] .md-search__overlay{left:-2.2rem}[dir=rtl] .md-search__overlay{right:-2.2rem}.md-search__overlay{background-color:var(--md-default-bg-color);border-radius:1rem;height:2rem;overflow:hidden;pointer-events:none;position:absolute;top:-1rem;transform-origin:center;transition:transform .3s .1s,opacity .2s .2s;width:2rem}[data-md-toggle=search]:checked~.md-header .md-search__overlay{opacity:1;transition:transform .4s,opacity .1s}}@media screen and (min-width:60em){[dir=ltr] .md-search__overlay{left:0}[dir=rtl] .md-search__overlay{right:0}.md-search__overlay{background-color:#0000008a;cursor:pointer;height:0;position:fixed;top:0;transition:width 0ms .25s,height 0ms .25s,opacity .25s;width:0}[data-md-toggle=search]:checked~.md-header .md-search__overlay{height:200vh;opacity:1;transition:width 0ms,height 0ms,opacity .25s;width:100%}}@media screen and (max-width:29.984375em){[data-md-toggle=search]:checked~.md-header .md-search__overlay{transform:scale(45)}}@media screen and (min-width:30em) and (max-width:44.984375em){[data-md-toggle=search]:checked~.md-header .md-search__overlay{transform:scale(60)}}@media screen and (min-width:45em) and (max-width:59.984375em){[data-md-toggle=search]:checked~.md-header .md-search__overlay{transform:scale(75)}}.md-search__inner{-webkit-backface-visibility:hidden;backface-visibility:hidden}@media screen and (max-width:59.984375em){[dir=ltr] .md-search__inner{left:0}[dir=rtl] .md-search__inner{right:0}.md-search__inner{height:0;opacity:0;overflow:hidden;position:fixed;top:0;transform:translateX(5%);transition:width 0ms .3s,height 0ms .3s,transform .15s cubic-bezier(.4,0,.2,1) .15s,opacity .15s .15s;width:0;z-index:2}[dir=rtl] .md-search__inner{transform:translateX(-5%)}[data-md-toggle=search]:checked~.md-header .md-search__inner{height:100%;opacity:1;transform:translateX(0);transition:width 0ms 0ms,height 0ms 0ms,transform .15s cubic-bezier(.1,.7,.1,1) .15s,opacity .15s .15s;width:100%}}@media screen and (min-width:60em){[dir=ltr] .md-search__inner{float:right}[dir=rtl] .md-search__inner{float:left}.md-search__inner{padding:.1rem 0;position:relative;transition:width .25s cubic-bezier(.1,.7,.1,1);width:11.7rem}}@media screen and (min-width:60em) and (max-width:76.234375em){[data-md-toggle=search]:checked~.md-header .md-search__inner{width:23.4rem}}@media screen and (min-width:76.25em){[data-md-toggle=search]:checked~.md-header .md-search__inner{width:34.4rem}}.md-search__form{background-color:var(--md-default-bg-color);box-shadow:0 0 .6rem #0000;height:2.4rem;position:relative;transition:color .25s,background-color .25s;z-index:2}@media screen and (min-width:60em){.md-search__form{background-color:#00000042;border-radius:.1rem;height:1.8rem}.md-search__form:hover{background-color:#ffffff1f}}[data-md-toggle=search]:checked~.md-header .md-search__form{background-color:var(--md-default-bg-color);border-radius:.1rem .1rem 0 0;box-shadow:0 0 .6rem #00000012;color:var(--md-default-fg-color)}[dir=ltr] .md-search__input{padding-left:3.6rem;padding-right:2.2rem}[dir=rtl] .md-search__input{padding-left:2.2rem;padding-right:3.6rem}.md-search__input{background:#0000;font-size:.9rem;height:100%;position:relative;text-overflow:ellipsis;width:100%;z-index:2}.md-search__input::placeholder{transition:color .25s}.md-search__input::placeholder,.md-search__input~.md-search__icon{color:var(--md-default-fg-color--light)}.md-search__input::-ms-clear{display:none}@media screen and (max-width:59.984375em){.md-search__input{font-size:.9rem;height:2.4rem;width:100%}}@media screen and (min-width:60em){[dir=ltr] .md-search__input{padding-left:2.2rem}[dir=rtl] .md-search__input{padding-right:2.2rem}.md-search__input{color:inherit;font-size:.8rem}.md-search__input::placeholder{color:var(--md-primary-bg-color--light)}.md-search__input+.md-search__icon{color:var(--md-primary-bg-color)}[data-md-toggle=search]:checked~.md-header .md-search__input{text-overflow:clip}[data-md-toggle=search]:checked~.md-header .md-search__input+.md-search__icon{color:var(--md-default-fg-color--light)}[data-md-toggle=search]:checked~.md-header .md-search__input::placeholder{color:#0000}}.md-search__icon{cursor:pointer;display:inline-block;height:1.2rem;transition:color .25s,opacity .25s;width:1.2rem}.md-search__icon:hover{opacity:.7}[dir=ltr] .md-search__icon[for=__search]{left:.5rem}[dir=rtl] .md-search__icon[for=__search]{right:.5rem}.md-search__icon[for=__search]{position:absolute;top:.3rem;z-index:2}[dir=rtl] .md-search__icon[for=__search] svg{transform:scaleX(-1)}@media screen and (max-width:59.984375em){[dir=ltr] .md-search__icon[for=__search]{left:.8rem}[dir=rtl] .md-search__icon[for=__search]{right:.8rem}.md-search__icon[for=__search]{top:.6rem}.md-search__icon[for=__search] svg:first-child{display:none}}@media screen and (min-width:60em){.md-search__icon[for=__search]{pointer-events:none}.md-search__icon[for=__search] svg:last-child{display:none}}[dir=ltr] .md-search__options{right:.5rem}[dir=rtl] .md-search__options{left:.5rem}.md-search__options{pointer-events:none;position:absolute;top:.3rem;z-index:2}@media screen and (max-width:59.984375em){[dir=ltr] .md-search__options{right:.8rem}[dir=rtl] .md-search__options{left:.8rem}.md-search__options{top:.6rem}}[dir=ltr] .md-search__options>.md-icon{margin-left:.2rem}[dir=rtl] .md-search__options>.md-icon{margin-right:.2rem}.md-search__options>.md-icon{color:var(--md-default-fg-color--light);opacity:0;transform:scale(.75);transition:transform .15s cubic-bezier(.1,.7,.1,1),opacity .15s}.md-search__options>.md-icon:not(.focus-visible){-webkit-tap-highlight-color:transparent;outline:none}[data-md-toggle=search]:checked~.md-header .md-search__input:valid~.md-search__options>.md-icon{opacity:1;pointer-events:auto;transform:scale(1)}[data-md-toggle=search]:checked~.md-header .md-search__input:valid~.md-search__options>.md-icon:hover{opacity:.7}[dir=ltr] .md-search__suggest{padding-left:3.6rem;padding-right:2.2rem}[dir=rtl] .md-search__suggest{padding-left:2.2rem;padding-right:3.6rem}.md-search__suggest{align-items:center;color:var(--md-default-fg-color--lighter);display:flex;font-size:.9rem;height:100%;opacity:0;position:absolute;top:0;transition:opacity 50ms;white-space:nowrap;width:100%}@media screen and (min-width:60em){[dir=ltr] .md-search__suggest{padding-left:2.2rem}[dir=rtl] .md-search__suggest{padding-right:2.2rem}.md-search__suggest{font-size:.8rem}}[data-md-toggle=search]:checked~.md-header .md-search__suggest{opacity:1;transition:opacity .3s .1s}[dir=ltr] .md-search__output{border-bottom-left-radius:.1rem}[dir=ltr] .md-search__output,[dir=rtl] .md-search__output{border-bottom-right-radius:.1rem}[dir=rtl] .md-search__output{border-bottom-left-radius:.1rem}.md-search__output{overflow:hidden;position:absolute;width:100%;z-index:1}@media screen and (max-width:59.984375em){.md-search__output{bottom:0;top:2.4rem}}@media screen and (min-width:60em){.md-search__output{opacity:0;top:1.9rem;transition:opacity .4s}[data-md-toggle=search]:checked~.md-header .md-search__output{box-shadow:var(--md-shadow-z3);opacity:1}}.md-search__scrollwrap{-webkit-backface-visibility:hidden;backface-visibility:hidden;background-color:var(--md-default-bg-color);height:100%;overflow-y:auto;touch-action:pan-y}@media (-webkit-max-device-pixel-ratio:1),(max-resolution:1dppx){.md-search__scrollwrap{transform:translateZ(0)}}@media screen and (min-width:60em) and (max-width:76.234375em){.md-search__scrollwrap{width:23.4rem}}@media screen and (min-width:76.25em){.md-search__scrollwrap{width:34.4rem}}@media screen and (min-width:60em){.md-search__scrollwrap{max-height:0;scrollbar-color:var(--md-default-fg-color--lighter) #0000;scrollbar-width:thin}[data-md-toggle=search]:checked~.md-header .md-search__scrollwrap{max-height:75vh}.md-search__scrollwrap:hover{scrollbar-color:var(--md-accent-fg-color) #0000}.md-search__scrollwrap::-webkit-scrollbar{height:.2rem;width:.2rem}.md-search__scrollwrap::-webkit-scrollbar-thumb{background-color:var(--md-default-fg-color--lighter)}.md-search__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:var(--md-accent-fg-color)}}.md-search-result{color:var(--md-default-fg-color);word-break:break-word}.md-search-result__meta{background-color:var(--md-default-fg-color--lightest);color:var(--md-default-fg-color--light);font-size:.64rem;line-height:1.8rem;padding:0 .8rem;scroll-snap-align:start}@media screen and (min-width:60em){[dir=ltr] .md-search-result__meta{padding-left:2.2rem}[dir=rtl] .md-search-result__meta{padding-right:2.2rem}}.md-search-result__list{list-style:none;margin:0;padding:0;-webkit-user-select:none;user-select:none}.md-search-result__item{box-shadow:0 -.05rem var(--md-default-fg-color--lightest)}.md-search-result__item:first-child{box-shadow:none}.md-search-result__link{display:block;outline:none;scroll-snap-align:start;transition:background-color .25s}.md-search-result__link:focus,.md-search-result__link:hover{background-color:var(--md-accent-fg-color--transparent)}.md-search-result__link:last-child p:last-child{margin-bottom:.6rem}.md-search-result__more>summary{cursor:pointer;display:block;outline:none;position:sticky;scroll-snap-align:start;top:0;z-index:1}.md-search-result__more>summary::marker{display:none}.md-search-result__more>summary::-webkit-details-marker{display:none}.md-search-result__more>summary>div{color:var(--md-typeset-a-color);font-size:.64rem;padding:.75em .8rem;transition:color .25s,background-color .25s}@media screen and (min-width:60em){[dir=ltr] .md-search-result__more>summary>div{padding-left:2.2rem}[dir=rtl] .md-search-result__more>summary>div{padding-right:2.2rem}}.md-search-result__more>summary:focus>div,.md-search-result__more>summary:hover>div{background-color:var(--md-accent-fg-color--transparent);color:var(--md-accent-fg-color)}.md-search-result__more[open]>summary{background-color:var(--md-default-bg-color)}.md-search-result__article{overflow:hidden;padding:0 .8rem;position:relative}@media screen and (min-width:60em){[dir=ltr] .md-search-result__article{padding-left:2.2rem}[dir=rtl] .md-search-result__article{padding-right:2.2rem}}[dir=ltr] .md-search-result__icon{left:0}[dir=rtl] .md-search-result__icon{right:0}.md-search-result__icon{color:var(--md-default-fg-color--light);height:1.2rem;margin:.5rem;position:absolute;width:1.2rem}@media screen and (max-width:59.984375em){.md-search-result__icon{display:none}}.md-search-result__icon:after{background-color:currentcolor;content:"";display:inline-block;height:100%;-webkit-mask-image:var(--md-search-result-icon);mask-image:var(--md-search-result-icon);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;width:100%}[dir=rtl] .md-search-result__icon:after{transform:scaleX(-1)}.md-search-result .md-typeset{color:var(--md-default-fg-color--light);font-size:.64rem;line-height:1.6}.md-search-result .md-typeset h1{color:var(--md-default-fg-color);font-size:.8rem;font-weight:400;line-height:1.4;margin:.55rem 0}.md-search-result .md-typeset h1 mark{text-decoration:none}.md-search-result .md-typeset h2{color:var(--md-default-fg-color);font-size:.64rem;font-weight:700;line-height:1.6;margin:.5em 0}.md-search-result .md-typeset h2 mark{text-decoration:none}.md-search-result__terms{color:var(--md-default-fg-color);display:block;font-size:.64rem;font-style:italic;margin:.5em 0}.md-search-result mark{background-color:initial;color:var(--md-accent-fg-color);text-decoration:underline}.md-select{position:relative;z-index:1}.md-select__inner{background-color:var(--md-default-bg-color);border-radius:.1rem;box-shadow:var(--md-shadow-z2);color:var(--md-default-fg-color);left:50%;margin-top:.2rem;max-height:0;opacity:0;position:absolute;top:calc(100% - .2rem);transform:translate3d(-50%,.3rem,0);transition:transform .25s 375ms,opacity .25s .25s,max-height 0ms .5s}.md-select:focus-within .md-select__inner,.md-select:hover .md-select__inner{max-height:10rem;opacity:1;transform:translate3d(-50%,0,0);transition:transform .25s cubic-bezier(.1,.7,.1,1),opacity .25s,max-height 0ms}.md-select__inner:after{border-bottom:.2rem solid #0000;border-bottom-color:var(--md-default-bg-color);border-left:.2rem solid #0000;border-right:.2rem solid #0000;border-top:0;content:"";height:0;left:50%;margin-left:-.2rem;margin-top:-.2rem;position:absolute;top:0;width:0}.md-select__list{border-radius:.1rem;font-size:.8rem;list-style-type:none;margin:0;max-height:inherit;overflow:auto;padding:0}.md-select__item{line-height:1.8rem}[dir=ltr] .md-select__link{padding-left:.6rem;padding-right:1.2rem}[dir=rtl] .md-select__link{padding-left:1.2rem;padding-right:.6rem}.md-select__link{cursor:pointer;display:block;outline:none;scroll-snap-align:start;transition:background-color .25s,color .25s;width:100%}.md-select__link:focus,.md-select__link:hover{color:var(--md-accent-fg-color)}.md-select__link:focus{background-color:var(--md-default-fg-color--lightest)}.md-sidebar{align-self:flex-start;flex-shrink:0;padding:1.2rem 0;position:sticky;top:2.4rem;width:12.1rem}@media print{.md-sidebar{display:none}}@media screen and (max-width:76.234375em){[dir=ltr] .md-sidebar--primary{left:-12.1rem}[dir=rtl] .md-sidebar--primary{right:-12.1rem}.md-sidebar--primary{background-color:var(--md-default-bg-color);display:block;height:100%;position:fixed;top:0;transform:translateX(0);transition:transform .25s cubic-bezier(.4,0,.2,1),box-shadow .25s;width:12.1rem;z-index:5}[data-md-toggle=drawer]:checked~.md-container .md-sidebar--primary{box-shadow:var(--md-shadow-z3);transform:translateX(12.1rem)}[dir=rtl] [data-md-toggle=drawer]:checked~.md-container .md-sidebar--primary{transform:translateX(-12.1rem)}.md-sidebar--primary .md-sidebar__scrollwrap{bottom:0;left:0;margin:0;overflow:hidden;position:absolute;right:0;scroll-snap-type:none;top:0}}@media screen and (min-width:76.25em){.md-sidebar{height:0}.no-js .md-sidebar{height:auto}.md-header--lifted~.md-container .md-sidebar{top:4.8rem}}.md-sidebar--secondary{display:none;order:2}@media screen and (min-width:60em){.md-sidebar--secondary{height:0}.no-js .md-sidebar--secondary{height:auto}.md-sidebar--secondary:not([hidden]){display:block}.md-sidebar--secondary .md-sidebar__scrollwrap{touch-action:pan-y}}.md-sidebar__scrollwrap{scrollbar-gutter:stable;-webkit-backface-visibility:hidden;backface-visibility:hidden;margin:0 .2rem;overflow-y:auto;scrollbar-color:var(--md-default-fg-color--lighter) #0000;scrollbar-width:thin}.md-sidebar__scrollwrap::-webkit-scrollbar{height:.2rem;width:.2rem}.md-sidebar__scrollwrap:focus-within,.md-sidebar__scrollwrap:hover{scrollbar-color:var(--md-accent-fg-color) #0000}.md-sidebar__scrollwrap:focus-within::-webkit-scrollbar-thumb,.md-sidebar__scrollwrap:hover::-webkit-scrollbar-thumb{background-color:var(--md-default-fg-color--lighter)}.md-sidebar__scrollwrap:focus-within::-webkit-scrollbar-thumb:hover,.md-sidebar__scrollwrap:hover::-webkit-scrollbar-thumb:hover{background-color:var(--md-accent-fg-color)}@supports selector(::-webkit-scrollbar){.md-sidebar__scrollwrap{scrollbar-gutter:auto}[dir=ltr] .md-sidebar__inner{padding-right:calc(100% - 11.5rem)}[dir=rtl] .md-sidebar__inner{padding-left:calc(100% - 11.5rem)}}@media screen and (max-width:76.234375em){.md-overlay{background-color:#0000008a;height:0;opacity:0;position:fixed;top:0;transition:width 0ms .25s,height 0ms .25s,opacity .25s;width:0;z-index:5}[data-md-toggle=drawer]:checked~.md-overlay{height:100%;opacity:1;transition:width 0ms,height 0ms,opacity .25s;width:100%}}@keyframes facts{0%{height:0}to{height:.65rem}}@keyframes fact{0%{opacity:0;transform:translateY(100%)}50%{opacity:0}to{opacity:1;transform:translateY(0)}}:root{--md-source-forks-icon:url('data:image/svg+xml;charset=utf-8,');--md-source-repositories-icon:url('data:image/svg+xml;charset=utf-8,');--md-source-stars-icon:url('data:image/svg+xml;charset=utf-8,');--md-source-version-icon:url('data:image/svg+xml;charset=utf-8,')}.md-source{-webkit-backface-visibility:hidden;backface-visibility:hidden;display:block;font-size:.65rem;line-height:1.2;outline-color:var(--md-accent-fg-color);transition:opacity .25s;white-space:nowrap}.md-source:hover{opacity:.7}.md-source__icon{display:inline-block;height:2.4rem;vertical-align:middle;width:2rem}[dir=ltr] .md-source__icon svg{margin-left:.6rem}[dir=rtl] .md-source__icon svg{margin-right:.6rem}.md-source__icon svg{margin-top:.6rem}[dir=ltr] .md-source__icon+.md-source__repository{padding-left:2rem}[dir=rtl] .md-source__icon+.md-source__repository{padding-right:2rem}[dir=ltr] .md-source__icon+.md-source__repository{margin-left:-2rem}[dir=rtl] .md-source__icon+.md-source__repository{margin-right:-2rem}[dir=ltr] .md-source__repository{margin-left:.6rem}[dir=rtl] .md-source__repository{margin-right:.6rem}.md-source__repository{display:inline-block;max-width:calc(100% - 1.2rem);overflow:hidden;text-overflow:ellipsis;vertical-align:middle}.md-source__facts{display:flex;font-size:.55rem;gap:.4rem;list-style-type:none;margin:.1rem 0 0;opacity:.75;overflow:hidden;padding:0;width:100%}.md-source__repository--active .md-source__facts{animation:facts .25s ease-in}.md-source__fact{overflow:hidden;text-overflow:ellipsis}.md-source__repository--active .md-source__fact{animation:fact .4s ease-out}[dir=ltr] .md-source__fact:before{margin-right:.1rem}[dir=rtl] .md-source__fact:before{margin-left:.1rem}.md-source__fact:before{background-color:currentcolor;content:"";display:inline-block;height:.6rem;-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;vertical-align:text-top;width:.6rem}.md-source__fact:nth-child(1n+2){flex-shrink:0}.md-source__fact--version:before{-webkit-mask-image:var(--md-source-version-icon);mask-image:var(--md-source-version-icon)}.md-source__fact--stars:before{-webkit-mask-image:var(--md-source-stars-icon);mask-image:var(--md-source-stars-icon)}.md-source__fact--forks:before{-webkit-mask-image:var(--md-source-forks-icon);mask-image:var(--md-source-forks-icon)}.md-source__fact--repositories:before{-webkit-mask-image:var(--md-source-repositories-icon);mask-image:var(--md-source-repositories-icon)}:root{--md-status:url('data:image/svg+xml;charset=utf-8,');--md-status--new:url('data:image/svg+xml;charset=utf-8,');--md-status--deprecated:url('data:image/svg+xml;charset=utf-8,');--md-status--encrypted:url('data:image/svg+xml;charset=utf-8,')}.md-status:after{background-color:var(--md-default-fg-color--light);content:"";display:inline-block;height:1.125em;-webkit-mask-image:var(--md-status);mask-image:var(--md-status);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;vertical-align:text-bottom;width:1.125em}.md-status:hover:after{background-color:currentcolor}.md-status--new:after{-webkit-mask-image:var(--md-status--new);mask-image:var(--md-status--new)}.md-status--deprecated:after{-webkit-mask-image:var(--md-status--deprecated);mask-image:var(--md-status--deprecated)}.md-status--encrypted:after{-webkit-mask-image:var(--md-status--encrypted);mask-image:var(--md-status--encrypted)}.md-tabs{background-color:var(--md-primary-fg-color);color:var(--md-primary-bg-color);display:block;line-height:1.3;overflow:auto;width:100%;z-index:3}@media print{.md-tabs{display:none}}@media screen and (max-width:76.234375em){.md-tabs{display:none}}.md-tabs[hidden]{pointer-events:none}[dir=ltr] .md-tabs__list{margin-left:.2rem}[dir=rtl] .md-tabs__list{margin-right:.2rem}.md-tabs__list{contain:content;display:flex;list-style:none;margin:0;overflow:auto;padding:0;scrollbar-width:none;white-space:nowrap}.md-tabs__list::-webkit-scrollbar{display:none}.md-tabs__item{height:2.4rem;padding-left:.6rem;padding-right:.6rem}.md-tabs__item--active .md-tabs__link{color:inherit;opacity:1}.md-tabs__link{-webkit-backface-visibility:hidden;backface-visibility:hidden;display:flex;font-size:.7rem;margin-top:.8rem;opacity:.7;outline-color:var(--md-accent-fg-color);outline-offset:.2rem;transition:transform .4s cubic-bezier(.1,.7,.1,1),opacity .25s}.md-tabs__link:focus,.md-tabs__link:hover{color:inherit;opacity:1}[dir=ltr] .md-tabs__link svg{margin-right:.4rem}[dir=rtl] .md-tabs__link svg{margin-left:.4rem}.md-tabs__link svg{fill:currentcolor;height:1.3em}.md-tabs__item:nth-child(2) .md-tabs__link{transition-delay:20ms}.md-tabs__item:nth-child(3) .md-tabs__link{transition-delay:40ms}.md-tabs__item:nth-child(4) .md-tabs__link{transition-delay:60ms}.md-tabs__item:nth-child(5) .md-tabs__link{transition-delay:80ms}.md-tabs__item:nth-child(6) .md-tabs__link{transition-delay:.1s}.md-tabs__item:nth-child(7) .md-tabs__link{transition-delay:.12s}.md-tabs__item:nth-child(8) .md-tabs__link{transition-delay:.14s}.md-tabs__item:nth-child(9) .md-tabs__link{transition-delay:.16s}.md-tabs__item:nth-child(10) .md-tabs__link{transition-delay:.18s}.md-tabs__item:nth-child(11) .md-tabs__link{transition-delay:.2s}.md-tabs__item:nth-child(12) .md-tabs__link{transition-delay:.22s}.md-tabs__item:nth-child(13) .md-tabs__link{transition-delay:.24s}.md-tabs__item:nth-child(14) .md-tabs__link{transition-delay:.26s}.md-tabs__item:nth-child(15) .md-tabs__link{transition-delay:.28s}.md-tabs__item:nth-child(16) .md-tabs__link{transition-delay:.3s}.md-tabs[hidden] .md-tabs__link{opacity:0;transform:translateY(50%);transition:transform 0ms .1s,opacity .1s}:root{--md-tag-icon:url('data:image/svg+xml;charset=utf-8,')}.md-typeset .md-tags:not([hidden]){display:inline-flex;flex-wrap:wrap;gap:.5em;margin-bottom:.75em;margin-top:-.125em}.md-typeset .md-tag{align-items:center;background:var(--md-default-fg-color--lightest);border-radius:2.4rem;display:inline-flex;font-size:.64rem;font-size:min(.8em,.64rem);font-weight:700;gap:.5em;letter-spacing:normal;line-height:1.6;padding:.3125em .78125em}.md-typeset .md-tag[href]{-webkit-tap-highlight-color:transparent;color:inherit;outline:none;transition:color 125ms,background-color 125ms}.md-typeset .md-tag[href]:focus,.md-typeset .md-tag[href]:hover{background-color:var(--md-accent-fg-color);color:var(--md-accent-bg-color)}[id]>.md-typeset .md-tag{vertical-align:text-top}.md-typeset .md-tag-icon:before{background-color:var(--md-default-fg-color--lighter);content:"";display:inline-block;height:1.2em;-webkit-mask-image:var(--md-tag-icon);mask-image:var(--md-tag-icon);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;transition:background-color 125ms;vertical-align:text-bottom;width:1.2em}.md-typeset .md-tag-icon[href]:focus:before,.md-typeset .md-tag-icon[href]:hover:before{background-color:var(--md-accent-bg-color)}@keyframes pulse{0%{transform:scale(.95)}75%{transform:scale(1)}to{transform:scale(.95)}}:root{--md-annotation-bg-icon:url('data:image/svg+xml;charset=utf-8,');--md-annotation-icon:url('data:image/svg+xml;charset=utf-8,');--md-tooltip-width:20rem}.md-tooltip{-webkit-backface-visibility:hidden;backface-visibility:hidden;background-color:var(--md-default-bg-color);border-radius:.1rem;box-shadow:var(--md-shadow-z2);color:var(--md-default-fg-color);font-family:var(--md-text-font-family);left:clamp(var(--md-tooltip-0,0rem) + .8rem,var(--md-tooltip-x),100vw + var(--md-tooltip-0,0rem) + .8rem - var(--md-tooltip-width) - 2 * .8rem);max-width:calc(100vw - 1.6rem);opacity:0;position:absolute;top:var(--md-tooltip-y);transform:translateY(-.4rem);transition:transform 0ms .25s,opacity .25s,z-index .25s;width:var(--md-tooltip-width);z-index:0}.md-tooltip--active{opacity:1;transform:translateY(0);transition:transform .25s cubic-bezier(.1,.7,.1,1),opacity .25s,z-index 0ms;z-index:2}.focus-visible>.md-tooltip,.md-tooltip:target{outline:var(--md-accent-fg-color) auto}.md-tooltip__inner{font-size:.64rem;padding:.8rem}.md-tooltip__inner.md-typeset>:first-child{margin-top:0}.md-tooltip__inner.md-typeset>:last-child{margin-bottom:0}.md-annotation{font-weight:400;outline:none;vertical-align:text-bottom;white-space:normal}[dir=rtl] .md-annotation{direction:rtl}code .md-annotation{font-family:var(--md-code-font-family);font-size:inherit}.md-annotation:not([hidden]){display:inline-block;line-height:1.25}.md-annotation__index{border-radius:.01px;cursor:pointer;display:inline-block;margin-left:.4ch;margin-right:.4ch;outline:none;overflow:hidden;position:relative;-webkit-user-select:none;user-select:none;vertical-align:text-top;z-index:0}.md-annotation .md-annotation__index{transition:z-index .25s}@media screen{.md-annotation__index{width:2.2ch}[data-md-visible]>.md-annotation__index{animation:pulse 2s infinite}.md-annotation__index:before{background:var(--md-default-bg-color);-webkit-mask-image:var(--md-annotation-bg-icon);mask-image:var(--md-annotation-bg-icon)}.md-annotation__index:after,.md-annotation__index:before{content:"";height:2.2ch;-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;position:absolute;top:-.1ch;width:2.2ch;z-index:-1}.md-annotation__index:after{background-color:var(--md-default-fg-color--lighter);-webkit-mask-image:var(--md-annotation-icon);mask-image:var(--md-annotation-icon);transform:scale(1.0001);transition:background-color .25s,transform .25s}.md-tooltip--active+.md-annotation__index:after{transform:rotate(45deg)}.md-tooltip--active+.md-annotation__index:after,:hover>.md-annotation__index:after{background-color:var(--md-accent-fg-color)}}.md-tooltip--active+.md-annotation__index{animation-play-state:paused;transition-duration:0ms;z-index:2}.md-annotation__index [data-md-annotation-id]{display:inline-block}@media print{.md-annotation__index [data-md-annotation-id]{background:var(--md-default-fg-color--lighter);border-radius:2ch;color:var(--md-default-bg-color);font-weight:700;padding:0 .6ch;white-space:nowrap}.md-annotation__index [data-md-annotation-id]:after{content:attr(data-md-annotation-id)}}.md-typeset .md-annotation-list{counter-reset:xxx;list-style:none}.md-typeset .md-annotation-list li{position:relative}[dir=ltr] .md-typeset .md-annotation-list li:before{left:-2.125em}[dir=rtl] .md-typeset .md-annotation-list li:before{right:-2.125em}.md-typeset .md-annotation-list li:before{background:var(--md-default-fg-color--lighter);border-radius:2ch;color:var(--md-default-bg-color);content:counter(xxx);counter-increment:xxx;font-size:.8875em;font-weight:700;height:2ch;line-height:1.25;min-width:2ch;padding:0 .6ch;position:absolute;text-align:center;top:.25em}[dir=ltr] .md-top{margin-left:50%}[dir=rtl] .md-top{margin-right:50%}.md-top{background-color:var(--md-default-bg-color);border-radius:1.6rem;box-shadow:var(--md-shadow-z2);color:var(--md-default-fg-color--light);cursor:pointer;display:block;font-size:.7rem;outline:none;padding:.4rem .8rem;position:fixed;top:3.2rem;transform:translate(-50%);transition:color 125ms,background-color 125ms,transform 125ms cubic-bezier(.4,0,.2,1),opacity 125ms;z-index:2}@media print{.md-top{display:none}}[dir=rtl] .md-top{transform:translate(50%)}.md-top[hidden]{opacity:0;pointer-events:none;transform:translate(-50%,.2rem);transition-duration:0ms}[dir=rtl] .md-top[hidden]{transform:translate(50%,.2rem)}.md-top:focus,.md-top:hover{background-color:var(--md-accent-fg-color);color:var(--md-accent-bg-color)}.md-top svg{display:inline-block;vertical-align:-.5em}@keyframes hoverfix{0%{pointer-events:none}}:root{--md-version-icon:url('data:image/svg+xml;charset=utf-8,')}.md-version{flex-shrink:0;font-size:.8rem;height:2.4rem}[dir=ltr] .md-version__current{margin-left:1.4rem;margin-right:.4rem}[dir=rtl] .md-version__current{margin-left:.4rem;margin-right:1.4rem}.md-version__current{color:inherit;cursor:pointer;outline:none;position:relative;top:.05rem}[dir=ltr] .md-version__current:after{margin-left:.4rem}[dir=rtl] .md-version__current:after{margin-right:.4rem}.md-version__current:after{background-color:currentcolor;content:"";display:inline-block;height:.6rem;-webkit-mask-image:var(--md-version-icon);mask-image:var(--md-version-icon);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;width:.4rem}.md-version__list{background-color:var(--md-default-bg-color);border-radius:.1rem;box-shadow:var(--md-shadow-z2);color:var(--md-default-fg-color);list-style-type:none;margin:.2rem .8rem;max-height:0;opacity:0;overflow:auto;padding:0;position:absolute;scroll-snap-type:y mandatory;top:.15rem;transition:max-height 0ms .5s,opacity .25s .25s;z-index:3}.md-version:focus-within .md-version__list,.md-version:hover .md-version__list{max-height:10rem;opacity:1;transition:max-height 0ms,opacity .25s}@media (hover:none),(pointer:coarse){.md-version:hover .md-version__list{animation:hoverfix .25s forwards}.md-version:focus-within .md-version__list{animation:none}}.md-version__item{line-height:1.8rem}[dir=ltr] .md-version__link{padding-left:.6rem;padding-right:1.2rem}[dir=rtl] .md-version__link{padding-left:1.2rem;padding-right:.6rem}.md-version__link{cursor:pointer;display:block;outline:none;scroll-snap-align:start;transition:color .25s,background-color .25s;white-space:nowrap;width:100%}.md-version__link:focus,.md-version__link:hover{color:var(--md-accent-fg-color)}.md-version__link:focus{background-color:var(--md-default-fg-color--lightest)}:root{--md-admonition-icon--note:url('data:image/svg+xml;charset=utf-8,');--md-admonition-icon--abstract:url('data:image/svg+xml;charset=utf-8,');--md-admonition-icon--info:url('data:image/svg+xml;charset=utf-8,');--md-admonition-icon--tip:url('data:image/svg+xml;charset=utf-8,');--md-admonition-icon--success:url('data:image/svg+xml;charset=utf-8,');--md-admonition-icon--question:url('data:image/svg+xml;charset=utf-8,');--md-admonition-icon--warning:url('data:image/svg+xml;charset=utf-8,');--md-admonition-icon--failure:url('data:image/svg+xml;charset=utf-8,');--md-admonition-icon--danger:url('data:image/svg+xml;charset=utf-8,');--md-admonition-icon--bug:url('data:image/svg+xml;charset=utf-8,');--md-admonition-icon--example:url('data:image/svg+xml;charset=utf-8,');--md-admonition-icon--quote:url('data:image/svg+xml;charset=utf-8,')}.md-typeset .admonition,.md-typeset details{background-color:var(--md-admonition-bg-color);border:.075rem solid #448aff;border-radius:.2rem;box-shadow:var(--md-shadow-z1);color:var(--md-admonition-fg-color);display:flow-root;font-size:.64rem;margin:1.5625em 0;padding:0 .6rem;page-break-inside:avoid;transition:box-shadow 125ms}@media print{.md-typeset .admonition,.md-typeset details{box-shadow:none}}.md-typeset .admonition:focus-within,.md-typeset details:focus-within{box-shadow:0 0 0 .2rem #448aff1a}.md-typeset .admonition>*,.md-typeset details>*{box-sizing:border-box}.md-typeset .admonition .admonition,.md-typeset .admonition details,.md-typeset details .admonition,.md-typeset details details{margin-bottom:1em;margin-top:1em}.md-typeset .admonition .md-typeset__scrollwrap,.md-typeset details .md-typeset__scrollwrap{margin:1em -.6rem}.md-typeset .admonition .md-typeset__table,.md-typeset details .md-typeset__table{padding:0 .6rem}.md-typeset .admonition>.tabbed-set:only-child,.md-typeset details>.tabbed-set:only-child{margin-top:0}html .md-typeset .admonition>:last-child,html .md-typeset details>:last-child{margin-bottom:.6rem}[dir=ltr] .md-typeset .admonition-title,[dir=ltr] .md-typeset summary{padding-left:2rem;padding-right:.6rem}[dir=rtl] .md-typeset .admonition-title,[dir=rtl] .md-typeset summary{padding-left:.6rem;padding-right:2rem}[dir=ltr] .md-typeset .admonition-title,[dir=ltr] .md-typeset summary{border-left-width:.2rem}[dir=rtl] .md-typeset .admonition-title,[dir=rtl] .md-typeset summary{border-right-width:.2rem}[dir=ltr] .md-typeset .admonition-title,[dir=ltr] .md-typeset summary{border-top-left-radius:.1rem}[dir=ltr] .md-typeset .admonition-title,[dir=ltr] .md-typeset summary,[dir=rtl] .md-typeset .admonition-title,[dir=rtl] .md-typeset summary{border-top-right-radius:.1rem}[dir=rtl] .md-typeset .admonition-title,[dir=rtl] .md-typeset summary{border-top-left-radius:.1rem}.md-typeset .admonition-title,.md-typeset summary{background-color:#448aff1a;border:none;font-weight:700;margin:0 -.6rem;padding-bottom:.4rem;padding-top:.4rem;position:relative}html .md-typeset .admonition-title:last-child,html .md-typeset summary:last-child{margin-bottom:0}[dir=ltr] .md-typeset .admonition-title:before,[dir=ltr] .md-typeset summary:before{left:.6rem}[dir=rtl] .md-typeset .admonition-title:before,[dir=rtl] .md-typeset summary:before{right:.6rem}.md-typeset .admonition-title:before,.md-typeset summary:before{background-color:#448aff;content:"";height:1rem;-webkit-mask-image:var(--md-admonition-icon--note);mask-image:var(--md-admonition-icon--note);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;position:absolute;top:.625em;width:1rem}.md-typeset .admonition-title code,.md-typeset summary code{box-shadow:0 0 0 .05rem var(--md-default-fg-color--lightest)}.md-typeset .admonition.note,.md-typeset details.note{border-color:#448aff}.md-typeset .admonition.note:focus-within,.md-typeset details.note:focus-within{box-shadow:0 0 0 .2rem #448aff1a}.md-typeset .note>.admonition-title,.md-typeset .note>summary{background-color:#448aff1a}.md-typeset .note>.admonition-title:before,.md-typeset .note>summary:before{background-color:#448aff;-webkit-mask-image:var(--md-admonition-icon--note);mask-image:var(--md-admonition-icon--note)}.md-typeset .note>.admonition-title:after,.md-typeset .note>summary:after{color:#448aff}.md-typeset .admonition.abstract,.md-typeset details.abstract{border-color:#00b0ff}.md-typeset .admonition.abstract:focus-within,.md-typeset details.abstract:focus-within{box-shadow:0 0 0 .2rem #00b0ff1a}.md-typeset .abstract>.admonition-title,.md-typeset .abstract>summary{background-color:#00b0ff1a}.md-typeset .abstract>.admonition-title:before,.md-typeset .abstract>summary:before{background-color:#00b0ff;-webkit-mask-image:var(--md-admonition-icon--abstract);mask-image:var(--md-admonition-icon--abstract)}.md-typeset .abstract>.admonition-title:after,.md-typeset .abstract>summary:after{color:#00b0ff}.md-typeset .admonition.info,.md-typeset details.info{border-color:#00b8d4}.md-typeset .admonition.info:focus-within,.md-typeset details.info:focus-within{box-shadow:0 0 0 .2rem #00b8d41a}.md-typeset .info>.admonition-title,.md-typeset .info>summary{background-color:#00b8d41a}.md-typeset .info>.admonition-title:before,.md-typeset .info>summary:before{background-color:#00b8d4;-webkit-mask-image:var(--md-admonition-icon--info);mask-image:var(--md-admonition-icon--info)}.md-typeset .info>.admonition-title:after,.md-typeset .info>summary:after{color:#00b8d4}.md-typeset .admonition.tip,.md-typeset details.tip{border-color:#00bfa5}.md-typeset .admonition.tip:focus-within,.md-typeset details.tip:focus-within{box-shadow:0 0 0 .2rem #00bfa51a}.md-typeset .tip>.admonition-title,.md-typeset .tip>summary{background-color:#00bfa51a}.md-typeset .tip>.admonition-title:before,.md-typeset .tip>summary:before{background-color:#00bfa5;-webkit-mask-image:var(--md-admonition-icon--tip);mask-image:var(--md-admonition-icon--tip)}.md-typeset .tip>.admonition-title:after,.md-typeset .tip>summary:after{color:#00bfa5}.md-typeset .admonition.success,.md-typeset details.success{border-color:#00c853}.md-typeset .admonition.success:focus-within,.md-typeset details.success:focus-within{box-shadow:0 0 0 .2rem #00c8531a}.md-typeset .success>.admonition-title,.md-typeset .success>summary{background-color:#00c8531a}.md-typeset .success>.admonition-title:before,.md-typeset .success>summary:before{background-color:#00c853;-webkit-mask-image:var(--md-admonition-icon--success);mask-image:var(--md-admonition-icon--success)}.md-typeset .success>.admonition-title:after,.md-typeset .success>summary:after{color:#00c853}.md-typeset .admonition.question,.md-typeset details.question{border-color:#64dd17}.md-typeset .admonition.question:focus-within,.md-typeset details.question:focus-within{box-shadow:0 0 0 .2rem #64dd171a}.md-typeset .question>.admonition-title,.md-typeset .question>summary{background-color:#64dd171a}.md-typeset .question>.admonition-title:before,.md-typeset .question>summary:before{background-color:#64dd17;-webkit-mask-image:var(--md-admonition-icon--question);mask-image:var(--md-admonition-icon--question)}.md-typeset .question>.admonition-title:after,.md-typeset .question>summary:after{color:#64dd17}.md-typeset .admonition.warning,.md-typeset details.warning{border-color:#ff9100}.md-typeset .admonition.warning:focus-within,.md-typeset details.warning:focus-within{box-shadow:0 0 0 .2rem #ff91001a}.md-typeset .warning>.admonition-title,.md-typeset .warning>summary{background-color:#ff91001a}.md-typeset .warning>.admonition-title:before,.md-typeset .warning>summary:before{background-color:#ff9100;-webkit-mask-image:var(--md-admonition-icon--warning);mask-image:var(--md-admonition-icon--warning)}.md-typeset .warning>.admonition-title:after,.md-typeset .warning>summary:after{color:#ff9100}.md-typeset .admonition.failure,.md-typeset details.failure{border-color:#ff5252}.md-typeset .admonition.failure:focus-within,.md-typeset details.failure:focus-within{box-shadow:0 0 0 .2rem #ff52521a}.md-typeset .failure>.admonition-title,.md-typeset .failure>summary{background-color:#ff52521a}.md-typeset .failure>.admonition-title:before,.md-typeset .failure>summary:before{background-color:#ff5252;-webkit-mask-image:var(--md-admonition-icon--failure);mask-image:var(--md-admonition-icon--failure)}.md-typeset .failure>.admonition-title:after,.md-typeset .failure>summary:after{color:#ff5252}.md-typeset .admonition.danger,.md-typeset details.danger{border-color:#ff1744}.md-typeset .admonition.danger:focus-within,.md-typeset details.danger:focus-within{box-shadow:0 0 0 .2rem #ff17441a}.md-typeset .danger>.admonition-title,.md-typeset .danger>summary{background-color:#ff17441a}.md-typeset .danger>.admonition-title:before,.md-typeset .danger>summary:before{background-color:#ff1744;-webkit-mask-image:var(--md-admonition-icon--danger);mask-image:var(--md-admonition-icon--danger)}.md-typeset .danger>.admonition-title:after,.md-typeset .danger>summary:after{color:#ff1744}.md-typeset .admonition.bug,.md-typeset details.bug{border-color:#f50057}.md-typeset .admonition.bug:focus-within,.md-typeset details.bug:focus-within{box-shadow:0 0 0 .2rem #f500571a}.md-typeset .bug>.admonition-title,.md-typeset .bug>summary{background-color:#f500571a}.md-typeset .bug>.admonition-title:before,.md-typeset .bug>summary:before{background-color:#f50057;-webkit-mask-image:var(--md-admonition-icon--bug);mask-image:var(--md-admonition-icon--bug)}.md-typeset .bug>.admonition-title:after,.md-typeset .bug>summary:after{color:#f50057}.md-typeset .admonition.example,.md-typeset details.example{border-color:#7c4dff}.md-typeset .admonition.example:focus-within,.md-typeset details.example:focus-within{box-shadow:0 0 0 .2rem #7c4dff1a}.md-typeset .example>.admonition-title,.md-typeset .example>summary{background-color:#7c4dff1a}.md-typeset .example>.admonition-title:before,.md-typeset .example>summary:before{background-color:#7c4dff;-webkit-mask-image:var(--md-admonition-icon--example);mask-image:var(--md-admonition-icon--example)}.md-typeset .example>.admonition-title:after,.md-typeset .example>summary:after{color:#7c4dff}.md-typeset .admonition.quote,.md-typeset details.quote{border-color:#9e9e9e}.md-typeset .admonition.quote:focus-within,.md-typeset details.quote:focus-within{box-shadow:0 0 0 .2rem #9e9e9e1a}.md-typeset .quote>.admonition-title,.md-typeset .quote>summary{background-color:#9e9e9e1a}.md-typeset .quote>.admonition-title:before,.md-typeset .quote>summary:before{background-color:#9e9e9e;-webkit-mask-image:var(--md-admonition-icon--quote);mask-image:var(--md-admonition-icon--quote)}.md-typeset .quote>.admonition-title:after,.md-typeset .quote>summary:after{color:#9e9e9e}:root{--md-footnotes-icon:url('data:image/svg+xml;charset=utf-8,')}.md-typeset .footnote{color:var(--md-default-fg-color--light);font-size:.64rem}[dir=ltr] .md-typeset .footnote>ol{margin-left:0}[dir=rtl] .md-typeset .footnote>ol{margin-right:0}.md-typeset .footnote>ol>li{transition:color 125ms}.md-typeset .footnote>ol>li:target{color:var(--md-default-fg-color)}.md-typeset .footnote>ol>li:focus-within .footnote-backref{opacity:1;transform:translateX(0);transition:none}.md-typeset .footnote>ol>li:hover .footnote-backref,.md-typeset .footnote>ol>li:target .footnote-backref{opacity:1;transform:translateX(0)}.md-typeset .footnote>ol>li>:first-child{margin-top:0}.md-typeset .footnote-ref{font-size:.75em;font-weight:700}html .md-typeset .footnote-ref{outline-offset:.1rem}.md-typeset [id^="fnref:"]:target>.footnote-ref{outline:auto}.md-typeset .footnote-backref{color:var(--md-typeset-a-color);display:inline-block;font-size:0;opacity:0;transform:translateX(.25rem);transition:color .25s,transform .25s .25s,opacity 125ms .25s;vertical-align:text-bottom}@media print{.md-typeset .footnote-backref{color:var(--md-typeset-a-color);opacity:1;transform:translateX(0)}}[dir=rtl] .md-typeset .footnote-backref{transform:translateX(-.25rem)}.md-typeset .footnote-backref:hover{color:var(--md-accent-fg-color)}.md-typeset .footnote-backref:before{background-color:currentcolor;content:"";display:inline-block;height:.8rem;-webkit-mask-image:var(--md-footnotes-icon);mask-image:var(--md-footnotes-icon);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;width:.8rem}[dir=rtl] .md-typeset .footnote-backref:before svg{transform:scaleX(-1)}[dir=ltr] .md-typeset .headerlink{margin-left:.5rem}[dir=rtl] .md-typeset .headerlink{margin-right:.5rem}.md-typeset .headerlink{color:var(--md-default-fg-color--lighter);display:inline-block;opacity:0;transition:color .25s,opacity 125ms}@media print{.md-typeset .headerlink{display:none}}.md-typeset .headerlink:focus,.md-typeset :hover>.headerlink,.md-typeset :target>.headerlink{opacity:1;transition:color .25s,opacity 125ms}.md-typeset .headerlink:focus,.md-typeset .headerlink:hover,.md-typeset :target>.headerlink{color:var(--md-accent-fg-color)}.md-typeset :target{--md-scroll-margin:3.6rem;--md-scroll-offset:0rem;scroll-margin-top:calc(var(--md-scroll-margin) - var(--md-scroll-offset))}@media screen and (min-width:76.25em){.md-header--lifted~.md-container .md-typeset :target{--md-scroll-margin:6rem}}.md-typeset h1:target,.md-typeset h2:target,.md-typeset h3:target{--md-scroll-offset:0.2rem}.md-typeset h4:target{--md-scroll-offset:0.15rem}.md-typeset div.arithmatex{overflow:auto}@media screen and (max-width:44.984375em){.md-typeset div.arithmatex{margin:0 -.8rem}}.md-typeset div.arithmatex>*{margin-left:auto!important;margin-right:auto!important;padding:0 .8rem;touch-action:auto;width:-webkit-min-content;width:min-content}.md-typeset div.arithmatex>* mjx-container{margin:0!important}.md-typeset del.critic{background-color:var(--md-typeset-del-color)}.md-typeset del.critic,.md-typeset ins.critic{-webkit-box-decoration-break:clone;box-decoration-break:clone}.md-typeset ins.critic{background-color:var(--md-typeset-ins-color)}.md-typeset .critic.comment{-webkit-box-decoration-break:clone;box-decoration-break:clone;color:var(--md-code-hl-comment-color)}.md-typeset .critic.comment:before{content:"/* "}.md-typeset .critic.comment:after{content:" */"}.md-typeset .critic.block{box-shadow:none;display:block;margin:1em 0;overflow:auto;padding-left:.8rem;padding-right:.8rem}.md-typeset .critic.block>:first-child{margin-top:.5em}.md-typeset .critic.block>:last-child{margin-bottom:.5em}:root{--md-details-icon:url('data:image/svg+xml;charset=utf-8,')}.md-typeset details{display:flow-root;overflow:visible;padding-top:0}.md-typeset details[open]>summary:after{transform:rotate(90deg)}.md-typeset details:not([open]){box-shadow:none;padding-bottom:0}.md-typeset details:not([open])>summary{border-radius:.1rem}[dir=ltr] .md-typeset summary{padding-right:1.8rem}[dir=rtl] .md-typeset summary{padding-left:1.8rem}[dir=ltr] .md-typeset summary{border-top-left-radius:.1rem}[dir=ltr] .md-typeset summary,[dir=rtl] .md-typeset summary{border-top-right-radius:.1rem}[dir=rtl] .md-typeset summary{border-top-left-radius:.1rem}.md-typeset summary{cursor:pointer;display:block;min-height:1rem}.md-typeset summary.focus-visible{outline-color:var(--md-accent-fg-color);outline-offset:.2rem}.md-typeset summary:not(.focus-visible){-webkit-tap-highlight-color:transparent;outline:none}[dir=ltr] .md-typeset summary:after{right:.4rem}[dir=rtl] .md-typeset summary:after{left:.4rem}.md-typeset summary:after{background-color:currentcolor;content:"";height:1rem;-webkit-mask-image:var(--md-details-icon);mask-image:var(--md-details-icon);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;position:absolute;top:.625em;transform:rotate(0deg);transition:transform .25s;width:1rem}[dir=rtl] .md-typeset summary:after{transform:rotate(180deg)}.md-typeset summary::marker{display:none}.md-typeset summary::-webkit-details-marker{display:none}.md-typeset .emojione,.md-typeset .gemoji,.md-typeset .twemoji{display:inline-flex;height:1.125em;vertical-align:text-top}.md-typeset .emojione svg,.md-typeset .gemoji svg,.md-typeset .twemoji svg{fill:currentcolor;max-height:100%;width:1.125em}.highlight .o,.highlight .ow{color:var(--md-code-hl-operator-color)}.highlight .p{color:var(--md-code-hl-punctuation-color)}.highlight .cpf,.highlight .l,.highlight .s,.highlight .s1,.highlight .s2,.highlight .sb,.highlight .sc,.highlight .si,.highlight .ss{color:var(--md-code-hl-string-color)}.highlight .cp,.highlight .se,.highlight .sh,.highlight .sr,.highlight .sx{color:var(--md-code-hl-special-color)}.highlight .il,.highlight .m,.highlight .mb,.highlight .mf,.highlight .mh,.highlight .mi,.highlight .mo{color:var(--md-code-hl-number-color)}.highlight .k,.highlight .kd,.highlight .kn,.highlight .kp,.highlight .kr,.highlight .kt{color:var(--md-code-hl-keyword-color)}.highlight .kc,.highlight .n{color:var(--md-code-hl-name-color)}.highlight .bp,.highlight .nb,.highlight .no{color:var(--md-code-hl-constant-color)}.highlight .nc,.highlight .ne,.highlight .nf,.highlight .nn{color:var(--md-code-hl-function-color)}.highlight .nd,.highlight .ni,.highlight .nl,.highlight .nt{color:var(--md-code-hl-keyword-color)}.highlight .c,.highlight .c1,.highlight .ch,.highlight .cm,.highlight .cs,.highlight .sd{color:var(--md-code-hl-comment-color)}.highlight .na,.highlight .nv,.highlight .vc,.highlight .vg,.highlight .vi{color:var(--md-code-hl-variable-color)}.highlight .ge,.highlight .gh,.highlight .go,.highlight .gp,.highlight .gr,.highlight .gs,.highlight .gt,.highlight .gu{color:var(--md-code-hl-generic-color)}.highlight .gd,.highlight .gi{border-radius:.1rem;margin:0 -.125em;padding:0 .125em}.highlight .gd{background-color:var(--md-typeset-del-color)}.highlight .gi{background-color:var(--md-typeset-ins-color)}.highlight .hll{background-color:var(--md-code-hl-color--light);box-shadow:2px 0 0 0 var(--md-code-hl-color) inset;display:block;margin:0 -1.1764705882em;padding:0 1.1764705882em}.highlight span.filename{background-color:var(--md-code-bg-color);border-bottom:.05rem solid var(--md-default-fg-color--lightest);border-top-left-radius:.1rem;border-top-right-radius:.1rem;display:flow-root;font-size:.85em;font-weight:700;margin-top:1em;padding:.6617647059em 1.1764705882em;position:relative}.highlight span.filename+pre{margin-top:0}.highlight span.filename+pre>code{border-top-left-radius:0;border-top-right-radius:0}.highlight [data-linenos]:before{background-color:var(--md-code-bg-color);box-shadow:-.05rem 0 var(--md-default-fg-color--lightest) inset;color:var(--md-default-fg-color--light);content:attr(data-linenos);float:left;left:-1.1764705882em;margin-left:-1.1764705882em;margin-right:1.1764705882em;padding-left:1.1764705882em;position:sticky;-webkit-user-select:none;user-select:none;z-index:3}.highlight code a[id]{position:absolute;visibility:hidden}.highlight code[data-md-copying] .hll{display:contents}.highlight code[data-md-copying] .md-annotation{display:none}.highlighttable{display:flow-root}.highlighttable tbody,.highlighttable td{display:block;padding:0}.highlighttable tr{display:flex}.highlighttable pre{margin:0}.highlighttable th.filename{flex-grow:1;padding:0;text-align:left}.highlighttable th.filename span.filename{margin-top:0}.highlighttable .linenos{background-color:var(--md-code-bg-color);border-bottom-left-radius:.1rem;border-top-left-radius:.1rem;font-size:.85em;padding:.7720588235em 0 .7720588235em 1.1764705882em;-webkit-user-select:none;user-select:none}.highlighttable .linenodiv{box-shadow:-.05rem 0 var(--md-default-fg-color--lightest) inset;padding-right:.5882352941em}.highlighttable .linenodiv pre{color:var(--md-default-fg-color--light);text-align:right}.highlighttable .code{flex:1;min-width:0}.linenodiv a{color:inherit}.md-typeset .highlighttable{direction:ltr;margin:1em 0}.md-typeset .highlighttable>tbody>tr>.code>div>pre>code{border-bottom-left-radius:0;border-top-left-radius:0}.md-typeset .highlight+.result{border:.05rem solid var(--md-code-bg-color);border-bottom-left-radius:.1rem;border-bottom-right-radius:.1rem;border-top-width:.1rem;margin-top:-1.125em;overflow:visible;padding:0 1em}.md-typeset .highlight+.result:after{clear:both;content:"";display:block}@media screen and (max-width:44.984375em){.md-content__inner>.highlight{margin:1em -.8rem}.md-content__inner>.highlight>.filename,.md-content__inner>.highlight>.highlighttable>tbody>tr>.code>div>pre>code,.md-content__inner>.highlight>.highlighttable>tbody>tr>.filename span.filename,.md-content__inner>.highlight>.highlighttable>tbody>tr>.linenos,.md-content__inner>.highlight>pre>code{border-radius:0}.md-content__inner>.highlight+.result{border-left-width:0;border-radius:0;border-right-width:0;margin-left:-.8rem;margin-right:-.8rem}}.md-typeset .keys kbd:after,.md-typeset .keys kbd:before{-moz-osx-font-smoothing:initial;-webkit-font-smoothing:initial;color:inherit;margin:0;position:relative}.md-typeset .keys span{color:var(--md-default-fg-color--light);padding:0 .2em}.md-typeset .keys .key-alt:before,.md-typeset .keys .key-left-alt:before,.md-typeset .keys .key-right-alt:before{content:"⎇";padding-right:.4em}.md-typeset .keys .key-command:before,.md-typeset .keys .key-left-command:before,.md-typeset .keys .key-right-command:before{content:"⌘";padding-right:.4em}.md-typeset .keys .key-control:before,.md-typeset .keys .key-left-control:before,.md-typeset .keys .key-right-control:before{content:"⌃";padding-right:.4em}.md-typeset .keys .key-left-meta:before,.md-typeset .keys .key-meta:before,.md-typeset .keys .key-right-meta:before{content:"◆";padding-right:.4em}.md-typeset .keys .key-left-option:before,.md-typeset .keys .key-option:before,.md-typeset .keys .key-right-option:before{content:"⌥";padding-right:.4em}.md-typeset .keys .key-left-shift:before,.md-typeset .keys .key-right-shift:before,.md-typeset .keys .key-shift:before{content:"⇧";padding-right:.4em}.md-typeset .keys .key-left-super:before,.md-typeset .keys .key-right-super:before,.md-typeset .keys .key-super:before{content:"❖";padding-right:.4em}.md-typeset .keys .key-left-windows:before,.md-typeset .keys .key-right-windows:before,.md-typeset .keys .key-windows:before{content:"⊞";padding-right:.4em}.md-typeset .keys .key-arrow-down:before{content:"↓";padding-right:.4em}.md-typeset .keys .key-arrow-left:before{content:"←";padding-right:.4em}.md-typeset .keys .key-arrow-right:before{content:"→";padding-right:.4em}.md-typeset .keys .key-arrow-up:before{content:"↑";padding-right:.4em}.md-typeset .keys .key-backspace:before{content:"⌫";padding-right:.4em}.md-typeset .keys .key-backtab:before{content:"⇤";padding-right:.4em}.md-typeset .keys .key-caps-lock:before{content:"⇪";padding-right:.4em}.md-typeset .keys .key-clear:before{content:"⌧";padding-right:.4em}.md-typeset .keys .key-context-menu:before{content:"☰";padding-right:.4em}.md-typeset .keys .key-delete:before{content:"⌦";padding-right:.4em}.md-typeset .keys .key-eject:before{content:"⏏";padding-right:.4em}.md-typeset .keys .key-end:before{content:"⤓";padding-right:.4em}.md-typeset .keys .key-escape:before{content:"⎋";padding-right:.4em}.md-typeset .keys .key-home:before{content:"⤒";padding-right:.4em}.md-typeset .keys .key-insert:before{content:"⎀";padding-right:.4em}.md-typeset .keys .key-page-down:before{content:"⇟";padding-right:.4em}.md-typeset .keys .key-page-up:before{content:"⇞";padding-right:.4em}.md-typeset .keys .key-print-screen:before{content:"⎙";padding-right:.4em}.md-typeset .keys .key-tab:after{content:"⇥";padding-left:.4em}.md-typeset .keys .key-num-enter:after{content:"⌤";padding-left:.4em}.md-typeset .keys .key-enter:after{content:"⏎";padding-left:.4em}:root{--md-tabbed-icon--prev:url('data:image/svg+xml;charset=utf-8,');--md-tabbed-icon--next:url('data:image/svg+xml;charset=utf-8,')}.md-typeset .tabbed-set{border-radius:.1rem;display:flex;flex-flow:column wrap;margin:1em 0;position:relative}.md-typeset .tabbed-set>input{height:0;opacity:0;position:absolute;width:0}.md-typeset .tabbed-set>input:target{--md-scroll-offset:0.625em}.md-typeset .tabbed-set>input.focus-visible~.tabbed-labels:before{background-color:var(--md-accent-fg-color)}.md-typeset .tabbed-labels{-ms-overflow-style:none;box-shadow:0 -.05rem var(--md-default-fg-color--lightest) inset;display:flex;max-width:100%;overflow:auto;scrollbar-width:none}@media print{.md-typeset .tabbed-labels{display:contents}}@media screen{.js .md-typeset .tabbed-labels{position:relative}.js .md-typeset .tabbed-labels:before{background:var(--md-default-fg-color);bottom:0;content:"";display:block;height:2px;left:0;position:absolute;transform:translateX(var(--md-indicator-x));transition:width 225ms,background-color .25s,transform .25s;transition-timing-function:cubic-bezier(.4,0,.2,1);width:var(--md-indicator-width)}}.md-typeset .tabbed-labels::-webkit-scrollbar{display:none}.md-typeset .tabbed-labels>label{border-bottom:.1rem solid #0000;border-radius:.1rem .1rem 0 0;color:var(--md-default-fg-color--light);cursor:pointer;flex-shrink:0;font-size:.64rem;font-weight:700;padding:.78125em 1.25em .625em;scroll-margin-inline-start:1rem;transition:background-color .25s,color .25s;white-space:nowrap;width:auto}@media print{.md-typeset .tabbed-labels>label:first-child{order:1}.md-typeset .tabbed-labels>label:nth-child(2){order:2}.md-typeset .tabbed-labels>label:nth-child(3){order:3}.md-typeset .tabbed-labels>label:nth-child(4){order:4}.md-typeset .tabbed-labels>label:nth-child(5){order:5}.md-typeset .tabbed-labels>label:nth-child(6){order:6}.md-typeset .tabbed-labels>label:nth-child(7){order:7}.md-typeset .tabbed-labels>label:nth-child(8){order:8}.md-typeset .tabbed-labels>label:nth-child(9){order:9}.md-typeset .tabbed-labels>label:nth-child(10){order:10}.md-typeset .tabbed-labels>label:nth-child(11){order:11}.md-typeset .tabbed-labels>label:nth-child(12){order:12}.md-typeset .tabbed-labels>label:nth-child(13){order:13}.md-typeset .tabbed-labels>label:nth-child(14){order:14}.md-typeset .tabbed-labels>label:nth-child(15){order:15}.md-typeset .tabbed-labels>label:nth-child(16){order:16}.md-typeset .tabbed-labels>label:nth-child(17){order:17}.md-typeset .tabbed-labels>label:nth-child(18){order:18}.md-typeset .tabbed-labels>label:nth-child(19){order:19}.md-typeset .tabbed-labels>label:nth-child(20){order:20}}.md-typeset .tabbed-labels>label:hover{color:var(--md-default-fg-color)}.md-typeset .tabbed-content{width:100%}@media print{.md-typeset .tabbed-content{display:contents}}.md-typeset .tabbed-block{display:none}@media print{.md-typeset .tabbed-block{display:block}.md-typeset .tabbed-block:first-child{order:1}.md-typeset .tabbed-block:nth-child(2){order:2}.md-typeset .tabbed-block:nth-child(3){order:3}.md-typeset .tabbed-block:nth-child(4){order:4}.md-typeset .tabbed-block:nth-child(5){order:5}.md-typeset .tabbed-block:nth-child(6){order:6}.md-typeset .tabbed-block:nth-child(7){order:7}.md-typeset .tabbed-block:nth-child(8){order:8}.md-typeset .tabbed-block:nth-child(9){order:9}.md-typeset .tabbed-block:nth-child(10){order:10}.md-typeset .tabbed-block:nth-child(11){order:11}.md-typeset .tabbed-block:nth-child(12){order:12}.md-typeset .tabbed-block:nth-child(13){order:13}.md-typeset .tabbed-block:nth-child(14){order:14}.md-typeset .tabbed-block:nth-child(15){order:15}.md-typeset .tabbed-block:nth-child(16){order:16}.md-typeset .tabbed-block:nth-child(17){order:17}.md-typeset .tabbed-block:nth-child(18){order:18}.md-typeset .tabbed-block:nth-child(19){order:19}.md-typeset .tabbed-block:nth-child(20){order:20}}.md-typeset .tabbed-block>.highlight:first-child>pre,.md-typeset .tabbed-block>pre:first-child{margin:0}.md-typeset .tabbed-block>.highlight:first-child>pre>code,.md-typeset .tabbed-block>pre:first-child>code{border-top-left-radius:0;border-top-right-radius:0}.md-typeset .tabbed-block>.highlight:first-child>.filename{border-top-left-radius:0;border-top-right-radius:0;margin:0}.md-typeset .tabbed-block>.highlight:first-child>.highlighttable{margin:0}.md-typeset .tabbed-block>.highlight:first-child>.highlighttable>tbody>tr>.filename span.filename,.md-typeset .tabbed-block>.highlight:first-child>.highlighttable>tbody>tr>.linenos{border-top-left-radius:0;border-top-right-radius:0;margin:0}.md-typeset .tabbed-block>.highlight:first-child>.highlighttable>tbody>tr>.code>div>pre>code{border-top-left-radius:0;border-top-right-radius:0}.md-typeset .tabbed-block>.highlight:first-child+.result{margin-top:-.125em}.md-typeset .tabbed-block>.tabbed-set{margin:0}.md-typeset .tabbed-button{align-self:center;border-radius:100%;color:var(--md-default-fg-color--light);cursor:pointer;display:block;height:.9rem;margin-top:.1rem;pointer-events:auto;transition:background-color .25s;width:.9rem}.md-typeset .tabbed-button:hover{background-color:var(--md-accent-fg-color--transparent);color:var(--md-accent-fg-color)}.md-typeset .tabbed-button:after{background-color:currentcolor;content:"";display:block;height:100%;-webkit-mask-image:var(--md-tabbed-icon--prev);mask-image:var(--md-tabbed-icon--prev);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;transition:background-color .25s,transform .25s;width:100%}.md-typeset .tabbed-control{background:linear-gradient(to right,var(--md-default-bg-color) 60%,#0000);display:flex;height:1.9rem;justify-content:start;pointer-events:none;position:absolute;transition:opacity 125ms;width:1.2rem}[dir=rtl] .md-typeset .tabbed-control{transform:rotate(180deg)}.md-typeset .tabbed-control[hidden]{opacity:0}.md-typeset .tabbed-control--next{background:linear-gradient(to left,var(--md-default-bg-color) 60%,#0000);justify-content:end;right:0}.md-typeset .tabbed-control--next .tabbed-button:after{-webkit-mask-image:var(--md-tabbed-icon--next);mask-image:var(--md-tabbed-icon--next)}@media screen and (max-width:44.984375em){[dir=ltr] .md-content__inner>.tabbed-set .tabbed-labels{padding-left:.8rem}[dir=rtl] .md-content__inner>.tabbed-set .tabbed-labels{padding-right:.8rem}.md-content__inner>.tabbed-set .tabbed-labels{margin:0 -.8rem;max-width:100vw;scroll-padding-inline-start:.8rem}[dir=ltr] .md-content__inner>.tabbed-set .tabbed-labels:after{padding-right:.8rem}[dir=rtl] .md-content__inner>.tabbed-set .tabbed-labels:after{padding-left:.8rem}.md-content__inner>.tabbed-set .tabbed-labels:after{content:""}[dir=ltr] .md-content__inner>.tabbed-set .tabbed-labels~.tabbed-control--prev{padding-left:.8rem}[dir=rtl] .md-content__inner>.tabbed-set .tabbed-labels~.tabbed-control--prev{padding-right:.8rem}[dir=ltr] .md-content__inner>.tabbed-set .tabbed-labels~.tabbed-control--prev{margin-left:-.8rem}[dir=rtl] .md-content__inner>.tabbed-set .tabbed-labels~.tabbed-control--prev{margin-right:-.8rem}.md-content__inner>.tabbed-set .tabbed-labels~.tabbed-control--prev{width:2rem}[dir=ltr] .md-content__inner>.tabbed-set .tabbed-labels~.tabbed-control--next{padding-right:.8rem}[dir=rtl] .md-content__inner>.tabbed-set .tabbed-labels~.tabbed-control--next{padding-left:.8rem}[dir=ltr] .md-content__inner>.tabbed-set .tabbed-labels~.tabbed-control--next{margin-right:-.8rem}[dir=rtl] .md-content__inner>.tabbed-set .tabbed-labels~.tabbed-control--next{margin-left:-.8rem}.md-content__inner>.tabbed-set .tabbed-labels~.tabbed-control--next{width:2rem}}@media screen{.md-typeset .tabbed-set>input:first-child:checked~.tabbed-labels>:first-child,.md-typeset .tabbed-set>input:nth-child(10):checked~.tabbed-labels>:nth-child(10),.md-typeset .tabbed-set>input:nth-child(11):checked~.tabbed-labels>:nth-child(11),.md-typeset .tabbed-set>input:nth-child(12):checked~.tabbed-labels>:nth-child(12),.md-typeset .tabbed-set>input:nth-child(13):checked~.tabbed-labels>:nth-child(13),.md-typeset .tabbed-set>input:nth-child(14):checked~.tabbed-labels>:nth-child(14),.md-typeset .tabbed-set>input:nth-child(15):checked~.tabbed-labels>:nth-child(15),.md-typeset .tabbed-set>input:nth-child(16):checked~.tabbed-labels>:nth-child(16),.md-typeset .tabbed-set>input:nth-child(17):checked~.tabbed-labels>:nth-child(17),.md-typeset .tabbed-set>input:nth-child(18):checked~.tabbed-labels>:nth-child(18),.md-typeset .tabbed-set>input:nth-child(19):checked~.tabbed-labels>:nth-child(19),.md-typeset .tabbed-set>input:nth-child(2):checked~.tabbed-labels>:nth-child(2),.md-typeset .tabbed-set>input:nth-child(20):checked~.tabbed-labels>:nth-child(20),.md-typeset .tabbed-set>input:nth-child(3):checked~.tabbed-labels>:nth-child(3),.md-typeset .tabbed-set>input:nth-child(4):checked~.tabbed-labels>:nth-child(4),.md-typeset .tabbed-set>input:nth-child(5):checked~.tabbed-labels>:nth-child(5),.md-typeset .tabbed-set>input:nth-child(6):checked~.tabbed-labels>:nth-child(6),.md-typeset .tabbed-set>input:nth-child(7):checked~.tabbed-labels>:nth-child(7),.md-typeset .tabbed-set>input:nth-child(8):checked~.tabbed-labels>:nth-child(8),.md-typeset .tabbed-set>input:nth-child(9):checked~.tabbed-labels>:nth-child(9){color:var(--md-default-fg-color)}.md-typeset .no-js .tabbed-set>input:first-child:checked~.tabbed-labels>:first-child,.md-typeset .no-js .tabbed-set>input:nth-child(10):checked~.tabbed-labels>:nth-child(10),.md-typeset .no-js .tabbed-set>input:nth-child(11):checked~.tabbed-labels>:nth-child(11),.md-typeset .no-js .tabbed-set>input:nth-child(12):checked~.tabbed-labels>:nth-child(12),.md-typeset .no-js .tabbed-set>input:nth-child(13):checked~.tabbed-labels>:nth-child(13),.md-typeset .no-js .tabbed-set>input:nth-child(14):checked~.tabbed-labels>:nth-child(14),.md-typeset .no-js .tabbed-set>input:nth-child(15):checked~.tabbed-labels>:nth-child(15),.md-typeset .no-js .tabbed-set>input:nth-child(16):checked~.tabbed-labels>:nth-child(16),.md-typeset .no-js .tabbed-set>input:nth-child(17):checked~.tabbed-labels>:nth-child(17),.md-typeset .no-js .tabbed-set>input:nth-child(18):checked~.tabbed-labels>:nth-child(18),.md-typeset .no-js .tabbed-set>input:nth-child(19):checked~.tabbed-labels>:nth-child(19),.md-typeset .no-js .tabbed-set>input:nth-child(2):checked~.tabbed-labels>:nth-child(2),.md-typeset .no-js .tabbed-set>input:nth-child(20):checked~.tabbed-labels>:nth-child(20),.md-typeset .no-js .tabbed-set>input:nth-child(3):checked~.tabbed-labels>:nth-child(3),.md-typeset .no-js .tabbed-set>input:nth-child(4):checked~.tabbed-labels>:nth-child(4),.md-typeset .no-js .tabbed-set>input:nth-child(5):checked~.tabbed-labels>:nth-child(5),.md-typeset .no-js .tabbed-set>input:nth-child(6):checked~.tabbed-labels>:nth-child(6),.md-typeset .no-js .tabbed-set>input:nth-child(7):checked~.tabbed-labels>:nth-child(7),.md-typeset .no-js .tabbed-set>input:nth-child(8):checked~.tabbed-labels>:nth-child(8),.md-typeset .no-js .tabbed-set>input:nth-child(9):checked~.tabbed-labels>:nth-child(9),.no-js .md-typeset .tabbed-set>input:first-child:checked~.tabbed-labels>:first-child,.no-js .md-typeset .tabbed-set>input:nth-child(10):checked~.tabbed-labels>:nth-child(10),.no-js .md-typeset .tabbed-set>input:nth-child(11):checked~.tabbed-labels>:nth-child(11),.no-js .md-typeset .tabbed-set>input:nth-child(12):checked~.tabbed-labels>:nth-child(12),.no-js .md-typeset .tabbed-set>input:nth-child(13):checked~.tabbed-labels>:nth-child(13),.no-js .md-typeset .tabbed-set>input:nth-child(14):checked~.tabbed-labels>:nth-child(14),.no-js .md-typeset .tabbed-set>input:nth-child(15):checked~.tabbed-labels>:nth-child(15),.no-js .md-typeset .tabbed-set>input:nth-child(16):checked~.tabbed-labels>:nth-child(16),.no-js .md-typeset .tabbed-set>input:nth-child(17):checked~.tabbed-labels>:nth-child(17),.no-js .md-typeset .tabbed-set>input:nth-child(18):checked~.tabbed-labels>:nth-child(18),.no-js .md-typeset .tabbed-set>input:nth-child(19):checked~.tabbed-labels>:nth-child(19),.no-js .md-typeset .tabbed-set>input:nth-child(2):checked~.tabbed-labels>:nth-child(2),.no-js .md-typeset .tabbed-set>input:nth-child(20):checked~.tabbed-labels>:nth-child(20),.no-js .md-typeset .tabbed-set>input:nth-child(3):checked~.tabbed-labels>:nth-child(3),.no-js .md-typeset .tabbed-set>input:nth-child(4):checked~.tabbed-labels>:nth-child(4),.no-js .md-typeset .tabbed-set>input:nth-child(5):checked~.tabbed-labels>:nth-child(5),.no-js .md-typeset .tabbed-set>input:nth-child(6):checked~.tabbed-labels>:nth-child(6),.no-js .md-typeset .tabbed-set>input:nth-child(7):checked~.tabbed-labels>:nth-child(7),.no-js .md-typeset .tabbed-set>input:nth-child(8):checked~.tabbed-labels>:nth-child(8),.no-js .md-typeset .tabbed-set>input:nth-child(9):checked~.tabbed-labels>:nth-child(9){border-color:var(--md-default-fg-color)}}.md-typeset .tabbed-set>input:first-child.focus-visible~.tabbed-labels>:first-child,.md-typeset .tabbed-set>input:nth-child(10).focus-visible~.tabbed-labels>:nth-child(10),.md-typeset .tabbed-set>input:nth-child(11).focus-visible~.tabbed-labels>:nth-child(11),.md-typeset .tabbed-set>input:nth-child(12).focus-visible~.tabbed-labels>:nth-child(12),.md-typeset .tabbed-set>input:nth-child(13).focus-visible~.tabbed-labels>:nth-child(13),.md-typeset .tabbed-set>input:nth-child(14).focus-visible~.tabbed-labels>:nth-child(14),.md-typeset .tabbed-set>input:nth-child(15).focus-visible~.tabbed-labels>:nth-child(15),.md-typeset .tabbed-set>input:nth-child(16).focus-visible~.tabbed-labels>:nth-child(16),.md-typeset .tabbed-set>input:nth-child(17).focus-visible~.tabbed-labels>:nth-child(17),.md-typeset .tabbed-set>input:nth-child(18).focus-visible~.tabbed-labels>:nth-child(18),.md-typeset .tabbed-set>input:nth-child(19).focus-visible~.tabbed-labels>:nth-child(19),.md-typeset .tabbed-set>input:nth-child(2).focus-visible~.tabbed-labels>:nth-child(2),.md-typeset .tabbed-set>input:nth-child(20).focus-visible~.tabbed-labels>:nth-child(20),.md-typeset .tabbed-set>input:nth-child(3).focus-visible~.tabbed-labels>:nth-child(3),.md-typeset .tabbed-set>input:nth-child(4).focus-visible~.tabbed-labels>:nth-child(4),.md-typeset .tabbed-set>input:nth-child(5).focus-visible~.tabbed-labels>:nth-child(5),.md-typeset .tabbed-set>input:nth-child(6).focus-visible~.tabbed-labels>:nth-child(6),.md-typeset .tabbed-set>input:nth-child(7).focus-visible~.tabbed-labels>:nth-child(7),.md-typeset .tabbed-set>input:nth-child(8).focus-visible~.tabbed-labels>:nth-child(8),.md-typeset .tabbed-set>input:nth-child(9).focus-visible~.tabbed-labels>:nth-child(9){color:var(--md-accent-fg-color)}.md-typeset .tabbed-set>input:first-child:checked~.tabbed-content>:first-child,.md-typeset .tabbed-set>input:nth-child(10):checked~.tabbed-content>:nth-child(10),.md-typeset .tabbed-set>input:nth-child(11):checked~.tabbed-content>:nth-child(11),.md-typeset .tabbed-set>input:nth-child(12):checked~.tabbed-content>:nth-child(12),.md-typeset .tabbed-set>input:nth-child(13):checked~.tabbed-content>:nth-child(13),.md-typeset .tabbed-set>input:nth-child(14):checked~.tabbed-content>:nth-child(14),.md-typeset .tabbed-set>input:nth-child(15):checked~.tabbed-content>:nth-child(15),.md-typeset .tabbed-set>input:nth-child(16):checked~.tabbed-content>:nth-child(16),.md-typeset .tabbed-set>input:nth-child(17):checked~.tabbed-content>:nth-child(17),.md-typeset .tabbed-set>input:nth-child(18):checked~.tabbed-content>:nth-child(18),.md-typeset .tabbed-set>input:nth-child(19):checked~.tabbed-content>:nth-child(19),.md-typeset .tabbed-set>input:nth-child(2):checked~.tabbed-content>:nth-child(2),.md-typeset .tabbed-set>input:nth-child(20):checked~.tabbed-content>:nth-child(20),.md-typeset .tabbed-set>input:nth-child(3):checked~.tabbed-content>:nth-child(3),.md-typeset .tabbed-set>input:nth-child(4):checked~.tabbed-content>:nth-child(4),.md-typeset .tabbed-set>input:nth-child(5):checked~.tabbed-content>:nth-child(5),.md-typeset .tabbed-set>input:nth-child(6):checked~.tabbed-content>:nth-child(6),.md-typeset .tabbed-set>input:nth-child(7):checked~.tabbed-content>:nth-child(7),.md-typeset .tabbed-set>input:nth-child(8):checked~.tabbed-content>:nth-child(8),.md-typeset .tabbed-set>input:nth-child(9):checked~.tabbed-content>:nth-child(9){display:block}:root{--md-tasklist-icon:url('data:image/svg+xml;charset=utf-8,');--md-tasklist-icon--checked:url('data:image/svg+xml;charset=utf-8,')}.md-typeset .task-list-item{list-style-type:none;position:relative}[dir=ltr] .md-typeset .task-list-item [type=checkbox]{left:-2em}[dir=rtl] .md-typeset .task-list-item [type=checkbox]{right:-2em}.md-typeset .task-list-item [type=checkbox]{position:absolute;top:.45em}.md-typeset .task-list-control [type=checkbox]{opacity:0;z-index:-1}[dir=ltr] .md-typeset .task-list-indicator:before{left:-1.5em}[dir=rtl] .md-typeset .task-list-indicator:before{right:-1.5em}.md-typeset .task-list-indicator:before{background-color:var(--md-default-fg-color--lightest);content:"";height:1.25em;-webkit-mask-image:var(--md-tasklist-icon);mask-image:var(--md-tasklist-icon);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;position:absolute;top:.15em;width:1.25em}.md-typeset [type=checkbox]:checked+.task-list-indicator:before{background-color:#00e676;-webkit-mask-image:var(--md-tasklist-icon--checked);mask-image:var(--md-tasklist-icon--checked)}:root>*{--md-mermaid-font-family:var(--md-text-font-family),sans-serif;--md-mermaid-edge-color:var(--md-code-fg-color);--md-mermaid-node-bg-color:var(--md-accent-fg-color--transparent);--md-mermaid-node-fg-color:var(--md-accent-fg-color);--md-mermaid-label-bg-color:var(--md-default-bg-color);--md-mermaid-label-fg-color:var(--md-code-fg-color);--md-mermaid-sequence-actor-bg-color:var(--md-mermaid-label-bg-color);--md-mermaid-sequence-actor-fg-color:var(--md-mermaid-label-fg-color);--md-mermaid-sequence-actor-border-color:var(--md-mermaid-node-fg-color);--md-mermaid-sequence-actor-line-color:var(--md-default-fg-color--lighter);--md-mermaid-sequence-actorman-bg-color:var(--md-mermaid-label-bg-color);--md-mermaid-sequence-actorman-line-color:var(--md-mermaid-node-fg-color);--md-mermaid-sequence-box-bg-color:var(--md-mermaid-node-bg-color);--md-mermaid-sequence-box-fg-color:var(--md-mermaid-edge-color);--md-mermaid-sequence-label-bg-color:var(--md-mermaid-node-bg-color);--md-mermaid-sequence-label-fg-color:var(--md-mermaid-node-fg-color);--md-mermaid-sequence-loop-bg-color:var(--md-mermaid-node-bg-color);--md-mermaid-sequence-loop-fg-color:var(--md-mermaid-edge-color);--md-mermaid-sequence-loop-border-color:var(--md-mermaid-node-fg-color);--md-mermaid-sequence-message-fg-color:var(--md-mermaid-edge-color);--md-mermaid-sequence-message-line-color:var(--md-mermaid-edge-color);--md-mermaid-sequence-note-bg-color:var(--md-mermaid-label-bg-color);--md-mermaid-sequence-note-fg-color:var(--md-mermaid-edge-color);--md-mermaid-sequence-note-border-color:var(--md-mermaid-label-fg-color);--md-mermaid-sequence-number-bg-color:var(--md-mermaid-node-fg-color);--md-mermaid-sequence-number-fg-color:var(--md-accent-bg-color)}.mermaid{line-height:normal;margin:1em 0}@media screen and (min-width:45em){[dir=ltr] .md-typeset .inline{float:left}[dir=rtl] .md-typeset .inline{float:right}[dir=ltr] .md-typeset .inline{margin-right:.8rem}[dir=rtl] .md-typeset .inline{margin-left:.8rem}.md-typeset .inline{margin-bottom:.8rem;margin-top:0;width:11.7rem}[dir=ltr] .md-typeset .inline.end{float:right}[dir=rtl] .md-typeset .inline.end{float:left}[dir=ltr] .md-typeset .inline.end{margin-left:.8rem;margin-right:0}[dir=rtl] .md-typeset .inline.end{margin-left:0;margin-right:.8rem}} \ No newline at end of file diff --git a/assets/stylesheets/main.35e1ed30.min.css.map b/assets/stylesheets/main.35e1ed30.min.css.map new file mode 100644 index 0000000..7612577 --- /dev/null +++ b/assets/stylesheets/main.35e1ed30.min.css.map @@ -0,0 +1 @@ +{"version":3,"sources":["src/templates/assets/stylesheets/main/components/_meta.scss","../../../../src/templates/assets/stylesheets/main.scss","src/templates/assets/stylesheets/main/_resets.scss","src/templates/assets/stylesheets/main/_colors.scss","src/templates/assets/stylesheets/main/_icons.scss","src/templates/assets/stylesheets/main/_typeset.scss","src/templates/assets/stylesheets/utilities/_break.scss","src/templates/assets/stylesheets/main/components/_author.scss","src/templates/assets/stylesheets/main/components/_banner.scss","src/templates/assets/stylesheets/main/components/_base.scss","src/templates/assets/stylesheets/main/components/_clipboard.scss","src/templates/assets/stylesheets/main/components/_consent.scss","src/templates/assets/stylesheets/main/components/_content.scss","src/templates/assets/stylesheets/main/components/_dialog.scss","src/templates/assets/stylesheets/main/components/_feedback.scss","src/templates/assets/stylesheets/main/components/_footer.scss","src/templates/assets/stylesheets/main/components/_form.scss","src/templates/assets/stylesheets/main/components/_header.scss","node_modules/material-design-color/material-color.scss","src/templates/assets/stylesheets/main/components/_nav.scss","src/templates/assets/stylesheets/main/components/_pagination.scss","src/templates/assets/stylesheets/main/components/_post.scss","src/templates/assets/stylesheets/main/components/_progress.scss","src/templates/assets/stylesheets/main/components/_search.scss","src/templates/assets/stylesheets/main/components/_select.scss","src/templates/assets/stylesheets/main/components/_sidebar.scss","src/templates/assets/stylesheets/main/components/_source.scss","src/templates/assets/stylesheets/main/components/_status.scss","src/templates/assets/stylesheets/main/components/_tabs.scss","src/templates/assets/stylesheets/main/components/_tag.scss","src/templates/assets/stylesheets/main/components/_tooltip.scss","src/templates/assets/stylesheets/main/components/_top.scss","src/templates/assets/stylesheets/main/components/_version.scss","src/templates/assets/stylesheets/main/extensions/markdown/_admonition.scss","src/templates/assets/stylesheets/main/extensions/markdown/_footnotes.scss","src/templates/assets/stylesheets/main/extensions/markdown/_toc.scss","src/templates/assets/stylesheets/main/extensions/pymdownx/_arithmatex.scss","src/templates/assets/stylesheets/main/extensions/pymdownx/_critic.scss","src/templates/assets/stylesheets/main/extensions/pymdownx/_details.scss","src/templates/assets/stylesheets/main/extensions/pymdownx/_emoji.scss","src/templates/assets/stylesheets/main/extensions/pymdownx/_highlight.scss","src/templates/assets/stylesheets/main/extensions/pymdownx/_keys.scss","src/templates/assets/stylesheets/main/extensions/pymdownx/_tabbed.scss","src/templates/assets/stylesheets/main/extensions/pymdownx/_tasklist.scss","src/templates/assets/stylesheets/main/integrations/_mermaid.scss","src/templates/assets/stylesheets/main/_modifiers.scss"],"names":[],"mappings":"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gC5vGI,kFACE,ahC8vGN,CgCnxGE,4DACE,oBhCsxGJ,CgCnxGI,sFACE,gChCqxGN,CgChxGE,oEACE,0BhCmxGJ,CgChxGI,kFACE,wBAlBG,CAmBH,qDAAA,CAAA,6ChCkxGN,CgC9wGI,gFACE,ahCgxGN,CgCryGE,4DACE,oBhCwyGJ,CgCryGI,sFACE,gChCuyGN,CgClyGE,oEACE,0BhCqyGJ,CgClyGI,kFACE,wBAlBG,CAmBH,qDAAA,CAAA,6ChCoyGN,CgChyGI,gFACE,ahCkyGN,CgCvzGE,0DACE,oBhC0zGJ,CgCvzGI,oFACE,gChCyzGN,CgCpzGE,kEACE,0BhCuzGJ,CgCpzGI,gFACE,wBAlBG,CAmBH,oDAAA,CAAA,4ChCszGN,CgClzGI,8EACE,ahCozGN,CgCz0GE,oDACE,oBhC40GJ,CgCz0GI,8EACE,gChC20GN,CgCt0GE,4DACE,0BhCy0GJ,CgCt0GI,0EACE,wBAlBG,CAmBH,iDAAA,CAAA,yChCw0GN,CgCp0GI,wEACE,ahCs0GN,CgC31GE,4DACE,oBhC81GJ,CgC31GI,sFACE,gChC61GN,CgCx1GE,oEACE,0BhC21GJ,CgCx1GI,kFACE,wBAlBG,CAmBH,qDAAA,CAAA,6ChC01GN,CgCt1GI,gFACE,ahCw1GN,CgC72GE,wDACE,oBhCg3GJ,CgC72GI,kFACE,gChC+2GN,CgC12GE,gEACE,0BhC62GJ,CgC12GI,8EACE,wBAlBG,CAmBH,mDAAA,CAAA,2ChC42GN,CgCx2GI,4EACE,ahC02GN,CiC9gHA,MACE,wMjCihHF,CiCxgHE,sBAEE,uCAAA,CADA,gBjC4gHJ,CiCxgHI,mCACE,ajC0gHN,CiC3gHI,mCACE,cjC0gHN,CiCtgHM,4BACE,sBjCwgHR,CiCrgHQ,mCACE,gCjCugHV,CiCngHQ,2DACE,SAAA,CAEA,uBAAA,CADA,ejCsgHV,CiCjgHQ,yGACE,SAAA,CACA,uBjCmgHV,CiC//GQ,yCACE,YjCigHV,CiC1/GE,0BACE,eAAA,CACA,ejC4/GJ,CiCz/GI,+BACE,oBjC2/GN,CiCt/GE,gDACE,YjCw/GJ,CiCp/GE,8BAIE,+BAAA,CAHA,oBAAA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","file":"main.css"} \ No newline at end of file diff --git a/assets/stylesheets/main.6a10b989.min.css b/assets/stylesheets/main.6a10b989.min.css deleted file mode 100644 index a794f34..0000000 --- a/assets/stylesheets/main.6a10b989.min.css +++ /dev/null @@ -1 +0,0 @@ -@charset "UTF-8";html{-webkit-text-size-adjust:none;-moz-text-size-adjust:none;text-size-adjust:none;box-sizing:border-box}*,:after,:before{box-sizing:inherit}@media (prefers-reduced-motion){*,:after,:before{transition:none!important}}body{margin:0}a,button,input,label{-webkit-tap-highlight-color:transparent}a{color:inherit;text-decoration:none}hr{border:0;box-sizing:initial;display:block;height:.05rem;overflow:visible;padding:0}small{font-size:80%}sub,sup{line-height:1em}img{border-style:none}table{border-collapse:initial;border-spacing:0}td,th{font-weight:400;vertical-align:top}button{background:#0000;border:0;font-family:inherit;font-size:inherit;margin:0;padding:0}input{border:0;outline:none}:root{--md-primary-fg-color:#4051b5;--md-primary-fg-color--light:#5d6cc0;--md-primary-fg-color--dark:#303fa1;--md-primary-bg-color:#fff;--md-primary-bg-color--light:#ffffffb3;--md-accent-fg-color:#526cfe;--md-accent-fg-color--transparent:#526cfe1a;--md-accent-bg-color:#fff;--md-accent-bg-color--light:#ffffffb3}[data-md-color-scheme=default]{color-scheme:light}[data-md-color-scheme=default] img[src$="#gh-dark-mode-only"],[data-md-color-scheme=default] img[src$="#only-dark"]{display:none}:root,[data-md-color-scheme=default]{--md-hue:225deg;--md-default-fg-color:#000000de;--md-default-fg-color--light:#0000008a;--md-default-fg-color--lighter:#00000052;--md-default-fg-color--lightest:#00000012;--md-default-bg-color:#fff;--md-default-bg-color--light:#ffffffb3;--md-default-bg-color--lighter:#ffffff4d;--md-default-bg-color--lightest:#ffffff1f;--md-code-fg-color:#36464e;--md-code-bg-color:#f5f5f5;--md-code-hl-color:#4287ff;--md-code-hl-color--light:#4287ff1a;--md-code-hl-number-color:#d52a2a;--md-code-hl-special-color:#db1457;--md-code-hl-function-color:#a846b9;--md-code-hl-constant-color:#6e59d9;--md-code-hl-keyword-color:#3f6ec6;--md-code-hl-string-color:#1c7d4d;--md-code-hl-name-color:var(--md-code-fg-color);--md-code-hl-operator-color:var(--md-default-fg-color--light);--md-code-hl-punctuation-color:var(--md-default-fg-color--light);--md-code-hl-comment-color:var(--md-default-fg-color--light);--md-code-hl-generic-color:var(--md-default-fg-color--light);--md-code-hl-variable-color:var(--md-default-fg-color--light);--md-typeset-color:var(--md-default-fg-color);--md-typeset-a-color:var(--md-primary-fg-color);--md-typeset-del-color:#f5503d26;--md-typeset-ins-color:#0bd57026;--md-typeset-kbd-color:#fafafa;--md-typeset-kbd-accent-color:#fff;--md-typeset-kbd-border-color:#b8b8b8;--md-typeset-mark-color:#ffff0080;--md-typeset-table-color:#0000001f;--md-typeset-table-color--light:rgba(0,0,0,.035);--md-admonition-fg-color:var(--md-default-fg-color);--md-admonition-bg-color:var(--md-default-bg-color);--md-warning-fg-color:#000000de;--md-warning-bg-color:#ff9;--md-footer-fg-color:#fff;--md-footer-fg-color--light:#ffffffb3;--md-footer-fg-color--lighter:#ffffff73;--md-footer-bg-color:#000000de;--md-footer-bg-color--dark:#00000052;--md-shadow-z1:0 0.2rem 0.5rem #0000000d,0 0 0.05rem #0000001a;--md-shadow-z2:0 0.2rem 0.5rem #0000001a,0 0 0.05rem #00000040;--md-shadow-z3:0 0.2rem 0.5rem #0003,0 0 0.05rem #00000059}.md-icon svg{fill:currentcolor;display:block;height:1.2rem;width:1.2rem}body{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;--md-text-font-family:var(--md-text-font,_),-apple-system,BlinkMacSystemFont,Helvetica,Arial,sans-serif;--md-code-font-family:var(--md-code-font,_),SFMono-Regular,Consolas,Menlo,monospace}aside,body,input{font-feature-settings:"kern","liga";color:var(--md-typeset-color);font-family:var(--md-text-font-family)}code,kbd,pre{font-feature-settings:"kern";font-family:var(--md-code-font-family)}:root{--md-typeset-table-sort-icon:url('data:image/svg+xml;charset=utf-8,');--md-typeset-table-sort-icon--asc:url('data:image/svg+xml;charset=utf-8,');--md-typeset-table-sort-icon--desc:url('data:image/svg+xml;charset=utf-8,')}.md-typeset{-webkit-print-color-adjust:exact;color-adjust:exact;font-size:.8rem;line-height:1.6}@media print{.md-typeset{font-size:.68rem}}.md-typeset blockquote,.md-typeset dl,.md-typeset figure,.md-typeset ol,.md-typeset pre,.md-typeset ul{margin-bottom:1em;margin-top:1em}.md-typeset h1{color:var(--md-default-fg-color--light);font-size:2em;line-height:1.3;margin:0 0 1.25em}.md-typeset h1,.md-typeset h2{font-weight:300;letter-spacing:-.01em}.md-typeset h2{font-size:1.5625em;line-height:1.4;margin:1.6em 0 .64em}.md-typeset h3{font-size:1.25em;font-weight:400;letter-spacing:-.01em;line-height:1.5;margin:1.6em 0 .8em}.md-typeset h2+h3{margin-top:.8em}.md-typeset h4{font-weight:700;letter-spacing:-.01em;margin:1em 0}.md-typeset h5,.md-typeset h6{color:var(--md-default-fg-color--light);font-size:.8em;font-weight:700;letter-spacing:-.01em;margin:1.25em 0}.md-typeset h5{text-transform:uppercase}.md-typeset hr{border-bottom:.05rem solid var(--md-default-fg-color--lightest);display:flow-root;margin:1.5em 0}.md-typeset a{color:var(--md-typeset-a-color);word-break:break-word}.md-typeset a,.md-typeset a:before{transition:color 125ms}.md-typeset a:focus,.md-typeset a:hover{color:var(--md-accent-fg-color)}.md-typeset a:focus code,.md-typeset a:hover code{background-color:var(--md-accent-fg-color--transparent)}.md-typeset a code{color:currentcolor;transition:background-color 125ms}.md-typeset a.focus-visible{outline-color:var(--md-accent-fg-color);outline-offset:.2rem}.md-typeset code,.md-typeset kbd,.md-typeset pre{color:var(--md-code-fg-color);direction:ltr;font-variant-ligatures:none}@media print{.md-typeset code,.md-typeset kbd,.md-typeset pre{white-space:pre-wrap}}.md-typeset code{background-color:var(--md-code-bg-color);border-radius:.1rem;-webkit-box-decoration-break:clone;box-decoration-break:clone;font-size:.85em;padding:0 .2941176471em;word-break:break-word}.md-typeset code:not(.focus-visible){-webkit-tap-highlight-color:transparent;outline:none}.md-typeset pre{display:flow-root;line-height:1.4;position:relative}.md-typeset pre>code{-webkit-box-decoration-break:slice;box-decoration-break:slice;box-shadow:none;display:block;margin:0;outline-color:var(--md-accent-fg-color);overflow:auto;padding:.7720588235em 1.1764705882em;scrollbar-color:var(--md-default-fg-color--lighter) #0000;scrollbar-width:thin;touch-action:auto;word-break:normal}.md-typeset pre>code:hover{scrollbar-color:var(--md-accent-fg-color) #0000}.md-typeset pre>code::-webkit-scrollbar{height:.2rem;width:.2rem}.md-typeset pre>code::-webkit-scrollbar-thumb{background-color:var(--md-default-fg-color--lighter)}.md-typeset pre>code::-webkit-scrollbar-thumb:hover{background-color:var(--md-accent-fg-color)}.md-typeset kbd{background-color:var(--md-typeset-kbd-color);border-radius:.1rem;box-shadow:0 .1rem 0 .05rem var(--md-typeset-kbd-border-color),0 .1rem 0 var(--md-typeset-kbd-border-color),0 -.1rem .2rem var(--md-typeset-kbd-accent-color) inset;color:var(--md-default-fg-color);display:inline-block;font-size:.75em;padding:0 .6666666667em;vertical-align:text-top;word-break:break-word}.md-typeset mark{background-color:var(--md-typeset-mark-color);-webkit-box-decoration-break:clone;box-decoration-break:clone;color:inherit;word-break:break-word}.md-typeset abbr{border-bottom:.05rem dotted var(--md-default-fg-color--light);cursor:help;text-decoration:none}@media (hover:none){.md-typeset abbr[title]:focus:after,.md-typeset abbr[title]:hover:after{background-color:var(--md-default-fg-color);border-radius:.1rem;box-shadow:var(--md-shadow-z3);color:var(--md-default-bg-color);content:attr(title);font-size:.7rem;left:.8rem;margin-top:2em;padding:.2rem .3rem;position:absolute;right:.8rem}}.md-typeset small{opacity:.75}[dir=ltr] .md-typeset sub,[dir=ltr] .md-typeset sup{margin-left:.078125em}[dir=rtl] .md-typeset sub,[dir=rtl] .md-typeset sup{margin-right:.078125em}[dir=ltr] .md-typeset blockquote{padding-left:.6rem}[dir=rtl] .md-typeset blockquote{padding-right:.6rem}[dir=ltr] .md-typeset blockquote{border-left:.2rem solid var(--md-default-fg-color--lighter)}[dir=rtl] .md-typeset blockquote{border-right:.2rem solid var(--md-default-fg-color--lighter)}.md-typeset blockquote{color:var(--md-default-fg-color--light);margin-left:0;margin-right:0}.md-typeset ul{list-style-type:disc}[dir=ltr] .md-typeset ol,[dir=ltr] .md-typeset ul{margin-left:.625em}[dir=rtl] .md-typeset ol,[dir=rtl] .md-typeset ul{margin-right:.625em}.md-typeset ol,.md-typeset ul{padding:0}.md-typeset ol:not([hidden]),.md-typeset ul:not([hidden]){display:flow-root}.md-typeset ol ol,.md-typeset ul ol{list-style-type:lower-alpha}.md-typeset ol ol ol,.md-typeset ul ol ol{list-style-type:lower-roman}[dir=ltr] .md-typeset ol li,[dir=ltr] .md-typeset ul li{margin-left:1.25em}[dir=rtl] .md-typeset ol li,[dir=rtl] .md-typeset ul li{margin-right:1.25em}.md-typeset ol li,.md-typeset ul li{margin-bottom:.5em}.md-typeset ol li blockquote,.md-typeset ol li p,.md-typeset ul li blockquote,.md-typeset ul li p{margin:.5em 0}.md-typeset ol li:last-child,.md-typeset ul li:last-child{margin-bottom:0}[dir=ltr] .md-typeset ol li ol,[dir=ltr] .md-typeset ol li ul,[dir=ltr] .md-typeset ul li ol,[dir=ltr] .md-typeset ul li ul{margin-left:.625em}[dir=rtl] .md-typeset ol li ol,[dir=rtl] .md-typeset ol li ul,[dir=rtl] .md-typeset ul li ol,[dir=rtl] .md-typeset ul li ul{margin-right:.625em}.md-typeset ol li ol,.md-typeset ol li ul,.md-typeset ul li ol,.md-typeset ul li ul{margin-bottom:.5em;margin-top:.5em}[dir=ltr] .md-typeset dd{margin-left:1.875em}[dir=rtl] .md-typeset dd{margin-right:1.875em}.md-typeset dd{margin-bottom:1.5em;margin-top:1em}.md-typeset img,.md-typeset svg,.md-typeset video{height:auto;max-width:100%}.md-typeset img[align=left]{margin:1em 1em 1em 0}.md-typeset img[align=right]{margin:1em 0 1em 1em}.md-typeset img[align]:only-child{margin-top:0}.md-typeset figure{display:flow-root;margin:1em auto;max-width:100%;text-align:center;width:-webkit-fit-content;width:-moz-fit-content;width:fit-content}.md-typeset figure img{display:block}.md-typeset figcaption{font-style:italic;margin:1em auto;max-width:24rem}.md-typeset iframe{max-width:100%}.md-typeset table:not([class]){background-color:var(--md-default-bg-color);border:.05rem solid var(--md-typeset-table-color);border-radius:.1rem;display:inline-block;font-size:.64rem;max-width:100%;overflow:auto;touch-action:auto}@media print{.md-typeset table:not([class]){display:table}}.md-typeset table:not([class])+*{margin-top:1.5em}.md-typeset table:not([class]) td>:first-child,.md-typeset table:not([class]) th>:first-child{margin-top:0}.md-typeset table:not([class]) td>:last-child,.md-typeset table:not([class]) th>:last-child{margin-bottom:0}.md-typeset table:not([class]) td:not([align]),.md-typeset table:not([class]) th:not([align]){text-align:left}[dir=rtl] .md-typeset table:not([class]) td:not([align]),[dir=rtl] .md-typeset table:not([class]) th:not([align]){text-align:right}.md-typeset table:not([class]) th{font-weight:700;min-width:5rem;padding:.9375em 1.25em;vertical-align:top}.md-typeset table:not([class]) td{border-top:.05rem solid var(--md-typeset-table-color);padding:.9375em 1.25em;vertical-align:top}.md-typeset table:not([class]) tbody tr{transition:background-color 125ms}.md-typeset table:not([class]) tbody tr:hover{background-color:var(--md-typeset-table-color--light);box-shadow:0 .05rem 0 var(--md-default-bg-color) inset}.md-typeset table:not([class]) a{word-break:normal}.md-typeset table th[role=columnheader]{cursor:pointer}[dir=ltr] .md-typeset table th[role=columnheader]:after{margin-left:.5em}[dir=rtl] .md-typeset table th[role=columnheader]:after{margin-right:.5em}.md-typeset table th[role=columnheader]:after{content:"";display:inline-block;height:1.2em;-webkit-mask-image:var(--md-typeset-table-sort-icon);mask-image:var(--md-typeset-table-sort-icon);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;transition:background-color 125ms;vertical-align:text-bottom;width:1.2em}.md-typeset table th[role=columnheader]:hover:after{background-color:var(--md-default-fg-color--lighter)}.md-typeset table th[role=columnheader][aria-sort=ascending]:after{background-color:var(--md-default-fg-color--light);-webkit-mask-image:var(--md-typeset-table-sort-icon--asc);mask-image:var(--md-typeset-table-sort-icon--asc)}.md-typeset table th[role=columnheader][aria-sort=descending]:after{background-color:var(--md-default-fg-color--light);-webkit-mask-image:var(--md-typeset-table-sort-icon--desc);mask-image:var(--md-typeset-table-sort-icon--desc)}.md-typeset__scrollwrap{margin:1em -.8rem;overflow-x:auto;touch-action:auto}.md-typeset__table{display:inline-block;margin-bottom:.5em;padding:0 .8rem}@media print{.md-typeset__table{display:block}}html .md-typeset__table table{display:table;margin:0;overflow:hidden;width:100%}@media screen and (max-width:44.984375em){.md-content__inner>pre{margin:1em -.8rem}.md-content__inner>pre code{border-radius:0}}.md-typeset .md-author{display:block;flex-shrink:0;height:1.6rem;overflow:hidden;position:relative;transition:color 125ms,transform 125ms;width:1.6rem}.md-typeset .md-author img{border-radius:100%;display:block}.md-typeset .md-author--more{background:var(--md-default-fg-color--lightest);color:var(--md-default-fg-color--lighter);font-size:.6rem;font-weight:700;line-height:1.6rem;text-align:center}.md-typeset .md-author--long{height:2.4rem;width:2.4rem}.md-typeset a.md-author{transform:scale(1)}.md-typeset a.md-author img{filter:grayscale(100%) opacity(75%);transition:filter 125ms}.md-typeset a.md-author:focus,.md-typeset a.md-author:hover{transform:scale(1.1);z-index:1}.md-typeset a.md-author:focus img,.md-typeset a.md-author:hover img{filter:grayscale(0)}.md-banner{background-color:var(--md-footer-bg-color);color:var(--md-footer-fg-color);overflow:auto}@media print{.md-banner{display:none}}.md-banner--warning{background-color:var(--md-warning-bg-color);color:var(--md-warning-fg-color)}.md-banner__inner{font-size:.7rem;margin:.6rem auto;padding:0 .8rem}[dir=ltr] .md-banner__button{float:right}[dir=rtl] .md-banner__button{float:left}.md-banner__button{color:inherit;cursor:pointer;transition:opacity .25s}.no-js .md-banner__button{display:none}.md-banner__button:hover{opacity:.7}html{font-size:125%;height:100%;overflow-x:hidden}@media screen and (min-width:100em){html{font-size:137.5%}}@media screen and (min-width:125em){html{font-size:150%}}body{background-color:var(--md-default-bg-color);display:flex;flex-direction:column;font-size:.5rem;min-height:100%;position:relative;width:100%}@media print{body{display:block}}@media screen and (max-width:59.984375em){body[data-md-scrolllock]{position:fixed}}.md-grid{margin-left:auto;margin-right:auto;max-width:61rem}.md-container{display:flex;flex-direction:column;flex-grow:1}@media print{.md-container{display:block}}.md-main{flex-grow:1}.md-main__inner{display:flex;height:100%;margin-top:1.5rem}.md-ellipsis{overflow:hidden;text-overflow:ellipsis}.md-toggle{display:none}.md-option{height:0;opacity:0;position:absolute;width:0}.md-option:checked+label:not([hidden]){display:block}.md-option.focus-visible+label{outline-color:var(--md-accent-fg-color);outline-style:auto}.md-skip{background-color:var(--md-default-fg-color);border-radius:.1rem;color:var(--md-default-bg-color);font-size:.64rem;margin:.5rem;opacity:0;outline-color:var(--md-accent-fg-color);padding:.3rem .5rem;position:fixed;transform:translateY(.4rem);z-index:-1}.md-skip:focus{opacity:1;transform:translateY(0);transition:transform .25s cubic-bezier(.4,0,.2,1),opacity 175ms 75ms;z-index:10}@page{margin:25mm}:root{--md-clipboard-icon:url('data:image/svg+xml;charset=utf-8,')}.md-clipboard{border-radius:.1rem;color:var(--md-default-fg-color--lightest);cursor:pointer;height:1.5em;outline-color:var(--md-accent-fg-color);outline-offset:.1rem;position:absolute;right:.5em;top:.5em;transition:color .25s;width:1.5em;z-index:1}@media print{.md-clipboard{display:none}}.md-clipboard:not(.focus-visible){-webkit-tap-highlight-color:transparent;outline:none}:hover>.md-clipboard{color:var(--md-default-fg-color--light)}.md-clipboard:focus,.md-clipboard:hover{color:var(--md-accent-fg-color)}.md-clipboard:after{background-color:currentcolor;content:"";display:block;height:1.125em;margin:0 auto;-webkit-mask-image:var(--md-clipboard-icon);mask-image:var(--md-clipboard-icon);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;width:1.125em}.md-clipboard--inline{cursor:pointer}.md-clipboard--inline code{transition:color .25s,background-color .25s}.md-clipboard--inline:focus code,.md-clipboard--inline:hover code{background-color:var(--md-accent-fg-color--transparent);color:var(--md-accent-fg-color)}@keyframes consent{0%{opacity:0;transform:translateY(100%)}to{opacity:1;transform:translateY(0)}}@keyframes overlay{0%{opacity:0}to{opacity:1}}.md-consent__overlay{animation:overlay .25s both;-webkit-backdrop-filter:blur(.1rem);backdrop-filter:blur(.1rem);background-color:#0000008a;height:100%;opacity:1;position:fixed;top:0;width:100%;z-index:5}.md-consent__inner{animation:consent .5s cubic-bezier(.1,.7,.1,1) both;background-color:var(--md-default-bg-color);border:0;border-radius:.1rem;bottom:0;box-shadow:0 0 .2rem #0000001a,0 .2rem .4rem #0003;max-height:100%;overflow:auto;padding:0;position:fixed;width:100%;z-index:5}.md-consent__form{padding:.8rem}.md-consent__settings{display:none;margin:1em 0}input:checked+.md-consent__settings{display:block}.md-consent__controls{margin-bottom:.8rem}.md-typeset .md-consent__controls .md-button{display:inline}@media screen and (max-width:44.984375em){.md-typeset .md-consent__controls .md-button{display:block;margin-top:.4rem;text-align:center;width:100%}}.md-consent label{cursor:pointer}.md-content{flex-grow:1;min-width:0}.md-content__inner{margin:0 .8rem 1.2rem;padding-top:.6rem}@media screen and (min-width:76.25em){[dir=ltr] .md-sidebar--primary:not([hidden])~.md-content>.md-content__inner{margin-left:1.2rem}[dir=ltr] .md-sidebar--secondary:not([hidden])~.md-content>.md-content__inner,[dir=rtl] .md-sidebar--primary:not([hidden])~.md-content>.md-content__inner{margin-right:1.2rem}[dir=rtl] .md-sidebar--secondary:not([hidden])~.md-content>.md-content__inner{margin-left:1.2rem}}.md-content__inner:before{content:"";display:block;height:.4rem}.md-content__inner>:last-child{margin-bottom:0}[dir=ltr] .md-content__button{float:right}[dir=rtl] .md-content__button{float:left}[dir=ltr] .md-content__button{margin-left:.4rem}[dir=rtl] .md-content__button{margin-right:.4rem}.md-content__button{margin:.4rem 0;padding:0}@media print{.md-content__button{display:none}}.md-typeset .md-content__button{color:var(--md-default-fg-color--lighter)}.md-content__button svg{display:inline;vertical-align:top}[dir=rtl] .md-content__button svg{transform:scaleX(-1)}[dir=ltr] .md-dialog{right:.8rem}[dir=rtl] .md-dialog{left:.8rem}.md-dialog{background-color:var(--md-default-fg-color);border-radius:.1rem;bottom:.8rem;box-shadow:var(--md-shadow-z3);min-width:11.1rem;opacity:0;padding:.4rem .6rem;pointer-events:none;position:fixed;transform:translateY(100%);transition:transform 0ms .4s,opacity .4s;z-index:4}@media print{.md-dialog{display:none}}.md-dialog--active{opacity:1;pointer-events:auto;transform:translateY(0);transition:transform .4s cubic-bezier(.075,.85,.175,1),opacity .4s}.md-dialog__inner{color:var(--md-default-bg-color);font-size:.7rem}.md-feedback{margin:2em 0 1em;text-align:center}.md-feedback fieldset{border:none;margin:0;padding:0}.md-feedback__title{font-weight:700;margin:1em auto}.md-feedback__inner{position:relative}.md-feedback__list{align-content:baseline;display:flex;flex-wrap:wrap;justify-content:center;position:relative}.md-feedback__list:hover .md-icon:not(:disabled){color:var(--md-default-fg-color--lighter)}:disabled .md-feedback__list{min-height:1.8rem}.md-feedback__icon{color:var(--md-default-fg-color--light);cursor:pointer;flex-shrink:0;margin:0 .1rem;transition:color 125ms}.md-feedback__icon:not(:disabled).md-icon:hover{color:var(--md-accent-fg-color)}.md-feedback__icon:disabled{color:var(--md-default-fg-color--lightest);pointer-events:none}.md-feedback__note{opacity:0;position:relative;transform:translateY(.4rem);transition:transform .4s cubic-bezier(.1,.7,.1,1),opacity .15s}.md-feedback__note>*{margin:0 auto;max-width:16rem}:disabled .md-feedback__note{opacity:1;transform:translateY(0)}.md-footer{background-color:var(--md-footer-bg-color);color:var(--md-footer-fg-color)}@media print{.md-footer{display:none}}.md-footer__inner{justify-content:space-between;overflow:auto;padding:.2rem}.md-footer__inner:not([hidden]){display:flex}.md-footer__link{align-items:end;display:flex;flex-grow:0.01;margin-bottom:.4rem;margin-top:1rem;max-width:100%;outline-color:var(--md-accent-fg-color);overflow:hidden;transition:opacity .25s}.md-footer__link:focus,.md-footer__link:hover{opacity:.7}[dir=rtl] .md-footer__link svg{transform:scaleX(-1)}@media screen and (max-width:44.984375em){.md-footer__link--prev{flex-shrink:0}.md-footer__link--prev .md-footer__title{display:none}}[dir=ltr] .md-footer__link--next{margin-left:auto}[dir=rtl] .md-footer__link--next{margin-right:auto}.md-footer__link--next{text-align:right}[dir=rtl] .md-footer__link--next{text-align:left}.md-footer__title{flex-grow:1;font-size:.9rem;margin-bottom:.7rem;max-width:calc(100% - 2.4rem);padding:0 1rem;white-space:nowrap}.md-footer__button{margin:.2rem;padding:.4rem}.md-footer__direction{font-size:.64rem;opacity:.7}.md-footer-meta{background-color:var(--md-footer-bg-color--dark)}.md-footer-meta__inner{display:flex;flex-wrap:wrap;justify-content:space-between;padding:.2rem}html .md-footer-meta.md-typeset a{color:var(--md-footer-fg-color--light)}html .md-footer-meta.md-typeset a:focus,html .md-footer-meta.md-typeset a:hover{color:var(--md-footer-fg-color)}.md-copyright{color:var(--md-footer-fg-color--lighter);font-size:.64rem;margin:auto .6rem;padding:.4rem 0;width:100%}@media screen and (min-width:45em){.md-copyright{width:auto}}.md-copyright__highlight{color:var(--md-footer-fg-color--light)}.md-social{display:inline-flex;gap:.2rem;margin:0 .4rem;padding:.2rem 0 .6rem}@media screen and (min-width:45em){.md-social{padding:.6rem 0}}.md-social__link{display:inline-block;height:1.6rem;text-align:center;width:1.6rem}.md-social__link:before{line-height:1.9}.md-social__link svg{fill:currentcolor;max-height:.8rem;vertical-align:-25%}.md-typeset .md-button{border:.1rem solid;border-radius:.1rem;color:var(--md-primary-fg-color);cursor:pointer;display:inline-block;font-weight:700;padding:.625em 2em;transition:color 125ms,background-color 125ms,border-color 125ms}.md-typeset .md-button--primary{background-color:var(--md-primary-fg-color);border-color:var(--md-primary-fg-color);color:var(--md-primary-bg-color)}.md-typeset .md-button:focus,.md-typeset .md-button:hover{background-color:var(--md-accent-fg-color);border-color:var(--md-accent-fg-color);color:var(--md-accent-bg-color)}[dir=ltr] .md-typeset .md-input{border-top-left-radius:.1rem}[dir=ltr] .md-typeset .md-input,[dir=rtl] .md-typeset .md-input{border-top-right-radius:.1rem}[dir=rtl] .md-typeset .md-input{border-top-left-radius:.1rem}.md-typeset .md-input{border-bottom:.1rem solid var(--md-default-fg-color--lighter);box-shadow:var(--md-shadow-z1);font-size:.8rem;height:1.8rem;padding:0 .6rem;transition:border .25s,box-shadow .25s}.md-typeset .md-input:focus,.md-typeset .md-input:hover{border-bottom-color:var(--md-accent-fg-color);box-shadow:var(--md-shadow-z2)}.md-typeset .md-input--stretch{width:100%}.md-header{background-color:var(--md-primary-fg-color);box-shadow:0 0 .2rem #0000,0 .2rem .4rem #0000;color:var(--md-primary-bg-color);display:block;left:0;position:sticky;right:0;top:0;z-index:4}@media print{.md-header{display:none}}.md-header[hidden]{transform:translateY(-100%);transition:transform .25s cubic-bezier(.8,0,.6,1),box-shadow .25s}.md-header--shadow{box-shadow:0 0 .2rem #0000001a,0 .2rem .4rem #0003;transition:transform .25s cubic-bezier(.1,.7,.1,1),box-shadow .25s}.md-header__inner{align-items:center;display:flex;padding:0 .2rem}.md-header__button{color:currentcolor;cursor:pointer;margin:.2rem;outline-color:var(--md-accent-fg-color);padding:.4rem;position:relative;transition:opacity .25s;vertical-align:middle;z-index:1}.md-header__button:hover{opacity:.7}.md-header__button:not([hidden]){display:inline-block}.md-header__button:not(.focus-visible){-webkit-tap-highlight-color:transparent;outline:none}.md-header__button.md-logo{margin:.2rem;padding:.4rem}@media screen and (max-width:76.234375em){.md-header__button.md-logo{display:none}}.md-header__button.md-logo img,.md-header__button.md-logo svg{fill:currentcolor;display:block;height:1.2rem;width:auto}@media screen and (min-width:60em){.md-header__button[for=__search]{display:none}}.no-js .md-header__button[for=__search]{display:none}[dir=rtl] .md-header__button[for=__search] svg{transform:scaleX(-1)}@media screen and (min-width:76.25em){.md-header__button[for=__drawer]{display:none}}.md-header__topic{display:flex;max-width:100%;position:absolute;transition:transform .4s cubic-bezier(.1,.7,.1,1),opacity .15s;white-space:nowrap}.md-header__topic+.md-header__topic{opacity:0;pointer-events:none;transform:translateX(1.25rem);transition:transform .4s cubic-bezier(1,.7,.1,.1),opacity .15s;z-index:-1}[dir=rtl] .md-header__topic+.md-header__topic{transform:translateX(-1.25rem)}.md-header__topic:first-child{font-weight:700}[dir=ltr] .md-header__title{margin-left:1rem}[dir=rtl] .md-header__title{margin-right:1rem}[dir=ltr] .md-header__title{margin-right:.4rem}[dir=rtl] .md-header__title{margin-left:.4rem}.md-header__title{flex-grow:1;font-size:.9rem;height:2.4rem;line-height:2.4rem}.md-header__title--active .md-header__topic{opacity:0;pointer-events:none;transform:translateX(-1.25rem);transition:transform .4s cubic-bezier(1,.7,.1,.1),opacity .15s;z-index:-1}[dir=rtl] .md-header__title--active .md-header__topic{transform:translateX(1.25rem)}.md-header__title--active .md-header__topic+.md-header__topic{opacity:1;pointer-events:auto;transform:translateX(0);transition:transform .4s cubic-bezier(.1,.7,.1,1),opacity .15s;z-index:0}.md-header__title>.md-header__ellipsis{height:100%;position:relative;width:100%}.md-header__option{display:flex;flex-shrink:0;max-width:100%;transition:max-width 0ms .25s,opacity .25s .25s;white-space:nowrap}[data-md-toggle=search]:checked~.md-header .md-header__option{max-width:0;opacity:0;transition:max-width 0ms,opacity 0ms}.md-header__option>input{bottom:0}.md-header__source{display:none}@media screen and (min-width:60em){[dir=ltr] .md-header__source{margin-left:1rem}[dir=rtl] .md-header__source{margin-right:1rem}.md-header__source{display:block;max-width:11.7rem;width:11.7rem}}@media screen and (min-width:76.25em){[dir=ltr] .md-header__source{margin-left:1.4rem}[dir=rtl] .md-header__source{margin-right:1.4rem}}.md-meta{color:var(--md-default-fg-color--light);font-size:.7rem;line-height:1.3}.md-meta__list{display:inline-flex;flex-wrap:wrap;list-style:none;margin:0;padding:0}.md-meta__item:not(:last-child):after{content:"·";margin-left:.2rem;margin-right:.2rem}.md-meta__link{color:var(--md-typeset-a-color)}.md-meta__link:focus,.md-meta__link:hover{color:var(--md-accent-fg-color)}.md-draft{background-color:#ff1744;border-radius:.125em;color:#fff;display:inline-block;font-weight:700;padding-left:.5714285714em;padding-right:.5714285714em}:root{--md-nav-icon--prev:url('data:image/svg+xml;charset=utf-8,');--md-nav-icon--next:url('data:image/svg+xml;charset=utf-8,');--md-toc-icon:url('data:image/svg+xml;charset=utf-8,')}.md-nav{font-size:.7rem;line-height:1.3}.md-nav__title{color:var(--md-default-fg-color--light);display:block;font-weight:700;overflow:hidden;padding:0 .6rem;text-overflow:ellipsis}.md-nav__title .md-nav__button{display:none}.md-nav__title .md-nav__button img{height:100%;width:auto}.md-nav__title .md-nav__button.md-logo img,.md-nav__title .md-nav__button.md-logo svg{fill:currentcolor;display:block;height:2.4rem;max-width:100%;object-fit:contain;width:auto}.md-nav__list{list-style:none;margin:0;padding:0}.md-nav__link{align-items:flex-start;display:flex;gap:.4rem;margin-top:.625em;scroll-snap-align:start;transition:color 125ms}.md-nav__link--passed{color:var(--md-default-fg-color--light)}.md-nav__item .md-nav__link--active,.md-nav__item .md-nav__link--active code{color:var(--md-typeset-a-color)}.md-nav__link .md-ellipsis{position:relative}[dir=ltr] .md-nav__link .md-icon:last-child{margin-left:auto}[dir=rtl] .md-nav__link .md-icon:last-child{margin-right:auto}.md-nav__link svg{fill:currentcolor;flex-shrink:0;height:1.3em}.md-nav__link[for]:focus,.md-nav__link[for]:hover,.md-nav__link[href]:focus,.md-nav__link[href]:hover{color:var(--md-accent-fg-color);cursor:pointer}.md-nav__link.focus-visible{outline-color:var(--md-accent-fg-color);outline-offset:.2rem}.md-nav--primary .md-nav__link[for=__toc]{display:none}.md-nav--primary .md-nav__link[for=__toc] .md-icon:after{background-color:currentcolor;display:block;height:100%;-webkit-mask-image:var(--md-toc-icon);mask-image:var(--md-toc-icon);width:100%}.md-nav--primary .md-nav__link[for=__toc]~.md-nav{display:none}.md-nav__container>.md-nav__link{margin-top:0}.md-nav__container>.md-nav__link:first-child{flex-grow:1;min-width:0}.md-nav__icon{flex-shrink:0}.md-nav__source{display:none}@media screen and (max-width:76.234375em){.md-nav--primary,.md-nav--primary .md-nav{background-color:var(--md-default-bg-color);display:flex;flex-direction:column;height:100%;left:0;position:absolute;right:0;top:0;z-index:1}.md-nav--primary .md-nav__item,.md-nav--primary .md-nav__title{font-size:.8rem;line-height:1.5}.md-nav--primary .md-nav__title{background-color:var(--md-default-fg-color--lightest);color:var(--md-default-fg-color--light);cursor:pointer;height:5.6rem;line-height:2.4rem;padding:3rem .8rem .2rem;position:relative;white-space:nowrap}[dir=ltr] .md-nav--primary .md-nav__title .md-nav__icon{left:.4rem}[dir=rtl] .md-nav--primary .md-nav__title .md-nav__icon{right:.4rem}.md-nav--primary .md-nav__title .md-nav__icon{display:block;height:1.2rem;margin:.2rem;position:absolute;top:.4rem;width:1.2rem}.md-nav--primary .md-nav__title .md-nav__icon:after{background-color:currentcolor;content:"";display:block;height:100%;-webkit-mask-image:var(--md-nav-icon--prev);mask-image:var(--md-nav-icon--prev);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;width:100%}.md-nav--primary .md-nav__title~.md-nav__list{background-color:var(--md-default-bg-color);box-shadow:0 .05rem 0 var(--md-default-fg-color--lightest) inset;overflow-y:auto;scroll-snap-type:y mandatory;touch-action:pan-y}.md-nav--primary .md-nav__title~.md-nav__list>:first-child{border-top:0}.md-nav--primary .md-nav__title[for=__drawer]{background-color:var(--md-primary-fg-color);color:var(--md-primary-bg-color);font-weight:700}.md-nav--primary .md-nav__title .md-logo{display:block;left:.2rem;margin:.2rem;padding:.4rem;position:absolute;right:.2rem;top:.2rem}.md-nav--primary .md-nav__list{flex:1}.md-nav--primary .md-nav__item{border-top:.05rem solid var(--md-default-fg-color--lightest)}.md-nav--primary .md-nav__item--active>.md-nav__link{color:var(--md-typeset-a-color)}.md-nav--primary .md-nav__item--active>.md-nav__link:focus,.md-nav--primary .md-nav__item--active>.md-nav__link:hover{color:var(--md-accent-fg-color)}.md-nav--primary .md-nav__link{margin-top:0;padding:.6rem .8rem}.md-nav--primary .md-nav__link svg{margin-top:.1em}.md-nav--primary .md-nav__link>.md-nav__link{padding:0}[dir=ltr] .md-nav--primary .md-nav__link .md-nav__icon{margin-right:-.2rem}[dir=rtl] .md-nav--primary .md-nav__link .md-nav__icon{margin-left:-.2rem}.md-nav--primary .md-nav__link .md-nav__icon{font-size:1.2rem;height:1.2rem;width:1.2rem}.md-nav--primary .md-nav__link .md-nav__icon:after{background-color:currentcolor;content:"";display:block;height:100%;-webkit-mask-image:var(--md-nav-icon--next);mask-image:var(--md-nav-icon--next);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;width:100%}[dir=rtl] .md-nav--primary .md-nav__icon:after{transform:scale(-1)}.md-nav--primary .md-nav--secondary .md-nav{background-color:initial;position:static}[dir=ltr] .md-nav--primary .md-nav--secondary .md-nav .md-nav__link{padding-left:1.4rem}[dir=rtl] .md-nav--primary .md-nav--secondary .md-nav .md-nav__link{padding-right:1.4rem}[dir=ltr] .md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav__link{padding-left:2rem}[dir=rtl] .md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav__link{padding-right:2rem}[dir=ltr] .md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav .md-nav__link{padding-left:2.6rem}[dir=rtl] .md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav .md-nav__link{padding-right:2.6rem}[dir=ltr] .md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav .md-nav .md-nav__link{padding-left:3.2rem}[dir=rtl] .md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav .md-nav .md-nav__link{padding-right:3.2rem}.md-nav--secondary{background-color:initial}.md-nav__toggle~.md-nav{display:flex;opacity:0;transform:translateX(100%);transition:transform .25s cubic-bezier(.8,0,.6,1),opacity 125ms 50ms}[dir=rtl] .md-nav__toggle~.md-nav{transform:translateX(-100%)}.md-nav__toggle:checked~.md-nav{opacity:1;transform:translateX(0);transition:transform .25s cubic-bezier(.4,0,.2,1),opacity 125ms 125ms}.md-nav__toggle:checked~.md-nav>.md-nav__list{-webkit-backface-visibility:hidden;backface-visibility:hidden}}@media screen and (max-width:59.984375em){.md-nav--primary .md-nav__link[for=__toc]{display:flex}.md-nav--primary .md-nav__link[for=__toc] .md-icon:after{content:""}.md-nav--primary .md-nav__link[for=__toc]+.md-nav__link{display:none}.md-nav--primary .md-nav__link[for=__toc]~.md-nav{display:flex}.md-nav__source{background-color:var(--md-primary-fg-color--dark);color:var(--md-primary-bg-color);display:block;padding:0 .2rem}}@media screen and (min-width:60em) and (max-width:76.234375em){.md-nav--integrated .md-nav__link[for=__toc]{display:flex}.md-nav--integrated .md-nav__link[for=__toc] .md-icon:after{content:""}.md-nav--integrated .md-nav__link[for=__toc]+.md-nav__link{display:none}.md-nav--integrated .md-nav__link[for=__toc]~.md-nav{display:flex}}@media screen and (min-width:60em){.md-nav{margin-bottom:-.4rem}.md-nav--secondary .md-nav__title{background:var(--md-default-bg-color);box-shadow:0 0 .4rem .4rem var(--md-default-bg-color);position:sticky;top:0;z-index:1}.md-nav--secondary .md-nav__title[for=__toc]{scroll-snap-align:start}.md-nav--secondary .md-nav__title .md-nav__icon{display:none}[dir=ltr] .md-nav--secondary .md-nav__list{padding-left:.6rem}[dir=rtl] .md-nav--secondary .md-nav__list{padding-right:.6rem}.md-nav--secondary .md-nav__list{padding-bottom:.4rem}[dir=ltr] .md-nav--secondary .md-nav__item>.md-nav__link{margin-right:.4rem}[dir=rtl] .md-nav--secondary .md-nav__item>.md-nav__link{margin-left:.4rem}}@media screen and (min-width:76.25em){.md-nav{margin-bottom:-.4rem;transition:max-height .25s cubic-bezier(.86,0,.07,1)}.md-nav--primary .md-nav__title{background:var(--md-default-bg-color);box-shadow:0 0 .4rem .4rem var(--md-default-bg-color);position:sticky;top:0;z-index:1}.md-nav--primary .md-nav__title[for=__drawer]{scroll-snap-align:start}.md-nav--primary .md-nav__title .md-nav__icon{display:none}[dir=ltr] .md-nav--primary .md-nav__list{padding-left:.6rem}[dir=rtl] .md-nav--primary .md-nav__list{padding-right:.6rem}.md-nav--primary .md-nav__list{padding-bottom:.4rem}[dir=ltr] .md-nav--primary .md-nav__item>.md-nav__link{margin-right:.4rem}[dir=rtl] .md-nav--primary .md-nav__item>.md-nav__link{margin-left:.4rem}.md-nav__toggle~.md-nav{display:grid;grid-template-rows:0fr;opacity:0;transition:grid-template-rows .25s cubic-bezier(.86,0,.07,1),opacity .25s,visibility 0ms .25s;visibility:collapse}.md-nav__toggle~.md-nav>.md-nav__list{overflow:hidden}.md-nav__toggle:checked~.md-nav,.md-nav__toggle:indeterminate~.md-nav{grid-template-rows:1fr;opacity:1;transition:grid-template-rows .25s cubic-bezier(.86,0,.07,1),opacity .15s .1s,visibility 0ms;visibility:visible}.md-nav__item--nested>.md-nav>.md-nav__title{display:none}.md-nav__item--section{display:block;margin:1.25em 0}.md-nav__item--section:last-child{margin-bottom:0}.md-nav__item--section>.md-nav__link{font-weight:700}.md-nav__item--section>.md-nav__link[for]{color:var(--md-default-fg-color--light)}.md-nav__item--section>.md-nav__link:not(.md-nav__container){pointer-events:none}.md-nav__item--section>.md-nav__link .md-icon,.md-nav__item--section>.md-nav__link>[for]{display:none}[dir=ltr] .md-nav__item--section>.md-nav{margin-left:-.6rem}[dir=rtl] .md-nav__item--section>.md-nav{margin-right:-.6rem}.md-nav__item--section>.md-nav{display:block;opacity:1;visibility:visible}.md-nav__item--section>.md-nav>.md-nav__list>.md-nav__item{padding:0}.md-nav__icon{border-radius:100%;height:.9rem;transition:background-color .25s;width:.9rem}.md-nav__icon:hover{background-color:var(--md-accent-fg-color--transparent)}.md-nav__icon:after{background-color:currentcolor;border-radius:100%;content:"";display:inline-block;height:100%;-webkit-mask-image:var(--md-nav-icon--next);mask-image:var(--md-nav-icon--next);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;transition:transform .25s;vertical-align:-.1rem;width:100%}[dir=rtl] .md-nav__icon:after{transform:rotate(180deg)}.md-nav__item--nested .md-nav__toggle:checked~.md-nav__link .md-nav__icon:after,.md-nav__item--nested .md-nav__toggle:indeterminate~.md-nav__link .md-nav__icon:after{transform:rotate(90deg)}.md-nav--lifted>.md-nav__list>.md-nav__item,.md-nav--lifted>.md-nav__title{display:none}.md-nav--lifted>.md-nav__list>.md-nav__item--active{display:block}.md-nav--lifted>.md-nav__list>.md-nav__item--active>.md-nav__link{background:var(--md-default-bg-color);box-shadow:0 0 .4rem .4rem var(--md-default-bg-color);margin-top:0;position:sticky;top:0;z-index:1}.md-nav--lifted>.md-nav__list>.md-nav__item--active>.md-nav__link:not(.md-nav__container){pointer-events:none}.md-nav--lifted>.md-nav__list>.md-nav__item--active.md-nav__item--section{margin:0}[dir=ltr] .md-nav--lifted>.md-nav__list>.md-nav__item>.md-nav{margin-left:-.6rem}[dir=rtl] .md-nav--lifted>.md-nav__list>.md-nav__item>.md-nav{margin-right:-.6rem}.md-nav--lifted>.md-nav__list>.md-nav__item>[for]{color:var(--md-default-fg-color--light)}.md-nav--lifted .md-nav[data-md-level="1"]{grid-template-rows:1fr;opacity:1;visibility:visible}.md-nav--integrated>.md-nav__list>.md-nav__item--active:not(.md-nav__item--nested){padding:0 .6rem}.md-nav--integrated>.md-nav__list>.md-nav__item--active:not(.md-nav__item--nested)>.md-nav__link{padding:0}[dir=ltr] .md-nav--integrated>.md-nav__list>.md-nav__item--active .md-nav--secondary{border-left:.05rem solid var(--md-primary-fg-color)}[dir=rtl] .md-nav--integrated>.md-nav__list>.md-nav__item--active .md-nav--secondary{border-right:.05rem solid var(--md-primary-fg-color)}.md-nav--integrated>.md-nav__list>.md-nav__item--active .md-nav--secondary{display:block;margin-bottom:1.25em;opacity:1;visibility:visible}.md-nav--integrated>.md-nav__list>.md-nav__item--active .md-nav--secondary>.md-nav__list{overflow:visible;padding-bottom:0}.md-nav--integrated>.md-nav__list>.md-nav__item--active .md-nav--secondary>.md-nav__title{display:none}}.md-pagination{font-size:.8rem;font-weight:700;gap:.4rem}.md-pagination,.md-pagination>*{align-items:center;display:flex;justify-content:center}.md-pagination>*{border-radius:.2rem;height:1.8rem;min-width:1.8rem;text-align:center}.md-pagination__current{background-color:var(--md-default-fg-color--lightest);color:var(--md-default-fg-color--light)}.md-pagination__link{transition:color 125ms,background-color 125ms}.md-pagination__link:focus,.md-pagination__link:hover{background-color:var(--md-accent-fg-color--transparent);color:var(--md-accent-fg-color)}.md-pagination__link:focus svg,.md-pagination__link:hover svg{color:var(--md-accent-fg-color)}.md-pagination__link.focus-visible{outline-color:var(--md-accent-fg-color);outline-offset:.2rem}.md-pagination__link svg{fill:currentcolor;color:var(--md-default-fg-color--lighter);display:block;max-height:100%;width:1.2rem}.md-post__back{border-bottom:.05rem solid var(--md-default-fg-color--lightest);margin-bottom:1.2rem;padding-bottom:1.2rem}@media screen and (max-width:76.234375em){.md-post__back{display:none}}[dir=rtl] .md-post__back svg{transform:scaleX(-1)}.md-post__authors{display:flex;flex-direction:column;gap:.6rem;margin:0 .6rem 1.2rem}.md-post .md-post__meta a{transition:color 125ms}.md-post .md-post__meta a:focus,.md-post .md-post__meta a:hover{color:var(--md-accent-fg-color)}.md-post__title{color:var(--md-default-fg-color--light);font-weight:700}.md-post--excerpt{margin-bottom:3.2rem}.md-post--excerpt .md-post__header{align-items:center;display:flex;gap:.6rem;min-height:1.6rem}.md-post--excerpt .md-post__authors{align-items:center;display:inline-flex;flex-direction:row;gap:.2rem;margin:0;min-height:2.4rem}[dir=ltr] .md-post--excerpt .md-post__meta .md-meta__list{margin-right:.4rem}[dir=rtl] .md-post--excerpt .md-post__meta .md-meta__list{margin-left:.4rem}.md-post--excerpt .md-post__content>:first-child{--md-scroll-margin:6rem;margin-top:0}.md-post>.md-nav--secondary{margin:1em 0}.md-profile{align-items:center;display:flex;font-size:.7rem;gap:.6rem;line-height:1.4;width:100%}.md-profile__description{flex-grow:1}.md-content--post{display:flex}@media screen and (max-width:76.234375em){.md-content--post{flex-flow:column-reverse}}.md-content--post>.md-content__inner{min-width:0}@media screen and (min-width:76.25em){[dir=ltr] .md-content--post>.md-content__inner{margin-left:1.2rem}[dir=rtl] .md-content--post>.md-content__inner{margin-right:1.2rem}}@media screen and (max-width:76.234375em){.md-sidebar.md-sidebar--post{padding:0;position:static;width:100%}.md-sidebar.md-sidebar--post .md-sidebar__inner{padding:0}.md-sidebar.md-sidebar--post .md-post__meta{margin-left:.6rem;margin-right:.6rem}.md-sidebar.md-sidebar--post .md-nav__item{border:none;display:inline}.md-sidebar.md-sidebar--post .md-nav__list{display:inline-flex;flex-wrap:wrap;gap:.6rem;padding-bottom:.6rem;padding-top:.6rem}.md-sidebar.md-sidebar--post .md-nav__link{padding:0}.md-sidebar.md-sidebar--post .md-nav{position:static}}:root{--md-progress-value:0;--md-progress-delay:400ms}.md-progress{background:var(--md-primary-bg-color);height:.075rem;opacity:min(clamp(0,var(--md-progress-value),1),clamp(0,100 - var(--md-progress-value),1));position:fixed;top:0;transform:scaleX(calc(var(--md-progress-value)*1%));transform-origin:left;transition:transform .5s cubic-bezier(.19,1,.22,1),opacity .25s var(--md-progress-delay);width:100%;z-index:4}:root{--md-search-result-icon:url('data:image/svg+xml;charset=utf-8,')}.md-search{position:relative}@media screen and (min-width:60em){.md-search{padding:.2rem 0}}.no-js .md-search{display:none}.md-search__overlay{opacity:0;z-index:1}@media screen and (max-width:59.984375em){[dir=ltr] .md-search__overlay{left:-2.2rem}[dir=rtl] .md-search__overlay{right:-2.2rem}.md-search__overlay{background-color:var(--md-default-bg-color);border-radius:1rem;height:2rem;overflow:hidden;pointer-events:none;position:absolute;top:-1rem;transform-origin:center;transition:transform .3s .1s,opacity .2s .2s;width:2rem}[data-md-toggle=search]:checked~.md-header .md-search__overlay{opacity:1;transition:transform .4s,opacity .1s}}@media screen and (min-width:60em){[dir=ltr] .md-search__overlay{left:0}[dir=rtl] .md-search__overlay{right:0}.md-search__overlay{background-color:#0000008a;cursor:pointer;height:0;position:fixed;top:0;transition:width 0ms .25s,height 0ms .25s,opacity .25s;width:0}[data-md-toggle=search]:checked~.md-header .md-search__overlay{height:200vh;opacity:1;transition:width 0ms,height 0ms,opacity .25s;width:100%}}@media screen and (max-width:29.984375em){[data-md-toggle=search]:checked~.md-header .md-search__overlay{transform:scale(45)}}@media screen and (min-width:30em) and (max-width:44.984375em){[data-md-toggle=search]:checked~.md-header .md-search__overlay{transform:scale(60)}}@media screen and (min-width:45em) and (max-width:59.984375em){[data-md-toggle=search]:checked~.md-header .md-search__overlay{transform:scale(75)}}.md-search__inner{-webkit-backface-visibility:hidden;backface-visibility:hidden}@media screen and (max-width:59.984375em){[dir=ltr] .md-search__inner{left:0}[dir=rtl] .md-search__inner{right:0}.md-search__inner{height:0;opacity:0;overflow:hidden;position:fixed;top:0;transform:translateX(5%);transition:width 0ms .3s,height 0ms .3s,transform .15s cubic-bezier(.4,0,.2,1) .15s,opacity .15s .15s;width:0;z-index:2}[dir=rtl] .md-search__inner{transform:translateX(-5%)}[data-md-toggle=search]:checked~.md-header .md-search__inner{height:100%;opacity:1;transform:translateX(0);transition:width 0ms 0ms,height 0ms 0ms,transform .15s cubic-bezier(.1,.7,.1,1) .15s,opacity .15s .15s;width:100%}}@media screen and (min-width:60em){[dir=ltr] .md-search__inner{float:right}[dir=rtl] .md-search__inner{float:left}.md-search__inner{padding:.1rem 0;position:relative;transition:width .25s cubic-bezier(.1,.7,.1,1);width:11.7rem}}@media screen and (min-width:60em) and (max-width:76.234375em){[data-md-toggle=search]:checked~.md-header .md-search__inner{width:23.4rem}}@media screen and (min-width:76.25em){[data-md-toggle=search]:checked~.md-header .md-search__inner{width:34.4rem}}.md-search__form{background-color:var(--md-default-bg-color);box-shadow:0 0 .6rem #0000;height:2.4rem;position:relative;transition:color .25s,background-color .25s;z-index:2}@media screen and (min-width:60em){.md-search__form{background-color:#00000042;border-radius:.1rem;height:1.8rem}.md-search__form:hover{background-color:#ffffff1f}}[data-md-toggle=search]:checked~.md-header .md-search__form{background-color:var(--md-default-bg-color);border-radius:.1rem .1rem 0 0;box-shadow:0 0 .6rem #00000012;color:var(--md-default-fg-color)}[dir=ltr] .md-search__input{padding-left:3.6rem;padding-right:2.2rem}[dir=rtl] .md-search__input{padding-left:2.2rem;padding-right:3.6rem}.md-search__input{background:#0000;font-size:.9rem;height:100%;position:relative;text-overflow:ellipsis;width:100%;z-index:2}.md-search__input::placeholder{transition:color .25s}.md-search__input::placeholder,.md-search__input~.md-search__icon{color:var(--md-default-fg-color--light)}.md-search__input::-ms-clear{display:none}@media screen and (max-width:59.984375em){.md-search__input{font-size:.9rem;height:2.4rem;width:100%}}@media screen and (min-width:60em){[dir=ltr] .md-search__input{padding-left:2.2rem}[dir=rtl] .md-search__input{padding-right:2.2rem}.md-search__input{color:inherit;font-size:.8rem}.md-search__input::placeholder{color:var(--md-primary-bg-color--light)}.md-search__input+.md-search__icon{color:var(--md-primary-bg-color)}[data-md-toggle=search]:checked~.md-header .md-search__input{text-overflow:clip}[data-md-toggle=search]:checked~.md-header .md-search__input+.md-search__icon{color:var(--md-default-fg-color--light)}[data-md-toggle=search]:checked~.md-header .md-search__input::placeholder{color:#0000}}.md-search__icon{cursor:pointer;display:inline-block;height:1.2rem;transition:color .25s,opacity .25s;width:1.2rem}.md-search__icon:hover{opacity:.7}[dir=ltr] .md-search__icon[for=__search]{left:.5rem}[dir=rtl] .md-search__icon[for=__search]{right:.5rem}.md-search__icon[for=__search]{position:absolute;top:.3rem;z-index:2}[dir=rtl] .md-search__icon[for=__search] svg{transform:scaleX(-1)}@media screen and (max-width:59.984375em){[dir=ltr] .md-search__icon[for=__search]{left:.8rem}[dir=rtl] .md-search__icon[for=__search]{right:.8rem}.md-search__icon[for=__search]{top:.6rem}.md-search__icon[for=__search] svg:first-child{display:none}}@media screen and (min-width:60em){.md-search__icon[for=__search]{pointer-events:none}.md-search__icon[for=__search] svg:last-child{display:none}}[dir=ltr] .md-search__options{right:.5rem}[dir=rtl] .md-search__options{left:.5rem}.md-search__options{pointer-events:none;position:absolute;top:.3rem;z-index:2}@media screen and (max-width:59.984375em){[dir=ltr] .md-search__options{right:.8rem}[dir=rtl] .md-search__options{left:.8rem}.md-search__options{top:.6rem}}[dir=ltr] .md-search__options>.md-icon{margin-left:.2rem}[dir=rtl] .md-search__options>.md-icon{margin-right:.2rem}.md-search__options>.md-icon{color:var(--md-default-fg-color--light);opacity:0;transform:scale(.75);transition:transform .15s cubic-bezier(.1,.7,.1,1),opacity .15s}.md-search__options>.md-icon:not(.focus-visible){-webkit-tap-highlight-color:transparent;outline:none}[data-md-toggle=search]:checked~.md-header .md-search__input:valid~.md-search__options>.md-icon{opacity:1;pointer-events:auto;transform:scale(1)}[data-md-toggle=search]:checked~.md-header .md-search__input:valid~.md-search__options>.md-icon:hover{opacity:.7}[dir=ltr] .md-search__suggest{padding-left:3.6rem;padding-right:2.2rem}[dir=rtl] .md-search__suggest{padding-left:2.2rem;padding-right:3.6rem}.md-search__suggest{align-items:center;color:var(--md-default-fg-color--lighter);display:flex;font-size:.9rem;height:100%;opacity:0;position:absolute;top:0;transition:opacity 50ms;white-space:nowrap;width:100%}@media screen and (min-width:60em){[dir=ltr] .md-search__suggest{padding-left:2.2rem}[dir=rtl] .md-search__suggest{padding-right:2.2rem}.md-search__suggest{font-size:.8rem}}[data-md-toggle=search]:checked~.md-header .md-search__suggest{opacity:1;transition:opacity .3s .1s}[dir=ltr] .md-search__output{border-bottom-left-radius:.1rem}[dir=ltr] .md-search__output,[dir=rtl] .md-search__output{border-bottom-right-radius:.1rem}[dir=rtl] .md-search__output{border-bottom-left-radius:.1rem}.md-search__output{overflow:hidden;position:absolute;width:100%;z-index:1}@media screen and (max-width:59.984375em){.md-search__output{bottom:0;top:2.4rem}}@media screen and (min-width:60em){.md-search__output{opacity:0;top:1.9rem;transition:opacity .4s}[data-md-toggle=search]:checked~.md-header .md-search__output{box-shadow:var(--md-shadow-z3);opacity:1}}.md-search__scrollwrap{-webkit-backface-visibility:hidden;backface-visibility:hidden;background-color:var(--md-default-bg-color);height:100%;overflow-y:auto;touch-action:pan-y}@media (-webkit-max-device-pixel-ratio:1),(max-resolution:1dppx){.md-search__scrollwrap{transform:translateZ(0)}}@media screen and (min-width:60em) and (max-width:76.234375em){.md-search__scrollwrap{width:23.4rem}}@media screen and (min-width:76.25em){.md-search__scrollwrap{width:34.4rem}}@media screen and (min-width:60em){.md-search__scrollwrap{max-height:0;scrollbar-color:var(--md-default-fg-color--lighter) #0000;scrollbar-width:thin}[data-md-toggle=search]:checked~.md-header .md-search__scrollwrap{max-height:75vh}.md-search__scrollwrap:hover{scrollbar-color:var(--md-accent-fg-color) #0000}.md-search__scrollwrap::-webkit-scrollbar{height:.2rem;width:.2rem}.md-search__scrollwrap::-webkit-scrollbar-thumb{background-color:var(--md-default-fg-color--lighter)}.md-search__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:var(--md-accent-fg-color)}}.md-search-result{color:var(--md-default-fg-color);word-break:break-word}.md-search-result__meta{background-color:var(--md-default-fg-color--lightest);color:var(--md-default-fg-color--light);font-size:.64rem;line-height:1.8rem;padding:0 .8rem;scroll-snap-align:start}@media screen and (min-width:60em){[dir=ltr] .md-search-result__meta{padding-left:2.2rem}[dir=rtl] .md-search-result__meta{padding-right:2.2rem}}.md-search-result__list{list-style:none;margin:0;padding:0;-webkit-user-select:none;user-select:none}.md-search-result__item{box-shadow:0 -.05rem var(--md-default-fg-color--lightest)}.md-search-result__item:first-child{box-shadow:none}.md-search-result__link{display:block;outline:none;scroll-snap-align:start;transition:background-color .25s}.md-search-result__link:focus,.md-search-result__link:hover{background-color:var(--md-accent-fg-color--transparent)}.md-search-result__link:last-child p:last-child{margin-bottom:.6rem}.md-search-result__more>summary{cursor:pointer;display:block;outline:none;position:sticky;scroll-snap-align:start;top:0;z-index:1}.md-search-result__more>summary::marker{display:none}.md-search-result__more>summary::-webkit-details-marker{display:none}.md-search-result__more>summary>div{color:var(--md-typeset-a-color);font-size:.64rem;padding:.75em .8rem;transition:color .25s,background-color .25s}@media screen and (min-width:60em){[dir=ltr] .md-search-result__more>summary>div{padding-left:2.2rem}[dir=rtl] .md-search-result__more>summary>div{padding-right:2.2rem}}.md-search-result__more>summary:focus>div,.md-search-result__more>summary:hover>div{background-color:var(--md-accent-fg-color--transparent);color:var(--md-accent-fg-color)}.md-search-result__more[open]>summary{background-color:var(--md-default-bg-color)}.md-search-result__article{overflow:hidden;padding:0 .8rem;position:relative}@media screen and (min-width:60em){[dir=ltr] .md-search-result__article{padding-left:2.2rem}[dir=rtl] .md-search-result__article{padding-right:2.2rem}}[dir=ltr] .md-search-result__icon{left:0}[dir=rtl] .md-search-result__icon{right:0}.md-search-result__icon{color:var(--md-default-fg-color--light);height:1.2rem;margin:.5rem;position:absolute;width:1.2rem}@media screen and (max-width:59.984375em){.md-search-result__icon{display:none}}.md-search-result__icon:after{background-color:currentcolor;content:"";display:inline-block;height:100%;-webkit-mask-image:var(--md-search-result-icon);mask-image:var(--md-search-result-icon);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;width:100%}[dir=rtl] .md-search-result__icon:after{transform:scaleX(-1)}.md-search-result .md-typeset{color:var(--md-default-fg-color--light);font-size:.64rem;line-height:1.6}.md-search-result .md-typeset h1{color:var(--md-default-fg-color);font-size:.8rem;font-weight:400;line-height:1.4;margin:.55rem 0}.md-search-result .md-typeset h1 mark{text-decoration:none}.md-search-result .md-typeset h2{color:var(--md-default-fg-color);font-size:.64rem;font-weight:700;line-height:1.6;margin:.5em 0}.md-search-result .md-typeset h2 mark{text-decoration:none}.md-search-result__terms{color:var(--md-default-fg-color);display:block;font-size:.64rem;font-style:italic;margin:.5em 0}.md-search-result mark{background-color:initial;color:var(--md-accent-fg-color);text-decoration:underline}.md-select{position:relative;z-index:1}.md-select__inner{background-color:var(--md-default-bg-color);border-radius:.1rem;box-shadow:var(--md-shadow-z2);color:var(--md-default-fg-color);left:50%;margin-top:.2rem;max-height:0;opacity:0;position:absolute;top:calc(100% - .2rem);transform:translate3d(-50%,.3rem,0);transition:transform .25s 375ms,opacity .25s .25s,max-height 0ms .5s}.md-select:focus-within .md-select__inner,.md-select:hover .md-select__inner{max-height:10rem;opacity:1;transform:translate3d(-50%,0,0);transition:transform .25s cubic-bezier(.1,.7,.1,1),opacity .25s,max-height 0ms}.md-select__inner:after{border-bottom:.2rem solid #0000;border-bottom-color:var(--md-default-bg-color);border-left:.2rem solid #0000;border-right:.2rem solid #0000;border-top:0;content:"";height:0;left:50%;margin-left:-.2rem;margin-top:-.2rem;position:absolute;top:0;width:0}.md-select__list{border-radius:.1rem;font-size:.8rem;list-style-type:none;margin:0;max-height:inherit;overflow:auto;padding:0}.md-select__item{line-height:1.8rem}[dir=ltr] .md-select__link{padding-left:.6rem;padding-right:1.2rem}[dir=rtl] .md-select__link{padding-left:1.2rem;padding-right:.6rem}.md-select__link{cursor:pointer;display:block;outline:none;scroll-snap-align:start;transition:background-color .25s,color .25s;width:100%}.md-select__link:focus,.md-select__link:hover{color:var(--md-accent-fg-color)}.md-select__link:focus{background-color:var(--md-default-fg-color--lightest)}.md-sidebar{align-self:flex-start;flex-shrink:0;padding:1.2rem 0;position:sticky;top:2.4rem;width:12.1rem}@media print{.md-sidebar{display:none}}@media screen and (max-width:76.234375em){[dir=ltr] .md-sidebar--primary{left:-12.1rem}[dir=rtl] .md-sidebar--primary{right:-12.1rem}.md-sidebar--primary{background-color:var(--md-default-bg-color);display:block;height:100%;position:fixed;top:0;transform:translateX(0);transition:transform .25s cubic-bezier(.4,0,.2,1),box-shadow .25s;width:12.1rem;z-index:5}[data-md-toggle=drawer]:checked~.md-container .md-sidebar--primary{box-shadow:var(--md-shadow-z3);transform:translateX(12.1rem)}[dir=rtl] [data-md-toggle=drawer]:checked~.md-container .md-sidebar--primary{transform:translateX(-12.1rem)}.md-sidebar--primary .md-sidebar__scrollwrap{bottom:0;left:0;margin:0;overflow:hidden;position:absolute;right:0;scroll-snap-type:none;top:0}}@media screen and (min-width:76.25em){.md-sidebar{height:0}.no-js .md-sidebar{height:auto}.md-header--lifted~.md-container .md-sidebar{top:4.8rem}}.md-sidebar--secondary{display:none;order:2}@media screen and (min-width:60em){.md-sidebar--secondary{height:0}.no-js .md-sidebar--secondary{height:auto}.md-sidebar--secondary:not([hidden]){display:block}.md-sidebar--secondary .md-sidebar__scrollwrap{touch-action:pan-y}}.md-sidebar__scrollwrap{scrollbar-gutter:stable;-webkit-backface-visibility:hidden;backface-visibility:hidden;margin:0 .2rem;overflow-y:auto;scrollbar-color:var(--md-default-fg-color--lighter) #0000;scrollbar-width:thin}.md-sidebar__scrollwrap::-webkit-scrollbar{height:.2rem;width:.2rem}.md-sidebar__scrollwrap:focus-within,.md-sidebar__scrollwrap:hover{scrollbar-color:var(--md-accent-fg-color) #0000}.md-sidebar__scrollwrap:focus-within::-webkit-scrollbar-thumb,.md-sidebar__scrollwrap:hover::-webkit-scrollbar-thumb{background-color:var(--md-default-fg-color--lighter)}.md-sidebar__scrollwrap:focus-within::-webkit-scrollbar-thumb:hover,.md-sidebar__scrollwrap:hover::-webkit-scrollbar-thumb:hover{background-color:var(--md-accent-fg-color)}@supports selector(::-webkit-scrollbar){.md-sidebar__scrollwrap{scrollbar-gutter:auto}[dir=ltr] .md-sidebar__inner{padding-right:calc(100% - 11.5rem)}[dir=rtl] .md-sidebar__inner{padding-left:calc(100% - 11.5rem)}}@media screen and (max-width:76.234375em){.md-overlay{background-color:#0000008a;height:0;opacity:0;position:fixed;top:0;transition:width 0ms .25s,height 0ms .25s,opacity .25s;width:0;z-index:5}[data-md-toggle=drawer]:checked~.md-overlay{height:100%;opacity:1;transition:width 0ms,height 0ms,opacity .25s;width:100%}}@keyframes facts{0%{height:0}to{height:.65rem}}@keyframes fact{0%{opacity:0;transform:translateY(100%)}50%{opacity:0}to{opacity:1;transform:translateY(0)}}:root{--md-source-forks-icon:url('data:image/svg+xml;charset=utf-8,');--md-source-repositories-icon:url('data:image/svg+xml;charset=utf-8,');--md-source-stars-icon:url('data:image/svg+xml;charset=utf-8,');--md-source-version-icon:url('data:image/svg+xml;charset=utf-8,')}.md-source{-webkit-backface-visibility:hidden;backface-visibility:hidden;display:block;font-size:.65rem;line-height:1.2;outline-color:var(--md-accent-fg-color);transition:opacity .25s;white-space:nowrap}.md-source:hover{opacity:.7}.md-source__icon{display:inline-block;height:2.4rem;vertical-align:middle;width:2rem}[dir=ltr] .md-source__icon svg{margin-left:.6rem}[dir=rtl] .md-source__icon svg{margin-right:.6rem}.md-source__icon svg{margin-top:.6rem}[dir=ltr] .md-source__icon+.md-source__repository{padding-left:2rem}[dir=rtl] .md-source__icon+.md-source__repository{padding-right:2rem}[dir=ltr] .md-source__icon+.md-source__repository{margin-left:-2rem}[dir=rtl] .md-source__icon+.md-source__repository{margin-right:-2rem}[dir=ltr] .md-source__repository{margin-left:.6rem}[dir=rtl] .md-source__repository{margin-right:.6rem}.md-source__repository{display:inline-block;max-width:calc(100% - 1.2rem);overflow:hidden;text-overflow:ellipsis;vertical-align:middle}.md-source__facts{display:flex;font-size:.55rem;gap:.4rem;list-style-type:none;margin:.1rem 0 0;opacity:.75;overflow:hidden;padding:0;width:100%}.md-source__repository--active .md-source__facts{animation:facts .25s ease-in}.md-source__fact{overflow:hidden;text-overflow:ellipsis}.md-source__repository--active .md-source__fact{animation:fact .4s ease-out}[dir=ltr] .md-source__fact:before{margin-right:.1rem}[dir=rtl] .md-source__fact:before{margin-left:.1rem}.md-source__fact:before{background-color:currentcolor;content:"";display:inline-block;height:.6rem;-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;vertical-align:text-top;width:.6rem}.md-source__fact:nth-child(1n+2){flex-shrink:0}.md-source__fact--version:before{-webkit-mask-image:var(--md-source-version-icon);mask-image:var(--md-source-version-icon)}.md-source__fact--stars:before{-webkit-mask-image:var(--md-source-stars-icon);mask-image:var(--md-source-stars-icon)}.md-source__fact--forks:before{-webkit-mask-image:var(--md-source-forks-icon);mask-image:var(--md-source-forks-icon)}.md-source__fact--repositories:before{-webkit-mask-image:var(--md-source-repositories-icon);mask-image:var(--md-source-repositories-icon)}:root{--md-status:url('data:image/svg+xml;charset=utf-8,');--md-status--new:url('data:image/svg+xml;charset=utf-8,');--md-status--deprecated:url('data:image/svg+xml;charset=utf-8,');--md-status--encrypted:url('data:image/svg+xml;charset=utf-8,')}.md-status:after{background-color:var(--md-default-fg-color--light);content:"";display:inline-block;height:1.125em;-webkit-mask-image:var(--md-status);mask-image:var(--md-status);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;vertical-align:text-bottom;width:1.125em}.md-status:hover:after{background-color:currentcolor}.md-status--new:after{-webkit-mask-image:var(--md-status--new);mask-image:var(--md-status--new)}.md-status--deprecated:after{-webkit-mask-image:var(--md-status--deprecated);mask-image:var(--md-status--deprecated)}.md-status--encrypted:after{-webkit-mask-image:var(--md-status--encrypted);mask-image:var(--md-status--encrypted)}.md-tabs{background-color:var(--md-primary-fg-color);color:var(--md-primary-bg-color);display:block;line-height:1.3;overflow:auto;width:100%;z-index:3}@media print{.md-tabs{display:none}}@media screen and (max-width:76.234375em){.md-tabs{display:none}}.md-tabs[hidden]{pointer-events:none}[dir=ltr] .md-tabs__list{margin-left:.2rem}[dir=rtl] .md-tabs__list{margin-right:.2rem}.md-tabs__list{contain:content;display:flex;list-style:none;margin:0;overflow:auto;padding:0;scrollbar-width:none;white-space:nowrap}.md-tabs__list::-webkit-scrollbar{display:none}.md-tabs__item{height:2.4rem;padding-left:.6rem;padding-right:.6rem}.md-tabs__item--active .md-tabs__link{color:inherit;opacity:1}.md-tabs__link{-webkit-backface-visibility:hidden;backface-visibility:hidden;display:flex;font-size:.7rem;margin-top:.8rem;opacity:.7;outline-color:var(--md-accent-fg-color);outline-offset:.2rem;transition:transform .4s cubic-bezier(.1,.7,.1,1),opacity .25s}.md-tabs__link:focus,.md-tabs__link:hover{color:inherit;opacity:1}[dir=ltr] .md-tabs__link svg{margin-right:.4rem}[dir=rtl] .md-tabs__link svg{margin-left:.4rem}.md-tabs__link svg{fill:currentcolor;height:1.3em}.md-tabs__item:nth-child(2) .md-tabs__link{transition-delay:20ms}.md-tabs__item:nth-child(3) .md-tabs__link{transition-delay:40ms}.md-tabs__item:nth-child(4) .md-tabs__link{transition-delay:60ms}.md-tabs__item:nth-child(5) .md-tabs__link{transition-delay:80ms}.md-tabs__item:nth-child(6) .md-tabs__link{transition-delay:.1s}.md-tabs__item:nth-child(7) .md-tabs__link{transition-delay:.12s}.md-tabs__item:nth-child(8) .md-tabs__link{transition-delay:.14s}.md-tabs__item:nth-child(9) .md-tabs__link{transition-delay:.16s}.md-tabs__item:nth-child(10) .md-tabs__link{transition-delay:.18s}.md-tabs__item:nth-child(11) .md-tabs__link{transition-delay:.2s}.md-tabs__item:nth-child(12) .md-tabs__link{transition-delay:.22s}.md-tabs__item:nth-child(13) .md-tabs__link{transition-delay:.24s}.md-tabs__item:nth-child(14) .md-tabs__link{transition-delay:.26s}.md-tabs__item:nth-child(15) .md-tabs__link{transition-delay:.28s}.md-tabs__item:nth-child(16) .md-tabs__link{transition-delay:.3s}.md-tabs[hidden] .md-tabs__link{opacity:0;transform:translateY(50%);transition:transform 0ms .1s,opacity .1s}:root{--md-tag-icon:url('data:image/svg+xml;charset=utf-8,')}.md-typeset .md-tags:not([hidden]){display:inline-flex;flex-wrap:wrap;gap:.5em;margin-bottom:.75em;margin-top:-.125em}.md-typeset .md-tag{align-items:center;background:var(--md-default-fg-color--lightest);border-radius:2.4rem;display:inline-flex;font-size:.64rem;font-size:min(.8em,.64rem);font-weight:700;gap:.5em;letter-spacing:normal;line-height:1.6;padding:.3125em .78125em}.md-typeset .md-tag[href]{-webkit-tap-highlight-color:transparent;color:inherit;outline:none;transition:color 125ms,background-color 125ms}.md-typeset .md-tag[href]:focus,.md-typeset .md-tag[href]:hover{background-color:var(--md-accent-fg-color);color:var(--md-accent-bg-color)}[id]>.md-typeset .md-tag{vertical-align:text-top}.md-typeset .md-tag-icon:before{background-color:var(--md-default-fg-color--lighter);content:"";display:inline-block;height:1.2em;-webkit-mask-image:var(--md-tag-icon);mask-image:var(--md-tag-icon);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;transition:background-color 125ms;vertical-align:text-bottom;width:1.2em}.md-typeset .md-tag-icon[href]:focus:before,.md-typeset .md-tag-icon[href]:hover:before{background-color:var(--md-accent-bg-color)}@keyframes pulse{0%{transform:scale(.95)}75%{transform:scale(1)}to{transform:scale(.95)}}:root{--md-annotation-bg-icon:url('data:image/svg+xml;charset=utf-8,');--md-annotation-icon:url('data:image/svg+xml;charset=utf-8,');--md-tooltip-width:20rem}.md-tooltip{-webkit-backface-visibility:hidden;backface-visibility:hidden;background-color:var(--md-default-bg-color);border-radius:.1rem;box-shadow:var(--md-shadow-z2);color:var(--md-default-fg-color);font-family:var(--md-text-font-family);left:clamp(var(--md-tooltip-0,0rem) + .8rem,var(--md-tooltip-x),100vw + var(--md-tooltip-0,0rem) + .8rem - var(--md-tooltip-width) - 2 * .8rem);max-width:calc(100vw - 1.6rem);opacity:0;position:absolute;top:var(--md-tooltip-y);transform:translateY(-.4rem);transition:transform 0ms .25s,opacity .25s,z-index .25s;width:var(--md-tooltip-width);z-index:0}.md-tooltip--active{opacity:1;transform:translateY(0);transition:transform .25s cubic-bezier(.1,.7,.1,1),opacity .25s,z-index 0ms;z-index:2}.focus-visible>.md-tooltip,.md-tooltip:target{outline:var(--md-accent-fg-color) auto}.md-tooltip__inner{font-size:.64rem;padding:.8rem}.md-tooltip__inner.md-typeset>:first-child{margin-top:0}.md-tooltip__inner.md-typeset>:last-child{margin-bottom:0}.md-annotation{font-weight:400;outline:none;vertical-align:text-bottom;white-space:normal}[dir=rtl] .md-annotation{direction:rtl}code .md-annotation{font-family:var(--md-code-font-family);font-size:inherit}.md-annotation:not([hidden]){display:inline-block;line-height:1.25}.md-annotation__index{border-radius:.01px;cursor:pointer;display:inline-block;margin-left:.4ch;margin-right:.4ch;outline:none;overflow:hidden;position:relative;-webkit-user-select:none;user-select:none;vertical-align:text-top;z-index:0}.md-annotation .md-annotation__index{transition:z-index .25s}@media screen{.md-annotation__index{width:2.2ch}[data-md-visible]>.md-annotation__index{animation:pulse 2s infinite}.md-annotation__index:before{background:var(--md-default-bg-color);-webkit-mask-image:var(--md-annotation-bg-icon);mask-image:var(--md-annotation-bg-icon)}.md-annotation__index:after,.md-annotation__index:before{content:"";height:2.2ch;-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;position:absolute;top:-.1ch;width:2.2ch;z-index:-1}.md-annotation__index:after{background-color:var(--md-default-fg-color--lighter);-webkit-mask-image:var(--md-annotation-icon);mask-image:var(--md-annotation-icon);transform:scale(1.0001);transition:background-color .25s,transform .25s}.md-tooltip--active+.md-annotation__index:after{transform:rotate(45deg)}.md-tooltip--active+.md-annotation__index:after,:hover>.md-annotation__index:after{background-color:var(--md-accent-fg-color)}}.md-tooltip--active+.md-annotation__index{animation-play-state:paused;transition-duration:0ms;z-index:2}.md-annotation__index [data-md-annotation-id]{display:inline-block}@media print{.md-annotation__index [data-md-annotation-id]{background:var(--md-default-fg-color--lighter);border-radius:2ch;color:var(--md-default-bg-color);font-weight:700;padding:0 .6ch;white-space:nowrap}.md-annotation__index [data-md-annotation-id]:after{content:attr(data-md-annotation-id)}}.md-typeset .md-annotation-list{counter-reset:xxx;list-style:none}.md-typeset .md-annotation-list li{position:relative}[dir=ltr] .md-typeset .md-annotation-list li:before{left:-2.125em}[dir=rtl] .md-typeset .md-annotation-list li:before{right:-2.125em}.md-typeset .md-annotation-list li:before{background:var(--md-default-fg-color--lighter);border-radius:2ch;color:var(--md-default-bg-color);content:counter(xxx);counter-increment:xxx;font-size:.8875em;font-weight:700;height:2ch;line-height:1.25;min-width:2ch;padding:0 .6ch;position:absolute;text-align:center;top:.25em}[dir=ltr] .md-top{margin-left:50%}[dir=rtl] .md-top{margin-right:50%}.md-top{background-color:var(--md-default-bg-color);border-radius:1.6rem;box-shadow:var(--md-shadow-z2);color:var(--md-default-fg-color--light);cursor:pointer;display:block;font-size:.7rem;outline:none;padding:.4rem .8rem;position:fixed;top:3.2rem;transform:translate(-50%);transition:color 125ms,background-color 125ms,transform 125ms cubic-bezier(.4,0,.2,1),opacity 125ms;z-index:2}@media print{.md-top{display:none}}[dir=rtl] .md-top{transform:translate(50%)}.md-top[hidden]{opacity:0;pointer-events:none;transform:translate(-50%,.2rem);transition-duration:0ms}[dir=rtl] .md-top[hidden]{transform:translate(50%,.2rem)}.md-top:focus,.md-top:hover{background-color:var(--md-accent-fg-color);color:var(--md-accent-bg-color)}.md-top svg{display:inline-block;vertical-align:-.5em}@keyframes hoverfix{0%{pointer-events:none}}:root{--md-version-icon:url('data:image/svg+xml;charset=utf-8,')}.md-version{flex-shrink:0;font-size:.8rem;height:2.4rem}[dir=ltr] .md-version__current{margin-left:1.4rem;margin-right:.4rem}[dir=rtl] .md-version__current{margin-left:.4rem;margin-right:1.4rem}.md-version__current{color:inherit;cursor:pointer;outline:none;position:relative;top:.05rem}[dir=ltr] .md-version__current:after{margin-left:.4rem}[dir=rtl] .md-version__current:after{margin-right:.4rem}.md-version__current:after{background-color:currentcolor;content:"";display:inline-block;height:.6rem;-webkit-mask-image:var(--md-version-icon);mask-image:var(--md-version-icon);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;width:.4rem}.md-version__list{background-color:var(--md-default-bg-color);border-radius:.1rem;box-shadow:var(--md-shadow-z2);color:var(--md-default-fg-color);list-style-type:none;margin:.2rem .8rem;max-height:0;opacity:0;overflow:auto;padding:0;position:absolute;scroll-snap-type:y mandatory;top:.15rem;transition:max-height 0ms .5s,opacity .25s .25s;z-index:3}.md-version:focus-within .md-version__list,.md-version:hover .md-version__list{max-height:10rem;opacity:1;transition:max-height 0ms,opacity .25s}@media (hover:none),(pointer:coarse){.md-version:hover .md-version__list{animation:hoverfix .25s forwards}.md-version:focus-within .md-version__list{animation:none}}.md-version__item{line-height:1.8rem}[dir=ltr] .md-version__link{padding-left:.6rem;padding-right:1.2rem}[dir=rtl] .md-version__link{padding-left:1.2rem;padding-right:.6rem}.md-version__link{cursor:pointer;display:block;outline:none;scroll-snap-align:start;transition:color .25s,background-color .25s;white-space:nowrap;width:100%}.md-version__link:focus,.md-version__link:hover{color:var(--md-accent-fg-color)}.md-version__link:focus{background-color:var(--md-default-fg-color--lightest)}:root{--md-admonition-icon--note:url('data:image/svg+xml;charset=utf-8,');--md-admonition-icon--abstract:url('data:image/svg+xml;charset=utf-8,');--md-admonition-icon--info:url('data:image/svg+xml;charset=utf-8,');--md-admonition-icon--tip:url('data:image/svg+xml;charset=utf-8,');--md-admonition-icon--success:url('data:image/svg+xml;charset=utf-8,');--md-admonition-icon--question:url('data:image/svg+xml;charset=utf-8,');--md-admonition-icon--warning:url('data:image/svg+xml;charset=utf-8,');--md-admonition-icon--failure:url('data:image/svg+xml;charset=utf-8,');--md-admonition-icon--danger:url('data:image/svg+xml;charset=utf-8,');--md-admonition-icon--bug:url('data:image/svg+xml;charset=utf-8,');--md-admonition-icon--example:url('data:image/svg+xml;charset=utf-8,');--md-admonition-icon--quote:url('data:image/svg+xml;charset=utf-8,')}.md-typeset .admonition,.md-typeset details{background-color:var(--md-admonition-bg-color);border:.075rem solid #448aff;border-radius:.2rem;box-shadow:var(--md-shadow-z1);color:var(--md-admonition-fg-color);display:flow-root;font-size:.64rem;margin:1.5625em 0;padding:0 .6rem;page-break-inside:avoid;transition:box-shadow 125ms}@media print{.md-typeset .admonition,.md-typeset details{box-shadow:none}}.md-typeset .admonition:focus-within,.md-typeset details:focus-within{box-shadow:0 0 0 .2rem #448aff1a}.md-typeset .admonition>*,.md-typeset details>*{box-sizing:border-box}.md-typeset .admonition .admonition,.md-typeset .admonition details,.md-typeset details .admonition,.md-typeset details details{margin-bottom:1em;margin-top:1em}.md-typeset .admonition .md-typeset__scrollwrap,.md-typeset details .md-typeset__scrollwrap{margin:1em -.6rem}.md-typeset .admonition .md-typeset__table,.md-typeset details .md-typeset__table{padding:0 .6rem}.md-typeset .admonition>.tabbed-set:only-child,.md-typeset details>.tabbed-set:only-child{margin-top:0}html .md-typeset .admonition>:last-child,html .md-typeset details>:last-child{margin-bottom:.6rem}[dir=ltr] .md-typeset .admonition-title,[dir=ltr] .md-typeset summary{padding-left:2rem;padding-right:.6rem}[dir=rtl] .md-typeset .admonition-title,[dir=rtl] .md-typeset summary{padding-left:.6rem;padding-right:2rem}[dir=ltr] .md-typeset .admonition-title,[dir=ltr] .md-typeset summary{border-left-width:.2rem}[dir=rtl] .md-typeset .admonition-title,[dir=rtl] .md-typeset summary{border-right-width:.2rem}[dir=ltr] .md-typeset .admonition-title,[dir=ltr] .md-typeset summary{border-top-left-radius:.1rem}[dir=ltr] .md-typeset .admonition-title,[dir=ltr] .md-typeset summary,[dir=rtl] .md-typeset .admonition-title,[dir=rtl] .md-typeset summary{border-top-right-radius:.1rem}[dir=rtl] .md-typeset .admonition-title,[dir=rtl] .md-typeset summary{border-top-left-radius:.1rem}.md-typeset .admonition-title,.md-typeset summary{background-color:#448aff1a;border:none;font-weight:700;margin:0 -.6rem;padding-bottom:.4rem;padding-top:.4rem;position:relative}html .md-typeset .admonition-title:last-child,html .md-typeset summary:last-child{margin-bottom:0}[dir=ltr] .md-typeset .admonition-title:before,[dir=ltr] .md-typeset summary:before{left:.6rem}[dir=rtl] .md-typeset .admonition-title:before,[dir=rtl] .md-typeset summary:before{right:.6rem}.md-typeset .admonition-title:before,.md-typeset summary:before{background-color:#448aff;content:"";height:1rem;-webkit-mask-image:var(--md-admonition-icon--note);mask-image:var(--md-admonition-icon--note);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;position:absolute;top:.625em;width:1rem}.md-typeset .admonition-title code,.md-typeset summary code{box-shadow:0 0 0 .05rem var(--md-default-fg-color--lightest)}.md-typeset .admonition.note,.md-typeset details.note{border-color:#448aff}.md-typeset .admonition.note:focus-within,.md-typeset details.note:focus-within{box-shadow:0 0 0 .2rem #448aff1a}.md-typeset .note>.admonition-title,.md-typeset .note>summary{background-color:#448aff1a}.md-typeset .note>.admonition-title:before,.md-typeset .note>summary:before{background-color:#448aff;-webkit-mask-image:var(--md-admonition-icon--note);mask-image:var(--md-admonition-icon--note)}.md-typeset .note>.admonition-title:after,.md-typeset .note>summary:after{color:#448aff}.md-typeset .admonition.abstract,.md-typeset details.abstract{border-color:#00b0ff}.md-typeset .admonition.abstract:focus-within,.md-typeset details.abstract:focus-within{box-shadow:0 0 0 .2rem #00b0ff1a}.md-typeset .abstract>.admonition-title,.md-typeset .abstract>summary{background-color:#00b0ff1a}.md-typeset .abstract>.admonition-title:before,.md-typeset .abstract>summary:before{background-color:#00b0ff;-webkit-mask-image:var(--md-admonition-icon--abstract);mask-image:var(--md-admonition-icon--abstract)}.md-typeset .abstract>.admonition-title:after,.md-typeset .abstract>summary:after{color:#00b0ff}.md-typeset .admonition.info,.md-typeset details.info{border-color:#00b8d4}.md-typeset .admonition.info:focus-within,.md-typeset details.info:focus-within{box-shadow:0 0 0 .2rem #00b8d41a}.md-typeset .info>.admonition-title,.md-typeset .info>summary{background-color:#00b8d41a}.md-typeset .info>.admonition-title:before,.md-typeset .info>summary:before{background-color:#00b8d4;-webkit-mask-image:var(--md-admonition-icon--info);mask-image:var(--md-admonition-icon--info)}.md-typeset .info>.admonition-title:after,.md-typeset .info>summary:after{color:#00b8d4}.md-typeset .admonition.tip,.md-typeset details.tip{border-color:#00bfa5}.md-typeset .admonition.tip:focus-within,.md-typeset details.tip:focus-within{box-shadow:0 0 0 .2rem #00bfa51a}.md-typeset .tip>.admonition-title,.md-typeset .tip>summary{background-color:#00bfa51a}.md-typeset .tip>.admonition-title:before,.md-typeset .tip>summary:before{background-color:#00bfa5;-webkit-mask-image:var(--md-admonition-icon--tip);mask-image:var(--md-admonition-icon--tip)}.md-typeset .tip>.admonition-title:after,.md-typeset .tip>summary:after{color:#00bfa5}.md-typeset .admonition.success,.md-typeset details.success{border-color:#00c853}.md-typeset .admonition.success:focus-within,.md-typeset details.success:focus-within{box-shadow:0 0 0 .2rem #00c8531a}.md-typeset .success>.admonition-title,.md-typeset .success>summary{background-color:#00c8531a}.md-typeset .success>.admonition-title:before,.md-typeset .success>summary:before{background-color:#00c853;-webkit-mask-image:var(--md-admonition-icon--success);mask-image:var(--md-admonition-icon--success)}.md-typeset .success>.admonition-title:after,.md-typeset .success>summary:after{color:#00c853}.md-typeset .admonition.question,.md-typeset details.question{border-color:#64dd17}.md-typeset .admonition.question:focus-within,.md-typeset details.question:focus-within{box-shadow:0 0 0 .2rem #64dd171a}.md-typeset .question>.admonition-title,.md-typeset .question>summary{background-color:#64dd171a}.md-typeset .question>.admonition-title:before,.md-typeset .question>summary:before{background-color:#64dd17;-webkit-mask-image:var(--md-admonition-icon--question);mask-image:var(--md-admonition-icon--question)}.md-typeset .question>.admonition-title:after,.md-typeset .question>summary:after{color:#64dd17}.md-typeset .admonition.warning,.md-typeset details.warning{border-color:#ff9100}.md-typeset .admonition.warning:focus-within,.md-typeset details.warning:focus-within{box-shadow:0 0 0 .2rem #ff91001a}.md-typeset .warning>.admonition-title,.md-typeset .warning>summary{background-color:#ff91001a}.md-typeset .warning>.admonition-title:before,.md-typeset .warning>summary:before{background-color:#ff9100;-webkit-mask-image:var(--md-admonition-icon--warning);mask-image:var(--md-admonition-icon--warning)}.md-typeset .warning>.admonition-title:after,.md-typeset .warning>summary:after{color:#ff9100}.md-typeset .admonition.failure,.md-typeset details.failure{border-color:#ff5252}.md-typeset .admonition.failure:focus-within,.md-typeset details.failure:focus-within{box-shadow:0 0 0 .2rem #ff52521a}.md-typeset .failure>.admonition-title,.md-typeset .failure>summary{background-color:#ff52521a}.md-typeset .failure>.admonition-title:before,.md-typeset .failure>summary:before{background-color:#ff5252;-webkit-mask-image:var(--md-admonition-icon--failure);mask-image:var(--md-admonition-icon--failure)}.md-typeset .failure>.admonition-title:after,.md-typeset .failure>summary:after{color:#ff5252}.md-typeset .admonition.danger,.md-typeset details.danger{border-color:#ff1744}.md-typeset .admonition.danger:focus-within,.md-typeset details.danger:focus-within{box-shadow:0 0 0 .2rem #ff17441a}.md-typeset .danger>.admonition-title,.md-typeset .danger>summary{background-color:#ff17441a}.md-typeset .danger>.admonition-title:before,.md-typeset .danger>summary:before{background-color:#ff1744;-webkit-mask-image:var(--md-admonition-icon--danger);mask-image:var(--md-admonition-icon--danger)}.md-typeset .danger>.admonition-title:after,.md-typeset .danger>summary:after{color:#ff1744}.md-typeset .admonition.bug,.md-typeset details.bug{border-color:#f50057}.md-typeset .admonition.bug:focus-within,.md-typeset details.bug:focus-within{box-shadow:0 0 0 .2rem #f500571a}.md-typeset .bug>.admonition-title,.md-typeset .bug>summary{background-color:#f500571a}.md-typeset .bug>.admonition-title:before,.md-typeset .bug>summary:before{background-color:#f50057;-webkit-mask-image:var(--md-admonition-icon--bug);mask-image:var(--md-admonition-icon--bug)}.md-typeset .bug>.admonition-title:after,.md-typeset .bug>summary:after{color:#f50057}.md-typeset .admonition.example,.md-typeset details.example{border-color:#7c4dff}.md-typeset .admonition.example:focus-within,.md-typeset details.example:focus-within{box-shadow:0 0 0 .2rem #7c4dff1a}.md-typeset .example>.admonition-title,.md-typeset .example>summary{background-color:#7c4dff1a}.md-typeset .example>.admonition-title:before,.md-typeset .example>summary:before{background-color:#7c4dff;-webkit-mask-image:var(--md-admonition-icon--example);mask-image:var(--md-admonition-icon--example)}.md-typeset .example>.admonition-title:after,.md-typeset .example>summary:after{color:#7c4dff}.md-typeset .admonition.quote,.md-typeset details.quote{border-color:#9e9e9e}.md-typeset .admonition.quote:focus-within,.md-typeset details.quote:focus-within{box-shadow:0 0 0 .2rem #9e9e9e1a}.md-typeset .quote>.admonition-title,.md-typeset .quote>summary{background-color:#9e9e9e1a}.md-typeset .quote>.admonition-title:before,.md-typeset .quote>summary:before{background-color:#9e9e9e;-webkit-mask-image:var(--md-admonition-icon--quote);mask-image:var(--md-admonition-icon--quote)}.md-typeset .quote>.admonition-title:after,.md-typeset .quote>summary:after{color:#9e9e9e}:root{--md-footnotes-icon:url('data:image/svg+xml;charset=utf-8,')}.md-typeset .footnote{color:var(--md-default-fg-color--light);font-size:.64rem}[dir=ltr] .md-typeset .footnote>ol{margin-left:0}[dir=rtl] .md-typeset .footnote>ol{margin-right:0}.md-typeset .footnote>ol>li{transition:color 125ms}.md-typeset .footnote>ol>li:target{color:var(--md-default-fg-color)}.md-typeset .footnote>ol>li:focus-within .footnote-backref{opacity:1;transform:translateX(0);transition:none}.md-typeset .footnote>ol>li:hover .footnote-backref,.md-typeset .footnote>ol>li:target .footnote-backref{opacity:1;transform:translateX(0)}.md-typeset .footnote>ol>li>:first-child{margin-top:0}.md-typeset .footnote-ref{font-size:.75em;font-weight:700}html .md-typeset .footnote-ref{outline-offset:.1rem}.md-typeset [id^="fnref:"]:target>.footnote-ref{outline:auto}.md-typeset .footnote-backref{color:var(--md-typeset-a-color);display:inline-block;font-size:0;opacity:0;transform:translateX(.25rem);transition:color .25s,transform .25s .25s,opacity 125ms .25s;vertical-align:text-bottom}@media print{.md-typeset .footnote-backref{color:var(--md-typeset-a-color);opacity:1;transform:translateX(0)}}[dir=rtl] .md-typeset .footnote-backref{transform:translateX(-.25rem)}.md-typeset .footnote-backref:hover{color:var(--md-accent-fg-color)}.md-typeset .footnote-backref:before{background-color:currentcolor;content:"";display:inline-block;height:.8rem;-webkit-mask-image:var(--md-footnotes-icon);mask-image:var(--md-footnotes-icon);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;width:.8rem}[dir=rtl] .md-typeset .footnote-backref:before svg{transform:scaleX(-1)}[dir=ltr] .md-typeset .headerlink{margin-left:.5rem}[dir=rtl] .md-typeset .headerlink{margin-right:.5rem}.md-typeset .headerlink{color:var(--md-default-fg-color--lighter);display:inline-block;opacity:0;transition:color .25s,opacity 125ms}@media print{.md-typeset .headerlink{display:none}}.md-typeset .headerlink:focus,.md-typeset :hover>.headerlink,.md-typeset :target>.headerlink{opacity:1;transition:color .25s,opacity 125ms}.md-typeset .headerlink:focus,.md-typeset .headerlink:hover,.md-typeset :target>.headerlink{color:var(--md-accent-fg-color)}.md-typeset :target{--md-scroll-margin:3.6rem;--md-scroll-offset:0rem;scroll-margin-top:calc(var(--md-scroll-margin) - var(--md-scroll-offset))}@media screen and (min-width:76.25em){.md-header--lifted~.md-container .md-typeset :target{--md-scroll-margin:6rem}}.md-typeset h1:target,.md-typeset h2:target,.md-typeset h3:target{--md-scroll-offset:0.2rem}.md-typeset h4:target{--md-scroll-offset:0.15rem}.md-typeset div.arithmatex{overflow:auto}@media screen and (max-width:44.984375em){.md-typeset div.arithmatex{margin:0 -.8rem}}.md-typeset div.arithmatex>*{margin-left:auto!important;margin-right:auto!important;padding:0 .8rem;touch-action:auto;width:-webkit-min-content;width:min-content}.md-typeset div.arithmatex>* mjx-container{margin:0!important}.md-typeset del.critic{background-color:var(--md-typeset-del-color)}.md-typeset del.critic,.md-typeset ins.critic{-webkit-box-decoration-break:clone;box-decoration-break:clone}.md-typeset ins.critic{background-color:var(--md-typeset-ins-color)}.md-typeset .critic.comment{-webkit-box-decoration-break:clone;box-decoration-break:clone;color:var(--md-code-hl-comment-color)}.md-typeset .critic.comment:before{content:"/* "}.md-typeset .critic.comment:after{content:" */"}.md-typeset .critic.block{box-shadow:none;display:block;margin:1em 0;overflow:auto;padding-left:.8rem;padding-right:.8rem}.md-typeset .critic.block>:first-child{margin-top:.5em}.md-typeset .critic.block>:last-child{margin-bottom:.5em}:root{--md-details-icon:url('data:image/svg+xml;charset=utf-8,')}.md-typeset details{display:flow-root;overflow:visible;padding-top:0}.md-typeset details[open]>summary:after{transform:rotate(90deg)}.md-typeset details:not([open]){box-shadow:none;padding-bottom:0}.md-typeset details:not([open])>summary{border-radius:.1rem}[dir=ltr] .md-typeset summary{padding-right:1.8rem}[dir=rtl] .md-typeset summary{padding-left:1.8rem}[dir=ltr] .md-typeset summary{border-top-left-radius:.1rem}[dir=ltr] .md-typeset summary,[dir=rtl] .md-typeset summary{border-top-right-radius:.1rem}[dir=rtl] .md-typeset summary{border-top-left-radius:.1rem}.md-typeset summary{cursor:pointer;display:block;min-height:1rem}.md-typeset summary.focus-visible{outline-color:var(--md-accent-fg-color);outline-offset:.2rem}.md-typeset summary:not(.focus-visible){-webkit-tap-highlight-color:transparent;outline:none}[dir=ltr] .md-typeset summary:after{right:.4rem}[dir=rtl] .md-typeset summary:after{left:.4rem}.md-typeset summary:after{background-color:currentcolor;content:"";height:1rem;-webkit-mask-image:var(--md-details-icon);mask-image:var(--md-details-icon);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;position:absolute;top:.625em;transform:rotate(0deg);transition:transform .25s;width:1rem}[dir=rtl] .md-typeset summary:after{transform:rotate(180deg)}.md-typeset summary::marker{display:none}.md-typeset summary::-webkit-details-marker{display:none}.md-typeset .emojione,.md-typeset .gemoji,.md-typeset .twemoji{display:inline-flex;height:1.125em;vertical-align:text-top}.md-typeset .emojione svg,.md-typeset .gemoji svg,.md-typeset .twemoji svg{fill:currentcolor;max-height:100%;width:1.125em}.highlight .o,.highlight .ow{color:var(--md-code-hl-operator-color)}.highlight .p{color:var(--md-code-hl-punctuation-color)}.highlight .cpf,.highlight .l,.highlight .s,.highlight .s1,.highlight .s2,.highlight .sb,.highlight .sc,.highlight .si,.highlight .ss{color:var(--md-code-hl-string-color)}.highlight .cp,.highlight .se,.highlight .sh,.highlight .sr,.highlight .sx{color:var(--md-code-hl-special-color)}.highlight .il,.highlight .m,.highlight .mb,.highlight .mf,.highlight .mh,.highlight .mi,.highlight .mo{color:var(--md-code-hl-number-color)}.highlight .k,.highlight .kd,.highlight .kn,.highlight .kp,.highlight .kr,.highlight .kt{color:var(--md-code-hl-keyword-color)}.highlight .kc,.highlight .n{color:var(--md-code-hl-name-color)}.highlight .bp,.highlight .nb,.highlight .no{color:var(--md-code-hl-constant-color)}.highlight .nc,.highlight .ne,.highlight .nf,.highlight .nn{color:var(--md-code-hl-function-color)}.highlight .nd,.highlight .ni,.highlight .nl,.highlight .nt{color:var(--md-code-hl-keyword-color)}.highlight .c,.highlight .c1,.highlight .ch,.highlight .cm,.highlight .cs,.highlight .sd{color:var(--md-code-hl-comment-color)}.highlight .na,.highlight .nv,.highlight .vc,.highlight .vg,.highlight .vi{color:var(--md-code-hl-variable-color)}.highlight .ge,.highlight .gh,.highlight .go,.highlight .gp,.highlight .gr,.highlight .gs,.highlight .gt,.highlight .gu{color:var(--md-code-hl-generic-color)}.highlight .gd,.highlight .gi{border-radius:.1rem;margin:0 -.125em;padding:0 .125em}.highlight .gd{background-color:var(--md-typeset-del-color)}.highlight .gi{background-color:var(--md-typeset-ins-color)}.highlight .hll{background-color:var(--md-code-hl-color--light);box-shadow:2px 0 0 0 var(--md-code-hl-color) inset;display:block;margin:0 -1.1764705882em;padding:0 1.1764705882em}.highlight span.filename{background-color:var(--md-code-bg-color);border-bottom:.05rem solid var(--md-default-fg-color--lightest);border-top-left-radius:.1rem;border-top-right-radius:.1rem;display:flow-root;font-size:.85em;font-weight:700;margin-top:1em;padding:.6617647059em 1.1764705882em;position:relative}.highlight span.filename+pre{margin-top:0}.highlight span.filename+pre>code{border-top-left-radius:0;border-top-right-radius:0}.highlight [data-linenos]:before{background-color:var(--md-code-bg-color);box-shadow:-.05rem 0 var(--md-default-fg-color--lightest) inset;color:var(--md-default-fg-color--light);content:attr(data-linenos);float:left;left:-1.1764705882em;margin-left:-1.1764705882em;margin-right:1.1764705882em;padding-left:1.1764705882em;position:sticky;-webkit-user-select:none;user-select:none;z-index:3}.highlight code a[id]{position:absolute;visibility:hidden}.highlight code[data-md-copying] .hll{display:contents}.highlight code[data-md-copying] .md-annotation{display:none}.highlighttable{display:flow-root}.highlighttable tbody,.highlighttable td{display:block;padding:0}.highlighttable tr{display:flex}.highlighttable pre{margin:0}.highlighttable th.filename{flex-grow:1;padding:0;text-align:left}.highlighttable th.filename span.filename{margin-top:0}.highlighttable .linenos{background-color:var(--md-code-bg-color);border-bottom-left-radius:.1rem;border-top-left-radius:.1rem;font-size:.85em;padding:.7720588235em 0 .7720588235em 1.1764705882em;-webkit-user-select:none;user-select:none}.highlighttable .linenodiv{box-shadow:-.05rem 0 var(--md-default-fg-color--lightest) inset;padding-right:.5882352941em}.highlighttable .linenodiv pre{color:var(--md-default-fg-color--light);text-align:right}.highlighttable .code{flex:1;min-width:0}.linenodiv a{color:inherit}.md-typeset .highlighttable{direction:ltr;margin:1em 0}.md-typeset .highlighttable>tbody>tr>.code>div>pre>code{border-bottom-left-radius:0;border-top-left-radius:0}.md-typeset .highlight+.result{border:.05rem solid var(--md-code-bg-color);border-bottom-left-radius:.1rem;border-bottom-right-radius:.1rem;border-top-width:.1rem;margin-top:-1.125em;overflow:visible;padding:0 1em}.md-typeset .highlight+.result:after{clear:both;content:"";display:block}@media screen and (max-width:44.984375em){.md-content__inner>.highlight{margin:1em -.8rem}.md-content__inner>.highlight>.filename,.md-content__inner>.highlight>.highlighttable>tbody>tr>.code>div>pre>code,.md-content__inner>.highlight>.highlighttable>tbody>tr>.filename span.filename,.md-content__inner>.highlight>.highlighttable>tbody>tr>.linenos,.md-content__inner>.highlight>pre>code{border-radius:0}.md-content__inner>.highlight+.result{border-left-width:0;border-radius:0;border-right-width:0;margin-left:-.8rem;margin-right:-.8rem}}.md-typeset .keys kbd:after,.md-typeset .keys kbd:before{-moz-osx-font-smoothing:initial;-webkit-font-smoothing:initial;color:inherit;margin:0;position:relative}.md-typeset .keys span{color:var(--md-default-fg-color--light);padding:0 .2em}.md-typeset .keys .key-alt:before,.md-typeset .keys .key-left-alt:before,.md-typeset .keys .key-right-alt:before{content:"⎇";padding-right:.4em}.md-typeset .keys .key-command:before,.md-typeset .keys .key-left-command:before,.md-typeset .keys .key-right-command:before{content:"⌘";padding-right:.4em}.md-typeset .keys .key-control:before,.md-typeset .keys .key-left-control:before,.md-typeset .keys .key-right-control:before{content:"⌃";padding-right:.4em}.md-typeset .keys .key-left-meta:before,.md-typeset .keys .key-meta:before,.md-typeset .keys .key-right-meta:before{content:"◆";padding-right:.4em}.md-typeset .keys .key-left-option:before,.md-typeset .keys .key-option:before,.md-typeset .keys .key-right-option:before{content:"⌥";padding-right:.4em}.md-typeset .keys .key-left-shift:before,.md-typeset .keys .key-right-shift:before,.md-typeset .keys .key-shift:before{content:"⇧";padding-right:.4em}.md-typeset .keys .key-left-super:before,.md-typeset .keys .key-right-super:before,.md-typeset .keys .key-super:before{content:"❖";padding-right:.4em}.md-typeset .keys .key-left-windows:before,.md-typeset .keys .key-right-windows:before,.md-typeset .keys .key-windows:before{content:"⊞";padding-right:.4em}.md-typeset .keys .key-arrow-down:before{content:"↓";padding-right:.4em}.md-typeset .keys .key-arrow-left:before{content:"←";padding-right:.4em}.md-typeset .keys .key-arrow-right:before{content:"→";padding-right:.4em}.md-typeset .keys .key-arrow-up:before{content:"↑";padding-right:.4em}.md-typeset .keys .key-backspace:before{content:"⌫";padding-right:.4em}.md-typeset .keys .key-backtab:before{content:"⇤";padding-right:.4em}.md-typeset .keys .key-caps-lock:before{content:"⇪";padding-right:.4em}.md-typeset .keys .key-clear:before{content:"⌧";padding-right:.4em}.md-typeset .keys .key-context-menu:before{content:"☰";padding-right:.4em}.md-typeset .keys .key-delete:before{content:"⌦";padding-right:.4em}.md-typeset .keys .key-eject:before{content:"⏏";padding-right:.4em}.md-typeset .keys .key-end:before{content:"⤓";padding-right:.4em}.md-typeset .keys .key-escape:before{content:"⎋";padding-right:.4em}.md-typeset .keys .key-home:before{content:"⤒";padding-right:.4em}.md-typeset .keys .key-insert:before{content:"⎀";padding-right:.4em}.md-typeset .keys .key-page-down:before{content:"⇟";padding-right:.4em}.md-typeset .keys .key-page-up:before{content:"⇞";padding-right:.4em}.md-typeset .keys .key-print-screen:before{content:"⎙";padding-right:.4em}.md-typeset .keys .key-tab:after{content:"⇥";padding-left:.4em}.md-typeset .keys .key-num-enter:after{content:"⌤";padding-left:.4em}.md-typeset .keys .key-enter:after{content:"⏎";padding-left:.4em}:root{--md-tabbed-icon--prev:url('data:image/svg+xml;charset=utf-8,');--md-tabbed-icon--next:url('data:image/svg+xml;charset=utf-8,')}.md-typeset .tabbed-set{border-radius:.1rem;display:flex;flex-flow:column wrap;margin:1em 0;position:relative}.md-typeset .tabbed-set>input{height:0;opacity:0;position:absolute;width:0}.md-typeset .tabbed-set>input:target{--md-scroll-offset:0.625em}.md-typeset .tabbed-set>input.focus-visible~.tabbed-labels:before{background-color:var(--md-accent-fg-color)}.md-typeset .tabbed-labels{-ms-overflow-style:none;box-shadow:0 -.05rem var(--md-default-fg-color--lightest) inset;display:flex;max-width:100%;overflow:auto;scrollbar-width:none}@media print{.md-typeset .tabbed-labels{display:contents}}@media screen{.js .md-typeset .tabbed-labels{position:relative}.js .md-typeset .tabbed-labels:before{background:var(--md-default-fg-color);bottom:0;content:"";display:block;height:2px;left:0;position:absolute;transform:translateX(var(--md-indicator-x));transition:width 225ms,background-color .25s,transform .25s;transition-timing-function:cubic-bezier(.4,0,.2,1);width:var(--md-indicator-width)}}.md-typeset .tabbed-labels::-webkit-scrollbar{display:none}.md-typeset .tabbed-labels>label{border-bottom:.1rem solid #0000;border-radius:.1rem .1rem 0 0;color:var(--md-default-fg-color--light);cursor:pointer;flex-shrink:0;font-size:.64rem;font-weight:700;padding:.78125em 1.25em .625em;scroll-margin-inline-start:1rem;transition:background-color .25s,color .25s;white-space:nowrap;width:auto}@media print{.md-typeset .tabbed-labels>label:first-child{order:1}.md-typeset .tabbed-labels>label:nth-child(2){order:2}.md-typeset .tabbed-labels>label:nth-child(3){order:3}.md-typeset .tabbed-labels>label:nth-child(4){order:4}.md-typeset .tabbed-labels>label:nth-child(5){order:5}.md-typeset .tabbed-labels>label:nth-child(6){order:6}.md-typeset .tabbed-labels>label:nth-child(7){order:7}.md-typeset .tabbed-labels>label:nth-child(8){order:8}.md-typeset .tabbed-labels>label:nth-child(9){order:9}.md-typeset .tabbed-labels>label:nth-child(10){order:10}.md-typeset .tabbed-labels>label:nth-child(11){order:11}.md-typeset .tabbed-labels>label:nth-child(12){order:12}.md-typeset .tabbed-labels>label:nth-child(13){order:13}.md-typeset .tabbed-labels>label:nth-child(14){order:14}.md-typeset .tabbed-labels>label:nth-child(15){order:15}.md-typeset .tabbed-labels>label:nth-child(16){order:16}.md-typeset .tabbed-labels>label:nth-child(17){order:17}.md-typeset .tabbed-labels>label:nth-child(18){order:18}.md-typeset .tabbed-labels>label:nth-child(19){order:19}.md-typeset .tabbed-labels>label:nth-child(20){order:20}}.md-typeset .tabbed-labels>label:hover{color:var(--md-default-fg-color)}.md-typeset .tabbed-content{width:100%}@media print{.md-typeset .tabbed-content{display:contents}}.md-typeset .tabbed-block{display:none}@media print{.md-typeset .tabbed-block{display:block}.md-typeset .tabbed-block:first-child{order:1}.md-typeset .tabbed-block:nth-child(2){order:2}.md-typeset .tabbed-block:nth-child(3){order:3}.md-typeset .tabbed-block:nth-child(4){order:4}.md-typeset .tabbed-block:nth-child(5){order:5}.md-typeset .tabbed-block:nth-child(6){order:6}.md-typeset .tabbed-block:nth-child(7){order:7}.md-typeset .tabbed-block:nth-child(8){order:8}.md-typeset .tabbed-block:nth-child(9){order:9}.md-typeset .tabbed-block:nth-child(10){order:10}.md-typeset .tabbed-block:nth-child(11){order:11}.md-typeset .tabbed-block:nth-child(12){order:12}.md-typeset .tabbed-block:nth-child(13){order:13}.md-typeset .tabbed-block:nth-child(14){order:14}.md-typeset .tabbed-block:nth-child(15){order:15}.md-typeset .tabbed-block:nth-child(16){order:16}.md-typeset .tabbed-block:nth-child(17){order:17}.md-typeset .tabbed-block:nth-child(18){order:18}.md-typeset .tabbed-block:nth-child(19){order:19}.md-typeset .tabbed-block:nth-child(20){order:20}}.md-typeset .tabbed-block>.highlight:first-child>pre,.md-typeset .tabbed-block>pre:first-child{margin:0}.md-typeset .tabbed-block>.highlight:first-child>pre>code,.md-typeset .tabbed-block>pre:first-child>code{border-top-left-radius:0;border-top-right-radius:0}.md-typeset .tabbed-block>.highlight:first-child>.filename{border-top-left-radius:0;border-top-right-radius:0;margin:0}.md-typeset .tabbed-block>.highlight:first-child>.highlighttable{margin:0}.md-typeset .tabbed-block>.highlight:first-child>.highlighttable>tbody>tr>.filename span.filename,.md-typeset .tabbed-block>.highlight:first-child>.highlighttable>tbody>tr>.linenos{border-top-left-radius:0;border-top-right-radius:0;margin:0}.md-typeset .tabbed-block>.highlight:first-child>.highlighttable>tbody>tr>.code>div>pre>code{border-top-left-radius:0;border-top-right-radius:0}.md-typeset .tabbed-block>.highlight:first-child+.result{margin-top:-.125em}.md-typeset .tabbed-block>.tabbed-set{margin:0}.md-typeset .tabbed-button{align-self:center;border-radius:100%;color:var(--md-default-fg-color--light);cursor:pointer;display:block;height:.9rem;margin-top:.1rem;pointer-events:auto;transition:background-color .25s;width:.9rem}.md-typeset .tabbed-button:hover{background-color:var(--md-accent-fg-color--transparent);color:var(--md-accent-fg-color)}.md-typeset .tabbed-button:after{background-color:currentcolor;content:"";display:block;height:100%;-webkit-mask-image:var(--md-tabbed-icon--prev);mask-image:var(--md-tabbed-icon--prev);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;transition:background-color .25s,transform .25s;width:100%}.md-typeset .tabbed-control{background:linear-gradient(to right,var(--md-default-bg-color) 60%,#0000);display:flex;height:1.9rem;justify-content:start;pointer-events:none;position:absolute;transition:opacity 125ms;width:1.2rem}[dir=rtl] .md-typeset .tabbed-control{transform:rotate(180deg)}.md-typeset .tabbed-control[hidden]{opacity:0}.md-typeset .tabbed-control--next{background:linear-gradient(to left,var(--md-default-bg-color) 60%,#0000);justify-content:end;right:0}.md-typeset .tabbed-control--next .tabbed-button:after{-webkit-mask-image:var(--md-tabbed-icon--next);mask-image:var(--md-tabbed-icon--next)}@media screen and (max-width:44.984375em){[dir=ltr] .md-content__inner>.tabbed-set .tabbed-labels{padding-left:.8rem}[dir=rtl] .md-content__inner>.tabbed-set .tabbed-labels{padding-right:.8rem}.md-content__inner>.tabbed-set .tabbed-labels{margin:0 -.8rem;max-width:100vw;scroll-padding-inline-start:.8rem}[dir=ltr] .md-content__inner>.tabbed-set .tabbed-labels:after{padding-right:.8rem}[dir=rtl] .md-content__inner>.tabbed-set .tabbed-labels:after{padding-left:.8rem}.md-content__inner>.tabbed-set .tabbed-labels:after{content:""}[dir=ltr] .md-content__inner>.tabbed-set .tabbed-labels~.tabbed-control--prev{padding-left:.8rem}[dir=rtl] .md-content__inner>.tabbed-set .tabbed-labels~.tabbed-control--prev{padding-right:.8rem}[dir=ltr] .md-content__inner>.tabbed-set .tabbed-labels~.tabbed-control--prev{margin-left:-.8rem}[dir=rtl] .md-content__inner>.tabbed-set .tabbed-labels~.tabbed-control--prev{margin-right:-.8rem}.md-content__inner>.tabbed-set .tabbed-labels~.tabbed-control--prev{width:2rem}[dir=ltr] .md-content__inner>.tabbed-set .tabbed-labels~.tabbed-control--next{padding-right:.8rem}[dir=rtl] .md-content__inner>.tabbed-set .tabbed-labels~.tabbed-control--next{padding-left:.8rem}[dir=ltr] .md-content__inner>.tabbed-set .tabbed-labels~.tabbed-control--next{margin-right:-.8rem}[dir=rtl] .md-content__inner>.tabbed-set .tabbed-labels~.tabbed-control--next{margin-left:-.8rem}.md-content__inner>.tabbed-set .tabbed-labels~.tabbed-control--next{width:2rem}}@media screen{.md-typeset .tabbed-set>input:first-child:checked~.tabbed-labels>:first-child,.md-typeset .tabbed-set>input:nth-child(10):checked~.tabbed-labels>:nth-child(10),.md-typeset .tabbed-set>input:nth-child(11):checked~.tabbed-labels>:nth-child(11),.md-typeset .tabbed-set>input:nth-child(12):checked~.tabbed-labels>:nth-child(12),.md-typeset .tabbed-set>input:nth-child(13):checked~.tabbed-labels>:nth-child(13),.md-typeset .tabbed-set>input:nth-child(14):checked~.tabbed-labels>:nth-child(14),.md-typeset .tabbed-set>input:nth-child(15):checked~.tabbed-labels>:nth-child(15),.md-typeset .tabbed-set>input:nth-child(16):checked~.tabbed-labels>:nth-child(16),.md-typeset .tabbed-set>input:nth-child(17):checked~.tabbed-labels>:nth-child(17),.md-typeset .tabbed-set>input:nth-child(18):checked~.tabbed-labels>:nth-child(18),.md-typeset .tabbed-set>input:nth-child(19):checked~.tabbed-labels>:nth-child(19),.md-typeset .tabbed-set>input:nth-child(2):checked~.tabbed-labels>:nth-child(2),.md-typeset .tabbed-set>input:nth-child(20):checked~.tabbed-labels>:nth-child(20),.md-typeset .tabbed-set>input:nth-child(3):checked~.tabbed-labels>:nth-child(3),.md-typeset .tabbed-set>input:nth-child(4):checked~.tabbed-labels>:nth-child(4),.md-typeset .tabbed-set>input:nth-child(5):checked~.tabbed-labels>:nth-child(5),.md-typeset .tabbed-set>input:nth-child(6):checked~.tabbed-labels>:nth-child(6),.md-typeset .tabbed-set>input:nth-child(7):checked~.tabbed-labels>:nth-child(7),.md-typeset .tabbed-set>input:nth-child(8):checked~.tabbed-labels>:nth-child(8),.md-typeset .tabbed-set>input:nth-child(9):checked~.tabbed-labels>:nth-child(9){color:var(--md-default-fg-color)}.md-typeset .no-js .tabbed-set>input:first-child:checked~.tabbed-labels>:first-child,.md-typeset .no-js .tabbed-set>input:nth-child(10):checked~.tabbed-labels>:nth-child(10),.md-typeset .no-js .tabbed-set>input:nth-child(11):checked~.tabbed-labels>:nth-child(11),.md-typeset .no-js .tabbed-set>input:nth-child(12):checked~.tabbed-labels>:nth-child(12),.md-typeset .no-js .tabbed-set>input:nth-child(13):checked~.tabbed-labels>:nth-child(13),.md-typeset .no-js .tabbed-set>input:nth-child(14):checked~.tabbed-labels>:nth-child(14),.md-typeset .no-js .tabbed-set>input:nth-child(15):checked~.tabbed-labels>:nth-child(15),.md-typeset .no-js .tabbed-set>input:nth-child(16):checked~.tabbed-labels>:nth-child(16),.md-typeset .no-js .tabbed-set>input:nth-child(17):checked~.tabbed-labels>:nth-child(17),.md-typeset .no-js .tabbed-set>input:nth-child(18):checked~.tabbed-labels>:nth-child(18),.md-typeset .no-js .tabbed-set>input:nth-child(19):checked~.tabbed-labels>:nth-child(19),.md-typeset .no-js .tabbed-set>input:nth-child(2):checked~.tabbed-labels>:nth-child(2),.md-typeset .no-js .tabbed-set>input:nth-child(20):checked~.tabbed-labels>:nth-child(20),.md-typeset .no-js .tabbed-set>input:nth-child(3):checked~.tabbed-labels>:nth-child(3),.md-typeset .no-js .tabbed-set>input:nth-child(4):checked~.tabbed-labels>:nth-child(4),.md-typeset .no-js .tabbed-set>input:nth-child(5):checked~.tabbed-labels>:nth-child(5),.md-typeset .no-js .tabbed-set>input:nth-child(6):checked~.tabbed-labels>:nth-child(6),.md-typeset .no-js .tabbed-set>input:nth-child(7):checked~.tabbed-labels>:nth-child(7),.md-typeset .no-js .tabbed-set>input:nth-child(8):checked~.tabbed-labels>:nth-child(8),.md-typeset .no-js .tabbed-set>input:nth-child(9):checked~.tabbed-labels>:nth-child(9),.no-js .md-typeset .tabbed-set>input:first-child:checked~.tabbed-labels>:first-child,.no-js .md-typeset .tabbed-set>input:nth-child(10):checked~.tabbed-labels>:nth-child(10),.no-js .md-typeset .tabbed-set>input:nth-child(11):checked~.tabbed-labels>:nth-child(11),.no-js .md-typeset .tabbed-set>input:nth-child(12):checked~.tabbed-labels>:nth-child(12),.no-js .md-typeset .tabbed-set>input:nth-child(13):checked~.tabbed-labels>:nth-child(13),.no-js .md-typeset .tabbed-set>input:nth-child(14):checked~.tabbed-labels>:nth-child(14),.no-js .md-typeset .tabbed-set>input:nth-child(15):checked~.tabbed-labels>:nth-child(15),.no-js .md-typeset .tabbed-set>input:nth-child(16):checked~.tabbed-labels>:nth-child(16),.no-js .md-typeset .tabbed-set>input:nth-child(17):checked~.tabbed-labels>:nth-child(17),.no-js .md-typeset .tabbed-set>input:nth-child(18):checked~.tabbed-labels>:nth-child(18),.no-js .md-typeset .tabbed-set>input:nth-child(19):checked~.tabbed-labels>:nth-child(19),.no-js .md-typeset .tabbed-set>input:nth-child(2):checked~.tabbed-labels>:nth-child(2),.no-js .md-typeset .tabbed-set>input:nth-child(20):checked~.tabbed-labels>:nth-child(20),.no-js .md-typeset .tabbed-set>input:nth-child(3):checked~.tabbed-labels>:nth-child(3),.no-js .md-typeset .tabbed-set>input:nth-child(4):checked~.tabbed-labels>:nth-child(4),.no-js .md-typeset .tabbed-set>input:nth-child(5):checked~.tabbed-labels>:nth-child(5),.no-js .md-typeset .tabbed-set>input:nth-child(6):checked~.tabbed-labels>:nth-child(6),.no-js .md-typeset .tabbed-set>input:nth-child(7):checked~.tabbed-labels>:nth-child(7),.no-js .md-typeset .tabbed-set>input:nth-child(8):checked~.tabbed-labels>:nth-child(8),.no-js .md-typeset .tabbed-set>input:nth-child(9):checked~.tabbed-labels>:nth-child(9){border-color:var(--md-default-fg-color)}}.md-typeset .tabbed-set>input:first-child.focus-visible~.tabbed-labels>:first-child,.md-typeset .tabbed-set>input:nth-child(10).focus-visible~.tabbed-labels>:nth-child(10),.md-typeset .tabbed-set>input:nth-child(11).focus-visible~.tabbed-labels>:nth-child(11),.md-typeset .tabbed-set>input:nth-child(12).focus-visible~.tabbed-labels>:nth-child(12),.md-typeset .tabbed-set>input:nth-child(13).focus-visible~.tabbed-labels>:nth-child(13),.md-typeset .tabbed-set>input:nth-child(14).focus-visible~.tabbed-labels>:nth-child(14),.md-typeset .tabbed-set>input:nth-child(15).focus-visible~.tabbed-labels>:nth-child(15),.md-typeset .tabbed-set>input:nth-child(16).focus-visible~.tabbed-labels>:nth-child(16),.md-typeset .tabbed-set>input:nth-child(17).focus-visible~.tabbed-labels>:nth-child(17),.md-typeset .tabbed-set>input:nth-child(18).focus-visible~.tabbed-labels>:nth-child(18),.md-typeset .tabbed-set>input:nth-child(19).focus-visible~.tabbed-labels>:nth-child(19),.md-typeset .tabbed-set>input:nth-child(2).focus-visible~.tabbed-labels>:nth-child(2),.md-typeset .tabbed-set>input:nth-child(20).focus-visible~.tabbed-labels>:nth-child(20),.md-typeset .tabbed-set>input:nth-child(3).focus-visible~.tabbed-labels>:nth-child(3),.md-typeset .tabbed-set>input:nth-child(4).focus-visible~.tabbed-labels>:nth-child(4),.md-typeset .tabbed-set>input:nth-child(5).focus-visible~.tabbed-labels>:nth-child(5),.md-typeset .tabbed-set>input:nth-child(6).focus-visible~.tabbed-labels>:nth-child(6),.md-typeset .tabbed-set>input:nth-child(7).focus-visible~.tabbed-labels>:nth-child(7),.md-typeset .tabbed-set>input:nth-child(8).focus-visible~.tabbed-labels>:nth-child(8),.md-typeset .tabbed-set>input:nth-child(9).focus-visible~.tabbed-labels>:nth-child(9){color:var(--md-accent-fg-color)}.md-typeset .tabbed-set>input:first-child:checked~.tabbed-content>:first-child,.md-typeset .tabbed-set>input:nth-child(10):checked~.tabbed-content>:nth-child(10),.md-typeset .tabbed-set>input:nth-child(11):checked~.tabbed-content>:nth-child(11),.md-typeset .tabbed-set>input:nth-child(12):checked~.tabbed-content>:nth-child(12),.md-typeset .tabbed-set>input:nth-child(13):checked~.tabbed-content>:nth-child(13),.md-typeset .tabbed-set>input:nth-child(14):checked~.tabbed-content>:nth-child(14),.md-typeset .tabbed-set>input:nth-child(15):checked~.tabbed-content>:nth-child(15),.md-typeset .tabbed-set>input:nth-child(16):checked~.tabbed-content>:nth-child(16),.md-typeset .tabbed-set>input:nth-child(17):checked~.tabbed-content>:nth-child(17),.md-typeset .tabbed-set>input:nth-child(18):checked~.tabbed-content>:nth-child(18),.md-typeset .tabbed-set>input:nth-child(19):checked~.tabbed-content>:nth-child(19),.md-typeset .tabbed-set>input:nth-child(2):checked~.tabbed-content>:nth-child(2),.md-typeset .tabbed-set>input:nth-child(20):checked~.tabbed-content>:nth-child(20),.md-typeset .tabbed-set>input:nth-child(3):checked~.tabbed-content>:nth-child(3),.md-typeset .tabbed-set>input:nth-child(4):checked~.tabbed-content>:nth-child(4),.md-typeset .tabbed-set>input:nth-child(5):checked~.tabbed-content>:nth-child(5),.md-typeset .tabbed-set>input:nth-child(6):checked~.tabbed-content>:nth-child(6),.md-typeset .tabbed-set>input:nth-child(7):checked~.tabbed-content>:nth-child(7),.md-typeset .tabbed-set>input:nth-child(8):checked~.tabbed-content>:nth-child(8),.md-typeset .tabbed-set>input:nth-child(9):checked~.tabbed-content>:nth-child(9){display:block}:root{--md-tasklist-icon:url('data:image/svg+xml;charset=utf-8,');--md-tasklist-icon--checked:url('data:image/svg+xml;charset=utf-8,')}.md-typeset .task-list-item{list-style-type:none;position:relative}[dir=ltr] .md-typeset .task-list-item [type=checkbox]{left:-2em}[dir=rtl] .md-typeset .task-list-item [type=checkbox]{right:-2em}.md-typeset .task-list-item [type=checkbox]{position:absolute;top:.45em}.md-typeset .task-list-control [type=checkbox]{opacity:0;z-index:-1}[dir=ltr] .md-typeset .task-list-indicator:before{left:-1.5em}[dir=rtl] .md-typeset .task-list-indicator:before{right:-1.5em}.md-typeset .task-list-indicator:before{background-color:var(--md-default-fg-color--lightest);content:"";height:1.25em;-webkit-mask-image:var(--md-tasklist-icon);mask-image:var(--md-tasklist-icon);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;position:absolute;top:.15em;width:1.25em}.md-typeset [type=checkbox]:checked+.task-list-indicator:before{background-color:#00e676;-webkit-mask-image:var(--md-tasklist-icon--checked);mask-image:var(--md-tasklist-icon--checked)}:root>*{--md-mermaid-font-family:var(--md-text-font-family),sans-serif;--md-mermaid-edge-color:var(--md-code-fg-color);--md-mermaid-node-bg-color:var(--md-accent-fg-color--transparent);--md-mermaid-node-fg-color:var(--md-accent-fg-color);--md-mermaid-label-bg-color:var(--md-default-bg-color);--md-mermaid-label-fg-color:var(--md-code-fg-color);--md-mermaid-sequence-actor-bg-color:var(--md-mermaid-label-bg-color);--md-mermaid-sequence-actor-fg-color:var(--md-mermaid-label-fg-color);--md-mermaid-sequence-actor-border-color:var(--md-mermaid-node-fg-color);--md-mermaid-sequence-actor-line-color:var(--md-default-fg-color--lighter);--md-mermaid-sequence-actorman-bg-color:var(--md-mermaid-label-bg-color);--md-mermaid-sequence-actorman-line-color:var(--md-mermaid-node-fg-color);--md-mermaid-sequence-box-bg-color:var(--md-mermaid-node-bg-color);--md-mermaid-sequence-box-fg-color:var(--md-mermaid-edge-color);--md-mermaid-sequence-label-bg-color:var(--md-mermaid-node-bg-color);--md-mermaid-sequence-label-fg-color:var(--md-mermaid-node-fg-color);--md-mermaid-sequence-loop-bg-color:var(--md-mermaid-node-bg-color);--md-mermaid-sequence-loop-fg-color:var(--md-mermaid-edge-color);--md-mermaid-sequence-loop-border-color:var(--md-mermaid-node-fg-color);--md-mermaid-sequence-message-fg-color:var(--md-mermaid-edge-color);--md-mermaid-sequence-message-line-color:var(--md-mermaid-edge-color);--md-mermaid-sequence-note-bg-color:var(--md-mermaid-label-bg-color);--md-mermaid-sequence-note-fg-color:var(--md-mermaid-edge-color);--md-mermaid-sequence-note-border-color:var(--md-mermaid-label-fg-color);--md-mermaid-sequence-number-bg-color:var(--md-mermaid-node-fg-color);--md-mermaid-sequence-number-fg-color:var(--md-accent-bg-color)}.mermaid{line-height:normal;margin:1em 0}@media screen and (min-width:45em){[dir=ltr] .md-typeset .inline{float:left}[dir=rtl] .md-typeset .inline{float:right}[dir=ltr] .md-typeset .inline{margin-right:.8rem}[dir=rtl] .md-typeset .inline{margin-left:.8rem}.md-typeset .inline{margin-bottom:.8rem;margin-top:0;width:11.7rem}[dir=ltr] .md-typeset .inline.end{float:right}[dir=rtl] .md-typeset .inline.end{float:left}[dir=ltr] .md-typeset .inline.end{margin-left:.8rem;margin-right:0}[dir=rtl] .md-typeset .inline.end{margin-left:0;margin-right:.8rem}} \ No newline at end of file diff --git a/assets/stylesheets/main.6a10b989.min.css.map b/assets/stylesheets/main.6a10b989.min.css.map deleted file mode 100644 index e9c6442..0000000 --- a/assets/stylesheets/main.6a10b989.min.css.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["src/templates/assets/stylesheets/main/components/_meta.scss","../../../../src/templates/assets/stylesheets/main.scss","src/templates/assets/stylesheets/main/_resets.scss","src/templates/assets/stylesheets/main/_colors.scss","src/templates/assets/stylesheets/main/_icons.scss","src/templates/assets/stylesheets/main/_typeset.scss","src/templates/assets/stylesheets/utilities/_break.scss","src/templates/assets/stylesheets/main/components/_author.scss","src/templates/assets/stylesheets/main/components/_banner.scss","src/templates/assets/stylesheets/main/components/_base.scss","src/templates/assets/stylesheets/main/components/_clipboard.scss","src/templates/assets/stylesheets/main/components/_consent.scss","src/templates/assets/stylesheets/main/components/_content.scss","src/templates/assets/stylesheets/main/components/_dialog.scss","src/templates/assets/stylesheets/main/components/_feedback.scss","src/templates/assets/stylesheets/main/components/_footer.scss","src/templates/assets/stylesheets/main/components/_form.scss","src/templates/assets/stylesheets/main/components/_header.scss","node_modules/material-design-color/material-color.scss","src/templates/assets/stylesheets/main/components/_nav.scss","src/templates/assets/stylesheets/main/components/_pagination.scss","src/templates/assets/stylesheets/main/components/_post.scss","src/templates/assets/stylesheets/main/components/_progress.scss","src/templates/assets/stylesheets/main/components/_search.scss","src/templates/assets/stylesheets/main/components/_select.scss","src/templates/assets/stylesheets/main/components/_sidebar.scss","src/templates/assets/stylesheets/main/components/_source.scss","src/templates/assets/stylesheets/main/components/_status.scss","src/templates/assets/stylesheets/main/components/_tabs.scss","src/templates/assets/stylesheets/main/components/_tag.scss","src/templates/assets/stylesheets/main/components/_tooltip.scss","src/templates/assets/stylesheets/main/components/_top.scss","src/templates/assets/stylesheets/main/components/_version.scss","src/templates/assets/stylesheets/main/extensions/markdown/_admonition.scss","src/templates/assets/stylesheets/main/extensions/markdown/_footnotes.scss","src/templates/assets/stylesheets/main/extensions/markdown/_toc.scss","src/templates/assets/stylesheets/main/extensions/pymdownx/_arithmatex.scss","src/templates/assets/stylesheets/main/extensions/pymdownx/_critic.scss","src/templates/assets/stylesheets/main/extensions/pymdownx/_details.scss","src/templates/assets/stylesheets/main/extensions/pymdownx/_emoji.scss","src/templates/assets/stylesheets/main/extensions/pymdownx/_highlight.scss","src/templates/assets/stylesheets/main/extensions/pymdownx/_keys.scss","src/templates/assets/stylesheets/main/extensions/pymdownx/_tabbed.scss","src/templates/assets/stylesheets/main/extensions/pymdownx/_tasklist.scss","src/templates/assets/stylesheets/main/integrations/_mermaid.scss","src/templates/assets/stylesheets/main/_modifiers.scss"],"names":[],"mappings":"AA0CE,gBC+xCF,CC7yCA,KAEE,6BAAA,CAAA,0BAAA,CAAA,qBAAA,CADA,qBDzBF,CC8BA,iBAGE,kBD3BF,CC8BE,gCANF,iBAOI,yBDzBF,CACF,CC6BA,KACE,QD1BF,CC8BA,qBAIE,uCD3BF,CC+BA,EACE,aAAA,CACA,oBD5BF,CCgCA,GAME,QAAA,CALA,kBAAA,CACA,aAAA,CACA,aAAA,CAEA,gBAAA,CADA,SD3BF,CCiCA,MACE,aD9BF,CCkCA,QAEE,eD/BF,CCmCA,IACE,iBDhCF,CCoCA,MAEE,uBAAA,CADA,gBDhCF,CCqCA,MAEE,eAAA,CACA,kBDlCF,CCsCA,OAKE,gBAAA,CACA,QAAA,CAHA,mBAAA,CACA,iBAAA,CAFA,QAAA,CADA,SD9BF,CCuCA,MACE,QAAA,CACA,YDpCF,CErDA,MAIE,6BAAA,CACA,oCAAA,CACA,mCAAA,CACA,0BAAA,CACA,sCAAA,CAGA,4BAAA,CACA,2CAAA,CACA,yBAAA,CACA,qCFmDF,CE7CA,+BAIE,kBF6CF,CE1CE,oHAEE,YF4CJ,CEnCA,qCAIE,eAAA,CAGA,+BAAA,CACA,sCAAA,CACA,wCAAA,CACA,yCAAA,CACA,0BAAA,CACA,sCAAA,CACA,wCAAA,CACA,yCAAA,CAGA,0BAAA,CACA,0BAAA,CAGA,0BAAA,CACA,mCAAA,CACA,iCAAA,CACA,kCAAA,CACA,mCAAA,CACA,mCAAA,CACA,kCAAA,CACA,iCAAA,CACA,+CAAA,CACA,6DAAA,CACA,gEAAA,CACA,4DAAA,CACA,4DAAA,CACA,6DAAA,CAGA,6CAAA,CAGA,+CAAA,CAGA,gCAAA,CACA,gCAAA,CAGA,8BAAA,CACA,kCAAA,CACA,qCAAA,CAGA,iCAAA,CAGA,kCAAA,CACA,gDAAA,CAGA,mDAAA,CACA,mDAAA,CAGA,+BAAA,CACA,0BAAA,CAGA,yBAAA,CACA,qCAAA,CACA,uCAAA,CACA,8BAAA,CACA,oCAAA,CAGA,8DAAA,CAKA,8DAAA,CAKA,0DFOF,CG9HE,aAIE,iBAAA,CAHA,aAAA,CAEA,aAAA,CADA,YHmIJ,CIxIA,KACE,kCAAA,CACA,iCAAA,CAGA,uGAAA,CAKA,mFJyIF,CInIA,iBAIE,mCAAA,CACA,6BAAA,CAFA,sCJwIF,CIlIA,aAIE,4BAAA,CADA,sCJsIF,CI7HA,MACE,0NAAA,CACA,mNAAA,CACA,oNJgIF,CIzHA,YAGE,gCAAA,CAAA,kBAAA,CAFA,eAAA,CACA,eJ6HF,CIxHE,aAPF,YAQI,gBJ2HF,CACF,CIxHE,uGAME,iBAAA,CAAA,cJ0HJ,CItHE,eAKE,uCAAA,CAHA,aAAA,CAEA,eAAA,CAHA,iBJ6HJ,CIpHE,8BAPE,eAAA,CAGA,qBJ+HJ,CI3HE,eAEE,kBAAA,CAEA,eAAA,CAHA,oBJ0HJ,CIlHE,eAEE,gBAAA,CACA,eAAA,CAEA,qBAAA,CADA,eAAA,CAHA,mBJwHJ,CIhHE,kBACE,eJkHJ,CI9GE,eAEE,eAAA,CACA,qBAAA,CAFA,YJkHJ,CI5GE,8BAKE,uCAAA,CAFA,cAAA,CACA,eAAA,CAEA,qBAAA,CAJA,eJkHJ,CI1GE,eACE,wBJ4GJ,CIxGE,eAGE,+DAAA,CAFA,iBAAA,CACA,cJ2GJ,CItGE,cACE,+BAAA,CACA,qBJwGJ,CIrGI,mCAEE,sBJsGN,CIlGI,wCACE,+BJoGN,CIjGM,kDACE,uDJmGR,CI9FI,mBACE,kBAAA,CACA,iCJgGN,CI5FI,4BACE,uCAAA,CACA,oBJ8FN,CIzFE,iDAIE,6BAAA,CACA,aAAA,CAFA,2BJ6FJ,CIxFI,aARF,iDASI,oBJ6FJ,CACF,CIzFE,iBAIE,wCAAA,CACA,mBAAA,CACA,kCAAA,CAAA,0BAAA,CAJA,eAAA,CADA,uBAAA,CAEA,qBJ8FJ,CIxFI,qCAEE,uCAAA,CADA,YJ2FN,CIrFE,gBAEE,iBAAA,CACA,eAAA,CAFA,iBJyFJ,CIpFI,qBASE,kCAAA,CAAA,0BAAA,CADA,eAAA,CAPA,aAAA,CAEA,QAAA,CAIA,uCAAA,CAHA,aAAA,CAFA,oCAAA,CASA,yDAAA,CADA,oBAAA,CAJA,iBAAA,CADA,iBJ4FN,CInFM,2BACE,+CJqFR,CIjFM,wCAEE,YAAA,CADA,WJoFR,CI/EM,8CACE,oDJiFR,CI9EQ,oDACE,0CJgFV,CIzEE,gBAOE,4CAAA,CACA,mBAAA,CACA,mKACE,CANF,gCAAA,CAHA,oBAAA,CAEA,eAAA,CADA,uBAAA,CAIA,uBAAA,CADA,qBJ+EJ,CIpEE,iBAGE,6CAAA,CACA,kCAAA,CAAA,0BAAA,CAHA,aAAA,CACA,qBJwEJ,CIlEE,iBAGE,6DAAA,CADA,WAAA,CADA,oBJsEJ,CIjEI,oBAGE,wEAQE,2CAAA,CACA,mBAAA,CACA,8BAAA,CAJA,gCAAA,CACA,mBAAA,CAFA,eAAA,CAHA,UAAA,CAEA,cAAA,CADA,mBAAA,CAFA,iBAAA,CACA,WJyEN,CACF,CI5DE,kBACE,WJ8DJ,CI1DE,oDAEE,qBJ4DJ,CI9DE,oDAEE,sBJ4DJ,CIxDE,iCACE,kBJ6DJ,CI9DE,iCACE,mBJ6DJ,CI9DE,iCAIE,2DJ0DJ,CI9DE,iCAIE,4DJ0DJ,CI9DE,uBAGE,uCAAA,CADA,aAAA,CAAA,cJ4DJ,CItDE,eACE,oBJwDJ,CIpDE,kDAGE,kBJsDJ,CIzDE,kDAGE,mBJsDJ,CIzDE,8BAEE,SJuDJ,CInDI,0DACE,iBJsDN,CIlDI,oCACE,2BJqDN,CIlDM,0CACE,2BJqDR,CIhDI,wDACE,kBJoDN,CIrDI,wDACE,mBJoDN,CIrDI,oCAEE,kBJmDN,CIhDM,kGAEE,aJoDR,CIhDM,0DACE,eJmDR,CI/CM,4HAEE,kBJkDR,CIpDM,4HAEE,mBJkDR,CIpDM,oFACE,kBAAA,CAAA,eJmDR,CI5CE,yBAEE,mBJ8CJ,CIhDE,yBAEE,oBJ8CJ,CIhDE,eACE,mBAAA,CAAA,cJ+CJ,CI1CE,kDAIE,WAAA,CADA,cJ6CJ,CIrCI,4BAEE,oBJuCN,CInCI,6BAEE,oBJqCN,CIjCI,kCACE,YJmCN,CI9BE,mBACE,iBAAA,CAGA,eAAA,CADA,cAAA,CAEA,iBAAA,CAHA,yBAAA,CAAA,sBAAA,CAAA,iBJmCJ,CI7BI,uBACE,aJ+BN,CI1BE,uBAGE,iBAAA,CADA,eAAA,CADA,eJ8BJ,CIxBE,mBACE,cJ0BJ,CItBE,+BAME,2CAAA,CACA,iDAAA,CACA,mBAAA,CAPA,oBAAA,CAGA,gBAAA,CAFA,cAAA,CACA,aAAA,CAEA,iBJ2BJ,CIrBI,aAXF,+BAYI,aJwBJ,CACF,CInBI,iCACE,gBJqBN,CIdM,8FACE,YJgBR,CIZM,4FACE,eJcR,CITI,8FACE,eJWN,CIRM,kHACE,gBJUR,CILI,kCAGE,eAAA,CAFA,cAAA,CACA,sBAAA,CAEA,kBJON,CIHI,kCAGE,qDAAA,CAFA,sBAAA,CACA,kBJMN,CIDI,wCACE,iCJGN,CIAM,8CACE,qDAAA,CACA,sDJER,CIGI,iCACE,iBJDN,CIME,wCACE,cJJJ,CIOI,wDAIE,gBJCN,CILI,wDAIE,iBJCN,CILI,8CAME,UAAA,CALA,oBAAA,CAEA,YAAA,CAKA,oDAAA,CAAA,4CAAA,CACA,6BAAA,CAAA,qBAAA,CACA,yBAAA,CAAA,iBAAA,CAHA,iCAAA,CAFA,0BAAA,CAHA,WJGN,CISI,oDACE,oDJPN,CIWI,mEACE,kDAAA,CACA,yDAAA,CAAA,iDJTN,CIaI,oEACE,kDAAA,CACA,0DAAA,CAAA,kDJXN,CIgBE,wBACE,iBAAA,CACA,eAAA,CACA,iBJdJ,CIkBE,mBACE,oBAAA,CAEA,kBAAA,CADA,eJfJ,CImBI,aANF,mBAOI,aJhBJ,CACF,CImBI,8BACE,aAAA,CAEA,QAAA,CACA,eAAA,CAFA,UJfN,CKhWI,0CD8XF,uBACE,iBJ1BF,CI6BE,4BACE,eJ3BJ,CACF,CM/hBE,uBAEE,aAAA,CACA,aAAA,CAEA,aAAA,CACA,eAAA,CALA,iBAAA,CAMA,sCACE,CAJF,YNoiBJ,CM5hBI,2BAEE,kBAAA,CADA,aN+hBN,CM1hBI,6BAME,+CAAA,CAFA,yCAAA,CAHA,eAAA,CACA,eAAA,CACA,kBAAA,CAEA,iBN6hBN,CMxhBI,6BAEE,aAAA,CADA,YN2hBN,CMrhBE,wBACE,kBNuhBJ,CMphBI,4BACE,mCAAA,CACA,uBNshBN,CMlhBI,4DAEE,oBAAA,CADA,SNqhBN,CMjhBM,oEACE,mBNmhBR,COzkBA,WAGE,0CAAA,CADA,+BAAA,CADA,aP8kBF,COzkBE,aANF,WAOI,YP4kBF,CACF,COzkBE,oBAEE,2CAAA,CADA,gCP4kBJ,COvkBE,kBAGE,eAAA,CADA,iBAAA,CADA,eP2kBJ,COrkBE,6BACE,WP0kBJ,CO3kBE,6BACE,UP0kBJ,CO3kBE,mBAEE,aAAA,CACA,cAAA,CACA,uBPukBJ,COpkBI,0BACE,YPskBN,COlkBI,yBACE,UPokBN,CQzmBA,KASE,cAAA,CARA,WAAA,CACA,iBR6mBF,CKzcI,oCGtKJ,KAaI,gBRsmBF,CACF,CK9cI,oCGtKJ,KAkBI,cRsmBF,CACF,CQjmBA,KASE,2CAAA,CAPA,YAAA,CACA,qBAAA,CAKA,eAAA,CAHA,eAAA,CAJA,iBAAA,CAGA,URumBF,CQ/lBE,aAZF,KAaI,aRkmBF,CACF,CK/cI,0CGhJF,yBAII,cR+lBJ,CACF,CQtlBA,SAEE,gBAAA,CAAA,iBAAA,CADA,eR0lBF,CQrlBA,cACE,YAAA,CACA,qBAAA,CACA,WRwlBF,CQrlBE,aANF,cAOI,aRwlBF,CACF,CQplBA,SACE,WRulBF,CQplBE,gBACE,YAAA,CACA,WAAA,CACA,iBRslBJ,CQjlBA,aACE,eAAA,CACA,sBRolBF,CQ3kBA,WACE,YR8kBF,CQzkBA,WAGE,QAAA,CACA,SAAA,CAHA,iBAAA,CACA,OR8kBF,CQzkBE,uCACE,aR2kBJ,CQvkBE,+BAEE,uCAAA,CADA,kBR0kBJ,CQpkBA,SASE,2CAAA,CACA,mBAAA,CAFA,gCAAA,CADA,gBAAA,CADA,YAAA,CAMA,SAAA,CADA,uCAAA,CANA,mBAAA,CAJA,cAAA,CAYA,2BAAA,CATA,UR8kBF,CQlkBE,eAEE,SAAA,CAIA,uBAAA,CAHA,oEACE,CAHF,URukBJ,CQzjBA,MACE,WR4jBF,CSrtBA,MACE,+PTutBF,CSjtBA,cASE,mBAAA,CAFA,0CAAA,CACA,cAAA,CAFA,YAAA,CAIA,uCAAA,CACA,oBAAA,CAVA,iBAAA,CAEA,UAAA,CADA,QAAA,CAUA,qBAAA,CAPA,WAAA,CADA,ST4tBF,CSjtBE,aAfF,cAgBI,YTotBF,CACF,CSjtBE,kCAEE,uCAAA,CADA,YTotBJ,CS/sBE,qBACE,uCTitBJ,CS7sBE,wCACE,+BT+sBJ,CS1sBE,oBAME,6BAAA,CADA,UAAA,CAJA,aAAA,CAEA,cAAA,CACA,aAAA,CAGA,2CAAA,CAAA,mCAAA,CACA,4BAAA,CAAA,oBAAA,CACA,6BAAA,CAAA,qBAAA,CACA,yBAAA,CAAA,iBAAA,CARA,aTotBJ,CSxsBE,sBACE,cT0sBJ,CSvsBI,2BACE,2CTysBN,CSnsBI,kEAEE,uDAAA,CADA,+BTssBN,CU5wBA,mBACE,GACE,SAAA,CACA,0BV+wBF,CU5wBA,GACE,SAAA,CACA,uBV8wBF,CACF,CU1wBA,mBACE,GACE,SV4wBF,CUzwBA,GACE,SV2wBF,CACF,CUhwBE,qBASE,2BAAA,CADA,mCAAA,CAAA,2BAAA,CAFA,0BAAA,CADA,WAAA,CAEA,SAAA,CANA,cAAA,CACA,KAAA,CAEA,UAAA,CADA,SVwwBJ,CU9vBE,mBAcE,mDAAA,CANA,2CAAA,CACA,QAAA,CACA,mBAAA,CARA,QAAA,CASA,kDACE,CAPF,eAAA,CAEA,aAAA,CADA,SAAA,CALA,cAAA,CAGA,UAAA,CADA,SVywBJ,CU1vBE,kBACE,aV4vBJ,CUxvBE,sBACE,YAAA,CACA,YV0vBJ,CUvvBI,oCACE,aVyvBN,CUpvBE,sBACE,mBVsvBJ,CUnvBI,6CACE,cVqvBN,CK/oBI,0CKvGA,6CAKI,aAAA,CAEA,gBAAA,CACA,iBAAA,CAFA,UVuvBN,CACF,CUhvBE,kBACE,cVkvBJ,CWn1BA,YACE,WAAA,CAIA,WXm1BF,CWh1BE,mBAEE,qBAAA,CADA,iBXm1BJ,CKtrBI,sCMtJE,4EACE,kBX+0BN,CW30BI,0JACE,mBX60BN,CW90BI,8EACE,kBX60BN,CACF,CWx0BI,0BAGE,UAAA,CAFA,aAAA,CACA,YX20BN,CWt0BI,+BACE,eXw0BN,CWl0BE,8BACE,WXu0BJ,CWx0BE,8BACE,UXu0BJ,CWx0BE,8BAIE,iBXo0BJ,CWx0BE,8BAIE,kBXo0BJ,CWx0BE,oBAGE,cAAA,CADA,SXs0BJ,CWj0BI,aAPF,oBAQI,YXo0BJ,CACF,CWj0BI,gCACE,yCXm0BN,CW/zBI,wBACE,cAAA,CACA,kBXi0BN,CW9zBM,kCACE,oBXg0BR,CYj4BA,qBAeE,WZk4BF,CYj5BA,qBAeE,UZk4BF,CYj5BA,WAOE,2CAAA,CACA,mBAAA,CANA,YAAA,CAOA,8BAAA,CALA,iBAAA,CAMA,SAAA,CALA,mBAAA,CACA,mBAAA,CALA,cAAA,CAaA,0BAAA,CAHA,wCACE,CATF,SZ84BF,CY/3BE,aAlBF,WAmBI,YZk4BF,CACF,CY/3BE,mBAEE,SAAA,CADA,mBAAA,CAKA,uBAAA,CAHA,kEZk4BJ,CY33BE,kBAEE,gCAAA,CADA,eZ83BJ,Cah6BA,aACE,gBAAA,CACA,iBbm6BF,Cah6BE,sBAGE,WAAA,CADA,QAAA,CADA,Sbo6BJ,Ca95BE,oBAEE,eAAA,CADA,ebi6BJ,Ca55BE,oBACE,iBb85BJ,Ca15BE,mBAIE,sBAAA,CAFA,YAAA,CACA,cAAA,CAEA,sBAAA,CAJA,iBbg6BJ,Caz5BI,iDACE,yCb25BN,Cav5BI,6BACE,iBby5BN,Cap5BE,mBAGE,uCAAA,CACA,cAAA,CAHA,aAAA,CACA,cAAA,CAGA,sBbs5BJ,Can5BI,gDACE,+Bbq5BN,Caj5BI,4BACE,0CAAA,CACA,mBbm5BN,Ca94BE,mBAEE,SAAA,CADA,iBAAA,CAKA,2BAAA,CAHA,8Dbi5BJ,Ca34BI,qBAEE,aAAA,CADA,eb84BN,Caz4BI,6BACE,SAAA,CACA,uBb24BN,Cc19BA,WAEE,0CAAA,CADA,+Bd89BF,Cc19BE,aALF,WAMI,Yd69BF,CACF,Cc19BE,kBACE,6BAAA,CAEA,aAAA,CADA,ad69BJ,Ccz9BI,gCACE,Yd29BN,Cct9BE,iBAOE,eAAA,CANA,YAAA,CAKA,cAAA,CAGA,mBAAA,CAAA,eAAA,CADA,cAAA,CAGA,uCAAA,CADA,eAAA,CAEA,uBdo9BJ,Ccj9BI,8CACE,Udm9BN,Cc/8BI,+BACE,oBdi9BN,CKn0BI,0CSvIE,uBACE,ad68BN,Cc18BM,yCACE,Yd48BR,CACF,Ccv8BI,iCACE,gBd08BN,Cc38BI,iCACE,iBd08BN,Cc38BI,uBAEE,gBdy8BN,Cct8BM,iCACE,edw8BR,Ccl8BE,kBACE,WAAA,CAIA,eAAA,CADA,mBAAA,CAFA,6BAAA,CACA,cAAA,CAGA,kBdo8BJ,Cch8BE,mBAEE,YAAA,CADA,adm8BJ,Cc97BE,sBACE,gBAAA,CACA,Udg8BJ,Cc37BA,gBACE,gDd87BF,Cc37BE,uBACE,YAAA,CACA,cAAA,CACA,6BAAA,CACA,ad67BJ,Ccz7BE,kCACE,sCd27BJ,Ccx7BI,gFACE,+Bd07BN,Ccl7BA,cAKE,wCAAA,CADA,gBAAA,CADA,iBAAA,CADA,eAAA,CADA,Udy7BF,CK74BI,mCS7CJ,cASI,Udq7BF,CACF,Ccj7BE,yBACE,sCdm7BJ,Cc56BA,WACE,mBAAA,CACA,SAAA,CAEA,cAAA,CADA,qBdg7BF,CK55BI,mCSvBJ,WAQI,ed+6BF,CACF,Cc56BE,iBACE,oBAAA,CAEA,aAAA,CACA,iBAAA,CAFA,Ydg7BJ,Cc36BI,wBACE,ed66BN,Ccz6BI,qBAGE,iBAAA,CAFA,gBAAA,CACA,mBd46BN,CellCE,uBAME,kBAAA,CACA,mBAAA,CAHA,gCAAA,CACA,cAAA,CAJA,oBAAA,CAEA,eAAA,CADA,kBAAA,CAMA,gEfqlCJ,Ce/kCI,gCAEE,2CAAA,CACA,uCAAA,CAFA,gCfmlCN,Ce7kCI,0DAEE,0CAAA,CACA,sCAAA,CAFA,+BfilCN,Ce1kCE,gCAKE,4Bf+kCJ,CeplCE,gEAME,6Bf8kCJ,CeplCE,gCAME,4Bf8kCJ,CeplCE,sBAIE,6DAAA,CAGA,8BAAA,CAJA,eAAA,CAFA,aAAA,CACA,eAAA,CAMA,sCf4kCJ,CevkCI,wDACE,6CAAA,CACA,8BfykCN,CerkCI,+BACE,UfukCN,CgB1nCA,WAOE,2CAAA,CAGA,8CACE,CALF,gCAAA,CADA,aAAA,CAHA,MAAA,CADA,eAAA,CACA,OAAA,CACA,KAAA,CACA,ShBioCF,CgBtnCE,aAfF,WAgBI,YhBynCF,CACF,CgBtnCE,mBAIE,2BAAA,CAHA,iEhBynCJ,CgBlnCE,mBACE,kDACE,CAEF,kEhBknCJ,CgB5mCE,kBAEE,kBAAA,CADA,YAAA,CAEA,ehB8mCJ,CgB1mCE,mBAKE,kBAAA,CAEA,cAAA,CAHA,YAAA,CAIA,uCAAA,CALA,aAAA,CAFA,iBAAA,CAQA,uBAAA,CAHA,qBAAA,CAJA,ShBmnCJ,CgBzmCI,yBACE,UhB2mCN,CgBvmCI,iCACE,oBhBymCN,CgBrmCI,uCAEE,uCAAA,CADA,YhBwmCN,CgBnmCI,2BAEE,YAAA,CADA,ahBsmCN,CKx/BI,0CW/GA,2BAMI,YhBqmCN,CACF,CgBlmCM,8DAIE,iBAAA,CAHA,aAAA,CAEA,aAAA,CADA,UhBsmCR,CKthCI,mCWzEA,iCAII,YhB+lCN,CACF,CgB5lCM,wCACE,YhB8lCR,CgB1lCM,+CACE,oBhB4lCR,CKjiCI,sCWtDA,iCAII,YhBulCN,CACF,CgBllCE,kBAEE,YAAA,CACA,cAAA,CAFA,iBAAA,CAIA,8DACE,CAFF,kBhBqlCJ,CgB/kCI,oCAGE,SAAA,CADA,mBAAA,CAKA,6BAAA,CAHA,8DACE,CAJF,UhBqlCN,CgB5kCM,8CACE,8BhB8kCR,CgBzkCI,8BACE,ehB2kCN,CgBtkCE,4BAGE,gBhB2kCJ,CgB9kCE,4BAGE,iBhB2kCJ,CgB9kCE,4BAIE,kBhB0kCJ,CgB9kCE,4BAIE,iBhB0kCJ,CgB9kCE,kBACE,WAAA,CAIA,eAAA,CAHA,aAAA,CAIA,kBhBwkCJ,CgBrkCI,4CAGE,SAAA,CADA,mBAAA,CAKA,8BAAA,CAHA,8DACE,CAJF,UhB2kCN,CgBlkCM,sDACE,6BhBokCR,CgBhkCM,8DAGE,SAAA,CADA,mBAAA,CAKA,uBAAA,CAHA,8DACE,CAJF,ShBskCR,CgB3jCI,uCAGE,WAAA,CAFA,iBAAA,CACA,UhB8jCN,CgBxjCE,mBACE,YAAA,CACA,aAAA,CACA,cAAA,CAEA,+CACE,CAFF,kBhB2jCJ,CgBrjCI,8DACE,WAAA,CACA,SAAA,CACA,oChBujCN,CgB9iCI,yBACE,QhBgjCN,CgB3iCE,mBACE,YhB6iCJ,CK1mCI,mCW4DF,6BAQI,gBhB6iCJ,CgBrjCA,6BAQI,iBhB6iCJ,CgBrjCA,mBAKI,aAAA,CAEA,iBAAA,CADA,ahB+iCJ,CACF,CKlnCI,sCW4DF,6BAaI,kBhB6iCJ,CgB1jCA,6BAaI,mBhB6iCJ,CACF,CD7xCA,SAGE,uCAAA,CAFA,eAAA,CACA,eCiyCF,CD7xCE,eACE,mBAAA,CACA,cAAA,CAGA,eAAA,CADA,QAAA,CADA,SCiyCJ,CD3xCE,sCAEE,WAAA,CADA,iBAAA,CAAA,kBC8xCJ,CDzxCE,eACE,+BC2xCJ,CDxxCI,0CACE,+BC0xCN,CDpxCA,UAKE,wBkBaa,ClBZb,oBAAA,CAFA,UAAA,CAHA,oBAAA,CAEA,eAAA,CADA,0BAAA,CAAA,2BC2xCF,CkB7zCA,MACE,0MAAA,CACA,gMAAA,CACA,yNlBg0CF,CkB1zCA,QACE,eAAA,CACA,elB6zCF,CkB1zCE,eAKE,uCAAA,CAJA,aAAA,CAGA,eAAA,CADA,eAAA,CADA,eAAA,CAIA,sBlB4zCJ,CkBzzCI,+BACE,YlB2zCN,CkBxzCM,mCAEE,WAAA,CADA,UlB2zCR,CkBnzCQ,sFAME,iBAAA,CALA,aAAA,CAGA,aAAA,CADA,cAAA,CAEA,kBAAA,CAHA,UlByzCV,CkB9yCE,cAGE,eAAA,CADA,QAAA,CADA,SlBkzCJ,CkB5yCE,cAGE,sBAAA,CAFA,YAAA,CACA,SAAA,CAEA,iBAAA,CAEA,uBAAA,CADA,sBlB+yCJ,CkB3yCI,sBACE,uClB6yCN,CkBtyCM,6EAEE,+BlBwyCR,CkBnyCI,2BAIE,iBlBkyCN,CkB9xCI,4CACE,gBlBgyCN,CkBjyCI,4CACE,iBlBgyCN,CkB5xCI,kBAGE,iBAAA,CAFA,aAAA,CACA,YlB+xCN,CkB1xCI,sGACE,+BAAA,CACA,clB4xCN,CkBxxCI,4BACE,uCAAA,CACA,oBlB0xCN,CkBtxCI,0CACE,YlBwxCN,CkBrxCM,yDAKE,6BAAA,CAJA,aAAA,CAEA,WAAA,CACA,qCAAA,CAAA,6BAAA,CAFA,UlB0xCR,CkBnxCM,kDACE,YlBqxCR,CkB/wCE,iCACE,YlBixCJ,CkB9wCI,6CACE,WAAA,CAGA,WlB8wCN,CkBzwCE,cACE,alB2wCJ,CkBvwCE,gBACE,YlBywCJ,CKvuCI,0Ca3BA,0CASE,2CAAA,CAHA,YAAA,CACA,qBAAA,CACA,WAAA,CALA,MAAA,CADA,iBAAA,CACA,OAAA,CACA,KAAA,CACA,SlBwwCJ,CkB7vCI,+DACE,eAAA,CACA,elB+vCN,CkB3vCI,gCAQE,qDAAA,CAHA,uCAAA,CAEA,cAAA,CALA,aAAA,CAEA,kBAAA,CADA,wBAAA,CAFA,iBAAA,CAKA,kBlB+vCN,CkB1vCM,wDAGE,UlBgwCR,CkBnwCM,wDAGE,WlBgwCR,CkBnwCM,8CAIE,aAAA,CAEA,aAAA,CACA,YAAA,CANA,iBAAA,CACA,SAAA,CAGA,YlB8vCR,CkBzvCQ,oDAKE,6BAAA,CADA,UAAA,CAHA,aAAA,CAEA,WAAA,CAGA,2CAAA,CAAA,mCAAA,CACA,4BAAA,CAAA,oBAAA,CACA,6BAAA,CAAA,qBAAA,CACA,yBAAA,CAAA,iBAAA,CAPA,UlBkwCV,CkBtvCM,8CAGE,2CAAA,CACA,gEACE,CAJF,eAAA,CAKA,4BAAA,CAJA,kBlB2vCR,CkBpvCQ,2DACE,YlBsvCV,CkBjvCM,8CAGE,2CAAA,CADA,gCAAA,CADA,elBqvCR,CkB/uCM,yCAIE,aAAA,CAFA,UAAA,CAIA,YAAA,CADA,aAAA,CAJA,iBAAA,CACA,WAAA,CACA,SlBovCR,CkB5uCI,+BACE,MlB8uCN,CkB1uCI,+BACE,4DlB4uCN,CkBzuCM,qDACE,+BlB2uCR,CkBxuCQ,sHACE,+BlB0uCV,CkBpuCI,+BAEE,YAAA,CADA,mBlBuuCN,CkBnuCM,mCACE,elBquCR,CkBjuCM,6CACE,SlBmuCR,CkB/tCM,uDAGE,mBlBkuCR,CkBruCM,uDAGE,kBlBkuCR,CkBruCM,6CAIE,gBAAA,CAFA,aAAA,CADA,YlBouCR,CkB9tCQ,mDAKE,6BAAA,CADA,UAAA,CAHA,aAAA,CAEA,WAAA,CAGA,2CAAA,CAAA,mCAAA,CACA,4BAAA,CAAA,oBAAA,CACA,6BAAA,CAAA,qBAAA,CACA,yBAAA,CAAA,iBAAA,CAPA,UlBuuCV,CkBvtCM,+CACE,mBlBytCR,CkBjtCM,4CAEE,wBAAA,CADA,elBotCR,CkBhtCQ,oEACE,mBlBktCV,CkBntCQ,oEACE,oBlBktCV,CkB9sCQ,4EACE,iBlBgtCV,CkBjtCQ,4EACE,kBlBgtCV,CkB5sCQ,oFACE,mBlB8sCV,CkB/sCQ,oFACE,oBlB8sCV,CkB1sCQ,4FACE,mBlB4sCV,CkB7sCQ,4FACE,oBlB4sCV,CkBrsCE,mBACE,wBlBusCJ,CkBnsCE,wBACE,YAAA,CACA,SAAA,CAIA,0BAAA,CAHA,oElBssCJ,CkBhsCI,kCACE,2BlBksCN,CkB7rCE,gCACE,SAAA,CAIA,uBAAA,CAHA,qElBgsCJ,CkB1rCI,8CAEE,kCAAA,CAAA,0BlB2rCN,CACF,CK13CI,0CauMA,0CACE,YlBsrCJ,CkBnrCI,yDACE,UlBqrCN,CkBjrCI,wDACE,YlBmrCN,CkB/qCI,kDACE,YlBirCN,CkB5qCE,gBAIE,iDAAA,CADA,gCAAA,CAFA,aAAA,CACA,elBgrCJ,CACF,CKv7CM,+DagRF,6CACE,YlB0qCJ,CkBvqCI,4DACE,UlByqCN,CkBrqCI,2DACE,YlBuqCN,CkBnqCI,qDACE,YlBqqCN,CACF,CK/6CI,mCa7JJ,QA6aI,oBlBmqCF,CkB7pCI,kCAME,qCAAA,CACA,qDAAA,CANA,eAAA,CACA,KAAA,CAGA,SlB+pCN,CkB1pCM,6CACE,uBlB4pCR,CkBxpCM,gDACE,YlB0pCR,CkBrpCI,2CACE,kBlBwpCN,CkBzpCI,2CACE,mBlBwpCN,CkBzpCI,iCAEE,oBlBupCN,CkBhpCI,yDACE,kBlBkpCN,CkBnpCI,yDACE,iBlBkpCN,CACF,CKx8CI,sCa7JJ,QAydI,oBAAA,CACA,oDlBgpCF,CkB1oCI,gCAME,qCAAA,CACA,qDAAA,CANA,eAAA,CACA,KAAA,CAGA,SlB4oCN,CkBvoCM,8CACE,uBlByoCR,CkBroCM,8CACE,YlBuoCR,CkBloCI,yCACE,kBlBqoCN,CkBtoCI,yCACE,mBlBqoCN,CkBtoCI,+BAEE,oBlBooCN,CkB7nCI,uDACE,kBlB+nCN,CkBhoCI,uDACE,iBlB+nCN,CkB1nCE,wBACE,YAAA,CACA,sBAAA,CAEA,SAAA,CACA,6FACE,CAHF,mBlB8nCJ,CkBtnCI,sCACE,elBwnCN,CkBnnCE,sEACE,sBAAA,CAEA,SAAA,CACA,4FACE,CAHF,kBlBunCJ,CkB9mCE,6CACE,YlBgnCJ,CkB5mCE,uBACE,aAAA,CACA,elB8mCJ,CkB3mCI,kCACE,elB6mCN,CkBzmCI,qCACE,elB2mCN,CkBxmCM,0CACE,uClB0mCR,CkBtmCM,6DACE,mBlBwmCR,CkBpmCM,yFAEE,YlBsmCR,CkBjmCI,yCAEE,kBlBqmCN,CkBvmCI,yCAEE,mBlBqmCN,CkBvmCI,+BACE,aAAA,CAGA,SAAA,CADA,kBlBomCN,CkBhmCM,2DACE,SlBkmCR,CkB5lCE,cAGE,kBAAA,CADA,YAAA,CAEA,gCAAA,CAHA,WlBimCJ,CkB3lCI,oBACE,uDlB6lCN,CkBzlCI,oBAME,6BAAA,CACA,kBAAA,CAFA,UAAA,CAJA,oBAAA,CAEA,WAAA,CAMA,2CAAA,CAAA,mCAAA,CACA,4BAAA,CAAA,oBAAA,CACA,6BAAA,CAAA,qBAAA,CACA,yBAAA,CAAA,iBAAA,CAJA,yBAAA,CAJA,qBAAA,CAFA,UlBqmCN,CkBxlCM,8BACE,wBlB0lCR,CkBtlCM,sKAEE,uBlBulCR,CkBzkCI,2EACE,YlB8kCN,CkB3kCM,oDACE,alB6kCR,CkB1kCQ,kEAKE,qCAAA,CACA,qDAAA,CAFA,YAAA,CAHA,eAAA,CACA,KAAA,CACA,SlB+kCV,CkBzkCU,0FACE,mBlB2kCZ,CkBtkCQ,0EACE,QlBwkCV,CkBnkCM,8DACE,kBlBqkCR,CkBtkCM,8DACE,mBlBqkCR,CkBjkCM,kDACE,uClBmkCR,CkB7jCI,2CACE,sBAAA,CAEA,SAAA,CADA,kBlBgkCN,CkBvjCI,mFACE,elByjCN,CkBtjCM,iGACE,SlBwjCR,CkBnjCI,qFAIE,mDlBsjCN,CkB1jCI,qFAIE,oDlBsjCN,CkB1jCI,2EACE,aAAA,CACA,oBAAA,CAGA,SAAA,CAFA,kBlBujCN,CkBljCM,yFAEE,gBAAA,CADA,gBlBqjCR,CkBhjCM,0FACE,YlBkjCR,CACF,CmB3wDA,eAKE,eAAA,CACA,eAAA,CAJA,SnBkxDF,CmB3wDE,gCANA,kBAAA,CAFA,YAAA,CAGA,sBnByxDF,CmBpxDE,iBAOE,mBAAA,CAFA,aAAA,CADA,gBAAA,CAEA,iBnB8wDJ,CmBzwDE,wBAEE,qDAAA,CADA,uCnB4wDJ,CmBvwDE,qBACE,6CnBywDJ,CmBpwDI,sDAEE,uDAAA,CADA,+BnBuwDN,CmBnwDM,8DACE,+BnBqwDR,CmBhwDI,mCACE,uCAAA,CACA,oBnBkwDN,CmB9vDI,yBAKE,iBAAA,CADA,yCAAA,CAHA,aAAA,CAEA,eAAA,CADA,YnBmwDN,CoBnzDE,eAGE,+DAAA,CADA,oBAAA,CADA,qBpBwzDJ,CKnoDI,0CetLF,eAOI,YpBszDJ,CACF,CoBhzDM,6BACE,oBpBkzDR,CoB5yDE,kBACE,YAAA,CACA,qBAAA,CACA,SAAA,CACA,qBpB8yDJ,CoBvyDI,0BACE,sBpByyDN,CoBtyDM,gEACE,+BpBwyDR,CoBlyDE,gBAEE,uCAAA,CADA,epBqyDJ,CoBhyDE,kBACE,oBpBkyDJ,CoB/xDI,mCAGE,kBAAA,CAFA,YAAA,CACA,SAAA,CAEA,iBpBiyDN,CoB7xDI,oCAIE,kBAAA,CAHA,mBAAA,CACA,kBAAA,CACA,SAAA,CAGA,QAAA,CADA,iBpBgyDN,CoB3xDI,0DACE,kBpB6xDN,CoB9xDI,0DACE,iBpB6xDN,CoBzxDI,iDACE,uBAAA,CAEA,YpB0xDN,CoBrxDE,4BACE,YpBuxDJ,CoBhxDA,YAGE,kBAAA,CAFA,YAAA,CAIA,eAAA,CAHA,SAAA,CAIA,eAAA,CAFA,UpBqxDF,CoBhxDE,yBACE,WpBkxDJ,CoB3wDA,kBACE,YpB8wDF,CKtsDI,0CezEJ,kBAKI,wBpB8wDF,CACF,CoB3wDE,qCACE,WpB6wDJ,CKjuDI,sCe7CF,+CAKI,kBpB6wDJ,CoBlxDA,+CAKI,mBpB6wDJ,CACF,CKntDI,0CerDJ,6BAMI,SAAA,CAFA,eAAA,CACA,UpB0wDF,CoBvwDE,gDACE,SpBywDJ,CoBtwDE,4CACE,iBAAA,CAAA,kBpBwwDJ,CoBrwDE,2CAEE,WAAA,CADA,cpBwwDJ,CoBpwDE,2CACE,mBAAA,CACA,cAAA,CACA,SAAA,CACA,oBAAA,CAAA,iBpBswDJ,CoBnwDE,2CACE,SpBqwDJ,CoBlwDE,qCACE,epBowDJ,CACF,CqB16DA,MACE,qBAAA,CACA,yBrB66DF,CqBv6DA,aAME,qCAAA,CADA,cAAA,CAEA,0FACE,CAPF,cAAA,CACA,KAAA,CAaA,mDAAA,CACA,qBAAA,CAJA,wFACE,CATF,UAAA,CADA,SrBi7DF,CsB57DA,MACE,igBtB+7DF,CsBz7DA,WACE,iBtB47DF,CK9xDI,mCiB/JJ,WAKI,etB47DF,CACF,CsBz7DE,kBACE,YtB27DJ,CsBv7DE,oBAEE,SAAA,CADA,StB07DJ,CKvxDI,0CiBpKF,8BAkBI,YtBu7DJ,CsBz8DA,8BAkBI,atBu7DJ,CsBz8DA,oBAYI,2CAAA,CACA,kBAAA,CAJA,WAAA,CACA,eAAA,CACA,mBAAA,CALA,iBAAA,CACA,SAAA,CAUA,uBAAA,CAHA,4CACE,CAPF,UtBi8DJ,CsBp7DI,+DACE,SAAA,CACA,oCtBs7DN,CACF,CK7zDI,mCiBjJF,8BAyCI,MtBg7DJ,CsBz9DA,8BAyCI,OtBg7DJ,CsBz9DA,oBAoCI,0BAAA,CADA,cAAA,CADA,QAAA,CAHA,cAAA,CACA,KAAA,CAKA,sDACE,CALF,OtBw7DJ,CsB76DI,+DAME,YAAA,CACA,SAAA,CACA,4CACE,CARF,UtBk7DN,CACF,CK5zDI,0CiBxGA,+DAII,mBtBo6DN,CACF,CK12DM,+DiB/DF,+DASI,mBtBo6DN,CACF,CK/2DM,+DiB/DF,+DAcI,mBtBo6DN,CACF,CsB/5DE,kBAEE,kCAAA,CAAA,0BtBg6DJ,CK90DI,0CiBpFF,4BAmBI,MtB45DJ,CsB/6DA,4BAmBI,OtB45DJ,CsB/6DA,kBAUI,QAAA,CAEA,SAAA,CADA,eAAA,CALA,cAAA,CACA,KAAA,CAWA,wBAAA,CALA,qGACE,CALF,OAAA,CADA,StBu6DJ,CsBz5DI,4BACE,yBtB25DN,CsBv5DI,6DAEE,WAAA,CACA,SAAA,CAMA,uBAAA,CALA,sGACE,CAJF,UtB65DN,CACF,CKz3DI,mCiBjEF,4BA2CI,WtBu5DJ,CsBl8DA,4BA2CI,UtBu5DJ,CsBl8DA,kBA6CI,eAAA,CAHA,iBAAA,CAIA,8CAAA,CAFA,atBs5DJ,CACF,CKx5DM,+DiBOF,6DAII,atBi5DN,CACF,CKv4DI,sCiBfA,6DASI,atBi5DN,CACF,CsB54DE,iBAIE,2CAAA,CACA,0BAAA,CAFA,aAAA,CAFA,iBAAA,CAKA,2CACE,CALF,StBk5DJ,CKp5DI,mCiBAF,iBAaI,0BAAA,CACA,mBAAA,CAFA,atB84DJ,CsBz4DI,uBACE,0BtB24DN,CACF,CsBv4DI,4DAEE,2CAAA,CACA,6BAAA,CACA,8BAAA,CAHA,gCtB44DN,CsBp4DE,4BAKE,mBAAA,CAAA,oBtBy4DJ,CsB94DE,4BAKE,mBAAA,CAAA,oBtBy4DJ,CsB94DE,kBAQE,gBAAA,CAFA,eAAA,CAFA,WAAA,CAHA,iBAAA,CAMA,sBAAA,CAJA,UAAA,CADA,StB44DJ,CsBn4DI,+BACE,qBtBq4DN,CsBj4DI,kEAEE,uCtBk4DN,CsB93DI,6BACE,YtBg4DN,CKp6DI,0CiBaF,kBA8BI,eAAA,CADA,aAAA,CADA,UtBi4DJ,CACF,CK97DI,mCiBgCF,4BAmCI,mBtBi4DJ,CsBp6DA,4BAmCI,oBtBi4DJ,CsBp6DA,kBAqCI,aAAA,CADA,etBg4DJ,CsB53DI,+BACE,uCtB83DN,CsB13DI,mCACE,gCtB43DN,CsBx3DI,6DACE,kBtB03DN,CsBv3DM,8EACE,uCtBy3DR,CsBr3DM,0EACE,WtBu3DR,CACF,CsBj3DE,iBAIE,cAAA,CAHA,oBAAA,CAEA,aAAA,CAEA,kCACE,CAJF,YtBs3DJ,CsB92DI,uBACE,UtBg3DN,CsB52DI,yCAGE,UtB+2DN,CsBl3DI,yCAGE,WtB+2DN,CsBl3DI,+BACE,iBAAA,CACA,SAAA,CAEA,StB82DN,CsB32DM,6CACE,oBtB62DR,CKp9DI,0CiB+FA,yCAcI,UtB42DN,CsB13DE,yCAcI,WtB42DN,CsB13DE,+BAaI,StB62DN,CsBz2DM,+CACE,YtB22DR,CACF,CKh/DI,mCiBkHA,+BAwBI,mBtB02DN,CsBv2DM,8CACE,YtBy2DR,CACF,CsBn2DE,8BAGE,WtBu2DJ,CsB12DE,8BAGE,UtBu2DJ,CsB12DE,oBAKE,mBAAA,CAJA,iBAAA,CACA,SAAA,CAEA,StBs2DJ,CK5+DI,0CiBkIF,8BAUI,WtBq2DJ,CsB/2DA,8BAUI,UtBq2DJ,CsB/2DA,oBASI,StBs2DJ,CACF,CsBl2DI,uCACE,iBtBw2DN,CsBz2DI,uCACE,kBtBw2DN,CsBz2DI,6BAEE,uCAAA,CACA,SAAA,CAIA,oBAAA,CAHA,+DtBq2DN,CsB/1DM,iDAEE,uCAAA,CADA,YtBk2DR,CsB71DM,gGAGE,SAAA,CADA,mBAAA,CAEA,kBtB81DR,CsB31DQ,sGACE,UtB61DV,CsBt1DE,8BAOE,mBAAA,CAAA,oBtB61DJ,CsBp2DE,8BAOE,mBAAA,CAAA,oBtB61DJ,CsBp2DE,oBAIE,kBAAA,CAKA,yCAAA,CANA,YAAA,CAKA,eAAA,CAFA,WAAA,CAKA,SAAA,CAVA,iBAAA,CACA,KAAA,CAUA,uBAAA,CAFA,kBAAA,CALA,UtB+1DJ,CKtiEI,mCiBkMF,8BAgBI,mBtBy1DJ,CsBz2DA,8BAgBI,oBtBy1DJ,CsBz2DA,oBAiBI,etBw1DJ,CACF,CsBr1DI,+DACE,SAAA,CACA,0BtBu1DN,CsBl1DE,6BAKE,+BtBq1DJ,CsB11DE,0DAME,gCtBo1DJ,CsB11DE,6BAME,+BtBo1DJ,CsB11DE,mBAIE,eAAA,CAHA,iBAAA,CAEA,UAAA,CADA,StBw1DJ,CKriEI,0CiB2MF,mBAWI,QAAA,CADA,UtBq1DJ,CACF,CK9jEI,mCiB8NF,mBAiBI,SAAA,CADA,UAAA,CAEA,sBtBo1DJ,CsBj1DI,8DACE,8BAAA,CACA,StBm1DN,CACF,CsB90DE,uBASE,kCAAA,CAAA,0BAAA,CAFA,2CAAA,CANA,WAAA,CACA,eAAA,CAIA,kBtB+0DJ,CsBz0DI,iEAZF,uBAaI,uBtB40DJ,CACF,CK3mEM,+DiBiRJ,uBAkBI,atB40DJ,CACF,CK1lEI,sCiB2PF,uBAuBI,atB40DJ,CACF,CK/lEI,mCiB2PF,uBA4BI,YAAA,CAEA,yDAAA,CADA,oBtB60DJ,CsBz0DI,kEACE,etB20DN,CsBv0DI,6BACE,+CtBy0DN,CsBr0DI,0CAEE,YAAA,CADA,WtBw0DN,CsBn0DI,gDACE,oDtBq0DN,CsBl0DM,sDACE,0CtBo0DR,CACF,CsB7zDA,kBACE,gCAAA,CACA,qBtBg0DF,CsB7zDE,wBAKE,qDAAA,CADA,uCAAA,CAFA,gBAAA,CACA,kBAAA,CAFA,eAAA,CAKA,uBtB+zDJ,CKnoEI,mCiB8TF,kCAUI,mBtB+zDJ,CsBz0DA,kCAUI,oBtB+zDJ,CACF,CsB3zDE,wBAGE,eAAA,CADA,QAAA,CADA,SAAA,CAIA,wBAAA,CAAA,gBtB4zDJ,CsBxzDE,wBACE,yDtB0zDJ,CsBvzDI,oCACE,etByzDN,CsBpzDE,wBACE,aAAA,CACA,YAAA,CAEA,uBAAA,CADA,gCtBuzDJ,CsBnzDI,4DACE,uDtBqzDN,CsBjzDI,gDACE,mBtBmzDN,CsB9yDE,gCAKE,cAAA,CADA,aAAA,CAEA,YAAA,CALA,eAAA,CAMA,uBAAA,CALA,KAAA,CACA,StBozDJ,CsB7yDI,wCACE,YtB+yDN,CsB1yDI,wDACE,YtB4yDN,CsBxyDI,oCAGE,+BAAA,CADA,gBAAA,CADA,mBAAA,CAGA,2CtB0yDN,CKrrEI,mCiBuYA,8CAUI,mBtBwyDN,CsBlzDE,8CAUI,oBtBwyDN,CACF,CsBpyDI,oFAEE,uDAAA,CADA,+BtBuyDN,CsBjyDE,sCACE,2CtBmyDJ,CsB9xDE,2BAGE,eAAA,CADA,eAAA,CADA,iBtBkyDJ,CKtsEI,mCiBmaF,qCAOI,mBtBgyDJ,CsBvyDA,qCAOI,oBtBgyDJ,CACF,CsB5xDE,kCAEE,MtBkyDJ,CsBpyDE,kCAEE,OtBkyDJ,CsBpyDE,wBAME,uCAAA,CAFA,aAAA,CACA,YAAA,CAJA,iBAAA,CAEA,YtBiyDJ,CKhsEI,0CiB4ZF,wBAUI,YtB8xDJ,CACF,CsB3xDI,8BAKE,6BAAA,CADA,UAAA,CAHA,oBAAA,CAEA,WAAA,CAGA,+CAAA,CAAA,uCAAA,CACA,4BAAA,CAAA,oBAAA,CACA,6BAAA,CAAA,qBAAA,CACA,yBAAA,CAAA,iBAAA,CAPA,UtBoyDN,CsB1xDM,wCACE,oBtB4xDR,CsBtxDE,8BAGE,uCAAA,CAFA,gBAAA,CACA,etByxDJ,CsBrxDI,iCAKE,gCAAA,CAHA,eAAA,CACA,eAAA,CACA,eAAA,CAHA,etB2xDN,CsBpxDM,sCACE,oBtBsxDR,CsBjxDI,iCAKE,gCAAA,CAHA,gBAAA,CACA,eAAA,CACA,eAAA,CAHA,atBuxDN,CsBhxDM,sCACE,oBtBkxDR,CsB5wDE,yBAKE,gCAAA,CAJA,aAAA,CAEA,gBAAA,CACA,iBAAA,CAFA,atBixDJ,CsB1wDE,uBAGE,wBAAA,CAFA,+BAAA,CACA,yBtB6wDJ,CuBj7EA,WACE,iBAAA,CACA,SvBo7EF,CuBj7EE,kBAOE,2CAAA,CACA,mBAAA,CACA,8BAAA,CAHA,gCAAA,CAHA,QAAA,CAEA,gBAAA,CADA,YAAA,CAMA,SAAA,CATA,iBAAA,CACA,sBAAA,CAaA,mCAAA,CAJA,oEvBo7EJ,CuB76EI,6EACE,gBAAA,CACA,SAAA,CAKA,+BAAA,CAJA,8EvBg7EN,CuBx6EI,wBAWE,+BAAA,CAAA,8CAAA,CAFA,6BAAA,CAAA,8BAAA,CACA,YAAA,CAFA,UAAA,CAHA,QAAA,CAFA,QAAA,CAIA,kBAAA,CADA,iBAAA,CALA,iBAAA,CACA,KAAA,CAEA,OvBi7EN,CuBr6EE,iBAOE,mBAAA,CAFA,eAAA,CACA,oBAAA,CAHA,QAAA,CAFA,kBAAA,CAGA,aAAA,CAFA,SvB46EJ,CuBn6EE,iBACE,kBvBq6EJ,CuBj6EE,2BAGE,kBAAA,CAAA,oBvBu6EJ,CuB16EE,2BAGE,mBAAA,CAAA,mBvBu6EJ,CuB16EE,iBAIE,cAAA,CAHA,aAAA,CAIA,YAAA,CAIA,uBAAA,CAHA,2CACE,CALF,UvBw6EJ,CuB95EI,8CACE,+BvBg6EN,CuB55EI,uBACE,qDvB85EN,CwBl/EA,YAIE,qBAAA,CADA,aAAA,CAGA,gBAAA,CALA,eAAA,CACA,UAAA,CAGA,axBs/EF,CwBl/EE,aATF,YAUI,YxBq/EF,CACF,CKv0EI,0CmB3KF,+BAeI,axBg/EJ,CwB//EA,+BAeI,cxBg/EJ,CwB//EA,qBAUI,2CAAA,CAHA,aAAA,CAEA,WAAA,CALA,cAAA,CACA,KAAA,CASA,uBAAA,CAHA,iEACE,CAJF,aAAA,CAFA,SxBy/EJ,CwB7+EI,mEACE,8BAAA,CACA,6BxB++EN,CwB5+EM,6EACE,8BxB8+ER,CwBz+EI,6CAEE,QAAA,CAAA,MAAA,CACA,QAAA,CAEA,eAAA,CAJA,iBAAA,CACA,OAAA,CAEA,qBAAA,CAFA,KxB8+EN,CACF,CKt3EI,sCmBtKJ,YAuDI,QxBy+EF,CwBt+EE,mBACE,WxBw+EJ,CwBp+EE,6CACE,UxBs+EJ,CACF,CwBl+EE,uBACE,YAAA,CACA,OxBo+EJ,CKr4EI,mCmBjGF,uBAMI,QxBo+EJ,CwBj+EI,8BACE,WxBm+EN,CwB/9EI,qCACE,axBi+EN,CwB79EI,+CACE,kBxB+9EN,CACF,CwB19EE,wBAUE,uBAAA,CANA,kCAAA,CAAA,0BAAA,CAHA,cAAA,CACA,eAAA,CASA,yDAAA,CAFA,oBxBy9EJ,CwBp9EI,2CAEE,YAAA,CADA,WxBu9EN,CwBl9EI,mEACE,+CxBo9EN,CwBj9EM,qHACE,oDxBm9ER,CwBh9EQ,iIACE,0CxBk9EV,CwBn8EE,wCAGE,wBACE,qBxBm8EJ,CwB/7EE,6BACE,kCxBi8EJ,CwBl8EE,6BACE,iCxBi8EJ,CACF,CK75EI,0CmB5BF,YAME,0BAAA,CADA,QAAA,CAEA,SAAA,CANA,cAAA,CACA,KAAA,CAMA,sDACE,CALF,OAAA,CADA,SxBk8EF,CwBv7EE,4CAEE,WAAA,CACA,SAAA,CACA,4CACE,CAJF,UxB47EJ,CACF,CyBzmFA,iBACE,GACE,QzB2mFF,CyBxmFA,GACE,azB0mFF,CACF,CyBtmFA,gBACE,GACE,SAAA,CACA,0BzBwmFF,CyBrmFA,IACE,SzBumFF,CyBpmFA,GACE,SAAA,CACA,uBzBsmFF,CACF,CyB9lFA,MACE,+eAAA,CACA,ygBAAA,CACA,mmBAAA,CACA,sfzBgmFF,CyB1lFA,WAOE,kCAAA,CAAA,0BAAA,CANA,aAAA,CACA,gBAAA,CACA,eAAA,CAEA,uCAAA,CAGA,uBAAA,CAJA,kBzBgmFF,CyBzlFE,iBACE,UzB2lFJ,CyBvlFE,iBACE,oBAAA,CAEA,aAAA,CACA,qBAAA,CAFA,UzB2lFJ,CyBtlFI,+BACE,iBzBylFN,CyB1lFI,+BACE,kBzBylFN,CyB1lFI,qBAEE,gBzBwlFN,CyBplFI,kDACE,iBzBulFN,CyBxlFI,kDACE,kBzBulFN,CyBxlFI,kDAEE,iBzBslFN,CyBxlFI,kDAEE,kBzBslFN,CyBjlFE,iCAGE,iBzBslFJ,CyBzlFE,iCAGE,kBzBslFJ,CyBzlFE,uBACE,oBAAA,CACA,6BAAA,CAEA,eAAA,CACA,sBAAA,CACA,qBzBmlFJ,CyB/kFE,kBACE,YAAA,CAMA,gBAAA,CALA,SAAA,CAMA,oBAAA,CAHA,gBAAA,CAIA,WAAA,CAHA,eAAA,CAFA,SAAA,CADA,UzBulFJ,CyB9kFI,iDACE,4BzBglFN,CyB3kFE,iBACE,eAAA,CACA,sBzB6kFJ,CyB1kFI,gDACE,2BzB4kFN,CyBxkFI,kCAIE,kBzBglFN,CyBplFI,kCAIE,iBzBglFN,CyBplFI,wBAOE,6BAAA,CADA,UAAA,CALA,oBAAA,CAEA,YAAA,CAKA,4BAAA,CAAA,oBAAA,CACA,6BAAA,CAAA,qBAAA,CACA,yBAAA,CAAA,iBAAA,CALA,uBAAA,CAHA,WzBklFN,CyBtkFI,iCACE,azBwkFN,CyBpkFI,iCACE,gDAAA,CAAA,wCzBskFN,CyBlkFI,+BACE,8CAAA,CAAA,sCzBokFN,CyBhkFI,+BACE,8CAAA,CAAA,sCzBkkFN,CyB9jFI,sCACE,qDAAA,CAAA,6CzBgkFN,C0BvtFA,MACE,mSAAA,CACA,oVAAA,CACA,mOAAA,CACA,qZ1B0tFF,C0BjtFE,iBAME,kDAAA,CADA,UAAA,CAJA,oBAAA,CAEA,cAAA,CAIA,mCAAA,CAAA,2BAAA,CACA,4BAAA,CAAA,oBAAA,CACA,6BAAA,CAAA,qBAAA,CACA,yBAAA,CAAA,iBAAA,CANA,0BAAA,CAFA,a1B4tFJ,C0BhtFE,uBACE,6B1BktFJ,C0B9sFE,sBACE,wCAAA,CAAA,gC1BgtFJ,C0B5sFE,6BACE,+CAAA,CAAA,uC1B8sFJ,C0B1sFE,4BACE,8CAAA,CAAA,sC1B4sFJ,C2BvvFA,SASE,2CAAA,CADA,gCAAA,CAJA,aAAA,CAGA,eAAA,CADA,aAAA,CADA,UAAA,CAFA,S3B8vFF,C2BrvFE,aAZF,SAaI,Y3BwvFF,CACF,CK7kFI,0CsBzLJ,SAkBI,Y3BwvFF,CACF,C2BrvFE,iBACE,mB3BuvFJ,C2BnvFE,yBAIE,iB3B0vFJ,C2B9vFE,yBAIE,kB3B0vFJ,C2B9vFE,eAQE,eAAA,CAPA,YAAA,CAMA,eAAA,CAJA,QAAA,CAEA,aAAA,CAHA,SAAA,CAWA,oBAAA,CAPA,kB3BwvFJ,C2B9uFI,kCACE,Y3BgvFN,C2B3uFE,eACE,aAAA,CACA,kBAAA,CAAA,mB3B6uFJ,C2B1uFI,sCACE,aAAA,CACA,S3B4uFN,C2BtuFE,eAOE,kCAAA,CAAA,0BAAA,CANA,YAAA,CAEA,eAAA,CADA,gBAAA,CAMA,UAAA,CAJA,uCAAA,CACA,oBAAA,CAIA,8D3BuuFJ,C2BluFI,0CACE,aAAA,CACA,S3BouFN,C2BhuFI,6BAEE,kB3BmuFN,C2BruFI,6BAEE,iB3BmuFN,C2BruFI,mBAGE,iBAAA,CAFA,Y3BouFN,C2B7tFM,2CACE,qB3B+tFR,C2BhuFM,2CACE,qB3BkuFR,C2BnuFM,2CACE,qB3BquFR,C2BtuFM,2CACE,qB3BwuFR,C2BzuFM,2CACE,oB3B2uFR,C2B5uFM,2CACE,qB3B8uFR,C2B/uFM,2CACE,qB3BivFR,C2BlvFM,2CACE,qB3BovFR,C2BrvFM,4CACE,qB3BuvFR,C2BxvFM,4CACE,oB3B0vFR,C2B3vFM,4CACE,qB3B6vFR,C2B9vFM,4CACE,qB3BgwFR,C2BjwFM,4CACE,qB3BmwFR,C2BpwFM,4CACE,qB3BswFR,C2BvwFM,4CACE,oB3BywFR,C2BnwFI,gCACE,SAAA,CAIA,yBAAA,CAHA,wC3BswFN,C4Bz2FA,MACE,wS5B42FF,C4Bn2FE,mCACE,mBAAA,CACA,cAAA,CACA,QAAA,CAEA,mBAAA,CADA,kB5Bu2FJ,C4Bl2FE,oBAGE,kBAAA,CAOA,+CAAA,CACA,oBAAA,CAVA,mBAAA,CAIA,gBAAA,CACA,0BAAA,CACA,eAAA,CALA,QAAA,CAOA,qBAAA,CADA,eAAA,CAJA,wB5B22FJ,C4Bj2FI,0BAGE,uCAAA,CAFA,aAAA,CACA,YAAA,CAEA,6C5Bm2FN,C4B91FM,gEAEE,0CAAA,CADA,+B5Bi2FR,C4B31FI,yBACE,uB5B61FN,C4Br1FI,gCAME,oDAAA,CADA,UAAA,CAJA,oBAAA,CAEA,YAAA,CAKA,qCAAA,CAAA,6BAAA,CACA,4BAAA,CAAA,oBAAA,CACA,6BAAA,CAAA,qBAAA,CACA,yBAAA,CAAA,iBAAA,CAJA,iCAAA,CAHA,0BAAA,CAFA,W5Bg2FN,C4Bn1FI,wFACE,0C5Bq1FN,C6B/5FA,iBACE,GACE,oB7Bk6FF,C6B/5FA,IACE,kB7Bi6FF,C6B95FA,GACE,oB7Bg6FF,CACF,C6Bx5FA,MACE,0NAAA,CACA,uPAAA,CACA,wB7B05FF,C6Bp5FA,YA6BE,kCAAA,CAAA,0BAAA,CAVA,2CAAA,CACA,mBAAA,CACA,8BAAA,CAHA,gCAAA,CADA,sCAAA,CAdA,+IACE,CAYF,8BAAA,CAMA,SAAA,CArBA,iBAAA,CACA,uBAAA,CAyBA,4BAAA,CAJA,uDACE,CATF,6BAAA,CADA,S7Bw5FF,C6Bt4FE,oBAEE,SAAA,CAKA,uBAAA,CAJA,2EACE,CAHF,S7B24FJ,C6Bj4FE,8CACE,sC7Bm4FJ,C6B/3FE,mBAEE,gBAAA,CADA,a7Bk4FJ,C6B93FI,2CACE,Y7Bg4FN,C6B53FI,0CACE,e7B83FN,C6Bt3FA,eACE,eAAA,CAGA,YAAA,CADA,0BAAA,CADA,kB7B23FF,C6Bt3FE,yBACE,a7Bw3FJ,C6Bp3FE,oBACE,sCAAA,CACA,iB7Bs3FJ,C6Bl3FE,6BACE,oBAAA,CAGA,gB7Bk3FJ,C6B92FE,sBAoBE,mBAAA,CAdA,cAAA,CAHA,oBAAA,CACA,gBAAA,CAAA,iBAAA,CAIA,YAAA,CAWA,eAAA,CAlBA,iBAAA,CAMA,wBAAA,CAAA,gBAAA,CAFA,uBAAA,CAHA,S7Bw3FJ,C6B92FI,qCACE,uB7Bg3FN,C6Bt2FI,cAvBF,sBAwBI,W7By2FJ,C6Bt2FI,wCACE,2B7Bw2FN,C6Bp2FI,6BAOE,qCAAA,CACA,+CAAA,CAAA,uC7By2FN,C6B/1FI,yDAZE,UAAA,CADA,YAAA,CAIA,4BAAA,CAAA,oBAAA,CACA,6BAAA,CAAA,qBAAA,CACA,yBAAA,CAAA,iBAAA,CAVA,iBAAA,CACA,SAAA,CAEA,WAAA,CADA,U7B63FN,C6B92FI,4BAOE,oDAAA,CAMA,4CAAA,CAAA,oCAAA,CADA,uBAAA,CAJA,+C7Bs2FN,C6B31FM,gDACE,uB7B61FR,C6Bz1FM,mFACE,0C7B21FR,CACF,C6Bt1FI,0CAGE,2BAAA,CADA,uBAAA,CADA,S7B01FN,C6Bp1FI,8CACE,oB7Bs1FN,C6Bn1FM,aAJF,8CASI,8CAAA,CACA,iBAAA,CAHA,gCAAA,CADA,eAAA,CADA,cAAA,CAGA,kB7Bw1FN,C6Bn1FM,oDACE,mC7Bq1FR,CACF,C6Bz0FE,gCAEE,iBAAA,CADA,e7B60FJ,C6Bz0FI,mCACE,iB7B20FN,C6Bx0FM,oDAGE,a7Bs1FR,C6Bz1FM,oDAGE,c7Bs1FR,C6Bz1FM,0CAcE,8CAAA,CACA,iBAAA,CALA,gCAAA,CAEA,oBAAA,CACA,qBAAA,CANA,iBAAA,CACA,eAAA,CAHA,UAAA,CAIA,gBAAA,CALA,aAAA,CAEA,cAAA,CALA,iBAAA,CAUA,iBAAA,CATA,S7Bu1FR,C8B9kGA,kBAME,e9B0lGF,C8BhmGA,kBAME,gB9B0lGF,C8BhmGA,QAUE,2CAAA,CACA,oBAAA,CAEA,8BAAA,CALA,uCAAA,CACA,cAAA,CALA,aAAA,CAGA,eAAA,CAKA,YAAA,CAPA,mBAAA,CAJA,cAAA,CACA,UAAA,CAiBA,yBAAA,CALA,mGACE,CAZF,S9B6lGF,C8B1kGE,aAtBF,QAuBI,Y9B6kGF,CACF,C8B1kGE,kBACE,wB9B4kGJ,C8BxkGE,gBAEE,SAAA,CADA,mBAAA,CAGA,+BAAA,CADA,uB9B2kGJ,C8BvkGI,0BACE,8B9BykGN,C8BpkGE,4BAEE,0CAAA,CADA,+B9BukGJ,C8BlkGE,YACE,oBAAA,CACA,oB9BokGJ,C+BznGA,oBACE,GACE,mB/B4nGF,CACF,C+BpnGA,MACE,wf/BsnGF,C+BhnGA,YACE,aAAA,CAEA,eAAA,CADA,a/BonGF,C+BhnGE,+BAOE,kBAAA,CAAA,kB/BinGJ,C+BxnGE,+BAOE,iBAAA,CAAA,mB/BinGJ,C+BxnGE,qBAQE,aAAA,CACA,cAAA,CACA,YAAA,CATA,iBAAA,CAKA,U/BknGJ,C+B3mGI,qCAIE,iB/BmnGN,C+BvnGI,qCAIE,kB/BmnGN,C+BvnGI,2BAME,6BAAA,CADA,UAAA,CAJA,oBAAA,CAEA,YAAA,CAIA,yCAAA,CAAA,iCAAA,CACA,4BAAA,CAAA,oBAAA,CACA,6BAAA,CAAA,qBAAA,CACA,yBAAA,CAAA,iBAAA,CARA,W/BqnGN,C+BxmGE,kBAUE,2CAAA,CACA,mBAAA,CACA,8BAAA,CAJA,gCAAA,CACA,oBAAA,CAHA,kBAAA,CAFA,YAAA,CASA,SAAA,CANA,aAAA,CAFA,SAAA,CAJA,iBAAA,CAgBA,4BAAA,CAfA,UAAA,CAYA,+CACE,CAZF,S/BsnGJ,C+BrmGI,+EACE,gBAAA,CACA,SAAA,CACA,sC/BumGN,C+BjmGI,qCAEE,oCACE,gC/BkmGN,C+B9lGI,2CACE,c/BgmGN,CACF,C+B3lGE,kBACE,kB/B6lGJ,C+BzlGE,4BAGE,kBAAA,CAAA,oB/BgmGJ,C+BnmGE,4BAGE,mBAAA,CAAA,mB/BgmGJ,C+BnmGE,kBAKE,cAAA,CAJA,aAAA,CAKA,YAAA,CAIA,uBAAA,CAHA,2CACE,CAJF,kBAAA,CAFA,U/BimGJ,C+BtlGI,gDACE,+B/BwlGN,C+BplGI,wBACE,qD/BslGN,CgCtrGA,MAEI,uWAAA,CAAA,8WAAA,CAAA,sPAAA,CAAA,8xBAAA,CAAA,0MAAA,CAAA,gbAAA,CAAA,gMAAA,CAAA,iQAAA,CAAA,0VAAA,CAAA,6aAAA,CAAA,8SAAA,CAAA,gMhC+sGJ,CgCnsGE,4CAME,8CAAA,CACA,4BAAA,CACA,mBAAA,CACA,8BAAA,CAJA,mCAAA,CAJA,iBAAA,CAGA,gBAAA,CADA,iBAAA,CADA,eAAA,CASA,uBAAA,CADA,2BhCusGJ,CgCnsGI,aAdF,4CAeI,ehCssGJ,CACF,CgCnsGI,sEACE,gChCqsGN,CgChsGI,gDACE,qBhCksGN,CgC9rGI,gIAEE,iBAAA,CADA,chCisGN,CgC5rGI,4FACE,iBhC8rGN,CgC1rGI,kFACE,ehC4rGN,CgCxrGI,0FACE,YhC0rGN,CgCtrGI,8EACE,mBhCwrGN,CgCnrGE,sEAGE,iBAAA,CAAA,mBhC6rGJ,CgChsGE,sEAGE,kBAAA,CAAA,kBhC6rGJ,CgChsGE,sEASE,uBhCurGJ,CgChsGE,sEASE,wBhCurGJ,CgChsGE,sEAUE,4BhCsrGJ,CgChsGE,4IAWE,6BhCqrGJ,CgChsGE,sEAWE,4BhCqrGJ,CgChsGE,kDAOE,0BAAA,CACA,WAAA,CAFA,eAAA,CADA,eAAA,CAHA,oBAAA,CAAA,iBAAA,CADA,iBhC+rGJ,CgClrGI,kFACE,ehCorGN,CgChrGI,oFAOE,UhCsrGN,CgC7rGI,oFAOE,WhCsrGN,CgC7rGI,gEAME,wBfkIU,CenIV,UAAA,CADA,WAAA,CAIA,kDAAA,CAAA,0CAAA,CACA,4BAAA,CAAA,oBAAA,CACA,6BAAA,CAAA,qBAAA,CACA,yBAAA,CAAA,iBAAA,CAVA,iBAAA,CACA,UAAA,CACA,UhC0rGN,CgC9qGI,4DACE,4DhCgrGN,CgClqGE,sDACE,oBhCqqGJ,CgClqGI,gFACE,gChCoqGN,CgC/pGE,8DACE,0BhCkqGJ,CgC/pGI,4EACE,wBAlBG,CAmBH,kDAAA,CAAA,0ChCiqGN,CgC7pGI,0EACE,ahC+pGN,CgCprGE,8DACE,oBhCurGJ,CgCprGI,wFACE,gChCsrGN,CgCjrGE,sEACE,0BhCorGJ,CgCjrGI,oFACE,wBAlBG,CAmBH,sDAAA,CAAA,8ChCmrGN,CgC/qGI,kFACE,ahCirGN,CgCtsGE,sDACE,oBhCysGJ,CgCtsGI,gFACE,gChCwsGN,CgCnsGE,8DACE,0BhCssGJ,CgCnsGI,4EACE,wBAlBG,CAmBH,kDAAA,CAAA,0ChCqsGN,CgCjsGI,0EACE,ahCmsGN,CgCxtGE,oDACE,oBhC2tGJ,CgCxtGI,8EACE,gChC0tGN,CgCrtGE,4DACE,0BhCwtGJ,CgCrtGI,0EACE,wBAlBG,CAmBH,iDAAA,CAAA,yChCutGN,CgCntGI,wEACE,ahCqtGN,CgC1uGE,4DACE,oBhC6uGJ,CgC1uGI,sFACE,gChC4uGN,CgCvuGE,oEACE,0BhC0uGJ,CgCvuGI,kFACE,wBAlBG,CAmBH,qDAAA,CAAA,6ChCyuGN,CgCruGI,gFACE,ahCuuGN,CgC5vGE,8DACE,oBhC+vGJ,CgC5vGI,wFACE,gChC8vGN,CgCzvGE,sEACE,0BhC4vGJ,CgCzvGI,oFACE,wBAlBG,CAmBH,sDAAA,CAAA,8ChC2vGN,CgCvvGI,kFACE,ahCyvGN,CgC9wGE,4DACE,oBhCixGJ,CgC9wGI,sFACE,gChCgxGN,CgC3wGE,oEACE,0BhC8wGJ,CgC3wGI,kFACE,wBAlBG,CAmBH,qDAAA,CAAA,6ChC6wGN,CgCzwGI,gFACE,ahC2wGN,CgChyGE,4DACE,oBhCmyGJ,CgChyGI,sFACE,gChCkyGN,CgC7xGE,oEACE,0BhCgyGJ,CgC7xGI,kFACE,wBAlBG,CAmBH,qDAAA,CAAA,6ChC+xGN,CgC3xGI,gFACE,ahC6xGN,CgClzGE,0DACE,oBhCqzGJ,CgClzGI,oFACE,gChCozGN,CgC/yGE,kEACE,0BhCkzGJ,CgC/yGI,gFACE,wBAlBG,CAmBH,oDAAA,CAAA,4ChCizGN,CgC7yGI,8EACE,ahC+yGN,CgCp0GE,oDACE,oBhCu0GJ,CgCp0GI,8EACE,gChCs0GN,CgCj0GE,4DACE,0BhCo0GJ,CgCj0GI,0EACE,wBAlBG,CAmBH,iDAAA,CAAA,yChCm0GN,CgC/zGI,wEACE,ahCi0GN,CgCt1GE,4DACE,oBhCy1GJ,CgCt1GI,sFACE,gChCw1GN,CgCn1GE,oEACE,0BhCs1GJ,CgCn1GI,kFACE,wBAlBG,CAmBH,qDAAA,CAAA,6ChCq1GN,CgCj1GI,gFACE,ahCm1GN,CgCx2GE,wDACE,oBhC22GJ,CgCx2GI,kFACE,gChC02GN,CgCr2GE,gEACE,0BhCw2GJ,CgCr2GI,8EACE,wBAlBG,CAmBH,mDAAA,CAAA,2ChCu2GN,CgCn2GI,4EACE,ahCq2GN,CiCzgHA,MACE,wMjC4gHF,CiCngHE,sBAEE,uCAAA,CADA,gBjCugHJ,CiCngHI,mCACE,ajCqgHN,CiCtgHI,mCACE,cjCqgHN,CiCjgHM,4BACE,sBjCmgHR,CiChgHQ,mCACE,gCjCkgHV,CiC9/GQ,2DACE,SAAA,CAEA,uBAAA,CADA,ejCigHV,CiC5/GQ,yGACE,SAAA,CACA,uBjC8/GV,CiC1/GQ,yCACE,YjC4/GV,CiCr/GE,0BACE,eAAA,CACA,ejCu/GJ,CiCp/GI,+BACE,oBjCs/GN,CiCj/GE,gDACE,YjCm/GJ,CiC/+GE,8BAIE,+BAAA,CAHA,oBAAA,CAEA,WAAA,CAGA,SAAA,CAKA,4BAAA,CAJA,4DACE,CAHF,0BjCm/GJ,CiC1+GI,aAdF,8BAeI,+BAAA,CACA,SAAA,CACA,uBjC6+GJ,CACF,CiC1+GI,wCACE,6BjC4+GN,CiCx+GI,oCACE,+BjC0+GN,CiCt+GI,qCAKE,6BAAA,CADA,UAAA,CAHA,oBAAA,CAEA,YAAA,CAGA,2CAAA,CAAA,mCAAA,CACA,4BAAA,CAAA,oBAAA,CACA,6BAAA,CAAA,qBAAA,CACA,yBAAA,CAAA,iBAAA,CAPA,WjC++GN,CiCl+GQ,mDACE,oBjCo+GV,CkCllHE,kCAEE,iBlCwlHJ,CkC1lHE,kCAEE,kBlCwlHJ,CkC1lHE,wBAGE,yCAAA,CAFA,oBAAA,CAGA,SAAA,CACA,mClCqlHJ,CkChlHI,aAVF,wBAWI,YlCmlHJ,CACF,CkC/kHE,6FAEE,SAAA,CACA,mClCilHJ,CkC3kHE,4FAEE,+BlC6kHJ,CkCzkHE,oBACE,yBAAA,CACA,uBAAA,CAGA,yElCykHJ,CK18GI,sC6BrHE,qDACE,uBlCkkHN,CACF,CkC7jHE,kEACE,yBlC+jHJ,CkC3jHE,sBACE,0BlC6jHJ,CmCxnHE,2BACE,anC2nHJ,CKt8GI,0C8BtLF,2BAKI,enC2nHJ,CACF,CmCxnHI,6BAGE,0BAAA,CAAA,2BAAA,CADA,eAAA,CAEA,iBAAA,CAHA,yBAAA,CAAA,iBnC6nHN,CmCvnHM,2CACE,kBnCynHR,CoC1oHE,uBACE,4CpC8oHJ,CoCzoHE,8CAJE,kCAAA,CAAA,0BpCipHJ,CoC7oHE,uBACE,4CpC4oHJ,CoCvoHE,4BAEE,kCAAA,CAAA,0BAAA,CADA,qCpC0oHJ,CoCtoHI,mCACE,apCwoHN,CoCpoHI,kCACE,apCsoHN,CoCjoHE,0BAKE,eAAA,CAJA,aAAA,CAEA,YAAA,CACA,aAAA,CAFA,kBAAA,CAAA,mBpCsoHJ,CoChoHI,uCACE,epCkoHN,CoC9nHI,sCACE,kBpCgoHN,CqC7qHA,MACE,8LrCgrHF,CqCvqHE,oBAGE,iBAAA,CAEA,gBAAA,CADA,arCyqHJ,CqCrqHI,wCACE,uBrCuqHN,CqCnqHI,gCAEE,eAAA,CADA,gBrCsqHN,CqC/pHM,wCACE,mBrCiqHR,CqC3pHE,8BAKE,oBrC8pHJ,CqCnqHE,8BAKE,mBrC8pHJ,CqCnqHE,8BAOE,4BrC4pHJ,CqCnqHE,4DAQE,6BrC2pHJ,CqCnqHE,8BAQE,4BrC2pHJ,CqCnqHE,oBAME,cAAA,CAHA,aAAA,CACA,erC+pHJ,CqCxpHI,kCACE,uCAAA,CACA,oBrC0pHN,CqCtpHI,wCAEE,uCAAA,CADA,YrCypHN,CqCppHI,oCASE,WrC0pHN,CqCnqHI,oCASE,UrC0pHN,CqCnqHI,0BAME,6BAAA,CADA,UAAA,CADA,WAAA,CAMA,yCAAA,CAAA,iCAAA,CACA,4BAAA,CAAA,oBAAA,CACA,6BAAA,CAAA,qBAAA,CACA,yBAAA,CAAA,iBAAA,CAZA,iBAAA,CACA,UAAA,CAMA,sBAAA,CADA,yBAAA,CAJA,UrCgqHN,CqCnpHM,oCACE,wBrCqpHR,CqChpHI,4BACE,YrCkpHN,CqC7oHI,4CACE,YrC+oHN,CsCtuHE,+DACE,mBAAA,CACA,cAAA,CACA,uBtCyuHJ,CsCtuHI,2EAGE,iBAAA,CADA,eAAA,CADA,atC0uHN,CuChvHE,6BACE,sCvCmvHJ,CuChvHE,cACE,yCvCkvHJ,CuCtuHE,sIACE,oCvCwuHJ,CuChuHE,2EACE,qCvCkuHJ,CuCxtHE,wGACE,oCvC0tHJ,CuCjtHE,yFACE,qCvCmtHJ,CuC9sHE,6BACE,kCvCgtHJ,CuC1sHE,6CACE,sCvC4sHJ,CuCrsHE,4DACE,sCvCusHJ,CuChsHE,4DACE,qCvCksHJ,CuCzrHE,yFACE,qCvC2rHJ,CuCnrHE,2EACE,sCvCqrHJ,CuC1qHE,wHACE,qCvC4qHJ,CuCvqHE,8BAGE,mBAAA,CADA,gBAAA,CADA,gBvC2qHJ,CuCtqHE,eACE,4CvCwqHJ,CuCrqHE,eACE,4CvCuqHJ,CuCnqHE,gBAIE,+CAAA,CACA,kDAAA,CAJA,aAAA,CAEA,wBAAA,CADA,wBvCwqHJ,CuCjqHE,yBAOE,wCAAA,CACA,+DAAA,CACA,4BAAA,CACA,6BAAA,CARA,iBAAA,CAGA,eAAA,CACA,eAAA,CAFA,cAAA,CADA,oCAAA,CAFA,iBvC4qHJ,CuChqHI,6BACE,YvCkqHN,CuC/pHM,kCACE,wBAAA,CACA,yBvCiqHR,CuC3pHE,iCAaE,wCAAA,CACA,+DAAA,CAJA,uCAAA,CACA,0BAAA,CALA,UAAA,CAJA,oBAAA,CAOA,2BAAA,CADA,2BAAA,CADA,2BAAA,CANA,eAAA,CAWA,wBAAA,CAAA,gBAAA,CAPA,SvCoqHJ,CuClpHE,sBACE,iBAAA,CACA,iBvCopHJ,CuC5oHI,sCACE,gBvC8oHN,CuC1oHI,gDACE,YvC4oHN,CuCloHA,gBACE,iBvCqoHF,CuCjoHE,yCACE,aAAA,CACA,SvCmoHJ,CuC9nHE,mBACE,YvCgoHJ,CuC3nHE,oBACE,QvC6nHJ,CuCznHE,4BACE,WAAA,CACA,SAAA,CACA,evC2nHJ,CuCxnHI,0CACE,YvC0nHN,CuCpnHE,yBAKE,wCAAA,CAEA,+BAAA,CADA,4BAAA,CAHA,eAAA,CADA,oDAAA,CAEA,wBAAA,CAAA,gBvCynHJ,CuClnHE,2BAEE,+DAAA,CADA,2BvCqnHJ,CuCjnHI,+BACE,uCAAA,CACA,gBvCmnHN,CuC9mHE,sBACE,MAAA,CACA,WvCgnHJ,CuC3mHA,aACE,avC8mHF,CuCpmHE,4BAEE,aAAA,CADA,YvCwmHJ,CuCpmHI,wDAEE,2BAAA,CADA,wBvCumHN,CuCjmHE,+BAKE,2CAAA,CAEA,+BAAA,CADA,gCAAA,CADA,sBAAA,CAHA,mBAAA,CACA,gBAAA,CAFA,avCymHJ,CuChmHI,qCAEE,UAAA,CACA,UAAA,CAFA,avComHN,CKtuHI,0CkCiJF,8BACE,iBvCylHF,CuC/kHE,wSAGE,evCqlHJ,CuCjlHE,sCAEE,mBAAA,CACA,eAAA,CADA,oBAAA,CADA,kBAAA,CAAA,mBvCqlHJ,CACF,CwC76HI,yDAIE,+BAAA,CACA,8BAAA,CAFA,aAAA,CADA,QAAA,CADA,iBxCm7HN,CwC36HI,uBAEE,uCAAA,CADA,cxC86HN,CwCz3HM,iHAEE,WAlDkB,CAiDlB,kBxCo4HR,CwCr4HM,6HAEE,WAlDkB,CAiDlB,kBxCg5HR,CwCj5HM,6HAEE,WAlDkB,CAiDlB,kBxC45HR,CwC75HM,oHAEE,WAlDkB,CAiDlB,kBxCw6HR,CwCz6HM,0HAEE,WAlDkB,CAiDlB,kBxCo7HR,CwCr7HM,uHAEE,WAlDkB,CAiDlB,kBxCg8HR,CwCj8HM,uHAEE,WAlDkB,CAiDlB,kBxC48HR,CwC78HM,6HAEE,WAlDkB,CAiDlB,kBxCw9HR,CwCz9HM,yCAEE,WAlDkB,CAiDlB,kBxC49HR,CwC79HM,yCAEE,WAlDkB,CAiDlB,kBxCg+HR,CwCj+HM,0CAEE,WAlDkB,CAiDlB,kBxCo+HR,CwCr+HM,uCAEE,WAlDkB,CAiDlB,kBxCw+HR,CwCz+HM,wCAEE,WAlDkB,CAiDlB,kBxC4+HR,CwC7+HM,sCAEE,WAlDkB,CAiDlB,kBxCg/HR,CwCj/HM,wCAEE,WAlDkB,CAiDlB,kBxCo/HR,CwCr/HM,oCAEE,WAlDkB,CAiDlB,kBxCw/HR,CwCz/HM,2CAEE,WAlDkB,CAiDlB,kBxC4/HR,CwC7/HM,qCAEE,WAlDkB,CAiDlB,kBxCggIR,CwCjgIM,oCAEE,WAlDkB,CAiDlB,kBxCogIR,CwCrgIM,kCAEE,WAlDkB,CAiDlB,kBxCwgIR,CwCzgIM,qCAEE,WAlDkB,CAiDlB,kBxC4gIR,CwC7gIM,mCAEE,WAlDkB,CAiDlB,kBxCghIR,CwCjhIM,qCAEE,WAlDkB,CAiDlB,kBxCohIR,CwCrhIM,wCAEE,WAlDkB,CAiDlB,kBxCwhIR,CwCzhIM,sCAEE,WAlDkB,CAiDlB,kBxC4hIR,CwC7hIM,2CAEE,WAlDkB,CAiDlB,kBxCgiIR,CwCrhIM,iCAEE,WAPkB,CAMlB,iBxCwhIR,CwCzhIM,uCAEE,WAPkB,CAMlB,iBxC4hIR,CwC7hIM,mCAEE,WAPkB,CAMlB,iBxCgiIR,CyClnIA,MACE,qMAAA,CACA,mMzCqnIF,CyC5mIE,wBAKE,mBAAA,CAHA,YAAA,CACA,qBAAA,CACA,YAAA,CAHA,iBzCmnIJ,CyCzmII,8BAGE,QAAA,CACA,SAAA,CAHA,iBAAA,CACA,OzC6mIN,CyCxmIM,qCACE,0BzC0mIR,CyC7kIM,kEACE,0CzC+kIR,CyCzkIE,2BAKE,uBAAA,CADA,+DAAA,CAHA,YAAA,CACA,cAAA,CACA,aAAA,CAGA,oBzC2kIJ,CyCxkII,aATF,2BAUI,gBzC2kIJ,CACF,CyCxkII,cAGE,+BACE,iBzCwkIN,CyCrkIM,sCAQE,qCAAA,CANA,QAAA,CAKA,UAAA,CAHA,aAAA,CAEA,UAAA,CAHA,MAAA,CAFA,iBAAA,CAaA,2CAAA,CALA,2DACE,CAGF,kDAAA,CARA,+BzC6kIR,CACF,CyC/jII,8CACE,YzCikIN,CyC7jII,iCASE,+BAAA,CACA,6BAAA,CAJA,uCAAA,CAEA,cAAA,CAPA,aAAA,CAGA,gBAAA,CACA,eAAA,CAFA,8BAAA,CAWA,+BAAA,CAHA,2CACE,CALF,kBAAA,CALA,UzCykIN,CyC1jIM,aAII,6CACE,OzCyjIV,CyC1jIQ,8CACE,OzC4jIV,CyC7jIQ,8CACE,OzC+jIV,CyChkIQ,8CACE,OzCkkIV,CyCnkIQ,8CACE,OzCqkIV,CyCtkIQ,8CACE,OzCwkIV,CyCzkIQ,8CACE,OzC2kIV,CyC5kIQ,8CACE,OzC8kIV,CyC/kIQ,8CACE,OzCilIV,CyCllIQ,+CACE,QzColIV,CyCrlIQ,+CACE,QzCulIV,CyCxlIQ,+CACE,QzC0lIV,CyC3lIQ,+CACE,QzC6lIV,CyC9lIQ,+CACE,QzCgmIV,CyCjmIQ,+CACE,QzCmmIV,CyCpmIQ,+CACE,QzCsmIV,CyCvmIQ,+CACE,QzCymIV,CyC1mIQ,+CACE,QzC4mIV,CyC7mIQ,+CACE,QzC+mIV,CyChnIQ,+CACE,QzCknIV,CACF,CyC7mIM,uCACE,gCzC+mIR,CyCzmIE,4BACE,UzC2mIJ,CyCxmII,aAJF,4BAKI,gBzC2mIJ,CACF,CyCvmIE,0BACE,YzCymIJ,CyCtmII,aAJF,0BAKI,azCymIJ,CyCrmIM,sCACE,OzCumIR,CyCxmIM,uCACE,OzC0mIR,CyC3mIM,uCACE,OzC6mIR,CyC9mIM,uCACE,OzCgnIR,CyCjnIM,uCACE,OzCmnIR,CyCpnIM,uCACE,OzCsnIR,CyCvnIM,uCACE,OzCynIR,CyC1nIM,uCACE,OzC4nIR,CyC7nIM,uCACE,OzC+nIR,CyChoIM,wCACE,QzCkoIR,CyCnoIM,wCACE,QzCqoIR,CyCtoIM,wCACE,QzCwoIR,CyCzoIM,wCACE,QzC2oIR,CyC5oIM,wCACE,QzC8oIR,CyC/oIM,wCACE,QzCipIR,CyClpIM,wCACE,QzCopIR,CyCrpIM,wCACE,QzCupIR,CyCxpIM,wCACE,QzC0pIR,CyC3pIM,wCACE,QzC6pIR,CyC9pIM,wCACE,QzCgqIR,CACF,CyC1pII,+FAEE,QzC4pIN,CyCzpIM,yGACE,wBAAA,CACA,yBzC4pIR,CyCnpIM,2DAEE,wBAAA,CACA,yBAAA,CAFA,QzCupIR,CyChpIM,iEACE,QzCkpIR,CyC/oIQ,qLAGE,wBAAA,CACA,yBAAA,CAFA,QzCmpIV,CyC7oIQ,6FACE,wBAAA,CACA,yBzC+oIV,CyC1oIM,yDACE,kBzC4oIR,CyCvoII,sCACE,QzCyoIN,CyCpoIE,2BAEE,iBAAA,CAOA,kBAAA,CAHA,uCAAA,CAEA,cAAA,CAPA,aAAA,CAGA,YAAA,CACA,gBAAA,CAEA,mBAAA,CAGA,gCAAA,CAPA,WzC6oIJ,CyCnoII,iCAEE,uDAAA,CADA,+BzCsoIN,CyCjoII,iCAKE,6BAAA,CADA,UAAA,CAHA,aAAA,CAEA,WAAA,CAMA,8CAAA,CAAA,sCAAA,CACA,4BAAA,CAAA,oBAAA,CACA,6BAAA,CAAA,qBAAA,CACA,yBAAA,CAAA,iBAAA,CANA,+CACE,CALF,UzC2oIN,CyC5nIE,4BAOE,yEACE,CANF,YAAA,CAGA,aAAA,CAFA,qBAAA,CAGA,mBAAA,CALA,iBAAA,CAYA,wBAAA,CATA,YzCkoIJ,CyCtnII,sCACE,wBzCwnIN,CyCpnII,oCACE,SzCsnIN,CyClnII,kCAGE,wEACE,CAFF,mBAAA,CADA,OzCsnIN,CyC5mIM,uDACE,8CAAA,CAAA,sCzC8mIR,CKpuII,0CoCoIF,wDAEE,kBzCsmIF,CyCxmIA,wDAEE,mBzCsmIF,CyCxmIA,8CAGE,eAAA,CAFA,eAAA,CAGA,iCzComIF,CyChmIE,8DACE,mBzCmmIJ,CyCpmIE,8DACE,kBzCmmIJ,CyCpmIE,oDAEE,UzCkmIJ,CyC9lIE,8EAEE,kBzCimIJ,CyCnmIE,8EAEE,mBzCimIJ,CyCnmIE,8EAGE,kBzCgmIJ,CyCnmIE,8EAGE,mBzCgmIJ,CyCnmIE,oEACE,UzCkmIJ,CyC5lIE,8EAEE,mBzC+lIJ,CyCjmIE,8EAEE,kBzC+lIJ,CyCjmIE,8EAGE,mBzC8lIJ,CyCjmIE,8EAGE,kBzC8lIJ,CyCjmIE,oEACE,UzCgmIJ,CACF,CyCllIE,cAHF,olDAII,gCzCqlIF,CyCllIE,g8GACE,uCzColIJ,CACF,CyC/kIA,4sDACE,+BzCklIF,CyC9kIA,wmDACE,azCilIF,C0Cp8IA,MACE,8WAAA,CACA,uX1Cu8IF,C0C97IE,4BAEE,oBAAA,CADA,iB1Ck8IJ,C0C77II,sDAGE,S1C+7IN,C0Cl8II,sDAGE,U1C+7IN,C0Cl8II,4CACE,iBAAA,CACA,S1Cg8IN,C0C17IE,+CAEE,SAAA,CADA,U1C67IJ,C0Cx7IE,kDAOE,W1C87IJ,C0Cr8IE,kDAOE,Y1C87IJ,C0Cr8IE,wCAME,qDAAA,CADA,UAAA,CADA,aAAA,CAIA,0CAAA,CAAA,kCAAA,CACA,4BAAA,CAAA,oBAAA,CACA,6BAAA,CAAA,qBAAA,CACA,yBAAA,CAAA,iBAAA,CAVA,iBAAA,CACA,SAAA,CACA,Y1Ck8IJ,C0Ct7IE,gEACE,wBzB2Wa,CyB1Wb,mDAAA,CAAA,2C1Cw7IJ,C2Cx+IA,QACE,8DAAA,CAGA,+CAAA,CACA,iEAAA,CACA,oDAAA,CACA,sDAAA,CACA,mDAAA,CAGA,qEAAA,CACA,qEAAA,CACA,wEAAA,CACA,0EAAA,CACA,wEAAA,CACA,yEAAA,CACA,kEAAA,CACA,+DAAA,CACA,oEAAA,CACA,oEAAA,CACA,mEAAA,CACA,gEAAA,CACA,uEAAA,CACA,mEAAA,CACA,qEAAA,CACA,oEAAA,CACA,gEAAA,CACA,wEAAA,CACA,qEAAA,CACA,+D3Cu+IF,C2Cj+IA,SAEE,kBAAA,CADA,Y3Cq+IF,CKp2II,mCuChKA,8BACE,U5C4gJJ,C4C7gJE,8BACE,W5C4gJJ,C4C7gJE,8BAGE,kB5C0gJJ,C4C7gJE,8BAGE,iB5C0gJJ,C4C7gJE,oBAKE,mBAAA,CADA,YAAA,CAFA,a5C2gJJ,C4CrgJI,kCACE,W5CwgJN,C4CzgJI,kCACE,U5CwgJN,C4CzgJI,kCAEE,iBAAA,CAAA,c5CugJN,C4CzgJI,kCAEE,aAAA,CAAA,kB5CugJN,CACF","file":"main.css"} \ No newline at end of file diff --git a/cloud_glossary/index.html b/cloud_glossary/index.html index ac8c74c..ff1e8ad 100644 --- a/cloud_glossary/index.html +++ b/cloud_glossary/index.html @@ -16,7 +16,7 @@ - + @@ -24,7 +24,7 @@ - + @@ -703,6 +703,26 @@ +
  • + + + + + Exercise: Using File Storage with Windows VM + + + + +
  • + + + + + + + + +
  • diff --git a/contact/index.html b/contact/index.html index 6fba7b5..31f80d6 100644 --- a/contact/index.html +++ b/contact/index.html @@ -16,7 +16,7 @@ - + @@ -24,7 +24,7 @@ - + @@ -458,6 +458,26 @@ +
  • + + + + + Exercise: Using File Storage with Windows VM + + + + +
  • + + + + + + + + +
  • diff --git a/exercises/azure_portal_walkthrough/index.html b/exercises/azure_portal_walkthrough/index.html index 56ccb28..680fba0 100644 --- a/exercises/azure_portal_walkthrough/index.html +++ b/exercises/azure_portal_walkthrough/index.html @@ -16,7 +16,7 @@ - + @@ -24,7 +24,7 @@ - + @@ -525,6 +525,26 @@ +
  • + + + + + Exercise: Using File Storage with Windows VM + + + + +
  • + + + + + + + + +
  • diff --git a/exercises/azure_vm_walkthrough/index.html b/exercises/azure_vm_walkthrough/index.html index 70af758..539c12f 100644 --- a/exercises/azure_vm_walkthrough/index.html +++ b/exercises/azure_vm_walkthrough/index.html @@ -16,7 +16,7 @@ - + @@ -24,7 +24,7 @@ - + @@ -775,6 +775,26 @@ +
  • + + + + + Exercise: Using File Storage with Windows VM + + + + +
  • + + + + + + + + +
  • diff --git a/exercises/azure_windows_vm_walkthrough/index.html b/exercises/azure_windows_vm_walkthrough/index.html index 186bd24..4434464 100644 --- a/exercises/azure_windows_vm_walkthrough/index.html +++ b/exercises/azure_windows_vm_walkthrough/index.html @@ -16,7 +16,7 @@ - + @@ -24,7 +24,7 @@ - + @@ -627,6 +627,26 @@ +
  • + + + + + Exercise: Using File Storage with Windows VM + + + + +
  • + + + + + + + + +
  • diff --git a/exercises/exercise_budget_alert/index.html b/exercises/exercise_budget_alert/index.html index 71acdde..b6686ee 100644 --- a/exercises/exercise_budget_alert/index.html +++ b/exercises/exercise_budget_alert/index.html @@ -16,7 +16,7 @@ - + @@ -24,7 +24,7 @@ - + @@ -504,6 +504,26 @@ +
  • + + + + + Exercise: Using File Storage with Windows VM + + + + +
  • + + + + + + + + +
  • diff --git a/exercises/exercise_create_storage_account/index.html b/exercises/exercise_create_storage_account/index.html index 214788c..a59ac1a 100644 --- a/exercises/exercise_create_storage_account/index.html +++ b/exercises/exercise_create_storage_account/index.html @@ -16,7 +16,7 @@ - + @@ -24,7 +24,7 @@ - + @@ -531,6 +531,26 @@ +
  • + + + + + Exercise: Using File Storage with Windows VM + + + + +
  • + + + + + + + + +
  • diff --git a/exercises/exercise_using_the_cloud_to_summarize_and_visualize_data/index.html b/exercises/exercise_using_the_cloud_to_summarize_and_visualize_data/index.html index 5658ef2..d2a68a7 100644 --- a/exercises/exercise_using_the_cloud_to_summarize_and_visualize_data/index.html +++ b/exercises/exercise_using_the_cloud_to_summarize_and_visualize_data/index.html @@ -12,11 +12,11 @@ - + - + @@ -24,7 +24,7 @@ - + @@ -539,6 +539,26 @@ +
  • + + + + + Exercise: Using File Storage with Windows VM + + + + +
  • + + + + + + + + +
  • diff --git a/exercises/exercise_windows_filestorage/index.html b/exercises/exercise_windows_filestorage/index.html new file mode 100644 index 0000000..ddf303b --- /dev/null +++ b/exercises/exercise_windows_filestorage/index.html @@ -0,0 +1,1313 @@ + + + + + + + + + + + + + + + + + + + + + + + Exercise: Using File Storage with Windows VM - MSU Cloud Computing Fellowship + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + Skip to content + + +
    +
    + +
    + + + + + + +
    + + +
    + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + + +
    +
    +
    + + + + + + + +
    +
    + + + + +

    Exercise: Using File Storage with Windows VM

    +

    Overview

    + +

    Using File Storage with Windows VM step-by-step.

    +

    First Step: Create a Storage Account

    +
      +
    1. We have already set up storage accounts in a previous tutorial. Refer back to the tutorial (Creating Azure Cloud Storage Accounts) if you still need to create one, however the one you have currently should work for this tutorial.
    2. +
    +

    Second Step: Create an Azure File Share

    +
      +
    1. +

      Go to your Storage Account

      +
        +
      • On the homepage, there should be a list of "Resources" in the middle of the page. Click the one with Type listed as Storage Account
      • +
      +
    2. +
    3. +

      Select File Shares

      +
        +
      • On the left side of the screen there is a menu. Under the "Data Storage" section is the File Shares button
      • +
      +
    4. +
    5. +

      Add a File Share

      +
        +
      • Towards the top of the screen click the + File Share button
      • +
      +
    6. +
    7. +

      File Share Properties

      +
        +
      • Basics
          +
        1. Name the File Share qsfileshare
        2. +
        3. Keep Tier as Transaction Optimized
        4. +
        +
      • +
      • Click Review + Create
      • +
      +
    8. +
    9. +

      Create a new txt file titled qsTestFile on your local machine

      +
        +
      • Go to your file folder, and in any directory of your choice - Right Click and select a new .txt file
      • +
      +
    10. +
    11. +

      With your file share open in Azure, click Upload (on the top middle section of the screen)

      +
    12. +
    13. +

      Upload your created txt file

      +
        +
      • Select Browse your Files and navigate to the directory you chose earlier, then attach your txt file
      • +
      +
    14. +
    +

    Third Step: Deploying a VM

    +

    We've created the storage account and the file share with a file in it. We now need to deploy a VM.

    +
      +
    1. +

      Create the Resource

      +
        +
      • Expand the left side menu and click Create a Resource
      • +
      • Under "Popular Azure services" select Virtual machine
      • +
      +
    2. +
    3. +

      Setting the VM Properties

      +
        +
      • Basics
          +
        1. Resource Group: Select the Cloud Computing Fellowship Resource group
        2. +
        3. Virtual machine name: qsVM
        4. +
        5. Security Type: Standard
        6. +
        7. Image: Windows Server 2019 Datacenter - x64 Gen2
        8. +
        9. Set your Username and Password to something you will remember for logging in to the VM
        10. +
        11. Select Inbound Ports: HTTP and RDP (3389)
        12. +
        +
      • +
      • Select Review and Create
      • +
      • Select Create
      • +
      • When deployment is done, select Go to Resource
      • +
      +
    4. +
    +

    Fourth Step: Connect to Your VM

    +
      +
    1. +

      Select Connect on the VM properties page

      +
    2. +
    3. +

      Click Select on the Native RDP File

      +
    4. +
    5. +

      Download the RDP File

      +
        +
      • On the right side menu select the Download RDP File under section 3
      • +
      +
    6. +
    7. +

      Open the VM on your local machine

      +
        +
      • Open the downloaded RDP file
      • +
      • Select Connect on the pop-up
      • +
      • Put the username and password that you created in the VM setup (if you are on a windows machine you may need to click "More Choices" before logging in)
      • +
      • You may get a certificate warning, you can ignore that
      • +
      +
    8. +
    +

    Fifth Step: Map the Azure File Share to a Windows Drive

    +
      +
    1. In the Azure portal, navigate to your qsfileshare and select Connect
    2. +
    3. Click Show Script in the right-hand menu pop-up
    4. +
    5. This will display a script in the same menu. Copy and paste this script into your notepad.
    6. +
    7. Go back to your VM
        +
      • Open Windows Powershell
      • +
      • Paste in the contents of your notepad
      • +
      • Press Enter
      • +
      • You will see "Credential added successfully" when it works
      • +
      +
    8. +
    +

    Sixth Step: Working with Snapshots

    +
      +
    1. +

      Create a Share Snapshot

      +
        +
      • Adding a snapshot in the Azure Portal
          +
        1. In the Azure Portal, navigate to the file share
        2. +
        3. Select Snapshots (located in the left hand side menu)
        4. +
        5. Select + Add a Snapshot and click Ok
        6. +
        +
      • +
      • In your VM, open the qstestfile.txt and type "This file has been modified".
      • +
      • Save and close the file.
      • +
      • Create another snapshot (repeat steps a-c)
      • +
      +
    2. +
    3. +

      Browse a Share Snapshot

      +
        +
      • On your file share, select Snapshots
      • +
      • Select the first Snapshot in the list
      • +
      • Select qsTestFile.txt
      • +
      +
    4. +
    5. +

      Restore from a Snapshot

      +
        +
      • Ensure you're in the file share Snapshot tab
      • +
      • Right click the qsTestFile
      • +
      • Select Restore
      • +
      • Select Overwrite Original File and click Ok
      • +
      • Open the file in the VM. It should be restored and have no text in it.
      • +
      +
    6. +
    7. +

      Delete a Share Snapshot

      +
        +
      • On your file share Snapshot list, select the last snapshot in the list
      • +
      • Select Delete
      • +
      +
    8. +
    9. +

      Use a Share Snapshot in Windows

      +
        +
      • You can view snapshots from your mounted Azure file share by using the Previous Versions tab
          +
        1. In your VM File Explorer, locate the mounted share. It should be titled qsfileshare and have a boxy symbol
        2. +
        3. Select qstestfile.txt and Right Click
        4. +
        5. Select Properties from menu
        6. +
        7. Select Previous Versions - this shows you a list of previous snapshots
        8. +
        9. Select Open
        10. +
        +
      • +
      +
    10. +
    11. +

      Restore from a Previous Version

      +
        +
      • In the same screen we were just in, rather than selecting "Open", select "Restore"
      • +
      +
    12. +
    +

    Seventh Step: Delete the Resources

    +
      +
    1. Click on your Resource Group
    2. +
    3. Select everything except the storage account you created in Session 1
    4. +
    5. Select Delete NOT "Delete Resource Group" to delete the resources
    6. +
    7. Go to your storage account and delete the fileshare as well
    8. +
    + + + + + + +
    +
    + + +
    + +
    + +
    + + +
    + +
    +
    +
    +
    + + + + + + + + + + \ No newline at end of file diff --git a/exercises/storage_pricing_exercise/index.html b/exercises/storage_pricing_exercise/index.html index 414f535..57edb69 100644 --- a/exercises/storage_pricing_exercise/index.html +++ b/exercises/storage_pricing_exercise/index.html @@ -9,14 +9,14 @@ - + - + @@ -24,7 +24,7 @@ - + @@ -449,6 +449,26 @@ + +
  • + + + + + Exercise: Using File Storage with Windows VM + + + + +
  • + + + + + + + + diff --git a/index.html b/index.html index e53839d..e006399 100644 --- a/index.html +++ b/index.html @@ -14,7 +14,7 @@ - + @@ -22,7 +22,7 @@ - + @@ -535,6 +535,26 @@ +
  • + + + + + Exercise: Using File Storage with Windows VM + + + + +
  • + + + + + + + + +
  • diff --git a/projects/index.html b/projects/index.html index 2469b07..85da356 100644 --- a/projects/index.html +++ b/projects/index.html @@ -16,7 +16,7 @@ - + @@ -24,7 +24,7 @@ - + @@ -502,6 +502,26 @@ +
  • + + + + + Exercise: Using File Storage with Windows VM + + + + +
  • + + + + + + + + +
  • diff --git a/references/index.html b/references/index.html index 0e48ca3..bdea6e4 100644 --- a/references/index.html +++ b/references/index.html @@ -16,7 +16,7 @@ - + @@ -24,7 +24,7 @@ - + @@ -448,6 +448,26 @@ +
  • + + + + + Exercise: Using File Storage with Windows VM + + + + +
  • + + + + + + + + +
  • diff --git a/search/search_index.json b/search/search_index.json index 91d9217..69aab59 100644 --- a/search/search_index.json +++ b/search/search_index.json @@ -1 +1 @@ -{"config":{"lang":["en"],"separator":"[\\s\\-]+","pipeline":["stopWordFilter"]},"docs":[{"location":"","title":"Syllabus","text":"

    from John Constable, Cloud Studies, 19th Century English painter

    "},{"location":"#msu-cloud-computing-fellowship","title":"MSU Cloud Computing Fellowship","text":""},{"location":"#program-summary","title":"Program Summary","text":"

    The program runs Fall semester through Winder/Spring semester.

    Fall semester is dedicated to learning how the cloud works. In-person sessions are approximately bi-weekly (see schedule below). A session includes preparatory readings and activities to orient you to the topic, followed by an in-person meeting on Friday to review the materials, seminar, provide a venue for discussion, and hands-on activities

    Winter/Spring semester is for building a project using cloud computing culminating in a symposium where you present what you've learned and built. Winter/spring sessions are bi-weekly for presentations by the fellows on their project status, discussion on success and challenges, presentations by cloud practitioners, and for general help.

    The culmination of the fellowship is a project resulting in a write-up and presentation during the spring symposium, typically held late-April or early-May.

    "},{"location":"#textbook","title":"Textbook","text":"

    We will occasionally link to the following book:

    \"Cloud Computing for Science and Engineering\", Ian Foster and Dennis B. Gannon, September 2017

    The book website does provide open access to individual chapters.

    "},{"location":"#meeting-location","title":"Meeting location","text":"

    MSU STEM Teaching and Learning Facility 642 Red Cedar Rd Michigan State University. East Lansing, MI 48824

    We plan to hold all sessions in-person.

    "},{"location":"#fall-2023-schedule","title":"Fall 2023 Schedule","text":"

    Each approximately 2-week session consists of - preparatory activities and materials (topics, links, tutorials) prior to meeting - an in-person session for review, activities, and discussion on the friday of week 1 - follow up for week 2

    1. Introduction
    2. Requirements:
      • September 4-8 Complete items in the Welcome email sent by Dr. Parvizi
      • post to teams to say hello
    3. Meeting September 8, 3pm STEM 3201:
      • introduction to the cloud fellowship
      • intro to Cloud/Computing and Azure
    4. Assignments:

    5. How to Cloud

    6. Meeting September 22, 3pm

      • Azure Organization
      • Creating and Using Virtual Machines
    7. Cloud Storage

    8. Meeting October 6, 3pm
    9. Assignment/Exercise: analyzing weather data in the cloud

    10. Databases and Data Analytics Systems on the Cloud for research

      • Meeting October 20, 3pm
      • Exercises: Using SQL database for research data
    11. Big Data Systems and the cloud

      • Meeting November 3, 3pm:
      • Exercise: Using R and Python on a databricks cluster
    12. Serverless Cloud Computing

      • Meeting November 17, 3pm
      • Review Project Requirements and Specification
      • Assignment: email 1-2 sentences describing a project you may undertake by December 6
    13. Azure AI Services

      • Meeting December 1, 3pm:
      • Discussion: Fellowship Projects
      • Demonstration of AI Services
      • Exercise Hands-on reating responder using Python API
      • Assignment: project proposal due January 8, 2024
    "},{"location":"#winterspring-2023-schedule","title":"Winter/Spring 2023 Schedule","text":"

    The second half is dedicated for fellows to complete a cloud computing project based on research interests culminating in a presentation at a symposium in late April

    Fellows will attend bi-weekly meetings where groups of fellows will present the goals and stats of their cloud computing projects for feedback and discussion.

    All meetings are in the MSU STEM Building, room 1201, alternate Fridays 3pm to 4:30pm

    Instructors are available by appointments, and typically during the alternate fridays to answer any questions you have about cloud, projects, or applying cloud computing technology to your research

    1. Turn in Project Proposal Monday, January 8th
    2. Post Written Project Proposal to MS Teams folder prior to 5:00 pm
    3. Additionally survey of fellows to determine symposium dates will be distributed

    4. Schedule meeting with Instructors to review proposals. This is on-going during January to ensure we have time to meet with all fellows one-on-one.

    5. Cloud Computing Seminar TBD January 12th

    6. Project Proposal Presentations Fellows will present their proposals to the fellowship, up to 6 per session, followed by questions and feedback from colleagues

    7. January 26, February 9th, February 23

    8. Project status presentations Fellows will present the status of their projects, describing challenges and successes, and receive questions, feedback, support and help from the fellowship ** March 8, March 22, April 5**

    9. Project Final Reports April 12 A writeup of the the results and lessons from applying cloud computing technology

    10. Symposium Preparation

    11. The data and time of the symposium will be determined January 24 Fellows must turn in Symposium Talk Title & Abstract 3d prior to symposium
    "},{"location":"#msu-cloud-computing-fellowship-symposium","title":"MSU Cloud Computing Fellowship Symposium","text":"

    Fellows will present the outcomes, successes, challenges and lessons learned at a symposium held on MSU campus late April, 2024. The date and time determined in January 2024 with input from the fellows. Fellows are strongly encourage to invite their advisors, mentors and colleagues.

    "},{"location":"#communications","title":"Communications","text":"

    Fellows are encouraged to contact us with questions or if they are ever stuck on an activity we've assigned. In addition to email, we are utilizing Microsoft Teams at MSU (Fellows receive a link in the welcome email). Please feel free to reach on out the MS Teams channel sent to participants at the beginning of the program. Mentioning one of us e.g. @billspat or @parvizm will help get our attention. Additionally you may email us at any time.

    The goal of the fellowship is to foster discussion. We encourage you to add your successes or challenges to any discussion or question Teams.

    If you need interactive, on-going help it may be better to schedule a help session with a fellowship coordinator; and we are happy to meet individually for additional support. This may be especially effective when fellows are developing their projects.

    We also save time during our synchronous meetings for group discussions, so please bring any concerns, difficulties, or successes to our sessions!

    If you are not a participant but have questions about the program, see the Contact page for how to get in touch with us.

    This work is licensed under a Creative Commons Attribution-NonCommercial 4.0 International License

    "},{"location":"about/","title":"About The MSU Cloud Computing Fellowship","text":"

    The MSU Cloud Computing Fellowship is a cross-disciplinary program produced by MSU\u2019s Institute of Cyber-Enabled Research (ICER) and MSU IT Services for invited MSU doctoral students and postdoctoral researchers. As a part of this program, fellows will participate in a series of workshops during the fall semester to:

    "},{"location":"about/#background","title":"Background","text":"

    MSU doctoral students and postdoctoral researchers are invited to apply in the summer and approximately 18 are selected each year. The program started in 2019. If you are an MSU graduate student or post-doc and interested in participating next year, please check back in the Summer of 2022 for announcements on the invitation to participate, or request to join the MSU ICER mailing list

    "},{"location":"about/#citing-the-msu-icer-cloud-computing-fellowship-in-research-publications","title":"Citing the MSU ICER Cloud Computing Fellowship in Research Publications","text":"

    We encourage cloud fellows to acknowledge the fellowship in publications arising from computational work performed during your fellowship project. Please let us know that you have referenced the fellowship, and we will link to your publication on the ICER publication site, which will further increase the visibility of your work. A sample statement can be:

    \"This work was supported in part through Michigan State University\u2019s Institute for Cyber-Enabled Research Cloud Computing Fellowship, with computational resources and services provided by Information Technology Services and the Office of Research and Innovation at Michigan State University.\u201d

    "},{"location":"about/#cloud-computing-fellowship-organizers","title":"Cloud Computing Fellowship Organizers","text":"

    Dr. Brian O'Shea Professor and Director, MSU ICER

    Role: Program Lead, ICER

    Dr. Brian O'Shea is a computational and theoretical astrophysicist studying cosmological structure formation, including galaxy formation and the behavior of the hot, diffuse plasma in the intergalactic medium and within galaxy clusters. He is also a co-author of the Enzo AMR code, an expert in high performance computing, and an advocate for open-source computing and open-source science. He received his B.S. in Engineering Physics at the University of Illinois in Urbana-Champaign (UIUC) in 2000, and his PhD in physics from UIUC in 2005 (with 2002-2005 being spent as a graduate student in residence at the Laboratory for Computational Astrophysics at UC San Diego and in the Theoretical Astrophysics Group at Los Alamos National Laboratory). Following that, he was a Director's Postdoctoral Fellow at Los Alamos National Laboratory, with a joint appointment between the Theoretical Astrophysics Group and the Applied Physics Division. Since 2008, he has been a member of the faculty at Michigan State University, with a joint appointment between the Department of Computational Mathematics, Science and Engineering (2015-present), the Department of Physics and Astronomy (2008-present), and the National Superconducting Cyclotron Laboratory (2014-present). From 2008-2015, Dr. O'Shea was a member of Lyman Briggs College. He has authored or co-authored over 75 peer-reviewed journal articles in astrophysics, computer science, and education research journals, and has received a variety of awards for his teaching and public outreach efforts. In 2016, he became a Fellow of the American Physical Society, and in 2019 he became the director of MSU's Institute for Cyber-Enabled Research.

    Patrick Bills Research Software Engineer, ICER Role: Co-Instructor

    Pat Bills research background is in data systems for ecology (MS Entomology, MSU). He has experience in database design, R, Python, and web application programming. Pat has worked in research IT for over 25 yrs for departments and labs across MSU, including for MSU ICER as a high performance computing research consultant and trainer, for MSU Enterprise services as the technical lead of the data science team, and currently as a research software engineer again for ICER.

    Like many, he has built and worked with on-campus linux systems for many years including the MSU HPC. Pat started his cloud journey in 2017 during a workshop at the HPC conference where he saw Ian Foster (our textbook author) present his vision of research on the cloud. Since then he has used cloud services from Google, Amazon, and Azure

    Dr. Mahmoud Parvizi Research Consultant, MSU ICER Role: Co-Instructor

    Mahmoud earned his PhD in physics from Vanderbilt University with research in high-energy theory in the context of early universe cosmology as well as computational astrophysics. In addition, Mahmoud earned an MBA with a concentration in finance from the University of Michigan - Flint. Mahmoud was formerly a postdoctoral research associate in the Department of Physics and Astronomy at Michigan State University with a focus on machine learning applications of cloud-computing workflows and currently a research consultant for the MSU Institute for Cyber-Enabled Research (ICER). He participated as a cloud fellow in 2019 and co-instructor of the Cloud Computing Fellowship in 2020.

    Mahmoud\u2019s diverse research interests include mathematical and theoretical physics, data-intensive astrophysics, machine learning for precision health, and cloud-computing platforms for academic research. His expertise includes 1) quantum field theory in curved/non-stationary spacetimes; 2) finite temperature quantum field theory and open quantum systems; 3) automated and end-to-end intelligent data pipelines for signal processing using compressed sensing and applied harmonic analysis; 4) machine learning and cloud-computing applications for precision health.

    Sponsored by ICER, the MSU Office of Research and Innovation (ORI), and MSU IT Services Research Cyberinfrastructure (RCI)

    "},{"location":"about/#previous-cloud-fellows","title":"Previous Cloud Fellows","text":"

    2019-2020

    2020-2021

    2021-2022

    Introducing the 2021 MSU Cloud Computing Fellows

    2022-2023

    Introducing the 2022 MSU Cloud Computing Fellows

    4th Annual Cloud Computing Fellows Symposium

    "},{"location":"cloud_glossary/","title":"Glossary of Cloud Terms","text":""},{"location":"cloud_glossary/#why","title":"Why?","text":"

    Researchers using the cloud must know a little about a lot of information technology to get computational work done in their domain specialty. Most cloud glossaries are for systems administrators, not the rest of us. This glossary is much more brief than Wikipedia and hopefully also provides the context a researcher needs to find what you need to use cloud services in your work. Do you have an item to add? Please contact us!

    "},{"location":"cloud_glossary/#other-glossaries","title":"Other Glossaries","text":"

    https://www.cloudbank.org/cloud-terms

    "},{"location":"cloud_glossary/#the-glossary","title":"The Glossary","text":""},{"location":"cloud_glossary/#arm-cpu","title":"Arm CPU","text":"

    CPU from \"Advanced RISC Machines, ltd. While historically most computers used Intel CPUs, ARM provides an alternative CPU that is becoming more popular and present as an option in HPC and Cloud Virtual Machine options. The vast majority of software written for Intel computers is compatible with ARM. Some computational work is sensitive to CPU choice, and CPU choice can affect cost and speed of excecution, so it may be important to understand the implications of this choice of CPU.

    "},{"location":"cloud_glossary/#arm-template","title":"ARM Template","text":"

    A specification file listing all of the cloud resources and configuration settings tha that the Azure Resource Manager can use to create resources for you when you submit it a certain way. Templates are a great shortcut and automation feature but difficult to edit. For details see Azure Documentation: What are ARM templates?

    "},{"location":"cloud_glossary/#azure-resource-manager-arm","title":"Azure Resource Manager (ARM)","text":"

    see Resource Manager

    =#### Blob Storage Azure calls there object cloud storage \"Blobs\". It is similar to Amazon Web Service 'S3' and Google cloud storage buckets. Azure Documentation: Introduction to Azure Blob storage While it's possible to 'mount' blob storage to linux VMs using 'blob fuse' or similar packages, it can not work as you may expect and so in practice Azure Files are a better solution for that. See File Storage

    "},{"location":"cloud_glossary/#client-server","title":"Client-Server","text":"

    Client/Server model of computing is something we use everyday but perhaps dont' use this term. See https://techterms.com/definition/client-server_model You are used to using maybe a dozen clients everyday (phone apps, web browser, ssh to connect to a remote linux, Remote Desktop client to connect to remote desktop server, etc). Cloud computing provides all the infrastructure needed to create servers quickly and easily.

    "},{"location":"cloud_glossary/#cloud-shell","title":"Cloud Shell","text":"

    Cloud computing providers usually have a service where you can run command line (CLI) or terminal commands in a web browser 'shell' This is helpful as the libraries and utilities are pre-installed. See https://docs.microsoft.com/en-us/azure/cloud-shell/overview and Azure Interfaces introduction.

    "},{"location":"cloud_glossary/#containers","title":"Containers","text":"

    Or Docker Containers (not all containers need to be Docker the vast majority of container system use Docker). For R users, see https://colinfay.me/docker-r-reproducibility/ For Python users, there is https://www.netguru.com/blog/python-docker-tutorial although you could read either.

    Linux Containers is a term for a collection of methods and technologies that allows a multiple isolated systems to be run on one Linux computer. This is differnet from virtual machines in that a VM host provides abstract or virtualized hardware so each VM requires it's own portion of memory and CPU cores whereas containers share the main part of Linux (the kernel), memory and CPU more dynamically. The primary comercial company for containers is \"Docker\" so Docker is sometimes used synonymously with 'container' but it is just one form.

    In addition to being more efficient than VMs, most container systems have a system and scripting language for building containers. The means onecan provision an entire system from code. Containers are widely use to package and distribute complex research software systems for example Bioinformatics workflow system \"Cromwell.\" This way reseearches can download and use a pre-installed system without the trouble of getting all of the pre-requistes (dependencies) installed on their machine.

    "},{"location":"cloud_glossary/#cpu","title":"CPU","text":"

    Central Processing Unit, the main 'chip' of a computer, and a core component when specifying a Virtual Machine 'size'

    "},{"location":"cloud_glossary/#devops","title":"DevOps","text":"

    This has many definitions but for researchers the shortcut is using code to make IT infrastructure. Helping developers (like you) do Ops (like sysadmins) with code. see IaC.

    "},{"location":"cloud_glossary/#docker","title":"Docker","text":"

    Docker is the most prevalent form of \"Containers\", e.g Docker is to containers as google is to search. See containers above for details. Note that Docker is many things as once: a method and format for Linux containers, a program for working with container ( e.g. docker build...), a Company, and that's company's hub or repository for storing and access free containers (or your own). Cloud companies also have \"hubs\" or repositories for storing your own Docker containers.

    "},{"location":"cloud_glossary/#file-storage-azure","title":"File Storage (Azure)","text":"

    Also called \"Azure Files.\" Azure cloud storage that is more traditional file sharing, and that can be connected (mounted) to computers and other services using the SMB protocal, making it similar experience to departmental shared fileservers. See https://azure.microsoft.com/en-us/services/storage/files/ and compare with Blob Storage

    "},{"location":"cloud_glossary/#firewall","title":"Firewall","text":"

    A common concept in networking, firewall software on a computer's networking components limits which kind of traffic can come in or out, and restricts which computer internet addresses can connect. Best practices suggest closing all connections via the firewall, only opening those connections for services you need, and only to those users (e.g. your own computer) you need to. Azure additionally has an option to \"allow connections from Azure networks\" so that you can freely connect from the portal, 'cloud shell', or connect from on azure service to another. The implication is that you trust all Azure services.

    "},{"location":"cloud_glossary/#gpu","title":"GPU","text":"

    From Wikipedia: https://en.wikipedia.org/wiki/Graphics_processing_unit GPUs can be very helpful for some code written to use them, especially many machine learning libraries, and Virtual Machines may be provisioned with GPUs.

    "},{"location":"cloud_glossary/#infrastructure-as-code-iac","title":"Infrastructure as Code (IaC)","text":"

    In stead of using a GUI, or manual steps to create cloud computing, cloud resources may be created using scripts that interact with the cloud provider's api, and additional scripts can configure individual resources (such as to install software on a VM or configure a database). Doing this kind of \"provisioning\" with scripts makes it reproducible and debuggable which is at the heart of the Workflow or DevOps mentality.

    "},{"location":"cloud_glossary/#ip-address","title":"IP Address","text":"

    a unique string of characters that identifies each computer using the Internet Protocol to communicate over a network. Your computer will have a different IP address depending on where you are located (home, work, field). In addition, a home wifi router will assign a 'local' ip address for inside your home, but your 'public' internet IP address will be different. To find your own IP address, simply google \"what is my ip.\" All Azure services (VMs, data systems, etc) are assigned IP addresses via networking. see https://docs.microsoft.com/en-us/azure/virtual-network/public-ip-addresses

    "},{"location":"cloud_glossary/#object-storage","title":"Object Storage","text":"

    From NetApp \"What is object storage?: \"...also known as object-based storage, is a strategy that manages and manipulates data storage as distinct units, called objects. These objects are kept in a single storehouse and are not ingrained in files inside other folders. Instead, object storage combines the pieces of data that make up a file, adds all its relevant metadata to that file, and attaches a custom identifier.\" Blob storage is object storage. Objects (e.g. files) are retrieved from a large system via their identifier, not their name. Amazon S3 and Google Cloud storage are also object stores.

    "},{"location":"cloud_glossary/#on-prem","title":"On-prem","text":"

    \"On Premise\" refers to technology (computers, disks, networking, etc) that are on your institutions computer centers or in your own lab. Note that for some researchers, \"on-prem\" can still mean remove (e.g. our HPC is only accessible remotely, so it may not be obvious that it's on premise to users).

    "},{"location":"cloud_glossary/#resource","title":"Resource","text":"

    For AWS and Azure, a resource is an entity that you can work with. The means something you can created, edit or delete via their cloud interface. Could be a computer (virtual machine), a whole cluster (azure batch pool), or some tiny network setting (IP address). Resoures almost always cost money. Resources are listed in your standard dashboard.

    "},{"location":"cloud_glossary/#resource-group","title":"Resource Group","text":"

    Organizational scheme unique to Azure. Nearly all resources must be part of a group and the resource group must be selected (or created ) when creating other resources. Resource groups could be used for specific projects, for 'personal' resources used for multiple projects (or for azure things like cloud shell).

    "},{"location":"cloud_glossary/#resource-manager","title":"Resource Manager","text":"

    Azure calls the system they use to interface between you and cloud resources the \"Azure Resource Manager\" or ARM. There used to be a different way to interact with Azure resources, hence this has a specific name and is referred to in Microsoft documentation.

    "},{"location":"cloud_glossary/#serverless","title":"Serverless","text":"

    This buzz-word applies to many different cloud services, primarily those that the cloud company manages for you, usually referring to cloud functions (AWS Lamba) and sometimes others in the \"Platform As A Service\" service model. The origin is that, if you run virtual machines with operating systems and software install, your are maintaining servers to support that software. If the cloud service does not require you to provision and maintain a server, it is often marketed as \"serverless\" (e.g. recent marketing of Azure Files as \"Serverless file shares\" where on-premise File Sharing requires staff to manage and maintain Windows File Servers.

    "},{"location":"cloud_glossary/#service-models","title":"Service Models","text":"

    This is related to the \"... as a service\" (..aaS) phrases defined in the NIST document which included \"Infrastructure\", \"Platform\" and \"Softare\" as a service (IaaS, PaaS and SaaS). It's a conceptual organization of cloud services based on the stack model of computating with the infrastructure (network, hardware, CPU, etc) at the bottom and Software on the top. See The NIST Definition of Cloud Computing

    "},{"location":"cloud_glossary/#service-level-agreement-sla","title":"Service Level Agreement (SLA)","text":"

    Level of service you expect from a vendor, laying out the metrics by which service is measured, as well as remedies or penalties should agreed-on service levels not be achieved. In Cloud this is often spells out 'uptime,' which is percent of time the system is not down, e.g. 99.99%, and guarantees against data loss and availability. For most research, uptime is not important as we are our own customer and can tolerate some downtime.

    "},{"location":"cloud_glossary/#services","title":"Services","text":"

    Cloud \"services\" are often bundles of resources pulled together for coordinate function. Cloud companies offer hundreds of often closely overlapping services.

    "},{"location":"cloud_glossary/#tags","title":"Tags","text":"

    AWS and Azure allow you add meta data to resource in the form of tags (e.g. hashtags, etc) which are keys and values. When you create a resource you can add a tag indicating the project it is for e.g. \"project\" = \"dna-methylation\" To add more detail if your DNA methylation has multiple aspects or experiments, add more tags like \"experiment\" = \"Fall 2021\"

    For workgroups it's stronlgy suggested you add a \"created_by\" = your netid because it's often difficult in Azure to determine who created a resource if it needs to be turned off or deleted.

    Use tags to organize your Azure resources and management hierarchy

    "},{"location":"cloud_glossary/#tensor-processing-unit-tpu","title":"Tensor Processing Unit (TPU)","text":"

    Google Tensor Processing Unit is specialized computer chip similar to GPUs, used by deep learning libraries such as TensorFlow ( which leads to the question of \"what is a tensor\" and that depends on who you ask but similar to matrix.

    "},{"location":"cloud_glossary/#virtual-machine","title":"Virtual Machine","text":"

    (aka VM) Creating a simulated computer hardware using software, to be able run a guest operating system inside a host system, such that the guest thinks it's running on an actual computer.

    "},{"location":"contact/","title":"Contacting Us","text":"

    If you are a Cloud Computing Fellowship participant this year (or past participant!), please contact the instructors Pat Bills or Mahmoud Parvizi with any issues or questions related to the material or activities.

    The session meetings are designed to have plenty of time for questions, troubleshooting and discussion. We will also schedule office hours prior to meeting times to help with pre-meeting activities.

    If you have general questions about the MSU Cloud Computing Fellowship, please contact Brian O'Shea

    If you will be an MSU graduate student or post-doc in the next Fall, and are interested in participating, please check back in the Summer for announcements for invitation to participate. The request for applications is announced on the MSU ICER mailing list and several other mailing lists around campus. We encourage anyone with an active research program that could benefit from cloud computing to apply

    If you are an MSU Researcher interested in using cloud for your research, please contact IT Services or MSU ICER via our ticketing systems and describe your needs.

    "},{"location":"projects/","title":"Projects","text":""},{"location":"projects/#cloud-computing-fellowship-projects-2022-2023","title":"Cloud Computing Fellowship Projects 2022-2023","text":"

    The primary activity of the Cloud Computing Fellowship is to support the fellows to create and present a cloud-computing-based project working with research data. During Fall semseter the fellowship provides materials and help to learn core cloud concepts and activies, and Winter/Spring semester is devoted to project development.

    "},{"location":"projects/#time-line-and-due-dates","title":"Time-line and Due dates","text":"

    Fellows deliver a proposal for their projects in early January 2024, and present that proposal to their colleagues in the fellowship. See the schedule for due dates. In Winter 2024 more detail will be provided on this site.

    "},{"location":"projects/#questions-answers-and-other-notes","title":"Questions, Answers and other Notes","text":"

    Q. Do I have to use my own data for my project or can I use data from the web or other public data?

    A. you can bring any data that you may use for your research, or that demonstrates cloud processes you may use in your research.

    Q. Could I work on a problem outside of my research for my project

    A. Yes. We encourage fellows to consider some small aspect of their own research to apply to their projects, but not all research can be readily adapted for cloud computing to contribute, especially with very limited time and budget. If the project is related, even tangentially, to your current research project, and you feel your chosen project will advance your career or knowledge of cloud for later application, then by all means please pursue and present what you've learned.

    Q. Do I have to use programming in my project?

    A. Most of the examples provided in the fellowship talk about processing data with scripts such as R or Python and many researchers are using these for data analysis, but it's not required for a successful project. You could install a program on a powerful virtual machine and show how to use that software along with cloud storage to tackle a large data set (for example). Secondly there are many forms of cloud computing that are not traditional such as data systems which may use a GUI or a language like SQL.

    One important aspect of a successful project is \"workflow thinking\" or how could you design your process so that you could do it 100 times or with some form of automation. That often requires programming but there are cloud systems that don't require programming (e.g. Azure Data Factory). Accumulating and organizing data is a huge part of successful research and using cloud tools to facilitate that and documenting the process, advantages and costs would be a successful project.

    Q. Do I have to use Virtual Machine as part of my project?

    No you don't, and in fact we encourage you to look for other services in the cloud to work with your data or your research processes.

    Q. Do I have to use services that we've covered in the sessions?

    A. Cloud companies provide many amazing services, and you are not limited to what we've talked about in the sessions. In addition we don't require you to use \"computation\" based services alone . If you are interested in using some other service, please contact us and we may find useful resources or connect you with a colleague who has used the service in mind.

    Q. Are there constraints on the things I want do with my project? Can I do whatever I want?

    A. Our goal is to facilitate your education and advancing your research program as it relates to cloud computing, and that is a very broad goal. If you use the fellowship to develop only a small system to show what's possible or not possible, even on public data, that uses cloud computing, that is an acceptable project.

    Q. I want to make a web site or application for my project, can I use a VM? how do I do that?

    A. This is a common request and the cloud was invented in part to run web applications. However web application design is a huge subject and the programming involved is almost as complex as any programming or data work you've done for your research. We tend to discourage projects focused on web applications because of the work involved to both 1) create the infrastructure for a website (web server, storage, databases, possibly docker containers, etc) and 2) the web application itself (Python/PHP other language, HTML, Javascript, Style Sheets, etc).

    Azure has services for hosting websites but don't attempt this for your project unless you have previous experience making websites or web applications, or if you are up for the big challenge of learning webdev along with cloud computing because the research you are showing off is mostly complete. Secondly web services must be on-line 24/7 and the cost may accumulate quickly.

    Finally cybsecurity is a major issues for websites which present an open door to anyone on the Internet. keeping your site secure is a major challenge so during development please turn it off when you are not using it, and consider that web applications are hacked routinely.

    However if you are ready to devote the time and this is a goal for your and your advisor please come speak with us as we have experience creating research web applications and we will support you.

    "},{"location":"exercises/azure_portal_walkthrough/","title":"Exercise: Azure Portal Walk-through and Storage account creation","text":"

    from MSU Cloud Computing Fellowship Session 1

    "},{"location":"exercises/azure_portal_walkthrough/#about","title":"About","text":"

    This is an exercise and introduction to the web interface to manage Microsoft Azure cloud services. Prior to doing this exercise, please read Azure Organization For more background on how azure is structured.

    For definition of terms used in this walkthrough , refer to our Cloud Glossary including \"resource\", \"azure resource manager\" and \"resource group\" or our list of cloud references for introduction to cloud computing.

    For this activity we'll be using the web interface which Azure calls the \"Portal\" but that is only one of several ways to interface with Azure that we will learn about. Many of the activities you can accomplish in the portal you can accomplish with the other (command line or code) interfaces.

    Azure's own overview of the Portal is here: https://docs.microsoft.com/en-us/azure/azure-portal/azure-portal-overview Please refer to that as well as this material.

    There is a corresponding video that we've made that includes infrmation about the portal, and also creating a storage account.

    "},{"location":"exercises/azure_portal_walkthrough/#orientation-to-the-azure-portal","title":"Orientation to the Azure Portal","text":"

    The link above is to a video that walks through the description and tutorial steps below, hosted on MSU MediaSpace ( requires MSU Log-in). Note this video also walks through creating a storage account.

    This assumes you have an Azure account and a valid subscription. For the purposes of this introduction, we assume that your account currently does not have ability to create a new subscription, resource group,

    1. Log-in to https://portal.azure.com with your MSU Netid.
      1. If you are a current member of the fellowship and you have difficulty logging in, please contact us right away.
    2. orientation: dashboard view. Azure portal first presents a \"dashboard\" which is organized into panels that show some aspect of your cloud account. You may alter the panels on this dashboard to show you the services and aspects of azure that are most important to you. For information on how to create customize your dashboard, see \"Create a dashboard in the Azure portal.\" In the standard, default version of the dashboard the first panel is a list of resources. If you have not created any resources yet you won't see anything. We will explorer resources later in this introduction. The standard dashboard panes are a list of your current resources (which may be in multiple resource groups), an advertisement with a link to learn about some new Azure service, and more links to create things the Azure has decided are most important to you. We will focus on the \"All Resources Pane\" If you click on anything here you can almost always use the back button to get back to the dashboard, or use the menu (described below)
    3. Top Bar Menu: the top menu ( three horizontal bars) is are links to many of the things also on the main dashboard. The \"home\" view is not the same as the dashboard but is a list of links to things Azure guess you may want to create, and a list of all of your resources. If you click \"resource groups\" in this list, you should see only one resource group (if any) unless you've been added to others or a different subscription.
    4. Search bar: in the middle of the top of the screen is white box in which you can type search terms include the kind of resource you want to see or create, or part of the name of specific resource you've created. This is what I use to create and find resources most of the time (and rarely use the links provided), more on that later.
    5. Shortcut buttons: the next few icons are short cuts to other functionality in the portal that we will cover in the future. Most are not critical.

    6. A note about portal navigation: When you click anything in the portal, it creates a new window without reloading the browser and with an X at the top right. This mimics a \"close window\" function and You can use the X return to the dashboard, or you may simply use the menu and go to where you need to

    Notice that like most things there are 4-5 ways to get to anywhere.

    "},{"location":"exercises/azure_portal_walkthrough/#bonus-what-can-you-do-here","title":"Bonus: What can you do here?","text":"

    The primary purpose of using the portal and your resource group is to create things, and manage and monitor those things. For the purpose of this activity - since you don't really have anything - we can simply look at the 'activity log' in the left side-panel near the top. - this opens a new table of columns Operation name, Status, Time, Time stamp, etc that is probably empty for you. - Tables of information like this in the portal have filters at the top. The default activity is just for the previous 6 hours. If you click on the Find that filter called \"timespan\" and select 1 week (or longer) you can see when I created the resource group and the budget.

    "},{"location":"exercises/azure_portal_walkthrough/#next-steps-create-a-storage-account","title":"Next Steps: Create a Storage Account","text":"

    For a good follow up exercise, see Creating a Storage Account with the Portal

    "},{"location":"exercises/azure_portal_walkthrough/#about-portal-resource-pages","title":"About Portal \"Resource\" Pages","text":"

    Most cloud resources in the portal have a list of categories on the left side, and pages for each category in the center. The first page is the \"Overview\" which has the resource group, subscription, and other info important for that resource. this followed by the \"Activity Log\" showing how the resource has been used. Each of the following items on the left side is a new page of additional options to alter how the resource is configured. For example if you click the \"tags\" section you see the tags you added (if any) and can modify or add new tags.

    Some of the options are not available on the forms when you create the resource, or the names of the options on these resource pages do not match the forms when you created the resources. In that case you may have to use two steps to configure the resource as you like, or better consider using a programmatic interface

    Again we did not discuss any of the characteristics of cloud storage or how to use it but you should now have enough familiarity with the azure portal to follow other tutorials to create and use storage or other resources.

    "},{"location":"exercises/azure_vm_walkthrough/","title":"Exercise: Creating and Connecting to a Virtual Machine (VM) for both Windows and Linux","text":""},{"location":"exercises/azure_vm_walkthrough/#about","title":"About","text":"

    This is an exercise and introduction to creating Virtual Machines (VMs) and related resources using the Azure Portal.

    There are two nearly identical activities, and you only need complete one of them:

    1. creating a Windows virtual machine and connecting with a graphic interface (GUI), namely Remote Desktop (rdp) to demonstrate how you may use full graphic software (like Rstudio, Matlab, etc) on a cloud computer
    2. creating a Linux Virtual machine and connection with the command line to demonstrate how you may use a terminal interface (or scripting) on a cloud computer.

    We will use a pre-configured virtual machine with software already installed for both versions. When creating a VM you can use an Azure template and there are many of these. The Data Science Virtual Machine (DSVM) from Azure has R, Python and many data science and statistical libraries available. For more information about the Azure DSVM see https://azure.microsoft.com/en-us/services/virtual-machines/data-science-virtual-machines/ and for the list of tools installed, see https://docs.microsoft.com/en-us/azure/machine-learning/data-science-virtual-machine/tools-included Azure has a new product called \"Azure Machine Learning\" that we may cover in a future session.

    "},{"location":"exercises/azure_vm_walkthrough/#requirements-for-both-activities","title":"Requirements for both activities","text":"

    You need an Azure account with an active subscription, and a resource group of your own to work in. Fellows have these things provided.

    This exercise assumes you understand how to use the Azure Portal, which is covered in the Azure Portal Walkthrough. In addition it's helpful to know what a virtual machine is but it's not crucial to complete the exercise. For more information on VMs see the readings session 2

    It's helpful to have basic understanding of the \"Client-Server\" model of computing as the VM we create will be running servers (remote desktop server for Windows, and ssh command line server for Linux)

    Finally we find that there are many layers of concepts related in this exercise related to IT Infrastructure, and we are happy to provde clarification as needed.

    "},{"location":"exercises/azure_vm_walkthrough/#optional-video-walk-through","title":"Optional Video Walk-through","text":"

    There was a previous exercise that created a Windows Virtual Machine only (from 2021). The following video is based on the exercise. Watching and following the video is not necessary to complete the exercise on this page, and it does not cover linux. However if you find videos more helpful, or would like to see in detail how it works, please take advantage of this walk-through:

    Link to Video for the Windows version of exercise. On mediaspace.msu.edu which requires an MSU log-in and is only availavble to participants in the MSU Cloud computing fellowship

    The materials that the video follows from 2021 are here, only use those if you need to, otherwise please continue below.

    "},{"location":"exercises/azure_vm_walkthrough/#creating-a-windows-virtual-machine","title":"Creating a Windows Virtual Machine","text":"

    This section is based on Windows, and is recommended for everyone as it is the easy way to connect to remote machine. For an equivalant exercise based on Linux, scroll down. If at any point, or if you are exploring, you can't seem to get the configuration correct (or there is a validation error you can't fix), starting over will not create any resources or incur charges. Go back to step 1 below.

    "},{"location":"exercises/azure_vm_walkthrough/#requirements-for-windows-vms","title":"Requirements for Windows VMs","text":"

    To connect to a Windows VM desktop, it's recommend you use the Microsoft Remote Desktop client.

    "},{"location":"exercises/azure_vm_walkthrough/#1-selecting-the-resource-template","title":"1. Selecting the Resource Template","text":"

    In the Azure Portal open the top left menu, and click \"+ Create a resource\" option (the first option)

    In the create resource search box, type \"data science virtual machine\" and press enter to search. It will present you with some of the suggested options as you type but please search.

    In the options select Data Science Virtual Machine - Windows 2022 (preview) ** (note there is also a 2019 version but they seem very similar and will both work for this exercise )

    Click \"Create\" ( note: do not click the \"start with a pre-set configuration\" option )

    "},{"location":"exercises/azure_vm_walkthrough/#2-configure-the-vm-using-the-azure-portal","title":"2. Configure the VM using the Azure Portal","text":"

    The resource creation forms work as described in the Azure Portal but since we used a pre-set configuration some of the values will be completed.

    "},{"location":"exercises/azure_vm_walkthrough/#basics","title":"Basics","text":"
    1. Subscription should be \"MSU Cloud Computing Fellowship\"

    2. Resource Group should be your CF resource group (the one with your netid). The default is to create a new resource group but participants aren't allow to create their own group, you must select the resource group with your netid.

    3. Virtual machine name Name: You could name it anything that is unique in the region you choose, but to help keep track of your resources, I strongly suggest using a name that includes your netid and the purpose of this VM: dsvm-netid-exercise2

    one option is to combine the project or activity (e.g. ), your net id, and some description of what you are doing. In the name above, replace \"netid\" with your own MSU netid. - Note that different resources have different naming restrictions. For example VMs the rules are \"can be almost anything, but Azure resource names cannot contain special characters \\/\"\"[]:|<>+=;,?*@&, whitespace, or begin with '_' or end with '.' or '-' \" - Note if you have an existing VM with this name, add a number 2 or other suffix. We will delete this VM and create something more suitable in the future.

    1. Region Select any region or use the deafult. In the future, when creating resources (like VMs) that access your storage account, should use the same region as that. For this exercise it doesn't matter as we will be deleting these resources. For me, the default was \"(US) Central US\"

    2. Availability Options Leave the default (\"Availability Zone\")

    3. Availability Zone Leave the default ( \"Zones 1\")

    4. Security Type You must change this value to \"Standard\" security type. The \"Trusted\" security option is for servers or production machines.

    5. Image should be \"Data Science Virtual Machine - windows...\" if this is changed you may have to re-enter some info again.
    6. VM Architecture Leave as the default x64 (Intel compatible)
    7. Azure Spot Instance leave unchecked.
    8. Size You can leave the size that is currently selected. NOTES: This is how you select the specifications for CPU and memory. The size you for this exercise doesn't matter for the outcome, but it will show prices which may be interesting. If you click this drop-down menu you may see some other sizes and prices. The Monthly price assumes 24 hour/day operation. Your price to experiment will often be less than $1.00

    9. Administrator Account Just like you need to log-in to your own computer, you must create a user account for the VM. Select a User name and account that you will easily remember, because you will need it to log-in to the new VM.

      • username : use any user name you will easily remember. I use my netid so I can always remember.
      • password : this must be a complex password, but use something you can remember, or copy/paste from another program. Do not use your MSU password or any other passwords you use
    10. Licensing Unlike Linux, Windows requires a license, and this option are for organization with an arrangement with Azure. Leave this box unchecked and Azure will add the extra charges (a few cents per hour) for the use of Windows. If you use a Windows VM for your research, you may be able to use an MSU license.
    "},{"location":"exercises/azure_vm_walkthrough/#disks","title":"Disks","text":"

    Leave these as the defaults.

    I want to point out one option that \"Delete with VM.\" We will talk about this in the future, but for now it's like purchasing the computer and the disk inside separately. In this case we are just testing so we will delete everything after we are done, but in practice there are reasons for keeping the disk around after you delete the VM so you may sometimes want to uncheck this box

    "},{"location":"exercises/azure_vm_walkthrough/#networking","title":"Networking","text":"

    You must create a 'virtual network' for you VM to be connected to (note historically Azure created this for you). Click \"create new\" to open the new network form.

    Create Virtual network

    1. enter a Name : suggest adding \"-vnet\" to your proposed VM name. For me this was \"dsvm1-billspat-ccf23-vnet
    2. leave all the rest of the settings as-is with the defaults
    3. click the [OK] button at the bottom of this form.
    "},{"location":"exercises/azure_vm_walkthrough/#other-settings","title":"Other Settings","text":"

    For this exercise we'll be using the default values for almost all the pages except for Basics page. However you are encouraged to look through these options to see what is involved in creating a virtual machine. The Azure VM documentation covers many of them. For example a VM requires several networking components. The good news is that Azure will name and create these for you, which will see.

    "},{"location":"exercises/azure_vm_walkthrough/#tags","title":"Tags","text":"

    For this exercise, using tags will be essential for identifying which components go to which VM. If you need more information see session 2 page for readings about tags. On the tags section, do the following:

    1. Click \"tags\" in the top row of options (just before 'review and create')
    2. In the first row, For Name, type activity and for the Value type session2 vm or similar unique value.
    3. Optionally, in an additional row, create another tag with Name created by and for Value put your netid. This kind of tag can be essential when you are sharing cloud accounts with other members of your work group, so that others in your group may identify who created the resources.
    "},{"location":"exercises/azure_vm_walkthrough/#review-and-create","title":"Review and Create","text":"
    1. click \"review and create\" at the bottom of the screen.

    If there are errors the form name will have a red dot next to it. Go back to that form and see what may be the issue.

    If the Validation passed, it will display the approximate hourly cost to use this VM. Mine says 0.1920 USD/hr

    Click \"Create\" and the deployment will start. It will take at most 15 minutes.

    Now, please skip down the the Viewing VM Resources section below

    "},{"location":"exercises/azure_vm_walkthrough/#optional-creating-a-linux-virtual-machine","title":"Optional: Creating a Linux Virtual Machine","text":"

    This sections is nearly identical to the section above with Windows, but uses Ubuntu Linux, and does not use a graphical interface (although with some work this is possible).

    "},{"location":"exercises/azure_vm_walkthrough/#requirements","title":"Requirements","text":"

    To connect to Linux you need an terminal or command line interface with an ssh client software. If you have used the MSU HPC, this is the same method for connection.

    "},{"location":"exercises/azure_vm_walkthrough/#creating-a-linux-virtual-machine","title":"Creating a Linux Virtual Machine","text":"

    If at any point, or if you are exploring, you can't seem to get the configuration correct (or there is a validation error you can't fix), starting over will not create any resources or incur charges. Go back to step 1 below.

    "},{"location":"exercises/azure_vm_walkthrough/#1-selecting-the-resource-template_1","title":"1. Selecting the Resource Template","text":"

    In the Azure Portal open the top left menu, and click \"+ Create a resource\" option (the first option)

    In the create resource search box, type \"data science virtual machine\"

    In the options select Data Science Virtual Machine - Ubuntu 20.04

    "},{"location":"exercises/azure_vm_walkthrough/#2-configure-the-vm-using-the-azure-portal_1","title":"2. Configure the VM using the Azure Portal","text":"

    The resource creation forms work as described in the Azure Portal but since we used a pre-set configuration some of the values will be completed.

    "},{"location":"exercises/azure_vm_walkthrough/#basics_1","title":"Basics","text":"
    1. The Subscription should be \"Cloud Computing Fellowship\" and resource group should be your CF resource group (with your netid).

    2. Virtual machine name Name: must be unique in the region. I suggest using your netid to name it, and add abbreviations for what you are creataing and for which activity. For example dsvm1-netid-ccf23 Use your actual NetId , for example \"dsvm1-billspat-ccf23\"

    Note that different resources have different naming restrictions. For example VMs the rules are \"can be almost anything, but Azure resource names cannot contain special characters \\/\"\"[]:|<>+=;,?*@&, whitespace, or begin with '_' or end with '.' or '-' \"

    Note if you have an existing VM with this name, add a number 2 or other suffix. We will delete this VM and create something more suitable in the future.

    1. Region You may select \"(US) North Central US\" or any other US-based region.
    2. Availability Options select \"No infrastructure Redundancy required\" this option is for critical infrastructure that needs to withstand a serious outage (e.g. if a hurricane affects a data center). You may also see an \"availability zone\" option appear (perhaps with an error message \"The value must not be empty\"). Selecting \"\"No infrastructure Redundancy required\" in the availability zone will remove the \"availability zone\" field and error message.
    3. Security Type Leave as 'standard'
    4. Image should be \"Data Science Virtual Machine - Unbuntu..\" if this is changed you may have to select it again from the list. Any Linux image is fine for this tutorial as
    5. VM Architecture leave as x64 (Intel processor compatible)
    6. Run with Azure Spot discount leave unchecked.
    7. Size You can leave the size that is currently selected, which is based on the pre-set configuration from the previous step. This is how you select the specifications for CPU and memory. The size you for this exercise doesn't matter for the outcome, but it will show prices which may be interesting. If you click this drop-down menu you may see some other sizes and prices. The Monthly price assumes 24 hour/day operation. Your price to experiment will often be less than $1.00 Click \"see all sizes\" if you are feeling adventurous -- there are maybe 100 options. (click the [x] in upper right to close the size selector window)
    8. Administrator Account Just like you need to log-in to your own computer, you must create a user account for the VM.
    9. Authentication Type For the purpose of this exercise, select \"password\" SSH Keys are strongly recommened but to keep this simple we will use a password.
    10. UserName Select a User name and account that you will easily remember, because you will need it to log-in to the new VM. You can use your MSU NetID for your username so it's easy to remember.

    11. password : something you can remember, but is complex to be secure. Do not use your MSU password or any other passwords you use

    "},{"location":"exercises/azure_vm_walkthrough/#disks_1","title":"Disks","text":"

    You can leave the defaults for this page.

    "},{"location":"exercises/azure_vm_walkthrough/#networking_1","title":"Networking","text":"

    You must create a 'virtual network' for you VM to be connected to (note historically Azure created this for you). Click \"create new\" to open the new network form.

    Create Virtual network

    1. enter a Name : suggest adding \"-vnet\" to your proposed VM name. For me this was \"dsvm1-billspat-ccf23-vnet
    2. leave all the rest of the settings as-is with the defaults
    3. click the [OK] button at the bottom of this form.
    "},{"location":"exercises/azure_vm_walkthrough/#other-options","title":"other options","text":"

    For this exercise we'll be using the default values for almost all the pages, except for 'Basics' , 'Networking' and . However you are encouraged to look through these options to see what is involved in creating a virtual machine. The Azure VM documentation covers many of them. For example a VM requires several networking components. The good news is that Azure will name and create these for you, which will see.

    "},{"location":"exercises/azure_vm_walkthrough/#tags_1","title":"Tags","text":"

    Using the Azure portal to create VM creates several resources (up to 12). Using tags will be essential for identifying which components go to which VM. This is the metadata associated with these resources. I suggest using a tag like \"activity\" to indicate which of our activities was used to create these resources.

    1. Click \"tags\" in the top row of options (just before 'review and create')
    2. In the first row, For Name, type activity and for the Value type session2
    3. click \"review and create\"
    "},{"location":"exercises/azure_vm_walkthrough/#review-and-create_1","title":"Review and Create","text":"

    If there are errors the form name will have a red dot next to it. Go back to that form and see what may be the issue.

    If the Validation passed, it will display the approximate hourly cost to use this Linux VM. Mine says 0.0730 USD/hr

    Click \"Create\" and the deployment will start. It will take at most 15 minutes.

    Linux Users continue to the next section

    "},{"location":"exercises/azure_vm_walkthrough/#viewing-vm-resources-in-your-resource-group-windows-and-linux","title":"Viewing VM Resources in your Resource group (Windows and Linux)","text":"

    You have a few options now. You can wait for the deployment to complete in the portal. When it's ready, the Azure portal will display a message and a link to \"go to resource.\"

    However you can also go to the page that lists the items in your resource group to find and explore while the deployment is in progress.

    1. Open your resource group in the portal:
      1. click the portal menu on the top left, and select \"resource groups\"
    2. From the list, select your CF21 group.
    3. When the deployment is finished, you should see several new resources
      • They will have the same name prefix \"CF21netid-dsvm\" but may have a suffix indicating the kind of resource (e.g. CF21-netid-dsvm1-ip
      • The second column is the \"type\" which helps identify what they are

    click for a large view in a new tab/window

    1. Select the item with type \"virtual machine\" and click on the name to open its resource page (for example, cf21-billspat-dsvmtest item in the screenshot above)
    "},{"location":"exercises/azure_vm_walkthrough/#the-vm-resource-page","title":"The VM Resource Page","text":"

    To see the details for your virtual machine, click the VM in your resource group if you haven't already.

    click for larger view

    Note that the Azure portal will show a few errors/warnings if the deployment is not complete. You may see a warning that the 'agent' in the VM is not working, but you can ignore it. It will go away when the VM configuration is complete.

    There are many details here but some immediate things to notice:

    "},{"location":"exercises/azure_vm_walkthrough/#connecting","title":"Connecting","text":""},{"location":"exercises/azure_vm_walkthrough/#connecting-to-a-windows-vm-using-remote-desktop-protocol-rdp-client","title":"Connecting to a Windows VM using Remote Desktop Protocol (RDP) client","text":"

    You may connect to this VM running the Windows operating system with either graphical desktop, a command line connection, or both.

    Every VM created in Azure has an \"IP Adress\" or internet address, and we use this to connect to.

    The following Azure documentation describes how to connect to a Windows VM: https://docs.microsoft.com/en-us/azure/virtual-machines/windows/connect-logon

    Here are more detailed instructions:

    There is a 'connect' link on the left side in the \"Settings\" section of the left menu.

    The connect pane looks something like this:

    Connect with RDP (remote desktop protocol) is a Microsoft method for connecting to the graphical desktop. For Mac/Linux requires additional software (mentioned at the beginning of this page).

    This is because we are using a temporary certificate but it is secure. Click \"Yes\"

    Starting up the VM Once you connect for the first time, the Windows VM will provision the VM user account and will install things during and after start-up. Feel free to close any windows. Once the installations are finished, you may use the machine as you would any other windows computer. You can start Jupyter notebooks to work with Python. Previous version of the Azure Data Science Virtual Machine has Rstudio installed on it, but the latest version only seems to have the base R interface.

    We will cover how to transfer code and files to a VM in a later session. If you are comfortable with using the command line, you can use git clone... to download code to run.

    Explore to see what is already pre-installed on this VM. If you start with a standard version of Windows, you will have to install your own software.

    When you finished with your remote session you may simply close the remote windows (leaving the VM running. See below for how to turn it off and delete it.

    Optional: Connect to the Windows DSVM with ssh

    NOTE In 2023 the 'connect' option in the Azure portal has a button beneath the RDP section that says \"more ways to connect.\" Inside this is a \"native ssh\" section. This only have instructions for how to connect with SSH. there is no special file to download like RDP.

    This windows machine has an SSH Server running, and the security settings from the pre-configured version allow connections from SSH. If you are familiar with ssh and the command line, you may start the CMD.EXE on your windows computer, or the Mac Terminal, and enter ssh <username>@<ipaddress>

    Where the username is the user you put for your VM when you created it, and the Public IP address is listed on the VM Resource page.

    This is similar to how you connect to the MSU HPC, if you are HPC user.

    You will be asked to add the host to your list hosts, and enter the password you used when you created the VM.

    When you log-in you will be connected to the Windows command prompt (e.g. C:\\Users\\username>

    To Exit, type exit at the command prompt.

    Next Steps: For information on turning off the VM and for eventually deleting the VM, scroll down below the Linux section as these operations are the same in the Azure portal for Linux or Windows virtual machines.

    "},{"location":"exercises/azure_vm_walkthrough/#connecting-to-a-linux-vm-using-ssh","title":"Connecting to a Linux VM using SSH","text":"

    We will connect and use this remote VM running the Linux operating system with a command line connection. It is possible to use a graphical connection but requires additional setup beyond the scope of the short exercise.

    In addition this assumes you have some familiarity with using the command line and starting your terminal program.

    There is a 'connect' link above the 'essentials' list, and a connect link on the left side - they both go to the same place.

    Connect with SSH

    this is the standard method of connecting with ssh, but we've included as much detail as possible for those who are new to using ssh.

    You may use the machine as you would any other linux computer. For more information about what software is installed, see We will cover how to transfer code and files to a VM in a later session.

    When you finished with your remote session you may simply close the remote windows (leaving the VM running. See below for how to turn it off and delete it.

    "},{"location":"exercises/azure_vm_walkthrough/#starting-and-stopping-the-vm-both-windows-and-linux","title":"Starting and Stopping the VM (both Windows and Linux)","text":"

    There are three ways to \"stop\" or turn off a VM. 1. when connected to it, e.g. in the remote desktop, use Windows to turn it off. The VM is then \"stopped.\" In a Linux ssh session you may use a command like sudo shutdown -h now When the Operating system is shut off, and hence tthe VM is not running, but it is still \"allocated.\" When you turn it back on, it will come on immediately. 1. Use the Azure portal to \"stop\" the VM which shuts down Windows (gracefully if possible) and 'deallocates' the VM. Restarted the VM appears to be the same process, but Azure must allocate resources first to run it, then power it up. This is cheaper then the first method in the long run 1. Delete it.

    "},{"location":"exercises/azure_vm_walkthrough/#stopping-deallocating-the-vm-with-the-portal","title":"Stopping (deallocating) the VM with the Portal:","text":"
    1. Go to the resource page for the VM, if you are not already.
    2. If you are just entering the portal, find your resource group, find the VM in your resource group (identified as a VM in the \"type\" column of the list of resources), and click to open the resource page.
    3. The Status field near the top of this screen will indicate running or stopped.
    4. Find the Start and Stop buttons near the top of this screen and click \"stop\" if the machine is running.
    5. There is a warning about losing your IP address, with a check box to reserve it.
      • If you plan on deleting the VM now, click \"ok\"
      • If you plan on restarting the VM and reconnecting, first check the box \"reserve the IP\" then click OK
      • The default is to use a \"dynamic\" address which is assigned every time you turn on the VM
      • When using a dynamic address, you must copy/paste the ip address, or re-download the RDP connection file everytime you restart the machine
      • the solution is to use a \"Static IP\" either when you create the VM, or assigning one after the VM is created. and checking the box does so.
      • you can also convert to a static IP with the portal, but it is not a straightforward process, see https://docs.microsoft.com/en-us/azure/virtual-network/virtual-networks-static-private-ip-arm-pportal
      • Pricing for a static ip is here: https://azure.microsoft.com/en-us/pricing/details/ip-addresses/ which as of now is $0.0036/hour which is charged even if the VM is turned off. That is approx $2.70/month
    6. It's a good idea to leave VMs in a \"stopped (deallocated)\" state if you are not using them for computations or providing a service, just as you would turn off or put your laptop to sleep. The main reason for this is for security.
    "},{"location":"exercises/azure_vm_walkthrough/#deleting-the-resources-both-windows-and-linux","title":"Deleting the Resources (both Windows and Linux)","text":"
    1. Open the Resource group as above
    2. When creating resources using the template as we did above, the resources associated with this VM will all start with the same prefix, so they are easy to identify. Select them with checkboxes, and click the \"Delete\" button which is on the top right of the screen (not the \"delete resource group\" button)
    3. If it's not obvious which resources are all included, you may also use the \"tag\" you created to filter what is listed and only show those with the same \"tag.\" For more information see https://docs.microsoft.com/en-us/azure/azure-portal/manage-filter-resource-views . If you add filter on tag, then you may select all the items that are shown, and delete those.
    4. after selecting confirm the deletion by typing \"yes\"

    Creating resources just to delete them may seem wasteful however we will cover how to save a \"snapshot\" and/or \"image\" of your VM's disk so that you may re-use any work to install and configure software withtout incurring charges.

    "},{"location":"exercises/azure_vm_walkthrough/#more-references","title":"More References","text":"

    Azure has very abbreviated versions of this exercise if you would like another perspective. They assume you can create your own resource group (which you don't have the ability to do currently in the fellowship)

    https://docs.microsoft.com/en-us/azure/machine-learning/data-science-virtual-machine/overview#next-steps

    **Data Science Use Case Tutorials from Azure: **

    If you follow these, just remember to delete the resources you create when you are done exploring

    Return to the Session 2 page

    "},{"location":"exercises/azure_windows_vm_walkthrough/","title":"Exercise: Creating a Windows Virtual Machine (VM)","text":"

    This is a previous version of a windows-only VM walk through from 2020, kep for historical reasons

    Please use our updated version that covers both Windows and Linux

    Link to Video for this exercise on mediaspace.msu.edu (requires log-in)

    "},{"location":"exercises/azure_windows_vm_walkthrough/#about","title":"About","text":"

    This is an exercise and introduction to creating Virtual Machines (VMs) and related resources using the Azure Portal. This exercise assumes you understand how to use the Azure Portal, which is covered in the Azure Portal Walkthrough. In addition it's helpful to know what a virtual machine is but it's not crucial to complete the exercise. For more information on VMs see session 2).

    We will use a pre-configured virtual machine with software already installed. When creating a VM you can use an Azure template and there are many of these. The Data Science Virtual Machine (DSVM) from Azure has R, Python and many data science and statistical libraries available. For more information about the Azure DSVM see https://azure.microsoft.com/en-us/services/virtual-machines/data-science-virtual-machines/

    "},{"location":"exercises/azure_windows_vm_walkthrough/#requirements","title":"Requirements","text":"

    You need an account in azure with an active subscription, and a resource group of your own to work in. Fellows have these things provided.

    "},{"location":"exercises/azure_windows_vm_walkthrough/#creating-and-connecting-to-a-windows-virtual-machine","title":"Creating and Connecting to a Windows Virtual Machine","text":""},{"location":"exercises/azure_windows_vm_walkthrough/#requirements_1","title":"Requirements","text":"

    To connect to a Windows VM desktop, it's recommend you use the Microsoft Remote Desktop client.

    "},{"location":"exercises/azure_windows_vm_walkthrough/#creating-a-windows-virtual-machine","title":"Creating a Windows Virtual Machine","text":"

    If at any point, or if you are exploring, you can't seem to get the configuration correct (or there is a validation error you can't fix), starting over will not create any resources or incur charges. Go back to step 1 below.

    "},{"location":"exercises/azure_windows_vm_walkthrough/#1-selecting-the-resource-template","title":"1. Selecting the Resource Template","text":"

    In the Azure Portal open the top left menu, and click \"+ Create a resource\" option (the first option)

    In the create resource search box, type \"data science virtual machine\"

    In the options select **Data Science Virtual Machine - Windows 2019 **

    The \"Plans\" section has a description of the template if you would like to know more.

    Click the \"start with a pre-set configuration\" option.

    "},{"location":"exercises/azure_windows_vm_walkthrough/#2-select-the-pre-set-configuration","title":"2. select the pre-set configuration","text":"

    These configurations help to select your VM size based on your activity. We will use the default options and click \"Continue to create a VM\"

    The options do not affect the outcome of the exercise so at this step explore each option

    Click \"Continue to create a VM\"

    "},{"location":"exercises/azure_windows_vm_walkthrough/#3-configure-the-vm-using-the-azure-portal","title":"3. Configure the VM using the Azure Portal","text":"

    The resource creation forms work as described in the Azure Portal but since we used a pre-set configuration some of the values will be completed.

    "},{"location":"exercises/azure_windows_vm_walkthrough/#basics","title":"Basics","text":"
    1. The Subscription should be \"Cloud Computing Fellowship\" and resource group should be your CF resource group (with your netid). As we create additional resource groups for this

    2. Virtual machine name Name: CF21-netid-dsvmtest One option is to combine the project (e.g. the fellowship), your net id, and some description of what you are doing. In the name above, replace \"netid\" with your own MSU netid.

    Note that different resources have different naming restrictions. For example VMs the rules are \"can be almost anything, but Azure resource names cannot contain special characters \\/\"\"[]:|<>+=;,?*@&, whitespace, or begin with '_' or end with '.' or '-' \"

    Note if you have an existing VM with this name, add a number 2 or other suffix. We will delete this VM and create something more suitable in the future. 1. Region Select \"(US) North Central US\" 1. Availability Options select \"No infrastructure Redundancy required\" this option is for critical infrastructure that needs to withstand a serious outage (e.g. if a hurricane affects a data center). You may also see an \"availability zone\" option appear (perhaps with an error message \"The value must not be empty\"). Selecting \"\"No infrastructure Redundancy required\" in the availability zone will remove the \"availability zone\" field and error message. 1. Image should be \"Data Science Virtual Machine - windows...\" if this is change you may 1. Azure Spot Instance leave unchecked. 1. Size You can leave the size that is currently selected. This is how you select the specifications for CPU and memory. The size you for this exercise doesn't matter for the outcome, but it will show prices which may be interesting. If you click this drop-down menu you may see some other sizes and prices. The Monthly price assumes 24 hour/day operation. Your price to experiment will often be less than $1.00 1. Administrator Account Just like you need to log-in to your own computer, you must create a user account for the VM. Select a User name and account that you will easily remember, because you will need it to log-in to the new VM. * username : use any user name you will easily remember, perhaps your netid * password : something you can remember, but is complex to be secure. Do not use your MSU password or any other passwords you use 1. Licensing Unlike Linux, Windows requires a license, and this option are for organization with an arrangement with Azure. Leave this box unchecked.

    "},{"location":"exercises/azure_windows_vm_walkthrough/#disks-and-other-settings","title":"Disks and Other Settings","text":"

    For this exercise we'll be using the default values for almost all the pages except for Basics page. However you are encouraged to look through these options to see what is involved in creating a virtual machine. The Azure VM documentation covers many of them. For example a VM requires several networking components. The good news is that Azure will name and create these for you, which will see.

    "},{"location":"exercises/azure_windows_vm_walkthrough/#tags","title":"Tags","text":"

    Using tags will be essential for identifying which components go to which VM. This is the metadata associated with these resources. I suggest using a tag like \"activity\" to indicate which of our activities was used to create these resources.

    1. Click \"tags\" in the top row of options (just before 'review and create')
    2. In the first row, For Name, type activity and for the Value type session2
    3. click \"review and create\"
    "},{"location":"exercises/azure_windows_vm_walkthrough/#review-and-create","title":"Review and Create","text":"

    If there are errors the form name will have a red dot next to it. Go back to that form and see what may be the issue.

    If the Validation passed, it will display the approximate hourly cost to use this VM. Mine says 0.1920 USD/hr

    Click \"Create\" and the deployment will start. It will take at most 15 minutes.

    "},{"location":"exercises/azure_windows_vm_walkthrough/#4-the-resources","title":"4. The Resources","text":"

    While the deployment is in progress you may explore the operation details or click any of the resources that have been created.

    1. Open your resource group in the portal:
      1. click the portal menu on the top left, and select \"resource groups\"
    2. From the list, select your CF21 group.
    3. When the deployment is finished, you should see several new resources
      • They will have the same name prefix \"CF21netid-dsvm\" but may have a suffix indicating the kind of resource (e.g. CF21-netid-dsvm1-ip
      • The second column is the \"type\" which helps identify what they are

    click for a large view in a new tab/window

    1. Select the item with type \"virtual machine\" and click on the name to open its resource page (for example, cf21-billspat-dsvmtest item in the screenshot above)
    "},{"location":"exercises/azure_windows_vm_walkthrough/#5-the-vm-resource-page","title":"5. The VM Resource Page","text":"

    To see the details for your virtual machine, click the VM in your resource group if you haven't already.

    click for larger view

    There are many details here but some immediate things to notice:

    "},{"location":"exercises/azure_windows_vm_walkthrough/#6-connecting","title":"6. Connecting","text":"

    You may connect to this VM running the Windows operating system with either graphical desktop, a command line connection, or both.

    The following Azure documentation describes how to connect to a Windows VM: https://docs.microsoft.com/en-us/azure/virtual-machines/windows/connect-logon

    Here are more detailed instructions:

    There is a 'connect' link above the 'essentials' list, and a connect link on the left side - they both go to the same place.

    Connect with RDP (remote desktop protocol) is a Microsoft method for connecting to the graphical desktop. For Mac/Linux requires additional software (mentioned at the beginning of this page).

    This is because we are using a temporary certificate but it is secure. Click \"Yes\"

    Once you connect, you may see Windows starting up and installing things. Feel free to close any windows. Once the installations are finished, you may use the machine as you would any other windows computer. If you type Rstudio in the search box, you may launch an Rstudio session on this remote computer. It also has Python, many python libs and Jupyter notebook.

    We will cover how to transfer code and files to a VM in a later session.

    When you finished with your remote session you may simply close the remote windows (leaving the VM running. See below for how to turn it off and delete it.

    Optional: Connect to the Windows DSVM with ssh

    This windows machine has an SSH Server running, and the security settings from the pre-configured version allow connections from SSH. If you are familiar with ssh and the command line, you may start the CMD.EXE on your windows computer, or the Mac Terminal, and enter ssh <username>@<ipaddress>

    Where the username is the user you put for your VM when you created it, and the Public IP address is listed on the VM Resource page.

    This is similar to how you connect to the MSU HPC, if you are HPC user.

    You will be asked to add the host to your list hosts, and enter the password you used when you created the VM.

    When you log-in you will be connected to the Windows command prompt (e.g. C:\\Users\\username>

    To Exit, type exit at the command prompt.

    "},{"location":"exercises/azure_windows_vm_walkthrough/#7-starting-and-stopping-the-vm","title":"7. Starting and Stopping the VM","text":"

    There are three ways to \"stop\" or turn off a VM. 1. when connected to it, e.g. in the remote desktop, use Windows to turn it off. The VM is then \"stopped.\" The VM is not running, but it is still \"allocated.\" When you turn it back on, it will come on immediately. 1. Use the Azure portal to \"stop\" the VM which shuts down Windows (gracefully if possible) and 'deallocates' the VM. Restarted the VM appears to be the same process, but Azure must allocate resources first to run it, then power it up. This is cheaper then the first method in the long run 1. Delete it.

    Stopping (deallocating) the VM with the Portal:

    1. Go to the resource page for the VM, if you are not already.
    2. If you are just entering the portal, find your resource group, find the VM in your resource group (identified as a VM in the \"type\" column of the list of resources), and click to open the resource page.
    3. The Status field near the top of this screen will indicate running or stopped.
    4. Find the Start and Stop buttons near the top of this screen and click \"stop\" if the machine is running.
    5. There is a warning about losing your IP address, with a check box to reserve it.
      • If you plan on deleting the VM now, click \"ok\"
      • If you plan on restarting the VM and reconnecting, first check the box \"reserve the IP\" then click OK
      • The default is to use a \"dynamic\" address which is assigned every time you turn on the VM
      • When using a dynamic address, you must copy/paste the ip address, or re-download the RDP connection file everytime you restart the machine
      • the solution is to use a \"Static IP\" either when you create the VM, or assigning one after the VM is created. and checking the box does so.
      • you can also convert to a static IP with the portal, but it is not a straightforward process, see https://docs.microsoft.com/en-us/azure/virtual-network/virtual-networks-static-private-ip-arm-pportal
      • Pricing for a static ip is here: https://azure.microsoft.com/en-us/pricing/details/ip-addresses/ which as of now is $0.0036/hour which is charged even if the VM is turned off. That is approx $2.70/month
    6. It's a good idea to leave VMs in a \"stopped (deallocated)\" state if you are not using them for computations or providing a service, just as you would turn off or put your laptop to sleep. The main reason for this is for security.
    "},{"location":"exercises/azure_windows_vm_walkthrough/#8-deleting-the-resources","title":"8. Deleting the Resources","text":"
    1. Open the Resource group as above
    2. When creating resources using the template as we did above, the resources associated with this VM will all start with the same prefix, so they are easy to identify. Select them with checkboxes, and click the \"Delete\" button which is on the top right of the screen (not the \"delete resource group\" button)
    3. If it's not obvious which resources are all included, you may also use the \"tag\" you created to filter what is listed and only show those with the same \"tag.\" For more information see https://docs.microsoft.com/en-us/azure/azure-portal/manage-filter-resource-views . IF you add filter on tag, then you may select all the items that are shown, and delete those.
    4. after selecting confirm the deletion by typing \"yes\"
    "},{"location":"exercises/exercise_budget_alert/","title":"MSU Cloud Computing Fellowship: Costs and Budgets with Microsoft Azure","text":"

    (Almost) everything you do in Azure has a cost, and costs for resources often acrue over time, wether the resource is in use or not. This is a short excercise to recieve an email when you have spent a certain amount of money. This can be valuable if you are experimenting and forget to delete a resource that you no longer need.

    For this work, You must first have a 'budget' in your resource group. We created a budget for 2022 for all fellowship participants that you can use for creating alerts.

    If you have not yet, please go through the \"Intro to the Azure portal\" exercise for more context about what we are doing.

    "},{"location":"exercises/exercise_budget_alert/#background","title":"Background","text":"

    See the \"costs\" section in the topics for details.

    In Azure you can set a 'budget' for a single resource (like a virtual machine), your whole resource group, or we could set on for the whole fellowship. However setting a budget doesn't stop you from spending anything or invoke any action.

    Once you set a budget or maximum dollar amount you'd like to spend, you need to to then add either actions or alerts when some threshold within that budget is reached.

    We have set budgets for your resource group in the fellowship. However you need to now set an alert to send you an email when you reach a spending amount. You can set multiple alerts. for example, we will set an alert when you reach a certain threshold.

    For details about this service, see the Azure Cost Management + Billing documentation. This specific exercise works with budgets and assumes there is one in your resource group. If you do not have a budget on your account, or if you'd like to create a new kind of budget please contact us and we will assist you. However if you are comfortable with Azure concepts, see this advanced [Azure Budget Tutorial

    https://learn.microsoft.com/en-us/azure/cost-management-billing/costs/tutorial-acm-create-budgets

    "},{"location":"exercises/exercise_budget_alert/#steps-to-add-a-cost-alert-to-an-existing-budget-your-resource-group","title":"Steps to add a \"cost alert\" to an existing budget your resource group.","text":"

    Find the Premade Budget

    Add an 'alert' to that budget

    You may add additional alerts if you want to be reminded at different thresholds of spending, e.g. 25%, 50%, 80%. One advantage to setting a low threshold like 20% of your budget is to help you learn how much things cost or to be alerted if there are resources you've created but didn't realize they still existed or were costing anything.

    I hope these instructions were clear but again, any questions please contact us using email or MS Teams.

    "},{"location":"exercises/exercise_create_storage_account/","title":"Creating a \"Storage Account\" with the Azure Portal","text":"

    (From: Session 1 - Introduction)

    This is a good activity to explore the Azure portal by creating a new resource. Storage accounts do not accrue much cost until you fill them up with data. Please review the exercise Azure Portal Walk-through if you haven't.

    We have not talked about Cloud storage, however you don't need to know about Cloud storage to complete this tutorial. This is simply an exercise to see how you would create something using the Azure portal, and Cloud storage is a benign (and very inexpensive) resource to use an example.

    Note that a \"storage account\" is not the same as \"disk\" you will see when you create a virtual machine. We will discuss the difference in detail in the session on storage.

    "},{"location":"exercises/exercise_create_storage_account/#requirements","title":"Requirements:","text":"

    All members of the current Cloud Computing Fellowship cohort have these things.

    "},{"location":"exercises/exercise_create_storage_account/#creating-a-storage-account-step-by-step","title":"Creating a storage account step-by-step.","text":""},{"location":"exercises/exercise_create_storage_account/#first-step-accessing-a-storage-account-template","title":"First Step: Accessing a Storage Account Template.","text":"
    1. Log-in to the Azure portal if you have not already. (https://portal.azure.com)
    2. Click the menu (top left, three horizontal bars).
    3. Select Home from the menu. (This is to ensure we all have the same view)
    4. Select Create a Resource in the upper left screen under Azure Services. Yes we could have click \"storage accounts\" instead but we want to demonstrate how to use the next screen...
      • Note: The current screen is where you can create almost any service Azure offers, and additional services created by third-parties or companies that are not Microsoft. When you are starting, ensure you are creating a service from Microsoft (we'll show you how in the next step)
    5. In the lower search bar (labeled Search services and marketplace), type Storage account Note that \"storage\" alone lists many other kinds of resources.
    6. You will see a list of several services. Select the first one labeled Storage account (icon looks like a green spreadsheet).
      • Note: The description of the service will say the provider, which should be Microsoft, if not go back using the back button and search for storage account again.
    7. Click Create under Storage account.
    "},{"location":"exercises/exercise_create_storage_account/#second-step-setting-up-the-storage-account","title":"Second Step: Setting up the Storage Account.","text":"

    Note: The Azure resource creation screens mostly work like this: there are so many settings Azure has split these up into groups which are listed horizontally across the top. You may work though these by clicking each group, OR finish a screen, and click \"Next..\" button on the bottom of the form. At any time you may click \"Review and Create\" and if you've missed some crucial setting, Azure will not let you create the resource without fixing it. We will go page-by-page for these settings

    1. Basics:

      1. Subscription: Cloud Computing Fellowship
      2. Resource Group: Select your resource group provided to you.
      3. Storage Account Name:

        • some resources have restrictions on naming. Next to storage account is an \"i\" in a circle that has more information. For storage accounts, they must be unique in region, and only numbers and lowercase letters are allowed. I don't know if Non-US letters are allowed (e.g.\u7bb1)
        • use your MSU ID (NetID) when you name things so help me keep track and also to help find a name that is unique. So, replace \"NETID\" with your MSU NetID here: \"stNETIDccf22\" e.g. stbillspatccf22
        • If you are repeating this tutorial, simply add a \"2\" or \"B\" e.g. \"stbillspatccf22B\" We can delete these experiments later.
      4. Region (Location): Change this location to US Central. Click in here to see the options. In practice, pick the region that is closest to you or where your data will be moving to (e.g. North Central US for MSU) but there are other considerations.

      5. Performance: Standard
      6. Redundancy: change from GeoRedundant to \"Locally Redundant\" (LRS). We won't see a difference, and LRS is cheaper. Beneath that, leave the \"make read access....\" box checked.
      7. Click next...Advanced
    2. Advanced:

      • Leave all of these settings as-is. Click next...
    3. Networking:
      • Leave all of these settings as-is. Click next...
    4. Data Protection:
      • Leave all of these settings as is. These settings allow you to recover files up to 7 days after deleting or over-writing. click next...
    5. Encryption:
      • Leave all of these settings as is. click next...
    6. Tags:
      • Tags are optional but eventually highly recommended. For now you can leave them blank.
    7. Review and create
      • review gives you a chance to double check your settings before committing
      • click Create
    "},{"location":"exercises/exercise_create_storage_account/#third-step-deploying-the-storage-account","title":"Third Step: Deploying the Storage Account","text":"
    1. Deployment
      • Azure calls the process of creating cloud resources a \"deployment.\" This term comes from the software engineering process of first \"building\" an application or utility (or \"compiling\" which is often not necessary for scripting languages like Python or R) and then moving that application onto the IT servers that make it available. On your own computer you download software that is already \"built\" (e.g. MS Word) and installing it is a form of deployment.
      • Deployment takes a while as the Azure Resource Manager takes your order and runs the code to generate the cloud resource you've described.
      • You may leave this page and the deployment will continue in the background.
    2. Finish and Review

      • When the deployment is complete, in the top bar of the Azure portal you'll see a number badge on the \"Notification\" icon indicating the number of messages you have (probably just 1). Click on the Notifications icon to show this message.
      • the message should be something like: Deployment succeeded Deployment 'resourcename_12345678901234' to resource group 'group name' was successful.
      • \"Go to Resource\" button will open the Portal page with options for the resource
      • \"Pin to Dashboard\" will create a new tile that is a shortcut to this resource on your dashboard for easy access. If you want to experiment with dashboard arranging then it's ok to click this and easy to remove later from your Portal Dashboard (it will be added to the bottom)
    3. Examine Resource (storage)

      • We have not talked about how storage works but the storage resource page is a good example to learn how the Portal is organized.
      • If you didn't already click \"go to resource\", open the top menu and click \"home\"
      • the Portal \"Home\" has a list of \"recent resources\" and this should be at the top.
    "},{"location":"exercises/exercise_using_the_cloud_to_summarize_and_visualize_data/","title":"Exercise: using the cloud to summarize and visualize data.","text":""},{"location":"exercises/exercise_using_the_cloud_to_summarize_and_visualize_data/#overview","title":"Overview","text":"

    The basic task of this project is analyze data in the cloud: copying data and code to the cloud, and using cloud computing to run a basic script, and save the output to cloud storage. We provide the data and the code (in R and Python ) with clear description of how to run it.

    The goal is to assess whether the structure of this material was sufficient (did we do our jobs?), that you were able to synthesize it, and hence you as a fellow are ready to take on a cloud project.

    The goal is not to determine your ability to run code (which you most like can already do!), use git, use the command line, or to be a systems admin but just to assess what piiece of this small puzzle we may need to reinforce. All steps should be able to be completed without having to write any code at all, except tp run the program. We hope this unified exercise helps fill any gaps in practical and potentially practical understanding of how computing in the cloud works. Or, even better, that it's so easy that it seems like busy work.

    "},{"location":"exercises/exercise_using_the_cloud_to_summarize_and_visualize_data/#process","title":"Process","text":"

    We are here to help along the way, and happy to answer any an all questions. The goal is to not present a step by step tutorial but to provide guidelines for how you should approach the problem. If you have issues it would be very help to us for you to review the course materials to determine if we've provided the information or links to the information to know if we need to augment these materials. However we will aways answer your questions as they come up.

    If you review this and find it very easy, you want to use something other than a VM to do calculations, or have code and data of your own you'd like to run, that is great! The goal is to help you accomplish a computation in a way that you may use in your project.

    "},{"location":"exercises/exercise_using_the_cloud_to_summarize_and_visualize_data/#output","title":"Output","text":"

    We ask that you prepare a short, informal description of the resources you used, how you used them to move data and execute code, and the costs associated with those resources. In addition any technical challenges, lack of clear documentation, or any other issues that needed to be overcome to complete this will be helpful to us.

    "},{"location":"exercises/exercise_using_the_cloud_to_summarize_and_visualize_data/#data","title":"Data","text":"

    The data is a simple CSV file of approximately 450,000 weather observations near the MSU campus. Details about the data file and it's origin are documented in the code site linked below. In addition a direct link for downloading the suggested data set will be sent to the fellows in email. While the data is in the public domain, for each download there is a small cost. Hence we are not posting the URL on this public site to prevent bots from repeatedly downloading the file.

    "},{"location":"exercises/exercise_using_the_cloud_to_summarize_and_visualize_data/#code","title":"Code","text":"

    The code we suggest you run is available on Github: https://github.com/msucloudfellowship/msu_ccf_miniproject There is a Python and an R version. The data is not in the github repository, but you should have recieved a link to download it, and there are instructions and code for downloading the data from the source for Lansing or other weather stations.

    "},{"location":"exercises/exercise_using_the_cloud_to_summarize_and_visualize_data/#task-details","title":"Task Details","text":"

    We expect you to create the following elements. If you already have some of these cloud resources, of course it's more efficient to re-use those but we want to get a cost element for all aspects, so we recommend creating a new resources (e..g. a new storage account) for this mini project.

    You can use the Azure portal to accomplish many if not not all of these tasks, excpet to run your actual program,

    "},{"location":"exercises/exercise_using_the_cloud_to_summarize_and_visualize_data/#due-dates","title":"Due dates","text":"

    The due date will be discussed in the email but they are flexible.

    "},{"location":"exercises/storage_pricing_exercise/","title":"None","text":"

    Prior to doing this exercise, See the reading and lecture slides for Cloud Storage for definitions of terms.

    How large, approximately, is your data? If you are unsure, estimate 100 gb. How much would it cost to keep it in the cloud?

    Compare the pricing for Blob, Files and Disk storage for 6 months

    Aspects Of Storage:

    Types of Storage to Compare:

    "},{"location":"exercises/storage_pricing_exercise/#optional-compare-with-on-premise-storage-costs","title":"Optional: compare with On-premise storage costs","text":"

    The MSU HPC offers 1TB storage with redundant backups and high-speed access for free, with each additional 1TB for $125/year. Since this is network attached storaage is this comparable to Azure Files or Azure Blob storage?

    If you need 2TB storage ( 1 free + 1 paid), what is the approximate Azure cost for 2000gb for 12 months, ignoring all operatinal costs (just storage)?

    "},{"location":"references/","title":"Cloud Computing References and Links to Azure Documentation","text":""},{"location":"references/#cloud-computing-for-research","title":"Cloud Computing for Research","text":"

    \"Cloud Computing for Science and Engineering\", Foster and Gannon

    Using Cloud Computing for Academic Research, Mahmoud Parvizi, unpublished draft, 2021.

    Several additional resources for learning about cloud from Cloudbank, a west-coast consortium to help researchers use cloud computing: https://cloudbank-project.github.io/cb-resources/

    Very in-depth case study of cloud for simulations (climate models): \\ Cloud Computing for Climate Modelling: Evaluation, Challenges and Benefits. Montes, D., et al. Computers 2020, 9(2), 52; https://doi.org/10.3390/computers9020052(2020).

    "},{"location":"references/#general-cloud-computing-interest","title":"General Cloud Computing Interest","text":"

    Historical Note Who Coined 'Cloud Computing'? by Antonio Regalado, October 2011, MIT Technology Review

    Intro to Cloud Computing from Microsoft which is primarily for IT people responsible for spending money and maintaining IT Infrastructure: MS Training Describe cloud computing

    "},{"location":"references/#azure-resources","title":"Azure Resources","text":""},{"location":"references/#general-azure-references","title":"General Azure References","text":"

    Main Azure Documentation : https://docs.microsoft.com/en-us/azure/

    List of All Azure Services : https://portal.azure.com/#allservices

    Azure Tips and Tricks : https://microsoft.github.io/AzureTipsAndTricks/

    Azure Portal \"How to\" series - focused on using the Azure portal to do several different things. This is mostly about the services themselves, not the portal, and many topics do not apply to us (e.g. Azure Arc) but there are some very useful videos : https://youtube.com/playlist?list=PLLasX02E8BPBKgXP4oflOL29TtqTzwhxR

    These look like really good intros to Azure, but requires a time investment. The examples are not really research computing examples but may be valuable learning examples. Most of these lessons were taken from other 'learning paths' and are still oriented towards IT professionals

    Microsoft Learn: - Azure for Researchers part 1: Introduction to Cloud Computing - Azure for Researchers part 2: Cloud Security and Cost Management

    "},{"location":"references/#azure-books-available-to-the-msu-community-via-the-library","title":"Azure Books available to the MSU Community via the Library","text":"

    Search for Microsoft Azure, ordered by date

    Microsoft Azure Functions: Developing Serverless Solutions Trevoir Williams, Packt Publishing 2022

    Practical Azure SQL Database for Modern Developers Davide Mauri, Silvano Coriani, Anna Hoffman, Sanjay Mishra, Jovan Popovic Apress 2021.

    Planning, Deploying, and Managing the Cloud Julian Soh, Marshall Copeland, Anthony Puca, Micheleen Harris. Apress 2020.

    "},{"location":"references/#interface-azure-portal","title":"Interface: Azure Portal","text":"

    Azure Portal Documentation : https://docs.microsoft.com/en-us/azure/azure-portal/

    Microsoft Azure Hierarchy: Organize your Azure resources effectively

    Re-organize your portal view by creating a new dashboard (optional) : https://docs.microsoft.com/en-us/azure/azure-portal/azure-portal-dashboards

    Azure portal productivity Tips : https://microsoft.github.io/AzureTipsAndTricks/blog/tip329.html#azure-portal-productivity-tips

    https://microsoft.github.io/AzureTipsAndTricks/blog/tip329.html

    "},{"location":"references/#azure-interface-azure-command-line","title":"Azure Interface: Azure Command Line","text":"

    Command-line progamming of Cloud Services

    "},{"location":"references/#azure-storage","title":"Azure Storage","text":"

    Create a Storage Account:

    https://docs.microsoft.com/en-us/azure/storage/common/storage-quickstart-create-account

    Azure Storage Explorer: https://azure.microsoft.com/en-us/features/storage-explorer/

    Blob Storage Documentation: https://docs.microsoft.com/en-us/azure/storage/blobs/

    Create and Manage a Storage Account: https://docs.microsoft.com/en-us/azure/storage/common/storage-quickstart-create-account

    Using the CLI with Storage Reference: https://docs.microsoft.com/en-us/cli/azure/storage/account

    Using PowerShell Storage Reference: https://docs.microsoft.com/en-us/powershell/module/azure.storage

    Create blob storage with CLI:

    https://docs.microsoft.com/en-us/azure/storage/common/storage-azure-cli

    Create blob storage with PowerShell:

    https://docs.microsoft.com/en-us/azure/storage/blobs/storage-quickstart-blobs-powershell

    "},{"location":"references/#compute","title":"Compute","text":"

    Overview of Compute Options: https://docs.microsoft.com/en-us/azure/architecture/guide/technology-choices/compute-overview

    Choosing an Azure Compute Service (Decision Tree): https://docs.microsoft.com/en-us/azure/architecture/guide/technology-choices/compute-decision-tree

    "},{"location":"references/#interface-arm-templates","title":"Interface: ARM templates","text":"

    Azure Resource Manager Templates are JSON-formatted configuration files that dictate which resources to create.

    See also information on 'Bicep', which is Azure's sipmlified (but still complex) template language to replace the ARM templates

    Overview of ARM templates: https://docs.microsoft.com/en-us/azure/azure-resource-manager/templates/overview

    explore quick start ARM templates (web): https://azure.microsoft.com/en-us/resources/templates/

    explore quick start ARM templates (github): https://github.com/Azure/AzureStack-QuickStart-Templates

    "},{"location":"references/#r-and-azure","title":"R and Azure","text":"

    https://blog.revolutionanalytics.com/2018/12/azurestor.html

    https://cloudblogs.microsoft.com/opensource/2019/07/01/azurer-available-create-manage-monitor-azure-services-r/

    https://docs.microsoft.com/en-us/azure/architecture/data-guide/technology-choices/r-developers-guide

    https://docs.microsoft.com/en-us/azure/machine-learning/studio-module-reference/r-packages-supported-by-azure-machine-learning

    https://github.com/Azure/AzureContainers

    https://github.com/Azure/AzureR

    https://github.com/Azure/AzureRMR

    "},{"location":"references/#python-and-azure","title":"Python and Azure","text":"

    https://azure.microsoft.com/en-us/develop/python/

    https://docs.microsoft.com/en-us/azure/python/

    https://github.com/Azure/azure-sdk-for-python

    https://github.com/Azure/azure-storage-python

    https://azure.github.io/azure-sdk/releases/latest/all/python.html (Note that pypi.org/project/azure/ is deprecated/obsolete if you find that via google)

    "},{"location":"references/#matlab-and-azure","title":"MATLAB and Azure","text":"

    https://blogs.msdn.microsoft.com/uk_faculty_connection/2017/06/29/running-matlab-on-azure-provision-a-matlab-distributed-computing-server-using-azure-vms/

    https://github.com/mathworks-ref-arch/matlab-on-azure

    https://www.itcentralstation.com/products/comparisons/mathworks-matlab_vs_microsoft-azure-machine-learning-studio

    https://www.mathworks.com/solutions/cloud.html

    "},{"location":"references/#microsoft-azure-cosmos-db","title":"Microsoft Azure Cosmos DB","text":"

    CosmosDB is a very large scale data system that can act like other database systems including SQL, MongoDB (a popular no-sql database), and others. It's advantage is that it can handle extremely large data sets (65tB) but is easy to get started. Google and AWS have similar offereings ( \"BigQuery\" and \"Aurora\" respectively).

    If your data is not large, consider using SQL data systems which are also very widely used (and can be used on your own computer)

    Intro: https://docs.microsoft.com/en-us/azure/cosmos-db/introduction

    It can be free to use, but you have to turn that on when creating the service for your account: https://docs.microsoft.com/en-us/azure/cosmos-db/free-tier

    You can run a notebook inside the databaase to queery data with python :

    "},{"location":"references/#cloud-architecture","title":"Cloud Architecture","text":"

    This section has resources for advanced to intermediate cloud users who are interested in much more details that most researchers will ever need, and are really geared for IT staff. However, sometimes to find insight into how to approach your problem (especially for cloud timing ooptimazation projects) these may have useful sections.

    Microsoft Azure Infrastructure Services for Architects by John Savill, Oct 2019, available from the MSU Library : http://catalog.lib.msu.edu/record=b13538669~S39

    Azure has changed since 2019 but may still be relevant

    "},{"location":"sessions/01_introduction/","title":"Introducing the MSU Cloud Computing Fellowship","text":"You don't have to face the clouds alone"},{"location":"sessions/01_introduction/#welcome","title":"Welcome!","text":"

    This is the first 'session' of the MSU Cloud Computing Fellowship (CCF) for 2022-2023. For a description of the program and how sessions are organized, see the CCF home page

    The goals of this introductory session are to orient you to this program, introduce ourselves to each other, provide some background on cloud computing, set up our technology, and discuss what all of our expectations are.

    "},{"location":"sessions/01_introduction/#activities","title":"Activities:","text":"

    Introduce yourself on Microsoft Teams

    You should have all been given access to a Team \"MSU ICER Cloud Computing Fellowship\" via your NetID.

    Confirm Access to Azure Portal

    "},{"location":"sessions/01_introduction/#introductions","title":"Introductions","text":""},{"location":"sessions/01_introduction/#msu-cloud-computing-fellowship-team","title":"MSU Cloud Computing Fellowship Team","text":"

    Sponsored by ICER, MSU Office of Research and Innovation (ORI), and MSU IT Services Research Cyberinfrastructure (RCI)

    "},{"location":"sessions/01_introduction/#participant-introductions-discussion","title":"Participant Introductions & Discussion","text":""},{"location":"sessions/01_introduction/#fellowship-program-overview","title":"Fellowship Program Overview","text":""},{"location":"sessions/01_introduction/#fellowship-goals","title":"Fellowship Goals","text":"

    Help you get an understanding of:

    Help you get some practical experience

    Fellowship - Learn from and support your fellow researchers

    Non-Goals: - cover all aspects of cloud - we don't cover networks for example due to time constraints - prepare you for a cloud computing certification (there are many existing resources for that) - become experts in everything cloud - build a dot-com empire

    "},{"location":"sessions/01_introduction/#program-overview","title":"Program Overview","text":"

    The syllabus\" is the home page of this website and has a detailed schedule. Keep an eye on the home page for updates!

    "},{"location":"sessions/01_introduction/#introduction-to-cloud-computing","title":"Introduction to Cloud Computing","text":" "},{"location":"sessions/01_introduction/#hands-on-using-the-azure-portal","title":"Hands-on: Using the Azure Portal","text":"
    1. Interacting with Azure using the Portal web interface
    2. Setting a Budget Alert Using the Azure Portal
    "},{"location":"sessions/01_introduction/#questions-and-discussion","title":"Questions and Discussion","text":""},{"location":"sessions/01_introduction/#follow-up-activity","title":"Follow up Activity","text":"

    Please complete the following prior to our next meeting in 2 weeks:

    *This first part requires significant learning, and the more you do know the better choices you can make when developing your project. *

    "},{"location":"sessions/01_introduction/#bonus-activity","title":"Bonus Activity","text":"

    If you are familiar with the command line, Azure offers a web-based terminal/shell with many applications pre-installed. once you have a storage account, you can create a special 'cloud shell' account. We will cover various interfaces to the cloud next time.

    "},{"location":"sessions/01_introduction/#readings","title":"Readings","text":"

    ## Optional Readings - Optional Historical Note Who Coined 'Cloud Computing'? by Antonio Regalado, October 2011, MIT Technology Review

    "},{"location":"sessions/02_how_to_cloud/","title":"Session 2: What is the cloud and how does it work? An introduction using storage and virtual machines","text":""},{"location":"sessions/02_how_to_cloud/#about-this-session","title":"About this Session","text":"

    We are providing materials and activities for this session for you to read and attempt at your own pace. Please attempt these and see how far you can get. Feel free to post on Microsoft Teams if you have any issues, find things that need correcting, or have general questions.

    We will host an optional, additional, in-person session to provide help to anyone who wants to attend, Friday September 23 2pm to 3:30p. Since this is outside of pre-arranged schedule, anyone who would like help but can't attend during this please contact us and we will arrange a time for you.

    We will discuss all of this material and more during our next regularly scheduled in-person session Friday September 30th.

    "},{"location":"sessions/02_how_to_cloud/#overview","title":"Overview","text":"

    When many people think of \"cloud computing\" they think of computers in the cloud, or virtual machines. Cloud computing companies offer much more than just virtualized hardware, but this is a good place to start. This session is designed to be a hands-on workshop where we walk-through creating the resources needed for to run a computer in the cloud, logging into this computer, copying data and using that data in a program. At the end of the session you should have a good introduction of what it means to \"cloud compute.\"

    "},{"location":"sessions/02_how_to_cloud/#overview-presentation","title":"Overview Presentation","text":"

    Cloud Concepts & Virtualization Slides (PDF)

    "},{"location":"sessions/02_how_to_cloud/#about-the-azure-portal","title":"About the Azure Portal","text":"

    We were introduced to the portal in the first session. The following dives into more detail about 'resource groups' which is the core of how Azure is organized. Note that, as we get started, fellows have access to just a single resource group that we've created for you. You can't create your own but you can create as many resources as yuo need inside this single resource group.

    "},{"location":"sessions/02_how_to_cloud/#optional-follow-ons","title":"Optional Follow-ons:","text":"

    Azure Storage

    The Activity above had you creat a 'storage account' with no background.

    You will see there are different types of storage, but all types must be inside a \"storage account\" and this \"storage account\" must be inside a resource group.

    We will re-visit concepts and usage of cloud storage in detail, as it's a core aspect of cloud computing.

    "},{"location":"sessions/02_how_to_cloud/#virtual-machines","title":"Virtual Machines","text":"

    We introduced \"virtualization\" during our introduction. For IT this means flexibly creating multiple resources on one piece of hardware using software. The main use case is many virtual computers (or servers) on one large computer hardware. This was create prior to cloud, but when you create your own computer in the cloud, it's based on the technology. To a user it may seem very similar, but to the systems IT engineer, it's very different. However these readings may help give you an

    "},{"location":"sessions/02_how_to_cloud/#readings","title":"Readings:","text":""},{"location":"sessions/02_how_to_cloud/#activity-create-a-virtual-machine-with-azure","title":"Activity: create a virtual machine with Azure","text":"

    Create (and delete) a Virtual Machine with the Azure Portal for both windows and Linux.

    "},{"location":"sessions/02_how_to_cloud/#discussion-why-create-a-vm","title":"Discussion: Why create a VM?","text":"

    What is a VM good for? The activity above does not discuss why you'd create a VM and connect with remote desktop, only that you can do it. We will discuss that at our next session. Can you think of possible use cases for your research, or other types of research, for a remote computer that could be very powerful or very small?

    "},{"location":"sessions/03_cloud_storage/","title":"Session 3: Cloud Storage","text":""},{"location":"sessions/03_cloud_storage/#introduction","title":"Introduction","text":"

    Central to using cloud for nearly all services is storing data. Cloud storage is quite different from what most are used to related to saving a file to your disk or USB removable media or even our HPC. During the previous workshop we created a VM but didn't use cloud storage, we simply create a VM \"virtual disk\" that is attached to the VM just like your hard drive is attached to your own computer. However there are disadvantages to this : 1. the main OS disk is typically deleted when the VM is deleted, although you can create a 'durable' disk to share 1. the data on the main OS disk is tied to that Virtual Machine and hence that operating system, that is, it's typically inaccessible from other cloud services 1. it is limited in size and scope The largest of virtual disks are around 1 TB. Azure Cloud storage accounts are limited to 5 TB and you may have multiple storage accounts. 1. You can only move data to/from a virtual or shared disk storage using a virtual machine 1. Most importantly virtual disks very expensive compared to cloud storage

    Cloud storage was engineered to save millions of files for millions of users and will take some changes to your approach to understanding how it works.

    "},{"location":"sessions/03_cloud_storage/#activities","title":"Activities","text":""},{"location":"sessions/03_cloud_storage/#readings","title":"Readings","text":""},{"location":"sessions/03_cloud_storage/#post-session-discussion-points","title":"Post-session discussion points","text":"

    There are several options when creating a storage account. For example, what is the difference LRS vs GRS? Is the documentation describing these clear or confusing? What conditions might you consider LRS vs GRS? Is it worth the cost?

    How would you share data with colleagues outside of MSU using cloud storage? Where did you find the information for how to do that (Microsoft, Azure, Blog post, other)? Let's say need to share 5gb of data. After doing the pricing exercise above just for storage, what are the costs for each upload and download of 5gb? Does it make a difference if it's Blob or File storage?

    "},{"location":"sessions/03_cloud_storage/#optional-activities","title":"Optional Activities:","text":"

    The following two activities walk through attaching Azure files to a VM so you can use it just like any other disk. This is only one method for moving data to/from cloud storage to your VM, but it does not require changing your program code.

    For Windows Users: Using File Storage with Windows VM

    Microsoft Tutorial: Create an SMB Azure file share and connect it to a Windows VM using the Azure portal

    Notes: - The tutorial has you create a storage account, but you can re-use the one you've already created (and change the names), or follow the tutorial and create another one. - Not all versions of Windows can use this. For much more detail, see the Azure documentation page \"Mount SMB Azure file share on Windows\"

    For Linux Users: Mounting File Storage with Linux VMs using NFS

    Microsoft Tutorial: Create an NFS Azure file share and mount it on a Linux VM using the Azure portal

    How to mount Azure Files on Linux using SMB

    Notes: - SMB (invented by Microsoft for Windows) and NFS (invented by Sun Microsystems from Unix) are competing methods for attaching network storage. Both were created for on-premise servers, but Azure Files storage brings this to the cloud. - this tutorial uses command line, and requires an ssh connection to the VM you create. - Knowledge of Linux systems (mount points, fstab, etc) required

    Optional: Python And Blob Storage

    This describes an a different method for moving files to/from cloud storage: using code. This does not require you to 'mount' the storage to your VM.

    For Intermediate Python users, and if you have time and interest, consider this tutorial from Azure: Quickstart: Manage blobs with Python v12 SDK

    Requirements:

    **Optional: Using Managed Disks with Linux

    Azure Learning Tutorial : Add and size disks in Azure virtual machines

    Notes: - Uses the Azure Command line interface which we have not discussed. For

    "},{"location":"topics/","title":"Short Topics for the Cloud Computing Fellowship","text":"

    These topics are introduced in the sessions in the syllabus. This is an index of all the topics here to help you find them outside of lessons. They are not in any particular order, but aggregated here in an effort to help you find them.

    "},{"location":"topics/azure_cloud_cost_basics/","title":"Intro to Cloud Costs on Azure","text":"

    You've heard us say that nearly everything Azure has a cost, but how can you tell how much?

    First, Cautionary Tale: Google Cloud Charged Me $1000 For This Mistake by Kunal Vaidya on Medium. *tl;dr: he forgot to turn off a service even though he was no longer using it. Good news it, Google does grant 1-time forgiveness if you can prove you are using the service to learn about it (e.g. you are student). *

    "},{"location":"topics/azure_cloud_cost_basics/#video-walk-through-of-azure-cost-analysis","title":"Video Walk-through of Azure Cost Analysis","text":"

    The following video walks through how to use the costs analysis features of the Azure portal for your resource group. 1) It helps to understand Azure Organization, and 2) it is from a few years ago so the screens may look a little different

    Short video (3:30) Demonstrating Azure Portal Cost Analysis, on MSU MediaSpace (log-in required)

    "},{"location":"topics/azure_cloud_cost_basics/#details-about-costs-in-azure","title":"Details about Costs in Azure","text":"

    The content below assumes you have knowledge of how to use the Azure Portal, basic cloud operations, what a virtual machine is. See the links and materials for session 01 for the necessary background.

    "},{"location":"topics/azure_cloud_cost_basics/#1-pricing-pages","title":"1. Pricing Pages.","text":"

    All cloud vendors have pricing pages that describe how they meter and charge for services. For Azure this is https://azure.microsoft.com/en-us/pricing/#product-pricing

    However I usually find the page I need quickly by simply googling azure <service name> pricing for example I wanted to see how much a static IP address costs in azure so googling 'azure static ip pricing' takes me to https://azure.microsoft.com/en-us/pricing/details/ip-addresses/

    Some of these pages are straightforward, but like the one above has addition knowledge. What does this mean in practice? For example, what does \"classic\" vs \"ARM\" even means? There is a link at the top of the page but this may take time to read and understand. I'll tell you that we will never use 'classic' and only use 'resource manager (ARM).' so look at the ARM Prices.

    This kind of background info is very common for services.

    "},{"location":"topics/azure_cloud_cost_basics/#2-build-something-and-check-the-cost","title":"2. Build something and check the cost","text":"

    The other option is the empircal method: build something, use it, review the costs, and estimate.

    At the resource group in the protal ( see Azure Organization), there is a link on the left-side menu, near the bottom labelled \"Cost Analysis\" - click that

    This is a live report of your current costs, with the ability to filter by time period, resource type, tags, and other things.

    Near the middle are rouded buttons controlling the view you see. At the right side of this is a button \"Add Filter\" which you can click to show costs only for some resources. For example if you click that and select \"Service Name\" and then \"virtual machines\" you will see the costs for the current month.

    A powerful filtering technique is to use tagging in Azure, which is akin to adding meta-data to resources. See the Cloud Glossary

    In many of the filtering mechanisms in Azure (including costs), the tag names (keys) use use are listed in the options for filtering.

    Carefully select the date range for which you want an estimate, especially if your trial run started a few days ago in the previous month as the default is a monthly estimate. Use a custom date range for the time period that makes sense for the costs you want to observe.

    Example Azure Cost Analysis Screen, filtered by Tag. Click for larger view

    "},{"location":"topics/azure_cloud_cost_basics/#3-pricing-calculators","title":"3. Pricing Calculators","text":"

    All the cloud companies have pricing calculators and they may be good for very rough estimates but I always multiple by 1.2 as I'm sure I missed some crucial resource that I didn't know I needed or didn't know costs money.

    For Azure it's https://azure.microsoft.com/en-us/pricing/calculator/

    "},{"location":"topics/azure_cloud_cost_basics/#summary-and-other-notes","title":"Summary and other notes","text":"

    Combining these three methods is how we can estimate costs.

    Notes:

    "},{"location":"topics/azure_cloud_cost_basics/#azure-pricing-resources","title":"Azure Pricing Resources","text":"

    Quickstart: Explore and analyze costs with cost analysis

    Video from John Saville on cost estimation including the pricing calculator: Master the Azure Pricing Calculator Jun 17, 2021

    "},{"location":"topics/azure_organization/","title":"Azure Organization","text":"

    This is a brief description of how Azure cloud services are organized for those just getting started with Azure. It's my own take on this topic written with researchers in mind. However it should not replace Azure official documentation. The link below has a great summary of how it's setup. However you may ignore all the other sections in the \"Azure setup guide\" as this is geared for IT professionals adoption cloud for their own organization

    Microsoft Azure Documentation: Organize your Azure resources effectively

    Azure is organized by directories of user accounts and subscriptions. All resources must be created in exactly one \"subscription\" which is a method for billing and for setting permissions. Your organizations \"directory\" is where your user account lives, but you may have access to multiple subscreiptions with one user. MSU created a \"Cloud Computing Fellowship\" subscription for all activities and resources for this, and we added your MSU directory accounts this subscription.

    Cloud computing components are known as \"resources,\" which AWS defines as \"an entity you can work with.\" Anything you can create using a cloud interfaces is a \"resource.\"

    To help with more organization, in Azure, resources belong to a resource group. Resource groups can collect resources by project which could still have hundreds or just a few resources. There is no restriction and up to you to organize how it works for you. For example, a lab could have a resource group for each member, or perhaps a resource group for each project, and members collaborate on those projects.

    It's also possible to restrict access to resource groups, e.g. a resource group for a project may only allow those who are working on the project access to that resource group. Azure has other organizational tools such management groups across subscriptions, complex identity management and role-based access control (RBAC) that we won't cover here.

    However, this is mostly for organization and resources may be accessed from one resource group to another, and even across subscriptions. Applying this organization scheme requires practice and sometimes vigilance.

    For most campuses, researchers will want to have their IT department create the subscriptions and billing as they often can get discounted prices or fee waivers. When your research group is ready to pay for services here at MSU, see the link to the \"cloud services request form\" on https://tech.msu.edu/network/cloud-services/

    Summary of top-down Azure Organization:

    Finally, it is possible to log-in to the Azure portal (e.g. your MSU account) and not have a valid subscription and not be able to create or access any resources. If you have never used Azure before, you may be asked to create a free trial. If are a you need to use Azure (e.g. for training) and do not have access to an MSU subscription, you may want to use a non-MSU email address and create your own account.

    Azure \"tags\" add added to resources (including resource groups) and are a way to identify and locate resources by search as for many other services. They are optional but highly recommended to use a tagging scheme to help organize your resources and for cost analysis. You can use any keys and any values you find useful.

    "},{"location":"topics/azure_organization/#azure-locations-or-regions","title":"Azure Locations or Regions","text":"

    Subscriptions are for accounting only and don't represent concrete cloud resources. However cloud resource must reside in computer somewhere, and hence have a location. Locations for cloud providers for can be thought of inside one of their massive data centers. In Azure, \"region\" and \"location\" are used interchangably (some interfaces use 'location, some use 'region')

    Resources and Resource groups must be assigned a location when you create them. considerations are 1) does the location actually provide the services you need (not all locations have all cutting edge products) and 2) is the location close to you to reduce time it takes for data to cross the internet to/from you and finally 3) is there some restriction based on your country of origin.

    Most of the time, simply choose the default which is East US which almost always has the latest features. For some advantage for data transfer, choose (US North Central US). However as a rule select a location/region and use that across all of your resources so that, for example, your data files in storage are close to (in the same data center as) a computer you may create.

    Regions become very important for companies that offer services around the world and want to reduce the connection time for their customers. It's also possible to have back-ups of resources in different region to protect against natural disasters.

    "},{"location":"topics/azure_tags/","title":"Azure tags","text":""},{"location":"topics/azure_tags/#using-tags-to-organize-resources-in-azure","title":"Using Tags to organize resources in Azure","text":"

    Tags are notes to yourself about the resource, use them for metadata.

    As the number of cloud resources blossom (e.g. cloud sprawl) it can be important to find related resources quickly. The azure portal has a way to see resource within and across resource groups using different filtering methods. One of those is the with resource meta-data, and you can add meta data using 'tags.'

    In my group we always have a tag with the key \"created by\" and value the netid of the creator. This may be redundant here becuase all the resources you create will be a in resource group with your NetID already in it, but add this for practice.

    You may consider using a tag like \"project\" with value for the project if either 1) a project may have multiple resource goups or 2) a resource group would have multiple projects.

    For now you have only one resource group, but tags are also used to find things across different resource groups, e.g. if by project name.

    Tags can be added and removed at will from resources without altering the resource, so add as many tags as you want when starting to see how they may work.

    "},{"location":"topics/azure_tags/#example-usage","title":"Example usage:","text":"

    When creating resources using the wizard, many resources are created at once. For example creating a virtual machine may create 12 resources. Adding a tagl to ID those resources together can really help to delet them.

    "},{"location":"topics/intro_aspects_of_cloud_computing/","title":"Nature of Cloud Computing","text":""},{"location":"topics/intro_aspects_of_cloud_computing/#some-motivation-at-amazoncom","title":"Some Motivation at Amazon.com","text":""},{"location":"topics/intro_aspects_of_cloud_computing/#eureka-moment-for-amazon-we-could-sell-it","title":"Eureka moment for Amazon: we could sell it","text":""},{"location":"topics/intro_aspects_of_cloud_computing/#nist-defintion-of-cloud","title":"NIST defintion of cloud","text":"

    Government offices interested in purchasing cloud computing needed a definition of it to differentiate from other kinds of computing, hence... the NIST definition of cloud computing essential characteristics

    "},{"location":"topics/intro_aspects_of_cloud_computing/#what-is-cloud-computing-cloud-concepts-vs-cloud-providers","title":"What is Cloud Computing? Cloud concepts vs Cloud Providers","text":""},{"location":"topics/intro_aspects_of_cloud_computing/#benefits-of-cloud-computing-for-research","title":"Benefits of Cloud Computing for Research","text":"

    Restatement of goals of this Cloud Computing Fellowship:

    "},{"location":"topics/intro_aspects_of_cloud_computing/#using-workflow-and-computational-thinking","title":"Using workflow and computational thinking","text":"

    To enhance reproducibility in your own work, consider documenting all the steps needed for create the environment to run your computation. For many on-premise academic systems (e.g. the MSU HPCC), we depend upon the system administrators to create that environment, but we may install and configure all the software we need to run our code. Workflow thinking can apply to the scienfic domain itself (e.g. \"Principles for data analysis workflows\" https://journals.plos.org/ploscompbiol/article?id=10.1371/journal.pcbi.1008770 ) and to the provisioning of the cloud computing environment. That is, we may use a workflow system for creating all the cloud stuff we need, and then a different workflow system that runs on that cloud stuff. One example is we may create an HPC system on Azure using templates and then launch the Slurm scheduler on that HPC to run our jobs. (note the complexity of running your own HPC is beyond the scope of this fellowship and used as an example only)

    A major advantage to using workflows or code for provisioning your cloud computing components is that you can turn them off and delete them when you are done, and restart when needed.

    Our first uses of cloud will use forms to create resources, but we encourage you to automation where possible.

    "},{"location":"topics/intro_aspects_of_cloud_computing/#about-cloud-security","title":"About Cloud Security","text":"

    Security and Risk management are important issues even for researchers who's data are open - If your computer is a server, your responsibility just increased 100X: these are prime targets. Consider each component of a server to be a point of vulnerability. - Finding a readable list of security recommendations for cloud computing is a challenge for all the reasons outlined above. Our textbook has a nice chaper outlining cloud security - We will cover methods to reduce security risks but it's important to consider the risk of hacking from the beginning

    Attackers may use the services you create to launch attacks on other services, leaving you liable.

    Microsoft Model of Shared Responsibility for Cloud Computing

    We will come back to this model as we gain deeper understanding of research computing on the cloud.

    "},{"location":"topics/intro_aspects_of_cloud_computing/#hpcc-vs-cloud","title":"HPCC vs Cloud","text":"

    The HPC is amazing effective at running all kinds of systems at very list cost, if any, to MSU researchers, but not all are the best fit.

    Many systems not designed for HPC can be adjusted to run in that environment. However, just like many workflows are difficult to port from HPC to cloud, some cloud workflows are difficult run on HPC (but never say never). Especially windows-based software.

    "},{"location":"topics/intro_aspects_of_cloud_computing/#acknowledging-bias-in-access-to-cloud-computing-across-research-cultures","title":"Acknowledging bias in access to cloud computing across research cultures","text":"

    It's widely recognized that AI is frequently bias. For example, Azure Voice recognition did not work for a female researcher who developed voice-controlled surgery, so

    However I believe there is also inherent bias in the user interfaces, design and definitions in the engineering of technology across many axes of diversity (gender, culture, background, training, creativity, etc). System Engineering is it's own discipline and Cloud computing is arcane so our goal is to reduce conceptual barriers to using this technology while you work with us.

    "},{"location":"topics/intro_aspects_of_cloud_computing/#about-cloud-costs","title":"About Cloud Costs","text":"

    Case Study: Computation of a machine learning model based on gene networks for inferring gene association ( https://www.geneplexus.net): a single (virtual) machine to run the ML such that users would not have to wait too long would be $650/month. However, if the computational power is provisioned only when needed, it's 5 cents/job.

    "},{"location":"topics/intro_aspects_of_cloud_computing/#value-proposition-of-cloud-computing","title":"Value Proposition of Cloud Computing","text":""},{"location":"topics/intro_to_cloud_interfaces/","title":"Interfacing with Cloud Services","text":"

    Cloud Services are by design DIY or on-demand and hence need a programming interface to create cloud resources. This is only possible becuase inside the data center, computer configuration can be done completely with code, also knows as \"Infrastructure as Code\" (IaC). Amazon's insight was that they could slap a website on top of that, put a system for tracking (metering) usage, and sell it.

    All of the cloud companies as their base use a web interface, so-called REST API. Knowing the details of REST is not important but it's often the basis for all of the other style of interfaces.

    Here is an example web api URL for weather forecast, with parameters for coordinates, units and format of output

    https://www.7timer.info/bin/astro.php?lon=113.2&lat=23.1&ac=0&unit=metric&output=json&tzshift=0

    Very few researchers would ever use the REST api directly, instead would use the web interface or even better the command line or programming language interface which achieves the same goal with less work.

    In Azure, everything you could possibly create is called a \"resource:\" a machine, a data service, a single network address. The system to work with Azure resources is the \"Azure Resource Manager\" or ARM and the primary interface for the Resource Manager is their web (REST) api. You may see references to resources in documentation and that means any web doo-dad.

    "},{"location":"topics/intro_to_cloud_interfaces/#summary-of-cloud-interfaces","title":"Summary of Cloud Interfaces","text":"

    This summary is focused on Microsoft Azure, but the other cloud companies have similar concepts. In addition to this guide, Chapter 1 of our text \"Cloud Computing for Science and Engineering\" has an excellent description and examples of these interfaces with examples from AWS. See the section of that chapter titled \"Accessing a cloud service\" in https://s3.us-east-2.amazonaws.com/a-book/Orienting.html

    "},{"location":"topics/intro_to_cloud_interfaces/#graphical-web-interface","title":"Graphical Web Interface","text":"

    Most people want a graphical user interface, and for azure that's the \"Portal\" or https://portal.azure.com. For Google cloud it's the \"console\" and for AWS it's also called the console. See below for an introduction to using the portal. Note that the Azure portal and Google console both have web-based terminals that allow you to use the CLI directly in the web interface.

    "},{"location":"topics/intro_to_cloud_interfaces/#desktop-applications","title":"Desktop Applications","text":"

    Azure provides some desktop applications for working with a few of the widely used cloud services :

    "},{"location":"topics/intro_to_cloud_interfaces/#command-line","title":"Command Line","text":"

    For those not familar with the command line at all, see https://www.digitalocean.com/community/tutorials/an-introduction-to-the-linux-terminal for linux and for Windows Powershell see https://programminghistorian.org/en/lessons/intro-to-powershell

    The command line interface is a great way to interact with cloud services because it's imperative and all options are specified in a single command. With the web interface, you may have to hunt through the user interface to find the checkbox for an option, but for command line

    Azure has two command line interfaces: The \"CLI\" which is based on Linux and will work in any linux or Mac terminal (or shell script) and the \"Powershell\" interface which is for Windows Powershell users. Since Powershell has been ported to Linux and Mac and the Linux Shell and Azure CLI can also be used on Windows, so both are operating system independent but in practice, Windows users use powershell and everyone else uses the CLI. Your choice depends on the kinds of other systems you'll be working with. For example, the MSU HPC uses Linux command shell but Windows servers and other Windows services like SQLServer work well with Powershell.

    "},{"location":"topics/intro_to_cloud_interfaces/#sdk-software-developer-kit","title":"SDK : Software Developer Kit","text":"

    A \"software developer kit\" is simply a collection of utilities, libraries/packages and documentation for a specific language to work with a specific service. All the cloud vendors have SDKs, and they all have SDKs for Python. SDK simply means you can create, delete, interact with cloud services from your program.

    Why leave python or R if don't have to?

    "},{"location":"topics/intro_to_cloud_interfaces/#python-sdk","title":"Python SDK","text":"

    All cloud vendors have SDKs to work with Python. After installing the SDK, you import the libraries and issue commands to create resources, then use those cloud resources to do work via client libraries (either Azure libraries or others). Azure has extensive documentation for using Python: https://docs.microsoft.com/en-us/azure/developer/python/?view=azure-python

    Example Azure code to create cloud storage, compared with how you would see the resources in the azure portal, and similar commands using the CLI : https://docs.microsoft.com/en-us/azure/developer/python/azure-sdk-example-storage?tabs=cmd

    Note that Azure also has a service \"Azure Cloud Functions\" that run python that are not the same thing as the SDK. These are 'serverless' resources (similar to AWS Lambda), which we will learn about later in the course.

    Both AWS and Google Cloud have Python SDKs, and probably other vendors.

    "},{"location":"topics/intro_to_cloud_interfaces/#rest","title":"REST","text":"

    Knowing the details of REST is not important but it's the basis for all of the other style of interfaces.

    Here is an example web api URL for weather forecast, with parameters for coordinates, units and format of output

    https://www.7timer.info/bin/astro.php?lon=113.2&lat=23.1&ac=0&unit=metric&output=json&tzshift=0

    The parameters to the weather data fetch program are lon, lat, ac, unit, output=json, tzshift, and they are embedded in the URL itself.

    This is caled a \"request,\" and using a web API often requires sending parameters not just sin the URL, but as an attachment or in the 'body' of the request. Browsers don't have an automatic way of doing that, so we use scripts (python Requests library) or special programs for testing Web APIs that can send parameters and data in the request body.

    This is a good explanation of REST and part 2 describes the details.

    https://medium.com/extend/what-is-rest-a-simple-explanation-for-beginners-part-1-introduction-b4a072f8740f

    The Azure REST api is a an interface to the Azure Resource Manager via the web. Requests sent can get information about your resources, or create new resources, just like the portal, the command line and the SDKs. Those other interfaces typically translate to the REST API. Knowing about it may help diagnose why your method for interfacing with Azure is not working but not necesary to learn. For examples and more detail, see https://learn.microsoft.com/en-us/azure/azure-resource-manager/templates/deploy-rest

    Few of us would ever use the Azure REST api directly, instead would use the web interface or even better the command line or programming language interface which achieves the same goal with less work.

    "},{"location":"topics/intro_to_cloud_interfaces/#r","title":"R","text":"

    Unlike the other vendors, Microsoft maintains an SDK for R Users which allows you to create cloud services directly from Rstudio. See their github pages https://github.com/Azure/AzureR and excellent documentation throughout the packages.

    "},{"location":"topics/intro_to_cloud_interfaces/#cloud-company-templating-frameworks","title":"Cloud company templating frameworks","text":"

    In addition to the \"SDKs\" for existing languages, cloud companies often have their own frameworks for using code to build (provision) infrastructure. For Azure, these are \"ARM Templates\" and for AWS it's Cloud Formation.

    "},{"location":"topics/intro_to_cloud_interfaces/#azure-arm-templates","title":"Azure: ARM templates","text":"

    Azure has a system for submitting a template, or essentially a configuration file to the Azure Resource Manager (ARM) that dictates which cloud resources are to be created. For Azure these are JSON-formatted files that are \"declaritive\" (rather than procedural or imperative like Python). The best way to understand these is to explore the many that Microsoft posts on github, and to try them. If you do, be mindful to delete any resources you create so as not to be charged for them.

    - Overview of ARM templates: https://docs.microsoft.com/en-us/azure/azure-resource-manager/templates/overview\n- Quick start ARM templates (github): https://github.com/Azure/AzureStack-QuickStart-Templates\n

    You may see reference to \"Bicep\" templates. This is simplified ARM templating language that may be easier to write, debug and maintain than the JSON format of ARM templates.

    "},{"location":"topics/intro_to_cloud_interfaces/#aws-cloud-formation","title":"AWS: Cloud Formation","text":"

    AWS also has templating language similar to Azure Resource Manager templates called cloud formation. If you are using AWS for your project, and want to automate the creation and deployment of resources, this may be a good option.

    AWS Documentation:

    "},{"location":"topics/intro_to_cloud_interfaces/#third-party-programming-with-terraform","title":"Third-party programming with Terraform","text":"

    There are other ways to 'program the cloud' from companies outside of the big three. One widely used frame is \"Terraform\" from Hashicorp, not affiliated with any cloud company. The advantage to Terraform is that it's declarative in that you specific what you want, unlike say the Python or command line interface, where you have to create items with commands one at a time.

    Terraform is used by cloud professionals becuase it's designed to keep the resources youve created running and allow you to modify them in place. If you find you are using scripting to build resources (which is great!) but your scripts are becomming combersome to maintain and your cloud architecture is complex, consider using Terraform.

    - Terraform: https://www.terraform.io\n- Can work with any vendor including Azure\n- Often more readable than ARM templates, Syntax remarkably simple \n- Focus on maintaining consistent systems ( declarative) \n- Does not cover all services, but can fall back to ARM templates when necessary\n
    "},{"location":"topics/intro_to_cloud_interfaces/#building-cloud-from-cloud","title":"Building Cloud from Cloud","text":"

    This may not be an 'interface' but is operationally similar. It's possible to use some of the above interfaces on existing cloud services, e.g. creating new cloud resources automaticaly from existing cloud resources. Your cloud architecture may need different types of resources, or parameterized resources only as needed (e.g. depending data inputs, a web-gateway for cloud on demand).

    For example Azure Logic Apps can create resources when they are run (e.g. provision and start a computer) and a logic app can be triggered by events such as when a new file is created, or using a web api (e.g. REST POST command that sends data and parameters). This adds significant complexity and is only valuable for event-based systems opens up using the cloud as a big computer programming language.

    "},{"location":"topics/intro_to_cloud_interfaces/#references","title":"References","text":"

    See our references page for curated Azure links. For AWS, see

    "},{"location":"topics/learning_how_to_learn_about_cloud/","title":"Learning how to learn about cloud","text":""},{"location":"topics/learning_how_to_learn_about_cloud/#guidelines-for-researchers","title":"Guidelines for Researchers","text":"

    You may have looked at the various websites and poked around the web, and found it's just not clear at all how cloud computing may be helpful to you, even though it all sounds great. The challenge for researchers learning about cloud is that most cloud documentation for isn't written for you.

    Challenges for researchers learning:

    "},{"location":"topics/learning_how_to_learn_about_cloud/#what-documentation-is-available-for-researchers","title":"What documentation is available for researchers?","text":"

    There are general, conceptual introductions and dicussions for academics.

    "},{"location":"topics/learning_how_to_learn_about_cloud/#learning-how-to-learn-about-cloud-caveats-and-help","title":"Learning how to learn about cloud: Caveats and help","text":"

    As part of this fellowship, our goal is to help you translate documentation written for the systems and developer perspectives into a research perspective.

    "},{"location":"topics/the_computing_in_cloud_computing/","title":"Helping to Understand the \"computing\" in cloud computing","text":"

    You come to us with a unique set of experiences with computing, with more or less experience depending on your previous needs. A challenge we have seen, for the many years we've been helping people, is understanding the context of computing in their research to understand the tools they have available.

    In fact most documentation for cloud computing assumes you know the world of computing. An introduction to cloud computing from microsoft lists this Prerequisite: \"Basic familiarity with IT terms and concepts.\" It turns out 'basic' can mean a lot of things.

    A core goal of the MSU Cloud Computing Fellowship is to help you connect cloud computing to your research in a meaningful way

    our original question: - How can cloud computing benefit help your research?

    Let's re-frame the question for this discussion: - Which kind of computing could help my research? - Can I use that kind of computing in the cloud? \\ That is, could cloud computing enable me to use computing I otherwise couldn't?

    You may already have an idea of what this is, and experience with computing but many who come to us know it's valuable but are ready to learn why.

    "},{"location":"topics/the_computing_in_cloud_computing/#what-is-computing-minimal-vocabulary","title":"What is computing? Minimal Vocabulary","text":"

    Cloud computing was invented for, and is marketed to IT systems administrators, software developers, and IT/technology managers. See the history of AWS. It is was not designed with researchers in mind. Most training and documentation Note, however, that Cloud Computing is general enough and is often marketed to researchers or 'for research.'

    The primary function of cloud computing is to provide \"infrastructure\" aka the \"back-end\" or back room of a company's IT department, so we ware going to learn about that. In fact, cloud computing is frequently defined, named, and sold based on abstractions of physical components of computers and IT infrastructure. Hence learning more about IT infrastructure, or \"computing\" may be helpful understanding the context in which cloud computing is engineered. This can help you determin what you may need from cloud computing to get your research done.

    Could you purchase your own infrastructure (computers, networks, disks, etc) and run it \"on-premise\" and get the same benefit as cloud computing? Or have your institution do that? Sometimes yes! The MSU HPCC is a great example when on-premise is more beneficial and cost-effective than cloud computing.

    "},{"location":"topics/the_computing_in_cloud_computing/#about-computing-major-components-of-computer","title":"About Computing: Major components of computer","text":"

    Of course you know what is in a computer. The goal is to come to common understanding, and to frame for extension to cloud, and to find the cloud services that mimic these features.

    Where is the data in this abstraction of computer infrastructure? Answer: everywhere

    If you hadn't thought or known about the components of a computer, that's no mistake. Most people don't know the details of how their car operates, how to change their oil, or diff between carburetor and turbo charging?

    "},{"location":"topics/the_computing_in_cloud_computing/#stack-model-of-computing","title":"\"Stack Model\" of computing.","text":"

    Just as in Science and the humanities, we need a model and terminology to talk about a subject. A standard IT model of a computer is a 'stack' model, where each upper layer depends upon the layers below. Most models of cloud computers build upon this simple model.

    User Interface/Connection Software Operating System Computer Hardware: CPU & RAM Data Storage Network"},{"location":"topics/the_computing_in_cloud_computing/#about-computing-what-is-a-server","title":"About Computing: What is a server?","text":"

    Cloud computing started with, and frequently talks about \"servers,\" so we should define that.

    A server is any computer running software that listens for, and responsed to, messages. For a server to be useful it should be connected to a network but it doesnt' need to be. Some terms: - The 'server' is actually the software, not the hardware. You can run a server on your laptop. - The computer that runs the software is the 'host' - A 'client' is software sends the message, and receives and interprets the response. - the protocol is the method by which you exchange messages. Now it is almost exclusively web (http) but there are many others - the form the input message can take, and the form of the message that is returned is known as the API of the server. it's the interface that you have to work with. - port: a computer may run many servers for internal and external use. Unix devised a system of numbered 'ports' (nbumber 01 to 64K), and when running a server you must tell the server which port to listen for messages. Users of most software never have to know or think about ports.

    The 'Client/server' model invented in the 60s is so successful that we use servers for our daily lives and don't think about it (except when the server is down). This model of computing is important because it's at the basis for of cloud computing.

    We often think of a server as a box, but in the model above, the server is in the software layer, but each of layers below provides services for that software to exchange messages with another computer. If you can abstract, virtualize or automate the layers below, it becomes much easier to provision servers than to purchase, install and configure physical hardware.

    "},{"location":"topics/the_computing_in_cloud_computing/#example-server","title":"Example Server","text":"

    A Web server is a well known, easy to use, and very useful server to run. The terms above translate as follows:

    What is the host in this URL? What is the message? We could spend a week talking about web servers, protocols and a year about programming web server. The important thing is that there is a host computer, the 'web server' software on the host listening for requests, and the client(s) connecting to it to retrieve files.

    "},{"location":"topics/the_computing_in_cloud_computing/#other-types-of-servers","title":"Other Types of Servers","text":"

    Many of these do not use web-based protocols or connections. They define their own protocols, either as a public standard (e.g. email) or proprietary standard (database)

    "},{"location":"topics/the_computing_in_cloud_computing/#servers-and-networks","title":"Servers and Networks","text":"

    Networking Requirements to access a server:

    Why do I think this is important? not only can you make a server (web, data, cluster, etc with cloud but everything you interact with in cloud is a server. You will see many services dedicated to networking in the cloud.

    On our campus, the network is managed by the institution, and it is configured to block all incomming traffic to prevent anyone from running a server which is a security risk.

    "},{"location":"topics/the_computing_in_cloud_computing/#too-much-hardware-virtualization-to-the-rescue","title":"Too much hardware? Virtualization to the rescue","text":"

    If you run a big IT Department that services 1000s of people, you need a lot of servers. Each server can only handle a certain amount of 'traffic.' Hence there are many methods for connecting multiple servers to act as one big server. Each physical machine requires 1) installation 10) maintainence.

    "}]} \ No newline at end of file +{"config":{"lang":["en"],"separator":"[\\s\\-]+","pipeline":["stopWordFilter"]},"docs":[{"location":"","title":"Syllabus","text":"

    from John Constable, Cloud Studies, 19th Century English painter

    "},{"location":"#msu-cloud-computing-fellowship","title":"MSU Cloud Computing Fellowship","text":""},{"location":"#program-summary","title":"Program Summary","text":"

    The program runs Fall semester through Winder/Spring semester.

    Fall semester is dedicated to learning how the cloud works. In-person sessions are approximately bi-weekly (see schedule below). A session includes preparatory readings and activities to orient you to the topic, followed by an in-person meeting on Friday to review the materials, seminar, provide a venue for discussion, and hands-on activities

    Winter/Spring semester is for building a project using cloud computing culminating in a symposium where you present what you've learned and built. Winter/spring sessions are bi-weekly for presentations by the fellows on their project status, discussion on success and challenges, presentations by cloud practitioners, and for general help.

    The culmination of the fellowship is a project resulting in a write-up and presentation during the spring symposium, typically held late-April or early-May.

    "},{"location":"#textbook","title":"Textbook","text":"

    We will occasionally link to the following book:

    \"Cloud Computing for Science and Engineering\", Ian Foster and Dennis B. Gannon, September 2017

    The book website does provide open access to individual chapters.

    "},{"location":"#meeting-location","title":"Meeting location","text":"

    MSU STEM Teaching and Learning Facility 642 Red Cedar Rd Michigan State University. East Lansing, MI 48824

    We plan to hold all sessions in-person.

    "},{"location":"#fall-2023-schedule","title":"Fall 2023 Schedule","text":"

    Each approximately 2-week session consists of - preparatory activities and materials (topics, links, tutorials) prior to meeting - an in-person session for review, activities, and discussion on the friday of week 1 - follow up for week 2

    1. Introduction
    2. Requirements:
      • September 4-8 Complete items in the Welcome email sent by Dr. Parvizi
      • post to teams to say hello
    3. Meeting September 8, 3pm STEM 3201:
      • introduction to the cloud fellowship
      • intro to Cloud/Computing and Azure
    4. Assignments:

    5. How to Cloud

    6. Meeting September 22, 3pm

      • Azure Organization
      • Creating and Using Virtual Machines
    7. Cloud Storage

    8. Meeting October 6, 3pm
    9. Assignment/Exercise: analyzing weather data in the cloud

    10. Databases and Data Analytics Systems on the Cloud for research

      • Meeting October 20, 3pm
      • Exercises: Using SQL database for research data
    11. Big Data Systems and the cloud

      • Meeting November 3, 3pm:
      • Exercise: Using R and Python on a databricks cluster
    12. Serverless Cloud Computing

      • Meeting November 17, 3pm
      • Review Project Requirements and Specification
      • Assignment: email 1-2 sentences describing a project you may undertake by December 6
    13. Azure AI Services

      • Meeting December 1, 3pm:
      • Discussion: Fellowship Projects
      • Demonstration of AI Services
      • Exercise Hands-on reating responder using Python API
      • Assignment: project proposal due January 8, 2024
    "},{"location":"#winterspring-2023-schedule","title":"Winter/Spring 2023 Schedule","text":"

    The second half is dedicated for fellows to complete a cloud computing project based on research interests culminating in a presentation at a symposium in late April

    Fellows will attend bi-weekly meetings where groups of fellows will present the goals and stats of their cloud computing projects for feedback and discussion.

    All meetings are in the MSU STEM Building, room 1201, alternate Fridays 3pm to 4:30pm

    Instructors are available by appointments, and typically during the alternate fridays to answer any questions you have about cloud, projects, or applying cloud computing technology to your research

    1. Turn in Project Proposal Monday, January 8th
    2. Post Written Project Proposal to MS Teams folder prior to 5:00 pm
    3. Additionally survey of fellows to determine symposium dates will be distributed

    4. Schedule meeting with Instructors to review proposals. This is on-going during January to ensure we have time to meet with all fellows one-on-one.

    5. Cloud Computing Seminar TBD January 12th

    6. Project Proposal Presentations Fellows will present their proposals to the fellowship, up to 6 per session, followed by questions and feedback from colleagues

    7. January 26, February 9th, February 23

    8. Project status presentations Fellows will present the status of their projects, describing challenges and successes, and receive questions, feedback, support and help from the fellowship ** March 8, March 22, April 5**

    9. Project Final Reports April 12 A writeup of the the results and lessons from applying cloud computing technology

    10. Symposium Preparation

    11. The data and time of the symposium will be determined January 24 Fellows must turn in Symposium Talk Title & Abstract 3d prior to symposium
    "},{"location":"#msu-cloud-computing-fellowship-symposium","title":"MSU Cloud Computing Fellowship Symposium","text":"

    Fellows will present the outcomes, successes, challenges and lessons learned at a symposium held on MSU campus late April, 2024. The date and time determined in January 2024 with input from the fellows. Fellows are strongly encourage to invite their advisors, mentors and colleagues.

    "},{"location":"#communications","title":"Communications","text":"

    Fellows are encouraged to contact us with questions or if they are ever stuck on an activity we've assigned. In addition to email, we are utilizing Microsoft Teams at MSU (Fellows receive a link in the welcome email). Please feel free to reach on out the MS Teams channel sent to participants at the beginning of the program. Mentioning one of us e.g. @billspat or @parvizm will help get our attention. Additionally you may email us at any time.

    The goal of the fellowship is to foster discussion. We encourage you to add your successes or challenges to any discussion or question Teams.

    If you need interactive, on-going help it may be better to schedule a help session with a fellowship coordinator; and we are happy to meet individually for additional support. This may be especially effective when fellows are developing their projects.

    We also save time during our synchronous meetings for group discussions, so please bring any concerns, difficulties, or successes to our sessions!

    If you are not a participant but have questions about the program, see the Contact page for how to get in touch with us.

    This work is licensed under a Creative Commons Attribution-NonCommercial 4.0 International License

    "},{"location":"about/","title":"About The MSU Cloud Computing Fellowship","text":"

    The MSU Cloud Computing Fellowship is a cross-disciplinary program produced by MSU\u2019s Institute of Cyber-Enabled Research (ICER) and MSU IT Services for invited MSU doctoral students and postdoctoral researchers. As a part of this program, fellows will participate in a series of workshops during the fall semester to:

    "},{"location":"about/#background","title":"Background","text":"

    MSU doctoral students and postdoctoral researchers are invited to apply in the summer and approximately 18 are selected each year. The program started in 2019. If you are an MSU graduate student or post-doc and interested in participating next year, please check back in the Summer of 2022 for announcements on the invitation to participate, or request to join the MSU ICER mailing list

    "},{"location":"about/#citing-the-msu-icer-cloud-computing-fellowship-in-research-publications","title":"Citing the MSU ICER Cloud Computing Fellowship in Research Publications","text":"

    We encourage cloud fellows to acknowledge the fellowship in publications arising from computational work performed during your fellowship project. Please let us know that you have referenced the fellowship, and we will link to your publication on the ICER publication site, which will further increase the visibility of your work. A sample statement can be:

    \"This work was supported in part through Michigan State University\u2019s Institute for Cyber-Enabled Research Cloud Computing Fellowship, with computational resources and services provided by Information Technology Services and the Office of Research and Innovation at Michigan State University.\u201d

    "},{"location":"about/#cloud-computing-fellowship-organizers","title":"Cloud Computing Fellowship Organizers","text":"

    Dr. Brian O'Shea Professor and Director, MSU ICER

    Role: Program Lead, ICER

    Dr. Brian O'Shea is a computational and theoretical astrophysicist studying cosmological structure formation, including galaxy formation and the behavior of the hot, diffuse plasma in the intergalactic medium and within galaxy clusters. He is also a co-author of the Enzo AMR code, an expert in high performance computing, and an advocate for open-source computing and open-source science. He received his B.S. in Engineering Physics at the University of Illinois in Urbana-Champaign (UIUC) in 2000, and his PhD in physics from UIUC in 2005 (with 2002-2005 being spent as a graduate student in residence at the Laboratory for Computational Astrophysics at UC San Diego and in the Theoretical Astrophysics Group at Los Alamos National Laboratory). Following that, he was a Director's Postdoctoral Fellow at Los Alamos National Laboratory, with a joint appointment between the Theoretical Astrophysics Group and the Applied Physics Division. Since 2008, he has been a member of the faculty at Michigan State University, with a joint appointment between the Department of Computational Mathematics, Science and Engineering (2015-present), the Department of Physics and Astronomy (2008-present), and the National Superconducting Cyclotron Laboratory (2014-present). From 2008-2015, Dr. O'Shea was a member of Lyman Briggs College. He has authored or co-authored over 75 peer-reviewed journal articles in astrophysics, computer science, and education research journals, and has received a variety of awards for his teaching and public outreach efforts. In 2016, he became a Fellow of the American Physical Society, and in 2019 he became the director of MSU's Institute for Cyber-Enabled Research.

    Patrick Bills Research Software Engineer, ICER Role: Co-Instructor

    Pat Bills research background is in data systems for ecology (MS Entomology, MSU). He has experience in database design, R, Python, and web application programming. Pat has worked in research IT for over 25 yrs for departments and labs across MSU, including for MSU ICER as a high performance computing research consultant and trainer, for MSU Enterprise services as the technical lead of the data science team, and currently as a research software engineer again for ICER.

    Like many, he has built and worked with on-campus linux systems for many years including the MSU HPC. Pat started his cloud journey in 2017 during a workshop at the HPC conference where he saw Ian Foster (our textbook author) present his vision of research on the cloud. Since then he has used cloud services from Google, Amazon, and Azure

    Dr. Mahmoud Parvizi Research Consultant, MSU ICER Role: Co-Instructor

    Mahmoud earned his PhD in physics from Vanderbilt University with research in high-energy theory in the context of early universe cosmology as well as computational astrophysics. In addition, Mahmoud earned an MBA with a concentration in finance from the University of Michigan - Flint. Mahmoud was formerly a postdoctoral research associate in the Department of Physics and Astronomy at Michigan State University with a focus on machine learning applications of cloud-computing workflows and currently a research consultant for the MSU Institute for Cyber-Enabled Research (ICER). He participated as a cloud fellow in 2019 and co-instructor of the Cloud Computing Fellowship in 2020.

    Mahmoud\u2019s diverse research interests include mathematical and theoretical physics, data-intensive astrophysics, machine learning for precision health, and cloud-computing platforms for academic research. His expertise includes 1) quantum field theory in curved/non-stationary spacetimes; 2) finite temperature quantum field theory and open quantum systems; 3) automated and end-to-end intelligent data pipelines for signal processing using compressed sensing and applied harmonic analysis; 4) machine learning and cloud-computing applications for precision health.

    Sponsored by ICER, the MSU Office of Research and Innovation (ORI), and MSU IT Services Research Cyberinfrastructure (RCI)

    "},{"location":"about/#previous-cloud-fellows","title":"Previous Cloud Fellows","text":"

    2019-2020

    2020-2021

    2021-2022

    Introducing the 2021 MSU Cloud Computing Fellows

    2022-2023

    Introducing the 2022 MSU Cloud Computing Fellows

    4th Annual Cloud Computing Fellows Symposium

    "},{"location":"cloud_glossary/","title":"Glossary of Cloud Terms","text":""},{"location":"cloud_glossary/#why","title":"Why?","text":"

    Researchers using the cloud must know a little about a lot of information technology to get computational work done in their domain specialty. Most cloud glossaries are for systems administrators, not the rest of us. This glossary is much more brief than Wikipedia and hopefully also provides the context a researcher needs to find what you need to use cloud services in your work. Do you have an item to add? Please contact us!

    "},{"location":"cloud_glossary/#other-glossaries","title":"Other Glossaries","text":"

    https://www.cloudbank.org/cloud-terms

    "},{"location":"cloud_glossary/#the-glossary","title":"The Glossary","text":""},{"location":"cloud_glossary/#arm-cpu","title":"Arm CPU","text":"

    CPU from \"Advanced RISC Machines, ltd. While historically most computers used Intel CPUs, ARM provides an alternative CPU that is becoming more popular and present as an option in HPC and Cloud Virtual Machine options. The vast majority of software written for Intel computers is compatible with ARM. Some computational work is sensitive to CPU choice, and CPU choice can affect cost and speed of excecution, so it may be important to understand the implications of this choice of CPU.

    "},{"location":"cloud_glossary/#arm-template","title":"ARM Template","text":"

    A specification file listing all of the cloud resources and configuration settings tha that the Azure Resource Manager can use to create resources for you when you submit it a certain way. Templates are a great shortcut and automation feature but difficult to edit. For details see Azure Documentation: What are ARM templates?

    "},{"location":"cloud_glossary/#azure-resource-manager-arm","title":"Azure Resource Manager (ARM)","text":"

    see Resource Manager

    =#### Blob Storage Azure calls there object cloud storage \"Blobs\". It is similar to Amazon Web Service 'S3' and Google cloud storage buckets. Azure Documentation: Introduction to Azure Blob storage While it's possible to 'mount' blob storage to linux VMs using 'blob fuse' or similar packages, it can not work as you may expect and so in practice Azure Files are a better solution for that. See File Storage

    "},{"location":"cloud_glossary/#client-server","title":"Client-Server","text":"

    Client/Server model of computing is something we use everyday but perhaps dont' use this term. See https://techterms.com/definition/client-server_model You are used to using maybe a dozen clients everyday (phone apps, web browser, ssh to connect to a remote linux, Remote Desktop client to connect to remote desktop server, etc). Cloud computing provides all the infrastructure needed to create servers quickly and easily.

    "},{"location":"cloud_glossary/#cloud-shell","title":"Cloud Shell","text":"

    Cloud computing providers usually have a service where you can run command line (CLI) or terminal commands in a web browser 'shell' This is helpful as the libraries and utilities are pre-installed. See https://docs.microsoft.com/en-us/azure/cloud-shell/overview and Azure Interfaces introduction.

    "},{"location":"cloud_glossary/#containers","title":"Containers","text":"

    Or Docker Containers (not all containers need to be Docker the vast majority of container system use Docker). For R users, see https://colinfay.me/docker-r-reproducibility/ For Python users, there is https://www.netguru.com/blog/python-docker-tutorial although you could read either.

    Linux Containers is a term for a collection of methods and technologies that allows a multiple isolated systems to be run on one Linux computer. This is differnet from virtual machines in that a VM host provides abstract or virtualized hardware so each VM requires it's own portion of memory and CPU cores whereas containers share the main part of Linux (the kernel), memory and CPU more dynamically. The primary comercial company for containers is \"Docker\" so Docker is sometimes used synonymously with 'container' but it is just one form.

    In addition to being more efficient than VMs, most container systems have a system and scripting language for building containers. The means onecan provision an entire system from code. Containers are widely use to package and distribute complex research software systems for example Bioinformatics workflow system \"Cromwell.\" This way reseearches can download and use a pre-installed system without the trouble of getting all of the pre-requistes (dependencies) installed on their machine.

    "},{"location":"cloud_glossary/#cpu","title":"CPU","text":"

    Central Processing Unit, the main 'chip' of a computer, and a core component when specifying a Virtual Machine 'size'

    "},{"location":"cloud_glossary/#devops","title":"DevOps","text":"

    This has many definitions but for researchers the shortcut is using code to make IT infrastructure. Helping developers (like you) do Ops (like sysadmins) with code. see IaC.

    "},{"location":"cloud_glossary/#docker","title":"Docker","text":"

    Docker is the most prevalent form of \"Containers\", e.g Docker is to containers as google is to search. See containers above for details. Note that Docker is many things as once: a method and format for Linux containers, a program for working with container ( e.g. docker build...), a Company, and that's company's hub or repository for storing and access free containers (or your own). Cloud companies also have \"hubs\" or repositories for storing your own Docker containers.

    "},{"location":"cloud_glossary/#file-storage-azure","title":"File Storage (Azure)","text":"

    Also called \"Azure Files.\" Azure cloud storage that is more traditional file sharing, and that can be connected (mounted) to computers and other services using the SMB protocal, making it similar experience to departmental shared fileservers. See https://azure.microsoft.com/en-us/services/storage/files/ and compare with Blob Storage

    "},{"location":"cloud_glossary/#firewall","title":"Firewall","text":"

    A common concept in networking, firewall software on a computer's networking components limits which kind of traffic can come in or out, and restricts which computer internet addresses can connect. Best practices suggest closing all connections via the firewall, only opening those connections for services you need, and only to those users (e.g. your own computer) you need to. Azure additionally has an option to \"allow connections from Azure networks\" so that you can freely connect from the portal, 'cloud shell', or connect from on azure service to another. The implication is that you trust all Azure services.

    "},{"location":"cloud_glossary/#gpu","title":"GPU","text":"

    From Wikipedia: https://en.wikipedia.org/wiki/Graphics_processing_unit GPUs can be very helpful for some code written to use them, especially many machine learning libraries, and Virtual Machines may be provisioned with GPUs.

    "},{"location":"cloud_glossary/#infrastructure-as-code-iac","title":"Infrastructure as Code (IaC)","text":"

    In stead of using a GUI, or manual steps to create cloud computing, cloud resources may be created using scripts that interact with the cloud provider's api, and additional scripts can configure individual resources (such as to install software on a VM or configure a database). Doing this kind of \"provisioning\" with scripts makes it reproducible and debuggable which is at the heart of the Workflow or DevOps mentality.

    "},{"location":"cloud_glossary/#ip-address","title":"IP Address","text":"

    a unique string of characters that identifies each computer using the Internet Protocol to communicate over a network. Your computer will have a different IP address depending on where you are located (home, work, field). In addition, a home wifi router will assign a 'local' ip address for inside your home, but your 'public' internet IP address will be different. To find your own IP address, simply google \"what is my ip.\" All Azure services (VMs, data systems, etc) are assigned IP addresses via networking. see https://docs.microsoft.com/en-us/azure/virtual-network/public-ip-addresses

    "},{"location":"cloud_glossary/#object-storage","title":"Object Storage","text":"

    From NetApp \"What is object storage?: \"...also known as object-based storage, is a strategy that manages and manipulates data storage as distinct units, called objects. These objects are kept in a single storehouse and are not ingrained in files inside other folders. Instead, object storage combines the pieces of data that make up a file, adds all its relevant metadata to that file, and attaches a custom identifier.\" Blob storage is object storage. Objects (e.g. files) are retrieved from a large system via their identifier, not their name. Amazon S3 and Google Cloud storage are also object stores.

    "},{"location":"cloud_glossary/#on-prem","title":"On-prem","text":"

    \"On Premise\" refers to technology (computers, disks, networking, etc) that are on your institutions computer centers or in your own lab. Note that for some researchers, \"on-prem\" can still mean remove (e.g. our HPC is only accessible remotely, so it may not be obvious that it's on premise to users).

    "},{"location":"cloud_glossary/#resource","title":"Resource","text":"

    For AWS and Azure, a resource is an entity that you can work with. The means something you can created, edit or delete via their cloud interface. Could be a computer (virtual machine), a whole cluster (azure batch pool), or some tiny network setting (IP address). Resoures almost always cost money. Resources are listed in your standard dashboard.

    "},{"location":"cloud_glossary/#resource-group","title":"Resource Group","text":"

    Organizational scheme unique to Azure. Nearly all resources must be part of a group and the resource group must be selected (or created ) when creating other resources. Resource groups could be used for specific projects, for 'personal' resources used for multiple projects (or for azure things like cloud shell).

    "},{"location":"cloud_glossary/#resource-manager","title":"Resource Manager","text":"

    Azure calls the system they use to interface between you and cloud resources the \"Azure Resource Manager\" or ARM. There used to be a different way to interact with Azure resources, hence this has a specific name and is referred to in Microsoft documentation.

    "},{"location":"cloud_glossary/#serverless","title":"Serverless","text":"

    This buzz-word applies to many different cloud services, primarily those that the cloud company manages for you, usually referring to cloud functions (AWS Lamba) and sometimes others in the \"Platform As A Service\" service model. The origin is that, if you run virtual machines with operating systems and software install, your are maintaining servers to support that software. If the cloud service does not require you to provision and maintain a server, it is often marketed as \"serverless\" (e.g. recent marketing of Azure Files as \"Serverless file shares\" where on-premise File Sharing requires staff to manage and maintain Windows File Servers.

    "},{"location":"cloud_glossary/#service-models","title":"Service Models","text":"

    This is related to the \"... as a service\" (..aaS) phrases defined in the NIST document which included \"Infrastructure\", \"Platform\" and \"Softare\" as a service (IaaS, PaaS and SaaS). It's a conceptual organization of cloud services based on the stack model of computating with the infrastructure (network, hardware, CPU, etc) at the bottom and Software on the top. See The NIST Definition of Cloud Computing

    "},{"location":"cloud_glossary/#service-level-agreement-sla","title":"Service Level Agreement (SLA)","text":"

    Level of service you expect from a vendor, laying out the metrics by which service is measured, as well as remedies or penalties should agreed-on service levels not be achieved. In Cloud this is often spells out 'uptime,' which is percent of time the system is not down, e.g. 99.99%, and guarantees against data loss and availability. For most research, uptime is not important as we are our own customer and can tolerate some downtime.

    "},{"location":"cloud_glossary/#services","title":"Services","text":"

    Cloud \"services\" are often bundles of resources pulled together for coordinate function. Cloud companies offer hundreds of often closely overlapping services.

    "},{"location":"cloud_glossary/#tags","title":"Tags","text":"

    AWS and Azure allow you add meta data to resource in the form of tags (e.g. hashtags, etc) which are keys and values. When you create a resource you can add a tag indicating the project it is for e.g. \"project\" = \"dna-methylation\" To add more detail if your DNA methylation has multiple aspects or experiments, add more tags like \"experiment\" = \"Fall 2021\"

    For workgroups it's stronlgy suggested you add a \"created_by\" = your netid because it's often difficult in Azure to determine who created a resource if it needs to be turned off or deleted.

    Use tags to organize your Azure resources and management hierarchy

    "},{"location":"cloud_glossary/#tensor-processing-unit-tpu","title":"Tensor Processing Unit (TPU)","text":"

    Google Tensor Processing Unit is specialized computer chip similar to GPUs, used by deep learning libraries such as TensorFlow ( which leads to the question of \"what is a tensor\" and that depends on who you ask but similar to matrix.

    "},{"location":"cloud_glossary/#virtual-machine","title":"Virtual Machine","text":"

    (aka VM) Creating a simulated computer hardware using software, to be able run a guest operating system inside a host system, such that the guest thinks it's running on an actual computer.

    "},{"location":"contact/","title":"Contacting Us","text":"

    If you are a Cloud Computing Fellowship participant this year (or past participant!), please contact the instructors Pat Bills or Mahmoud Parvizi with any issues or questions related to the material or activities.

    The session meetings are designed to have plenty of time for questions, troubleshooting and discussion. We will also schedule office hours prior to meeting times to help with pre-meeting activities.

    If you have general questions about the MSU Cloud Computing Fellowship, please contact Brian O'Shea

    If you will be an MSU graduate student or post-doc in the next Fall, and are interested in participating, please check back in the Summer for announcements for invitation to participate. The request for applications is announced on the MSU ICER mailing list and several other mailing lists around campus. We encourage anyone with an active research program that could benefit from cloud computing to apply

    If you are an MSU Researcher interested in using cloud for your research, please contact IT Services or MSU ICER via our ticketing systems and describe your needs.

    "},{"location":"projects/","title":"Projects","text":""},{"location":"projects/#cloud-computing-fellowship-projects-2022-2023","title":"Cloud Computing Fellowship Projects 2022-2023","text":"

    The primary activity of the Cloud Computing Fellowship is to support the fellows to create and present a cloud-computing-based project working with research data. During Fall semseter the fellowship provides materials and help to learn core cloud concepts and activies, and Winter/Spring semester is devoted to project development.

    "},{"location":"projects/#time-line-and-due-dates","title":"Time-line and Due dates","text":"

    Fellows deliver a proposal for their projects in early January 2024, and present that proposal to their colleagues in the fellowship. See the schedule for due dates. In Winter 2024 more detail will be provided on this site.

    "},{"location":"projects/#questions-answers-and-other-notes","title":"Questions, Answers and other Notes","text":"

    Q. Do I have to use my own data for my project or can I use data from the web or other public data?

    A. you can bring any data that you may use for your research, or that demonstrates cloud processes you may use in your research.

    Q. Could I work on a problem outside of my research for my project

    A. Yes. We encourage fellows to consider some small aspect of their own research to apply to their projects, but not all research can be readily adapted for cloud computing to contribute, especially with very limited time and budget. If the project is related, even tangentially, to your current research project, and you feel your chosen project will advance your career or knowledge of cloud for later application, then by all means please pursue and present what you've learned.

    Q. Do I have to use programming in my project?

    A. Most of the examples provided in the fellowship talk about processing data with scripts such as R or Python and many researchers are using these for data analysis, but it's not required for a successful project. You could install a program on a powerful virtual machine and show how to use that software along with cloud storage to tackle a large data set (for example). Secondly there are many forms of cloud computing that are not traditional such as data systems which may use a GUI or a language like SQL.

    One important aspect of a successful project is \"workflow thinking\" or how could you design your process so that you could do it 100 times or with some form of automation. That often requires programming but there are cloud systems that don't require programming (e.g. Azure Data Factory). Accumulating and organizing data is a huge part of successful research and using cloud tools to facilitate that and documenting the process, advantages and costs would be a successful project.

    Q. Do I have to use Virtual Machine as part of my project?

    No you don't, and in fact we encourage you to look for other services in the cloud to work with your data or your research processes.

    Q. Do I have to use services that we've covered in the sessions?

    A. Cloud companies provide many amazing services, and you are not limited to what we've talked about in the sessions. In addition we don't require you to use \"computation\" based services alone . If you are interested in using some other service, please contact us and we may find useful resources or connect you with a colleague who has used the service in mind.

    Q. Are there constraints on the things I want do with my project? Can I do whatever I want?

    A. Our goal is to facilitate your education and advancing your research program as it relates to cloud computing, and that is a very broad goal. If you use the fellowship to develop only a small system to show what's possible or not possible, even on public data, that uses cloud computing, that is an acceptable project.

    Q. I want to make a web site or application for my project, can I use a VM? how do I do that?

    A. This is a common request and the cloud was invented in part to run web applications. However web application design is a huge subject and the programming involved is almost as complex as any programming or data work you've done for your research. We tend to discourage projects focused on web applications because of the work involved to both 1) create the infrastructure for a website (web server, storage, databases, possibly docker containers, etc) and 2) the web application itself (Python/PHP other language, HTML, Javascript, Style Sheets, etc).

    Azure has services for hosting websites but don't attempt this for your project unless you have previous experience making websites or web applications, or if you are up for the big challenge of learning webdev along with cloud computing because the research you are showing off is mostly complete. Secondly web services must be on-line 24/7 and the cost may accumulate quickly.

    Finally cybsecurity is a major issues for websites which present an open door to anyone on the Internet. keeping your site secure is a major challenge so during development please turn it off when you are not using it, and consider that web applications are hacked routinely.

    However if you are ready to devote the time and this is a goal for your and your advisor please come speak with us as we have experience creating research web applications and we will support you.

    "},{"location":"exercises/azure_portal_walkthrough/","title":"Exercise: Azure Portal Walk-through and Storage account creation","text":"

    from MSU Cloud Computing Fellowship Session 1

    "},{"location":"exercises/azure_portal_walkthrough/#about","title":"About","text":"

    This is an exercise and introduction to the web interface to manage Microsoft Azure cloud services. Prior to doing this exercise, please read Azure Organization For more background on how azure is structured.

    For definition of terms used in this walkthrough , refer to our Cloud Glossary including \"resource\", \"azure resource manager\" and \"resource group\" or our list of cloud references for introduction to cloud computing.

    For this activity we'll be using the web interface which Azure calls the \"Portal\" but that is only one of several ways to interface with Azure that we will learn about. Many of the activities you can accomplish in the portal you can accomplish with the other (command line or code) interfaces.

    Azure's own overview of the Portal is here: https://docs.microsoft.com/en-us/azure/azure-portal/azure-portal-overview Please refer to that as well as this material.

    There is a corresponding video that we've made that includes infrmation about the portal, and also creating a storage account.

    "},{"location":"exercises/azure_portal_walkthrough/#orientation-to-the-azure-portal","title":"Orientation to the Azure Portal","text":"

    The link above is to a video that walks through the description and tutorial steps below, hosted on MSU MediaSpace ( requires MSU Log-in). Note this video also walks through creating a storage account.

    This assumes you have an Azure account and a valid subscription. For the purposes of this introduction, we assume that your account currently does not have ability to create a new subscription, resource group,

    1. Log-in to https://portal.azure.com with your MSU Netid.
      1. If you are a current member of the fellowship and you have difficulty logging in, please contact us right away.
    2. orientation: dashboard view. Azure portal first presents a \"dashboard\" which is organized into panels that show some aspect of your cloud account. You may alter the panels on this dashboard to show you the services and aspects of azure that are most important to you. For information on how to create customize your dashboard, see \"Create a dashboard in the Azure portal.\" In the standard, default version of the dashboard the first panel is a list of resources. If you have not created any resources yet you won't see anything. We will explorer resources later in this introduction. The standard dashboard panes are a list of your current resources (which may be in multiple resource groups), an advertisement with a link to learn about some new Azure service, and more links to create things the Azure has decided are most important to you. We will focus on the \"All Resources Pane\" If you click on anything here you can almost always use the back button to get back to the dashboard, or use the menu (described below)
    3. Top Bar Menu: the top menu ( three horizontal bars) is are links to many of the things also on the main dashboard. The \"home\" view is not the same as the dashboard but is a list of links to things Azure guess you may want to create, and a list of all of your resources. If you click \"resource groups\" in this list, you should see only one resource group (if any) unless you've been added to others or a different subscription.
    4. Search bar: in the middle of the top of the screen is white box in which you can type search terms include the kind of resource you want to see or create, or part of the name of specific resource you've created. This is what I use to create and find resources most of the time (and rarely use the links provided), more on that later.
    5. Shortcut buttons: the next few icons are short cuts to other functionality in the portal that we will cover in the future. Most are not critical.

    6. A note about portal navigation: When you click anything in the portal, it creates a new window without reloading the browser and with an X at the top right. This mimics a \"close window\" function and You can use the X return to the dashboard, or you may simply use the menu and go to where you need to

    Notice that like most things there are 4-5 ways to get to anywhere.

    "},{"location":"exercises/azure_portal_walkthrough/#bonus-what-can-you-do-here","title":"Bonus: What can you do here?","text":"

    The primary purpose of using the portal and your resource group is to create things, and manage and monitor those things. For the purpose of this activity - since you don't really have anything - we can simply look at the 'activity log' in the left side-panel near the top. - this opens a new table of columns Operation name, Status, Time, Time stamp, etc that is probably empty for you. - Tables of information like this in the portal have filters at the top. The default activity is just for the previous 6 hours. If you click on the Find that filter called \"timespan\" and select 1 week (or longer) you can see when I created the resource group and the budget.

    "},{"location":"exercises/azure_portal_walkthrough/#next-steps-create-a-storage-account","title":"Next Steps: Create a Storage Account","text":"

    For a good follow up exercise, see Creating a Storage Account with the Portal

    "},{"location":"exercises/azure_portal_walkthrough/#about-portal-resource-pages","title":"About Portal \"Resource\" Pages","text":"

    Most cloud resources in the portal have a list of categories on the left side, and pages for each category in the center. The first page is the \"Overview\" which has the resource group, subscription, and other info important for that resource. this followed by the \"Activity Log\" showing how the resource has been used. Each of the following items on the left side is a new page of additional options to alter how the resource is configured. For example if you click the \"tags\" section you see the tags you added (if any) and can modify or add new tags.

    Some of the options are not available on the forms when you create the resource, or the names of the options on these resource pages do not match the forms when you created the resources. In that case you may have to use two steps to configure the resource as you like, or better consider using a programmatic interface

    Again we did not discuss any of the characteristics of cloud storage or how to use it but you should now have enough familiarity with the azure portal to follow other tutorials to create and use storage or other resources.

    "},{"location":"exercises/azure_vm_walkthrough/","title":"Exercise: Creating and Connecting to a Virtual Machine (VM) for both Windows and Linux","text":""},{"location":"exercises/azure_vm_walkthrough/#about","title":"About","text":"

    This is an exercise and introduction to creating Virtual Machines (VMs) and related resources using the Azure Portal.

    There are two nearly identical activities, and you only need complete one of them:

    1. creating a Windows virtual machine and connecting with a graphic interface (GUI), namely Remote Desktop (rdp) to demonstrate how you may use full graphic software (like Rstudio, Matlab, etc) on a cloud computer
    2. creating a Linux Virtual machine and connection with the command line to demonstrate how you may use a terminal interface (or scripting) on a cloud computer.

    We will use a pre-configured virtual machine with software already installed for both versions. When creating a VM you can use an Azure template and there are many of these. The Data Science Virtual Machine (DSVM) from Azure has R, Python and many data science and statistical libraries available. For more information about the Azure DSVM see https://azure.microsoft.com/en-us/services/virtual-machines/data-science-virtual-machines/ and for the list of tools installed, see https://docs.microsoft.com/en-us/azure/machine-learning/data-science-virtual-machine/tools-included Azure has a new product called \"Azure Machine Learning\" that we may cover in a future session.

    "},{"location":"exercises/azure_vm_walkthrough/#requirements-for-both-activities","title":"Requirements for both activities","text":"

    You need an Azure account with an active subscription, and a resource group of your own to work in. Fellows have these things provided.

    This exercise assumes you understand how to use the Azure Portal, which is covered in the Azure Portal Walkthrough. In addition it's helpful to know what a virtual machine is but it's not crucial to complete the exercise. For more information on VMs see the readings session 2

    It's helpful to have basic understanding of the \"Client-Server\" model of computing as the VM we create will be running servers (remote desktop server for Windows, and ssh command line server for Linux)

    Finally we find that there are many layers of concepts related in this exercise related to IT Infrastructure, and we are happy to provde clarification as needed.

    "},{"location":"exercises/azure_vm_walkthrough/#optional-video-walk-through","title":"Optional Video Walk-through","text":"

    There was a previous exercise that created a Windows Virtual Machine only (from 2021). The following video is based on the exercise. Watching and following the video is not necessary to complete the exercise on this page, and it does not cover linux. However if you find videos more helpful, or would like to see in detail how it works, please take advantage of this walk-through:

    Link to Video for the Windows version of exercise. On mediaspace.msu.edu which requires an MSU log-in and is only availavble to participants in the MSU Cloud computing fellowship

    The materials that the video follows from 2021 are here, only use those if you need to, otherwise please continue below.

    "},{"location":"exercises/azure_vm_walkthrough/#creating-a-windows-virtual-machine","title":"Creating a Windows Virtual Machine","text":"

    This section is based on Windows, and is recommended for everyone as it is the easy way to connect to remote machine. For an equivalant exercise based on Linux, scroll down. If at any point, or if you are exploring, you can't seem to get the configuration correct (or there is a validation error you can't fix), starting over will not create any resources or incur charges. Go back to step 1 below.

    "},{"location":"exercises/azure_vm_walkthrough/#requirements-for-windows-vms","title":"Requirements for Windows VMs","text":"

    To connect to a Windows VM desktop, it's recommend you use the Microsoft Remote Desktop client.

    "},{"location":"exercises/azure_vm_walkthrough/#1-selecting-the-resource-template","title":"1. Selecting the Resource Template","text":"

    In the Azure Portal open the top left menu, and click \"+ Create a resource\" option (the first option)

    In the create resource search box, type \"data science virtual machine\" and press enter to search. It will present you with some of the suggested options as you type but please search.

    In the options select Data Science Virtual Machine - Windows 2022 (preview) ** (note there is also a 2019 version but they seem very similar and will both work for this exercise )

    Click \"Create\" ( note: do not click the \"start with a pre-set configuration\" option )

    "},{"location":"exercises/azure_vm_walkthrough/#2-configure-the-vm-using-the-azure-portal","title":"2. Configure the VM using the Azure Portal","text":"

    The resource creation forms work as described in the Azure Portal but since we used a pre-set configuration some of the values will be completed.

    "},{"location":"exercises/azure_vm_walkthrough/#basics","title":"Basics","text":"
    1. Subscription should be \"MSU Cloud Computing Fellowship\"

    2. Resource Group should be your CF resource group (the one with your netid). The default is to create a new resource group but participants aren't allow to create their own group, you must select the resource group with your netid.

    3. Virtual machine name Name: You could name it anything that is unique in the region you choose, but to help keep track of your resources, I strongly suggest using a name that includes your netid and the purpose of this VM: dsvm-netid-exercise2

    one option is to combine the project or activity (e.g. ), your net id, and some description of what you are doing. In the name above, replace \"netid\" with your own MSU netid. - Note that different resources have different naming restrictions. For example VMs the rules are \"can be almost anything, but Azure resource names cannot contain special characters \\/\"\"[]:|<>+=;,?*@&, whitespace, or begin with '_' or end with '.' or '-' \" - Note if you have an existing VM with this name, add a number 2 or other suffix. We will delete this VM and create something more suitable in the future.

    1. Region Select any region or use the deafult. In the future, when creating resources (like VMs) that access your storage account, should use the same region as that. For this exercise it doesn't matter as we will be deleting these resources. For me, the default was \"(US) Central US\"

    2. Availability Options Leave the default (\"Availability Zone\")

    3. Availability Zone Leave the default ( \"Zones 1\")

    4. Security Type You must change this value to \"Standard\" security type. The \"Trusted\" security option is for servers or production machines.

    5. Image should be \"Data Science Virtual Machine - windows...\" if this is changed you may have to re-enter some info again.
    6. VM Architecture Leave as the default x64 (Intel compatible)
    7. Azure Spot Instance leave unchecked.
    8. Size You can leave the size that is currently selected. NOTES: This is how you select the specifications for CPU and memory. The size you for this exercise doesn't matter for the outcome, but it will show prices which may be interesting. If you click this drop-down menu you may see some other sizes and prices. The Monthly price assumes 24 hour/day operation. Your price to experiment will often be less than $1.00

    9. Administrator Account Just like you need to log-in to your own computer, you must create a user account for the VM. Select a User name and account that you will easily remember, because you will need it to log-in to the new VM.

      • username : use any user name you will easily remember. I use my netid so I can always remember.
      • password : this must be a complex password, but use something you can remember, or copy/paste from another program. Do not use your MSU password or any other passwords you use
    10. Licensing Unlike Linux, Windows requires a license, and this option are for organization with an arrangement with Azure. Leave this box unchecked and Azure will add the extra charges (a few cents per hour) for the use of Windows. If you use a Windows VM for your research, you may be able to use an MSU license.
    "},{"location":"exercises/azure_vm_walkthrough/#disks","title":"Disks","text":"

    Leave these as the defaults.

    I want to point out one option that \"Delete with VM.\" We will talk about this in the future, but for now it's like purchasing the computer and the disk inside separately. In this case we are just testing so we will delete everything after we are done, but in practice there are reasons for keeping the disk around after you delete the VM so you may sometimes want to uncheck this box

    "},{"location":"exercises/azure_vm_walkthrough/#networking","title":"Networking","text":"

    You must create a 'virtual network' for you VM to be connected to (note historically Azure created this for you). Click \"create new\" to open the new network form.

    Create Virtual network

    1. enter a Name : suggest adding \"-vnet\" to your proposed VM name. For me this was \"dsvm1-billspat-ccf23-vnet
    2. leave all the rest of the settings as-is with the defaults
    3. click the [OK] button at the bottom of this form.
    "},{"location":"exercises/azure_vm_walkthrough/#other-settings","title":"Other Settings","text":"

    For this exercise we'll be using the default values for almost all the pages except for Basics page. However you are encouraged to look through these options to see what is involved in creating a virtual machine. The Azure VM documentation covers many of them. For example a VM requires several networking components. The good news is that Azure will name and create these for you, which will see.

    "},{"location":"exercises/azure_vm_walkthrough/#tags","title":"Tags","text":"

    For this exercise, using tags will be essential for identifying which components go to which VM. If you need more information see session 2 page for readings about tags. On the tags section, do the following:

    1. Click \"tags\" in the top row of options (just before 'review and create')
    2. In the first row, For Name, type activity and for the Value type session2 vm or similar unique value.
    3. Optionally, in an additional row, create another tag with Name created by and for Value put your netid. This kind of tag can be essential when you are sharing cloud accounts with other members of your work group, so that others in your group may identify who created the resources.
    "},{"location":"exercises/azure_vm_walkthrough/#review-and-create","title":"Review and Create","text":"
    1. click \"review and create\" at the bottom of the screen.

    If there are errors the form name will have a red dot next to it. Go back to that form and see what may be the issue.

    If the Validation passed, it will display the approximate hourly cost to use this VM. Mine says 0.1920 USD/hr

    Click \"Create\" and the deployment will start. It will take at most 15 minutes.

    Now, please skip down the the Viewing VM Resources section below

    "},{"location":"exercises/azure_vm_walkthrough/#optional-creating-a-linux-virtual-machine","title":"Optional: Creating a Linux Virtual Machine","text":"

    This sections is nearly identical to the section above with Windows, but uses Ubuntu Linux, and does not use a graphical interface (although with some work this is possible).

    "},{"location":"exercises/azure_vm_walkthrough/#requirements","title":"Requirements","text":"

    To connect to Linux you need an terminal or command line interface with an ssh client software. If you have used the MSU HPC, this is the same method for connection.

    "},{"location":"exercises/azure_vm_walkthrough/#creating-a-linux-virtual-machine","title":"Creating a Linux Virtual Machine","text":"

    If at any point, or if you are exploring, you can't seem to get the configuration correct (or there is a validation error you can't fix), starting over will not create any resources or incur charges. Go back to step 1 below.

    "},{"location":"exercises/azure_vm_walkthrough/#1-selecting-the-resource-template_1","title":"1. Selecting the Resource Template","text":"

    In the Azure Portal open the top left menu, and click \"+ Create a resource\" option (the first option)

    In the create resource search box, type \"data science virtual machine\"

    In the options select Data Science Virtual Machine - Ubuntu 20.04

    "},{"location":"exercises/azure_vm_walkthrough/#2-configure-the-vm-using-the-azure-portal_1","title":"2. Configure the VM using the Azure Portal","text":"

    The resource creation forms work as described in the Azure Portal but since we used a pre-set configuration some of the values will be completed.

    "},{"location":"exercises/azure_vm_walkthrough/#basics_1","title":"Basics","text":"
    1. The Subscription should be \"Cloud Computing Fellowship\" and resource group should be your CF resource group (with your netid).

    2. Virtual machine name Name: must be unique in the region. I suggest using your netid to name it, and add abbreviations for what you are creataing and for which activity. For example dsvm1-netid-ccf23 Use your actual NetId , for example \"dsvm1-billspat-ccf23\"

    Note that different resources have different naming restrictions. For example VMs the rules are \"can be almost anything, but Azure resource names cannot contain special characters \\/\"\"[]:|<>+=;,?*@&, whitespace, or begin with '_' or end with '.' or '-' \"

    Note if you have an existing VM with this name, add a number 2 or other suffix. We will delete this VM and create something more suitable in the future.

    1. Region You may select \"(US) North Central US\" or any other US-based region.
    2. Availability Options select \"No infrastructure Redundancy required\" this option is for critical infrastructure that needs to withstand a serious outage (e.g. if a hurricane affects a data center). You may also see an \"availability zone\" option appear (perhaps with an error message \"The value must not be empty\"). Selecting \"\"No infrastructure Redundancy required\" in the availability zone will remove the \"availability zone\" field and error message.
    3. Security Type Leave as 'standard'
    4. Image should be \"Data Science Virtual Machine - Unbuntu..\" if this is changed you may have to select it again from the list. Any Linux image is fine for this tutorial as
    5. VM Architecture leave as x64 (Intel processor compatible)
    6. Run with Azure Spot discount leave unchecked.
    7. Size You can leave the size that is currently selected, which is based on the pre-set configuration from the previous step. This is how you select the specifications for CPU and memory. The size you for this exercise doesn't matter for the outcome, but it will show prices which may be interesting. If you click this drop-down menu you may see some other sizes and prices. The Monthly price assumes 24 hour/day operation. Your price to experiment will often be less than $1.00 Click \"see all sizes\" if you are feeling adventurous -- there are maybe 100 options. (click the [x] in upper right to close the size selector window)
    8. Administrator Account Just like you need to log-in to your own computer, you must create a user account for the VM.
    9. Authentication Type For the purpose of this exercise, select \"password\" SSH Keys are strongly recommened but to keep this simple we will use a password.
    10. UserName Select a User name and account that you will easily remember, because you will need it to log-in to the new VM. You can use your MSU NetID for your username so it's easy to remember.

    11. password : something you can remember, but is complex to be secure. Do not use your MSU password or any other passwords you use

    "},{"location":"exercises/azure_vm_walkthrough/#disks_1","title":"Disks","text":"

    You can leave the defaults for this page.

    "},{"location":"exercises/azure_vm_walkthrough/#networking_1","title":"Networking","text":"

    You must create a 'virtual network' for you VM to be connected to (note historically Azure created this for you). Click \"create new\" to open the new network form.

    Create Virtual network

    1. enter a Name : suggest adding \"-vnet\" to your proposed VM name. For me this was \"dsvm1-billspat-ccf23-vnet
    2. leave all the rest of the settings as-is with the defaults
    3. click the [OK] button at the bottom of this form.
    "},{"location":"exercises/azure_vm_walkthrough/#other-options","title":"other options","text":"

    For this exercise we'll be using the default values for almost all the pages, except for 'Basics' , 'Networking' and . However you are encouraged to look through these options to see what is involved in creating a virtual machine. The Azure VM documentation covers many of them. For example a VM requires several networking components. The good news is that Azure will name and create these for you, which will see.

    "},{"location":"exercises/azure_vm_walkthrough/#tags_1","title":"Tags","text":"

    Using the Azure portal to create VM creates several resources (up to 12). Using tags will be essential for identifying which components go to which VM. This is the metadata associated with these resources. I suggest using a tag like \"activity\" to indicate which of our activities was used to create these resources.

    1. Click \"tags\" in the top row of options (just before 'review and create')
    2. In the first row, For Name, type activity and for the Value type session2
    3. click \"review and create\"
    "},{"location":"exercises/azure_vm_walkthrough/#review-and-create_1","title":"Review and Create","text":"

    If there are errors the form name will have a red dot next to it. Go back to that form and see what may be the issue.

    If the Validation passed, it will display the approximate hourly cost to use this Linux VM. Mine says 0.0730 USD/hr

    Click \"Create\" and the deployment will start. It will take at most 15 minutes.

    Linux Users continue to the next section

    "},{"location":"exercises/azure_vm_walkthrough/#viewing-vm-resources-in-your-resource-group-windows-and-linux","title":"Viewing VM Resources in your Resource group (Windows and Linux)","text":"

    You have a few options now. You can wait for the deployment to complete in the portal. When it's ready, the Azure portal will display a message and a link to \"go to resource.\"

    However you can also go to the page that lists the items in your resource group to find and explore while the deployment is in progress.

    1. Open your resource group in the portal:
      1. click the portal menu on the top left, and select \"resource groups\"
    2. From the list, select your CF21 group.
    3. When the deployment is finished, you should see several new resources
      • They will have the same name prefix \"CF21netid-dsvm\" but may have a suffix indicating the kind of resource (e.g. CF21-netid-dsvm1-ip
      • The second column is the \"type\" which helps identify what they are

    click for a large view in a new tab/window

    1. Select the item with type \"virtual machine\" and click on the name to open its resource page (for example, cf21-billspat-dsvmtest item in the screenshot above)
    "},{"location":"exercises/azure_vm_walkthrough/#the-vm-resource-page","title":"The VM Resource Page","text":"

    To see the details for your virtual machine, click the VM in your resource group if you haven't already.

    click for larger view

    Note that the Azure portal will show a few errors/warnings if the deployment is not complete. You may see a warning that the 'agent' in the VM is not working, but you can ignore it. It will go away when the VM configuration is complete.

    There are many details here but some immediate things to notice:

    "},{"location":"exercises/azure_vm_walkthrough/#connecting","title":"Connecting","text":""},{"location":"exercises/azure_vm_walkthrough/#connecting-to-a-windows-vm-using-remote-desktop-protocol-rdp-client","title":"Connecting to a Windows VM using Remote Desktop Protocol (RDP) client","text":"

    You may connect to this VM running the Windows operating system with either graphical desktop, a command line connection, or both.

    Every VM created in Azure has an \"IP Adress\" or internet address, and we use this to connect to.

    The following Azure documentation describes how to connect to a Windows VM: https://docs.microsoft.com/en-us/azure/virtual-machines/windows/connect-logon

    Here are more detailed instructions:

    There is a 'connect' link on the left side in the \"Settings\" section of the left menu.

    The connect pane looks something like this:

    Connect with RDP (remote desktop protocol) is a Microsoft method for connecting to the graphical desktop. For Mac/Linux requires additional software (mentioned at the beginning of this page).

    This is because we are using a temporary certificate but it is secure. Click \"Yes\"

    Starting up the VM Once you connect for the first time, the Windows VM will provision the VM user account and will install things during and after start-up. Feel free to close any windows. Once the installations are finished, you may use the machine as you would any other windows computer. You can start Jupyter notebooks to work with Python. Previous version of the Azure Data Science Virtual Machine has Rstudio installed on it, but the latest version only seems to have the base R interface.

    We will cover how to transfer code and files to a VM in a later session. If you are comfortable with using the command line, you can use git clone... to download code to run.

    Explore to see what is already pre-installed on this VM. If you start with a standard version of Windows, you will have to install your own software.

    When you finished with your remote session you may simply close the remote windows (leaving the VM running. See below for how to turn it off and delete it.

    Optional: Connect to the Windows DSVM with ssh

    NOTE In 2023 the 'connect' option in the Azure portal has a button beneath the RDP section that says \"more ways to connect.\" Inside this is a \"native ssh\" section. This only have instructions for how to connect with SSH. there is no special file to download like RDP.

    This windows machine has an SSH Server running, and the security settings from the pre-configured version allow connections from SSH. If you are familiar with ssh and the command line, you may start the CMD.EXE on your windows computer, or the Mac Terminal, and enter ssh <username>@<ipaddress>

    Where the username is the user you put for your VM when you created it, and the Public IP address is listed on the VM Resource page.

    This is similar to how you connect to the MSU HPC, if you are HPC user.

    You will be asked to add the host to your list hosts, and enter the password you used when you created the VM.

    When you log-in you will be connected to the Windows command prompt (e.g. C:\\Users\\username>

    To Exit, type exit at the command prompt.

    Next Steps: For information on turning off the VM and for eventually deleting the VM, scroll down below the Linux section as these operations are the same in the Azure portal for Linux or Windows virtual machines.

    "},{"location":"exercises/azure_vm_walkthrough/#connecting-to-a-linux-vm-using-ssh","title":"Connecting to a Linux VM using SSH","text":"

    We will connect and use this remote VM running the Linux operating system with a command line connection. It is possible to use a graphical connection but requires additional setup beyond the scope of the short exercise.

    In addition this assumes you have some familiarity with using the command line and starting your terminal program.

    There is a 'connect' link above the 'essentials' list, and a connect link on the left side - they both go to the same place.

    Connect with SSH

    this is the standard method of connecting with ssh, but we've included as much detail as possible for those who are new to using ssh.

    You may use the machine as you would any other linux computer. For more information about what software is installed, see We will cover how to transfer code and files to a VM in a later session.

    When you finished with your remote session you may simply close the remote windows (leaving the VM running. See below for how to turn it off and delete it.

    "},{"location":"exercises/azure_vm_walkthrough/#starting-and-stopping-the-vm-both-windows-and-linux","title":"Starting and Stopping the VM (both Windows and Linux)","text":"

    There are three ways to \"stop\" or turn off a VM. 1. when connected to it, e.g. in the remote desktop, use Windows to turn it off. The VM is then \"stopped.\" In a Linux ssh session you may use a command like sudo shutdown -h now When the Operating system is shut off, and hence tthe VM is not running, but it is still \"allocated.\" When you turn it back on, it will come on immediately. 1. Use the Azure portal to \"stop\" the VM which shuts down Windows (gracefully if possible) and 'deallocates' the VM. Restarted the VM appears to be the same process, but Azure must allocate resources first to run it, then power it up. This is cheaper then the first method in the long run 1. Delete it.

    "},{"location":"exercises/azure_vm_walkthrough/#stopping-deallocating-the-vm-with-the-portal","title":"Stopping (deallocating) the VM with the Portal:","text":"
    1. Go to the resource page for the VM, if you are not already.
    2. If you are just entering the portal, find your resource group, find the VM in your resource group (identified as a VM in the \"type\" column of the list of resources), and click to open the resource page.
    3. The Status field near the top of this screen will indicate running or stopped.
    4. Find the Start and Stop buttons near the top of this screen and click \"stop\" if the machine is running.
    5. There is a warning about losing your IP address, with a check box to reserve it.
      • If you plan on deleting the VM now, click \"ok\"
      • If you plan on restarting the VM and reconnecting, first check the box \"reserve the IP\" then click OK
      • The default is to use a \"dynamic\" address which is assigned every time you turn on the VM
      • When using a dynamic address, you must copy/paste the ip address, or re-download the RDP connection file everytime you restart the machine
      • the solution is to use a \"Static IP\" either when you create the VM, or assigning one after the VM is created. and checking the box does so.
      • you can also convert to a static IP with the portal, but it is not a straightforward process, see https://docs.microsoft.com/en-us/azure/virtual-network/virtual-networks-static-private-ip-arm-pportal
      • Pricing for a static ip is here: https://azure.microsoft.com/en-us/pricing/details/ip-addresses/ which as of now is $0.0036/hour which is charged even if the VM is turned off. That is approx $2.70/month
    6. It's a good idea to leave VMs in a \"stopped (deallocated)\" state if you are not using them for computations or providing a service, just as you would turn off or put your laptop to sleep. The main reason for this is for security.
    "},{"location":"exercises/azure_vm_walkthrough/#deleting-the-resources-both-windows-and-linux","title":"Deleting the Resources (both Windows and Linux)","text":"
    1. Open the Resource group as above
    2. When creating resources using the template as we did above, the resources associated with this VM will all start with the same prefix, so they are easy to identify. Select them with checkboxes, and click the \"Delete\" button which is on the top right of the screen (not the \"delete resource group\" button)
    3. If it's not obvious which resources are all included, you may also use the \"tag\" you created to filter what is listed and only show those with the same \"tag.\" For more information see https://docs.microsoft.com/en-us/azure/azure-portal/manage-filter-resource-views . If you add filter on tag, then you may select all the items that are shown, and delete those.
    4. after selecting confirm the deletion by typing \"yes\"

    Creating resources just to delete them may seem wasteful however we will cover how to save a \"snapshot\" and/or \"image\" of your VM's disk so that you may re-use any work to install and configure software withtout incurring charges.

    "},{"location":"exercises/azure_vm_walkthrough/#more-references","title":"More References","text":"

    Azure has very abbreviated versions of this exercise if you would like another perspective. They assume you can create your own resource group (which you don't have the ability to do currently in the fellowship)

    https://docs.microsoft.com/en-us/azure/machine-learning/data-science-virtual-machine/overview#next-steps

    **Data Science Use Case Tutorials from Azure: **

    If you follow these, just remember to delete the resources you create when you are done exploring

    Return to the Session 2 page

    "},{"location":"exercises/azure_windows_vm_walkthrough/","title":"Exercise: Creating a Windows Virtual Machine (VM)","text":"

    This is a previous version of a windows-only VM walk through from 2020, kep for historical reasons

    Please use our updated version that covers both Windows and Linux

    Link to Video for this exercise on mediaspace.msu.edu (requires log-in)

    "},{"location":"exercises/azure_windows_vm_walkthrough/#about","title":"About","text":"

    This is an exercise and introduction to creating Virtual Machines (VMs) and related resources using the Azure Portal. This exercise assumes you understand how to use the Azure Portal, which is covered in the Azure Portal Walkthrough. In addition it's helpful to know what a virtual machine is but it's not crucial to complete the exercise. For more information on VMs see session 2).

    We will use a pre-configured virtual machine with software already installed. When creating a VM you can use an Azure template and there are many of these. The Data Science Virtual Machine (DSVM) from Azure has R, Python and many data science and statistical libraries available. For more information about the Azure DSVM see https://azure.microsoft.com/en-us/services/virtual-machines/data-science-virtual-machines/

    "},{"location":"exercises/azure_windows_vm_walkthrough/#requirements","title":"Requirements","text":"

    You need an account in azure with an active subscription, and a resource group of your own to work in. Fellows have these things provided.

    "},{"location":"exercises/azure_windows_vm_walkthrough/#creating-and-connecting-to-a-windows-virtual-machine","title":"Creating and Connecting to a Windows Virtual Machine","text":""},{"location":"exercises/azure_windows_vm_walkthrough/#requirements_1","title":"Requirements","text":"

    To connect to a Windows VM desktop, it's recommend you use the Microsoft Remote Desktop client.

    "},{"location":"exercises/azure_windows_vm_walkthrough/#creating-a-windows-virtual-machine","title":"Creating a Windows Virtual Machine","text":"

    If at any point, or if you are exploring, you can't seem to get the configuration correct (or there is a validation error you can't fix), starting over will not create any resources or incur charges. Go back to step 1 below.

    "},{"location":"exercises/azure_windows_vm_walkthrough/#1-selecting-the-resource-template","title":"1. Selecting the Resource Template","text":"

    In the Azure Portal open the top left menu, and click \"+ Create a resource\" option (the first option)

    In the create resource search box, type \"data science virtual machine\"

    In the options select **Data Science Virtual Machine - Windows 2019 **

    The \"Plans\" section has a description of the template if you would like to know more.

    Click the \"start with a pre-set configuration\" option.

    "},{"location":"exercises/azure_windows_vm_walkthrough/#2-select-the-pre-set-configuration","title":"2. select the pre-set configuration","text":"

    These configurations help to select your VM size based on your activity. We will use the default options and click \"Continue to create a VM\"

    The options do not affect the outcome of the exercise so at this step explore each option

    Click \"Continue to create a VM\"

    "},{"location":"exercises/azure_windows_vm_walkthrough/#3-configure-the-vm-using-the-azure-portal","title":"3. Configure the VM using the Azure Portal","text":"

    The resource creation forms work as described in the Azure Portal but since we used a pre-set configuration some of the values will be completed.

    "},{"location":"exercises/azure_windows_vm_walkthrough/#basics","title":"Basics","text":"
    1. The Subscription should be \"Cloud Computing Fellowship\" and resource group should be your CF resource group (with your netid). As we create additional resource groups for this

    2. Virtual machine name Name: CF21-netid-dsvmtest One option is to combine the project (e.g. the fellowship), your net id, and some description of what you are doing. In the name above, replace \"netid\" with your own MSU netid.

    Note that different resources have different naming restrictions. For example VMs the rules are \"can be almost anything, but Azure resource names cannot contain special characters \\/\"\"[]:|<>+=;,?*@&, whitespace, or begin with '_' or end with '.' or '-' \"

    Note if you have an existing VM with this name, add a number 2 or other suffix. We will delete this VM and create something more suitable in the future. 1. Region Select \"(US) North Central US\" 1. Availability Options select \"No infrastructure Redundancy required\" this option is for critical infrastructure that needs to withstand a serious outage (e.g. if a hurricane affects a data center). You may also see an \"availability zone\" option appear (perhaps with an error message \"The value must not be empty\"). Selecting \"\"No infrastructure Redundancy required\" in the availability zone will remove the \"availability zone\" field and error message. 1. Image should be \"Data Science Virtual Machine - windows...\" if this is change you may 1. Azure Spot Instance leave unchecked. 1. Size You can leave the size that is currently selected. This is how you select the specifications for CPU and memory. The size you for this exercise doesn't matter for the outcome, but it will show prices which may be interesting. If you click this drop-down menu you may see some other sizes and prices. The Monthly price assumes 24 hour/day operation. Your price to experiment will often be less than $1.00 1. Administrator Account Just like you need to log-in to your own computer, you must create a user account for the VM. Select a User name and account that you will easily remember, because you will need it to log-in to the new VM. * username : use any user name you will easily remember, perhaps your netid * password : something you can remember, but is complex to be secure. Do not use your MSU password or any other passwords you use 1. Licensing Unlike Linux, Windows requires a license, and this option are for organization with an arrangement with Azure. Leave this box unchecked.

    "},{"location":"exercises/azure_windows_vm_walkthrough/#disks-and-other-settings","title":"Disks and Other Settings","text":"

    For this exercise we'll be using the default values for almost all the pages except for Basics page. However you are encouraged to look through these options to see what is involved in creating a virtual machine. The Azure VM documentation covers many of them. For example a VM requires several networking components. The good news is that Azure will name and create these for you, which will see.

    "},{"location":"exercises/azure_windows_vm_walkthrough/#tags","title":"Tags","text":"

    Using tags will be essential for identifying which components go to which VM. This is the metadata associated with these resources. I suggest using a tag like \"activity\" to indicate which of our activities was used to create these resources.

    1. Click \"tags\" in the top row of options (just before 'review and create')
    2. In the first row, For Name, type activity and for the Value type session2
    3. click \"review and create\"
    "},{"location":"exercises/azure_windows_vm_walkthrough/#review-and-create","title":"Review and Create","text":"

    If there are errors the form name will have a red dot next to it. Go back to that form and see what may be the issue.

    If the Validation passed, it will display the approximate hourly cost to use this VM. Mine says 0.1920 USD/hr

    Click \"Create\" and the deployment will start. It will take at most 15 minutes.

    "},{"location":"exercises/azure_windows_vm_walkthrough/#4-the-resources","title":"4. The Resources","text":"

    While the deployment is in progress you may explore the operation details or click any of the resources that have been created.

    1. Open your resource group in the portal:
      1. click the portal menu on the top left, and select \"resource groups\"
    2. From the list, select your CF21 group.
    3. When the deployment is finished, you should see several new resources
      • They will have the same name prefix \"CF21netid-dsvm\" but may have a suffix indicating the kind of resource (e.g. CF21-netid-dsvm1-ip
      • The second column is the \"type\" which helps identify what they are

    click for a large view in a new tab/window

    1. Select the item with type \"virtual machine\" and click on the name to open its resource page (for example, cf21-billspat-dsvmtest item in the screenshot above)
    "},{"location":"exercises/azure_windows_vm_walkthrough/#5-the-vm-resource-page","title":"5. The VM Resource Page","text":"

    To see the details for your virtual machine, click the VM in your resource group if you haven't already.

    click for larger view

    There are many details here but some immediate things to notice:

    "},{"location":"exercises/azure_windows_vm_walkthrough/#6-connecting","title":"6. Connecting","text":"

    You may connect to this VM running the Windows operating system with either graphical desktop, a command line connection, or both.

    The following Azure documentation describes how to connect to a Windows VM: https://docs.microsoft.com/en-us/azure/virtual-machines/windows/connect-logon

    Here are more detailed instructions:

    There is a 'connect' link above the 'essentials' list, and a connect link on the left side - they both go to the same place.

    Connect with RDP (remote desktop protocol) is a Microsoft method for connecting to the graphical desktop. For Mac/Linux requires additional software (mentioned at the beginning of this page).

    This is because we are using a temporary certificate but it is secure. Click \"Yes\"

    Once you connect, you may see Windows starting up and installing things. Feel free to close any windows. Once the installations are finished, you may use the machine as you would any other windows computer. If you type Rstudio in the search box, you may launch an Rstudio session on this remote computer. It also has Python, many python libs and Jupyter notebook.

    We will cover how to transfer code and files to a VM in a later session.

    When you finished with your remote session you may simply close the remote windows (leaving the VM running. See below for how to turn it off and delete it.

    Optional: Connect to the Windows DSVM with ssh

    This windows machine has an SSH Server running, and the security settings from the pre-configured version allow connections from SSH. If you are familiar with ssh and the command line, you may start the CMD.EXE on your windows computer, or the Mac Terminal, and enter ssh <username>@<ipaddress>

    Where the username is the user you put for your VM when you created it, and the Public IP address is listed on the VM Resource page.

    This is similar to how you connect to the MSU HPC, if you are HPC user.

    You will be asked to add the host to your list hosts, and enter the password you used when you created the VM.

    When you log-in you will be connected to the Windows command prompt (e.g. C:\\Users\\username>

    To Exit, type exit at the command prompt.

    "},{"location":"exercises/azure_windows_vm_walkthrough/#7-starting-and-stopping-the-vm","title":"7. Starting and Stopping the VM","text":"

    There are three ways to \"stop\" or turn off a VM. 1. when connected to it, e.g. in the remote desktop, use Windows to turn it off. The VM is then \"stopped.\" The VM is not running, but it is still \"allocated.\" When you turn it back on, it will come on immediately. 1. Use the Azure portal to \"stop\" the VM which shuts down Windows (gracefully if possible) and 'deallocates' the VM. Restarted the VM appears to be the same process, but Azure must allocate resources first to run it, then power it up. This is cheaper then the first method in the long run 1. Delete it.

    Stopping (deallocating) the VM with the Portal:

    1. Go to the resource page for the VM, if you are not already.
    2. If you are just entering the portal, find your resource group, find the VM in your resource group (identified as a VM in the \"type\" column of the list of resources), and click to open the resource page.
    3. The Status field near the top of this screen will indicate running or stopped.
    4. Find the Start and Stop buttons near the top of this screen and click \"stop\" if the machine is running.
    5. There is a warning about losing your IP address, with a check box to reserve it.
      • If you plan on deleting the VM now, click \"ok\"
      • If you plan on restarting the VM and reconnecting, first check the box \"reserve the IP\" then click OK
      • The default is to use a \"dynamic\" address which is assigned every time you turn on the VM
      • When using a dynamic address, you must copy/paste the ip address, or re-download the RDP connection file everytime you restart the machine
      • the solution is to use a \"Static IP\" either when you create the VM, or assigning one after the VM is created. and checking the box does so.
      • you can also convert to a static IP with the portal, but it is not a straightforward process, see https://docs.microsoft.com/en-us/azure/virtual-network/virtual-networks-static-private-ip-arm-pportal
      • Pricing for a static ip is here: https://azure.microsoft.com/en-us/pricing/details/ip-addresses/ which as of now is $0.0036/hour which is charged even if the VM is turned off. That is approx $2.70/month
    6. It's a good idea to leave VMs in a \"stopped (deallocated)\" state if you are not using them for computations or providing a service, just as you would turn off or put your laptop to sleep. The main reason for this is for security.
    "},{"location":"exercises/azure_windows_vm_walkthrough/#8-deleting-the-resources","title":"8. Deleting the Resources","text":"
    1. Open the Resource group as above
    2. When creating resources using the template as we did above, the resources associated with this VM will all start with the same prefix, so they are easy to identify. Select them with checkboxes, and click the \"Delete\" button which is on the top right of the screen (not the \"delete resource group\" button)
    3. If it's not obvious which resources are all included, you may also use the \"tag\" you created to filter what is listed and only show those with the same \"tag.\" For more information see https://docs.microsoft.com/en-us/azure/azure-portal/manage-filter-resource-views . IF you add filter on tag, then you may select all the items that are shown, and delete those.
    4. after selecting confirm the deletion by typing \"yes\"
    "},{"location":"exercises/exercise_budget_alert/","title":"MSU Cloud Computing Fellowship: Costs and Budgets with Microsoft Azure","text":"

    (Almost) everything you do in Azure has a cost, and costs for resources often acrue over time, wether the resource is in use or not. This is a short excercise to recieve an email when you have spent a certain amount of money. This can be valuable if you are experimenting and forget to delete a resource that you no longer need.

    For this work, You must first have a 'budget' in your resource group. We created a budget for 2022 for all fellowship participants that you can use for creating alerts.

    If you have not yet, please go through the \"Intro to the Azure portal\" exercise for more context about what we are doing.

    "},{"location":"exercises/exercise_budget_alert/#background","title":"Background","text":"

    See the \"costs\" section in the topics for details.

    In Azure you can set a 'budget' for a single resource (like a virtual machine), your whole resource group, or we could set on for the whole fellowship. However setting a budget doesn't stop you from spending anything or invoke any action.

    Once you set a budget or maximum dollar amount you'd like to spend, you need to to then add either actions or alerts when some threshold within that budget is reached.

    We have set budgets for your resource group in the fellowship. However you need to now set an alert to send you an email when you reach a spending amount. You can set multiple alerts. for example, we will set an alert when you reach a certain threshold.

    For details about this service, see the Azure Cost Management + Billing documentation. This specific exercise works with budgets and assumes there is one in your resource group. If you do not have a budget on your account, or if you'd like to create a new kind of budget please contact us and we will assist you. However if you are comfortable with Azure concepts, see this advanced [Azure Budget Tutorial

    https://learn.microsoft.com/en-us/azure/cost-management-billing/costs/tutorial-acm-create-budgets

    "},{"location":"exercises/exercise_budget_alert/#steps-to-add-a-cost-alert-to-an-existing-budget-your-resource-group","title":"Steps to add a \"cost alert\" to an existing budget your resource group.","text":"

    Find the Premade Budget

    Add an 'alert' to that budget

    You may add additional alerts if you want to be reminded at different thresholds of spending, e.g. 25%, 50%, 80%. One advantage to setting a low threshold like 20% of your budget is to help you learn how much things cost or to be alerted if there are resources you've created but didn't realize they still existed or were costing anything.

    I hope these instructions were clear but again, any questions please contact us using email or MS Teams.

    "},{"location":"exercises/exercise_create_storage_account/","title":"Creating a \"Storage Account\" with the Azure Portal","text":"

    (From: Session 1 - Introduction)

    This is a good activity to explore the Azure portal by creating a new resource. Storage accounts do not accrue much cost until you fill them up with data. Please review the exercise Azure Portal Walk-through if you haven't.

    We have not talked about Cloud storage, however you don't need to know about Cloud storage to complete this tutorial. This is simply an exercise to see how you would create something using the Azure portal, and Cloud storage is a benign (and very inexpensive) resource to use an example.

    Note that a \"storage account\" is not the same as \"disk\" you will see when you create a virtual machine. We will discuss the difference in detail in the session on storage.

    "},{"location":"exercises/exercise_create_storage_account/#requirements","title":"Requirements:","text":"

    All members of the current Cloud Computing Fellowship cohort have these things.

    "},{"location":"exercises/exercise_create_storage_account/#creating-a-storage-account-step-by-step","title":"Creating a storage account step-by-step.","text":""},{"location":"exercises/exercise_create_storage_account/#first-step-accessing-a-storage-account-template","title":"First Step: Accessing a Storage Account Template.","text":"
    1. Log-in to the Azure portal if you have not already. (https://portal.azure.com)
    2. Click the menu (top left, three horizontal bars).
    3. Select Home from the menu. (This is to ensure we all have the same view)
    4. Select Create a Resource in the upper left screen under Azure Services. Yes we could have click \"storage accounts\" instead but we want to demonstrate how to use the next screen...
      • Note: The current screen is where you can create almost any service Azure offers, and additional services created by third-parties or companies that are not Microsoft. When you are starting, ensure you are creating a service from Microsoft (we'll show you how in the next step)
    5. In the lower search bar (labeled Search services and marketplace), type Storage account Note that \"storage\" alone lists many other kinds of resources.
    6. You will see a list of several services. Select the first one labeled Storage account (icon looks like a green spreadsheet).
      • Note: The description of the service will say the provider, which should be Microsoft, if not go back using the back button and search for storage account again.
    7. Click Create under Storage account.
    "},{"location":"exercises/exercise_create_storage_account/#second-step-setting-up-the-storage-account","title":"Second Step: Setting up the Storage Account.","text":"

    Note: The Azure resource creation screens mostly work like this: there are so many settings Azure has split these up into groups which are listed horizontally across the top. You may work though these by clicking each group, OR finish a screen, and click \"Next..\" button on the bottom of the form. At any time you may click \"Review and Create\" and if you've missed some crucial setting, Azure will not let you create the resource without fixing it. We will go page-by-page for these settings

    1. Basics:

      1. Subscription: Cloud Computing Fellowship
      2. Resource Group: Select your resource group provided to you.
      3. Storage Account Name:

        • some resources have restrictions on naming. Next to storage account is an \"i\" in a circle that has more information. For storage accounts, they must be unique in region, and only numbers and lowercase letters are allowed. I don't know if Non-US letters are allowed (e.g.\u7bb1)
        • use your MSU ID (NetID) when you name things so help me keep track and also to help find a name that is unique. So, replace \"NETID\" with your MSU NetID here: \"stNETIDccf22\" e.g. stbillspatccf22
        • If you are repeating this tutorial, simply add a \"2\" or \"B\" e.g. \"stbillspatccf22B\" We can delete these experiments later.
      4. Region (Location): Change this location to US Central. Click in here to see the options. In practice, pick the region that is closest to you or where your data will be moving to (e.g. North Central US for MSU) but there are other considerations.

      5. Performance: Standard
      6. Redundancy: change from GeoRedundant to \"Locally Redundant\" (LRS). We won't see a difference, and LRS is cheaper. Beneath that, leave the \"make read access....\" box checked.
      7. Click next...Advanced
    2. Advanced:

      • Leave all of these settings as-is. Click next...
    3. Networking:
      • Leave all of these settings as-is. Click next...
    4. Data Protection:
      • Leave all of these settings as is. These settings allow you to recover files up to 7 days after deleting or over-writing. click next...
    5. Encryption:
      • Leave all of these settings as is. click next...
    6. Tags:
      • Tags are optional but eventually highly recommended. For now you can leave them blank.
    7. Review and create
      • review gives you a chance to double check your settings before committing
      • click Create
    "},{"location":"exercises/exercise_create_storage_account/#third-step-deploying-the-storage-account","title":"Third Step: Deploying the Storage Account","text":"
    1. Deployment
      • Azure calls the process of creating cloud resources a \"deployment.\" This term comes from the software engineering process of first \"building\" an application or utility (or \"compiling\" which is often not necessary for scripting languages like Python or R) and then moving that application onto the IT servers that make it available. On your own computer you download software that is already \"built\" (e.g. MS Word) and installing it is a form of deployment.
      • Deployment takes a while as the Azure Resource Manager takes your order and runs the code to generate the cloud resource you've described.
      • You may leave this page and the deployment will continue in the background.
    2. Finish and Review

      • When the deployment is complete, in the top bar of the Azure portal you'll see a number badge on the \"Notification\" icon indicating the number of messages you have (probably just 1). Click on the Notifications icon to show this message.
      • the message should be something like: Deployment succeeded Deployment 'resourcename_12345678901234' to resource group 'group name' was successful.
      • \"Go to Resource\" button will open the Portal page with options for the resource
      • \"Pin to Dashboard\" will create a new tile that is a shortcut to this resource on your dashboard for easy access. If you want to experiment with dashboard arranging then it's ok to click this and easy to remove later from your Portal Dashboard (it will be added to the bottom)
    3. Examine Resource (storage)

      • We have not talked about how storage works but the storage resource page is a good example to learn how the Portal is organized.
      • If you didn't already click \"go to resource\", open the top menu and click \"home\"
      • the Portal \"Home\" has a list of \"recent resources\" and this should be at the top.
    "},{"location":"exercises/exercise_using_the_cloud_to_summarize_and_visualize_data/","title":"Exercise: using the cloud to summarize and visualize data.","text":""},{"location":"exercises/exercise_using_the_cloud_to_summarize_and_visualize_data/#overview","title":"Overview","text":"

    The basic task of this project is analyze data in the cloud: copying data and code to the cloud, and using cloud computing to run a basic script, and save the output to cloud storage. We provide the data and the code (in R and Python ) with clear description of how to run it.

    The goal is to assess whether the structure of this material was sufficient (did we do our jobs?), that you were able to synthesize it, and hence you as a fellow are ready to take on a cloud project.

    The goal is not to determine your ability to run code (which you most like can already do!), use git, use the command line, or to be a systems admin but just to assess what piiece of this small puzzle we may need to reinforce. All steps should be able to be completed without having to write any code at all, except tp run the program. We hope this unified exercise helps fill any gaps in practical and potentially practical understanding of how computing in the cloud works. Or, even better, that it's so easy that it seems like busy work.

    "},{"location":"exercises/exercise_using_the_cloud_to_summarize_and_visualize_data/#process","title":"Process","text":"

    We are here to help along the way, and happy to answer any an all questions. The goal is to not present a step by step tutorial but to provide guidelines for how you should approach the problem. If you have issues it would be very help to us for you to review the course materials to determine if we've provided the information or links to the information to know if we need to augment these materials. However we will aways answer your questions as they come up.

    If you review this and find it very easy, you want to use something other than a VM to do calculations, or have code and data of your own you'd like to run, that is great! The goal is to help you accomplish a computation in a way that you may use in your project.

    "},{"location":"exercises/exercise_using_the_cloud_to_summarize_and_visualize_data/#output","title":"Output","text":"

    We ask that you prepare a short, informal description of the resources you used, how you used them to move data and execute code, and the costs associated with those resources. In addition any technical challenges, lack of clear documentation, or any other issues that needed to be overcome to complete this will be helpful to us.

    "},{"location":"exercises/exercise_using_the_cloud_to_summarize_and_visualize_data/#data","title":"Data","text":"

    The data is a simple CSV file of approximately 450,000 weather observations near the MSU campus. Details about the data file and it's origin are documented in the code site linked below. In addition a direct link for downloading the suggested data set will be sent to the fellows in email. While the data is in the public domain, for each download there is a small cost. Hence we are not posting the URL on this public site to prevent bots from repeatedly downloading the file.

    "},{"location":"exercises/exercise_using_the_cloud_to_summarize_and_visualize_data/#code","title":"Code","text":"

    The code we suggest you run is available on Github: https://github.com/msucloudfellowship/msu_ccf_miniproject There is a Python and an R version. The data is not in the github repository, but you should have recieved a link to download it, and there are instructions and code for downloading the data from the source for Lansing or other weather stations.

    "},{"location":"exercises/exercise_using_the_cloud_to_summarize_and_visualize_data/#task-details","title":"Task Details","text":"

    We expect you to create the following elements. If you already have some of these cloud resources, of course it's more efficient to re-use those but we want to get a cost element for all aspects, so we recommend creating a new resources (e..g. a new storage account) for this mini project.

    You can use the Azure portal to accomplish many if not not all of these tasks, excpet to run your actual program,

    "},{"location":"exercises/exercise_using_the_cloud_to_summarize_and_visualize_data/#due-dates","title":"Due dates","text":"

    The due date will be discussed in the email but they are flexible.

    "},{"location":"exercises/exercise_windows_filestorage/","title":"Exercise: Using File Storage with Windows VM","text":""},{"location":"exercises/exercise_windows_filestorage/#overview","title":"Overview","text":""},{"location":"exercises/exercise_windows_filestorage/#using-file-storage-with-windows-vm-step-by-step","title":"Using File Storage with Windows VM step-by-step.","text":""},{"location":"exercises/exercise_windows_filestorage/#first-step-create-a-storage-account","title":"First Step: Create a Storage Account","text":"
    1. We have already set up storage accounts in a previous tutorial. Refer back to the tutorial (Creating Azure Cloud Storage Accounts) if you still need to create one, however the one you have currently should work for this tutorial.
    "},{"location":"exercises/exercise_windows_filestorage/#second-step-create-an-azure-file-share","title":"Second Step: Create an Azure File Share","text":"
    1. Go to your Storage Account

      • On the homepage, there should be a list of \"Resources\" in the middle of the page. Click the one with Type listed as Storage Account
    2. Select File Shares

      • On the left side of the screen there is a menu. Under the \"Data Storage\" section is the File Shares button
    3. Add a File Share

      • Towards the top of the screen click the + File Share button
    4. File Share Properties

      • Basics
        1. Name the File Share qsfileshare
        2. Keep Tier as Transaction Optimized
      • Click Review + Create
    5. Create a new txt file titled qsTestFile on your local machine

      • Go to your file folder, and in any directory of your choice - Right Click and select a new .txt file
    6. With your file share open in Azure, click Upload (on the top middle section of the screen)

    7. Upload your created txt file

      • Select Browse your Files and navigate to the directory you chose earlier, then attach your txt file
    "},{"location":"exercises/exercise_windows_filestorage/#third-step-deploying-a-vm","title":"Third Step: Deploying a VM","text":"

    We've created the storage account and the file share with a file in it. We now need to deploy a VM.

    1. Create the Resource

      • Expand the left side menu and click Create a Resource
      • Under \"Popular Azure services\" select Virtual machine
    2. Setting the VM Properties

      • Basics
        1. Resource Group: Select the Cloud Computing Fellowship Resource group
        2. Virtual machine name: qsVM
        3. Security Type: Standard
        4. Image: Windows Server 2019 Datacenter - x64 Gen2
        5. Set your Username and Password to something you will remember for logging in to the VM
        6. Select Inbound Ports: HTTP and RDP (3389)
      • Select Review and Create
      • Select Create
      • When deployment is done, select Go to Resource
    "},{"location":"exercises/exercise_windows_filestorage/#fourth-step-connect-to-your-vm","title":"Fourth Step: Connect to Your VM","text":"
    1. Select Connect on the VM properties page

    2. Click Select on the Native RDP File

    3. Download the RDP File

      • On the right side menu select the Download RDP File under section 3
    4. Open the VM on your local machine

      • Open the downloaded RDP file
      • Select Connect on the pop-up
      • Put the username and password that you created in the VM setup (if you are on a windows machine you may need to click \"More Choices\" before logging in)
      • You may get a certificate warning, you can ignore that
    "},{"location":"exercises/exercise_windows_filestorage/#fifth-step-map-the-azure-file-share-to-a-windows-drive","title":"Fifth Step: Map the Azure File Share to a Windows Drive","text":"
    1. In the Azure portal, navigate to your qsfileshare and select Connect
    2. Click Show Script in the right-hand menu pop-up
    3. This will display a script in the same menu. Copy and paste this script into your notepad.
    4. Go back to your VM
      • Open Windows Powershell
      • Paste in the contents of your notepad
      • Press Enter
      • You will see \"Credential added successfully\" when it works
    "},{"location":"exercises/exercise_windows_filestorage/#sixth-step-working-with-snapshots","title":"Sixth Step: Working with Snapshots","text":"
    1. Create a Share Snapshot

      • Adding a snapshot in the Azure Portal
        1. In the Azure Portal, navigate to the file share
        2. Select Snapshots (located in the left hand side menu)
        3. Select + Add a Snapshot and click Ok
      • In your VM, open the qstestfile.txt and type \"This file has been modified\".
      • Save and close the file.
      • Create another snapshot (repeat steps a-c)
    2. Browse a Share Snapshot

      • On your file share, select Snapshots
      • Select the first Snapshot in the list
      • Select qsTestFile.txt
    3. Restore from a Snapshot

      • Ensure you're in the file share Snapshot tab
      • Right click the qsTestFile
      • Select Restore
      • Select Overwrite Original File and click Ok
      • Open the file in the VM. It should be restored and have no text in it.
    4. Delete a Share Snapshot

      • On your file share Snapshot list, select the last snapshot in the list
      • Select Delete
    5. Use a Share Snapshot in Windows

      • You can view snapshots from your mounted Azure file share by using the Previous Versions tab
        1. In your VM File Explorer, locate the mounted share. It should be titled qsfileshare and have a boxy symbol
        2. Select qstestfile.txt and Right Click
        3. Select Properties from menu
        4. Select Previous Versions - this shows you a list of previous snapshots
        5. Select Open
    6. Restore from a Previous Version

      • In the same screen we were just in, rather than selecting \"Open\", select \"Restore\"
    "},{"location":"exercises/exercise_windows_filestorage/#seventh-step-delete-the-resources","title":"Seventh Step: Delete the Resources","text":"
    1. Click on your Resource Group
    2. Select everything except the storage account you created in Session 1
    3. Select Delete NOT \"Delete Resource Group\" to delete the resources
    4. Go to your storage account and delete the fileshare as well
    "},{"location":"exercises/storage_pricing_exercise/","title":"None","text":"

    Prior to doing this exercise, See the reading and lecture slides for Cloud Storage for definitions of terms.

    How large, approximately, is your data? If you are unsure, estimate 100 gb. How much would it cost to keep it in the cloud?

    Compare the pricing for Blob, Files and Disk storage for 6 months

    Aspects Of Storage:

    Types of Storage to Compare:

    "},{"location":"exercises/storage_pricing_exercise/#optional-compare-with-on-premise-storage-costs","title":"Optional: compare with On-premise storage costs","text":"

    The MSU HPC offers 1TB storage with redundant backups and high-speed access for free, with each additional 1TB for $125/year. Since this is network attached storaage is this comparable to Azure Files or Azure Blob storage?

    If you need 2TB storage ( 1 free + 1 paid), what is the approximate Azure cost for 2000gb for 12 months, ignoring all operatinal costs (just storage)?

    "},{"location":"references/","title":"Cloud Computing References and Links to Azure Documentation","text":""},{"location":"references/#cloud-computing-for-research","title":"Cloud Computing for Research","text":"

    \"Cloud Computing for Science and Engineering\", Foster and Gannon

    Using Cloud Computing for Academic Research, Mahmoud Parvizi, unpublished draft, 2021.

    Several additional resources for learning about cloud from Cloudbank, a west-coast consortium to help researchers use cloud computing: https://cloudbank-project.github.io/cb-resources/

    Very in-depth case study of cloud for simulations (climate models): \\ Cloud Computing for Climate Modelling: Evaluation, Challenges and Benefits. Montes, D., et al. Computers 2020, 9(2), 52; https://doi.org/10.3390/computers9020052(2020).

    "},{"location":"references/#general-cloud-computing-interest","title":"General Cloud Computing Interest","text":"

    Historical Note Who Coined 'Cloud Computing'? by Antonio Regalado, October 2011, MIT Technology Review

    Intro to Cloud Computing from Microsoft which is primarily for IT people responsible for spending money and maintaining IT Infrastructure: MS Training Describe cloud computing

    "},{"location":"references/#azure-resources","title":"Azure Resources","text":""},{"location":"references/#general-azure-references","title":"General Azure References","text":"

    Main Azure Documentation : https://docs.microsoft.com/en-us/azure/

    List of All Azure Services : https://portal.azure.com/#allservices

    Azure Tips and Tricks : https://microsoft.github.io/AzureTipsAndTricks/

    Azure Portal \"How to\" series - focused on using the Azure portal to do several different things. This is mostly about the services themselves, not the portal, and many topics do not apply to us (e.g. Azure Arc) but there are some very useful videos : https://youtube.com/playlist?list=PLLasX02E8BPBKgXP4oflOL29TtqTzwhxR

    These look like really good intros to Azure, but requires a time investment. The examples are not really research computing examples but may be valuable learning examples. Most of these lessons were taken from other 'learning paths' and are still oriented towards IT professionals

    Microsoft Learn: - Azure for Researchers part 1: Introduction to Cloud Computing - Azure for Researchers part 2: Cloud Security and Cost Management

    "},{"location":"references/#azure-books-available-to-the-msu-community-via-the-library","title":"Azure Books available to the MSU Community via the Library","text":"

    Search for Microsoft Azure, ordered by date

    Microsoft Azure Functions: Developing Serverless Solutions Trevoir Williams, Packt Publishing 2022

    Practical Azure SQL Database for Modern Developers Davide Mauri, Silvano Coriani, Anna Hoffman, Sanjay Mishra, Jovan Popovic Apress 2021.

    Planning, Deploying, and Managing the Cloud Julian Soh, Marshall Copeland, Anthony Puca, Micheleen Harris. Apress 2020.

    "},{"location":"references/#interface-azure-portal","title":"Interface: Azure Portal","text":"

    Azure Portal Documentation : https://docs.microsoft.com/en-us/azure/azure-portal/

    Microsoft Azure Hierarchy: Organize your Azure resources effectively

    Re-organize your portal view by creating a new dashboard (optional) : https://docs.microsoft.com/en-us/azure/azure-portal/azure-portal-dashboards

    Azure portal productivity Tips : https://microsoft.github.io/AzureTipsAndTricks/blog/tip329.html#azure-portal-productivity-tips

    https://microsoft.github.io/AzureTipsAndTricks/blog/tip329.html

    "},{"location":"references/#azure-interface-azure-command-line","title":"Azure Interface: Azure Command Line","text":"

    Command-line progamming of Cloud Services

    "},{"location":"references/#azure-storage","title":"Azure Storage","text":"

    Create a Storage Account:

    https://docs.microsoft.com/en-us/azure/storage/common/storage-quickstart-create-account

    Azure Storage Explorer: https://azure.microsoft.com/en-us/features/storage-explorer/

    Blob Storage Documentation: https://docs.microsoft.com/en-us/azure/storage/blobs/

    Create and Manage a Storage Account: https://docs.microsoft.com/en-us/azure/storage/common/storage-quickstart-create-account

    Using the CLI with Storage Reference: https://docs.microsoft.com/en-us/cli/azure/storage/account

    Using PowerShell Storage Reference: https://docs.microsoft.com/en-us/powershell/module/azure.storage

    Create blob storage with CLI:

    https://docs.microsoft.com/en-us/azure/storage/common/storage-azure-cli

    Create blob storage with PowerShell:

    https://docs.microsoft.com/en-us/azure/storage/blobs/storage-quickstart-blobs-powershell

    "},{"location":"references/#compute","title":"Compute","text":"

    Overview of Compute Options: https://docs.microsoft.com/en-us/azure/architecture/guide/technology-choices/compute-overview

    Choosing an Azure Compute Service (Decision Tree): https://docs.microsoft.com/en-us/azure/architecture/guide/technology-choices/compute-decision-tree

    "},{"location":"references/#interface-arm-templates","title":"Interface: ARM templates","text":"

    Azure Resource Manager Templates are JSON-formatted configuration files that dictate which resources to create.

    See also information on 'Bicep', which is Azure's sipmlified (but still complex) template language to replace the ARM templates

    Overview of ARM templates: https://docs.microsoft.com/en-us/azure/azure-resource-manager/templates/overview

    explore quick start ARM templates (web): https://azure.microsoft.com/en-us/resources/templates/

    explore quick start ARM templates (github): https://github.com/Azure/AzureStack-QuickStart-Templates

    "},{"location":"references/#r-and-azure","title":"R and Azure","text":"

    https://blog.revolutionanalytics.com/2018/12/azurestor.html

    https://cloudblogs.microsoft.com/opensource/2019/07/01/azurer-available-create-manage-monitor-azure-services-r/

    https://docs.microsoft.com/en-us/azure/architecture/data-guide/technology-choices/r-developers-guide

    https://docs.microsoft.com/en-us/azure/machine-learning/studio-module-reference/r-packages-supported-by-azure-machine-learning

    https://github.com/Azure/AzureContainers

    https://github.com/Azure/AzureR

    https://github.com/Azure/AzureRMR

    "},{"location":"references/#python-and-azure","title":"Python and Azure","text":"

    https://azure.microsoft.com/en-us/develop/python/

    https://docs.microsoft.com/en-us/azure/python/

    https://github.com/Azure/azure-sdk-for-python

    https://github.com/Azure/azure-storage-python

    https://azure.github.io/azure-sdk/releases/latest/all/python.html (Note that pypi.org/project/azure/ is deprecated/obsolete if you find that via google)

    "},{"location":"references/#matlab-and-azure","title":"MATLAB and Azure","text":"

    https://blogs.msdn.microsoft.com/uk_faculty_connection/2017/06/29/running-matlab-on-azure-provision-a-matlab-distributed-computing-server-using-azure-vms/

    https://github.com/mathworks-ref-arch/matlab-on-azure

    https://www.itcentralstation.com/products/comparisons/mathworks-matlab_vs_microsoft-azure-machine-learning-studio

    https://www.mathworks.com/solutions/cloud.html

    "},{"location":"references/#microsoft-azure-cosmos-db","title":"Microsoft Azure Cosmos DB","text":"

    CosmosDB is a very large scale data system that can act like other database systems including SQL, MongoDB (a popular no-sql database), and others. It's advantage is that it can handle extremely large data sets (65tB) but is easy to get started. Google and AWS have similar offereings ( \"BigQuery\" and \"Aurora\" respectively).

    If your data is not large, consider using SQL data systems which are also very widely used (and can be used on your own computer)

    Intro: https://docs.microsoft.com/en-us/azure/cosmos-db/introduction

    It can be free to use, but you have to turn that on when creating the service for your account: https://docs.microsoft.com/en-us/azure/cosmos-db/free-tier

    You can run a notebook inside the databaase to queery data with python :

    "},{"location":"references/#cloud-architecture","title":"Cloud Architecture","text":"

    This section has resources for advanced to intermediate cloud users who are interested in much more details that most researchers will ever need, and are really geared for IT staff. However, sometimes to find insight into how to approach your problem (especially for cloud timing ooptimazation projects) these may have useful sections.

    Microsoft Azure Infrastructure Services for Architects by John Savill, Oct 2019, available from the MSU Library : http://catalog.lib.msu.edu/record=b13538669~S39

    Azure has changed since 2019 but may still be relevant

    "},{"location":"sessions/01_introduction/","title":"Introducing the MSU Cloud Computing Fellowship","text":"You don't have to face the clouds alone"},{"location":"sessions/01_introduction/#welcome","title":"Welcome!","text":"

    This is the first 'session' of the MSU Cloud Computing Fellowship (CCF) for 2022-2023. For a description of the program and how sessions are organized, see the CCF home page

    The goals of this introductory session are to orient you to this program, introduce ourselves to each other, provide some background on cloud computing, set up our technology, and discuss what all of our expectations are.

    "},{"location":"sessions/01_introduction/#activities","title":"Activities:","text":"

    Introduce yourself on Microsoft Teams

    You should have all been given access to a Team \"MSU ICER Cloud Computing Fellowship\" via your NetID.

    Confirm Access to Azure Portal

    "},{"location":"sessions/01_introduction/#introductions","title":"Introductions","text":""},{"location":"sessions/01_introduction/#msu-cloud-computing-fellowship-team","title":"MSU Cloud Computing Fellowship Team","text":"

    Sponsored by ICER, MSU Office of Research and Innovation (ORI), and MSU IT Services Research Cyberinfrastructure (RCI)

    "},{"location":"sessions/01_introduction/#participant-introductions-discussion","title":"Participant Introductions & Discussion","text":""},{"location":"sessions/01_introduction/#fellowship-program-overview","title":"Fellowship Program Overview","text":""},{"location":"sessions/01_introduction/#fellowship-goals","title":"Fellowship Goals","text":"

    Help you get an understanding of:

    Help you get some practical experience

    Fellowship - Learn from and support your fellow researchers

    Non-Goals: - cover all aspects of cloud - we don't cover networks for example due to time constraints - prepare you for a cloud computing certification (there are many existing resources for that) - become experts in everything cloud - build a dot-com empire

    "},{"location":"sessions/01_introduction/#program-overview","title":"Program Overview","text":"

    The syllabus\" is the home page of this website and has a detailed schedule. Keep an eye on the home page for updates!

    "},{"location":"sessions/01_introduction/#introduction-to-cloud-computing","title":"Introduction to Cloud Computing","text":" "},{"location":"sessions/01_introduction/#hands-on-using-the-azure-portal","title":"Hands-on: Using the Azure Portal","text":"
    1. Interacting with Azure using the Portal web interface
    2. Setting a Budget Alert Using the Azure Portal
    "},{"location":"sessions/01_introduction/#questions-and-discussion","title":"Questions and Discussion","text":""},{"location":"sessions/01_introduction/#follow-up-activity","title":"Follow up Activity","text":"

    Please complete the following prior to our next meeting in 2 weeks:

    *This first part requires significant learning, and the more you do know the better choices you can make when developing your project. *

    "},{"location":"sessions/01_introduction/#bonus-activity","title":"Bonus Activity","text":"

    If you are familiar with the command line, Azure offers a web-based terminal/shell with many applications pre-installed. once you have a storage account, you can create a special 'cloud shell' account. We will cover various interfaces to the cloud next time.

    "},{"location":"sessions/01_introduction/#readings","title":"Readings","text":"

    ## Optional Readings - Optional Historical Note Who Coined 'Cloud Computing'? by Antonio Regalado, October 2011, MIT Technology Review

    "},{"location":"sessions/02_how_to_cloud/","title":"Session 2: What is the cloud and how does it work? An introduction using storage and virtual machines","text":""},{"location":"sessions/02_how_to_cloud/#about-this-session","title":"About this Session","text":"

    We are providing materials and activities for this session for you to read and attempt at your own pace. Please attempt these and see how far you can get. Feel free to post on Microsoft Teams if you have any issues, find things that need correcting, or have general questions.

    We will host an optional, additional, in-person session to provide help to anyone who wants to attend, Friday September 23 2pm to 3:30p. Since this is outside of pre-arranged schedule, anyone who would like help but can't attend during this please contact us and we will arrange a time for you.

    We will discuss all of this material and more during our next regularly scheduled in-person session Friday September 30th.

    "},{"location":"sessions/02_how_to_cloud/#overview","title":"Overview","text":"

    When many people think of \"cloud computing\" they think of computers in the cloud, or virtual machines. Cloud computing companies offer much more than just virtualized hardware, but this is a good place to start. This session is designed to be a hands-on workshop where we walk-through creating the resources needed for to run a computer in the cloud, logging into this computer, copying data and using that data in a program. At the end of the session you should have a good introduction of what it means to \"cloud compute.\"

    "},{"location":"sessions/02_how_to_cloud/#overview-presentation","title":"Overview Presentation","text":"

    Cloud Concepts & Virtualization Slides (PDF)

    "},{"location":"sessions/02_how_to_cloud/#about-the-azure-portal","title":"About the Azure Portal","text":"

    We were introduced to the portal in the first session. The following dives into more detail about 'resource groups' which is the core of how Azure is organized. Note that, as we get started, fellows have access to just a single resource group that we've created for you. You can't create your own but you can create as many resources as yuo need inside this single resource group.

    "},{"location":"sessions/02_how_to_cloud/#optional-follow-ons","title":"Optional Follow-ons:","text":"

    Azure Storage

    The Activity above had you creat a 'storage account' with no background.

    You will see there are different types of storage, but all types must be inside a \"storage account\" and this \"storage account\" must be inside a resource group.

    We will re-visit concepts and usage of cloud storage in detail, as it's a core aspect of cloud computing.

    "},{"location":"sessions/02_how_to_cloud/#virtual-machines","title":"Virtual Machines","text":"

    We introduced \"virtualization\" during our introduction. For IT this means flexibly creating multiple resources on one piece of hardware using software. The main use case is many virtual computers (or servers) on one large computer hardware. This was create prior to cloud, but when you create your own computer in the cloud, it's based on the technology. To a user it may seem very similar, but to the systems IT engineer, it's very different. However these readings may help give you an

    "},{"location":"sessions/02_how_to_cloud/#readings","title":"Readings:","text":""},{"location":"sessions/02_how_to_cloud/#activity-create-a-virtual-machine-with-azure","title":"Activity: create a virtual machine with Azure","text":"

    Create (and delete) a Virtual Machine with the Azure Portal for both windows and Linux.

    "},{"location":"sessions/02_how_to_cloud/#discussion-why-create-a-vm","title":"Discussion: Why create a VM?","text":"

    What is a VM good for? The activity above does not discuss why you'd create a VM and connect with remote desktop, only that you can do it. We will discuss that at our next session. Can you think of possible use cases for your research, or other types of research, for a remote computer that could be very powerful or very small?

    "},{"location":"sessions/03_cloud_storage/","title":"Session 3: Cloud Storage","text":""},{"location":"sessions/03_cloud_storage/#introduction","title":"Introduction","text":"

    Central to using cloud for nearly all services is storing data. Cloud storage is quite different from what most are used to related to saving a file to your disk or USB removable media or even our HPC. During the previous workshop we created a VM but didn't use cloud storage, we simply create a VM \"virtual disk\" that is attached to the VM just like your hard drive is attached to your own computer. However there are disadvantages to this : 1. the main OS disk is typically deleted when the VM is deleted, although you can create a 'durable' disk to share 1. the data on the main OS disk is tied to that Virtual Machine and hence that operating system, that is, it's typically inaccessible from other cloud services 1. it is limited in size and scope The largest of virtual disks are around 1 TB. Azure Cloud storage accounts are limited to 5 TB and you may have multiple storage accounts. 1. You can only move data to/from a virtual or shared disk storage using a virtual machine 1. Most importantly virtual disks very expensive compared to cloud storage

    Cloud storage was engineered to save millions of files for millions of users and will take some changes to your approach to understanding how it works.

    "},{"location":"sessions/03_cloud_storage/#activities","title":"Activities","text":""},{"location":"sessions/03_cloud_storage/#readings","title":"Readings","text":""},{"location":"sessions/03_cloud_storage/#post-session-discussion-points","title":"Post-session discussion points","text":"

    There are several options when creating a storage account. For example, what is the difference LRS vs GRS? Is the documentation describing these clear or confusing? What conditions might you consider LRS vs GRS? Is it worth the cost?

    How would you share data with colleagues outside of MSU using cloud storage? Where did you find the information for how to do that (Microsoft, Azure, Blog post, other)? Let's say need to share 5gb of data. After doing the pricing exercise above just for storage, what are the costs for each upload and download of 5gb? Does it make a difference if it's Blob or File storage?

    "},{"location":"sessions/03_cloud_storage/#activities_1","title":"Activities:","text":"

    The following two activities walk through attaching Azure files to a VM so you can use it just like any other disk. This is only one method for moving data to/from cloud storage to your VM, but it does not require changing your program code.

    For Windows Users: Using File Storage with Windows VM

    Create an SMB Azure file share and connect it to a Windows VM using the Azure portal

    For Linux Users: Mounting File Storage with Linux VMs using NFS

    Microsoft Tutorial: Create an NFS Azure file share and mount it on a Linux VM using the Azure portal

    How to mount Azure Files on Linux using SMB

    Notes: - SMB (invented by Microsoft for Windows) and NFS (invented by Sun Microsystems from Unix) are competing methods for attaching network storage. Both were created for on-premise servers, but Azure Files storage brings this to the cloud. - this tutorial uses command line, and requires an ssh connection to the VM you create. - Knowledge of Linux systems (mount points, fstab, etc) required

    Optional: Python And Blob Storage

    This describes an a different method for moving files to/from cloud storage: using code. This does not require you to 'mount' the storage to your VM.

    For Intermediate Python users, and if you have time and interest, consider this tutorial from Azure: Quickstart: Manage blobs with Python v12 SDK

    Requirements:

    **Optional: Using Managed Disks with Linux

    Azure Learning Tutorial : Add and size disks in Azure virtual machines

    Notes: - Uses the Azure Command line interface which we have not discussed. For

    "},{"location":"topics/","title":"Short Topics for the Cloud Computing Fellowship","text":"

    These topics are introduced in the sessions in the syllabus. This is an index of all the topics here to help you find them outside of lessons. They are not in any particular order, but aggregated here in an effort to help you find them.

    "},{"location":"topics/azure_cloud_cost_basics/","title":"Intro to Cloud Costs on Azure","text":"

    You've heard us say that nearly everything Azure has a cost, but how can you tell how much?

    First, Cautionary Tale: Google Cloud Charged Me $1000 For This Mistake by Kunal Vaidya on Medium. *tl;dr: he forgot to turn off a service even though he was no longer using it. Good news it, Google does grant 1-time forgiveness if you can prove you are using the service to learn about it (e.g. you are student). *

    "},{"location":"topics/azure_cloud_cost_basics/#video-walk-through-of-azure-cost-analysis","title":"Video Walk-through of Azure Cost Analysis","text":"

    The following video walks through how to use the costs analysis features of the Azure portal for your resource group. 1) It helps to understand Azure Organization, and 2) it is from a few years ago so the screens may look a little different

    Short video (3:30) Demonstrating Azure Portal Cost Analysis, on MSU MediaSpace (log-in required)

    "},{"location":"topics/azure_cloud_cost_basics/#details-about-costs-in-azure","title":"Details about Costs in Azure","text":"

    The content below assumes you have knowledge of how to use the Azure Portal, basic cloud operations, what a virtual machine is. See the links and materials for session 01 for the necessary background.

    "},{"location":"topics/azure_cloud_cost_basics/#1-pricing-pages","title":"1. Pricing Pages.","text":"

    All cloud vendors have pricing pages that describe how they meter and charge for services. For Azure this is https://azure.microsoft.com/en-us/pricing/#product-pricing

    However I usually find the page I need quickly by simply googling azure <service name> pricing for example I wanted to see how much a static IP address costs in azure so googling 'azure static ip pricing' takes me to https://azure.microsoft.com/en-us/pricing/details/ip-addresses/

    Some of these pages are straightforward, but like the one above has addition knowledge. What does this mean in practice? For example, what does \"classic\" vs \"ARM\" even means? There is a link at the top of the page but this may take time to read and understand. I'll tell you that we will never use 'classic' and only use 'resource manager (ARM).' so look at the ARM Prices.

    This kind of background info is very common for services.

    "},{"location":"topics/azure_cloud_cost_basics/#2-build-something-and-check-the-cost","title":"2. Build something and check the cost","text":"

    The other option is the empircal method: build something, use it, review the costs, and estimate.

    At the resource group in the protal ( see Azure Organization), there is a link on the left-side menu, near the bottom labelled \"Cost Analysis\" - click that

    This is a live report of your current costs, with the ability to filter by time period, resource type, tags, and other things.

    Near the middle are rouded buttons controlling the view you see. At the right side of this is a button \"Add Filter\" which you can click to show costs only for some resources. For example if you click that and select \"Service Name\" and then \"virtual machines\" you will see the costs for the current month.

    A powerful filtering technique is to use tagging in Azure, which is akin to adding meta-data to resources. See the Cloud Glossary

    In many of the filtering mechanisms in Azure (including costs), the tag names (keys) use use are listed in the options for filtering.

    Carefully select the date range for which you want an estimate, especially if your trial run started a few days ago in the previous month as the default is a monthly estimate. Use a custom date range for the time period that makes sense for the costs you want to observe.

    Example Azure Cost Analysis Screen, filtered by Tag. Click for larger view

    "},{"location":"topics/azure_cloud_cost_basics/#3-pricing-calculators","title":"3. Pricing Calculators","text":"

    All the cloud companies have pricing calculators and they may be good for very rough estimates but I always multiple by 1.2 as I'm sure I missed some crucial resource that I didn't know I needed or didn't know costs money.

    For Azure it's https://azure.microsoft.com/en-us/pricing/calculator/

    "},{"location":"topics/azure_cloud_cost_basics/#summary-and-other-notes","title":"Summary and other notes","text":"

    Combining these three methods is how we can estimate costs.

    Notes:

    "},{"location":"topics/azure_cloud_cost_basics/#azure-pricing-resources","title":"Azure Pricing Resources","text":"

    Quickstart: Explore and analyze costs with cost analysis

    Video from John Saville on cost estimation including the pricing calculator: Master the Azure Pricing Calculator Jun 17, 2021

    "},{"location":"topics/azure_organization/","title":"Azure Organization","text":"

    This is a brief description of how Azure cloud services are organized for those just getting started with Azure. It's my own take on this topic written with researchers in mind. However it should not replace Azure official documentation. The link below has a great summary of how it's setup. However you may ignore all the other sections in the \"Azure setup guide\" as this is geared for IT professionals adoption cloud for their own organization

    Microsoft Azure Documentation: Organize your Azure resources effectively

    Azure is organized by directories of user accounts and subscriptions. All resources must be created in exactly one \"subscription\" which is a method for billing and for setting permissions. Your organizations \"directory\" is where your user account lives, but you may have access to multiple subscreiptions with one user. MSU created a \"Cloud Computing Fellowship\" subscription for all activities and resources for this, and we added your MSU directory accounts this subscription.

    Cloud computing components are known as \"resources,\" which AWS defines as \"an entity you can work with.\" Anything you can create using a cloud interfaces is a \"resource.\"

    To help with more organization, in Azure, resources belong to a resource group. Resource groups can collect resources by project which could still have hundreds or just a few resources. There is no restriction and up to you to organize how it works for you. For example, a lab could have a resource group for each member, or perhaps a resource group for each project, and members collaborate on those projects.

    It's also possible to restrict access to resource groups, e.g. a resource group for a project may only allow those who are working on the project access to that resource group. Azure has other organizational tools such management groups across subscriptions, complex identity management and role-based access control (RBAC) that we won't cover here.

    However, this is mostly for organization and resources may be accessed from one resource group to another, and even across subscriptions. Applying this organization scheme requires practice and sometimes vigilance.

    For most campuses, researchers will want to have their IT department create the subscriptions and billing as they often can get discounted prices or fee waivers. When your research group is ready to pay for services here at MSU, see the link to the \"cloud services request form\" on https://tech.msu.edu/network/cloud-services/

    Summary of top-down Azure Organization:

    Finally, it is possible to log-in to the Azure portal (e.g. your MSU account) and not have a valid subscription and not be able to create or access any resources. If you have never used Azure before, you may be asked to create a free trial. If are a you need to use Azure (e.g. for training) and do not have access to an MSU subscription, you may want to use a non-MSU email address and create your own account.

    Azure \"tags\" add added to resources (including resource groups) and are a way to identify and locate resources by search as for many other services. They are optional but highly recommended to use a tagging scheme to help organize your resources and for cost analysis. You can use any keys and any values you find useful.

    "},{"location":"topics/azure_organization/#azure-locations-or-regions","title":"Azure Locations or Regions","text":"

    Subscriptions are for accounting only and don't represent concrete cloud resources. However cloud resource must reside in computer somewhere, and hence have a location. Locations for cloud providers for can be thought of inside one of their massive data centers. In Azure, \"region\" and \"location\" are used interchangably (some interfaces use 'location, some use 'region')

    Resources and Resource groups must be assigned a location when you create them. considerations are 1) does the location actually provide the services you need (not all locations have all cutting edge products) and 2) is the location close to you to reduce time it takes for data to cross the internet to/from you and finally 3) is there some restriction based on your country of origin.

    Most of the time, simply choose the default which is East US which almost always has the latest features. For some advantage for data transfer, choose (US North Central US). However as a rule select a location/region and use that across all of your resources so that, for example, your data files in storage are close to (in the same data center as) a computer you may create.

    Regions become very important for companies that offer services around the world and want to reduce the connection time for their customers. It's also possible to have back-ups of resources in different region to protect against natural disasters.

    "},{"location":"topics/azure_tags/","title":"Azure tags","text":""},{"location":"topics/azure_tags/#using-tags-to-organize-resources-in-azure","title":"Using Tags to organize resources in Azure","text":"

    Tags are notes to yourself about the resource, use them for metadata.

    As the number of cloud resources blossom (e.g. cloud sprawl) it can be important to find related resources quickly. The azure portal has a way to see resource within and across resource groups using different filtering methods. One of those is the with resource meta-data, and you can add meta data using 'tags.'

    In my group we always have a tag with the key \"created by\" and value the netid of the creator. This may be redundant here becuase all the resources you create will be a in resource group with your NetID already in it, but add this for practice.

    You may consider using a tag like \"project\" with value for the project if either 1) a project may have multiple resource goups or 2) a resource group would have multiple projects.

    For now you have only one resource group, but tags are also used to find things across different resource groups, e.g. if by project name.

    Tags can be added and removed at will from resources without altering the resource, so add as many tags as you want when starting to see how they may work.

    "},{"location":"topics/azure_tags/#example-usage","title":"Example usage:","text":"

    When creating resources using the wizard, many resources are created at once. For example creating a virtual machine may create 12 resources. Adding a tagl to ID those resources together can really help to delet them.

    "},{"location":"topics/intro_aspects_of_cloud_computing/","title":"Nature of Cloud Computing","text":""},{"location":"topics/intro_aspects_of_cloud_computing/#some-motivation-at-amazoncom","title":"Some Motivation at Amazon.com","text":""},{"location":"topics/intro_aspects_of_cloud_computing/#eureka-moment-for-amazon-we-could-sell-it","title":"Eureka moment for Amazon: we could sell it","text":""},{"location":"topics/intro_aspects_of_cloud_computing/#nist-defintion-of-cloud","title":"NIST defintion of cloud","text":"

    Government offices interested in purchasing cloud computing needed a definition of it to differentiate from other kinds of computing, hence... the NIST definition of cloud computing essential characteristics

    "},{"location":"topics/intro_aspects_of_cloud_computing/#what-is-cloud-computing-cloud-concepts-vs-cloud-providers","title":"What is Cloud Computing? Cloud concepts vs Cloud Providers","text":""},{"location":"topics/intro_aspects_of_cloud_computing/#benefits-of-cloud-computing-for-research","title":"Benefits of Cloud Computing for Research","text":"

    Restatement of goals of this Cloud Computing Fellowship:

    "},{"location":"topics/intro_aspects_of_cloud_computing/#using-workflow-and-computational-thinking","title":"Using workflow and computational thinking","text":"

    To enhance reproducibility in your own work, consider documenting all the steps needed for create the environment to run your computation. For many on-premise academic systems (e.g. the MSU HPCC), we depend upon the system administrators to create that environment, but we may install and configure all the software we need to run our code. Workflow thinking can apply to the scienfic domain itself (e.g. \"Principles for data analysis workflows\" https://journals.plos.org/ploscompbiol/article?id=10.1371/journal.pcbi.1008770 ) and to the provisioning of the cloud computing environment. That is, we may use a workflow system for creating all the cloud stuff we need, and then a different workflow system that runs on that cloud stuff. One example is we may create an HPC system on Azure using templates and then launch the Slurm scheduler on that HPC to run our jobs. (note the complexity of running your own HPC is beyond the scope of this fellowship and used as an example only)

    A major advantage to using workflows or code for provisioning your cloud computing components is that you can turn them off and delete them when you are done, and restart when needed.

    Our first uses of cloud will use forms to create resources, but we encourage you to automation where possible.

    "},{"location":"topics/intro_aspects_of_cloud_computing/#about-cloud-security","title":"About Cloud Security","text":"

    Security and Risk management are important issues even for researchers who's data are open - If your computer is a server, your responsibility just increased 100X: these are prime targets. Consider each component of a server to be a point of vulnerability. - Finding a readable list of security recommendations for cloud computing is a challenge for all the reasons outlined above. Our textbook has a nice chaper outlining cloud security - We will cover methods to reduce security risks but it's important to consider the risk of hacking from the beginning

    Attackers may use the services you create to launch attacks on other services, leaving you liable.

    Microsoft Model of Shared Responsibility for Cloud Computing

    We will come back to this model as we gain deeper understanding of research computing on the cloud.

    "},{"location":"topics/intro_aspects_of_cloud_computing/#hpcc-vs-cloud","title":"HPCC vs Cloud","text":"

    The HPC is amazing effective at running all kinds of systems at very list cost, if any, to MSU researchers, but not all are the best fit.

    Many systems not designed for HPC can be adjusted to run in that environment. However, just like many workflows are difficult to port from HPC to cloud, some cloud workflows are difficult run on HPC (but never say never). Especially windows-based software.

    "},{"location":"topics/intro_aspects_of_cloud_computing/#acknowledging-bias-in-access-to-cloud-computing-across-research-cultures","title":"Acknowledging bias in access to cloud computing across research cultures","text":"

    It's widely recognized that AI is frequently bias. For example, Azure Voice recognition did not work for a female researcher who developed voice-controlled surgery, so

    However I believe there is also inherent bias in the user interfaces, design and definitions in the engineering of technology across many axes of diversity (gender, culture, background, training, creativity, etc). System Engineering is it's own discipline and Cloud computing is arcane so our goal is to reduce conceptual barriers to using this technology while you work with us.

    "},{"location":"topics/intro_aspects_of_cloud_computing/#about-cloud-costs","title":"About Cloud Costs","text":"

    Case Study: Computation of a machine learning model based on gene networks for inferring gene association ( https://www.geneplexus.net): a single (virtual) machine to run the ML such that users would not have to wait too long would be $650/month. However, if the computational power is provisioned only when needed, it's 5 cents/job.

    "},{"location":"topics/intro_aspects_of_cloud_computing/#value-proposition-of-cloud-computing","title":"Value Proposition of Cloud Computing","text":""},{"location":"topics/intro_to_cloud_interfaces/","title":"Interfacing with Cloud Services","text":"

    Cloud Services are by design DIY or on-demand and hence need a programming interface to create cloud resources. This is only possible becuase inside the data center, computer configuration can be done completely with code, also knows as \"Infrastructure as Code\" (IaC). Amazon's insight was that they could slap a website on top of that, put a system for tracking (metering) usage, and sell it.

    All of the cloud companies as their base use a web interface, so-called REST API. Knowing the details of REST is not important but it's often the basis for all of the other style of interfaces.

    Here is an example web api URL for weather forecast, with parameters for coordinates, units and format of output

    https://www.7timer.info/bin/astro.php?lon=113.2&lat=23.1&ac=0&unit=metric&output=json&tzshift=0

    Very few researchers would ever use the REST api directly, instead would use the web interface or even better the command line or programming language interface which achieves the same goal with less work.

    In Azure, everything you could possibly create is called a \"resource:\" a machine, a data service, a single network address. The system to work with Azure resources is the \"Azure Resource Manager\" or ARM and the primary interface for the Resource Manager is their web (REST) api. You may see references to resources in documentation and that means any web doo-dad.

    "},{"location":"topics/intro_to_cloud_interfaces/#summary-of-cloud-interfaces","title":"Summary of Cloud Interfaces","text":"

    This summary is focused on Microsoft Azure, but the other cloud companies have similar concepts. In addition to this guide, Chapter 1 of our text \"Cloud Computing for Science and Engineering\" has an excellent description and examples of these interfaces with examples from AWS. See the section of that chapter titled \"Accessing a cloud service\" in https://s3.us-east-2.amazonaws.com/a-book/Orienting.html

    "},{"location":"topics/intro_to_cloud_interfaces/#graphical-web-interface","title":"Graphical Web Interface","text":"

    Most people want a graphical user interface, and for azure that's the \"Portal\" or https://portal.azure.com. For Google cloud it's the \"console\" and for AWS it's also called the console. See below for an introduction to using the portal. Note that the Azure portal and Google console both have web-based terminals that allow you to use the CLI directly in the web interface.

    "},{"location":"topics/intro_to_cloud_interfaces/#desktop-applications","title":"Desktop Applications","text":"

    Azure provides some desktop applications for working with a few of the widely used cloud services :

    "},{"location":"topics/intro_to_cloud_interfaces/#command-line","title":"Command Line","text":"

    For those not familar with the command line at all, see https://www.digitalocean.com/community/tutorials/an-introduction-to-the-linux-terminal for linux and for Windows Powershell see https://programminghistorian.org/en/lessons/intro-to-powershell

    The command line interface is a great way to interact with cloud services because it's imperative and all options are specified in a single command. With the web interface, you may have to hunt through the user interface to find the checkbox for an option, but for command line

    Azure has two command line interfaces: The \"CLI\" which is based on Linux and will work in any linux or Mac terminal (or shell script) and the \"Powershell\" interface which is for Windows Powershell users. Since Powershell has been ported to Linux and Mac and the Linux Shell and Azure CLI can also be used on Windows, so both are operating system independent but in practice, Windows users use powershell and everyone else uses the CLI. Your choice depends on the kinds of other systems you'll be working with. For example, the MSU HPC uses Linux command shell but Windows servers and other Windows services like SQLServer work well with Powershell.

    "},{"location":"topics/intro_to_cloud_interfaces/#sdk-software-developer-kit","title":"SDK : Software Developer Kit","text":"

    A \"software developer kit\" is simply a collection of utilities, libraries/packages and documentation for a specific language to work with a specific service. All the cloud vendors have SDKs, and they all have SDKs for Python. SDK simply means you can create, delete, interact with cloud services from your program.

    Why leave python or R if don't have to?

    "},{"location":"topics/intro_to_cloud_interfaces/#python-sdk","title":"Python SDK","text":"

    All cloud vendors have SDKs to work with Python. After installing the SDK, you import the libraries and issue commands to create resources, then use those cloud resources to do work via client libraries (either Azure libraries or others). Azure has extensive documentation for using Python: https://docs.microsoft.com/en-us/azure/developer/python/?view=azure-python

    Example Azure code to create cloud storage, compared with how you would see the resources in the azure portal, and similar commands using the CLI : https://docs.microsoft.com/en-us/azure/developer/python/azure-sdk-example-storage?tabs=cmd

    Note that Azure also has a service \"Azure Cloud Functions\" that run python that are not the same thing as the SDK. These are 'serverless' resources (similar to AWS Lambda), which we will learn about later in the course.

    Both AWS and Google Cloud have Python SDKs, and probably other vendors.

    "},{"location":"topics/intro_to_cloud_interfaces/#rest","title":"REST","text":"

    Knowing the details of REST is not important but it's the basis for all of the other style of interfaces.

    Here is an example web api URL for weather forecast, with parameters for coordinates, units and format of output

    https://www.7timer.info/bin/astro.php?lon=113.2&lat=23.1&ac=0&unit=metric&output=json&tzshift=0

    The parameters to the weather data fetch program are lon, lat, ac, unit, output=json, tzshift, and they are embedded in the URL itself.

    This is caled a \"request,\" and using a web API often requires sending parameters not just sin the URL, but as an attachment or in the 'body' of the request. Browsers don't have an automatic way of doing that, so we use scripts (python Requests library) or special programs for testing Web APIs that can send parameters and data in the request body.

    This is a good explanation of REST and part 2 describes the details.

    https://medium.com/extend/what-is-rest-a-simple-explanation-for-beginners-part-1-introduction-b4a072f8740f

    The Azure REST api is a an interface to the Azure Resource Manager via the web. Requests sent can get information about your resources, or create new resources, just like the portal, the command line and the SDKs. Those other interfaces typically translate to the REST API. Knowing about it may help diagnose why your method for interfacing with Azure is not working but not necesary to learn. For examples and more detail, see https://learn.microsoft.com/en-us/azure/azure-resource-manager/templates/deploy-rest

    Few of us would ever use the Azure REST api directly, instead would use the web interface or even better the command line or programming language interface which achieves the same goal with less work.

    "},{"location":"topics/intro_to_cloud_interfaces/#r","title":"R","text":"

    Unlike the other vendors, Microsoft maintains an SDK for R Users which allows you to create cloud services directly from Rstudio. See their github pages https://github.com/Azure/AzureR and excellent documentation throughout the packages.

    "},{"location":"topics/intro_to_cloud_interfaces/#cloud-company-templating-frameworks","title":"Cloud company templating frameworks","text":"

    In addition to the \"SDKs\" for existing languages, cloud companies often have their own frameworks for using code to build (provision) infrastructure. For Azure, these are \"ARM Templates\" and for AWS it's Cloud Formation.

    "},{"location":"topics/intro_to_cloud_interfaces/#azure-arm-templates","title":"Azure: ARM templates","text":"

    Azure has a system for submitting a template, or essentially a configuration file to the Azure Resource Manager (ARM) that dictates which cloud resources are to be created. For Azure these are JSON-formatted files that are \"declaritive\" (rather than procedural or imperative like Python). The best way to understand these is to explore the many that Microsoft posts on github, and to try them. If you do, be mindful to delete any resources you create so as not to be charged for them.

    - Overview of ARM templates: https://docs.microsoft.com/en-us/azure/azure-resource-manager/templates/overview\n- Quick start ARM templates (github): https://github.com/Azure/AzureStack-QuickStart-Templates\n

    You may see reference to \"Bicep\" templates. This is simplified ARM templating language that may be easier to write, debug and maintain than the JSON format of ARM templates.

    "},{"location":"topics/intro_to_cloud_interfaces/#aws-cloud-formation","title":"AWS: Cloud Formation","text":"

    AWS also has templating language similar to Azure Resource Manager templates called cloud formation. If you are using AWS for your project, and want to automate the creation and deployment of resources, this may be a good option.

    AWS Documentation:

    "},{"location":"topics/intro_to_cloud_interfaces/#third-party-programming-with-terraform","title":"Third-party programming with Terraform","text":"

    There are other ways to 'program the cloud' from companies outside of the big three. One widely used frame is \"Terraform\" from Hashicorp, not affiliated with any cloud company. The advantage to Terraform is that it's declarative in that you specific what you want, unlike say the Python or command line interface, where you have to create items with commands one at a time.

    Terraform is used by cloud professionals becuase it's designed to keep the resources youve created running and allow you to modify them in place. If you find you are using scripting to build resources (which is great!) but your scripts are becomming combersome to maintain and your cloud architecture is complex, consider using Terraform.

    - Terraform: https://www.terraform.io\n- Can work with any vendor including Azure\n- Often more readable than ARM templates, Syntax remarkably simple \n- Focus on maintaining consistent systems ( declarative) \n- Does not cover all services, but can fall back to ARM templates when necessary\n
    "},{"location":"topics/intro_to_cloud_interfaces/#building-cloud-from-cloud","title":"Building Cloud from Cloud","text":"

    This may not be an 'interface' but is operationally similar. It's possible to use some of the above interfaces on existing cloud services, e.g. creating new cloud resources automaticaly from existing cloud resources. Your cloud architecture may need different types of resources, or parameterized resources only as needed (e.g. depending data inputs, a web-gateway for cloud on demand).

    For example Azure Logic Apps can create resources when they are run (e.g. provision and start a computer) and a logic app can be triggered by events such as when a new file is created, or using a web api (e.g. REST POST command that sends data and parameters). This adds significant complexity and is only valuable for event-based systems opens up using the cloud as a big computer programming language.

    "},{"location":"topics/intro_to_cloud_interfaces/#references","title":"References","text":"

    See our references page for curated Azure links. For AWS, see

    "},{"location":"topics/learning_how_to_learn_about_cloud/","title":"Learning how to learn about cloud","text":""},{"location":"topics/learning_how_to_learn_about_cloud/#guidelines-for-researchers","title":"Guidelines for Researchers","text":"

    You may have looked at the various websites and poked around the web, and found it's just not clear at all how cloud computing may be helpful to you, even though it all sounds great. The challenge for researchers learning about cloud is that most cloud documentation for isn't written for you.

    Challenges for researchers learning:

    "},{"location":"topics/learning_how_to_learn_about_cloud/#what-documentation-is-available-for-researchers","title":"What documentation is available for researchers?","text":"

    There are general, conceptual introductions and dicussions for academics.

    "},{"location":"topics/learning_how_to_learn_about_cloud/#learning-how-to-learn-about-cloud-caveats-and-help","title":"Learning how to learn about cloud: Caveats and help","text":"

    As part of this fellowship, our goal is to help you translate documentation written for the systems and developer perspectives into a research perspective.

    "},{"location":"topics/the_computing_in_cloud_computing/","title":"Helping to Understand the \"computing\" in cloud computing","text":"

    You come to us with a unique set of experiences with computing, with more or less experience depending on your previous needs. A challenge we have seen, for the many years we've been helping people, is understanding the context of computing in their research to understand the tools they have available.

    In fact most documentation for cloud computing assumes you know the world of computing. An introduction to cloud computing from microsoft lists this Prerequisite: \"Basic familiarity with IT terms and concepts.\" It turns out 'basic' can mean a lot of things.

    A core goal of the MSU Cloud Computing Fellowship is to help you connect cloud computing to your research in a meaningful way

    our original question: - How can cloud computing benefit help your research?

    Let's re-frame the question for this discussion: - Which kind of computing could help my research? - Can I use that kind of computing in the cloud? \\ That is, could cloud computing enable me to use computing I otherwise couldn't?

    You may already have an idea of what this is, and experience with computing but many who come to us know it's valuable but are ready to learn why.

    "},{"location":"topics/the_computing_in_cloud_computing/#what-is-computing-minimal-vocabulary","title":"What is computing? Minimal Vocabulary","text":"

    Cloud computing was invented for, and is marketed to IT systems administrators, software developers, and IT/technology managers. See the history of AWS. It is was not designed with researchers in mind. Most training and documentation Note, however, that Cloud Computing is general enough and is often marketed to researchers or 'for research.'

    The primary function of cloud computing is to provide \"infrastructure\" aka the \"back-end\" or back room of a company's IT department, so we ware going to learn about that. In fact, cloud computing is frequently defined, named, and sold based on abstractions of physical components of computers and IT infrastructure. Hence learning more about IT infrastructure, or \"computing\" may be helpful understanding the context in which cloud computing is engineered. This can help you determin what you may need from cloud computing to get your research done.

    Could you purchase your own infrastructure (computers, networks, disks, etc) and run it \"on-premise\" and get the same benefit as cloud computing? Or have your institution do that? Sometimes yes! The MSU HPCC is a great example when on-premise is more beneficial and cost-effective than cloud computing.

    "},{"location":"topics/the_computing_in_cloud_computing/#about-computing-major-components-of-computer","title":"About Computing: Major components of computer","text":"

    Of course you know what is in a computer. The goal is to come to common understanding, and to frame for extension to cloud, and to find the cloud services that mimic these features.

    Where is the data in this abstraction of computer infrastructure? Answer: everywhere

    If you hadn't thought or known about the components of a computer, that's no mistake. Most people don't know the details of how their car operates, how to change their oil, or diff between carburetor and turbo charging?

    "},{"location":"topics/the_computing_in_cloud_computing/#stack-model-of-computing","title":"\"Stack Model\" of computing.","text":"

    Just as in Science and the humanities, we need a model and terminology to talk about a subject. A standard IT model of a computer is a 'stack' model, where each upper layer depends upon the layers below. Most models of cloud computers build upon this simple model.

    User Interface/Connection Software Operating System Computer Hardware: CPU & RAM Data Storage Network"},{"location":"topics/the_computing_in_cloud_computing/#about-computing-what-is-a-server","title":"About Computing: What is a server?","text":"

    Cloud computing started with, and frequently talks about \"servers,\" so we should define that.

    A server is any computer running software that listens for, and responsed to, messages. For a server to be useful it should be connected to a network but it doesnt' need to be. Some terms: - The 'server' is actually the software, not the hardware. You can run a server on your laptop. - The computer that runs the software is the 'host' - A 'client' is software sends the message, and receives and interprets the response. - the protocol is the method by which you exchange messages. Now it is almost exclusively web (http) but there are many others - the form the input message can take, and the form of the message that is returned is known as the API of the server. it's the interface that you have to work with. - port: a computer may run many servers for internal and external use. Unix devised a system of numbered 'ports' (nbumber 01 to 64K), and when running a server you must tell the server which port to listen for messages. Users of most software never have to know or think about ports.

    The 'Client/server' model invented in the 60s is so successful that we use servers for our daily lives and don't think about it (except when the server is down). This model of computing is important because it's at the basis for of cloud computing.

    We often think of a server as a box, but in the model above, the server is in the software layer, but each of layers below provides services for that software to exchange messages with another computer. If you can abstract, virtualize or automate the layers below, it becomes much easier to provision servers than to purchase, install and configure physical hardware.

    "},{"location":"topics/the_computing_in_cloud_computing/#example-server","title":"Example Server","text":"

    A Web server is a well known, easy to use, and very useful server to run. The terms above translate as follows:

    What is the host in this URL? What is the message? We could spend a week talking about web servers, protocols and a year about programming web server. The important thing is that there is a host computer, the 'web server' software on the host listening for requests, and the client(s) connecting to it to retrieve files.

    "},{"location":"topics/the_computing_in_cloud_computing/#other-types-of-servers","title":"Other Types of Servers","text":"

    Many of these do not use web-based protocols or connections. They define their own protocols, either as a public standard (e.g. email) or proprietary standard (database)

    "},{"location":"topics/the_computing_in_cloud_computing/#servers-and-networks","title":"Servers and Networks","text":"

    Networking Requirements to access a server:

    Why do I think this is important? not only can you make a server (web, data, cluster, etc with cloud but everything you interact with in cloud is a server. You will see many services dedicated to networking in the cloud.

    On our campus, the network is managed by the institution, and it is configured to block all incomming traffic to prevent anyone from running a server which is a security risk.

    "},{"location":"topics/the_computing_in_cloud_computing/#too-much-hardware-virtualization-to-the-rescue","title":"Too much hardware? Virtualization to the rescue","text":"

    If you run a big IT Department that services 1000s of people, you need a lot of servers. Each server can only handle a certain amount of 'traffic.' Hence there are many methods for connecting multiple servers to act as one big server. Each physical machine requires 1) installation 10) maintainence.

    "}]} \ No newline at end of file diff --git a/sessions/01_introduction/index.html b/sessions/01_introduction/index.html index 6e68114..117a117 100644 --- a/sessions/01_introduction/index.html +++ b/sessions/01_introduction/index.html @@ -16,7 +16,7 @@ - + @@ -24,7 +24,7 @@ - + @@ -448,6 +448,26 @@ +
  • + + + + + Exercise: Using File Storage with Windows VM + + + + +
  • + + + + + + + + +
  • diff --git a/sessions/02_how_to_cloud/index.html b/sessions/02_how_to_cloud/index.html index 9885be6..bc71e0f 100644 --- a/sessions/02_how_to_cloud/index.html +++ b/sessions/02_how_to_cloud/index.html @@ -16,7 +16,7 @@ - + @@ -24,7 +24,7 @@ - + @@ -448,6 +448,26 @@ +
  • + + + + + Exercise: Using File Storage with Windows VM + + + + +
  • + + + + + + + + +
  • diff --git a/sessions/03_cloud_storage/index.html b/sessions/03_cloud_storage/index.html index 16543e2..5d8601b 100644 --- a/sessions/03_cloud_storage/index.html +++ b/sessions/03_cloud_storage/index.html @@ -16,7 +16,7 @@ - + @@ -24,7 +24,7 @@ - + @@ -448,6 +448,26 @@ +
  • + + + + + Exercise: Using File Storage with Windows VM + + + + +
  • + + + + + + + + +
  • @@ -691,8 +711,8 @@
  • - - Optional Activities: + + Activities:
  • @@ -971,8 +991,8 @@
  • - - Optional Activities: + + Activities:
  • @@ -1040,13 +1060,10 @@

    Readings

    Post-session discussion points

    There are several options when creating a storage account. For example, what is the difference LRS vs GRS? Is the documentation describing these clear or confusing? What conditions might you consider LRS vs GRS? Is it worth the cost?

    How would you share data with colleagues outside of MSU using cloud storage? Where did you find the information for how to do that (Microsoft, Azure, Blog post, other)? Let's say need to share 5gb of data. After doing the pricing exercise above just for storage, what are the costs for each upload and download of 5gb? Does it make a difference if it's Blob or File storage?

    -

    Optional Activities:

    +

    Activities:

    The following two activities walk through attaching Azure files to a VM so you can use it just like any other disk. This is only one method for moving data to/from cloud storage to your VM, but it does not require changing your program code.

    For Windows Users: Using File Storage with Windows VM

    -

    Microsoft Tutorial: Create an SMB Azure file share and connect it to a Windows VM using the Azure portal

    -

    Notes: -- The tutorial has you create a storage account, but you can re-use the one you've already created (and change the names), or follow the tutorial and create another one.
    -- Not all versions of Windows can use this. For much more detail, see the Azure documentation page "Mount SMB Azure file share on Windows"

    +

    Create an SMB Azure file share and connect it to a Windows VM using the Azure portal

    For Linux Users: Mounting File Storage with Linux VMs using NFS

    Microsoft Tutorial: Create an NFS Azure file share and mount it on a Linux VM using the Azure portal

    How to mount Azure Files on Linux using SMB

    diff --git a/sitemap.xml.gz b/sitemap.xml.gz index 855af71566544ee55dceb69437b03e0fd1028155..b610fe6c377ab2d001ff0b85a481bdfc6be9f4d9 100644 GIT binary patch delta 13 Ucmb=gXP58h;5d2CXd-(B03QzonE(I) delta 13 Ucmb=gXP58h;Al9dHj%vo038(sKmY&$ diff --git a/topics/azure_cloud_cost_basics/index.html b/topics/azure_cloud_cost_basics/index.html index 8b8f905..7cda9f9 100644 --- a/topics/azure_cloud_cost_basics/index.html +++ b/topics/azure_cloud_cost_basics/index.html @@ -16,7 +16,7 @@ - + @@ -24,7 +24,7 @@ - + @@ -448,6 +448,26 @@ +
  • + + + + + Exercise: Using File Storage with Windows VM + + + + +
  • + + + + + + + + +
  • diff --git a/topics/azure_organization/index.html b/topics/azure_organization/index.html index 41e64fa..8e5ae48 100644 --- a/topics/azure_organization/index.html +++ b/topics/azure_organization/index.html @@ -16,7 +16,7 @@ - + @@ -24,7 +24,7 @@ - + @@ -448,6 +448,26 @@ +
  • + + + + + Exercise: Using File Storage with Windows VM + + + + +
  • + + + + + + + + +
  • diff --git a/topics/azure_tags/index.html b/topics/azure_tags/index.html index f37824a..174cf87 100644 --- a/topics/azure_tags/index.html +++ b/topics/azure_tags/index.html @@ -16,7 +16,7 @@ - + @@ -24,7 +24,7 @@ - + @@ -448,6 +448,26 @@ +
  • + + + + + Exercise: Using File Storage with Windows VM + + + + +
  • + + + + + + + + +
  • diff --git a/topics/index.html b/topics/index.html index f58d67d..ea1620e 100644 --- a/topics/index.html +++ b/topics/index.html @@ -16,7 +16,7 @@ - + @@ -24,7 +24,7 @@ - + @@ -448,6 +448,26 @@ +
  • + + + + + Exercise: Using File Storage with Windows VM + + + + +
  • + + + + + + + + +
  • diff --git a/topics/intro_aspects_of_cloud_computing/index.html b/topics/intro_aspects_of_cloud_computing/index.html index 82d1ffa..27f1b52 100644 --- a/topics/intro_aspects_of_cloud_computing/index.html +++ b/topics/intro_aspects_of_cloud_computing/index.html @@ -16,7 +16,7 @@ - + @@ -24,7 +24,7 @@ - + @@ -448,6 +448,26 @@ +
  • + + + + + Exercise: Using File Storage with Windows VM + + + + +
  • + + + + + + + + +
  • diff --git a/topics/intro_to_cloud_interfaces/index.html b/topics/intro_to_cloud_interfaces/index.html index 75edcd5..96cbafe 100644 --- a/topics/intro_to_cloud_interfaces/index.html +++ b/topics/intro_to_cloud_interfaces/index.html @@ -16,7 +16,7 @@ - + @@ -24,7 +24,7 @@ - + @@ -448,6 +448,26 @@ +
  • + + + + + Exercise: Using File Storage with Windows VM + + + + +
  • + + + + + + + + +
  • diff --git a/topics/learning_how_to_learn_about_cloud/index.html b/topics/learning_how_to_learn_about_cloud/index.html index 0ad76e5..3a67d54 100644 --- a/topics/learning_how_to_learn_about_cloud/index.html +++ b/topics/learning_how_to_learn_about_cloud/index.html @@ -16,7 +16,7 @@ - + @@ -24,7 +24,7 @@ - + @@ -448,6 +448,26 @@ +
  • + + + + + Exercise: Using File Storage with Windows VM + + + + +
  • + + + + + + + + +
  • diff --git a/topics/the_computing_in_cloud_computing/index.html b/topics/the_computing_in_cloud_computing/index.html index 8658104..309c2c0 100644 --- a/topics/the_computing_in_cloud_computing/index.html +++ b/topics/the_computing_in_cloud_computing/index.html @@ -14,7 +14,7 @@ - + @@ -22,7 +22,7 @@ - + @@ -446,6 +446,26 @@ +
  • + + + + + Exercise: Using File Storage with Windows VM + + + + +
  • + + + + + + + + +