facelessuser: Needs tests
facelessuser: @gir-bot remove S: needs-review
@gir-bot add S: rejected
facelessuser: We are not going to merge this because we actually can't identify a user with any amount of certainty. There are links that follow the user or user/repo pattern that are not either.
facelessuser: @gir-bot lgtm
facelessuser: @gir-bot lgtm
diff --git a/docs/src/markdown/about/changelog.md b/docs/src/markdown/about/changelog.md
index e4a8922c..00215e9a 100644
--- a/docs/src/markdown/about/changelog.md
+++ b/docs/src/markdown/about/changelog.md
@@ -4,6 +4,8 @@
 
 Please see [Release Notes](./release.md#upgrading-to-70) for details on upgrading to 7.0.
 
+- **NEW**: MagicLink will now shorten user name and repository links when link shortening is enabled.
+- **NEW**: Added MagicLink options `social_url_shortener` and `shortener_user_exclude` were added.
 - **NEW**: UML examples are now demonstrated with Mermaid in documentation.
 - **NEW**: SuperFences, if using the attribute list format (` ``` {.lang .additional_class, linenums="1"} `) allows
   adding additional classes. IDs can be added as well, though Pygments generated code blocks do not have a mechanism to
diff --git a/docs/src/markdown/extensions/magiclink.md b/docs/src/markdown/extensions/magiclink.md
index 7946cb72..6bf00d7e 100644
--- a/docs/src/markdown/extensions/magiclink.md
+++ b/docs/src/markdown/extensions/magiclink.md
@@ -231,28 +231,28 @@ the user and repository: `{user}/{repo}@{hash1}...{hash2}`. Lastly, to reference
 ## Repository Link Shortener
 
 MagicLink can also recognize issue, pull request, commit, and compare links, and render them in the same output format
-as the [repository shortcut links](#shorthand-links) feature. Unfortunately, mention link shortening is not presently
-supported due to the fact that MagicLink does not use any of the providers' API to verify user links, and some
-legitimate links can look like user links, but are not.
+as the [repository shortcut links](#shorthand-links) feature.
 
 If we specify long form URLs from external providers, they will be shortened appropriately.
 
-
 !!! example "External Provider Example"
 
     === "Output"
+        - https://github.com/facelessuser
+        - https://github.com/facelessuser/pymdown-extensions
         - https://gitlab.com/pycqa/flake8/issues/385
         - https://bitbucket.org/mrabarnett/mrab-regex/issues/260/extremely-slow-matching-using-ignorecase
 
     === "Markdown"
         ```
+        - https://github.com/facelessuser
+        - https://github.com/facelessuser/pymdown-extensions
         - https://gitlab.com/pycqa/flake8/issues/385
         - https://bitbucket.org/mrabarnett/mrab-regex/issues/260/extremely-slow-matching-using-ignorecase
         ```
 
-
-When specifying links that reference the configured `provider`, `user`, and `repo`, links will be shortened differently
-in light of that context.
+When specifying links that reference the configured `provider`, `user`, and `repo`, some links will be shortened
+differently in light of that context.
 
 !!! example "Internal Provider Example"
 
@@ -272,6 +272,15 @@ in light of that context.
         - https://github.com/facelessuser/Rummage/commit/181c06d1f11fa29961b334e90606ed1f1ec7a7cc
         ```
 
+MagicLink will shorten user name and repository name links, but every site has some links that will conflict, or better
+stated, will have links that follow the pattern of user name and repository name links, but are not actually either.
+For example, `https://github.com/support` is not a user name, nor are any links under `support` repository names. By
+default, MagicLink has provided a list of exclusions for each provider to avoid treating such links as a user name or
+repository name. You can override them and add more via the option [`shortener_user_exclude`](#user-excludes).
+
+!!! new "New 7.0"
+    MagicLink added user name and repository name link shortening along.
+
 ## CSS
 
 For normal links, no classes are added to the anchor tags. For repository links, `magiclink` will be added as a class.
@@ -293,16 +302,33 @@ Twitter              | `magiclink-twitter`
 
 ## Options
 
-Option                          | Type   | Default         | Description
-------------------------------- | ------ | --------------- | -----------
-`hide_protocol`                 | bool   | `#!py3 False`    | If `True`, links are displayed without the initial `ftp://`, `http://`, `https://`, or `ftps://`.
-`repo_url_shortener`            | bool   | `#!py3 False`    | If `True`, GitHub, Bitbucket, and GitLab commit, pull, and issue links are are rendered in a shorthand syntax.
-`repo_url_shorthand`            | bool   | `#!py3 False`    | If `True`, you can directly use a shorthand syntax to represent commit, pull, issue, and mention links for repository providers and they will be auto-linked.
-`social_url_shorthand`          | bool   | `#!py3 False`    | If `True`, you can directly use a shorthand syntax to represent mention links for social media providers and they will be auto-linked.
-`provider`                      | string | `#!py3 'github'` | The provider to use for repository shorthand syntax and shortener.
-`user`                          | string | `#!py3 ''`       | The default user name to use for the specified provider.
-`repo`                          | string | `#!py3 ''`       | The default repository name to use for the specified user and provider.
-`labels`                        | dict   | `#!py3 {}`       | A dictionary for overriding repository link title text. See [labels](#labels) for more info.
+Option                          | Type   | Default                     | Description
+------------------------------- | ------ | --------------------------- | -----------
+`hide_protocol`                 | bool   | `#!py3 False`               | If `True`, links are displayed without the initial `ftp://`, `http://`, `https://`, or `ftps://`.
+`repo_url_shortener`            | bool   | `#!py3 False`               | If `True`, GitHub, Bitbucket, and GitLab commit, pull, and issue links are are rendered in a shorthand syntax.
+`social_url_shortener`          | bool   | `#!py3 False`               | if `True`, Twitter user links are rendered in a shorthand syntax.
+`shortener_user_exclude`        | dict   | [See below](#user-excludes) | Specifies a list of user names to avoid when attempting to shorten links. See [User Excludes](#user-excludes) for more info.
+`repo_url_shorthand`            | bool   | `#!py3 False`               | If `True`, you can directly use a shorthand syntax to represent commit, pull, issue, and mention links for repository providers and they will be auto-linked.
+`social_url_shorthand`          | bool   | `#!py3 False`               | If `True`, you can directly use a shorthand syntax to represent mention links for social media providers and they will be auto-linked.
+`provider`                      | string | `#!py3 'github'`            | The provider to use for repository shorthand syntax and shortener.
+`user`                          | string | `#!py3 ''`                  | The default user name to use for the specified provider.
+`repo`                          | string | `#!py3 ''`                  | The default repository name to use for the specified user and provider.
+`labels`                        | dict   | `#!py3 {}`                  | A dictionary for overriding repository link title text. See [Labels](#labels) for more info.
+
+### User Excludes
+
+Defaults for `shortener_user_exclude`:
+
+```py
+{
+    "bitbucket": ['dashboard', 'account', 'plans', 'support', 'repo'],
+    "github": ['marketeplace', 'notifications', 'issues', 'pull', 'sponsors', 'settings', 'support'],
+    "gitlab": ['dashboard', '-', 'explore', 'help', 'projects'],
+    "twitter": ['i', 'messages', 'bookmarks', 'home']
+}
+```
+
+When overriding, only the providers that are explicitly provided get overridden.
 
 ### Labels
 
diff --git a/docs/src/mkdocs.yml b/docs/src/mkdocs.yml
index 26fb5298..89fc0a39 100644
--- a/docs/src/mkdocs.yml
+++ b/docs/src/mkdocs.yml
@@ -105,6 +105,7 @@ markdown_extensions:
       repo_url_shortener: true
       repo_url_shorthand: true
       social_url_shorthand: true
+      social_url_shortener: true
       user: facelessuser
       repo: pymdown-extensions
   - pymdownx.tilde:
diff --git a/docs/theme/assets/pymdownx-extras/extra-8d532f7233.css b/docs/theme/assets/pymdownx-extras/extra-8d532f7233.css
new file mode 100644
index 00000000..a5ce6e77
--- /dev/null
+++ b/docs/theme/assets/pymdownx-extras/extra-8d532f7233.css
@@ -0,0 +1,1 @@
+@charset "UTF-8";:root{--md-code-fg-color:#f8f8f2;--md-code-bg-color:#272935;--md-default-fg-color:rgba(248, 248, 242, 0.87);--md-default-fg-color--light:rgba(248, 248, 242, 0.54);--md-default-fg-color--lighter:rgba(248, 248, 242, 0.16);--md-default-fg-color--lightest:rgba(248, 248, 242, 0.07);--md-default-bg-color:#2e303e;--md-default-bg-color--light:rgba(46, 48, 62, 0.7);--md-default-bg-color--lighter:rgba(46, 48, 62, 0.3);--md-default-bg-color--lightest:rgba(46, 48, 62, 0.12);--md-default-bg-color--dark:#272935;--md-default-bg-color--darker:#21222c;--md-default-bg-color--darkest:#1a1b23}[data-md-color-primary=drac-red]{--md-primary-fg-color:hsla(0deg, 100%, 67%, 1);--md-primary-fg-color--transparent:hsla(0deg, 100%, 67%, 0.1);--md-primary-fg-color--light:hsla(0deg, 100%, 72%, 1);--md-primary-fg-color--dark:hsla(0deg, 100%, 62%, 1);--md-primary-bg-color:var(--md-default-bg-color);--md-primary-bg-color--light:var(--md-default-bg-color--light)}[data-md-color-primary=drac-pink]{--md-primary-fg-color:hsla(326deg, 100%, 74%, 1);--md-primary-fg-color--transparent:hsla(326deg, 100%, 74%, 0.1);--md-primary-fg-color--light:hsla(326deg, 100%, 79%, 1);--md-primary-fg-color--dark:hsla(326deg, 100%, 69%, 1);--md-primary-bg-color:var(--md-default-bg-color);--md-primary-bg-color--light:var(--md-default-bg-color--light)}[data-md-color-primary=drac-purple]{--md-primary-fg-color:hsla(265deg, 89%, 78%, 1);--md-primary-fg-color--transparent:hsla(265deg, 89%, 78%, 0.1);--md-primary-fg-color--light:hsla(265deg, 89%, 83%, 1);--md-primary-fg-color--dark:hsla(265deg, 89%, 73%, 1);--md-primary-bg-color:var(--md-default-bg-color);--md-primary-bg-color--light:var(--md-default-bg-color--light)}[data-md-color-primary=drac-blue]{--md-primary-fg-color:hsla(225deg, 27%, 51%, 1);--md-primary-fg-color--transparent:hsla(225deg, 27%, 51%, 0.1);--md-primary-fg-color--light:hsla(225deg, 27%, 56%, 1);--md-primary-fg-color--dark:hsla(225deg, 27%, 46%, 1);--md-primary-bg-color:var(--md-default-bg-color);--md-primary-bg-color--light:var(--md-default-bg-color--light)}[data-md-color-primary=drac-cyan]{--md-primary-fg-color:hsla(191deg, 97%, 77%, 1);--md-primary-fg-color--transparent:hsla(191deg, 97%, 77%, 0.1);--md-primary-fg-color--light:hsla(191deg, 97%, 82%, 1);--md-primary-fg-color--dark:hsla(191deg, 97%, 72%, 1);--md-primary-bg-color:var(--md-default-bg-color);--md-primary-bg-color--light:var(--md-default-bg-color--light)}[data-md-color-primary=drac-green]{--md-primary-fg-color:hsla(135deg, 94%, 65%, 1);--md-primary-fg-color--transparent:hsla(135deg, 94%, 65%, 0.1);--md-primary-fg-color--light:hsla(135deg, 94%, 70%, 1);--md-primary-fg-color--dark:hsla(135deg, 94%, 60%, 1);--md-primary-bg-color:var(--md-default-bg-color);--md-primary-bg-color--light:var(--md-default-bg-color--light)}[data-md-color-primary=drac-yellow]{--md-primary-fg-color:hsla(65deg, 92%, 76%, 1);--md-primary-fg-color--transparent:hsla(65deg, 92%, 76%, 0.1);--md-primary-fg-color--light:hsla(65deg, 92%, 81%, 1);--md-primary-fg-color--dark:hsla(65deg, 92%, 71%, 1);--md-primary-bg-color:var(--md-default-bg-color);--md-primary-bg-color--light:var(--md-default-bg-color--light)}[data-md-color-primary=drac-orange]{--md-primary-fg-color:hsla(31deg, 100%, 71%, 1);--md-primary-fg-color--transparent:hsla(31deg, 100%, 71%, 0.1);--md-primary-fg-color--light:hsla(31deg, 100%, 76%, 1);--md-primary-fg-color--dark:hsla(31deg, 100%, 66%, 1);--md-primary-bg-color:var(--md-default-bg-color);--md-primary-bg-color--light:var(--md-default-bg-color--light)}[data-md-color-accent=drac-red]{--md-accent-fg-color:hsla(0deg, 100%, 62%, 1);--md-accent-fg-color--transparent:hsla(0deg, 100%, 62%, 0.1);--md-accent-bg-color:var(--md-default-bg-color);--md-accent-bg-color--light:var(--md-default-bg-color--light)}[data-md-color-accent=drac-pink]{--md-accent-fg-color:hsla(326deg, 100%, 69%, 1);--md-accent-fg-color--transparent:hsla(326deg, 100%, 69%, 0.1);--md-accent-bg-color:var(--md-default-bg-color);--md-accent-bg-color--light:var(--md-default-bg-color--light)}[data-md-color-accent=drac-purple]{--md-accent-fg-color:hsla(265deg, 89%, 73%, 1);--md-accent-fg-color--transparent:hsla(265deg, 89%, 73%, 0.1);--md-accent-bg-color:var(--md-default-bg-color);--md-accent-bg-color--light:var(--md-default-bg-color--light)}[data-md-color-accent=drac-blue]{--md-accent-fg-color:hsla(225deg, 27%, 46%, 1);--md-accent-fg-color--transparent:hsla(225deg, 27%, 46%, 0.1);--md-accent-bg-color:var(--md-default-bg-color);--md-accent-bg-color--light:var(--md-default-bg-color--light)}[data-md-color-accent=drac-cyan]{--md-accent-fg-color:hsla(191deg, 97%, 72%, 1);--md-accent-fg-color--transparent:hsla(191deg, 97%, 72%, 0.1);--md-accent-bg-color:var(--md-default-bg-color);--md-accent-bg-color--light:var(--md-default-bg-color--light)}[data-md-color-accent=drac-green]{--md-accent-fg-color:hsla(135deg, 94%, 60%, 1);--md-accent-fg-color--transparent:hsla(135deg, 94%, 60%, 0.1);--md-accent-bg-color:var(--md-default-bg-color);--md-accent-bg-color--light:var(--md-default-bg-color--light)}[data-md-color-accent=drac-yellow]{--md-accent-fg-color:hsla(65deg, 92%, 71%, 1);--md-accent-fg-color--transparent:hsla(65deg, 92%, 71%, 0.1);--md-accent-bg-color:var(--md-default-bg-color);--md-accent-bg-color--light:var(--md-default-bg-color--light)}[data-md-color-accent=drac-orange]{--md-accent-fg-color:hsla(31deg, 100%, 66%, 1);--md-accent-fg-color--transparent:hsla(31deg, 100%, 66%, 0.1);--md-accent-bg-color:var(--md-default-bg-color);--md-accent-bg-color--light:var(--md-default-bg-color--light)}.md-typeset .admonition.note,.md-typeset details.note{border-color:#6071a4}.md-typeset .admonition.note>:first-child,.md-typeset details.note>:first-child{background-color:rgba(96,113,164,.4)}.md-typeset .admonition.note>:first-child::before,.md-typeset details.note>:first-child::before{background-color:#6071a4}.md-typeset .admonition.abstract,.md-typeset .admonition.summary,.md-typeset .admonition.tldr,.md-typeset details.abstract,.md-typeset details.summary,.md-typeset details.tldr{border-color:#8be8fd}.md-typeset .admonition.abstract>:first-child,.md-typeset .admonition.summary>:first-child,.md-typeset .admonition.tldr>:first-child,.md-typeset details.abstract>:first-child,.md-typeset details.summary>:first-child,.md-typeset details.tldr>:first-child{background-color:rgba(139,232,253,.4)}.md-typeset .admonition.abstract>:first-child::before,.md-typeset .admonition.summary>:first-child::before,.md-typeset .admonition.tldr>:first-child::before,.md-typeset details.abstract>:first-child::before,.md-typeset details.summary>:first-child::before,.md-typeset details.tldr>:first-child::before{background-color:#8be8fd}.md-typeset .admonition.info,.md-typeset .admonition.todo,.md-typeset details.info,.md-typeset details.todo{border-color:#bff3fd}.md-typeset .admonition.info>:first-child,.md-typeset .admonition.todo>:first-child,.md-typeset details.info>:first-child,.md-typeset details.todo>:first-child{background-color:rgba(191,243,253,.4)}.md-typeset .admonition.info>:first-child::before,.md-typeset .admonition.todo>:first-child::before,.md-typeset details.info>:first-child::before,.md-typeset details.todo>:first-child::before{background-color:#bff3fd}.md-typeset .admonition.hint,.md-typeset .admonition.important,.md-typeset .admonition.tip,.md-typeset details.hint,.md-typeset details.important,.md-typeset details.tip{border-color:#8bfdd9}.md-typeset .admonition.hint>:first-child,.md-typeset .admonition.important>:first-child,.md-typeset .admonition.tip>:first-child,.md-typeset details.hint>:first-child,.md-typeset details.important>:first-child,.md-typeset details.tip>:first-child{background-color:rgba(139,253,217,.4)}.md-typeset .admonition.hint>:first-child::before,.md-typeset .admonition.important>:first-child::before,.md-typeset .admonition.tip>:first-child::before,.md-typeset details.hint>:first-child::before,.md-typeset details.important>:first-child::before,.md-typeset details.tip>:first-child::before{background-color:#8bfdd9}.md-typeset .admonition.check,.md-typeset .admonition.done,.md-typeset .admonition.success,.md-typeset details.check,.md-typeset details.done,.md-typeset details.success{border-color:#52fa7c}.md-typeset .admonition.check>:first-child,.md-typeset .admonition.done>:first-child,.md-typeset .admonition.success>:first-child,.md-typeset details.check>:first-child,.md-typeset details.done>:first-child,.md-typeset details.success>:first-child{background-color:rgba(82,250,124,.4)}.md-typeset .admonition.check>:first-child::before,.md-typeset .admonition.done>:first-child::before,.md-typeset .admonition.success>:first-child::before,.md-typeset details.check>:first-child::before,.md-typeset details.done>:first-child::before,.md-typeset details.success>:first-child::before{background-color:#52fa7c}.md-typeset .admonition.faq,.md-typeset .admonition.help,.md-typeset .admonition.question,.md-typeset details.faq,.md-typeset details.help,.md-typeset details.question{border-color:#98fbb1}.md-typeset .admonition.faq>:first-child,.md-typeset .admonition.help>:first-child,.md-typeset .admonition.question>:first-child,.md-typeset details.faq>:first-child,.md-typeset details.help>:first-child,.md-typeset details.question>:first-child{background-color:rgba(152,251,177,.4)}.md-typeset .admonition.faq>:first-child::before,.md-typeset .admonition.help>:first-child::before,.md-typeset .admonition.question>:first-child::before,.md-typeset details.faq>:first-child::before,.md-typeset details.help>:first-child::before,.md-typeset details.question>:first-child::before{background-color:#98fbb1}.md-typeset .admonition.attention,.md-typeset .admonition.caution,.md-typeset .admonition.warning,.md-typeset details.attention,.md-typeset details.caution,.md-typeset details.warning{border-color:#ffb86b}.md-typeset .admonition.attention>:first-child,.md-typeset .admonition.caution>:first-child,.md-typeset .admonition.warning>:first-child,.md-typeset details.attention>:first-child,.md-typeset details.caution>:first-child,.md-typeset details.warning>:first-child{background-color:rgba(255,184,107,.4)}.md-typeset .admonition.attention>:first-child::before,.md-typeset .admonition.caution>:first-child::before,.md-typeset .admonition.warning>:first-child::before,.md-typeset details.attention>:first-child::before,.md-typeset details.caution>:first-child::before,.md-typeset details.warning>:first-child::before{background-color:#ffb86b}.md-typeset .admonition.fail,.md-typeset .admonition.failure,.md-typeset .admonition.missing,.md-typeset details.fail,.md-typeset details.failure,.md-typeset details.missing{border-color:#ff2e2e}.md-typeset .admonition.fail>:first-child,.md-typeset .admonition.failure>:first-child,.md-typeset .admonition.missing>:first-child,.md-typeset details.fail>:first-child,.md-typeset details.failure>:first-child,.md-typeset details.missing>:first-child{background-color:rgba(255,46,46,.4)}.md-typeset .admonition.fail>:first-child::before,.md-typeset .admonition.failure>:first-child::before,.md-typeset .admonition.missing>:first-child::before,.md-typeset details.fail>:first-child::before,.md-typeset details.failure>:first-child::before,.md-typeset details.missing>:first-child::before{background-color:#ff2e2e}.md-typeset .admonition.danger,.md-typeset .admonition.error,.md-typeset details.danger,.md-typeset details.error{border-color:#ff5757}.md-typeset .admonition.danger>:first-child,.md-typeset .admonition.error>:first-child,.md-typeset details.danger>:first-child,.md-typeset details.error>:first-child{background-color:rgba(255,87,87,.4)}.md-typeset .admonition.danger>:first-child::before,.md-typeset .admonition.error>:first-child::before,.md-typeset details.danger>:first-child::before,.md-typeset details.error>:first-child::before{background-color:#ff5757}.md-typeset .admonition.bug,.md-typeset details.bug{border-color:#ff47b3}.md-typeset .admonition.bug>:first-child,.md-typeset details.bug>:first-child{background-color:rgba(255,71,179,.4)}.md-typeset .admonition.bug>:first-child::before,.md-typeset details.bug>:first-child::before{background-color:#ff47b3}.md-typeset .admonition.example,.md-typeset details.example{border-color:#bf95f9}.md-typeset .admonition.example>:first-child,.md-typeset details.example>:first-child{background-color:rgba(191,149,249,.4)}.md-typeset .admonition.example>:first-child::before,.md-typeset details.example>:first-child::before{background-color:#bf95f9}.md-typeset .admonition.cite,.md-typeset .admonition.quote,.md-typeset details.cite,.md-typeset details.quote{border-color:#787d8c}.md-typeset .admonition.cite>:first-child,.md-typeset .admonition.quote>:first-child,.md-typeset details.cite>:first-child,.md-typeset details.quote>:first-child{background-color:rgba(120,125,140,.4)}.md-typeset .admonition.cite>:first-child::before,.md-typeset .admonition.quote>:first-child::before,.md-typeset details.cite>:first-child::before,.md-typeset details.quote>:first-child::before{background-color:#787d8c}:root{--md-admonition-icon--settings:url("data:image/svg+xml;charset=utf-8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'><path d='M12,15.5A3.5,3.5 0 0,1 8.5,12A3.5,3.5 0 0,1 12,8.5A3.5,3.5 0 0,1 15.5,12A3.5,3.5 0 0,1 12,15.5M19.43,12.97C19.47,12.65 19.5,12.33 19.5,12C19.5,11.67 19.47,11.34 19.43,11L21.54,9.37C21.73,9.22 21.78,8.95 21.66,8.73L19.66,5.27C19.54,5.05 19.27,4.96 19.05,5.05L16.56,6.05C16.04,5.66 15.5,5.32 14.87,5.07L14.5,2.42C14.46,2.18 14.25,2 14,2H10C9.75,2 9.54,2.18 9.5,2.42L9.13,5.07C8.5,5.32 7.96,5.66 7.44,6.05L4.95,5.05C4.73,4.96 4.46,5.05 4.34,5.27L2.34,8.73C2.21,8.95 2.27,9.22 2.46,9.37L4.57,11C4.53,11.34 4.5,11.67 4.5,12C4.5,12.33 4.53,12.65 4.57,12.97L2.46,14.63C2.27,14.78 2.21,15.05 2.34,15.27L4.34,18.73C4.46,18.95 4.73,19.03 4.95,18.95L7.44,17.94C7.96,18.34 8.5,18.68 9.13,18.93L9.5,21.58C9.54,21.82 9.75,22 10,22H14C14.25,22 14.46,21.82 14.5,21.58L14.87,18.93C15.5,18.67 16.04,18.34 16.56,17.94L19.05,18.95C19.27,19.03 19.54,18.95 19.66,18.73L21.66,15.27C21.78,15.05 21.73,14.78 21.54,14.63L19.43,12.97Z' /></svg>");--md-admonition-icon--new:url("data:image/svg+xml;charset=utf-8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'><path d='M23,12L20.56,9.22L20.9,5.54L17.29,4.72L15.4,1.54L12,3L8.6,1.54L6.71,4.72L3.1,5.53L3.44,9.21L1,12L3.44,14.78L3.1,18.47L6.71,19.29L8.6,22.47L12,21L15.4,22.46L17.29,19.28L20.9,18.46L20.56,14.78L23,12M13,17H11V15H13V17M13,13H11V7H13V13Z' /></svg>")}.md-typeset .admonition.config,.md-typeset .admonition.settings,.md-typeset details.config,.md-typeset details.settings{border-color:#ff7ac6}.md-typeset .config>.admonition-title,.md-typeset .settings>.admonition-title,.md-typeset details.config>summary,.md-typeset details.settings>summary{background-color:rgba(255,122,198,.4)}.md-typeset .config>.admonition-title::before,.md-typeset .settings>.admonition-title::before,.md-typeset details.config>summary::before,.md-typeset details.settings>summary::before{width:1rem;height:1rem;background-color:#ff7ac6;background-size:1rem;-webkit-mask-image:var(--md-admonition-icon--settings);mask-image:var(--md-admonition-icon--settings);content:"\a0"}.md-typeset .admonition.new,.md-typeset details.new{border-color:#f1fa89}.md-typeset .new>.admonition-title,.md-typeset details.new>summary{background-color:rgba(241,250,137,.4)}.md-typeset .new>.admonition-title::before,.md-typeset details.new>summary::before{width:1rem;height:1rem;background-color:#f1fa89;background-size:1rem;-webkit-mask-image:var(--md-admonition-icon--new);mask-image:var(--md-admonition-icon--new);content:"\a0"}.md-typeset .admonition,.md-typeset details,.md-typeset table:not([class]){box-shadow:0 .2rem .5rem rgba(0,0,0,.15),0 0 .05rem rgba(0,0,0,.2)}.md-typeset summary::after{background-color:var(--md-default-fg-color--light)}.md-typeset del.critic{padding:0 .25em;background-color:rgba(255,122,198,.5);box-shadow:none}.md-typeset ins.critic{padding:0 .25em;background-color:rgba(82,250,124,.5);box-shadow:none}.md-typeset .critic.comment{color:#6071a4}.md-typeset .critic.break{margin:0}.highlight .hll{background-color:rgba(68,71,90,.4)}.highlight .c{color:#6071a4}.highlight .err{color:#f8f8f2}.highlight .g{color:#f8f8f2}.highlight .k{color:#ff7ac6}.highlight .l{color:#f8f8f2}.highlight .n{color:#f8f8f2}.highlight .o{color:#ff7ac6}.highlight .x{color:#f8f8f2}.highlight .p{color:#f8f8f2}.highlight .ch{color:#6071a4}.highlight .cm{color:#6071a4}.highlight .cp{color:#ff7ac6}.highlight .cpf{color:#6071a4}.highlight .c1{color:#6071a4}.highlight .cs{color:#6071a4}.highlight .gd{color:#ff7ac6;font-weight:700;background-color:#272935}.highlight .ge{color:#f8f8f2;text-decoration:underline}.highlight .gr{color:#f8f8f2}.highlight .gh{color:rgba(248,248,242,.54);font-weight:700}.highlight .gi{color:#52fa7c;font-weight:700;background-color:#272935}.highlight .go{color:#6071a4}.highlight .gp{color:#f8f8f2}.highlight .gs{color:#f8f8f2}.highlight .gu{color:rgba(248,248,242,.54);font-weight:700}.highlight .gt{color:#f8f8f2}.highlight .kc{color:#ff7ac6}.highlight .kd{color:#8be8fd;font-style:italic}.highlight .kn{color:#ff7ac6}.highlight .kp{color:#ff7ac6}.highlight .kr{color:#ff7ac6}.highlight .kt{color:#8be8fd}.highlight .ld{color:#f8f8f2}.highlight .m{color:#bf95f9}.highlight .s{color:#f1fa89}.highlight .na{color:#52fa7c}.highlight .nb{color:#8be8fd;font-style:italic}.highlight .nc{color:#52fa7c}.highlight .no{color:#f8f8f2}.highlight .nd{color:#f8f8f2}.highlight .ni{color:#f8f8f2}.highlight .ne{color:#f8f8f2}.highlight .nf{color:#52fa7c}.highlight .nl{color:#8be8fd;font-style:italic}.highlight .nn{color:#f8f8f2}.highlight .nx{color:#f8f8f2}.highlight .py{color:#f8f8f2}.highlight .nt{color:#ff7ac6}.highlight .nv{color:#8be8fd;font-style:italic}.highlight .ow{color:#ff7ac6}.highlight .w{color:#f8f8f2}.highlight .mb{color:#bf95f9}.highlight .mf{color:#bf95f9}.highlight .mh{color:#bf95f9}.highlight .mi{color:#bf95f9}.highlight .mo{color:#bf95f9}.highlight .sa{color:#f1fa89}.highlight .sb{color:#f1fa89}.highlight .sc{color:#f1fa89}.highlight .dl{color:#f1fa89}.highlight .sd{color:#f1fa89}.highlight .s2{color:#f1fa89}.highlight .se{color:#f1fa89}.highlight .sh{color:#f1fa89}.highlight .si{color:#f1fa89}.highlight .sx{color:#f1fa89}.highlight .sr{color:#f1fa89}.highlight .s1{color:#f1fa89}.highlight .ss{color:#f1fa89}.highlight .bp{color:#f8f8f2;font-style:italic}.highlight .fm{color:#52fa7c}.highlight .vc{color:#8be8fd;font-style:italic}.highlight .vg{color:#8be8fd;font-style:italic}.highlight .vi{color:#8be8fd;font-style:italic}.highlight .vm{color:#8be8fd;font-style:italic}.highlight .il{color:#bf95f9}.md-typeset a>code{margin:0 .29412em;padding:.07353em 0;color:inherit;font-size:.85em;background-color:var(--md-code-bg-color);border-radius:.1rem;box-shadow:.29412em 0 0 var(--md-code-bg-color),-.29412em 0 0 var(--md-code-bg-color);-webkit-box-decoration-break:clone;box-decoration-break:clone}.md-typeset td code{word-break:normal}.md-typeset .codehilite,.md-typeset .highlight{-moz-tab-size:8;-o-tab-size:8;tab-size:8}.md-typeset .codehilite [data-linenos].special::before,.md-typeset .highlight [data-linenos].special::before{background-color:var(--md-default-fg-color--lightest)}.md-typeset .codehilitetable .linenodiv .special,.md-typeset .highlighttable .linenodiv .special{margin-right:-.58824em;margin-left:-1.17647em;padding-right:.58824em;padding-left:1.17647em;background-color:var(--md-default-fg-color--lightest)}.md-typeset kbd{background-color:var(--md-default-fg-color--lightest);box-shadow:0 .1rem 0 .05rem var(--md-default-bg-color--darkest),0 .1rem 0 var(--md-default-bg-color--dark),inset 0 -.1rem .2rem var(--md-default-fg-color--lighter)}.md-typeset .keys kbd::after,.md-typeset .keys kbd::before{position:relative;margin:0;color:var(--md-default-fg-color);-moz-osx-font-smoothing:initial;-webkit-font-smoothing:initial}.md-typeset .keys span{padding:0 .2em;color:var(--md-default-fg-color--light)}.md-typeset .keys .key-alt::before{padding-right:.4em;content:"⎇"}.md-typeset .keys .key-left-alt::before{padding-right:.4em;content:"⎇"}.md-typeset .keys .key-right-alt::before{padding-right:.4em;content:"⎇"}.md-typeset .keys .key-command::before{padding-right:.4em;content:"⌘"}.md-typeset .keys .key-left-command::before{padding-right:.4em;content:"⌘"}.md-typeset .keys .key-right-command::before{padding-right:.4em;content:"⌘"}.md-typeset .keys .key-control::before{padding-right:.4em;content:"⌃"}.md-typeset .keys .key-left-control::before{padding-right:.4em;content:"⌃"}.md-typeset .keys .key-right-control::before{padding-right:.4em;content:"⌃"}.md-typeset .keys .key-meta::before{padding-right:.4em;content:"◆"}.md-typeset .keys .key-left-meta::before{padding-right:.4em;content:"◆"}.md-typeset .keys .key-right-meta::before{padding-right:.4em;content:"◆"}.md-typeset .keys .key-option::before{padding-right:.4em;content:"⌥"}.md-typeset .keys .key-left-option::before{padding-right:.4em;content:"⌥"}.md-typeset .keys .key-right-option::before{padding-right:.4em;content:"⌥"}.md-typeset .keys .key-shift::before{padding-right:.4em;content:"⇧"}.md-typeset .keys .key-left-shift::before{padding-right:.4em;content:"⇧"}.md-typeset .keys .key-right-shift::before{padding-right:.4em;content:"⇧"}.md-typeset .keys .key-super::before{padding-right:.4em;content:"❖"}.md-typeset .keys .key-left-super::before{padding-right:.4em;content:"❖"}.md-typeset .keys .key-right-super::before{padding-right:.4em;content:"❖"}.md-typeset .keys .key-windows::before{padding-right:.4em;content:"⊞"}.md-typeset .keys .key-left-windows::before{padding-right:.4em;content:"⊞"}.md-typeset .keys .key-right-windows::before{padding-right:.4em;content:"⊞"}.md-typeset .keys .key-arrow-down::before{padding-right:.4em;content:"▽"}.md-typeset .keys .key-arrow-left::before{padding-right:.4em;content:"◁"}.md-typeset .keys .key-arrow-right::before{padding-right:.4em;content:"▷"}.md-typeset .keys .key-arrow-up::before{padding-right:.4em;content:"△"}.md-typeset .keys .key-backspace::before{padding-right:.4em;content:"⌫"}.md-typeset .keys .key-backtab::before{padding-right:.4em;content:"⇤"}.md-typeset .keys .key-caps-lock::before{padding-right:.4em;content:"⇪"}.md-typeset .keys .key-clear::before{padding-right:.4em;content:"⌧"}.md-typeset .keys .key-context-menu::before{padding-right:.4em;content:"☰"}.md-typeset .keys .key-delete::before{padding-right:.4em;content:"⌦"}.md-typeset .keys .key-eject::before{padding-right:.4em;content:"⏏"}.md-typeset .keys .key-end::before{padding-right:.4em;content:"⤓"}.md-typeset .keys .key-escape::before{padding-right:.4em;content:"⎋"}.md-typeset .keys .key-home::before{padding-right:.4em;content:"⤒"}.md-typeset .keys .key-insert::before{padding-right:.4em;content:"⎀"}.md-typeset .keys .key-page-down::before{padding-right:.4em;content:"⇟"}.md-typeset .keys .key-page-up::before{padding-right:.4em;content:"⇞"}.md-typeset .keys .key-print-screen::before{padding-right:.4em;content:"⎙"}.md-typeset .keys .key-tab::after{padding-left:.4em;content:"↹"}.md-typeset .keys .key-num-enter::after{padding-left:.4em;content:"⌤"}.md-typeset .keys .key-enter::after{padding-left:.4em;content:"⏎"}.md-typeset a{color:#8be8fd}.md-typeset a[href^="mailto:"]::before{-webkit-mask-image:url("data:image/svg+xml;charset=utf-8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'><path d='M20,4H4C2.89,4 2,4.89 2,6V18A2,2 0 0,0 4,20H20A2,2 0 0,0 22,18V6C22,4.89 21.1,4 20,4M17,17H7V15H17M17,13H7V11H17M20,9H17V6H20' /></svg>");mask-image:url("data:image/svg+xml;charset=utf-8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'><path d='M20,4H4C2.89,4 2,4.89 2,6V18A2,2 0 0,0 4,20H20A2,2 0 0,0 22,18V6C22,4.89 21.1,4 20,4M17,17H7V15H17M17,13H7V11H17M20,9H17V6H20' /></svg>")}.md-typeset .magiclink-commit::before,.md-typeset .magiclink-compare::before,.md-typeset .magiclink-issue::before,.md-typeset .magiclink-pull::before{-webkit-mask-position:bottom;mask-position:bottom;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:.9375em auto;mask-size:.9375em auto}.md-typeset .magiclink-commit::before,.md-typeset .magiclink-compare::before,.md-typeset .magiclink-issue::before,.md-typeset .magiclink-pull::before,.md-typeset .magiclink-repository::before,.md-typeset a[href^="mailto:"]::before{position:relative;width:1em;height:1em;padding-right:1em;background-color:#8be8fd;background-size:1em;transition:background-color 125ms;content:"\a0"}.md-typeset .magiclink-commit:hover::before,.md-typeset .magiclink-compare:hover::before,.md-typeset .magiclink-issue:hover::before,.md-typeset .magiclink-pull:hover::before,.md-typeset .magiclink-repository:hover::before,.md-typeset a[href^="mailto:"]:hover::before{background-color:var(--md-accent-fg-color)}.md-typeset .magiclink-commit::before{-webkit-mask-image:url("data:image/svg+xml;charset=utf-8,<svg xmlns='http://www.w3.org/2000/svg' width='14' height='16' viewBox='0 0 14 16'><path fill-rule='evenodd' d='M10.86 7c-.45-1.72-2-3-3.86-3-1.86 0-3.41 1.28-3.86 3H0v2h3.14c.45 1.72 2 3 3.86 3 1.86 0 3.41-1.28 3.86-3H14V7h-3.14zM7 10.2c-1.22 0-2.2-.98-2.2-2.2 0-1.22.98-2.2 2.2-2.2 1.22 0 2.2.98 2.2 2.2 0 1.22-.98 2.2-2.2 2.2z'/></svg>");mask-image:url("data:image/svg+xml;charset=utf-8,<svg xmlns='http://www.w3.org/2000/svg' width='14' height='16' viewBox='0 0 14 16'><path fill-rule='evenodd' d='M10.86 7c-.45-1.72-2-3-3.86-3-1.86 0-3.41 1.28-3.86 3H0v2h3.14c.45 1.72 2 3 3.86 3 1.86 0 3.41-1.28 3.86-3H14V7h-3.14zM7 10.2c-1.22 0-2.2-.98-2.2-2.2 0-1.22.98-2.2 2.2-2.2 1.22 0 2.2.98 2.2 2.2 0 1.22-.98 2.2-2.2 2.2z'/></svg>")}.md-typeset .magiclink-compare::before{-webkit-mask-image:url("data:image/svg+xml;charset=utf-8,<svg xmlns='http://www.w3.org/2000/svg' width='13' height='16' viewBox='0 0 13 16'><path fill-rule='evenodd' d='M6 7h2v1H6v2H5V8H3V7h2V5h1v2zm-3 6h5v-1H3v1zM7.5 2L11 5.5V15c0 .55-.45 1-1 1H1c-.55 0-1-.45-1-1V3c0-.55.45-1 1-1h6.5zM10 6L7 3H1v12h9V6zM8.5 0H3v1h5l4 4v8h1V4.5L8.5 0z'/></svg>");mask-image:url("data:image/svg+xml;charset=utf-8,<svg xmlns='http://www.w3.org/2000/svg' width='13' height='16' viewBox='0 0 13 16'><path fill-rule='evenodd' d='M6 7h2v1H6v2H5V8H3V7h2V5h1v2zm-3 6h5v-1H3v1zM7.5 2L11 5.5V15c0 .55-.45 1-1 1H1c-.55 0-1-.45-1-1V3c0-.55.45-1 1-1h6.5zM10 6L7 3H1v12h9V6zM8.5 0H3v1h5l4 4v8h1V4.5L8.5 0z'/></svg>")}.md-typeset .magiclink-pull::before{-webkit-mask-image:url("data:image/svg+xml;charset=utf-8,<svg xmlns='http://www.w3.org/2000/svg' width='12' height='16' viewBox='0 0 12 16'><path fill-rule='evenodd' d='M11 11.28V5c-.03-.78-.34-1.47-.94-2.06C9.46 2.35 8.78 2.03 8 2H7V0L4 3l3 3V4h1c.27.02.48.11.69.31.21.2.3.42.31.69v6.28A1.993 1.993 0 0010 15a1.993 1.993 0 001-3.72zm-1 2.92c-.66 0-1.2-.55-1.2-1.2 0-.65.55-1.2 1.2-1.2.65 0 1.2.55 1.2 1.2 0 .65-.55 1.2-1.2 1.2zM4 3c0-1.11-.89-2-2-2a1.993 1.993 0 00-1 3.72v6.56A1.993 1.993 0 002 15a1.993 1.993 0 001-3.72V4.72c.59-.34 1-.98 1-1.72zm-.8 10c0 .66-.55 1.2-1.2 1.2-.65 0-1.2-.55-1.2-1.2 0-.65.55-1.2 1.2-1.2.65 0 1.2.55 1.2 1.2zM2 4.2C1.34 4.2.8 3.65.8 3c0-.65.55-1.2 1.2-1.2.65 0 1.2.55 1.2 1.2 0 .65-.55 1.2-1.2 1.2z'/></svg>");mask-image:url("data:image/svg+xml;charset=utf-8,<svg xmlns='http://www.w3.org/2000/svg' width='12' height='16' viewBox='0 0 12 16'><path fill-rule='evenodd' d='M11 11.28V5c-.03-.78-.34-1.47-.94-2.06C9.46 2.35 8.78 2.03 8 2H7V0L4 3l3 3V4h1c.27.02.48.11.69.31.21.2.3.42.31.69v6.28A1.993 1.993 0 0010 15a1.993 1.993 0 001-3.72zm-1 2.92c-.66 0-1.2-.55-1.2-1.2 0-.65.55-1.2 1.2-1.2.65 0 1.2.55 1.2 1.2 0 .65-.55 1.2-1.2 1.2zM4 3c0-1.11-.89-2-2-2a1.993 1.993 0 00-1 3.72v6.56A1.993 1.993 0 002 15a1.993 1.993 0 001-3.72V4.72c.59-.34 1-.98 1-1.72zm-.8 10c0 .66-.55 1.2-1.2 1.2-.65 0-1.2-.55-1.2-1.2 0-.65.55-1.2 1.2-1.2.65 0 1.2.55 1.2 1.2zM2 4.2C1.34 4.2.8 3.65.8 3c0-.65.55-1.2 1.2-1.2.65 0 1.2.55 1.2 1.2 0 .65-.55 1.2-1.2 1.2z'/></svg>")}.md-typeset .magiclink-issue::before{-webkit-mask-image:url("data:image/svg+xml;charset=utf-8,<svg xmlns='http://www.w3.org/2000/svg' width='14' height='16' viewBox='0 0 14 16'><path fill-rule='evenodd' d='M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 011.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z'/></svg>");mask-image:url("data:image/svg+xml;charset=utf-8,<svg xmlns='http://www.w3.org/2000/svg' width='14' height='16' viewBox='0 0 14 16'><path fill-rule='evenodd' d='M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 011.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z'/></svg>")}.md-typeset .magiclink-repository.magiclink-github::before{-webkit-mask-image:url("data:image/svg+xml;charset=utf-8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'><path d='M12,2A10,10 0 0,0 2,12C2,16.42 4.87,20.17 8.84,21.5C9.34,21.58 9.5,21.27 9.5,21C9.5,20.77 9.5,20.14 9.5,19.31C6.73,19.91 6.14,17.97 6.14,17.97C5.68,16.81 5.03,16.5 5.03,16.5C4.12,15.88 5.1,15.9 5.1,15.9C6.1,15.97 6.63,16.93 6.63,16.93C7.5,18.45 8.97,18 9.54,17.76C9.63,17.11 9.89,16.67 10.17,16.42C7.95,16.17 5.62,15.31 5.62,11.5C5.62,10.39 6,9.5 6.65,8.79C6.55,8.54 6.2,7.5 6.75,6.15C6.75,6.15 7.59,5.88 9.5,7.17C10.29,6.95 11.15,6.84 12,6.84C12.85,6.84 13.71,6.95 14.5,7.17C16.41,5.88 17.25,6.15 17.25,6.15C17.8,7.5 17.45,8.54 17.35,8.79C18,9.5 18.38,10.39 18.38,11.5C18.38,15.32 16.04,16.16 13.81,16.41C14.17,16.72 14.5,17.33 14.5,18.26C14.5,19.6 14.5,20.68 14.5,21C14.5,21.27 14.66,21.59 15.17,21.5C19.14,20.16 22,16.42 22,12A10,10 0 0,0 12,2Z' /></svg>");mask-image:url("data:image/svg+xml;charset=utf-8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'><path d='M12,2A10,10 0 0,0 2,12C2,16.42 4.87,20.17 8.84,21.5C9.34,21.58 9.5,21.27 9.5,21C9.5,20.77 9.5,20.14 9.5,19.31C6.73,19.91 6.14,17.97 6.14,17.97C5.68,16.81 5.03,16.5 5.03,16.5C4.12,15.88 5.1,15.9 5.1,15.9C6.1,15.97 6.63,16.93 6.63,16.93C7.5,18.45 8.97,18 9.54,17.76C9.63,17.11 9.89,16.67 10.17,16.42C7.95,16.17 5.62,15.31 5.62,11.5C5.62,10.39 6,9.5 6.65,8.79C6.55,8.54 6.2,7.5 6.75,6.15C6.75,6.15 7.59,5.88 9.5,7.17C10.29,6.95 11.15,6.84 12,6.84C12.85,6.84 13.71,6.95 14.5,7.17C16.41,5.88 17.25,6.15 17.25,6.15C17.8,7.5 17.45,8.54 17.35,8.79C18,9.5 18.38,10.39 18.38,11.5C18.38,15.32 16.04,16.16 13.81,16.41C14.17,16.72 14.5,17.33 14.5,18.26C14.5,19.6 14.5,20.68 14.5,21C14.5,21.27 14.66,21.59 15.17,21.5C19.14,20.16 22,16.42 22,12A10,10 0 0,0 12,2Z' /></svg>")}.md-typeset .magiclink-repository.magiclink-gitlab::before{-webkit-mask-image:url("data:image/svg+xml;charset=utf-8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'><path d='M3.16,10L12,21.5L2.32,14.3C2.05,14.09 1.94,13.75 2.04,13.44L3.16,10M6.11,3.17C6,2.83 5.5,2.83 5.37,3.17L3.16,10H8.32L6.11,3.17M8.32,10L12,21.5L15.68,10H8.32M21.96,13.44L20.84,10L12,21.5L21.68,14.3C21.95,14.09 22.06,13.75 21.96,13.44M18.63,3.17C18.5,2.83 18,2.83 17.89,3.17L15.68,10H20.84L18.63,3.17Z' /></svg>");mask-image:url("data:image/svg+xml;charset=utf-8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'><path d='M3.16,10L12,21.5L2.32,14.3C2.05,14.09 1.94,13.75 2.04,13.44L3.16,10M6.11,3.17C6,2.83 5.5,2.83 5.37,3.17L3.16,10H8.32L6.11,3.17M8.32,10L12,21.5L15.68,10H8.32M21.96,13.44L20.84,10L12,21.5L21.68,14.3C21.95,14.09 22.06,13.75 21.96,13.44M18.63,3.17C18.5,2.83 18,2.83 17.89,3.17L15.68,10H20.84L18.63,3.17Z' /></svg>")}.md-typeset .magiclink-repository.magiclink-bitbucket::before{-webkit-mask-image:url("data:image/svg+xml;charset=utf-8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'><path d='M21.43,2C21.79,2.07 22.03,2.42 22,2.82L21.12,8.7L19.27,21.4C19.2,21.75 18.95,22 18.63,22H5.37C5.05,22 4.8,21.75 4.73,21.4L2.88,8.7L2,2.82C1.97,2.42 2.21,2.07 2.57,2H21.43M14.08,15.26L15.1,8.7H8.9L9.92,15.26H14.08Z' /></svg>");mask-image:url("data:image/svg+xml;charset=utf-8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'><path d='M21.43,2C21.79,2.07 22.03,2.42 22,2.82L21.12,8.7L19.27,21.4C19.2,21.75 18.95,22 18.63,22H5.37C5.05,22 4.8,21.75 4.73,21.4L2.88,8.7L2,2.82C1.97,2.42 2.21,2.07 2.57,2H21.43M14.08,15.26L15.1,8.7H8.9L9.92,15.26H14.08Z' /></svg>")}.md-typeset mark{padding:0 .25em;color:var(--md-default-bg-color);background-color:#eefb79;box-shadow:none}.md-typeset .progress-label{position:absolute;width:100%;margin:0;color:var(--md-default-fg-color);font-weight:700;line-height:1.4rem;white-space:nowrap;text-align:center;text-shadow:-.0625em -.0625em .375em var(--md-default-bg-color--light),.0625em -.0625em .375em var(--md-default-bg-color--light),-.0625em .0625em .375em var(--md-default-bg-color--light),.0625em .0625em .375em var(--md-default-bg-color--light)}.md-typeset .progress-bar{float:left;height:1.2rem;background-color:#2979ff}.md-typeset .candystripe-animate .progress-bar{-webkit-animation:animate-stripes 3s linear infinite;animation:animate-stripes 3s linear infinite}.md-typeset .progress{position:relative;display:block;width:100%;height:1.2rem;margin:.5rem 0;background-color:var(--md-default-fg-color--lightest)}.md-typeset .progress.thin{height:.4rem;margin-top:.9rem}.md-typeset .progress.thin .progress-label{margin-top:-.4rem}.md-typeset .progress.thin .progress-bar{height:.4rem}.md-typeset .progress.candystripe .progress-bar{background-image:linear-gradient(135deg,var(--md-default-bg-color--lightest) 27%,transparent 27%,transparent 52%,var(--md-default-bg-color--lightest) 52%,var(--md-default-bg-color--lightest) 77%,transparent 77%,transparent);background-size:2rem 2rem}.md-typeset .progress-100plus .progress-bar{background-color:#52fa7c}.md-typeset .progress-80plus .progress-bar{background-color:#98fbb1}.md-typeset .progress-60plus .progress-bar{background-color:#f1fa89}.md-typeset .progress-40plus .progress-bar{background-color:#ffb86b}.md-typeset .progress-20plus .progress-bar{background-color:#ff7ac6}.md-typeset .progress-0plus .progress-bar{background-color:#ff5757}@-webkit-keyframes animate-stripes{0%{background-position:0 0}100%{background-position:6rem 0}}@keyframes animate-stripes{0%{background-position:0 0}100%{background-position:6rem 0}}.md-typeset div.mermaid{margin:1em 0;overflow:auto}.md-typeset div.mermaid::-webkit-scrollbar{width:.2rem;height:.2rem}.md-typeset div.mermaid::-webkit-scrollbar-thumb{background-color:var(--md-default-fg-color--lighter)}.md-typeset div.mermaid::-webkit-scrollbar-thumb:hover{background-color:var(--md-accent-fg-color)}.md-typeset .tabbed-set>.tabbed-content{padding:0 .6rem;overflow:hidden;box-shadow:0 -.05rem var(--md-default-fg-color--lighter)}.md-typeset .tabbed-set>input:checked+label+.tabbed-content{font-size:.64rem}.md-typeset .tabbed-set>input:checked+label+.tabbed-content>.codehilite:only-child code,.md-typeset .tabbed-set>input:checked+label+.tabbed-content>.codehilitetable:only-child code,.md-typeset .tabbed-set>input:checked+label+.tabbed-content>.highlight:only-child code,.md-typeset .tabbed-set>input:checked+label+.tabbed-content>.highlighttable:only-child code,.md-typeset .tabbed-set>input:checked+label+.tabbed-content>pre:only-child code{margin-right:-.6rem;margin-left:-.6rem;padding-right:.6rem;padding-left:.6rem}.md-typeset .tabbed-set>input:checked+label+.tabbed-content>.codehilite:only-child code .hll,.md-typeset .tabbed-set>input:checked+label+.tabbed-content>.codehilitetable:only-child code .hll,.md-typeset .tabbed-set>input:checked+label+.tabbed-content>.highlight:only-child code .hll,.md-typeset .tabbed-set>input:checked+label+.tabbed-content>.highlighttable:only-child code .hll,.md-typeset .tabbed-set>input:checked+label+.tabbed-content>pre:only-child code .hll{margin:0 -.6rem;padding:0 .6rem}.md-typeset table:not([class]){box-shadow:0 .2rem .5rem rgba(0,0,0,.15),0 0 .05rem rgba(0,0,0,.2)}.md-typeset table:not([class]) tr:hover{background-color:rgba(0,0,0,.08)}.md-typeset table:not([class]) th{color:var(--md-default-fg-color);background-color:var(--md-default-bg-color--dark);border-bottom:.05rem solid var(--md-primary-fg-color)}.md-typeset table:not([class]) td{border-top:.05rem solid var(--md-default-fg-color--lighter)}.md-typeset .task-list-control .task-list-indicator::before{background-color:var(--md-default-fg-color--lighter)}.md-typeset .task-list-control [type=checkbox]:checked+.task-list-indicator::before{background-color:#52fa7c}.md-typeset .headerlink{width:1em;height:1em;vertical-align:middle;background-color:var(--md-default-fg-color--light);background-size:1em;-webkit-mask-size:1em;mask-size:1em;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;visibility:visible;-webkit-mask-image:url("data:image/svg+xml;charset=utf-8,<svg xmlns='http://www.w3.org/2000/svg' height='24' viewBox='0 0 24 24' width='24'><path d='M0 0h24v24H0z' fill='none'/><path d='M3.9 12c0-1.71 1.39-3.1 3.1-3.1h4V7H7c-2.76 0-5 2.24-5 5s2.24 5 5 5h4v-1.9H7c-1.71 0-3.1-1.39-3.1-3.1zM8 13h8v-2H8v2zm9-6h-4v1.9h4c1.71 0 3.1 1.39 3.1 3.1s-1.39 3.1-3.1 3.1h-4V17h4c2.76 0 5-2.24 5-5s-2.24-5-5-5z'/></svg>");mask-image:url("data:image/svg+xml;charset=utf-8,<svg xmlns='http://www.w3.org/2000/svg' height='24' viewBox='0 0 24 24' width='24'><path d='M0 0h24v24H0z' fill='none'/><path d='M3.9 12c0-1.71 1.39-3.1 3.1-3.1h4V7H7c-2.76 0-5 2.24-5 5s2.24 5 5 5h4v-1.9H7c-1.71 0-3.1-1.39-3.1-3.1zM8 13h8v-2H8v2zm9-6h-4v1.9h4c1.71 0 3.1 1.39 3.1 3.1s-1.39 3.1-3.1 3.1h-4V17h4c2.76 0 5-2.24 5-5s-2.24-5-5-5z'/></svg>")}.md-typeset .headerlink:hover,.md-typeset [id]:target .headerlink{background-color:var(--md-accent-fg-color)}.md-typeset div.mermaid svg{max-width:none;font-size:16px!important}.md-typeset div.mermaid svg .label{font-family:'trebuchet ms',verdana,arial;font-family:var(--mermaid-font-family);color:#333}.md-typeset div.mermaid svg .label text{fill:#333}.md-typeset div.mermaid svg .node circle,.md-typeset div.mermaid svg .node ellipse,.md-typeset div.mermaid svg .node path,.md-typeset div.mermaid svg .node polygon,.md-typeset div.mermaid svg .node rect{fill:#5f4a7c;stroke:#bf95f9;stroke-width:1px}.md-typeset div.mermaid svg .node .label{text-align:center}.md-typeset div.mermaid svg .node.clickable{cursor:pointer}.md-typeset div.mermaid svg .arrowheadPath{fill:#bf95f9}.md-typeset div.mermaid svg .edgePath .path{stroke:#bf95f9;stroke-width:1.5px}.md-typeset div.mermaid svg .edgeLabel{background-color:#392d4b;text-align:center}.md-typeset div.mermaid svg .cluster rect{fill:#303952;stroke:#6071a4;stroke-width:1px}.md-typeset div.mermaid svg .cluster text{fill:#bf95f9}.md-typeset div.mermaid svg div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:'trebuchet ms',verdana,arial;font-family:var(--mermaid-font-family);font-size:12px;background:#303952;border:1px solid #6071a4;border-radius:2px;pointer-events:none;z-index:100}.md-typeset div.mermaid svg .actor{stroke:#bf95f9;fill:#5f4a7c}.md-typeset div.mermaid svg text.actor{fill:#bf95f9;stroke:none}.md-typeset div.mermaid svg .actor-line{stroke:#bf95f9}.md-typeset div.mermaid svg .messageLine0{stroke-width:1.5;stroke-dasharray:'2 2';stroke:#bf95f9}.md-typeset div.mermaid svg .messageLine1{stroke-width:1.5;stroke-dasharray:'2 2';stroke:#bf95f9}.md-typeset div.mermaid svg #arrowhead{fill:#bf95f9}.md-typeset div.mermaid svg .sequenceNumber{fill:#bf95f9}.md-typeset div.mermaid svg #sequencenumber{fill:#bf95f9}.md-typeset div.mermaid svg #crosshead path{fill:#bf95f9!important;stroke:#bf95f9!important}.md-typeset div.mermaid svg .messageText{fill:#bf95f9;stroke:none}.md-typeset div.mermaid svg .labelBox{stroke:#bf95f9;fill:#5f4a7c}.md-typeset div.mermaid svg .labelText{fill:#272935;stroke:none}.md-typeset div.mermaid svg .loopText{fill:#bf95f9;stroke:none}.md-typeset div.mermaid svg .loopLine{stroke-width:2;stroke-dasharray:'2 2';stroke:#bf95f9}.md-typeset div.mermaid svg .note{stroke:#f1fa89;fill:#787d45}.md-typeset div.mermaid svg .noteText{fill:#000;stroke:none;font-family:'trebuchet ms',verdana,arial;font-family:var(--mermaid-font-family);font-size:14px}.md-typeset div.mermaid svg .activation0{fill:#272d42;stroke:#6071a4}.md-typeset div.mermaid svg .activation1{fill:#272d42;stroke:#6071a4}.md-typeset div.mermaid svg .activation2{fill:#272d42;stroke:#6071a4}.md-typeset div.mermaid svg .mermaid-main-font{font-family:"trebuchet ms",verdana,arial;font-family:var(--mermaid-font-family)}.md-typeset div.mermaid svg .section{stroke:none;opacity:.2}.md-typeset div.mermaid svg .section0{fill:rgba(191,149,249,.3)}.md-typeset div.mermaid svg .section2{fill:rgba(191,149,249,.6)}.md-typeset div.mermaid svg .section1,.md-typeset div.mermaid svg .section3{fill:#2e303e;opacity:.2}.md-typeset div.mermaid svg .sectionTitle0{fill:#bf95f9}.md-typeset div.mermaid svg .sectionTitle1{fill:#bf95f9}.md-typeset div.mermaid svg .sectionTitle2{fill:#bf95f9}.md-typeset div.mermaid svg .sectionTitle3{fill:#bf95f9}.md-typeset div.mermaid svg .sectionTitle{text-anchor:start;font-size:11px;text-height:14px;font-family:'trebuchet ms',verdana,arial;font-family:var(--mermaid-font-family)}.md-typeset div.mermaid svg .grid .tick{stroke:#bf95f9;opacity:.8;shape-rendering:crispEdges}.md-typeset div.mermaid svg .grid .tick text{font-family:'trebuchet ms',verdana,arial;font-family:var(--mermaid-font-family)}.md-typeset div.mermaid svg .grid path{stroke-width:0}.md-typeset div.mermaid svg .today{fill:none;stroke:#ff7ac6;stroke-width:2px}.md-typeset div.mermaid svg .task{stroke-width:2}.md-typeset div.mermaid svg .taskText{text-anchor:middle;font-family:'trebuchet ms',verdana,arial;font-family:var(--mermaid-font-family)}.md-typeset div.mermaid svg .taskText:not([font-size]){font-size:11px}.md-typeset div.mermaid svg .taskTextOutsideRight{fill:#272935;text-anchor:start;font-size:11px;font-family:'trebuchet ms',verdana,arial;font-family:var(--mermaid-font-family)}.md-typeset div.mermaid svg .taskTextOutsideLeft{fill:#272935;text-anchor:end;font-size:11px}.md-typeset div.mermaid svg .task.clickable{cursor:pointer}.md-typeset div.mermaid svg .taskText.clickable{cursor:pointer;fill:#8be8fd!important;font-weight:700}.md-typeset div.mermaid svg .taskTextOutsideLeft.clickable{cursor:pointer;fill:#8be8fd!important;font-weight:700}.md-typeset div.mermaid svg .taskTextOutsideRight.clickable{cursor:pointer;fill:#8be8fd!important;font-weight:700}.md-typeset div.mermaid svg .taskText0,.md-typeset div.mermaid svg .taskText1,.md-typeset div.mermaid svg .taskText2,.md-typeset div.mermaid svg .taskText3{fill:#bf95f9}.md-typeset div.mermaid svg .task0,.md-typeset div.mermaid svg .task1,.md-typeset div.mermaid svg .task2,.md-typeset div.mermaid svg .task3{fill:#5f4a7c;stroke:#bf95f9}.md-typeset div.mermaid svg .taskTextOutside0,.md-typeset div.mermaid svg .taskTextOutside2{fill:#bf95f9}.md-typeset div.mermaid svg .taskTextOutside1,.md-typeset div.mermaid svg .taskTextOutside3{fill:#bf95f9}.md-typeset div.mermaid svg .active0,.md-typeset div.mermaid svg .active1,.md-typeset div.mermaid svg .active2,.md-typeset div.mermaid svg .active3{fill:#803d63;stroke:#ff7ac6}.md-typeset div.mermaid svg .activeText0,.md-typeset div.mermaid svg .activeText1,.md-typeset div.mermaid svg .activeText2,.md-typeset div.mermaid svg .activeText3{fill:#272935!important}.md-typeset div.mermaid svg .done0,.md-typeset div.mermaid svg .done1,.md-typeset div.mermaid svg .done2,.md-typeset div.mermaid svg .done3{stroke:#6071a4;fill:#303952;stroke-width:2}.md-typeset div.mermaid svg .doneText0,.md-typeset div.mermaid svg .doneText1,.md-typeset div.mermaid svg .doneText2,.md-typeset div.mermaid svg .doneText3{fill:#272935!important}.md-typeset div.mermaid svg .crit0,.md-typeset div.mermaid svg .crit1,.md-typeset div.mermaid svg .crit2,.md-typeset div.mermaid svg .crit3{stroke:#ff5757;fill:#802b2b;stroke-width:2}.md-typeset div.mermaid svg .activeCrit0,.md-typeset div.mermaid svg .activeCrit1,.md-typeset div.mermaid svg .activeCrit2,.md-typeset div.mermaid svg .activeCrit3{stroke:#ff5757;fill:#803d63;stroke-width:2}.md-typeset div.mermaid svg .doneCrit0,.md-typeset div.mermaid svg .doneCrit1,.md-typeset div.mermaid svg .doneCrit2,.md-typeset div.mermaid svg .doneCrit3{stroke:#ff5757;fill:#303952;stroke-width:2;cursor:pointer;shape-rendering:crispEdges}.md-typeset div.mermaid svg .milestone{transform:rotate(45deg) scale(.8,.8)}.md-typeset div.mermaid svg .milestoneText{font-style:italic}.md-typeset div.mermaid svg .doneCritText0,.md-typeset div.mermaid svg .doneCritText1,.md-typeset div.mermaid svg .doneCritText2,.md-typeset div.mermaid svg .doneCritText3{fill:#272935!important}.md-typeset div.mermaid svg .activeCritText0,.md-typeset div.mermaid svg .activeCritText1,.md-typeset div.mermaid svg .activeCritText2,.md-typeset div.mermaid svg .activeCritText3{fill:#272935!important}.md-typeset div.mermaid svg .titleText{text-anchor:middle;font-size:18px;fill:#272935;font-family:'trebuchet ms',verdana,arial;font-family:var(--mermaid-font-family)}.md-typeset div.mermaid svg g.classGroup text{fill:#bf95f9;stroke:none;font-family:'trebuchet ms',verdana,arial;font-family:var(--mermaid-font-family);font-size:10px}.md-typeset div.mermaid svg g.classGroup text .title{font-weight:bolder}.md-typeset div.mermaid svg g.clickable{cursor:pointer}.md-typeset div.mermaid svg g.classGroup rect{fill:#5f4a7c;stroke:#bf95f9}.md-typeset div.mermaid svg g.classGroup line{stroke:#bf95f9;stroke-width:1}.md-typeset div.mermaid svg .classLabel .box{stroke:none;stroke-width:0;fill:#5f4a7c;opacity:.5}.md-typeset div.mermaid svg .classLabel .label{fill:#bf95f9;font-size:10px}.md-typeset div.mermaid svg .relation{stroke:#bf95f9;stroke-width:1;fill:none}.md-typeset div.mermaid svg .dashed-line{stroke-dasharray:3}.md-typeset div.mermaid svg #compositionStart{fill:#bf95f9;stroke:#bf95f9;stroke-width:1}.md-typeset div.mermaid svg #compositionEnd{fill:#bf95f9;stroke:#bf95f9;stroke-width:1}.md-typeset div.mermaid svg #aggregationStart{fill:#5f4a7c;stroke:#bf95f9;stroke-width:1}.md-typeset div.mermaid svg #aggregationEnd{fill:#5f4a7c;stroke:#bf95f9;stroke-width:1}.md-typeset div.mermaid svg #dependencyStart{fill:#bf95f9;stroke:#bf95f9;stroke-width:1}.md-typeset div.mermaid svg #dependencyEnd{fill:#bf95f9;stroke:#bf95f9;stroke-width:1}.md-typeset div.mermaid svg #extensionStart{fill:#bf95f9;stroke:#bf95f9;stroke-width:1}.md-typeset div.mermaid svg #extensionEnd{fill:#bf95f9;stroke:#bf95f9;stroke-width:1}.md-typeset div.mermaid svg .branch-label,.md-typeset div.mermaid svg .commit-id,.md-typeset div.mermaid svg .commit-msg{fill:#d3d3d3;color:#d3d3d3;font-family:'trebuchet ms',verdana,arial;font-family:var(--mermaid-font-family)}.md-typeset div.mermaid svg .pieTitleText{text-anchor:middle;font-size:25px;fill:#272935;font-family:'trebuchet ms',verdana,arial;font-family:var(--mermaid-font-family)}.md-typeset div.mermaid svg .slice{font-family:'trebuchet ms',verdana,arial;font-family:var(--mermaid-font-family)}.md-typeset div.mermaid svg g.stateGroup text{fill:#bf95f9;stroke:none;font-size:10px;font-family:'trebuchet ms',verdana,arial;font-family:var(--mermaid-font-family)}.md-typeset div.mermaid svg g.stateGroup text{fill:#bf95f9;stroke:none;font-size:10px}.md-typeset div.mermaid svg g.stateGroup .state-title{font-weight:bolder;fill:#bf95f9}.md-typeset div.mermaid svg g.stateGroup rect{fill:#5f4a7c;stroke:#bf95f9}.md-typeset div.mermaid svg g.stateGroup line{stroke:#bf95f9;stroke-width:1}.md-typeset div.mermaid svg .transition{stroke:#bf95f9;stroke-width:1;fill:none}.md-typeset div.mermaid svg .stateGroup .composit{fill:#fff;border-bottom:1px}.md-typeset div.mermaid svg .stateGroup .alt-composit{fill:#e0e0e0;border-bottom:1px}.md-typeset div.mermaid svg .state-note{stroke:#f1fa89;fill:#787d45}.md-typeset div.mermaid svg .state-note text{fill:#000;stroke:none;font-size:10px}.md-typeset div.mermaid svg .stateLabel .box{stroke:none;stroke-width:0;fill:#5f4a7c;opacity:.5}.md-typeset div.mermaid svg .stateLabel text{fill:#bf95f9;font-size:10px;font-weight:700;font-family:'trebuchet ms',verdana,arial;font-family:var(--mermaid-font-family)}.md-typeset div.mermaid svg :root{--mermaid-font-family:'"trebuchet ms", verdana, arial';--mermaid-font-family:"Comic Sans MS","Comic Sans",cursive}.md-typeset div.mermaid svg .label text,.md-typeset div.mermaid svg .labelText{fill:#bf95f9}.md-typeset div.mermaid svg .edgeLabel text{fill:#bf95f9}.md-typeset div.mermaid svg .edgeLabel rect{opacity:.5!important;fill:#5f4a7c!important}.md-typeset div.mermaid svg .noteText{fill:#f1fa89}.md-typeset div.mermaid svg .sectionTitle,.md-typeset div.mermaid svg .taskTextOutsideLeft,.md-typeset div.mermaid svg .taskTextOutsideRight{fill:#bf95f9!important}.md-typeset div.mermaid svg .taskText{fill:#bf95f9!important}.md-typeset div.mermaid svg .taskText[class*=doneText]{fill:#6071a4!important}.md-typeset div.mermaid svg .taskText[class*=activeText]{fill:#ff7ac6!important}.md-typeset div.mermaid svg .taskText[class*=critText]{fill:#ff5757!important}.md-typeset div.mermaid svg .grid .tick line{stroke:rgba(191,149,249,.7)!important}.md-typeset div.mermaid svg .grid .tick text{fill:#bf95f9}.md-typeset div.mermaid svg .stateGroup circle[style$="fill: black;"]{fill:#5f4a7c!important;stroke:#5f4a7c!important}.md-typeset div.mermaid svg .stateGroup circle[style$="fill: white;"]{fill:#5f4a7c!important;stroke:#bf95f9!important}.md-typeset div.mermaid svg .stateGroup .composit{fill:#2e303e}.md-typeset div.mermaid svg .classGroup .title,.md-typeset div.mermaid svg .classGroup text,.md-typeset div.mermaid svg .classLabel .label{font-size:16px!important}.md-header{background-color:var(--md-default-bg-color--darkest);border-bottom:.05rem solid var(--md-primary-fg-color)}.md-header[data-md-state=shadow]{box-shadow:0 0 .2rem rgba(0,0,0,.15),0 0 .2rem .4rem rgba(0,0,0,.2)}.md-header,.md-nav__source,.md-tabs{color:var(--md-default-fg-color)}.md-tabs{background-color:var(--md-primary-fg-color--transparent)}.md-tabs__link--active{color:var(--md-primary-fg-color)}.md-tabs__link:hover{color:var(--md-accent-fg-color)}.md-hero{color:var(--md-default-fg-color);background-color:var(--md-primary-fg-color--transparent)}.md-search__input{color:var(--md-default-fg-color);background-color:var(--md-accent-bg-color--light)}.md-search__input:hover{background-color:var(--md-default-bg-color)}.md-search__input~.md-search__icon{color:var(--md-default-fg-color)}.md-search__input::-webkit-input-placeholder{color:var(--md-default-fg-color--light)}.md-search__input::-moz-placeholder{color:var(--md-default-fg-color--light)}.md-search__input:-ms-input-placeholder{color:var(--md-default-fg-color--light)}.md-search__input::-ms-input-placeholder{color:var(--md-default-fg-color--light)}.md-search__input::placeholder{color:var(--md-default-fg-color--light)}.md-overlay,.md-search__overlay{background-color:var(--md-default-bg-color--light)}.md-footer{color:var(--md-default-fg-color--light);background-color:transparent}.md-footer-nav__direction{color:var(--md-primary-fg-color)}.md-footer-meta{background-color:var(--md-default-bg-color--darkest);border-top:.05rem solid var(--md-primary-fg-color)}.md-footer-copyright{color:#484b61}.md-footer-copyright .md-footer-copyright__highlight{color:var(--md-default-fg-color--light)}.md-footer-copyright .md-footer-copyright__highlight .md-footer-custom-text{color:#484b61}html .md-footer-meta.md-typeset a{color:var(--md-default-fg-color--light)}html .md-footer-meta.md-typeset a:hover{color:var(--md-default-fg-color)}.md-typeset h5{color:var(--md-default-fg-color);text-transform:none}@media screen and (max-width:76.1875em){html .md-nav--primary .md-nav__title[for="__drawer"]{color:var(--md-default-fg-color);background-color:var(--md-default-bg-color--darkest);border-bottom:.05rem solid var(--md-primary-fg-color)}}@media screen and (max-width:59.9375em){.md-nav__source{color:var(--md-default-fg-color);background-color:var(--md-primary-fg-color--transparent)}html .md-nav .md-nav__title{color:var(--md-default-fg-color);background-color:var(--md-default-bg-color--darkest);border-bottom:.05rem solid var(--md-primary-fg-color)}}
\ No newline at end of file
diff --git a/docs/theme/assets/pymdownx-extras/extra-9dc654756b.css b/docs/theme/assets/pymdownx-extras/extra-9dc654756b.css
deleted file mode 100644
index 0fbe9757..00000000
--- a/docs/theme/assets/pymdownx-extras/extra-9dc654756b.css
+++ /dev/null
@@ -1,1 +0,0 @@
-@charset "UTF-8";:root{--md-code-fg-color:#f8f8f2;--md-code-bg-color:#272935;--md-default-fg-color:rgba(248, 248, 242, 0.87);--md-default-fg-color--light:rgba(248, 248, 242, 0.54);--md-default-fg-color--lighter:rgba(248, 248, 242, 0.16);--md-default-fg-color--lightest:rgba(248, 248, 242, 0.07);--md-default-bg-color:#2e303e;--md-default-bg-color--light:rgba(46, 48, 62, 0.7);--md-default-bg-color--lighter:rgba(46, 48, 62, 0.3);--md-default-bg-color--lightest:rgba(46, 48, 62, 0.12);--md-default-bg-color--dark:#272935;--md-default-bg-color--darker:#21222c;--md-default-bg-color--darkest:#1a1b23}[data-md-color-primary=drac-red]{--md-primary-fg-color:hsla(0deg, 100%, 67%, 1);--md-primary-fg-color--transparent:hsla(0deg, 100%, 67%, 0.1);--md-primary-fg-color--light:hsla(0deg, 100%, 72%, 1);--md-primary-fg-color--dark:hsla(0deg, 100%, 62%, 1);--md-primary-bg-color:var(--md-default-bg-color);--md-primary-bg-color--light:var(--md-default-bg-color--light)}[data-md-color-primary=drac-pink]{--md-primary-fg-color:hsla(326deg, 100%, 74%, 1);--md-primary-fg-color--transparent:hsla(326deg, 100%, 74%, 0.1);--md-primary-fg-color--light:hsla(326deg, 100%, 79%, 1);--md-primary-fg-color--dark:hsla(326deg, 100%, 69%, 1);--md-primary-bg-color:var(--md-default-bg-color);--md-primary-bg-color--light:var(--md-default-bg-color--light)}[data-md-color-primary=drac-purple]{--md-primary-fg-color:hsla(265deg, 89%, 78%, 1);--md-primary-fg-color--transparent:hsla(265deg, 89%, 78%, 0.1);--md-primary-fg-color--light:hsla(265deg, 89%, 83%, 1);--md-primary-fg-color--dark:hsla(265deg, 89%, 73%, 1);--md-primary-bg-color:var(--md-default-bg-color);--md-primary-bg-color--light:var(--md-default-bg-color--light)}[data-md-color-primary=drac-blue]{--md-primary-fg-color:hsla(225deg, 27%, 51%, 1);--md-primary-fg-color--transparent:hsla(225deg, 27%, 51%, 0.1);--md-primary-fg-color--light:hsla(225deg, 27%, 56%, 1);--md-primary-fg-color--dark:hsla(225deg, 27%, 46%, 1);--md-primary-bg-color:var(--md-default-bg-color);--md-primary-bg-color--light:var(--md-default-bg-color--light)}[data-md-color-primary=drac-cyan]{--md-primary-fg-color:hsla(191deg, 97%, 77%, 1);--md-primary-fg-color--transparent:hsla(191deg, 97%, 77%, 0.1);--md-primary-fg-color--light:hsla(191deg, 97%, 82%, 1);--md-primary-fg-color--dark:hsla(191deg, 97%, 72%, 1);--md-primary-bg-color:var(--md-default-bg-color);--md-primary-bg-color--light:var(--md-default-bg-color--light)}[data-md-color-primary=drac-green]{--md-primary-fg-color:hsla(135deg, 94%, 65%, 1);--md-primary-fg-color--transparent:hsla(135deg, 94%, 65%, 0.1);--md-primary-fg-color--light:hsla(135deg, 94%, 70%, 1);--md-primary-fg-color--dark:hsla(135deg, 94%, 60%, 1);--md-primary-bg-color:var(--md-default-bg-color);--md-primary-bg-color--light:var(--md-default-bg-color--light)}[data-md-color-primary=drac-yellow]{--md-primary-fg-color:hsla(65deg, 92%, 76%, 1);--md-primary-fg-color--transparent:hsla(65deg, 92%, 76%, 0.1);--md-primary-fg-color--light:hsla(65deg, 92%, 81%, 1);--md-primary-fg-color--dark:hsla(65deg, 92%, 71%, 1);--md-primary-bg-color:var(--md-default-bg-color);--md-primary-bg-color--light:var(--md-default-bg-color--light)}[data-md-color-primary=drac-orange]{--md-primary-fg-color:hsla(31deg, 100%, 71%, 1);--md-primary-fg-color--transparent:hsla(31deg, 100%, 71%, 0.1);--md-primary-fg-color--light:hsla(31deg, 100%, 76%, 1);--md-primary-fg-color--dark:hsla(31deg, 100%, 66%, 1);--md-primary-bg-color:var(--md-default-bg-color);--md-primary-bg-color--light:var(--md-default-bg-color--light)}[data-md-color-accent=drac-red]{--md-accent-fg-color:hsla(0deg, 100%, 62%, 1);--md-accent-fg-color--transparent:hsla(0deg, 100%, 62%, 0.1);--md-accent-bg-color:var(--md-default-bg-color);--md-accent-bg-color--light:var(--md-default-bg-color--light)}[data-md-color-accent=drac-pink]{--md-accent-fg-color:hsla(326deg, 100%, 69%, 1);--md-accent-fg-color--transparent:hsla(326deg, 100%, 69%, 0.1);--md-accent-bg-color:var(--md-default-bg-color);--md-accent-bg-color--light:var(--md-default-bg-color--light)}[data-md-color-accent=drac-purple]{--md-accent-fg-color:hsla(265deg, 89%, 73%, 1);--md-accent-fg-color--transparent:hsla(265deg, 89%, 73%, 0.1);--md-accent-bg-color:var(--md-default-bg-color);--md-accent-bg-color--light:var(--md-default-bg-color--light)}[data-md-color-accent=drac-blue]{--md-accent-fg-color:hsla(225deg, 27%, 46%, 1);--md-accent-fg-color--transparent:hsla(225deg, 27%, 46%, 0.1);--md-accent-bg-color:var(--md-default-bg-color);--md-accent-bg-color--light:var(--md-default-bg-color--light)}[data-md-color-accent=drac-cyan]{--md-accent-fg-color:hsla(191deg, 97%, 72%, 1);--md-accent-fg-color--transparent:hsla(191deg, 97%, 72%, 0.1);--md-accent-bg-color:var(--md-default-bg-color);--md-accent-bg-color--light:var(--md-default-bg-color--light)}[data-md-color-accent=drac-green]{--md-accent-fg-color:hsla(135deg, 94%, 60%, 1);--md-accent-fg-color--transparent:hsla(135deg, 94%, 60%, 0.1);--md-accent-bg-color:var(--md-default-bg-color);--md-accent-bg-color--light:var(--md-default-bg-color--light)}[data-md-color-accent=drac-yellow]{--md-accent-fg-color:hsla(65deg, 92%, 71%, 1);--md-accent-fg-color--transparent:hsla(65deg, 92%, 71%, 0.1);--md-accent-bg-color:var(--md-default-bg-color);--md-accent-bg-color--light:var(--md-default-bg-color--light)}[data-md-color-accent=drac-orange]{--md-accent-fg-color:hsla(31deg, 100%, 66%, 1);--md-accent-fg-color--transparent:hsla(31deg, 100%, 66%, 0.1);--md-accent-bg-color:var(--md-default-bg-color);--md-accent-bg-color--light:var(--md-default-bg-color--light)}.md-typeset .admonition.note,.md-typeset details.note{border-color:#6071a4}.md-typeset .admonition.note>:first-child,.md-typeset details.note>:first-child{background-color:rgba(96,113,164,.4)}.md-typeset .admonition.note>:first-child::before,.md-typeset details.note>:first-child::before{background-color:#6071a4}.md-typeset .admonition.abstract,.md-typeset .admonition.summary,.md-typeset .admonition.tldr,.md-typeset details.abstract,.md-typeset details.summary,.md-typeset details.tldr{border-color:#8be8fd}.md-typeset .admonition.abstract>:first-child,.md-typeset .admonition.summary>:first-child,.md-typeset .admonition.tldr>:first-child,.md-typeset details.abstract>:first-child,.md-typeset details.summary>:first-child,.md-typeset details.tldr>:first-child{background-color:rgba(139,232,253,.4)}.md-typeset .admonition.abstract>:first-child::before,.md-typeset .admonition.summary>:first-child::before,.md-typeset .admonition.tldr>:first-child::before,.md-typeset details.abstract>:first-child::before,.md-typeset details.summary>:first-child::before,.md-typeset details.tldr>:first-child::before{background-color:#8be8fd}.md-typeset .admonition.info,.md-typeset .admonition.todo,.md-typeset details.info,.md-typeset details.todo{border-color:#bff3fd}.md-typeset .admonition.info>:first-child,.md-typeset .admonition.todo>:first-child,.md-typeset details.info>:first-child,.md-typeset details.todo>:first-child{background-color:rgba(191,243,253,.4)}.md-typeset .admonition.info>:first-child::before,.md-typeset .admonition.todo>:first-child::before,.md-typeset details.info>:first-child::before,.md-typeset details.todo>:first-child::before{background-color:#bff3fd}.md-typeset .admonition.hint,.md-typeset .admonition.important,.md-typeset .admonition.tip,.md-typeset details.hint,.md-typeset details.important,.md-typeset details.tip{border-color:#8bfdd9}.md-typeset .admonition.hint>:first-child,.md-typeset .admonition.important>:first-child,.md-typeset .admonition.tip>:first-child,.md-typeset details.hint>:first-child,.md-typeset details.important>:first-child,.md-typeset details.tip>:first-child{background-color:rgba(139,253,217,.4)}.md-typeset .admonition.hint>:first-child::before,.md-typeset .admonition.important>:first-child::before,.md-typeset .admonition.tip>:first-child::before,.md-typeset details.hint>:first-child::before,.md-typeset details.important>:first-child::before,.md-typeset details.tip>:first-child::before{background-color:#8bfdd9}.md-typeset .admonition.check,.md-typeset .admonition.done,.md-typeset .admonition.success,.md-typeset details.check,.md-typeset details.done,.md-typeset details.success{border-color:#52fa7c}.md-typeset .admonition.check>:first-child,.md-typeset .admonition.done>:first-child,.md-typeset .admonition.success>:first-child,.md-typeset details.check>:first-child,.md-typeset details.done>:first-child,.md-typeset details.success>:first-child{background-color:rgba(82,250,124,.4)}.md-typeset .admonition.check>:first-child::before,.md-typeset .admonition.done>:first-child::before,.md-typeset .admonition.success>:first-child::before,.md-typeset details.check>:first-child::before,.md-typeset details.done>:first-child::before,.md-typeset details.success>:first-child::before{background-color:#52fa7c}.md-typeset .admonition.faq,.md-typeset .admonition.help,.md-typeset .admonition.question,.md-typeset details.faq,.md-typeset details.help,.md-typeset details.question{border-color:#98fbb1}.md-typeset .admonition.faq>:first-child,.md-typeset .admonition.help>:first-child,.md-typeset .admonition.question>:first-child,.md-typeset details.faq>:first-child,.md-typeset details.help>:first-child,.md-typeset details.question>:first-child{background-color:rgba(152,251,177,.4)}.md-typeset .admonition.faq>:first-child::before,.md-typeset .admonition.help>:first-child::before,.md-typeset .admonition.question>:first-child::before,.md-typeset details.faq>:first-child::before,.md-typeset details.help>:first-child::before,.md-typeset details.question>:first-child::before{background-color:#98fbb1}.md-typeset .admonition.attention,.md-typeset .admonition.caution,.md-typeset .admonition.warning,.md-typeset details.attention,.md-typeset details.caution,.md-typeset details.warning{border-color:#ffb86b}.md-typeset .admonition.attention>:first-child,.md-typeset .admonition.caution>:first-child,.md-typeset .admonition.warning>:first-child,.md-typeset details.attention>:first-child,.md-typeset details.caution>:first-child,.md-typeset details.warning>:first-child{background-color:rgba(255,184,107,.4)}.md-typeset .admonition.attention>:first-child::before,.md-typeset .admonition.caution>:first-child::before,.md-typeset .admonition.warning>:first-child::before,.md-typeset details.attention>:first-child::before,.md-typeset details.caution>:first-child::before,.md-typeset details.warning>:first-child::before{background-color:#ffb86b}.md-typeset .admonition.fail,.md-typeset .admonition.failure,.md-typeset .admonition.missing,.md-typeset details.fail,.md-typeset details.failure,.md-typeset details.missing{border-color:#ff2e2e}.md-typeset .admonition.fail>:first-child,.md-typeset .admonition.failure>:first-child,.md-typeset .admonition.missing>:first-child,.md-typeset details.fail>:first-child,.md-typeset details.failure>:first-child,.md-typeset details.missing>:first-child{background-color:rgba(255,46,46,.4)}.md-typeset .admonition.fail>:first-child::before,.md-typeset .admonition.failure>:first-child::before,.md-typeset .admonition.missing>:first-child::before,.md-typeset details.fail>:first-child::before,.md-typeset details.failure>:first-child::before,.md-typeset details.missing>:first-child::before{background-color:#ff2e2e}.md-typeset .admonition.danger,.md-typeset .admonition.error,.md-typeset details.danger,.md-typeset details.error{border-color:#ff5757}.md-typeset .admonition.danger>:first-child,.md-typeset .admonition.error>:first-child,.md-typeset details.danger>:first-child,.md-typeset details.error>:first-child{background-color:rgba(255,87,87,.4)}.md-typeset .admonition.danger>:first-child::before,.md-typeset .admonition.error>:first-child::before,.md-typeset details.danger>:first-child::before,.md-typeset details.error>:first-child::before{background-color:#ff5757}.md-typeset .admonition.bug,.md-typeset details.bug{border-color:#ff47b3}.md-typeset .admonition.bug>:first-child,.md-typeset details.bug>:first-child{background-color:rgba(255,71,179,.4)}.md-typeset .admonition.bug>:first-child::before,.md-typeset details.bug>:first-child::before{background-color:#ff47b3}.md-typeset .admonition.example,.md-typeset details.example{border-color:#bf95f9}.md-typeset .admonition.example>:first-child,.md-typeset details.example>:first-child{background-color:rgba(191,149,249,.4)}.md-typeset .admonition.example>:first-child::before,.md-typeset details.example>:first-child::before{background-color:#bf95f9}.md-typeset .admonition.cite,.md-typeset .admonition.quote,.md-typeset details.cite,.md-typeset details.quote{border-color:#787d8c}.md-typeset .admonition.cite>:first-child,.md-typeset .admonition.quote>:first-child,.md-typeset details.cite>:first-child,.md-typeset details.quote>:first-child{background-color:rgba(120,125,140,.4)}.md-typeset .admonition.cite>:first-child::before,.md-typeset .admonition.quote>:first-child::before,.md-typeset details.cite>:first-child::before,.md-typeset details.quote>:first-child::before{background-color:#787d8c}:root{--md-admonition-icon--settings:url("data:image/svg+xml;charset=utf-8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' id='settings'><path d='M12,15.5A3.5,3.5 0 0,1 8.5,12A3.5,3.5 0 0,1 12,8.5A3.5,3.5 0 0,1 15.5,12A3.5,3.5 0 0,1 12,15.5M19.43,12.97C19.47,12.65 19.5,12.33 19.5,12C19.5,11.67 19.47,11.34 19.43,11L21.54,9.37C21.73,9.22 21.78,8.95 21.66,8.73L19.66,5.27C19.54,5.05 19.27,4.96 19.05,5.05L16.56,6.05C16.04,5.66 15.5,5.32 14.87,5.07L14.5,2.42C14.46,2.18 14.25,2 14,2H10C9.75,2 9.54,2.18 9.5,2.42L9.13,5.07C8.5,5.32 7.96,5.66 7.44,6.05L4.95,5.05C4.73,4.96 4.46,5.05 4.34,5.27L2.34,8.73C2.21,8.95 2.27,9.22 2.46,9.37L4.57,11C4.53,11.34 4.5,11.67 4.5,12C4.5,12.33 4.53,12.65 4.57,12.97L2.46,14.63C2.27,14.78 2.21,15.05 2.34,15.27L4.34,18.73C4.46,18.95 4.73,19.03 4.95,18.95L7.44,17.94C7.96,18.34 8.5,18.68 9.13,18.93L9.5,21.58C9.54,21.82 9.75,22 10,22H14C14.25,22 14.46,21.82 14.5,21.58L14.87,18.93C15.5,18.67 16.04,18.34 16.56,17.94L19.05,18.95C19.27,19.03 19.54,18.95 19.66,18.73L21.66,15.27C21.78,15.05 21.73,14.78 21.54,14.63L19.43,12.97Z' /></svg>");--md-admonition-icon--new:url("data:image/svg+xml;charset=utf-8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' id='alert-decagram'><path d='M23,12L20.56,9.22L20.9,5.54L17.29,4.72L15.4,1.54L12,3L8.6,1.54L6.71,4.72L3.1,5.53L3.44,9.21L1,12L3.44,14.78L3.1,18.47L6.71,19.29L8.6,22.47L12,21L15.4,22.46L17.29,19.28L20.9,18.46L20.56,14.78L23,12M13,17H11V15H13V17M13,13H11V7H13V13Z' /></svg>")}.md-typeset .admonition.config,.md-typeset .admonition.settings,.md-typeset details.config,.md-typeset details.settings{border-color:#ff7ac6}.md-typeset .config>.admonition-title,.md-typeset .settings>.admonition-title,.md-typeset details.config>summary,.md-typeset details.settings>summary{background-color:rgba(255,122,198,.4)}.md-typeset .config>.admonition-title::before,.md-typeset .settings>.admonition-title::before,.md-typeset details.config>summary::before,.md-typeset details.settings>summary::before{width:1rem;height:1rem;background-color:#ff7ac6;background-size:1rem;-webkit-mask-image:var(--md-admonition-icon--settings);mask-image:var(--md-admonition-icon--settings);content:"\a0"}.md-typeset .admonition.new,.md-typeset details.new{border-color:#f1fa89}.md-typeset .new>.admonition-title,.md-typeset details.new>summary{background-color:rgba(241,250,137,.4)}.md-typeset .new>.admonition-title::before,.md-typeset details.new>summary::before{width:1rem;height:1rem;background-color:#f1fa89;background-size:1rem;-webkit-mask-image:var(--md-admonition-icon--new);mask-image:var(--md-admonition-icon--new);content:"\a0"}.md-typeset .admonition,.md-typeset details,.md-typeset table:not([class]){box-shadow:0 .2rem .5rem rgba(0,0,0,.15),0 0 .05rem rgba(0,0,0,.2)}.md-typeset summary::after{background-color:var(--md-default-fg-color--light)}.md-typeset del.critic{padding:0 .25em;background-color:rgba(255,122,198,.5);box-shadow:none}.md-typeset ins.critic{padding:0 .25em;background-color:rgba(82,250,124,.5);box-shadow:none}.md-typeset .critic.comment{color:#6071a4}.md-typeset .critic.break{margin:0}.highlight .hll{background-color:rgba(68,71,90,.4)}.highlight .c{color:#6071a4}.highlight .err{color:#f8f8f2}.highlight .g{color:#f8f8f2}.highlight .k{color:#ff7ac6}.highlight .l{color:#f8f8f2}.highlight .n{color:#f8f8f2}.highlight .o{color:#ff7ac6}.highlight .x{color:#f8f8f2}.highlight .p{color:#f8f8f2}.highlight .ch{color:#6071a4}.highlight .cm{color:#6071a4}.highlight .cp{color:#ff7ac6}.highlight .cpf{color:#6071a4}.highlight .c1{color:#6071a4}.highlight .cs{color:#6071a4}.highlight .gd{color:#ff7ac6;font-weight:700;background-color:#272935}.highlight .ge{color:#f8f8f2;text-decoration:underline}.highlight .gr{color:#f8f8f2}.highlight .gh{color:rgba(248,248,242,.54);font-weight:700}.highlight .gi{color:#52fa7c;font-weight:700;background-color:#272935}.highlight .go{color:#6071a4}.highlight .gp{color:#f8f8f2}.highlight .gs{color:#f8f8f2}.highlight .gu{color:rgba(248,248,242,.54);font-weight:700}.highlight .gt{color:#f8f8f2}.highlight .kc{color:#ff7ac6}.highlight .kd{color:#8be8fd;font-style:italic}.highlight .kn{color:#ff7ac6}.highlight .kp{color:#ff7ac6}.highlight .kr{color:#ff7ac6}.highlight .kt{color:#8be8fd}.highlight .ld{color:#f8f8f2}.highlight .m{color:#bf95f9}.highlight .s{color:#f1fa89}.highlight .na{color:#52fa7c}.highlight .nb{color:#8be8fd;font-style:italic}.highlight .nc{color:#52fa7c}.highlight .no{color:#f8f8f2}.highlight .nd{color:#f8f8f2}.highlight .ni{color:#f8f8f2}.highlight .ne{color:#f8f8f2}.highlight .nf{color:#52fa7c}.highlight .nl{color:#8be8fd;font-style:italic}.highlight .nn{color:#f8f8f2}.highlight .nx{color:#f8f8f2}.highlight .py{color:#f8f8f2}.highlight .nt{color:#ff7ac6}.highlight .nv{color:#8be8fd;font-style:italic}.highlight .ow{color:#ff7ac6}.highlight .w{color:#f8f8f2}.highlight .mb{color:#bf95f9}.highlight .mf{color:#bf95f9}.highlight .mh{color:#bf95f9}.highlight .mi{color:#bf95f9}.highlight .mo{color:#bf95f9}.highlight .sa{color:#f1fa89}.highlight .sb{color:#f1fa89}.highlight .sc{color:#f1fa89}.highlight .dl{color:#f1fa89}.highlight .sd{color:#f1fa89}.highlight .s2{color:#f1fa89}.highlight .se{color:#f1fa89}.highlight .sh{color:#f1fa89}.highlight .si{color:#f1fa89}.highlight .sx{color:#f1fa89}.highlight .sr{color:#f1fa89}.highlight .s1{color:#f1fa89}.highlight .ss{color:#f1fa89}.highlight .bp{color:#f8f8f2;font-style:italic}.highlight .fm{color:#52fa7c}.highlight .vc{color:#8be8fd;font-style:italic}.highlight .vg{color:#8be8fd;font-style:italic}.highlight .vi{color:#8be8fd;font-style:italic}.highlight .vm{color:#8be8fd;font-style:italic}.highlight .il{color:#bf95f9}.md-typeset a>code{margin:0 .29412em;padding:.07353em 0;color:inherit;font-size:.85em;background-color:var(--md-code-bg-color);border-radius:.1rem;box-shadow:.29412em 0 0 var(--md-code-bg-color),-.29412em 0 0 var(--md-code-bg-color);-webkit-box-decoration-break:clone;box-decoration-break:clone}.md-typeset td code{word-break:normal}.md-typeset .codehilite,.md-typeset .highlight{-moz-tab-size:8;-o-tab-size:8;tab-size:8}.md-typeset .codehilite [data-linenos].special::before,.md-typeset .highlight [data-linenos].special::before{background-color:var(--md-default-fg-color--lightest)}.md-typeset .codehilitetable .linenodiv .special,.md-typeset .highlighttable .linenodiv .special{margin-right:-.58824em;margin-left:-1.17647em;padding-right:.58824em;padding-left:1.17647em;background-color:var(--md-default-fg-color--lightest)}.md-typeset kbd{background-color:var(--md-default-fg-color--lightest);box-shadow:0 .1rem 0 .05rem var(--md-default-bg-color--darkest),0 .1rem 0 var(--md-default-bg-color--dark),inset 0 -.1rem .2rem var(--md-default-fg-color--lighter)}.md-typeset .keys kbd::after,.md-typeset .keys kbd::before{position:relative;margin:0;color:var(--md-default-fg-color);-moz-osx-font-smoothing:initial;-webkit-font-smoothing:initial}.md-typeset .keys span{padding:0 .2em;color:var(--md-default-fg-color--light)}.md-typeset .keys .key-alt::before{padding-right:.4em;content:"⎇"}.md-typeset .keys .key-left-alt::before{padding-right:.4em;content:"⎇"}.md-typeset .keys .key-right-alt::before{padding-right:.4em;content:"⎇"}.md-typeset .keys .key-command::before{padding-right:.4em;content:"⌘"}.md-typeset .keys .key-left-command::before{padding-right:.4em;content:"⌘"}.md-typeset .keys .key-right-command::before{padding-right:.4em;content:"⌘"}.md-typeset .keys .key-control::before{padding-right:.4em;content:"⌃"}.md-typeset .keys .key-left-control::before{padding-right:.4em;content:"⌃"}.md-typeset .keys .key-right-control::before{padding-right:.4em;content:"⌃"}.md-typeset .keys .key-meta::before{padding-right:.4em;content:"◆"}.md-typeset .keys .key-left-meta::before{padding-right:.4em;content:"◆"}.md-typeset .keys .key-right-meta::before{padding-right:.4em;content:"◆"}.md-typeset .keys .key-option::before{padding-right:.4em;content:"⌥"}.md-typeset .keys .key-left-option::before{padding-right:.4em;content:"⌥"}.md-typeset .keys .key-right-option::before{padding-right:.4em;content:"⌥"}.md-typeset .keys .key-shift::before{padding-right:.4em;content:"⇧"}.md-typeset .keys .key-left-shift::before{padding-right:.4em;content:"⇧"}.md-typeset .keys .key-right-shift::before{padding-right:.4em;content:"⇧"}.md-typeset .keys .key-super::before{padding-right:.4em;content:"❖"}.md-typeset .keys .key-left-super::before{padding-right:.4em;content:"❖"}.md-typeset .keys .key-right-super::before{padding-right:.4em;content:"❖"}.md-typeset .keys .key-windows::before{padding-right:.4em;content:"⊞"}.md-typeset .keys .key-left-windows::before{padding-right:.4em;content:"⊞"}.md-typeset .keys .key-right-windows::before{padding-right:.4em;content:"⊞"}.md-typeset .keys .key-arrow-down::before{padding-right:.4em;content:"▽"}.md-typeset .keys .key-arrow-left::before{padding-right:.4em;content:"◁"}.md-typeset .keys .key-arrow-right::before{padding-right:.4em;content:"▷"}.md-typeset .keys .key-arrow-up::before{padding-right:.4em;content:"△"}.md-typeset .keys .key-backspace::before{padding-right:.4em;content:"⌫"}.md-typeset .keys .key-backtab::before{padding-right:.4em;content:"⇤"}.md-typeset .keys .key-caps-lock::before{padding-right:.4em;content:"⇪"}.md-typeset .keys .key-clear::before{padding-right:.4em;content:"⌧"}.md-typeset .keys .key-context-menu::before{padding-right:.4em;content:"☰"}.md-typeset .keys .key-delete::before{padding-right:.4em;content:"⌦"}.md-typeset .keys .key-eject::before{padding-right:.4em;content:"⏏"}.md-typeset .keys .key-end::before{padding-right:.4em;content:"⤓"}.md-typeset .keys .key-escape::before{padding-right:.4em;content:"⎋"}.md-typeset .keys .key-home::before{padding-right:.4em;content:"⤒"}.md-typeset .keys .key-insert::before{padding-right:.4em;content:"⎀"}.md-typeset .keys .key-page-down::before{padding-right:.4em;content:"⇟"}.md-typeset .keys .key-page-up::before{padding-right:.4em;content:"⇞"}.md-typeset .keys .key-print-screen::before{padding-right:.4em;content:"⎙"}.md-typeset .keys .key-tab::after{padding-left:.4em;content:"↹"}.md-typeset .keys .key-num-enter::after{padding-left:.4em;content:"⌤"}.md-typeset .keys .key-enter::after{padding-left:.4em;content:"⏎"}.md-typeset a{color:#8be8fd}.md-typeset a[href^="mailto:"]::before{-webkit-mask-image:url("data:image/svg+xml;charset=utf-8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' id='mail'><path d='M20,4H4C2.89,4 2,4.89 2,6V18A2,2 0 0,0 4,20H20A2,2 0 0,0 22,18V6C22,4.89 21.1,4 20,4M17,17H7V15H17M17,13H7V11H17M20,9H17V6H20' /></svg>");mask-image:url("data:image/svg+xml;charset=utf-8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' id='mail'><path d='M20,4H4C2.89,4 2,4.89 2,6V18A2,2 0 0,0 4,20H20A2,2 0 0,0 22,18V6C22,4.89 21.1,4 20,4M17,17H7V15H17M17,13H7V11H17M20,9H17V6H20' /></svg>")}.md-typeset .magiclink-commit::before,.md-typeset .magiclink-compare::before,.md-typeset .magiclink-issue::before,.md-typeset .magiclink-pull::before{-webkit-mask-position:bottom;mask-position:bottom;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:.9375em auto;mask-size:.9375em auto}.md-typeset .magiclink-commit::before,.md-typeset .magiclink-compare::before,.md-typeset .magiclink-issue::before,.md-typeset .magiclink-pull::before,.md-typeset .magiclink-repository::before,.md-typeset a[href^="mailto:"]::before{position:relative;width:1em;height:1em;padding-right:1em;background-color:#8be8fd;background-size:1em;transition:background-color 125ms;content:"\a0"}.md-typeset .magiclink-commit:hover::before,.md-typeset .magiclink-compare:hover::before,.md-typeset .magiclink-issue:hover::before,.md-typeset .magiclink-pull:hover::before,.md-typeset .magiclink-repository:hover::before,.md-typeset a[href^="mailto:"]:hover::before{background-color:var(--md-accent-fg-color)}.md-typeset .magiclink-commit::before{-webkit-mask-image:url("data:image/svg+xml;charset=utf-8,<svg xmlns='http://www.w3.org/2000/svg' width='14' height='16' viewBox='0 0 14 16'><path fill-rule='evenodd' d='M10.86 7c-.45-1.72-2-3-3.86-3-1.86 0-3.41 1.28-3.86 3H0v2h3.14c.45 1.72 2 3 3.86 3 1.86 0 3.41-1.28 3.86-3H14V7h-3.14zM7 10.2c-1.22 0-2.2-.98-2.2-2.2 0-1.22.98-2.2 2.2-2.2 1.22 0 2.2.98 2.2 2.2 0 1.22-.98 2.2-2.2 2.2z'/></svg>");mask-image:url("data:image/svg+xml;charset=utf-8,<svg xmlns='http://www.w3.org/2000/svg' width='14' height='16' viewBox='0 0 14 16'><path fill-rule='evenodd' d='M10.86 7c-.45-1.72-2-3-3.86-3-1.86 0-3.41 1.28-3.86 3H0v2h3.14c.45 1.72 2 3 3.86 3 1.86 0 3.41-1.28 3.86-3H14V7h-3.14zM7 10.2c-1.22 0-2.2-.98-2.2-2.2 0-1.22.98-2.2 2.2-2.2 1.22 0 2.2.98 2.2 2.2 0 1.22-.98 2.2-2.2 2.2z'/></svg>")}.md-typeset .magiclink-compare::before{-webkit-mask-image:url("data:image/svg+xml;charset=utf-8,<svg xmlns='http://www.w3.org/2000/svg' width='13' height='16' viewBox='0 0 13 16'><path fill-rule='evenodd' d='M6 7h2v1H6v2H5V8H3V7h2V5h1v2zm-3 6h5v-1H3v1zM7.5 2L11 5.5V15c0 .55-.45 1-1 1H1c-.55 0-1-.45-1-1V3c0-.55.45-1 1-1h6.5zM10 6L7 3H1v12h9V6zM8.5 0H3v1h5l4 4v8h1V4.5L8.5 0z'/></svg>");mask-image:url("data:image/svg+xml;charset=utf-8,<svg xmlns='http://www.w3.org/2000/svg' width='13' height='16' viewBox='0 0 13 16'><path fill-rule='evenodd' d='M6 7h2v1H6v2H5V8H3V7h2V5h1v2zm-3 6h5v-1H3v1zM7.5 2L11 5.5V15c0 .55-.45 1-1 1H1c-.55 0-1-.45-1-1V3c0-.55.45-1 1-1h6.5zM10 6L7 3H1v12h9V6zM8.5 0H3v1h5l4 4v8h1V4.5L8.5 0z'/></svg>")}.md-typeset .magiclink-pull::before{-webkit-mask-image:url("data:image/svg+xml;charset=utf-8,<svg xmlns='http://www.w3.org/2000/svg' width='12' height='16' viewBox='0 0 12 16'><path fill-rule='evenodd' d='M11 11.28V5c-.03-.78-.34-1.47-.94-2.06C9.46 2.35 8.78 2.03 8 2H7V0L4 3l3 3V4h1c.27.02.48.11.69.31.21.2.3.42.31.69v6.28A1.993 1.993 0 0010 15a1.993 1.993 0 001-3.72zm-1 2.92c-.66 0-1.2-.55-1.2-1.2 0-.65.55-1.2 1.2-1.2.65 0 1.2.55 1.2 1.2 0 .65-.55 1.2-1.2 1.2zM4 3c0-1.11-.89-2-2-2a1.993 1.993 0 00-1 3.72v6.56A1.993 1.993 0 002 15a1.993 1.993 0 001-3.72V4.72c.59-.34 1-.98 1-1.72zm-.8 10c0 .66-.55 1.2-1.2 1.2-.65 0-1.2-.55-1.2-1.2 0-.65.55-1.2 1.2-1.2.65 0 1.2.55 1.2 1.2zM2 4.2C1.34 4.2.8 3.65.8 3c0-.65.55-1.2 1.2-1.2.65 0 1.2.55 1.2 1.2 0 .65-.55 1.2-1.2 1.2z'/></svg>");mask-image:url("data:image/svg+xml;charset=utf-8,<svg xmlns='http://www.w3.org/2000/svg' width='12' height='16' viewBox='0 0 12 16'><path fill-rule='evenodd' d='M11 11.28V5c-.03-.78-.34-1.47-.94-2.06C9.46 2.35 8.78 2.03 8 2H7V0L4 3l3 3V4h1c.27.02.48.11.69.31.21.2.3.42.31.69v6.28A1.993 1.993 0 0010 15a1.993 1.993 0 001-3.72zm-1 2.92c-.66 0-1.2-.55-1.2-1.2 0-.65.55-1.2 1.2-1.2.65 0 1.2.55 1.2 1.2 0 .65-.55 1.2-1.2 1.2zM4 3c0-1.11-.89-2-2-2a1.993 1.993 0 00-1 3.72v6.56A1.993 1.993 0 002 15a1.993 1.993 0 001-3.72V4.72c.59-.34 1-.98 1-1.72zm-.8 10c0 .66-.55 1.2-1.2 1.2-.65 0-1.2-.55-1.2-1.2 0-.65.55-1.2 1.2-1.2.65 0 1.2.55 1.2 1.2zM2 4.2C1.34 4.2.8 3.65.8 3c0-.65.55-1.2 1.2-1.2.65 0 1.2.55 1.2 1.2 0 .65-.55 1.2-1.2 1.2z'/></svg>")}.md-typeset .magiclink-issue::before{-webkit-mask-image:url("data:image/svg+xml;charset=utf-8,<svg xmlns='http://www.w3.org/2000/svg' width='14' height='16' viewBox='0 0 14 16'><path fill-rule='evenodd' d='M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 011.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z'/></svg>");mask-image:url("data:image/svg+xml;charset=utf-8,<svg xmlns='http://www.w3.org/2000/svg' width='14' height='16' viewBox='0 0 14 16'><path fill-rule='evenodd' d='M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 011.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z'/></svg>")}.md-typeset .magiclink-repository.magiclink-github::before{-webkit-mask-image:url("data:image/svg+xml;charset=utf-8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' id='github-circle'><path d='M12,2A10,10 0 0,0 2,12C2,16.42 4.87,20.17 8.84,21.5C9.34,21.58 9.5,21.27 9.5,21C9.5,20.77 9.5,20.14 9.5,19.31C6.73,19.91 6.14,17.97 6.14,17.97C5.68,16.81 5.03,16.5 5.03,16.5C4.12,15.88 5.1,15.9 5.1,15.9C6.1,15.97 6.63,16.93 6.63,16.93C7.5,18.45 8.97,18 9.54,17.76C9.63,17.11 9.89,16.67 10.17,16.42C7.95,16.17 5.62,15.31 5.62,11.5C5.62,10.39 6,9.5 6.65,8.79C6.55,8.54 6.2,7.5 6.75,6.15C6.75,6.15 7.59,5.88 9.5,7.17C10.29,6.95 11.15,6.84 12,6.84C12.85,6.84 13.71,6.95 14.5,7.17C16.41,5.88 17.25,6.15 17.25,6.15C17.8,7.5 17.45,8.54 17.35,8.79C18,9.5 18.38,10.39 18.38,11.5C18.38,15.32 16.04,16.16 13.81,16.41C14.17,16.72 14.5,17.33 14.5,18.26C14.5,19.6 14.5,20.68 14.5,21C14.5,21.27 14.66,21.59 15.17,21.5C19.14,20.16 22,16.42 22,12A10,10 0 0,0 12,2Z' /></svg>");mask-image:url("data:image/svg+xml;charset=utf-8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' id='github-circle'><path d='M12,2A10,10 0 0,0 2,12C2,16.42 4.87,20.17 8.84,21.5C9.34,21.58 9.5,21.27 9.5,21C9.5,20.77 9.5,20.14 9.5,19.31C6.73,19.91 6.14,17.97 6.14,17.97C5.68,16.81 5.03,16.5 5.03,16.5C4.12,15.88 5.1,15.9 5.1,15.9C6.1,15.97 6.63,16.93 6.63,16.93C7.5,18.45 8.97,18 9.54,17.76C9.63,17.11 9.89,16.67 10.17,16.42C7.95,16.17 5.62,15.31 5.62,11.5C5.62,10.39 6,9.5 6.65,8.79C6.55,8.54 6.2,7.5 6.75,6.15C6.75,6.15 7.59,5.88 9.5,7.17C10.29,6.95 11.15,6.84 12,6.84C12.85,6.84 13.71,6.95 14.5,7.17C16.41,5.88 17.25,6.15 17.25,6.15C17.8,7.5 17.45,8.54 17.35,8.79C18,9.5 18.38,10.39 18.38,11.5C18.38,15.32 16.04,16.16 13.81,16.41C14.17,16.72 14.5,17.33 14.5,18.26C14.5,19.6 14.5,20.68 14.5,21C14.5,21.27 14.66,21.59 15.17,21.5C19.14,20.16 22,16.42 22,12A10,10 0 0,0 12,2Z' /></svg>")}.md-typeset .magiclink-repository.magiclink-gitlab::before{-webkit-mask-image:url("data:image/svg+xml;charset=utf-8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' id='gitlab'><path d='M3.16,10L12,21.5L2.32,14.3C2.05,14.09 1.94,13.75 2.04,13.44L3.16,10M6.11,3.17C6,2.83 5.5,2.83 5.37,3.17L3.16,10H8.32L6.11,3.17M8.32,10L12,21.5L15.68,10H8.32M21.96,13.44L20.84,10L12,21.5L21.68,14.3C21.95,14.09 22.06,13.75 21.96,13.44M18.63,3.17C18.5,2.83 18,2.83 17.89,3.17L15.68,10H20.84L18.63,3.17Z' /></svg>");mask-image:url("data:image/svg+xml;charset=utf-8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' id='gitlab'><path d='M3.16,10L12,21.5L2.32,14.3C2.05,14.09 1.94,13.75 2.04,13.44L3.16,10M6.11,3.17C6,2.83 5.5,2.83 5.37,3.17L3.16,10H8.32L6.11,3.17M8.32,10L12,21.5L15.68,10H8.32M21.96,13.44L20.84,10L12,21.5L21.68,14.3C21.95,14.09 22.06,13.75 21.96,13.44M18.63,3.17C18.5,2.83 18,2.83 17.89,3.17L15.68,10H20.84L18.63,3.17Z' /></svg>")}.md-typeset .magiclink-repository.magiclink-bitbucket::before{-webkit-mask-image:url("data:image/svg+xml;charset=utf-8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' id='bitbucket'><path d='M21.43,2C21.79,2.07 22.03,2.42 22,2.82L21.12,8.7L19.27,21.4C19.2,21.75 18.95,22 18.63,22H5.37C5.05,22 4.8,21.75 4.73,21.4L2.88,8.7L2,2.82C1.97,2.42 2.21,2.07 2.57,2H21.43M14.08,15.26L15.1,8.7H8.9L9.92,15.26H14.08Z' /></svg>");mask-image:url("data:image/svg+xml;charset=utf-8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' id='bitbucket'><path d='M21.43,2C21.79,2.07 22.03,2.42 22,2.82L21.12,8.7L19.27,21.4C19.2,21.75 18.95,22 18.63,22H5.37C5.05,22 4.8,21.75 4.73,21.4L2.88,8.7L2,2.82C1.97,2.42 2.21,2.07 2.57,2H21.43M14.08,15.26L15.1,8.7H8.9L9.92,15.26H14.08Z' /></svg>")}.md-typeset mark{padding:0 .25em;color:var(--md-default-bg-color);background-color:#eefb79;box-shadow:none}.md-typeset .progress-label{position:absolute;width:100%;margin:0;color:var(--md-default-fg-color);font-weight:700;line-height:1.4rem;white-space:nowrap;text-align:center;text-shadow:-.0625em -.0625em .375em var(--md-default-bg-color--light),.0625em -.0625em .375em var(--md-default-bg-color--light),-.0625em .0625em .375em var(--md-default-bg-color--light),.0625em .0625em .375em var(--md-default-bg-color--light)}.md-typeset .progress-bar{float:left;height:1.2rem;background-color:#2979ff}.md-typeset .candystripe-animate .progress-bar{-webkit-animation:animate-stripes 3s linear infinite;animation:animate-stripes 3s linear infinite}.md-typeset .progress{position:relative;display:block;width:100%;height:1.2rem;margin:.5rem 0;background-color:var(--md-default-fg-color--lightest)}.md-typeset .progress.thin{height:.4rem;margin-top:.9rem}.md-typeset .progress.thin .progress-label{margin-top:-.4rem}.md-typeset .progress.thin .progress-bar{height:.4rem}.md-typeset .progress.candystripe .progress-bar{background-image:linear-gradient(135deg,var(--md-default-bg-color--lightest) 27%,transparent 27%,transparent 52%,var(--md-default-bg-color--lightest) 52%,var(--md-default-bg-color--lightest) 77%,transparent 77%,transparent);background-size:2rem 2rem}.md-typeset .progress-100plus .progress-bar{background-color:#52fa7c}.md-typeset .progress-80plus .progress-bar{background-color:#98fbb1}.md-typeset .progress-60plus .progress-bar{background-color:#f1fa89}.md-typeset .progress-40plus .progress-bar{background-color:#ffb86b}.md-typeset .progress-20plus .progress-bar{background-color:#ff7ac6}.md-typeset .progress-0plus .progress-bar{background-color:#ff5757}@-webkit-keyframes animate-stripes{0%{background-position:0 0}100%{background-position:6rem 0}}@keyframes animate-stripes{0%{background-position:0 0}100%{background-position:6rem 0}}.md-typeset div.mermaid{margin:1em 0;overflow:auto}.md-typeset div.mermaid::-webkit-scrollbar{width:.2rem;height:.2rem}.md-typeset div.mermaid::-webkit-scrollbar-thumb{background-color:var(--md-default-fg-color--lighter)}.md-typeset div.mermaid::-webkit-scrollbar-thumb:hover{background-color:var(--md-accent-fg-color)}.md-typeset .tabbed-set>.tabbed-content{padding:0 .6rem;overflow:hidden;box-shadow:0 -.05rem var(--md-default-fg-color--lighter)}.md-typeset .tabbed-set>input:checked+label+.tabbed-content{font-size:.64rem}.md-typeset .tabbed-set>input:checked+label+.tabbed-content>.codehilite:only-child code,.md-typeset .tabbed-set>input:checked+label+.tabbed-content>.codehilitetable:only-child code,.md-typeset .tabbed-set>input:checked+label+.tabbed-content>.highlight:only-child code,.md-typeset .tabbed-set>input:checked+label+.tabbed-content>.highlighttable:only-child code,.md-typeset .tabbed-set>input:checked+label+.tabbed-content>pre:only-child code{margin-right:-.6rem;margin-left:-.6rem;padding-right:.6rem;padding-left:.6rem}.md-typeset .tabbed-set>input:checked+label+.tabbed-content>.codehilite:only-child code .hll,.md-typeset .tabbed-set>input:checked+label+.tabbed-content>.codehilitetable:only-child code .hll,.md-typeset .tabbed-set>input:checked+label+.tabbed-content>.highlight:only-child code .hll,.md-typeset .tabbed-set>input:checked+label+.tabbed-content>.highlighttable:only-child code .hll,.md-typeset .tabbed-set>input:checked+label+.tabbed-content>pre:only-child code .hll{margin:0 -.6rem;padding:0 .6rem}.md-typeset table:not([class]){box-shadow:0 .2rem .5rem rgba(0,0,0,.15),0 0 .05rem rgba(0,0,0,.2)}.md-typeset table:not([class]) tr:hover{background-color:rgba(0,0,0,.08)}.md-typeset table:not([class]) th{color:var(--md-default-fg-color);background-color:var(--md-default-bg-color--dark);border-bottom:.05rem solid var(--md-primary-fg-color)}.md-typeset table:not([class]) td{border-top:.05rem solid var(--md-default-fg-color--lighter)}.md-typeset .task-list-control .task-list-indicator::before{background-color:var(--md-default-fg-color--lighter)}.md-typeset .task-list-control [type=checkbox]:checked+.task-list-indicator::before{background-color:#52fa7c}.md-typeset .headerlink{width:1em;height:1em;vertical-align:middle;background-color:var(--md-default-fg-color--light);background-size:1em;-webkit-mask-size:1em;mask-size:1em;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;visibility:visible;-webkit-mask-image:url("data:image/svg+xml;charset=utf-8,<svg xmlns='http://www.w3.org/2000/svg' height='24' viewBox='0 0 24 24' width='24'><path d='M0 0h24v24H0z' fill='none'/><path d='M3.9 12c0-1.71 1.39-3.1 3.1-3.1h4V7H7c-2.76 0-5 2.24-5 5s2.24 5 5 5h4v-1.9H7c-1.71 0-3.1-1.39-3.1-3.1zM8 13h8v-2H8v2zm9-6h-4v1.9h4c1.71 0 3.1 1.39 3.1 3.1s-1.39 3.1-3.1 3.1h-4V17h4c2.76 0 5-2.24 5-5s-2.24-5-5-5z'/></svg>");mask-image:url("data:image/svg+xml;charset=utf-8,<svg xmlns='http://www.w3.org/2000/svg' height='24' viewBox='0 0 24 24' width='24'><path d='M0 0h24v24H0z' fill='none'/><path d='M3.9 12c0-1.71 1.39-3.1 3.1-3.1h4V7H7c-2.76 0-5 2.24-5 5s2.24 5 5 5h4v-1.9H7c-1.71 0-3.1-1.39-3.1-3.1zM8 13h8v-2H8v2zm9-6h-4v1.9h4c1.71 0 3.1 1.39 3.1 3.1s-1.39 3.1-3.1 3.1h-4V17h4c2.76 0 5-2.24 5-5s-2.24-5-5-5z'/></svg>")}.md-typeset .headerlink:hover,.md-typeset [id]:target .headerlink{background-color:var(--md-accent-fg-color)}.md-typeset div.mermaid svg{max-width:none;font-size:16px!important}.md-typeset div.mermaid svg .label{font-family:'trebuchet ms',verdana,arial;font-family:var(--mermaid-font-family);color:#333}.md-typeset div.mermaid svg .label text{fill:#333}.md-typeset div.mermaid svg .node circle,.md-typeset div.mermaid svg .node ellipse,.md-typeset div.mermaid svg .node path,.md-typeset div.mermaid svg .node polygon,.md-typeset div.mermaid svg .node rect{fill:#5f4a7c;stroke:#bf95f9;stroke-width:1px}.md-typeset div.mermaid svg .node .label{text-align:center}.md-typeset div.mermaid svg .node.clickable{cursor:pointer}.md-typeset div.mermaid svg .arrowheadPath{fill:#bf95f9}.md-typeset div.mermaid svg .edgePath .path{stroke:#bf95f9;stroke-width:1.5px}.md-typeset div.mermaid svg .edgeLabel{background-color:#392d4b;text-align:center}.md-typeset div.mermaid svg .cluster rect{fill:#303952;stroke:#6071a4;stroke-width:1px}.md-typeset div.mermaid svg .cluster text{fill:#bf95f9}.md-typeset div.mermaid svg div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:'trebuchet ms',verdana,arial;font-family:var(--mermaid-font-family);font-size:12px;background:#303952;border:1px solid #6071a4;border-radius:2px;pointer-events:none;z-index:100}.md-typeset div.mermaid svg .actor{stroke:#bf95f9;fill:#5f4a7c}.md-typeset div.mermaid svg text.actor{fill:#bf95f9;stroke:none}.md-typeset div.mermaid svg .actor-line{stroke:#bf95f9}.md-typeset div.mermaid svg .messageLine0{stroke-width:1.5;stroke-dasharray:'2 2';stroke:#bf95f9}.md-typeset div.mermaid svg .messageLine1{stroke-width:1.5;stroke-dasharray:'2 2';stroke:#bf95f9}.md-typeset div.mermaid svg #arrowhead{fill:#bf95f9}.md-typeset div.mermaid svg .sequenceNumber{fill:#bf95f9}.md-typeset div.mermaid svg #sequencenumber{fill:#bf95f9}.md-typeset div.mermaid svg #crosshead path{fill:#bf95f9!important;stroke:#bf95f9!important}.md-typeset div.mermaid svg .messageText{fill:#bf95f9;stroke:none}.md-typeset div.mermaid svg .labelBox{stroke:#bf95f9;fill:#5f4a7c}.md-typeset div.mermaid svg .labelText{fill:#272935;stroke:none}.md-typeset div.mermaid svg .loopText{fill:#bf95f9;stroke:none}.md-typeset div.mermaid svg .loopLine{stroke-width:2;stroke-dasharray:'2 2';stroke:#bf95f9}.md-typeset div.mermaid svg .note{stroke:#f1fa89;fill:#787d45}.md-typeset div.mermaid svg .noteText{fill:#000;stroke:none;font-family:'trebuchet ms',verdana,arial;font-family:var(--mermaid-font-family);font-size:14px}.md-typeset div.mermaid svg .activation0{fill:#272d42;stroke:#6071a4}.md-typeset div.mermaid svg .activation1{fill:#272d42;stroke:#6071a4}.md-typeset div.mermaid svg .activation2{fill:#272d42;stroke:#6071a4}.md-typeset div.mermaid svg .mermaid-main-font{font-family:"trebuchet ms",verdana,arial;font-family:var(--mermaid-font-family)}.md-typeset div.mermaid svg .section{stroke:none;opacity:.2}.md-typeset div.mermaid svg .section0{fill:rgba(191,149,249,.3)}.md-typeset div.mermaid svg .section2{fill:rgba(191,149,249,.6)}.md-typeset div.mermaid svg .section1,.md-typeset div.mermaid svg .section3{fill:#2e303e;opacity:.2}.md-typeset div.mermaid svg .sectionTitle0{fill:#bf95f9}.md-typeset div.mermaid svg .sectionTitle1{fill:#bf95f9}.md-typeset div.mermaid svg .sectionTitle2{fill:#bf95f9}.md-typeset div.mermaid svg .sectionTitle3{fill:#bf95f9}.md-typeset div.mermaid svg .sectionTitle{text-anchor:start;font-size:11px;text-height:14px;font-family:'trebuchet ms',verdana,arial;font-family:var(--mermaid-font-family)}.md-typeset div.mermaid svg .grid .tick{stroke:#bf95f9;opacity:.8;shape-rendering:crispEdges}.md-typeset div.mermaid svg .grid .tick text{font-family:'trebuchet ms',verdana,arial;font-family:var(--mermaid-font-family)}.md-typeset div.mermaid svg .grid path{stroke-width:0}.md-typeset div.mermaid svg .today{fill:none;stroke:#ff7ac6;stroke-width:2px}.md-typeset div.mermaid svg .task{stroke-width:2}.md-typeset div.mermaid svg .taskText{text-anchor:middle;font-family:'trebuchet ms',verdana,arial;font-family:var(--mermaid-font-family)}.md-typeset div.mermaid svg .taskText:not([font-size]){font-size:11px}.md-typeset div.mermaid svg .taskTextOutsideRight{fill:#272935;text-anchor:start;font-size:11px;font-family:'trebuchet ms',verdana,arial;font-family:var(--mermaid-font-family)}.md-typeset div.mermaid svg .taskTextOutsideLeft{fill:#272935;text-anchor:end;font-size:11px}.md-typeset div.mermaid svg .task.clickable{cursor:pointer}.md-typeset div.mermaid svg .taskText.clickable{cursor:pointer;fill:#8be8fd!important;font-weight:700}.md-typeset div.mermaid svg .taskTextOutsideLeft.clickable{cursor:pointer;fill:#8be8fd!important;font-weight:700}.md-typeset div.mermaid svg .taskTextOutsideRight.clickable{cursor:pointer;fill:#8be8fd!important;font-weight:700}.md-typeset div.mermaid svg .taskText0,.md-typeset div.mermaid svg .taskText1,.md-typeset div.mermaid svg .taskText2,.md-typeset div.mermaid svg .taskText3{fill:#bf95f9}.md-typeset div.mermaid svg .task0,.md-typeset div.mermaid svg .task1,.md-typeset div.mermaid svg .task2,.md-typeset div.mermaid svg .task3{fill:#5f4a7c;stroke:#bf95f9}.md-typeset div.mermaid svg .taskTextOutside0,.md-typeset div.mermaid svg .taskTextOutside2{fill:#bf95f9}.md-typeset div.mermaid svg .taskTextOutside1,.md-typeset div.mermaid svg .taskTextOutside3{fill:#bf95f9}.md-typeset div.mermaid svg .active0,.md-typeset div.mermaid svg .active1,.md-typeset div.mermaid svg .active2,.md-typeset div.mermaid svg .active3{fill:#803d63;stroke:#ff7ac6}.md-typeset div.mermaid svg .activeText0,.md-typeset div.mermaid svg .activeText1,.md-typeset div.mermaid svg .activeText2,.md-typeset div.mermaid svg .activeText3{fill:#272935!important}.md-typeset div.mermaid svg .done0,.md-typeset div.mermaid svg .done1,.md-typeset div.mermaid svg .done2,.md-typeset div.mermaid svg .done3{stroke:#6071a4;fill:#303952;stroke-width:2}.md-typeset div.mermaid svg .doneText0,.md-typeset div.mermaid svg .doneText1,.md-typeset div.mermaid svg .doneText2,.md-typeset div.mermaid svg .doneText3{fill:#272935!important}.md-typeset div.mermaid svg .crit0,.md-typeset div.mermaid svg .crit1,.md-typeset div.mermaid svg .crit2,.md-typeset div.mermaid svg .crit3{stroke:#ff5757;fill:#802b2b;stroke-width:2}.md-typeset div.mermaid svg .activeCrit0,.md-typeset div.mermaid svg .activeCrit1,.md-typeset div.mermaid svg .activeCrit2,.md-typeset div.mermaid svg .activeCrit3{stroke:#ff5757;fill:#803d63;stroke-width:2}.md-typeset div.mermaid svg .doneCrit0,.md-typeset div.mermaid svg .doneCrit1,.md-typeset div.mermaid svg .doneCrit2,.md-typeset div.mermaid svg .doneCrit3{stroke:#ff5757;fill:#303952;stroke-width:2;cursor:pointer;shape-rendering:crispEdges}.md-typeset div.mermaid svg .milestone{transform:rotate(45deg) scale(.8,.8)}.md-typeset div.mermaid svg .milestoneText{font-style:italic}.md-typeset div.mermaid svg .doneCritText0,.md-typeset div.mermaid svg .doneCritText1,.md-typeset div.mermaid svg .doneCritText2,.md-typeset div.mermaid svg .doneCritText3{fill:#272935!important}.md-typeset div.mermaid svg .activeCritText0,.md-typeset div.mermaid svg .activeCritText1,.md-typeset div.mermaid svg .activeCritText2,.md-typeset div.mermaid svg .activeCritText3{fill:#272935!important}.md-typeset div.mermaid svg .titleText{text-anchor:middle;font-size:18px;fill:#272935;font-family:'trebuchet ms',verdana,arial;font-family:var(--mermaid-font-family)}.md-typeset div.mermaid svg g.classGroup text{fill:#bf95f9;stroke:none;font-family:'trebuchet ms',verdana,arial;font-family:var(--mermaid-font-family);font-size:10px}.md-typeset div.mermaid svg g.classGroup text .title{font-weight:bolder}.md-typeset div.mermaid svg g.clickable{cursor:pointer}.md-typeset div.mermaid svg g.classGroup rect{fill:#5f4a7c;stroke:#bf95f9}.md-typeset div.mermaid svg g.classGroup line{stroke:#bf95f9;stroke-width:1}.md-typeset div.mermaid svg .classLabel .box{stroke:none;stroke-width:0;fill:#5f4a7c;opacity:.5}.md-typeset div.mermaid svg .classLabel .label{fill:#bf95f9;font-size:10px}.md-typeset div.mermaid svg .relation{stroke:#bf95f9;stroke-width:1;fill:none}.md-typeset div.mermaid svg .dashed-line{stroke-dasharray:3}.md-typeset div.mermaid svg #compositionStart{fill:#bf95f9;stroke:#bf95f9;stroke-width:1}.md-typeset div.mermaid svg #compositionEnd{fill:#bf95f9;stroke:#bf95f9;stroke-width:1}.md-typeset div.mermaid svg #aggregationStart{fill:#5f4a7c;stroke:#bf95f9;stroke-width:1}.md-typeset div.mermaid svg #aggregationEnd{fill:#5f4a7c;stroke:#bf95f9;stroke-width:1}.md-typeset div.mermaid svg #dependencyStart{fill:#bf95f9;stroke:#bf95f9;stroke-width:1}.md-typeset div.mermaid svg #dependencyEnd{fill:#bf95f9;stroke:#bf95f9;stroke-width:1}.md-typeset div.mermaid svg #extensionStart{fill:#bf95f9;stroke:#bf95f9;stroke-width:1}.md-typeset div.mermaid svg #extensionEnd{fill:#bf95f9;stroke:#bf95f9;stroke-width:1}.md-typeset div.mermaid svg .branch-label,.md-typeset div.mermaid svg .commit-id,.md-typeset div.mermaid svg .commit-msg{fill:#d3d3d3;color:#d3d3d3;font-family:'trebuchet ms',verdana,arial;font-family:var(--mermaid-font-family)}.md-typeset div.mermaid svg .pieTitleText{text-anchor:middle;font-size:25px;fill:#272935;font-family:'trebuchet ms',verdana,arial;font-family:var(--mermaid-font-family)}.md-typeset div.mermaid svg .slice{font-family:'trebuchet ms',verdana,arial;font-family:var(--mermaid-font-family)}.md-typeset div.mermaid svg g.stateGroup text{fill:#bf95f9;stroke:none;font-size:10px;font-family:'trebuchet ms',verdana,arial;font-family:var(--mermaid-font-family)}.md-typeset div.mermaid svg g.stateGroup text{fill:#bf95f9;stroke:none;font-size:10px}.md-typeset div.mermaid svg g.stateGroup .state-title{font-weight:bolder;fill:#bf95f9}.md-typeset div.mermaid svg g.stateGroup rect{fill:#5f4a7c;stroke:#bf95f9}.md-typeset div.mermaid svg g.stateGroup line{stroke:#bf95f9;stroke-width:1}.md-typeset div.mermaid svg .transition{stroke:#bf95f9;stroke-width:1;fill:none}.md-typeset div.mermaid svg .stateGroup .composit{fill:#fff;border-bottom:1px}.md-typeset div.mermaid svg .stateGroup .alt-composit{fill:#e0e0e0;border-bottom:1px}.md-typeset div.mermaid svg .state-note{stroke:#f1fa89;fill:#787d45}.md-typeset div.mermaid svg .state-note text{fill:#000;stroke:none;font-size:10px}.md-typeset div.mermaid svg .stateLabel .box{stroke:none;stroke-width:0;fill:#5f4a7c;opacity:.5}.md-typeset div.mermaid svg .stateLabel text{fill:#bf95f9;font-size:10px;font-weight:700;font-family:'trebuchet ms',verdana,arial;font-family:var(--mermaid-font-family)}.md-typeset div.mermaid svg :root{--mermaid-font-family:'"trebuchet ms", verdana, arial';--mermaid-font-family:"Comic Sans MS","Comic Sans",cursive}.md-typeset div.mermaid svg .label text,.md-typeset div.mermaid svg .labelText{fill:#bf95f9}.md-typeset div.mermaid svg .edgeLabel text{fill:#bf95f9}.md-typeset div.mermaid svg .edgeLabel rect{opacity:.5!important;fill:#5f4a7c!important}.md-typeset div.mermaid svg .noteText{fill:#f1fa89}.md-typeset div.mermaid svg .sectionTitle,.md-typeset div.mermaid svg .taskTextOutsideLeft,.md-typeset div.mermaid svg .taskTextOutsideRight{fill:#bf95f9!important}.md-typeset div.mermaid svg .taskText{fill:#bf95f9!important}.md-typeset div.mermaid svg .taskText[class*=doneText]{fill:#6071a4!important}.md-typeset div.mermaid svg .taskText[class*=activeText]{fill:#ff7ac6!important}.md-typeset div.mermaid svg .taskText[class*=critText]{fill:#ff5757!important}.md-typeset div.mermaid svg .grid .tick line{stroke:rgba(191,149,249,.7)!important}.md-typeset div.mermaid svg .grid .tick text{fill:#bf95f9}.md-typeset div.mermaid svg .stateGroup circle[style$="fill: black;"]{fill:#5f4a7c!important;stroke:#5f4a7c!important}.md-typeset div.mermaid svg .stateGroup circle[style$="fill: white;"]{fill:#5f4a7c!important;stroke:#bf95f9!important}.md-typeset div.mermaid svg .stateGroup .composit{fill:#2e303e}.md-typeset div.mermaid svg .classGroup .title,.md-typeset div.mermaid svg .classGroup text,.md-typeset div.mermaid svg .classLabel .label{font-size:16px!important}.md-header{background-color:var(--md-default-bg-color--darkest);border-bottom:.05rem solid var(--md-primary-fg-color)}.md-header[data-md-state=shadow]{box-shadow:0 0 .2rem rgba(0,0,0,.15),0 0 .2rem .4rem rgba(0,0,0,.2)}.md-header,.md-nav__source,.md-tabs{color:var(--md-default-fg-color)}.md-tabs{background-color:var(--md-primary-fg-color--transparent)}.md-tabs__link--active{color:var(--md-primary-fg-color)}.md-tabs__link:hover{color:var(--md-accent-fg-color)}.md-hero{color:var(--md-default-fg-color);background-color:var(--md-primary-fg-color--transparent)}.md-search__input{color:var(--md-default-fg-color);background-color:var(--md-accent-bg-color--light)}.md-search__input:hover{background-color:var(--md-default-bg-color)}.md-search__input~.md-search__icon{color:var(--md-default-fg-color)}.md-search__input::-webkit-input-placeholder{color:var(--md-default-fg-color--light)}.md-search__input::-moz-placeholder{color:var(--md-default-fg-color--light)}.md-search__input:-ms-input-placeholder{color:var(--md-default-fg-color--light)}.md-search__input::-ms-input-placeholder{color:var(--md-default-fg-color--light)}.md-search__input::placeholder{color:var(--md-default-fg-color--light)}.md-overlay,.md-search__overlay{background-color:var(--md-default-bg-color--light)}.md-footer{color:var(--md-default-fg-color--light);background-color:transparent}.md-footer-nav__direction{color:var(--md-primary-fg-color)}.md-footer-meta{background-color:var(--md-default-bg-color--darkest);border-top:.05rem solid var(--md-primary-fg-color)}.md-footer-copyright{color:#484b61}.md-footer-copyright .md-footer-copyright__highlight{color:var(--md-default-fg-color--light)}.md-footer-copyright .md-footer-copyright__highlight .md-footer-custom-text{color:#484b61}html .md-footer-meta.md-typeset a{color:var(--md-default-fg-color--light)}html .md-footer-meta.md-typeset a:hover{color:var(--md-default-fg-color)}.md-typeset h5{color:var(--md-default-fg-color);text-transform:none}@media screen and (max-width:76.1875em){html .md-nav--primary .md-nav__title[for="__drawer"]{color:var(--md-default-fg-color);background-color:var(--md-default-bg-color--darkest);border-bottom:.05rem solid var(--md-primary-fg-color)}}@media screen and (max-width:59.9375em){.md-nav__source{color:var(--md-default-fg-color);background-color:var(--md-primary-fg-color--transparent)}html .md-nav .md-nav__title{color:var(--md-default-fg-color);background-color:var(--md-default-bg-color--darkest);border-bottom:.05rem solid var(--md-primary-fg-color)}}
\ No newline at end of file
diff --git a/mkdocs.yml b/mkdocs.yml
index 74f686e4..aaddd2cd 100644
--- a/mkdocs.yml
+++ b/mkdocs.yml
@@ -105,6 +105,7 @@ markdown_extensions:
       repo_url_shortener: true
       repo_url_shorthand: true
       social_url_shorthand: true
+      social_url_shortener: true
       user: facelessuser
       repo: pymdown-extensions
   - pymdownx.tilde:
@@ -136,7 +137,7 @@ extra:
     - icon: fontawesome/brands/discord
       link: https://discord.gg/fqQ7ypS
 extra_css:
-  - assets/pymdownx-extras/extra-9dc654756b.css
+  - assets/pymdownx-extras/extra-8d532f7233.css
 extra_javascript:
   - assets/pymdownx-extras/extra-835d408546.js
 
diff --git a/pymdownx/magiclink.py b/pymdownx/magiclink.py
index 12a501c9..8e574756 100644
--- a/pymdownx/magiclink.py
+++ b/pymdownx/magiclink.py
@@ -34,6 +34,12 @@ from markdown.inlinepatterns import LinkInlineProcessor, InlineProcessor
 MAGIC_LINK = 1
 MAGIC_AUTO_LINK = 2
 
+DEFAULT_EXCLUDES = {
+    "bitbucket": ['dashboard', 'account', 'plans', 'support', 'repo'],
+    "github": ['marketeplace', 'notifications', 'issues', 'pull', 'sponsors', 'settings', 'support'],
+    "gitlab": ['dashboard', '-', 'explore', 'help', 'projects'],
+    "twitter": ['i', 'messages', 'bookmarks', 'home']
+}
 
 # Bare link/email detection
 RE_MAIL = r'''(?xi)
@@ -118,26 +124,54 @@ RE_GIT_INT_MICRO_REFS = r'''(?x)
 # Repository link shortening pattern
 RE_REPO_LINK = re.compile(
     r'''(?xi)
-    (?:
-        (?P<github>(?P<github_base>https://(?:w{3}\.)?github.com/(?P<github_user_repo>[^/]+/[^/]+))/
-            (?:issues/(?P<github_issue>\d+)/?|
-               pull/(?P<github_pull>\d+)/?|
-               commit/(?P<github_commit>[\da-f]{40})/?|
-               compare/(?P<github_diff1>[\da-f]{40})\.{3}(?P<github_diff2>[\da-f]{40}))) |
-
-        (?P<bitbucket>(?P<bitbucket_base>https://(?:w{3}\.)?bitbucket.org/(?P<bitbucket_user_repo>[^/]+/[^/]+))/
-            (?:issues/(?P<bitbucket_issue>\d+)(?:/[^/]+)?/?|
-               pull-requests/(?P<bitbucket_pull>\d+)(?:/[^/]+(?:/diff)?)?/?|
-               commits/commit/(?P<bitbucket_commit>[\da-f]{40})/?|
-               branches/commits/(?P<bitbucket_diff1>[\da-f]{40})(?:\.{2}|%0d)(?P<bitbucket_diff2>[\da-f]{40})\#diff)) |
-
-        (?P<gitlab>(?P<gitlab_base>https://(?:w{3}\.)?gitlab.com/(?P<gitlab_user_repo>[^/]+/[^/]+))/
-            (?:issues/(?P<gitlab_issue>\d+)/?|
-               merge_requests/(?P<gitlab_pull>\d+)/?|
-               commit/(?P<gitlab_commit>[\da-f]{40})/?|
-               compare/(?P<gitlab_diff1>[\da-f]{40})\.{3}(?P<gitlab_diff2>[\da-f]{40})))
-    )
-    '''
+    ^(?:
+        (?P<github>(?P<github_base>https://(?:w{{3}}\.)?github\.com/
+            (?P<github_user_repo>(?P<github_user>{})/[^/]+))/
+                (?:issues/(?P<github_issue>\d+)/?|
+                    pull/(?P<github_pull>\d+)/?|
+                    commit/(?P<github_commit>[\da-f]{{40}})/?|
+                    compare/(?P<github_diff1>[\da-f]{{40}})\.{{3}}
+                        (?P<github_diff2>[\da-f]{{40}})))|
+
+        (?P<bitbucket>(?P<bitbucket_base>https://(?:w{{3}}\.)?bitbucket\.org/
+            (?P<bitbucket_user_repo>(?P<bitbucket_user>{})/[^/]+))/
+                (?:issues/(?P<bitbucket_issue>\d+)(?:/[^/]+)?/?|
+                    pull-requests/(?P<bitbucket_pull>\d+)(?:/[^/]+(?:/diff)?)?/?|
+                    commits/commit/(?P<bitbucket_commit>[\da-f]{{40}})/?|
+                    branches/commits/(?P<bitbucket_diff1>[\da-f]{{40}})
+                        (?:\.{{2}}|%0d)(?P<bitbucket_diff2>[\da-f]{{40}})\#diff))|
+
+        (?P<gitlab>(?P<gitlab_base>https://(?:w{{3}}\.)?gitlab\.com/
+            (?P<gitlab_user_repo>(?P<gitlab_user>{})/[^/]+))/
+                (?:issues/(?P<gitlab_issue>\d+)/?|
+                    merge_requests/(?P<gitlab_pull>\d+)/?|
+                    commit/(?P<gitlab_commit>[\da-f]{{40}})/?|
+                    compare/(?P<gitlab_diff1>[\da-f]{{40}})\.{{3}}
+                        (?P<gitlab_diff2>[\da-f]{{40}})))
+    )/?$
+    '''.format(RE_GITHUB_USER, RE_BITBUCKET_USER, RE_GITLAB_USER)
+)
+
+# Repository link shortening pattern
+RE_USER_REPO_LINK = re.compile(
+    r'''(?xi)
+    ^(?:
+        (?P<github>(?P<github_base>https://(?:w{{3}}\.)?github\.com/
+            (?P<github_user_repo>(?P<github_user>{})(?:/(?P<github_repo>[^/]+))?))) |
+        (?P<bitbucket>(?P<bitbucket_base>https://(?:w{{3}}\.)?bitbucket\.org/
+            (?P<bitbucket_user_repo>(?P<bitbucket_user>{})(?:/(?P<bitbucket_repo>[^/]+)/?)?))) |
+        (?P<gitlab>(?P<gitlab_base>https://(?:w{{3}}\.)?gitlab\.com/
+            (?P<gitlab_user_repo>(?P<gitlab_user>{})(?:/(?P<gitlab_repo>[^/]+))?))) |
+    )/?$
+    '''.format(RE_GITHUB_USER, RE_BITBUCKET_USER, RE_GITLAB_USER)
+)
+
+RE_SOCIAL_LINK = re.compile(
+    r'''(?xi)
+    ^(?:
+        (?P<twitter>(?P<twitter_base>https://(?:w{{3}}\.)?twitter\.com/(?P<twitter_user>{})))
+    )/?$
+    '''.format(RE_TWITTER_USER)
 )
 
 # Provider specific info (links, names, specific patterns, etc.)
@@ -295,11 +329,15 @@ class MagicShortenerTreeprocessor(Treeprocessor):
     PULL = 1
     COMMIT = 2
     DIFF = 3
+    REPO = 4
+    USER = 5
 
-    def __init__(self, md, base_url, base_user_url, labels):
+    def __init__(self, md, base_url, base_user_url, labels, repo_shortner, social_shortener, excludes):
         """Initialize."""
 
         self.base = base_url
+        self.repo_shortner = repo_shortner
+        self.social_shortener = social_shortener
         self.base_user = base_user_url
         self.repo_labels = labels
         self.labels = {
@@ -307,8 +345,40 @@ class MagicShortenerTreeprocessor(Treeprocessor):
             "bitbucket": "Bitbucket",
             "gitlab": "GitLab"
         }
+        self.excludes = excludes
         Treeprocessor.__init__(self, md)
 
+    def shorten_repo(self, link, class_name, label, user_repo):
+        """Shorten repo link."""
+
+        text = '%s' % user_repo
+        link.text = md_util.AtomicString(text)
+
+        if 'magiclink-repository' not in class_name:
+            class_name.append('magiclink-repository')
+
+        link.set(
+            'title',
+            "%s %s: %s" % (
+                label, self.repo_labels.get('repository', 'Repository'), user_repo
+            )
+        )
+
+    def shorten_user(self, link, class_name, label, user_repo):
+        """Shorten user link."""
+
+        link.text = md_util.AtomicString('@' + user_repo)
+
+        if 'magiclink-mention' not in class_name:
+            class_name.append('magiclink-mention')
+
+        link.set(
+            'title',
+            "%s %s: %s" % (
+                label, self.repo_labels.get('metion', 'User'), user_repo
+            )
+        )
+
     def shorten_diff(self, link, class_name, label, user_repo, value, hash_size):
         """Shorten diff/compare links."""
 
@@ -375,7 +445,7 @@ class MagicShortenerTreeprocessor(Treeprocessor):
         link.text = md_util.AtomicString(text)
         link.set('title', '%s %s: %s%s%s' % (label, issue_type, user_repo.rstrip('/'), separator, value))
 
-    def shorten(self, link, provider, link_type, user_repo, value, url, hash_size):
+    def shorten_issue_commit(self, link, provider, link_type, user_repo, value, hash_size):
         """Shorten URL."""
 
         label = PROVIDER_INFO[provider]['provider']
@@ -398,6 +468,27 @@ class MagicShortenerTreeprocessor(Treeprocessor):
             self.shorten_issue(link, class_name, label, user_repo, value, link_type)
         link.set('class', ' '.join(class_name))
 
+    def shorten_user_repo(self, link, provider, link_type, user_repo):
+        """Shorten URL."""
+
+        label = PROVIDER_INFO[provider]['provider']
+        prov_class = 'magiclink-%s' % provider
+        class_attr = link.get('class', '')
+        class_name = class_attr.split(' ') if class_attr else []
+
+        if 'magiclink' not in class_name:
+            class_name.append('magiclink')
+
+        if prov_class not in class_name:
+            class_name.append(prov_class)
+
+        # Link specific shortening logic
+        if link_type is self.REPO:
+            self.shorten_repo(link, class_name, label, user_repo)
+        else:
+            self.shorten_user(link, class_name, label, user_repo)
+        link.set('class', ' '.join(class_name))
+
     def get_provider(self, match):
         """Get the provider and hash size."""
 
@@ -410,22 +501,43 @@ class MagicShortenerTreeprocessor(Treeprocessor):
             provider = 'gitlab'
         return provider
 
+    def get_social_provider(self, match):
+        """Get social provider."""
+
+        if match.group('twitter'):
+            provider = 'twitter'
+        return provider
+
     def get_type(self, provider, match):
         """Get the link type."""
 
-        # Gather info about link type
-        if match.group(provider + '_diff1') is not None:
-            value = (match.group(provider + '_diff1'), match.group(provider + '_diff2'))
-            link_type = self.DIFF
-        elif match.group(provider + '_commit') is not None:
-            value = match.group(provider + '_commit')
-            link_type = self.COMMIT
-        elif match.group(provider + '_pull') is not None:
-            value = match.group(provider + '_pull')
-            link_type = self.PULL
-        else:
-            value = match.group(provider + '_issue')
-            link_type = self.ISSUE
+        try:
+            # Gather info about link type
+            if match.group(provider + '_diff1') is not None:
+                value = (match.group(provider + '_diff1'), match.group(provider + '_diff2'))
+                link_type = self.DIFF
+            elif match.group(provider + '_commit') is not None:
+                value = match.group(provider + '_commit')
+                link_type = self.COMMIT
+            elif match.group(provider + '_pull') is not None:
+                value = match.group(provider + '_pull')
+                link_type = self.PULL
+            else:
+                value = match.group(provider + '_issue')
+                link_type = self.ISSUE
+        except IndexError:
+            # Gather info about link type
+            found = False
+            try:
+                if match.group(provider + '_repo') is not None:
+                    value = None
+                    link_type = self.REPO
+                    found = True
+            except IndexError:
+                pass
+            if not found:
+                value = None
+                link_type = self.USER
         return value, link_type
 
     def is_my_repo(self, provider, match):
@@ -439,6 +551,12 @@ class MagicShortenerTreeprocessor(Treeprocessor):
 
         return self.base_user and match.group(provider + '_base').startswith(self.base_user)
 
+    def excluded(self, provider, match):
+        """Check if user has been excluded."""
+
+        user = match.group(provider + '_user')
+        return user.lower() in self.excludes.get(provider, set())
+
     def run(self, root):
         """Shorten popular git repository links."""
 
@@ -450,6 +568,7 @@ class MagicShortenerTreeprocessor(Treeprocessor):
             is_magic = link.attrib.get('magiclink')
             href = link.attrib.get('href', '')
             text = link.text
+            found = False
 
             if is_magic:
                 del link.attrib['magiclink']
@@ -461,23 +580,58 @@ class MagicShortenerTreeprocessor(Treeprocessor):
             # Make sure the text matches the `href`.  If needed, add back protocol to be sure.
             # Not all links will pass through MagicLink, so we try both with and without protocol.
             if (text == href or (is_magic and self.hide_protocol and ('https://' + text) == href)):
-                m = RE_REPO_LINK.match(href)
-                if m:
-                    provider = self.get_provider(m)
-                    self.my_repo = self.is_my_repo(provider, m)
-                    self.my_user = self.my_repo or self.is_my_user(provider, m)
-                    value, link_type = self.get_type(provider, m)
-
-                    # All right, everything set, let's shorten.
-                    self.shorten(
-                        link,
-                        provider,
-                        link_type,
-                        m.group(provider + '_user_repo'),
-                        value,
-                        href,
-                        PROVIDER_INFO[provider]['hash_size']
-                    )
+                if self.repo_shortner:
+                    m = RE_REPO_LINK.match(href)
+                    if m:
+                        provider = self.get_provider(m)
+                        self.my_repo = self.is_my_repo(provider, m)
+                        self.my_user = self.my_repo or self.is_my_user(provider, m)
+                        value, link_type = self.get_type(provider, m)
+                        found = True
+
+                        # All right, everything set, let's shorten.
+                        if not self.excluded(provider, m):
+                            self.shorten_issue_commit(
+                                link,
+                                provider,
+                                link_type,
+                                m.group(provider + '_user_repo'),
+                                value,
+                                PROVIDER_INFO[provider]['hash_size']
+                            )
+                if not found and self.repo_shortner:
+                    m = RE_USER_REPO_LINK.match(href)
+                    if m:
+                        provider = self.get_provider(m)
+                        self.my_repo = self.is_my_repo(provider, m)
+                        self.my_user = self.my_repo or self.is_my_user(provider, m)
+                        value, link_type = self.get_type(provider, m)
+                        found = True
+
+                        if not self.excluded(provider, m):
+                            # All right, everything set, let's shorten.
+                            self.shorten_user_repo(
+                                link,
+                                provider,
+                                link_type,
+                                m.group(provider + '_user_repo')
+                            )
+                if not found and self.social_shortener:
+                    m = RE_SOCIAL_LINK.match(href)
+                    if m:
+                        provider = self.get_social_provider(m)
+                        self.my_repo = self.is_my_repo(provider, m)
+                        self.my_user = self.my_repo or self.is_my_user(provider, m)
+                        value, link_type = self.get_type(provider, m)
+
+                        if not self.excluded(provider, m):
+                            # All right, everything set, let's shorten.
+                            self.shorten_user_repo(
+                                link,
+                                provider,
+                                link_type,
+                                m.group(provider + '_user')
+                            )
         return root
 
 
@@ -693,6 +847,19 @@ class MagiclinkExtension(Extension):
                 False,
                 "If 'True' repo commit and issue links are shortened - Default: False"
             ],
+            'social_url_shortener': [
+                False,
+                "If 'True' social links are shortened - Default: False"
+            ],
+            'shortener_user_exclude': [
+                {
+                    "bitbucket": ['dashboard', 'account', 'plans', 'support', 'repo'],
+                    "github": ['marketeplace', 'notifications', 'issues', 'pull', 'sponsors', 'settings', 'support'],
+                    "gitlab": ['dashboard', '-', 'explore', 'help', 'projects'],
+                    "twitter": ['i', 'messages', 'bookmarks', 'home']
+                },
+                "A list of user names to exclude from URL shortening."
+            ],
             'repo_url_shorthand': [
                 False,
                 "If 'True' repo shorthand syntax is converted to links - Default: False"
@@ -781,10 +948,13 @@ class MagiclinkExtension(Extension):
                 )
                 md.inlinePatterns.register(git_int_micro_refs, "magic-int-micro-refs", 79.3)
 
-    def setup_shortener(self, md, base_url, base_user_url, config):
+    def setup_shortener(self, md, base_url, base_user_url, config, repo_shortner, social_shortener):
         """Setup shortener."""
 
-        shortener = MagicShortenerTreeprocessor(md, base_url, base_user_url, self.labels)
+        shortener = MagicShortenerTreeprocessor(
+            md, base_url, base_user_url, self.labels, repo_shortner, social_shortener,
+            self.shortener_exclusions
+        )
         shortener.config = config
         md.treeprocessors.register(shortener, "magic-repo-shortener", 9.9)
 
@@ -816,6 +986,12 @@ class MagiclinkExtension(Extension):
         self.is_social = self.provider in SOCIAL_PROVIDERS
         self.git_short = config.get('repo_url_shorthand', False)
         self.social_short = config.get('social_url_shorthand', False)
+        self.repo_shortner = config.get('repo_url_shortener', False)
+        self.social_shortener = config.get('social_url_shortener', False)
+        self.shortener_exclusions = {k: set(v) for k, v in DEFAULT_EXCLUDES.items()}
+        for key, value in config.get('shortener_user_exclude', {}).items():
+            if key in ('github', 'bitbucket', 'gitlab', 'twitter') and isinstance(value, (list, tuple, set)):
+                self.shortener_exclusions[key] = set([x.lower() for x in value])
 
         # Ensure valid provider
         if self.provider not in PROVIDER_INFO:
@@ -838,9 +1014,9 @@ class MagiclinkExtension(Extension):
             self.setup_shorthand(md, int_mentions, ext_mentions, config)
 
         # Setup link post processor for shortening repository links
-        if config.get('repo_url_shortener', False):
+        if self.repo_shortner or self.social_shortener:
             base_url, base_user_url = self.get_base_urls(config)
-            self.setup_shortener(md, base_url, base_user_url, config)
+            self.setup_shortener(md, base_url, base_user_url, config, self.repo_shortner, self.social_shortener)
 
 
 def makeExtension(*args, **kwargs):

Minor trouble with magiclink extension
I try to implement the MagicLink extension into my sites, but when using it, does it not shorten the github urls, despite me enabling both `repo_url_shortener` and `repo_url_shorthand` in the mkdocs.yml

I want to point out, that the repositories I want to point towards are all on GitHub, but not all are within the same organisation/user.

The extension does automatically set the link, but does not shorten it in any way.
`@user/repo` mentions are working, but do lack the GitHub icon. Does this require the provider to be set?
Or does it require some additional CSS stuff to be added?

I'm generally lost on how I could implement this the best way.

Additional information:
- Version MkDocs 1.1
- Using Material Theme 5.0.0 RC 3
- Using PyMdown 7.0 with following extensions:
  - superfences
  - tabbed
  - magiclink
diff --git a/tests/test_extensions/test_magiclink.py b/tests/test_extensions/test_magiclink.py
new file mode 100644
index 00000000..f5b74ca3
--- /dev/null
+++ b/tests/test_extensions/test_magiclink.py
@@ -0,0 +1,97 @@
+"""Test cases for MagicLink."""
+from .. import util
+
+
+class TestMagicLinkShortner(util.MdCase):
+    """Test cases for repo link shortening."""
+
+    extension = [
+        'pymdownx.magiclink',
+    ]
+
+    extension_configs = {
+        'pymdownx.magiclink': {
+            'repo_url_shortener': True
+        }
+    }
+
+    def test_user(self):
+        """Test user shortening."""
+
+        # Test #! original syntax
+        self.check_markdown(
+            r'https://github.com/facelessuser',
+            r'<p><a class="magiclink magiclink-github magiclink-mention" href="https://github.com/facelessuser" title="GitHub User: facelessuser">@facelessuser</a></p>'  # noqa: E501
+        )
+
+    def test_repo(self):
+        """Test repository shortening."""
+
+        # Test #! original syntax
+        self.check_markdown(
+            r'https://github.com/facelessuser/pymdown-extensions',
+            r'<p><a class="magiclink magiclink-github magiclink-repository" href="https://github.com/facelessuser/pymdown-extensions" title="GitHub Repository: facelessuser/pymdown-extensions">facelessuser/pymdown-extensions</a></p>'  # noqa: E501
+        )
+
+    def test_no_social(self):
+        """Test that social shortening does not happen."""
+
+        self.check_markdown(
+            r'https://twitter.com/someuser',
+            r'<p><a href="https://twitter.com/someuser">https://twitter.com/someuser</a></p>'
+        )
+
+    def test_excluded_user(self):
+        """Test excluded."""
+
+        self.check_markdown(
+            r'https://github.com/support',
+            r'<p><a href="https://github.com/support">https://github.com/support</a></p>'
+        )
+
+    def test_excluded_user_repo(self):
+        """Test excluded."""
+
+        self.check_markdown(
+            r'https://github.com/support/repo',
+            r'<p><a href="https://github.com/support/repo">https://github.com/support/repo</a></p>'
+        )
+
+
+class TestMagicLinkShortnerSocial(util.MdCase):
+    """Test cases for social link shortener."""
+
+    extension = [
+        'pymdownx.magiclink',
+    ]
+
+    extension_configs = {
+        'pymdownx.magiclink': {
+            'social_url_shortener': True
+        }
+    }
+
+    def test_user(self):
+        """Test user shortening."""
+
+        # Test #! original syntax
+        self.check_markdown(
+            r'https://twitter.com/someuser',
+            r'<p><a class="magiclink magiclink-twitter magiclink-mention" href="https://twitter.com/someuser" title="Twitter User: someuser">@someuser</a></p>'  # noqa: E501
+        )
+
+    def test_no_repo(self):
+        """Test that repository shortening does not happen."""
+
+        self.check_markdown(
+            r'https://github.com/facelessuser',
+            r'<p><a href="https://github.com/facelessuser">https://github.com/facelessuser</a></p>'
+        )
+
+    def test_excluded(self):
+        """Test excluded user."""
+
+        self.check_markdown(
+            r'https://twitter.com/home',
+            r'<p><a href="https://twitter.com/home">https://twitter.com/home</a></p>'
+        )

pip install -e .[dev]
parse_log_pytest
requirements.txt
pytest pytest-cov pytest-xdist pytest-mock pytest-asyncio pyyaml
apt-get update apt-get install -y gcc
3.9
requirements/project.txt
pytest --no-header -rA --tb=line --color=no -p no:cacheprovider -W ignore::DeprecationWarning
coverage==7.8.0
exceptiongroup==1.2.2
execnet==2.1.1
importlib_metadata==8.6.1
iniconfig==2.1.0
Markdown==3.7
packaging==24.2
pluggy==1.5.0
-e git+https://github.com/facelessuser/pymdown-extensions.git@8454c9de5aea2ed1b8b9df0d19990ce0c61cb4f9#egg=pymdown_extensions
pytest==8.3.5
pytest-asyncio==0.26.0
pytest-cov==6.0.0
pytest-mock==3.14.0
pytest-xdist==3.6.1
PyYAML==6.0.2
tomli==2.2.1
typing_extensions==4.13.0
zipp==3.21.0

name: pymdown-extensions
channels:
  - defaults
  - https://repo.anaconda.com/pkgs/main
  - https://repo.anaconda.com/pkgs/r
  - conda-forge
dependencies:
  - _libgcc_mutex=0.1=main
  - _openmp_mutex=5.1=1_gnu
  - ca-certificates=2025.2.25=h06a4308_0
  - ld_impl_linux-64=2.40=h12ee557_0
  - libffi=3.4.4=h6a678d5_1
  - libgcc-ng=11.2.0=h1234567_1
  - libgomp=11.2.0=h1234567_1
  - libstdcxx-ng=11.2.0=h1234567_1
  - ncurses=6.4=h6a678d5_0
  - openssl=3.0.16=h5eee18b_0
  - pip=25.0=py39h06a4308_0
  - python=3.9.21=he870216_1
  - readline=8.2=h5eee18b_0
  - setuptools=75.8.0=py39h06a4308_0
  - sqlite=3.45.3=h5eee18b_0
  - tk=8.6.14=h39e8969_0
  - tzdata=2025a=h04d1e81_0
  - wheel=0.45.1=py39h06a4308_0
  - xz=5.6.4=h5eee18b_1
  - zlib=1.2.13=h5eee18b_1
  - pip:
      - coverage==7.8.0
      - exceptiongroup==1.2.2
      - execnet==2.1.1
      - importlib-metadata==8.6.1
      - iniconfig==2.1.0
      - markdown==3.7
      - packaging==24.2
      - pluggy==1.5.0
      - pytest==8.3.5
      - pytest-asyncio==0.26.0
      - pytest-cov==6.0.0
      - pytest-mock==3.14.0
      - pytest-xdist==3.6.1
      - pyyaml==6.0.2
      - tomli==2.2.1
      - typing-extensions==4.13.0
      - zipp==3.21.0
prefix: /opt/conda/envs/pymdown-extensions

tests/test_extensions/test_magiclink.py::TestMagicLinkShortner::test_repo tests/test_extensions/test_magiclink.py::TestMagicLinkShortner::test_user tests/test_extensions/test_magiclink.py::TestMagicLinkShortnerSocial::test_excluded tests/test_extensions/test_magiclink.py::TestMagicLinkShortnerSocial::test_no_repo tests/test_extensions/test_magiclink.py::TestMagicLinkShortnerSocial::test_user
tests/test_extensions/test_magiclink.py::TestMagicLinkShortner::test_excluded_user tests/test_extensions/test_magiclink.py::TestMagicLinkShortner::test_excluded_user_repo tests/test_extensions/test_magiclink.py::TestMagicLinkShortner::test_no_social
pymdownx/magiclink.py docs/src/mkdocs.yml docs/src/markdown/about/changelog.md docs/src/markdown/extensions/magiclink.md docs/theme/assets/pymdownx-extras/extra-8d532f7233.css mkdocs.yml docs/theme/assets/pymdownx-extras/extra-9dc654756b.css
pymdownx/magiclink.py docs/src/mkdocs.yml docs/src/markdown/about/changelog.md docs/src/markdown/extensions/magiclink.md docs/theme/assets/pymdownx-extras/extra-8d532f7233.css mkdocs.yml docs/theme/assets/pymdownx-extras/extra-9dc654756b.css