diff --git a/.nojekyll b/.nojekyll new file mode 100644 index 0000000..e69de29 diff --git a/404.html b/404.html new file mode 100644 index 0000000..f5a4a1a --- /dev/null +++ b/404.html @@ -0,0 +1,13 @@ + + + + + +Page Not Found | RefTree + + + + +
Skip to main content

Page Not Found

We could not find what you were looking for.

Please contact the owner of the site that linked you to the original URL and let them know their link is broken.

+ + \ No newline at end of file diff --git a/Guide.md b/Guide.md deleted file mode 100644 index 2bb29c7..0000000 --- a/Guide.md +++ /dev/null @@ -1,220 +0,0 @@ -# Guide - -## Trees - -This library renders diagrams based on a simple data representation called -[`RefTree`](https://github.com/stanch/reftree/blob/master/core/src/main/scala/reftree/core/RefTree.scala). -Essentially, a `RefTree` denotes either an object (`AnyRef`) with a number of fields, -or a primitive (`AnyVal`). - -To render a value of type `A`, you will need an implicit instance of `ToRefTree[A]`. -For many Scala collections, as well as case classes, no extra work is needed, -as these instances are readily available or generated on the fly. - -You can configure the automatically generated instances like so: - -```mdoc:silent -import reftree.core.ToRefTree - -case class Tree(size: Int, value: Int, children: List[Tree]) - -implicit val treeDerivationConfig = (ToRefTree.DerivationConfig[Tree] - .rename("MyTree") // display as “MyTree” - .tweakField("size", _.withName("s")) // label the field “s”, instead of “size” - .tweakField("value", _.withTreeHighlight(true)) // highlight the value - .tweakField("children", _.withoutName)) // do not label the “children” field - -implicitly[ToRefTree[Tree]] // auto-derivation will use the configuration above -``` - -For something custom, manual derivation is the way to go, for example: - -```mdoc:silent -import reftree.core._ - -implicit def treeInstance: ToRefTree[Tree] = ToRefTree[Tree] { tree => - RefTree.Ref(tree, Seq( - // display the size as a hexadecimal number (why not?) - RefTree.Val.formatted(tree.size)(_.toHexString).toField.withName("s"), - // highlight the value - tree.value.refTree.withHighlight(true).toField.withName("value"), - // do not label the children - tree.children.refTree.toField - )).rename("MyTree") // change the name displayed for the class -} -``` - -## Renderers - -To render diagrams and animations, you will need a `Renderer`. - -**For JVM:** - -```mdoc:invisible -val ImagePath = "site/target/tut/images" -``` - -```mdoc:silent -import reftree.render._ -import reftree.diagram._ -import java.nio.file.Paths - -val renderer = Renderer( - renderingOptions = RenderingOptions(density = 75), - directory = Paths.get(ImagePath, "guide") -) -``` - -You can also pass a `format` parameter as a String to the `Renderer` constructor -to specify the format you require. The default is `png`. You can specify any -file type supported by `dot -T`. - -**For Scala.js:** - -```scala -import reftree.render._ -import reftree.diagram._ - -val renderer = Renderer( - renderingOptions = RenderingOptions(density = 75) -) -``` - -There are two ways to use renderers: - -**JVM** - -```mdoc:silent -import scala.collection.immutable.Queue - -// Option 1: using the `render` method -renderer.render("queue", Diagram(Queue(1))) - -// Option 2: using syntactic sugar -import renderer._ -Diagram(Queue(1)).render("queue") -``` - -**Scala.js** - -```scala -import org.scalajs.dom - -// Option 1: using the `render` method -renderer.render(dom.document.getElementById("diagram"), Diagram(List(1))) - -// Option 2: using syntactic sugar -import renderer._ -Diagram(List(1)).render(dom.document.getElementById("diagram")) -``` - -You can set various options, for example: - -```mdoc:silent -// using the `render` method -renderer.tweakRendering(_.withVerticalSpacing(2)).render("queue", Diagram(Queue(1))) - -// using syntactic sugar -Diagram(Queue(1)).render("queue", _.withVerticalSpacing(2)) -``` - -## Diagrams - -Diagrams can be created and combined into bigger diagrams using the following API: - -```mdoc:silent -// no caption -Diagram(Queue(1)).render("caption-none") -``` - -![caption-none](images/guide/caption-none.png) - -```mdoc:silent -// automatically set caption to "Queue(1) :+ 2" -Diagram.sourceCodeCaption(Queue(1) :+ 2).render("caption-source") -``` - -![caption-source](images/guide/caption-source.png) - -```mdoc:silent -// use toString to get the caption, i.e. "Queue(1, 2)" -Diagram.toStringCaption(Queue(1) :+ 2).render("caption-tostring") -``` - -![caption-tostring](images/guide/caption-tostring.png) - -```mdoc:silent -// merge two diagrams, set captions manually -(Diagram(Queue(1)).withCaption("one") + Diagram(Queue(2)).withCaption("two")).render("one-two") -``` - -![one-two](images/guide/one-two.png) - -```mdoc:silent -// isolate each diagram in its own namespace (graph nodes will not be shared across them) -(Diagram(Queue(1)).toNamespace("one") + Diagram(Queue(2)).toNamespace("two")).render("namespaced") -``` - -![namespaced](images/guide/namespaced.png) - -## Animations - -Animation is essentially a sequence of diagrams, which can be rendered to an animated GIF. -The simplest way to create an animation is to use the builder API: - -```mdoc:silent -(Animation - .startWith(Queue(1)) - .iterateWithIndex(2)((queue, i) => queue :+ (i + 1)) - .build() - .render("animation-simple")) -``` - -![animation-simple](images/guide/animation-simple.gif) - -You can also configure how the diagram for each frame is produced: - -```mdoc:silent -(Animation - .startWith(Queue(1)) - .iterateWithIndex(2)((queue, i) => queue :+ (i + 1)) - .build(Diagram(_).withCaption("My Queue").withColor(2)) - .render("animation-captioned-red")) -``` - -![animation-captioned-red](images/guide/animation-captioned-red.gif) - -Note that by default the library will try to reduce the average movement of -all tree nodes across animation frames. Sometimes you want to “anchor” -the root of the data structure instead, to force it to stay still -while everything else is moving. You can achieve this via `withAnchor` method: - -```mdoc:silent -(Animation - .startWith(Queue(1)) - .iterateWithIndex(2)((queue, i) => queue :+ (i + 1)) - .build(Diagram(_).withAnchor("queue").withCaption("This node is anchored!")) - .render("animation-anchored")) -``` - -![animation-anchored](images/guide/animation-anchored.gif) - -Finally, animations can be combined in sequence or in parallel, for example: - -```mdoc:silent -val queue1 = (Animation - .startWith(Queue(1)) - .iterateWithIndex(2)((queue, i) => queue :+ (i + 1)) - .build() - .toNamespace("one")) - -val queue2 = (Animation - .startWith(Queue(10)) - .iterateWithIndex(2)((queue, i) => queue :+ (10 * (i + 1))) - .build() - .toNamespace("two")) - -(queue1 + queue2).render("animation-parallel") -``` - -![animation-parallel](images/guide/animation-parallel.gif) diff --git a/JsDemo.md b/JsDemo.md deleted file mode 100644 index 4a96432..0000000 --- a/JsDemo.md +++ /dev/null @@ -1,16 +0,0 @@ -# Scala.js demo - -Here is an animation of elements being appended to a list, -rendered in your browser! - -```scala -val renderer = Renderer() -import renderer._ - -Animation.startWith(List(1)).iterate(_ :+ 2, _ :+ 3, _ :+ 4).build() - .render(dom.document.getElementById("animation"), tweakAnimation = _.withOnionSkinLayers(2)) -``` - -
- - diff --git a/Navigation.md b/Navigation.md deleted file mode 100644 index 38931fd..0000000 --- a/Navigation.md +++ /dev/null @@ -1,26 +0,0 @@ -# Summary - -## Documentation - -* [Overview](Overview.md) - * [Features](Overview.md#features) - * [Getting started](Overview.md#getting-started) -* [Guide](Guide.md) - * [Trees](Guide.md#trees) - * [Renderers](Guide.md#renderers) - * [Diagrams](Guide.md#diagrams) - * [Animations](Guide.md#animations) -* [Scala API](https://stanch.github.io/reftree/api/jvm/index.html) -* [Scala.js API](https://stanch.github.io/reftree/api/js/index.html) - -## Useful links - -* [GitHub page](https://github.com/stanch/reftree) -* [Gitter chat](https://gitter.im/stanch/reftree) - -## Talks & demos - -* [Talks](Talks.md) - * [Unzipping immutability](talks/Immutability.md) - * [Visualize your data structures!](talks/Visualize.md) -* [Scala.js demo](JsDemo.md) diff --git a/Overview.md b/Overview.md deleted file mode 100644 index 895a335..0000000 --- a/Overview.md +++ /dev/null @@ -1,103 +0,0 @@ -# Overview - -Behold, automatically generated diagrams and animations for your data! -`reftree` is a *Scala* and *Scala.js* library that allows you to -create data structure visualizations with very little effort. - -![teaser](images/teaser.gif) - -There are a few ways you can use `reftree`: - -* [improving the documentation of your projects](https://stanch.github.io/zipper/); -* [live-coding demos and talks](Talks.md); -* exploring how things work; -* anywhere you need diagrams of your Scala data structures. - -## Features - -* Pre-made visualizations of many standard collections: - [lists, queues, vectors, etc](talks/Immutability.html#immutable-data-structures). - - ![lists](images/immutability/data/lists.png) - -* Automatic visualization of case classes (using - [shapeless](https://github.com/milessabin/shapeless/wiki/Feature-overview:-shapeless-2.0.0#generic-representation-of-sealed-families-of-case-classes)). - - ```scala - case class Employee( - name: String, - salary: Long - ) - - case class Startup( - name: String, - founder: Employee, - team: List[Employee] - ) - ``` - - ![startup](images/immutability/lenses/startup.png) - -* Static diagrams as well as animations can be generated. -* Hassle-free captions (using [sourcecode](https://github.com/lihaoyi/sourcecode)). -* Scala.js support (*experimental*). - -## Getting Started - -To use this library you will need to have [GraphViz](http://www.graphviz.org/) installed (and have `dot` on your `PATH`). -I also recommend to install the [Source Code Pro](https://github.com/adobe-fonts/source-code-pro) fonts (regular and *italic*), -as I find they look the best among the free options and therefore are used by default. - -For viewing PNG and animated GIF on Linux I recommend `eog` and `gifview` respectively. - -### Interactive usage - -To jump into an interactive session: - -``` -$ git clone https://github.com/stanch/reftree -$ cd reftree -$ sbt demo -@ render(List(1, 2, 3)) -// display diagram.png with your favorite image viewer -``` - -### Including in your project - -You can depend on the library by adding these lines to your `build.sbt`: - -[![Maven metadata URI](https://img.shields.io/maven-metadata/v/http/central.maven.org/maven2/io/github/stanch/reftree_2.12/maven-metadata.xml.svg)](https://mvnrepository.com/artifact/io.github.stanch/reftree) - -```scala -// JVM -libraryDependencies += "io.github.stanch" %% "reftree" % "latest-version" - -// Scala.js -libraryDependencies += "io.github.stanch" %%% "reftree" % "latest-version" -``` - -### Minimal example - -```mdoc:invisible -val ImagePath = "site/target/mdoc/images" -``` - -```mdoc:silent -import reftree.render.{Renderer, RenderingOptions} -import reftree.diagram.Diagram -import java.nio.file.Paths - -val renderer = Renderer( - renderingOptions = RenderingOptions(density = 75), - directory = Paths.get(ImagePath, "overview") -) -import renderer._ - -case class Person(firstName: String, age: Int) - -Diagram.sourceCodeCaption(Person("Bob", 42)).render("example") -``` - -![bob](images/overview/example.png) - -For more details, please refer to the [guide](Guide.md). diff --git a/Talks.md b/Talks.md deleted file mode 100644 index 6851112..0000000 --- a/Talks.md +++ /dev/null @@ -1,21 +0,0 @@ -# Talks - -## [Unzipping Immutability](talks/Immutability.md) - -This talk takes advantage of `reftree` to observe several immutable data structures in action -and uncover their inner beauty. Having surfaced immutability’s crucial tricks, -we move our focus to lenses and zippers — handy tools that combine -the convenience of the “mutable world” with the expressiveness of functional programming. - -![queue](images/queue.gif) - -## [Visualize your data structures!](talks/Visualize.md) - -The above talk focused on immutable data and various ways it can be manipulated. - -This time I would like to take you on a journey deep inside `reftree` itself, -so that we can see how some of these techniques and concepts can be applied... -to produce visualizations of themselves — using one of my favorite `reftree` -features: animations. - -![reftree](images/visualize/inside/reftree.png) diff --git a/_layouts/layout.html b/_layouts/layout.html deleted file mode 100644 index a60487b..0000000 --- a/_layouts/layout.html +++ /dev/null @@ -1,7 +0,0 @@ -{% extends template.self %} - -{% block head %} - {{ super() }} - - -{% endblock %} diff --git a/assets/css/styles.70297ef0.css b/assets/css/styles.70297ef0.css new file mode 100644 index 0000000..ec347ae --- /dev/null +++ b/assets/css/styles.70297ef0.css @@ -0,0 +1 @@ +.col,.container{padding:0 var(--ifm-spacing-horizontal);width:100%}.markdown>h2,.markdown>h3,.markdown>h4,.markdown>h5,.markdown>h6{margin-bottom:calc(var(--ifm-heading-vertical-rhythm-bottom)*var(--ifm-leading))}.markdown li,body{word-wrap:break-word}body,ol ol,ol ul,ul ol,ul ul{margin:0}pre,table{overflow:auto}blockquote,pre{margin:0 0 var(--ifm-spacing-vertical)}.breadcrumbs__link,.button{transition-timing-function:var(--ifm-transition-timing-default)}.button,code{vertical-align:middle}.button--outline.button--active,.button--outline:active,.button--outline:hover,:root{--ifm-button-color:var(--ifm-font-color-base-inverse)}.menu__link:hover,a{transition:color var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.navbar--dark,:root{--ifm-navbar-link-hover-color:var(--ifm-color-primary)}.menu,.navbar-sidebar{overflow-x:hidden}:root,html[data-theme=dark]{--ifm-color-emphasis-500:var(--ifm-color-gray-500)}.toggleButton_gllP,html{-webkit-tap-highlight-color:transparent}.clean-list,.containsTaskList_mC6p,.details_lb9f>summary,.dropdown__menu,.menu__list{list-style:none}:root{--ifm-color-scheme:light;--ifm-dark-value:10%;--ifm-darker-value:15%;--ifm-darkest-value:30%;--ifm-light-value:15%;--ifm-lighter-value:30%;--ifm-lightest-value:50%;--ifm-contrast-background-value:90%;--ifm-contrast-foreground-value:70%;--ifm-contrast-background-dark-value:70%;--ifm-contrast-foreground-dark-value:90%;--ifm-color-primary:#3578e5;--ifm-color-secondary:#ebedf0;--ifm-color-success:#00a400;--ifm-color-info:#54c7ec;--ifm-color-warning:#ffba00;--ifm-color-danger:#fa383e;--ifm-color-primary-dark:#306cce;--ifm-color-primary-darker:#2d66c3;--ifm-color-primary-darkest:#2554a0;--ifm-color-primary-light:#538ce9;--ifm-color-primary-lighter:#72a1ed;--ifm-color-primary-lightest:#9abcf2;--ifm-color-primary-contrast-background:#ebf2fc;--ifm-color-primary-contrast-foreground:#102445;--ifm-color-secondary-dark:#d4d5d8;--ifm-color-secondary-darker:#c8c9cc;--ifm-color-secondary-darkest:#a4a6a8;--ifm-color-secondary-light:#eef0f2;--ifm-color-secondary-lighter:#f1f2f5;--ifm-color-secondary-lightest:#f5f6f8;--ifm-color-secondary-contrast-background:#fdfdfe;--ifm-color-secondary-contrast-foreground:#474748;--ifm-color-success-dark:#009400;--ifm-color-success-darker:#008b00;--ifm-color-success-darkest:#007300;--ifm-color-success-light:#26b226;--ifm-color-success-lighter:#4dbf4d;--ifm-color-success-lightest:#80d280;--ifm-color-success-contrast-background:#e6f6e6;--ifm-color-success-contrast-foreground:#003100;--ifm-color-info-dark:#4cb3d4;--ifm-color-info-darker:#47a9c9;--ifm-color-info-darkest:#3b8ba5;--ifm-color-info-light:#6ecfef;--ifm-color-info-lighter:#87d8f2;--ifm-color-info-lightest:#aae3f6;--ifm-color-info-contrast-background:#eef9fd;--ifm-color-info-contrast-foreground:#193c47;--ifm-color-warning-dark:#e6a700;--ifm-color-warning-darker:#d99e00;--ifm-color-warning-darkest:#b38200;--ifm-color-warning-light:#ffc426;--ifm-color-warning-lighter:#ffcf4d;--ifm-color-warning-lightest:#ffdd80;--ifm-color-warning-contrast-background:#fff8e6;--ifm-color-warning-contrast-foreground:#4d3800;--ifm-color-danger-dark:#e13238;--ifm-color-danger-darker:#d53035;--ifm-color-danger-darkest:#af272b;--ifm-color-danger-light:#fb565b;--ifm-color-danger-lighter:#fb7478;--ifm-color-danger-lightest:#fd9c9f;--ifm-color-danger-contrast-background:#ffebec;--ifm-color-danger-contrast-foreground:#4b1113;--ifm-color-white:#fff;--ifm-color-black:#000;--ifm-color-gray-0:var(--ifm-color-white);--ifm-color-gray-100:#f5f6f7;--ifm-color-gray-200:#ebedf0;--ifm-color-gray-300:#dadde1;--ifm-color-gray-400:#ccd0d5;--ifm-color-gray-500:#bec3c9;--ifm-color-gray-600:#8d949e;--ifm-color-gray-700:#606770;--ifm-color-gray-800:#444950;--ifm-color-gray-900:#1c1e21;--ifm-color-gray-1000:var(--ifm-color-black);--ifm-color-emphasis-0:var(--ifm-color-gray-0);--ifm-color-emphasis-100:var(--ifm-color-gray-100);--ifm-color-emphasis-200:var(--ifm-color-gray-200);--ifm-color-emphasis-300:var(--ifm-color-gray-300);--ifm-color-emphasis-400:var(--ifm-color-gray-400);--ifm-color-emphasis-600:var(--ifm-color-gray-600);--ifm-color-emphasis-700:var(--ifm-color-gray-700);--ifm-color-emphasis-800:var(--ifm-color-gray-800);--ifm-color-emphasis-900:var(--ifm-color-gray-900);--ifm-color-emphasis-1000:var(--ifm-color-gray-1000);--ifm-color-content:var(--ifm-color-emphasis-900);--ifm-color-content-inverse:var(--ifm-color-emphasis-0);--ifm-color-content-secondary:#525860;--ifm-background-color:#0000;--ifm-background-surface-color:var(--ifm-color-content-inverse);--ifm-global-border-width:1px;--ifm-global-radius:0.4rem;--ifm-hover-overlay:#0000000d;--ifm-font-color-base:var(--ifm-color-content);--ifm-font-color-base-inverse:var(--ifm-color-content-inverse);--ifm-font-color-secondary:var(--ifm-color-content-secondary);--ifm-font-family-base:system-ui,-apple-system,Segoe UI,Roboto,Ubuntu,Cantarell,Noto Sans,sans-serif,BlinkMacSystemFont,"Segoe UI",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";--ifm-font-family-monospace:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--ifm-font-size-base:100%;--ifm-font-weight-light:300;--ifm-font-weight-normal:400;--ifm-font-weight-semibold:500;--ifm-font-weight-bold:700;--ifm-font-weight-base:var(--ifm-font-weight-normal);--ifm-line-height-base:1.65;--ifm-global-spacing:1rem;--ifm-spacing-vertical:var(--ifm-global-spacing);--ifm-spacing-horizontal:var(--ifm-global-spacing);--ifm-transition-fast:200ms;--ifm-transition-slow:400ms;--ifm-transition-timing-default:cubic-bezier(0.08,0.52,0.52,1);--ifm-global-shadow-lw:0 1px 2px 0 #0000001a;--ifm-global-shadow-md:0 5px 40px #0003;--ifm-global-shadow-tl:0 12px 28px 0 #0003,0 2px 4px 0 #0000001a;--ifm-z-index-dropdown:100;--ifm-z-index-fixed:200;--ifm-z-index-overlay:400;--ifm-container-width:1140px;--ifm-container-width-xl:1320px;--ifm-code-background:#f6f7f8;--ifm-code-border-radius:var(--ifm-global-radius);--ifm-code-font-size:90%;--ifm-code-padding-horizontal:0.1rem;--ifm-code-padding-vertical:0.1rem;--ifm-pre-background:var(--ifm-code-background);--ifm-pre-border-radius:var(--ifm-code-border-radius);--ifm-pre-color:inherit;--ifm-pre-line-height:1.45;--ifm-pre-padding:1rem;--ifm-heading-color:inherit;--ifm-heading-margin-top:0;--ifm-heading-margin-bottom:var(--ifm-spacing-vertical);--ifm-heading-font-family:var(--ifm-font-family-base);--ifm-heading-font-weight:var(--ifm-font-weight-bold);--ifm-heading-line-height:1.25;--ifm-h1-font-size:2rem;--ifm-h2-font-size:1.5rem;--ifm-h3-font-size:1.25rem;--ifm-h4-font-size:1rem;--ifm-h5-font-size:0.875rem;--ifm-h6-font-size:0.85rem;--ifm-image-alignment-padding:1.25rem;--ifm-leading-desktop:1.25;--ifm-leading:calc(var(--ifm-leading-desktop)*1rem);--ifm-list-left-padding:2rem;--ifm-list-margin:1rem;--ifm-list-item-margin:0.25rem;--ifm-list-paragraph-margin:1rem;--ifm-table-cell-padding:0.75rem;--ifm-table-background:#0000;--ifm-table-stripe-background:#00000008;--ifm-table-border-width:1px;--ifm-table-border-color:var(--ifm-color-emphasis-300);--ifm-table-head-background:inherit;--ifm-table-head-color:inherit;--ifm-table-head-font-weight:var(--ifm-font-weight-bold);--ifm-table-cell-color:inherit;--ifm-link-color:var(--ifm-color-primary);--ifm-link-decoration:none;--ifm-link-hover-color:var(--ifm-link-color);--ifm-link-hover-decoration:underline;--ifm-paragraph-margin-bottom:var(--ifm-leading);--ifm-blockquote-font-size:var(--ifm-font-size-base);--ifm-blockquote-border-left-width:2px;--ifm-blockquote-padding-horizontal:var(--ifm-spacing-horizontal);--ifm-blockquote-padding-vertical:0;--ifm-blockquote-shadow:none;--ifm-blockquote-color:var(--ifm-color-emphasis-800);--ifm-blockquote-border-color:var(--ifm-color-emphasis-300);--ifm-hr-background-color:var(--ifm-color-emphasis-500);--ifm-hr-height:1px;--ifm-hr-margin-vertical:1.5rem;--ifm-scrollbar-size:7px;--ifm-scrollbar-track-background-color:#f1f1f1;--ifm-scrollbar-thumb-background-color:silver;--ifm-scrollbar-thumb-hover-background-color:#a7a7a7;--ifm-alert-background-color:inherit;--ifm-alert-border-color:inherit;--ifm-alert-border-radius:var(--ifm-global-radius);--ifm-alert-border-width:0px;--ifm-alert-border-left-width:5px;--ifm-alert-color:var(--ifm-font-color-base);--ifm-alert-padding-horizontal:var(--ifm-spacing-horizontal);--ifm-alert-padding-vertical:var(--ifm-spacing-vertical);--ifm-alert-shadow:var(--ifm-global-shadow-lw);--ifm-avatar-intro-margin:1rem;--ifm-avatar-intro-alignment:inherit;--ifm-avatar-photo-size:3rem;--ifm-badge-background-color:inherit;--ifm-badge-border-color:inherit;--ifm-badge-border-radius:var(--ifm-global-radius);--ifm-badge-border-width:var(--ifm-global-border-width);--ifm-badge-color:var(--ifm-color-white);--ifm-badge-padding-horizontal:calc(var(--ifm-spacing-horizontal)*0.5);--ifm-badge-padding-vertical:calc(var(--ifm-spacing-vertical)*0.25);--ifm-breadcrumb-border-radius:1.5rem;--ifm-breadcrumb-spacing:0.5rem;--ifm-breadcrumb-color-active:var(--ifm-color-primary);--ifm-breadcrumb-item-background-active:var(--ifm-hover-overlay);--ifm-breadcrumb-padding-horizontal:0.8rem;--ifm-breadcrumb-padding-vertical:0.4rem;--ifm-breadcrumb-size-multiplier:1;--ifm-breadcrumb-separator:url('data:image/svg+xml;utf8,');--ifm-breadcrumb-separator-filter:none;--ifm-breadcrumb-separator-size:0.5rem;--ifm-breadcrumb-separator-size-multiplier:1.25;--ifm-button-background-color:inherit;--ifm-button-border-color:var(--ifm-button-background-color);--ifm-button-border-width:var(--ifm-global-border-width);--ifm-button-font-weight:var(--ifm-font-weight-bold);--ifm-button-padding-horizontal:1.5rem;--ifm-button-padding-vertical:0.375rem;--ifm-button-size-multiplier:1;--ifm-button-transition-duration:var(--ifm-transition-fast);--ifm-button-border-radius:calc(var(--ifm-global-radius)*var(--ifm-button-size-multiplier));--ifm-button-group-spacing:2px;--ifm-card-background-color:var(--ifm-background-surface-color);--ifm-card-border-radius:calc(var(--ifm-global-radius)*2);--ifm-card-horizontal-spacing:var(--ifm-global-spacing);--ifm-card-vertical-spacing:var(--ifm-global-spacing);--ifm-toc-border-color:var(--ifm-color-emphasis-300);--ifm-toc-link-color:var(--ifm-color-content-secondary);--ifm-toc-padding-vertical:0.5rem;--ifm-toc-padding-horizontal:0.5rem;--ifm-dropdown-background-color:var(--ifm-background-surface-color);--ifm-dropdown-font-weight:var(--ifm-font-weight-semibold);--ifm-dropdown-link-color:var(--ifm-font-color-base);--ifm-dropdown-hover-background-color:var(--ifm-hover-overlay);--ifm-footer-background-color:var(--ifm-color-emphasis-100);--ifm-footer-color:inherit;--ifm-footer-link-color:var(--ifm-color-emphasis-700);--ifm-footer-link-hover-color:var(--ifm-color-primary);--ifm-footer-link-horizontal-spacing:0.5rem;--ifm-footer-padding-horizontal:calc(var(--ifm-spacing-horizontal)*2);--ifm-footer-padding-vertical:calc(var(--ifm-spacing-vertical)*2);--ifm-footer-title-color:inherit;--ifm-footer-logo-max-width:min(30rem,90vw);--ifm-hero-background-color:var(--ifm-background-surface-color);--ifm-hero-text-color:var(--ifm-color-emphasis-800);--ifm-menu-color:var(--ifm-color-emphasis-700);--ifm-menu-color-active:var(--ifm-color-primary);--ifm-menu-color-background-active:var(--ifm-hover-overlay);--ifm-menu-color-background-hover:var(--ifm-hover-overlay);--ifm-menu-link-padding-horizontal:0.75rem;--ifm-menu-link-padding-vertical:0.375rem;--ifm-menu-link-sublist-icon:url('data:image/svg+xml;utf8,');--ifm-menu-link-sublist-icon-filter:none;--ifm-navbar-background-color:var(--ifm-background-surface-color);--ifm-navbar-height:3.75rem;--ifm-navbar-item-padding-horizontal:0.75rem;--ifm-navbar-item-padding-vertical:0.25rem;--ifm-navbar-link-color:var(--ifm-font-color-base);--ifm-navbar-link-active-color:var(--ifm-link-color);--ifm-navbar-padding-horizontal:var(--ifm-spacing-horizontal);--ifm-navbar-padding-vertical:calc(var(--ifm-spacing-vertical)*0.5);--ifm-navbar-shadow:var(--ifm-global-shadow-lw);--ifm-navbar-search-input-background-color:var(--ifm-color-emphasis-200);--ifm-navbar-search-input-color:var(--ifm-color-emphasis-800);--ifm-navbar-search-input-placeholder-color:var(--ifm-color-emphasis-500);--ifm-navbar-search-input-icon:url('data:image/svg+xml;utf8,');--ifm-navbar-sidebar-width:83vw;--ifm-pagination-border-radius:var(--ifm-global-radius);--ifm-pagination-color-active:var(--ifm-color-primary);--ifm-pagination-font-size:1rem;--ifm-pagination-item-active-background:var(--ifm-hover-overlay);--ifm-pagination-page-spacing:0.2em;--ifm-pagination-padding-horizontal:calc(var(--ifm-spacing-horizontal)*1);--ifm-pagination-padding-vertical:calc(var(--ifm-spacing-vertical)*0.25);--ifm-pagination-nav-border-radius:var(--ifm-global-radius);--ifm-pagination-nav-color-hover:var(--ifm-color-primary);--ifm-pills-color-active:var(--ifm-color-primary);--ifm-pills-color-background-active:var(--ifm-hover-overlay);--ifm-pills-spacing:0.125rem;--ifm-tabs-color:var(--ifm-font-color-secondary);--ifm-tabs-color-active:var(--ifm-color-primary);--ifm-tabs-color-active-border:var(--ifm-tabs-color-active);--ifm-tabs-padding-horizontal:1rem;--ifm-tabs-padding-vertical:1rem;--docusaurus-progress-bar-color:var(--ifm-color-primary);--ifm-color-primary:#2e8555;--ifm-color-primary-dark:#29784c;--ifm-color-primary-darker:#277148;--ifm-color-primary-darkest:#205d3b;--ifm-color-primary-light:#33925d;--ifm-color-primary-lighter:#359962;--ifm-color-primary-lightest:#3cad6e;--ifm-code-font-size:95%;--docusaurus-highlighted-code-line-bg:#0000001a;--docusaurus-announcement-bar-height:auto;--docusaurus-tag-list-border:var(--ifm-color-emphasis-300);--docusaurus-collapse-button-bg:#0000;--docusaurus-collapse-button-bg-hover:#0000001a;--doc-sidebar-width:300px;--doc-sidebar-hidden-width:30px}.badge--danger,.badge--info,.badge--primary,.badge--secondary,.badge--success,.badge--warning{--ifm-badge-border-color:var(--ifm-badge-background-color)}.button--link,.button--outline{--ifm-button-background-color:#0000}*{box-sizing:border-box}html{background-color:var(--ifm-background-color);color:var(--ifm-font-color-base);color-scheme:var(--ifm-color-scheme);font:var(--ifm-font-size-base)/var(--ifm-line-height-base) var(--ifm-font-family-base);-webkit-font-smoothing:antialiased;text-rendering:optimizelegibility;-webkit-text-size-adjust:100%;text-size-adjust:100%}iframe{border:0;color-scheme:auto}.container{margin:0 auto;max-width:var(--ifm-container-width)}.container--fluid{max-width:inherit}.row{display:flex;flex-wrap:wrap;margin:0 calc(var(--ifm-spacing-horizontal)*-1)}.margin-bottom--none,.margin-vert--none,.markdown>:last-child{margin-bottom:0!important}.margin-top--none,.margin-vert--none{margin-top:0!important}.row--no-gutters{margin-left:0;margin-right:0}.margin-horiz--none,.margin-right--none{margin-right:0!important}.row--no-gutters>.col{padding-left:0;padding-right:0}.row--align-top{align-items:flex-start}.row--align-bottom{align-items:flex-end}.menuExternalLink_NmtK,.row--align-center{align-items:center}.row--align-stretch{align-items:stretch}.row--align-baseline{align-items:baseline}.col{--ifm-col-width:100%;flex:1 0;margin-left:0;max-width:var(--ifm-col-width)}.padding-bottom--none,.padding-vert--none{padding-bottom:0!important}.padding-top--none,.padding-vert--none{padding-top:0!important}.padding-horiz--none,.padding-left--none{padding-left:0!important}.padding-horiz--none,.padding-right--none{padding-right:0!important}.col[class*=col--]{flex:0 0 var(--ifm-col-width)}.col--1{--ifm-col-width:8.33333%}.col--offset-1{margin-left:8.33333%}.col--2{--ifm-col-width:16.66667%}.col--offset-2{margin-left:16.66667%}.col--3{--ifm-col-width:25%}.col--offset-3{margin-left:25%}.col--4{--ifm-col-width:33.33333%}.col--offset-4{margin-left:33.33333%}.col--5{--ifm-col-width:41.66667%}.col--offset-5{margin-left:41.66667%}.col--6{--ifm-col-width:50%}.col--offset-6{margin-left:50%}.col--7{--ifm-col-width:58.33333%}.col--offset-7{margin-left:58.33333%}.col--8{--ifm-col-width:66.66667%}.col--offset-8{margin-left:66.66667%}.col--9{--ifm-col-width:75%}.col--offset-9{margin-left:75%}.col--10{--ifm-col-width:83.33333%}.col--offset-10{margin-left:83.33333%}.col--11{--ifm-col-width:91.66667%}.col--offset-11{margin-left:91.66667%}.col--12{--ifm-col-width:100%}.col--offset-12{margin-left:100%}.margin-horiz--none,.margin-left--none{margin-left:0!important}.margin--none{margin:0!important}.margin-bottom--xs,.margin-vert--xs{margin-bottom:.25rem!important}.margin-top--xs,.margin-vert--xs{margin-top:.25rem!important}.margin-horiz--xs,.margin-left--xs{margin-left:.25rem!important}.margin-horiz--xs,.margin-right--xs{margin-right:.25rem!important}.margin--xs{margin:.25rem!important}.margin-bottom--sm,.margin-vert--sm{margin-bottom:.5rem!important}.margin-top--sm,.margin-vert--sm{margin-top:.5rem!important}.margin-horiz--sm,.margin-left--sm{margin-left:.5rem!important}.margin-horiz--sm,.margin-right--sm{margin-right:.5rem!important}.margin--sm{margin:.5rem!important}.margin-bottom--md,.margin-vert--md{margin-bottom:1rem!important}.margin-top--md,.margin-vert--md{margin-top:1rem!important}.margin-horiz--md,.margin-left--md{margin-left:1rem!important}.margin-horiz--md,.margin-right--md{margin-right:1rem!important}.margin--md{margin:1rem!important}.margin-bottom--lg,.margin-vert--lg{margin-bottom:2rem!important}.margin-top--lg,.margin-vert--lg{margin-top:2rem!important}.margin-horiz--lg,.margin-left--lg{margin-left:2rem!important}.margin-horiz--lg,.margin-right--lg{margin-right:2rem!important}.margin--lg{margin:2rem!important}.margin-bottom--xl,.margin-vert--xl{margin-bottom:5rem!important}.margin-top--xl,.margin-vert--xl{margin-top:5rem!important}.margin-horiz--xl,.margin-left--xl{margin-left:5rem!important}.margin-horiz--xl,.margin-right--xl{margin-right:5rem!important}.margin--xl{margin:5rem!important}.padding--none{padding:0!important}.padding-bottom--xs,.padding-vert--xs{padding-bottom:.25rem!important}.padding-top--xs,.padding-vert--xs{padding-top:.25rem!important}.padding-horiz--xs,.padding-left--xs{padding-left:.25rem!important}.padding-horiz--xs,.padding-right--xs{padding-right:.25rem!important}.padding--xs{padding:.25rem!important}.padding-bottom--sm,.padding-vert--sm{padding-bottom:.5rem!important}.padding-top--sm,.padding-vert--sm{padding-top:.5rem!important}.padding-horiz--sm,.padding-left--sm{padding-left:.5rem!important}.padding-horiz--sm,.padding-right--sm{padding-right:.5rem!important}.padding--sm{padding:.5rem!important}.padding-bottom--md,.padding-vert--md{padding-bottom:1rem!important}.padding-top--md,.padding-vert--md{padding-top:1rem!important}.padding-horiz--md,.padding-left--md{padding-left:1rem!important}.padding-horiz--md,.padding-right--md{padding-right:1rem!important}.padding--md{padding:1rem!important}.padding-bottom--lg,.padding-vert--lg{padding-bottom:2rem!important}.padding-top--lg,.padding-vert--lg{padding-top:2rem!important}.padding-horiz--lg,.padding-left--lg{padding-left:2rem!important}.padding-horiz--lg,.padding-right--lg{padding-right:2rem!important}.padding--lg{padding:2rem!important}.padding-bottom--xl,.padding-vert--xl{padding-bottom:5rem!important}.padding-top--xl,.padding-vert--xl{padding-top:5rem!important}.padding-horiz--xl,.padding-left--xl{padding-left:5rem!important}.padding-horiz--xl,.padding-right--xl{padding-right:5rem!important}.padding--xl{padding:5rem!important}code{background-color:var(--ifm-code-background);border:.1rem solid #0000001a;border-radius:var(--ifm-code-border-radius);font-family:var(--ifm-font-family-monospace);font-size:var(--ifm-code-font-size);padding:var(--ifm-code-padding-vertical) var(--ifm-code-padding-horizontal)}a code{color:inherit}pre{background-color:var(--ifm-pre-background);border-radius:var(--ifm-pre-border-radius);color:var(--ifm-pre-color);font:var(--ifm-code-font-size)/var(--ifm-pre-line-height) var(--ifm-font-family-monospace);padding:var(--ifm-pre-padding)}pre code{background-color:initial;border:none;font-size:100%;line-height:inherit;padding:0}kbd{background-color:var(--ifm-color-emphasis-0);border:1px solid var(--ifm-color-emphasis-400);border-radius:.2rem;box-shadow:inset 0 -1px 0 var(--ifm-color-emphasis-400);color:var(--ifm-color-emphasis-800);font:80% var(--ifm-font-family-monospace);padding:.15rem .3rem}h1,h2,h3,h4,h5,h6{color:var(--ifm-heading-color);font-family:var(--ifm-heading-font-family);font-weight:var(--ifm-heading-font-weight);line-height:var(--ifm-heading-line-height);margin:var(--ifm-heading-margin-top) 0 var(--ifm-heading-margin-bottom) 0}h1{font-size:var(--ifm-h1-font-size)}h2{font-size:var(--ifm-h2-font-size)}h3{font-size:var(--ifm-h3-font-size)}h4{font-size:var(--ifm-h4-font-size)}h5{font-size:var(--ifm-h5-font-size)}h6{font-size:var(--ifm-h6-font-size)}img{max-width:100%;max-height:400px;width:auto}img[align=right]{padding-left:var(--image-alignment-padding)}img[align=left]{padding-right:var(--image-alignment-padding)}.markdown{--ifm-h1-vertical-rhythm-top:3;--ifm-h2-vertical-rhythm-top:2;--ifm-h3-vertical-rhythm-top:1.5;--ifm-heading-vertical-rhythm-top:1.25;--ifm-h1-vertical-rhythm-bottom:1.25;--ifm-heading-vertical-rhythm-bottom:1}.markdown:after,.markdown:before{content:"";display:table}.markdown:after{clear:both}.markdown h1:first-child{--ifm-h1-font-size:3rem;margin-bottom:calc(var(--ifm-h1-vertical-rhythm-bottom)*var(--ifm-leading))}.markdown>h2{--ifm-h2-font-size:2rem;margin-top:calc(var(--ifm-h2-vertical-rhythm-top)*var(--ifm-leading))}.markdown>h3{--ifm-h3-font-size:1.5rem;margin-top:calc(var(--ifm-h3-vertical-rhythm-top)*var(--ifm-leading))}.markdown>h4,.markdown>h5,.markdown>h6{margin-top:calc(var(--ifm-heading-vertical-rhythm-top)*var(--ifm-leading))}.markdown>p,.markdown>pre,.markdown>ul{margin-bottom:var(--ifm-leading)}.markdown li>p{margin-top:var(--ifm-list-paragraph-margin)}.markdown li+li{margin-top:var(--ifm-list-item-margin)}ol,ul{margin:0 0 var(--ifm-list-margin);padding-left:var(--ifm-list-left-padding)}ol ol,ul ol{list-style-type:lower-roman}ol ol ol,ol ul ol,ul ol ol,ul ul ol{list-style-type:lower-alpha}table{border-collapse:collapse;display:block;margin-bottom:var(--ifm-spacing-vertical)}table thead tr{border-bottom:2px solid var(--ifm-table-border-color)}table thead,table tr:nth-child(2n){background-color:var(--ifm-table-stripe-background)}table tr{background-color:var(--ifm-table-background);border-top:var(--ifm-table-border-width) solid var(--ifm-table-border-color)}table td,table th{border:var(--ifm-table-border-width) solid var(--ifm-table-border-color);padding:var(--ifm-table-cell-padding)}table th{background-color:var(--ifm-table-head-background);color:var(--ifm-table-head-color);font-weight:var(--ifm-table-head-font-weight)}table td{color:var(--ifm-table-cell-color)}strong{font-weight:var(--ifm-font-weight-bold)}a{color:var(--ifm-link-color);text-decoration:var(--ifm-link-decoration)}a:hover{color:var(--ifm-link-hover-color);text-decoration:var(--ifm-link-hover-decoration)}.button:hover,.text--no-decoration,.text--no-decoration:hover,a:not([href]){text-decoration:none}p{margin:0 0 var(--ifm-paragraph-margin-bottom)}blockquote{border-left:var(--ifm-blockquote-border-left-width) solid var(--ifm-blockquote-border-color);box-shadow:var(--ifm-blockquote-shadow);color:var(--ifm-blockquote-color);font-size:var(--ifm-blockquote-font-size);padding:var(--ifm-blockquote-padding-vertical) var(--ifm-blockquote-padding-horizontal)}blockquote>:first-child{margin-top:0}blockquote>:last-child{margin-bottom:0}hr{background-color:var(--ifm-hr-background-color);border:0;height:var(--ifm-hr-height);margin:var(--ifm-hr-margin-vertical) 0}.shadow--lw{box-shadow:var(--ifm-global-shadow-lw)!important}.shadow--md{box-shadow:var(--ifm-global-shadow-md)!important}.shadow--tl{box-shadow:var(--ifm-global-shadow-tl)!important}.text--primary,.wordWrapButtonEnabled_EoeP .wordWrapButtonIcon_Bwma{color:var(--ifm-color-primary)}.text--secondary{color:var(--ifm-color-secondary)}.text--success{color:var(--ifm-color-success)}.text--info{color:var(--ifm-color-info)}.text--warning{color:var(--ifm-color-warning)}.text--danger{color:var(--ifm-color-danger)}.text--center{text-align:center}.text--left{text-align:left}.text--justify{text-align:justify}.text--right{text-align:right}.text--capitalize{text-transform:capitalize}.text--lowercase{text-transform:lowercase}.admonitionHeading_Gvgb,.alert__heading,.text--uppercase{text-transform:uppercase}.text--light{font-weight:var(--ifm-font-weight-light)}.text--normal{font-weight:var(--ifm-font-weight-normal)}.text--semibold{font-weight:var(--ifm-font-weight-semibold)}.text--bold{font-weight:var(--ifm-font-weight-bold)}.text--italic{font-style:italic}.text--truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.text--break{word-wrap:break-word!important;word-break:break-word!important}.clean-btn{background:none;border:none;color:inherit;cursor:pointer;font-family:inherit;padding:0}.alert,.alert .close{color:var(--ifm-alert-foreground-color)}.clean-list{padding-left:0}.alert--primary{--ifm-alert-background-color:var(--ifm-color-primary-contrast-background);--ifm-alert-background-color-highlight:#3578e526;--ifm-alert-foreground-color:var(--ifm-color-primary-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-primary-dark)}.alert--secondary{--ifm-alert-background-color:var(--ifm-color-secondary-contrast-background);--ifm-alert-background-color-highlight:#ebedf026;--ifm-alert-foreground-color:var(--ifm-color-secondary-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-secondary-dark)}.alert--success{--ifm-alert-background-color:var(--ifm-color-success-contrast-background);--ifm-alert-background-color-highlight:#00a40026;--ifm-alert-foreground-color:var(--ifm-color-success-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-success-dark)}.alert--info{--ifm-alert-background-color:var(--ifm-color-info-contrast-background);--ifm-alert-background-color-highlight:#54c7ec26;--ifm-alert-foreground-color:var(--ifm-color-info-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-info-dark)}.alert--warning{--ifm-alert-background-color:var(--ifm-color-warning-contrast-background);--ifm-alert-background-color-highlight:#ffba0026;--ifm-alert-foreground-color:var(--ifm-color-warning-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-warning-dark)}.alert--danger{--ifm-alert-background-color:var(--ifm-color-danger-contrast-background);--ifm-alert-background-color-highlight:#fa383e26;--ifm-alert-foreground-color:var(--ifm-color-danger-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-danger-dark)}.alert{--ifm-code-background:var(--ifm-alert-background-color-highlight);--ifm-link-color:var(--ifm-alert-foreground-color);--ifm-link-hover-color:var(--ifm-alert-foreground-color);--ifm-link-decoration:underline;--ifm-tabs-color:var(--ifm-alert-foreground-color);--ifm-tabs-color-active:var(--ifm-alert-foreground-color);--ifm-tabs-color-active-border:var(--ifm-alert-border-color);background-color:var(--ifm-alert-background-color);border:var(--ifm-alert-border-width) solid var(--ifm-alert-border-color);border-left-width:var(--ifm-alert-border-left-width);border-radius:var(--ifm-alert-border-radius);box-shadow:var(--ifm-alert-shadow);padding:var(--ifm-alert-padding-vertical) var(--ifm-alert-padding-horizontal)}.alert__heading{align-items:center;display:flex;font:700 var(--ifm-h5-font-size)/var(--ifm-heading-line-height) var(--ifm-heading-font-family);margin-bottom:.5rem}.alert__icon{display:inline-flex;margin-right:.4em}.alert__icon svg{fill:var(--ifm-alert-foreground-color);stroke:var(--ifm-alert-foreground-color);stroke-width:0}.alert .close{margin:calc(var(--ifm-alert-padding-vertical)*-1) calc(var(--ifm-alert-padding-horizontal)*-1) 0 0;opacity:.75}.alert .close:focus,.alert .close:hover{opacity:1}.alert a{text-decoration-color:var(--ifm-alert-border-color)}.alert a:hover{text-decoration-thickness:2px}.avatar{column-gap:var(--ifm-avatar-intro-margin);display:flex}.avatar__photo{border-radius:50%;display:block;height:var(--ifm-avatar-photo-size);overflow:hidden;width:var(--ifm-avatar-photo-size)}.card--full-height,.navbar__logo img,body,html{height:100%}.avatar__photo--sm{--ifm-avatar-photo-size:2rem}.avatar__photo--lg{--ifm-avatar-photo-size:4rem}.avatar__photo--xl{--ifm-avatar-photo-size:6rem}.avatar__intro{display:flex;flex:1 1;flex-direction:column;justify-content:center;text-align:var(--ifm-avatar-intro-alignment)}.badge,.breadcrumbs__item,.breadcrumbs__link,.button,.dropdown>.navbar__link:after{display:inline-block}.avatar__name{font:700 var(--ifm-h4-font-size)/var(--ifm-heading-line-height) var(--ifm-font-family-base)}.avatar__subtitle{margin-top:.25rem}.avatar--vertical{--ifm-avatar-intro-alignment:center;--ifm-avatar-intro-margin:0.5rem;align-items:center;flex-direction:column}.badge{background-color:var(--ifm-badge-background-color);border:var(--ifm-badge-border-width) solid var(--ifm-badge-border-color);border-radius:var(--ifm-badge-border-radius);color:var(--ifm-badge-color);font-size:75%;font-weight:var(--ifm-font-weight-bold);line-height:1;padding:var(--ifm-badge-padding-vertical) var(--ifm-badge-padding-horizontal)}.badge--primary{--ifm-badge-background-color:var(--ifm-color-primary)}.badge--secondary{--ifm-badge-background-color:var(--ifm-color-secondary);color:var(--ifm-color-black)}.breadcrumbs__link,.button.button--secondary.button--outline:not(.button--active):not(:hover){color:var(--ifm-font-color-base)}.badge--success{--ifm-badge-background-color:var(--ifm-color-success)}.badge--info{--ifm-badge-background-color:var(--ifm-color-info)}.badge--warning{--ifm-badge-background-color:var(--ifm-color-warning)}.badge--danger{--ifm-badge-background-color:var(--ifm-color-danger)}.breadcrumbs{margin-bottom:0;padding-left:0}.breadcrumbs__item:not(:last-child):after{background:var(--ifm-breadcrumb-separator) center;content:" ";display:inline-block;filter:var(--ifm-breadcrumb-separator-filter);height:calc(var(--ifm-breadcrumb-separator-size)*var(--ifm-breadcrumb-size-multiplier)*var(--ifm-breadcrumb-separator-size-multiplier));margin:0 var(--ifm-breadcrumb-spacing);opacity:.5;width:calc(var(--ifm-breadcrumb-separator-size)*var(--ifm-breadcrumb-size-multiplier)*var(--ifm-breadcrumb-separator-size-multiplier))}.breadcrumbs__item--active .breadcrumbs__link{background:var(--ifm-breadcrumb-item-background-active);color:var(--ifm-breadcrumb-color-active)}.breadcrumbs__link{border-radius:var(--ifm-breadcrumb-border-radius);font-size:calc(1rem*var(--ifm-breadcrumb-size-multiplier));padding:calc(var(--ifm-breadcrumb-padding-vertical)*var(--ifm-breadcrumb-size-multiplier)) calc(var(--ifm-breadcrumb-padding-horizontal)*var(--ifm-breadcrumb-size-multiplier));transition-duration:var(--ifm-transition-fast);transition-property:background,color}.breadcrumbs__link:any-link:hover,.breadcrumbs__link:link:hover,.breadcrumbs__link:visited:hover,area[href].breadcrumbs__link:hover{background:var(--ifm-breadcrumb-item-background-active);text-decoration:none}.breadcrumbs--sm{--ifm-breadcrumb-size-multiplier:0.8}.breadcrumbs--lg{--ifm-breadcrumb-size-multiplier:1.2}.button{background-color:var(--ifm-button-background-color);border:var(--ifm-button-border-width) solid var(--ifm-button-border-color);border-radius:var(--ifm-button-border-radius);cursor:pointer;font-size:calc(.875rem*var(--ifm-button-size-multiplier));font-weight:var(--ifm-button-font-weight);line-height:1.5;padding:calc(var(--ifm-button-padding-vertical)*var(--ifm-button-size-multiplier)) calc(var(--ifm-button-padding-horizontal)*var(--ifm-button-size-multiplier));text-align:center;transition-duration:var(--ifm-button-transition-duration);transition-property:color,background,border-color;-webkit-user-select:none;user-select:none;white-space:nowrap}.button,.button:hover{color:var(--ifm-button-color)}.button--outline{--ifm-button-color:var(--ifm-button-border-color)}.button--outline:hover{--ifm-button-background-color:var(--ifm-button-border-color)}.button--link{--ifm-button-border-color:#0000;color:var(--ifm-link-color);text-decoration:var(--ifm-link-decoration)}.button--link.button--active,.button--link:active,.button--link:hover{color:var(--ifm-link-hover-color);text-decoration:var(--ifm-link-hover-decoration)}.button.disabled,.button:disabled,.button[disabled]{opacity:.65;pointer-events:none}.button--sm{--ifm-button-size-multiplier:0.8}.button--lg{--ifm-button-size-multiplier:1.35}.button--block{display:block;width:100%}.button.button--secondary{color:var(--ifm-color-gray-900)}:where(.button--primary){--ifm-button-background-color:var(--ifm-color-primary);--ifm-button-border-color:var(--ifm-color-primary)}:where(.button--primary):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-primary-dark);--ifm-button-border-color:var(--ifm-color-primary-dark)}.button--primary.button--active,.button--primary:active{--ifm-button-background-color:var(--ifm-color-primary-darker);--ifm-button-border-color:var(--ifm-color-primary-darker)}:where(.button--secondary){--ifm-button-background-color:var(--ifm-color-secondary);--ifm-button-border-color:var(--ifm-color-secondary)}:where(.button--secondary):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-secondary-dark);--ifm-button-border-color:var(--ifm-color-secondary-dark)}.button--secondary.button--active,.button--secondary:active{--ifm-button-background-color:var(--ifm-color-secondary-darker);--ifm-button-border-color:var(--ifm-color-secondary-darker)}:where(.button--success){--ifm-button-background-color:var(--ifm-color-success);--ifm-button-border-color:var(--ifm-color-success)}:where(.button--success):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-success-dark);--ifm-button-border-color:var(--ifm-color-success-dark)}.button--success.button--active,.button--success:active{--ifm-button-background-color:var(--ifm-color-success-darker);--ifm-button-border-color:var(--ifm-color-success-darker)}:where(.button--info){--ifm-button-background-color:var(--ifm-color-info);--ifm-button-border-color:var(--ifm-color-info)}:where(.button--info):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-info-dark);--ifm-button-border-color:var(--ifm-color-info-dark)}.button--info.button--active,.button--info:active{--ifm-button-background-color:var(--ifm-color-info-darker);--ifm-button-border-color:var(--ifm-color-info-darker)}:where(.button--warning){--ifm-button-background-color:var(--ifm-color-warning);--ifm-button-border-color:var(--ifm-color-warning)}:where(.button--warning):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-warning-dark);--ifm-button-border-color:var(--ifm-color-warning-dark)}.button--warning.button--active,.button--warning:active{--ifm-button-background-color:var(--ifm-color-warning-darker);--ifm-button-border-color:var(--ifm-color-warning-darker)}:where(.button--danger){--ifm-button-background-color:var(--ifm-color-danger);--ifm-button-border-color:var(--ifm-color-danger)}:where(.button--danger):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-danger-dark);--ifm-button-border-color:var(--ifm-color-danger-dark)}.button--danger.button--active,.button--danger:active{--ifm-button-background-color:var(--ifm-color-danger-darker);--ifm-button-border-color:var(--ifm-color-danger-darker)}.button-group{display:inline-flex;gap:var(--ifm-button-group-spacing)}.button-group>.button:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.button-group>.button:not(:last-child){border-bottom-right-radius:0;border-top-right-radius:0}.button-group--block{display:flex;justify-content:stretch}.button-group--block>.button{flex-grow:1}.card{background-color:var(--ifm-card-background-color);border-radius:var(--ifm-card-border-radius);box-shadow:var(--ifm-global-shadow-lw);display:flex;flex-direction:column;overflow:hidden}.card__image{padding-top:var(--ifm-card-vertical-spacing)}.card__image:first-child{padding-top:0}.card__body,.card__footer,.card__header{padding:var(--ifm-card-vertical-spacing) var(--ifm-card-horizontal-spacing)}.card__body:not(:last-child),.card__footer:not(:last-child),.card__header:not(:last-child){padding-bottom:0}.card__body>:last-child,.card__footer>:last-child,.card__header>:last-child{margin-bottom:0}.card__footer{margin-top:auto}.table-of-contents{font-size:.8rem;margin-bottom:0;padding:var(--ifm-toc-padding-vertical) 0}.table-of-contents,.table-of-contents ul{list-style:none;padding-left:var(--ifm-toc-padding-horizontal)}.table-of-contents li{margin:var(--ifm-toc-padding-vertical) var(--ifm-toc-padding-horizontal)}.table-of-contents__left-border{border-left:1px solid var(--ifm-toc-border-color)}.table-of-contents__link{color:var(--ifm-toc-link-color);display:block}.table-of-contents__link--active,.table-of-contents__link--active code,.table-of-contents__link:hover,.table-of-contents__link:hover code{color:var(--ifm-color-primary);text-decoration:none}.close{color:var(--ifm-color-black);float:right;font-size:1.5rem;font-weight:var(--ifm-font-weight-bold);line-height:1;opacity:.5;padding:1rem;transition:opacity var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.close:hover{opacity:.7}.close:focus,.theme-code-block-highlighted-line .codeLineNumber_Tfdd:before{opacity:.8}.dropdown{display:inline-flex;font-weight:var(--ifm-dropdown-font-weight);position:relative;vertical-align:top}.dropdown--hoverable:hover .dropdown__menu,.dropdown--show .dropdown__menu{opacity:1;pointer-events:all;transform:translateY(-1px);visibility:visible}#nprogress,.dropdown__menu,.navbar__item.dropdown .navbar__link:not([href]){pointer-events:none}.dropdown--right .dropdown__menu{left:inherit;right:0}.dropdown--nocaret .navbar__link:after{content:none!important}.dropdown__menu{background-color:var(--ifm-dropdown-background-color);border-radius:var(--ifm-global-radius);box-shadow:var(--ifm-global-shadow-md);left:0;max-height:80vh;min-width:10rem;opacity:0;overflow-y:auto;padding:.5rem;position:absolute;top:calc(100% - var(--ifm-navbar-item-padding-vertical) + .3rem);transform:translateY(-.625rem);transition-duration:var(--ifm-transition-fast);transition-property:opacity,transform,visibility;transition-timing-function:var(--ifm-transition-timing-default);visibility:hidden;z-index:var(--ifm-z-index-dropdown)}.menu__caret,.menu__link,.menu__list-item-collapsible{border-radius:.25rem;transition:background var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.dropdown__link{border-radius:.25rem;color:var(--ifm-dropdown-link-color);display:block;font-size:.875rem;margin-top:.2rem;padding:.25rem .5rem;white-space:nowrap}.dropdown__link--active,.dropdown__link:hover{background-color:var(--ifm-dropdown-hover-background-color);color:var(--ifm-dropdown-link-color);text-decoration:none}.dropdown__link--active,.dropdown__link--active:hover{--ifm-dropdown-link-color:var(--ifm-link-color)}.dropdown>.navbar__link:after{border-color:currentcolor #0000;border-style:solid;border-width:.4em .4em 0;content:"";margin-left:.3em;position:relative;top:2px;transform:translateY(-50%)}.footer{background-color:var(--ifm-footer-background-color);color:var(--ifm-footer-color);padding:var(--ifm-footer-padding-vertical) var(--ifm-footer-padding-horizontal)}.footer--dark{--ifm-footer-background-color:#303846;--ifm-footer-color:var(--ifm-footer-link-color);--ifm-footer-link-color:var(--ifm-color-secondary);--ifm-footer-title-color:var(--ifm-color-white)}.footer__links{margin-bottom:1rem}.footer__link-item{color:var(--ifm-footer-link-color);line-height:2}.footer__link-item:hover{color:var(--ifm-footer-link-hover-color)}.footer__link-separator{margin:0 var(--ifm-footer-link-horizontal-spacing)}.footer__logo{margin-top:1rem;max-width:var(--ifm-footer-logo-max-width)}.footer__title{color:var(--ifm-footer-title-color);font:700 var(--ifm-h4-font-size)/var(--ifm-heading-line-height) var(--ifm-font-family-base);margin-bottom:var(--ifm-heading-margin-bottom)}.menu,.navbar__link{font-weight:var(--ifm-font-weight-semibold)}.docItemContainer_Djhp article>:first-child,.docItemContainer_Djhp header+*,.footer__item{margin-top:0}.admonitionContent_BuS1>:last-child,.cardContainer_fWXF :last-child,.collapsibleContent_i85q p:last-child,.details_lb9f>summary>p:last-child,.footer__items{margin-bottom:0}.codeBlockStandalone_MEMb,[type=checkbox]{padding:0}.hero{align-items:center;background-color:var(--ifm-hero-background-color);color:var(--ifm-hero-text-color);display:flex;padding:4rem 2rem}.hero--primary{--ifm-hero-background-color:var(--ifm-color-primary);--ifm-hero-text-color:var(--ifm-font-color-base-inverse)}.hero--dark{--ifm-hero-background-color:#303846;--ifm-hero-text-color:var(--ifm-color-white)}.hero__title{font-size:3rem}.hero__subtitle{font-size:1.5rem}.menu__list{margin:0;padding-left:0}.menu__caret,.menu__link{padding:var(--ifm-menu-link-padding-vertical) var(--ifm-menu-link-padding-horizontal)}.menu__list .menu__list{flex:0 0 100%;margin-top:.25rem;padding-left:var(--ifm-menu-link-padding-horizontal)}.menu__list-item:not(:first-child){margin-top:.25rem}.menu__list-item--collapsed .menu__list{height:0;overflow:hidden}.details_lb9f[data-collapsed=false].isBrowser_bmU9>summary:before,.details_lb9f[open]:not(.isBrowser_bmU9)>summary:before,.menu__list-item--collapsed .menu__caret:before,.menu__list-item--collapsed .menu__link--sublist:after{transform:rotate(90deg)}.menu__list-item-collapsible{display:flex;flex-wrap:wrap;position:relative}.menu__caret:hover,.menu__link:hover,.menu__list-item-collapsible--active,.menu__list-item-collapsible:hover{background:var(--ifm-menu-color-background-hover)}.menu__list-item-collapsible .menu__link--active,.menu__list-item-collapsible .menu__link:hover{background:none!important}.menu__caret,.menu__link{align-items:center;display:flex}.menu__link{color:var(--ifm-menu-color);flex:1;line-height:1.25}.menu__link:hover{color:var(--ifm-menu-color);text-decoration:none}.menu__caret:before,.menu__link--sublist-caret:after{height:1.25rem;transform:rotate(180deg);transition:transform var(--ifm-transition-fast) linear;width:1.25rem;filter:var(--ifm-menu-link-sublist-icon-filter);content:""}.menu__link--sublist-caret:after{background:var(--ifm-menu-link-sublist-icon) 50%/2rem 2rem;margin-left:auto;min-width:1.25rem}.menu__link--active,.menu__link--active:hover{color:var(--ifm-menu-color-active)}.navbar__brand,.navbar__link{color:var(--ifm-navbar-link-color)}.menu__link--active:not(.menu__link--sublist){background-color:var(--ifm-menu-color-background-active)}.menu__caret:before{background:var(--ifm-menu-link-sublist-icon) 50%/2rem 2rem}.navbar--dark,html[data-theme=dark]{--ifm-menu-link-sublist-icon-filter:invert(100%) sepia(94%) saturate(17%) hue-rotate(223deg) brightness(104%) contrast(98%)}.navbar{background-color:var(--ifm-navbar-background-color);box-shadow:var(--ifm-navbar-shadow);height:var(--ifm-navbar-height);padding:var(--ifm-navbar-padding-vertical) var(--ifm-navbar-padding-horizontal)}.navbar,.navbar>.container,.navbar>.container-fluid{display:flex}.navbar--fixed-top{position:sticky;top:0;z-index:var(--ifm-z-index-fixed)}.navbar-sidebar,.navbar-sidebar__backdrop{bottom:0;opacity:0;position:fixed;transition-duration:var(--ifm-transition-fast);transition-timing-function:ease-in-out;left:0;top:0;visibility:hidden}.navbar__inner{display:flex;flex-wrap:wrap;justify-content:space-between;width:100%}.navbar__brand{align-items:center;display:flex;margin-right:1rem;min-width:0}.navbar__brand:hover{color:var(--ifm-navbar-link-hover-color);text-decoration:none}.announcementBarContent_xLdY,.navbar__title{flex:1 1 auto}.navbar__toggle{display:none;margin-right:.5rem}.navbar__logo{flex:0 0 auto;height:2rem;margin-right:.5rem}.navbar__items{align-items:center;display:flex;flex:1;min-width:0}.navbar__items--center{flex:0 0 auto}.navbar__items--center .navbar__brand{margin:0}.navbar__items--center+.navbar__items--right{flex:1}.navbar__items--right{flex:0 0 auto;justify-content:flex-end}.navbar__items--right>:last-child{padding-right:0}.navbar__item{display:inline-block;padding:var(--ifm-navbar-item-padding-vertical) var(--ifm-navbar-item-padding-horizontal)}.navbar__link--active,.navbar__link:hover{color:var(--ifm-navbar-link-hover-color);text-decoration:none}.navbar--dark,.navbar--primary{--ifm-menu-color:var(--ifm-color-gray-300);--ifm-navbar-link-color:var(--ifm-color-gray-100);--ifm-navbar-search-input-background-color:#ffffff1a;--ifm-navbar-search-input-placeholder-color:#ffffff80;color:var(--ifm-color-white)}.navbar--dark{--ifm-navbar-background-color:#242526;--ifm-menu-color-background-active:#ffffff0d;--ifm-navbar-search-input-color:var(--ifm-color-white)}.navbar--primary{--ifm-navbar-background-color:var(--ifm-color-primary);--ifm-navbar-link-hover-color:var(--ifm-color-white);--ifm-menu-color-active:var(--ifm-color-white);--ifm-navbar-search-input-color:var(--ifm-color-emphasis-500)}.navbar__search-input{appearance:none;background:var(--ifm-navbar-search-input-background-color) var(--ifm-navbar-search-input-icon) no-repeat .75rem center/1rem 1rem;border:none;border-radius:2rem;color:var(--ifm-navbar-search-input-color);cursor:text;display:inline-block;font-size:.9rem;height:2rem;padding:0 .5rem 0 2.25rem;width:12.5rem}.navbar__search-input::placeholder{color:var(--ifm-navbar-search-input-placeholder-color)}.navbar-sidebar{background-color:var(--ifm-navbar-background-color);box-shadow:var(--ifm-global-shadow-md);transform:translate3d(-100%,0,0);transition-property:opacity,visibility,transform;width:var(--ifm-navbar-sidebar-width)}.navbar-sidebar--show .navbar-sidebar,.navbar-sidebar__items{transform:translateZ(0)}.navbar-sidebar--show .navbar-sidebar,.navbar-sidebar--show .navbar-sidebar__backdrop{opacity:1;visibility:visible}.navbar-sidebar__backdrop{background-color:#0009;right:0;transition-property:opacity,visibility}.navbar-sidebar__brand{align-items:center;box-shadow:var(--ifm-navbar-shadow);display:flex;flex:1;height:var(--ifm-navbar-height);padding:var(--ifm-navbar-padding-vertical) var(--ifm-navbar-padding-horizontal)}.navbar-sidebar__items{display:flex;height:calc(100% - var(--ifm-navbar-height));transition:transform var(--ifm-transition-fast) ease-in-out}.navbar-sidebar__items--show-secondary{transform:translate3d(calc((var(--ifm-navbar-sidebar-width))*-1),0,0)}.navbar-sidebar__item{flex-shrink:0;padding:.5rem;width:calc(var(--ifm-navbar-sidebar-width))}.navbar-sidebar__back{background:var(--ifm-menu-color-background-active);font-size:15px;font-weight:var(--ifm-button-font-weight);margin:0 0 .2rem -.5rem;padding:.6rem 1.5rem;position:relative;text-align:left;top:-.5rem;width:calc(100% + 1rem)}.navbar-sidebar__close{display:flex;margin-left:auto}.pagination{column-gap:var(--ifm-pagination-page-spacing);display:flex;font-size:var(--ifm-pagination-font-size);padding-left:0}.pagination--sm{--ifm-pagination-font-size:0.8rem;--ifm-pagination-padding-horizontal:0.8rem;--ifm-pagination-padding-vertical:0.2rem}.pagination--lg{--ifm-pagination-font-size:1.2rem;--ifm-pagination-padding-horizontal:1.2rem;--ifm-pagination-padding-vertical:0.3rem}.pagination__item{display:inline-flex}.pagination__item>span{padding:var(--ifm-pagination-padding-vertical)}.pagination__item--active .pagination__link{color:var(--ifm-pagination-color-active)}.pagination__item--active .pagination__link,.pagination__item:not(.pagination__item--active):hover .pagination__link{background:var(--ifm-pagination-item-active-background)}.pagination__item--disabled,.pagination__item[disabled]{opacity:.25;pointer-events:none}.pagination__link{border-radius:var(--ifm-pagination-border-radius);color:var(--ifm-font-color-base);display:inline-block;padding:var(--ifm-pagination-padding-vertical) var(--ifm-pagination-padding-horizontal);transition:background var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.pagination__link:hover{text-decoration:none}.pagination-nav{display:grid;grid-gap:var(--ifm-spacing-horizontal);gap:var(--ifm-spacing-horizontal);grid-template-columns:repeat(2,1fr)}.pagination-nav__link{border:1px solid var(--ifm-color-emphasis-300);border-radius:var(--ifm-pagination-nav-border-radius);display:block;height:100%;line-height:var(--ifm-heading-line-height);padding:var(--ifm-global-spacing);transition:border-color var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.pagination-nav__link:hover{border-color:var(--ifm-pagination-nav-color-hover);text-decoration:none}.pagination-nav__link--next{grid-column:2/3;text-align:right}.pagination-nav__label{font-size:var(--ifm-h4-font-size);font-weight:var(--ifm-heading-font-weight);word-break:break-word}.pagination-nav__link--prev .pagination-nav__label:before{content:"« "}.pagination-nav__link--next .pagination-nav__label:after{content:" »"}.pagination-nav__sublabel{color:var(--ifm-color-content-secondary);font-size:var(--ifm-h5-font-size);font-weight:var(--ifm-font-weight-semibold);margin-bottom:.25rem}.pills__item,.tabs{font-weight:var(--ifm-font-weight-bold)}.pills{display:flex;gap:var(--ifm-pills-spacing);padding-left:0}.pills__item{border-radius:.5rem;cursor:pointer;display:inline-block;padding:.25rem 1rem;transition:background var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.tabs,:not(.containsTaskList_mC6p>li)>.containsTaskList_mC6p{padding-left:0}.pills__item--active{color:var(--ifm-pills-color-active)}.pills__item--active,.pills__item:not(.pills__item--active):hover{background:var(--ifm-pills-color-background-active)}.pills--block{justify-content:stretch}.pills--block .pills__item{flex-grow:1;text-align:center}.tabs{color:var(--ifm-tabs-color);display:flex;margin-bottom:0;overflow-x:auto}.tabs__item{border-bottom:3px solid #0000;border-radius:var(--ifm-global-radius);cursor:pointer;display:inline-flex;padding:var(--ifm-tabs-padding-vertical) var(--ifm-tabs-padding-horizontal);transition:background-color var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.tabs__item--active{border-bottom-color:var(--ifm-tabs-color-active-border);border-bottom-left-radius:0;border-bottom-right-radius:0;color:var(--ifm-tabs-color-active)}.tabs__item:hover{background-color:var(--ifm-hover-overlay)}.tabs--block{justify-content:stretch}.tabs--block .tabs__item{flex-grow:1;justify-content:center}html[data-theme=dark]{--ifm-color-scheme:dark;--ifm-color-emphasis-0:var(--ifm-color-gray-1000);--ifm-color-emphasis-100:var(--ifm-color-gray-900);--ifm-color-emphasis-200:var(--ifm-color-gray-800);--ifm-color-emphasis-300:var(--ifm-color-gray-700);--ifm-color-emphasis-400:var(--ifm-color-gray-600);--ifm-color-emphasis-600:var(--ifm-color-gray-400);--ifm-color-emphasis-700:var(--ifm-color-gray-300);--ifm-color-emphasis-800:var(--ifm-color-gray-200);--ifm-color-emphasis-900:var(--ifm-color-gray-100);--ifm-color-emphasis-1000:var(--ifm-color-gray-0);--ifm-background-color:#1b1b1d;--ifm-background-surface-color:#242526;--ifm-hover-overlay:#ffffff0d;--ifm-color-content:#e3e3e3;--ifm-color-content-secondary:#fff;--ifm-breadcrumb-separator-filter:invert(64%) sepia(11%) saturate(0%) hue-rotate(149deg) brightness(99%) contrast(95%);--ifm-code-background:#ffffff1a;--ifm-scrollbar-track-background-color:#444;--ifm-scrollbar-thumb-background-color:#686868;--ifm-scrollbar-thumb-hover-background-color:#7a7a7a;--ifm-table-stripe-background:#ffffff12;--ifm-toc-border-color:var(--ifm-color-emphasis-200);--ifm-color-primary-contrast-background:#102445;--ifm-color-primary-contrast-foreground:#ebf2fc;--ifm-color-secondary-contrast-background:#474748;--ifm-color-secondary-contrast-foreground:#fdfdfe;--ifm-color-success-contrast-background:#003100;--ifm-color-success-contrast-foreground:#e6f6e6;--ifm-color-info-contrast-background:#193c47;--ifm-color-info-contrast-foreground:#eef9fd;--ifm-color-warning-contrast-background:#4d3800;--ifm-color-warning-contrast-foreground:#fff8e6;--ifm-color-danger-contrast-background:#4b1113;--ifm-color-danger-contrast-foreground:#ffebec}#nprogress .bar{background:var(--docusaurus-progress-bar-color);height:2px;left:0;position:fixed;top:0;width:100%;z-index:1031}#nprogress .peg{box-shadow:0 0 10px var(--docusaurus-progress-bar-color),0 0 5px var(--docusaurus-progress-bar-color);height:100%;opacity:1;position:absolute;right:0;transform:rotate(3deg) translateY(-4px);width:100px}[data-theme=dark]{--ifm-color-primary:#25c2a0;--ifm-color-primary-dark:#21af90;--ifm-color-primary-darker:#1fa588;--ifm-color-primary-darkest:#1a8870;--ifm-color-primary-light:#29d5b0;--ifm-color-primary-lighter:#32d8b4;--ifm-color-primary-lightest:#4fddbf;--docusaurus-highlighted-code-line-bg:#0000004d}body:not(.navigation-with-keyboard) :not(input):focus{outline:0}#__docusaurus-base-url-issue-banner-container,.docSidebarContainer_YfHR,.navbarSearchContainer_Bca1:empty,.sidebarLogo_isFc,.themedComponent_mlkZ,[data-theme=dark] .lightToggleIcon_pyhR,[data-theme=light] .darkToggleIcon_wfgR,html[data-announcement-bar-initially-dismissed=true] .announcementBar_mb4j{display:none}.skipToContent_fXgn{background-color:var(--ifm-background-surface-color);color:var(--ifm-color-emphasis-900);left:100%;padding:calc(var(--ifm-global-spacing)/2) var(--ifm-global-spacing);position:fixed;top:1rem;z-index:calc(var(--ifm-z-index-fixed) + 1)}.skipToContent_fXgn:focus{box-shadow:var(--ifm-global-shadow-md);left:1rem}.closeButton_CVFx{line-height:0;padding:0}.content_knG7{font-size:85%;padding:5px 0;text-align:center}.content_knG7 a{color:inherit;text-decoration:underline}.announcementBar_mb4j{align-items:center;background-color:var(--ifm-color-white);border-bottom:1px solid var(--ifm-color-emphasis-100);color:var(--ifm-color-black);display:flex;height:var(--docusaurus-announcement-bar-height)}.announcementBarPlaceholder_vyr4{flex:0 0 10px}.announcementBarClose_gvF7{align-self:stretch;flex:0 0 30px}.toggle_vylO{height:2rem;width:2rem}.toggleButton_gllP{align-items:center;border-radius:50%;display:flex;height:100%;justify-content:center;transition:background var(--ifm-transition-fast);width:100%}.toggleButton_gllP:hover{background:var(--ifm-color-emphasis-200)}.toggleButtonDisabled_aARS{cursor:not-allowed}.darkNavbarColorModeToggle_X3D1:hover{background:var(--ifm-color-gray-800)}.tag_zVej{border:1px solid var(--docusaurus-tag-list-border);transition:border var(--ifm-transition-fast)}.tag_zVej:hover{--docusaurus-tag-list-border:var(--ifm-link-color);text-decoration:none}.tagRegular_sFm0{border-radius:var(--ifm-global-radius);font-size:90%;padding:.2rem .5rem .3rem}.tagWithCount_h2kH{align-items:center;border-left:0;display:flex;padding:0 .5rem 0 1rem;position:relative}.tagWithCount_h2kH:after,.tagWithCount_h2kH:before{border:1px solid var(--docusaurus-tag-list-border);content:"";position:absolute;top:50%;transition:inherit}.tagWithCount_h2kH:before{border-bottom:0;border-right:0;height:1.18rem;right:100%;transform:translate(50%,-50%) rotate(-45deg);width:1.18rem}.tagWithCount_h2kH:after{border-radius:50%;height:.5rem;left:0;transform:translateY(-50%);width:.5rem}.tagWithCount_h2kH span{background:var(--ifm-color-secondary);border-radius:var(--ifm-global-radius);color:var(--ifm-color-black);font-size:.7rem;line-height:1.2;margin-left:.3rem;padding:.1rem .4rem}.tags_jXut{display:inline}.tag_QGVx{display:inline-block;margin:0 .4rem .5rem 0}.iconEdit_Z9Sw{margin-right:.3em;vertical-align:sub}.lastUpdated_JAkA{font-size:smaller;font-style:italic;margin-top:.2rem}.tocCollapsibleButton_TO0P{align-items:center;display:flex;font-size:inherit;justify-content:space-between;padding:.4rem .8rem;width:100%}.tocCollapsibleButton_TO0P:after{background:var(--ifm-menu-link-sublist-icon) 50% 50%/2rem 2rem no-repeat;content:"";filter:var(--ifm-menu-link-sublist-icon-filter);height:1.25rem;transform:rotate(180deg);transition:transform var(--ifm-transition-fast);width:1.25rem}.tocCollapsibleButtonExpanded_MG3E:after,.tocCollapsibleExpanded_sAul{transform:none}.tocCollapsible_ETCw{background-color:var(--ifm-menu-color-background-active);border-radius:var(--ifm-global-radius);margin:1rem 0}.tocCollapsibleContent_vkbj>ul{border-left:none;border-top:1px solid var(--ifm-color-emphasis-300);font-size:15px;padding:.2rem 0}.tocCollapsibleContent_vkbj ul li{margin:.4rem .8rem}.tocCollapsibleContent_vkbj a{display:block}.tableOfContents_bqdL{max-height:calc(100vh - var(--ifm-navbar-height) - 2rem);overflow-y:auto;position:sticky;top:calc(var(--ifm-navbar-height) + 1rem)}.backToTopButton_sjWU{background-color:var(--ifm-color-emphasis-200);border-radius:50%;bottom:1.3rem;box-shadow:var(--ifm-global-shadow-lw);height:3rem;opacity:0;position:fixed;right:1.3rem;transform:scale(0);transition:all var(--ifm-transition-fast) var(--ifm-transition-timing-default);visibility:hidden;width:3rem;z-index:calc(var(--ifm-z-index-fixed) - 1)}.backToTopButton_sjWU:after{background-color:var(--ifm-color-emphasis-1000);content:" ";display:inline-block;height:100%;-webkit-mask:var(--ifm-menu-link-sublist-icon) 50%/2rem 2rem no-repeat;mask:var(--ifm-menu-link-sublist-icon) 50%/2rem 2rem no-repeat;width:100%}.backToTopButtonShow_xfvO{opacity:1;transform:scale(1);visibility:visible}[data-theme=dark] .themedComponent--dark_xIcU,[data-theme=light] .themedComponent--light_NVdE,html:not([data-theme]) .themedComponent--light_NVdE{display:initial}[data-theme=dark]:root{--docusaurus-collapse-button-bg:#ffffff0d;--docusaurus-collapse-button-bg-hover:#ffffff1a}.collapseSidebarButton_PEFL{display:none;margin:0}.iconExternalLink_nPIU{margin-left:.3rem}.dropdownNavbarItemMobile_S0Fm{cursor:pointer}.iconLanguage_nlXk{margin-right:5px;vertical-align:text-bottom}.navbarHideable_m1mJ{transition:transform var(--ifm-transition-fast) ease}.navbarHidden_jGov{transform:translate3d(0,calc(-100% - 2px),0)}.errorBoundaryError_a6uf{color:red;white-space:pre-wrap}.errorBoundaryFallback_VBag{color:red;padding:.55rem}.buttonGroup__atx button,.codeBlockContainer_Ckt0{background:var(--prism-background-color);color:var(--prism-color)}.footerLogoLink_BH7S{opacity:.5;transition:opacity var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.footerLogoLink_BH7S:hover,.hash-link:focus,:hover>.hash-link{opacity:1}.docMainContainer_TBSr,.docRoot_UBD9{display:flex;width:100%}.docsWrapper_hBAB{display:flex;flex:1 0 auto}.anchorWithStickyNavbar_LWe7{scroll-margin-top:calc(var(--ifm-navbar-height) + .5rem)}.anchorWithHideOnScrollNavbar_WYt5{scroll-margin-top:.5rem}.hash-link{opacity:0;padding-left:.5rem;transition:opacity var(--ifm-transition-fast);-webkit-user-select:none;user-select:none}.hash-link:before{content:"#"}.mainWrapper_z2l0{display:flex;flex:1 0 auto;flex-direction:column}.docusaurus-mt-lg{margin-top:3rem}#__docusaurus{display:flex;flex-direction:column;min-height:100%}.codeBlockContainer_Ckt0{border-radius:var(--ifm-code-border-radius);box-shadow:var(--ifm-global-shadow-lw);margin-bottom:var(--ifm-leading)}.codeBlockContent_biex{border-radius:inherit;direction:ltr;position:relative}.codeBlockTitle_Ktv7{border-bottom:1px solid var(--ifm-color-emphasis-300);border-top-left-radius:inherit;border-top-right-radius:inherit;font-size:var(--ifm-code-font-size);font-weight:500;padding:.75rem var(--ifm-pre-padding)}.codeBlock_bY9V{--ifm-pre-background:var(--prism-background-color);margin:0;padding:0}.codeBlockTitle_Ktv7+.codeBlockContent_biex .codeBlock_bY9V{border-top-left-radius:0;border-top-right-radius:0}.codeBlockLines_e6Vv{float:left;font:inherit;min-width:100%;padding:var(--ifm-pre-padding)}.codeBlockLinesWithNumbering_o6Pm{display:table;padding:var(--ifm-pre-padding) 0}.buttonGroup__atx{column-gap:.2rem;display:flex;position:absolute;right:calc(var(--ifm-pre-padding)/2);top:calc(var(--ifm-pre-padding)/2)}.buttonGroup__atx button{align-items:center;border:1px solid var(--ifm-color-emphasis-300);border-radius:var(--ifm-global-radius);display:flex;line-height:0;opacity:0;padding:.4rem;transition:opacity var(--ifm-transition-fast) ease-in-out}.buttonGroup__atx button:focus-visible,.buttonGroup__atx button:hover{opacity:1!important}.theme-code-block:hover .buttonGroup__atx button{opacity:.4}:where(:root){--docusaurus-highlighted-code-line-bg:#484d5b}:where([data-theme=dark]){--docusaurus-highlighted-code-line-bg:#646464}.theme-code-block-highlighted-line{background-color:var(--docusaurus-highlighted-code-line-bg);display:block;margin:0 calc(var(--ifm-pre-padding)*-1);padding:0 var(--ifm-pre-padding)}.codeLine_lJS_{counter-increment:a;display:table-row}.codeLineNumber_Tfdd{background:var(--ifm-pre-background);display:table-cell;left:0;overflow-wrap:normal;padding:0 var(--ifm-pre-padding);position:sticky;text-align:right;width:1%}.codeLineNumber_Tfdd:before{content:counter(a);opacity:.4}.codeLineContent_feaV{padding-right:var(--ifm-pre-padding)}.theme-code-block:hover .copyButtonCopied_obH4{opacity:1!important}.copyButtonIcons_eSgA{height:1.125rem;position:relative;width:1.125rem}.copyButtonIcon_y97N,.copyButtonSuccessIcon_LjdS{left:0;position:absolute;top:0;fill:currentColor;height:inherit;opacity:inherit;transition:all var(--ifm-transition-fast) ease;width:inherit}.copyButtonSuccessIcon_LjdS{color:#00d600;left:50%;opacity:0;top:50%;transform:translate(-50%,-50%) scale(.33)}.copyButtonCopied_obH4 .copyButtonIcon_y97N{opacity:0;transform:scale(.33)}.copyButtonCopied_obH4 .copyButtonSuccessIcon_LjdS{opacity:1;transform:translate(-50%,-50%) scale(1);transition-delay:75ms}.wordWrapButtonIcon_Bwma{height:1.2rem;width:1.2rem}.details_lb9f{--docusaurus-details-summary-arrow-size:0.38rem;--docusaurus-details-transition:transform 200ms ease;--docusaurus-details-decoration-color:grey}.details_lb9f>summary{cursor:pointer;padding-left:1rem;position:relative}.details_lb9f>summary::-webkit-details-marker{display:none}.details_lb9f>summary:before{border-color:#0000 #0000 #0000 var(--docusaurus-details-decoration-color);border-style:solid;border-width:var(--docusaurus-details-summary-arrow-size);content:"";left:0;position:absolute;top:.45rem;transform:rotate(0);transform-origin:calc(var(--docusaurus-details-summary-arrow-size)/2) 50%;transition:var(--docusaurus-details-transition)}.collapsibleContent_i85q{border-top:1px solid var(--docusaurus-details-decoration-color);margin-top:1rem;padding-top:1rem}.details_b_Ee{--docusaurus-details-decoration-color:var(--ifm-alert-border-color);--docusaurus-details-transition:transform var(--ifm-transition-fast) ease;border:1px solid var(--ifm-alert-border-color);margin:0 0 var(--ifm-spacing-vertical)}.img_ev3q{height:auto}.admonition_xJq3{margin-bottom:1em}.admonitionHeading_Gvgb{font:var(--ifm-heading-font-weight) var(--ifm-h5-font-size)/var(--ifm-heading-line-height) var(--ifm-heading-font-family)}.admonitionHeading_Gvgb:not(:last-child){margin-bottom:.3rem}.admonitionHeading_Gvgb code{text-transform:none}.admonitionIcon_Rf37{display:inline-block;margin-right:.4em;vertical-align:middle}.admonitionIcon_Rf37 svg{display:inline-block;height:1.6em;width:1.6em;fill:var(--ifm-alert-foreground-color)}.breadcrumbHomeIcon_YNFT{height:1.1rem;position:relative;top:1px;vertical-align:top;width:1.1rem}.breadcrumbsContainer_Z_bl{--ifm-breadcrumb-size-multiplier:0.8;margin-bottom:.8rem}.cardContainer_fWXF{--ifm-link-color:var(--ifm-color-emphasis-800);--ifm-link-hover-color:var(--ifm-color-emphasis-700);--ifm-link-hover-decoration:none;border:1px solid var(--ifm-color-emphasis-200);box-shadow:0 1.5px 3px 0 #00000026;transition:all var(--ifm-transition-fast) ease;transition-property:border,box-shadow}.cardContainer_fWXF:hover{border-color:var(--ifm-color-primary);box-shadow:0 3px 6px 0 #0003}.cardTitle_rnsV{font-size:1.2rem}.cardDescription_PWke{font-size:.8rem}@media (min-width:997px){.collapseSidebarButton_PEFL,.expandButton_TmdG{background-color:var(--docusaurus-collapse-button-bg)}:root{--docusaurus-announcement-bar-height:30px}.announcementBarClose_gvF7,.announcementBarPlaceholder_vyr4{flex-basis:50px}.lastUpdated_JAkA{text-align:right}.tocMobile_ITEo{display:none}.collapseSidebarButton_PEFL{border:1px solid var(--ifm-toc-border-color);border-radius:0;bottom:0;display:block!important;height:40px;position:sticky}.collapseSidebarButtonIcon_kv0_{margin-top:4px;transform:rotate(180deg)}.expandButtonIcon_i1dp,[dir=rtl] .collapseSidebarButtonIcon_kv0_{transform:rotate(0)}.collapseSidebarButton_PEFL:focus,.collapseSidebarButton_PEFL:hover,.expandButton_TmdG:focus,.expandButton_TmdG:hover{background-color:var(--docusaurus-collapse-button-bg-hover)}.navbarSearchContainer_Bca1{padding:var(--ifm-navbar-item-padding-vertical) var(--ifm-navbar-item-padding-horizontal)}.menuHtmlItem_M9Kj{padding:var(--ifm-menu-link-padding-vertical) var(--ifm-menu-link-padding-horizontal)}.menu_SIkG{flex-grow:1;padding:.5rem}@supports (scrollbar-gutter:stable){.menu_SIkG{padding:.5rem 0 .5rem .5rem;scrollbar-gutter:stable}}.menuWithAnnouncementBar_GW3s{margin-bottom:var(--docusaurus-announcement-bar-height)}.sidebar_njMd{display:flex;flex-direction:column;height:100%;padding-top:var(--ifm-navbar-height);width:var(--doc-sidebar-width)}.sidebarWithHideableNavbar_wUlq{padding-top:0}.sidebarHidden_VK0M{opacity:0;visibility:hidden}.sidebarLogo_isFc{align-items:center;color:inherit!important;display:flex!important;margin:0 var(--ifm-navbar-padding-horizontal);max-height:var(--ifm-navbar-height);min-height:var(--ifm-navbar-height);text-decoration:none!important}.sidebarLogo_isFc img{height:2rem;margin-right:.5rem}.expandButton_TmdG{align-items:center;display:flex;height:100%;justify-content:center;position:absolute;right:0;top:0;transition:background-color var(--ifm-transition-fast) ease;width:100%}[dir=rtl] .expandButtonIcon_i1dp{transform:rotate(180deg)}.docSidebarContainer_YfHR{border-right:1px solid var(--ifm-toc-border-color);clip-path:inset(0);display:block;margin-top:calc(var(--ifm-navbar-height)*-1);transition:width var(--ifm-transition-fast) ease;width:var(--doc-sidebar-width);will-change:width}.docSidebarContainerHidden_DPk8{cursor:pointer;width:var(--doc-sidebar-hidden-width)}.sidebarViewport_aRkj{height:100%;max-height:100vh;position:sticky;top:0}.docMainContainer_TBSr{flex-grow:1;max-width:calc(100% - var(--doc-sidebar-width))}.docMainContainerEnhanced_lQrH{max-width:calc(100% - var(--doc-sidebar-hidden-width))}.docItemWrapperEnhanced_JWYK{max-width:calc(var(--ifm-container-width) + var(--doc-sidebar-width))!important}.docItemCol_VOVn{max-width:75%!important}}@media (min-width:1440px){.container{max-width:var(--ifm-container-width-xl)}}@media (max-width:996px){.col{--ifm-col-width:100%;flex-basis:var(--ifm-col-width);margin-left:0}.footer{--ifm-footer-padding-horizontal:0}.colorModeToggle_DEke,.footer__link-separator,.navbar__item,.tableOfContents_bqdL{display:none}.footer__col{margin-bottom:calc(var(--ifm-spacing-vertical)*3)}.footer__link-item{display:block}.hero{padding-left:0;padding-right:0}.navbar>.container,.navbar>.container-fluid{padding:0}.navbar__toggle{display:inherit}.navbar__search-input{width:9rem}.pills--block,.tabs--block{flex-direction:column}.docItemContainer_F8PC{padding:0 .3rem}.navbarSearchContainer_Bca1{position:absolute;right:var(--ifm-navbar-padding-horizontal)}}@media (max-width:576px){.markdown h1:first-child{--ifm-h1-font-size:2rem}.markdown>h2{--ifm-h2-font-size:1.5rem}.markdown>h3{--ifm-h3-font-size:1.25rem}}@media (hover:hover){.backToTopButton_sjWU:hover{background-color:var(--ifm-color-emphasis-300)}}@media (pointer:fine){.thin-scrollbar{scrollbar-width:thin}.thin-scrollbar::-webkit-scrollbar{height:var(--ifm-scrollbar-size);width:var(--ifm-scrollbar-size)}.thin-scrollbar::-webkit-scrollbar-track{background:var(--ifm-scrollbar-track-background-color);border-radius:10px}.thin-scrollbar::-webkit-scrollbar-thumb{background:var(--ifm-scrollbar-thumb-background-color);border-radius:10px}.thin-scrollbar::-webkit-scrollbar-thumb:hover{background:var(--ifm-scrollbar-thumb-hover-background-color)}}@media (prefers-reduced-motion:reduce){:root{--ifm-transition-fast:0ms;--ifm-transition-slow:0ms}}@media print{.announcementBar_mb4j,.footer,.menu,.navbar,.pagination-nav,.table-of-contents,.tocMobile_ITEo{display:none}.tabs{page-break-inside:avoid}.codeBlockLines_e6Vv{white-space:pre-wrap}} \ No newline at end of file diff --git a/assets/images/animation-anchored-8c8b5dfa237ead06adb46717a46ae600.gif b/assets/images/animation-anchored-8c8b5dfa237ead06adb46717a46ae600.gif new file mode 100644 index 0000000..096cd47 Binary files /dev/null and b/assets/images/animation-anchored-8c8b5dfa237ead06adb46717a46ae600.gif differ diff --git a/assets/images/animation-captioned-red-83dcdff0e9a287254cfdb063d0bb5ffe.gif b/assets/images/animation-captioned-red-83dcdff0e9a287254cfdb063d0bb5ffe.gif new file mode 100644 index 0000000..ca95132 Binary files /dev/null and b/assets/images/animation-captioned-red-83dcdff0e9a287254cfdb063d0bb5ffe.gif differ diff --git a/assets/images/animation-parallel-290fc9d667a8b0509bdbfa044269f886.gif b/assets/images/animation-parallel-290fc9d667a8b0509bdbfa044269f886.gif new file mode 100644 index 0000000..188501a Binary files /dev/null and b/assets/images/animation-parallel-290fc9d667a8b0509bdbfa044269f886.gif differ diff --git a/assets/images/animation-simple-2f9602a0503b36aed74a8e40e2b0b745.gif b/assets/images/animation-simple-2f9602a0503b36aed74a8e40e2b0b745.gif new file mode 100644 index 0000000..e8cb902 Binary files /dev/null and b/assets/images/animation-simple-2f9602a0503b36aed74a8e40e2b0b745.gif differ diff --git a/assets/images/big-vectors-4b0f5120bf4a32b8802dc41e520eb37a.png b/assets/images/big-vectors-4b0f5120bf4a32b8802dc41e520eb37a.png new file mode 100644 index 0000000..9dc1c99 Binary files /dev/null and b/assets/images/big-vectors-4b0f5120bf4a32b8802dc41e520eb37a.png differ diff --git a/assets/images/bob-6e8dad95c440d488af22193a37ae0d7f.png b/assets/images/bob-6e8dad95c440d488af22193a37ae0d7f.png new file mode 100644 index 0000000..85b17d2 Binary files /dev/null and b/assets/images/bob-6e8dad95c440d488af22193a37ae0d7f.png differ diff --git a/assets/images/caption-none-5d20b75c0a1aa4c1ffc800e1d6b6660f.png b/assets/images/caption-none-5d20b75c0a1aa4c1ffc800e1d6b6660f.png new file mode 100644 index 0000000..c1bf777 Binary files /dev/null and b/assets/images/caption-none-5d20b75c0a1aa4c1ffc800e1d6b6660f.png differ diff --git a/assets/images/caption-source-31a271258492ebebc6722d8e8933ea46.png b/assets/images/caption-source-31a271258492ebebc6722d8e8933ea46.png new file mode 100644 index 0000000..f354240 Binary files /dev/null and b/assets/images/caption-source-31a271258492ebebc6722d8e8933ea46.png differ diff --git a/assets/images/caption-tostring-ba525adeb95638e83be22d8857c98a9c.png b/assets/images/caption-tostring-ba525adeb95638e83be22d8857c98a9c.png new file mode 100644 index 0000000..53bec95 Binary files /dev/null and b/assets/images/caption-tostring-ba525adeb95638e83be22d8857c98a9c.png differ diff --git a/assets/images/company-3188e3cf359d9f1c7224ffceed126083.png b/assets/images/company-3188e3cf359d9f1c7224ffceed126083.png new file mode 100644 index 0000000..d214d8b Binary files /dev/null and b/assets/images/company-3188e3cf359d9f1c7224ffceed126083.png differ diff --git a/assets/images/edge-0a8b76cae995e0a8c485063cb500de8a.png b/assets/images/edge-0a8b76cae995e0a8c485063cb500de8a.png new file mode 100644 index 0000000..3209b61 Binary files /dev/null and b/assets/images/edge-0a8b76cae995e0a8c485063cb500de8a.png differ diff --git a/assets/images/edgePath-e11472fa0a55e29fd9de9876ff597ceb.png b/assets/images/edgePath-e11472fa0a55e29fd9de9876ff597ceb.png new file mode 100644 index 0000000..8c4b6f9 Binary files /dev/null and b/assets/images/edgePath-e11472fa0a55e29fd9de9876ff597ceb.png differ diff --git a/assets/images/edgePathElement-8070f24cd6faf257dbf2357bbc26ab75.png b/assets/images/edgePathElement-8070f24cd6faf257dbf2357bbc26ab75.png new file mode 100644 index 0000000..1645e9f Binary files /dev/null and b/assets/images/edgePathElement-8070f24cd6faf257dbf2357bbc26ab75.png differ diff --git a/assets/images/edgePathString-e95d3068168658ba325a9e873dbf2612.png b/assets/images/edgePathString-e95d3068168658ba325a9e873dbf2612.png new file mode 100644 index 0000000..38b92b9 Binary files /dev/null and b/assets/images/edgePathString-e95d3068168658ba325a9e873dbf2612.png differ diff --git a/assets/images/edgePolyline-7c4044c84e38ce242eefda017e1e188c.png b/assets/images/edgePolyline-7c4044c84e38ce242eefda017e1e188c.png new file mode 100644 index 0000000..047fcad Binary files /dev/null and b/assets/images/edgePolyline-7c4044c84e38ce242eefda017e1e188c.png differ diff --git a/assets/images/edges-100-9cbc68a0debf543244c33b7d26b22709.gif b/assets/images/edges-100-9cbc68a0debf543244c33b7d26b22709.gif new file mode 100644 index 0000000..b2f1c91 Binary files /dev/null and b/assets/images/edges-100-9cbc68a0debf543244c33b7d26b22709.gif differ diff --git a/assets/images/edges-4-788922eab8ebbf8f1d0ffaa9a071132b.gif b/assets/images/edges-4-788922eab8ebbf8f1d0ffaa9a071132b.gif new file mode 100644 index 0000000..390ec6a Binary files /dev/null and b/assets/images/edges-4-788922eab8ebbf8f1d0ffaa9a071132b.gif differ diff --git a/assets/images/example-279830c17e2bfcec051c7a3c6280e740.png b/assets/images/example-279830c17e2bfcec051c7a3c6280e740.png new file mode 100644 index 0000000..cd5a56f Binary files /dev/null and b/assets/images/example-279830c17e2bfcec051c7a3c6280e740.png differ diff --git a/assets/images/finger-b0999bed13c76359869b636227548cc6.gif b/assets/images/finger-b0999bed13c76359869b636227548cc6.gif new file mode 100644 index 0000000..12b5349 Binary files /dev/null and b/assets/images/finger-b0999bed13c76359869b636227548cc6.gif differ diff --git a/assets/images/founderLens-005975324dcee19c77494d453f8647c2.png b/assets/images/founderLens-005975324dcee19c77494d453f8647c2.png new file mode 100644 index 0000000..8870be6 Binary files /dev/null and b/assets/images/founderLens-005975324dcee19c77494d453f8647c2.png differ diff --git a/assets/images/founderSalaryLens-89e3e6d28efff27c4c8f563cfa49d3ee.png b/assets/images/founderSalaryLens-89e3e6d28efff27c4c8f563cfa49d3ee.png new file mode 100644 index 0000000..9979d9c Binary files /dev/null and b/assets/images/founderSalaryLens-89e3e6d28efff27c4c8f563cfa49d3ee.png differ diff --git a/assets/images/founderVowelTraversal-d35014cf80294acb4990d554bcedb0d3.png b/assets/images/founderVowelTraversal-d35014cf80294acb4990d554bcedb0d3.png new file mode 100644 index 0000000..e90a046 Binary files /dev/null and b/assets/images/founderVowelTraversal-d35014cf80294acb4990d554bcedb0d3.png differ diff --git a/assets/images/generic-2c235d68ea9ba3134644dfbbfcfc8d0e.png b/assets/images/generic-2c235d68ea9ba3134644dfbbfcfc8d0e.png new file mode 100644 index 0000000..6112630 Binary files /dev/null and b/assets/images/generic-2c235d68ea9ba3134644dfbbfcfc8d0e.png differ diff --git a/assets/images/list-a190da16976869e8e07bee62d501a9f7.png b/assets/images/list-a190da16976869e8e07bee62d501a9f7.png new file mode 100644 index 0000000..f5f51c2 Binary files /dev/null and b/assets/images/list-a190da16976869e8e07bee62d501a9f7.png differ diff --git a/assets/images/list-append-063e66f9ba76613ce2a8ba351ea27ee8.gif b/assets/images/list-append-063e66f9ba76613ce2a8ba351ea27ee8.gif new file mode 100644 index 0000000..0422ed6 Binary files /dev/null and b/assets/images/list-append-063e66f9ba76613ce2a8ba351ea27ee8.gif differ diff --git a/assets/images/list-prepend-d90a987fd8bfc72246aa9c61dbfcf1c8.gif b/assets/images/list-prepend-d90a987fd8bfc72246aa9c61dbfcf1c8.gif new file mode 100644 index 0000000..e4f14c4 Binary files /dev/null and b/assets/images/list-prepend-d90a987fd8bfc72246aa9c61dbfcf1c8.gif differ diff --git a/assets/images/lists-58f15f89774ee685a16243b40e9ba7c2.png b/assets/images/lists-58f15f89774ee685a16243b40e9ba7c2.png new file mode 100644 index 0000000..36890aa Binary files /dev/null and b/assets/images/lists-58f15f89774ee685a16243b40e9ba7c2.png differ diff --git a/assets/images/namespaced-6dd14cbd377faee7a4c6a3be9940fe68.png b/assets/images/namespaced-6dd14cbd377faee7a4c6a3be9940fe68.png new file mode 100644 index 0000000..82adb9f Binary files /dev/null and b/assets/images/namespaced-6dd14cbd377faee7a4c6a3be9940fe68.png differ diff --git a/assets/images/notSoSimpleXml-d176756e1aae1946e6d6fe906c9d9bbc.png b/assets/images/notSoSimpleXml-d176756e1aae1946e6d6fe906c9d9bbc.png new file mode 100644 index 0000000..aed9412 Binary files /dev/null and b/assets/images/notSoSimpleXml-d176756e1aae1946e6d6fe906c9d9bbc.png differ diff --git a/assets/images/one-two-fe52e6208faa3021867df57332b3e6ec.png b/assets/images/one-two-fe52e6208faa3021867df57332b3e6ec.png new file mode 100644 index 0000000..2276e88 Binary files /dev/null and b/assets/images/one-two-fe52e6208faa3021867df57332b3e6ec.png differ diff --git a/assets/images/points-5c9c6c00db5175c0d948a09163a40637.png b/assets/images/points-5c9c6c00db5175c0d948a09163a40637.png new file mode 100644 index 0000000..b35bb8b Binary files /dev/null and b/assets/images/points-5c9c6c00db5175c0d948a09163a40637.png differ diff --git a/assets/images/polylines-00e6358bcbdecbf9807c0bc2ade2d3f9.png b/assets/images/polylines-00e6358bcbdecbf9807c0bc2ade2d3f9.png new file mode 100644 index 0000000..100604d Binary files /dev/null and b/assets/images/polylines-00e6358bcbdecbf9807c0bc2ade2d3f9.png differ diff --git a/assets/images/queue-668a708310e8e78475fbc9b757c69eb3.gif b/assets/images/queue-668a708310e8e78475fbc9b757c69eb3.gif new file mode 100644 index 0000000..26dc49f Binary files /dev/null and b/assets/images/queue-668a708310e8e78475fbc9b757c69eb3.gif differ diff --git a/assets/images/queues-5efd3f3abf9c377155a0b4b6de6a77f9.png b/assets/images/queues-5efd3f3abf9c377155a0b4b6de6a77f9.png new file mode 100644 index 0000000..277195d Binary files /dev/null and b/assets/images/queues-5efd3f3abf9c377155a0b4b6de6a77f9.png differ diff --git a/assets/images/reftree-eb6c2fd2b4464cf68d9c3fe04e8ad231.png b/assets/images/reftree-eb6c2fd2b4464cf68d9c3fe04e8ad231.png new file mode 100644 index 0000000..1a84040 Binary files /dev/null and b/assets/images/reftree-eb6c2fd2b4464cf68d9c3fe04e8ad231.png differ diff --git a/assets/images/salaryLens-0d89d07dc97f512aa7fe6b50f061cfcd.png b/assets/images/salaryLens-0d89d07dc97f512aa7fe6b50f061cfcd.png new file mode 100644 index 0000000..8f636e1 Binary files /dev/null and b/assets/images/salaryLens-0d89d07dc97f512aa7fe6b50f061cfcd.png differ diff --git a/assets/images/simpleTree-bbaebacbd585b97eea7d64d94848caf8.png b/assets/images/simpleTree-bbaebacbd585b97eea7d64d94848caf8.png new file mode 100644 index 0000000..deaa8bc Binary files /dev/null and b/assets/images/simpleTree-bbaebacbd585b97eea7d64d94848caf8.png differ diff --git a/assets/images/simpleXml-33e8a5f26cea7dd70c3808d86690488b.png b/assets/images/simpleXml-33e8a5f26cea7dd70c3808d86690488b.png new file mode 100644 index 0000000..cebfd37 Binary files /dev/null and b/assets/images/simpleXml-33e8a5f26cea7dd70c3808d86690488b.png differ diff --git a/assets/images/startup-2a750a1231daf1c2d9c548867f54ffc1.png b/assets/images/startup-2a750a1231daf1c2d9c548867f54ffc1.png new file mode 100644 index 0000000..69051a5 Binary files /dev/null and b/assets/images/startup-2a750a1231daf1c2d9c548867f54ffc1.png differ diff --git a/assets/images/teaser-c537f72f2d1b9c6052885ae09904eae0.gif b/assets/images/teaser-c537f72f2d1b9c6052885ae09904eae0.gif new file mode 100644 index 0000000..7254caf Binary files /dev/null and b/assets/images/teaser-c537f72f2d1b9c6052885ae09904eae0.gif differ diff --git a/assets/images/tree+zipper-b1cf73da287eda26f64b667ce8dcf311.gif b/assets/images/tree+zipper-b1cf73da287eda26f64b667ce8dcf311.gif new file mode 100644 index 0000000..619c177 Binary files /dev/null and b/assets/images/tree+zipper-b1cf73da287eda26f64b667ce8dcf311.gif differ diff --git a/assets/images/tree2-9e8f1e7e745ac62ee27f909cf0770ae0.png b/assets/images/tree2-9e8f1e7e745ac62ee27f909cf0770ae0.png new file mode 100644 index 0000000..3bbf23d Binary files /dev/null and b/assets/images/tree2-9e8f1e7e745ac62ee27f909cf0770ae0.png differ diff --git a/assets/images/updatedHierarchy-ca0b5d651e31d5815f0d14c96fd928ad.png b/assets/images/updatedHierarchy-ca0b5d651e31d5815f0d14c96fd928ad.png new file mode 100644 index 0000000..4fc6823 Binary files /dev/null and b/assets/images/updatedHierarchy-ca0b5d651e31d5815f0d14c96fd928ad.png differ diff --git a/assets/images/vectors-d5f0252feb82955ab0584957427fb307.png b/assets/images/vectors-d5f0252feb82955ab0584957427fb307.png new file mode 100644 index 0000000..28e1589 Binary files /dev/null and b/assets/images/vectors-d5f0252feb82955ab0584957427fb307.png differ diff --git a/assets/images/vowelTraversal-6534f12953b90dc5b6d40f6ee44e6c27.png b/assets/images/vowelTraversal-6534f12953b90dc5b6d40f6ee44e6c27.png new file mode 100644 index 0000000..243681b Binary files /dev/null and b/assets/images/vowelTraversal-6534f12953b90dc5b6d40f6ee44e6c27.png differ diff --git a/assets/images/x+y-c7fbf58ef886ad0cf3d32f18259c15be.png b/assets/images/x+y-c7fbf58ef886ad0cf3d32f18259c15be.png new file mode 100644 index 0000000..e7fbfd7 Binary files /dev/null and b/assets/images/x+y-c7fbf58ef886ad0cf3d32f18259c15be.png differ diff --git a/assets/images/zipper1+2-bc931dc2a9a17d909a27f5ae5d1e095b.png b/assets/images/zipper1+2-bc931dc2a9a17d909a27f5ae5d1e095b.png new file mode 100644 index 0000000..f64c361 Binary files /dev/null and b/assets/images/zipper1+2-bc931dc2a9a17d909a27f5ae5d1e095b.png differ diff --git a/assets/images/zipper1+3-dafaaae54d3abc9716c59963ceb6f171.png b/assets/images/zipper1+3-dafaaae54d3abc9716c59963ceb6f171.png new file mode 100644 index 0000000..fef2419 Binary files /dev/null and b/assets/images/zipper1+3-dafaaae54d3abc9716c59963ceb6f171.png differ diff --git a/assets/images/zipper1-4a80c9c87d37df30e02c064945cde2f6.png b/assets/images/zipper1-4a80c9c87d37df30e02c064945cde2f6.png new file mode 100644 index 0000000..d3c9dda Binary files /dev/null and b/assets/images/zipper1-4a80c9c87d37df30e02c064945cde2f6.png differ diff --git a/assets/images/zipper1-5f0e8ccac0548193671b75d4f96125e4.png b/assets/images/zipper1-5f0e8ccac0548193671b75d4f96125e4.png new file mode 100644 index 0000000..b3f57a9 Binary files /dev/null and b/assets/images/zipper1-5f0e8ccac0548193671b75d4f96125e4.png differ diff --git a/assets/images/zipper2-1176392f67e450e82bfa63dabbeacf90.png b/assets/images/zipper2-1176392f67e450e82bfa63dabbeacf90.png new file mode 100644 index 0000000..c7c9b4f Binary files /dev/null and b/assets/images/zipper2-1176392f67e450e82bfa63dabbeacf90.png differ diff --git a/assets/images/zipper2b-b4d938aec16be4bc5d0601737ed9bd53.png b/assets/images/zipper2b-b4d938aec16be4bc5d0601737ed9bd53.png new file mode 100644 index 0000000..8f19201 Binary files /dev/null and b/assets/images/zipper2b-b4d938aec16be4bc5d0601737ed9bd53.png differ diff --git a/assets/images/zipper3-25b272311b7ec6ce2e1b0ce993d16055.png b/assets/images/zipper3-25b272311b7ec6ce2e1b0ce993d16055.png new file mode 100644 index 0000000..6a46262 Binary files /dev/null and b/assets/images/zipper3-25b272311b7ec6ce2e1b0ce993d16055.png differ diff --git a/assets/images/zipper3-9ab483dc84adf5005cafecc77e51e394.png b/assets/images/zipper3-9ab483dc84adf5005cafecc77e51e394.png new file mode 100644 index 0000000..f0bb5be Binary files /dev/null and b/assets/images/zipper3-9ab483dc84adf5005cafecc77e51e394.png differ diff --git a/assets/images/zipper4-283827a5d36341e55ced1d024b328633.png b/assets/images/zipper4-283827a5d36341e55ced1d024b328633.png new file mode 100644 index 0000000..f1151d1 Binary files /dev/null and b/assets/images/zipper4-283827a5d36341e55ced1d024b328633.png differ diff --git a/assets/images/zipper4-cbb2cf5c5de815041892e7f3b09703f8.png b/assets/images/zipper4-cbb2cf5c5de815041892e7f3b09703f8.png new file mode 100644 index 0000000..a7563ce Binary files /dev/null and b/assets/images/zipper4-cbb2cf5c5de815041892e7f3b09703f8.png differ diff --git a/assets/images/zipper5-56ccb910b4b659418162c70c7d32c364.png b/assets/images/zipper5-56ccb910b4b659418162c70c7d32c364.png new file mode 100644 index 0000000..b0835a7 Binary files /dev/null and b/assets/images/zipper5-56ccb910b4b659418162c70c7d32c364.png differ diff --git a/assets/images/zipper5-ce83ff83213a95c042b81012c81a28fc.png b/assets/images/zipper5-ce83ff83213a95c042b81012c81a28fc.png new file mode 100644 index 0000000..1326c00 Binary files /dev/null and b/assets/images/zipper5-ce83ff83213a95c042b81012c81a28fc.png differ diff --git a/assets/images/zipper6-4431d6974f1d299e656fa1e5c8d54fb0.png b/assets/images/zipper6-4431d6974f1d299e656fa1e5c8d54fb0.png new file mode 100644 index 0000000..cd3f4d5 Binary files /dev/null and b/assets/images/zipper6-4431d6974f1d299e656fa1e5c8d54fb0.png differ diff --git a/assets/images/zipper6-5e74a23116f43ca88bf512b027cbdd9e.png b/assets/images/zipper6-5e74a23116f43ca88bf512b027cbdd9e.png new file mode 100644 index 0000000..c5c290e Binary files /dev/null and b/assets/images/zipper6-5e74a23116f43ca88bf512b027cbdd9e.png differ diff --git a/assets/images/zipper7-cd17a63fb6f4732884da00b544ffa549.png b/assets/images/zipper7-cd17a63fb6f4732884da00b544ffa549.png new file mode 100644 index 0000000..c3a5d7c Binary files /dev/null and b/assets/images/zipper7-cd17a63fb6f4732884da00b544ffa549.png differ diff --git a/assets/js/132.fe654836.js b/assets/js/132.fe654836.js new file mode 100644 index 0000000..59e83bf --- /dev/null +++ b/assets/js/132.fe654836.js @@ -0,0 +1 @@ +(self.webpackChunkreftree=self.webpackChunkreftree||[]).push([[132],{4744:e=>{"use strict";var t=function(e){return function(e){return!!e&&"object"==typeof e}(e)&&!function(e){var t=Object.prototype.toString.call(e);return"[object RegExp]"===t||"[object Date]"===t||function(e){return e.$$typeof===r}(e)}(e)};var r="function"==typeof Symbol&&Symbol.for?Symbol.for("react.element"):60103;function n(e,t){return!1!==t.clone&&t.isMergeableObject(e)?s((r=e,Array.isArray(r)?[]:{}),e,t):e;var r}function a(e,t,r){return e.concat(t).map((function(e){return n(e,r)}))}function o(e){return Object.keys(e).concat(function(e){return Object.getOwnPropertySymbols?Object.getOwnPropertySymbols(e).filter((function(t){return Object.propertyIsEnumerable.call(e,t)})):[]}(e))}function i(e,t){try{return t in e}catch(r){return!1}}function l(e,t,r){var a={};return r.isMergeableObject(e)&&o(e).forEach((function(t){a[t]=n(e[t],r)})),o(t).forEach((function(o){(function(e,t){return i(e,t)&&!(Object.hasOwnProperty.call(e,t)&&Object.propertyIsEnumerable.call(e,t))})(e,o)||(i(e,o)&&r.isMergeableObject(t[o])?a[o]=function(e,t){if(!t.customMerge)return s;var r=t.customMerge(e);return"function"==typeof r?r:s}(o,r)(e[o],t[o],r):a[o]=n(t[o],r))})),a}function s(e,r,o){(o=o||{}).arrayMerge=o.arrayMerge||a,o.isMergeableObject=o.isMergeableObject||t,o.cloneUnlessOtherwiseSpecified=n;var i=Array.isArray(r);return i===Array.isArray(e)?i?o.arrayMerge(e,r,o):l(e,r,o):n(r,o)}s.all=function(e,t){if(!Array.isArray(e))throw new Error("first argument should be an array");return e.reduce((function(e,r){return s(e,r,t)}),{})};var u=s;e.exports=u},6147:e=>{function t(e,t){e.onload=function(){this.onerror=this.onload=null,t(null,e)},e.onerror=function(){this.onerror=this.onload=null,t(new Error("Failed to load "+this.src),e)}}function r(e,t){e.onreadystatechange=function(){"complete"!=this.readyState&&"loaded"!=this.readyState||(this.onreadystatechange=null,t(null,e))}}e.exports=function(e,n,a){var o=document.head||document.getElementsByTagName("head")[0],i=document.createElement("script");"function"==typeof n&&(a=n,n={}),n=n||{},a=a||function(){},i.type=n.type||"text/javascript",i.charset=n.charset||"utf8",i.async=!("async"in n)||!!n.async,i.src=e,n.attrs&&function(e,t){for(var r in t)e.setAttribute(r,t[r])}(i,n.attrs),n.text&&(i.text=""+n.text),("onload"in i?t:r)(i,a),i.onload||t(i,a),o.appendChild(i)}},1811:(e,t,r)=>{"use strict";r.r(t),r.d(t,{default:()=>o});var n=Number.isNaN||function(e){return"number"==typeof e&&e!=e};function a(e,t){if(e.length!==t.length)return!1;for(var r=0;r{var n,a=Object.create,o=Object.defineProperty,i=Object.getOwnPropertyDescriptor,l=Object.getOwnPropertyNames,s=Object.getPrototypeOf,u=Object.prototype.hasOwnProperty,c=(e,t,r,n)=>{if(t&&"object"==typeof t||"function"==typeof t)for(let a of l(t))u.call(e,a)||a===r||o(e,a,{get:()=>t[a],enumerable:!(n=i(t,a))||n.enumerable});return e},d=(e,t,r)=>(r=null!=e?a(s(e)):{},c(!t&&e&&e.__esModule?r:o(r,"default",{value:e,enumerable:!0}),e)),p=(e,t,r)=>(((e,t,r)=>{t in e?o(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r})(e,"symbol"!=typeof t?t+"":t,r),r),y={};((e,t)=>{for(var r in t)o(e,r,{get:t[r],enumerable:!0})})(y,{default:()=>P}),e.exports=(n=y,c(o({},"__esModule",{value:!0}),n));var h=d(r(6540)),f=d(r(115)),m=r(7604),b=r(5635);class P extends h.Component{constructor(){super(...arguments),p(this,"mounted",!1),p(this,"isReady",!1),p(this,"isPlaying",!1),p(this,"isLoading",!0),p(this,"loadOnReady",null),p(this,"startOnPlay",!0),p(this,"seekOnPlay",null),p(this,"onDurationCalled",!1),p(this,"handlePlayerMount",(e=>{this.player||(this.player=e,this.player.load(this.props.url)),this.progress()})),p(this,"getInternalPlayer",(e=>this.player?this.player[e]:null)),p(this,"progress",(()=>{if(this.props.url&&this.player&&this.isReady){const e=this.getCurrentTime()||0,t=this.getSecondsLoaded(),r=this.getDuration();if(r){const n={playedSeconds:e,played:e/r};null!==t&&(n.loadedSeconds=t,n.loaded=t/r),n.playedSeconds===this.prevPlayed&&n.loadedSeconds===this.prevLoaded||this.props.onProgress(n),this.prevPlayed=n.playedSeconds,this.prevLoaded=n.loadedSeconds}}this.progressTimeout=setTimeout(this.progress,this.props.progressFrequency||this.props.progressInterval)})),p(this,"handleReady",(()=>{if(!this.mounted)return;this.isReady=!0,this.isLoading=!1;const{onReady:e,playing:t,volume:r,muted:n}=this.props;e(),n||null===r||this.player.setVolume(r),this.loadOnReady?(this.player.load(this.loadOnReady,!0),this.loadOnReady=null):t&&this.player.play(),this.handleDurationCheck()})),p(this,"handlePlay",(()=>{this.isPlaying=!0,this.isLoading=!1;const{onStart:e,onPlay:t,playbackRate:r}=this.props;this.startOnPlay&&(this.player.setPlaybackRate&&1!==r&&this.player.setPlaybackRate(r),e(),this.startOnPlay=!1),t(),this.seekOnPlay&&(this.seekTo(this.seekOnPlay),this.seekOnPlay=null),this.handleDurationCheck()})),p(this,"handlePause",(e=>{this.isPlaying=!1,this.isLoading||this.props.onPause(e)})),p(this,"handleEnded",(()=>{const{activePlayer:e,loop:t,onEnded:r}=this.props;e.loopOnEnded&&t&&this.seekTo(0),t||(this.isPlaying=!1,r())})),p(this,"handleError",((...e)=>{this.isLoading=!1,this.props.onError(...e)})),p(this,"handleDurationCheck",(()=>{clearTimeout(this.durationCheckTimeout);const e=this.getDuration();e?this.onDurationCalled||(this.props.onDuration(e),this.onDurationCalled=!0):this.durationCheckTimeout=setTimeout(this.handleDurationCheck,100)})),p(this,"handleLoaded",(()=>{this.isLoading=!1}))}componentDidMount(){this.mounted=!0}componentWillUnmount(){clearTimeout(this.progressTimeout),clearTimeout(this.durationCheckTimeout),this.isReady&&this.props.stopOnUnmount&&(this.player.stop(),this.player.disablePIP&&this.player.disablePIP()),this.mounted=!1}componentDidUpdate(e){if(!this.player)return;const{url:t,playing:r,volume:n,muted:a,playbackRate:o,pip:i,loop:l,activePlayer:s,disableDeferredLoading:u}=this.props;if(!(0,f.default)(e.url,t)){if(this.isLoading&&!s.forceLoad&&!u&&!(0,b.isMediaStream)(t))return console.warn(`ReactPlayer: the attempt to load ${t} is being deferred until the player has loaded`),void(this.loadOnReady=t);this.isLoading=!0,this.startOnPlay=!0,this.onDurationCalled=!1,this.player.load(t,this.isReady)}e.playing||!r||this.isPlaying||this.player.play(),e.playing&&!r&&this.isPlaying&&this.player.pause(),!e.pip&&i&&this.player.enablePIP&&this.player.enablePIP(),e.pip&&!i&&this.player.disablePIP&&this.player.disablePIP(),e.volume!==n&&null!==n&&this.player.setVolume(n),e.muted!==a&&(a?this.player.mute():(this.player.unmute(),null!==n&&setTimeout((()=>this.player.setVolume(n))))),e.playbackRate!==o&&this.player.setPlaybackRate&&this.player.setPlaybackRate(o),e.loop!==l&&this.player.setLoop&&this.player.setLoop(l)}getDuration(){return this.isReady?this.player.getDuration():null}getCurrentTime(){return this.isReady?this.player.getCurrentTime():null}getSecondsLoaded(){return this.isReady?this.player.getSecondsLoaded():null}seekTo(e,t,r){if(!this.isReady)return void(0!==e&&(this.seekOnPlay=e,setTimeout((()=>{this.seekOnPlay=null}),5e3)));if(t?"fraction"===t:e>0&&e<1){const t=this.player.getDuration();return t?void this.player.seekTo(t*e,r):void console.warn("ReactPlayer: could not seek using fraction \u2013\xa0duration not yet available")}this.player.seekTo(e,r)}render(){const e=this.props.activePlayer;return e?h.default.createElement(e,{...this.props,onMount:this.handlePlayerMount,onReady:this.handleReady,onPlay:this.handlePlay,onPause:this.handlePause,onEnded:this.handleEnded,onLoaded:this.handleLoaded,onError:this.handleError}):null}}p(P,"displayName","Player"),p(P,"propTypes",m.propTypes),p(P,"defaultProps",m.defaultProps)},5580:(e,t,r)=>{var n,a=Object.create,o=Object.defineProperty,i=Object.getOwnPropertyDescriptor,l=Object.getOwnPropertyNames,s=Object.getPrototypeOf,u=Object.prototype.hasOwnProperty,c=(e,t,r,n)=>{if(t&&"object"==typeof t||"function"==typeof t)for(let a of l(t))u.call(e,a)||a===r||o(e,a,{get:()=>t[a],enumerable:!(n=i(t,a))||n.enumerable});return e},d=(e,t,r)=>(r=null!=e?a(s(e)):{},c(!t&&e&&e.__esModule?r:o(r,"default",{value:e,enumerable:!0}),e)),p=(e,t,r)=>(((e,t,r)=>{t in e?o(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r})(e,"symbol"!=typeof t?t+"":t,r),r),y={};((e,t)=>{for(var r in t)o(e,r,{get:t[r],enumerable:!0})})(y,{createReactPlayer:()=>S}),e.exports=(n=y,c(o({},"__esModule",{value:!0}),n));var h=d(r(6540)),f=d(r(4744)),m=d(r(1811)),b=d(r(115)),P=r(7604),g=r(5635),w=d(r(8021));const v=(0,g.lazy)((()=>r.e(353).then(r.t.bind(r,6734,23)))),O="undefined"!=typeof window&&window.document&&"undefined"!=typeof document,k=void 0!==r.g&&r.g.window&&r.g.window.document,_=Object.keys(P.propTypes),T=O||k?h.Suspense:()=>null,j=[],S=(e,t)=>{var r;return r=class extends h.Component{constructor(){super(...arguments),p(this,"state",{showPreview:!!this.props.light}),p(this,"references",{wrapper:e=>{this.wrapper=e},player:e=>{this.player=e}}),p(this,"handleClickPreview",(e=>{this.setState({showPreview:!1}),this.props.onClickPreview(e)})),p(this,"showPreview",(()=>{this.setState({showPreview:!0})})),p(this,"getDuration",(()=>this.player?this.player.getDuration():null)),p(this,"getCurrentTime",(()=>this.player?this.player.getCurrentTime():null)),p(this,"getSecondsLoaded",(()=>this.player?this.player.getSecondsLoaded():null)),p(this,"getInternalPlayer",((e="player")=>this.player?this.player.getInternalPlayer(e):null)),p(this,"seekTo",((e,t,r)=>{if(!this.player)return null;this.player.seekTo(e,t,r)})),p(this,"handleReady",(()=>{this.props.onReady(this)})),p(this,"getActivePlayer",(0,m.default)((r=>{for(const t of[...j,...e])if(t.canPlay(r))return t;return t||null}))),p(this,"getConfig",(0,m.default)(((e,t)=>{const{config:r}=this.props;return f.default.all([P.defaultProps.config,P.defaultProps.config[t]||{},r,r[t]||{}])}))),p(this,"getAttributes",(0,m.default)((e=>(0,g.omit)(this.props,_)))),p(this,"renderActivePlayer",(e=>{if(!e)return null;const t=this.getActivePlayer(e);if(!t)return null;const r=this.getConfig(e,t.key);return h.default.createElement(w.default,{...this.props,key:t.key,ref:this.references.player,config:r,activePlayer:t.lazyPlayer||t,onReady:this.handleReady})}))}shouldComponentUpdate(e,t){return!(0,b.default)(this.props,e)||!(0,b.default)(this.state,t)}componentDidUpdate(e){const{light:t}=this.props;!e.light&&t&&this.setState({showPreview:!0}),e.light&&!t&&this.setState({showPreview:!1})}renderPreview(e){if(!e)return null;const{light:t,playIcon:r,previewTabIndex:n,oEmbedUrl:a,previewAriaLabel:o}=this.props;return h.default.createElement(v,{url:e,light:t,playIcon:r,previewTabIndex:n,previewAriaLabel:o,oEmbedUrl:a,onClick:this.handleClickPreview})}render(){const{url:e,style:t,width:r,height:n,fallback:a,wrapper:o}=this.props,{showPreview:i}=this.state,l=this.getAttributes(e),s="string"==typeof o?this.references.wrapper:void 0;return h.default.createElement(o,{ref:s,style:{...t,width:r,height:n},...l},h.default.createElement(T,{fallback:a},i?this.renderPreview(e):this.renderActivePlayer(e)))}},p(r,"displayName","ReactPlayer"),p(r,"propTypes",P.propTypes),p(r,"defaultProps",P.defaultProps),p(r,"addCustomPlayer",(e=>{j.push(e)})),p(r,"removeCustomPlayers",(()=>{j.length=0})),p(r,"canPlay",(t=>{for(const r of[...j,...e])if(r.canPlay(t))return!0;return!1})),p(r,"canEnablePIP",(t=>{for(const r of[...j,...e])if(r.canEnablePIP&&r.canEnablePIP(t))return!0;return!1})),r}},3554:(e,t,r)=>{var n,a=Object.create,o=Object.defineProperty,i=Object.getOwnPropertyDescriptor,l=Object.getOwnPropertyNames,s=Object.getPrototypeOf,u=Object.prototype.hasOwnProperty,c=(e,t,r,n)=>{if(t&&"object"==typeof t||"function"==typeof t)for(let a of l(t))u.call(e,a)||a===r||o(e,a,{get:()=>t[a],enumerable:!(n=i(t,a))||n.enumerable});return e},d={};((e,t)=>{for(var r in t)o(e,r,{get:t[r],enumerable:!0})})(d,{default:()=>f}),e.exports=(n=d,c(o({},"__esModule",{value:!0}),n));var p=((e,t,r)=>(r=null!=e?a(s(e)):{},c(!t&&e&&e.__esModule?r:o(r,"default",{value:e,enumerable:!0}),e)))(r(7015)),y=r(5580);const h=p.default[p.default.length-1];var f=(0,y.createReactPlayer)(p.default,h)},327:(e,t,r)=>{var n,a=Object.defineProperty,o=Object.getOwnPropertyDescriptor,i=Object.getOwnPropertyNames,l=Object.prototype.hasOwnProperty,s={};((e,t)=>{for(var r in t)a(e,r,{get:t[r],enumerable:!0})})(s,{AUDIO_EXTENSIONS:()=>_,DASH_EXTENSIONS:()=>S,FLV_EXTENSIONS:()=>E,HLS_EXTENSIONS:()=>j,MATCH_URL_DAILYMOTION:()=>w,MATCH_URL_FACEBOOK:()=>h,MATCH_URL_FACEBOOK_WATCH:()=>f,MATCH_URL_KALTURA:()=>k,MATCH_URL_MIXCLOUD:()=>v,MATCH_URL_MUX:()=>y,MATCH_URL_SOUNDCLOUD:()=>d,MATCH_URL_STREAMABLE:()=>m,MATCH_URL_TWITCH_CHANNEL:()=>g,MATCH_URL_TWITCH_VIDEO:()=>P,MATCH_URL_VIDYARD:()=>O,MATCH_URL_VIMEO:()=>p,MATCH_URL_WISTIA:()=>b,MATCH_URL_YOUTUBE:()=>c,VIDEO_EXTENSIONS:()=>T,canPlay:()=>I}),e.exports=(n=s,((e,t,r,n)=>{if(t&&"object"==typeof t||"function"==typeof t)for(let s of i(t))l.call(e,s)||s===r||a(e,s,{get:()=>t[s],enumerable:!(n=o(t,s))||n.enumerable});return e})(a({},"__esModule",{value:!0}),n));var u=r(5635);const c=/(?:youtu\.be\/|youtube(?:-nocookie|education)?\.com\/(?:embed\/|v\/|watch\/|watch\?v=|watch\?.+&v=|shorts\/|live\/))((\w|-){11})|youtube\.com\/playlist\?list=|youtube\.com\/user\//,d=/(?:soundcloud\.com|snd\.sc)\/[^.]+$/,p=/vimeo\.com\/(?!progressive_redirect).+/,y=/stream\.mux\.com\/(?!\w+\.m3u8)(\w+)/,h=/^https?:\/\/(www\.)?facebook\.com.*\/(video(s)?|watch|story)(\.php?|\/).+$/,f=/^https?:\/\/fb\.watch\/.+$/,m=/streamable\.com\/([a-z0-9]+)$/,b=/(?:wistia\.(?:com|net)|wi\.st)\/(?:medias|embed)\/(?:iframe\/)?([^?]+)/,P=/(?:www\.|go\.)?twitch\.tv\/videos\/(\d+)($|\?)/,g=/(?:www\.|go\.)?twitch\.tv\/([a-zA-Z0-9_]+)($|\?)/,w=/^(?:(?:https?):)?(?:\/\/)?(?:www\.)?(?:(?:dailymotion\.com(?:\/embed)?\/video)|dai\.ly)\/([a-zA-Z0-9]+)(?:_[\w_-]+)?(?:[\w.#_-]+)?/,v=/mixcloud\.com\/([^/]+\/[^/]+)/,O=/vidyard.com\/(?:watch\/)?([a-zA-Z0-9-_]+)/,k=/^https?:\/\/[a-zA-Z]+\.kaltura.(com|org)\/p\/([0-9]+)\/sp\/([0-9]+)00\/embedIframeJs\/uiconf_id\/([0-9]+)\/partner_id\/([0-9]+)(.*)entry_id.([a-zA-Z0-9-_].*)$/,_=/\.(m4a|m4b|mp4a|mpga|mp2|mp2a|mp3|m2a|m3a|wav|weba|aac|oga|spx)($|\?)/i,T=/\.(mp4|og[gv]|webm|mov|m4v)(#t=[,\d+]+)?($|\?)/i,j=/\.(m3u8)($|\?)/i,S=/\.(mpd)($|\?)/i,E=/\.(flv)($|\?)/i,C=e=>{if(e instanceof Array){for(const t of e){if("string"==typeof t&&C(t))return!0;if(C(t.src))return!0}return!1}return!(!(0,u.isMediaStream)(e)&&!(0,u.isBlobUrl)(e))||(_.test(e)||T.test(e)||j.test(e)||S.test(e)||E.test(e))},I={youtube:e=>e instanceof Array?e.every((e=>c.test(e))):c.test(e),soundcloud:e=>d.test(e)&&!_.test(e),vimeo:e=>p.test(e)&&!T.test(e)&&!j.test(e),mux:e=>y.test(e),facebook:e=>h.test(e)||f.test(e),streamable:e=>m.test(e),wistia:e=>b.test(e),twitch:e=>P.test(e)||g.test(e),dailymotion:e=>w.test(e),mixcloud:e=>v.test(e),vidyard:e=>O.test(e),kaltura:e=>k.test(e),file:C}},7015:(e,t,r)=>{Object.create;var n,a=Object.defineProperty,o=Object.getOwnPropertyDescriptor,i=Object.getOwnPropertyNames,l=(Object.getPrototypeOf,Object.prototype.hasOwnProperty),s=(e,t,r,n)=>{if(t&&"object"==typeof t||"function"==typeof t)for(let s of i(t))l.call(e,s)||s===r||a(e,s,{get:()=>t[s],enumerable:!(n=o(t,s))||n.enumerable});return e},u={};((e,t)=>{for(var r in t)a(e,r,{get:t[r],enumerable:!0})})(u,{default:()=>p}),e.exports=(n=u,s(a({},"__esModule",{value:!0}),n));var c=r(5635),d=r(327),p=[{key:"youtube",name:"YouTube",canPlay:d.canPlay.youtube,lazyPlayer:(0,c.lazy)((()=>r.e(446).then(r.t.bind(r,2910,23))))},{key:"soundcloud",name:"SoundCloud",canPlay:d.canPlay.soundcloud,lazyPlayer:(0,c.lazy)((()=>r.e(979).then(r.t.bind(r,3127,23))))},{key:"vimeo",name:"Vimeo",canPlay:d.canPlay.vimeo,lazyPlayer:(0,c.lazy)((()=>r.e(173).then(r.t.bind(r,1423,23))))},{key:"mux",name:"Mux",canPlay:d.canPlay.mux,lazyPlayer:(0,c.lazy)((()=>r.e(723).then(r.t.bind(r,7553,23))))},{key:"facebook",name:"Facebook",canPlay:d.canPlay.facebook,lazyPlayer:(0,c.lazy)((()=>r.e(887).then(r.t.bind(r,1343,23))))},{key:"streamable",name:"Streamable",canPlay:d.canPlay.streamable,lazyPlayer:(0,c.lazy)((()=>r.e(627).then(r.t.bind(r,9643,23))))},{key:"wistia",name:"Wistia",canPlay:d.canPlay.wistia,lazyPlayer:(0,c.lazy)((()=>r.e(340).then(r.t.bind(r,3330,23))))},{key:"twitch",name:"Twitch",canPlay:d.canPlay.twitch,lazyPlayer:(0,c.lazy)((()=>r.e(42).then(r.t.bind(r,1400,23))))},{key:"dailymotion",name:"DailyMotion",canPlay:d.canPlay.dailymotion,lazyPlayer:(0,c.lazy)((()=>r.e(328).then(r.t.bind(r,9348,23))))},{key:"mixcloud",name:"Mixcloud",canPlay:d.canPlay.mixcloud,lazyPlayer:(0,c.lazy)((()=>r.e(570).then(r.t.bind(r,3276,23))))},{key:"vidyard",name:"Vidyard",canPlay:d.canPlay.vidyard,lazyPlayer:(0,c.lazy)((()=>r.e(392).then(r.t.bind(r,3552,23))))},{key:"kaltura",name:"Kaltura",canPlay:d.canPlay.kaltura,lazyPlayer:(0,c.lazy)((()=>r.e(463).then(r.t.bind(r,7945,23))))},{key:"file",name:"FilePlayer",canPlay:d.canPlay.file,canEnablePIP:e=>d.canPlay.file(e)&&(document.pictureInPictureEnabled||(0,c.supportsWebKitPresentationMode)())&&!d.AUDIO_EXTENSIONS.test(e),lazyPlayer:(0,c.lazy)((()=>r.e(458).then(r.t.bind(r,688,23))))}]},7604:(e,t,r)=>{var n,a=Object.create,o=Object.defineProperty,i=Object.getOwnPropertyDescriptor,l=Object.getOwnPropertyNames,s=Object.getPrototypeOf,u=Object.prototype.hasOwnProperty,c=(e,t,r,n)=>{if(t&&"object"==typeof t||"function"==typeof t)for(let a of l(t))u.call(e,a)||a===r||o(e,a,{get:()=>t[a],enumerable:!(n=i(t,a))||n.enumerable});return e},d={};((e,t)=>{for(var r in t)o(e,r,{get:t[r],enumerable:!0})})(d,{defaultProps:()=>_,propTypes:()=>O}),e.exports=(n=d,c(o({},"__esModule",{value:!0}),n));var p=((e,t,r)=>(r=null!=e?a(s(e)):{},c(!t&&e&&e.__esModule?r:o(r,"default",{value:e,enumerable:!0}),e)))(r(5556));const{string:y,bool:h,number:f,array:m,oneOfType:b,shape:P,object:g,func:w,node:v}=p.default,O={url:b([y,m,g]),playing:h,loop:h,controls:h,volume:f,muted:h,playbackRate:f,width:b([y,f]),height:b([y,f]),style:g,progressInterval:f,playsinline:h,pip:h,stopOnUnmount:h,light:b([h,y,g]),playIcon:v,previewTabIndex:f,previewAriaLabel:y,fallback:v,oEmbedUrl:y,wrapper:b([y,w,P({render:w.isRequired})]),config:P({soundcloud:P({options:g}),youtube:P({playerVars:g,embedOptions:g,onUnstarted:w}),facebook:P({appId:y,version:y,playerId:y,attributes:g}),dailymotion:P({params:g}),vimeo:P({playerOptions:g,title:y}),mux:P({attributes:g,version:y}),file:P({attributes:g,tracks:m,forceVideo:h,forceAudio:h,forceHLS:h,forceSafariHLS:h,forceDisableHls:h,forceDASH:h,forceFLV:h,hlsOptions:g,hlsVersion:y,dashVersion:y,flvVersion:y}),wistia:P({options:g,playerId:y,customControls:m}),mixcloud:P({options:g}),twitch:P({options:g,playerId:y}),vidyard:P({options:g})}),onReady:w,onStart:w,onPlay:w,onPause:w,onBuffer:w,onBufferEnd:w,onEnded:w,onError:w,onDuration:w,onSeek:w,onPlaybackRateChange:w,onPlaybackQualityChange:w,onProgress:w,onClickPreview:w,onEnablePIP:w,onDisablePIP:w},k=()=>{},_={playing:!1,loop:!1,controls:!1,volume:null,muted:!1,playbackRate:1,width:"640px",height:"360px",style:{},progressInterval:1e3,playsinline:!1,pip:!1,stopOnUnmount:!0,light:!1,fallback:null,wrapper:"div",previewTabIndex:0,previewAriaLabel:"",oEmbedUrl:"https://noembed.com/embed?url={url}",config:{soundcloud:{options:{visual:!0,buying:!1,liking:!1,download:!1,sharing:!1,show_comments:!1,show_playcount:!1}},youtube:{playerVars:{playsinline:1,showinfo:0,rel:0,iv_load_policy:3,modestbranding:1},embedOptions:{},onUnstarted:k},facebook:{appId:"1309697205772819",version:"v3.3",playerId:null,attributes:{}},dailymotion:{params:{api:1,"endscreen-enable":!1}},vimeo:{playerOptions:{autopause:!1,byline:!1,portrait:!1,title:!1},title:null},mux:{attributes:{},version:"2"},file:{attributes:{},tracks:[],forceVideo:!1,forceAudio:!1,forceHLS:!1,forceDASH:!1,forceFLV:!1,hlsOptions:{},hlsVersion:"1.1.4",dashVersion:"3.1.3",flvVersion:"1.5.0",forceDisableHls:!1},wistia:{options:{},playerId:null,customControls:null},mixcloud:{options:{hide_cover:1}},twitch:{options:{},playerId:null},vidyard:{options:{}}},onReady:k,onStart:k,onPlay:k,onPause:k,onBuffer:k,onBufferEnd:k,onEnded:k,onError:k,onDuration:k,onSeek:k,onPlaybackRateChange:k,onPlaybackQualityChange:k,onProgress:k,onClickPreview:k,onEnablePIP:k,onDisablePIP:k}},5635:(e,t,r)=>{var n,a=Object.create,o=Object.defineProperty,i=Object.getOwnPropertyDescriptor,l=Object.getOwnPropertyNames,s=Object.getPrototypeOf,u=Object.prototype.hasOwnProperty,c=(e,t,r,n)=>{if(t&&"object"==typeof t||"function"==typeof t)for(let a of l(t))u.call(e,a)||a===r||o(e,a,{get:()=>t[a],enumerable:!(n=i(t,a))||n.enumerable});return e},d=(e,t,r)=>(r=null!=e?a(s(e)):{},c(!t&&e&&e.__esModule?r:o(r,"default",{value:e,enumerable:!0}),e)),p={};((e,t)=>{for(var r in t)o(e,r,{get:t[r],enumerable:!0})})(p,{callPlayer:()=>R,getConfig:()=>C,getSDK:()=>E,isBlobUrl:()=>M,isMediaStream:()=>A,lazy:()=>m,omit:()=>I,parseEndTime:()=>k,parseStartTime:()=>O,queryString:()=>T,randomString:()=>_,supportsWebKitPresentationMode:()=>L}),e.exports=(n=p,c(o({},"__esModule",{value:!0}),n));var y=d(r(6540)),h=d(r(6147)),f=d(r(4744));const m=e=>y.default.lazy((async()=>{const t=await e();return"function"==typeof t.default?t:t.default})),b=/[?&#](?:start|t)=([0-9hms]+)/,P=/[?&#]end=([0-9hms]+)/,g=/(\d+)(h|m|s)/g,w=/^\d+$/;function v(e,t){if(e instanceof Array)return;const r=e.match(t);if(r){const e=r[1];if(e.match(g))return function(e){let t=0,r=g.exec(e);for(;null!==r;){const[,n,a]=r;"h"===a&&(t+=60*parseInt(n,10)*60),"m"===a&&(t+=60*parseInt(n,10)),"s"===a&&(t+=parseInt(n,10)),r=g.exec(e)}return t}(e);if(w.test(e))return parseInt(e)}}function O(e){return v(e,b)}function k(e){return v(e,P)}function _(){return Math.random().toString(36).substr(2,5)}function T(e){return Object.keys(e).map((t=>`${t}=${e[t]}`)).join("&")}function j(e){return window[e]?window[e]:window.exports&&window.exports[e]?window.exports[e]:window.module&&window.module.exports&&window.module.exports[e]?window.module.exports[e]:null}const S={},E=function(e){0;return e}((function(e,t,r=null,n=(()=>!0),a=h.default){const o=j(t);return o&&n(o)?Promise.resolve(o):new Promise(((n,o)=>{if(S[e])return void S[e].push({resolve:n,reject:o});S[e]=[{resolve:n,reject:o}];const i=t=>{S[e].forEach((e=>e.resolve(t)))};if(r){const e=window[r];window[r]=function(){e&&e(),i(j(t))}}a(e,(n=>{n?(S[e].forEach((e=>e.reject(n))),S[e]=null):r||i(j(t))}))}))}));function C(e,t){return(0,f.default)(t.config,e.config)}function I(e,...t){const r=[].concat(...t),n={},a=Object.keys(e);for(const o of a)-1===r.indexOf(o)&&(n[o]=e[o]);return n}function R(e,...t){if(!this.player||!this.player[e]){let t=`ReactPlayer: ${this.constructor.displayName} player could not call %c${e}%c \u2013 `;return this.player?this.player[e]||(t+="The method was not available"):t+="The player was not available",console.warn(t,"font-weight: bold",""),null}return this.player[e](...t)}function A(e){return"undefined"!=typeof window&&void 0!==window.MediaStream&&e instanceof window.MediaStream}function M(e){return/^blob:/.test(e)}function L(e=document.createElement("video")){const t=!1===/iPhone|iPod/.test(navigator.userAgent);return e.webkitSupportsPresentationMode&&"function"==typeof e.webkitSetPresentationMode&&t}},8453:(e,t,r)=>{"use strict";r.d(t,{R:()=>i,x:()=>l});var n=r(6540);const a={},o=n.createContext(a);function i(e){const t=n.useContext(o);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function l(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:i(e.components),n.createElement(o.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/17896441.9e05f0ab.js b/assets/js/17896441.9e05f0ab.js new file mode 100644 index 0000000..4f40cf0 --- /dev/null +++ b/assets/js/17896441.9e05f0ab.js @@ -0,0 +1 @@ +(self.webpackChunkreftree=self.webpackChunkreftree||[]).push([[401],{4313:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>qt});var s=n(6540),a=n(1003),o=n(9532),i=n(4848);const l=s.createContext(null);function c(e){let{children:t,content:n}=e;const a=function(e){return(0,s.useMemo)((()=>({metadata:e.metadata,frontMatter:e.frontMatter,assets:e.assets,contentTitle:e.contentTitle,toc:e.toc})),[e])}(n);return(0,i.jsx)(l.Provider,{value:a,children:t})}function r(){const e=(0,s.useContext)(l);if(null===e)throw new o.dV("DocProvider");return e}function d(){const{metadata:e,frontMatter:t,assets:n}=r();return(0,i.jsx)(a.be,{title:e.title,description:e.description,keywords:t.keywords,image:n.image??t.image})}var u=n(4164),m=n(4581),h=n(1312),p=n(8774);function f(e){const{permalink:t,title:n,subLabel:s,isNext:a}=e;return(0,i.jsxs)(p.A,{className:(0,u.A)("pagination-nav__link",a?"pagination-nav__link--next":"pagination-nav__link--prev"),to:t,children:[s&&(0,i.jsx)("div",{className:"pagination-nav__sublabel",children:s}),(0,i.jsx)("div",{className:"pagination-nav__label",children:n})]})}function x(e){const{previous:t,next:n}=e;return(0,i.jsxs)("nav",{className:"pagination-nav docusaurus-mt-lg","aria-label":(0,h.T)({id:"theme.docs.paginator.navAriaLabel",message:"Docs pages",description:"The ARIA label for the docs pagination"}),children:[t&&(0,i.jsx)(f,{...t,subLabel:(0,i.jsx)(h.A,{id:"theme.docs.paginator.previous",description:"The label used to navigate to the previous doc",children:"Previous"})}),n&&(0,i.jsx)(f,{...n,subLabel:(0,i.jsx)(h.A,{id:"theme.docs.paginator.next",description:"The label used to navigate to the next doc",children:"Next"}),isNext:!0})]})}function b(){const{metadata:e}=r();return(0,i.jsx)(x,{previous:e.previous,next:e.next})}var g=n(4586),j=n(4070),v=n(7559),N=n(5597),C=n(2252);const A={unreleased:function(e){let{siteTitle:t,versionMetadata:n}=e;return(0,i.jsx)(h.A,{id:"theme.docs.versions.unreleasedVersionLabel",description:"The label used to tell the user that he's browsing an unreleased doc version",values:{siteTitle:t,versionLabel:(0,i.jsx)("b",{children:n.label})},children:"This is unreleased documentation for {siteTitle} {versionLabel} version."})},unmaintained:function(e){let{siteTitle:t,versionMetadata:n}=e;return(0,i.jsx)(h.A,{id:"theme.docs.versions.unmaintainedVersionLabel",description:"The label used to tell the user that he's browsing an unmaintained doc version",values:{siteTitle:t,versionLabel:(0,i.jsx)("b",{children:n.label})},children:"This is documentation for {siteTitle} {versionLabel}, which is no longer actively maintained."})}};function k(e){const t=A[e.versionMetadata.banner];return(0,i.jsx)(t,{...e})}function y(e){let{versionLabel:t,to:n,onClick:s}=e;return(0,i.jsx)(h.A,{id:"theme.docs.versions.latestVersionSuggestionLabel",description:"The label used to tell the user to check the latest version",values:{versionLabel:t,latestVersionLink:(0,i.jsx)("b",{children:(0,i.jsx)(p.A,{to:n,onClick:s,children:(0,i.jsx)(h.A,{id:"theme.docs.versions.latestVersionLinkLabel",description:"The label used for the latest version suggestion link label",children:"latest version"})})})},children:"For up-to-date documentation, see the {latestVersionLink} ({versionLabel})."})}function L(e){let{className:t,versionMetadata:n}=e;const{siteConfig:{title:s}}=(0,g.A)(),{pluginId:a}=(0,j.vT)({failfast:!0}),{savePreferredVersionName:o}=(0,N.g1)(a),{latestDocSuggestion:l,latestVersionSuggestion:c}=(0,j.HW)(a),r=l??(d=c).docs.find((e=>e.id===d.mainDocId));var d;return(0,i.jsxs)("div",{className:(0,u.A)(t,v.G.docs.docVersionBanner,"alert alert--warning margin-bottom--md"),role:"alert",children:[(0,i.jsx)("div",{children:(0,i.jsx)(k,{siteTitle:s,versionMetadata:n})}),(0,i.jsx)("div",{className:"margin-top--md",children:(0,i.jsx)(y,{versionLabel:c.label,to:r.path,onClick:()=>o(c.name)})})]})}function _(e){let{className:t}=e;const n=(0,C.r)();return n.banner?(0,i.jsx)(L,{className:t,versionMetadata:n}):null}function B(e){let{className:t}=e;const n=(0,C.r)();return n.badge?(0,i.jsx)("span",{className:(0,u.A)(t,v.G.docs.docVersionBadge,"badge badge--secondary"),children:(0,i.jsx)(h.A,{id:"theme.docs.versionBadge.label",values:{versionLabel:n.label},children:"Version: {versionLabel}"})}):null}const w={tag:"tag_zVej",tagRegular:"tagRegular_sFm0",tagWithCount:"tagWithCount_h2kH"};function T(e){let{permalink:t,label:n,count:s,description:a}=e;return(0,i.jsxs)(p.A,{href:t,title:a,className:(0,u.A)(w.tag,s?w.tagWithCount:w.tagRegular),children:[n,s&&(0,i.jsx)("span",{children:s})]})}const E={tags:"tags_jXut",tag:"tag_QGVx"};function H(e){let{tags:t}=e;return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)("b",{children:(0,i.jsx)(h.A,{id:"theme.tags.tagsListLabel",description:"The label alongside a tag list",children:"Tags:"})}),(0,i.jsx)("ul",{className:(0,u.A)(E.tags,"padding--none","margin-left--sm"),children:t.map((e=>(0,i.jsx)("li",{className:E.tag,children:(0,i.jsx)(T,{...e})},e.permalink)))})]})}const M={iconEdit:"iconEdit_Z9Sw"};function I(e){let{className:t,...n}=e;return(0,i.jsx)("svg",{fill:"currentColor",height:"20",width:"20",viewBox:"0 0 40 40",className:(0,u.A)(M.iconEdit,t),"aria-hidden":"true",...n,children:(0,i.jsx)("g",{children:(0,i.jsx)("path",{d:"m34.5 11.7l-3 3.1-6.3-6.3 3.1-3q0.5-0.5 1.2-0.5t1.1 0.5l3.9 3.9q0.5 0.4 0.5 1.1t-0.5 1.2z m-29.5 17.1l18.4-18.5 6.3 6.3-18.4 18.4h-6.3v-6.2z"})})})}function S(e){let{editUrl:t}=e;return(0,i.jsxs)(p.A,{to:t,className:v.G.common.editThisPage,children:[(0,i.jsx)(I,{}),(0,i.jsx)(h.A,{id:"theme.common.editThisPage",description:"The link label to edit the current page",children:"Edit this page"})]})}function U(e){void 0===e&&(e={});const{i18n:{currentLocale:t}}=(0,g.A)(),n=function(){const{i18n:{currentLocale:e,localeConfigs:t}}=(0,g.A)();return t[e].calendar}();return new Intl.DateTimeFormat(t,{calendar:n,...e})}function V(e){let{lastUpdatedAt:t}=e;const n=new Date(t),s=U({day:"numeric",month:"short",year:"numeric",timeZone:"UTC"}).format(n);return(0,i.jsx)(h.A,{id:"theme.lastUpdated.atDate",description:"The words used to describe on which date a page has been last updated",values:{date:(0,i.jsx)("b",{children:(0,i.jsx)("time",{dateTime:n.toISOString(),itemProp:"dateModified",children:s})})},children:" on {date}"})}function R(e){let{lastUpdatedBy:t}=e;return(0,i.jsx)(h.A,{id:"theme.lastUpdated.byUser",description:"The words used to describe by who the page has been last updated",values:{user:(0,i.jsx)("b",{children:t})},children:" by {user}"})}function z(e){let{lastUpdatedAt:t,lastUpdatedBy:n}=e;return(0,i.jsxs)("span",{className:v.G.common.lastUpdated,children:[(0,i.jsx)(h.A,{id:"theme.lastUpdated.lastUpdatedAtBy",description:"The sentence used to display when a page has been last updated, and by who",values:{atDate:t?(0,i.jsx)(V,{lastUpdatedAt:t}):"",byUser:n?(0,i.jsx)(R,{lastUpdatedBy:n}):""},children:"Last updated{atDate}{byUser}"}),!1]})}const O={lastUpdated:"lastUpdated_JAkA"};function P(e){let{className:t,editUrl:n,lastUpdatedAt:s,lastUpdatedBy:a}=e;return(0,i.jsxs)("div",{className:(0,u.A)("row",t),children:[(0,i.jsx)("div",{className:"col",children:n&&(0,i.jsx)(S,{editUrl:n})}),(0,i.jsx)("div",{className:(0,u.A)("col",O.lastUpdated),children:(s||a)&&(0,i.jsx)(z,{lastUpdatedAt:s,lastUpdatedBy:a})})]})}function G(){const{metadata:e}=r(),{editUrl:t,lastUpdatedAt:n,lastUpdatedBy:s,tags:a}=e,o=a.length>0,l=!!(t||n||s);return o||l?(0,i.jsxs)("footer",{className:(0,u.A)(v.G.docs.docFooter,"docusaurus-mt-lg"),children:[o&&(0,i.jsx)("div",{className:(0,u.A)("row margin-top--sm",v.G.docs.docFooterTagsRow),children:(0,i.jsx)("div",{className:"col",children:(0,i.jsx)(H,{tags:a})})}),l&&(0,i.jsx)(P,{className:(0,u.A)("margin-top--sm",v.G.docs.docFooterEditMetaRow),editUrl:t,lastUpdatedAt:n,lastUpdatedBy:s})]}):null}var D=n(1422),W=n(6342);function $(e){const t=e.map((e=>({...e,parentIndex:-1,children:[]}))),n=Array(7).fill(-1);t.forEach(((e,t)=>{const s=n.slice(2,e.level);e.parentIndex=Math.max(...s),n[e.level]=t}));const s=[];return t.forEach((e=>{const{parentIndex:n,...a}=e;n>=0?t[n].children.push(a):s.push(a)})),s}function F(e){let{toc:t,minHeadingLevel:n,maxHeadingLevel:s}=e;return t.flatMap((e=>{const t=F({toc:e.children,minHeadingLevel:n,maxHeadingLevel:s});return function(e){return e.level>=n&&e.level<=s}(e)?[{...e,children:t}]:t}))}function q(e){const t=e.getBoundingClientRect();return t.top===t.bottom?q(e.parentNode):t}function Z(e,t){let{anchorTopOffset:n}=t;const s=e.find((e=>q(e).top>=n));if(s){return function(e){return e.top>0&&e.bottom{e.current=t?0:document.querySelector(".navbar").clientHeight}),[t]),e}function Y(e){const t=(0,s.useRef)(void 0),n=J();(0,s.useEffect)((()=>{if(!e)return()=>{};const{linkClassName:s,linkActiveClassName:a,minHeadingLevel:o,maxHeadingLevel:i}=e;function l(){const e=function(e){return Array.from(document.getElementsByClassName(e))}(s),l=function(e){let{minHeadingLevel:t,maxHeadingLevel:n}=e;const s=[];for(let a=t;a<=n;a+=1)s.push(`h${a}.anchor`);return Array.from(document.querySelectorAll(s.join()))}({minHeadingLevel:o,maxHeadingLevel:i}),c=Z(l,{anchorTopOffset:n.current}),r=e.find((e=>c&&c.id===function(e){return decodeURIComponent(e.href.substring(e.href.indexOf("#")+1))}(e)));e.forEach((e=>{!function(e,n){n?(t.current&&t.current!==e&&t.current.classList.remove(a),e.classList.add(a),t.current=e):e.classList.remove(a)}(e,e===r)}))}return document.addEventListener("scroll",l),document.addEventListener("resize",l),l(),()=>{document.removeEventListener("scroll",l),document.removeEventListener("resize",l)}}),[e,n])}function K(e){let{toc:t,className:n,linkClassName:s,isChild:a}=e;return t.length?(0,i.jsx)("ul",{className:a?void 0:n,children:t.map((e=>(0,i.jsxs)("li",{children:[(0,i.jsx)(p.A,{to:`#${e.id}`,className:s??void 0,dangerouslySetInnerHTML:{__html:e.value}}),(0,i.jsx)(K,{isChild:!0,toc:e.children,className:n,linkClassName:s})]},e.id)))}):null}const Q=s.memo(K);function X(e){let{toc:t,className:n="table-of-contents table-of-contents__left-border",linkClassName:a="table-of-contents__link",linkActiveClassName:o,minHeadingLevel:l,maxHeadingLevel:c,...r}=e;const d=(0,W.p)(),u=l??d.tableOfContents.minHeadingLevel,m=c??d.tableOfContents.maxHeadingLevel,h=function(e){let{toc:t,minHeadingLevel:n,maxHeadingLevel:a}=e;return(0,s.useMemo)((()=>F({toc:$(t),minHeadingLevel:n,maxHeadingLevel:a})),[t,n,a])}({toc:t,minHeadingLevel:u,maxHeadingLevel:m});return Y((0,s.useMemo)((()=>{if(a&&o)return{linkClassName:a,linkActiveClassName:o,minHeadingLevel:u,maxHeadingLevel:m}}),[a,o,u,m])),(0,i.jsx)(Q,{toc:h,className:n,linkClassName:a,...r})}const ee={tocCollapsibleButton:"tocCollapsibleButton_TO0P",tocCollapsibleButtonExpanded:"tocCollapsibleButtonExpanded_MG3E"};function te(e){let{collapsed:t,...n}=e;return(0,i.jsx)("button",{type:"button",...n,className:(0,u.A)("clean-btn",ee.tocCollapsibleButton,!t&&ee.tocCollapsibleButtonExpanded,n.className),children:(0,i.jsx)(h.A,{id:"theme.TOCCollapsible.toggleButtonLabel",description:"The label used by the button on the collapsible TOC component",children:"On this page"})})}const ne={tocCollapsible:"tocCollapsible_ETCw",tocCollapsibleContent:"tocCollapsibleContent_vkbj",tocCollapsibleExpanded:"tocCollapsibleExpanded_sAul"};function se(e){let{toc:t,className:n,minHeadingLevel:s,maxHeadingLevel:a}=e;const{collapsed:o,toggleCollapsed:l}=(0,D.u)({initialState:!0});return(0,i.jsxs)("div",{className:(0,u.A)(ne.tocCollapsible,!o&&ne.tocCollapsibleExpanded,n),children:[(0,i.jsx)(te,{collapsed:o,onClick:l}),(0,i.jsx)(D.N,{lazy:!0,className:ne.tocCollapsibleContent,collapsed:o,children:(0,i.jsx)(X,{toc:t,minHeadingLevel:s,maxHeadingLevel:a})})]})}const ae={tocMobile:"tocMobile_ITEo"};function oe(){const{toc:e,frontMatter:t}=r();return(0,i.jsx)(se,{toc:e,minHeadingLevel:t.toc_min_heading_level,maxHeadingLevel:t.toc_max_heading_level,className:(0,u.A)(v.G.docs.docTocMobile,ae.tocMobile)})}const ie={tableOfContents:"tableOfContents_bqdL",docItemContainer:"docItemContainer_F8PC"},le="table-of-contents__link toc-highlight",ce="table-of-contents__link--active";function re(e){let{className:t,...n}=e;return(0,i.jsx)("div",{className:(0,u.A)(ie.tableOfContents,"thin-scrollbar",t),children:(0,i.jsx)(X,{...n,linkClassName:le,linkActiveClassName:ce})})}function de(){const{toc:e,frontMatter:t}=r();return(0,i.jsx)(re,{toc:e,minHeadingLevel:t.toc_min_heading_level,maxHeadingLevel:t.toc_max_heading_level,className:v.G.docs.docTocDesktop})}var ue=n(1107),me=n(8453),he=n(5260),pe=n(2303),fe=n(5293);function xe(){const{prism:e}=(0,W.p)(),{colorMode:t}=(0,fe.G)(),n=e.theme,s=e.darkTheme||n;return"dark"===t?s:n}var be=n(8426),ge=n.n(be);const je=/title=(?["'])(?.*?)\1/,ve=/\{(?<range>[\d,-]+)\}/,Ne={js:{start:"\\/\\/",end:""},jsBlock:{start:"\\/\\*",end:"\\*\\/"},jsx:{start:"\\{\\s*\\/\\*",end:"\\*\\/\\s*\\}"},bash:{start:"#",end:""},html:{start:"\x3c!--",end:"--\x3e"}},Ce={...Ne,lua:{start:"--",end:""},wasm:{start:"\\;\\;",end:""},tex:{start:"%",end:""},vb:{start:"['\u2018\u2019]",end:""},vbnet:{start:"(?:_\\s*)?['\u2018\u2019]",end:""},rem:{start:"[Rr][Ee][Mm]\\b",end:""},f90:{start:"!",end:""},ml:{start:"\\(\\*",end:"\\*\\)"},cobol:{start:"\\*>",end:""}},Ae=Object.keys(Ne);function ke(e,t){const n=e.map((e=>{const{start:n,end:s}=Ce[e];return`(?:${n}\\s*(${t.flatMap((e=>[e.line,e.block?.start,e.block?.end].filter(Boolean))).join("|")})\\s*${s})`})).join("|");return new RegExp(`^\\s*(?:${n})\\s*$`)}function ye(e,t){let n=e.replace(/\n$/,"");const{language:s,magicComments:a,metastring:o}=t;if(o&&ve.test(o)){const e=o.match(ve).groups.range;if(0===a.length)throw new Error(`A highlight range has been given in code block's metastring (\`\`\` ${o}), but no magic comment config is available. Docusaurus applies the first magic comment entry's className for metastring ranges.`);const t=a[0].className,s=ge()(e).filter((e=>e>0)).map((e=>[e-1,[t]]));return{lineClassNames:Object.fromEntries(s),code:n}}if(void 0===s)return{lineClassNames:{},code:n};const i=function(e,t){switch(e){case"js":case"javascript":case"ts":case"typescript":return ke(["js","jsBlock"],t);case"jsx":case"tsx":return ke(["js","jsBlock","jsx"],t);case"html":return ke(["js","jsBlock","html"],t);case"python":case"py":case"bash":return ke(["bash"],t);case"markdown":case"md":return ke(["html","jsx","bash"],t);case"tex":case"latex":case"matlab":return ke(["tex"],t);case"lua":case"haskell":case"sql":return ke(["lua"],t);case"wasm":return ke(["wasm"],t);case"vb":case"vba":case"visual-basic":return ke(["vb","rem"],t);case"vbnet":return ke(["vbnet","rem"],t);case"batch":return ke(["rem"],t);case"basic":return ke(["rem","f90"],t);case"fsharp":return ke(["js","ml"],t);case"ocaml":case"sml":return ke(["ml"],t);case"fortran":return ke(["f90"],t);case"cobol":return ke(["cobol"],t);default:return ke(Ae,t)}}(s,a),l=n.split("\n"),c=Object.fromEntries(a.map((e=>[e.className,{start:0,range:""}]))),r=Object.fromEntries(a.filter((e=>e.line)).map((e=>{let{className:t,line:n}=e;return[n,t]}))),d=Object.fromEntries(a.filter((e=>e.block)).map((e=>{let{className:t,block:n}=e;return[n.start,t]}))),u=Object.fromEntries(a.filter((e=>e.block)).map((e=>{let{className:t,block:n}=e;return[n.end,t]})));for(let h=0;h<l.length;){const e=l[h].match(i);if(!e){h+=1;continue}const t=e.slice(1).find((e=>void 0!==e));r[t]?c[r[t]].range+=`${h},`:d[t]?c[d[t]].start=h:u[t]&&(c[u[t]].range+=`${c[u[t]].start}-${h-1},`),l.splice(h,1)}n=l.join("\n");const m={};return Object.entries(c).forEach((e=>{let[t,{range:n}]=e;ge()(n).forEach((e=>{m[e]??=[],m[e].push(t)}))})),{lineClassNames:m,code:n}}const Le={codeBlockContainer:"codeBlockContainer_Ckt0"};function _e(e){let{as:t,...n}=e;const s=function(e){const t={color:"--prism-color",backgroundColor:"--prism-background-color"},n={};return Object.entries(e.plain).forEach((e=>{let[s,a]=e;const o=t[s];o&&"string"==typeof a&&(n[o]=a)})),n}(xe());return(0,i.jsx)(t,{...n,style:s,className:(0,u.A)(n.className,Le.codeBlockContainer,v.G.common.codeBlock)})}const Be={codeBlockContent:"codeBlockContent_biex",codeBlockTitle:"codeBlockTitle_Ktv7",codeBlock:"codeBlock_bY9V",codeBlockStandalone:"codeBlockStandalone_MEMb",codeBlockLines:"codeBlockLines_e6Vv",codeBlockLinesWithNumbering:"codeBlockLinesWithNumbering_o6Pm",buttonGroup:"buttonGroup__atx"};function we(e){let{children:t,className:n}=e;return(0,i.jsx)(_e,{as:"pre",tabIndex:0,className:(0,u.A)(Be.codeBlockStandalone,"thin-scrollbar",n),children:(0,i.jsx)("code",{className:Be.codeBlockLines,children:t})})}const Te={attributes:!0,characterData:!0,childList:!0,subtree:!0};function Ee(e,t){const[n,a]=(0,s.useState)(),i=(0,s.useCallback)((()=>{a(e.current?.closest("[role=tabpanel][hidden]"))}),[e,a]);(0,s.useEffect)((()=>{i()}),[i]),function(e,t,n){void 0===n&&(n=Te);const a=(0,o._q)(t),i=(0,o.Be)(n);(0,s.useEffect)((()=>{const t=new MutationObserver(a);return e&&t.observe(e,i),()=>t.disconnect()}),[e,a,i])}(n,(e=>{e.forEach((e=>{"attributes"===e.type&&"hidden"===e.attributeName&&(t(),i())}))}),{attributes:!0,characterData:!1,childList:!1,subtree:!1})}var He=n(1765);const Me={codeLine:"codeLine_lJS_",codeLineNumber:"codeLineNumber_Tfdd",codeLineContent:"codeLineContent_feaV"};function Ie(e){let{line:t,classNames:n,showLineNumbers:s,getLineProps:a,getTokenProps:o}=e;1===t.length&&"\n"===t[0].content&&(t[0].content="");const l=a({line:t,className:(0,u.A)(n,s&&Me.codeLine)}),c=t.map(((e,t)=>(0,i.jsx)("span",{...o({token:e})},t)));return(0,i.jsxs)("span",{...l,children:[s?(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)("span",{className:Me.codeLineNumber}),(0,i.jsx)("span",{className:Me.codeLineContent,children:c})]}):c,(0,i.jsx)("br",{})]})}function Se(e){return(0,i.jsx)("svg",{viewBox:"0 0 24 24",...e,children:(0,i.jsx)("path",{fill:"currentColor",d:"M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"})})}function Ue(e){return(0,i.jsx)("svg",{viewBox:"0 0 24 24",...e,children:(0,i.jsx)("path",{fill:"currentColor",d:"M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"})})}const Ve={copyButtonCopied:"copyButtonCopied_obH4",copyButtonIcons:"copyButtonIcons_eSgA",copyButtonIcon:"copyButtonIcon_y97N",copyButtonSuccessIcon:"copyButtonSuccessIcon_LjdS"};function Re(e){let{code:t,className:n}=e;const[a,o]=(0,s.useState)(!1),l=(0,s.useRef)(void 0),c=(0,s.useCallback)((()=>{!function(e,t){let{target:n=document.body}=void 0===t?{}:t;if("string"!=typeof e)throw new TypeError(`Expected parameter \`text\` to be a \`string\`, got \`${typeof e}\`.`);const s=document.createElement("textarea"),a=document.activeElement;s.value=e,s.setAttribute("readonly",""),s.style.contain="strict",s.style.position="absolute",s.style.left="-9999px",s.style.fontSize="12pt";const o=document.getSelection(),i=o.rangeCount>0&&o.getRangeAt(0);n.append(s),s.select(),s.selectionStart=0,s.selectionEnd=e.length;let l=!1;try{l=document.execCommand("copy")}catch{}s.remove(),i&&(o.removeAllRanges(),o.addRange(i)),a&&a.focus()}(t),o(!0),l.current=window.setTimeout((()=>{o(!1)}),1e3)}),[t]);return(0,s.useEffect)((()=>()=>window.clearTimeout(l.current)),[]),(0,i.jsx)("button",{type:"button","aria-label":a?(0,h.T)({id:"theme.CodeBlock.copied",message:"Copied",description:"The copied button label on code blocks"}):(0,h.T)({id:"theme.CodeBlock.copyButtonAriaLabel",message:"Copy code to clipboard",description:"The ARIA label for copy code blocks button"}),title:(0,h.T)({id:"theme.CodeBlock.copy",message:"Copy",description:"The copy button label on code blocks"}),className:(0,u.A)("clean-btn",n,Ve.copyButton,a&&Ve.copyButtonCopied),onClick:c,children:(0,i.jsxs)("span",{className:Ve.copyButtonIcons,"aria-hidden":"true",children:[(0,i.jsx)(Se,{className:Ve.copyButtonIcon}),(0,i.jsx)(Ue,{className:Ve.copyButtonSuccessIcon})]})})}function ze(e){return(0,i.jsx)("svg",{viewBox:"0 0 24 24",...e,children:(0,i.jsx)("path",{fill:"currentColor",d:"M4 19h6v-2H4v2zM20 5H4v2h16V5zm-3 6H4v2h13.25c1.1 0 2 .9 2 2s-.9 2-2 2H15v-2l-3 3l3 3v-2h2c2.21 0 4-1.79 4-4s-1.79-4-4-4z"})})}const Oe={wordWrapButtonIcon:"wordWrapButtonIcon_Bwma",wordWrapButtonEnabled:"wordWrapButtonEnabled_EoeP"};function Pe(e){let{className:t,onClick:n,isEnabled:s}=e;const a=(0,h.T)({id:"theme.CodeBlock.wordWrapToggle",message:"Toggle word wrap",description:"The title attribute for toggle word wrapping button of code block lines"});return(0,i.jsx)("button",{type:"button",onClick:n,className:(0,u.A)("clean-btn",t,s&&Oe.wordWrapButtonEnabled),"aria-label":a,title:a,children:(0,i.jsx)(ze,{className:Oe.wordWrapButtonIcon,"aria-hidden":"true"})})}function Ge(e){let{children:t,className:n="",metastring:a,title:o,showLineNumbers:l,language:c}=e;const{prism:{defaultLanguage:r,magicComments:d}}=(0,W.p)(),m=function(e){return e?.toLowerCase()}(c??function(e){const t=e.split(" ").find((e=>e.startsWith("language-")));return t?.replace(/language-/,"")}(n)??r),h=xe(),p=function(){const[e,t]=(0,s.useState)(!1),[n,a]=(0,s.useState)(!1),o=(0,s.useRef)(null),i=(0,s.useCallback)((()=>{const n=o.current.querySelector("code");e?n.removeAttribute("style"):(n.style.whiteSpace="pre-wrap",n.style.overflowWrap="anywhere"),t((e=>!e))}),[o,e]),l=(0,s.useCallback)((()=>{const{scrollWidth:e,clientWidth:t}=o.current,n=e>t||o.current.querySelector("code").hasAttribute("style");a(n)}),[o]);return Ee(o,l),(0,s.useEffect)((()=>{l()}),[e,l]),(0,s.useEffect)((()=>(window.addEventListener("resize",l,{passive:!0}),()=>{window.removeEventListener("resize",l)})),[l]),{codeBlockRef:o,isEnabled:e,isCodeScrollable:n,toggle:i}}(),f=function(e){return e?.match(je)?.groups.title??""}(a)||o,{lineClassNames:x,code:b}=ye(t,{metastring:a,language:m,magicComments:d}),g=l??function(e){return Boolean(e?.includes("showLineNumbers"))}(a);return(0,i.jsxs)(_e,{as:"div",className:(0,u.A)(n,m&&!n.includes(`language-${m}`)&&`language-${m}`),children:[f&&(0,i.jsx)("div",{className:Be.codeBlockTitle,children:f}),(0,i.jsxs)("div",{className:Be.codeBlockContent,children:[(0,i.jsx)(He.f4,{theme:h,code:b,language:m??"text",children:e=>{let{className:t,style:n,tokens:s,getLineProps:a,getTokenProps:o}=e;return(0,i.jsx)("pre",{tabIndex:0,ref:p.codeBlockRef,className:(0,u.A)(t,Be.codeBlock,"thin-scrollbar"),style:n,children:(0,i.jsx)("code",{className:(0,u.A)(Be.codeBlockLines,g&&Be.codeBlockLinesWithNumbering),children:s.map(((e,t)=>(0,i.jsx)(Ie,{line:e,getLineProps:a,getTokenProps:o,classNames:x[t],showLineNumbers:g},t)))})})}}),(0,i.jsxs)("div",{className:Be.buttonGroup,children:[(p.isEnabled||p.isCodeScrollable)&&(0,i.jsx)(Pe,{className:Be.codeButton,onClick:()=>p.toggle(),isEnabled:p.isEnabled}),(0,i.jsx)(Re,{className:Be.codeButton,code:b})]})]})]})}function De(e){let{children:t,...n}=e;const a=(0,pe.A)(),o=function(e){return s.Children.toArray(e).some((e=>(0,s.isValidElement)(e)))?e:Array.isArray(e)?e.join(""):e}(t),l="string"==typeof o?Ge:we;return(0,i.jsx)(l,{...n,children:o},String(a))}function We(e){return(0,i.jsx)("code",{...e})}var $e=n(3427);const Fe={details:"details_lb9f",isBrowser:"isBrowser_bmU9",collapsibleContent:"collapsibleContent_i85q"};function qe(e){return!!e&&("SUMMARY"===e.tagName||qe(e.parentElement))}function Ze(e,t){return!!e&&(e===t||Ze(e.parentElement,t))}function Je(e){let{summary:t,children:n,...a}=e;(0,$e.A)().collectAnchor(a.id);const o=(0,pe.A)(),l=(0,s.useRef)(null),{collapsed:c,setCollapsed:r}=(0,D.u)({initialState:!a.open}),[d,m]=(0,s.useState)(a.open),h=s.isValidElement(t)?t:(0,i.jsx)("summary",{children:t??"Details"});return(0,i.jsxs)("details",{...a,ref:l,open:d,"data-collapsed":c,className:(0,u.A)(Fe.details,o&&Fe.isBrowser,a.className),onMouseDown:e=>{qe(e.target)&&e.detail>1&&e.preventDefault()},onClick:e=>{e.stopPropagation();const t=e.target;qe(t)&&Ze(t,l.current)&&(e.preventDefault(),c?(r(!1),m(!0)):r(!0))},children:[h,(0,i.jsx)(D.N,{lazy:!1,collapsed:c,disableSSRStyle:!0,onCollapseTransitionEnd:e=>{r(e),m(!e)},children:(0,i.jsx)("div",{className:Fe.collapsibleContent,children:n})})]})}const Ye={details:"details_b_Ee"},Ke="alert alert--info";function Qe(e){let{...t}=e;return(0,i.jsx)(Je,{...t,className:(0,u.A)(Ke,Ye.details,t.className)})}function Xe(e){const t=s.Children.toArray(e.children),n=t.find((e=>s.isValidElement(e)&&"summary"===e.type)),a=(0,i.jsx)(i.Fragment,{children:t.filter((e=>e!==n))});return(0,i.jsx)(Qe,{...e,summary:n,children:a})}function et(e){return(0,i.jsx)(ue.A,{...e})}const tt={containsTaskList:"containsTaskList_mC6p"};function nt(e){if(void 0!==e)return(0,u.A)(e,e?.includes("contains-task-list")&&tt.containsTaskList)}const st={img:"img_ev3q"};function at(e){const{mdxAdmonitionTitle:t,rest:n}=function(e){const t=s.Children.toArray(e),n=t.find((e=>s.isValidElement(e)&&"mdxAdmonitionTitle"===e.type)),a=t.filter((e=>e!==n)),o=n?.props.children;return{mdxAdmonitionTitle:o,rest:a.length>0?(0,i.jsx)(i.Fragment,{children:a}):null}}(e.children),a=e.title??t;return{...e,...a&&{title:a},children:n}}const ot={admonition:"admonition_xJq3",admonitionHeading:"admonitionHeading_Gvgb",admonitionIcon:"admonitionIcon_Rf37",admonitionContent:"admonitionContent_BuS1"};function it(e){let{type:t,className:n,children:s}=e;return(0,i.jsx)("div",{className:(0,u.A)(v.G.common.admonition,v.G.common.admonitionType(t),ot.admonition,n),children:s})}function lt(e){let{icon:t,title:n}=e;return(0,i.jsxs)("div",{className:ot.admonitionHeading,children:[(0,i.jsx)("span",{className:ot.admonitionIcon,children:t}),n]})}function ct(e){let{children:t}=e;return t?(0,i.jsx)("div",{className:ot.admonitionContent,children:t}):null}function rt(e){const{type:t,icon:n,title:s,children:a,className:o}=e;return(0,i.jsxs)(it,{type:t,className:o,children:[s||n?(0,i.jsx)(lt,{title:s,icon:n}):null,(0,i.jsx)(ct,{children:a})]})}function dt(e){return(0,i.jsx)("svg",{viewBox:"0 0 14 16",...e,children:(0,i.jsx)("path",{fillRule:"evenodd",d:"M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"})})}const ut={icon:(0,i.jsx)(dt,{}),title:(0,i.jsx)(h.A,{id:"theme.admonition.note",description:"The default label used for the Note admonition (:::note)",children:"note"})};function mt(e){return(0,i.jsx)(rt,{...ut,...e,className:(0,u.A)("alert alert--secondary",e.className),children:e.children})}function ht(e){return(0,i.jsx)("svg",{viewBox:"0 0 12 16",...e,children:(0,i.jsx)("path",{fillRule:"evenodd",d:"M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"})})}const pt={icon:(0,i.jsx)(ht,{}),title:(0,i.jsx)(h.A,{id:"theme.admonition.tip",description:"The default label used for the Tip admonition (:::tip)",children:"tip"})};function ft(e){return(0,i.jsx)(rt,{...pt,...e,className:(0,u.A)("alert alert--success",e.className),children:e.children})}function xt(e){return(0,i.jsx)("svg",{viewBox:"0 0 14 16",...e,children:(0,i.jsx)("path",{fillRule:"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 0 1 1.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"})})}const bt={icon:(0,i.jsx)(xt,{}),title:(0,i.jsx)(h.A,{id:"theme.admonition.info",description:"The default label used for the Info admonition (:::info)",children:"info"})};function gt(e){return(0,i.jsx)(rt,{...bt,...e,className:(0,u.A)("alert alert--info",e.className),children:e.children})}function jt(e){return(0,i.jsx)("svg",{viewBox:"0 0 16 16",...e,children:(0,i.jsx)("path",{fillRule:"evenodd",d:"M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"})})}const vt={icon:(0,i.jsx)(jt,{}),title:(0,i.jsx)(h.A,{id:"theme.admonition.warning",description:"The default label used for the Warning admonition (:::warning)",children:"warning"})};function Nt(e){return(0,i.jsx)("svg",{viewBox:"0 0 12 16",...e,children:(0,i.jsx)("path",{fillRule:"evenodd",d:"M5.05.31c.81 2.17.41 3.38-.52 4.31C3.55 5.67 1.98 6.45.9 7.98c-1.45 2.05-1.7 6.53 3.53 7.7-2.2-1.16-2.67-4.52-.3-6.61-.61 2.03.53 3.33 1.94 2.86 1.39-.47 2.3.53 2.27 1.67-.02.78-.31 1.44-1.13 1.81 3.42-.59 4.78-3.42 4.78-5.56 0-2.84-2.53-3.22-1.25-5.61-1.52.13-2.03 1.13-1.89 2.75.09 1.08-1.02 1.8-1.86 1.33-.67-.41-.66-1.19-.06-1.78C8.18 5.31 8.68 2.45 5.05.32L5.03.3l.02.01z"})})}const Ct={icon:(0,i.jsx)(Nt,{}),title:(0,i.jsx)(h.A,{id:"theme.admonition.danger",description:"The default label used for the Danger admonition (:::danger)",children:"danger"})};const At={icon:(0,i.jsx)(jt,{}),title:(0,i.jsx)(h.A,{id:"theme.admonition.caution",description:"The default label used for the Caution admonition (:::caution)",children:"caution"})};const kt={...{note:mt,tip:ft,info:gt,warning:function(e){return(0,i.jsx)(rt,{...vt,...e,className:(0,u.A)("alert alert--warning",e.className),children:e.children})},danger:function(e){return(0,i.jsx)(rt,{...Ct,...e,className:(0,u.A)("alert alert--danger",e.className),children:e.children})}},...{secondary:e=>(0,i.jsx)(mt,{title:"secondary",...e}),important:e=>(0,i.jsx)(gt,{title:"important",...e}),success:e=>(0,i.jsx)(ft,{title:"success",...e}),caution:function(e){return(0,i.jsx)(rt,{...At,...e,className:(0,u.A)("alert alert--warning",e.className),children:e.children})}}};function yt(e){const t=at(e),n=(s=t.type,kt[s]||(console.warn(`No admonition component found for admonition type "${s}". Using Info as fallback.`),kt.info));var s;return(0,i.jsx)(n,{...t})}var Lt=n(418);const _t={Head:he.A,details:Xe,Details:Xe,code:function(e){return function(e){return void 0!==e.children&&s.Children.toArray(e.children).every((e=>"string"==typeof e&&!e.includes("\n")))}(e)?(0,i.jsx)(We,{...e}):(0,i.jsx)(De,{...e})},a:function(e){return(0,i.jsx)(p.A,{...e})},pre:function(e){return(0,i.jsx)(i.Fragment,{children:e.children})},ul:function(e){return(0,i.jsx)("ul",{...e,className:nt(e.className)})},li:function(e){return(0,$e.A)().collectAnchor(e.id),(0,i.jsx)("li",{...e})},img:function(e){return(0,i.jsx)("img",{decoding:"async",loading:"lazy",...e,className:(t=e.className,(0,u.A)(t,st.img))});var t},h1:e=>(0,i.jsx)(et,{as:"h1",...e}),h2:e=>(0,i.jsx)(et,{as:"h2",...e}),h3:e=>(0,i.jsx)(et,{as:"h3",...e}),h4:e=>(0,i.jsx)(et,{as:"h4",...e}),h5:e=>(0,i.jsx)(et,{as:"h5",...e}),h6:e=>(0,i.jsx)(et,{as:"h6",...e}),admonition:yt,mermaid:Lt.A};function Bt(e){let{children:t}=e;return(0,i.jsx)(me.x,{components:_t,children:t})}function wt(e){let{children:t}=e;const n=function(){const{metadata:e,frontMatter:t,contentTitle:n}=r();return t.hide_title||void 0!==n?null:e.title}();return(0,i.jsxs)("div",{className:(0,u.A)(v.G.docs.docMarkdown,"markdown"),children:[n&&(0,i.jsx)("header",{children:(0,i.jsx)(ue.A,{as:"h1",children:n})}),(0,i.jsx)(Bt,{children:t})]})}var Tt=n(1754),Et=n(9169),Ht=n(6025);function Mt(e){return(0,i.jsx)("svg",{viewBox:"0 0 24 24",...e,children:(0,i.jsx)("path",{d:"M10 19v-5h4v5c0 .55.45 1 1 1h3c.55 0 1-.45 1-1v-7h1.7c.46 0 .68-.57.33-.87L12.67 3.6c-.38-.34-.96-.34-1.34 0l-8.36 7.53c-.34.3-.13.87.33.87H5v7c0 .55.45 1 1 1h3c.55 0 1-.45 1-1z",fill:"currentColor"})})}const It={breadcrumbHomeIcon:"breadcrumbHomeIcon_YNFT"};function St(){const e=(0,Ht.Ay)("/");return(0,i.jsx)("li",{className:"breadcrumbs__item",children:(0,i.jsx)(p.A,{"aria-label":(0,h.T)({id:"theme.docs.breadcrumbs.home",message:"Home page",description:"The ARIA label for the home page in the breadcrumbs"}),className:"breadcrumbs__link",href:e,children:(0,i.jsx)(Mt,{className:It.breadcrumbHomeIcon})})})}const Ut={breadcrumbsContainer:"breadcrumbsContainer_Z_bl"};function Vt(e){let{children:t,href:n,isLast:s}=e;const a="breadcrumbs__link";return s?(0,i.jsx)("span",{className:a,itemProp:"name",children:t}):n?(0,i.jsx)(p.A,{className:a,href:n,itemProp:"item",children:(0,i.jsx)("span",{itemProp:"name",children:t})}):(0,i.jsx)("span",{className:a,children:t})}function Rt(e){let{children:t,active:n,index:s,addMicrodata:a}=e;return(0,i.jsxs)("li",{...a&&{itemScope:!0,itemProp:"itemListElement",itemType:"https://schema.org/ListItem"},className:(0,u.A)("breadcrumbs__item",{"breadcrumbs__item--active":n}),children:[t,(0,i.jsx)("meta",{itemProp:"position",content:String(s+1)})]})}function zt(){const e=(0,Tt.OF)(),t=(0,Et.Dt)();return e?(0,i.jsx)("nav",{className:(0,u.A)(v.G.docs.docBreadcrumbs,Ut.breadcrumbsContainer),"aria-label":(0,h.T)({id:"theme.docs.breadcrumbs.navAriaLabel",message:"Breadcrumbs",description:"The ARIA label for the breadcrumbs"}),children:(0,i.jsxs)("ul",{className:"breadcrumbs",itemScope:!0,itemType:"https://schema.org/BreadcrumbList",children:[t&&(0,i.jsx)(St,{}),e.map(((t,n)=>{const s=n===e.length-1,a="category"===t.type&&t.linkUnlisted?void 0:t.href;return(0,i.jsx)(Rt,{active:s,index:n,addMicrodata:!!a,children:(0,i.jsx)(Vt,{href:a,isLast:s,children:t.label})},n)}))]})}):null}function Ot(){return(0,i.jsx)(h.A,{id:"theme.unlistedContent.title",description:"The unlisted content banner title",children:"Unlisted page"})}function Pt(){return(0,i.jsx)(h.A,{id:"theme.unlistedContent.message",description:"The unlisted content banner message",children:"This page is unlisted. Search engines will not index it, and only users having a direct link can access it."})}function Gt(){return(0,i.jsx)(he.A,{children:(0,i.jsx)("meta",{name:"robots",content:"noindex, nofollow"})})}function Dt(e){let{className:t}=e;return(0,i.jsx)(yt,{type:"caution",title:(0,i.jsx)(Ot,{}),className:(0,u.A)(t,v.G.common.unlistedBanner),children:(0,i.jsx)(Pt,{})})}function Wt(e){return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(Gt,{}),(0,i.jsx)(Dt,{...e})]})}const $t={docItemContainer:"docItemContainer_Djhp",docItemCol:"docItemCol_VOVn"};function Ft(e){let{children:t}=e;const n=function(){const{frontMatter:e,toc:t}=r(),n=(0,m.l)(),s=e.hide_table_of_contents,a=!s&&t.length>0;return{hidden:s,mobile:a?(0,i.jsx)(oe,{}):void 0,desktop:!a||"desktop"!==n&&"ssr"!==n?void 0:(0,i.jsx)(de,{})}}(),{metadata:{unlisted:s}}=r();return(0,i.jsxs)("div",{className:"row",children:[(0,i.jsxs)("div",{className:(0,u.A)("col",!n.hidden&&$t.docItemCol),children:[s&&(0,i.jsx)(Wt,{}),(0,i.jsx)(_,{}),(0,i.jsxs)("div",{className:$t.docItemContainer,children:[(0,i.jsxs)("article",{children:[(0,i.jsx)(zt,{}),(0,i.jsx)(B,{}),n.mobile,(0,i.jsx)(wt,{children:t}),(0,i.jsx)(G,{})]}),(0,i.jsx)(b,{})]})]}),n.desktop&&(0,i.jsx)("div",{className:"col col--3",children:n.desktop})]})}function qt(e){const t=`docs-doc-id-${e.content.metadata.id}`,n=e.content;return(0,i.jsx)(c,{content:e.content,children:(0,i.jsxs)(a.e3,{className:t,children:[(0,i.jsx)(d,{}),(0,i.jsx)(Ft,{children:(0,i.jsx)(n,{})})]})})}},8426:(e,t)=>{function n(e){let t,n=[];for(let s of e.split(",").map((e=>e.trim())))if(/^-?\d+$/.test(s))n.push(parseInt(s,10));else if(t=s.match(/^(-?\d+)(-|\.\.\.?|\u2025|\u2026|\u22EF)(-?\d+)$/)){let[e,s,a,o]=t;if(s&&o){s=parseInt(s),o=parseInt(o);const e=s<o?1:-1;"-"!==a&&".."!==a&&"\u2025"!==a||(o+=e);for(let t=s;t!==o;t+=e)n.push(t)}}return n}t.default=n,e.exports=n},8453:(e,t,n)=>{"use strict";n.d(t,{R:()=>i,x:()=>l});var s=n(6540);const a={},o=s.createContext(a);function i(e){const t=s.useContext(o);return s.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function l(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:i(e.components),s.createElement(o.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/22c5de9a.0c9c5e17.js b/assets/js/22c5de9a.0c9c5e17.js new file mode 100644 index 0000000..05097c3 --- /dev/null +++ b/assets/js/22c5de9a.0c9c5e17.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkreftree=self.webpackChunkreftree||[]).push([[672],{8598:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>d,contentTitle:()=>l,default:()=>g,frontMatter:()=>o,metadata:()=>c,toc:()=>p});var t=i(4848),s=i(8453),a=i(3554),r=i.n(a);const o={sidebar_position:1,description:"A journey deep inside reftree\u2019s animations feature, showing how some of functional programming techniques and concepts can be applied to produce visualizations of themselves."},l="Visualize your data structures!",c={id:"talks/Visualize",title:"Visualize your data structures!",description:"A journey deep inside reftree\u2019s animations feature, showing how some of functional programming techniques and concepts can be applied to produce visualizations of themselves.",source:"@site/../site-gen/target/mdoc/talks/Visualize.md",sourceDirName:"talks",slug:"/talks/Visualize",permalink:"/reftree/docs/talks/Visualize",draft:!1,unlisted:!1,editUrl:"https://github.com/stanch/reftree/tree/main/docs/../site-gen/target/mdoc/talks/Visualize.md",tags:[],version:"current",sidebarPosition:1,frontMatter:{sidebar_position:1,description:"A journey deep inside reftree\u2019s animations feature, showing how some of functional programming techniques and concepts can be applied to produce visualizations of themselves."},sidebar:"mainSidebar",previous:{title:"Unzipping Immutability",permalink:"/reftree/docs/talks/Immutability"}},d={},p=[{value:"Introducing <code>reftree</code>",id:"introducing-reftree",level:2},{value:"Inside <code>reftree</code>",id:"inside-reftree",level:2},{value:"Functional animation",id:"functional-animation",level:2},{value:"Zipping it up",id:"zipping-it-up",level:2}];function h(e){const n={a:"a",code:"code",em:"em",h1:"h1",h2:"h2",img:"img",li:"li",p:"p",pre:"pre",ul:"ul",...(0,s.R)(),...e.components},{Details:a}=n;return a||function(e,n){throw new Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("Details",!0),(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.h1,{id:"visualize-your-data-structures",children:"Visualize your data structures!"}),"\n",(0,t.jsx)(n.p,{children:"This page contains the materials for my talk \u201cVisualize your data structures!\u201d."}),"\n","\n",(0,t.jsx)(r(),{controls:!0,style:{marginBottom:"1em"},url:"https://www.youtube.com/watch?v=yoayLNPTESk"}),"\n",(0,t.jsxs)(a,{children:[(0,t.jsx)("summary",{children:"Older videos"}),(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["ScalaDays Chicago, April 2017: ",(0,t.jsx)(n.a,{href:"https://www.youtube.com/watch?v=6mWaqGHeg3g",children:"https://www.youtube.com/watch?v=6mWaqGHeg3g"})]}),"\n"]})]}),"\n",(0,t.jsx)(n.p,{children:"You can use this page in two ways:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"as a reference/refresher on the material covered in the talk;"}),"\n",(0,t.jsx)(n.li,{children:"as an interactive playground where you can try the same commands I presented."}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"Throughout this page we will assume the following\ndeclarations (each section might add its own):"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-scala",children:"import reftree.core._\nimport reftree.diagram._\nimport reftree.render._\nimport reftree.geometry._\nimport reftree.svg.animation.Frame\nimport reftree.svg.XmlSvgApi\nimport reftree.svg.XmlSvgApi.svgUnzip\nimport reftree.contrib.XmlInstances._\nimport reftree.contrib.OpticInstances._\nimport reftree.contrib.ZipperInstances._\nimport reftree.contrib.ShapelessInstances._\nimport reftree.util.Optics\nimport reftree.demo.Data\nimport reftree.demo.Shortcuts\nimport scala.collection.immutable._\nimport java.nio.file.Paths\nimport Diagram.{sourceCodeCaption => diagram}\n"})}),"\n",(0,t.jsx)(n.p,{children:"To start an interactive session, just run"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"$ sbt demo\n@ render(List(1, 2, 3))\n"})}),"\n",(0,t.jsxs)(n.p,{children:["and open ",(0,t.jsx)(n.code,{children:"diagram.png"})," in your favorite image viewer (hopefully one that\nreloads images automatically on file change). You will also need to have\n",(0,t.jsx)(n.a,{href:"http://www.graphviz.org/",children:"GraphViz"})," installed. ",(0,t.jsx)(n.em,{children:"The interactive session\nalready has all the necessary imports in scope."})]}),"\n",(0,t.jsxs)(n.h2,{id:"introducing-reftree",children:["Introducing ",(0,t.jsx)(n.code,{children:"reftree"})]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-scala",children:'// extra declarations for this section\nval renderer = Renderer(\n renderingOptions = RenderingOptions(density = 100),\n directory = Paths.get(ImagePath, "visualize")\n)\nimport renderer._\n'})}),"\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.a,{href:"https://stanch.github.io/reftree",children:"reftree"})," is a library for visualizing Scala data structures."]}),"\n",(0,t.jsx)(n.p,{children:"Let\u2019s look at a quick usage example:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-scala",children:'case class Person(firstName: String, age: Int)\n\nval bob = Person("Bob", 42)\n// bob: Person = Person(firstName = "Bob", age = 42)\n\ndiagram(bob).render("bob")\n'})}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"bob",src:i(108).A+"",width:"313",height:"363"})}),"\n",(0,t.jsx)(n.p,{children:"That\u2019s it! You can configure the visualization as you like:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-scala",children:"// render strings as a single box\nimport reftree.contrib.SimplifiedInstances.string\n"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-scala",children:'// rename the firstName field (pun not intended)\nimplicit val personConfig: ToRefTree.DerivationConfig[Person] =\n ToRefTree.DerivationConfig[Person]\n .tweakField("firstName", _.withName("name"))\n\ndiagram(bob).render("bob-simplified")\n'})}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"bob-simplified",src:i(9341).A+"",width:"238",height:"364"})}),"\n",(0,t.jsxs)(n.p,{children:["There are various ways you can use ",(0,t.jsx)(n.code,{children:"reftree"}),":"]}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"improving the documentation of your projects;"}),"\n",(0,t.jsx)(n.li,{children:"live-coding demos;"}),"\n",(0,t.jsx)(n.li,{children:"exploring how things work;"}),"\n",(0,t.jsx)(n.li,{children:"anywhere you need diagrams of your Scala data structures."}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:["(",(0,t.jsx)(n.em,{children:"Incidentally, this talk is an example of all of the above."}),")"]}),"\n",(0,t.jsxs)(n.p,{children:["My previous ",(0,t.jsx)(n.code,{children:"reftree"}),"-powered ",(0,t.jsx)(n.a,{href:"/reftree/docs/talks/Immutability",children:"talk"})," focused on\nimmutable data and various ways it can be manipulated (I do recommend it)."]}),"\n",(0,t.jsxs)(n.p,{children:["Today I would like to take you on a journey deep inside ",(0,t.jsx)(n.code,{children:"reftree"})," itself,\nso that we can see how some of these techniques and concepts can be applied...\nto produce visualizations of themselves \u2014 using one of my favorite ",(0,t.jsx)(n.code,{children:"reftree"}),"\nfeatures: animations."]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-scala",children:'Animation\n .startWith(Queue(1, 2, 3))\n .repeat(3)(_.iterate(2)(q => q :+ (q.max + 1)).iterate(2)(_.tail))\n .build(Diagram.toStringCaption(_).withAnchor("queue"))\n .render("queue")\n'})}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"queue",src:i(9696).A+"",width:"540",height:"922"})}),"\n",(0,t.jsxs)(n.h2,{id:"inside-reftree",children:["Inside ",(0,t.jsx)(n.code,{children:"reftree"})]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-scala",children:"// extra declarations for this section\nimport reftree.contrib.SimplifiedInstances.{option, seq, list}\n"})}),"\n",(0,t.jsxs)(n.p,{children:["First, we need to grasp the basics of ",(0,t.jsx)(n.code,{children:"reftree"}),"."]}),"\n",(0,t.jsxs)(n.p,{children:["To visualize a value of some type ",(0,t.jsx)(n.code,{children:"A"}),", ",(0,t.jsx)(n.code,{children:"reftree"})," converts it into a data structure\ncalled ",(0,t.jsx)(n.code,{children:"RefTree"})," (surprise!), using a typeclass ",(0,t.jsx)(n.code,{children:"ToRefTree[A]"}),"."]}),"\n",(0,t.jsxs)(n.p,{children:["For case classes this is done automagically, using\n",(0,t.jsx)(n.a,{href:"https://github.com/milessabin/shapeless/wiki/Feature-overview:-shapeless-2.0.0#generic-representation-of-sealed-families-of-case-classes",children:(0,t.jsx)(n.em,{children:"shapeless"})}),".\n(",(0,t.jsxs)(n.em,{children:["If you are curious about the magic, take a look at ",(0,t.jsx)(n.a,{href:"https://github.com/stanch/reftree/blob/master/core/shared/src/main/scala/reftree/core/GenericInstances.scala",children:"this file"}),"."]}),")\nGiven our friend ",(0,t.jsx)(n.code,{children:"bob"}),", ",(0,t.jsx)(n.em,{children:"shapeless"})," would provide a generic representation,\nwhich includes the field names (at the type level!) and the values (as a heterogeneous list):"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-scala",children:'Shortcuts.generic(bob)\n// res2: shapeless.::[String with shapeless.labelled.KeyTag[Symbol with shapeless.tag.Tagged["firstName"], String], shapeless.::[Int with shapeless.labelled.KeyTag[Symbol with shapeless.tag.Tagged["age"], Int], shapeless.HNil]] = "Bob" :: 42 :: HNil\n\ndiagram(Shortcuts.generic(bob)).render("generic")\n'})}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"generic",src:i(2634).A+"",width:"417",height:"460"})}),"\n",(0,t.jsxs)(n.p,{children:["This information is enough to auto-generate a ",(0,t.jsx)(n.code,{children:"RefTree"}),".\nNow, what does it look like? The best way to find out is to visualize a ",(0,t.jsx)(n.code,{children:"RefTree"}),"\nof a ",(0,t.jsx)(n.code,{children:"RefTree"}),"!"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-scala",children:'diagram(Shortcuts.refTree(bob)).render("reftree")\n'})}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"reftree",src:i(3342).A+"",width:"1581",height:"836"})}),"\n",(0,t.jsxs)(n.p,{children:["As you can see, it contains values (",(0,t.jsx)(n.code,{children:"Val"}),") and references (",(0,t.jsx)(n.code,{children:"Ref"}),")."]}),"\n",(0,t.jsxs)(n.p,{children:["How do we get from ",(0,t.jsx)(n.code,{children:"RefTree"})," to an image though?\nThis is where ",(0,t.jsx)(n.a,{href:"http://www.graphviz.org/",children:"GraphViz"})," comes in.\nFrom a ",(0,t.jsx)(n.code,{children:"RefTree"})," we can obtain a graph definition that can be rendered by GraphViz:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-scala",children:'Shortcuts.graph(bob).encode\n// res5: String = """digraph "Diagram" {\n// graph [ ranksep=0.8 bgcolor="#ffffff00" ]\n// node [ shape="plaintext" fontname="Source Code Pro" fontcolor="#000000ff" ]\n// edge [ arrowsize=0.7 color="#000000ff" ]\n// "-repl.MdocSession$MdocApp$Person1720614161" [ id="-repl.MdocSession$MdocApp$Person1720614161" label=<<table cellspacing="0" cellpadding="6" cellborder="0" columns="*" bgcolor="#ffffff00" style="rounded"><tr><td port="n" rowspan="2">Person</td><td bgcolor="#ffffff00"><i>name</i></td><td bgcolor="#ffffff00"><i>age</i></td></tr><hr/><tr><td port="0" bgcolor="#ffffff00">·</td><td bgcolor="#ffffff00">42</td></tr></table>> ] [ color="#104e8bff" fontcolor="#104e8bff" ]\n// "-java.lang.String337059875" [ id="-java.lang.String337059875" label=<<table cellspacing="0" cellpadding="6" cellborder="0" columns="*" bgcolor="#ffffff00" style="rounded"><tr><td port="n" rowspan="2">"Bob"</td></tr></table>> ] [ color="#104e8bff" fontcolor="#104e8bff" ]\n// "-repl.MdocSession$MdocApp$Person1720614161":"0":"s" -> "-java.lang.String337059875":"n":"n" [ id="-repl.MdocSession$MdocApp$Person1720614161-0-java.lang.String337059875" ] [ color="#104e8bff" ]\n// }"""\n'})}),"\n",(0,t.jsxs)(n.p,{children:["Going even further, we can ask GraphViz for an ",(0,t.jsx)(n.a,{href:"https://en.wikipedia.org/wiki/Scalable_Vector_Graphics",children:"SVG"})," output:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-scala",children:'Shortcuts.svg(bob)\n// res6: xml.Node = <svg width="171pt" height="168pt" viewBox="0.00 0.00 171.00 168.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><g id="graph0" class="graph"><title>Diagram\x3c!-- -repl.MdocSession$MdocApp$Person1720614161 --\x3e-repl.MdocSession$MdocApp$Person1720614161Personnameage\xb742\x3c!-- -java.lang.String337059875 --\x3e-java.lang.String337059875"Bob"\x3c!-- -repl.MdocSession$MdocApp$Person1720614161->-java.lang.String337059875 --\x3e-repl.MdocSession$MdocApp$Person1720614161:s->-java.lang.String337059875:n\n'})}),"\n",(0,t.jsx)(n.p,{children:"At this point you might be guessing how we can use this as a basis for our animation approach.\nEvery state of a data structure will be a separate frame in the SVG format.\nHowever, an animation consisting of these frames alone would be too jumpy.\nWe need to add intermediate frames to smoothly \u201cmorph\u201d one frame into another.\nWith SVG being a vector format, this sounds simple.\nWe just have to individually morph different aspects of the image:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"graph node positions;"}),"\n",(0,t.jsx)(n.li,{children:"graph edges and their shapes;"}),"\n",(0,t.jsx)(n.li,{children:"colors;"}),"\n",(0,t.jsx)(n.li,{children:"stroke thickness;"}),"\n",(0,t.jsx)(n.li,{children:"transparency."}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"Ouch! A sane functional approach would definitely help here :)"}),"\n",(0,t.jsx)(n.h2,{id:"functional-animation",children:"Functional animation"}),"\n",(0,t.jsxs)(n.p,{children:["Let\u2019s start by introducing an abstraction for morphing, or, in other words,\ninterpolating things of type ",(0,t.jsx)(n.code,{children:"A"}),":"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-scala",children:"trait Interpolation[A] {\n def apply(left: A, right: A, time: Double): A\n def sample(left: A, right: A, n: Int, inclusive: Boolean = true): Seq[A]\n}\n"})}),"\n",(0,t.jsxs)(n.p,{children:["(",(0,t.jsxs)(n.em,{children:["If you are curious, ",(0,t.jsx)(n.a,{href:"https://github.com/stanch/reftree/blob/master/core/shared/src/main/scala/reftree/geometry/Interpolation.scala",children:"here is the actual implementation"}),"."]}),")"]}),"\n",(0,t.jsxs)(n.p,{children:["Once we have an instance of ",(0,t.jsx)(n.code,{children:"Interpolation[xml.Node]"}),", we can generate\nas many intermediate frames as we want! But how do we construct this instance?"]}),"\n",(0,t.jsxs)(n.p,{children:["Consider a lowly floating point number (it can represent an ",(0,t.jsx)(n.em,{children:"x"})," coordinate of some element in our SVG, for example).\nThere is an obvious way to implement ",(0,t.jsx)(n.code,{children:"Interpolation[Double]"}),", which ",(0,t.jsx)(n.code,{children:"reftree"})," already defines as ",(0,t.jsx)(n.code,{children:"Interpolation.double"}),":"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-scala",children:'val numbers = Interpolation.double.sample(0, 10, 5).toList\n// numbers: List[Double] = List(0.0, 2.5, 5.0, 7.5, 10.0)\n\ndiagram(numbers).render("numbers")\n'})}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"numbers",src:i(4447).A+"",width:"376",height:"193"})}),"\n",(0,t.jsx)(n.p,{children:"Now if you think about a point in 2D space, it\u2019s just two numbers joined together:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-scala",children:'val point = Point(0, 10)\n// point: Point = Point(x = 0.0, y = 10.0)\n\ndiagram(point).render("point")\n'})}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"point",src:i(4967).A+"",width:"226",height:"231"})}),"\n",(0,t.jsx)(n.p,{children:"Can we use the number interpolation to interpolate these two numbers?\nTo answer this question, let\u2019s introduce more abstraction\n(in a great tradition of functional programming)."}),"\n",(0,t.jsxs)(n.p,{children:["A lens ",(0,t.jsx)(n.code,{children:"Lens[A, B]"})," is something that can \u201cfocus\u201d on a piece of data of type ",(0,t.jsx)(n.code,{children:"B"}),"\ninside a data structure of type ",(0,t.jsx)(n.code,{children:"A"})," and provide read-write access to it.\nWe will use the excellent ",(0,t.jsxs)(n.a,{href:"https://github.com/julien-truffaut/Monocle",children:[(0,t.jsx)(n.em,{children:"Monocle"})," library"]}),"\nto create lenses and other optics along the way:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-scala",children:'import monocle.macros.GenLens\n\nval x = GenLens[Point](_.x)\n// x: monocle.package.Lens[Point, Double] = repl.MdocSession$MdocApp$$anon$1@3ecdc46e\nval y = GenLens[Point](_.y)\n// y: monocle.package.Lens[Point, Double] = repl.MdocSession$MdocApp$$anon$2@2426d136\n\n(diagram(OpticFocus(x, point)).toNamespace("x") +\n diagram(OpticFocus(y, point)).toNamespace("y")).render("x+y")\n'})}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"x+y",src:i(9221).A+"",width:"580",height:"231"})}),"\n",(0,t.jsx)(n.p,{children:"Lenses provide several methods to manipulate data:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-scala",children:"x.get(point)\n// res10: Double = 0.0\ny.set(20)(point)\n// res11: Point = Point(x = 0.0, y = 20.0)\ny.modify(_ + 20)(point)\n// res12: Point = Point(x = 0.0, y = 30.0)\n"})}),"\n",(0,t.jsxs)(n.p,{children:["If we can read and write each coordinate field, we can interpolate them separately\nand update the point field by field.\nWe do this by piping ",(0,t.jsx)(n.code,{children:"Interpolation.double"})," through ",(0,t.jsx)(n.code,{children:"x"})," and ",(0,t.jsx)(n.code,{children:"y"})," lenses\nand combining the resulting interpolations:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-scala",children:'val pointInterpolation = (\n x.interpolateWith(Interpolation.double) +\n y.interpolateWith(Interpolation.double))\n// pointInterpolation: Interpolation[Point] = reftree.geometry.Interpolation$$anonfun$apply$4@22a4cc89\n\nval points = pointInterpolation.sample(Point(0, 0), Point(10, 20), 5).toList\n// points: List[Point] = List(\n// Point(x = 0.0, y = 0.0),\n// Point(x = 2.5, y = 5.0),\n// Point(x = 5.0, y = 10.0),\n// Point(x = 7.5, y = 15.0),\n// Point(x = 10.0, y = 20.0)\n// )\n\ndiagram(points).render("points")\n'})}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"points",src:i(7692).A+"",width:"1176",height:"363"})}),"\n",(0,t.jsxs)(n.p,{children:["Of course, ",(0,t.jsx)(n.code,{children:"reftree"})," already defines this as ",(0,t.jsx)(n.code,{children:"Point.interpolation"}),"."]}),"\n",(0,t.jsx)(n.p,{children:"Using the same approach, we can build a polyline interpolator\n(assuming the polylines being interpolated consist of equal number of points):"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-scala",children:'Data.polyline1\n// res14: Polyline = Polyline(\n// points = List(Point(x = 0.0, y = 10.0), Point(x = 10.0, y = 20.0))\n// )\nData.polyline2\n// res15: Polyline = Polyline(\n// points = List(Point(x = 20.0, y = 30.0), Point(x = 40.0, y = 50.0))\n// )\n\nval polylineInterpolation = (GenLens[Polyline](_.points)\n .interpolateEachWith(Point.interpolation))\n// polylineInterpolation: Interpolation[Polyline] = reftree.geometry.Interpolation$$anonfun$apply$4@30694434\n\nval polylines = polylineInterpolation.sample(Data.polyline1, Data.polyline2, 3).toList\n// polylines: List[Polyline] = List(\n// Polyline(points = List(Point(x = 0.0, y = 10.0), Point(x = 10.0, y = 20.0))),\n// Polyline(points = List(Point(x = 10.0, y = 20.0), Point(x = 25.0, y = 35.0))),\n// Polyline(points = List(Point(x = 20.0, y = 30.0), Point(x = 40.0, y = 50.0)))\n// )\n\ndiagram(polylines).render("polylines")\n'})}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"polylines",src:i(5846).A+"",width:"1491",height:"664"})}),"\n",(0,t.jsxs)(n.p,{children:["We are finally ready to implement our first substantial interpolator: one that morphs graph edges.\n",(0,t.jsxs)(n.em,{children:["The following approach is inspired by Mike Bostock\u2019s ",(0,t.jsx)(n.a,{href:"https://bl.ocks.org/mbostock/3916621",children:"path tween"}),",\nhowever ",(0,t.jsx)(n.code,{children:"reftree"})," puts more emphasis on types and even includes its own\n",(0,t.jsx)(n.a,{href:"https://github.com/stanch/reftree/blob/master/core/shared/src/main/scala/reftree/geometry/Path.scala",children:"SVG path parser and simplification algorithm"}),"."]})]}),"\n",(0,t.jsx)(n.p,{children:"The resulting animation should look like this:"}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"edges-100",src:i(8914).A+"",width:"361",height:"194"})}),"\n",(0,t.jsxs)(n.p,{children:["An edge is drawn with an ",(0,t.jsx)(n.a,{href:"https://developer.mozilla.org/en-US/docs/Web/SVG/Tutorial/Paths",children:"SVG path"}),",\nwhich consists of several commands, e.g. \u201cmove to\u201d, \u201cline to\u201d, \u201cbezier curve to\u201d.\nHere is a minimized SVG snippet for an actual edge:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-scala",children:'Data.edge1\n// res17: xml.Node = \n\ndiagram(Data.edge1).render("edge")\n'})}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"edge",src:i(1842).A+"",width:"1365",height:"703"})}),"\n",(0,t.jsxs)(n.p,{children:["As you can see, the commands themselves are given in the ",(0,t.jsx)(n.code,{children:"d"})," attribute inside the ",(0,t.jsx)(n.code,{children:"path"})," element\nin a rather obscure format. Luckily, we have lenses and other optics at our disposal\nto plumb through this mess."]}),"\n",(0,t.jsxs)(n.p,{children:["First, let\u2019s get to the ",(0,t.jsx)(n.code,{children:"path"})," element. ",(0,t.jsx)(n.code,{children:"reftree"})," implements a few things that will help us:"]}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"XmlSvgApi"}),", an implementation of several useful SVG operations for ",(0,t.jsx)(n.em,{children:"scala-xml"}),".\nIn particular, if offers a CSS selector-like method for matching elements of certain type and/or class."]}),"\n",(0,t.jsxs)(n.li,{children:["An optic that focuses on an element deep inside XML or any other recursive data structure: ",(0,t.jsx)(n.code,{children:"Optics.collectFirst"}),".\nIt is actually an ",(0,t.jsx)(n.code,{children:"Optional"}),", not a ",(0,t.jsx)(n.code,{children:"Lens"}),", since the element might be missing."]}),"\n"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-scala",children:'val edgePathElement = Optics.collectFirst(XmlSvgApi.select("path"))\n// edgePathElement: monocle.package.Optional[xml.Node, xml.Node] = monocle.Optional$$anon$6@60d718e3\n\ndiagram(OpticFocus(edgePathElement, Data.edge1)).render("edgePathElement")\n'})}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"edgePathElement",src:i(3135).A+"",width:"1408",height:"703"})}),"\n",(0,t.jsxs)(n.p,{children:["Next, we need to \u201cdescend\u201d to the ",(0,t.jsx)(n.code,{children:"d"})," attribute. Here is where optics really shine:\nwe can compose ",(0,t.jsx)(n.code,{children:"Optional[A, B]"})," with ",(0,t.jsx)(n.code,{children:"Optional[B, C]"})," to get an ",(0,t.jsx)(n.code,{children:"Optional[A, C]"}),":"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-scala",children:'val d = XmlSvgApi.attr("d")\n// d: monocle.package.Optional[xml.Node, String] = monocle.POptional$$anon$1@72eadaae\nval edgePathString = edgePathElement composeOptional d\n// edgePathString: monocle.POptional[xml.Node, xml.Node, String, String] = monocle.POptional$$anon$1@762e80fe\n\ndiagram(OpticFocus(edgePathString, Data.edge1)).render("edgePathString")\n'})}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"edgePathString",src:i(8908).A+"",width:"1403",height:"703"})}),"\n",(0,t.jsx)(n.p,{children:"Next, we will use an isomorphism, another kind of optic, to view\nthe string as a nice case class:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-scala",children:'Path.stringIso\n// res21: monocle.package.Iso[String, Path] = monocle.PIso$$anon$9@c1c32eb\n\nval edgePath = edgePathString composeIso Path.stringIso\n// edgePath: monocle.POptional[xml.Node, xml.Node, Path, Path] = monocle.POptional$$anon$1@54d4338b\n\ndiagram(edgePath.getOption(Data.edge1)).render("edgePath")\n'})}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"edgePath",src:i(3959).A+"",width:"1435",height:"701"})}),"\n",(0,t.jsxs)(n.p,{children:["And finally, another isomorphism takes us from a ",(0,t.jsx)(n.code,{children:"Path"})," to its sampled representation\nas a ",(0,t.jsx)(n.code,{children:"Polyline"}),". (",(0,t.jsx)(n.em,{children:"Purists will say that this is not really an isomorphism because\nit\u2019s not reversible, but with a lot of points you can get pretty close ;)"}),")"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-scala",children:'Path.polylineIso(points = 4)\n// res23: monocle.package.Iso[Path, Polyline] = monocle.PIso$$anon$9@704fac15\n\ndef edgePolyline(points: Int) = edgePath composeIso Path.polylineIso(points)\n\ndiagram(edgePolyline(4).getOption(Data.edge1)).render("edgePolyline")\n'})}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"edgePolyline",src:i(7274).A+"",width:"1727",height:"532"})}),"\n",(0,t.jsx)(n.p,{children:"Let\u2019s interpolate!"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-scala",children:'def edgeInterpolation(points: Int) = edgePolyline(points).interpolateWith(Polyline.interpolation)\n\ndef edges(points: Int, frames: Int) = (Data.edge1 +:\n edgeInterpolation(points).sample(Data.edge1, Data.edge2, frames, inclusive = false) :+\n Data.edge2)\n\nAnimatedGifRenderer.renderFrames(\n edges(4, 4).map(Frame(_)),\n Paths.get(ImagePath, "visualize", "edges-4.gif"),\n RenderingOptions(density = 200),\n AnimationOptions(framesPerSecond = 1)\n)\n\nAnimatedGifRenderer.renderFrames(\n edges(100, 32).map(Frame(_)),\n Paths.get(ImagePath, "visualize", "edges-100.gif"),\n RenderingOptions(density = 200),\n AnimationOptions(framesPerSecond = 8)\n)\n'})}),"\n",(0,t.jsx)(n.p,{children:"With 4 points and 4 frames:"}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"edges-4",src:i(5047).A+"",width:"361",height:"194"})}),"\n",(0,t.jsx)(n.p,{children:"With 100 points and 32 frames:"}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"edges-100",src:i(8914).A+"",width:"361",height:"194"})}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsxs)(n.em,{children:["Interpolating the entire image is left as an exercise for the reader,\nalthough the impatient will find the complete implementation\n",(0,t.jsx)(n.a,{href:"https://github.com/stanch/reftree/blob/master/core/shared/src/main/scala/reftree/svg/animation/GraphInterpolation.scala",children:"here"}),"."]})}),"\n",(0,t.jsxs)(n.p,{children:["Notice that we never touched XML directly.\nIn fact, equipped with the same set of optics for another format or representation,\nwe would be able to operate on it without changing the code too much.\nCase in point: ",(0,t.jsx)(n.code,{children:"reftree"})," supports both\n",(0,t.jsx)(n.a,{href:"https://github.com/stanch/reftree/blob/master/core/jvm/src/main/scala/reftree/svg/XmlSvgApi.scala",children:(0,t.jsx)(n.em,{children:"scala-xml"})})," and\n",(0,t.jsx)(n.a,{href:"https://github.com/stanch/reftree/blob/master/core/js/src/main/scala/reftree/svg/DomSvgApi.scala",children:(0,t.jsx)(n.em,{children:"scala-js-dom"})})," (for Scala.js),\nwith only 50 lines of implementation-specific code for each backend.\nThis goes to show the flexibility and usefulness of optics."]}),"\n",(0,t.jsx)(n.h2,{id:"zipping-it-up",children:"Zipping it up"}),"\n",(0,t.jsxs)(n.p,{children:["In the previous section we saw ",(0,t.jsx)(n.code,{children:"Optics.collectFirst"})," \u2014 an optic that is able to perform\nmodifications deep inside SVG. How do we go about implementing something like this,\nor, more generally, how do we edit recursive data structures such as XML?"]}),"\n",(0,t.jsxs)(n.p,{children:["This solution is called a \u201cZipper\u201d, and was introduced by G\xe9rard Huet in 1997.\nIt consists of a \u201ccursor\u201d pointing to a location anywhere in a tree \u2014 \u201ccurrent focus\u201d.\nThe cursor can be moved freely with operations like ",(0,t.jsx)(n.code,{children:"moveDownLeft"}),", ",(0,t.jsx)(n.code,{children:"moveRight"}),", ",(0,t.jsx)(n.code,{children:"moveUp"}),", etc.\nCurrent focus can be updated, deleted, or new nodes can be inserted to its left or right.\nZippers are immutable, and every operation returns a new Zipper.\nAll the changes made to the tree can be committed, yielding a new modified version of the original tree."]}),"\n",(0,t.jsxs)(n.p,{children:["My ",(0,t.jsx)(n.a,{href:"https://github.com/stanch/zipper#zipper--an-implementation-of-huets-zipper",children:"zipper library"}),"\nprovides a few useful movements and operations. Just like optics, it\u2019s rather generic and flexible.\nThe zipper can operate on any type, as long as an instance of the ",(0,t.jsx)(n.code,{children:"Unzip"})," typeclass is available,\nwhich can be automatically derived in many cases.\n(",(0,t.jsxs)(n.em,{children:["Note that the derivation of ",(0,t.jsx)(n.code,{children:"Unzip"})," for SVG can be found\n",(0,t.jsx)(n.a,{href:"https://github.com/stanch/reftree/blob/master/core/shared/src/main/scala/reftree/svg/api/BaseSvgApi.scala",children:"here"}),"."]}),")"]}),"\n",(0,t.jsx)(n.p,{children:"Consider a simple XML tree:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-scala",children:'Data.simpleXml\n// res27: xml.Node = \n\ndiagram(Data.simpleXml).render("simpleXml")\n'})}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"simpleXml",src:i(4792).A+"",width:"1277",height:"703"})}),"\n",(0,t.jsx)(n.p,{children:"When we wrap a Zipper around this tree, it does not look very interesting yet:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-scala",children:'import zipper.Zipper\n\nval zipper1 = Zipper(Data.simpleXml)\n// zipper1: Zipper[xml.Node] = Zipper(List(),,List(),None)\n\n(diagram(Data.simpleXml) + diagram(zipper1)).render("zipper1")\n'})}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"zipper1",src:i(3618).A+"",width:"1321",height:"872"})}),"\n",(0,t.jsx)(n.p,{children:"We can see that it just points to the original tree.\nIn this case the focus is the root of the tree, which has no siblings,\nand the parent zipper does not exist, since we are at the top level."}),"\n",(0,t.jsx)(n.p,{children:"To move down the tree, we \u201cunzip\u201d it, separating the child nodes into\nthe focused node and its left and right siblings:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-scala",children:'val zipper2 = zipper1.moveDownLeft\n// zipper2: Zipper[xml.Node] = Zipper(List(),,List(, , ),Some(Zipper(List(),,List(),None)))\n\n(diagram(zipper1) + diagram(zipper2)).render("zipper1+2")\n'})}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"zipper1+2",src:i(2385).A+"",width:"1366",height:"1042"})}),"\n",(0,t.jsx)(n.p,{children:"The new Zipper links to the old one,\nwhich will allow us to return to the root of the tree when we are done applying changes.\nThis link however prevents us from seeing the picture clearly.\nLet\u2019s look at the second zipper alone:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-scala",children:'diagram(zipper2).render("zipper2b")\n'})}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"zipper2b",src:i(5823).A+"",width:"1178",height:"872"})}),"\n",(0,t.jsxs)(n.p,{children:["Great! We have ",(0,t.jsx)(n.code,{children:"2"})," in focus and ",(0,t.jsx)(n.code,{children:"3, 4, 5"})," as right siblings. What happens if we move right a bit?"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-scala",children:'val zipper3 = zipper2.moveRightBy(2)\n// zipper3: Zipper[xml.Node] = Zipper(List(, ),,List(),Some(Zipper(List(),,List(),None)))\n\ndiagram(zipper3).render("zipper3")\n'})}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"zipper3",src:i(1248).A+"",width:"1113",height:"872"})}),"\n",(0,t.jsx)(n.p,{children:"This is interesting! Notice that the left siblings are \u201cinverted\u201d.\nThis allows to move left and right in constant time, because the sibling\nadjacent to the focus is always at the head of the list."}),"\n",(0,t.jsx)(n.p,{children:"This also allows us to insert new siblings easily:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-scala",children:'val zipper4 = zipper3.insertLeft()\n// zipper4: Zipper[xml.Node] = Zipper(List(, , ),,List(),Some(Zipper(List(),,List(),None)))\n\ndiagram(zipper4).render("zipper4")\n'})}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"zipper4",src:i(4095).A+"",width:"1235",height:"872"})}),"\n",(0,t.jsx)(n.p,{children:"And, as you might know, we can delete nodes and update the focus:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-scala",children:'val zipper5 = zipper4.deleteAndMoveRight.set()\n// zipper5: Zipper[xml.Node] = Zipper(List(, , ),,List(),Some(Zipper(List(),,List(),None)))\n\ndiagram(zipper5).render("zipper5")\n'})}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"zipper5",src:i(5078).A+"",width:"556",height:"667"})}),"\n",(0,t.jsx)(n.p,{children:"Finally, when we move up, the siblings at the current level are \u201czipped\u201d\ntogether and their parent node is updated:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-scala",children:'val zipper6 = zipper5.moveUp\n// zipper6: Zipper[xml.Node] = Zipper(List(),,List(),None)\n\ndiagram(zipper6).render("zipper6")\n'})}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"zipper6",src:i(6317).A+"",width:"794",height:"703"})}),"\n",(0,t.jsxs)(n.p,{children:["When we are done editing, the ",(0,t.jsx)(n.code,{children:".commit"})," shorthand can be used for going\nall the way up (applying all the changes) and returning the focus.\nNotice how all the unchanged nodes are shared between the old and the new XML."]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-scala",children:'val notSoSimpleXml = zipper6.commit\n// notSoSimpleXml: xml.Node = \n\n(diagram(Data.simpleXml) + diagram(notSoSimpleXml)).render("notSoSimpleXml")\n'})}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"notSoSimpleXml",src:i(4259).A+"",width:"1560",height:"703"})}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsxs)(n.em,{children:["Using an XML zipper, a determined reader can easily implement advanced lenses,\nsuch as ",(0,t.jsx)(n.code,{children:"Optics.collectFirst"}),", ",(0,t.jsx)(n.code,{children:"Optics.collectLeftByKey"}),", etc, all found\n",(0,t.jsx)(n.a,{href:"https://github.com/stanch/reftree/blob/master/core/shared/src/main/scala/reftree/util/Optics.scala",children:"here"}),"."]})}),"\n",(0,t.jsx)(n.p,{children:"To conclude, here is an animation of a zipper and the tree it operates on\n(from my previous talk), produced (as we know now) not without zippers\u2019 help:"}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"tree+zipper",src:i(1864).A+"",width:"1241",height:"690"})}),"\n",(0,t.jsxs)(n.p,{children:["That\u2019s all! Thank you for reading this far.\nI hope you are leaving this page with some great ",(0,t.jsx)(n.code,{children:"reftree"})," use-cases in mind :)"]})]})}function g(e={}){const{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(h,{...e})}):h(e)}},9696:(e,n,i)=>{i.d(n,{A:()=>t});const t=i.p+"assets/images/queue-668a708310e8e78475fbc9b757c69eb3.gif"},1864:(e,n,i)=>{i.d(n,{A:()=>t});const t=i.p+"assets/images/tree+zipper-b1cf73da287eda26f64b667ce8dcf311.gif"},9341:(e,n,i)=>{i.d(n,{A:()=>t});const t="data:image/png;base64,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"},108:(e,n,i)=>{i.d(n,{A:()=>t});const t=i.p+"assets/images/bob-6e8dad95c440d488af22193a37ae0d7f.png"},1842:(e,n,i)=>{i.d(n,{A:()=>t});const t=i.p+"assets/images/edge-0a8b76cae995e0a8c485063cb500de8a.png"},3959:(e,n,i)=>{i.d(n,{A:()=>t});const t=i.p+"assets/images/edgePath-e11472fa0a55e29fd9de9876ff597ceb.png"},3135:(e,n,i)=>{i.d(n,{A:()=>t});const t=i.p+"assets/images/edgePathElement-8070f24cd6faf257dbf2357bbc26ab75.png"},8908:(e,n,i)=>{i.d(n,{A:()=>t});const t=i.p+"assets/images/edgePathString-e95d3068168658ba325a9e873dbf2612.png"},7274:(e,n,i)=>{i.d(n,{A:()=>t});const t=i.p+"assets/images/edgePolyline-7c4044c84e38ce242eefda017e1e188c.png"},8914:(e,n,i)=>{i.d(n,{A:()=>t});const t=i.p+"assets/images/edges-100-9cbc68a0debf543244c33b7d26b22709.gif"},5047:(e,n,i)=>{i.d(n,{A:()=>t});const t=i.p+"assets/images/edges-4-788922eab8ebbf8f1d0ffaa9a071132b.gif"},2634:(e,n,i)=>{i.d(n,{A:()=>t});const t=i.p+"assets/images/generic-2c235d68ea9ba3134644dfbbfcfc8d0e.png"},4259:(e,n,i)=>{i.d(n,{A:()=>t});const t=i.p+"assets/images/notSoSimpleXml-d176756e1aae1946e6d6fe906c9d9bbc.png"},4447:(e,n,i)=>{i.d(n,{A:()=>t});const t="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAXgAAADBCAYAAADFL6uvAAAABmJLR0QA/wD/AP+gvaeTAAAY+UlEQVR4nO3deXxU9b3/8dfnTEiAAJmwheJ+XdqfVi+LtmoF89NeLdYM6BWtv9vepULcuikErL96TW2tkonYa60LoNe61Za6kGitSxVBq31U0WulWrdqa1UWSQIEIZk5n/tHCMQQIDAbHN7PxyOPB3OWz/d75st5z5kzZ86AiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiBTc8PFT7qoYP/XVQvdDRKRQgkJ3IGcsGOv47wvdDRGRQolkwA+rvGAA7gdjgQJeRPZYkQx4vG00EIQhCngR2WMVZbPYsPFTfmjYUcsXzT15+Pjqk8BnAkcCaw3qli2a+1+dyw4fX30vcMDyRXPGdK8zfPyUleZ297LFc78FUFE55WgPbVERqQNTFF0PHGPuPwpjxfdY2H4T8AWcG5Yvnns5QOA2xmFNuoS3ho2rvtIC/7I5+4bGMzGLffPDhTe9073Nww6bXLxySHyGw5eAIxzeC+DuZa02ixfmtH9iO8dNOcPMfrp80dyKT51wzn7plP0IOBnACepXLJpzdeeyI46v/r9p98sCGOWw3rHnDR5avmjOHMAzftJFRLYiq0fwATYK/IPh46trDf8vc3vQzGsMVjtcWzF+ygGbl/Yxji/pXmPk+P/YB2xIaLy0acm0jQLaUhT90twWAn9xsxkWtj9gbk+Z8S7GRYABuDMW+Ki4zZ8zC/dy7ErcfmDO8WGYfojJk2Nd2/zUCefst2JI/Hl3pmB2Fx5OAP+pw/SK/n7NFhtqjALeHjquekw6FTzvBAPd7PsON0H4cudiFZXnfDZ0f9jgdQLONPfzzXgNvH74uKl3Zfh0i4hsU1aP4B1Gg8XBbx/6UfM/Ll06vw2g4vgpa3C7G4/9A/CXvY85Z3Ab7G/GFgGfpmg0gLttCviNgWqh24UrF89ZMmxc9VAzn26Bn75s4dznho+bujfGIXQeERtjgXJ3zlq+eN4jnWWGjatuN/OfjFhRNu5DWNhZPZ0KbsUIN4RFo1ueurFp4/Rnhh0/NQCu3fuYi2a+9+y1H3fWCbDRDqsD83sN/8byRXN/0ePzEcZOBg+XL5p7XpfJC0YeV319m6f67eDTKyKyQ7IW8CPG/cewEEaCzVm+aM75y7vMC0PazQDz5QDtRUWjIcRsyyN4x0eDpeIDSpau3Dx5lGO/Xbl4zhKAwPxgh6eXLZz3HADGQcBSgJFjq/un8E+b+/RlXcIdIIilF3oY4CEHsjHgh4+fchpwQhCGn295elO4dzB7EfdYKlj7D531O/rIKGAk7l9btnhej+EO4MZfzek3fFz1ZcNWNc3qfMF7/+k5f932sykikrmsBXxofUZ3HED7z7rPC8w+45COtfIWgJMeA5aOrQle3qIQNhr405sP/2RDx+PaAP5+uLnXdy7hHef17+2y0higASBV6qOAmON/2KKPBEUGuAcfbZro9gUMQgt+P3z81G4rdLwhCPv6pteaimPPG+6kRwK3L188785tPScrnprzq4rxU6938ytWDIl/Y/j4KXc4sZtXLLr5jW2tJyKSDdk7B99xGiW0vuv/p/ssx0ZjvPb+C3PWAXhgY4A/dz7uZjT4i50PhlS+fwjQn6DjnHzZceeXAweY8wJ0vHMA9raN5/PdbQwQWr+2l7oXDkI7FCAMU5u/AGUcDr4oSPPZHv88OGz5b+ct27QtReGojvWCm3rxrPiyRXO/GcMPdfg52L8Z4dKKcVO+04t1RUQykr1z8KGPMuP1ZY/e0brlTB9DyOLOR+b2aeC17kuNOH7qUaGzr/nmD1iL0j7KDQKLvQjQtyg11kNIe8f5+853DuHGgLfAxwKv9tSP0H2qwVsrR655c1NfoNnNDvnwmblLuy/fI2MUTmgl63p499GzDxbNexX4zt7HXPTdtj5rb3Kz2SMrq+98f+GcldtdWURkJ2XtCN6M0e682H36xiPu/e0TV8z4cDcv7rrc8HHVk0L3hwEsRvcPWJs7L20MQzsSWLvy6b3eBPCO0zNtwz9a3RHQzhiccO9jLur3yfpTzzOj0vFLmD8/3Tk9dF7EOXxY5dRR3fs+bPy547tPc3y0w597fiHbrGLcuScOHzf15K7T3nv22o+t4xSWeZAu3db6IiKZysoR/MYPNg8Bv7X7vL5B+2jHCC3W9QPVt805qWL81O9h/pY7p+K+L3Ax8LP1pDZfIgmjvMsRvZmPxXkRakOAoCNwX1m6dH7b/pX/3nddyKHA+raitY+OOL76P8PQBxPYJNy/ijN7xeJ5v+raPw/T11ssdqGF/nDFuOrLiIWvhGn7DGanG+EJFeOnHL5s0by/dC4fOKN6urxzC0F4Is7MivFTbwN/NB3E3grC9KGOfRv4/QdP3PJub59fEZGdkZUj+HQ/DgcCi9kWR/BOMBrw9IbizaEd8C3gFYdLneByd3tl2KrmE82DYuCd5oW3NXcpMQrrcsmkM9bZfHmlwxin453D+nTsCCCWDuwojI9D99+aMdfcy93szOWL507r3r+Vz9y6JkynP4cFj7v5ZR7aI2ZMNfc3QreDu4b7yLHV/R0OgS23s7tlT8291AJODrFSx34YhOFisFrHFhW3h6dsb30REdmGsuPOLx9WecGAQvdDREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREti1W6A7kWsXxU84esM/Y/Vv/uuT1QvdFRCSfgkJ3INfC0Ko9ZmcVuh8iIvkW+YAXEdlTKeBFRCJKAS8iElEKeBGRiFLAi4hElAJeRCSiFPAiIhGlgBcRiSgFvIhIRCngRUQiSgEvIhJRCngRkYhSwIuIRJQCXkQkohTwIiIRpYAXEYkoBbyISEQp4EVEIkoBLyISUQp4EZGIUsCLiESUAl5EJKIU8CIiEaWAFxGJKAW8iEhEKeBFRCJKAS8iElEKeBGRiFLAi4hElAJeRCSiFPAiIhGlgBcRiSgFvIhIRCngRUQiSgEvIhJRCngRkYhSwIuIRJQCXkQkohTwIiIRpYAXEYkoBbyISEQp4EVEIkoBLyISUQp4EZGIUsCLiESUAl5EJKIU8CIiEaWAFxGJKAW8iEhEKeBFRCJKAS8iElEKeBGRiFLAi4hElAJeRCSiFPAiIhGlgBcRiSgFvIhIRCngRUQiSgEvIhJRCngRkYhSwIuIRJQCXkQkohTwIiIRpYAXEYkoBbyISEQp4EVEIkoBLyISUQp4EZGIUsCLiESUAl5EJKIU8CIiEaWAFxGJKAW8iEhEKeBFRCKqqNAdyLaDJnyzZMWaVP/NU9JF7lZcdtz55Z1TWj5Or+WFOe2F6J+ISL5ELuBbWts+XxKET31yqlMShGd2PhheZgcvh7fy3jkRkTyK3CmaFYs+9bRjH25ltruxZPkTcxTuIhJ5kQt4qA3NuMOxVPc57jjY7YXolYhIvkUw4ME9/XPDtzj9ZObmqdSvCtEnEZF8i2TAr1h0y4sOrwPeOc0hDfbkymdufb+AXRMRyZtIBjyAGXcB4abHTuDmdxawSyIieRXZgCdmd9Fl+xxS7Za6v4A9EhHJq8gG/PIn5rzl+Es4IZAy7KHmhbc1F7pfIiL5EtmABwg8uANzA4o84O5C90dEJJ+s0B0YeNqPhhSliyeHeAI4wGA/oF9Wiocpile/DRbQNuhAsIJvrojsmdLA+8C77jwVI/3zVY2XLM11owVLvKGJWSNTBD8C/h+Aw+OBsdThb+7+QbbaKWl5u9aD2Mq2gftdn62aO8Q4i9CWYb6wIO1nkWGHY4xz9xsK3ZdMOWEsILgAeNThz4XuT6bMOcnNBoDfV+i+ZMoC24vQT3cLbsfDlkL3JxsMBoLtC34Q2JeAIcAfzHxa04IZi3PYbr65xSde8x3crwBvxbkyXZS6e839l36Ui9YqxlVPcfxvyxfPfSQX9bcnnkgucXiupaHmgkK0n03lE+sudLfZzQ01JYXuS8YmXFcS77NhPW7/2tw4/Y5CdydT8UTdnWB7NzfUVBa6L5mKT0pWEvJkSOzg1Q0Xv1no/mRd9c19yj9cfVJo/H9zjnb8HtLpC1se+m5TtpvK771oJlxXEu9TPw/nX3D/sfUNv980/5KcvkK3lTC/KbVXay7bEBHptTnntjfBQ+C/jldd81UzZlus6NlBidmnZvsFLX8BX1nbN95nw2+Azzl+VkvjjPn5aLbp8TmReIsnIlFj3tzIHWWT6n7naWsMLP1ceSJ5QlNDzcvZaiFPV9G4lQ0svQU4KrDgiy0N+Ql3EZFdXcsDM96yWNGxwDsOjcNOqRuRrdp5CfiyRLLGjK+4+7+uWjDtd/loU0Rkd9H8wEXNRYQJINZeZPdSW5uVbM55wA+eeM0+hl1uWH1L44x7c92eiMjuaGXDzPcDD84Aji5bUnpONmrmPODTHtYBTUUl/X6Q67ZERHZnqxqnPYfzM4Mr45OujWdaL6cBPzQxa6TBmQ7fXzH/wrW5bEtEJAr6pP1SoMy8/V8yrZXTgE8RO9uhLShJ/zKX7YiIRMWKX8/4EPw37nZ2prVyfIrGE2Y8lOtr3UVEosQ8uAc4NtMranJ9Dv4gsKxd0ykisifwNL8DLF3EqEzq5C7gJ9cWAyNw3s1ZG12UVdWNiU9MvhOvqpub1cLVN/ehsja/3/gVkT1ac+m+7wEeOhkdwecsuAakSuNAANbr+yuUTUyea85NhMGo5gen/c8ONRjYUTj7YZYArwbz7a+0ffEPVy/0Qf1fboHzs1FvewZNmvW5IIxdBn60wUchPNGHcObKhplrduXaPSlN/LiimLYrHDsFGILxFs4v46tbk+8srF2fSe3yicmr3ZnZ81z/YXPDjMsyqZ/v9vI1NvFE8g7gq9taxt3P2NlLmvM9LgB7T57dr7UtdWQY2rFmfB04pGQ9A5Y9WtPjLUp2i31s/plpEsk2CyjNpD+ROTIdWBy7fe2GVLs7L2Ur3AHcKc/XLdnKTr3mRAvDBvA/uHOJBT7M3C5KERxTPvnqykw+y8hl7Z6UJ+q+4LTPd2wN+G0Yb1hox7pxefOg/kcCEzNqwL0crNmd6VvMiwUvZVQ7z+3ldWwCbvE0C3uaZebfBhvsfYue3On6+R4XYO368GTM7th4N/Bt3ggvSvtYb0Qm4N+bf/HHwK1ZL2yUZ73m1poKwnrgxeaS1pOYX9sGMHhifUPo/lK4PpgK1O+KtXuUthaLeWM/X3fR+4216zZOvT2eqH8DqB80Mfn51Qtqfr/zDQTlmL/X0lBzSza6W8j28jk2zQ/ULIQtA76sKnkC2KEQ/tPq+TWrdr6FfI8LNDdOfwAYCFA+MZns8cVlo0jtY72w2wZ82anXnGhB+HgPsx5vbqj5p+4T96+s7dsycMDFHvjZOPsDzQ5/NPN7mov3v4v5Z6Y7l41X1c3F7AygP1AMdl48kTyvaz3Dj2tqmPFMtran44iXUWD/3PmfA2DVgul/iieSjRbYN9jJ/yC5rL01TQ/VvAKc2/38nAfhAxZavWGHAzsd8E4Yx4MVGXVyF2ivEGPT3dDErIEp41aD+qYFM3f+6J38j8uOiNo+1hu77U/2pdMbXsaZ1PXP4cOtLd88qHRuaH6ZwT3mdibY9wx7G7cbyze8U9112ZBgDs6/45wJYPBI97bSJUWvZnmTjgAoIv1Y9xmGPYazX/nkq8t2wdo7xELfF8DhbxlWKjdn+f6VtX2HVNV/ZvDps/YGz+HJtJy1V/CxSWEzcAYVFff/YebV8j0uO2SP2Me62m2P4Nc+fOkKYEHXafFEsudXyNragCVMNrinaUHNlV3m/GxgVX3tmrGtq2jYPHF14/Q/dKlJiP+lpXHGJ9rKthDbx2DdyoaZa0oTP67oQ/si3Bc1N86Y6u4fYMC62D7ADp/Hy2XtHWax03BfV9RW/GyGlcpD8+ObB5V+BN6fVEC8qn6VW92sloaaZDY/h8lle4Uem2GTfzqgff26CxxuyNK3zfM9Lr22x+xjXey2R/A7pLY2BH8dOCVeVT+J6pv7dM5a0zh9Zcf8wgrwIUAzQJG1Hw4cglnHB5HWcSWS92HorlZ7RwyuuuZo3C9wqF318LdWZ1LLzOfh3JImHNPfW0stzeFmPG7YrLKq5LRs9TnX7RV6bNrb1n0doyxdxHXZqJfvcdkRe8I+1t1uewS/o8KQfw4CbsP8/viHq9fZxOTTHvJwEAT3rlowLcPTBZlzbBkdv9NIS0vrwvig0mmO/XHj7KEAsbRt9RRUoWr3VmnixxUhbXfhwQsta9Zem2m9pgUzru7898brz16htvbs+JLSA83sYrL9mUKO2iv42DgTgZfX3l+zPBvl8j0uOyLq+1hP9piAX/3gjDeAL5QnkkeEcLI5J7pxVejh1fFE8tLmhprZheyfY+8ZXlL25avKWx76blMzbOqP4SMdCPr2e29Xq90bgybPHhxsaHsMzFNFXsXC2lROGqqtDW1i8nF3Zg6sqh+6pnH6ypy0k8X2Cjo2E64rcTYcazAvJ/U75XtctiLK+9jW7BmnaLpoaqh5uaWhJtnUUPOl0G0fzJ8G6rdxz4fVhg3Iecc8fB4gKCqa0H1W6ExweG1b50jLJtUdODQxa2Auamei7MtXlQcb0o+ADQ2Jfak3R4rb3Jbt8JDhwMdr1qxt3pn1s93edrelgGNTXrz+cwZ9bQeuZtrZscn3uGylE5Hcx7Zljwj4YZN/OiBeVT+p+6f5axqnr7QweAKw9uJ0362s/jZwdLZ+YWVrWhpnLHHjWQ/t20y4btOXNeKT6kaZcXJgfv3W1o0n6r5uob2RIvj7gNOSw7NZOxPDTqkbYbHYU8CIMPTje/ODwtvblo5lrknEE/Wnd58+MDHr0xiTHZ7K5ruEnW2vN9tSqLEBcDgAIHTe783y29uefI/LjoriPrY9u+YpmiBMxBP1Pdxkx15ubpj24o6Wa9vQOsHM7oon6v8IyQY3fw0PVuE+xs0vcefXLQ98952e1nXjJnNuKnuhtNEm1v3CCYpxH4Pzq5bGmid2eNu2IXCvcePheJ8Nj1JV999uNoyQGoPniz+227a2nrudaIYBA/uEfB5ozFbtnRWfdNX+7aE9Duxt5tMsxph4ov7YrssUkb6v+1e4e7MtZuGx7syIT6x7ArfFhr0ZOp81/AJgfeDpc7O5LTvbXm+2BfI/Npv6F9qnzCAIYr26bn1725PvcYGO2xSsXZ8+aXMfORigrS9V8arkxwDt1ue51obvLINo7WO9sasewV8BftuWf+ktjg56o6VhxnxSdjD4kziV5vYTw+eb8RWHHwzsGztjq+suqLnZ3C40Yy/cbjT3Kw0OCwLf2hH/TmtqmPGMu1eCN2NWB3wd+EU/bz1ha/fVAAiwG4E3wR8ra2nd4jrcTGrvLA9jM4EDgRJ3u97c7uk+nu2BbXEk1KttWVBziTtfxG0tcK7jtwTmp4HdkYpxWFPjJX/N5rbsbHu92RbI/9h0Muu4kVUsZr06J7697cn3uACsbQ2HYzyw6W/jLTAcft45rZj2Izf1MUL7WEENmjx7cDyR9PjE5GmF7kshxRPJJWWJ5A2F7kc2lE+suzCeSG4odD+yYsJ1JfFE0uNV9V8rdFeyIZ6ouzOeSC4sdD+yIT4pWRlPJH1QYvZBhe5LIcUTybbyRF1GNznM2RH86vkXNQEfm7NXrtoQEYmiipOSpUAfzDL6YlQOT9GY0/F19H1z14aISPSsL/FPA6ThrUzq5PQcvOMvOHwxl22IiESNWXAKsHp1S+uO/S5GNzkNeCN2DzB68MT6Q3PZjohIxHwFs/vI8IdxchrwzSVrfgOsTHv4zVy2IyISFWUTk18EP8yduzOtldvLJOfXtuF+hWHVZYlZR25/BRGRPVhlbZG5zwaebmmY1tPvXeyQnF8H37xm3Y0YfzKCG6iszfq14yIiUREfVPo9sP9jFrsgG7dWzv0XnRbWpjz0fwMOKxvU/9Zd6Ob/IiK7jLKq5JnAf5r75U0LLv7jdlfohbx8k7WlccYSsK8ZdlY8cc1PmPzLWD7aFRHZHcQT1yTMuA3jzqbGmquyVTdvtypobph+n5udC15dtuHdxsETrhuUr7ZFRHZNbmVVddMhvN+wB5vbSqZm81ev8novmpYF0+d5GEwwODrss+G1skR9da7v0igisiuKT6obFU/UP2VmSZzrm8as/QoPfyurtwLJ+90kWx6c9tvBp886Ip0KkobfFF9SegGJ+juCovQvVt03M+83xBcRyZeRVbX9W4P+VeZ2NiGnYryKhyc0N858sud7jWamoB94llfVHwd8w80TQD/gPYO/+6Zf+4oA90FmlnJYV+iuZMqgxKE/0FTovmRJOdAKtBW6I5kypxQjiMS+4xRhDKTjB6oL/nvJWdLXnSFmHAzEgGcdbmtZ3frfubxH/i5xRcvQxKyB7W4nmdk/GowAixe6TyIi2eL4OuAjh9csSD3WvJXfnxARERERERERERERERERERERERERERERERERERER2T38Lw24DnJ90If/AAAAAElFTkSuQmCC"},4967:(e,n,i)=>{i.d(n,{A:()=>t});const t="data:image/png;base64,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"},7692:(e,n,i)=>{i.d(n,{A:()=>t});const t=i.p+"assets/images/points-5c9c6c00db5175c0d948a09163a40637.png"},5846:(e,n,i)=>{i.d(n,{A:()=>t});const t=i.p+"assets/images/polylines-00e6358bcbdecbf9807c0bc2ade2d3f9.png"},3342:(e,n,i)=>{i.d(n,{A:()=>t});const t=i.p+"assets/images/reftree-eb6c2fd2b4464cf68d9c3fe04e8ad231.png"},4792:(e,n,i)=>{i.d(n,{A:()=>t});const t=i.p+"assets/images/simpleXml-33e8a5f26cea7dd70c3808d86690488b.png"},9221:(e,n,i)=>{i.d(n,{A:()=>t});const t=i.p+"assets/images/x+y-c7fbf58ef886ad0cf3d32f18259c15be.png"},2385:(e,n,i)=>{i.d(n,{A:()=>t});const t=i.p+"assets/images/zipper1+2-bc931dc2a9a17d909a27f5ae5d1e095b.png"},3618:(e,n,i)=>{i.d(n,{A:()=>t});const t=i.p+"assets/images/zipper1-5f0e8ccac0548193671b75d4f96125e4.png"},5823:(e,n,i)=>{i.d(n,{A:()=>t});const t=i.p+"assets/images/zipper2b-b4d938aec16be4bc5d0601737ed9bd53.png"},1248:(e,n,i)=>{i.d(n,{A:()=>t});const t=i.p+"assets/images/zipper3-25b272311b7ec6ce2e1b0ce993d16055.png"},4095:(e,n,i)=>{i.d(n,{A:()=>t});const t=i.p+"assets/images/zipper4-cbb2cf5c5de815041892e7f3b09703f8.png"},5078:(e,n,i)=>{i.d(n,{A:()=>t});const t=i.p+"assets/images/zipper5-56ccb910b4b659418162c70c7d32c364.png"},6317:(e,n,i)=>{i.d(n,{A:()=>t});const t=i.p+"assets/images/zipper6-5e74a23116f43ca88bf512b027cbdd9e.png"}}]); \ No newline at end of file diff --git a/assets/js/237.f4ea580f.js b/assets/js/237.f4ea580f.js new file mode 100644 index 0000000..1677ef1 --- /dev/null +++ b/assets/js/237.f4ea580f.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkreftree=self.webpackChunkreftree||[]).push([[237],{3363:(e,t,n)=>{n.d(t,{A:()=>a});n(6540);var i=n(4164),r=n(1312),o=n(1107),s=n(4848);function a(e){let{className:t}=e;return(0,s.jsx)("main",{className:(0,i.A)("container margin-vert--xl",t),children:(0,s.jsx)("div",{className:"row",children:(0,s.jsxs)("div",{className:"col col--6 col--offset-3",children:[(0,s.jsx)(o.A,{as:"h1",className:"hero__title",children:(0,s.jsx)(r.A,{id:"theme.NotFound.title",description:"The title of the 404 page",children:"Page Not Found"})}),(0,s.jsx)("p",{children:(0,s.jsx)(r.A,{id:"theme.NotFound.p1",description:"The first paragraph of the 404 page",children:"We could not find what you were looking for."})}),(0,s.jsx)("p",{children:(0,s.jsx)(r.A,{id:"theme.NotFound.p2",description:"The 2nd paragraph of the 404 page",children:"Please contact the owner of the site that linked you to the original URL and let them know their link is broken."})})]})})})}},2237:(e,t,n)=>{n.r(t),n.d(t,{default:()=>l});n(6540);var i=n(1312),r=n(1003),o=n(781),s=n(3363),a=n(4848);function l(){const e=(0,i.T)({id:"theme.NotFound.title",message:"Page Not Found"});return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(r.be,{title:e}),(0,a.jsx)(o.A,{children:(0,a.jsx)(s.A,{})})]})}}}]); \ No newline at end of file diff --git a/assets/js/37c4c8cd.a437f795.js b/assets/js/37c4c8cd.a437f795.js new file mode 100644 index 0000000..79574dd --- /dev/null +++ b/assets/js/37c4c8cd.a437f795.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkreftree=self.webpackChunkreftree||[]).push([[956],{6773:(e,s,n)=>{n.r(s),n.d(s,{assets:()=>l,contentTitle:()=>a,default:()=>h,frontMatter:()=>r,metadata:()=>c,toc:()=>o});var t=n(4848),i=n(8453);const r={slug:"/",sidebar_position:1},a="Overview",c={id:"Overview",title:"Overview",description:"Behold, automatically generated diagrams and animations for your data!",source:"@site/../site-gen/target/mdoc/Overview.md",sourceDirName:".",slug:"/",permalink:"/reftree/docs/",draft:!1,unlisted:!1,editUrl:"https://github.com/stanch/reftree/tree/main/docs/../site-gen/target/mdoc/Overview.md",tags:[],version:"current",sidebarPosition:1,frontMatter:{slug:"/",sidebar_position:1},sidebar:"mainSidebar",next:{title:"Getting started",permalink:"/reftree/docs/GettingStarted"}},l={},o=[{value:"Features",id:"features",level:2}];function d(e){const s={a:"a",code:"code",em:"em",h1:"h1",h2:"h2",img:"img",li:"li",p:"p",pre:"pre",ul:"ul",...(0,i.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(s.h1,{id:"overview",children:"Overview"}),"\n",(0,t.jsxs)(s.p,{children:["Behold, automatically generated diagrams and animations for your data!\n",(0,t.jsx)(s.code,{children:"reftree"})," is a ",(0,t.jsx)(s.em,{children:"Scala"})," and ",(0,t.jsx)(s.em,{children:"Scala.js"})," library that allows you to\ncreate data structure visualizations with very little effort."]}),"\n",(0,t.jsx)(s.p,{children:(0,t.jsx)(s.img,{alt:"teaser",src:n(9583).A+"",width:"1216",height:"514"})}),"\n",(0,t.jsxs)(s.p,{children:["There are a few ways you can use ",(0,t.jsx)(s.code,{children:"reftree"}),":"]}),"\n",(0,t.jsxs)(s.ul,{children:["\n",(0,t.jsxs)(s.li,{children:[(0,t.jsx)(s.a,{href:"https://stanch.github.io/zipper/",children:"improving the documentation of your projects"}),";"]}),"\n",(0,t.jsxs)(s.li,{children:[(0,t.jsx)(s.a,{href:"/reftree/docs/talks/",children:"live-coding demos and talks"}),";"]}),"\n",(0,t.jsx)(s.li,{children:"exploring how things work;"}),"\n",(0,t.jsx)(s.li,{children:"anywhere you need diagrams of your Scala data structures."}),"\n"]}),"\n",(0,t.jsx)(s.h2,{id:"features",children:"Features"}),"\n",(0,t.jsxs)(s.ul,{children:["\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsxs)(s.p,{children:["Pre-made visualizations of many standard collections:\n",(0,t.jsx)(s.a,{href:"/reftree/docs/talks/Immutability#immutable-data-structures",children:"lists, queues, vectors, etc"}),"."]}),"\n",(0,t.jsx)(s.p,{children:(0,t.jsx)(s.img,{alt:"lists",src:n(2600).A+"",width:"455",height:"722"})}),"\n"]}),"\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsxs)(s.p,{children:["Automatic visualization of case classes (using\n",(0,t.jsx)(s.a,{href:"https://github.com/milessabin/shapeless/wiki/Feature-overview:-shapeless-2.0.0#generic-representation-of-sealed-families-of-case-classes",children:"shapeless"}),")."]}),"\n",(0,t.jsx)(s.pre,{children:(0,t.jsx)(s.code,{className:"language-scala",children:"case class Employee(\n name: String,\n salary: Long\n)\n\ncase class Startup(\n name: String,\n founder: Employee,\n team: List[Employee]\n)\n"})}),"\n",(0,t.jsx)(s.p,{children:(0,t.jsx)(s.img,{alt:"startup",src:n(7056).A+"",width:"1977",height:"701"})}),"\n"]}),"\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsx)(s.p,{children:"Static diagrams as well as animations can be generated."}),"\n"]}),"\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsxs)(s.p,{children:["Hassle-free captions (using ",(0,t.jsx)(s.a,{href:"https://github.com/lihaoyi/sourcecode",children:"sourcecode"}),")."]}),"\n"]}),"\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsxs)(s.p,{children:["Scala.js support (",(0,t.jsx)(s.em,{children:"experimental"}),")."]}),"\n"]}),"\n"]})]})}function h(e={}){const{wrapper:s}={...(0,i.R)(),...e.components};return s?(0,t.jsx)(s,{...e,children:(0,t.jsx)(d,{...e})}):d(e)}},2600:(e,s,n)=>{n.d(s,{A:()=>t});const t=n.p+"assets/images/lists-58f15f89774ee685a16243b40e9ba7c2.png"},7056:(e,s,n)=>{n.d(s,{A:()=>t});const t=n.p+"assets/images/startup-2a750a1231daf1c2d9c548867f54ffc1.png"},9583:(e,s,n)=>{n.d(s,{A:()=>t});const t=n.p+"assets/images/teaser-c537f72f2d1b9c6052885ae09904eae0.gif"},8453:(e,s,n)=>{n.d(s,{R:()=>a,x:()=>c});var t=n(6540);const i={},r=t.createContext(i);function a(e){const s=t.useContext(r);return t.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function c(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:a(e.components),t.createElement(r.Provider,{value:s},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/5e95c892.b6ccb016.js b/assets/js/5e95c892.b6ccb016.js new file mode 100644 index 0000000..06f1870 --- /dev/null +++ b/assets/js/5e95c892.b6ccb016.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkreftree=self.webpackChunkreftree||[]).push([[647],{7121:(e,r,s)=>{s.r(r),s.d(r,{default:()=>l});s(6540);var t=s(4164),u=s(1003),a=s(7559),c=s(2831),n=s(781),f=s(4848);function l(e){return(0,f.jsx)(u.e3,{className:(0,t.A)(a.G.wrapper.docsPages),children:(0,f.jsx)(n.A,{children:(0,c.v)(e.route.routes)})})}}}]); \ No newline at end of file diff --git a/assets/js/66c1eed3.fe49005a.js b/assets/js/66c1eed3.fe49005a.js new file mode 100644 index 0000000..cd8ad4f --- /dev/null +++ b/assets/js/66c1eed3.fe49005a.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkreftree=self.webpackChunkreftree||[]).push([[350],{5011:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>$,contentTitle:()=>v,default:()=>P,frontMatter:()=>F,metadata:()=>T,toc:()=>A});var r=n(4848),s=n(8453),o=n(6540),i=n(4164),c=n(1754),l=n(8774),a=n(4586);const u=["zero","one","two","few","many","other"];function d(e){return u.filter((t=>e.includes(t)))}const m={locale:"en",pluralForms:d(["one","other"]),select:e=>1===e?"one":"other"};function f(){const{i18n:{currentLocale:e}}=(0,a.A)();return(0,o.useMemo)((()=>{try{return function(e){const t=new Intl.PluralRules(e);return{locale:e,pluralForms:d(t.resolvedOptions().pluralCategories),select:e=>t.select(e)}}(e)}catch(t){return console.error(`Failed to use Intl.PluralRules for locale "${e}".\nDocusaurus will fallback to the default (English) implementation.\nError: ${t.message}\n`),m}}),[e])}function p(){const e=f();return{selectMessage:(t,n)=>function(e,t,n){const r=e.split("|");if(1===r.length)return r[0];r.length>n.pluralForms.length&&console.error(`For locale=${n.locale}, a maximum of ${n.pluralForms.length} plural forms are expected (${n.pluralForms.join(",")}), but the message contains ${r.length}: ${e}`);const s=n.select(t),o=n.pluralForms.indexOf(s);return r[Math.min(o,r.length-1)]}(n,t,e)}}var h=n(6654),g=n(1312),x=n(1107);const k={cardContainer:"cardContainer_fWXF",cardTitle:"cardTitle_rnsV",cardDescription:"cardDescription_PWke"};function j(e){let{href:t,children:n}=e;return(0,r.jsx)(l.A,{href:t,className:(0,i.A)("card padding--lg",k.cardContainer),children:n})}function b(e){let{href:t,icon:n,title:s,description:o}=e;return(0,r.jsxs)(j,{href:t,children:[(0,r.jsxs)(x.A,{as:"h2",className:(0,i.A)("text--truncate",k.cardTitle),title:s,children:[n," ",s]}),o&&(0,r.jsx)("p",{className:(0,i.A)("text--truncate",k.cardDescription),title:o,children:o})]})}function y(e){let{item:t}=e;const n=(0,c.Nr)(t),s=function(){const{selectMessage:e}=p();return t=>e(t,(0,g.T)({message:"1 item|{count} items",id:"theme.docs.DocCard.categoryDescription.plurals",description:"The default description for a category card in the generated index about how many items this category includes"},{count:t}))}();return n?(0,r.jsx)(b,{href:n,icon:"\ud83d\uddc3\ufe0f",title:t.label,description:t.description??s(t.items.length)}):null}function w(e){let{item:t}=e;const n=(0,h.A)(t.href)?"\ud83d\udcc4\ufe0f":"\ud83d\udd17",s=(0,c.cC)(t.docId??void 0);return(0,r.jsx)(b,{href:t.href,icon:n,title:t.label,description:t.description??s?.description})}function C(e){let{item:t}=e;switch(t.type){case"link":return(0,r.jsx)(w,{item:t});case"category":return(0,r.jsx)(y,{item:t});default:throw new Error(`unknown item type ${JSON.stringify(t)}`)}}function N(e){let{className:t}=e;const n=(0,c.$S)();return(0,r.jsx)(D,{items:n.items,className:t})}function D(e){const{items:t,className:n}=e;if(!t)return(0,r.jsx)(N,{...e});const s=(0,c.d1)(t);return(0,r.jsx)("section",{className:(0,i.A)("row",n),children:s.map(((e,t)=>(0,r.jsx)("article",{className:"col col--6 margin-bottom--lg",children:(0,r.jsx)(C,{item:e})},t)))})}const F={sidebar_position:4},v="Talks / Demos",T={id:"talks/index",title:"Talks / Demos",description:"",source:"@site/../site-gen/target/mdoc/talks/index.md",sourceDirName:"talks",slug:"/talks/",permalink:"/reftree/docs/talks/",draft:!1,unlisted:!1,editUrl:"https://github.com/stanch/reftree/tree/main/docs/../site-gen/target/mdoc/talks/index.md",tags:[],version:"current",sidebarPosition:4,frontMatter:{sidebar_position:4},sidebar:"mainSidebar",previous:{title:"User guide",permalink:"/reftree/docs/Guide"},next:{title:"Unzipping Immutability",permalink:"/reftree/docs/talks/Immutability"}},$={},A=[];function M(e){const t={h1:"h1",...(0,s.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(t.h1,{id:"talks--demos",children:"Talks / Demos"}),"\n","\n",(0,r.jsx)(D,{})]})}function P(e={}){const{wrapper:t}={...(0,s.R)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(M,{...e})}):M(e)}},8453:(e,t,n)=>{n.d(t,{R:()=>i,x:()=>c});var r=n(6540);const s={},o=r.createContext(s);function i(e){const t=r.useContext(o);return r.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function c(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:i(e.components),r.createElement(o.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/71ffd77d.ca1b41b0.js b/assets/js/71ffd77d.ca1b41b0.js new file mode 100644 index 0000000..f10c9eb --- /dev/null +++ b/assets/js/71ffd77d.ca1b41b0.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkreftree=self.webpackChunkreftree||[]).push([[533],{3691:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>d,contentTitle:()=>s,default:()=>h,frontMatter:()=>a,metadata:()=>o,toc:()=>c});var r=t(4848),i=t(8453);const a={sidebar_position:2},s="Getting started",o={id:"GettingStarted",title:"Getting started",description:"To use this library you will need to have GraphViz installed (and have dot on your PATH).",source:"@site/../site-gen/target/mdoc/GettingStarted.md",sourceDirName:".",slug:"/GettingStarted",permalink:"/reftree/docs/GettingStarted",draft:!1,unlisted:!1,editUrl:"https://github.com/stanch/reftree/tree/main/docs/../site-gen/target/mdoc/GettingStarted.md",tags:[],version:"current",sidebarPosition:2,frontMatter:{sidebar_position:2},sidebar:"mainSidebar",previous:{title:"Overview",permalink:"/reftree/docs/"},next:{title:"User guide",permalink:"/reftree/docs/Guide"}},d={},c=[{value:"Interactive usage",id:"interactive-usage",level:2},{value:"Including in your project",id:"including-in-your-project",level:2},{value:"Minimal example",id:"minimal-example",level:2}];function l(e){const n={a:"a",code:"code",em:"em",h1:"h1",h2:"h2",img:"img",p:"p",pre:"pre",...(0,i.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.h1,{id:"getting-started",children:"Getting started"}),"\n",(0,r.jsxs)(n.p,{children:["To use this library you will need to have ",(0,r.jsx)(n.a,{href:"http://www.graphviz.org/",children:"GraphViz"})," installed (and have ",(0,r.jsx)(n.code,{children:"dot"})," on your ",(0,r.jsx)(n.code,{children:"PATH"}),").\nI also recommend to install the ",(0,r.jsx)(n.a,{href:"https://github.com/adobe-fonts/source-code-pro",children:"Source Code Pro"})," fonts (regular and ",(0,r.jsx)(n.em,{children:"italic"}),"),\nas I find they look the best among the free options and therefore are used by default."]}),"\n",(0,r.jsxs)(n.p,{children:["For viewing PNG and animated GIF on Linux I recommend ",(0,r.jsx)(n.code,{children:"eog"})," and ",(0,r.jsx)(n.code,{children:"gifview"})," respectively."]}),"\n",(0,r.jsx)(n.h2,{id:"interactive-usage",children:"Interactive usage"}),"\n",(0,r.jsx)(n.p,{children:"To jump into an interactive session:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"$ git clone https://github.com/stanch/reftree\n$ cd reftree\n$ sbt demo\n@ render(List(1, 2, 3))\n// display diagram.png with your favorite image viewer\n"})}),"\n",(0,r.jsx)(n.h2,{id:"including-in-your-project",children:"Including in your project"}),"\n",(0,r.jsxs)(n.p,{children:["You can depend on the library by adding these lines to your ",(0,r.jsx)(n.code,{children:"build.sbt"}),":"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-scala",children:'// JVM\nlibraryDependencies += "io.github.stanch" %% "reftree" % "1.4.0"\n\n// Scala.js\nlibraryDependencies += "io.github.stanch" %%% "reftree" % "1.4.0"\n'})}),"\n",(0,r.jsx)(n.h2,{id:"minimal-example",children:"Minimal example"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-scala",children:'import reftree.render.{Renderer, RenderingOptions}\nimport reftree.diagram.Diagram\nimport java.nio.file.Paths\n\nval renderer = Renderer(\n renderingOptions = RenderingOptions(density = 100),\n directory = Paths.get(ImagePath, "overview")\n)\nimport renderer._\n\ncase class Person(firstName: String, age: Int)\n\nDiagram.sourceCodeCaption(Person("Bob", 42)).render("example")\n'})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.img,{alt:"bob",src:t(8710).A+"",width:"367",height:"363"})}),"\n",(0,r.jsxs)(n.p,{children:["For more details, please refer to the ",(0,r.jsx)(n.a,{href:"/reftree/docs/Guide",children:"guide"}),"."]})]})}function h(e={}){const{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(l,{...e})}):l(e)}},8710:(e,n,t)=>{t.d(n,{A:()=>r});const r=t.p+"assets/images/example-279830c17e2bfcec051c7a3c6280e740.png"},8453:(e,n,t)=>{t.d(n,{R:()=>s,x:()=>o});var r=t(6540);const i={},a=r.createContext(i);function s(e){const n=r.useContext(a);return r.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function o(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:s(e.components),r.createElement(a.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/9d744931.c5feb62f.js b/assets/js/9d744931.c5feb62f.js new file mode 100644 index 0000000..feca06f --- /dev/null +++ b/assets/js/9d744931.c5feb62f.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkreftree=self.webpackChunkreftree||[]).push([[396],{5685:e=>{e.exports=JSON.parse('{"version":{"pluginId":"default","version":"current","label":"Next","banner":null,"badge":false,"noIndex":false,"className":"docs-version-current","isLast":true,"docsSidebars":{"mainSidebar":[{"type":"link","label":"Overview","href":"/reftree/docs/","docId":"Overview","unlisted":false},{"type":"link","label":"Getting started","href":"/reftree/docs/GettingStarted","docId":"GettingStarted","unlisted":false},{"type":"link","label":"User guide","href":"/reftree/docs/Guide","docId":"Guide","unlisted":false},{"type":"category","label":"Talks / Demos","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Unzipping Immutability","href":"/reftree/docs/talks/Immutability","docId":"talks/Immutability","unlisted":false},{"type":"link","label":"Visualize your data structures!","href":"/reftree/docs/talks/Visualize","docId":"talks/Visualize","unlisted":false}],"href":"/reftree/docs/talks/"}]},"docs":{"GettingStarted":{"id":"GettingStarted","title":"Getting started","description":"To use this library you will need to have GraphViz installed (and have dot on your PATH).","sidebar":"mainSidebar"},"Guide":{"id":"Guide","title":"User guide","description":"Trees","sidebar":"mainSidebar"},"Overview":{"id":"Overview","title":"Overview","description":"Behold, automatically generated diagrams and animations for your data!","sidebar":"mainSidebar"},"talks/Immutability":{"id":"talks/Immutability","title":"Unzipping Immutability","description":"This talk takes advantage of reftree to observe several immutable data structures in action and uncover their inner beauty. Having surfaced immutability\u2019s crucial tricks, we move our focus to lenses and zippers \u2014 handy tools that combine the convenience of the \u201cmutable world\u201d with the expressiveness of functional programming.","sidebar":"mainSidebar"},"talks/index":{"id":"talks/index","title":"Talks / Demos","description":"","sidebar":"mainSidebar"},"talks/Visualize":{"id":"talks/Visualize","title":"Visualize your data structures!","description":"A journey deep inside reftree\u2019s animations feature, showing how some of functional programming techniques and concepts can be applied to produce visualizations of themselves.","sidebar":"mainSidebar"}}}}')}}]); \ No newline at end of file diff --git a/assets/js/a7456010.d3f42fc7.js b/assets/js/a7456010.d3f42fc7.js new file mode 100644 index 0000000..7f4ccd0 --- /dev/null +++ b/assets/js/a7456010.d3f42fc7.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkreftree=self.webpackChunkreftree||[]).push([[235],{8552:e=>{e.exports=JSON.parse('{"name":"docusaurus-plugin-content-pages","id":"default"}')}}]); \ No newline at end of file diff --git a/assets/js/a7bd4aaa.8ba4f90d.js b/assets/js/a7bd4aaa.8ba4f90d.js new file mode 100644 index 0000000..3aea298 --- /dev/null +++ b/assets/js/a7bd4aaa.8ba4f90d.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkreftree=self.webpackChunkreftree||[]).push([[98],{4532:(e,n,s)=>{s.r(n),s.d(n,{default:()=>x});s(6540);var r=s(1003),t=s(2967),o=s(2252),i=s(2831),c=s(1463),u=s(4848);function a(e){const{version:n}=e;return(0,u.jsxs)(u.Fragment,{children:[(0,u.jsx)(c.A,{version:n.version,tag:(0,t.tU)(n.pluginId,n.version)}),(0,u.jsx)(r.be,{children:n.noIndex&&(0,u.jsx)("meta",{name:"robots",content:"noindex, nofollow"})})]})}function l(e){const{version:n,route:s}=e;return(0,u.jsx)(r.e3,{className:n.className,children:(0,u.jsx)(o.n,{version:n,children:(0,i.v)(s.routes)})})}function x(e){return(0,u.jsxs)(u.Fragment,{children:[(0,u.jsx)(a,{...e}),(0,u.jsx)(l,{...e})]})}}}]); \ No newline at end of file diff --git a/assets/js/a94703ab.6fa9d72a.js b/assets/js/a94703ab.6fa9d72a.js new file mode 100644 index 0000000..2580f55 --- /dev/null +++ b/assets/js/a94703ab.6fa9d72a.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkreftree=self.webpackChunkreftree||[]).push([[48],{2559:(e,t,n)=>{n.r(t),n.d(t,{default:()=>be});var a=n(6540),o=n(4164),i=n(1003),s=n(7559),l=n(1754),r=n(6588),c=n(1312),d=n(3104),u=n(5062);const m={backToTopButton:"backToTopButton_sjWU",backToTopButtonShow:"backToTopButtonShow_xfvO"};var b=n(4848);function h(){const{shown:e,scrollToTop:t}=function(e){let{threshold:t}=e;const[n,o]=(0,a.useState)(!1),i=(0,a.useRef)(!1),{startScroll:s,cancelScroll:l}=(0,d.gk)();return(0,d.Mq)(((e,n)=>{let{scrollY:a}=e;const s=n?.scrollY;s&&(i.current?i.current=!1:a>=s?(l(),o(!1)):a{e.location.hash&&(i.current=!0,o(!1))})),{shown:n,scrollToTop:()=>s(0)}}({threshold:300});return(0,b.jsx)("button",{"aria-label":(0,c.T)({id:"theme.BackToTopButton.buttonAriaLabel",message:"Scroll back to top",description:"The ARIA label for the back to top button"}),className:(0,o.A)("clean-btn",s.G.common.backToTopButton,m.backToTopButton,e&&m.backToTopButtonShow),type:"button",onClick:t})}var p=n(3109),x=n(6347),f=n(4581),j=n(6342),v=n(3465);function _(e){return(0,b.jsx)("svg",{width:"20",height:"20","aria-hidden":"true",...e,children:(0,b.jsxs)("g",{fill:"#7a7a7a",children:[(0,b.jsx)("path",{d:"M9.992 10.023c0 .2-.062.399-.172.547l-4.996 7.492a.982.982 0 01-.828.454H1c-.55 0-1-.453-1-1 0-.2.059-.403.168-.551l4.629-6.942L.168 3.078A.939.939 0 010 2.528c0-.548.45-.997 1-.997h2.996c.352 0 .649.18.828.45L9.82 9.472c.11.148.172.347.172.55zm0 0"}),(0,b.jsx)("path",{d:"M19.98 10.023c0 .2-.058.399-.168.547l-4.996 7.492a.987.987 0 01-.828.454h-3c-.547 0-.996-.453-.996-1 0-.2.059-.403.168-.551l4.625-6.942-4.625-6.945a.939.939 0 01-.168-.55 1 1 0 01.996-.997h3c.348 0 .649.18.828.45l4.996 7.492c.11.148.168.347.168.55zm0 0"})]})})}const A={collapseSidebarButton:"collapseSidebarButton_PEFL",collapseSidebarButtonIcon:"collapseSidebarButtonIcon_kv0_"};function g(e){let{onClick:t}=e;return(0,b.jsx)("button",{type:"button",title:(0,c.T)({id:"theme.docs.sidebar.collapseButtonTitle",message:"Collapse sidebar",description:"The title attribute for collapse button of doc sidebar"}),"aria-label":(0,c.T)({id:"theme.docs.sidebar.collapseButtonAriaLabel",message:"Collapse sidebar",description:"The title attribute for collapse button of doc sidebar"}),className:(0,o.A)("button button--secondary button--outline",A.collapseSidebarButton),onClick:t,children:(0,b.jsx)(_,{className:A.collapseSidebarButtonIcon})})}var k=n(5041),C=n(9532);const S=Symbol("EmptyContext"),T=a.createContext(S);function N(e){let{children:t}=e;const[n,o]=(0,a.useState)(null),i=(0,a.useMemo)((()=>({expandedItem:n,setExpandedItem:o})),[n]);return(0,b.jsx)(T.Provider,{value:i,children:t})}var I=n(1422),B=n(9169),y=n(8774),w=n(2303);function L(e){let{collapsed:t,categoryLabel:n,onClick:a}=e;return(0,b.jsx)("button",{"aria-label":t?(0,c.T)({id:"theme.DocSidebarItem.expandCategoryAriaLabel",message:"Expand sidebar category '{label}'",description:"The ARIA label to expand the sidebar category"},{label:n}):(0,c.T)({id:"theme.DocSidebarItem.collapseCategoryAriaLabel",message:"Collapse sidebar category '{label}'",description:"The ARIA label to collapse the sidebar category"},{label:n}),"aria-expanded":!t,type:"button",className:"clean-btn menu__caret",onClick:a})}function E(e){let{item:t,onItemClick:n,activePath:i,level:r,index:c,...d}=e;const{items:u,label:m,collapsible:h,className:p,href:x}=t,{docs:{sidebar:{autoCollapseCategories:f}}}=(0,j.p)(),v=function(e){const t=(0,w.A)();return(0,a.useMemo)((()=>e.href&&!e.linkUnlisted?e.href:!t&&e.collapsible?(0,l.Nr)(e):void 0),[e,t])}(t),_=(0,l.w8)(t,i),A=(0,B.ys)(x,i),{collapsed:g,setCollapsed:k}=(0,I.u)({initialState:()=>!!h&&(!_&&t.collapsed)}),{expandedItem:N,setExpandedItem:E}=function(){const e=(0,a.useContext)(T);if(e===S)throw new C.dV("DocSidebarItemsExpandedStateProvider");return e}(),M=function(e){void 0===e&&(e=!g),E(e?null:c),k(e)};return function(e){let{isActive:t,collapsed:n,updateCollapsed:o}=e;const i=(0,C.ZC)(t);(0,a.useEffect)((()=>{t&&!i&&n&&o(!1)}),[t,i,n,o])}({isActive:_,collapsed:g,updateCollapsed:M}),(0,a.useEffect)((()=>{h&&null!=N&&N!==c&&f&&k(!0)}),[h,N,c,k,f]),(0,b.jsxs)("li",{className:(0,o.A)(s.G.docs.docSidebarItemCategory,s.G.docs.docSidebarItemCategoryLevel(r),"menu__list-item",{"menu__list-item--collapsed":g},p),children:[(0,b.jsxs)("div",{className:(0,o.A)("menu__list-item-collapsible",{"menu__list-item-collapsible--active":A}),children:[(0,b.jsx)(y.A,{className:(0,o.A)("menu__link",{"menu__link--sublist":h,"menu__link--sublist-caret":!x&&h,"menu__link--active":_}),onClick:h?e=>{n?.(t),x?M(!1):(e.preventDefault(),M())}:()=>{n?.(t)},"aria-current":A?"page":void 0,role:h&&!x?"button":void 0,"aria-expanded":h&&!x?!g:void 0,href:h?v??"#":v,...d,children:m}),x&&h&&(0,b.jsx)(L,{collapsed:g,categoryLabel:m,onClick:e=>{e.preventDefault(),M()}})]}),(0,b.jsx)(I.N,{lazy:!0,as:"ul",className:"menu__list",collapsed:g,children:(0,b.jsx)(U,{items:u,tabIndex:g?-1:0,onItemClick:n,activePath:i,level:r+1})})]})}var M=n(6654),H=n(3186);const G={menuExternalLink:"menuExternalLink_NmtK"};function W(e){let{item:t,onItemClick:n,activePath:a,level:i,index:r,...c}=e;const{href:d,label:u,className:m,autoAddBaseUrl:h}=t,p=(0,l.w8)(t,a),x=(0,M.A)(d);return(0,b.jsx)("li",{className:(0,o.A)(s.G.docs.docSidebarItemLink,s.G.docs.docSidebarItemLinkLevel(i),"menu__list-item",m),children:(0,b.jsxs)(y.A,{className:(0,o.A)("menu__link",!x&&G.menuExternalLink,{"menu__link--active":p}),autoAddBaseUrl:h,"aria-current":p?"page":void 0,to:d,...x&&{onClick:n?()=>n(t):void 0},...c,children:[u,!x&&(0,b.jsx)(H.A,{})]})},u)}const P={menuHtmlItem:"menuHtmlItem_M9Kj"};function R(e){let{item:t,level:n,index:a}=e;const{value:i,defaultStyle:l,className:r}=t;return(0,b.jsx)("li",{className:(0,o.A)(s.G.docs.docSidebarItemLink,s.G.docs.docSidebarItemLinkLevel(n),l&&[P.menuHtmlItem,"menu__list-item"],r),dangerouslySetInnerHTML:{__html:i}},a)}function D(e){let{item:t,...n}=e;switch(t.type){case"category":return(0,b.jsx)(E,{item:t,...n});case"html":return(0,b.jsx)(R,{item:t,...n});default:return(0,b.jsx)(W,{item:t,...n})}}function F(e){let{items:t,...n}=e;const a=(0,l.Y)(t,n.activePath);return(0,b.jsx)(N,{children:a.map(((e,t)=>(0,b.jsx)(D,{item:e,index:t,...n},t)))})}const U=(0,a.memo)(F),V={menu:"menu_SIkG",menuWithAnnouncementBar:"menuWithAnnouncementBar_GW3s"};function Y(e){let{path:t,sidebar:n,className:i}=e;const l=function(){const{isActive:e}=(0,k.M)(),[t,n]=(0,a.useState)(e);return(0,d.Mq)((t=>{let{scrollY:a}=t;e&&n(0===a)}),[e]),e&&t}();return(0,b.jsx)("nav",{"aria-label":(0,c.T)({id:"theme.docs.sidebar.navAriaLabel",message:"Docs sidebar",description:"The ARIA label for the sidebar navigation"}),className:(0,o.A)("menu thin-scrollbar",V.menu,l&&V.menuWithAnnouncementBar,i),children:(0,b.jsx)("ul",{className:(0,o.A)(s.G.docs.docSidebarMenu,"menu__list"),children:(0,b.jsx)(U,{items:n,activePath:t,level:1})})})}const K="sidebar_njMd",z="sidebarWithHideableNavbar_wUlq",q="sidebarHidden_VK0M",O="sidebarLogo_isFc";function J(e){let{path:t,sidebar:n,onCollapse:a,isHidden:i}=e;const{navbar:{hideOnScroll:s},docs:{sidebar:{hideable:l}}}=(0,j.p)();return(0,b.jsxs)("div",{className:(0,o.A)(K,s&&z,i&&q),children:[s&&(0,b.jsx)(v.A,{tabIndex:-1,className:O}),(0,b.jsx)(Y,{path:t,sidebar:n}),l&&(0,b.jsx)(g,{onClick:a})]})}const Q=a.memo(J);var X=n(5600),Z=n(9876);const $=e=>{let{sidebar:t,path:n}=e;const a=(0,Z.M)();return(0,b.jsx)("ul",{className:(0,o.A)(s.G.docs.docSidebarMenu,"menu__list"),children:(0,b.jsx)(U,{items:t,activePath:n,onItemClick:e=>{"category"===e.type&&e.href&&a.toggle(),"link"===e.type&&a.toggle()},level:1})})};function ee(e){return(0,b.jsx)(X.GX,{component:$,props:e})}const te=a.memo(ee);function ne(e){const t=(0,f.l)(),n="desktop"===t||"ssr"===t,a="mobile"===t;return(0,b.jsxs)(b.Fragment,{children:[n&&(0,b.jsx)(Q,{...e}),a&&(0,b.jsx)(te,{...e})]})}const ae={expandButton:"expandButton_TmdG",expandButtonIcon:"expandButtonIcon_i1dp"};function oe(e){let{toggleSidebar:t}=e;return(0,b.jsx)("div",{className:ae.expandButton,title:(0,c.T)({id:"theme.docs.sidebar.expandButtonTitle",message:"Expand sidebar",description:"The ARIA label and title attribute for expand button of doc sidebar"}),"aria-label":(0,c.T)({id:"theme.docs.sidebar.expandButtonAriaLabel",message:"Expand sidebar",description:"The ARIA label and title attribute for expand button of doc sidebar"}),tabIndex:0,role:"button",onKeyDown:t,onClick:t,children:(0,b.jsx)(_,{className:ae.expandButtonIcon})})}const ie={docSidebarContainer:"docSidebarContainer_YfHR",docSidebarContainerHidden:"docSidebarContainerHidden_DPk8",sidebarViewport:"sidebarViewport_aRkj"};function se(e){let{children:t}=e;const n=(0,r.t)();return(0,b.jsx)(a.Fragment,{children:t},n?.name??"noSidebar")}function le(e){let{sidebar:t,hiddenSidebarContainer:n,setHiddenSidebarContainer:i}=e;const{pathname:l}=(0,x.zy)(),[r,c]=(0,a.useState)(!1),d=(0,a.useCallback)((()=>{r&&c(!1),!r&&(0,p.O)()&&c(!0),i((e=>!e))}),[i,r]);return(0,b.jsx)("aside",{className:(0,o.A)(s.G.docs.docSidebarContainer,ie.docSidebarContainer,n&&ie.docSidebarContainerHidden),onTransitionEnd:e=>{e.currentTarget.classList.contains(ie.docSidebarContainer)&&n&&c(!0)},children:(0,b.jsx)(se,{children:(0,b.jsxs)("div",{className:(0,o.A)(ie.sidebarViewport,r&&ie.sidebarViewportHidden),children:[(0,b.jsx)(ne,{sidebar:t,path:l,onCollapse:d,isHidden:r}),r&&(0,b.jsx)(oe,{toggleSidebar:d})]})})})}const re={docMainContainer:"docMainContainer_TBSr",docMainContainerEnhanced:"docMainContainerEnhanced_lQrH",docItemWrapperEnhanced:"docItemWrapperEnhanced_JWYK"};function ce(e){let{hiddenSidebarContainer:t,children:n}=e;const a=(0,r.t)();return(0,b.jsx)("main",{className:(0,o.A)(re.docMainContainer,(t||!a)&&re.docMainContainerEnhanced),children:(0,b.jsx)("div",{className:(0,o.A)("container padding-top--md padding-bottom--lg",re.docItemWrapper,t&&re.docItemWrapperEnhanced),children:n})})}const de={docRoot:"docRoot_UBD9",docsWrapper:"docsWrapper_hBAB"};function ue(e){let{children:t}=e;const n=(0,r.t)(),[o,i]=(0,a.useState)(!1);return(0,b.jsxs)("div",{className:de.docsWrapper,children:[(0,b.jsx)(h,{}),(0,b.jsxs)("div",{className:de.docRoot,children:[n&&(0,b.jsx)(le,{sidebar:n.items,hiddenSidebarContainer:o,setHiddenSidebarContainer:i}),(0,b.jsx)(ce,{hiddenSidebarContainer:o,children:t})]})]})}var me=n(3363);function be(e){const t=(0,l.B5)(e);if(!t)return(0,b.jsx)(me.A,{});const{docElement:n,sidebarName:a,sidebarItems:c}=t;return(0,b.jsx)(i.e3,{className:(0,o.A)(s.G.page.docsDocPage),children:(0,b.jsx)(r.V,{name:a,items:c,children:(0,b.jsx)(ue,{children:n})})})}},3363:(e,t,n)=>{n.d(t,{A:()=>l});n(6540);var a=n(4164),o=n(1312),i=n(1107),s=n(4848);function l(e){let{className:t}=e;return(0,s.jsx)("main",{className:(0,a.A)("container margin-vert--xl",t),children:(0,s.jsx)("div",{className:"row",children:(0,s.jsxs)("div",{className:"col col--6 col--offset-3",children:[(0,s.jsx)(i.A,{as:"h1",className:"hero__title",children:(0,s.jsx)(o.A,{id:"theme.NotFound.title",description:"The title of the 404 page",children:"Page Not Found"})}),(0,s.jsx)("p",{children:(0,s.jsx)(o.A,{id:"theme.NotFound.p1",description:"The first paragraph of the 404 page",children:"We could not find what you were looking for."})}),(0,s.jsx)("p",{children:(0,s.jsx)(o.A,{id:"theme.NotFound.p2",description:"The 2nd paragraph of the 404 page",children:"Please contact the owner of the site that linked you to the original URL and let them know their link is broken."})})]})})})}}}]); \ No newline at end of file diff --git a/assets/js/aba21aa0.b00a85c6.js b/assets/js/aba21aa0.b00a85c6.js new file mode 100644 index 0000000..4c5d98e --- /dev/null +++ b/assets/js/aba21aa0.b00a85c6.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkreftree=self.webpackChunkreftree||[]).push([[742],{7093:e=>{e.exports=JSON.parse('{"name":"docusaurus-plugin-content-docs","id":"default"}')}}]); \ No newline at end of file diff --git a/assets/js/b3d9ed0f.5a9d3f91.js b/assets/js/b3d9ed0f.5a9d3f91.js new file mode 100644 index 0000000..f37531f --- /dev/null +++ b/assets/js/b3d9ed0f.5a9d3f91.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkreftree=self.webpackChunkreftree||[]).push([[814],{6444:(e,n,a)=>{a.r(n),a.d(n,{assets:()=>d,contentTitle:()=>c,default:()=>m,frontMatter:()=>l,metadata:()=>o,toc:()=>h});var s=a(4848),r=a(8453),t=a(3554),i=a.n(t);const l={sidebar_position:1,description:"This talk takes advantage of reftree to observe several immutable data structures in action and uncover their inner beauty. Having surfaced immutability\u2019s crucial tricks, we move our focus to lenses and zippers \u2014 handy tools that combine the convenience of the \u201cmutable world\u201d with the expressiveness of functional programming."},c="Unzipping Immutability",o={id:"talks/Immutability",title:"Unzipping Immutability",description:"This talk takes advantage of reftree to observe several immutable data structures in action and uncover their inner beauty. Having surfaced immutability\u2019s crucial tricks, we move our focus to lenses and zippers \u2014 handy tools that combine the convenience of the \u201cmutable world\u201d with the expressiveness of functional programming.",source:"@site/../site-gen/target/mdoc/talks/Immutability.md",sourceDirName:"talks",slug:"/talks/Immutability",permalink:"/reftree/docs/talks/Immutability",draft:!1,unlisted:!1,editUrl:"https://github.com/stanch/reftree/tree/main/docs/../site-gen/target/mdoc/talks/Immutability.md",tags:[],version:"current",sidebarPosition:1,frontMatter:{sidebar_position:1,description:"This talk takes advantage of reftree to observe several immutable data structures in action and uncover their inner beauty. Having surfaced immutability\u2019s crucial tricks, we move our focus to lenses and zippers \u2014 handy tools that combine the convenience of the \u201cmutable world\u201d with the expressiveness of functional programming."},sidebar:"mainSidebar",previous:{title:"Talks / Demos",permalink:"/reftree/docs/talks/"},next:{title:"Visualize your data structures!",permalink:"/reftree/docs/talks/Visualize"}},d={},h=[{value:"Immutable data structures",id:"immutable-data-structures",level:2},{value:"Lists",id:"lists",level:3},{value:"Queues",id:"queues",level:3},{value:"Vectors",id:"vectors",level:3},{value:"Finger Trees",id:"finger-trees",level:3},{value:"Lenses",id:"lenses",level:2},{value:"Zippers",id:"zippers",level:2},{value:"Useful resources",id:"useful-resources",level:2},{value:"Books, papers and talks",id:"books-papers-and-talks",level:3},{value:"Scala libraries",id:"scala-libraries",level:3}];function p(e){const n={a:"a",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",img:"img",li:"li",p:"p",pre:"pre",ul:"ul",...(0,r.R)(),...e.components},{Details:t}=n;return t||function(e,n){throw new Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("Details",!0),(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.h1,{id:"unzipping-immutability",children:"Unzipping Immutability"}),"\n",(0,s.jsx)(n.p,{children:"This page contains the materials for my talk \u201cUnzipping Immutability\u201d."}),"\n","\n",(0,s.jsx)(i(),{controls:!0,style:{marginBottom:"1em"},url:"https://www.youtube.com/watch?v=dOj-wk5MQ3k"}),"\n",(0,s.jsxs)(t,{children:[(0,s.jsx)("summary",{children:"Older videos"}),(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["LX Scala, April 2016: ",(0,s.jsx)(n.a,{href:"https://vimeo.com/162214356",children:"https://vimeo.com/162214356"})]}),"\n",(0,s.jsxs)(n.li,{children:["Pixels Camp, October 2016: ",(0,s.jsx)(n.a,{href:"https://www.youtube.com/watch?v=yeMvhuD689A",children:"https://www.youtube.com/watch?v=yeMvhuD689A"})]}),"\n"]})]}),"\n",(0,s.jsx)(n.p,{children:"You can use this page in two ways:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"as a reference/refresher on the concepts covered in the talk;"}),"\n",(0,s.jsx)(n.li,{children:"as an interactive playground where you can try the same commands I presented."}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"Throughout this page we will assume the following\ndeclarations (each section might add its own):"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-scala",children:"import reftree.core._\nimport reftree.diagram._\nimport reftree.render._\nimport reftree.demo.Data._\nimport scala.collection.immutable._\nimport java.nio.file.Paths\nimport Diagram.{sourceCodeCaption => diagram}\n"})}),"\n",(0,s.jsx)(n.p,{children:"To start an interactive session, just run"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"$ sbt demo\n@ render(List(1, 2, 3))\n"})}),"\n",(0,s.jsxs)(n.p,{children:["and open ",(0,s.jsx)(n.code,{children:"diagram.png"})," in your favorite image viewer (hopefully one that\nreloads images automatically on file change). You will also need to have\n",(0,s.jsx)(n.a,{href:"http://www.graphviz.org/",children:"GraphViz"})," installed. ",(0,s.jsx)(n.em,{children:"The interactive session\nalready has all the necessary imports in scope."})]}),"\n",(0,s.jsx)(n.h2,{id:"immutable-data-structures",children:"Immutable data structures"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-scala",children:'// extra declarations for this section\nval renderer = Renderer(\n renderingOptions = RenderingOptions(density = 100),\n directory = Paths.get(ImagePath, "immutability")\n)\nimport renderer._\n'})}),"\n",(0,s.jsx)(n.h3,{id:"lists",children:"Lists"}),"\n",(0,s.jsx)(n.p,{children:"We\u2019ll start with one of the simplest structures: a list.\nIt consists of a number of cells pointing to each other:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-scala",children:"val list = List(1, 2, 3)\n// list: List[Int] = List(1, 2, 3)\n"})}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-scala",children:'diagram(list).render("list")\n'})}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{alt:"list",src:a(8603).A+"",width:"322",height:"590"})}),"\n",(0,s.jsx)(n.p,{children:"Elements can be added to or removed from the front of the list with no effort,\nbecause we can share the same cells across several lists.\nThis would not be possible with a mutable list,\nsince modifying the shared part would modify every data structure making use of it."}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-scala",children:"val add = 0 :: list\n// add: List[Int] = List(0, 1, 2, 3)\nval remove = list.tail\n// remove: List[Int] = List(2, 3)\n"})}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-scala",children:'(diagram(list) + diagram(add) + diagram(remove)).render("lists")\n'})}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{alt:"lists",src:a(2600).A+"",width:"455",height:"722"})}),"\n",(0,s.jsxs)(n.p,{children:["However we can\u2019t easily add elements at the end of the list, since the last cell\nis pointing to the empty list (",(0,s.jsx)(n.code,{children:"Nil"}),") and is immutable, i.e. cannot be changed.\nThus we are forced to create a new list every time:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-scala",children:'(Animation\n .startWith(List(1))\n .iterate(_ :+ 2, _ :+ 3, _ :+ 4)\n .build()\n .render("list-append", tweakAnimation = _.withOnionSkinLayers(3)))\n'})}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{alt:"list-append",src:a(2773).A+"",width:"675",height:"722"})}),"\n",(0,s.jsx)(n.p,{children:"This certainly does not look efficient compared to adding elements at the front:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-scala",children:'(Animation\n .startWith(List(1))\n .iterate(2 :: _, 3 :: _, 4 :: _)\n .build()\n .render("list-prepend"))\n'})}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{alt:"list-prepend",src:a(2515).A+"",width:"457",height:"722"})}),"\n",(0,s.jsx)(n.h3,{id:"queues",children:"Queues"}),"\n",(0,s.jsx)(n.p,{children:"If we want to add elements on both sides efficiently, we need a different data structure: a queue.\nThe queue below, also known as a \u201cBanker\u2019s Queue\u201d, has two lists: one for prepending and one for appending."}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-scala",children:"val queue1 = Queue(1, 2, 3)\n// queue1: Queue[Int] = Queue(1, 2, 3)\nval queue2 = (queue1 :+ 4).tail\n// queue2: Queue[Int] = Queue(2, 3, 4)\n"})}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-scala",children:'(diagram(queue1) + diagram(queue2)).render("queues", _.withVerticalSpacing(1.2))\n'})}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{alt:"queues",src:a(5623).A+"",width:"607",height:"992"})}),"\n",(0,s.jsx)(n.p,{children:"This way we can add and remove elements very easily at both ends.\nExcept when we try to remove an element and the respective list is empty!\nIn this case the queue will rotate the other list to make use of its elements.\nAlthough this operation is expensive, the usage pattern intended for a queue\nmakes it rare enough to yield great average (\u201cammortized\u201d) performance:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-scala",children:'(Animation\n .startWith(Queue(1, 2, 3))\n .repeat(3)(_.iterate(2)(q => q :+ (q.max + 1)).iterate(2)(_.tail))\n .build(Diagram.toStringCaption(_).withAnchor("queue"))\n .render("queue"))\n'})}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{alt:"queue",src:a(9696).A+"",width:"540",height:"922"})}),"\n",(0,s.jsx)(n.h3,{id:"vectors",children:"Vectors"}),"\n",(0,s.jsxs)(n.p,{children:["One downside common to both lists and queues we saw before is that to get an element by index,\nwe need to potentially traverse the whole structure. A ",(0,s.jsx)(n.code,{children:"Vector"})," is a powerful data structure\naddressing this shortcoming and available in Scala (among other languages, like Clojure)."]}),"\n",(0,s.jsx)(n.p,{children:"Internally vectors utilize up to 6 layers of arrays, where 32 elements sit on the first layer,\n1024 \u2014 on the second, 32^3 \u2014 on the third, etc.\nTherefore getting any element by its index requires at most 6 pointer dereferences,\nwhich can be deemed constant time (yes, the trick is that the number of elements that can\nbe stored is limited by 2^31)."}),"\n",(0,s.jsx)(n.p,{children:"The internal 32-element arrays form the basic structural sharing blocks.\nFor small vectors they will be recreated on most operations:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-scala",children:"val vector1 = (1 to 20).toVector\n// vector1: Vector[Int] = Vector(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20)\nval vector2 = vector1 :+ 21\n// vector2: Vector[Int] = Vector(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21)\n"})}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-scala",children:'(diagram(vector1) + diagram(vector2)).render("vectors", _.withVerticalSpacing(2))\n'})}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{alt:"vectors",src:a(1999).A+"",width:"2022",height:"601"})}),"\n",(0,s.jsx)(n.p,{children:"However as more layers leap into action, a huge chunk of the data can be shared:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-scala",children:"val vector3 = (1 to 100).toVector\n// vector3: Vector[Int] = Vector(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100)\nval vector4 = vector3 :+ 21\n// vector4: Vector[Int] = Vector(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 21)\n"})}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-scala",children:'(diagram(vector3) + diagram(vector4)).render("big-vectors", _.withVerticalSpacing(2))\n'})}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{alt:"big-vectors",src:a(5390).A+"",width:"3785",height:"853"})}),"\n",(0,s.jsxs)(n.p,{children:["If you want to know more, this structure is covered in great detail by Jean Niklas L\u2019orange\n",(0,s.jsx)(n.a,{href:"http://hypirion.com/musings/understanding-persistent-vector-pt-1",children:"in his blog"}),".\nI also highly recommend watching ",(0,s.jsx)(n.a,{href:"https://www.youtube.com/watch?v=pNhBQJN44YQ",children:"this talk"})," by Daniel Spiewak."]}),"\n",(0,s.jsx)(n.h3,{id:"finger-trees",children:"Finger Trees"}),"\n",(0,s.jsxs)(n.p,{children:["To conclude this section, I would like to share a slightly less popular, but beautifully designed\ndata structure called \u201cfinger tree\u201d described in ",(0,s.jsx)(n.a,{href:"http://www.cs.ox.ac.uk/ralf.hinze/publications/FingerTrees.pdf",children:"this paper"}),"\nby Hinze and Paterson. Enjoy the read and this animation of a finger tree getting filled with some numbers:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-scala",children:'import de.sciss.fingertree.{FingerTree, Measure}\nimport reftree.contrib.FingerTreeInstances._\n\nimplicit val measure = Measure.Indexed\n\nAnimation\n .startWith(FingerTree(1))\n .iterateWithIndex(21)((t, i) => t :+ (i + 1))\n .build(Diagram(_).withCaption("Finger Tree").withAnchor("tree"))\n .render("finger", _.withDensity(75).withVerticalSpacing(2))\n'})}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{alt:"finger",src:a(7580).A+"",width:"1730",height:"1160"})}),"\n",(0,s.jsx)(n.h2,{id:"lenses",children:"Lenses"}),"\n",(0,s.jsxs)(n.p,{children:["So far we were looking into \u201cstandard\u201d data structures,\nbut in our code we often have to deal with custom data structures comprising our domain model.\nUpdating this sort of data can be tricky if it\u2019s immutable.\nFor case classes Scala gives us the ",(0,s.jsx)(n.code,{children:"copy"})," method:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-scala",children:"case class Employee(\n name: String,\n salary: Long\n)\n"})}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-scala",children:'employee\n// res7: Employee = Employee(name = "Michael", salary = 4000L)\nval raisedEmployee = employee.copy(salary = employee.salary + 10)\n// raisedEmployee: Employee = Employee(name = "Michael", salary = 4010L)\n'})}),"\n",(0,s.jsxs)(n.p,{children:["However once composition comes into play, the resulting nested immutable data structures\nwould require a lot of ",(0,s.jsx)(n.code,{children:"copy"})," calls:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-scala",children:"case class Employee(\n name: String,\n salary: Long\n)\n\ncase class Startup(\n name: String,\n founder: Employee,\n team: List[Employee]\n)\n"})}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-scala",children:'startup\n// res8: Startup = Startup(\n// name = "Acme",\n// founder = Employee(name = "Michael", salary = 4000L),\n// team = List(\n// Employee(name = "Adam", salary = 2100L),\n// Employee(name = "Bella", salary = 2100L),\n// Employee(name = "Chad", salary = 1980L),\n// Employee(name = "Delia", salary = 1850L)\n// )\n// )\nval raisedFounder = startup.copy(\n founder = startup.founder.copy(\n salary = startup.founder.salary + 10\n )\n)\n// raisedFounder: Startup = Startup(\n// name = "Acme",\n// founder = Employee(name = "Michael", salary = 4010L),\n// team = List(\n// Employee(name = "Adam", salary = 2100L),\n// Employee(name = "Bella", salary = 2100L),\n// Employee(name = "Chad", salary = 1980L),\n// Employee(name = "Delia", salary = 1850L)\n// )\n// )\n'})}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-scala",children:"// extra declarations for this section\nimport reftree.contrib.SimplifiedInstances.{list => listInstance}\nimport reftree.contrib.OpticInstances._\n"})}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-scala",children:'(diagram(startup) + diagram(raisedFounder)).render("startup")\n'})}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{alt:"startup",src:a(7056).A+"",width:"1977",height:"701"})}),"\n",(0,s.jsx)(n.p,{children:"Ouch!"}),"\n",(0,s.jsxs)(n.p,{children:["A common solution to this problem is a \u201clens\u201d.\nIn the simplest case a lens is a pair of functions to get and set a value of type ",(0,s.jsx)(n.code,{children:"B"})," inside a value of type ",(0,s.jsx)(n.code,{children:"A"}),".\nIt\u2019s called a lens because it focuses on some part of the data and allows to update it.\nFor example, here is a lens that focuses on an employee\u2019s salary\n(using the excellent ",(0,s.jsx)(n.a,{href:"https://github.com/julien-truffaut/Monocle",children:"Monocle library"}),"):"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-scala",children:'import monocle.macros.GenLens\n\nval salaryLens = GenLens[Employee](_.salary)\n// salaryLens: monocle.package.Lens[Employee, Long] = repl.MdocSession$MdocApp$$anon$1@1637d34f\n\nsalaryLens.get(startup.founder)\n// res10: Long = 4000L\nsalaryLens.modify(s => s + 10)(startup.founder)\n// res11: Employee = Employee(name = "Michael", salary = 4010L)\n'})}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-scala",children:'diagram(OpticFocus(salaryLens, startup.founder)).render("salaryLens")\n'})}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{alt:"salaryLens",src:a(7817).A+"",width:"592",height:"363"})}),"\n",(0,s.jsx)(n.p,{children:"We can also define a lens that focuses on the startup\u2019s founder:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-scala",children:'val founderLens = GenLens[Startup](_.founder)\n// founderLens: monocle.package.Lens[Startup, Employee] = repl.MdocSession$MdocApp$$anon$2@552a02e5\n\nfounderLens.get(startup)\n// res13: Employee = Employee(name = "Michael", salary = 4000L)\n'})}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-scala",children:'diagram(OpticFocus(founderLens, startup)).render("founderLens")\n'})}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{alt:"founderLens",src:a(1738).A+"",width:"1832",height:"701"})}),"\n",(0,s.jsx)(n.p,{children:"It\u2019s not apparent yet how this would help, but the trick is that lenses can be composed:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-scala",children:'val founderSalaryLens = founderLens composeLens salaryLens\n// founderSalaryLens: monocle.PLens[Startup, Startup, Long, Long] = monocle.PLens$$anon$1@7a1aec99\n\nfounderSalaryLens.get(startup)\n// res15: Long = 4000L\nfounderSalaryLens.modify(s => s + 10)(startup)\n// res16: Startup = Startup(\n// name = "Acme",\n// founder = Employee(name = "Michael", salary = 4010L),\n// team = List(\n// Employee(name = "Adam", salary = 2100L),\n// Employee(name = "Bella", salary = 2100L),\n// Employee(name = "Chad", salary = 1980L),\n// Employee(name = "Delia", salary = 1850L)\n// )\n// )\n'})}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-scala",children:'diagram(OpticFocus(founderSalaryLens, startup)).render("founderSalaryLens")\n'})}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{alt:"founderSalaryLens",src:a(5288).A+"",width:"1866",height:"701"})}),"\n",(0,s.jsx)(n.p,{children:"One interesting thing is that lenses can focus on anything, not just direct attributes of the data.\nHere is a traversal \u2014 a more generic kind of lens \u2014 that focuses on all vowels in a string:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-scala",children:'diagram(OpticFocus(vowelTraversal, "example")).render("vowelTraversal")\n'})}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{alt:"vowelTraversal",src:a(2964).A+"",width:"494",height:"193"})}),"\n",(0,s.jsx)(n.p,{children:"We can use it to give our founder a funny name:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-scala",children:'val employeeNameLens = GenLens[Employee](_.name)\n// employeeNameLens: monocle.package.Lens[Employee, String] = repl.MdocSession$MdocApp$$anon$3@47f42c18\nval founderVowelTraversal = founderLens composeLens employeeNameLens composeTraversal vowelTraversal\n// founderVowelTraversal: monocle.PTraversal[Startup, Startup, Char, Char] = monocle.PTraversal$$anon$2@4283ed79\n\nfounderVowelTraversal.modify(v => v.toUpper)(startup)\n// res19: Startup = Startup(\n// name = "Acme",\n// founder = Employee(name = "MIchAEl", salary = 4000L),\n// team = List(\n// Employee(name = "Adam", salary = 2100L),\n// Employee(name = "Bella", salary = 2100L),\n// Employee(name = "Chad", salary = 1980L),\n// Employee(name = "Delia", salary = 1850L)\n// )\n// )\n'})}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-scala",children:'diagram(OpticFocus(founderVowelTraversal, startup)).render("founderVowelTraversal")\n'})}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{alt:"founderVowelTraversal",src:a(7289).A+"",width:"1889",height:"701"})}),"\n",(0,s.jsxs)(n.p,{children:["So far we have replaced the ",(0,s.jsx)(n.code,{children:"copy"})," boilerplate with a number of lens declarations.\nHowever most of the time our goal is just to update data."]}),"\n",(0,s.jsxs)(n.p,{children:["In Scala there is a great library called ",(0,s.jsx)(n.a,{href:"https://github.com/adamw/quicklens",children:"quicklens"}),"\nthat allows to do exactly that, creating all the necessary lenses under the hood:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-scala",children:'import com.softwaremill.quicklens._\n\nval raisedCeo = startup.modify(_.founder.salary).using(s => s + 10)\n// raisedCeo: Startup = Startup(\n// name = "Acme",\n// founder = Employee(name = "Michael", salary = 4010L),\n// team = List(\n// Employee(name = "Adam", salary = 2100L),\n// Employee(name = "Bella", salary = 2100L),\n// Employee(name = "Chad", salary = 1980L),\n// Employee(name = "Delia", salary = 1850L)\n// )\n// )\n'})}),"\n",(0,s.jsx)(n.p,{children:"You might think this is approaching the syntax for updating mutable data,\nbut actually we have already surpassed it, since lenses are much more flexible:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-scala",children:'val raisedEveryone = startup.modifyAll(_.founder.salary, _.team.each.salary).using(s => s + 10)\n// raisedEveryone: Startup = Startup(\n// name = "Acme",\n// founder = Employee(name = "Michael", salary = 4010L),\n// team = List(\n// Employee(name = "Adam", salary = 2110L),\n// Employee(name = "Bella", salary = 2110L),\n// Employee(name = "Chad", salary = 1990L),\n// Employee(name = "Delia", salary = 1860L)\n// )\n// )\n'})}),"\n",(0,s.jsx)(n.h2,{id:"zippers",children:"Zippers"}),"\n",(0,s.jsx)(n.p,{children:"In our domain models we are often faced with recursive data structures.\nConsider this example:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-scala",children:"case class Employee(\n name: String,\n salary: Long\n)\n\ncase class Hierarchy(\n employee: Employee,\n team: List[Hierarchy]\n)\n\ncase class Company(\n name: String,\n hierarchy: Hierarchy\n)\n"})}),"\n",(0,s.jsxs)(n.p,{children:["The ",(0,s.jsx)(n.code,{children:"Hierarchy"})," class refers to itself.\nLet\u2019s grab a company object and display its hierarchy as a tree:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-scala",children:"// extra declarations for this section\nimport zipper._\nimport reftree.contrib.SimplifiedInstances.option\nimport reftree.contrib.ZipperInstances._\n"})}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-scala",children:'diagram(company.hierarchy).render("company")\n'})}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{alt:"company",src:a(3422).A+"",width:"2283",height:"1210"})}),"\n",(0,s.jsxs)(n.p,{children:["What if we want to navigate through this tree and modify it along the way?\nWe can use ",(0,s.jsx)(n.a,{href:"#lenses",children:"lenses"}),", but the recursive nature of the tree allows for a better solution."]}),"\n",(0,s.jsxs)(n.p,{children:["This solution is called a \u201cZipper\u201d, and was introduced by G\xe9rard Huet in 1997.\nIt consists of a \u201ccursor\u201d pointing to a location anywhere in the tree \u2014 \u201ccurrent focus\u201d.\nThe cursor can be moved freely with operations like ",(0,s.jsx)(n.code,{children:"moveDownLeft"}),", ",(0,s.jsx)(n.code,{children:"moveRight"}),", ",(0,s.jsx)(n.code,{children:"moveUp"}),", etc.\nCurrent focus can be updated, deleted, or new nodes can be inserted to its left or right.\nZippers are immutable, and every operation returns a new Zipper.\nAll the changes made to the tree can be committed, yielding a new modified version of the original tree."]}),"\n",(0,s.jsx)(n.p,{children:"Here is how we would insert a new employee into the hierarchy:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-scala",children:"val updatedHierarchy = Zipper(company.hierarchy).moveDownRight.moveDownRight.insertRight(newHire).commit\n"})}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-scala",children:'(diagram(company.hierarchy) + diagram(updatedHierarchy)).render("updatedHierarchy")\n'})}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{alt:"updatedHierarchy",src:a(365).A+"",width:"2505",height:"1210"})}),"\n",(0,s.jsxs)(n.p,{children:["My ",(0,s.jsx)(n.a,{href:"https://github.com/stanch/zipper#zipper--an-implementation-of-huets-zipper",children:"zipper library"}),"\nprovides a few useful movements and operations."]}),"\n",(0,s.jsx)(n.p,{children:"Let\u2019s consider a simpler recursive data structure:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-scala",children:"case class Tree(x: Int, c: List[Tree] = List.empty)\n"})}),"\n",(0,s.jsx)(n.p,{children:"and a simple tree:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-scala",children:"simpleTree\n// res23: Tree = Tree(\n// x = 1,\n// c = List(\n// Tree(x = 2, c = List()),\n// Tree(x = 3, c = List()),\n// Tree(x = 4, c = List()),\n// Tree(x = 5, c = List(Tree(x = 6, c = List()), Tree(x = 7, c = List())))\n// )\n// )\n"})}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-scala",children:'diagram(simpleTree).render("simpleTree")\n'})}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{alt:"simpleTree",src:a(977).A+"",width:"925",height:"721"})}),"\n",(0,s.jsx)(n.p,{children:"When we wrap a Zipper around this tree, it does not look very interesting yet:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-scala",children:"val zipper1 = Zipper(simpleTree)\n"})}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-scala",children:'(diagram(simpleTree) + diagram(zipper1)).render("zipper1")\n'})}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{alt:"zipper1",src:a(3596).A+"",width:"998",height:"890"})}),"\n",(0,s.jsx)(n.p,{children:"We can see that it just points to the original tree and has some other empty fields.\nMore specifically, a Zipper consists of four pointers:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-scala",children:"case class Zipper[A](\n left: List[A], // left siblings of the focus\n focus: A, // the current focus\n right: List[A], // right siblings of the focus\n top: Option[Zipper[A]] // the parent zipper\n)\n"})}),"\n",(0,s.jsx)(n.p,{children:"In this case the focus is the root of the tree, which has no siblings,\nand the parent zipper does not exist, since we are at the top level."}),"\n",(0,s.jsx)(n.p,{children:"One thing we can do right away is modify the focus:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-scala",children:"val zipper2 = zipper1.update(focus => focus.copy(x = focus.x + 99))\n"})}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-scala",children:'(diagram(simpleTree) + diagram(zipper1) + diagram(zipper2)).render("zipper2")\n'})}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{alt:"zipper2",src:a(7879).A+"",width:"1299",height:"890"})}),"\n",(0,s.jsx)(n.p,{children:"We just created a new tree! To obtain it, we have to commit the changes:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-scala",children:"val tree2 = zipper2.commit\n"})}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-scala",children:'(diagram(simpleTree) + diagram(tree2)).render("tree2")\n'})}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{alt:"tree2",src:a(4025).A+"",width:"947",height:"721"})}),"\n",(0,s.jsx)(n.p,{children:"If you were following closely,\nyou would notice that nothing spectacular happened yet:\nwe could\u2019ve easily obtained the same result by modifying the tree directly:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-scala",children:"val tree2b = simpleTree.copy(x = simpleTree.x + 99)\n\nassert(tree2b == tree2)\n"})}),"\n",(0,s.jsx)(n.p,{children:"The power of Zipper becomes apparent when we go one or more levels deep.\nTo move down the tree, we \u201cunzip\u201d it, separating the child nodes into\nthe focused node and its left and right siblings:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-scala",children:"val zipper3 = zipper1.moveDownLeft\n"})}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-scala",children:'(diagram(zipper1) + diagram(zipper3)).render("zipper1+3")\n'})}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{alt:"zipper1+3",src:a(3146).A+"",width:"973",height:"1060"})}),"\n",(0,s.jsx)(n.p,{children:"The new Zipper links to the old one,\nwhich will allow us to return to the root of the tree when we are done applying changes.\nThis link however prevents us from seeing the picture clearly.\nLet\u2019s look at the second zipper alone:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-scala",children:'diagram(zipper3).render("zipper3")\n'})}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{alt:"zipper3",src:a(4862).A+"",width:"927",height:"758"})}),"\n",(0,s.jsxs)(n.p,{children:["Great! We have ",(0,s.jsx)(n.code,{children:"2"})," in focus and ",(0,s.jsx)(n.code,{children:"3, 4, 5"})," as right siblings. What happens if we move right a bit?"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-scala",children:"val zipper4 = zipper3.moveRightBy(2)\n"})}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-scala",children:'diagram(zipper4).render("zipper4")\n'})}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{alt:"zipper4",src:a(3358).A+"",width:"818",height:"758"})}),"\n",(0,s.jsx)(n.p,{children:"This is interesting! Notice that the left siblings are \u201cinverted\u201d.\nThis allows to move left and right in constant time, because the sibling\nadjacent to the focus is always at the head of the list."}),"\n",(0,s.jsx)(n.p,{children:"This also allows us to insert new siblings easily:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-scala",children:"val zipper5 = zipper4.insertLeft(Tree(34))\n"})}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-scala",children:'diagram(zipper5).render("zipper5")\n'})}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{alt:"zipper5",src:a(2712).A+"",width:"935",height:"758"})}),"\n",(0,s.jsx)(n.p,{children:"And, as you might know, we can delete nodes and update the focus:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-scala",children:"val zipper6 = zipper5.deleteAndMoveRight.set(Tree(45))\n"})}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-scala",children:'diagram(zipper6).render("zipper6")\n'})}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{alt:"zipper6",src:a(7203).A+"",width:"531",height:"494"})}),"\n",(0,s.jsx)(n.p,{children:"Finally, when we move up, the siblings at the current level are \u201czipped\u201d\ntogether and their parent node is updated:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-scala",children:"val zipper7 = zipper6.moveUp\n"})}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-scala",children:'diagram(zipper7).render("zipper7")\n'})}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{alt:"zipper7",src:a(1994).A+"",width:"777",height:"626"})}),"\n",(0,s.jsxs)(n.p,{children:["You can probably guess by now that ",(0,s.jsx)(n.code,{children:".commit"})," is a shorthand for going\nall the way up (applying all the changes) and returning the focus:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-scala",children:"val tree3a = zipper6.moveUp.focus\nval tree3b = zipper6.commit\n\nassert(tree3a == tree3b)\n"})}),"\n",(0,s.jsx)(n.p,{children:"Here is an animation of the navigation process:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-scala",children:'val movement = Animation\n .startWith(Zipper(Data.simpleTree))\n .iterate(\n _.moveDownLeft,\n _.moveRight, _.moveRight, _.moveRight,\n _.moveDownLeft,\n _.moveRight, _.moveLeft,\n _.top.get,\n _.moveLeft, _.moveLeft, _.moveLeft,\n _.top.get\n )\n\nval trees = movement\n .build(z => Diagram(ZipperFocus(z, Data.simpleTree)).withCaption("Tree").withAnchor("tree"))\n .toNamespace("tree")\n\nval zippers = movement\n .build(Diagram(_).withCaption("Zipper").withAnchor("zipper").withColor(2))\n .toNamespace("zipper")\n\n(trees + zippers).render("tree+zipper")\n'})}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{alt:"tree+zipper",src:a(1864).A+"",width:"1241",height:"690"})}),"\n",(0,s.jsx)(n.h2,{id:"useful-resources",children:"Useful resources"}),"\n",(0,s.jsx)(n.h3,{id:"books-papers-and-talks",children:"Books, papers and talks"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.a,{href:"http://www.amazon.com/Purely-Functional-Structures-Chris-Okasaki/dp/0521663504",children:"Purely functional data structures"})," by Chris Okasaki,\nand/or ",(0,s.jsx)(n.a,{href:"https://www.cs.cmu.edu/~rwh/theses/okasaki.pdf",children:"his PhD thesis"})," \u2014 ",(0,s.jsx)(n.em,{children:"the"})," introduction to immutable data structures"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.a,{href:"http://cstheory.stackexchange.com/a/1550",children:"What\u2019s new in purely functional data structures since Okasaki"})," \u2014 an excellent StackExchange answer\nwith pointers for further reading"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.a,{href:"https://www.youtube.com/watch?v=pNhBQJN44YQ",children:"Extreme cleverness"})," by Daniel Spiewak \u2014 a superb talk\ncovering several immutable data structures (implemented ",(0,s.jsx)(n.a,{href:"https://github.com/djspiewak/extreme-cleverness",children:"here"}),")"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.a,{href:"http://hypirion.com/musings/understanding-persistent-vector-pt-1",children:"Understanding Clojure\u2019s Persistent Vectors, part 1"}),"\nand ",(0,s.jsx)(n.a,{href:"http://hypirion.com/musings/understanding-persistent-vector-pt-2",children:"part 2"})," \u2014 a series of blog posts by Jean Niklas L\u2019orange"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.a,{href:"http://www.cs.ox.ac.uk/ralf.hinze/publications/FingerTrees.pdf",children:"Finger Trees"})," and\n",(0,s.jsx)(n.a,{href:"http://www.cs.ox.ac.uk/ralf.hinze/publications/Brother12.pdf",children:"1-2 Brother Trees"})," described by Hinze and Paterson"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.a,{href:"https://www.st.cs.uni-saarland.de/edu/seminare/2005/advanced-fp/docs/huet-zipper.pdf",children:"Huet\u2019s original Zipper paper"})," \u2014 a great short read\nintroducing the Zipper"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.a,{href:"http://dspace.library.uu.nl/bitstream/handle/1874/2532/2001-33.pdf",children:"Weaving a web"})," by Hinze and Jeuring \u2014\nanother interesting Zipper-like approach"]}),"\n"]}),"\n",(0,s.jsx)(n.h3,{id:"scala-libraries",children:"Scala libraries"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.a,{href:"https://github.com/stanch/zipper",children:"zipper"})," \u2014 my Zipper implementation"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.a,{href:"https://github.com/julien-truffaut/Monocle",children:"Monocle"})," \u2014 an \u201coptics\u201d library"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.a,{href:"https://github.com/adamw/quicklens",children:"Quicklens"})," \u2014 a simpler way to update nested case classes"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.a,{href:"https://github.com/Sciss/FingerTree",children:"FingerTree"})," \u2014 an implementation of the Finger Tree data structure"]}),"\n"]})]})}function m(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(p,{...e})}):p(e)}},7580:(e,n,a)=>{a.d(n,{A:()=>s});const s=a.p+"assets/images/finger-b0999bed13c76359869b636227548cc6.gif"},5390:(e,n,a)=>{a.d(n,{A:()=>s});const s=a.p+"assets/images/big-vectors-4b0f5120bf4a32b8802dc41e520eb37a.png"},3422:(e,n,a)=>{a.d(n,{A:()=>s});const s=a.p+"assets/images/company-3188e3cf359d9f1c7224ffceed126083.png"},1738:(e,n,a)=>{a.d(n,{A:()=>s});const s=a.p+"assets/images/founderLens-005975324dcee19c77494d453f8647c2.png"},5288:(e,n,a)=>{a.d(n,{A:()=>s});const s=a.p+"assets/images/founderSalaryLens-89e3e6d28efff27c4c8f563cfa49d3ee.png"},7289:(e,n,a)=>{a.d(n,{A:()=>s});const s=a.p+"assets/images/founderVowelTraversal-d35014cf80294acb4990d554bcedb0d3.png"},2773:(e,n,a)=>{a.d(n,{A:()=>s});const s=a.p+"assets/images/list-append-063e66f9ba76613ce2a8ba351ea27ee8.gif"},2515:(e,n,a)=>{a.d(n,{A:()=>s});const s=a.p+"assets/images/list-prepend-d90a987fd8bfc72246aa9c61dbfcf1c8.gif"},8603:(e,n,a)=>{a.d(n,{A:()=>s});const s=a.p+"assets/images/list-a190da16976869e8e07bee62d501a9f7.png"},2600:(e,n,a)=>{a.d(n,{A:()=>s});const s=a.p+"assets/images/lists-58f15f89774ee685a16243b40e9ba7c2.png"},5623:(e,n,a)=>{a.d(n,{A:()=>s});const s=a.p+"assets/images/queues-5efd3f3abf9c377155a0b4b6de6a77f9.png"},7817:(e,n,a)=>{a.d(n,{A:()=>s});const s=a.p+"assets/images/salaryLens-0d89d07dc97f512aa7fe6b50f061cfcd.png"},977:(e,n,a)=>{a.d(n,{A:()=>s});const s=a.p+"assets/images/simpleTree-bbaebacbd585b97eea7d64d94848caf8.png"},7056:(e,n,a)=>{a.d(n,{A:()=>s});const s=a.p+"assets/images/startup-2a750a1231daf1c2d9c548867f54ffc1.png"},4025:(e,n,a)=>{a.d(n,{A:()=>s});const s=a.p+"assets/images/tree2-9e8f1e7e745ac62ee27f909cf0770ae0.png"},365:(e,n,a)=>{a.d(n,{A:()=>s});const s=a.p+"assets/images/updatedHierarchy-ca0b5d651e31d5815f0d14c96fd928ad.png"},1999:(e,n,a)=>{a.d(n,{A:()=>s});const s=a.p+"assets/images/vectors-d5f0252feb82955ab0584957427fb307.png"},2964:(e,n,a)=>{a.d(n,{A:()=>s});const s=a.p+"assets/images/vowelTraversal-6534f12953b90dc5b6d40f6ee44e6c27.png"},3146:(e,n,a)=>{a.d(n,{A:()=>s});const s=a.p+"assets/images/zipper1+3-dafaaae54d3abc9716c59963ceb6f171.png"},3596:(e,n,a)=>{a.d(n,{A:()=>s});const s=a.p+"assets/images/zipper1-4a80c9c87d37df30e02c064945cde2f6.png"},7879:(e,n,a)=>{a.d(n,{A:()=>s});const s=a.p+"assets/images/zipper2-1176392f67e450e82bfa63dabbeacf90.png"},4862:(e,n,a)=>{a.d(n,{A:()=>s});const s=a.p+"assets/images/zipper3-9ab483dc84adf5005cafecc77e51e394.png"},3358:(e,n,a)=>{a.d(n,{A:()=>s});const s=a.p+"assets/images/zipper4-283827a5d36341e55ced1d024b328633.png"},2712:(e,n,a)=>{a.d(n,{A:()=>s});const s=a.p+"assets/images/zipper5-ce83ff83213a95c042b81012c81a28fc.png"},7203:(e,n,a)=>{a.d(n,{A:()=>s});const s=a.p+"assets/images/zipper6-4431d6974f1d299e656fa1e5c8d54fb0.png"},1994:(e,n,a)=>{a.d(n,{A:()=>s});const s=a.p+"assets/images/zipper7-cd17a63fb6f4732884da00b544ffa549.png"},9696:(e,n,a)=>{a.d(n,{A:()=>s});const s=a.p+"assets/images/queue-668a708310e8e78475fbc9b757c69eb3.gif"},1864:(e,n,a)=>{a.d(n,{A:()=>s});const s=a.p+"assets/images/tree+zipper-b1cf73da287eda26f64b667ce8dcf311.gif"}}]); \ No newline at end of file diff --git a/assets/js/c4f5d8e4.f29e2922.js b/assets/js/c4f5d8e4.f29e2922.js new file mode 100644 index 0000000..d476a15 --- /dev/null +++ b/assets/js/c4f5d8e4.f29e2922.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkreftree=self.webpackChunkreftree||[]).push([[634],{192:(e,r,s)=>{s.r(r),s.d(r,{default:()=>f});s(6540);var t=s(6347),c=s(4848);const f=()=>(0,c.jsx)(c.Fragment,{children:(0,c.jsx)(t.rd,{to:"/reftree/docs"})})}}]); \ No newline at end of file diff --git a/assets/js/e7ed7793.d03dfad9.js b/assets/js/e7ed7793.d03dfad9.js new file mode 100644 index 0000000..15b407c --- /dev/null +++ b/assets/js/e7ed7793.d03dfad9.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkreftree=self.webpackChunkreftree||[]).push([[66],{2468:(e,n,a)=>{a.r(n),a.d(n,{assets:()=>d,contentTitle:()=>s,default:()=>h,frontMatter:()=>t,metadata:()=>o,toc:()=>c});var i=a(4848),r=a(8453);const t={sidebar_position:3},s="User guide",o={id:"Guide",title:"User guide",description:"Trees",source:"@site/../site-gen/target/mdoc/Guide.md",sourceDirName:".",slug:"/Guide",permalink:"/reftree/docs/Guide",draft:!1,unlisted:!1,editUrl:"https://github.com/stanch/reftree/tree/main/docs/../site-gen/target/mdoc/Guide.md",tags:[],version:"current",sidebarPosition:3,frontMatter:{sidebar_position:3},sidebar:"mainSidebar",previous:{title:"Getting started",permalink:"/reftree/docs/GettingStarted"},next:{title:"Talks / Demos",permalink:"/reftree/docs/talks/"}},d={},c=[{value:"Trees",id:"trees",level:2},{value:"Renderers",id:"renderers",level:2},{value:"Diagrams",id:"diagrams",level:2},{value:"Animations",id:"animations",level:2}];function l(e){const n={a:"a",code:"code",h1:"h1",h2:"h2",img:"img",p:"p",pre:"pre",strong:"strong",...(0,r.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.h1,{id:"user-guide",children:"User guide"}),"\n",(0,i.jsx)(n.h2,{id:"trees",children:"Trees"}),"\n",(0,i.jsxs)(n.p,{children:["This library renders diagrams based on a simple data representation called\n",(0,i.jsx)(n.a,{href:"https://github.com/stanch/reftree/blob/master/core/src/main/scala/reftree/core/RefTree.scala",children:(0,i.jsx)(n.code,{children:"RefTree"})}),".\nEssentially, a ",(0,i.jsx)(n.code,{children:"RefTree"})," denotes either an object (",(0,i.jsx)(n.code,{children:"AnyRef"}),") with a number of fields,\nor a primitive (",(0,i.jsx)(n.code,{children:"AnyVal"}),")."]}),"\n",(0,i.jsxs)(n.p,{children:["To render a value of type ",(0,i.jsx)(n.code,{children:"A"}),", you will need an implicit instance of ",(0,i.jsx)(n.code,{children:"ToRefTree[A]"}),".\nFor many Scala collections, as well as case classes, no extra work is needed,\nas these instances are readily available or generated on the fly."]}),"\n",(0,i.jsx)(n.p,{children:"You can configure the automatically generated instances like so:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-scala",children:'import reftree.core.ToRefTree\n\ncase class Tree(size: Int, value: Int, children: List[Tree])\n\nimplicit val treeDerivationConfig: ToRefTree.DerivationConfig[Tree] =\n ToRefTree.DerivationConfig[Tree]\n .rename("MyTree") // display as \u201cMyTree\u201d\n .tweakField("size", _.withName("s")) // label the field \u201cs\u201d, instead of \u201csize\u201d\n .tweakField("value", _.withTreeHighlight(true)) // highlight the value\n .tweakField("children", _.withoutName) // do not label the \u201cchildren\u201d field\n\nimplicitly[ToRefTree[Tree]] // auto-derivation will use the configuration above\n'})}),"\n",(0,i.jsx)(n.p,{children:"For something custom, manual derivation is the way to go, for example:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-scala",children:'import reftree.core._\n\nimplicit def treeInstance: ToRefTree[Tree] = ToRefTree[Tree] { tree =>\n RefTree.Ref(tree, Seq(\n // display the size as a hexadecimal number (why not?)\n RefTree.Val.formatted(tree.size)(_.toHexString).toField.withName("s"),\n // highlight the value\n tree.value.refTree.withHighlight(true).toField.withName("value"),\n // do not label the children\n tree.children.refTree.toField\n )).rename("MyTree") // change the name displayed for the class\n}\n'})}),"\n",(0,i.jsx)(n.h2,{id:"renderers",children:"Renderers"}),"\n",(0,i.jsxs)(n.p,{children:["To render diagrams and animations, you will need a ",(0,i.jsx)(n.code,{children:"Renderer"}),"."]}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.strong,{children:"For JVM:"})}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-scala",children:'import reftree.render._\nimport reftree.diagram._\nimport java.nio.file.Paths\n\nval renderer = Renderer(\n renderingOptions = RenderingOptions(density = 75),\n directory = Paths.get(ImagePath, "guide")\n)\n'})}),"\n",(0,i.jsxs)(n.p,{children:["You can also pass a ",(0,i.jsx)(n.code,{children:"format"})," parameter as a String to the ",(0,i.jsx)(n.code,{children:"Renderer"})," constructor\nto specify the format you require. The default is ",(0,i.jsx)(n.code,{children:"png"}),". You can specify any\nfile type supported by ",(0,i.jsx)(n.code,{children:"dot -T"}),"."]}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.strong,{children:"For Scala.js:"})}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-scala",children:"import reftree.render._\nimport reftree.diagram._\n\nval renderer = Renderer(\n renderingOptions = RenderingOptions(density = 75)\n)\n"})}),"\n",(0,i.jsx)(n.p,{children:"There are two ways to use renderers:"}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.strong,{children:"JVM"})}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-scala",children:'import scala.collection.immutable.Queue\n\n// Option 1: using the `render` method\nrenderer.render("queue", Diagram(Queue(1)))\n\n// Option 2: using syntactic sugar\nimport renderer._\nDiagram(Queue(1)).render("queue")\n'})}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.strong,{children:"Scala.js"})}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-scala",children:'import org.scalajs.dom\n\n// Option 1: using the `render` method\nrenderer.render(dom.document.getElementById("diagram"), Diagram(List(1)))\n\n// Option 2: using syntactic sugar\nimport renderer._\nDiagram(List(1)).render(dom.document.getElementById("diagram"))\n'})}),"\n",(0,i.jsx)(n.p,{children:"You can set various options, for example:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-scala",children:'// using the `render` method\nrenderer.tweakRendering(_.withVerticalSpacing(2)).render("queue", Diagram(Queue(1)))\n\n// using syntactic sugar\nDiagram(Queue(1)).render("queue", _.withVerticalSpacing(2))\n'})}),"\n",(0,i.jsx)(n.h2,{id:"diagrams",children:"Diagrams"}),"\n",(0,i.jsx)(n.p,{children:"Diagrams can be created and combined into bigger diagrams using the following API:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-scala",children:'// no caption\nDiagram(Queue(1)).render("caption-none")\n'})}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"caption-none",src:a(4990).A+"",width:"187",height:"274"})}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-scala",children:'// automatically set caption to "Queue(1) :+ 2"\nDiagram.sourceCodeCaption(Queue(1) :+ 2).render("caption-source")\n'})}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"caption-source",src:a(1127).A+"",width:"297",height:"372"})}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-scala",children:'// use toString to get the caption, i.e. "Queue(1, 2)"\nDiagram.toStringCaption(Queue(1) :+ 2).render("caption-tostring")\n'})}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"caption-tostring",src:a(1664).A+"",width:"288",height:"372"})}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-scala",children:'// merge two diagrams, set captions manually\n(Diagram(Queue(1)).withCaption("one") + Diagram(Queue(2)).withCaption("two")).render("one-two")\n'})}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"one-two",src:a(6462).A+"",width:"392",height:"372"})}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-scala",children:'// isolate each diagram in its own namespace (graph nodes will not be shared across them)\n(Diagram(Queue(1)).toNamespace("one") + Diagram(Queue(2)).toNamespace("two")).render("namespaced")\n'})}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"namespaced",src:a(6132).A+"",width:"402",height:"274"})}),"\n",(0,i.jsx)(n.h2,{id:"animations",children:"Animations"}),"\n",(0,i.jsx)(n.p,{children:"Animation is essentially a sequence of diagrams, which can be rendered to an animated GIF.\nThe simplest way to create an animation is to use the builder API:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-scala",children:'(Animation\n .startWith(Queue(1))\n .iterateWithIndex(2)((queue, i) => queue :+ (i + 1))\n .build()\n .render("animation-simple"))\n'})}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"animation-simple",src:a(949).A+"",width:"330",height:"471"})}),"\n",(0,i.jsx)(n.p,{children:"You can also configure how the diagram for each frame is produced:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-scala",children:'(Animation\n .startWith(Queue(1))\n .iterateWithIndex(2)((queue, i) => queue :+ (i + 1))\n .build(Diagram(_).withCaption("My Queue").withColor(2))\n .render("animation-captioned-red"))\n'})}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"animation-captioned-red",src:a(5802).A+"",width:"305",height:"471"})}),"\n",(0,i.jsxs)(n.p,{children:["Note that by default the library will try to reduce the average movement of\nall tree nodes across animation frames. Sometimes you want to \u201canchor\u201d\nthe root of the data structure instead, to force it to stay still\nwhile everything else is moving. You can achieve this via ",(0,i.jsx)(n.code,{children:"withAnchor"})," method:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-scala",children:'(Animation\n .startWith(Queue(1))\n .iterateWithIndex(2)((queue, i) => queue :+ (i + 1))\n .build(Diagram(_).withAnchor("queue").withCaption("This node is anchored!"))\n .render("animation-anchored"))\n'})}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"animation-anchored",src:a(2955).A+"",width:"365",height:"471"})}),"\n",(0,i.jsx)(n.p,{children:"Finally, animations can be combined in sequence or in parallel, for example:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-scala",children:'val queue1 = (Animation\n .startWith(Queue(1))\n .iterateWithIndex(2)((queue, i) => queue :+ (i + 1))\n .build()\n .toNamespace("one"))\n\nval queue2 = (Animation\n .startWith(Queue(10))\n .iterateWithIndex(2)((queue, i) => queue :+ (10 * (i + 1)))\n .build()\n .toNamespace("two"))\n\n(queue1 + queue2).render("animation-parallel")\n'})}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"animation-parallel",src:a(7938).A+"",width:"610",height:"471"})})]})}function h(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(l,{...e})}):l(e)}},2955:(e,n,a)=>{a.d(n,{A:()=>i});const i=a.p+"assets/images/animation-anchored-8c8b5dfa237ead06adb46717a46ae600.gif"},5802:(e,n,a)=>{a.d(n,{A:()=>i});const i=a.p+"assets/images/animation-captioned-red-83dcdff0e9a287254cfdb063d0bb5ffe.gif"},7938:(e,n,a)=>{a.d(n,{A:()=>i});const i=a.p+"assets/images/animation-parallel-290fc9d667a8b0509bdbfa044269f886.gif"},949:(e,n,a)=>{a.d(n,{A:()=>i});const i=a.p+"assets/images/animation-simple-2f9602a0503b36aed74a8e40e2b0b745.gif"},4990:(e,n,a)=>{a.d(n,{A:()=>i});const i=a.p+"assets/images/caption-none-5d20b75c0a1aa4c1ffc800e1d6b6660f.png"},1127:(e,n,a)=>{a.d(n,{A:()=>i});const i=a.p+"assets/images/caption-source-31a271258492ebebc6722d8e8933ea46.png"},1664:(e,n,a)=>{a.d(n,{A:()=>i});const i=a.p+"assets/images/caption-tostring-ba525adeb95638e83be22d8857c98a9c.png"},6132:(e,n,a)=>{a.d(n,{A:()=>i});const i=a.p+"assets/images/namespaced-6dd14cbd377faee7a4c6a3be9940fe68.png"},6462:(e,n,a)=>{a.d(n,{A:()=>i});const i=a.p+"assets/images/one-two-fe52e6208faa3021867df57332b3e6ec.png"},8453:(e,n,a)=>{a.d(n,{R:()=>s,x:()=>o});var i=a(6540);const r={},t=i.createContext(r);function s(e){const n=i.useContext(t);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function o(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:s(e.components),i.createElement(t.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/main.4cb1021e.js b/assets/js/main.4cb1021e.js new file mode 100644 index 0000000..105e179 --- /dev/null +++ b/assets/js/main.4cb1021e.js @@ -0,0 +1,2 @@ +/*! For license information please see main.4cb1021e.js.LICENSE.txt */ +(self.webpackChunkreftree=self.webpackChunkreftree||[]).push([[792],{8328:(e,t,n)=>{"use strict";n.d(t,{A:()=>f});n(6540);var r=n(3259),a=n.n(r),o=n(4054);const i={17896441:[()=>Promise.all([n.e(869),n.e(401)]).then(n.bind(n,4313)),"@theme/DocItem",4313],"22c5de9a":[()=>Promise.all([n.e(132),n.e(672)]).then(n.bind(n,8598)),"@site/../site-gen/target/mdoc/talks/Visualize.md",8598],"37c4c8cd":[()=>n.e(956).then(n.bind(n,6773)),"@site/../site-gen/target/mdoc/Overview.md",6773],"5e95c892":[()=>n.e(647).then(n.bind(n,7121)),"@theme/DocsRoot",7121],"5e9f5e1a":[()=>Promise.resolve().then(n.bind(n,4784)),"@generated/docusaurus.config",4784],"66c1eed3":[()=>Promise.all([n.e(869),n.e(350)]).then(n.bind(n,5011)),"@site/../site-gen/target/mdoc/talks/index.md",5011],"71ffd77d":[()=>n.e(533).then(n.bind(n,3691)),"@site/../site-gen/target/mdoc/GettingStarted.md",3691],"9d744931":[()=>n.e(396).then(n.t.bind(n,5685,19)),"@generated/docusaurus-plugin-content-docs/default/p/reftree-docs-dbd.json",5685],a7456010:[()=>n.e(235).then(n.t.bind(n,8552,19)),"@generated/docusaurus-plugin-content-pages/default/__plugin.json",8552],a7bd4aaa:[()=>n.e(98).then(n.bind(n,4532)),"@theme/DocVersionRoot",4532],a94703ab:[()=>Promise.all([n.e(869),n.e(48)]).then(n.bind(n,2559)),"@theme/DocRoot",2559],aba21aa0:[()=>n.e(742).then(n.t.bind(n,7093,19)),"@generated/docusaurus-plugin-content-docs/default/__plugin.json",7093],b3d9ed0f:[()=>Promise.all([n.e(132),n.e(814)]).then(n.bind(n,6444)),"@site/../site-gen/target/mdoc/talks/Immutability.md",6444],c4f5d8e4:[()=>n.e(634).then(n.bind(n,192)),"@site/src/pages/index.js",192],e7ed7793:[()=>n.e(66).then(n.bind(n,2468)),"@site/../site-gen/target/mdoc/Guide.md",2468]};var l=n(4848);function s(e){let{error:t,retry:n,pastDelay:r}=e;return t?(0,l.jsxs)("div",{style:{textAlign:"center",color:"#fff",backgroundColor:"#fa383e",borderColor:"#fa383e",borderStyle:"solid",borderRadius:"0.25rem",borderWidth:"1px",boxSizing:"border-box",display:"block",padding:"1rem",flex:"0 0 50%",marginLeft:"25%",marginRight:"25%",marginTop:"5rem",maxWidth:"50%",width:"100%"},children:[(0,l.jsx)("p",{children:String(t)}),(0,l.jsx)("div",{children:(0,l.jsx)("button",{type:"button",onClick:n,children:"Retry"})})]}):r?(0,l.jsx)("div",{style:{display:"flex",justifyContent:"center",alignItems:"center",height:"100vh"},children:(0,l.jsx)("svg",{id:"loader",style:{width:128,height:110,position:"absolute",top:"calc(100vh - 64%)"},viewBox:"0 0 45 45",xmlns:"http://www.w3.org/2000/svg",stroke:"#61dafb",children:(0,l.jsxs)("g",{fill:"none",fillRule:"evenodd",transform:"translate(1 1)",strokeWidth:"2",children:[(0,l.jsxs)("circle",{cx:"22",cy:"22",r:"6",strokeOpacity:"0",children:[(0,l.jsx)("animate",{attributeName:"r",begin:"1.5s",dur:"3s",values:"6;22",calcMode:"linear",repeatCount:"indefinite"}),(0,l.jsx)("animate",{attributeName:"stroke-opacity",begin:"1.5s",dur:"3s",values:"1;0",calcMode:"linear",repeatCount:"indefinite"}),(0,l.jsx)("animate",{attributeName:"stroke-width",begin:"1.5s",dur:"3s",values:"2;0",calcMode:"linear",repeatCount:"indefinite"})]}),(0,l.jsxs)("circle",{cx:"22",cy:"22",r:"6",strokeOpacity:"0",children:[(0,l.jsx)("animate",{attributeName:"r",begin:"3s",dur:"3s",values:"6;22",calcMode:"linear",repeatCount:"indefinite"}),(0,l.jsx)("animate",{attributeName:"stroke-opacity",begin:"3s",dur:"3s",values:"1;0",calcMode:"linear",repeatCount:"indefinite"}),(0,l.jsx)("animate",{attributeName:"stroke-width",begin:"3s",dur:"3s",values:"2;0",calcMode:"linear",repeatCount:"indefinite"})]}),(0,l.jsx)("circle",{cx:"22",cy:"22",r:"8",children:(0,l.jsx)("animate",{attributeName:"r",begin:"0s",dur:"1.5s",values:"6;1;2;3;4;5;6",calcMode:"linear",repeatCount:"indefinite"})})]})})}):null}var u=n(6921),c=n(3102);function d(e,t){if("*"===e)return a()({loading:s,loader:()=>n.e(237).then(n.bind(n,2237)),modules:["@theme/NotFound"],webpack:()=>[2237],render(e,t){const n=e.default;return(0,l.jsx)(c.W,{value:{plugin:{name:"native",id:"default"}},children:(0,l.jsx)(n,{...t})})}});const r=o[`${e}-${t}`],d={},f=[],p=[],g=(0,u.A)(r);return Object.entries(g).forEach((e=>{let[t,n]=e;const r=i[n];r&&(d[t]=r[0],f.push(r[1]),p.push(r[2]))})),a().Map({loading:s,loader:d,modules:f,webpack:()=>p,render(t,n){const a=JSON.parse(JSON.stringify(r));Object.entries(t).forEach((t=>{let[n,r]=t;const o=r.default;if(!o)throw new Error(`The page component at ${e} doesn't have a default export. This makes it impossible to render anything. Consider default-exporting a React component.`);"object"!=typeof o&&"function"!=typeof o||Object.keys(r).filter((e=>"default"!==e)).forEach((e=>{o[e]=r[e]}));let i=a;const l=n.split(".");l.slice(0,-1).forEach((e=>{i=i[e]})),i[l[l.length-1]]=o}));const o=a.__comp;delete a.__comp;const i=a.__context;delete a.__context;const s=a.__props;return delete a.__props,(0,l.jsx)(c.W,{value:i,children:(0,l.jsx)(o,{...a,...s,...n})})}})}const f=[{path:"/reftree/docs",component:d("/reftree/docs","044"),routes:[{path:"/reftree/docs",component:d("/reftree/docs","a83"),routes:[{path:"/reftree/docs",component:d("/reftree/docs","eae"),routes:[{path:"/reftree/docs/",component:d("/reftree/docs/","30f"),exact:!0,sidebar:"mainSidebar"},{path:"/reftree/docs/GettingStarted",component:d("/reftree/docs/GettingStarted","5bd"),exact:!0,sidebar:"mainSidebar"},{path:"/reftree/docs/Guide",component:d("/reftree/docs/Guide","860"),exact:!0,sidebar:"mainSidebar"},{path:"/reftree/docs/talks/",component:d("/reftree/docs/talks/","b64"),exact:!0,sidebar:"mainSidebar"},{path:"/reftree/docs/talks/Immutability",component:d("/reftree/docs/talks/Immutability","ddb"),exact:!0,sidebar:"mainSidebar"},{path:"/reftree/docs/talks/Visualize",component:d("/reftree/docs/talks/Visualize","e4f"),exact:!0,sidebar:"mainSidebar"}]}]}]},{path:"/reftree/",component:d("/reftree/","289"),exact:!0},{path:"*",component:d("*")}]},6125:(e,t,n)=>{"use strict";n.d(t,{o:()=>o,x:()=>i});var r=n(6540),a=n(4848);const o=r.createContext(!1);function i(e){let{children:t}=e;const[n,i]=(0,r.useState)(!1);return(0,r.useEffect)((()=>{i(!0)}),[]),(0,a.jsx)(o.Provider,{value:n,children:t})}},8536:(e,t,n)=>{"use strict";var r=n(6540),a=n(5338),o=n(545),i=n(4625),l=n(4784),s=n(8193);const u=[n(119),n(6134),n(6294),n(1043)];var c=n(8328),d=n(6347),f=n(2831),p=n(4848);function g(e){let{children:t}=e;return(0,p.jsx)(p.Fragment,{children:t})}var h=n(5260),m=n(4586),y=n(6025),b=n(6342),v=n(1003),w=n(2131),k=n(4090),x=n(2967),S=n(440),E=n(1463);function C(){const{i18n:{currentLocale:e,defaultLocale:t,localeConfigs:n}}=(0,m.A)(),r=(0,w.o)(),a=n[e].htmlLang,o=e=>e.replace("-","_");return(0,p.jsxs)(h.A,{children:[Object.entries(n).map((e=>{let[t,{htmlLang:n}]=e;return(0,p.jsx)("link",{rel:"alternate",href:r.createUrl({locale:t,fullyQualified:!0}),hrefLang:n},t)})),(0,p.jsx)("link",{rel:"alternate",href:r.createUrl({locale:t,fullyQualified:!0}),hrefLang:"x-default"}),(0,p.jsx)("meta",{property:"og:locale",content:o(a)}),Object.values(n).filter((e=>a!==e.htmlLang)).map((e=>(0,p.jsx)("meta",{property:"og:locale:alternate",content:o(e.htmlLang)},`meta-og-${e.htmlLang}`)))]})}function _(e){let{permalink:t}=e;const{siteConfig:{url:n}}=(0,m.A)(),r=function(){const{siteConfig:{url:e,baseUrl:t,trailingSlash:n}}=(0,m.A)(),{pathname:r}=(0,d.zy)();return e+(0,S.applyTrailingSlash)((0,y.Ay)(r),{trailingSlash:n,baseUrl:t})}(),a=t?`${n}${t}`:r;return(0,p.jsxs)(h.A,{children:[(0,p.jsx)("meta",{property:"og:url",content:a}),(0,p.jsx)("link",{rel:"canonical",href:a})]})}function A(){const{i18n:{currentLocale:e}}=(0,m.A)(),{metadata:t,image:n}=(0,b.p)();return(0,p.jsxs)(p.Fragment,{children:[(0,p.jsxs)(h.A,{children:[(0,p.jsx)("meta",{name:"twitter:card",content:"summary_large_image"}),(0,p.jsx)("body",{className:k.w})]}),n&&(0,p.jsx)(v.be,{image:n}),(0,p.jsx)(_,{}),(0,p.jsx)(C,{}),(0,p.jsx)(E.A,{tag:x.Cy,locale:e}),(0,p.jsx)(h.A,{children:t.map(((e,t)=>(0,p.jsx)("meta",{...e},t)))})]})}const T=new Map;var N=n(6125),j=n(6988),P=n(205);function L(e){for(var t=arguments.length,n=new Array(t>1?t-1:0),r=1;r{const r=t.default?.[e]??t[e];return r?.(...n)}));return()=>a.forEach((e=>e?.()))}const O=function(e){let{children:t,location:n,previousLocation:r}=e;return(0,P.A)((()=>{r!==n&&(!function(e){let{location:t,previousLocation:n}=e;if(!n)return;const r=t.pathname===n.pathname,a=t.hash===n.hash,o=t.search===n.search;if(r&&a&&!o)return;const{hash:i}=t;if(i){const e=decodeURIComponent(i.substring(1)),t=document.getElementById(e);t?.scrollIntoView()}else window.scrollTo(0,0)}({location:n,previousLocation:r}),L("onRouteDidUpdate",{previousLocation:r,location:n}))}),[r,n]),t};function R(e){const t=Array.from(new Set([e,decodeURI(e)])).map((e=>(0,f.u)(c.A,e))).flat();return Promise.all(t.map((e=>e.route.component.preload?.())))}class I extends r.Component{previousLocation;routeUpdateCleanupCb;constructor(e){super(e),this.previousLocation=null,this.routeUpdateCleanupCb=s.A.canUseDOM?L("onRouteUpdate",{previousLocation:null,location:this.props.location}):()=>{},this.state={nextRouteHasLoaded:!0}}shouldComponentUpdate(e,t){if(e.location===this.props.location)return t.nextRouteHasLoaded;const n=e.location;return this.previousLocation=this.props.location,this.setState({nextRouteHasLoaded:!1}),this.routeUpdateCleanupCb=L("onRouteUpdate",{previousLocation:this.previousLocation,location:n}),R(n.pathname).then((()=>{this.routeUpdateCleanupCb(),this.setState({nextRouteHasLoaded:!0})})).catch((e=>{console.warn(e),window.location.reload()})),!1}render(){const{children:e,location:t}=this.props;return(0,p.jsx)(O,{previousLocation:this.previousLocation,location:t,children:(0,p.jsx)(d.qh,{location:t,render:()=>e})})}}const F=I,M="__docusaurus-base-url-issue-banner-container",D="__docusaurus-base-url-issue-banner",z="__docusaurus-base-url-issue-banner-suggestion-container";function B(e){return`\ndocument.addEventListener('DOMContentLoaded', function maybeInsertBanner() {\n var shouldInsert = typeof window['docusaurus'] === 'undefined';\n shouldInsert && insertBanner();\n});\n\nfunction insertBanner() {\n var bannerContainer = document.createElement('div');\n bannerContainer.id = '${M}';\n var bannerHtml = ${JSON.stringify(function(e){return`\n
\n

Your Docusaurus site did not load properly.

\n

A very common reason is a wrong site baseUrl configuration.

\n

Current configured baseUrl = ${e} ${"/"===e?" (default value)":""}

\n

We suggest trying baseUrl =

\n
\n`}(e)).replace(/{let{route:t}=e;return!0===t.exact})))return T.set(e.pathname,e.pathname),e;const t=e.pathname.trim().replace(/(?:\/index)?\.html$/,"")||"/";return T.set(e.pathname,t),{...e,pathname:t}}((0,d.zy)());return(0,p.jsx)(F,{location:e,children:G})}function Q(){return(0,p.jsx)(H.A,{children:(0,p.jsx)(j.l,{children:(0,p.jsxs)(N.x,{children:[(0,p.jsxs)(g,{children:[(0,p.jsx)(V,{}),(0,p.jsx)(A,{}),(0,p.jsx)(U,{}),(0,p.jsx)(Y,{})]}),(0,p.jsx)(q,{})]})})})}var K=n(4054);const Z=function(e){try{return document.createElement("link").relList.supports(e)}catch{return!1}}("prefetch")?function(e){return new Promise(((t,n)=>{if("undefined"==typeof document)return void n();const r=document.createElement("link");r.setAttribute("rel","prefetch"),r.setAttribute("href",e),r.onload=()=>t(),r.onerror=()=>n();const a=document.getElementsByTagName("head")[0]??document.getElementsByName("script")[0]?.parentNode;a?.appendChild(r)}))}:function(e){return new Promise(((t,n)=>{const r=new XMLHttpRequest;r.open("GET",e,!0),r.withCredentials=!0,r.onload=()=>{200===r.status?t():n()},r.send(null)}))};var X=n(6921);const J=new Set,ee=new Set,te=()=>navigator.connection?.effectiveType.includes("2g")||navigator.connection?.saveData,ne={prefetch:e=>{if(!(e=>!te()&&!ee.has(e)&&!J.has(e))(e))return!1;J.add(e);const t=(0,f.u)(c.A,e).flatMap((e=>{return t=e.route.path,Object.entries(K).filter((e=>{let[n]=e;return n.replace(/-[^-]+$/,"")===t})).flatMap((e=>{let[,t]=e;return Object.values((0,X.A)(t))}));var t}));return Promise.all(t.map((e=>{const t=n.gca(e);return t&&!t.includes("undefined")?Z(t).catch((()=>{})):Promise.resolve()})))},preload:e=>!!(e=>!te()&&!ee.has(e))(e)&&(ee.add(e),R(e))},re=Object.freeze(ne);function ae(e){let{children:t}=e;return"hash"===l.default.future.experimental_router?(0,p.jsx)(i.I9,{children:t}):(0,p.jsx)(i.Kd,{children:t})}const oe=Boolean(!0);if(s.A.canUseDOM){window.docusaurus=re;const e=document.getElementById("__docusaurus"),t=(0,p.jsx)(o.vd,{children:(0,p.jsx)(ae,{children:(0,p.jsx)(Q,{})})}),n=(e,t)=>{console.error("Docusaurus React Root onRecoverableError:",e,t)},i=()=>{if(window.docusaurusRoot)window.docusaurusRoot.render(t);else if(oe)window.docusaurusRoot=a.hydrateRoot(e,t,{onRecoverableError:n});else{const r=a.createRoot(e,{onRecoverableError:n});r.render(t),window.docusaurusRoot=r}};R(window.location.pathname).then((()=>{(0,r.startTransition)(i)}))}},6988:(e,t,n)=>{"use strict";n.d(t,{o:()=>d,l:()=>f});var r=n(6540),a=n(4784);const o=JSON.parse('{"docusaurus-plugin-content-docs":{"default":{"path":"/reftree/docs","versions":[{"name":"current","label":"Next","isLast":true,"path":"/reftree/docs","mainDocId":"Overview","docs":[{"id":"GettingStarted","path":"/reftree/docs/GettingStarted","sidebar":"mainSidebar"},{"id":"Guide","path":"/reftree/docs/Guide","sidebar":"mainSidebar"},{"id":"Overview","path":"/reftree/docs/","sidebar":"mainSidebar"},{"id":"talks/Immutability","path":"/reftree/docs/talks/Immutability","sidebar":"mainSidebar"},{"id":"talks/index","path":"/reftree/docs/talks/","sidebar":"mainSidebar"},{"id":"talks/Visualize","path":"/reftree/docs/talks/Visualize","sidebar":"mainSidebar"}],"draftIds":[],"sidebars":{"mainSidebar":{"link":{"path":"/reftree/docs/","label":"Overview"}}}}],"breadcrumbs":true}}}'),i=JSON.parse('{"defaultLocale":"en","locales":["en"],"path":"i18n","currentLocale":"en","localeConfigs":{"en":{"label":"English","direction":"ltr","htmlLang":"en","calendar":"gregory","path":"en"}}}');var l=n(2654);const s=JSON.parse('{"docusaurusVersion":"3.4.0","siteVersion":"0.0.0","pluginVersions":{"docusaurus-plugin-content-docs":{"type":"package","name":"@docusaurus/plugin-content-docs","version":"3.4.0"},"docusaurus-plugin-content-blog":{"type":"package","name":"@docusaurus/plugin-content-blog","version":"3.4.0"},"docusaurus-plugin-content-pages":{"type":"package","name":"@docusaurus/plugin-content-pages","version":"3.4.0"},"docusaurus-plugin-sitemap":{"type":"package","name":"@docusaurus/plugin-sitemap","version":"3.4.0"},"docusaurus-theme-classic":{"type":"package","name":"@docusaurus/theme-classic","version":"3.4.0"}}}');var u=n(4848);const c={siteConfig:a.default,siteMetadata:s,globalData:o,i18n:i,codeTranslations:l},d=r.createContext(c);function f(e){let{children:t}=e;return(0,u.jsx)(d.Provider,{value:c,children:t})}},7489:(e,t,n)=>{"use strict";n.d(t,{A:()=>h});var r=n(6540),a=n(8193),o=n(5260),i=n(440),l=n(781),s=n(3102),u=n(4848);function c(e){let{error:t,tryAgain:n}=e;return(0,u.jsxs)("div",{style:{display:"flex",flexDirection:"column",justifyContent:"center",alignItems:"flex-start",minHeight:"100vh",width:"100%",maxWidth:"80ch",fontSize:"20px",margin:"0 auto",padding:"1rem"},children:[(0,u.jsx)("h1",{style:{fontSize:"3rem"},children:"This page crashed"}),(0,u.jsx)("button",{type:"button",onClick:n,style:{margin:"1rem 0",fontSize:"2rem",cursor:"pointer",borderRadius:20,padding:"1rem"},children:"Try again"}),(0,u.jsx)(d,{error:t})]})}function d(e){let{error:t}=e;const n=(0,i.getErrorCausalChain)(t).map((e=>e.message)).join("\n\nCause:\n");return(0,u.jsx)("p",{style:{whiteSpace:"pre-wrap"},children:n})}function f(e){let{children:t}=e;return(0,u.jsx)(s.W,{value:{plugin:{name:"docusaurus-core-error-boundary",id:"default"}},children:t})}function p(e){let{error:t,tryAgain:n}=e;return(0,u.jsx)(f,{children:(0,u.jsxs)(h,{fallback:()=>(0,u.jsx)(c,{error:t,tryAgain:n}),children:[(0,u.jsx)(o.A,{children:(0,u.jsx)("title",{children:"Page Error"})}),(0,u.jsx)(l.A,{children:(0,u.jsx)(c,{error:t,tryAgain:n})})]})})}const g=e=>(0,u.jsx)(p,{...e});class h extends r.Component{constructor(e){super(e),this.state={error:null}}componentDidCatch(e){a.A.canUseDOM&&this.setState({error:e})}render(){const{children:e}=this.props,{error:t}=this.state;if(t){const e={error:t,tryAgain:()=>this.setState({error:null})};return(this.props.fallback??g)(e)}return e??null}}},8193:(e,t,n)=>{"use strict";n.d(t,{A:()=>a});const r="undefined"!=typeof window&&"document"in window&&"createElement"in window.document,a={canUseDOM:r,canUseEventListeners:r&&("addEventListener"in window||"attachEvent"in window),canUseIntersectionObserver:r&&"IntersectionObserver"in window,canUseViewport:r&&"screen"in window}},5260:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});n(6540);var r=n(545),a=n(4848);function o(e){return(0,a.jsx)(r.mg,{...e})}},8774:(e,t,n)=>{"use strict";n.d(t,{A:()=>p});var r=n(6540),a=n(4625),o=n(440),i=n(4586),l=n(6654),s=n(8193),u=n(3427),c=n(6025),d=n(4848);function f(e,t){let{isNavLink:n,to:f,href:p,activeClassName:g,isActive:h,"data-noBrokenLinkCheck":m,autoAddBaseUrl:y=!0,...b}=e;const{siteConfig:v}=(0,i.A)(),{trailingSlash:w,baseUrl:k}=v,x=v.future.experimental_router,{withBaseUrl:S}=(0,c.hH)(),E=(0,u.A)(),C=(0,r.useRef)(null);(0,r.useImperativeHandle)(t,(()=>C.current));const _=f||p;const A=(0,l.A)(_),T=_?.replace("pathname://","");let N=void 0!==T?(j=T,y&&(e=>e.startsWith("/"))(j)?S(j):j):void 0;var j;"hash"===x&&N?.startsWith("./")&&(N=N?.slice(1)),N&&A&&(N=(0,o.applyTrailingSlash)(N,{trailingSlash:w,baseUrl:k}));const P=(0,r.useRef)(!1),L=n?a.k2:a.N_,O=s.A.canUseIntersectionObserver,R=(0,r.useRef)(),I=()=>{P.current||null==N||(window.docusaurus.preload(N),P.current=!0)};(0,r.useEffect)((()=>(!O&&A&&null!=N&&window.docusaurus.prefetch(N),()=>{O&&R.current&&R.current.disconnect()})),[R,N,O,A]);const F=N?.startsWith("#")??!1,M=!b.target||"_self"===b.target,D=!N||!A||!M;return m||!F&&D||E.collectLink(N),b.id&&E.collectAnchor(b.id),D?(0,d.jsx)("a",{ref:C,href:N,..._&&!A&&{target:"_blank",rel:"noopener noreferrer"},...b}):(0,d.jsx)(L,{...b,onMouseEnter:I,onTouchStart:I,innerRef:e=>{C.current=e,O&&e&&A&&(R.current=new window.IntersectionObserver((t=>{t.forEach((t=>{e===t.target&&(t.isIntersecting||t.intersectionRatio>0)&&(R.current.unobserve(e),R.current.disconnect(),null!=N&&window.docusaurus.prefetch(N))}))})),R.current.observe(e))},to:N,...n&&{isActive:h,activeClassName:g}})}const p=r.forwardRef(f)},418:(e,t,n)=>{"use strict";n.d(t,{A:()=>r});const r=()=>null},1312:(e,t,n)=>{"use strict";n.d(t,{A:()=>u,T:()=>s});var r=n(6540),a=n(4848);function o(e,t){const n=e.split(/(\{\w+\})/).map(((e,n)=>{if(n%2==1){const n=t?.[e.slice(1,-1)];if(void 0!==n)return n}return e}));return n.some((e=>(0,r.isValidElement)(e)))?n.map(((e,t)=>(0,r.isValidElement)(e)?r.cloneElement(e,{key:t}):e)).filter((e=>""!==e)):n.join("")}var i=n(2654);function l(e){let{id:t,message:n}=e;if(void 0===t&&void 0===n)throw new Error("Docusaurus translation declarations must have at least a translation id or a default translation message");return i[t??n]??n??t}function s(e,t){let{message:n,id:r}=e;return o(l({message:n,id:r}),t)}function u(e){let{children:t,id:n,values:r}=e;if(t&&"string"!=typeof t)throw console.warn("Illegal children",t),new Error("The Docusaurus component only accept simple string values");const i=l({message:t,id:n});return(0,a.jsx)(a.Fragment,{children:o(i,r)})}},7065:(e,t,n)=>{"use strict";n.d(t,{W:()=>r});const r="default"},6654:(e,t,n)=>{"use strict";function r(e){return/^(?:\w*:|\/\/)/.test(e)}function a(e){return void 0!==e&&!r(e)}n.d(t,{A:()=>a,z:()=>r})},6025:(e,t,n)=>{"use strict";n.d(t,{Ay:()=>l,hH:()=>i});var r=n(6540),a=n(4586),o=n(6654);function i(){const{siteConfig:e}=(0,a.A)(),{baseUrl:t,url:n}=e,i=e.future.experimental_router,l=(0,r.useCallback)(((e,r)=>function(e){let{siteUrl:t,baseUrl:n,url:r,options:{forcePrependBaseUrl:a=!1,absolute:i=!1}={},router:l}=e;if(!r||r.startsWith("#")||(0,o.z)(r))return r;if("hash"===l)return r.startsWith("/")?`.${r}`:`./${r}`;if(a)return n+r.replace(/^\//,"");if(r===n.replace(/\/$/,""))return n;const s=r.startsWith(n)?r:n+r.replace(/^\//,"");return i?t+s:s}({siteUrl:n,baseUrl:t,url:e,options:r,router:i})),[n,t,i]);return{withBaseUrl:l}}function l(e,t){void 0===t&&(t={});const{withBaseUrl:n}=i();return n(e,t)}},3427:(e,t,n)=>{"use strict";n.d(t,{A:()=>i});var r=n(6540);n(4848);const a=r.createContext({collectAnchor:()=>{},collectLink:()=>{}}),o=()=>(0,r.useContext)(a);function i(){return o()}},4586:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});var r=n(6540),a=n(6988);function o(){return(0,r.useContext)(a.o)}},2303:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});var r=n(6540),a=n(6125);function o(){return(0,r.useContext)(a.o)}},205:(e,t,n)=>{"use strict";n.d(t,{A:()=>a});var r=n(6540);const a=n(8193).A.canUseDOM?r.useLayoutEffect:r.useEffect},6921:(e,t,n)=>{"use strict";n.d(t,{A:()=>a});const r=e=>"object"==typeof e&&!!e&&Object.keys(e).length>0;function a(e){const t={};return function e(n,a){Object.entries(n).forEach((n=>{let[o,i]=n;const l=a?`${a}.${o}`:o;r(i)?e(i,l):t[l]=i}))}(e),t}},3102:(e,t,n)=>{"use strict";n.d(t,{W:()=>i,o:()=>o});var r=n(6540),a=n(4848);const o=r.createContext(null);function i(e){let{children:t,value:n}=e;const i=r.useContext(o),l=(0,r.useMemo)((()=>function(e){let{parent:t,value:n}=e;if(!t){if(!n)throw new Error("Unexpected: no Docusaurus route context found");if(!("plugin"in n))throw new Error("Unexpected: Docusaurus topmost route context has no `plugin` attribute");return n}const r={...t.data,...n?.data};return{plugin:t.plugin,data:r}}({parent:i,value:n})),[i,n]);return(0,a.jsx)(o.Provider,{value:l,children:t})}},4070:(e,t,n)=>{"use strict";n.d(t,{zK:()=>h,vT:()=>f,Gy:()=>c,HW:()=>m,ht:()=>d,r7:()=>g,jh:()=>p});var r=n(6347),a=n(4586),o=n(7065);function i(e,t){void 0===t&&(t={});const n=function(){const{globalData:e}=(0,a.A)();return e}()[e];if(!n&&t.failfast)throw new Error(`Docusaurus plugin global data not found for "${e}" plugin.`);return n}const l=e=>e.versions.find((e=>e.isLast));function s(e,t){const n=function(e,t){const n=l(e);return[...e.versions.filter((e=>e!==n)),n].find((e=>!!(0,r.B6)(t,{path:e.path,exact:!1,strict:!1})))}(e,t),a=n?.docs.find((e=>!!(0,r.B6)(t,{path:e.path,exact:!0,strict:!1})));return{activeVersion:n,activeDoc:a,alternateDocVersions:a?function(t){const n={};return e.versions.forEach((e=>{e.docs.forEach((r=>{r.id===t&&(n[e.name]=r)}))})),n}(a.id):{}}}const u={},c=()=>i("docusaurus-plugin-content-docs")??u,d=e=>{try{return function(e,t,n){void 0===t&&(t=o.W),void 0===n&&(n={});const r=i(e),a=r?.[t];if(!a&&n.failfast)throw new Error(`Docusaurus plugin global data not found for "${e}" plugin with id "${t}".`);return a}("docusaurus-plugin-content-docs",e,{failfast:!0})}catch(t){throw new Error("You are using a feature of the Docusaurus docs plugin, but this plugin does not seem to be enabled"+("Default"===e?"":` (pluginId=${e}`),{cause:t})}};function f(e){void 0===e&&(e={});const t=c(),{pathname:n}=(0,r.zy)();return function(e,t,n){void 0===n&&(n={});const a=Object.entries(e).sort(((e,t)=>t[1].path.localeCompare(e[1].path))).find((e=>{let[,n]=e;return!!(0,r.B6)(t,{path:n.path,exact:!1,strict:!1})})),o=a?{pluginId:a[0],pluginData:a[1]}:void 0;if(!o&&n.failfast)throw new Error(`Can't find active docs plugin for "${t}" pathname, while it was expected to be found. Maybe you tried to use a docs feature that can only be used on a docs-related page? Existing docs plugin paths are: ${Object.values(e).map((e=>e.path)).join(", ")}`);return o}(t,n,e)}function p(e){return d(e).versions}function g(e){const t=d(e);return l(t)}function h(e){const t=d(e),{pathname:n}=(0,r.zy)();return s(t,n)}function m(e){const t=d(e),{pathname:n}=(0,r.zy)();return function(e,t){const n=l(e);return{latestDocSuggestion:s(e,t).alternateDocVersions[n.name],latestVersionSuggestion:n}}(t,n)}},6294:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>o});var r=n(5947),a=n.n(r);a().configure({showSpinner:!1});const o={onRouteUpdate(e){let{location:t,previousLocation:n}=e;if(n&&t.pathname!==n.pathname){const e=window.setTimeout((()=>{a().start()}),200);return()=>window.clearTimeout(e)}},onRouteDidUpdate(){a().done()}}},6134:(e,t,n)=>{"use strict";n.r(t);var r=n(1765),a=n(4784);!function(e){const{themeConfig:{prism:t}}=a.default,{additionalLanguages:r}=t;globalThis.Prism=e,r.forEach((e=>{"php"===e&&n(9700),n(8661)(`./prism-${e}`)})),delete globalThis.Prism}(r.My)},1107:(e,t,n)=>{"use strict";n.d(t,{A:()=>c});n(6540);var r=n(4164),a=n(1312),o=n(6342),i=n(8774),l=n(3427);const s={anchorWithStickyNavbar:"anchorWithStickyNavbar_LWe7",anchorWithHideOnScrollNavbar:"anchorWithHideOnScrollNavbar_WYt5"};var u=n(4848);function c(e){let{as:t,id:n,...c}=e;const d=(0,l.A)(),{navbar:{hideOnScroll:f}}=(0,o.p)();if("h1"===t||!n)return(0,u.jsx)(t,{...c,id:void 0});d.collectAnchor(n);const p=(0,a.T)({id:"theme.common.headingLinkTitle",message:"Direct link to {heading}",description:"Title for link to heading"},{heading:"string"==typeof c.children?c.children:n});return(0,u.jsxs)(t,{...c,className:(0,r.A)("anchor",f?s.anchorWithHideOnScrollNavbar:s.anchorWithStickyNavbar,c.className),id:n,children:[c.children,(0,u.jsx)(i.A,{className:"hash-link",to:`#${n}`,"aria-label":p,title:p,children:"\u200b"})]})}},3186:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});n(6540);const r={iconExternalLink:"iconExternalLink_nPIU"};var a=n(4848);function o(e){let{width:t=13.5,height:n=13.5}=e;return(0,a.jsx)("svg",{width:t,height:n,"aria-hidden":"true",viewBox:"0 0 24 24",className:r.iconExternalLink,children:(0,a.jsx)("path",{fill:"currentColor",d:"M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"})})}},781:(e,t,n)=>{"use strict";n.d(t,{A:()=>pt});var r=n(6540),a=n(4164),o=n(7489),i=n(1003),l=n(6347),s=n(1312),u=n(5062),c=n(4848);const d="__docusaurus_skipToContent_fallback";function f(e){e.setAttribute("tabindex","-1"),e.focus(),e.removeAttribute("tabindex")}function p(){const e=(0,r.useRef)(null),{action:t}=(0,l.W6)(),n=(0,r.useCallback)((e=>{e.preventDefault();const t=document.querySelector("main:first-of-type")??document.getElementById(d);t&&f(t)}),[]);return(0,u.$)((n=>{let{location:r}=n;e.current&&!r.hash&&"PUSH"===t&&f(e.current)})),{containerRef:e,onClick:n}}const g=(0,s.T)({id:"theme.common.skipToMainContent",description:"The skip to content label used for accessibility, allowing to rapidly navigate to main content with keyboard tab/enter navigation",message:"Skip to main content"});function h(e){const t=e.children??g,{containerRef:n,onClick:r}=p();return(0,c.jsx)("div",{ref:n,role:"region","aria-label":g,children:(0,c.jsx)("a",{...e,href:`#${d}`,onClick:r,children:t})})}var m=n(7559),y=n(4090);const b={skipToContent:"skipToContent_fXgn"};function v(){return(0,c.jsx)(h,{className:b.skipToContent})}var w=n(6342),k=n(5041);function x(e){let{width:t=21,height:n=21,color:r="currentColor",strokeWidth:a=1.2,className:o,...i}=e;return(0,c.jsx)("svg",{viewBox:"0 0 15 15",width:t,height:n,...i,children:(0,c.jsx)("g",{stroke:r,strokeWidth:a,children:(0,c.jsx)("path",{d:"M.75.75l13.5 13.5M14.25.75L.75 14.25"})})})}const S={closeButton:"closeButton_CVFx"};function E(e){return(0,c.jsx)("button",{type:"button","aria-label":(0,s.T)({id:"theme.AnnouncementBar.closeButtonAriaLabel",message:"Close",description:"The ARIA label for close button of announcement bar"}),...e,className:(0,a.A)("clean-btn close",S.closeButton,e.className),children:(0,c.jsx)(x,{width:14,height:14,strokeWidth:3.1})})}const C={content:"content_knG7"};function _(e){const{announcementBar:t}=(0,w.p)(),{content:n}=t;return(0,c.jsx)("div",{...e,className:(0,a.A)(C.content,e.className),dangerouslySetInnerHTML:{__html:n}})}const A={announcementBar:"announcementBar_mb4j",announcementBarPlaceholder:"announcementBarPlaceholder_vyr4",announcementBarClose:"announcementBarClose_gvF7",announcementBarContent:"announcementBarContent_xLdY"};function T(){const{announcementBar:e}=(0,w.p)(),{isActive:t,close:n}=(0,k.M)();if(!t)return null;const{backgroundColor:r,textColor:a,isCloseable:o}=e;return(0,c.jsxs)("div",{className:A.announcementBar,style:{backgroundColor:r,color:a},role:"banner",children:[o&&(0,c.jsx)("div",{className:A.announcementBarPlaceholder}),(0,c.jsx)(_,{className:A.announcementBarContent}),o&&(0,c.jsx)(E,{onClick:n,className:A.announcementBarClose})]})}var N=n(9876),j=n(3104);var P=n(9532),L=n(5600);const O=r.createContext(null);function R(e){let{children:t}=e;const n=function(){const e=(0,N.M)(),t=(0,L.YL)(),[n,a]=(0,r.useState)(!1),o=null!==t.component,i=(0,P.ZC)(o);return(0,r.useEffect)((()=>{o&&!i&&a(!0)}),[o,i]),(0,r.useEffect)((()=>{o?e.shown||a(!0):a(!1)}),[e.shown,o]),(0,r.useMemo)((()=>[n,a]),[n])}();return(0,c.jsx)(O.Provider,{value:n,children:t})}function I(e){if(e.component){const t=e.component;return(0,c.jsx)(t,{...e.props})}}function F(){const e=(0,r.useContext)(O);if(!e)throw new P.dV("NavbarSecondaryMenuDisplayProvider");const[t,n]=e,a=(0,r.useCallback)((()=>n(!1)),[n]),o=(0,L.YL)();return(0,r.useMemo)((()=>({shown:t,hide:a,content:I(o)})),[a,o,t])}function M(e){let{header:t,primaryMenu:n,secondaryMenu:r}=e;const{shown:o}=F();return(0,c.jsxs)("div",{className:"navbar-sidebar",children:[t,(0,c.jsxs)("div",{className:(0,a.A)("navbar-sidebar__items",{"navbar-sidebar__items--show-secondary":o}),children:[(0,c.jsx)("div",{className:"navbar-sidebar__item menu",children:n}),(0,c.jsx)("div",{className:"navbar-sidebar__item menu",children:r})]})]})}var D=n(5293),z=n(2303);function B(e){return(0,c.jsx)("svg",{viewBox:"0 0 24 24",width:24,height:24,...e,children:(0,c.jsx)("path",{fill:"currentColor",d:"M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"})})}function $(e){return(0,c.jsx)("svg",{viewBox:"0 0 24 24",width:24,height:24,...e,children:(0,c.jsx)("path",{fill:"currentColor",d:"M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"})})}const U={toggle:"toggle_vylO",toggleButton:"toggleButton_gllP",darkToggleIcon:"darkToggleIcon_wfgR",lightToggleIcon:"lightToggleIcon_pyhR",toggleButtonDisabled:"toggleButtonDisabled_aARS"};function V(e){let{className:t,buttonClassName:n,value:r,onChange:o}=e;const i=(0,z.A)(),l=(0,s.T)({message:"Switch between dark and light mode (currently {mode})",id:"theme.colorToggle.ariaLabel",description:"The ARIA label for the navbar color mode toggle"},{mode:"dark"===r?(0,s.T)({message:"dark mode",id:"theme.colorToggle.ariaLabel.mode.dark",description:"The name for the dark color mode"}):(0,s.T)({message:"light mode",id:"theme.colorToggle.ariaLabel.mode.light",description:"The name for the light color mode"})});return(0,c.jsx)("div",{className:(0,a.A)(U.toggle,t),children:(0,c.jsxs)("button",{className:(0,a.A)("clean-btn",U.toggleButton,!i&&U.toggleButtonDisabled,n),type:"button",onClick:()=>o("dark"===r?"light":"dark"),disabled:!i,title:l,"aria-label":l,"aria-live":"polite",children:[(0,c.jsx)(B,{className:(0,a.A)(U.toggleIcon,U.lightToggleIcon)}),(0,c.jsx)($,{className:(0,a.A)(U.toggleIcon,U.darkToggleIcon)})]})})}const H=r.memo(V),W={darkNavbarColorModeToggle:"darkNavbarColorModeToggle_X3D1"};function q(e){let{className:t}=e;const n=(0,w.p)().navbar.style,r=(0,w.p)().colorMode.disableSwitch,{colorMode:a,setColorMode:o}=(0,D.G)();return r?null:(0,c.jsx)(H,{className:t,buttonClassName:"dark"===n?W.darkNavbarColorModeToggle:void 0,value:a,onChange:o})}var G=n(3465);function Y(){return(0,c.jsx)(G.A,{className:"navbar__brand",imageClassName:"navbar__logo",titleClassName:"navbar__title text--truncate"})}function Q(){const e=(0,N.M)();return(0,c.jsx)("button",{type:"button","aria-label":(0,s.T)({id:"theme.docs.sidebar.closeSidebarButtonAriaLabel",message:"Close navigation bar",description:"The ARIA label for close button of mobile sidebar"}),className:"clean-btn navbar-sidebar__close",onClick:()=>e.toggle(),children:(0,c.jsx)(x,{color:"var(--ifm-color-emphasis-600)"})})}function K(){return(0,c.jsxs)("div",{className:"navbar-sidebar__brand",children:[(0,c.jsx)(Y,{}),(0,c.jsx)(q,{className:"margin-right--md"}),(0,c.jsx)(Q,{})]})}var Z=n(8774),X=n(6025),J=n(6654);function ee(e,t){return void 0!==e&&void 0!==t&&new RegExp(e,"gi").test(t)}var te=n(3186);function ne(e){let{activeBasePath:t,activeBaseRegex:n,to:r,href:a,label:o,html:i,isDropdownLink:l,prependBaseUrlToHref:s,...u}=e;const d=(0,X.Ay)(r),f=(0,X.Ay)(t),p=(0,X.Ay)(a,{forcePrependBaseUrl:!0}),g=o&&a&&!(0,J.A)(a),h=i?{dangerouslySetInnerHTML:{__html:i}}:{children:(0,c.jsxs)(c.Fragment,{children:[o,g&&(0,c.jsx)(te.A,{...l&&{width:12,height:12}})]})};return a?(0,c.jsx)(Z.A,{href:s?p:a,...u,...h}):(0,c.jsx)(Z.A,{to:d,isNavLink:!0,...(t||n)&&{isActive:(e,t)=>n?ee(n,t.pathname):t.pathname.startsWith(f)},...u,...h})}function re(e){let{className:t,isDropdownItem:n=!1,...r}=e;const o=(0,c.jsx)(ne,{className:(0,a.A)(n?"dropdown__link":"navbar__item navbar__link",t),isDropdownLink:n,...r});return n?(0,c.jsx)("li",{children:o}):o}function ae(e){let{className:t,isDropdownItem:n,...r}=e;return(0,c.jsx)("li",{className:"menu__list-item",children:(0,c.jsx)(ne,{className:(0,a.A)("menu__link",t),...r})})}function oe(e){let{mobile:t=!1,position:n,...r}=e;const a=t?ae:re;return(0,c.jsx)(a,{...r,activeClassName:r.activeClassName??(t?"menu__link--active":"navbar__link--active")})}var ie=n(1422),le=n(9169),se=n(4586);const ue={dropdownNavbarItemMobile:"dropdownNavbarItemMobile_S0Fm"};function ce(e,t){return e.some((e=>function(e,t){return!!(0,le.ys)(e.to,t)||!!ee(e.activeBaseRegex,t)||!(!e.activeBasePath||!t.startsWith(e.activeBasePath))}(e,t)))}function de(e){let{items:t,position:n,className:o,onClick:i,...l}=e;const s=(0,r.useRef)(null),[u,d]=(0,r.useState)(!1);return(0,r.useEffect)((()=>{const e=e=>{s.current&&!s.current.contains(e.target)&&d(!1)};return document.addEventListener("mousedown",e),document.addEventListener("touchstart",e),document.addEventListener("focusin",e),()=>{document.removeEventListener("mousedown",e),document.removeEventListener("touchstart",e),document.removeEventListener("focusin",e)}}),[s]),(0,c.jsxs)("div",{ref:s,className:(0,a.A)("navbar__item","dropdown","dropdown--hoverable",{"dropdown--right":"right"===n,"dropdown--show":u}),children:[(0,c.jsx)(ne,{"aria-haspopup":"true","aria-expanded":u,role:"button",href:l.to?void 0:"#",className:(0,a.A)("navbar__link",o),...l,onClick:l.to?void 0:e=>e.preventDefault(),onKeyDown:e=>{"Enter"===e.key&&(e.preventDefault(),d(!u))},children:l.children??l.label}),(0,c.jsx)("ul",{className:"dropdown__menu",children:t.map(((e,t)=>(0,r.createElement)(Ce,{isDropdownItem:!0,activeClassName:"dropdown__link--active",...e,key:t})))})]})}function fe(e){let{items:t,className:n,position:o,onClick:i,...s}=e;const u=function(){const{siteConfig:{baseUrl:e}}=(0,se.A)(),{pathname:t}=(0,l.zy)();return t.replace(e,"/")}(),d=ce(t,u),{collapsed:f,toggleCollapsed:p,setCollapsed:g}=(0,ie.u)({initialState:()=>!d});return(0,r.useEffect)((()=>{d&&g(!d)}),[u,d,g]),(0,c.jsxs)("li",{className:(0,a.A)("menu__list-item",{"menu__list-item--collapsed":f}),children:[(0,c.jsx)(ne,{role:"button",className:(0,a.A)(ue.dropdownNavbarItemMobile,"menu__link menu__link--sublist menu__link--sublist-caret",n),...s,onClick:e=>{e.preventDefault(),p()},children:s.children??s.label}),(0,c.jsx)(ie.N,{lazy:!0,as:"ul",className:"menu__list",collapsed:f,children:t.map(((e,t)=>(0,r.createElement)(Ce,{mobile:!0,isDropdownItem:!0,onClick:i,activeClassName:"menu__link--active",...e,key:t})))})]})}function pe(e){let{mobile:t=!1,...n}=e;const r=t?fe:de;return(0,c.jsx)(r,{...n})}var ge=n(2131);function he(e){let{width:t=20,height:n=20,...r}=e;return(0,c.jsx)("svg",{viewBox:"0 0 24 24",width:t,height:n,"aria-hidden":!0,...r,children:(0,c.jsx)("path",{fill:"currentColor",d:"M12.87 15.07l-2.54-2.51.03-.03c1.74-1.94 2.98-4.17 3.71-6.53H17V4h-7V2H8v2H1v1.99h11.17C11.5 7.92 10.44 9.75 9 11.35 8.07 10.32 7.3 9.19 6.69 8h-2c.73 1.63 1.73 3.17 2.98 4.56l-5.09 5.02L4 19l5-5 3.11 3.11.76-2.04zM18.5 10h-2L12 22h2l1.12-3h4.75L21 22h2l-4.5-12zm-2.62 7l1.62-4.33L19.12 17h-3.24z"})})}const me="iconLanguage_nlXk";var ye=n(418);const be={navbarSearchContainer:"navbarSearchContainer_Bca1"};function ve(e){let{children:t,className:n}=e;return(0,c.jsx)("div",{className:(0,a.A)(n,be.navbarSearchContainer),children:t})}var we=n(4070),ke=n(1754);var xe=n(5597);const Se=e=>e.docs.find((t=>t.id===e.mainDocId));const Ee={default:oe,localeDropdown:function(e){let{mobile:t,dropdownItemsBefore:n,dropdownItemsAfter:r,queryString:a="",...o}=e;const{i18n:{currentLocale:i,locales:u,localeConfigs:d}}=(0,se.A)(),f=(0,ge.o)(),{search:p,hash:g}=(0,l.zy)(),h=[...n,...u.map((e=>{const n=`${`pathname://${f.createUrl({locale:e,fullyQualified:!1})}`}${p}${g}${a}`;return{label:d[e].label,lang:d[e].htmlLang,to:n,target:"_self",autoAddBaseUrl:!1,className:e===i?t?"menu__link--active":"dropdown__link--active":""}})),...r],m=t?(0,s.T)({message:"Languages",id:"theme.navbar.mobileLanguageDropdown.label",description:"The label for the mobile language switcher dropdown"}):d[i].label;return(0,c.jsx)(pe,{...o,mobile:t,label:(0,c.jsxs)(c.Fragment,{children:[(0,c.jsx)(he,{className:me}),m]}),items:h})},search:function(e){let{mobile:t,className:n}=e;return t?null:(0,c.jsx)(ve,{className:n,children:(0,c.jsx)(ye.A,{})})},dropdown:pe,html:function(e){let{value:t,className:n,mobile:r=!1,isDropdownItem:o=!1}=e;const i=o?"li":"div";return(0,c.jsx)(i,{className:(0,a.A)({navbar__item:!r&&!o,"menu__list-item":r},n),dangerouslySetInnerHTML:{__html:t}})},doc:function(e){let{docId:t,label:n,docsPluginId:r,...a}=e;const{activeDoc:o}=(0,we.zK)(r),i=(0,ke.QB)(t,r),l=o?.path===i?.path;return null===i||i.unlisted&&!l?null:(0,c.jsx)(oe,{exact:!0,...a,isActive:()=>l||!!o?.sidebar&&o.sidebar===i.sidebar,label:n??i.id,to:i.path})},docSidebar:function(e){let{sidebarId:t,label:n,docsPluginId:r,...a}=e;const{activeDoc:o}=(0,we.zK)(r),i=(0,ke.fW)(t,r).link;if(!i)throw new Error(`DocSidebarNavbarItem: Sidebar with ID "${t}" doesn't have anything to be linked to.`);return(0,c.jsx)(oe,{exact:!0,...a,isActive:()=>o?.sidebar===t,label:n??i.label,to:i.path})},docsVersion:function(e){let{label:t,to:n,docsPluginId:r,...a}=e;const o=(0,ke.Vd)(r)[0],i=t??o.label,l=n??(e=>e.docs.find((t=>t.id===e.mainDocId)))(o).path;return(0,c.jsx)(oe,{...a,label:i,to:l})},docsVersionDropdown:function(e){let{mobile:t,docsPluginId:n,dropdownActiveClassDisabled:r,dropdownItemsBefore:a,dropdownItemsAfter:o,...i}=e;const{search:u,hash:d}=(0,l.zy)(),f=(0,we.zK)(n),p=(0,we.jh)(n),{savePreferredVersionName:g}=(0,xe.g1)(n),h=[...a,...p.map((e=>{const t=f.alternateDocVersions[e.name]??Se(e);return{label:e.label,to:`${t.path}${u}${d}`,isActive:()=>e===f.activeVersion,onClick:()=>g(e.name)}})),...o],m=(0,ke.Vd)(n)[0],y=t&&h.length>1?(0,s.T)({id:"theme.navbar.mobileVersionsDropdown.label",message:"Versions",description:"The label for the navbar versions dropdown on mobile view"}):m.label,b=t&&h.length>1?void 0:Se(m).path;return h.length<=1?(0,c.jsx)(oe,{...i,mobile:t,label:y,to:b,isActive:r?()=>!1:void 0}):(0,c.jsx)(pe,{...i,mobile:t,label:y,to:b,items:h,isActive:r?()=>!1:void 0})}};function Ce(e){let{type:t,...n}=e;const r=function(e,t){return e&&"default"!==e?e:"items"in t?"dropdown":"default"}(t,n),a=Ee[r];if(!a)throw new Error(`No NavbarItem component found for type "${t}".`);return(0,c.jsx)(a,{...n})}function _e(){const e=(0,N.M)(),t=(0,w.p)().navbar.items;return(0,c.jsx)("ul",{className:"menu__list",children:t.map(((t,n)=>(0,r.createElement)(Ce,{mobile:!0,...t,onClick:()=>e.toggle(),key:n})))})}function Ae(e){return(0,c.jsx)("button",{...e,type:"button",className:"clean-btn navbar-sidebar__back",children:(0,c.jsx)(s.A,{id:"theme.navbar.mobileSidebarSecondaryMenu.backButtonLabel",description:"The label of the back button to return to main menu, inside the mobile navbar sidebar secondary menu (notably used to display the docs sidebar)",children:"\u2190 Back to main menu"})})}function Te(){const e=0===(0,w.p)().navbar.items.length,t=F();return(0,c.jsxs)(c.Fragment,{children:[!e&&(0,c.jsx)(Ae,{onClick:()=>t.hide()}),t.content]})}function Ne(){const e=(0,N.M)();var t;return void 0===(t=e.shown)&&(t=!0),(0,r.useEffect)((()=>(document.body.style.overflow=t?"hidden":"visible",()=>{document.body.style.overflow="visible"})),[t]),e.shouldRender?(0,c.jsx)(M,{header:(0,c.jsx)(K,{}),primaryMenu:(0,c.jsx)(_e,{}),secondaryMenu:(0,c.jsx)(Te,{})}):null}const je={navbarHideable:"navbarHideable_m1mJ",navbarHidden:"navbarHidden_jGov"};function Pe(e){return(0,c.jsx)("div",{role:"presentation",...e,className:(0,a.A)("navbar-sidebar__backdrop",e.className)})}function Le(e){let{children:t}=e;const{navbar:{hideOnScroll:n,style:o}}=(0,w.p)(),i=(0,N.M)(),{navbarRef:l,isNavbarVisible:d}=function(e){const[t,n]=(0,r.useState)(e),a=(0,r.useRef)(!1),o=(0,r.useRef)(0),i=(0,r.useCallback)((e=>{null!==e&&(o.current=e.getBoundingClientRect().height)}),[]);return(0,j.Mq)(((t,r)=>{let{scrollY:i}=t;if(!e)return;if(i=l?n(!1):i+u{if(!e)return;const r=t.location.hash;if(r?document.getElementById(r.substring(1)):void 0)return a.current=!0,void n(!1);n(!0)})),{navbarRef:i,isNavbarVisible:t}}(n);return(0,c.jsxs)("nav",{ref:l,"aria-label":(0,s.T)({id:"theme.NavBar.navAriaLabel",message:"Main",description:"The ARIA label for the main navigation"}),className:(0,a.A)("navbar","navbar--fixed-top",n&&[je.navbarHideable,!d&&je.navbarHidden],{"navbar--dark":"dark"===o,"navbar--primary":"primary"===o,"navbar-sidebar--show":i.shown}),children:[t,(0,c.jsx)(Pe,{onClick:i.toggle}),(0,c.jsx)(Ne,{})]})}var Oe=n(440);const Re={errorBoundaryError:"errorBoundaryError_a6uf",errorBoundaryFallback:"errorBoundaryFallback_VBag"};function Ie(e){return(0,c.jsx)("button",{type:"button",...e,children:(0,c.jsx)(s.A,{id:"theme.ErrorPageContent.tryAgain",description:"The label of the button to try again rendering when the React error boundary captures an error",children:"Try again"})})}function Fe(e){let{error:t}=e;const n=(0,Oe.getErrorCausalChain)(t).map((e=>e.message)).join("\n\nCause:\n");return(0,c.jsx)("p",{className:Re.errorBoundaryError,children:n})}class Me extends r.Component{componentDidCatch(e,t){throw this.props.onError(e,t)}render(){return this.props.children}}const De="right";function ze(e){let{width:t=30,height:n=30,className:r,...a}=e;return(0,c.jsx)("svg",{className:r,width:t,height:n,viewBox:"0 0 30 30","aria-hidden":"true",...a,children:(0,c.jsx)("path",{stroke:"currentColor",strokeLinecap:"round",strokeMiterlimit:"10",strokeWidth:"2",d:"M4 7h22M4 15h22M4 23h22"})})}function Be(){const{toggle:e,shown:t}=(0,N.M)();return(0,c.jsx)("button",{onClick:e,"aria-label":(0,s.T)({id:"theme.docs.sidebar.toggleSidebarButtonAriaLabel",message:"Toggle navigation bar",description:"The ARIA label for hamburger menu button of mobile navigation"}),"aria-expanded":t,className:"navbar__toggle clean-btn",type:"button",children:(0,c.jsx)(ze,{})})}const $e={colorModeToggle:"colorModeToggle_DEke"};function Ue(e){let{items:t}=e;return(0,c.jsx)(c.Fragment,{children:t.map(((e,t)=>(0,c.jsx)(Me,{onError:t=>new Error(`A theme navbar item failed to render.\nPlease double-check the following navbar item (themeConfig.navbar.items) of your Docusaurus config:\n${JSON.stringify(e,null,2)}`,{cause:t}),children:(0,c.jsx)(Ce,{...e})},t)))})}function Ve(e){let{left:t,right:n}=e;return(0,c.jsxs)("div",{className:"navbar__inner",children:[(0,c.jsx)("div",{className:"navbar__items",children:t}),(0,c.jsx)("div",{className:"navbar__items navbar__items--right",children:n})]})}function He(){const e=(0,N.M)(),t=(0,w.p)().navbar.items,[n,r]=function(e){function t(e){return"left"===(e.position??De)}return[e.filter(t),e.filter((e=>!t(e)))]}(t),a=t.find((e=>"search"===e.type));return(0,c.jsx)(Ve,{left:(0,c.jsxs)(c.Fragment,{children:[!e.disabled&&(0,c.jsx)(Be,{}),(0,c.jsx)(Y,{}),(0,c.jsx)(Ue,{items:n})]}),right:(0,c.jsxs)(c.Fragment,{children:[(0,c.jsx)(Ue,{items:r}),(0,c.jsx)(q,{className:$e.colorModeToggle}),!a&&(0,c.jsx)(ve,{children:(0,c.jsx)(ye.A,{})})]})})}function We(){return(0,c.jsx)(Le,{children:(0,c.jsx)(He,{})})}function qe(e){let{item:t}=e;const{to:n,href:r,label:a,prependBaseUrlToHref:o,...i}=t,l=(0,X.Ay)(n),s=(0,X.Ay)(r,{forcePrependBaseUrl:!0});return(0,c.jsxs)(Z.A,{className:"footer__link-item",...r?{href:o?s:r}:{to:l},...i,children:[a,r&&!(0,J.A)(r)&&(0,c.jsx)(te.A,{})]})}function Ge(e){let{item:t}=e;return t.html?(0,c.jsx)("li",{className:"footer__item",dangerouslySetInnerHTML:{__html:t.html}}):(0,c.jsx)("li",{className:"footer__item",children:(0,c.jsx)(qe,{item:t})},t.href??t.to)}function Ye(e){let{column:t}=e;return(0,c.jsxs)("div",{className:"col footer__col",children:[(0,c.jsx)("div",{className:"footer__title",children:t.title}),(0,c.jsx)("ul",{className:"footer__items clean-list",children:t.items.map(((e,t)=>(0,c.jsx)(Ge,{item:e},t)))})]})}function Qe(e){let{columns:t}=e;return(0,c.jsx)("div",{className:"row footer__links",children:t.map(((e,t)=>(0,c.jsx)(Ye,{column:e},t)))})}function Ke(){return(0,c.jsx)("span",{className:"footer__link-separator",children:"\xb7"})}function Ze(e){let{item:t}=e;return t.html?(0,c.jsx)("span",{className:"footer__link-item",dangerouslySetInnerHTML:{__html:t.html}}):(0,c.jsx)(qe,{item:t})}function Xe(e){let{links:t}=e;return(0,c.jsx)("div",{className:"footer__links text--center",children:(0,c.jsx)("div",{className:"footer__links",children:t.map(((e,n)=>(0,c.jsxs)(r.Fragment,{children:[(0,c.jsx)(Ze,{item:e}),t.length!==n+1&&(0,c.jsx)(Ke,{})]},n)))})})}function Je(e){let{links:t}=e;return function(e){return"title"in e[0]}(t)?(0,c.jsx)(Qe,{columns:t}):(0,c.jsx)(Xe,{links:t})}var et=n(1122);const tt={footerLogoLink:"footerLogoLink_BH7S"};function nt(e){let{logo:t}=e;const{withBaseUrl:n}=(0,X.hH)(),r={light:n(t.src),dark:n(t.srcDark??t.src)};return(0,c.jsx)(et.A,{className:(0,a.A)("footer__logo",t.className),alt:t.alt,sources:r,width:t.width,height:t.height,style:t.style})}function rt(e){let{logo:t}=e;return t.href?(0,c.jsx)(Z.A,{href:t.href,className:tt.footerLogoLink,target:t.target,children:(0,c.jsx)(nt,{logo:t})}):(0,c.jsx)(nt,{logo:t})}function at(e){let{copyright:t}=e;return(0,c.jsx)("div",{className:"footer__copyright",dangerouslySetInnerHTML:{__html:t}})}function ot(e){let{style:t,links:n,logo:r,copyright:o}=e;return(0,c.jsx)("footer",{className:(0,a.A)("footer",{"footer--dark":"dark"===t}),children:(0,c.jsxs)("div",{className:"container container-fluid",children:[n,(r||o)&&(0,c.jsxs)("div",{className:"footer__bottom text--center",children:[r&&(0,c.jsx)("div",{className:"margin-bottom--sm",children:r}),o]})]})})}function it(){const{footer:e}=(0,w.p)();if(!e)return null;const{copyright:t,links:n,logo:r,style:a}=e;return(0,c.jsx)(ot,{style:a,links:n&&n.length>0&&(0,c.jsx)(Je,{links:n}),logo:r&&(0,c.jsx)(rt,{logo:r}),copyright:t&&(0,c.jsx)(at,{copyright:t})})}const lt=r.memo(it),st=(0,P.fM)([D.a,k.o,j.Tv,xe.VQ,i.Jx,function(e){let{children:t}=e;return(0,c.jsx)(L.y_,{children:(0,c.jsx)(N.e,{children:(0,c.jsx)(R,{children:t})})})}]);function ut(e){let{children:t}=e;return(0,c.jsx)(st,{children:t})}var ct=n(1107);function dt(e){let{error:t,tryAgain:n}=e;return(0,c.jsx)("main",{className:"container margin-vert--xl",children:(0,c.jsx)("div",{className:"row",children:(0,c.jsxs)("div",{className:"col col--6 col--offset-3",children:[(0,c.jsx)(ct.A,{as:"h1",className:"hero__title",children:(0,c.jsx)(s.A,{id:"theme.ErrorPageContent.title",description:"The title of the fallback page when the page crashed",children:"This page crashed."})}),(0,c.jsx)("div",{className:"margin-vert--lg",children:(0,c.jsx)(Ie,{onClick:n,className:"button button--primary shadow--lw"})}),(0,c.jsx)("hr",{}),(0,c.jsx)("div",{className:"margin-vert--md",children:(0,c.jsx)(Fe,{error:t})})]})})})}const ft={mainWrapper:"mainWrapper_z2l0"};function pt(e){const{children:t,noFooter:n,wrapperClassName:r,title:l,description:s}=e;return(0,y.J)(),(0,c.jsxs)(ut,{children:[(0,c.jsx)(i.be,{title:l,description:s}),(0,c.jsx)(v,{}),(0,c.jsx)(T,{}),(0,c.jsx)(We,{}),(0,c.jsx)("div",{id:d,className:(0,a.A)(m.G.wrapper.main,ft.mainWrapper,r),children:(0,c.jsx)(o.A,{fallback:e=>(0,c.jsx)(dt,{...e}),children:t})}),!n&&(0,c.jsx)(lt,{})]})}},3465:(e,t,n)=>{"use strict";n.d(t,{A:()=>c});n(6540);var r=n(8774),a=n(6025),o=n(4586),i=n(6342),l=n(1122),s=n(4848);function u(e){let{logo:t,alt:n,imageClassName:r}=e;const o={light:(0,a.Ay)(t.src),dark:(0,a.Ay)(t.srcDark||t.src)},i=(0,s.jsx)(l.A,{className:t.className,sources:o,height:t.height,width:t.width,alt:n,style:t.style});return r?(0,s.jsx)("div",{className:r,children:i}):i}function c(e){const{siteConfig:{title:t}}=(0,o.A)(),{navbar:{title:n,logo:l}}=(0,i.p)(),{imageClassName:c,titleClassName:d,...f}=e,p=(0,a.Ay)(l?.href||"/"),g=n?"":t,h=l?.alt??g;return(0,s.jsxs)(r.A,{to:p,...f,...l?.target&&{target:l.target},children:[l&&(0,s.jsx)(u,{logo:l,alt:h,imageClassName:c}),null!=n&&(0,s.jsx)("b",{className:d,children:n})]})}},1463:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});n(6540);var r=n(5260),a=n(4848);function o(e){let{locale:t,version:n,tag:o}=e;const i=t;return(0,a.jsxs)(r.A,{children:[t&&(0,a.jsx)("meta",{name:"docusaurus_locale",content:t}),n&&(0,a.jsx)("meta",{name:"docusaurus_version",content:n}),o&&(0,a.jsx)("meta",{name:"docusaurus_tag",content:o}),i&&(0,a.jsx)("meta",{name:"docsearch:language",content:i}),n&&(0,a.jsx)("meta",{name:"docsearch:version",content:n}),o&&(0,a.jsx)("meta",{name:"docsearch:docusaurus_tag",content:o})]})}},1122:(e,t,n)=>{"use strict";n.d(t,{A:()=>c});var r=n(6540),a=n(4164),o=n(2303),i=n(5293);const l={themedComponent:"themedComponent_mlkZ","themedComponent--light":"themedComponent--light_NVdE","themedComponent--dark":"themedComponent--dark_xIcU"};var s=n(4848);function u(e){let{className:t,children:n}=e;const u=(0,o.A)(),{colorMode:c}=(0,i.G)();return(0,s.jsx)(s.Fragment,{children:(u?"dark"===c?["dark"]:["light"]:["light","dark"]).map((e=>{const o=n({theme:e,className:(0,a.A)(t,l.themedComponent,l[`themedComponent--${e}`])});return(0,s.jsx)(r.Fragment,{children:o},e)}))})}function c(e){const{sources:t,className:n,alt:r,...a}=e;return(0,s.jsx)(u,{className:n,children:e=>{let{theme:n,className:o}=e;return(0,s.jsx)("img",{src:t[n],alt:r,className:o,...a})}})}},1422:(e,t,n)=>{"use strict";n.d(t,{N:()=>y,u:()=>u});var r=n(6540),a=n(8193),o=n(205),i=n(3109),l=n(4848);const s="ease-in-out";function u(e){let{initialState:t}=e;const[n,a]=(0,r.useState)(t??!1),o=(0,r.useCallback)((()=>{a((e=>!e))}),[]);return{collapsed:n,setCollapsed:a,toggleCollapsed:o}}const c={display:"none",overflow:"hidden",height:"0px"},d={display:"block",overflow:"visible",height:"auto"};function f(e,t){const n=t?c:d;e.style.display=n.display,e.style.overflow=n.overflow,e.style.height=n.height}function p(e){let{collapsibleRef:t,collapsed:n,animation:a}=e;const o=(0,r.useRef)(!1);(0,r.useEffect)((()=>{const e=t.current;function r(){const t=e.scrollHeight,n=a?.duration??function(e){if((0,i.O)())return 1;const t=e/36;return Math.round(10*(4+15*t**.25+t/5))}(t);return{transition:`height ${n}ms ${a?.easing??s}`,height:`${t}px`}}function l(){const t=r();e.style.transition=t.transition,e.style.height=t.height}if(!o.current)return f(e,n),void(o.current=!0);return e.style.willChange="height",function(){const t=requestAnimationFrame((()=>{n?(l(),requestAnimationFrame((()=>{e.style.height=c.height,e.style.overflow=c.overflow}))):(e.style.display="block",requestAnimationFrame((()=>{l()})))}));return()=>cancelAnimationFrame(t)}()}),[t,n,a])}function g(e){if(!a.A.canUseDOM)return e?c:d}function h(e){let{as:t="div",collapsed:n,children:a,animation:o,onCollapseTransitionEnd:i,className:s,disableSSRStyle:u}=e;const c=(0,r.useRef)(null);return p({collapsibleRef:c,collapsed:n,animation:o}),(0,l.jsx)(t,{ref:c,style:u?void 0:g(n),onTransitionEnd:e=>{"height"===e.propertyName&&(f(c.current,n),i?.(n))},className:s,children:a})}function m(e){let{collapsed:t,...n}=e;const[a,i]=(0,r.useState)(!t),[s,u]=(0,r.useState)(t);return(0,o.A)((()=>{t||i(!0)}),[t]),(0,o.A)((()=>{a&&u(t)}),[a,t]),a?(0,l.jsx)(h,{...n,collapsed:s}):null}function y(e){let{lazy:t,...n}=e;const r=t?m:h;return(0,l.jsx)(r,{...n})}},5041:(e,t,n)=>{"use strict";n.d(t,{M:()=>h,o:()=>g});var r=n(6540),a=n(2303),o=n(679),i=n(9532),l=n(6342),s=n(4848);const u=(0,o.Wf)("docusaurus.announcement.dismiss"),c=(0,o.Wf)("docusaurus.announcement.id"),d=()=>"true"===u.get(),f=e=>u.set(String(e)),p=r.createContext(null);function g(e){let{children:t}=e;const n=function(){const{announcementBar:e}=(0,l.p)(),t=(0,a.A)(),[n,o]=(0,r.useState)((()=>!!t&&d()));(0,r.useEffect)((()=>{o(d())}),[]);const i=(0,r.useCallback)((()=>{f(!0),o(!0)}),[]);return(0,r.useEffect)((()=>{if(!e)return;const{id:t}=e;let n=c.get();"annoucement-bar"===n&&(n="announcement-bar");const r=t!==n;c.set(t),r&&f(!1),!r&&d()||o(!1)}),[e]),(0,r.useMemo)((()=>({isActive:!!e&&!n,close:i})),[e,n,i])}();return(0,s.jsx)(p.Provider,{value:n,children:t})}function h(){const e=(0,r.useContext)(p);if(!e)throw new i.dV("AnnouncementBarProvider");return e}},5293:(e,t,n)=>{"use strict";n.d(t,{G:()=>y,a:()=>m});var r=n(6540),a=n(8193),o=n(9532),i=n(679),l=n(6342),s=n(4848);const u=r.createContext(void 0),c="theme",d=(0,i.Wf)(c),f={light:"light",dark:"dark"},p=e=>e===f.dark?f.dark:f.light,g=e=>a.A.canUseDOM?p(document.documentElement.getAttribute("data-theme")):p(e),h=e=>{d.set(p(e))};function m(e){let{children:t}=e;const n=function(){const{colorMode:{defaultMode:e,disableSwitch:t,respectPrefersColorScheme:n}}=(0,l.p)(),[a,o]=(0,r.useState)(g(e));(0,r.useEffect)((()=>{t&&d.del()}),[t]);const i=(0,r.useCallback)((function(t,r){void 0===r&&(r={});const{persist:a=!0}=r;t?(o(t),a&&h(t)):(o(n?window.matchMedia("(prefers-color-scheme: dark)").matches?f.dark:f.light:e),d.del())}),[n,e]);(0,r.useEffect)((()=>{document.documentElement.setAttribute("data-theme",p(a))}),[a]),(0,r.useEffect)((()=>{if(t)return;const e=e=>{if(e.key!==c)return;const t=d.get();null!==t&&i(p(t))};return window.addEventListener("storage",e),()=>window.removeEventListener("storage",e)}),[t,i]);const s=(0,r.useRef)(!1);return(0,r.useEffect)((()=>{if(t&&!n)return;const e=window.matchMedia("(prefers-color-scheme: dark)"),r=()=>{window.matchMedia("print").matches||s.current?s.current=window.matchMedia("print").matches:i(null)};return e.addListener(r),()=>e.removeListener(r)}),[i,t,n]),(0,r.useMemo)((()=>({colorMode:a,setColorMode:i,get isDarkTheme(){return a===f.dark},setLightTheme(){i(f.light)},setDarkTheme(){i(f.dark)}})),[a,i])}();return(0,s.jsx)(u.Provider,{value:n,children:t})}function y(){const e=(0,r.useContext)(u);if(null==e)throw new o.dV("ColorModeProvider","Please see https://docusaurus.io/docs/api/themes/configuration#use-color-mode.");return e}},5597:(e,t,n)=>{"use strict";n.d(t,{VQ:()=>y,g1:()=>v});var r=n(6540),a=n(4070),o=n(7065),i=n(6342),l=n(1754),s=n(9532),u=n(679),c=n(4848);const d=e=>`docs-preferred-version-${e}`,f={save:(e,t,n)=>{(0,u.Wf)(d(e),{persistence:t}).set(n)},read:(e,t)=>(0,u.Wf)(d(e),{persistence:t}).get(),clear:(e,t)=>{(0,u.Wf)(d(e),{persistence:t}).del()}},p=e=>Object.fromEntries(e.map((e=>[e,{preferredVersionName:null}])));const g=r.createContext(null);function h(){const e=(0,a.Gy)(),t=(0,i.p)().docs.versionPersistence,n=(0,r.useMemo)((()=>Object.keys(e)),[e]),[o,l]=(0,r.useState)((()=>p(n)));(0,r.useEffect)((()=>{l(function(e){let{pluginIds:t,versionPersistence:n,allDocsData:r}=e;function a(e){const t=f.read(e,n);return r[e].versions.some((e=>e.name===t))?{preferredVersionName:t}:(f.clear(e,n),{preferredVersionName:null})}return Object.fromEntries(t.map((e=>[e,a(e)])))}({allDocsData:e,versionPersistence:t,pluginIds:n}))}),[e,t,n]);return[o,(0,r.useMemo)((()=>({savePreferredVersion:function(e,n){f.save(e,t,n),l((t=>({...t,[e]:{preferredVersionName:n}})))}})),[t])]}function m(e){let{children:t}=e;const n=h();return(0,c.jsx)(g.Provider,{value:n,children:t})}function y(e){let{children:t}=e;return l.C5?(0,c.jsx)(m,{children:t}):(0,c.jsx)(c.Fragment,{children:t})}function b(){const e=(0,r.useContext)(g);if(!e)throw new s.dV("DocsPreferredVersionContextProvider");return e}function v(e){void 0===e&&(e=o.W);const t=(0,a.ht)(e),[n,i]=b(),{preferredVersionName:l}=n[e];return{preferredVersion:t.versions.find((e=>e.name===l))??null,savePreferredVersionName:(0,r.useCallback)((t=>{i.savePreferredVersion(e,t)}),[i,e])}}},6588:(e,t,n)=>{"use strict";n.d(t,{V:()=>s,t:()=>u});var r=n(6540),a=n(9532),o=n(4848);const i=Symbol("EmptyContext"),l=r.createContext(i);function s(e){let{children:t,name:n,items:a}=e;const i=(0,r.useMemo)((()=>n&&a?{name:n,items:a}:null),[n,a]);return(0,o.jsx)(l.Provider,{value:i,children:t})}function u(){const e=(0,r.useContext)(l);if(e===i)throw new a.dV("DocsSidebarProvider");return e}},2252:(e,t,n)=>{"use strict";n.d(t,{n:()=>l,r:()=>s});var r=n(6540),a=n(9532),o=n(4848);const i=r.createContext(null);function l(e){let{children:t,version:n}=e;return(0,o.jsx)(i.Provider,{value:n,children:t})}function s(){const e=(0,r.useContext)(i);if(null===e)throw new a.dV("DocsVersionProvider");return e}},9876:(e,t,n)=>{"use strict";n.d(t,{e:()=>p,M:()=>g});var r=n(6540),a=n(5600),o=n(4581),i=n(6347),l=n(9532);function s(e){!function(e){const t=(0,i.W6)(),n=(0,l._q)(e);(0,r.useEffect)((()=>t.block(((e,t)=>n(e,t)))),[t,n])}(((t,n)=>{if("POP"===n)return e(t,n)}))}var u=n(6342),c=n(4848);const d=r.createContext(void 0);function f(){const e=function(){const e=(0,a.YL)(),{items:t}=(0,u.p)().navbar;return 0===t.length&&!e.component}(),t=(0,o.l)(),n=!e&&"mobile"===t,[i,l]=(0,r.useState)(!1);s((()=>{if(i)return l(!1),!1}));const c=(0,r.useCallback)((()=>{l((e=>!e))}),[]);return(0,r.useEffect)((()=>{"desktop"===t&&l(!1)}),[t]),(0,r.useMemo)((()=>({disabled:e,shouldRender:n,toggle:c,shown:i})),[e,n,c,i])}function p(e){let{children:t}=e;const n=f();return(0,c.jsx)(d.Provider,{value:n,children:t})}function g(){const e=r.useContext(d);if(void 0===e)throw new l.dV("NavbarMobileSidebarProvider");return e}},5600:(e,t,n)=>{"use strict";n.d(t,{GX:()=>u,YL:()=>s,y_:()=>l});var r=n(6540),a=n(9532),o=n(4848);const i=r.createContext(null);function l(e){let{children:t}=e;const n=(0,r.useState)({component:null,props:null});return(0,o.jsx)(i.Provider,{value:n,children:t})}function s(){const e=(0,r.useContext)(i);if(!e)throw new a.dV("NavbarSecondaryMenuContentProvider");return e[0]}function u(e){let{component:t,props:n}=e;const o=(0,r.useContext)(i);if(!o)throw new a.dV("NavbarSecondaryMenuContentProvider");const[,l]=o,s=(0,a.Be)(n);return(0,r.useEffect)((()=>{l({component:t,props:s})}),[l,t,s]),(0,r.useEffect)((()=>()=>l({component:null,props:null})),[l]),null}},4090:(e,t,n)=>{"use strict";n.d(t,{w:()=>a,J:()=>o});var r=n(6540);const a="navigation-with-keyboard";function o(){(0,r.useEffect)((()=>{function e(e){"keydown"===e.type&&"Tab"===e.key&&document.body.classList.add(a),"mousedown"===e.type&&document.body.classList.remove(a)}return document.addEventListener("keydown",e),document.addEventListener("mousedown",e),()=>{document.body.classList.remove(a),document.removeEventListener("keydown",e),document.removeEventListener("mousedown",e)}}),[])}},4581:(e,t,n)=>{"use strict";n.d(t,{l:()=>l});var r=n(6540),a=n(8193);const o={desktop:"desktop",mobile:"mobile",ssr:"ssr"},i=996;function l(e){let{desktopBreakpoint:t=i}=void 0===e?{}:e;const[n,l]=(0,r.useState)((()=>"ssr"));return(0,r.useEffect)((()=>{function e(){l(function(e){if(!a.A.canUseDOM)throw new Error("getWindowSize() should only be called after React hydration");return window.innerWidth>e?o.desktop:o.mobile}(t))}return e(),window.addEventListener("resize",e),()=>{window.removeEventListener("resize",e)}}),[t]),n}},7559:(e,t,n)=>{"use strict";n.d(t,{G:()=>r});const r={page:{blogListPage:"blog-list-page",blogPostPage:"blog-post-page",blogTagsListPage:"blog-tags-list-page",blogTagPostListPage:"blog-tags-post-list-page",docsDocPage:"docs-doc-page",docsTagsListPage:"docs-tags-list-page",docsTagDocListPage:"docs-tags-doc-list-page",mdxPage:"mdx-page"},wrapper:{main:"main-wrapper",blogPages:"blog-wrapper",docsPages:"docs-wrapper",mdxPages:"mdx-wrapper"},common:{editThisPage:"theme-edit-this-page",lastUpdated:"theme-last-updated",backToTopButton:"theme-back-to-top-button",codeBlock:"theme-code-block",admonition:"theme-admonition",unlistedBanner:"theme-unlisted-banner",admonitionType:e=>`theme-admonition-${e}`},layout:{},docs:{docVersionBanner:"theme-doc-version-banner",docVersionBadge:"theme-doc-version-badge",docBreadcrumbs:"theme-doc-breadcrumbs",docMarkdown:"theme-doc-markdown",docTocMobile:"theme-doc-toc-mobile",docTocDesktop:"theme-doc-toc-desktop",docFooter:"theme-doc-footer",docFooterTagsRow:"theme-doc-footer-tags-row",docFooterEditMetaRow:"theme-doc-footer-edit-meta-row",docSidebarContainer:"theme-doc-sidebar-container",docSidebarMenu:"theme-doc-sidebar-menu",docSidebarItemCategory:"theme-doc-sidebar-item-category",docSidebarItemLink:"theme-doc-sidebar-item-link",docSidebarItemCategoryLevel:e=>`theme-doc-sidebar-item-category-level-${e}`,docSidebarItemLinkLevel:e=>`theme-doc-sidebar-item-link-level-${e}`},blog:{blogFooterTagsRow:"theme-blog-footer-tags-row",blogFooterEditMetaRow:"theme-blog-footer-edit-meta-row"},pages:{pageFooterEditMetaRow:"theme-pages-footer-edit-meta-row"}}},3109:(e,t,n)=>{"use strict";function r(){return window.matchMedia("(prefers-reduced-motion: reduce)").matches}n.d(t,{O:()=>r})},1754:(e,t,n)=>{"use strict";n.d(t,{d1:()=>A,Nr:()=>g,w8:()=>b,C5:()=>f,$S:()=>h,cC:()=>p,B5:()=>_,Vd:()=>S,QB:()=>C,fW:()=>E,OF:()=>x,Y:()=>w});var r=n(6540),a=n(6347),o=n(2831),i=n(4070),l=n(5597),s=n(2252),u=n(6588);function c(e){return Array.from(new Set(e))}var d=n(9169);const f=!!i.Gy;function p(e){const t=(0,s.r)();if(!e)return;const n=t.docs[e];if(!n)throw new Error(`no version doc found by id=${e}`);return n}function g(e){return"link"!==e.type||e.unlisted?"category"===e.type?function(e){if(e.href&&!e.linkUnlisted)return e.href;for(const t of e.items){const e=g(t);if(e)return e}}(e):void 0:e.href}function h(){const{pathname:e}=(0,a.zy)(),t=(0,u.t)();if(!t)throw new Error("Unexpected: cant find current sidebar in context");const n=k({sidebarItems:t.items,pathname:e,onlyCategories:!0}).slice(-1)[0];if(!n)throw new Error(`${e} is not associated with a category. useCurrentSidebarCategory() should only be used on category index pages.`);return n}const m=(e,t)=>void 0!==e&&(0,d.ys)(e,t),y=(e,t)=>e.some((e=>b(e,t)));function b(e,t){return"link"===e.type?m(e.href,t):"category"===e.type&&(m(e.href,t)||y(e.items,t))}function v(e,t){switch(e.type){case"category":return b(e,t)||e.items.some((e=>v(e,t)));case"link":return!e.unlisted||b(e,t);default:return!0}}function w(e,t){return(0,r.useMemo)((()=>e.filter((e=>v(e,t)))),[e,t])}function k(e){let{sidebarItems:t,pathname:n,onlyCategories:r=!1}=e;const a=[];return function e(t){for(const o of t)if("category"===o.type&&((0,d.ys)(o.href,n)||e(o.items))||"link"===o.type&&(0,d.ys)(o.href,n)){return r&&"category"!==o.type||a.unshift(o),!0}return!1}(t),a}function x(){const e=(0,u.t)(),{pathname:t}=(0,a.zy)(),n=(0,i.vT)()?.pluginData.breadcrumbs;return!1!==n&&e?k({sidebarItems:e.items,pathname:t}):null}function S(e){const{activeVersion:t}=(0,i.zK)(e),{preferredVersion:n}=(0,l.g1)(e),a=(0,i.r7)(e);return(0,r.useMemo)((()=>c([t,n,a].filter(Boolean))),[t,n,a])}function E(e,t){const n=S(t);return(0,r.useMemo)((()=>{const t=n.flatMap((e=>e.sidebars?Object.entries(e.sidebars):[])),r=t.find((t=>t[0]===e));if(!r)throw new Error(`Can't find any sidebar with id "${e}" in version${n.length>1?"s":""} ${n.map((e=>e.name)).join(", ")}".\nAvailable sidebar ids are:\n- ${t.map((e=>e[0])).join("\n- ")}`);return r[1]}),[e,n])}function C(e,t){const n=S(t);return(0,r.useMemo)((()=>{const t=n.flatMap((e=>e.docs)),r=t.find((t=>t.id===e));if(!r){if(n.flatMap((e=>e.draftIds)).includes(e))return null;throw new Error(`Couldn't find any doc with id "${e}" in version${n.length>1?"s":""} "${n.map((e=>e.name)).join(", ")}".\nAvailable doc ids are:\n- ${c(t.map((e=>e.id))).join("\n- ")}`)}return r}),[e,n])}function _(e){let{route:t}=e;const n=(0,a.zy)(),r=(0,s.r)(),i=t.routes,l=i.find((e=>(0,a.B6)(n.pathname,e)));if(!l)return null;const u=l.sidebar,c=u?r.docsSidebars[u]:void 0;return{docElement:(0,o.v)(i),sidebarName:u,sidebarItems:c}}function A(e){return e.filter((e=>!("category"===e.type||"link"===e.type)||!!g(e)))}},1003:(e,t,n)=>{"use strict";n.d(t,{e3:()=>p,be:()=>d,Jx:()=>g});var r=n(6540),a=n(4164),o=n(5260),i=n(3102);function l(){const e=r.useContext(i.o);if(!e)throw new Error("Unexpected: no Docusaurus route context found");return e}var s=n(6025),u=n(4586);var c=n(4848);function d(e){let{title:t,description:n,keywords:r,image:a,children:i}=e;const l=function(e){const{siteConfig:t}=(0,u.A)(),{title:n,titleDelimiter:r}=t;return e?.trim().length?`${e.trim()} ${r} ${n}`:n}(t),{withBaseUrl:d}=(0,s.hH)(),f=a?d(a,{absolute:!0}):void 0;return(0,c.jsxs)(o.A,{children:[t&&(0,c.jsx)("title",{children:l}),t&&(0,c.jsx)("meta",{property:"og:title",content:l}),n&&(0,c.jsx)("meta",{name:"description",content:n}),n&&(0,c.jsx)("meta",{property:"og:description",content:n}),r&&(0,c.jsx)("meta",{name:"keywords",content:Array.isArray(r)?r.join(","):r}),f&&(0,c.jsx)("meta",{property:"og:image",content:f}),f&&(0,c.jsx)("meta",{name:"twitter:image",content:f}),i]})}const f=r.createContext(void 0);function p(e){let{className:t,children:n}=e;const i=r.useContext(f),l=(0,a.A)(i,t);return(0,c.jsxs)(f.Provider,{value:l,children:[(0,c.jsx)(o.A,{children:(0,c.jsx)("html",{className:l})}),n]})}function g(e){let{children:t}=e;const n=l(),r=`plugin-${n.plugin.name.replace(/docusaurus-(?:plugin|theme)-(?:content-)?/gi,"")}`;const o=`plugin-id-${n.plugin.id}`;return(0,c.jsx)(p,{className:(0,a.A)(r,o),children:t})}},9532:(e,t,n)=>{"use strict";n.d(t,{Be:()=>u,ZC:()=>l,_q:()=>i,dV:()=>s,fM:()=>c});var r=n(6540),a=n(205),o=n(4848);function i(e){const t=(0,r.useRef)(e);return(0,a.A)((()=>{t.current=e}),[e]),(0,r.useCallback)((function(){return t.current(...arguments)}),[])}function l(e){const t=(0,r.useRef)();return(0,a.A)((()=>{t.current=e})),t.current}class s extends Error{constructor(e,t){super(),this.name="ReactContextError",this.message=`Hook ${this.stack?.split("\n")[1]?.match(/at (?:\w+\.)?(?\w+)/)?.groups.name??""} is called outside the <${e}>. ${t??""}`}}function u(e){const t=Object.entries(e);return t.sort(((e,t)=>e[0].localeCompare(t[0]))),(0,r.useMemo)((()=>e),t.flat())}function c(e){return t=>{let{children:n}=t;return(0,o.jsx)(o.Fragment,{children:e.reduceRight(((e,t)=>(0,o.jsx)(t,{children:e})),n)})}}},9169:(e,t,n)=>{"use strict";n.d(t,{Dt:()=>l,ys:()=>i});var r=n(6540),a=n(8328),o=n(4586);function i(e,t){const n=e=>(!e||e.endsWith("/")?e:`${e}/`)?.toLowerCase();return n(e)===n(t)}function l(){const{baseUrl:e}=(0,o.A)().siteConfig;return(0,r.useMemo)((()=>function(e){let{baseUrl:t,routes:n}=e;function r(e){return e.path===t&&!0===e.exact}function a(e){return e.path===t&&!e.exact}return function e(t){if(0===t.length)return;return t.find(r)||e(t.filter(a).flatMap((e=>e.routes??[])))}(n)}({routes:a.A,baseUrl:e})),[e])}},3104:(e,t,n)=>{"use strict";n.d(t,{Mq:()=>f,Tv:()=>u,gk:()=>p});var r=n(6540),a=n(8193),o=n(2303),i=(n(205),n(9532)),l=n(4848);const s=r.createContext(void 0);function u(e){let{children:t}=e;const n=function(){const e=(0,r.useRef)(!0);return(0,r.useMemo)((()=>({scrollEventsEnabledRef:e,enableScrollEvents:()=>{e.current=!0},disableScrollEvents:()=>{e.current=!1}})),[])}();return(0,l.jsx)(s.Provider,{value:n,children:t})}function c(){const e=(0,r.useContext)(s);if(null==e)throw new i.dV("ScrollControllerProvider");return e}const d=()=>a.A.canUseDOM?{scrollX:window.pageXOffset,scrollY:window.pageYOffset}:null;function f(e,t){void 0===t&&(t=[]);const{scrollEventsEnabledRef:n}=c(),a=(0,r.useRef)(d()),o=(0,i._q)(e);(0,r.useEffect)((()=>{const e=()=>{if(!n.current)return;const e=d();o(e,a.current),a.current=e},t={passive:!0};return e(),window.addEventListener("scroll",e,t),()=>window.removeEventListener("scroll",e,t)}),[o,n,...t])}function p(){const e=(0,r.useRef)(null),t=(0,o.A)()&&"smooth"===getComputedStyle(document.documentElement).scrollBehavior;return{startScroll:n=>{e.current=t?function(e){return window.scrollTo({top:e,behavior:"smooth"}),()=>{}}(n):function(e){let t=null;const n=document.documentElement.scrollTop>e;return function r(){const a=document.documentElement.scrollTop;(n&&a>e||!n&&at&&cancelAnimationFrame(t)}(n)},cancelScroll:()=>e.current?.()}}},2967:(e,t,n)=>{"use strict";n.d(t,{Cy:()=>r,tU:()=>a});n(4586);const r="default";function a(e,t){return`docs-${e}-${t}`}},679:(e,t,n)=>{"use strict";n.d(t,{Wf:()=>u});n(6540);const r=JSON.parse('{"N":"localStorage","M":""}'),a=r.N;function o(e){let{key:t,oldValue:n,newValue:r,storage:a}=e;if(n===r)return;const o=document.createEvent("StorageEvent");o.initStorageEvent("storage",!1,!1,t,n,r,window.location.href,a),window.dispatchEvent(o)}function i(e){if(void 0===e&&(e=a),"undefined"==typeof window)throw new Error("Browser storage is not available on Node.js/Docusaurus SSR process.");if("none"===e)return null;try{return window[e]}catch(n){return t=n,l||(console.warn("Docusaurus browser storage is not available.\nPossible reasons: running Docusaurus in an iframe, in an incognito browser session, or using too strict browser privacy settings.",t),l=!0),null}var t}let l=!1;const s={get:()=>null,set:()=>{},del:()=>{},listen:()=>()=>{}};function u(e,t){const n=`${e}${r.M}`;if("undefined"==typeof window)return function(e){function t(){throw new Error(`Illegal storage API usage for storage key "${e}".\nDocusaurus storage APIs are not supposed to be called on the server-rendering process.\nPlease only call storage APIs in effects and event handlers.`)}return{get:t,set:t,del:t,listen:t}}(n);const a=i(t?.persistence);return null===a?s:{get:()=>{try{return a.getItem(n)}catch(e){return console.error(`Docusaurus storage error, can't get key=${n}`,e),null}},set:e=>{try{const t=a.getItem(n);a.setItem(n,e),o({key:n,oldValue:t,newValue:e,storage:a})}catch(t){console.error(`Docusaurus storage error, can't set ${n}=${e}`,t)}},del:()=>{try{const e=a.getItem(n);a.removeItem(n),o({key:n,oldValue:e,newValue:null,storage:a})}catch(e){console.error(`Docusaurus storage error, can't delete key=${n}`,e)}},listen:e=>{try{const t=t=>{t.storageArea===a&&t.key===n&&e(t)};return window.addEventListener("storage",t),()=>window.removeEventListener("storage",t)}catch(t){return console.error(`Docusaurus storage error, can't listen for changes of key=${n}`,t),()=>{}}}}}},2131:(e,t,n)=>{"use strict";n.d(t,{o:()=>i});var r=n(4586),a=n(6347),o=n(440);function i(){const{siteConfig:{baseUrl:e,url:t,trailingSlash:n},i18n:{defaultLocale:i,currentLocale:l}}=(0,r.A)(),{pathname:s}=(0,a.zy)(),u=(0,o.applyTrailingSlash)(s,{trailingSlash:n,baseUrl:e}),c=l===i?e:e.replace(`/${l}/`,"/"),d=u.replace(e,"");return{createUrl:function(e){let{locale:n,fullyQualified:r}=e;return`${r?t:""}${function(e){return e===i?`${c}`:`${c}${e}/`}(n)}${d}`}}}},5062:(e,t,n)=>{"use strict";n.d(t,{$:()=>i});var r=n(6540),a=n(6347),o=n(9532);function i(e){const t=(0,a.zy)(),n=(0,o.ZC)(t),i=(0,o._q)(e);(0,r.useEffect)((()=>{n&&t!==n&&i({location:t,previousLocation:n})}),[i,t,n])}},6342:(e,t,n)=>{"use strict";n.d(t,{p:()=>a});var r=n(4586);function a(){return(0,r.A)().siteConfig.themeConfig}},2983:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.removeTrailingSlash=t.addLeadingSlash=t.addTrailingSlash=void 0;const r=n(2566);function a(e){return e.endsWith("/")?e:`${e}/`}function o(e){return(0,r.removeSuffix)(e,"/")}t.addTrailingSlash=a,t.default=function(e,t){const{trailingSlash:n,baseUrl:r}=t;if(e.startsWith("#"))return e;if(void 0===n)return e;const[i]=e.split(/[#?]/),l="/"===i||i===r?i:(s=i,n?a(s):o(s));var s;return e.replace(i,l)},t.addLeadingSlash=function(e){return(0,r.addPrefix)(e,"/")},t.removeTrailingSlash=o},253:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.getErrorCausalChain=void 0,t.getErrorCausalChain=function e(t){return t.cause?[t,...e(t.cause)]:[t]}},440:function(e,t,n){"use strict";var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.getErrorCausalChain=t.removePrefix=t.addSuffix=t.removeSuffix=t.addPrefix=t.removeTrailingSlash=t.addLeadingSlash=t.addTrailingSlash=t.applyTrailingSlash=t.blogPostContainerID=void 0,t.blogPostContainerID="__blog-post-container";var a=n(2983);Object.defineProperty(t,"applyTrailingSlash",{enumerable:!0,get:function(){return r(a).default}}),Object.defineProperty(t,"addTrailingSlash",{enumerable:!0,get:function(){return a.addTrailingSlash}}),Object.defineProperty(t,"addLeadingSlash",{enumerable:!0,get:function(){return a.addLeadingSlash}}),Object.defineProperty(t,"removeTrailingSlash",{enumerable:!0,get:function(){return a.removeTrailingSlash}});var o=n(2566);Object.defineProperty(t,"addPrefix",{enumerable:!0,get:function(){return o.addPrefix}}),Object.defineProperty(t,"removeSuffix",{enumerable:!0,get:function(){return o.removeSuffix}}),Object.defineProperty(t,"addSuffix",{enumerable:!0,get:function(){return o.addSuffix}}),Object.defineProperty(t,"removePrefix",{enumerable:!0,get:function(){return o.removePrefix}});var i=n(253);Object.defineProperty(t,"getErrorCausalChain",{enumerable:!0,get:function(){return i.getErrorCausalChain}})},2566:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.removePrefix=t.addSuffix=t.removeSuffix=t.addPrefix=void 0,t.addPrefix=function(e,t){return e.startsWith(t)?e:`${t}${e}`},t.removeSuffix=function(e,t){return""===t?e:e.endsWith(t)?e.slice(0,-t.length):e},t.addSuffix=function(e,t){return e.endsWith(t)?e:`${e}${t}`},t.removePrefix=function(e,t){return e.startsWith(t)?e.slice(t.length):e}},9231:(e,t,n)=>{"use strict";n.d(t,{zR:()=>S,TM:()=>N,yJ:()=>h,sC:()=>P,AO:()=>g,Fu:()=>m});var r=n(8168);function a(e){return"/"===e.charAt(0)}function o(e,t){for(var n=t,r=n+1,a=e.length;r=0;f--){var p=i[f];"."===p?o(i,f):".."===p?(o(i,f),d++):d&&(o(i,f),d--)}if(!u)for(;d--;d)i.unshift("..");!u||""===i[0]||i[0]&&a(i[0])||i.unshift("");var g=i.join("/");return n&&"/"!==g.substr(-1)&&(g+="/"),g};function l(e){return e.valueOf?e.valueOf():Object.prototype.valueOf.call(e)}const s=function e(t,n){if(t===n)return!0;if(null==t||null==n)return!1;if(Array.isArray(t))return Array.isArray(n)&&t.length===n.length&&t.every((function(t,r){return e(t,n[r])}));if("object"==typeof t||"object"==typeof n){var r=l(t),a=l(n);return r!==t||a!==n?e(r,a):Object.keys(Object.assign({},t,n)).every((function(r){return e(t[r],n[r])}))}return!1};var u=n(1561);function c(e){return"/"===e.charAt(0)?e:"/"+e}function d(e){return"/"===e.charAt(0)?e.substr(1):e}function f(e,t){return function(e,t){return 0===e.toLowerCase().indexOf(t.toLowerCase())&&-1!=="/?#".indexOf(e.charAt(t.length))}(e,t)?e.substr(t.length):e}function p(e){return"/"===e.charAt(e.length-1)?e.slice(0,-1):e}function g(e){var t=e.pathname,n=e.search,r=e.hash,a=t||"/";return n&&"?"!==n&&(a+="?"===n.charAt(0)?n:"?"+n),r&&"#"!==r&&(a+="#"===r.charAt(0)?r:"#"+r),a}function h(e,t,n,a){var o;"string"==typeof e?(o=function(e){var t=e||"/",n="",r="",a=t.indexOf("#");-1!==a&&(r=t.substr(a),t=t.substr(0,a));var o=t.indexOf("?");return-1!==o&&(n=t.substr(o),t=t.substr(0,o)),{pathname:t,search:"?"===n?"":n,hash:"#"===r?"":r}}(e),o.state=t):(void 0===(o=(0,r.A)({},e)).pathname&&(o.pathname=""),o.search?"?"!==o.search.charAt(0)&&(o.search="?"+o.search):o.search="",o.hash?"#"!==o.hash.charAt(0)&&(o.hash="#"+o.hash):o.hash="",void 0!==t&&void 0===o.state&&(o.state=t));try{o.pathname=decodeURI(o.pathname)}catch(l){throw l instanceof URIError?new URIError('Pathname "'+o.pathname+'" could not be decoded. This is likely caused by an invalid percent-encoding.'):l}return n&&(o.key=n),a?o.pathname?"/"!==o.pathname.charAt(0)&&(o.pathname=i(o.pathname,a.pathname)):o.pathname=a.pathname:o.pathname||(o.pathname="/"),o}function m(e,t){return e.pathname===t.pathname&&e.search===t.search&&e.hash===t.hash&&e.key===t.key&&s(e.state,t.state)}function y(){var e=null;var t=[];return{setPrompt:function(t){return e=t,function(){e===t&&(e=null)}},confirmTransitionTo:function(t,n,r,a){if(null!=e){var o="function"==typeof e?e(t,n):e;"string"==typeof o?"function"==typeof r?r(o,a):a(!0):a(!1!==o)}else a(!0)},appendListener:function(e){var n=!0;function r(){n&&e.apply(void 0,arguments)}return t.push(r),function(){n=!1,t=t.filter((function(e){return e!==r}))}},notifyListeners:function(){for(var e=arguments.length,n=new Array(e),r=0;rt?n.splice(t,n.length-t,a):n.push(a),d({action:r,location:a,index:t,entries:n})}}))},replace:function(e,t){var r="REPLACE",a=h(e,t,f(),w.location);c.confirmTransitionTo(a,r,n,(function(e){e&&(w.entries[w.index]=a,d({action:r,location:a}))}))},go:v,goBack:function(){v(-1)},goForward:function(){v(1)},canGo:function(e){var t=w.index+e;return t>=0&&t{"use strict";var r=n(4363),a={childContextTypes:!0,contextType:!0,contextTypes:!0,defaultProps:!0,displayName:!0,getDefaultProps:!0,getDerivedStateFromError:!0,getDerivedStateFromProps:!0,mixins:!0,propTypes:!0,type:!0},o={name:!0,length:!0,prototype:!0,caller:!0,callee:!0,arguments:!0,arity:!0},i={$$typeof:!0,compare:!0,defaultProps:!0,displayName:!0,propTypes:!0,type:!0},l={};function s(e){return r.isMemo(e)?i:l[e.$$typeof]||a}l[r.ForwardRef]={$$typeof:!0,render:!0,defaultProps:!0,displayName:!0,propTypes:!0},l[r.Memo]=i;var u=Object.defineProperty,c=Object.getOwnPropertyNames,d=Object.getOwnPropertySymbols,f=Object.getOwnPropertyDescriptor,p=Object.getPrototypeOf,g=Object.prototype;e.exports=function e(t,n,r){if("string"!=typeof n){if(g){var a=p(n);a&&a!==g&&e(t,a,r)}var i=c(n);d&&(i=i.concat(d(n)));for(var l=s(t),h=s(n),m=0;m{"use strict";e.exports=function(e,t,n,r,a,o,i,l){if(!e){var s;if(void 0===t)s=new Error("Minified exception occurred; use the non-minified dev environment for the full error message and additional helpful warnings.");else{var u=[n,r,a,o,i,l],c=0;(s=new Error(t.replace(/%s/g,(function(){return u[c++]})))).name="Invariant Violation"}throw s.framesToPop=1,s}}},4634:e=>{e.exports=Array.isArray||function(e){return"[object Array]"==Object.prototype.toString.call(e)}},119:(e,t,n)=>{"use strict";n.r(t)},1043:(e,t,n)=>{"use strict";n.r(t)},5947:function(e,t,n){var r,a;r=function(){var e,t,n={version:"0.2.0"},r=n.settings={minimum:.08,easing:"ease",positionUsing:"",speed:200,trickle:!0,trickleRate:.02,trickleSpeed:800,showSpinner:!0,barSelector:'[role="bar"]',spinnerSelector:'[role="spinner"]',parent:"body",template:'
'};function a(e,t,n){return en?n:e}function o(e){return 100*(-1+e)}function i(e,t,n){var a;return(a="translate3d"===r.positionUsing?{transform:"translate3d("+o(e)+"%,0,0)"}:"translate"===r.positionUsing?{transform:"translate("+o(e)+"%,0)"}:{"margin-left":o(e)+"%"}).transition="all "+t+"ms "+n,a}n.configure=function(e){var t,n;for(t in e)void 0!==(n=e[t])&&e.hasOwnProperty(t)&&(r[t]=n);return this},n.status=null,n.set=function(e){var t=n.isStarted();e=a(e,r.minimum,1),n.status=1===e?null:e;var o=n.render(!t),u=o.querySelector(r.barSelector),c=r.speed,d=r.easing;return o.offsetWidth,l((function(t){""===r.positionUsing&&(r.positionUsing=n.getPositioningCSS()),s(u,i(e,c,d)),1===e?(s(o,{transition:"none",opacity:1}),o.offsetWidth,setTimeout((function(){s(o,{transition:"all "+c+"ms linear",opacity:0}),setTimeout((function(){n.remove(),t()}),c)}),c)):setTimeout(t,c)})),this},n.isStarted=function(){return"number"==typeof n.status},n.start=function(){n.status||n.set(0);var e=function(){setTimeout((function(){n.status&&(n.trickle(),e())}),r.trickleSpeed)};return r.trickle&&e(),this},n.done=function(e){return e||n.status?n.inc(.3+.5*Math.random()).set(1):this},n.inc=function(e){var t=n.status;return t?("number"!=typeof e&&(e=(1-t)*a(Math.random()*t,.1,.95)),t=a(t+e,0,.994),n.set(t)):n.start()},n.trickle=function(){return n.inc(Math.random()*r.trickleRate)},e=0,t=0,n.promise=function(r){return r&&"resolved"!==r.state()?(0===t&&n.start(),e++,t++,r.always((function(){0==--t?(e=0,n.done()):n.set((e-t)/e)})),this):this},n.render=function(e){if(n.isRendered())return document.getElementById("nprogress");c(document.documentElement,"nprogress-busy");var t=document.createElement("div");t.id="nprogress",t.innerHTML=r.template;var a,i=t.querySelector(r.barSelector),l=e?"-100":o(n.status||0),u=document.querySelector(r.parent);return s(i,{transition:"all 0 linear",transform:"translate3d("+l+"%,0,0)"}),r.showSpinner||(a=t.querySelector(r.spinnerSelector))&&p(a),u!=document.body&&c(u,"nprogress-custom-parent"),u.appendChild(t),t},n.remove=function(){d(document.documentElement,"nprogress-busy"),d(document.querySelector(r.parent),"nprogress-custom-parent");var e=document.getElementById("nprogress");e&&p(e)},n.isRendered=function(){return!!document.getElementById("nprogress")},n.getPositioningCSS=function(){var e=document.body.style,t="WebkitTransform"in e?"Webkit":"MozTransform"in e?"Moz":"msTransform"in e?"ms":"OTransform"in e?"O":"";return t+"Perspective"in e?"translate3d":t+"Transform"in e?"translate":"margin"};var l=function(){var e=[];function t(){var n=e.shift();n&&n(t)}return function(n){e.push(n),1==e.length&&t()}}(),s=function(){var e=["Webkit","O","Moz","ms"],t={};function n(e){return e.replace(/^-ms-/,"ms-").replace(/-([\da-z])/gi,(function(e,t){return t.toUpperCase()}))}function r(t){var n=document.body.style;if(t in n)return t;for(var r,a=e.length,o=t.charAt(0).toUpperCase()+t.slice(1);a--;)if((r=e[a]+o)in n)return r;return t}function a(e){return e=n(e),t[e]||(t[e]=r(e))}function o(e,t,n){t=a(t),e.style[t]=n}return function(e,t){var n,r,a=arguments;if(2==a.length)for(n in t)void 0!==(r=t[n])&&t.hasOwnProperty(n)&&o(e,n,r);else o(e,a[1],a[2])}}();function u(e,t){return("string"==typeof e?e:f(e)).indexOf(" "+t+" ")>=0}function c(e,t){var n=f(e),r=n+t;u(n,t)||(e.className=r.substring(1))}function d(e,t){var n,r=f(e);u(e,t)&&(n=r.replace(" "+t+" "," "),e.className=n.substring(1,n.length-1))}function f(e){return(" "+(e.className||"")+" ").replace(/\s+/gi," ")}function p(e){e&&e.parentNode&&e.parentNode.removeChild(e)}return n},void 0===(a="function"==typeof r?r.call(t,n,t,e):r)||(e.exports=a)},5302:(e,t,n)=>{var r=n(4634);e.exports=p,e.exports.parse=o,e.exports.compile=function(e,t){return l(o(e,t),t)},e.exports.tokensToFunction=l,e.exports.tokensToRegExp=f;var a=new RegExp(["(\\\\.)","([\\/.])?(?:(?:\\:(\\w+)(?:\\(((?:\\\\.|[^\\\\()])+)\\))?|\\(((?:\\\\.|[^\\\\()])+)\\))([+*?])?|(\\*))"].join("|"),"g");function o(e,t){for(var n,r=[],o=0,i=0,l="",c=t&&t.delimiter||"/";null!=(n=a.exec(e));){var d=n[0],f=n[1],p=n.index;if(l+=e.slice(i,p),i=p+d.length,f)l+=f[1];else{var g=e[i],h=n[2],m=n[3],y=n[4],b=n[5],v=n[6],w=n[7];l&&(r.push(l),l="");var k=null!=h&&null!=g&&g!==h,x="+"===v||"*"===v,S="?"===v||"*"===v,E=n[2]||c,C=y||b;r.push({name:m||o++,prefix:h||"",delimiter:E,optional:S,repeat:x,partial:k,asterisk:!!w,pattern:C?u(C):w?".*":"[^"+s(E)+"]+?"})}}return i{!function(e){var t=/\b(?:abstract|assert|boolean|break|byte|case|catch|char|class|const|continue|default|do|double|else|enum|exports|extends|final|finally|float|for|goto|if|implements|import|instanceof|int|interface|long|module|native|new|non-sealed|null|open|opens|package|permits|private|protected|provides|public|record(?!\s*[(){}[\]<>=%~.:,;?+\-*/&|^])|requires|return|sealed|short|static|strictfp|super|switch|synchronized|this|throw|throws|to|transient|transitive|try|uses|var|void|volatile|while|with|yield)\b/,n=/(?:[a-z]\w*\s*\.\s*)*(?:[A-Z]\w*\s*\.\s*)*/.source,r={pattern:RegExp(/(^|[^\w.])/.source+n+/[A-Z](?:[\d_A-Z]*[a-z]\w*)?\b/.source),lookbehind:!0,inside:{namespace:{pattern:/^[a-z]\w*(?:\s*\.\s*[a-z]\w*)*(?:\s*\.)?/,inside:{punctuation:/\./}},punctuation:/\./}};e.languages.java=e.languages.extend("clike",{string:{pattern:/(^|[^\\])"(?:\\.|[^"\\\r\n])*"/,lookbehind:!0,greedy:!0},"class-name":[r,{pattern:RegExp(/(^|[^\w.])/.source+n+/[A-Z]\w*(?=\s+\w+\s*[;,=()]|\s*(?:\[[\s,]*\]\s*)?::\s*new\b)/.source),lookbehind:!0,inside:r.inside},{pattern:RegExp(/(\b(?:class|enum|extends|implements|instanceof|interface|new|record|throws)\s+)/.source+n+/[A-Z]\w*\b/.source),lookbehind:!0,inside:r.inside}],keyword:t,function:[e.languages.clike.function,{pattern:/(::\s*)[a-z_]\w*/,lookbehind:!0}],number:/\b0b[01][01_]*L?\b|\b0x(?:\.[\da-f_p+-]+|[\da-f_]+(?:\.[\da-f_p+-]+)?)\b|(?:\b\d[\d_]*(?:\.[\d_]*)?|\B\.\d[\d_]*)(?:e[+-]?\d[\d_]*)?[dfl]?/i,operator:{pattern:/(^|[^.])(?:<<=?|>>>?=?|->|--|\+\+|&&|\|\||::|[?:~]|[-+*/%&|^!=<>]=?)/m,lookbehind:!0},constant:/\b[A-Z][A-Z_\d]+\b/}),e.languages.insertBefore("java","string",{"triple-quoted-string":{pattern:/"""[ \t]*[\r\n](?:(?:"|"")?(?:\\.|[^"\\]))*"""/,greedy:!0,alias:"string"},char:{pattern:/'(?:\\.|[^'\\\r\n]){1,6}'/,greedy:!0}}),e.languages.insertBefore("java","class-name",{annotation:{pattern:/(^|[^.])@\w+(?:\s*\.\s*\w+)*/,lookbehind:!0,alias:"punctuation"},generics:{pattern:/<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&))*>)*>)*>)*>/,inside:{"class-name":r,keyword:t,punctuation:/[<>(),.:]/,operator:/[?&|]/}},import:[{pattern:RegExp(/(\bimport\s+)/.source+n+/(?:[A-Z]\w*|\*)(?=\s*;)/.source),lookbehind:!0,inside:{namespace:r.inside.namespace,punctuation:/\./,operator:/\*/,"class-name":/\w+/}},{pattern:RegExp(/(\bimport\s+static\s+)/.source+n+/(?:\w+|\*)(?=\s*;)/.source),lookbehind:!0,alias:"static",inside:{namespace:r.inside.namespace,static:/\b\w+$/,punctuation:/\./,operator:/\*/,"class-name":/\w+/}}],namespace:{pattern:RegExp(/(\b(?:exports|import(?:\s+static)?|module|open|opens|package|provides|requires|to|transitive|uses|with)\s+)(?!)[a-z]\w*(?:\.[a-z]\w*)*\.?/.source.replace(//g,(function(){return t.source}))),lookbehind:!0,inside:{punctuation:/\./}}})}(Prism)},9700:()=>{!function(e){function t(e,t){return"___"+e.toUpperCase()+t+"___"}Object.defineProperties(e.languages["markup-templating"]={},{buildPlaceholders:{value:function(n,r,a,o){if(n.language===r){var i=n.tokenStack=[];n.code=n.code.replace(a,(function(e){if("function"==typeof o&&!o(e))return e;for(var a,l=i.length;-1!==n.code.indexOf(a=t(r,l));)++l;return i[l]=e,a})),n.grammar=e.languages.markup}}},tokenizePlaceholders:{value:function(n,r){if(n.language===r&&n.tokenStack){n.grammar=e.languages[r];var a=0,o=Object.keys(n.tokenStack);!function i(l){for(var s=0;s=o.length);s++){var u=l[s];if("string"==typeof u||u.content&&"string"==typeof u.content){var c=o[a],d=n.tokenStack[c],f="string"==typeof u?u:u.content,p=t(r,c),g=f.indexOf(p);if(g>-1){++a;var h=f.substring(0,g),m=new e.Token(r,e.tokenize(d,n.grammar),"language-"+r,d),y=f.substring(g+p.length),b=[];h&&b.push.apply(b,i([h])),b.push(m),y&&b.push.apply(b,i([y])),"string"==typeof u?l.splice.apply(l,[s,1].concat(b)):u.content=b}}else u.content&&i(u.content)}return l}(n.tokens)}}}})}(Prism)},4252:()=>{Prism.languages.scala=Prism.languages.extend("java",{"triple-quoted-string":{pattern:/"""[\s\S]*?"""/,greedy:!0,alias:"string"},string:{pattern:/("|')(?:\\.|(?!\1)[^\\\r\n])*\1/,greedy:!0},keyword:/<-|=>|\b(?:abstract|case|catch|class|def|derives|do|else|enum|extends|extension|final|finally|for|forSome|given|if|implicit|import|infix|inline|lazy|match|new|null|object|opaque|open|override|package|private|protected|return|sealed|self|super|this|throw|trait|transparent|try|type|using|val|var|while|with|yield)\b/,number:/\b0x(?:[\da-f]*\.)?[\da-f]+|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e\d+)?[dfl]?/i,builtin:/\b(?:Any|AnyRef|AnyVal|Boolean|Byte|Char|Double|Float|Int|Long|Nothing|Short|String|Unit)\b/,symbol:/'[^\d\s\\]\w*/}),Prism.languages.insertBefore("scala","triple-quoted-string",{"string-interpolation":{pattern:/\b[a-z]\w*(?:"""(?:[^$]|\$(?:[^{]|\{(?:[^{}]|\{[^{}]*\})*\}))*?"""|"(?:[^$"\r\n]|\$(?:[^{]|\{(?:[^{}]|\{[^{}]*\})*\}))*")/i,greedy:!0,inside:{id:{pattern:/^\w+/,greedy:!0,alias:"function"},escape:{pattern:/\\\$"|\$[$"]/,greedy:!0,alias:"symbol"},interpolation:{pattern:/\$(?:\w+|\{(?:[^{}]|\{[^{}]*\})*\})/,greedy:!0,inside:{punctuation:/^\$\{?|\}$/,expression:{pattern:/[\s\S]+/,inside:Prism.languages.scala}}},string:/[\s\S]+/}}}),delete Prism.languages.scala["class-name"],delete Prism.languages.scala.function,delete Prism.languages.scala.constant},8661:(e,t,n)=>{var r={"./prism-java":6976,"./prism-scala":4252};function a(e){var t=o(e);return n(t)}function o(e){if(!n.o(r,e)){var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}return r[e]}a.keys=function(){return Object.keys(r)},a.resolve=o,e.exports=a,a.id=8661},2694:(e,t,n)=>{"use strict";var r=n(6925);function a(){}function o(){}o.resetWarningCache=a,e.exports=function(){function e(e,t,n,a,o,i){if(i!==r){var l=new Error("Calling PropTypes validators directly is not supported by the `prop-types` package. Use PropTypes.checkPropTypes() to call them. Read more at http://fb.me/use-check-prop-types");throw l.name="Invariant Violation",l}}function t(){return e}e.isRequired=e;var n={array:e,bigint:e,bool:e,func:e,number:e,object:e,string:e,symbol:e,any:e,arrayOf:t,element:e,elementType:e,instanceOf:t,node:e,objectOf:t,oneOf:t,oneOfType:t,shape:t,exact:t,checkPropTypes:o,resetWarningCache:a};return n.PropTypes=n,n}},5556:(e,t,n)=>{e.exports=n(2694)()},6925:e=>{"use strict";e.exports="SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED"},2551:(e,t,n)=>{"use strict";var r=n(6540),a=n(9982);function o(e){for(var t="https://reactjs.org/docs/error-decoder.html?invariant="+e,n=1;n