summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJan-Erik Rediger <janerik@fnordig.de>2018-07-20 12:02:12 +0200
committerJan-Erik Rediger <janerik@fnordig.de>2018-07-20 12:02:20 +0200
commit95377fd9b247763fe1e9568190f3ddbe094afbe1 (patch)
treeee2aaafca84fffcfdf3d96fa5e91d6eb481ae492
parenta0de245557ca2bb9b3f61a4bf41256495dcb3aae (diff)
Add license and readme
-rw-r--r--LICENSE373
-rw-r--r--README.md88
-rw-r--r--assets/mermaid-init.js1
-rw-r--r--assets/mermaid.css351
-rw-r--r--assets/mermaid.min.js28
-rw-r--r--simple-graph.pngbin0 -> 3650 bytes
6 files changed, 841 insertions, 0 deletions
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000..a612ad9
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,373 @@
+Mozilla Public License Version 2.0
+==================================
+
+1. Definitions
+--------------
+
+1.1. "Contributor"
+ means each individual or legal entity that creates, contributes to
+ the creation of, or owns Covered Software.
+
+1.2. "Contributor Version"
+ means the combination of the Contributions of others (if any) used
+ by a Contributor and that particular Contributor's Contribution.
+
+1.3. "Contribution"
+ means Covered Software of a particular Contributor.
+
+1.4. "Covered Software"
+ means Source Code Form to which the initial Contributor has attached
+ the notice in Exhibit A, the Executable Form of such Source Code
+ Form, and Modifications of such Source Code Form, in each case
+ including portions thereof.
+
+1.5. "Incompatible With Secondary Licenses"
+ means
+
+ (a) that the initial Contributor has attached the notice described
+ in Exhibit B to the Covered Software; or
+
+ (b) that the Covered Software was made available under the terms of
+ version 1.1 or earlier of the License, but not also under the
+ terms of a Secondary License.
+
+1.6. "Executable Form"
+ means any form of the work other than Source Code Form.
+
+1.7. "Larger Work"
+ means a work that combines Covered Software with other material, in
+ a separate file or files, that is not Covered Software.
+
+1.8. "License"
+ means this document.
+
+1.9. "Licensable"
+ means having the right to grant, to the maximum extent possible,
+ whether at the time of the initial grant or subsequently, any and
+ all of the rights conveyed by this License.
+
+1.10. "Modifications"
+ means any of the following:
+
+ (a) any file in Source Code Form that results from an addition to,
+ deletion from, or modification of the contents of Covered
+ Software; or
+
+ (b) any new file in Source Code Form that contains any Covered
+ Software.
+
+1.11. "Patent Claims" of a Contributor
+ means any patent claim(s), including without limitation, method,
+ process, and apparatus claims, in any patent Licensable by such
+ Contributor that would be infringed, but for the grant of the
+ License, by the making, using, selling, offering for sale, having
+ made, import, or transfer of either its Contributions or its
+ Contributor Version.
+
+1.12. "Secondary License"
+ means either the GNU General Public License, Version 2.0, the GNU
+ Lesser General Public License, Version 2.1, the GNU Affero General
+ Public License, Version 3.0, or any later versions of those
+ licenses.
+
+1.13. "Source Code Form"
+ means the form of the work preferred for making modifications.
+
+1.14. "You" (or "Your")
+ means an individual or a legal entity exercising rights under this
+ License. For legal entities, "You" includes any entity that
+ controls, is controlled by, or is under common control with You. For
+ purposes of this definition, "control" means (a) the power, direct
+ or indirect, to cause the direction or management of such entity,
+ whether by contract or otherwise, or (b) ownership of more than
+ fifty percent (50%) of the outstanding shares or beneficial
+ ownership of such entity.
+
+2. License Grants and Conditions
+--------------------------------
+
+2.1. Grants
+
+Each Contributor hereby grants You a world-wide, royalty-free,
+non-exclusive license:
+
+(a) under intellectual property rights (other than patent or trademark)
+ Licensable by such Contributor to use, reproduce, make available,
+ modify, display, perform, distribute, and otherwise exploit its
+ Contributions, either on an unmodified basis, with Modifications, or
+ as part of a Larger Work; and
+
+(b) under Patent Claims of such Contributor to make, use, sell, offer
+ for sale, have made, import, and otherwise transfer either its
+ Contributions or its Contributor Version.
+
+2.2. Effective Date
+
+The licenses granted in Section 2.1 with respect to any Contribution
+become effective for each Contribution on the date the Contributor first
+distributes such Contribution.
+
+2.3. Limitations on Grant Scope
+
+The licenses granted in this Section 2 are the only rights granted under
+this License. No additional rights or licenses will be implied from the
+distribution or licensing of Covered Software under this License.
+Notwithstanding Section 2.1(b) above, no patent license is granted by a
+Contributor:
+
+(a) for any code that a Contributor has removed from Covered Software;
+ or
+
+(b) for infringements caused by: (i) Your and any other third party's
+ modifications of Covered Software, or (ii) the combination of its
+ Contributions with other software (except as part of its Contributor
+ Version); or
+
+(c) under Patent Claims infringed by Covered Software in the absence of
+ its Contributions.
+
+This License does not grant any rights in the trademarks, service marks,
+or logos of any Contributor (except as may be necessary to comply with
+the notice requirements in Section 3.4).
+
+2.4. Subsequent Licenses
+
+No Contributor makes additional grants as a result of Your choice to
+distribute the Covered Software under a subsequent version of this
+License (see Section 10.2) or under the terms of a Secondary License (if
+permitted under the terms of Section 3.3).
+
+2.5. Representation
+
+Each Contributor represents that the Contributor believes its
+Contributions are its original creation(s) or it has sufficient rights
+to grant the rights to its Contributions conveyed by this License.
+
+2.6. Fair Use
+
+This License is not intended to limit any rights You have under
+applicable copyright doctrines of fair use, fair dealing, or other
+equivalents.
+
+2.7. Conditions
+
+Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted
+in Section 2.1.
+
+3. Responsibilities
+-------------------
+
+3.1. Distribution of Source Form
+
+All distribution of Covered Software in Source Code Form, including any
+Modifications that You create or to which You contribute, must be under
+the terms of this License. You must inform recipients that the Source
+Code Form of the Covered Software is governed by the terms of this
+License, and how they can obtain a copy of this License. You may not
+attempt to alter or restrict the recipients' rights in the Source Code
+Form.
+
+3.2. Distribution of Executable Form
+
+If You distribute Covered Software in Executable Form then:
+
+(a) such Covered Software must also be made available in Source Code
+ Form, as described in Section 3.1, and You must inform recipients of
+ the Executable Form how they can obtain a copy of such Source Code
+ Form by reasonable means in a timely manner, at a charge no more
+ than the cost of distribution to the recipient; and
+
+(b) You may distribute such Executable Form under the terms of this
+ License, or sublicense it under different terms, provided that the
+ license for the Executable Form does not attempt to limit or alter
+ the recipients' rights in the Source Code Form under this License.
+
+3.3. Distribution of a Larger Work
+
+You may create and distribute a Larger Work under terms of Your choice,
+provided that You also comply with the requirements of this License for
+the Covered Software. If the Larger Work is a combination of Covered
+Software with a work governed by one or more Secondary Licenses, and the
+Covered Software is not Incompatible With Secondary Licenses, this
+License permits You to additionally distribute such Covered Software
+under the terms of such Secondary License(s), so that the recipient of
+the Larger Work may, at their option, further distribute the Covered
+Software under the terms of either this License or such Secondary
+License(s).
+
+3.4. Notices
+
+You may not remove or alter the substance of any license notices
+(including copyright notices, patent notices, disclaimers of warranty,
+or limitations of liability) contained within the Source Code Form of
+the Covered Software, except that You may alter any license notices to
+the extent required to remedy known factual inaccuracies.
+
+3.5. Application of Additional Terms
+
+You may choose to offer, and to charge a fee for, warranty, support,
+indemnity or liability obligations to one or more recipients of Covered
+Software. However, You may do so only on Your own behalf, and not on
+behalf of any Contributor. You must make it absolutely clear that any
+such warranty, support, indemnity, or liability obligation is offered by
+You alone, and You hereby agree to indemnify every Contributor for any
+liability incurred by such Contributor as a result of warranty, support,
+indemnity or liability terms You offer. You may include additional
+disclaimers of warranty and limitations of liability specific to any
+jurisdiction.
+
+4. Inability to Comply Due to Statute or Regulation
+---------------------------------------------------
+
+If it is impossible for You to comply with any of the terms of this
+License with respect to some or all of the Covered Software due to
+statute, judicial order, or regulation then You must: (a) comply with
+the terms of this License to the maximum extent possible; and (b)
+describe the limitations and the code they affect. Such description must
+be placed in a text file included with all distributions of the Covered
+Software under this License. Except to the extent prohibited by statute
+or regulation, such description must be sufficiently detailed for a
+recipient of ordinary skill to be able to understand it.
+
+5. Termination
+--------------
+
+5.1. The rights granted under this License will terminate automatically
+if You fail to comply with any of its terms. However, if You become
+compliant, then the rights granted under this License from a particular
+Contributor are reinstated (a) provisionally, unless and until such
+Contributor explicitly and finally terminates Your grants, and (b) on an
+ongoing basis, if such Contributor fails to notify You of the
+non-compliance by some reasonable means prior to 60 days after You have
+come back into compliance. Moreover, Your grants from a particular
+Contributor are reinstated on an ongoing basis if such Contributor
+notifies You of the non-compliance by some reasonable means, this is the
+first time You have received notice of non-compliance with this License
+from such Contributor, and You become compliant prior to 30 days after
+Your receipt of the notice.
+
+5.2. If You initiate litigation against any entity by asserting a patent
+infringement claim (excluding declaratory judgment actions,
+counter-claims, and cross-claims) alleging that a Contributor Version
+directly or indirectly infringes any patent, then the rights granted to
+You by any and all Contributors for the Covered Software under Section
+2.1 of this License shall terminate.
+
+5.3. In the event of termination under Sections 5.1 or 5.2 above, all
+end user license agreements (excluding distributors and resellers) which
+have been validly granted by You or Your distributors under this License
+prior to termination shall survive termination.
+
+************************************************************************
+* *
+* 6. Disclaimer of Warranty *
+* ------------------------- *
+* *
+* Covered Software is provided under this License on an "as is" *
+* basis, without warranty of any kind, either expressed, implied, or *
+* statutory, including, without limitation, warranties that the *
+* Covered Software is free of defects, merchantable, fit for a *
+* particular purpose or non-infringing. The entire risk as to the *
+* quality and performance of the Covered Software is with You. *
+* Should any Covered Software prove defective in any respect, You *
+* (not any Contributor) assume the cost of any necessary servicing, *
+* repair, or correction. This disclaimer of warranty constitutes an *
+* essential part of this License. No use of any Covered Software is *
+* authorized under this License except under this disclaimer. *
+* *
+************************************************************************
+
+************************************************************************
+* *
+* 7. Limitation of Liability *
+* -------------------------- *
+* *
+* Under no circumstances and under no legal theory, whether tort *
+* (including negligence), contract, or otherwise, shall any *
+* Contributor, or anyone who distributes Covered Software as *
+* permitted above, be liable to You for any direct, indirect, *
+* special, incidental, or consequential damages of any character *
+* including, without limitation, damages for lost profits, loss of *
+* goodwill, work stoppage, computer failure or malfunction, or any *
+* and all other commercial damages or losses, even if such party *
+* shall have been informed of the possibility of such damages. This *
+* limitation of liability shall not apply to liability for death or *
+* personal injury resulting from such party's negligence to the *
+* extent applicable law prohibits such limitation. Some *
+* jurisdictions do not allow the exclusion or limitation of *
+* incidental or consequential damages, so this exclusion and *
+* limitation may not apply to You. *
+* *
+************************************************************************
+
+8. Litigation
+-------------
+
+Any litigation relating to this License may be brought only in the
+courts of a jurisdiction where the defendant maintains its principal
+place of business and such litigation shall be governed by laws of that
+jurisdiction, without reference to its conflict-of-law provisions.
+Nothing in this Section shall prevent a party's ability to bring
+cross-claims or counter-claims.
+
+9. Miscellaneous
+----------------
+
+This License represents the complete agreement concerning the subject
+matter hereof. If any provision of this License is held to be
+unenforceable, such provision shall be reformed only to the extent
+necessary to make it enforceable. Any law or regulation which provides
+that the language of a contract shall be construed against the drafter
+shall not be used to construe this License against a Contributor.
+
+10. Versions of the License
+---------------------------
+
+10.1. New Versions
+
+Mozilla Foundation is the license steward. Except as provided in Section
+10.3, no one other than the license steward has the right to modify or
+publish new versions of this License. Each version will be given a
+distinguishing version number.
+
+10.2. Effect of New Versions
+
+You may distribute the Covered Software under the terms of the version
+of the License under which You originally received the Covered Software,
+or under the terms of any subsequent version published by the license
+steward.
+
+10.3. Modified Versions
+
+If you create software not governed by this License, and you want to
+create a new license for such software, you may create and use a
+modified version of this License if you rename the license and remove
+any references to the name of the license steward (except to note that
+such modified license differs from this License).
+
+10.4. Distributing Source Code Form that is Incompatible With Secondary
+Licenses
+
+If You choose to distribute Source Code Form that is Incompatible With
+Secondary Licenses under the terms of this version of the License, the
+notice described in Exhibit B of this License must be attached.
+
+Exhibit A - Source Code Form License Notice
+-------------------------------------------
+
+ This Source Code Form is subject to the terms of the Mozilla Public
+ License, v. 2.0. If a copy of the MPL was not distributed with this
+ file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+If it is not possible or desirable to put the notice in a particular
+file, then You may include the notice in a location (such as a LICENSE
+file in a relevant directory) where a recipient would be likely to look
+for such a notice.
+
+You may add additional accurate notices of copyright ownership.
+
+Exhibit B - "Incompatible With Secondary Licenses" Notice
+---------------------------------------------------------
+
+ This Source Code Form is "Incompatible With Secondary Licenses", as
+ defined by the Mozilla Public License, v. 2.0.
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..cdd5742
--- /dev/null
+++ b/README.md
@@ -0,0 +1,88 @@
+# mdbook-mermaid
+
+A preprocessor for [mdbook][] to add [mermaid.js][] support.
+
+[mdbook]: https://github.com/rust-lang-nursery/mdBook
+[mermaid.js]: https://mermaidjs.github.io/
+
+It turns this:
+
+~~~
+```mermaid
+graph TD;
+ A-->B;
+ A-->C;
+ B-->D;
+ C-->D;
+```
+~~~
+
+into this:
+
+![Simple Graph](simple-graph.png)
+
+in your book.
+(Graph provided by [Mermaid Live Editor](https://mermaidjs.github.io/mermaid-live-editor/#/view/eyJjb2RlIjoiZ3JhcGggVEQ7XG4gICAgQS0tPkI7XG4gICAgQS0tPkM7XG4gICAgQi0tPkQ7XG4gICAgQy0tPkQ7IiwibWVybWFpZCI6eyJ0aGVtZSI6ImRlZmF1bHQifX0))
+
+## Installation
+
+If you want to use only this preprocessor, install the tool:
+
+```
+cargo install --git https://github.com/badboy/mdbook-mermaid
+```
+
+Add the following to your `book.toml`
+
+```toml
+[output.html]
+additional-css = ["mermaid.css"]
+additional-js = ["mermaid.min.js", "mermaid-init.js"]
+```
+
+Copy the files (`mermaid.css`, `mermaid.min.js`, `mermaid-init.js`) from the [`assets/`] (assets) directory into your source directory.
+
+Finally, build your book:
+
+```
+mdbook-mermaid path/to/book
+```
+
+### Programmatic use
+
+You can also use this programmatically, e.g. in order to use multiple additional preprocessors.
+Add `mdbook-mermaid` as a dependency in your `Cargo.toml`:
+
+```toml
+[dependencies.mdbook-mermaid]
+git = "https://github.com/badboy/mdbook-mermaid"
+```
+
+Then add it to your code:
+
+```rust
+extern crate mdbook_mermaid;
+
+// ...
+
+let mut book = MDBook::load(&book_dir)?;
+book.with_preprecessor(mdbook_mermaid::Mermaid);
+```
+
+Don't forget to copy the files (`mermaid.css`, `mermaid.min.js`, `mermaid-init.js`) from the [`assets/`] (assets) directory into your source directory.
+
+Add the following to your `book.toml` to include these files in your build:
+
+```toml
+[output.html]
+additional-css = ["mermaid.css"]
+additional-js = ["mermaid.min.js", "mermaid-init.js"]
+```
+
+
+
+
+## License
+
+MPL. See [LICENSE](LICENSE).
+Copyright (c) 2018 Jan-Erik Rediger <janerik@fnordig.de>
diff --git a/assets/mermaid-init.js b/assets/mermaid-init.js
new file mode 100644
index 0000000..313a6e8
--- /dev/null
+++ b/assets/mermaid-init.js
@@ -0,0 +1 @@
+mermaid.initialize({startOnLoad:true});
diff --git a/assets/mermaid.css b/assets/mermaid.css
new file mode 100644
index 0000000..eb66f0b
--- /dev/null
+++ b/assets/mermaid.css
@@ -0,0 +1,351 @@
+/* Flowchart variables */
+/* Sequence Diagram variables */
+/* Gantt chart variables */
+.mermaid .label {
+ color: #333;
+}
+.node rect,
+.node circle,
+.node ellipse,
+.node polygon {
+ fill: #ECECFF;
+ stroke: #CCCCFF;
+ stroke-width: 1px;
+}
+.arrowheadPath {
+ fill: #333333;
+}
+.edgePath .path {
+ stroke: #333333;
+}
+.edgeLabel {
+ background-color: #e8e8e8;
+}
+.cluster rect {
+ fill: #ffffde !important;
+ rx: 4 !important;
+ stroke: #aaaa33 !important;
+ stroke-width: 1px !important;
+}
+.cluster text {
+ fill: #333;
+}
+.actor {
+ stroke: #CCCCFF;
+ fill: #ECECFF;
+}
+text.actor {
+ fill: black;
+ stroke: none;
+}
+.actor-line {
+ stroke: grey;
+}
+.messageLine0 {
+ stroke-width: 1.5;
+ stroke-dasharray: "2 2";
+ marker-end: "url(#arrowhead)";
+ stroke: #333;
+}
+.messageLine1 {
+ stroke-width: 1.5;
+ stroke-dasharray: "2 2";
+ stroke: #333;
+}
+#arrowhead {
+ fill: #333;
+}
+#crosshead path {
+ fill: #333 !important;
+ stroke: #333 !important;
+}
+.messageText {
+ fill: #333;
+ stroke: none;
+}
+.labelBox {
+ stroke: #CCCCFF;
+ fill: #ECECFF;
+}
+.labelText {
+ fill: black;
+ stroke: none;
+}
+.loopText {
+ fill: black;
+ stroke: none;
+}
+.loopLine {
+ stroke-width: 2;
+ stroke-dasharray: "2 2";
+ marker-end: "url(#arrowhead)";
+ stroke: #CCCCFF;
+}
+.note {
+ stroke: #aaaa33;
+ fill: #fff5ad;
+}
+.noteText {
+ fill: black;
+ stroke: none;
+ font-family: 'trebuchet ms', verdana, arial;
+ font-size: 14px;
+}
+/** Section styling */
+.section {
+ stroke: none;
+ opacity: 0.2;
+}
+.section0 {
+ fill: rgba(102, 102, 255, 0.49);
+}
+.section2 {
+ fill: #fff400;
+}
+.section1,
+.section3 {
+ fill: white;
+ opacity: 0.2;
+}
+.sectionTitle0 {
+ fill: #333;
+}
+.sectionTitle1 {
+ fill: #333;
+}
+.sectionTitle2 {
+ fill: #333;
+}
+.sectionTitle3 {
+ fill: #333;
+}
+.sectionTitle {
+ text-anchor: start;
+ font-size: 11px;
+ text-height: 14px;
+}
+/* Grid and axis */
+.grid .tick {
+ stroke: lightgrey;
+ opacity: 0.3;
+ shape-rendering: crispEdges;
+}
+.grid path {
+ stroke-width: 0;
+}
+/* Today line */
+.today {
+ fill: none;
+ stroke: red;
+ stroke-width: 2px;
+}
+/* Task styling */
+/* Default task */
+.task {
+ stroke-width: 2;
+}
+.taskText {
+ text-anchor: middle;
+ font-size: 11px;
+}
+.taskTextOutsideRight {
+ fill: black;
+ text-anchor: start;
+ font-size: 11px;
+}
+.taskTextOutsideLeft {
+ fill: black;
+ text-anchor: end;
+ font-size: 11px;
+}
+/* Specific task settings for the sections*/
+.taskText0,
+.taskText1,
+.taskText2,
+.taskText3 {
+ fill: white;
+}
+.task0,
+.task1,
+.task2,
+.task3 {
+ fill: #8a90dd;
+ stroke: #534fbc;
+}
+.taskTextOutside0,
+.taskTextOutside2 {
+ fill: black;
+}
+.taskTextOutside1,
+.taskTextOutside3 {
+ fill: black;
+}
+/* Active task */
+.active0,
+.active1,
+.active2,
+.active3 {
+ fill: #bfc7ff;
+ stroke: #534fbc;
+}
+.activeText0,
+.activeText1,
+.activeText2,
+.activeText3 {
+ fill: black !important;
+}
+/* Completed task */
+.done0,
+.done1,
+.done2,
+.done3 {
+ stroke: grey;
+ fill: lightgrey;
+ stroke-width: 2;
+}
+.doneText0,
+.doneText1,
+.doneText2,
+.doneText3 {
+ fill: black !important;
+}
+/* Tasks on the critical line */
+.crit0,
+.crit1,
+.crit2,
+.crit3 {
+ stroke: #ff8888;
+ fill: red;
+ stroke-width: 2;
+}
+.activeCrit0,
+.activeCrit1,
+.activeCrit2,
+.activeCrit3 {
+ stroke: #ff8888;
+ fill: #bfc7ff;
+ stroke-width: 2;
+}
+.doneCrit0,
+.doneCrit1,
+.doneCrit2,
+.doneCrit3 {
+ stroke: #ff8888;
+ fill: lightgrey;
+ stroke-width: 2;
+ cursor: pointer;
+ shape-rendering: crispEdges;
+}
+.doneCritText0,
+.doneCritText1,
+.doneCritText2,
+.doneCritText3 {
+ fill: black !important;
+}
+.activeCritText0,
+.activeCritText1,
+.activeCritText2,
+.activeCritText3 {
+ fill: black !important;
+}
+.titleText {
+ text-anchor: middle;
+ font-size: 18px;
+ fill: black;
+}
+g.classGroup text {
+ fill: #9370DB;
+ stroke: none;
+ font-family: 'trebuchet ms', verdana, arial;
+ font-size: 10px;
+}
+g.classGroup rect {
+ fill: #ECECFF;
+ stroke: #9370DB;
+}
+g.classGroup line {
+ stroke: #9370DB;
+ stroke-width: 1;
+}
+svg .classLabel .box {
+ stroke: none;
+ stroke-width: 0;
+ fill: #ECECFF;
+ opacity: 0.5;
+}
+svg .classLabel .label {
+ fill: #9370DB;
+ font-size: 10px;
+}
+.relation {
+ stroke: #9370DB;
+ stroke-width: 1;
+ fill: none;
+}
+.composition {
+ fill: #9370DB;
+ stroke: #9370DB;
+ stroke-width: 1;
+}
+#compositionStart {
+ fill: #9370DB;
+ stroke: #9370DB;
+ stroke-width: 1;
+}
+#compositionEnd {
+ fill: #9370DB;
+ stroke: #9370DB;
+ stroke-width: 1;
+}
+.aggregation {
+ fill: #ECECFF;
+ stroke: #9370DB;
+ stroke-width: 1;
+}
+#aggregationStart {
+ fill: #ECECFF;
+ stroke: #9370DB;
+ stroke-width: 1;
+}
+#aggregationEnd {
+ fill: #ECECFF;
+ stroke: #9370DB;
+ stroke-width: 1;
+}
+#dependencyStart {
+ fill: #9370DB;
+ stroke: #9370DB;
+ stroke-width: 1;
+}
+#dependencyEnd {
+ fill: #9370DB;
+ stroke: #9370DB;
+ stroke-width: 1;
+}
+#extensionStart {
+ fill: #9370DB;
+ stroke: #9370DB;
+ stroke-width: 1;
+}
+#extensionEnd {
+ fill: #9370DB;
+ stroke: #9370DB;
+ stroke-width: 1;
+}
+.node text {
+ font-family: 'trebuchet ms', verdana, arial;
+ font-size: 14px;
+}
+div.mermaidTooltip {
+ position: absolute;
+ text-align: center;
+ max-width: 200px;
+ padding: 2px;
+ font-family: 'trebuchet ms', verdana, arial;
+ font-size: 12px;
+ background: #ffffde;
+ border: 1px solid #aaaa33;
+ border-radius: 2px;
+ pointer-events: none;
+ z-index: 100;
+}
diff --git a/assets/mermaid.min.js b/assets/mermaid.min.js
new file mode 100644
index 0000000..519873c
--- /dev/null
+++ b/assets/mermaid.min.js
@@ -0,0 +1,28 @@
+!function(t){function e(r){if(n[r])return n[r].exports;var i=n[r]={i:r,l:!1,exports:{}};return t[r].call(i.exports,i,i.exports,e),i.l=!0,i.exports}var n={};e.m=t,e.c=n,e.d=function(t,n,r){e.o(t,n)||Object.defineProperty(t,n,{configurable:!1,enumerable:!0,get:r})},e.n=function(t){var n=t&&t.__esModule?function(){return t.default}:function(){return t};return e.d(n,"a",n),n},e.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},e.p="",e(e.s=169)}([function(t,e,n){(function(t){!function(e,n){t.exports=n()}(0,function(){"use strict";function e(){return Mr.apply(null,arguments)}function r(t){return t instanceof Array||"[object Array]"===Object.prototype.toString.call(t)}function i(t){return null!=t&&"[object Object]"===Object.prototype.toString.call(t)}function a(t){var e;for(e in t)return!1;return!0}function u(t){return void 0===t}function o(t){return"number"==typeof t||"[object Number]"===Object.prototype.toString.call(t)}function s(t){return t instanceof Date||"[object Date]"===Object.prototype.toString.call(t)}function c(t,e){var n,r=[];for(n=0;n<t.length;++n)r.push(e(t[n],n));return r}function l(t,e){return Object.prototype.hasOwnProperty.call(t,e)}function f(t,e){for(var n in e)l(e,n)&&(t[n]=e[n]);return l(e,"toString")&&(t.toString=e.toString),l(e,"valueOf")&&(t.valueOf=e.valueOf),t}function h(t,e,n,r){return ve(t,e,n,r,!0).utc()}function d(){return{empty:!1,unusedTokens:[],unusedInput:[],overflow:-2,charsLeftOver:0,nullInput:!1,invalidMonth:null,invalidFormat:!1,userInvalidated:!1,iso:!1,parsedDateParts:[],meridiem:null,rfc2822:!1,weekdayMismatch:!1}}function p(t){return null==t._pf&&(t._pf=d()),t._pf}function _(t){if(null==t._isValid){var e=p(t),n=wr.call(e.parsedDateParts,function(t){return null!=t}),r=!isNaN(t._d.getTime())&&e.overflow<0&&!e.empty&&!e.invalidMonth&&!e.invalidWeekday&&!e.nullInput&&!e.invalidFormat&&!e.userInvalidated&&(!e.meridiem||e.meridiem&&n);if(t._strict&&(r=r&&0===e.charsLeftOver&&0===e.unusedTokens.length&&void 0===e.bigHour),null!=Object.isFrozen&&Object.isFrozen(t))return r;t._isValid=r}return t._isValid}function m(t){var e=h(NaN);return null!=t?f(p(e),t):p(e).userInvalidated=!0,e}function g(t,e){var n,r,i;if(u(e._isAMomentObject)||(t._isAMomentObject=e._isAMomentObject),u(e._i)||(t._i=e._i),u(e._f)||(t._f=e._f),u(e._l)||(t._l=e._l),u(e._strict)||(t._strict=e._strict),u(e._tzm)||(t._tzm=e._tzm),u(e._isUTC)||(t._isUTC=e._isUTC),u(e._offset)||(t._offset=e._offset),u(e._pf)||(t._pf=p(e)),u(e._locale)||(t._locale=e._locale),Lr.length>0)for(n=0;n<Lr.length;n++)r=Lr[n],i=e[r],u(i)||(t[r]=i);return t}function y(t){g(this,t),this._d=new Date(null!=t._d?t._d.getTime():NaN),this.isValid()||(this._d=new Date(NaN)),!1===kr&&(kr=!0,e.updateOffset(this),kr=!1)}function v(t){return t instanceof y||null!=t&&null!=t._isAMomentObject}function M(t){return t<0?Math.ceil(t)||0:Math.floor(t)}function b(t){var e=+t,n=0;return 0!==e&&isFinite(e)&&(n=M(e)),n}function w(t,e,n){var r,i=Math.min(t.length,e.length),a=Math.abs(t.length-e.length),u=0;for(r=0;r<i;r++)(n&&t[r]!==e[r]||!n&&b(t[r])!==b(e[r]))&&u++;return u+a}function L(t){!1===e.suppressDeprecationWarnings&&"undefined"!=typeof console&&console.warn&&console.warn("Deprecation warning: "+t)}function k(t,n){var r=!0;return f(function(){if(null!=e.deprecationHandler&&e.deprecationHandler(null,t),r){for(var i,a=[],u=0;u<arguments.length;u++){if(i="","object"==typeof arguments[u]){i+="\n["+u+"] ";for(var o in arguments[0])i+=o+": "+arguments[0][o]+", ";i=i.slice(0,-2)}else i=arguments[u];a.push(i)}L(t+"\nArguments: "+Array.prototype.slice.call(a).join("")+"\n"+(new Error).stack),r=!1}return n.apply(this,arguments)},n)}function x(t,n){null!=e.deprecationHandler&&e.deprecationHandler(t,n),xr[t]||(L(n),xr[t]=!0)}function D(t){return t instanceof Function||"[object Function]"===Object.prototype.toString.call(t)}function Y(t){var e,n;for(n in t)e=t[n],D(e)?this[n]=e:this["_"+n]=e;this._config=t,this._dayOfMonthOrdinalParseLenient=new RegExp((this._dayOfMonthOrdinalParse.source||this._ordinalParse.source)+"|"+/\d{1,2}/.source)}function T(t,e){var n,r=f({},t);for(n in e)l(e,n)&&(i(t[n])&&i(e[n])?(r[n]={},f(r[n],t[n]),f(r[n],e[n])):null!=e[n]?r[n]=e[n]:delete r[n]);for(n in t)l(t,n)&&!l(e,n)&&i(t[n])&&(r[n]=f({},r[n]));return r}function A(t){null!=t&&this.set(t)}function E(t,e,n){var r=this._calendar[t]||this._calendar.sameElse;return D(r)?r.call(e,n):r}function S(t){var e=this._longDateFormat[t],n=this._longDateFormat[t.toUpperCase()];return e||!n?e:(this._longDateFormat[t]=n.replace(/MMMM|MM|DD|dddd/g,function(t){return t.slice(1)}),this._longDateFormat[t])}function j(){return this._invalidDate}function C(t){return this._ordinal.replace("%d",t)}function F(t,e,n,r){var i=this._relativeTime[n];return D(i)?i(t,e,n,r):i.replace(/%d/i,t)}function O(t,e){var n=this._relativeTime[t>0?"future":"past"];return D(n)?n(e):n.replace(/%s/i,e)}function H(t,e){var n=t.toLowerCase();Cr[n]=Cr[n+"s"]=Cr[e]=t}function P(t){return"string"==typeof t?Cr[t]||Cr[t.toLowerCase()]:void 0}function N(t){var e,n,r={};for(n in t)l(t,n)&&(e=P(n))&&(r[e]=t[n]);return r}function I(t,e){Fr[t]=e}function B(t){var e=[];for(var n in t)e.push({unit:n,priority:Fr[n]});return e.sort(function(t,e){return t.priority-e.priority}),e}function R(t,n){return function(r){return null!=r?(z(this,t,r),e.updateOffset(this,n),this):W(this,t)}}function W(t,e){return t.isValid()?t._d["get"+(t._isUTC?"UTC":"")+e]():NaN}function z(t,e,n){t.isValid()&&t._d["set"+(t._isUTC?"UTC":"")+e](n)}function q(t){return t=P(t),D(this[t])?this[t]():this}function U(t,e){if("object"==typeof t){t=N(t);for(var n=B(t),r=0;r<n.length;r++)this[n[r].unit](t[n[r].unit])}else if(t=P(t),D(this[t]))return this[t](e);return this}function $(t,e,n){var r=""+Math.abs(t),i=e-r.length;return(t>=0?n?"+":"":"-")+Math.pow(10,Math.max(0,i)).toString().substr(1)+r}function V(t,e,n,r){var i=r;"string"==typeof r&&(i=function(){return this[r]()}),t&&(Nr[t]=i),e&&(Nr[e[0]]=function(){return $(i.apply(this,arguments),e[1],e[2])}),n&&(Nr[n]=function(){return this.localeData().ordinal(i.apply(this,arguments),t)})}function G(t){return t.match(/\[[\s\S]/)?t.replace(/^\[|\]$/g,""):t.replace(/\\/g,"")}function J(t){var e,n,r=t.match(Or);for(e=0,n=r.length;e<n;e++)Nr[r[e]]?r[e]=Nr[r[e]]:r[e]=G(r[e]);return function(e){var i,a="";for(i=0;i<n;i++)a+=D(r[i])?r[i].call(e,t):r[i];return a}}function Z(t,e){return t.isValid()?(e=K(e,t.localeData()),Pr[e]=Pr[e]||J(e),Pr[e](t)):t.localeData().invalidDate()}function K(t,e){function n(t){return e.longDateFormat(t)||t}var r=5;for(Hr.lastIndex=0;r>=0&&Hr.test(t);)t=t.replace(Hr,n),Hr.lastIndex=0,r-=1;return t}function X(t,e,n){ni[t]=D(e)?e:function(t,r){return t&&n?n:e}}function Q(t,e){return l(ni,t)?ni[t](e._strict,e._locale):new RegExp(tt(t))}function tt(t){return et(t.replace("\\","").replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g,function(t,e,n,r,i){return e||n||r||i}))}function et(t){return t.replace(/[-\/\\^$*+?.()|[\]{}]/g,"\\$&")}function nt(t,e){var n,r=e;for("string"==typeof t&&(t=[t]),o(e)&&(r=function(t,n){n[e]=b(t)}),n=0;n<t.length;n++)ri[t[n]]=r}function rt(t,e){nt(t,function(t,n,r,i){r._w=r._w||{},e(t,r._w,r,i)})}function it(t,e,n){null!=e&&l(ri,t)&&ri[t](e,n._a,n,t)}function at(t,e){return new Date(Date.UTC(t,e+1,0)).getUTCDate()}function ut(t,e){return t?r(this._months)?this._months[t.month()]:this._months[(this._months.isFormat||pi).test(e)?"format":"standalone"][t.month()]:r(this._months)?this._months:this._months.standalone}function ot(t,e){return t?r(this._monthsShort)?this._monthsShort[t.month()]:this._monthsShort[pi.test(e)?"format":"standalone"][t.month()]:r(this._monthsShort)?this._monthsShort:this._monthsShort.standalone}function st(t,e,n){var r,i,a,u=t.toLocaleLowerCase();if(!this._monthsParse)for(this._monthsParse=[],this._longMonthsParse=[],this._shortMonthsParse=[],r=0;r<12;++r)a=h([2e3,r]),this._shortMonthsParse[r]=this.monthsShort(a,"").toLocaleLowerCase(),this._longMonthsParse[r]=this.months(a,"").toLocaleLowerCase();return n?"MMM"===e?(i=di.call(this._shortMonthsParse,u),-1!==i?i:null):(i=di.call(this._longMonthsParse,u),-1!==i?i:null):"MMM"===e?-1!==(i=di.call(this._shortMonthsParse,u))?i:(i=di.call(this._longMonthsParse,u),-1!==i?i:null):-1!==(i=di.call(this._longMonthsParse,u))?i:(i=di.call(this._shortMonthsParse,u),-1!==i?i:null)}function ct(t,e,n){var r,i,a;if(this._monthsParseExact)return st.call(this,t,e,n);for(this._monthsParse||(this._monthsParse=[],this._longMonthsParse=[],this._shortMonthsParse=[]),r=0;r<12;r++){if(i=h([2e3,r]),n&&!this._longMonthsParse[r]&&(this._longMonthsParse[r]=new RegExp("^"+this.months(i,"").replace(".","")+"$","i"),this._shortMonthsParse[r]=new RegExp("^"+this.monthsShort(i,"").replace(".","")+"$","i")),n||this._monthsParse[r]||(a="^"+this.months(i,"")+"|^"+this.monthsShort(i,""),this._monthsParse[r]=new RegExp(a.replace(".",""),"i")),n&&"MMMM"===e&&this._longMonthsParse[r].test(t))return r;if(n&&"MMM"===e&&this._shortMonthsParse[r].test(t))return r;if(!n&&this._monthsParse[r].test(t))return r}}function lt(t,e){var n;if(!t.isValid())return t;if("string"==typeof e)if(/^\d+$/.test(e))e=b(e);else if(e=t.localeData().monthsParse(e),!o(e))return t;return n=Math.min(t.date(),at(t.year(),e)),t._d["set"+(t._isUTC?"UTC":"")+"Month"](e,n),t}function ft(t){return null!=t?(lt(this,t),e.updateOffset(this,!0),this):W(this,"Month")}function ht(){return at(this.year(),this.month())}function dt(t){return this._monthsParseExact?(l(this,"_monthsRegex")||_t.call(this),t?this._monthsShortStrictRegex:this._monthsShortRegex):(l(this,"_monthsShortRegex")||(this._monthsShortRegex=gi),this._monthsShortStrictRegex&&t?this._monthsShortStrictRegex:this._monthsShortRegex)}function pt(t){return this._monthsParseExact?(l(this,"_monthsRegex")||_t.call(this),t?this._monthsStrictRegex:this._monthsRegex):(l(this,"_monthsRegex")||(this._monthsRegex=yi),this._monthsStrictRegex&&t?this._monthsStrictRegex:this._monthsRegex)}function _t(){function t(t,e){return e.length-t.length}var e,n,r=[],i=[],a=[];for(e=0;e<12;e++)n=h([2e3,e]),r.push(this.monthsShort(n,"")),i.push(this.months(n,"")),a.push(this.months(n,"")),a.push(this.monthsShort(n,""));for(r.sort(t),i.sort(t),a.sort(t),e=0;e<12;e++)r[e]=et(r[e]),i[e]=et(i[e]);for(e=0;e<24;e++)a[e]=et(a[e]);this._monthsRegex=new RegExp("^("+a.join("|")+")","i"),this._monthsShortRegex=this._monthsRegex,this._monthsStrictRegex=new RegExp("^("+i.join("|")+")","i"),this._monthsShortStrictRegex=new RegExp("^("+r.join("|")+")","i")}function mt(t){return gt(t)?366:365}function gt(t){return t%4==0&&t%100!=0||t%400==0}function yt(){return gt(this.year())}function vt(t,e,n,r,i,a,u){var o=new Date(t,e,n,r,i,a,u);return t<100&&t>=0&&isFinite(o.getFullYear())&&o.setFullYear(t),o}function Mt(t){var e=new Date(Date.UTC.apply(null,arguments));return t<100&&t>=0&&isFinite(e.getUTCFullYear())&&e.setUTCFullYear(t),e}function bt(t,e,n){var r=7+e-n;return-(7+Mt(t,0,r).getUTCDay()-e)%7+r-1}function wt(t,e,n,r,i){var a,u,o=(7+n-r)%7,s=bt(t,r,i),c=1+7*(e-1)+o+s;return c<=0?(a=t-1,u=mt(a)+c):c>mt(t)?(a=t+1,u=c-mt(t)):(a=t,u=c),{year:a,dayOfYear:u}}function Lt(t,e,n){var r,i,a=bt(t.year(),e,n),u=Math.floor((t.dayOfYear()-a-1)/7)+1;return u<1?(i=t.year()-1,r=u+kt(i,e,n)):u>kt(t.year(),e,n)?(r=u-kt(t.year(),e,n),i=t.year()+1):(i=t.year(),r=u),{week:r,year:i}}function kt(t,e,n){var r=bt(t,e,n),i=bt(t+1,e,n);return(mt(t)-r+i)/7}function xt(t){return Lt(t,this._week.dow,this._week.doy).week}function Dt(){return this._week.dow}function Yt(){return this._week.doy}function Tt(t){var e=this.localeData().week(this);return null==t?e:this.add(7*(t-e),"d")}function At(t){var e=Lt(this,1,4).week;return null==t?e:this.add(7*(t-e),"d")}function Et(t,e){return"string"!=typeof t?t:isNaN(t)?(t=e.weekdaysParse(t),"number"==typeof t?t:null):parseInt(t,10)}function St(t,e){return"string"==typeof t?e.weekdaysParse(t)%7||7:isNaN(t)?null:t}function jt(t,e){return t?r(this._weekdays)?this._weekdays[t.day()]:this._weekdays[this._weekdays.isFormat.test(e)?"format":"standalone"][t.day()]:r(this._weekdays)?this._weekdays:this._weekdays.standalone}function Ct(t){return t?this._weekdaysShort[t.day()]:this._weekdaysShort}function Ft(t){return t?this._weekdaysMin[t.day()]:this._weekdaysMin}function Ot(t,e,n){var r,i,a,u=t.toLocaleLowerCase();if(!this._weekdaysParse)for(this._weekdaysParse=[],this._shortWeekdaysParse=[],this._minWeekdaysParse=[],r=0;r<7;++r)a=h([2e3,1]).day(r),this._minWeekdaysParse[r]=this.weekdaysMin(a,"").toLocaleLowerCase(),this._shortWeekdaysParse[r]=this.weekdaysShort(a,"").toLocaleLowerCase(),this._weekdaysParse[r]=this.weekdays(a,"").toLocaleLo