diff --git a/.buildinfo b/.buildinfo new file mode 100644 index 00000000..91f7a384 --- /dev/null +++ b/.buildinfo @@ -0,0 +1,4 @@ +# Sphinx build info version 1 +# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. +config: 1048e154f92cd5a18d38b03433e027f9 +tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/.editorconfig b/.editorconfig deleted file mode 100644 index 1d7d564d..00000000 --- a/.editorconfig +++ /dev/null @@ -1,25 +0,0 @@ -root = true - -[*] -charset = utf-8 -insert_final_newline = true -trim_trailing_whitespace = true - -[*.md] -indent_size = 2 -indent_style = space -max_line_length = 100 # Please keep this in sync with bin/lesson_check.py! - -[*.r] -max_line_length = 80 - -[*.py] -indent_size = 4 -indent_style = space -max_line_length = 79 - -[*.sh] -end_of_line = lf - -[Makefile] -indent_style = tab diff --git a/.gitignore b/.gitignore deleted file mode 100644 index 27af20da..00000000 --- a/.gitignore +++ /dev/null @@ -1,12 +0,0 @@ -*.pyc -*~ -.DS_Store -.ipynb_checkpoints -.sass-cache -.jekyll-cache/ -__pycache__ -_site -.Rproj.user -.Rhistory -.RData - diff --git a/_episodes/.gitkeep b/.nojekyll similarity index 100% rename from _episodes/.gitkeep rename to .nojekyll diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 5653b5a5..00000000 --- a/.travis.yml +++ /dev/null @@ -1,21 +0,0 @@ -services: - - docker - -language: python -python: - - 3.8 - -cache: - pip: true - -branches: - only: - - gh-pages - - /.*/ - -before_script: - - pip install -U pip setuptools wheel typing - - pip install cwltool cwltest html5lib - -script: - - make RUNNER=cwltool unittest-examples diff --git a/.zenodo.json b/.zenodo.json deleted file mode 100644 index 5195b19e..00000000 --- a/.zenodo.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "description": "Common Workflow Language User Guide", - "license": "CC-BY-4.0", - "title": "Common Workflow Language User Guide", - "upload_type": "publication", - "publication_type": "softwaredocumentation", - "creators": [ - { - "affiliation": "European Molecular Biology Laboratory", - "orcid": "https://orcid.org/0000-0003-1766-456X", - "name": "Toby Hodges" - }, - { - "affiliation": "Common Workflow Language project", - "orcid": "https://orcid.org/0000-0002-2961-9670", - "name": "Michael R. Crusoe" - } - ], - "access_right": "open", - "notes": "Based off of the excellent Software/Data Carpentry templates: https://doi.org/10.5281/zenodo.838778", - "related_identifiers": [ - { - "scheme": "url", - "identifier": "https://github.com/common-workflow-language/user_guide", - "relation": "isSupplementTo" - }, - { - "scheme": "doi", - "identifier": "10.5281/zenodo.840129", - "relation": "isPartOf" - } - ] -} diff --git a/01-introduction/index.md.html b/01-introduction/index.md.html new file mode 100644 index 00000000..bc7c2f1d --- /dev/null +++ b/01-introduction/index.md.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/02-1st-example/index.md.html b/02-1st-example/index.md.html new file mode 100644 index 00000000..bc7c2f1d --- /dev/null +++ b/02-1st-example/index.md.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/03-input/index.md.html b/03-input/index.md.html new file mode 100644 index 00000000..9fce93fc --- /dev/null +++ b/03-input/index.md.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/04-output/index.md.html b/04-output/index.md.html new file mode 100644 index 00000000..d0715100 --- /dev/null +++ b/04-output/index.md.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/05-stdout/index.md.html b/05-stdout/index.md.html new file mode 100644 index 00000000..d0715100 --- /dev/null +++ b/05-stdout/index.md.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/06-params/index.md.html b/06-params/index.md.html new file mode 100644 index 00000000..9a7642c0 --- /dev/null +++ b/06-params/index.md.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/07-containers/index.md.html b/07-containers/index.md.html new file mode 100644 index 00000000..6a1359ec --- /dev/null +++ b/07-containers/index.md.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/08-arguments/index.md.html b/08-arguments/index.md.html new file mode 100644 index 00000000..7009a241 --- /dev/null +++ b/08-arguments/index.md.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/09-array-inputs/index.md.html b/09-array-inputs/index.md.html new file mode 100644 index 00000000..9fce93fc --- /dev/null +++ b/09-array-inputs/index.md.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/10-array-outputs/index.md.html b/10-array-outputs/index.md.html new file mode 100644 index 00000000..d0715100 --- /dev/null +++ b/10-array-outputs/index.md.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/11-records/index.md.html b/11-records/index.md.html new file mode 100644 index 00000000..9fce93fc --- /dev/null +++ b/11-records/index.md.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/12-env/index.md.html b/12-env/index.md.html new file mode 100644 index 00000000..74332c1a --- /dev/null +++ b/12-env/index.md.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/13-expressions/index.md.html b/13-expressions/index.md.html new file mode 100644 index 00000000..aaeb3e55 --- /dev/null +++ b/13-expressions/index.md.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/14-runtime/index.md.html b/14-runtime/index.md.html new file mode 100644 index 00000000..3770abba --- /dev/null +++ b/14-runtime/index.md.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/15-staging/index.md.html b/15-staging/index.md.html new file mode 100644 index 00000000..6533cc35 --- /dev/null +++ b/15-staging/index.md.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/16-file-formats/index.md.html b/16-file-formats/index.md.html new file mode 100644 index 00000000..2c5b7c9f --- /dev/null +++ b/16-file-formats/index.md.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/17-metadata/index.md.html b/17-metadata/index.md.html new file mode 100644 index 00000000..9e6250a5 --- /dev/null +++ b/17-metadata/index.md.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/19-custom-types/index.md.html b/19-custom-types/index.md.html new file mode 100644 index 00000000..96f69a52 --- /dev/null +++ b/19-custom-types/index.md.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/20-software-requirements/index.md.html b/20-software-requirements/index.md.html new file mode 100644 index 00000000..337d6866 --- /dev/null +++ b/20-software-requirements/index.md.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/21-1st-workflow/index.md.html b/21-1st-workflow/index.md.html new file mode 100644 index 00000000..b2ac176b --- /dev/null +++ b/21-1st-workflow/index.md.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/22-nested-workflows/index.md.html b/22-nested-workflows/index.md.html new file mode 100644 index 00000000..161dc645 --- /dev/null +++ b/22-nested-workflows/index.md.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/23-scatter-workflow/index.md.html b/23-scatter-workflow/index.md.html new file mode 100644 index 00000000..590450f9 --- /dev/null +++ b/23-scatter-workflow/index.md.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/24_conditional-workflow/index.md.html b/24_conditional-workflow/index.md.html new file mode 100644 index 00000000..36a45615 --- /dev/null +++ b/24_conditional-workflow/index.md.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/AUTHORS b/AUTHORS deleted file mode 100644 index 04e1f5ab..00000000 --- a/AUTHORS +++ /dev/null @@ -1 +0,0 @@ -FIXME: list authors' names and email addresses. \ No newline at end of file diff --git a/CITATION b/CITATION deleted file mode 100644 index 6fc87ca8..00000000 --- a/CITATION +++ /dev/null @@ -1,34 +0,0 @@ -# Citation - -To cite CWL as a project, as a language, or as a standard, use: - -Amstutz, Peter; Crusoe, Michael R; Tijanić, Nebojša; Chapman, Brad; -Chilton, John; Heuer, Michael; Kartashov, Andrey; Kern, John; Leehr, Dan; -Ménager, Hervé; Nedeljkovich, Maya; Scales, Matt; Soiland-Reyes, Stian; -Stojanovic, Luka (2016): Common Workflow Language, v1.0. Specification, -Common Workflow Language working group. https://w3id.org/cwl/v1.0/ -https://dx.doi.org/10.6084/m9.figshare.3115156.v2 - -@data{cwl, - doi = {10.6084/m9.figshare.3115156.v2}, - url = {https://doi.org/10.6084/m9.figshare.3115156.v2}, - author = {Peter Amstutz; Michael R. Crusoe; Nebojša Tijanić; Brad Chapman; -John Chilton; Michael Heuer; Andrey Kartashov; John Kern; Dan Leehr; -Hervé Ménager; Maya Nedeljkovich; Matt Scales; Stian Soiland-Reyes; -Luka Stojanovic - }, - publisher = {Figshare}, - institution = {Common Workflow Language working group}, - title = {Common Workflow Language, v1.0}, - year = {2016} -} - -# the above is from https://github.com/common-workflow-language/common-workflow-language/blob/master/CITATION - -Our preferred DOI for the "CWL User Guide" is http://doi.org/10.5281/zenodo.840129 - -The latest DOI for the "CWL User Guide" is: -[![DOI](https://zenodo.org/badge/89621457.svg)](https://zenodo.org/badge/latestdoi/89621457) - -The structure and style of this user guide is derived from [the Carpentries](https://github.com/carpentries) -lesson template: [![DOI](https://zenodo.org/badge/DOI/10.5281/zenodo.838778.svg)](https://doi.org/10.5281/zenodo.838778) diff --git a/CODE_OF_CONDUCT.html b/CODE_OF_CONDUCT.html new file mode 100644 index 00000000..16610abb --- /dev/null +++ b/CODE_OF_CONDUCT.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md deleted file mode 100644 index c0ac4141..00000000 --- a/CODE_OF_CONDUCT.md +++ /dev/null @@ -1,24 +0,0 @@ ---- -layout: page -title: "Contributor Code of Conduct" ---- -As contributors and maintainers of this project, -we pledge to respect all people who contribute through reporting issues, -posting feature requests, -updating documentation, -submitting pull requests or patches, -and other activities. - -The CWL Project is dedicated to providing a harassment-free experience for -everyone, regardless of gender, gender identity and expression, sexual -orientation, disability, physical appearance, body size, age, race, or religion. -We do not tolerate harassment of participants in any form. - -This code of conduct applies to all CWL Project spaces, including the Google -Group, the Gitter chat room, the Google Hangouts chats, both online and off. -Anyone who violates this code of conduct may be sanctioned or expelled from -these spaces at the discretion of the leadership team. - -For more details, see the [complete CWL project code of conduct](https://github.com/common-workflow-language/common-workflow-language/blob/master/CODE_OF_CONDUCT.md). - -{% include links.md %} diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md deleted file mode 100644 index fcfbc294..00000000 --- a/CONTRIBUTING.md +++ /dev/null @@ -1,148 +0,0 @@ -# Contributing - -The [Common Workflow Language project](cwl-site) is an open source project, -and we welcome contributions of all kinds: -new lessons, -fixes to existing material, -bug reports, -and reviews of proposed changes are all welcome. - -## Contributor Agreement - -By contributing, -you agree that we may redistribute your work under [our license](LICENSE.md). -In exchange, -we will address your issues and/or assess your change proposal as promptly as we can, -and help you become a member of our community. -Everyone involved in the [Common Workflow Language project](cwl-site) -agrees to abide by our [code of conduct](CONDUCT.md). - -## How to Contribute - -The easiest way to get started is to file an issue -to tell us about a spelling mistake, -some awkward wording, -or a factual error. -This is a good way to introduce yourself -and to meet some of our community members. - -1. If you do not have a [GitHub][github] account, - you can [send us comments by email][discuss-list]. - However, - we will be able to respond more quickly if you use one of the other methods described below. - -2. If you have a [GitHub][github] account, - or are willing to [create one][github-join], - but do not know how to use Git, - you can report problems or suggest improvements by [creating an issue][issues]. - This allows us to assign the item to someone - and to respond to it in a threaded discussion. - -3. If you are comfortable with Git, - and would like to add or change material, - you can submit a pull request (PR). - Instructions for doing this are [included below](#using-github). - -## Where to Contribute - -1. If you wish to change this lesson, - please work in , - which can be viewed at . - -2. If you wish to change the example lesson, - please work in , - which documents the format of our lessons - and can be viewed at . - -3. If you wish to change the template used for workshop websites, - please work in . - The home page of that repository explains how to set up workshop websites, - while the extra pages in - provide more background on our design choices. - -4. If you wish to change CSS style files, tools, - or HTML boilerplate for lessons or workshops stored in `_includes` or `_layouts`, - please work in . - -## What to Contribute - -There are many ways to contribute, -from writing new exercises and improving existing ones -to updating or filling in the documentation -and submitting [bug reports][issues] -about things that don't work, aren't clear, or are missing. -If you are looking for ideas, -please see [the list of issues for this repository][issues], -or the issues for [Common Workflow Language](cwl-issues) project itself. - -Comments on issues and reviews of pull requests are just as welcome: -we are smarter together than we are on our own. -Reviews from novices and newcomers are particularly valuable: -it's easy for people who have been using these lessons for a while -to forget how impenetrable some of this material can be, -so fresh eyes are always welcome. - - -## Using GitHub - -If you choose to contribute via GitHub, you may want to look at -[How to Contribute to an Open Source Project on GitHub][how-contribute]. -To manage changes, we follow [GitHub flow][github-flow]. -Each lesson has two maintainers who review issues and pull requests or encourage others to do so. -The maintainers are community volunteers and have final say over what gets merged into the lesson. -To use the web interface for contributing to a lesson: - -1. Fork the originating repository to your GitHub profile. -2. Within your version of the forked repository, move to the `gh-pages` branch and -create a new branch for each significant change being made. -3. Navigate to the file(s) you wish to change within the new branches and make revisions as required. -4. Commit all changed files within the appropriate branches. -5. Create individual pull requests from each of your changed branches -to the `gh-pages` branch within the originating repository. -6. If you receive feedback, make changes using your issue-specific branches of the forked -repository and the pull requests will update automatically. -7. Repeat as needed until all feedback has been addressed. - -When starting work, please make sure your clone of the originating `gh-pages` branch is up-to-date -before creating your own revision-specific branch(es) from there. -Additionally, please only work from your newly-created branch(es) and *not* -your clone of the originating `gh-pages` branch. -Lastly, published copies of all the lessons are available in the `gh-pages` branch of the originating -repository for reference while revising. - -## Other Resources - -General discussion of [Common Workflow Language](cwl-site) project -happens on the [discussion mailing list][discuss-list], -which everyone is welcome to join. - -[dc-issues]: https://github.com/issues?q=user%3Adatacarpentry -[dc-lessons]: http://datacarpentry.org/lessons/ -[dc-site]: http://datacarpentry.org/ -[discuss-list]: https://groups.google.com/forum/#!forum/common-workflow-language -[github]: https://github.com -[github-flow]: https://guides.github.com/introduction/flow/ -[github-join]: https://github.com/join -[how-contribute]: https://egghead.io/series/how-to-contribute-to-an-open-source-project-on-github -[issues]: https://github.com/common-workflow-language/user_guide/issues -[repo]: https://github.com/common-workflow-language/user_guide -[swc-issues]: https://github.com/issues?q=user%3Aswcarpentry -[swc-lessons]: https://software-carpentry.org/lessons/ -[swc-site]: https://software-carpentry.org/ -[cwl-site]: https://www.commonwl.org/ diff --git a/Gemfile b/Gemfile deleted file mode 100644 index 02b7beb2..00000000 --- a/Gemfile +++ /dev/null @@ -1,11 +0,0 @@ -# frozen_string_literal: true - -source "https://rubygems.org" - -git_source(:github) {|repo_name| "https://github.com/#{repo_name}" } - -# gem "rails" - -gem "jekyll", "~> 4.1" - -gem "jekyll-sitemap", "~> 1.4" diff --git a/Gemfile.lock b/Gemfile.lock deleted file mode 100644 index 83a7a9f9..00000000 --- a/Gemfile.lock +++ /dev/null @@ -1,70 +0,0 @@ -GEM - remote: https://rubygems.org/ - specs: - addressable (2.8.0) - public_suffix (>= 2.0.2, < 5.0) - colorator (1.1.0) - concurrent-ruby (1.1.7) - em-websocket (0.5.2) - eventmachine (>= 0.12.9) - http_parser.rb (~> 0.6.0) - eventmachine (1.2.7) - ffi (1.13.1) - forwardable-extended (2.6.0) - http_parser.rb (0.6.0) - i18n (1.8.5) - concurrent-ruby (~> 1.0) - jekyll (4.1.1) - addressable (~> 2.4) - colorator (~> 1.0) - em-websocket (~> 0.5) - i18n (~> 1.0) - jekyll-sass-converter (~> 2.0) - jekyll-watch (~> 2.0) - kramdown (~> 2.1) - kramdown-parser-gfm (~> 1.0) - liquid (~> 4.0) - mercenary (~> 0.4.0) - pathutil (~> 0.9) - rouge (~> 3.0) - safe_yaml (~> 1.0) - terminal-table (~> 1.8) - jekyll-sass-converter (2.1.0) - sassc (> 2.0.1, < 3.0) - jekyll-sitemap (1.4.0) - jekyll (>= 3.7, < 5.0) - jekyll-watch (2.2.1) - listen (~> 3.0) - kramdown (2.3.1) - rexml - kramdown-parser-gfm (1.1.0) - kramdown (~> 2.0) - liquid (4.0.3) - listen (3.3.3) - rb-fsevent (~> 0.10, >= 0.10.3) - rb-inotify (~> 0.9, >= 0.9.10) - mercenary (0.4.0) - pathutil (0.16.2) - forwardable-extended (~> 2.6) - public_suffix (4.0.6) - rb-fsevent (0.10.4) - rb-inotify (0.10.1) - ffi (~> 1.0) - rexml (3.2.5) - rouge (3.25.0) - safe_yaml (1.0.5) - sassc (2.4.0) - ffi (~> 1.9) - terminal-table (1.8.0) - unicode-display_width (~> 1.1, >= 1.1.1) - unicode-display_width (1.7.0) - -PLATFORMS - ruby - -DEPENDENCIES - jekyll (~> 4.1) - jekyll-sitemap (~> 1.4) - -BUNDLED WITH - 2.1.4 diff --git a/LICENSE.html b/LICENSE.html new file mode 100644 index 00000000..39883424 --- /dev/null +++ b/LICENSE.html @@ -0,0 +1,611 @@ + + + + + + + + + + + + + + + 5. Licenses — Common Workflow Language User Guide 0.1 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+
+
+ + + + +
+
+ + + + + +
+ + + + + + + + + + + +
+ +
+ + +
+
+ +
+
+ +
+ +
+ + + + +
+ +
+ + +
+
+ + + + + +
+ +
+

5. Licenses#

+
+

5.1. Instructional Material#

+

All Common Workflow Language project instructional material and changes +to the structure are also made available under the Creative Commons Attribution +license. The following is a human-readable summary of +(and not a substitute for) the full legal text of the CC BY 4.0 +license.

+

You are free:

+
    +
  • to Share—copy and redistribute the material in any medium or format

  • +
  • to Adapt—remix, transform, and build upon the material

  • +
+

for any purpose, even commercially.

+

The licensor cannot revoke these freedoms as long as you follow the +license terms:

+
    +
  • Attribution—You must give appropriate credit (mentioning that +your work is derived from work that is Copyright © the Common Workflow +Language project, and, where practical, linking to +https://www.commonwl.org/ ), provide a link to the +license, and indicate if changes were made. You may do +so in any reasonable manner, but not in any way that suggests the +licensor endorses you or your use.

  • +
  • No additional restrictions—You may not apply legal terms or +technological measures that legally restrict others from doing +anything the license permits. With the understanding that:

    +
      +
    • You do not have to comply with the license for elements of the +material in the public domain or where your use is permitted by an +applicable exception or limitation.

    • +
    • No warranties are given. The license may not give you all of the +permissions necessary for your intended use. For example, other +rights such as publicity, privacy, or moral rights may limit how you +use the material.

    • +
    +
  • +
+
+
+

5.2. Software#

+

Except where otherwise noted, the example programs and other software +provided by Common Workflow Language project are made available under the +OSI-approved +Apache 2.0 license.

+

Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an “AS IS” BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License.

+
+
+ + +
+ + + + + + + +
+ + + +
+ + +
+
+ +
+ +
+
+
+ + + + + + + + \ No newline at end of file diff --git a/LICENSE.md b/LICENSE.md deleted file mode 100644 index bb048824..00000000 --- a/LICENSE.md +++ /dev/null @@ -1,75 +0,0 @@ ---- -layout: page -title: "Licenses" -root: . ---- -## Instructional Material - -This material is derived from a framework created by the Software Carpentry -and Data Carpentry projects under the [Creative Commons Attribution -license][cc-by-human]. - -All Common Workflow Language project instructional material and changes -to the structure are also made available under the [Creative Commons Attribution -license][cc-by-human]. The following is a human-readable summary of -(and not a substitute for) the [full legal text of the CC BY 4.0 -license][cc-by-legal]. - -You are free: - -* to **Share**---copy and redistribute the material in any medium or format -* to **Adapt**---remix, transform, and build upon the material - -for any purpose, even commercially. - -The licensor cannot revoke these freedoms as long as you follow the -license terms. - -Under the following terms: - -* **Attribution**---You must give appropriate credit (mentioning that - your work is derived from work that is Copyright © the Common Workflow - Language project, and Copyright © Software Carpentry, and, where practical, linking to - https://www.commonwl.org/ and https://software-carpentry.org/), provide a [link to the - license][cc-by-human], and indicate if changes were made. You may do - so in any reasonable manner, but not in any way that suggests the - licensor endorses you or your use. - -**No additional restrictions**---You may not apply legal terms or -technological measures that legally restrict others from doing -anything the license permits. With the understanding that: - -Notices: - -* You do not have to comply with the license for elements of the - material in the public domain or where your use is permitted by an - applicable exception or limitation. -* No warranties are given. The license may not give you all of the - permissions necessary for your intended use. For example, other - rights such as publicity, privacy, or moral rights may limit how you - use the material. - -## Software - -Except where otherwise noted, the example programs and other software -provided by Common Workflow Language project are made available under the -[OSI][osi]-approved -[Apache 2.0 license][apache-2.0-license]. - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -## Trademark - -"Software Carpentry" and "Data Carpentry" and their respective logos -are registered trademarks of [Community Initiatives][CI]. - -[cc-by-human]: https://creativecommons.org/licenses/by/4.0/ -[cc-by-legal]: https://creativecommons.org/licenses/by/4.0/legalcode -[apache-2.0-license]: https://opensource.org/licenses/Apache-2.0 -[mit-license]: https://opensource.org/licenses/mit-license.html -[ci]: http://communityin.org/ -[osi]: https://opensource.org diff --git a/Makefile b/Makefile deleted file mode 100644 index d291abe6..00000000 --- a/Makefile +++ /dev/null @@ -1,121 +0,0 @@ -## ======================================== -## Commands for both workshop and lesson websites. - -# Settings -MAKEFILES=Makefile $(wildcard *.mk) -JEKYLL=jekyll -JEKYLL_VERSION=3.8.5 -PARSER=bin/markdown_ast.rb -DST=_site - -# Controls -.PHONY : commands clean files -.NOTPARALLEL: -all : commands - -## commands : show all commands. -commands : - @grep -h -E '^##' ${MAKEFILES} | sed -e 's/## //g' - -## docker-serve : use docker to build the site -docker-serve : - docker run --rm -it -v ${PWD}:/srv/jekyll -p 127.0.0.1:4000:4000 jekyll/jekyll:${JEKYLL_VERSION} make serve - -## serve : run a local server. -serve : lesson-md - ${JEKYLL} serve - -## site : build files but do not run a server. -site : lesson-md - ${JEKYLL} build - -# repo-check : check repository settings. -repo-check : - @bin/repo_check.py -s . - -## clean : clean up junk files. -clean : - @rm -rf ${DST} - @rm -rf .sass-cache - @rm -rf bin/__pycache__ - @find . -name .DS_Store -exec rm {} \; - @find . -name '*~' -exec rm {} \; - @find . -name '*.pyc' -exec rm {} \; - -## clean-rmd : clean intermediate R files (that need to be committed to the repo). -clean-rmd : - @rm -rf ${RMD_DST} - @rm -rf fig/rmd-* - -## ---------------------------------------- -## Commands specific to workshop websites. - -.PHONY : workshop-check - -## workshop-check : check workshop homepage. -workshop-check : - @bin/workshop_check.py . - -## ---------------------------------------- -## Commands specific to lesson websites. - -.PHONY : lesson-check lesson-md lesson-files lesson-fixme - -# RMarkdown files -RMD_SRC = $(wildcard _episodes_rmd/??-*.Rmd) -RMD_DST = $(patsubst _episodes_rmd/%.Rmd,_episodes/%.md,$(RMD_SRC)) - -# Lesson source files in the order they appear in the navigation menu. -MARKDOWN_SRC = \ - index.md \ - CODE_OF_CONDUCT.md \ - setup.md \ - $(sort $(wildcard _episodes/*.md)) \ - reference.md \ - $(sort $(wildcard _extras/*.md)) \ - LICENSE.md - -# Generated lesson files in the order they appear in the navigation menu. -HTML_DST = \ - ${DST}/index.html \ - ${DST}/conduct/index.html \ - ${DST}/setup/index.html \ - $(patsubst _episodes/%.md,${DST}/%/index.html,$(sort $(wildcard _episodes/*.md))) \ - ${DST}/reference/index.html \ - $(patsubst _extras/%.md,${DST}/%/index.html,$(sort $(wildcard _extras/*.md))) \ - ${DST}/license/index.html - -## lesson-md : convert Rmarkdown files to markdown -lesson-md : ${RMD_DST} - -_episodes/%.md: _episodes_rmd/%.Rmd - @bin/knit_lessons.sh $< $@ - -## lesson-check : validate lesson Markdown. -lesson-check : lesson-fixme - @bin/lesson_check.py -s . -p ${PARSER} -r _includes/links.md - -## lesson-check-all : validate lesson Markdown, checking line lengths and trailing whitespace. -lesson-check-all : - @bin/lesson_check.py -s . -p ${PARSER} -r _includes/links.md -l -w --permissive - -## unittest : run unit tests on checking tools. -unittest : - @bin/test_lesson_check.py - -## lesson-files : show expected names of generated files for debugging. -lesson-files : - @echo 'RMD_SRC:' ${RMD_SRC} - @echo 'RMD_DST:' ${RMD_DST} - @echo 'MARKDOWN_SRC:' ${MARKDOWN_SRC} - @echo 'HTML_DST:' ${HTML_DST} - -## lesson-fixme : show FIXME markers embedded in source files. -lesson-fixme : - @fgrep -i -n FIXME ${MARKDOWN_SRC} || true - -#------------------------------------------------------------------------------- -# Include extra commands if available. -#------------------------------------------------------------------------------- - --include commands.mk diff --git a/README.md b/README.md deleted file mode 100644 index fb3c4dc2..00000000 --- a/README.md +++ /dev/null @@ -1,38 +0,0 @@ -[![DOI](https://zenodo.org/badge/89621457.svg)](https://zenodo.org/badge/latestdoi/89621457) - -[![Syntax Check](https://travis-ci.org/common-workflow-language/user_guide.svg?branch=gh-pages)](https://travis-ci.org/common-workflow-language/user_guide) - -[User guide for CWL v1.0.2](https://www.commonwl.org/user_guide/) - -Original source: -https://github.com/common-workflow-language/common-workflow-language/blob/a2a8a08b8c8d56f8f2ca6284ca4e9cbf23d19346/v1.0/UserGuide.yml - -## Contributing - -We welcome all contributions to improve the lesson! Maintainers will do their best to help you if you have any -questions, concerns, or experience any difficulties along the way. -To edit the user guide: - -We'd like to ask you to familiarize yourself with our [Contribution Guide](CONTRIBUTING.md) and have a look at -the [more detailed guidelines][lesson-example] on proper formatting, ways to render the lesson locally, and even -how to write new episodes. - -- The text files for each tutorial can be found in the directory [_episodes](_episodes) - -- The cwl and yaml code files linked to each tutorial can be found in the directory [_includes/cwl](_includes/cwl) - -This repo is based upon https://github.com/swcarpentry/styles and should be periodically resynced. - -## Maintainer(s) - -* FIXME - -## Authors - -A list of contributors to the lesson can be found in [AUTHORS](AUTHORS) - -## Citation - -To cite this lesson, please consult with [CITATION](CITATION) - -[lesson-example]: https://carpentries.github.io/lesson-example diff --git a/_config.yml b/_config.yml deleted file mode 100644 index b8626ecd..00000000 --- a/_config.yml +++ /dev/null @@ -1,110 +0,0 @@ -#------------------------------------------------------------ -# Values for this lesson. -#------------------------------------------------------------ - -# Which carpentry is this ("swc", "dc", "lc", "cp", or "cwl")? -# swc: Software Carpentry -# dc: Data Carpentry -# lc: Library Carpentry -# cp: Carpentries (to use for instructor traning for instance) -# cwl: Common Workflow Language -carpentry: "cwl" - -# Overall title for pages. -title: "Common Workflow Language User Guide" - -# Life cycle stage of the lesson -# possible values: "pre-alpha", "alpha", "beta", "stable" -life_cycle: "stable" - -#------------------------------------------------------------ -# Generic settings (should not need to change). -#------------------------------------------------------------ - -# What kind of thing is this ("workshop" or "lesson")? -kind: "lesson" - -# Languages -# Order is from https://en.wikipedia.org/wiki/List_of_languages_by_total_number_of_speakers#Ethnologue_(2019,_22nd_edition) -# followed by the remaining entries from https://en.wikipedia.org/wiki/List_of_languages_by_number_of_native_speakers#Ethnologue_(2019,_22nd_edition) -other_languages: ["zh-CN", "zh-TW", "hi", "es", "fr", "ar", "bn", "ru", "pt", "id", "ur", "de", "ja", "sw", "mr", "te", "pa", "ta", "tr", "ko", "vi", "jw", "it", "ha", "th", "gu", "kn", "fa", "ms", "pl", "yo", "ml", "su", "uz", "ig", "ro", "nl", "az", "ku", "am", "mg", "sr", "ne", "km", "so", "ceb", "si", "el", "kk", "hu", "zu", "cs"] - -# Magic to make URLs resolve both locally and on GitHub. -# See https://help.github.com/articles/repository-metadata-on-github-pages/. -repository: common-workflow-language/user-guide -email: "https://www.commonwl.org/#Support" - -# # Email address, no mailto: -# email: "team@carpentries.org" - -# Sites. -# amy_site: "https://amy.software-carpentry.org/workshops" -# carpentries_github: "https://github.com/carpentries" -# carpentries_pages: "https://carpentries.github.io" -# carpentries_site: "https://carpentries.org/" -# dc_site: "http://datacarpentry.org" -# example_repo: "https://github.com/carpentries/lesson-example" -# example_site: "https://carpentries.github.io/lesson-example" -# lc_site: "https://librarycarpentry.org/" -# swc_github: "https://github.com/swcarpentry" -# swc_pages: "https://swcarpentry.github.io" -# swc_site: "https://software-carpentry.org" -# template_repo: "https://github.com/carpentries/styles" -# training_site: "https://carpentries.github.io/instructor-training" -workshop_repo: "https://github.com/carpentries/workshop-template" -workshop_site: "https://carpentries.github.io/workshop-template" -cc_by_human: "https://creativecommons.org/licenses/by/4.0/" - -# Surveys. -# swc_pre_survey: "https://www.surveymonkey.com/r/swc_pre_workshop_v1?workshop_id=" -# swc_post_survey: "https://www.surveymonkey.com/r/swc_post_workshop_v1?workshop_id=" -# training_post_survey: "https://www.surveymonkey.com/r/post-instructor-training" -# dc_pre_survey: "https://www.surveymonkey.com/r/dcpreworkshopassessment?workshop_id=" -# dc_post_survey: "https://www.surveymonkey.com/r/dcpostworkshopassessment?workshop_id=" -# lc_pre_survey: "https://www.surveymonkey.com/r/lcpreworkshopsurvey?workshop_id=" -# lc_post_survey: "https://www.surveymonkey.com/r/lcpostworkshopsurvey?workshop_id=" -# instructor_pre_survey: "https://www.surveymonkey.com/r/instructor_training_pre_survey?workshop_id=" -# instructor_post_survey: "https://www.surveymonkey.com/r/instructor_training_post_survey?workshop_id=" - - -# Start time in minutes (0 to be clock-independent, 540 to show a start at 09:00 am). -start_time: 0 - -# Specify that things in the episodes collection should be output. -collections: - episodes: - output: true - permalink: /:path/index.html - extras: - output: true - permalink: /:path/index.html - -# Set the default layout for things in the episodes collection. -defaults: - - values: - root: . - layout: page - - scope: - path: "" - type: episodes - values: - root: .. - layout: episode - - scope: - path: "" - type: extras - values: - root: .. - layout: page - -# Files and directories that are not to be copied. -exclude: - - Makefile - - bin/ - - .Rproj.user/ - -# Turn on built-in syntax highlighting. -highlighter: rouge - -plugins: - - jekyll-sitemap diff --git a/_episodes/01-introduction.md b/_episodes/01-introduction.md deleted file mode 100644 index d070f85c..00000000 --- a/_episodes/01-introduction.md +++ /dev/null @@ -1,32 +0,0 @@ ---- -title: "Introduction" -teaching: 0 -exercises: 0 -questions: -- "What is Common Workflow Language?" -- "Why might I want to learn to use CWL?" -objectives: -- "Learn what CWL is." -- "Learn about the motivation behind the project." -keypoints: -- "CWL describes command line tools and workflows." -- "CWL is not software." -- "Descriptions in CWL aid portability between environments" ---- - -CWL is a way to describe command line tools and connect them together to create -workflows. Because CWL is a specification and not a specific piece of -software, tools and workflows described using CWL are portable across a variety -of platforms that support the CWL standard. - -CWL has roots in "make" and many similar tools that determine order of -execution based on dependencies between tasks. However unlike "make", CWL -tasks are isolated and you must be explicit about your inputs and outputs. The -benefit of explicitness and isolation are flexibility, portability, and -scalability: tools and workflows described with CWL can transparently leverage -technologies such as Docker and be used with CWL implementations from different -vendors. CWL is well suited for describing large-scale workflows in cluster, -cloud and high performance computing environments where tasks are scheduled in -parallel across many nodes. - -{% include links.md %} diff --git a/_episodes/02-1st-example.md b/_episodes/02-1st-example.md deleted file mode 100644 index d1e5654c..00000000 --- a/_episodes/02-1st-example.md +++ /dev/null @@ -1,107 +0,0 @@ ---- -title: "First Example" -teaching: 5 -exercises: 0 -questions: -- "How do I write a CWL description of a simple command line tool?" -objectives: -- "Learn the basic structure of a CWL description." -keypoints: -- "CWL documents are written in YAML and/or JSON." -- "The command called is specified with `baseCommand`." -- "Each expected input is described in the `inputs` section." -- "Input values are specified in a separate YAML file." -- "The tool description and input files are provided as arguments to a CWL runner." ---- -The simplest "hello world" program. This accepts one input parameter, writes a message to the terminal or job log, and produces -no permanent output. -CWL documents are written in [JSON][json] or [YAML][yaml], or a mix of the two. -We will use YAML throughout this guide. -If you are not familiar with YAML, -you may find it helpful to refer to -[this quick tutorial for the subset of YAML used in CWL]({{ page.root }}{% link _extras/yaml.md %}). - -First, create a file called `1st-tool.cwl`, containing the boxed text below. It will help you to use a text editor that can be -specified to produce text in YAML or JSON. Whatever text editor you use, the indents you see should not be created using tabs. - -*1st-tool.cwl* -~~~ -{% include cwl/02-1st-example/1st-tool.cwl %} -~~~ -{: .source} - -Next, create a file called `echo-job.yml`, containing the following boxed text, which will describe the input of a run: - -*echo-job.yml* -~~~ -{% include cwl/02-1st-example/echo-job.yml %} -~~~ -{: .source} - -Now, invoke `cwl-runner` with the tool wrapper `1st-tool.cwl` and the input object echo-job.yml on the command line. The command -is `cwl-runner 1st-tool.cwl echo-job.yml`. The boxed text below shows this command and the expected output. - -~~~ -$ cwl-runner 1st-tool.cwl echo-job.yml -[job 1st-tool.cwl] /tmp/tmpmM5S_1$ echo \ - 'Hello world!' -Hello world! -[job 1st-tool.cwl] completed success -{} -Final process status is success - -~~~ -{: .output} - -The command `cwl-runner 1st-tool.cwl echo-job.yml` is an example of a general form that you will often come across while using -CWL. The general form is `cwl-runner [tool-or-workflow-description] [input-job-settings]` - -What's going on here? Let's break down the contents of `1st-tool.cwl`: - -~~~ -cwlVersion: v1.0 -class: CommandLineTool -~~~ -{: .source} - -The `cwlVersion` field indicates the version of the CWL spec used by the document. The `class` field indicates this document -describes a command line tool. - -~~~ -baseCommand: echo -~~~ -{: .source} - -The `baseCommand` provides the name of program that will actually run (`echo`). `echo` is a built-in program in the bash and -C shells. - -~~~ -inputs: - message: - type: string - inputBinding: - position: 1 -~~~ -{: .source} - -The `inputs` section describes the inputs of the tool. -This is a mapped list of input parameters -(see the [YAML Guide]({{ page.root }}{% link _extras/yaml.md %}#maps) for more about the format) -and each parameter includes an identifier, -a data type, -and optionally an `inputBinding`. -The `inputBinding` describes how this input parameter should appear -on the command line. -In this example, -the `position` field indicates where it should appear on the command line. - -~~~ -outputs: [] -~~~ -{: .source} - -This tool has no formal output, so the `outputs` section is an empty list. - -[echo]: http://www.linfo.org/echo.html - -{% include links.md %} diff --git a/_episodes/03-input.md b/_episodes/03-input.md deleted file mode 100644 index 568f3307..00000000 --- a/_episodes/03-input.md +++ /dev/null @@ -1,154 +0,0 @@ ---- -title: "Essential Input Parameters" -teaching: 10 -exercises: 0 -questions: -- "How can I pass arguments to a command?" -- "How is the order of parameters defined for a command?" -objectives: -- "Learn how to describe and handle input parameters and files to a tool." -keypoints: -- "Inputs are described in the `inputs` section of a CWL description." -- "Files should be described with `class: File`." -- "You can use the `inputBinding` section to describe where and how an input -appears in the command." ---- - -The `inputs` of a tool is a list of input parameters that control how to -run the tool. Each parameter has an `id` for the name of parameter, and -`type` describing what types of values are valid for that parameter. - -Available primitive types are *string*, *int*, *long*, *float*, *double*, -and *null*; complex types are *array* and *record*; in addition there are -special types *File*, *Directory* and *Any*. - -The following example demonstrates some input parameters with different -types and appearing on the command line in different ways. - -First, create a file called inp.cwl, containing the following: - - -*inp.cwl* - -~~~ -{% include cwl/03-input/inp.cwl %} -~~~ -{: .source} - -Create a file called inp-job.yml: - -*inp-job.yml* - -~~~ -{% include cwl/03-input/inp-job.yml %} -~~~ -{: .source} - -Notice that "example_file", as a `File` type, must be provided as an -object with the fields `class: File` and `path`. - -Next, create a whale.txt using [touch] by typing `touch whale.txt` on the command line and then invoke `cwl-runner` with the tool wrapper and the input object on the command line, using the command `cwl-runner inp.cwl inp-job.yml`. The following boxed text describes these two commands and the expected output from the command line: - -~~~ -$ touch whale.txt -$ cwl-runner inp.cwl inp-job.yml -[job inp.cwl] /tmp/tmpzrSnfX$ echo \ - -f \ - -i42 \ - --example-string \ - hello \ - --file=/tmp/tmpRBSHIG/stg979b6d24-d50a-47e3-9e9e-90097eed2cbc/whale.txt --f -i42 --example-string hello --file=/tmp/tmpRBSHIG/stg979b6d24-d50a-47e3-9e9e-90097eed2cbc/whale.txt -[job inp.cwl] completed success -{} -Final process status is success -~~~ -{: .output} -> ## Where did those `/tmp` paths come from? -> -> The CWL reference runner (cwltool) and other runners create temporary -> directories with symbolic ("soft") links to your input files to ensure that -> the tools aren't accidentally accessing files that were not explicitly -> specified -{: .callout} - -The field `inputBinding` is optional and indicates whether and how the -input parameter should be appear on the tool's command line. If -`inputBinding` is missing, the parameter does not appear on the command -line. Let's look at each example in detail. - -~~~ -example_flag: - type: boolean - inputBinding: - position: 1 - prefix: -f -~~~ -{: .source} - -Boolean types are treated as a flag. If the input parameter -"example_flag" is "true", then `prefix` will be added to the -command line. If false, no flag is added. - -~~~ -example_string: - type: string - inputBinding: - position: 3 - prefix: --example-string -~~~ -{: .source} - -String types appear on the command line as literal values. The `prefix` -is optional, if provided, it appears as a separate argument on the -command line before the parameter . In the example above, this is -rendered as `--example-string hello`. - -~~~ -example_int: - type: int - inputBinding: - position: 2 - prefix: -i - separate: false -~~~ -{: .source} - -Integer (and floating point) types appear on the command line with -decimal text representation. When the option `separate` is false (the -default value is true), the prefix and value are combined into a single -argument. In the example above, this is rendered as `-i42`. - - -~~~ -example_file: - type: File? - inputBinding: - prefix: --file= - separate: false - position: 4 -~~~ -{: .source} - -File types appear on the command line as the path to the file. When the -parameter type ends with a question mark `?` it indicates that the -parameter is optional. In the example above, this is rendered as -`--file=/tmp/random/path/whale.txt`. However, if the "example_file" -parameter were not provided in the input, nothing would appear on the -command line. - -Input files are read-only. If you wish to update an input file, you must -[first copy it to the output directory]({{ page.root }}/15-staging/). - -The value of `position` is used to determine where parameter should -appear on the command line. Positions are relative to one another, not -absolute. As a result, positions do not have to be sequential, three -parameters with positions 1, 3, 5 will result in the same command -line as 1, 2, 3. More than one parameter can have the same position -(ties are broken using the parameter name), and the position field itself -is optional. The default position is 0. - -The `baseCommand` field will always appear in the final command line before the parameters. - -[touch]: http://www.linfo.org/touch.html -{% include links.md %} diff --git a/_episodes/04-output.md b/_episodes/04-output.md deleted file mode 100644 index 1283bd56..00000000 --- a/_episodes/04-output.md +++ /dev/null @@ -1,89 +0,0 @@ ---- -title: "Returning Output Files" -teaching: 10 -exercises: 0 -questions: -- "Where does the output of a command go?" -- "How can I save the output of a command?" -objectives: -- "Learn how to describe and handle outputs from a tool." -keypoints: -- "Outputs are described in the `outputs` section of a CWL description." -- "The field `outputBinding` describes how to to set the value of each -output parameter." -- "Wildcards are allowed in the `glob` field." ---- -The `outputs` of a tool is a list of output parameters that should be -returned after running the tool. Each parameter has an `id` for the name -of parameter, and `type` describing what types of values are valid for -that parameter. - -When a tool runs under CWL, the starting working directory is the -designated output directory. The underlying tool or script must record -its results in the form of files created in the output directory. The -output parameters returned by the CWL tool are either the output files -themselves, or come from examining the content of those files. - -The following example demonstrates how to return a file that has been extracted from a tar file. - -> ## Passing mandatory arguments to the `baseCommand` -> -> In previous examples, the `baseCommand` was just a string, with any arguments passed as CWL inputs. -> Instead of a single string we can use an _array of strings_. The first element is the command to run, and -> any subsequent elements are mandatory command line arguments -{: .callout} - -*tar.cwl* - -~~~ -{% include cwl/04-output/tar.cwl %} -~~~ -{: .source} - -*tar-job.yml* - -~~~ -{% include cwl/04-output/tar-job.yml %} -~~~ -{: .source} - -Next, create a tar file for the example and invoke `cwl-runner` with the tool -wrapper and the input object on the command line: - -~~~ -$ touch hello.txt && tar -cvf hello.tar hello.txt -$ cwl-runner tar.cwl tar-job.yml -[job tar.cwl] /tmp/tmpqOeawQ$ tar \ - --extract --file \ - /tmp/tmpGDk8Y1/stg80bbad20-494d-47af-8075-dffc32df03a3/hello.tar -[job tar.cwl] completed success -{ - "example_out": { - "location": "file:///home/me/cwl/user_guide/hello.txt", - "basename": "hello.txt", - "class": "File", - "checksum": "sha1$da39a3ee5e6b4b0d3255bfef95601890afd80709", - "size": 0, - "path": "/home/me/cwl/user_guide/hello.txt" - } -} -Final process status is success -~~~ -{: .output} - -The field `outputBinding` describes how to set the value of each -output parameter. - -~~~ -outputs: - example_out: - type: File - outputBinding: - glob: hello.txt -~~~ -{: .source} - -The `glob` field consists of the name of a file in the output directory. -If you don't know name of the file in advance, you can use a wildcard pattern like `glob: '*.txt'`. - -{% include links.md %} diff --git a/_episodes/05-stdout.md b/_episodes/05-stdout.md deleted file mode 100644 index c1fc1467..00000000 --- a/_episodes/05-stdout.md +++ /dev/null @@ -1,53 +0,0 @@ ---- -title: "Capturing Standard Output" -teaching: 10 -exercises: 0 -questions: -- "How do I capture the standard output stream of a command?" -objectives: -- "Learn how to capture streamed output from a tool." -keypoints: -- "Use the `stdout` field to specify a filename to capture streamed output." -- "The corresponding output parameter must have `type: stdout`." ---- -To capture a tool's standard output stream, add the `stdout` field with -the name of the file where the output stream should go. Then add `type: -stdout` on the corresponding output parameter. - -*stdout.cwl* - -~~~ -{% include cwl/05-stdout/stdout.cwl %} -~~~ -{: .source} - -*echo-job.yml* - -~~~ -{% include cwl/05-stdout/echo-job.yml %} -~~~ -{: .source} - -Now invoke `cwl-runner` providing the tool wrapper and the input object -on the command line: - -~~~ -$ cwl-runner stdout.cwl echo-job.yml -[job stdout.cwl] /tmp/tmpE0gTz7$ echo \ - 'Hello world!' > /tmp/tmpE0gTz7/output.txt -[job stdout.cwl] completed success -{ - "example_out": { - "location": "file:///home/me/cwl/user_guide/output.txt", - "basename": "output.txt", - "class": "File", - "checksum": "sha1$47a013e660d408619d894b20806b1d5086aab03b", - "size": 13, - "path": "/home/me/cwl/user_guide/output.txt" - } -} -Final process status is success - -~~~ -{: .output} -{% include links.md %} diff --git a/_episodes/06-params.md b/_episodes/06-params.md deleted file mode 100644 index c97e48aa..00000000 --- a/_episodes/06-params.md +++ /dev/null @@ -1,137 +0,0 @@ ---- -title: "Parameter References" -teaching: 10 -exercises: 0 -questions: -- "How can I re-use parameter values in another location?" -objectives: -- "Learn how to make parameter references in descriptions." -keypoints: -- "Some fields permit parameter references enclosed in `$(...)`." -- "References are written using a subset of Javascript syntax." ---- -In a previous example, we extracted a file using the "tar" program. -However, that example was very limited because it assumed that the file -we were interested in was called "hello.txt", and this was written into the -`.cwl` file. This is not the best way to do this, as the "hello.txt" filename -may vary or be dependant on the input file(s) used. To avoid this we can -specify the name of the file we want in the job parameters file (`.yml`). In -this example, you will see how to reference the value of input parameters -dynamically from other fields, which will allow us to then specify the name of -the file to extract. - -*tar-param.cwl* - -~~~ -{% include cwl/06-params/tar-param.cwl %} -~~~ -{: .source} - -*tar-param-job.yml* - -~~~ -{% include cwl/06-params/tar-param-job.yml %} -~~~ -{: .source} - -Create your input files and invoke `cwl-runner` with the tool wrapper and the -input object on the command line: - -~~~ -$ rm hello.tar || true && touch goodbye.txt && tar -cvf hello.tar goodbye.txt -$ cwl-runner tar-param.cwl tar-param-job.yml -[job tar-param.cwl] /tmp/tmpwH4ouT$ tar \ - --extract --file \ - /tmp/tmpREYiEt/stgd7764383-99c9-4848-af51-7c2d6e5527d9/hello.tar \ - goodbye.txt -[job tar-param.cwl] completed success -{ - "extracted_file": { - "location": "file:///home/me/cwl/user_guide/goodbye.txt", - "basename": "goodbye.txt", - "class": "File", - "checksum": "sha1$da39a3ee5e6b4b0d3255bfef95601890afd80709", - "size": 0, - "path": "/home/me/cwl/user_guide/goodbye.txt" - } -} -Final process status is success -~~~ -{: .output} - -Certain fields permit parameter references which are enclosed in `$(...)`. -These are evaluated and replaced with value being referenced. - -~~~ -outputs: - extracted_out: - type: File - outputBinding: - glob: $(inputs.extractfile) -~~~ -{: .source} - -References are written using a subset of Javascript syntax. In this -example, `$(inputs.extractfile)`, `$(inputs["extractfile"])`, and -`$(inputs['extractfile'])` are equivalent. - -The value of the "inputs" variable is the input object provided when the -CWL tool was invoked. - -Note that because `File` parameters are objects, to get the path to an -input file you must reference the path field on a file object; to -reference the path to the tar file in the above example you would write -`$(inputs.tarfile.path)`. - -> ## Where are parameter references allowed? -> You can only use parameter references in certain fields. These are: -> -> - From [`CommandLineTool`](http://www.commonwl.org/v1.0/CommandLineTool.html#CommandLineTool) -> - `arguments` -> - `valueFrom` -> - `stdin` -> - `stdout` -> - `stderr` -> - From [CommandInputParameter](http://www.commonwl.org/v1.0/CommandLineTool.html#CommandInputParameter) -> - `format` -> - `secondaryFiles` -> - From [`inputBinding`](http://www.commonwl.org/v1.0/CommandLineTool.html#CommandLineBinding) -> - `valueFrom` -> - From [CommandOutputParamater](http://www.commonwl.org/v1.0/CommandLineTool.html#CommandOutputParameter) -> - `format` -> - `secondaryFiles` -> - From [CommandOutputBinding](http://www.commonwl.org/v1.0/CommandLineTool.html#CommandOutputBinding) -> - `glob` -> - `outputEval` -> - From `Workflow` -> - From [InputParameter](http://www.commonwl.org/v1.0/Workflow.html#InputParameter) and [WorkflowOutputParameter](http://www.commonwl.org/v1.0/Workflow.html#WorkflowOutputParameter) -> - `format` -> - `secondaryFiles` -> - From `steps` -> - From [WorkflowStepInput](http://www.commonwl.org/v1.0/Workflow.html#WorkflowStepInput) -> - `valueFrom` -> - From [ExpressionTool](https://www.commonwl.org/v1.0/Workflow.html#ExpressionTool) -> - `expression` -> - From [InputParameter](http://www.commonwl.org/v1.0/Workflow.html#InputParameter) and [ExpressionToolOutputParameter](http://www.commonwl.org/v1.0/Workflow.html#ExpressionToolOutputParameter) -> - `format` -> - `secondaryFiles` -> - From [`ResourceRequirement`](http://www.commonwl.org/v1.0/CommandLineTool.html#ResourceRequirement) -> - `coresMin` -> - `coresMax` -> - `ramMin` -> - `ramMax` -> - `tmpdirMin` -> - `tmpdirMax` -> - `outdirMin` -> - `outdirMax` -> - From [`InitialWorkDirRequirement`](http://www.commonwl.org/v1.0/CommandLineTool.html#InitialWorkDirRequirement) -> - `listing` -> - in [Dirent](http://www.commonwl.org/v1.0/CommandLineTool.html#Dirent) -> - `entry` -> - `entryname` -> - From `EnvVarRequirement` -> - From [EnvironmentDef](http://www.commonwl.org/v1.0/CommandLineTool.html#EnvironmentDef) -> - `envValue` -{: .callout } - -{% include links.md %} diff --git a/_episodes/07-containers.md b/_episodes/07-containers.md deleted file mode 100644 index 5439b1d5..00000000 --- a/_episodes/07-containers.md +++ /dev/null @@ -1,114 +0,0 @@ ---- -title: "Running Tools Inside Docker" -teaching: 10 -exercises: 0 -questions: -- "How do I run tools inside a Docker container?" -objectives: -- "Learn how to invoke tools inside a complete controlled runtime." -keypoints: -- "Containers can help to simplify management of the software requirements of -a tool." -- "Specify a Docker image for a tool with `DockerRequirement` in the `hints` -section." ---- -[Docker][docker] containers simplify software installation by providing a -complete known-good runtime for software and its dependencies. However, -containers are also purposefully isolated from the host system, so in -order to run a tool inside a Docker container there is additional work to -ensure that input files are available inside the container and output -files can be recovered from the container. A CWL runner can perform this work -automatically, allowing you to use Docker to simplify your software -management while avoiding the complexity of invoking and managing Docker -containers. - -One of the responsibilities of the CWL runner is to adjust the paths of -input files to reflect the location where they appear inside the container. - - -This example runs a simple Node.js script inside a Docker container which will -then print "Hello World" to the standard output. - -*docker.cwl* - -~~~ -{% include cwl/07-containers/docker.cwl %} -~~~ -{: .source} - -*docker-job.yml* - -~~~ -{% include cwl/07-containers/docker-job.yml %} -~~~ -{: .source} - -Before we run this, lets just break it down and see what some bits do. Most of this -has been explained in previous sections, the only part that is really new is the `dockerRequirement` -section. - -~~~ -baseCommand: node -hints: - DockerRequirement: - dockerPull: node:slim -~~~ -{: .source} - -`baseCommand: node` tells CWL that we will be running this command in a container. We -then need to specify some `hints` for how to find the container we want. In this case we list -just our requirements for the docker container in `DockerRequirements`. The `dockerPull:` -parameter takes the same value that you would pass to a `docker pull` command. That is, -the name of the container image (you can even specify the tag, which is good idea for -best practises when using containers for reproducible research). In this case we have -used a container called `node:slim`. - - -Provide a "hello.js" and invoke `cwl-runner` providing the tool wrapper and the -input object on the command line: - -~~~ -$ echo "console.log(\"Hello World\");" > hello.js -$ cwl-runner docker.cwl docker-job.yml -[job docker.cwl] /tmp/tmpgugLND$ docker \ - run \ - -i \ - --volume=/tmp/tmpgugLND:/var/spool/cwl:rw \ - --volume=/tmp/tmpSs5JoN:/tmp:rw \ - --volume=/home/me/cwl/user_guide/hello.js:/var/lib/cwl/job369354770_examples/hello.js:ro \ - --workdir=/var/spool/cwl \ - --read-only=true \ - --user=1000 \ - --rm \ - --env=TMPDIR=/tmp \ - --env=HOME=/var/spool/cwl \ - node:slim \ - node \ - /var/lib/cwl/job369354770_examples/hello.js > /tmp/tmpgugLND/output.txt -[job docker.cwl] completed success -{ - "example_out": { - "location": "file:///home/me/cwl/user_guide/output.txt", - "basename": "output.txt", - "class": "File", - "checksum": "sha1$648a6a6ffffdaa0badb23b8baf90b6168dd16b3a", - "size": 12, - "path": "/home/me/cwl/user_guide/output.txt" - } -} -Final process status is success -$ cat output.txt -Hello World -~~~ -{: .output} - -Notice the CWL runner has constructed a Docker command line to run the -script. - -In this example, the path to the script `hello.js` is `/home/me/cwl/user_guide/hello.js` -outside the container but `/var/lib/cwl/job369354770_examples/hello.js` inside -the container, as reflected in the invocation of the `node` command. - - -[docker]: https://docker.io -{% include links.md %} diff --git a/_episodes/08-arguments.md b/_episodes/08-arguments.md deleted file mode 100644 index 4a35b5ad..00000000 --- a/_episodes/08-arguments.md +++ /dev/null @@ -1,95 +0,0 @@ ---- -title: "Additional Arguments and Parameters" -teaching: 10 -exercises: 0 -questions: -- "How do I specify arguments that don't require input values?" -- "How do I refer to runtime parameters?" -objectives: -- "Learn how to add additional options to a command." -- "Learn how to reference runtime parameters." -keypoints: -- "Use the `arguments` section to describe command line options that do not -correspond exactly to input parameters." -- "Runtime parameters provide information about the environment when the tool -is actually executed." -- "Runtime parameters are referred under the `runtime` namespace." ---- -Sometimes tools require additional command line options that don't -correspond exactly to input parameters. - -In this example, we will wrap the Java compiler to compile a java source -file to a class file. By default, "javac" will create the class files in -the same directory as the source file. However, CWL input files (and the -directories in which they appear) may be read-only, so we need to -instruct "javac" to write the class file to the designated output directory -instead. - -*arguments.cwl* - -~~~ -{% include cwl/08-arguments/arguments.cwl %} -~~~ -{: .source} - -*arguments-job.yml* - -~~~ -{% include cwl/08-arguments/arguments-job.yml %} -~~~ -{: .source} - -Now create a sample Java file and invoke `cwl-runner` providing the tool wrapper -and the input object on the command line: - -~~~ -$ echo "public class Hello {}" > Hello.java -$ cwl-runner arguments.cwl arguments-job.yml -[job arguments.cwl] /tmp/tmpwYALo1$ docker \ - run \ - -i \ - --volume=/home/peter/work/common-workflow-language/v1.0/examples/Hello.java:/var/lib/cwl/stg8939ac04-7443-4990-a518-1855b2322141/Hello.java:ro \ - --volume=/tmp/tmpwYALo1:/var/spool/cwl:rw \ - --volume=/tmp/tmpptIAJ8:/tmp:rw \ - --workdir=/var/spool/cwl \ - --read-only=true \ - --user=1001 \ - --rm \ - --env=TMPDIR=/tmp \ - --env=HOME=/var/spool/cwl \ - openjdk:9.0.1-11-slim \ - javac \ - -d \ - /var/spool/cwl \ - /var/lib/cwl/stg8939ac04-7443-4990-a518-1855b2322141/Hello.java -Final process status is success -{ - "classfile": { - "size": 416, - "location": "/home/example/Hello.class", - "checksum": "sha1$2f7ac33c1f3aac3f1fec7b936b6562422c85b38a", - "class": "File" - } -} - -~~~ -{: .output} - -Here we use the `arguments` field to add an additional argument to the -command line that isn't tied to a specific input parameter. - -~~~ -arguments: ["-d", $(runtime.outdir)] -~~~ -{: .source} - -This example references a runtime parameter. Runtime parameters provide -information about the hardware or software environment when the tool is -actually executed. The `$(runtime.outdir)` parameter is the path to the -designated output directory. Other parameters include `$(runtime.tmpdir)`, -`$(runtime.ram)`, `$(runtime.cores)`, `$(runtime.outdirSize)`, and -`$(runtime.tmpdirSize)`. See the [Runtime Environment][runtime] section of the -CWL specification for details. - -[runtime]: https://www.commonwl.org/v1.0/CommandLineTool.html#Runtime_environment -{% include links.md %} diff --git a/_episodes/09-array-inputs.md b/_episodes/09-array-inputs.md deleted file mode 100644 index 96626cb4..00000000 --- a/_episodes/09-array-inputs.md +++ /dev/null @@ -1,83 +0,0 @@ ---- -title: "Array Inputs" -teaching: 10 -exercises: 0 -questions: -- "How do I provide multiple values for a single argument?" -objectives: -- "Learn how to provide parameter arrays as input to a tool." -- "Learn how to control the organization of array parameters on the command -line." -keypoints: -- "Array parameter definitions are nested under the `type` field with -`type: array`." -- "The appearance of array parameters on the command line differs depending on -with the `inputBinding` field is provided in the description." -- "Use the `itemSeparator` field to control concatenatation of array -parameters." ---- -It is easy to add arrays of input parameters represented to the command -line. There are two ways to specify an array parameter. First is to provide -`type` field with `type: array` and `items` defining the valid data types -that may appear in the array. Alternatively, brackets `[]` may be added after -the type name to indicate that input parameter is array of that type. - -*array-inputs.cwl* - -~~~ -{% include cwl/09-array-inputs/array-inputs.cwl %} -~~~ -{: .source} - -*array-inputs-job.yml* - -~~~ -{% include cwl/09-array-inputs/array-inputs-job.yml %} -~~~ -{: .source} - -Now invoke `cwl-runner` providing the tool wrapper and the input object -on the command line: - -~~~ -$ cwl-runner array-inputs.cwl array-inputs-job.yml -[job array-inputs.cwl] /home/examples$ echo \ - -A \ - one \ - two \ - three \ - -B=four \ - -B=five \ - -B=six \ - -C=seven,eight,nine > /home/examples/output.txt -[job array-inputs.cwl] completed success -{ - "example_out": { - "location": "file:///home/examples/output.txt", - "basename": "output.txt", - "class": "File", - "checksum": "sha1$91038e29452bc77dcd21edef90a15075f3071540", - "size": 60, - "path": "/home/examples/output.txt" - } -} -Final process status is success -$ cat output.txt --A one two three -B=four -B=five -B=six -C=seven,eight,nine -~~~ -{: .output} - -The `inputBinding` can appear either on the outer array parameter definition -or the inner array element definition, and these produce different behavior when -constructing the command line, as shown above. -In addition, the `itemSeparator` field, if provided, specifies that array -values should be concatenated into a single argument separated by the item -separator string. - -Note that the arrays of inputs are specified inside square brackets `[]` in `array-inputs-job.yml`. Arrays can also be expressed over multiple lines, where -array values that are not defined with an associated key are marked by a leading `-`. -This will be demonstrated in the next lesson -and is discussed in more detail in the [YAML Guide]({{ page.root }}{% link _extras/yaml.md %}#arrays). -You can specify arrays of arrays, arrays of records, and other complex types. - -{% include links.md %} diff --git a/_episodes/10-array-outputs.md b/_episodes/10-array-outputs.md deleted file mode 100644 index 678c2343..00000000 --- a/_episodes/10-array-outputs.md +++ /dev/null @@ -1,62 +0,0 @@ ---- -title: "Array Outputs" -teaching: 10 -exercises: 0 -questions: -- "What do I do when a tool produces output in more than one file?" -- "How do I specify which output files should be kept?" -objectives: -- "Learn how to create arrays of output files." -keypoints: -- "You can capture multiple output files into an array of files using `glob`." -- "Use wildcards and filenames to specify the output files that will be returned -after tool execution." ---- -You can also capture multiple output files into an array of files using `glob`. - -*array-outputs.cwl* - -~~~ -{% include cwl/10-array-outputs/array-outputs.cwl %} -~~~ -{: .source} - -*array-outputs-job.yml* - -~~~ -{% include cwl/10-array-outputs/array-outputs-job.yml %} -~~~ -{: .source} - -Now invoke `cwl-runner` providing the tool wrapper and the input object -on the command line: - -~~~ -$ cwl-runner array-outputs.cwl array-outputs-job.yml -[job 140190876078160] /home/example$ touch foo.txt bar.dat baz.txt -Final process status is success -{ - "output": [ - { - "size": 0, - "location": "foo.txt", - "checksum": "sha1$da39a3ee5e6b4b0d3255bfef95601890afd80709", - "class": "File" - }, - { - "size": 0, - "location": "baz.txt", - "checksum": "sha1$da39a3ee5e6b4b0d3255bfef95601890afd80709", - "class": "File" - } - ] -} -~~~ -{: .output} - -As described in the [YAML Guide]({{ page.root }}{% link _extras/yaml.md %}#arrays), -the array of expected outputs is specified in `array-outputs-job.yml` with each -entry marked by a leading `-`. This format can also be used in CWL descriptions -to mark entries in arrays, as demonstrated in several of the upcoming sections. - -{% include links.md %} diff --git a/_episodes/11-records.md b/_episodes/11-records.md deleted file mode 100644 index ccd6ba49..00000000 --- a/_episodes/11-records.md +++ /dev/null @@ -1,117 +0,0 @@ ---- -title: "Advanced Inputs" -teaching: 10 -exercises: 0 -questions: -- "How do I describe which parameters must and must not be used in combination?" -objectives: -- "Learn how to use records to describe the relationships between inputs." -keypoints: -- "Use the `record` field to group parameters together." -- "Multiple `record`s within the same parameter description are treated as -exclusive." ---- -Sometimes an underlying tool has several arguments that must be provided -together (they are dependent) or several arguments that cannot be provided -together (they are exclusive). You can use records and type unions to group -parameters together to describe these two conditions. - -*record.cwl* - -~~~ -{% include cwl/11-records/record.cwl %} -~~~ -{: .source} - -*record-job1.yml* - -~~~ -{% include cwl/11-records/record-job1.yml %} -~~~ -{: .source} - -~~~ -$ cwl-runner record.cwl record-job1.yml -Workflow error, try again with --debug for more information: -Invalid job input record: -record-job1.yml:1:1: the `dependent_parameters` field is not valid because - missing required field `itemB` -~~~ -{: .output} - -In the first example, you can't provide `itemA` without also providing `itemB`. - -*record-job2.yml* - -~~~ -{% include cwl/11-records/record-job2.yml %} -~~~ -{: .source} - -~~~ -$ cwl-runner record.cwl record-job2.yml -record-job2.yml:6:3: invalid field `itemD`, expected one of: 'itemC' -[job record.cwl] /home/example$ echo \ - -A \ - one \ - -B \ - two \ - -C \ - three > /home/example/output.txt -[job record.cwl] completed success -{ - "example_out": { - "location": "file:///home/example/11-records/output.txt", - "basename": "output.txt", - "class": "File", - "checksum": "sha1$329fe3b598fed0dfd40f511522eaf386edb2d077", - "size": 23, - "path": "/home/example/output.txt" - } -} -Final process status is success -$ cat output.txt --A one -B two -C three -~~~ -{: .output} - -In the second example, `itemC` and `itemD` are exclusive, so only `itemC` -is added to the command line and `itemD` is ignored. - -*record-job3.yml* - -~~~ -{% include cwl/11-records/record-job3.yml %} -~~~ -{: .source} - -~~~ -$ cwl-runner record.cwl record-job3.yml -[job record.cwl] /home/example$ echo \ - -A \ - one \ - -B \ - two \ - -D \ - four > /home/example/output.txt -[job record.cwl] completed success -{ - "example_out": { - "location": "file:///home/example/output.txt", - "basename": "output.txt", - "class": "File", - "checksum": "sha1$77f572b28e441240a5e30eb14f1d300bcc13a3b4", - "size": 22, - "path": "/home/example/output.txt" - } -} -Final process status is success -$ cat output.txt --A one -B two -D four -~~~ -{: .output} - -In the third example, only `itemD` is provided, so it appears on the -command line. - -{% include links.md %} diff --git a/_episodes/12-env.md b/_episodes/12-env.md deleted file mode 100644 index 4b8c6c17..00000000 --- a/_episodes/12-env.md +++ /dev/null @@ -1,58 +0,0 @@ ---- -title: "Environment Variables" -teaching: 10 -exercises: 0 -questions: -- "How do I set the value of environment variables for a tool's execution?" -objectives: -- "Learn how to pass environment variables to a tool's runtime." -keypoints: -- "Tools run in a restricted environment with a minimal set of environment -variables." -- "Use the `EnvVarRequirement` field to set environment variables inside a -tool's environment." ---- -Tools run in a restricted environment and do not inherit most environment -variables from the parent process. You can set environment variables for -the tool using `EnvVarRequirement`. - -*env.cwl* - -~~~ -{% include cwl/12-env/env.cwl %} -~~~ -{: .source} - -*echo-job.yml* - -~~~ -{% include cwl/12-env/echo-job.yml %} -~~~ -{: .source} - -Now invoke `cwl-runner` with the tool wrapper and the input object on the -command line: - -~~~ -$ cwl-runner env.cwl echo-job.yml -[job env.cwl] /home/example$ env > /home/example/output.txt -[job env.cwl] completed success -{ - "example_out": { - "location": "file:///home/example/output.txt", - "basename": "output.txt", - "class": "File", - "checksum": "sha1$1ca16a840b14807b2fd3323022c476b06a150e2f", - "size": 94, - "path": "/home/example/output.txt" - } -} -Final process status is success -$ cat output.txt -HELLO=Hello world! -PATH=/bin:/usr/bin:/usr/local/bin -HOME=/home/example -TMPDIR=/tmp/tmp63Obpk -~~~ -{: .output} -{% include links.md %} diff --git a/_episodes/13-expressions.md b/_episodes/13-expressions.md deleted file mode 100644 index bf169b59..00000000 --- a/_episodes/13-expressions.md +++ /dev/null @@ -1,157 +0,0 @@ ---- -title: "JavaScript Expressions" -teaching: 10 -exercises: 0 -questions: -- "What do I do when I want to create values dynamically and CWL doesn't -provide a built-in way of doing so?" -objectives: -- "Learn how to insert JavaScript expressions into a CWL description." -keypoints: -- "If `InlineJavascriptRequirement` is specified, you can include JavaScript -expressions that will be evaluated by the CWL runner." -- "Expressions are only valid in certain fields." -- "Expressions should only be used when no built in CWL solution exists." ---- -If you need to manipulate input parameters, include the requirement -`InlineJavascriptRequirement` and then anywhere a parameter reference is -legal you can provide a fragment of Javascript that will be evaluated by -the CWL runner. - -__Note: JavaScript expressions should only be used when absolutely necessary. -When manipulating file names, extensions, paths etc, consider whether one of the -[built in `File` properties][file-prop] like `basename`, `nameroot`, `nameext`, -etc, could be used instead. -See the [list of recommended practices][rec-practices].__ - -*expression.cwl* - -~~~ -{% include cwl/13-expressions/expression.cwl %} -~~~ -{: .source} - -As this tool does not require any `inputs` we can run it with an (almost) empty -job file: - -*empty.yml* - -~~~ -{% include cwl/13-expressions/empty.yml %} -~~~ -{: .source} - -`empty.yml` contains a description of an empty JSON object. JSON objects -descriptions are contained inside curly brackets `{}`, so an empty object is -represented simply by a set of empty brackets. - -We can then run `expression.cwl`: - -~~~ -$ cwl-runner expression.cwl empty.yml -[job expression.cwl] /home/example$ echo \ - -A \ - 2 \ - -B \ - baz \ - -C \ - 10 \ - 9 \ - 8 \ - 7 \ - 6 \ - 5 \ - 4 \ - 3 \ - 2 \ - 1 > /home/example/output.txt -[job expression.cwl] completed success -{ - "example_out": { - "location": "file:///home/example/output.txt", - "basename": "output.txt", - "class": "File", - "checksum": "sha1$a739a6ff72d660d32111265e508ed2fc91f01a7c", - "size": 36, - "path": "/home/example/output.txt" - } -} -Final process status is success -$ cat output.txt --A 2 -B baz -C 10 9 8 7 6 5 4 3 2 1 -~~~ -{: .output} - -Note that requirements can be provided with the map syntax, as in the example above: - -~~~ -requirements: - InlineJavascriptRequirement: {} -~~~ -{: .source} - -Or as an array, with each entry (in this case, only `class: InlineJavascriptRequirement`) marked by a `-`. -The same syntax is used to describe the additional command line arguments. - -~~~ -requirements: - - class: InlineJavascriptRequirement -~~~ -{: .source} - -> ## Where are JavaScript expressions allowed? -> Just like [parameter references]({{ page.root }}{% link _episodes/06-params.md %}), you can use JavaScript Expressions -> only in certain fields. These are: -> -> - From [`CommandLineTool`](https://www.commonwl.org/v1.0/CommandLineTool.html#CommandLineTool) -> - `arguments` -> - `valueFrom` -> - `stdin` -> - `stdout` -> - `stderr` -> - From [CommandInputParameter](https://www.commonwl.org/v1.0/CommandLineTool.html#CommandInputParameter) -> - `format` -> - `secondaryFiles` -> - From [`inputBinding`](https://www.commonwl.org/v1.0/CommandLineTool.html#CommandLineBinding) -> - `valueFrom` -> - From [CommandOutputParamater](https://www.commonwl.org/v1.0/CommandLineTool.html#CommandOutputParameter) -> - `format` -> - `secondaryFiles` -> - From [CommandOutputBinding](https://www.commonwl.org/v1.0/CommandLineTool.html#CommandOutputBinding) -> - `glob` -> - `outputEval` -> - From `Workflow` -> - From [InputParameter](https://www.commonwl.org/v1.0/Workflow.html#InputParameter) and [WorkflowOutputParameter](https://www.commonwl.org/v1.0/Workflow.html#WorkflowOutputParameter) -> - `format` -> - `secondaryFiles` -> - From `steps` -> - From [WorkflowStepInput](https://www.commonwl.org/v1.0/Workflow.html#WorkflowStepInput) -> - `valueFrom` -> - From [ExpressionTool](https://www.commonwl.org/v1.0/Workflow.html#ExpressionTool) -> - `expression` -> - From [InputParameter](https://www.commonwl.org/v1.0/Workflow.html#InputParameter) and [ExpressionToolOutputParameter](https://www.commonwl.org/v1.0/Workflow.html#ExpressionToolOutputParameter) -> - `format` -> - `secondaryFiles` -> - From [`ResourceRequirement`](https://www.commonwl.org/v1.0/CommandLineTool.html#ResourceRequirement) -> - `coresMin` -> - `coresMax` -> - `ramMin` -> - `ramMax` -> - `tmpdirMin` -> - `tmpdirMax` -> - `outdirMin` -> - `outdirMax` -> - From [`InitialWorkDirRequirement`](https://www.commonwl.org/v1.0/CommandLineTool.html#InitialWorkDirRequirement) -> - `listing` -> - in [Dirent](https://www.commonwl.org/v1.0/CommandLineTool.html#Dirent) -> - `entry` -> - `entryname` -> - From `EnvVarRequirement` -> - From [EnvironmentDef](https://www.commonwl.org/v1.0/CommandLineTool.html#EnvironmentDef) -> - `envValue` -{: .callout } - - -[file-prop]: https://www.commonwl.org/v1.0/CommandLineTool.html#File -[rec-practices]: https://www.commonwl.org/user_guide/rec-practices/ -{% include links.md %} diff --git a/_episodes/14-runtime.md b/_episodes/14-runtime.md deleted file mode 100644 index 32d17f6a..00000000 --- a/_episodes/14-runtime.md +++ /dev/null @@ -1,93 +0,0 @@ ---- -title: "Creating Files at Runtime" -teaching: 10 -exercises: 0 -questions: -- "How do I create required input files from input parameters at runtime?" -- "How do I invoke a script rather than just a simple command line?" -- "Besides `inputBinding`, how else can I pass arguments to the tool?" -objectives: -- "Learn how to create files on the fly during runtime." -- "Learn how to use expressions in bash scripts." -keypoints: -- "Use `InitialWorkDirRequirement` to specify input files that need to be -created during tool runtime." ---- -Sometimes you need to create a file on the fly from input parameters, -such as tools which expect to read their input configuration from a file -rather than the command line parameters, or need a small wrapper shell script. - -To generate such files we can use the `InitialWorkDirRequirement`. - -*createfile.cwl* - -~~~ -{% include cwl/14-runtime/createfile.cwl %} -~~~ -{: .source} - -Any [expressions](../13-expressions/index.html) like `$(inputs.message)` are -expanded by the CWL engine before creating the file; -here inserting the value at the input `message`. - -> ## Tip -> The _CWL expressions_ are independent of any _shell variables_ -used later during command line tool invocation. That means that any genuine -need for the character `$` must be **escaped** with `\`, -for instance `\${PREFIX}` above is expanded to `${PREFIX}` in the generated file -to be evaluated by the shell script instead of the CWL engine. -{: .callout} - -To test the above CWL tool use this job to provide the input value `message`: - -*echo-job.yml* - -~~~ -{% include cwl/14-runtime/echo-job.yml %} -~~~ -{: .source} - -Before we run this, lets look at each step in a little more detail. -The base command `baseCommand: ["sh", "example.sh"]` -will execute the command `sh example.sh`. -This will run the file we create in the shell. - -`InitialWorkDirRequirement` requires a `listing`. -As the `listing` is a YAML array we need a `-` on the first line of -each element of the array, in this case we have just one element. -`entryname:` can have any value, -but it must match what was specified in the `baseCommand`. -The final part is `entry:`, this is followed by `|-` -which is YAML quoting syntax, and means that you are using a multiline string -(without it we would need to write the whole script on one line). -(see the [YAML Guide]({{ page.root }}{% link _extras/yaml.md %}#maps) -for more about the formating) - -Now invoke `cwl-runner` with the tool wrapper and the input object on the -command line: - -~~~ -$ cwl-runner createfile.cwl echo-job.yml -[job createfile.cwl] /private/tmp/docker_tmphrqxxcdl$ sh \ - example.sh > /private/tmp/docker_tmphrqxxcdl/output.txt -Could not collect memory usage, job ended before monitoring began. -[job createfile.cwl] completed success -{ - "example_out": { - "location": "file:///home/example/output.txt", - "basename": "output.txt", - "class": "File", - "checksum": "sha1$9045abe4bd04dd8ccfe50c6ff61820b784b64aa7", - "size": 25, - "path": "/home/example/output.txt" - } -} -Final process status is success -$ cat output.txt -Message is: Hello world! -~~~ -{: .output} - - - -{% include links.md %} diff --git a/_episodes/15-staging.md b/_episodes/15-staging.md deleted file mode 100644 index ae089987..00000000 --- a/_episodes/15-staging.md +++ /dev/null @@ -1,52 +0,0 @@ ---- -title: "Staging Input Files" -teaching: 10 -exercises: 0 -questions: -- "What can I do if a tool needs to be able to write output to the location where its input files are stored?" -objectives: -- "Learn how to handle situations where a tool expects to write output files to -the same directory as its input files." -keypoints: -- "Input files are normally kept in a read-only directory." -- "Use `InitialWorkDirRequirement` to stage input files in the working -directory." ---- -Normally, input files are located in a read-only directory separate from -the output directory. This causes problems if the underlying tool expects to -write its output files alongside the input file in the same directory. You use `InitialWorkDirRequirement` to stage input files into the output directory. -In this example, we use a JavaScript expression to extract the base name of the -input file from its leading directory path. - -*linkfile.cwl* - -~~~ -{% include cwl/15-staging/linkfile.cwl %} -~~~ -{: .source} - -*arguments-job.yml* - -~~~ -{% include cwl/15-staging/arguments-job.yml %} -~~~ -{: .source} - -Now invoke `cwl-runner` with the tool wrapper and the input object on the -command line: - -~~~ -$ cwl-runner linkfile.cwl arguments-job.yml -[job 139928309171664] /home/example$ docker run -i --volume=/home/example/Hello.java:/var/lib/cwl/job557617295_examples/Hello.java:ro --volume=/home/example:/var/spool/cwl:rw --volume=/tmp/tmpmNbApw:/tmp:rw --workdir=/var/spool/cwl --read-only=true --net=none --user=1001 --rm --env=TMPDIR=/tmp openjdk:9.0.1-11-slim javac Hello.java -Final process status is success -{ -"classfile": { - "size": 416, - "location": "/home/example/Hello.class", - "checksum": "sha1$2f7ac33c1f3aac3f1fec7b936b6562422c85b38a", - "class": "File" - } -} -~~~ -{: .output} -{% include links.md %} diff --git a/_episodes/16-file-formats.md b/_episodes/16-file-formats.md deleted file mode 100644 index 9bb0f6d1..00000000 --- a/_episodes/16-file-formats.md +++ /dev/null @@ -1,93 +0,0 @@ ---- -title: "File Formats" -teaching: 10 -exercises: 0 -questions: -- "How can I mark the required file format for input files?" -- "How can I mark the produced file format of output files?" -objectives: -- "Learn how to unambiguously specify the format of `File` objects." -keypoints: -- "You can document the expected format of input and output `File`s." -- "Once your tool is mature, we recommend specifying formats by referencing -existing ontologies e.g. EDAM." ---- -Tools and workflows can take `File` types as input and produce them as output. -We also recommend indicating the format for `File` types. This helps document -for others how to use your tool while allowing you to do some simple -type-checking when creating parameter files. - -For file formats, we recommend referencing existing ontologies (like EDAM in -our example), reference a local ontology for your institution, or do not add -a file format initially for quick development before sharing your tool with -others. You can browse existing file format listings for IANA [here][IANA] and -for EDAM [here][EDAM]. - -In the next tutorial, we explain the `$namespaces` and `$schemas` section of the -document in greater detail, so don't worry about these for now. - -Note that for added value `cwltool` can do some basic reasoning based on file -formats and warn you if there seem to be some obvious mismatches. - -*metadata_example.cwl* - -~~~ -{% include cwl/16-file-formats/metadata_example.cwl %} -~~~ -{: .source} - -The equivalent of this CWL description in command line format is: - -`wc -l /path/to/aligned_sequences.ext > output.txt` - -#### Sample Parameter Files - -Below is an example of a parameter file for the example above. We encourage -checking in working examples of parameter files for your tool. This allows -others to quickly work with your tool, starting from a "known good" -parameterization. - -*sample.yml* - -~~~ -{% include cwl/16-file-formats/sample.yml %} -~~~ -{: .source} - -___Note:___ To follow the example below, you need to download the example input file, *file-formats.bam*. The file is available from [https://github.com/common-workflow-language/user_guide/raw/gh-pages/_includes/cwl/16-file-formats/file-formats.bam -](https://github.com/common-workflow-language/user_guide/raw/gh-pages/_includes/cwl/16-file-formats/file-formats.bam) and can be downloaded e.g. via `wget`: - -~~~ -wget https://github.com/common-workflow-language/user_guide/raw/gh-pages/_includes/cwl/16-file-formats/file-formats.bam -~~~ -{: .source} - - -Now invoke `cwl-runner` with the tool wrapper and the input object on the -command line: - -~~~ -$ cwltool metadata_example.cwl sample.yml -/usr/local/bin/cwltool 1.0.20161114152756 -Resolved 'metadata_example.cwl' to 'file:///media/large_volume/testing/cwl_tutorial2/metadata_example.cwl' -[job metadata_example.cwl] /tmp/tmpNWyAd6$ /bin/sh \ - -c \ - 'wc' '-l' '/tmp/tmpBf6m9u/stge293ac74-3d42-45c9-b506-dd35ea3e6eea/file-formats.bam' > /tmp/tmpNWyAd6/output.txt -Final process status is success -{ - "report": { - "format": "http://edamontology.org/format_1964", - "checksum": "sha1$49dc5004959ba9f1d07b8c00da9c46dd802cbe79", - "basename": "output.txt", - "location": "file:///media/large_volume/testing/cwl_tutorial2/output.txt", - "path": "/media/large_volume/testing/cwl_tutorial2/output.txt", - "class": "File", - "size": 80 - } -} -~~~ -{: .output} - -[IANA]: https://www.iana.org/assignments/media-types/media-types.xhtml -[EDAM]: https://www.ebi.ac.uk/ols/ontologies/edam/terms?iri=http%3A%2F%2Fedamontology.org%2Fformat_1915 -{% include links.md %} diff --git a/_episodes/17-metadata.md b/_episodes/17-metadata.md deleted file mode 100644 index 997b5e1e..00000000 --- a/_episodes/17-metadata.md +++ /dev/null @@ -1,54 +0,0 @@ ---- -title: "Metadata and Authorship" -teaching: 10 -exercises: 0 -questions: -- "How do I make it easier for people to cite my tool descriptions?" -objectives: -- "Learn how to add authorship information and other metadata to a CWL -description." -keypoints: -- "Metadata can be provided in CWL descriptions." -- "Developers should provide a minimal amount of authorship information to -encourage correct citation." ---- -Implementation extensions not required for correct execution (for example, -fields related to GUI presentation) and metadata about the tool or workflow -itself (for example, authorship for use in citations) may be provided as -additional fields on any object. Such extensions fields (e.g. `format: edam:format_2572`) -can use a namespace prefix listed in the `$namespaces` section of the document -(e.g edam: http://edamontology.org/) as described in the [Schema Salad specification][schema-salad]. -Once you add the namespace prefix, you can access it anywhere in the document as shown below. -Otherwise one must use full URLs: `format: http://edamontology.org/format_2572`. - - -For all developers, we recommend the following minimal metadata for your tool -and workflows. This example includes metadata allowing others to cite your tool. - -*metadata_example2.cwl* - -~~~ -{% include cwl/17-metadata/metadata_example2.cwl %} -~~~ -{: .source} - -The equivalent of this CWL description in command line format is: - -`wc -l /path/to/aligned_sequences.ext > output.txt` - -#### Extended Example - -For those that are highly motivated, it is also possible to annotate your tool -with a much larger amount of metadata. This example includes EDAM ontology tags -as keywords (allowing the grouping of related tools), hints at hardware -requirements in order to use the tool, and a few more metadata fields. - -*metadata_example3.cwl* - -~~~ -{% include cwl/17-metadata/metadata_example3.cwl %} -~~~ -{: .source} - -[schema-salad]: https://www.commonwl.org/v1.0/SchemaSalad.html#Explicit_context -{% include links.md %} diff --git a/_episodes/19-custom-types.md b/_episodes/19-custom-types.md deleted file mode 100644 index e024a92c..00000000 --- a/_episodes/19-custom-types.md +++ /dev/null @@ -1,101 +0,0 @@ ---- -title: "Custom Types" -teaching: 10 -exercises: 0 -questions: -- "How do I create and import my own custom types into a CWL description?" -objectives: -- "Learn how to write custom CWL object types." -- "Learn how to import these custom objects into a tool description." -keypoints: -- "You can create your own custom types to load into descriptions." -- "These custom types allow the user to configure the behaviour of a tool - without tinkering directly with the tool description." -- "Custom types are described in separate YAML files and imported as needed." ---- - -Sometimes you may want to write your own custom types for use and reuse in CWL -descriptions. Use of such custom types can reduce redundancy between multiple -descriptions that all use the same type, and also allow for additional -customisation/configuration of a tool/analysis without the need to fiddle with -the CWL description directly. - -The example below is a CWL description of the [biom convert format][biom] tool for -converting a standard biom table file to hd5 format. - -*custom-types.cwl* - -~~~ -{% include cwl/19-custom-types/custom-types.cwl %} -~~~ -{: .source} - -*custom-types.yml* - -~~~ -{% include cwl/19-custom-types/custom-types.yml %} -~~~ -{: .source} - -___Note:___ To follow the example below, you need to download the example input file, *rich_sparse_otu_table.biom*. The file is available from [https://raw.githubusercontent.com/common-workflow-language/user_guide/gh-pages/_includes/cwl/19-custom-types/rich_sparse_otu_table.biom](https://raw.githubusercontent.com/common-workflow-language/user_guide/gh-pages/_includes/cwl/19-custom-types/rich_sparse_otu_table.biom) and can be downloaded e.g. via `wget`: - -~~~ -wget https://raw.githubusercontent.com/common-workflow-language/user_guide/gh-pages/_includes/cwl/19-custom-types/rich_sparse_otu_table.biom -~~~ -{: .source} - -On line 29, in `inputs:table_type`, a list of allowable table options to be used in the -table conversion are imported as a custom object: - -``` -inputs: - biom: - type: File - format: edam:format_3746 # BIOM - inputBinding: - prefix: --input-fp - table_type: - type: biom-convert-table.yaml#table_type - inputBinding: - prefix: --table-type -``` -{: .source} - -The reference to a custom type is a combination of the name of the file in which -the object is defined (`biom-convert-table.yaml`) and the name of the object -within that file (`table_type`) that defines the custom type. In this case the `symbols` -array from the imported `biom-convert-table.yaml` file define the allowable table options. -For example, in `custom-types.yml`, we pass `OTU table` as an `input` that -tells the tool to create an OTU table in hd5 format. - -The contents of the YAML file describing the custom type are given below: - -~~~ -{% include cwl/19-custom-types/biom-convert-table.yaml %} -~~~ -{: .source} - -In order for the custom type to be used in the CWL description, it must be -imported. Imports are described in `requirements:SchemaDefRequirement`, as -below in the example `custom-types.cwl` description: - -``` -requirements: - InlineJavascriptRequirement: {} - ResourceRequirement: - coresMax: 1 - ramMin: 100 - SchemaDefRequirement: - types: - - $import: biom-convert-table.yaml -``` -{: .source} - -Note also that the author of this CWL description has also included -`ResourceRequirement`s, specifying the minimum amount of RAM and number of cores -required for the tool to run successfully, as well as details of the version of -the software that the description was written for and other useful metadata. -These features are discussed further in other chapters of this user guide. - -[biom]: http://biom-format.org/ -{% include links.md %} diff --git a/_episodes/20-software-requirements.md b/_episodes/20-software-requirements.md deleted file mode 100644 index 807ddd3e..00000000 --- a/_episodes/20-software-requirements.md +++ /dev/null @@ -1,60 +0,0 @@ ---- -title: "Specifying Software Requirements" -teaching: 10 -exercises: 0 -questions: -- "How do I specify requirements/dependencies for a job?" -- "What level of detail should I provide for a software requirement?" -objectives: -- "Learn how to write software requirement descriptions." -- "Learn how to use SciCrunch to retrieve a unique identifier for a tool/version -that is required." -keypoints: -- "Software requirements should be specified under `hints:SoftwareRequirement`." ---- -Often tool descriptions will be written for a specific version of a software. To -make it easier for others to use your descriptions, you can include a -`SoftwareRequirement` field in the `hints` section. -This may also help to avoid confusion about which version of a tool the -description was written for. - -~~~ -{% include cwl/20-software-requirements/custom-types.cwl %} -~~~ -{: .source} - -In this example, the software requirement being described is InterProScan -version 5.21-60. - -~~~ -hints: - SoftwareRequirement: - packages: - interproscan: - specs: [ "https://identifiers.org/rrid/RRID:SCR_005829" ] - version: [ "5.21-60" ] -~~~ -{: .source} - -Depending on your CWL runner, these hints may be used to check -that required software is installed and available before the job is run. To enable -these checks with the reference implementation, use the [dependency resolvers configuration][dependencies]. - -As well as a version number, a unique resource identifier (URI) for the tool is -given in the form of an [RRID][rrid]. Resources with RRIDs can be looked up in the -[SciCrunch][scicrunch] registry, which provides a portal for finding, tracking, -and referring to scientific resources consistently. If you want to specify a -tool as a `SoftwareRequirement`, search for the tool on SciCrunch and use the -RRID that it has been assigned in the registry. (Follow [this tutorial][scicrunch-add-tool] -if you want to add a tool to SciCrunch.) You can use this RRID to refer -to the tool (via [identifiers.org][identifiers]) in the `specs` field of your -requirement description. Other good choices, in order of preference, are to -include the DOI for the main tool citation and the URL to the tool. - - -[rrid]: https://scicrunch.org/resources/about/resource -[scicrunch]: https://scicrunch.org/ -[dependencies]: https://github.com/common-workflow-language/cwltool#leveraging-softwarerequirements-beta -[identifiers]: https://identifiers.org/ -[scicrunch-add-tool]: https://scicrunch.org/page/tutorials/336 -{% include links.md %} diff --git a/_episodes/21-1st-workflow.md b/_episodes/21-1st-workflow.md deleted file mode 100644 index a633e727..00000000 --- a/_episodes/21-1st-workflow.md +++ /dev/null @@ -1,148 +0,0 @@ ---- -title: "Writing Workflows" -teaching: 10 -exercises: 0 -questions: -- "How do I connect tools together into a workflow?" -objectives: -- "Learn how to construct workflows from multiple CWL tool descriptions." -keypoints: -- "Each step in a workflow must have its own CWL description." -- "Top level inputs and outputs of the workflow are described in the `inputs` -and `outputs` fields respectively." -- "The steps are specified under `steps`." -- "Execution order is determined by the connections between steps." ---- -This workflow extracts a java source file from a tar file and then -compiles it. - -*1st-workflow.cwl* - -~~~ -{% include cwl/21-1st-workflow/1st-workflow.cwl %} -~~~ -{: .source} - -> ## Visualization of 1st-workflow.cwl -> Visualization of 1st-workflow.cwl -{: .callout} - -Use a YAML or a JSON object in a separate file to describe the input of a run: - -*1st-workflow-job.yml* - -~~~ -{% include cwl/21-1st-workflow/1st-workflow-job.yml %} -~~~ -{: .source} - -Now invoke `cwl-runner` with the tool wrapper and the input object on the -command line: - -~~~ -$ echo "public class Hello {}" > Hello.java && tar -cvf hello.tar Hello.java -$ cwl-runner 1st-workflow.cwl 1st-workflow-job.yml -[job untar] /tmp/tmp94qFiM$ tar --create --file /home/example/hello.tar Hello.java -[step untar] completion status is success -[job compile] /tmp/tmpu1iaKL$ docker run -i --volume=/tmp/tmp94qFiM/Hello.java:/var/lib/cwl/job301600808_tmp94qFiM/Hello.java:ro --volume=/tmp/tmpu1iaKL:/var/spool/cwl:rw --volume=/tmp/tmpfZnNdR:/tmp:rw --workdir=/var/spool/cwl --read-only=true --net=none --user=1001 --rm --env=TMPDIR=/tmp java:7 javac -d /var/spool/cwl /var/lib/cwl/job301600808_tmp94qFiM/Hello.java -[step compile] completion status is success -[workflow 1st-workflow.cwl] outdir is /home/example -Final process status is success -{ - "compiled_class": { - "location": "/home/example/Hello.class", - "checksum": "sha1$e68df795c0686e9aa1a1195536bd900f5f417b18", - "class": "File", - "size": 416 - } -} -~~~ -{: .output} - -What's going on here? Let's break it down: - -~~~ -cwlVersion: v1.0 -class: Workflow -~~~ -{: .source} - -The `cwlVersion` field indicates the version of the CWL spec used by the -document. The `class` field indicates this document describes a workflow. - - -~~~ -inputs: - tarball: File - name_of_file_to_extract: string -~~~ -{: .source} - -The `inputs` section describes the inputs of the workflow. This is a -list of input parameters where each parameter consists of an identifier -and a data type. These parameters can be used as sources for input to -specific workflows steps. - -~~~ -outputs: - compiled_class: - type: File - outputSource: compile/classfile -~~~ -{: .source} - -The `outputs` section describes the outputs of the workflow. This is a -list of output parameters where each parameter consists of an identifier -and a data type. The `outputSource` connects the output parameter `classfile` -of the `compile` step to the workflow output parameter `compiled_class`. - -~~~ -steps: - untar: - run: tar-param.cwl - in: - tarfile: tarball - extractfile: name_of_file_to_extract - out: [extracted_file] -~~~ -{: .source} - -The `steps` section describes the actual steps of the workflow. In this -example, the first step extracts a file from a tar file, and the second -step compiles the file from the first step using the java compiler. -Workflow steps are not necessarily run in the order they are listed, -instead the order is determined by the dependencies between steps (using -`source`). In addition, workflow steps which do not depend on one -another may run in parallel. - -The first step, `untar` runs `tar-param.cwl` (described previously in -[Parameter References]({{ page.root }}{% link _episodes/06-params.md %})). -This tool has two input parameters, `tarfile` and `extractfile` and one output -parameter `extracted_file`. - -The ``in`` section of the workflow step connects these two input parameters to -the inputs of the workflow, `tarball` and `name_of_file_to_extract` using -`source`. This means that when the workflow step is executed, the values -assigned to `tarball` and `name_of_file_to_extract` will be used for the -parameters `tarfile` and `extractfile` in order to run the tool. - -The `out` section of the workflow step lists the output parameters that are -expected from the tool. - -~~~ - compile: - run: arguments.cwl - in: - src: untar/extracted_file - out: [classfile] -~~~ -{: .source} - -The second step `compile` depends on the results from the first step by -connecting the input parameter `src` to the output parameter of `untar` using -`untar/extracted_file`. It runs `arguments.cwl` (described previously in -[Additional Arguments and Parameters]({{ page.root }}{% link _episodes/08-arguments.md %})). -The output of this step `classfile` is connected to the -`outputs` section for the Workflow, described above. - -{% include links.md %} diff --git a/_episodes/22-nested-workflows.md b/_episodes/22-nested-workflows.md deleted file mode 100644 index b461003a..00000000 --- a/_episodes/22-nested-workflows.md +++ /dev/null @@ -1,134 +0,0 @@ ---- -title: "Nested Workflows" -teaching: 10 -exercises: 0 -questions: -- "How do I connect multiple workflows together?" -objectives: -- "Learn how to construct nested workflows from multiple CWL workflow -descriptions." -keypoints: -- "A workflow can be used as a step in another workflow, if the workflow engine -supports the `SubworkflowFeatureRequirement`." -- "The workflows are specified under `steps`, with the worklow's description -file provided as the value to the `run` field." -- "Use `default` to specify a default value for a field, which can be -overwritten by a value in the input object." -- "Use `>` to ignore newlines in long commands split over multiple lines." ---- -Workflows are ways to combine multiple tools to perform a larger operations. -We can also think of a workflow as being a tool itself; a CWL workflow can be -used as a step in another CWL workflow, if the workflow engine supports the -`SubworkflowFeatureRequirement`: - - -~~~ -requirements: - SubworkflowFeatureRequirement: {} -~~~ -{: .source} - -Here's an example workflow that uses our `1st-workflow.cwl` as a nested -workflow: - -*nestedworkflows.cwl* - -~~~ -{% include cwl/22-nested-workflows/nestedworkflows.cwl %} -~~~ -{: .source} - -> ## Visualization of the workflow and the inner workflow from its `compile` step -> This two-step workflow starts with the `create-tar` step which is connected to -> the `compile` step in orange; `compile` is another workflow, diagrammed on the -> right. In purple we see the fixed string `"Hello.java"` being supplied as the -> `name_of_file_to_extract`. -> -> -> -{: .callout} - -A CWL `Workflow` can be used as a `step` just like a `CommandLineTool`, its CWL -file is included with `run`. The workflow inputs (`tarball` and `name_of_file_to_extract`) and outputs -(`compiled_class`) then can be mapped to become the step's input/outputs. - -~~~ - compile: - run: 1st-workflow.cwl - in: - tarball: create-tar/tar_compressed_java_file - name_of_file_to_extract: - default: "Hello.java" - out: [compiled_class] -~~~ -{: .source} - -Our `1st-workflow.cwl` was parameterized with workflow inputs, so when running -it we had to provide a job file to denote the tar file and `*.java` filename. -This is generally best-practice, as it means it can be reused in multiple parent -workflows, or even in multiple steps within the same workflow. - -Here we use `default:` to hard-code `"Hello.java"` as the `name_of_file_to_extract` -input, however our workflow also requires a tar file at `tarball`, which we will -prepare in the `create-tar` step. At this point it is probably a good idea to refactor -`1st-workflow.cwl` to have more specific input/output names, as those also -appear in its usage as a tool. - -It is also possible to do a less generic approach and avoid external -dependencies in the job file. So in this workflow we can generate a hard-coded -`Hello.java` file using the previously mentioned `InitialWorkDirRequirement` -requirement, before adding it to a tar file. - -~~~ - create-tar: - requirements: - InitialWorkDirRequirement: - listing: - - entryname: Hello.java - entry: | - public class Hello { - public static void main(String[] argv) { - System.out.println("Hello from Java"); - } - } -~~~ -{: .source} - -In this case our step can assume `Hello.java` rather than be parameterized, so -we can use hardcoded values `hello.tar` and `Hello.java` in a `baseCommand` and -the resulting `outputs`: - -~~~ - run: - class: CommandLineTool - inputs: [] - baseCommand: [tar, --create, --file=hello.tar, Hello.java] - outputs: - tar_compressed_java_file: - type: File - streamable: true - outputBinding: - glob: "hello.tar" -~~~ -{: .source} - -Did you notice that we didn't split out the `tar --create` tool to a separate file, -but rather embedded it within the CWL Workflow file? This is generally not best -practice, as the tool then can't be reused. The reason for doing it in this case -is because the command line is hard-coded with filenames that only make sense -within this workflow. - -In this example we had to prepare a tar file outside, but only because our inner -workflow was designed to take that as an input. A better refactoring of the -inner workflow would be to take a list of Java files to compile, which would -simplify its usage as a tool step in other workflows. - -Nested workflows can be a powerful feature to generate higher-level functional -and reusable workflow units - but just like for creating a CWL Tool description, -care must be taken to improve its usability in multiple workflows. - -{% include links.md %} diff --git a/_episodes/23-scatter-workflow.md b/_episodes/23-scatter-workflow.md deleted file mode 100644 index bea0ba75..00000000 --- a/_episodes/23-scatter-workflow.md +++ /dev/null @@ -1,172 +0,0 @@ ---- -title: "Scattering Workflows" -teaching: 10 -exercises: 0 -questions: -- "How do I run tools or workflows in parallel?" -objectives: -- "Learn how to create workflows that can run a step over a list of inputs." -keypoints: -- "A workflow can scatter over an input array in a step of a workflow, if the workflow engine -supports the `ScatterFeatureRequirement`." -- The `scatter` field is specified for each step you want to scatter -- The `scatter` field references the step level inputs, not the workflow inputs -- Scatter runs on each step specified independently ---- -Now that we know how to write workflows, we can start utilizing the `ScatterFeatureRequirement`. -This feature tells the runner that you wish to run a tool or workflow multiple times over a list -of inputs. The workflow then takes the input(s) as an array and will run the specified step(s) -on each element of the array as if it were a single input. This allows you to run the same workflow -on multiple inputs without having to generate many different commands or input yaml files. - -~~~ -requirements: - ScatterFeatureRequirement: {} -~~~ -{: .source} - -The most common reason a new user might want to use scatter is to perform the same analysis on -different samples. Let's start with a simple workflow that calls our first example and takes -an array of strings as input to the workflow: - -*scatter-workflow.cwl* - -~~~ -{% include cwl/23-scatter-workflow/scatter-workflow.cwl %} -~~~ -{: .source} - -Aside from the `requirements` section including `ScatterFeatureRequirement`, what is -going on here? - -~~~ -inputs: - message_array: string[] -~~~ -{: .source} - -First of all, notice that the main workflow level input here requires an array of strings. - -~~~ -steps: - echo: - run: 1st-tool.cwl - scatter: message - in: - message: message_array - out: [] -~~~ -{: .source} - -Here we've added a new field to the step `echo` called `scatter`. This field tells the -runner that we'd like to scatter over this input for this particular step. Note that -the input name listed after scatter is the one of the step's input, not a workflow level input. - -For our first scatter, it's as simple as that! Since our tool doesn't collect any outputs, we -still use `outputs: []` in our workflow, but if you expect that the final output of your -workflow will now have multiple outputs to collect, be sure to update that to an array type -as well! - -Using the following input file: - -*scatter-job.yml* - -~~~ -{% include cwl/23-scatter-workflow/scatter-job.yml %} -~~~ -{: .source} - -As a reminder, `1st-tool.cwl` simply calls the command `echo` on a message. If we invoke -`cwl-runner scatter-workflow.cwl scatter-job.yml` on the command line: - -~~~ -$ cwl-runner scatter-workflow.cwl scatter-job.yml -[workflow scatter-workflow.cwl] start -[step echo] start -[job echo] /tmp/tmp0hqmg400$ echo \ - 'Hello world!' -Hello world! -[job echo] completed success -[step echo] start -[job echo_2] /tmp/tmpu65_m1zw$ echo \ - 'Hola mundo!' -Hola mundo! -[job echo_2] completed success -[step echo] start -[job echo_3] /tmp/tmp5cs7a2wh$ echo \ - 'Bonjour le monde!' -Bonjour le monde! -[job echo_3] completed success -[step echo] start -[job echo_4] /tmp/tmp301wo7p8$ echo \ - 'Hallo welt!' -Hallo welt! -[job echo_4] completed success -[step echo] completed success -[workflow scatter-workflow.cwl] completed success -{} -Final process status is success -~~~ -{: .output} - -You can see that the workflow calls echo multiple times on each element of our -`message_array`. Ok, so how about if we want to scatter over two steps in a workflow? - -Let's perform a simple echo like above, but capturing `stdout` by adding the following -lines instead of `outputs: []` - -*1st-tool-mod.cwl* - -~~~ -outputs: - echo_out: - type: stdout -~~~ -{: .source} - -And add a second step that uses `wc` to count the characters in each file. See the tool -below: - -*wc-tool.cwl* - -~~~ -{% include cwl/23-scatter-workflow/wc-tool.cwl %} -~~~ -{: .source} - -Now, how do we incorporate scatter? Remember the scatter field is under each step: - -*scatter-two-steps.cwl* - -~~~ -{% include cwl/23-scatter-workflow/scatter-two-steps.cwl %} -~~~ -{: .source} - -Here we have placed the scatter field under each step. This is fine for this example since -it runs quickly, but if you're running many samples for a more complex workflow, you may -wish to consider an alternative. Here we are running scatter on each step independently, but -since the second step is not dependent on the first step completing all languages, we aren't -using the scatter functionality efficiently. The second step expects an array as input from -the first step, so it will wait until everything in step one is finished before doing anything. -Pretend that `echo Hello World!` takes 1 minute to perform, `wc -c` on the output takes 3 minutes -and that `echo Hallo welt!` takes 5 minutes to perform, and `wc` on that output takes 3 minutes. -Even though `echo Hello World!` could finish in 4 minutes, it will actually finish in 8 minutes -because the first step must wait on `echo Hallo welt!`. You can see how this might not scale -well. - -Ok, so how do we scatter on steps that can proceed independent of other samples? Remember from -[chapter 21]({{ page.root }}/22-nested-workflows/), that we can make an entire workflow a single step in another workflow! Convert our -two step workflow to a single step subworkflow: - -*scatter-nested-workflow.cwl* - -~~~ -{% include cwl/23-scatter-workflow/scatter-nested-workflow.cwl %} -~~~ -{: .source} - -Now the scatter acts on a single step, but that step consists of two steps so each step is performed -in parallel. - -{% include links.md %} diff --git a/_episodes/24_conditional-workflow.md b/_episodes/24_conditional-workflow.md deleted file mode 100644 index a5373b20..00000000 --- a/_episodes/24_conditional-workflow.md +++ /dev/null @@ -1,132 +0,0 @@ ---- -title: "Conditional workflows" -teaching: 24 -exercises: 0 -questions: -- "How do you write workflows with conditions?" -objectives: -- "Learn how to construct workflows containing conditional steps." -keypoints: -- "" ---- -This workflow contains a conditional step and is executed based on the input. -This allows workflows to skip additional steps based on input parameters given at the start of the program or by previous steps. - -*conditional-workflow.cwl* - -``` -class: Workflow -cwlVersion: v1.2 -inputs: - val: int - -steps: - - step1: - in: - in1: val - a_new_var: val - run: foo.cwl - when: $(inputs.in1 < 1) - out: [out1] - - step2: - in: - in1: val - a_new_var: val - run: foo.cwl - when: $(inputs.a_new_var > 2) - out: [out1] - -outputs: - out1: - type: string - outputSource: - - step1/out1 - - step2/out1 - pickValue: first_non_null - -requirements: - InlineJavascriptRequirement: {} - MultipleInputFeatureRequirement: {} -``` - -The first thing you'll notice is that this workflow is only compatible for version 1.2 or greater of the CWL standards. - -``` -class: Workflow -cwlVersion: v1.2 -``` - -The first step of the worklfow (step1) contains two input properties and will execute foo.cwl when the conditions are met. The new property `when` is where the condition validation takes place. In this case only when `in1` from the workflow contains a value `< 1` this step will be executed. - -``` -steps: - - step1: - in: - in1: val - a_new_var: val - run: foo.cwl - when: $(inputs.in1 < 1) - out: [out1] -``` - -Using the following command `cwltool cond-wf-003.1.cwl --val 0` the value will pass the first conditional step and will therefor be executed and is shown in the log by `INFO [step step1] start` whereas the second step is skipped as indicated by `INFO [step step2] will be skipped`. - -``` -INFO [workflow ] start -INFO [workflow ] starting step step1 -INFO [step step1] start -INFO [job step1] /private/tmp/docker_tmpdcyoto2d$ echo - -INFO [job step1] completed success -INFO [step step1] completed success -INFO [workflow ] starting step step2 -INFO [step step2] will be skipped -INFO [step step2] completed skipped -INFO [workflow ] completed success -{ - "out1": "foo 0" -} -INFO Final process status is success -``` - -When a value of 3 is given the first conditional step will not be executed but the second step will `cwltool cond-wf-003.1.cwl --val 3`. - -``` -INFO [workflow ] start -INFO [workflow ] starting step step1 -INFO [step step1] will be skipped -INFO [step step1] completed skipped -INFO [workflow ] starting step step2 -INFO [step step2] start -INFO [job step2] /private/tmp/docker_tmpqwr93mxx$ echo - -INFO [job step2] completed success -INFO [step step2] completed success -INFO [workflow ] completed success -{ - "out1": "foo 3" -} -INFO Final process status is success -``` - -If no conditions are met for example when using `--val 2` the workflow will raise a permanentFail. - -``` -cwltool cond-wf-003.1.cwl --val 2 - -INFO [workflow ] start -INFO [workflow ] starting step step1 -INFO [step step1] will be skipped -INFO [step step1] completed skipped -INFO [workflow ] starting step step2 -INFO [step step2] will be skipped -INFO [step step2] completed skipped -ERROR [workflow ] Cannot collect workflow output: All sources for 'out1' are null -INFO [workflow ] completed permanentFail -WARNING Final process status is permanentFail -``` - -{% include links.md %} diff --git a/_episodes_rmd/.gitkeep b/_episodes_rmd/.gitkeep deleted file mode 100644 index e69de29b..00000000 diff --git a/_episodes_rmd/data/.gitkeep b/_episodes_rmd/data/.gitkeep deleted file mode 100644 index e69de29b..00000000 diff --git a/_extras/.gitkeep b/_extras/.gitkeep deleted file mode 100644 index e69de29b..00000000 diff --git a/_extras/miscellaneous.md b/_extras/miscellaneous.md deleted file mode 100644 index 91271839..00000000 --- a/_extras/miscellaneous.md +++ /dev/null @@ -1,384 +0,0 @@ ---- -layout: page -title: Miscellaneous -permalink: /misc/ ---- - -This is a collection of examples and short notes -about some operations that fall outside the scope of the User Guide -and/or have not yet been implemented in a clean way in the CWL standards. - -### Non "`File`" types using `evalFrom` - -```yaml -cwlVersion: v1.0 # or v1.1 -class: CommandLineTool -requirements: - InlineJavascriptRequirement: {} - -baseCommand: [ echo, "42" ] - -inputs: [] - -stdout: my_number.txt - -outputs: - my_number: - type: int - outputBinding: - glob: my_number.txt - loadContents: True - outputEval: $(parselnt(self[0].contents)) - - my_number_as_string: - type: string - outputBinding: - glob: my_number.txt - loadContents: True - outputEval: $(self[0].contents) -``` - -### Rename an input file - -This example shows how you can change the name of an input file -as part of a tool description. -This could be useful when you are taking files produced from another -step in a workflow and don't want to work with the default names that these -files were given when they were created. - -```yaml -requirements: - InitialWorkDirRequirement: - listing: - - entry: $(inputs.src1) - entryName: newName - - entry: $(inputs.src2) - entryName: $(inputs.src1.basename)_custom_extension -``` - -### Rename an output file - -This example shows how you can change the name an output file -from the default name given to it by a tool: - -```yaml -cwlVersion: v1.0 # or v1.1 -class: CommandLineTool -requirements: - InlineJavascriptRequirement: {} - -baseCommand: [] - -inputs: [] - -outputs: - otu_table: - type: File - outputBinding: - glob: otu_table.txt - outputEval: ${self[0].basename=inputs.otu_table_name; return self;} -``` - -### Setting `self`-based input bindings for optional inputs - -Currently, `cwltool` can't cope with missing optional inputs if their -input binding makes use of `self`. -Below is an example workaround for this, -pending a more sophisticated fix. - -```yaml -#!/usr/bin/env cwl-runner -cwlVersion: v1.0 -class: CommandLineTool - -requirements: { InlineJavascriptRequirement: {} } - -inputs: - cfg: - type: File? - inputBinding: - prefix: -cfg - valueFrom: | - ${ if(self === null) { return null;} else { return self.basename; } } - -baseCommand: echo - -outputs: [] -``` - -### Model a "one-or-the-other" parameter - -Below is an example of how -you can specify different strings to be added to a command line -based on the value given to a Boolean parameter. - -```yaml -cwlVersion: v1.0 -class: CommandLineTool -requirements: - InlineJavascriptRequirement: {} -inputs: - fancy_bool: - type: boolean - default: false # or true - inputBinding: - valueFrom: ${if (self) { return "foo";} else { return "bar";}} - -baseCommand: echo - -outputs: [] -``` - -### Connect a solo value to an input that expects an array of that type - -Using [`MultipleInputFeatureRequirement`](https://www.commonwl.org/v1.0/Workflow.html#MultipleInputFeatureRequirement) -along with -[`linkMerge: merge_nested`](https://www.commonwl.org/v1.0/Workflow.html#WorkflowStepInput) - -> merge_nested -> -> The input must be an array consisting of exactly one entry for each input link. -> If "merge_nested" is specified with a single link, the value from the link must be wrapped in a single-item list. - -Which means "create a list with exactly these sources as elements" - -Or in other words: if the destination is of type `File[]` (an array of `File`s) -and the source is a single `File` then add `MultipleInputFeatureRequirement` to the Workflow level `requirements` -and add `linkMerge: merge_nested` under the appropriate `in` entry of the destination step. - -```yaml -cwlVersion: v1.0 -class: Workflow - -requirements: - MultipleInputFeatureRequirement: {} - -inputs: - readme: File - -steps: - first: - run: tests/checker_wf/cat.cwl - in: - cat_in: # type is File[] - source: [ readme ] # but the source is of type File - linkMerge: merge_nested - out: [txt] - -outputs: - result: - type: File - outputSource: first/txt -``` -### Optional Inputs 💯 - -To make an input parameter optional, add a question mark to the type declaration. - -```yaml -inputs: - InputRead1: - type: File - inputBinding: - position: 100 - - #Optional Inputs - isCasava: - type: boolean? - inputBinding: - position: 1 - prefix: "--casava" -``` - -### Enum Inputs ⚜️ - -For commandline flags that require a specific input as the argument an enum type can be declared in CWL. **Specifying null here is known as long form style. It does the same thing as the question mark on the other inputs.** - -```yaml -Format: - type: - - "null" - - type: enum - symbols: - - bam - - sam - - bam_mapped - - sam_mapped - - fastq - inputBinding: - position: 2 - prefix: "--format" -``` - -### Record Inputs 📀 - -For commandline flags that are either **mutually exclusive** or **dependent** a special record type can be defined. You can also specify null here to create optional inputs. - -```yaml -#Using record inputs to create mutually exclusive inputs - - Strand: - type: - - "null" - - type: record - name: forward - fields: - forward: - type: boolean - inputBinding: - prefix: "--fr-stranded" - - - type: record - name: reverse - fields: - reverse: - type: boolean - inputBinding: - prefix: "--rf-stranded" - - PseudoBam: - type: boolean? - inputBinding: - prefix: "--pseudobam" - -#Using record inputs to create dependent inputs - - GenomeBam: - type: - - "null" - - type: record - name: genome_bam - fields: - genomebam: - type: boolean - inputBinding: - prefix: "--genomebam" - - gtf: - type: File - inputBinding: - prefix: "--gtf" - - chromosomes: - type: File - inputBinding: - prefix: "--chromosomes" -``` -### Setting Mutually Exclusive Parameters - -In order to properly set fields in a record input type, you need to pass a dictionary to the input to properly set the parameters. This is done by using inline javascript and returning the dictionary with the key of the field you want to set. The source field is set to indicate the input from the workflow to be used as the value. - -```yaml -steps: - - build_hisat2_index: - run: ../Tools/Hisat2-Index.cwl - in: - InputFiles: - source: FastaFiles - valueFrom : | - ${return {"fasta": self};} - - IndexName: IndexName - - out: [indexes] -``` - -### Setting Booleans - -These can be set by using the default field -```yaml -input: - default:true -``` -### Concating Strings in Inputs - -The valueFrom field must be used instead of default. - -```yaml -input: - valueFrom: | - My String: $(input.stringvalue) -``` - -### `cwltool` errors due to filenames with space characters inside - -`cwltool` does not allow some characters in filenames by default. - -For example, the filename is `a space is here.txt` includes 3 space characters. - -```console -ERROR Workflow error, try again with --debug for more information: - -Invalid filename: 'a space is here.txt' contains illegal characters -``` - -If you can not avoid these dangerous characters, then pass `--relax-path-checks` to `cwltool`. - -### CWL Parameter Reference error due to hyphen in input identifier - -If `cwltool --validate` returns valid - -```console -$ cwltool --validate cwl/qiime.cwl -INFO /usr/local/bin/cwltool 1.0.20190831161204 -INFO Resolved 'cwl/qiime.cwl' to 'file:///workspace/cwl/qiime.cwl' -cwl/qiime.cwl is valid CWL. -``` - -But executing it causes an error like: - -```console -$ cwltool cwl/qiime.cwl --sample-input metadata.tsv -INFO /usr/local/bin/cwltool 1.0.20190831161204 -INFO Resolved 'cwl/qiime.cwl' to 'file:///workspace/cwl/qiime.cwl' -ERROR Workflow error, try again with --debug for more information: -cwl/qiime.cwl:14:5: Expression evaluation error: - Syntax error in parameter reference '(inputs.sample-input)'. This could be due - to using Javascript code without specifying InlineJavascriptRequirement. -``` - -The file is here - -```cwl -cwlVersion: v1.0 -class: CommandLineTool -baseCommand: [qiime, metadata, tabulate] -arguments: - - prefix: --m-input-file - valueFrom: $(inputs.sample-input) -inputs: - sample-input: File -outputs: [] -``` - -Problem caused by `-` (hyphen character). - -```cwl -valueFrom: $(inputs.sample-input) - # ^ this is problem -... - -inputs: - sample-input: File - # ^ this is problem -``` - - -Fix this error is change `-` (hyphen) to `_` (underscore) - -```cwl -valueFrom: $(inputs.sample_input) - # ^ changed here - -... - -inputs: - sample_input: File - # ^ changed here -``` - -If is not possible to change the input identifier, then you can use an alternative CWL Parameter Reference syntax: - -```cwl -valueFrom: $(inputs["sample-input"]) -``` diff --git a/_extras/recommended-practices.md b/_extras/recommended-practices.md deleted file mode 100644 index 5e203699..00000000 --- a/_extras/recommended-practices.md +++ /dev/null @@ -1,104 +0,0 @@ ---- -layout: page -title: "Recommended Practices" -permalink: /rec-practices/ ---- - -Below are a set of recommended good practices to keep in mind when writing a -Common Workflow Language description for a tool or workflow. These guidelines -are presented for consideration on a scale of usefulness: more is better, not -all are required. - -☐ No `type: string` parameters for names of input or reference -files/directories; use `type: File` or `type: Directory` as appropriate. - -☐ Include a license that allows for re-use by anyone, e.g. -[Apache 2.0][apache-license]. If possible, the license should be specified with -its corresponding [SPDX identifier][spdx]. Construct the metadata field for the -licence by providing a URL of the form `https://spdx.org/licenses/[SPDX-ID]` -where `SPDX-ID` is the taken from the list of identifiers linked above. See the -example snippet below for guidance. For non-standard licenses without an SPDX -identifier, provide a URL to the license. - -_Example of metadata field for license with SPDX identifier:_ -~~~ -$namespaces: - s: https://schema.org/ -s:license: https://spdx.org/licenses/Apache-2.0 -# other s: declarations -~~~ -{: .source} - -For more examples of providing metadata within CWL descriptions, see the -[Metadata and Authorship section]({{ page.root }}{% link _episodes/17-metadata.md %}) -of this User Guide. - -☐ Include [attribution information][license-example] for the author(s) of -the CWL tool or workflow description. Use unambiguous identifiers like -[ORCID][orcid]. - -☐ In tool descriptions, list dependencies using short name(s) under -`SoftwareRequirement`. - -☐ Include [SciCrunch][scicrunch] identifiers for dependencies in -`https://identifiers.org/rrid/RRID:SCR_NNNNNN` format. - -☐ All `input` and `output` identifiers should reflect their conceptual -identity. Use informative names like `unaligned_sequences`, `reference_genome`, -`phylogeny`, or `aligned_sequences` instead of `foo_input`, `foo_file`, -`result`, `input`, `output`, and so forth. - -☐ In tool descriptions, include a list of version(s) of the tool that are -known to work with this description under `SoftwareRequirement`. - -☐ `format` should be specified for all input and output `File`s. -Bioinformatics tools should use format identifiers from [EDAM][edam-example]. -See also `iana:text/plain`, `iana:text/tab-separated-values` with -`$namespaces: { iana: "https://www.iana.org/assignments/media-types/" }`. -[Full IANA media type list][iana-types] (also known as MIME types). For -non-bioinformatics tools use or build an appropriate ontology/controlled -vocabulary in the same way. Please edit this page to let us know about it. - -☐ Mark all input and output `File`s that are read from or written to in a -streaming compatible way (only once, no random-access), as `streamable: true`. - -☐ Each `CommandLineTool` description should focus on a single operation -only, even if the (sub)command is capable of more. Don't overcomplicate your -tool descriptions with options that you don't need/use. - -☐ Custom types should be defined with one external YAML per type -definition for re-use. - -☐ Include a top level short `label` summarising the tool/workflow. - -☐ If useful, include a top level `doc` as well. This should provide a -longer, more detailed description than was provided in the top level `label` -(see above). - -☐ Use `type: enum` instead of `type: string` for elements with a fixed -list of valid values. - -☐ Evaluate all use of JavaScript for possible elimination or replacement. -One common example: manipulating `File` names and paths? Consider whether one -of the [built in `File` properties][file-prop] like `basename`, `nameroot`, -`nameext`, etc, could be used instead. - -☐ Give the tool description to a colleague (preferably at a different -institution) to test and provide feedback. - -☐ Complex workflows with individual components which can be abstracted -should utilise the [`SubworkflowFeatureRequirement`][subworkflow] to make their -workflow modular and allow sections of them to be easily reused. - -☐ Software containers should be made to be conformant to the ["Recommendations for the packaging and containerizing of bioinformatics software"][containers] (also useful to other disciplines). - -[containers]: https://doi.org/10.12688/f1000research.15140.1 -[apache-license]: https://spdx.org/licenses/Apache-2.0.html -[license-example]: https://github.com/ProteinsWebTeam/ebi-metagenomics-cwl/blob/master/workflows/emg-assembly.cwl#L200 -[scicrunch]: https://scicrunch.org -[edam-example]: http://edamontology.org/format_1915 -[iana-types]: https://www.iana.org/assignments/media-types/media-types.xhtml -[file-prop]: https://www.commonwl.org/v1.0/CommandLineTool.html#File -[orcid]: https://orcid.org -[subworkflow]: https://www.commonwl.org/v1.0/Workflow.html#SubworkflowFeatureRequirement -[spdx]: https://spdx.org/licenses/ diff --git a/_extras/yaml.md b/_extras/yaml.md deleted file mode 100644 index e92a239d..00000000 --- a/_extras/yaml.md +++ /dev/null @@ -1,202 +0,0 @@ ---- -layout: page -title: "YAML Guide" -permalink: /yaml/ ---- - - - - -[YAML][yaml] is a file format -designed to be readable by both computers and humans. -This guide introduces the features of YAML -relevant when writing CWL descriptions and input parameter files. - -### Contents - -- [Key-Value Pairs]({{ page.root }}{% link _extras/yaml.md %}#key-value-pairs) -- [Comments]({{ page.root }}{% link _extras/yaml.md %}#comments) -- [Maps]({{ page.root }}{% link _extras/yaml.md %}#maps) -- [Arrays]({{ page.root }}{% link _extras/yaml.md %}#arrays) -- [JSON Style]({{ page.root }}{% link _extras/yaml.md %}#json-style) - -### Key-Value Pairs - -Fundamentally, a file written in YAML consists of a set of _key-value pairs_. -Each pair is written as `key: value`, -where whitespace after the `:` is optional. -Key names in CWL files should not contain whitespace - -We use [_camelCase_][camelCase] for multi-word key names -that have special meaning in the CWL specification -and underscored key names otherwise. -For example: - -```yaml -first_name: Bilbo -last_name: Baggins -age_years: 111 -home: Bag End, Hobbiton -``` - -The YAML above defines four keys - -`first_name`, `last_name`, `age_years`, and `home` - -with their four respective values. -Values can be -character strings, -numeric (integer, floating point, or scientfic representation), -Boolean (`true` or `false`), -or more complex nested types (see below). - -Values may be wrapped in quotation marks -but be aware that this may change the way that they are interpreted -i.e. `"1234"` will be treated as a character string -, while `1234` will be treated as an integer. -This distinction can be important, -for example when describing parameters to a command: -in CWL all parts of `baseCommand` must be strings so, -if you want to specify a fixed numeric value to a command, -make sure that you wrap that numeric value in quotes: `baseCommand: [echo, "42"]`. - -### Comments - -You may use `#` to add comments to your CWL and parameter files. -Any characters to the right of ` #` will be ignored by the program interpreting -the YAML. -For example: - -```yaml -first_name: Bilbo -last_name: Baggins -age_years: 111 -# this line will be ignored by the interpreter -home: Bag End, Hobbiton # this is ignored too -``` - -If there is anything on the line before the comment, -be sure to add at least one space before the `#`! - -### Maps - -When describing a tool or workflow with CWL, -it is usually necessary to construct more complex, nested representations. -Called _maps_, -these hierarchical structures are described in YAML by providing -additional key-value pairs as the value of any key. -These pairs (sometimes referred to as "children") are written -on new lines under the key to which they belong (the "parent"), -and should be indented with two spaces -(⇥tab characters are not allowed). -For example: - -```yaml -cwlVersion: v1.0 -class: CommandLineTool -baseCommand: echo -inputs: # this key has an object value - example_flag: # so does this one - type: boolean - inputBinding: # and this one too - position: 1 - prefix: -f -``` - -The YAML above illustrates how you can build up complex nested object -descriptions relatively quickly. -The `inputs` map contains a single key, `example_flag`, -which itself contains two keys, `type` and `inputBinding`, -while one of these children, `inputBinding`, -contains a further two key-value pairs (`position` and `prefix`). -See the [Arrays](#arrays) section below for more information about providing multiple -values/key-value pairs for a single key. -For comparison with the example YAML above, -here is a graphical representation of the `inputs` object it describes. - -
-graph TD - inputs --> example_flag - example_flag --> type - type --- bool((boolean)) - example_flag --> inputBinding - inputBinding --> position - inputBinding --> prefix - position --- posval((1)) - prefix --- prefval(('-f')) -
- -### Arrays - -In certain circumstances it is necessary to provide -multiple values or objects for a single key. -As we've already seen in the [Maps](#Maps) section above, -more than one key-value pair can be mapped to a single key. -However, it is also possible to define multiple values for a key -without having to provide a unique key for each value. -We can achieve this with an _array_, -where each value is defined on its own line and preceded by `-`. -For example: - -```yaml -touchfiles: - - foo.txt - - bar.dat - - baz.txt -``` - -and a more complex example combining maps and arrays: - -```yaml -exclusive_parameters: - type: - - type: record - name: itemC - fields: - itemC: - type: string - inputBinding: - prefix: -C - - type: record - name: itemD - fields: - itemD: - type: string - inputBinding: - prefix: -D -``` - -### JSON Style - -YAML is based on [JavaScript Object Notation (JSON)][json] -and maps and arrays can also be defined in YAML using the native JSON syntax. -For example: - -```yaml -touchfiles: [foo.txt, bar.dat, baz.txt] # equivalent to first Arrays example -``` - -and: - -```yaml -# equivalent to the `inputs` example in "Maps" above -inputs: {example_flag: {type: boolean, inputBinding: {position: 1, prefix: -f}}} -``` - -Native JSON can be useful -to indicate where a field is being left intentionally empty -(such as `[]` for an empty array), -and where it makes more sense -for the values to be located on the same line -(such as when providing option flags and their values in a shell command). -However, as the second example above shows, -it can severely affect the readability of a YAML file -and should be used sparingly. - -### Reference - -The [Learn YAML in Y Minutes][yaml-y-mins] reference was very helpful for us -while we wrote this guide, -though it also covers features that are not valid in CWL. - -[camelCase]: https://en.wikipedia.org/wiki/Camel_case -[yaml-y-mins]: https://learnxinyminutes.com/docs/yaml/ - -{% include links.md %} diff --git a/_images/CWL-Logo-HD-cropped2.png b/_images/CWL-Logo-HD-cropped2.png new file mode 100644 index 00000000..f7df48db Binary files /dev/null and b/_images/CWL-Logo-HD-cropped2.png differ diff --git a/_images/graphviz-31e64e790986643ef2b3f5e6bc28d3d39838e9be.svg b/_images/graphviz-31e64e790986643ef2b3f5e6bc28d3d39838e9be.svg new file mode 100644 index 00000000..abe1a9b5 --- /dev/null +++ b/_images/graphviz-31e64e790986643ef2b3f5e6bc28d3d39838e9be.svg @@ -0,0 +1,60 @@ + + + + + + +G + + +cluster_0 + +steps + + + +steps_0 + +Command-line tools + + + +steps_1 + +Expression tools + + + +outputs + +outputs + + + +steps_1->outputs + + + + + +steps_2 + +Sub-workflows + + + +inputs + +inputs + + + +inputs->steps_1 + + + + + diff --git a/_images/graphviz-39ddc5fddd7e5ad94f50549c8694b6091ea24ae2.svg b/_images/graphviz-39ddc5fddd7e5ad94f50549c8694b6091ea24ae2.svg new file mode 100644 index 00000000..a89729fd --- /dev/null +++ b/_images/graphviz-39ddc5fddd7e5ad94f50549c8694b6091ea24ae2.svg @@ -0,0 +1,48 @@ + + + + + + +G + + +cluster_0 + +expression + + + +expression + +JavaScript + + + +outputs + +outputs + + + +expression->outputs + + + + + +inputs + +inputs + + + +inputs->expression + + + + + diff --git a/_images/graphviz-4d746944e4b361d70c103c350377e92490136b86.svg b/_images/graphviz-4d746944e4b361d70c103c350377e92490136b86.svg new file mode 100644 index 00000000..372eb51f --- /dev/null +++ b/_images/graphviz-4d746944e4b361d70c103c350377e92490136b86.svg @@ -0,0 +1,74 @@ + + + + + + +A GraphViz graph with the CWL processing units, e.g. Process, Workflow, CommandLineTool, etc. + + + +Process + +Process + + + +n1 + + + + +Process->n1 + + + + + +CommandLineTool + +CommandLineTool + + + +ExpressionTool + +ExpressionTool + + + +Operation + +Operation + + + +Workflow + +Workflow + + + +n1->CommandLineTool + + + + +n1->ExpressionTool + + + + +n1->Operation + + + + +n1->Workflow + + + + diff --git a/_images/graphviz-50f71480e1fde5bfe7ca5afa005f8614587f43e8.svg b/_images/graphviz-50f71480e1fde5bfe7ca5afa005f8614587f43e8.svg new file mode 100644 index 00000000..588f0196 --- /dev/null +++ b/_images/graphviz-50f71480e1fde5bfe7ca5afa005f8614587f43e8.svg @@ -0,0 +1,48 @@ + + + + + + +G + + +cluster_0 + +baseCommand + + + +command + +echo + + + +outputs + +outputs + + + +command->outputs + + + + + +inputs + +inputs + + + +inputs->command + + + + + diff --git a/_images/graphviz-b2e161069f145124e4da46557a8340e408a06117.svg b/_images/graphviz-b2e161069f145124e4da46557a8340e408a06117.svg new file mode 100644 index 00000000..16a5422a --- /dev/null +++ b/_images/graphviz-b2e161069f145124e4da46557a8340e408a06117.svg @@ -0,0 +1,125 @@ + + + + + + +G + + +cluster_0 + +CWL Runners + + +cluster_1 + +Tools + + +cluster_2 + +Editors + + +cluster_3 + +Viewers + + + +cwltool + +cwltool + + + +CWL Specification + +CWL Specification + + + +cwltool->CWL Specification + + + + + +toil + +toil + + + +Arvados + +Arvados + + + +runner_others + +... + + + +vscode-cwl + +vscode-cwl + + + +CWL Viewer + +CWL Viewer + + + + +vim-cwl + +vim-cwl + + + +benten + +benten + + + +editor_others + +... + + + +And more + +And more + + + + +vue-cwl + +vue-cwl + + + +viewer_others + +... + + + +CWL Specification->vscode-cwl + + + + + diff --git a/_images/graphviz-ff6041f478840e96bfd2c9c585d00a38ab63ef99.svg b/_images/graphviz-ff6041f478840e96bfd2c9c585d00a38ab63ef99.svg new file mode 100644 index 00000000..a656a399 --- /dev/null +++ b/_images/graphviz-ff6041f478840e96bfd2c9c585d00a38ab63ef99.svg @@ -0,0 +1,48 @@ + + + + + + +G + + +cluster_inputs + +Workflow Inputs + + + +echo + +echo + + + +uppercase + +uppercase + + + +echo->uppercase + + + + + +message + +message + + + +message->echo + + + + + diff --git a/_includes/aio-script.md b/_includes/aio-script.md deleted file mode 100644 index a81fbcdd..00000000 --- a/_includes/aio-script.md +++ /dev/null @@ -1,50 +0,0 @@ -{% comment %} -As a maintainer, you don't need to edit this file. -If you notice that something doesn't work, please -open an issue: https://github.com/carpentries/styles/issues/new -{% endcomment %} - -{% include manual_episode_order.html %} - - - -{% comment %} Create an anchor for every episode. {% endcomment %} - -{% for lesson_episode in lesson_episodes %} - {% if site.episode_order %} - {% assign episode = site.episodes | where: "slug", lesson_episode | first %} - {% else %} - {% assign episode = lesson_episode %} - {% endif %} -
-{% endfor %} diff --git a/_includes/all_keypoints.html b/_includes/all_keypoints.html deleted file mode 100644 index f0abd251..00000000 --- a/_includes/all_keypoints.html +++ /dev/null @@ -1,31 +0,0 @@ -{% comment %} - Display key points of all episodes for reference. -{% endcomment %} - -{% include base_path.html %} -{% include manual_episode_order.html %} - -

Key Points

- -{% for lesson_episode in lesson_episodes %} - {% if site.episode_order %} - {% assign episode = site.episodes | where: "slug", lesson_episode | first %} - {% else %} - {% assign episode = lesson_episode %} - {% endif %} - {% unless episode.break %} - - - - - {% endunless %} -{% endfor %} -
- {{ episode.title }} - -
    - {% for keypoint in episode.keypoints %} -
  • {{ keypoint|markdownify }}
  • - {% endfor %} -
-
diff --git a/_includes/base_path.html b/_includes/base_path.html deleted file mode 100644 index 7efb3570..00000000 --- a/_includes/base_path.html +++ /dev/null @@ -1,27 +0,0 @@ -{% comment %} -This is adapted from: https://ricostacruz.com/til/relative-paths-in-jekyll - -`page.url` gives the URL of the current page with a leading /: - -- when the URL ends with the extension (e.g., /foo/bar.html) then we can get - the depth by counting the number of / and remove - 1 -- when the URL ends with a / (e.g. /foo/bar/) then the number / gives the depth - directly -{% endcomment %} - -{% assign relative_root_path = '' %} - -{% assign last_char = page.url | slice: -1 %} - -{% if last_char == "/"} -{% assign offset = 0 %} -{% else %} -{% assign offset = 1 %} -{% endif %} - -{% assign depth = page.url | split: '/' | size | minus: offset %} -{% if depth <= 1 %}{% assign relative_root_path = '.' %} -{% elsif depth == 2 %}{% assign relative_root_path = '..' %} -{% elsif depth == 3 %}{% assign relative_root_path = '../..' %} -{% elsif depth == 4 %}{% assign relative_root_path = '../../..' %} -{% endif %} diff --git a/_includes/carpentries.html b/_includes/carpentries.html deleted file mode 100644 index c032bd54..00000000 --- a/_includes/carpentries.html +++ /dev/null @@ -1,70 +0,0 @@ -{% comment %} - General description of Software, Data, and Library Carpentry. -{% endcomment %} - -{% include base_path.html %} - -
-
- The Carpentries logo -
-
-

The Carpentries comprises - Software Carpentry, Data Carpentry, and Library Carpentry communities of Instructors, Trainers, - Maintainers, helpers, and supporters who share a mission to teach - foundational coding and data science skills to researchers and people - working in library- and information-related roles. In January, - 2018, The Carpentries was formed by the merger of Software Carpentry and - Data Carpentry. Library Carpentry became an official Carpentries Lesson Program in November 2018.

- -

While individual lessons and workshops continue to be run under each - lesson project, The Carpentries provide overall staffing and governance, as - well as support for assessment, instructor training and mentoring. - Memberships are joint, and the Carpentries project maintains a shared Code - of Conduct. The Carpentries is a fiscally sponsored project of Community - Initiatives, a registered 501(c)3 non-profit based in California, USA.

-
-
-
-
- Software Carpentry logo -
-
-

Since 1998, Software Carpentry has - been teaching researchers across all disciplines the foundational coding - skills they need to get more done in less time and with less pain. Its - volunteer instructors have run hundreds of events for thousands of learners - around the world. Now that all research involves some degree of - computational work, whether with big data, cloud computing, or simple task - automation, these skills are needed more than ever.

-
-
-
-
-
- Data Carpentry logo -
-
-

Data Carpentry develops and teaches - workshops on the fundamental data skills needed to conduct research. Its - target audience is researchers who have little to no prior computational - experience, and its lessons are domain specific, building on learners' - existing knowledge to enable them to quickly apply skills learned to their - own research. Data Carpentry workshops take researchers through the entire - data life cycle.

-
-
-
-
-
- Library Carpentry logo -
-
-

Library Carpentry develops lessons and - teaches workshops for and with people working in library- and - information-related roles. Its goal is to create an on-ramp to empower this - community to use software and data in their own work, as well as be - advocates for and train others in efficient, effective and reproducible data - and software practices.

-
-
diff --git a/_includes/cwl/02-1st-example/1st-tool.cwl b/_includes/cwl/02-1st-example/1st-tool.cwl deleted file mode 100755 index 1d550fc2..00000000 --- a/_includes/cwl/02-1st-example/1st-tool.cwl +++ /dev/null @@ -1,11 +0,0 @@ -#!/usr/bin/env cwl-runner - -cwlVersion: v1.0 -class: CommandLineTool -baseCommand: echo -inputs: - message: - type: string - inputBinding: - position: 1 -outputs: [] diff --git a/_includes/cwl/02-1st-example/echo-job.yml b/_includes/cwl/02-1st-example/echo-job.yml deleted file mode 100755 index 5329e737..00000000 --- a/_includes/cwl/02-1st-example/echo-job.yml +++ /dev/null @@ -1 +0,0 @@ -message: Hello world! diff --git a/_includes/cwl/03-input/inp-job.yml b/_includes/cwl/03-input/inp-job.yml deleted file mode 100644 index 14871b7a..00000000 --- a/_includes/cwl/03-input/inp-job.yml +++ /dev/null @@ -1,6 +0,0 @@ -example_flag: true -example_string: hello -example_int: 42 -example_file: - class: File - path: whale.txt diff --git a/_includes/cwl/03-input/inp.cwl b/_includes/cwl/03-input/inp.cwl deleted file mode 100755 index 576c16da..00000000 --- a/_includes/cwl/03-input/inp.cwl +++ /dev/null @@ -1,30 +0,0 @@ -#!/usr/bin/env cwl-runner - -cwlVersion: v1.0 -class: CommandLineTool -baseCommand: echo -inputs: - example_flag: - type: boolean - inputBinding: - position: 1 - prefix: -f - example_string: - type: string - inputBinding: - position: 3 - prefix: --example-string - example_int: - type: int - inputBinding: - position: 2 - prefix: -i - separate: false - example_file: - type: File? - inputBinding: - prefix: --file= - separate: false - position: 4 - -outputs: [] diff --git a/_includes/cwl/03-input/whale.txt b/_includes/cwl/03-input/whale.txt deleted file mode 100644 index e69de29b..00000000 diff --git a/_includes/cwl/04-output/hello.tar b/_includes/cwl/04-output/hello.tar deleted file mode 100644 index 155f6e60..00000000 Binary files a/_includes/cwl/04-output/hello.tar and /dev/null differ diff --git a/_includes/cwl/04-output/tar-job.yml b/_includes/cwl/04-output/tar-job.yml deleted file mode 100644 index da76e853..00000000 --- a/_includes/cwl/04-output/tar-job.yml +++ /dev/null @@ -1,3 +0,0 @@ -tarfile: - class: File - path: hello.tar diff --git a/_includes/cwl/04-output/tar.cwl b/_includes/cwl/04-output/tar.cwl deleted file mode 100644 index f1b45964..00000000 --- a/_includes/cwl/04-output/tar.cwl +++ /dev/null @@ -1,15 +0,0 @@ -#!/usr/bin/env cwl-runner - -cwlVersion: v1.0 -class: CommandLineTool -baseCommand: [tar, --extract] -inputs: - tarfile: - type: File - inputBinding: - prefix: --file -outputs: - example_out: - type: File - outputBinding: - glob: hello.txt diff --git a/_includes/cwl/05-stdout/echo-job.yml b/_includes/cwl/05-stdout/echo-job.yml deleted file mode 100755 index 5329e737..00000000 --- a/_includes/cwl/05-stdout/echo-job.yml +++ /dev/null @@ -1 +0,0 @@ -message: Hello world! diff --git a/_includes/cwl/05-stdout/stdout.cwl b/_includes/cwl/05-stdout/stdout.cwl deleted file mode 100755 index 5908f88f..00000000 --- a/_includes/cwl/05-stdout/stdout.cwl +++ /dev/null @@ -1,14 +0,0 @@ -#!/usr/bin/env cwl-runner - -cwlVersion: v1.0 -class: CommandLineTool -baseCommand: echo -stdout: output.txt -inputs: - message: - type: string - inputBinding: - position: 1 -outputs: - example_out: - type: stdout diff --git a/_includes/cwl/06-params/hello.tar b/_includes/cwl/06-params/hello.tar deleted file mode 100644 index 344a03a3..00000000 Binary files a/_includes/cwl/06-params/hello.tar and /dev/null differ diff --git a/_includes/cwl/06-params/tar-param-job.yml b/_includes/cwl/06-params/tar-param-job.yml deleted file mode 100644 index 62a5c5fe..00000000 --- a/_includes/cwl/06-params/tar-param-job.yml +++ /dev/null @@ -1,4 +0,0 @@ -tarfile: - class: File - path: hello.tar -extractfile: goodbye.txt diff --git a/_includes/cwl/06-params/tar-param.cwl b/_includes/cwl/06-params/tar-param.cwl deleted file mode 100644 index 87ad9e0f..00000000 --- a/_includes/cwl/06-params/tar-param.cwl +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/env cwl-runner - -cwlVersion: v1.0 -class: CommandLineTool -baseCommand: [tar, --extract] -inputs: - tarfile: - type: File - inputBinding: - prefix: --file - extractfile: - type: string - inputBinding: - position: 1 -outputs: - extracted_file: - type: File - outputBinding: - glob: $(inputs.extractfile) diff --git a/_includes/cwl/07-containers/docker-job.yml b/_includes/cwl/07-containers/docker-job.yml deleted file mode 100644 index 373db3dd..00000000 --- a/_includes/cwl/07-containers/docker-job.yml +++ /dev/null @@ -1,3 +0,0 @@ -src: - class: File - path: hello.js diff --git a/_includes/cwl/07-containers/docker.cwl b/_includes/cwl/07-containers/docker.cwl deleted file mode 100755 index 9f6090a1..00000000 --- a/_includes/cwl/07-containers/docker.cwl +++ /dev/null @@ -1,17 +0,0 @@ -#!/usr/bin/env cwl-runner - -cwlVersion: v1.0 -class: CommandLineTool -baseCommand: node -hints: - DockerRequirement: - dockerPull: node:slim -inputs: - src: - type: File - inputBinding: - position: 1 -outputs: - example_out: - type: stdout -stdout: output.txt diff --git a/_includes/cwl/07-containers/hello.js b/_includes/cwl/07-containers/hello.js deleted file mode 100644 index accefceb..00000000 --- a/_includes/cwl/07-containers/hello.js +++ /dev/null @@ -1 +0,0 @@ -console.log("Hello World"); diff --git a/_includes/cwl/08-arguments/Hello.java b/_includes/cwl/08-arguments/Hello.java deleted file mode 100644 index 6afc99f0..00000000 --- a/_includes/cwl/08-arguments/Hello.java +++ /dev/null @@ -1 +0,0 @@ -public class Hello {} diff --git a/_includes/cwl/08-arguments/arguments-job.yml b/_includes/cwl/08-arguments/arguments-job.yml deleted file mode 100644 index 9e56989a..00000000 --- a/_includes/cwl/08-arguments/arguments-job.yml +++ /dev/null @@ -1,3 +0,0 @@ -src: - class: File - path: Hello.java diff --git a/_includes/cwl/08-arguments/arguments.cwl b/_includes/cwl/08-arguments/arguments.cwl deleted file mode 100644 index 3a2e4538..00000000 --- a/_includes/cwl/08-arguments/arguments.cwl +++ /dev/null @@ -1,20 +0,0 @@ -#!/usr/bin/env cwl-runner - -cwlVersion: v1.0 -class: CommandLineTool -label: Example trivial wrapper for Java 9 compiler -hints: - DockerRequirement: - dockerPull: openjdk:9.0.1-11-slim -baseCommand: javac -arguments: ["-d", $(runtime.outdir)] -inputs: - src: - type: File - inputBinding: - position: 1 -outputs: - classfile: - type: File - outputBinding: - glob: "*.class" diff --git a/_includes/cwl/09-array-inputs/array-inputs-job.yml b/_includes/cwl/09-array-inputs/array-inputs-job.yml deleted file mode 100644 index b9ece902..00000000 --- a/_includes/cwl/09-array-inputs/array-inputs-job.yml +++ /dev/null @@ -1,3 +0,0 @@ -filesA: [one, two, three] -filesB: [four, five, six] -filesC: [seven, eight, nine] diff --git a/_includes/cwl/09-array-inputs/array-inputs.cwl b/_includes/cwl/09-array-inputs/array-inputs.cwl deleted file mode 100755 index bef63538..00000000 --- a/_includes/cwl/09-array-inputs/array-inputs.cwl +++ /dev/null @@ -1,34 +0,0 @@ -#!/usr/bin/env cwl-runner - -cwlVersion: v1.0 -class: CommandLineTool -inputs: - filesA: - type: string[] - inputBinding: - prefix: -A - position: 1 - - filesB: - type: - type: array - items: string - inputBinding: - prefix: -B= - separate: false - inputBinding: - position: 2 - - filesC: - type: string[] - inputBinding: - prefix: -C= - itemSeparator: "," - separate: false - position: 4 - -outputs: - example_out: - type: stdout -stdout: output.txt -baseCommand: echo diff --git a/_includes/cwl/10-array-outputs/array-outputs-job.yml b/_includes/cwl/10-array-outputs/array-outputs-job.yml deleted file mode 100644 index 886b6dc0..00000000 --- a/_includes/cwl/10-array-outputs/array-outputs-job.yml +++ /dev/null @@ -1,4 +0,0 @@ -touchfiles: - - foo.txt - - bar.dat - - baz.txt diff --git a/_includes/cwl/10-array-outputs/array-outputs.cwl b/_includes/cwl/10-array-outputs/array-outputs.cwl deleted file mode 100755 index 2d6654ea..00000000 --- a/_includes/cwl/10-array-outputs/array-outputs.cwl +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/env cwl-runner - -cwlVersion: v1.0 -class: CommandLineTool -baseCommand: touch -inputs: - touchfiles: - type: - type: array - items: string - inputBinding: - position: 1 -outputs: - output: - type: - type: array - items: File - outputBinding: - glob: "*.txt" diff --git a/_includes/cwl/11-records/record-job1.yml b/_includes/cwl/11-records/record-job1.yml deleted file mode 100644 index af8b0e00..00000000 --- a/_includes/cwl/11-records/record-job1.yml +++ /dev/null @@ -1,4 +0,0 @@ -dependent_parameters: - itemA: one -exclusive_parameters: - itemC: three diff --git a/_includes/cwl/11-records/record-job2.yml b/_includes/cwl/11-records/record-job2.yml deleted file mode 100644 index 296d06f1..00000000 --- a/_includes/cwl/11-records/record-job2.yml +++ /dev/null @@ -1,6 +0,0 @@ -dependent_parameters: - itemA: one - itemB: two -exclusive_parameters: - itemC: three - itemD: four diff --git a/_includes/cwl/11-records/record-job3.yml b/_includes/cwl/11-records/record-job3.yml deleted file mode 100644 index 31b179e8..00000000 --- a/_includes/cwl/11-records/record-job3.yml +++ /dev/null @@ -1,5 +0,0 @@ -dependent_parameters: - itemA: one - itemB: two -exclusive_parameters: - itemD: four diff --git a/_includes/cwl/11-records/record.cwl b/_includes/cwl/11-records/record.cwl deleted file mode 100755 index e33cb44a..00000000 --- a/_includes/cwl/11-records/record.cwl +++ /dev/null @@ -1,39 +0,0 @@ -#!/usr/bin/env cwl-runner - -cwlVersion: v1.0 -class: CommandLineTool -inputs: - dependent_parameters: - type: - type: record - name: dependent_parameters - fields: - itemA: - type: string - inputBinding: - prefix: -A - itemB: - type: string - inputBinding: - prefix: -B - exclusive_parameters: - type: - - type: record - name: itemC - fields: - itemC: - type: string - inputBinding: - prefix: -C - - type: record - name: itemD - fields: - itemD: - type: string - inputBinding: - prefix: -D -outputs: - example_out: - type: stdout -stdout: output.txt -baseCommand: echo diff --git a/_includes/cwl/12-env/echo-job.yml b/_includes/cwl/12-env/echo-job.yml deleted file mode 100755 index 5329e737..00000000 --- a/_includes/cwl/12-env/echo-job.yml +++ /dev/null @@ -1 +0,0 @@ -message: Hello world! diff --git a/_includes/cwl/12-env/env.cwl b/_includes/cwl/12-env/env.cwl deleted file mode 100755 index 7e4d4087..00000000 --- a/_includes/cwl/12-env/env.cwl +++ /dev/null @@ -1,15 +0,0 @@ -#!/usr/bin/env cwl-runner - -cwlVersion: v1.0 -class: CommandLineTool -baseCommand: env -requirements: - EnvVarRequirement: - envDef: - HELLO: $(inputs.message) -inputs: - message: string -outputs: - example_out: - type: stdout -stdout: output.txt diff --git a/_includes/cwl/13-expressions/empty.yml b/_includes/cwl/13-expressions/empty.yml deleted file mode 100644 index 0967ef42..00000000 --- a/_includes/cwl/13-expressions/empty.yml +++ /dev/null @@ -1 +0,0 @@ -{} diff --git a/_includes/cwl/13-expressions/expression.cwl b/_includes/cwl/13-expressions/expression.cwl deleted file mode 100644 index da1e75dc..00000000 --- a/_includes/cwl/13-expressions/expression.cwl +++ /dev/null @@ -1,28 +0,0 @@ -#!/usr/bin/env cwl-runner - -cwlVersion: v1.0 -class: CommandLineTool -baseCommand: echo - -requirements: - InlineJavascriptRequirement: {} - -inputs: [] -outputs: - example_out: - type: stdout -stdout: output.txt -arguments: - - prefix: -A - valueFrom: $(1+1) - - prefix: -B - valueFrom: $("/foo/bar/baz".split('/').slice(-1)[0]) - - prefix: -C - valueFrom: | - ${ - var r = []; - for (var i = 10; i >= 1; i--) { - r.push(i); - } - return r; - } diff --git a/_includes/cwl/14-runtime/createfile.cwl b/_includes/cwl/14-runtime/createfile.cwl deleted file mode 100644 index 5e39a36f..00000000 --- a/_includes/cwl/14-runtime/createfile.cwl +++ /dev/null @@ -1,19 +0,0 @@ -class: CommandLineTool -cwlVersion: v1.0 -baseCommand: ["sh", "example.sh"] - -requirements: - InitialWorkDirRequirement: - listing: - - entryname: example.sh - entry: |- - PREFIX='Message is:' - MSG="\${PREFIX} $(inputs.message)" - echo \${MSG} - -inputs: - message: string -outputs: - example_out: - type: stdout -stdout: output.txt diff --git a/_includes/cwl/14-runtime/echo-job.yml b/_includes/cwl/14-runtime/echo-job.yml deleted file mode 100755 index 5329e737..00000000 --- a/_includes/cwl/14-runtime/echo-job.yml +++ /dev/null @@ -1 +0,0 @@ -message: Hello world! diff --git a/_includes/cwl/15-staging/Hello.java b/_includes/cwl/15-staging/Hello.java deleted file mode 100644 index 6afc99f0..00000000 --- a/_includes/cwl/15-staging/Hello.java +++ /dev/null @@ -1 +0,0 @@ -public class Hello {} diff --git a/_includes/cwl/15-staging/arguments-job.yml b/_includes/cwl/15-staging/arguments-job.yml deleted file mode 100644 index 9e56989a..00000000 --- a/_includes/cwl/15-staging/arguments-job.yml +++ /dev/null @@ -1,3 +0,0 @@ -src: - class: File - path: Hello.java diff --git a/_includes/cwl/15-staging/linkfile.cwl b/_includes/cwl/15-staging/linkfile.cwl deleted file mode 100644 index ffeb6996..00000000 --- a/_includes/cwl/15-staging/linkfile.cwl +++ /dev/null @@ -1,26 +0,0 @@ -#!/usr/bin/env cwl-runner - -cwlVersion: v1.0 -class: CommandLineTool -hints: - DockerRequirement: - dockerPull: openjdk:9.0.1-11-slim -baseCommand: javac - -requirements: - InitialWorkDirRequirement: - listing: - - $(inputs.src) - -inputs: - src: - type: File - inputBinding: - position: 1 - valueFrom: $(self.basename) - -outputs: - classfile: - type: File - outputBinding: - glob: "*.class" diff --git a/_includes/cwl/16-file-formats/file-formats.bam b/_includes/cwl/16-file-formats/file-formats.bam deleted file mode 100644 index 7a3b5102..00000000 Binary files a/_includes/cwl/16-file-formats/file-formats.bam and /dev/null differ diff --git a/_includes/cwl/16-file-formats/metadata_example.cwl b/_includes/cwl/16-file-formats/metadata_example.cwl deleted file mode 100644 index 9485522b..00000000 --- a/_includes/cwl/16-file-formats/metadata_example.cwl +++ /dev/null @@ -1,28 +0,0 @@ -#!/usr/bin/env cwl-runner -cwlVersion: v1.0 -class: CommandLineTool - -label: An example tool demonstrating metadata. - -inputs: - aligned_sequences: - type: File - label: Aligned sequences in BAM format - format: edam:format_2572 - inputBinding: - position: 1 - -baseCommand: [ wc, -l ] - -stdout: output.txt - -outputs: - report: - type: stdout - format: edam:format_1964 - label: A text file that contains a line count - -$namespaces: - edam: http://edamontology.org/ -$schemas: - - http://edamontology.org/EDAM_1.18.owl diff --git a/_includes/cwl/16-file-formats/sample.yml b/_includes/cwl/16-file-formats/sample.yml deleted file mode 100644 index 062e2e98..00000000 --- a/_includes/cwl/16-file-formats/sample.yml +++ /dev/null @@ -1,4 +0,0 @@ -aligned_sequences: - class: File - format: http://edamontology.org/format_2572 - path: file-formats.bam diff --git a/_includes/cwl/17-metadata/file-formats.bam b/_includes/cwl/17-metadata/file-formats.bam deleted file mode 100644 index 7a3b5102..00000000 Binary files a/_includes/cwl/17-metadata/file-formats.bam and /dev/null differ diff --git a/_includes/cwl/17-metadata/metadata_example2.cwl b/_includes/cwl/17-metadata/metadata_example2.cwl deleted file mode 100644 index b4921901..00000000 --- a/_includes/cwl/17-metadata/metadata_example2.cwl +++ /dev/null @@ -1,49 +0,0 @@ -#!/usr/bin/env cwl-runner -cwlVersion: v1.0 -class: CommandLineTool - -label: An example tool demonstrating metadata. -doc: Note that this is an example and the metadata is not necessarily consistent. - -inputs: - aligned_sequences: - type: File - label: Aligned sequences in BAM format - format: edam:format_2572 - inputBinding: - position: 1 - -baseCommand: [ wc, -l ] - -stdout: output.txt - -outputs: - report: - type: stdout - format: edam:format_1964 - label: A text file that contains a line count - -s:author: - - class: s:Person - s:identifier: https://orcid.org/0000-0002-6130-1021 - s:email: mailto:dyuen@oicr.on.ca - s:name: Denis Yuen - -s:contributor: - - class: s:Person - s:identifier: http://orcid.org/0000-0002-7681-6415 - s:email: mailto:briandoconnor@gmail.com - s:name: Brian O'Connor - -s:citation: https://dx.doi.org/10.6084/m9.figshare.3115156.v2 -s:codeRepository: https://github.com/common-workflow-language/common-workflow-language -s:dateCreated: "2016-12-13" -s:license: https://spdx.org/licenses/Apache-2.0 - -$namespaces: - s: https://schema.org/ - edam: http://edamontology.org/ - -$schemas: - - https://schema.org/version/latest/schemaorg-current-https.rdf - - http://edamontology.org/EDAM_1.18.owl diff --git a/_includes/cwl/17-metadata/metadata_example3.cwl b/_includes/cwl/17-metadata/metadata_example3.cwl deleted file mode 100644 index 99135075..00000000 --- a/_includes/cwl/17-metadata/metadata_example3.cwl +++ /dev/null @@ -1,56 +0,0 @@ -#!/usr/bin/env cwl-runner -cwlVersion: v1.0 -class: CommandLineTool - -label: An example tool demonstrating metadata. -doc: Note that this is an example and the metadata is not necessarily consistent. - -hints: - ResourceRequirement: - coresMin: 4 - -inputs: - aligned_sequences: - type: File - label: Aligned sequences in BAM format - format: edam:format_2572 - inputBinding: - position: 1 - -baseCommand: [ wc, -l ] - -stdout: output.txt - -outputs: - report: - type: stdout - format: edam:format_1964 - label: A text file that contains a line count - -s:author: - - class: s:Person - s:identifier: https://orcid.org/0000-0002-6130-1021 - s:email: mailto:dyuen@oicr.on.ca - s:name: Denis Yuen - -s:contributor: - - class: s:Person - s:identifier: http://orcid.org/0000-0002-7681-6415 - s:email: mailto:briandoconnor@gmail.com - s:name: Brian O'Connor - -s:citation: https://dx.doi.org/10.6084/m9.figshare.3115156.v2 -s:codeRepository: https://github.com/common-workflow-language/common-workflow-language -s:dateCreated: "2016-12-13" -s:license: https://spdx.org/licenses/Apache-2.0 - -s:keywords: edam:topic_0091 , edam:topic_0622 -s:programmingLanguage: C - -$namespaces: - s: https://schema.org/ - edam: http://edamontology.org/ - -$schemas: - - https://schema.org/version/latest/schemaorg-current-http.rdf - - http://edamontology.org/EDAM_1.18.owl diff --git a/_includes/cwl/17-metadata/sample.yml b/_includes/cwl/17-metadata/sample.yml deleted file mode 100644 index 89a41813..00000000 --- a/_includes/cwl/17-metadata/sample.yml +++ /dev/null @@ -1,7 +0,0 @@ -aligned_sequences: - class: File - format: http://edamontology.org/format_2572 - path: file-formats.bam -bamstats_report: - class: File - path: /tmp/bamstats_report.zip diff --git a/_includes/cwl/19-custom-types/InterProScan-apps.yml b/_includes/cwl/19-custom-types/InterProScan-apps.yml deleted file mode 100644 index e42779c3..00000000 --- a/_includes/cwl/19-custom-types/InterProScan-apps.yml +++ /dev/null @@ -1,18 +0,0 @@ -type: enum -name: apps -symbols: - - TIGRFAM - - SFLD - - SUPERFAMILY - - Gene3D - - Hamap - - Coils - - ProSiteProfiles - - SMART - - CDD - - PRINTS - - PIRSF - - ProSitePatterns - - Pfam - - ProDom - - MobiDBLite diff --git a/_includes/cwl/19-custom-types/biom-convert-table.yaml b/_includes/cwl/19-custom-types/biom-convert-table.yaml deleted file mode 100644 index d36e2567..00000000 --- a/_includes/cwl/19-custom-types/biom-convert-table.yaml +++ /dev/null @@ -1,12 +0,0 @@ -type: enum -name: table_type -label: The type of the table to produce -symbols: - - OTU table - - Pathway table - - Function table - - Ortholog table - - Gene table - - Metabolite table - - Taxon table - - Table diff --git a/_includes/cwl/19-custom-types/custom-types.cwl b/_includes/cwl/19-custom-types/custom-types.cwl deleted file mode 100644 index fb70427a..00000000 --- a/_includes/cwl/19-custom-types/custom-types.cwl +++ /dev/null @@ -1,64 +0,0 @@ -#!/usr/bin/env cwl-runner -cwlVersion: v1.0 -class: CommandLineTool - -requirements: - InlineJavascriptRequirement: {} - ResourceRequirement: - coresMax: 1 - ramMin: 100 # just a default, could be lowered - SchemaDefRequirement: - types: - - $import: biom-convert-table.yaml - -hints: - DockerRequirement: - dockerPull: 'quay.io/biocontainers/biom-format:2.1.6--py27_0' - SoftwareRequirement: - packages: - biom-format: - specs: [ "https://doi.org/10.1186/2047-217X-1-7" ] - version: [ "2.1.6" ] - -inputs: - biom: - type: File - format: edam:format_3746 # BIOM - inputBinding: - prefix: --input-fp - table_type: - type: biom-convert-table.yaml#table_type - inputBinding: - prefix: --table-type - - header_key: - type: string? - doc: | - The observation metadata to include from the input BIOM table file when - creating a tsv table file. By default no observation metadata will be - included. - inputBinding: - prefix: --header-key - -baseCommand: [ biom, convert ] - -arguments: - - valueFrom: $(inputs.biom.nameroot).hdf5 - prefix: --output-fp - - --to-hdf5 - -outputs: - result: - type: File - outputBinding: { glob: "$(inputs.biom.nameroot)*" } - -$namespaces: - edam: http://edamontology.org/ - s: https://schema.org/ - -$schemas: - - http://edamontology.org/EDAM_1.16.owl - - https://schema.org/version/latest/schemaorg-current-http.rdf - -s:license: https://spdx.org/licenses/Apache-2.0 -s:copyrightHolder: "EMBL - European Bioinformatics Institute" diff --git a/_includes/cwl/19-custom-types/custom-types.yml b/_includes/cwl/19-custom-types/custom-types.yml deleted file mode 100644 index 4f873913..00000000 --- a/_includes/cwl/19-custom-types/custom-types.yml +++ /dev/null @@ -1,5 +0,0 @@ -biom: - class: File - format: http://edamontology.org/format_3746 - path: rich_sparse_otu_table.biom -table_type: OTU table diff --git a/_includes/cwl/19-custom-types/rich_sparse_otu_table.biom b/_includes/cwl/19-custom-types/rich_sparse_otu_table.biom deleted file mode 100644 index 1b9a0e2f..00000000 --- a/_includes/cwl/19-custom-types/rich_sparse_otu_table.biom +++ /dev/null @@ -1,66 +0,0 @@ -{ - "id":"w00asdt", - "format": "1.0.0", - "format_url": "http://biom-format.org", - "type": "OTU table", - "generated_by": "QIIME revision XYZ", - "date": "2011-12-19T19:00:00", - "rows":[ - {"id":"GG_OTU_1", "metadata":{"taxonomy":["k__Bacteria", "p__Proteobacteria", "c__Gammaproteobacteria", "o__Enterobacteriales", "f__Enterobacteriaceae", "g__Escherichia", "s__"]}}, - {"id":"GG_OTU_2", "metadata":{"taxonomy":["k__Bacteria", "p__Cyanobacteria", "c__Nostocophycideae", "o__Nostocales", "f__Nostocaceae", "g__Dolichospermum", "s__"]}}, - {"id":"GG_OTU_3", "metadata":{"taxonomy":["k__Archaea", "p__Euryarchaeota", "c__Methanomicrobia", "o__Methanosarcinales", "f__Methanosarcinaceae", "g__Methanosarcina", "s__"]}}, - {"id":"GG_OTU_4", "metadata":{"taxonomy":["k__Bacteria", "p__Firmicutes", "c__Clostridia", "o__Halanaerobiales", "f__Halanaerobiaceae", "g__Halanaerobium", "s__Halanaerobiumsaccharolyticum"]}}, - {"id":"GG_OTU_5", "metadata":{"taxonomy":["k__Bacteria", "p__Proteobacteria", "c__Gammaproteobacteria", "o__Enterobacteriales", "f__Enterobacteriaceae", "g__Escherichia", "s__"]}} - ], - "columns":[ - {"id":"Sample1", "metadata":{ - "BarcodeSequence":"CGCTTATCGAGA", - "LinkerPrimerSequence":"CATGCTGCCTCCCGTAGGAGT", - "BODY_SITE":"gut", - "Description":"human gut"}}, - {"id":"Sample2", "metadata":{ - "BarcodeSequence":"CATACCAGTAGC", - "LinkerPrimerSequence":"CATGCTGCCTCCCGTAGGAGT", - "BODY_SITE":"gut", - "Description":"human gut"}}, - {"id":"Sample3", "metadata":{ - "BarcodeSequence":"CTCTCTACCTGT", - "LinkerPrimerSequence":"CATGCTGCCTCCCGTAGGAGT", - "BODY_SITE":"gut", - "Description":"human gut"}}, - {"id":"Sample4", "metadata":{ - "BarcodeSequence":"CTCTCGGCCTGT", - "LinkerPrimerSequence":"CATGCTGCCTCCCGTAGGAGT", - "BODY_SITE":"skin", - "Description":"human skin"}}, - {"id":"Sample5", "metadata":{ - "BarcodeSequence":"CTCTCTACCAAT", - "LinkerPrimerSequence":"CATGCTGCCTCCCGTAGGAGT", - "BODY_SITE":"skin", - "Description":"human skin"}}, - {"id":"Sample6", "metadata":{ - "BarcodeSequence":"CTAACTACCAAT", - "LinkerPrimerSequence":"CATGCTGCCTCCCGTAGGAGT", - "BODY_SITE":"skin", - "Description":"human skin"}} - ], - "matrix_type": "sparse", - "matrix_element_type": "int", - "shape": [5, 6], - "data":[[0,2,1], - [1,0,5], - [1,1,1], - [1,3,2], - [1,4,3], - [1,5,1], - [2,2,1], - [2,3,4], - [2,5,2], - [3,0,2], - [3,1,1], - [3,2,1], - [3,5,1], - [4,1,1], - [4,2,1] - ] - } diff --git a/_includes/cwl/19-custom-types/test_proteins.fasta b/_includes/cwl/19-custom-types/test_proteins.fasta deleted file mode 100644 index ec34ed42..00000000 --- a/_includes/cwl/19-custom-types/test_proteins.fasta +++ /dev/null @@ -1,34 +0,0 @@ ->Q97R95 -MKYKRIVFKVGTSSLTNEDGSLSRSKVKDITQQLAMLHEAGHELILVSSGAIAAGFGALG -FKKRPTKIADKQASAAVGQGLLLEEYTTNLLLRQIVSAQILLTQDDFVDKRRYKNAHQAL -SVLLNRGAIPIINENDSVVIDELKVGDNDTLSAQVAAMVQADLLVFLTDVDGLYTGNPNS -DPRAKRLERIETINREIIDMAGGAGSSNGTGGMLTKIKAATIATESGVPVYICSSLKSDS -MIEAAEETEDGSYFVAQEKGLRTQKQWLAFYAQSQGSIWVDKGAAEALSQYGKSLLLSGI -VEAEGVFSYGDIVTVFDKESGKSLGKGRVQFGASALEDMLRSQKAKGVLIYRDDWISITP -EIQLLFTEF ->A2VDN9 -MEVKGKKKLTGKGTKMSQEKSKFHKNNDSGSSKTFPKKVVKEGGPKITSKNFEKTATKPGKKGVKQFKNKQQGDRIPKNK -FQQANKFNQKRKFQPDSKSDESAAKKPKWDEFKKKKKELKQSRQLSDKTNYDIVIRAKQIWEILRRKDCDKEKRVKLMSD -LQKLIQGKIKTIAFAHDSTRVIQCYIQFGNEEQRKQAFEELRGDLVELSKAKYSRNIVKKFLMYGSKAQIAEIIRSFKGH -VRKLLRHAEASAIVEYAYNDKAILEQRNMLTEELYGNTFQLYKSADHPTLDKVLEVQPEKLELIMDEMKQILTPMAQKEA -VIKHSLVHKVFLDFFTYAPPKLRSEMIEAIREAVVYLAHTHDGARVAMYCLWHGTPKDRKVIVKTMKTYIEKVANGQYSH -LVLLAAFDCIDDTKLVKQIIISEIINSLPNIVNDKYGRKVLLYLLSPRDPAHTVREIIEVLQKGDGNAHSKKDTEIRRRE -LLESISPALLSYLQGHAQEVVLDKSACVLVADILGTATGDVQPAMDAVASLAAAELHPGGKDGELHIAEHPAGHLVLKWL -IEQDKKMKERGREGCFAKTLIERVGVKNLKSWASVNRGAIILSSLLQSSDQEVANKVKAGLKSLIPALEKSKNTSKGIEM -LLEKLTA ->A2YIW7 -MAAEEGVVIACHNKDEFDAQMTKAKEAGKVVIIDFTASWCGPCRFIAPVFAEYAKKFPGAVFLKVDVDELKEVAEKYNVE -AMPTFLFIKDGAEADKVVGARKDDLQNTIVKHVGATAASASA ->P22298 -GRGLLPFVLLALGIXAPWAVEGAENALKGGACPPRKIVQCLRYEKPKCTSDWQCPDKKKC -CRDTCAIKCLNPVAITNPVKVKPGKCPVVYGQCMMLNPPNHCKTDSQCLGDLKCCKSMCG -KVCLTPVKA ->A0B6J9 -MSKIGKSIRLERIIDRKTRKTVIVPMDHGLTVGPIPGLIDLAAAVDKVAEGGANAVLGHM -GLPLYGHRGYGKDVGLIIHLSASTSLGPDANHKVLVTRVEDAIRVGADGVSIHVNVGAED -EAEMLRDLGMVARRCDLWGMPLLAMMYPRGAKVRSEHSVEYVKHAARVGAELGVDIVKTN -YTGSPETFREVVRGCPAPVVIAGGPKMDTEADLLQMVYDAMQAGAAGISIGRNIFQAENP -TLLTRKLSKIVHEGYTPEEAARLKL ->P02939 -MNRTKLVLGAVILGSTLLAGCSSNAKIDQLSTDVQTLNAKVDQLSNDVTAIRSDVQAAKD -DAARANQRLDNQAHSYRK \ No newline at end of file diff --git a/_includes/cwl/20-software-requirements/InterProScan-apps.yml b/_includes/cwl/20-software-requirements/InterProScan-apps.yml deleted file mode 100644 index e42779c3..00000000 --- a/_includes/cwl/20-software-requirements/InterProScan-apps.yml +++ /dev/null @@ -1,18 +0,0 @@ -type: enum -name: apps -symbols: - - TIGRFAM - - SFLD - - SUPERFAMILY - - Gene3D - - Hamap - - Coils - - ProSiteProfiles - - SMART - - CDD - - PRINTS - - PIRSF - - ProSitePatterns - - Pfam - - ProDom - - MobiDBLite diff --git a/_includes/cwl/20-software-requirements/custom-types.cwl b/_includes/cwl/20-software-requirements/custom-types.cwl deleted file mode 100644 index 044db0bf..00000000 --- a/_includes/cwl/20-software-requirements/custom-types.cwl +++ /dev/null @@ -1,67 +0,0 @@ -cwlVersion: v1.0 -class: CommandLineTool - -label: "InterProScan: protein sequence classifier" - -doc: | - Version 5.21-60 can be downloaded here: - https://interproscan-docs.readthedocs.io/en/latest/HowToDownload.html - - Documentation on how to run InterProScan 5 can be found here: - https://interproscan-docs.readthedocs.io/en/latest/HowToRun.html - -requirements: - ResourceRequirement: - ramMin: 10240 - coresMin: 3 - SchemaDefRequirement: - types: - - $import: InterProScan-apps.yml - -hints: - SoftwareRequirement: - packages: - interproscan: - specs: [ "https://identifiers.org/rrid/RRID:SCR_005829" ] - version: [ "5.21-60" ] - -inputs: - proteinFile: - type: File - inputBinding: - prefix: --input - applications: - type: InterProScan-apps.yml#apps[]? - inputBinding: - itemSeparator: ',' - prefix: --applications - -baseCommand: interproscan.sh - -arguments: - - valueFrom: $(inputs.proteinFile.nameroot).i5_annotations - prefix: --outfile - - valueFrom: TSV - prefix: --formats - - --disable-precalc - - --goterms - - --pathways - - valueFrom: $(runtime.tmpdir) - prefix: --tempdir - - -outputs: - i5Annotations: - type: File - format: iana:text/tab-separated-values - outputBinding: - glob: $(inputs.proteinFile.nameroot).i5_annotations - -$namespaces: - iana: https://www.iana.org/assignments/media-types/ - s: https://schema.org/ -$schemas: - - https://schema.org/version/latest/schemaorg-current-http.rdf - -s:license: https://spdx.org/licenses/Apache-2.0 -s:copyrightHolder: "EMBL - European Bioinformatics Institute" diff --git a/_includes/cwl/20-software-requirements/custom-types.yml b/_includes/cwl/20-software-requirements/custom-types.yml deleted file mode 100644 index ec8fb9e6..00000000 --- a/_includes/cwl/20-software-requirements/custom-types.yml +++ /dev/null @@ -1,3 +0,0 @@ -proteinFile: - class: File - path: test_proteins.fasta diff --git a/_includes/cwl/20-software-requirements/test_proteins.fasta b/_includes/cwl/20-software-requirements/test_proteins.fasta deleted file mode 100644 index ec34ed42..00000000 --- a/_includes/cwl/20-software-requirements/test_proteins.fasta +++ /dev/null @@ -1,34 +0,0 @@ ->Q97R95 -MKYKRIVFKVGTSSLTNEDGSLSRSKVKDITQQLAMLHEAGHELILVSSGAIAAGFGALG -FKKRPTKIADKQASAAVGQGLLLEEYTTNLLLRQIVSAQILLTQDDFVDKRRYKNAHQAL -SVLLNRGAIPIINENDSVVIDELKVGDNDTLSAQVAAMVQADLLVFLTDVDGLYTGNPNS -DPRAKRLERIETINREIIDMAGGAGSSNGTGGMLTKIKAATIATESGVPVYICSSLKSDS -MIEAAEETEDGSYFVAQEKGLRTQKQWLAFYAQSQGSIWVDKGAAEALSQYGKSLLLSGI -VEAEGVFSYGDIVTVFDKESGKSLGKGRVQFGASALEDMLRSQKAKGVLIYRDDWISITP -EIQLLFTEF ->A2VDN9 -MEVKGKKKLTGKGTKMSQEKSKFHKNNDSGSSKTFPKKVVKEGGPKITSKNFEKTATKPGKKGVKQFKNKQQGDRIPKNK -FQQANKFNQKRKFQPDSKSDESAAKKPKWDEFKKKKKELKQSRQLSDKTNYDIVIRAKQIWEILRRKDCDKEKRVKLMSD -LQKLIQGKIKTIAFAHDSTRVIQCYIQFGNEEQRKQAFEELRGDLVELSKAKYSRNIVKKFLMYGSKAQIAEIIRSFKGH -VRKLLRHAEASAIVEYAYNDKAILEQRNMLTEELYGNTFQLYKSADHPTLDKVLEVQPEKLELIMDEMKQILTPMAQKEA -VIKHSLVHKVFLDFFTYAPPKLRSEMIEAIREAVVYLAHTHDGARVAMYCLWHGTPKDRKVIVKTMKTYIEKVANGQYSH -LVLLAAFDCIDDTKLVKQIIISEIINSLPNIVNDKYGRKVLLYLLSPRDPAHTVREIIEVLQKGDGNAHSKKDTEIRRRE -LLESISPALLSYLQGHAQEVVLDKSACVLVADILGTATGDVQPAMDAVASLAAAELHPGGKDGELHIAEHPAGHLVLKWL -IEQDKKMKERGREGCFAKTLIERVGVKNLKSWASVNRGAIILSSLLQSSDQEVANKVKAGLKSLIPALEKSKNTSKGIEM -LLEKLTA ->A2YIW7 -MAAEEGVVIACHNKDEFDAQMTKAKEAGKVVIIDFTASWCGPCRFIAPVFAEYAKKFPGAVFLKVDVDELKEVAEKYNVE -AMPTFLFIKDGAEADKVVGARKDDLQNTIVKHVGATAASASA ->P22298 -GRGLLPFVLLALGIXAPWAVEGAENALKGGACPPRKIVQCLRYEKPKCTSDWQCPDKKKC -CRDTCAIKCLNPVAITNPVKVKPGKCPVVYGQCMMLNPPNHCKTDSQCLGDLKCCKSMCG -KVCLTPVKA ->A0B6J9 -MSKIGKSIRLERIIDRKTRKTVIVPMDHGLTVGPIPGLIDLAAAVDKVAEGGANAVLGHM -GLPLYGHRGYGKDVGLIIHLSASTSLGPDANHKVLVTRVEDAIRVGADGVSIHVNVGAED -EAEMLRDLGMVARRCDLWGMPLLAMMYPRGAKVRSEHSVEYVKHAARVGAELGVDIVKTN -YTGSPETFREVVRGCPAPVVIAGGPKMDTEADLLQMVYDAMQAGAAGISIGRNIFQAENP -TLLTRKLSKIVHEGYTPEEAARLKL ->P02939 -MNRTKLVLGAVILGSTLLAGCSSNAKIDQLSTDVQTLNAKVDQLSNDVTAIRSDVQAAKD -DAARANQRLDNQAHSYRK \ No newline at end of file diff --git a/_includes/cwl/21-1st-workflow/1st-workflow-job.yml b/_includes/cwl/21-1st-workflow/1st-workflow-job.yml deleted file mode 100644 index fce5dc1a..00000000 --- a/_includes/cwl/21-1st-workflow/1st-workflow-job.yml +++ /dev/null @@ -1,4 +0,0 @@ -tarball: - class: File - path: hello.tar -name_of_file_to_extract: Hello.java diff --git a/_includes/cwl/21-1st-workflow/1st-workflow.cwl b/_includes/cwl/21-1st-workflow/1st-workflow.cwl deleted file mode 100644 index 24b19bd2..00000000 --- a/_includes/cwl/21-1st-workflow/1st-workflow.cwl +++ /dev/null @@ -1,26 +0,0 @@ -#!/usr/bin/env cwl-runner - -cwlVersion: v1.0 -class: Workflow -inputs: - tarball: File - name_of_file_to_extract: string - -outputs: - compiled_class: - type: File - outputSource: compile/classfile - -steps: - untar: - run: tar-param.cwl - in: - tarfile: tarball - extractfile: name_of_file_to_extract - out: [extracted_file] - - compile: - run: arguments.cwl - in: - src: untar/extracted_file - out: [classfile] diff --git a/_includes/cwl/21-1st-workflow/arguments.cwl b/_includes/cwl/21-1st-workflow/arguments.cwl deleted file mode 100644 index c26d2642..00000000 --- a/_includes/cwl/21-1st-workflow/arguments.cwl +++ /dev/null @@ -1,21 +0,0 @@ -#!/usr/bin/env cwl-runner - -cwlVersion: v1.0 -class: CommandLineTool -label: Example trivial wrapper for Java 9 compiler -hints: - DockerRequirement: - dockerPull: openjdk:9.0.1-11-slim -baseCommand: javac -arguments: ["-d", $(runtime.outdir)] -inputs: - src: - type: File - inputBinding: - position: 1 -outputs: - classfile: - type: File - outputBinding: - glob: "*.class" - diff --git a/_includes/cwl/21-1st-workflow/hello.tar b/_includes/cwl/21-1st-workflow/hello.tar deleted file mode 100644 index d30185d7..00000000 Binary files a/_includes/cwl/21-1st-workflow/hello.tar and /dev/null differ diff --git a/_includes/cwl/21-1st-workflow/tar-param.cwl b/_includes/cwl/21-1st-workflow/tar-param.cwl deleted file mode 100644 index 87ad9e0f..00000000 --- a/_includes/cwl/21-1st-workflow/tar-param.cwl +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/env cwl-runner - -cwlVersion: v1.0 -class: CommandLineTool -baseCommand: [tar, --extract] -inputs: - tarfile: - type: File - inputBinding: - prefix: --file - extractfile: - type: string - inputBinding: - position: 1 -outputs: - extracted_file: - type: File - outputBinding: - glob: $(inputs.extractfile) diff --git a/_includes/cwl/22-nested-workflows/1st-workflow.cwl b/_includes/cwl/22-nested-workflows/1st-workflow.cwl deleted file mode 100644 index 24b19bd2..00000000 --- a/_includes/cwl/22-nested-workflows/1st-workflow.cwl +++ /dev/null @@ -1,26 +0,0 @@ -#!/usr/bin/env cwl-runner - -cwlVersion: v1.0 -class: Workflow -inputs: - tarball: File - name_of_file_to_extract: string - -outputs: - compiled_class: - type: File - outputSource: compile/classfile - -steps: - untar: - run: tar-param.cwl - in: - tarfile: tarball - extractfile: name_of_file_to_extract - out: [extracted_file] - - compile: - run: arguments.cwl - in: - src: untar/extracted_file - out: [classfile] diff --git a/_includes/cwl/22-nested-workflows/arguments.cwl b/_includes/cwl/22-nested-workflows/arguments.cwl deleted file mode 100644 index c26d2642..00000000 --- a/_includes/cwl/22-nested-workflows/arguments.cwl +++ /dev/null @@ -1,21 +0,0 @@ -#!/usr/bin/env cwl-runner - -cwlVersion: v1.0 -class: CommandLineTool -label: Example trivial wrapper for Java 9 compiler -hints: - DockerRequirement: - dockerPull: openjdk:9.0.1-11-slim -baseCommand: javac -arguments: ["-d", $(runtime.outdir)] -inputs: - src: - type: File - inputBinding: - position: 1 -outputs: - classfile: - type: File - outputBinding: - glob: "*.class" - diff --git a/_includes/cwl/22-nested-workflows/nestedworkflows.cwl b/_includes/cwl/22-nested-workflows/nestedworkflows.cwl deleted file mode 100644 index 75a4f00a..00000000 --- a/_includes/cwl/22-nested-workflows/nestedworkflows.cwl +++ /dev/null @@ -1,47 +0,0 @@ -#!/usr/bin/env cwl-runner - -cwlVersion: v1.0 -class: Workflow - -inputs: [] - -outputs: - classout: - type: File - outputSource: compile/compiled_class - -requirements: - SubworkflowFeatureRequirement: {} - -steps: - compile: - run: 1st-workflow.cwl - in: - tarball: create-tar/tar_compressed_java_file - name_of_file_to_extract: - default: "Hello.java" - out: [compiled_class] - - create-tar: - in: [] - out: [tar_compressed_java_file] - run: - class: CommandLineTool - requirements: - InitialWorkDirRequirement: - listing: - - entryname: Hello.java - entry: | - public class Hello { - public static void main(String[] argv) { - System.out.println("Hello from Java"); - } - } - inputs: [] - baseCommand: [tar, --create, --file=hello.tar, Hello.java] - outputs: - tar_compressed_java_file: - type: File - streamable: true - outputBinding: - glob: "hello.tar" diff --git a/_includes/cwl/22-nested-workflows/tar-param.cwl b/_includes/cwl/22-nested-workflows/tar-param.cwl deleted file mode 100644 index 87ad9e0f..00000000 --- a/_includes/cwl/22-nested-workflows/tar-param.cwl +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/env cwl-runner - -cwlVersion: v1.0 -class: CommandLineTool -baseCommand: [tar, --extract] -inputs: - tarfile: - type: File - inputBinding: - prefix: --file - extractfile: - type: string - inputBinding: - position: 1 -outputs: - extracted_file: - type: File - outputBinding: - glob: $(inputs.extractfile) diff --git a/_includes/cwl/23-scatter-workflow/1st-tool-mod.cwl b/_includes/cwl/23-scatter-workflow/1st-tool-mod.cwl deleted file mode 100755 index 4ebbdf38..00000000 --- a/_includes/cwl/23-scatter-workflow/1st-tool-mod.cwl +++ /dev/null @@ -1,13 +0,0 @@ -#!/usr/bin/env cwl-runner - -cwlVersion: v1.0 -class: CommandLineTool -baseCommand: echo -inputs: - message: - type: string - inputBinding: - position: 1 -outputs: - echo_out: - type: stdout diff --git a/_includes/cwl/23-scatter-workflow/1st-tool.cwl b/_includes/cwl/23-scatter-workflow/1st-tool.cwl deleted file mode 100755 index 1d550fc2..00000000 --- a/_includes/cwl/23-scatter-workflow/1st-tool.cwl +++ /dev/null @@ -1,11 +0,0 @@ -#!/usr/bin/env cwl-runner - -cwlVersion: v1.0 -class: CommandLineTool -baseCommand: echo -inputs: - message: - type: string - inputBinding: - position: 1 -outputs: [] diff --git a/_includes/cwl/23-scatter-workflow/scatter-job.yml b/_includes/cwl/23-scatter-workflow/scatter-job.yml deleted file mode 100755 index 566d5724..00000000 --- a/_includes/cwl/23-scatter-workflow/scatter-job.yml +++ /dev/null @@ -1,5 +0,0 @@ -message_array: - - Hello world! - - Hola mundo! - - Bonjour le monde! - - Hallo welt! diff --git a/_includes/cwl/23-scatter-workflow/scatter-nested-workflow.cwl b/_includes/cwl/23-scatter-workflow/scatter-nested-workflow.cwl deleted file mode 100644 index 11e597fc..00000000 --- a/_includes/cwl/23-scatter-workflow/scatter-nested-workflow.cwl +++ /dev/null @@ -1,35 +0,0 @@ -#!/usr/bin/env cwl-runner - -cwlVersion: v1.0 -class: Workflow - -requirements: - ScatterFeatureRequirement: {} - SubworkflowFeatureRequirement: {} - -inputs: - message_array: string[] - -steps: - subworkflow: - run: - class: Workflow - inputs: - message: string - outputs: [] - steps: - echo: - run: 1st-tool-mod.cwl - in: - message: message - out: [echo_out] - wc: - run: wc-tool.cwl - in: - input_file: echo/echo_out - out: [] - scatter: message - in: - message: message_array - out: [] -outputs: [] diff --git a/_includes/cwl/23-scatter-workflow/scatter-two-steps.cwl b/_includes/cwl/23-scatter-workflow/scatter-two-steps.cwl deleted file mode 100644 index baf86b8c..00000000 --- a/_includes/cwl/23-scatter-workflow/scatter-two-steps.cwl +++ /dev/null @@ -1,26 +0,0 @@ -#!/usr/bin/env cwl-runner - -cwlVersion: v1.0 -class: Workflow - -requirements: - ScatterFeatureRequirement: {} - -inputs: - message_array: string[] - -steps: - echo: - run: 1st-tool-mod.cwl - scatter: message - in: - message: message_array - out: [echo_out] - wc: - run: wc-tool.cwl - scatter: input_file - in: - input_file: echo/echo_out - out: [] - -outputs: [] diff --git a/_includes/cwl/23-scatter-workflow/scatter-workflow.cwl b/_includes/cwl/23-scatter-workflow/scatter-workflow.cwl deleted file mode 100644 index b5a0393d..00000000 --- a/_includes/cwl/23-scatter-workflow/scatter-workflow.cwl +++ /dev/null @@ -1,20 +0,0 @@ -#!/usr/bin/env cwl-runner - -cwlVersion: v1.0 -class: Workflow - -requirements: - ScatterFeatureRequirement: {} - -inputs: - message_array: string[] - -steps: - echo: - run: 1st-tool.cwl - scatter: message - in: - message: message_array - out: [] - -outputs: [] diff --git a/_includes/cwl/23-scatter-workflow/wc-tool.cwl b/_includes/cwl/23-scatter-workflow/wc-tool.cwl deleted file mode 100755 index c3064634..00000000 --- a/_includes/cwl/23-scatter-workflow/wc-tool.cwl +++ /dev/null @@ -1,12 +0,0 @@ -#!/usr/bin/env cwl-runner - -cwlVersion: v1.0 -class: CommandLineTool -baseCommand: wc -arguments: ["-c"] -inputs: - input_file: - type: File - inputBinding: - position: 1 -outputs: [] diff --git a/_includes/cwl/conformance-test.yml b/_includes/cwl/conformance-test.yml deleted file mode 100644 index 47340e0c..00000000 --- a/_includes/cwl/conformance-test.yml +++ /dev/null @@ -1,254 +0,0 @@ -# Section 2 -- doc: Test for section 2 - job: 02-1st-example/echo-job.yml - tool: 02-1st-example/1st-tool.cwl - should_fail: false - output: {} - -# Section 3 -- doc: Test for section 3 - job: 03-input/inp-job.yml - tool: 03-input/inp.cwl - should_fail: false - output: {} - -# Section 4 -- doc: Test for section 4 - job: 04-output/tar-job.yml - tool: 04-output/tar.cwl - output: - example_out: - class: File - checksum: sha1$da39a3ee5e6b4b0d3255bfef95601890afd80709 - basename: hello.txt - location: Any - size: 0 - -# Section 5 -- doc: Test for section 5 - job: 05-stdout/echo-job.yml - tool: 05-stdout/stdout.cwl - output: - example_out: - class: File - checksum: sha1$47a013e660d408619d894b20806b1d5086aab03b - basename: output.txt - location: Any - size: 13 - -# Section 6 -- doc: Test for section 6 - job: 06-params/tar-param-job.yml - tool: 06-params/tar-param.cwl - output: - extracted_file: - class: File - checksum: sha1$da39a3ee5e6b4b0d3255bfef95601890afd80709 - basename: goodbye.txt - location: Any - size: 0 - -# Section 7 -- doc: Test for section 7 - job: 07-containers/docker-job.yml - tool: 07-containers/docker.cwl - output: - example_out: - class: File - checksum: sha1$648a6a6ffffdaa0badb23b8baf90b6168dd16b3a - basename: output.txt - location: Any - size: 12 - -# Section 8 -- doc: Test for section 8 - job: 08-arguments/arguments-job.yml - tool: 08-arguments/arguments.cwl - output: - classfile: - class: File - checksum: sha1$fdb876b40ad9ebc7fee873212e02d5940588642e - basename: Hello.class - location: Any - size: 184 - -# Section 9 -- doc: Test for section 9 - job: 09-array-inputs/array-inputs-job.yml - tool: 09-array-inputs/array-inputs.cwl - output: - example_out: - class: File - checksum: sha1$91038e29452bc77dcd21edef90a15075f3071540 - basename: output.txt - location: Any - size: 60 - -# Section 10 -- doc: Test for section 10 - job: 10-array-outputs/array-outputs-job.yml - tool: 10-array-outputs/array-outputs.cwl - output: - output: - - class: File - basename: baz.txt - checksum: sha1$da39a3ee5e6b4b0d3255bfef95601890afd80709 - location: Any - size: 0 - - class: File - basename: foo.txt - checksum: sha1$da39a3ee5e6b4b0d3255bfef95601890afd80709 - location: Any - size: 0 - -# Section 11 depends on side-effects -- doc: Test for section 11 (1st example) - job: 11-records/record-job1.yml - tool: 11-records/record.cwl - should_fail: true - -- doc: Test for section 11 (2nd example) - job: 11-records/record-job2.yml - tool: 11-records/record.cwl - output: - example_out: - class: File - checksum: sha1$329fe3b598fed0dfd40f511522eaf386edb2d077 - basename: output.txt - location: Any - size: 23 - -- doc: Test for section 11 (3rd example) - job: 11-records/record-job3.yml - tool: 11-records/record.cwl - output: - example_out: - class: File - checksum: sha1$77f572b28e441240a5e30eb14f1d300bcc13a3b4 - basename: output.txt - location: Any - size: 22 - -# Section 12 -- doc: Test for section 12 - job: 12-env/echo-job.yml - tool: 12-env/env.cwl - output: - example_out: - class: File - basename: output.txt - location: Any - -# Section 13 -- doc: Test for section 13 - job: 13-expressions/empty.yml - tool: 13-expressions/expression.cwl - output: - example_out: - class: File - checksum: sha1$a739a6ff72d660d32111265e508ed2fc91f01a7c - basename: output.txt - location: Any - size: 36 - -# Section 14 -- doc: Test for section 14 - job: 14-runtime/echo-job.yml - tool: 14-runtime/createfile.cwl - output: - example_out: - class: File - checksum: sha1$9045abe4bd04dd8ccfe50c6ff61820b784b64aa7 - basename: output.txt - location: Any - size: 25 - -# Section 15 -- doc: Test for section 15 - job: 15-staging/arguments-job.yml - tool: 15-staging/linkfile.cwl - output: - classfile: - class: File - checksum: sha1$fdb876b40ad9ebc7fee873212e02d5940588642e - basename: Hello.class - location: Any - size: 184 - -# Section 16 -# Note: The checksum and size is always changed for every executions -- doc: Test for section 16 - job: 16-file-formats/sample.yml - tool: 16-file-formats/metadata_example.cwl - output: - report: - class: File - basename: output.txt - location: Any - -# Section 17 -# Note: The checksum and size is always changed for every executions -- doc: Test for section 17 (1st example) - job: 17-metadata/sample.yml - tool: 17-metadata/metadata_example2.cwl - output: - report: - class: File - basename: output.txt - location: Any - -- doc: Test for section 17 (extended example) - job: 17-metadata/sample.yml - tool: 17-metadata/metadata_example3.cwl - output: - report: - class: File - basename: output.txt - location: Any - -# Section 19 -# Note: The checksum is always changed for every executions -- doc: Test for section 19 - job: 19-custom-types/custom-types.yml - tool: 19-custom-types/custom-types.cwl - output: - result: - class: File - basename: rich_sparse_otu_table.hdf5 - location: Any - size: 46992 - -# Section 20 -# See: Issue #48 -# - doc: Test for section 20 -# job: 20-software-requirements/custom-types.yml -# tool: 20-software-requirements/costom-types.cwl -# output: -# i5Annotations: -# class: File -# basename: test_proteins.i5_annotations -# location: Any -# size: Any # To be fixed - -# Section 21 -- doc: Test for section 21 - job: 21-1st-workflow/1st-workflow-job.yml - tool: 21-1st-workflow/1st-workflow.cwl - output: - compiled_class: - class: File - checksum: sha1$39e3219327347c05aa3e82236f83aa6d77fe6bfd - basename: Hello.class - location: Any - size: 419 - -# Section 22 -- doc: Test for section 22 - tool: 22-nested-workflows/nestedworkflows.cwl - output: - classout: - class: File - checksum: sha1$39e3219327347c05aa3e82236f83aa6d77fe6bfd - basename: Hello.class - location: Any - size: 419 diff --git a/_includes/dc/intro.html b/_includes/dc/intro.html deleted file mode 100644 index 741aeebb..00000000 --- a/_includes/dc/intro.html +++ /dev/null @@ -1,18 +0,0 @@ -

- Data Carpentry - aims to help researchers get their work done - in less time and with less pain - by teaching them basic research computing skills. - This hands-on workshop will cover basic concepts and tools, - including program design, version control, data management, - and task automation. - Participants will be encouraged to help one another - and to apply what they have learned to their own research problems. -

-

- - For more information on what we teach and why, - please see our paper - "Best Practices for Scientific Computing". - -

diff --git a/_includes/dc/schedule.html b/_includes/dc/schedule.html deleted file mode 100644 index 6894a19e..00000000 --- a/_includes/dc/schedule.html +++ /dev/null @@ -1,24 +0,0 @@ -
-
-

Day 1

- - - - - - - -
09:00 Automating tasks with the Unix shell
10:30 Coffee
12:00 Lunch break
13:00 Building programs with Python
14:30 Coffee
16:00 Wrap-up
-
-
-

Day 2

- - - - - - - -
09:00 Version control with Git
10:30 Coffee
12:00 Lunch break
13:00 Managing data with SQL
14:30 Coffee
16:00 Wrap-up
-
-
diff --git a/_includes/dc/syllabus.html b/_includes/dc/syllabus.html deleted file mode 100644 index a325ceec..00000000 --- a/_includes/dc/syllabus.html +++ /dev/null @@ -1,96 +0,0 @@ -
-
-

The Unix Shell

-
    -
  • Files and directories
  • -
  • History and tab completion
  • -
  • Pipes and redirection
  • -
  • Looping over files
  • -
  • Creating and running shell scripts
  • -
  • Finding things
  • -
  • Reference...
  • -
-
-
-

Programming in Python

-
    -
  • Using libraries
  • -
  • Working with arrays
  • -
  • Reading and plotting data
  • -
  • Creating and using functions
  • -
  • Loops and conditionals
  • -
  • Defensive programming
  • -
  • Using Python from the command line
  • -
  • Reference...
  • -
-
- - -
- -
-
-

Version Control with Git

-
    -
  • Creating a repository
  • -
  • Recording changes to files: add, commit, ...
  • -
  • Viewing changes: status, diff, ...
  • -
  • Ignoring files
  • -
  • Working on the web: clone, pull, push, ...
  • -
  • Resolving conflicts
  • -
  • Open licenses
  • -
  • Where to host work, and why
  • -
  • Reference...
  • -
-
- -
-

Open Refine

-
    -
  • Introduction to OpenRefine
  • -
  • Importing data
  • -
  • Basic functions
  • -
  • Advanced Functions
  • -
  • Reference...
  • -
-
-
diff --git a/_includes/dc/who.html b/_includes/dc/who.html deleted file mode 100644 index 2d8e94ae..00000000 --- a/_includes/dc/who.html +++ /dev/null @@ -1,8 +0,0 @@ -

- Who: - The course is aimed at graduate students and other researchers. - - You don't need to have any previous knowledge of the tools - that will be presented at the workshop. - -

diff --git a/_includes/episode_break.html b/_includes/episode_break.html deleted file mode 100644 index 36d2d2fa..00000000 --- a/_includes/episode_break.html +++ /dev/null @@ -1,15 +0,0 @@ -{% comment %} - Display a break's timings in a box similar to a learning episode's. -{% endcomment %} -
-

Overview

- -
-
- Break: {{ page.break }} min -
-
-
-
- -
diff --git a/_includes/episode_keypoints.html b/_includes/episode_keypoints.html deleted file mode 100644 index 2baa53ef..00000000 --- a/_includes/episode_keypoints.html +++ /dev/null @@ -1,11 +0,0 @@ -{% comment %} - Display key points for an episode. -{% endcomment %} -
-

Key Points

-
    - {% for keypoint in page.keypoints %} -
  • {{ keypoint|markdownify }}
  • - {% endfor %} -
-
diff --git a/_includes/episode_navbar.html b/_includes/episode_navbar.html deleted file mode 100644 index 5abf86f2..00000000 --- a/_includes/episode_navbar.html +++ /dev/null @@ -1,42 +0,0 @@ -{% comment %} -For some reason, the relative_root_path seems out of scope in this file, so we -need to re-assign it here -{% endcomment %} - -{% include base_path.html %} - -{% comment %} - Navigation bar for an episode. -{% endcomment %} - -{% include manual_episode_order.html %} -{% comment %} - 'previous_episode' and 'next_episodes' are defined in 'manual_episode_order.html'. - These replace 'page.previous' and 'page.next' objects, correspondingly. -{% endcomment %} - -
-
-

- {% if previous_episode %} - previous episode - {% else %} - lesson home - {% endif %} -

-
-
- {% if include.episode_navbar_title %} -

{{ site.title }}

- {% endif %} -
-
-

- {% if next_episode %} - next episode - {% else %} - lesson home - {% endif %} -

-
-
diff --git a/_includes/episode_overview.html b/_includes/episode_overview.html deleted file mode 100644 index cb87e0f6..00000000 --- a/_includes/episode_overview.html +++ /dev/null @@ -1,36 +0,0 @@ -{% comment %} - Display an episode's timings and learning objectives. -{% endcomment %} -
-

Overview

- -
-
- Teaching: {{ page.teaching }} min -
- Exercises: {{ page.exercises }} min -
-
- Questions -
    - {% for question in page.questions %} -
  • {{ question|markdownify }}
  • - {% endfor %} -
-
-
- -
-
-
-
- Objectives -
    - {% for objective in page.objectives %} -
  • {{ objective|markdownify }}
  • - {% endfor %} -
-
-
- -
diff --git a/_includes/episode_title.html b/_includes/episode_title.html deleted file mode 100644 index d0abc654..00000000 --- a/_includes/episode_title.html +++ /dev/null @@ -1,9 +0,0 @@ -
-
-
-
-

{{ page.title }}

-
-
-
-
diff --git a/_includes/favicons.html b/_includes/favicons.html deleted file mode 100644 index 85628d59..00000000 --- a/_includes/favicons.html +++ /dev/null @@ -1,36 +0,0 @@ -{% assign favicon_url = relative_root_path | append: '/assets/favicons/' | append: site.carpentry %} - -{% if site.carpentry == 'swc' %} -{% assign carpentry = 'Software Carpentry' %} -{% elsif site.carpentry == 'dc' %} -{% assign carpentry = 'Data Carpentry' %} -{% elsif site.carpentry == 'lc' %} -{% assign carpentry = 'Library Carpentry' %} -{% elsif site.carpentry == 'cp' %} -{% assign carpentry = 'The Carpentries' %} -{% elsif site.carpentry == 'cwl' %} -{% assign carpentry = 'The Common Workflow Language Project' %} -{% endif %} - - - - - - - - - - - - - - - - - - - - - - - diff --git a/_includes/gh_variables.html b/_includes/gh_variables.html deleted file mode 100644 index 3fdae4ac..00000000 --- a/_includes/gh_variables.html +++ /dev/null @@ -1,45 +0,0 @@ -{% comment %} -When rendering websites locally, `site.github.url` doesn't get resolved properly -unless a GitHub Personal Access Token is set up and available in the -environment. This leads to warnings and errors when trying to serve the site -locally. To work around this, we use the `jekyll.environment` variable which is -set to `development` when rendering the site locally, and set to `production` on -GitHub where `site.github.url` is defined. -{% endcomment %} - -{% if jekyll.environment == "production" %} - -{% comment %} -First, get the name of the repository -{% endcomment %} -{% assign repo_name = site.github.repository_name %} - -{% comment %} -`site.github.public_repositories` contains comprehensive information for all public repositories for the organization. We use `where` to extract the part -of the metadata that is relevant to the present repository. -{% endcomment %} -{% assign repo_info = site.github.public_repositories | where: "name", repo_name %} - -{% comment %} -Now, we can extract the default branch for the repo -{% endcomment %} -{% assign default_branch = repo_info[0].default_branch %} - -{% comment %} -Other variables requested by the template -{% endcomment %} -{% assign repo_url = site.github.repository_url %} -{% assign search_domain_url = site.github.url %} -{% assign project_title = site.github.project_title %} -{% assign source_branch = site.github.source.branch %} - -{% elsif jekyll.environment == "development" %} - -{% assign repo_name = "" %} -{% assign repo_url = "" %} -{% assign default_branch = "" %} -{% assign search_domain_url = "" %} -{% assign project_title = "" %} -{% assign source_branch = "" %} - -{% endif %} diff --git a/_includes/javascript.html b/_includes/javascript.html deleted file mode 100644 index fcc74e6e..00000000 --- a/_includes/javascript.html +++ /dev/null @@ -1,14 +0,0 @@ -{% comment %} - JavaScript used in lesson and workshop pages. -{% endcomment %} - - - - diff --git a/_includes/lc/intro.html b/_includes/lc/intro.html deleted file mode 100644 index b218f2ba..00000000 --- a/_includes/lc/intro.html +++ /dev/null @@ -1,19 +0,0 @@ -

- Library Carpentry - is made by people working in library- and information-related roles to help you: -

-
    -
  • automate repetitive, boring, error-prone tasks
  • -
  • create, maintain and analyze sustainable and reusable data
  • -
  • work effectively with IT and systems colleagues
  • -
  • better understand the use of software in research
  • -
  • and much more...
  • -
-

- - Library Carpentry introduces you to the fundamentals of computing - and provides you with a platform for further self-directed learning. - For more information on what we teach and why, please see our paper - "Library Carpentry: software skills training for library professionals". - -

diff --git a/_includes/lc/schedule.html b/_includes/lc/schedule.html deleted file mode 100644 index cc2b5920..00000000 --- a/_includes/lc/schedule.html +++ /dev/null @@ -1,24 +0,0 @@ -
-
-

Day 1

- - - - - - - -
09:00 Data Intro for Librarians
10:30 Coffee
12:00 Lunch break
13:00 Shell Lessons for Libraries
14:30 Coffee
16:00 Wrap-up
-
-
-

Day 2

- - - - - - - -
09:00 Git Intro for Librarians
10:30 Coffee
12:00 Lunch break
13:00 OpenRefine for Librarians
14:30 Coffee
16:00 Wrap-up
-
-
diff --git a/_includes/lc/syllabus.html b/_includes/lc/syllabus.html deleted file mode 100644 index e2c7012e..00000000 --- a/_includes/lc/syllabus.html +++ /dev/null @@ -1,69 +0,0 @@ -
-
-

Data Intro

-
    -
  • Intro to data
  • -
  • Jargon busting
  • -
  • Keyboard shortcuts
  • -
  • Plain text formats
  • -
  • Naming files
  • -
  • Regular expressions
  • -
  • Reference...
  • -
-
-
-

The Unix Shell

-
    -
  • Files and directories
  • -
  • History and tab completion
  • -
  • Counting and sorting contents in files
  • -
  • Pipes and redirection
  • -
  • Mining or searching in files
  • -
  • Reference...
  • -
-
- -
- -
-
-

Version Control with Git

-
    -
  • Creating a repository
  • -
  • Configuring git
  • -
  • Recording changes to files: add, commit, ...
  • -
  • Viewing state changes with status
  • -
  • Working on the web: clone, pull, push, ...
  • -
  • Where to host work, and why
  • -
  • Reference...
  • -
-
-
-
-

Open Refine

-
    -
  • Introduction to OpenRefine
  • -
  • Importing data
  • -
  • Basic functions
  • -
  • Advanced Functions
  • -
  • Reference...
  • -
-
-
-
- diff --git a/_includes/lc/who.html b/_includes/lc/who.html deleted file mode 100644 index ecbf7066..00000000 --- a/_includes/lc/who.html +++ /dev/null @@ -1,8 +0,0 @@ -

- Who: - The course is for people working in library- and information-related roles. - - You don't need to have any previous knowledge of the tools that - will be presented at the workshop. - -

diff --git a/_includes/lesson_footer.html b/_includes/lesson_footer.html deleted file mode 100644 index 03091a7c..00000000 --- a/_includes/lesson_footer.html +++ /dev/null @@ -1,54 +0,0 @@ -{% comment %} - Footer for lesson pages. -{% endcomment %} - -{% include gh_variables.html %} - - diff --git a/_includes/life_cycle.html b/_includes/life_cycle.html deleted file mode 100644 index efc5b6d9..00000000 --- a/_includes/life_cycle.html +++ /dev/null @@ -1,34 +0,0 @@ - -{% if site.life_cycle == "pre-alpha" %} - -
-
- This lesson is still being designed and assembled (Pre-Alpha version) -
-
- - -{% elsif site.life_cycle == "alpha" %} - -
-
- This lesson is in the early stages of development (Alpha version) -
-
- - -{% elsif site.life_cycle == "beta" %} - -
-
- This lesson is being piloted (Beta version) -
-
- -{% elsif site.life_cycle == "stable" %} - -{% comment %} -We don't do anything special for now -{% endcomment %} - -{% endif %} diff --git a/_includes/links.md b/_includes/links.md deleted file mode 100644 index 9b8ecd5a..00000000 --- a/_includes/links.md +++ /dev/null @@ -1,50 +0,0 @@ -{% include base_path.html %} -[cc-by-human]: https://creativecommons.org/licenses/by/4.0/ -[cc-by-legal]: https://creativecommons.org/licenses/by/4.0/legalcode -[ci]: http://communityin.org/ -[coc-reporting]: https://docs.carpentries.org/topic_folders/policies/incident-reporting.html -[coc]: https://docs.carpentries.org/topic_folders/policies/code-of-conduct.html -[concept-maps]: https://carpentries.github.io/instructor-training/05-memory/ -[contrib-covenant]: https://contributor-covenant.org/ -[contributing]: {{ repo_url }}/blob/{{ source_branch }}/CONTRIBUTING.md -[cran-checkpoint]: https://cran.r-project.org/package=checkpoint -[cran-knitr]: https://cran.r-project.org/package=knitr -[cran-stringr]: https://cran.r-project.org/package=stringr -[dc-lessons]: http://www.datacarpentry.org/lessons/ -[email]: mailto:team@carpentries.org -[github-importer]: https://import.github.com/ -[importer]: https://github.com/new/import -[jekyll-collection]: https://jekyllrb.com/docs/collections/ -[jekyll-install]: https://jekyllrb.com/docs/installation/ -[jekyll-windows]: http://jekyll-windows.juthilo.com/ -[jekyll]: https://jekyllrb.com/ -[jupyter]: https://jupyter.org/ -[json]: http://json.org -[kramdown]: https://kramdown.gettalong.org/ -[lc-lessons]: https://librarycarpentry.org/lessons/ -[lesson-aio]: {{ relative_root_path }}{% link aio.md %} -[lesson-coc]: {{ relative_root_path }}{% link CODE_OF_CONDUCT.md %} -[lesson-example]: https://carpentries.github.io/lesson-example/ -[lesson-license]: {{ relative_root_path }}{% link LICENSE.md %} -[lesson-mainpage]: {{ relative_root_path }}{% link index.md %} -[lesson-reference]: {{ relative_root_path }}{% link reference.md %} -[lesson-setup]: {{ relative_root_path }}{% link setup.md %} -[mit-license]: https://opensource.org/licenses/mit-license.html -[morea]: https://morea-framework.github.io/ -[numfocus]: https://numfocus.org/ -[osi]: https://opensource.org -[pandoc]: https://pandoc.org/ -[paper-now]: https://github.com/PeerJ/paper-now -[python-gapminder]: https://swcarpentry.github.io/python-novice-gapminder/ -[pyyaml]: https://pypi.python.org/pypi/PyYAML -[r-markdown]: https://rmarkdown.rstudio.com/ -[rstudio]: https://www.rstudio.com/ -[ruby-install-guide]: https://www.ruby-lang.org/en/downloads/ -[ruby-installer]: https://rubyinstaller.org/ -[rubygems]: https://rubygems.org/pages/download/ -[styles]: https://github.com/carpentries/styles/ -[swc-lessons]: https://software-carpentry.org/lessons/ -[swc-releases]: https://github.com/swcarpentry/swc-releases -[training]: https://carpentries.github.io/instructor-training/ -[workshop-repo]: {{ site.workshop_repo }} -[yaml]: http://yaml.org/ diff --git a/_includes/main_title.html b/_includes/main_title.html deleted file mode 100644 index 7d17317f..00000000 --- a/_includes/main_title.html +++ /dev/null @@ -1,14 +0,0 @@ -{% comment %} - Main title for lesson pages. -{% endcomment %} - -{% include base_path.html %} - -{% if site.kind == "lesson" %} -

{{ site.title }}{% if page.title %}: {{ page.title }}{% endif %}

- -{% else %} - -

{{ page.title }}

- -{% endif %} diff --git a/_includes/manual_episode_order.html b/_includes/manual_episode_order.html deleted file mode 100644 index 2928ee85..00000000 --- a/_includes/manual_episode_order.html +++ /dev/null @@ -1,111 +0,0 @@ -{% comment %} - This file enables manual episode ordering until - GitHub Pages switches to Jekyll that supports it - without any major hackery. Note, some logic will - be required even when this transition happens - but it won't be as involved as what we have to do - in this file. - - To order lesson episodes or extras manually - (instead of the default alpha-numerical order), - create array variables 'episode_order' and - 'extras_order' in `_config.yml` like so: - - episode_order: - - episodeA - - episodeB - - extras_order: - - extraA - - extraB - - Note that "Reference" page is currently always - added to "Extras" as the first item. - - The main outcomes of the code in this file are: - - 'lesson_episodes' variable that replaces - 'site.episodes' variable when manual episode - order is defined. - - 'lesson_extras' variable that replaces - 'site.extras' variable when manual ordering of - files in '_extras' is used - - 'previous_episode' and 'next_episode' objects - that replace 'page.previous' and 'page.next' variables, - correspondingly, and that have such properties - as 'url' and 'title' and that are used in - 'episode_navbar.html'. - - When episode order is specified manualy, the 'lesson_episodes' - variable contains a list of episode names ("slugs", to be precise; - "slug" is the episode name without '.md'). Therefore, when we - iterate over 'lesson_episodes' (in syllabus.html and navbar.html) , - we have to check whether we use manual episode ordering and, if so, - find the corresponding episode object. This is what we do with the - following code in every loop over 'lesson_episodes': - - {% if site.episode_order %} - {% assign episode = site.episodes | where: "slug", lesson_episode | first %} - {% else %} - {% assign episode = lesson_episode %} - {% endif %} -{% endcomment %} - - - -{% if site.episode_order %} - {% assign lesson_episodes = site.episode_order %} -{% else %} - {% assign lesson_episodes = site.episodes %} -{% endif %} - - -{% comment %} - If 'episode_order' is defined, we need to determine - - previous episode object ('previous_episode') - - and next episode object ('next_episode') -{% endcomment %} - - -{% if site.episode_order %} - {% for lesson_episode in lesson_episodes %} - - {% comment %} - We iterate over the specified lesson episodes using - a 'for' loop because we can use - 'forloop.first', 'forloop.last', and 'forloop.index0'. - {% endcomment %} - - {% unless lesson_episode == page.slug %} {% continue %} {% endunless %} - - {% if forloop.first %} - {% assign previous_episode = nil %} - {% else %} - {% assign p_idx = forloop.index0 | minus: 1 %} - {% assign p_name = lesson_episodes[p_idx] %} - {% assign previous_episode = site.episodes | where: "slug", p_name | first %} - {% endif %} - - {% if forloop.last == true %} - {% assign next_episode = nil %} - {% else %} - {% assign n_idx = forloop.index0 | plus: 1 %} - {% assign n_name = lesson_episodes[n_idx] %} - {% assign next_episode = site.episodes | where: "slug", n_name | first %} - {% endif %} - {% endfor %} -{% else %} - {% assign previous_episode = page.previous %} - {% assign next_episode = page.next %} -{% endif %} - - - -{% if site.extras_order %} - {% assign lesson_extras = site.extras_order %} -{% else %} - {% assign lesson_extras = site.extras %} -{% endif %} - -{% comment %} - We do not need to determine "previous" or "next" extra. -{% endcomment %} diff --git a/_includes/navbar.html b/_includes/navbar.html deleted file mode 100644 index 0362851f..00000000 --- a/_includes/navbar.html +++ /dev/null @@ -1,120 +0,0 @@ -{% comment %} - Lesson navigation bar. -{% endcomment %} - -{% include gh_variables.html %} -{% include manual_episode_order.html %} - - diff --git a/_includes/sc/intro.html b/_includes/sc/intro.html deleted file mode 100644 index 7b9fbf57..00000000 --- a/_includes/sc/intro.html +++ /dev/null @@ -1,18 +0,0 @@ -

- Software Carpentry - aims to help researchers get their work done - in less time and with less pain - by teaching them basic research computing skills. - This hands-on workshop will cover basic concepts and tools, - including program design, version control, data management, - and task automation. - Participants will be encouraged to help one another - and to apply what they have learned to their own research problems. -

-

- - For more information on what we teach and why, - please see our paper - "Best Practices for Scientific Computing". - -

diff --git a/_includes/sc/schedule.html b/_includes/sc/schedule.html deleted file mode 100644 index 6894a19e..00000000 --- a/_includes/sc/schedule.html +++ /dev/null @@ -1,24 +0,0 @@ -
-
-

Day 1

- - - - - - - -
09:00 Automating tasks with the Unix shell
10:30 Coffee
12:00 Lunch break
13:00 Building programs with Python
14:30 Coffee
16:00 Wrap-up
-
-
-

Day 2

- - - - - - - -
09:00 Version control with Git
10:30 Coffee
12:00 Lunch break
13:00 Managing data with SQL
14:30 Coffee
16:00 Wrap-up
-
-
diff --git a/_includes/sc/syllabus.html b/_includes/sc/syllabus.html deleted file mode 100644 index a325ceec..00000000 --- a/_includes/sc/syllabus.html +++ /dev/null @@ -1,96 +0,0 @@ -
-
-

The Unix Shell

-
    -
  • Files and directories
  • -
  • History and tab completion
  • -
  • Pipes and redirection
  • -
  • Looping over files
  • -
  • Creating and running shell scripts
  • -
  • Finding things
  • -
  • Reference...
  • -
-
-
-

Programming in Python

-
    -
  • Using libraries
  • -
  • Working with arrays
  • -
  • Reading and plotting data
  • -
  • Creating and using functions
  • -
  • Loops and conditionals
  • -
  • Defensive programming
  • -
  • Using Python from the command line
  • -
  • Reference...
  • -
-
- - -
- -
-
-

Version Control with Git

-
    -
  • Creating a repository
  • -
  • Recording changes to files: add, commit, ...
  • -
  • Viewing changes: status, diff, ...
  • -
  • Ignoring files
  • -
  • Working on the web: clone, pull, push, ...
  • -
  • Resolving conflicts
  • -
  • Open licenses
  • -
  • Where to host work, and why
  • -
  • Reference...
  • -
-
- -
-

Open Refine

-
    -
  • Introduction to OpenRefine
  • -
  • Importing data
  • -
  • Basic functions
  • -
  • Advanced Functions
  • -
  • Reference...
  • -
-
-
diff --git a/_includes/sc/who.html b/_includes/sc/who.html deleted file mode 100644 index 2d8e94ae..00000000 --- a/_includes/sc/who.html +++ /dev/null @@ -1,8 +0,0 @@ -

- Who: - The course is aimed at graduate students and other researchers. - - You don't need to have any previous knowledge of the tools - that will be presented at the workshop. - -

diff --git a/_includes/syllabus.html b/_includes/syllabus.html deleted file mode 100644 index 6f113460..00000000 --- a/_includes/syllabus.html +++ /dev/null @@ -1,93 +0,0 @@ -{% include base_path.html %} - -{% comment %} - Display syllabus in tabular form. - Days are displayed if at least one episode has 'start = true'. -{% endcomment %} - -{% include manual_episode_order.html %} - -
-

Schedule

- - {% assign lesson_number = 0 %} - {% assign day = 0 %} - {% assign multiday = false %} - {% for lesson_episode in lesson_episodes %} - {% if site.episode_order %} - {% assign episode = site.episodes | where: "slug", lesson_episode | first %} - {% else %} - {% assign episode = lesson_episode %} - {% endif %} - {% if episode.start %}{% assign multiday = true %}{% break %}{% endif %} - {% endfor %} - {% assign current = site.start_time %} - - - - {% if multiday %}{% endif %} - - - - - {% for lesson_episode in lesson_episodes %} - {% if site.episode_order %} - {% assign episode = site.episodes | where: "slug", lesson_episode | first %} - {% else %} - {% assign episode = lesson_episode %} - {% endif %} - {% if episode.start %} {% comment %} Starting a new day? {% endcomment %} - {% assign day = day | plus: 1 %} - {% if day > 1 %} {% comment %} If about to start day 2 or later, show finishing time for previous day {% endcomment %} - {% assign hours = current | divided_by: 60 %} - {% assign minutes = current | modulo: 60 %} - - {% if multiday %}{% endif %} - - - - - {% endif %} - {% assign current = site.start_time %} {% comment %}Re-set start time of this episode to general daily start time {% endcomment %} - {% endif %} - {% assign hours = current | divided_by: 60 %} - {% assign minutes = current | modulo: 60 %} - - {% if multiday %}{% endif %} - - - - - {% assign current = current | plus: episode.teaching | plus: episode.exercises | plus: episode.break %} - {% endfor %} - {% assign hours = current | divided_by: 60 %} - {% assign minutes = current | modulo: 60 %} - - {% if multiday %}{% endif %} - - - - -
SetupDownload files required for the lesson
{% if hours < 10 %}0{% endif %}{{ hours }}:{% if minutes < 10 %}0{% endif %}{{ minutes }}Finish
{% if episode.start %}Day {{ day }}{% endif %}{% if hours < 10 %}0{% endif %}{{ hours }}:{% if minutes < 10 %}0{% endif %}{{ minutes }} - {% assign lesson_number = lesson_number | plus: 1 %} - {{ lesson_number }}. {{ episode.title }} - - {% if episode.break %} - Break - {% else %} - {% if episode.questions %} - {% for question in episode.questions %} - {{question|markdownify|strip_html}} - {% unless forloop.last %} -
- {% endunless %} - {% endfor %} - {% endif %} - {% endif %} -
{% if hours < 10 %}0{% endif %}{{ hours }}:{% if minutes < 10 %}0{% endif %}{{ minutes }}Finish
- -

- The actual schedule may vary slightly depending on the topics and exercises chosen by the instructor. -

- -
diff --git a/_includes/what-is-cwl.html b/_includes/what-is-cwl.html new file mode 100644 index 00000000..81ce8902 --- /dev/null +++ b/_includes/what-is-cwl.html @@ -0,0 +1,550 @@ + + + + + + + + + + + + + + + <no title> — Common Workflow Language User Guide 0.1 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+
+
+ + + + +
+
+ + + + + +
+ + + + + + + + + + + +
+ +
+ + +
+
+ +
+
+ +
+ +
+ + + + +
+ +
+ + +
+
+ + + + + +
+ +

CWL is a way to describe command-line tools and connect them together to create workflows. +Because CWL is a specification and not a specific piece of software, tools and workflows +described using CWL are portable across a variety of platforms that support the CWL standard.

+ + +
+ + + + + +
+ +
+
+
+ +
+ + + +
+ + +
+
+ +
+ +
+
+
+ + + + + + + + \ No newline at end of file diff --git a/_includes/workshop_ad.html b/_includes/workshop_ad.html deleted file mode 100644 index e8e72e34..00000000 --- a/_includes/workshop_ad.html +++ /dev/null @@ -1,32 +0,0 @@ -{% comment %} - Advertising box at the top of a workshop website home page. -{% endcomment %} -
-
-
-

{{page.venue}}

-
-
-

{{page.humandate}}

-

{% if page.humantime %}{{page.humantime}}{% endif %}

-
-
-

- Instructors: - {% if page.instructor %} - {{page.instructor | join: ', ' %}} - {% else %} - to be announced. - {% endif %} -

- {% if page.helper %} -

- Helpers: - {{page.helper | join: ', ' %}} -

- {% endif %} -
-
-
-
-
diff --git a/_includes/workshop_calendar.html b/_includes/workshop_calendar.html deleted file mode 100644 index f88327dc..00000000 --- a/_includes/workshop_calendar.html +++ /dev/null @@ -1 +0,0 @@ -Add to your Google Calendar. diff --git a/_includes/workshop_footer.html b/_includes/workshop_footer.html deleted file mode 100644 index 5390ac1d..00000000 --- a/_includes/workshop_footer.html +++ /dev/null @@ -1,26 +0,0 @@ -{% comment %} - Footer for a standard workshop. -{% endcomment %} - diff --git a/_layouts/base.html b/_layouts/base.html deleted file mode 100644 index 07a49727..00000000 --- a/_layouts/base.html +++ /dev/null @@ -1,49 +0,0 @@ ---- ---- -{% include base_path.html %} -{% include gh_variables.html %} - - - - - - - - - - - - - - - - {% include favicons.html %} - - - - - - - {% if page.title %}{{ page.title }}{% endif %}{% if page.title and site.title %} – {% endif %}{% if site.title %}{{ site.title }}{% endif %} - - - - - - {% include life_cycle.html %} - -
- {% include navbar.html %} -{{ content }} - {% if site.kind == "workshop" %} - {% include workshop_footer.html %} - {% else %} - {% include lesson_footer.html %} - {% endif %} -
- {% include javascript.html %} - - diff --git a/_layouts/break.html b/_layouts/break.html deleted file mode 100644 index ac582324..00000000 --- a/_layouts/break.html +++ /dev/null @@ -1,10 +0,0 @@ ---- -layout: base ---- -{% include episode_navbar.html episode_navbar_title=true %} -
-{% include episode_title.html %} -{% include episode_break.html %} -{{content}} -
-{% include episode_navbar.html episode_navbar_title=false %} diff --git a/_layouts/episode.html b/_layouts/episode.html deleted file mode 100644 index 0b276e77..00000000 --- a/_layouts/episode.html +++ /dev/null @@ -1,11 +0,0 @@ ---- -layout: base ---- -{% include episode_navbar.html episode_navbar_title=true %} -
-{% include episode_title.html %} -{% include episode_overview.html %} -{{content}} -{% include episode_keypoints.html %} -
-{% include episode_navbar.html episode_navbar_title=false %} diff --git a/_layouts/lesson.html b/_layouts/lesson.html deleted file mode 100644 index f3f7300e..00000000 --- a/_layouts/lesson.html +++ /dev/null @@ -1,8 +0,0 @@ ---- -layout: base ---- -{% include main_title.html %} -
- {{ content }} -
-{% include syllabus.html %} diff --git a/_layouts/page.html b/_layouts/page.html deleted file mode 100644 index 656edfef..00000000 --- a/_layouts/page.html +++ /dev/null @@ -1,7 +0,0 @@ ---- -layout: base ---- -{% include main_title.html %} -
-{{content}} -
diff --git a/_layouts/reference.html b/_layouts/reference.html deleted file mode 100644 index 27c96955..00000000 --- a/_layouts/reference.html +++ /dev/null @@ -1,6 +0,0 @@ ---- -layout: page -title: "Reference" ---- -{% include all_keypoints.html %} -{{content}} diff --git a/_layouts/workshop.html b/_layouts/workshop.html deleted file mode 100644 index cf57cdf4..00000000 --- a/_layouts/workshop.html +++ /dev/null @@ -1,55 +0,0 @@ ---- ---- -{% include base_path.html %} -{% include gh_variables.html %} - - - - - - - - - - - - - - - - - - - {% if page.redirect %} - - {% endif %} - - - - - - - - - - - {% include favicons.html %} - - - - - {{ page.venue }}: {{ page.humandate }} - - -
- {% include navbar.html %} - {% include workshop_ad.html %} -{{ content }} - {% include workshop_footer.html %} -
- {% include javascript.html %} - - diff --git a/_sources/LICENSE.md.txt b/_sources/LICENSE.md.txt new file mode 100644 index 00000000..84798e58 --- /dev/null +++ b/_sources/LICENSE.md.txt @@ -0,0 +1,2 @@ +```{include} ../LICENSE.md +``` diff --git a/_sources/_includes/what-is-cwl.md.txt b/_sources/_includes/what-is-cwl.md.txt new file mode 100644 index 00000000..f9357b8f --- /dev/null +++ b/_sources/_includes/what-is-cwl.md.txt @@ -0,0 +1,3 @@ +CWL is a way to describe command-line tools and connect them together to create workflows. +Because CWL is a specification and not a specific piece of software, tools and workflows +described using CWL are portable across a variety of platforms that support the CWL standard. diff --git a/_sources/episodes.md.txt b/_sources/episodes.md.txt new file mode 100644 index 00000000..8057f43b --- /dev/null +++ b/_sources/episodes.md.txt @@ -0,0 +1,12 @@ +--- +orphan: true +--- + +# This page has moved + +```{attention} + +This page is out-of-date and was kept here to preserve the links of the old +User Guide. Please use the new [Table of Contents](index.md#table-of-contents) +to browse the User Guide. +``` diff --git a/_sources/faq.md.txt b/_sources/faq.md.txt new file mode 100644 index 00000000..7f57e574 --- /dev/null +++ b/_sources/faq.md.txt @@ -0,0 +1,458 @@ +# FAQ + +% The items here do not look like questions, because we merged the +% How-Tos with the FAQ. We can/need to change it later. + +```{contents} +:local: +:backlinks: "top" +``` + +## How do I create non "`File`" types using `evalFrom`? + +```yaml +cwlVersion: v1.0 # or v1.1 +class: CommandLineTool +requirements: + InlineJavascriptRequirement: {} + +baseCommand: [ echo, "42" ] + +inputs: [] + +stdout: my_number.txt + +outputs: + my_number: + type: int + outputBinding: + glob: my_number.txt + loadContents: True + outputEval: $(parselnt(self[0].contents)) + + my_number_as_string: + type: string + outputBinding: + glob: my_number.txt + loadContents: True + outputEval: $(self[0].contents) +``` + +## How do I rename an input file? + +This example demonstrates how to change the name of an input file +as part of a tool description. +This could be useful when you are taking files produced from another +step in a workflow, and don't want to work with the default names that these +files were given when they were created. + +```yaml +requirements: + InitialWorkDirRequirement: + listing: + - entry: $(inputs.src1) + entryName: newName + - entry: $(inputs.src2) + entryName: $(inputs.src1.basename)_custom_extension +``` + +## How do I rename an output file? + +This example demonstrates how to change the name of an output file +from the default name given to it by a tool: + +```yaml +cwlVersion: v1.0 +class: CommandLineTool +requirements: + InlineJavascriptRequirement: {} + +baseCommand: [ touch, otu_table.txt ] + +inputs: + otu_table_name: string + +outputs: + otu_table: + type: File + outputBinding: + glob: otu_table.txt + outputEval: ${self[0].basename=inputs.otu_table_name; return self;} +``` + +By modifying the `basename` field in the `outputEval` field, CWL workflow engines will rename +the file using the new name for subsequent steps or as a workflow-level output. + +## How do I reference a local script? + +There are two ways to reference a local script: + +The first method involves adding the path to a folder containing your scripts to the `PATH` environment variable. This +allows you to execute the shell script directly (without explicitly using the `sh` or `bash` commands). + +Start with adding a _shebang_ at the top of your file: + +```{code-block} +#!/bin/bash +``` + +After that, make the script executable with the command `chmod +x scriptname.sh` + +Finally, modify your `PATH` to add the directory where your script is located. +(It is good practice to use `$HOME/bin` for storing your own scripts). + +```bash +export PATH=$PATH:$HOME/bin +``` + +Now you can use `baseCommand: scriptname.sh` to run the script directly. + +```cwl +#!/bin/bash +cwlVersion: v1.0 +class: CommandLineTool +baseCommand: scriptname.sh +``` + +When you wish to share your work later, you can place your script in a software container in the Docker format. + +The second method involves including an input of `type: File` in the script itself: + +```cwl +class: CommandLineTool + +inputs: + my_script: + type: File + inputBinding: + position: 0 + + + # other inputs go here + +baseCommand: sh + +outputs: [] +``` + +## How can I set `self`-based input bindings for optional inputs? + +Currently, `cwltool` can't cope with missing optional inputs if their +input binding makes use of `self`. +Below is an example workaround for this, +pending a more sophisticated fix. + +```yaml +#!/usr/bin/env cwl-runner +cwlVersion: v1.0 +class: CommandLineTool + +requirements: { InlineJavascriptRequirement: {} } + +inputs: + cfg: + type: File? + inputBinding: + prefix: -cfg + valueFrom: | + ${ if(self === null) { return null;} else { return self.basename; } } + +baseCommand: echo + +outputs: [] +``` + +## How can I model a "one-or-the-other" parameter? + +Below is an example showing how +to specify different strings to be added to a command line, +based on the value given to a Boolean parameter. + +```yaml +cwlVersion: v1.0 +class: CommandLineTool +requirements: + InlineJavascriptRequirement: {} +inputs: + fancy_bool: + type: boolean + default: false # or true + inputBinding: + valueFrom: ${if (self) { return "foo";} else { return "bar";}} + +baseCommand: echo + +outputs: [] +``` + +## How do I connect a solo value to an input that expects an array of that type? + +Add a [`MultipleInputFeatureRequirement`](https://www.commonwl.org/v1.0/Workflow.html#MultipleInputFeatureRequirement) +along with +[`linkMerge: merge_nested`](https://www.commonwl.org/v1.0/Workflow.html#WorkflowStepInput): + +> merge_nested +> +> The input must be an array consisting of exactly one entry for each input link. +> If "merge_nested" is specified with a single link, the value from the link must be wrapped in a single-item list. + +Which means "create a list with exactly these sources as elements". + +Or in other words: if the destination is of type `File[]` (an array of `File`s) +and the source is a single `File` then add `MultipleInputFeatureRequirement` to the Workflow level `requirements` +and add `linkMerge: merge_nested` under the appropriate `in` entry of the destination step. + +```yaml +cwlVersion: v1.0 +class: Workflow + +requirements: + MultipleInputFeatureRequirement: {} + +inputs: + readme: File + +steps: + first: + run: tests/checker_wf/cat.cwl + in: + cat_in: # type is File[] + source: [ readme ] # but the source is of type File + linkMerge: merge_nested + out: [txt] + +outputs: + result: + type: File + outputSource: first/txt +``` +## How do make an input optional? 💯 + +To make an input parameter optional, add a question mark to the type declaration. + +```yaml +inputs: + InputRead1: + type: File + inputBinding: + position: 100 + + #Optional Inputs + isCasava: + type: boolean? + inputBinding: + position: 1 + prefix: "--casava" +``` + +## How do I specify an input that must come from a list of predefined values (i.e. How do I use enum inputs) ? + +For command line flags that require a specific input as the argument an enum type can be declared in CWL. **Specifying null here is known as long form style. It does the same thing as the question mark on the other inputs.** + +```yaml +Format: + type: + - "null" + - type: enum + symbols: + - bam + - sam + - bam_mapped + - sam_mapped + - fastq + inputBinding: + position: 2 + prefix: "--format" +``` + +## How do I describe dependent or exclusive input parameters(e.g. How do I use record inputs)? + +For commandline flags that are either **mutually exclusive** or **dependent** a special record type can be defined. You can also specify null here to create optional inputs. + +```yaml +#Using record inputs to create mutually exclusive inputs + + Strand: + type: + - "null" + - type: record + name: forward + fields: + forward: + type: boolean + inputBinding: + prefix: "--fr-stranded" + + - type: record + name: reverse + fields: + reverse: + type: boolean + inputBinding: + prefix: "--rf-stranded" + + PseudoBam: + type: boolean? + inputBinding: + prefix: "--pseudobam" + +#Using record inputs to create dependent inputs + + GenomeBam: + type: + - "null" + - type: record + name: genome_bam + fields: + genomebam: + type: boolean + inputBinding: + prefix: "--genomebam" + + gtf: + type: File + inputBinding: + prefix: "--gtf" + + chromosomes: + type: File + inputBinding: + prefix: "--chromosomes" +``` +## How do I set mutually exclusive parameters? + +To properly set fields in a record input type, you need to pass a dictionary to the input to properly set the parameters. This is done by using inline JavaScript and returning the dictionary with the key of the field you want to set. The source field is set to indicate the input from the workflow to be used as the value. + +```yaml +steps: + + build_hisat2_index: + run: ../Tools/Hisat2-Index.cwl + in: + InputFiles: + source: FastaFiles + valueFrom : | + ${return {"fasta": self};} + + IndexName: IndexName + + out: [indexes] +``` + +## How can I set Booleans? + +These can be set by using the default field +```yaml +input: + default: true +``` +## What should I do when concatenating strings in inputs? + +The valueFrom field must be used instead of default. + +```yaml +input: + valueFrom: | + My String: $(input.stringvalue) +``` + +## I get `cwltool` errors due to filenames with space characters inside. What should I do? + +`cwltool` does not allow some characters in filenames by default. + +For example, the filename `a space is here.txt` includes 3 space characters. + +```console +ERROR Workflow error, try again with --debug for more information: + +Invalid filename: 'a space is here.txt' contains illegal characters +``` + +If you can not avoid these dangerous characters, then pass `--relax-path-checks` to `cwltool`. + +## What should I do when I get CWL Parameter Reference error due to hyphen in an input identifier? + +If `cwltool --validate` returns valid + +```console +$ cwltool --validate cwl/qiime.cwl +INFO /usr/local/bin/cwltool 1.0.20190831161204 +INFO Resolved 'cwl/qiime.cwl' to 'file:///workspace/cwl/qiime.cwl' +cwl/qiime.cwl is valid CWL. +``` + +But executing it causes an error like: + +```console +$ cwltool cwl/qiime.cwl --sample-input metadata.tsv +INFO /usr/local/bin/cwltool 1.0.20190831161204 +INFO Resolved 'cwl/qiime.cwl' to 'file:///workspace/cwl/qiime.cwl' +ERROR Workflow error, try again with --debug for more information: +cwl/qiime.cwl:14:5: Expression evaluation error: + Syntax error in parameter reference '(inputs.sample-input)'. This could be due + to using Javascript code without specifying InlineJavascriptRequirement. +``` + +The file is here + +```cwl +cwlVersion: v1.0 +class: CommandLineTool +baseCommand: [qiime, metadata, tabulate] +arguments: + - prefix: --m-input-file + valueFrom: $(inputs.sample-input) +inputs: + sample-input: File +outputs: [] +``` + +Problem caused by `-` (hyphen character). + +```cwl +valueFrom: $(inputs.sample-input) + # ^ this is problem +... + +inputs: + sample-input: File + # ^ this is problem +``` + + +To fix this error, change `-` (hyphen) to `_` (underscore): + +```cwl +valueFrom: $(inputs.sample_input) + # ^ changed here + +... + +inputs: + sample_input: File + # ^ changed here +``` + +If it is not possible to change the input identifier, then you can use an alternative CWL Parameter Reference syntax: + +```cwl +valueFrom: $(inputs["sample-input"]) +``` + +## How do I use CWL and cwltool with Singularity? + + +The CWL standards are built around (optional) Docker format containers. +The reference runner and several other CWL implementations support running +those Docker format containers using the Singularity engine. Directly +specifying a Singularity format container is not part of the CWL standards. + +## How do I debug the JavaScript in my CWL tool? + +You can use the --js-console option of cwltool, or you can try +creating a JavaScript or TypeScript project for your code, and load it +using expressionLib, e.g.: +https://github.com/common-workflow-language/common-workflow-language/blob/master/v1.0/v1.0/template-tool.cwl#L6-L8 + +% - https://github.com/common-workflow-language/user_guide/issues/6 +% - Maybe adapt some of these (or move to a workaround?) https://www.synapse.org/#!Synapse:syn2813589/wiki/401464 diff --git a/_sources/index.md.txt b/_sources/index.md.txt new file mode 100644 index 00000000..8e10fa54 --- /dev/null +++ b/_sources/index.md.txt @@ -0,0 +1,41 @@ +# Common Workflow Language User Guide + +This guide will introduce you to writing workflows using the +[Common Workflow Language](https://www.commonwl.org/) (CWL) +open standards. This guide describes the latest specification {{ cwl_version }}. + +```{admonition} Contributions and Feedback are Welcome! + +If you find that something is missing from this guide, or if you would +like to provide other feedback, file an Issue on the [project repository +for this guide][repo]. You can also suggest changes directly in a Pull +Request by clicking the "Edit this page" button at the right sidebar of +each page. +``` + +## Navigating the User Guide + +If you are a beginner user get started with the [Introduction](/introduction/index.md) +section. For advanced users the subsections of the +[Topics](/topics/index.md) have detailed information about the +most common topics for CWL. + +The Table of Contents is displayed at the top menu and also on the left sidebar. +It also appears further down this page but with links to subsections. The right +sidebar contains links to the sections of each page, and the Search form is on +the left sidebar. + +## Table of Contents + +```{toctree} +:maxdepth: 3 +:numbered: + +introduction/index.md +topics/index.md +tutorials.md +faq.md +LICENSE.md +``` + +[repo]: https://github.com/common-workflow-language/user_guide/issues diff --git a/_sources/introduction/basic-concepts.md.txt b/_sources/introduction/basic-concepts.md.txt new file mode 100644 index 00000000..c6013a29 --- /dev/null +++ b/_sources/introduction/basic-concepts.md.txt @@ -0,0 +1,186 @@ +# Basic Concepts + +This section describes the basic concepts for users to get started on working with +Common Workflow Language (CWL) workflows. Readers are expected to be familiar +with workflow managers, YAML, and comfortable with following instructions for the +command-line. The other sections of the user guide cover the same concepts, but +in more detail. If you are already familiar with CWL or you are looking for more advanced +content, you may want to skip this section. + +## The CWL Specification + +```{include} /_includes/what-is-cwl.md +``` + +```{image} /_static/images/logos/cwl/CWL-Logo-HD-cropped2.png +:name: cwl-logo +:width: 300px +:align: center +``` + +The CWL specification is a document written and maintained by the CWL community. +The specification has different versions. The version covered in this user guide +is the {{ cwl_version }}. + +The specification version can have up to three numbers separated by `.`s (dots). +The first number is the major release, used for backward-incompatible changes like +the removal of deprecated features. The second number is the minor release, +used for new features or smaller changes that are backward-compatible. The last number +is used for bug fixes, like typos and other corrections to the specification. + +```{note} + +The model used for the specification version is called Semantic Versioning. See +the end of this section to [learn more](#learn-more) about it. +``` + +## Implementations + +An implementation of the CWL specification is any software written following +what is defined in a version of the specification document. However, implementations may +not implement every aspect of the specification. CWL implementations are +licensed under both Open Source and commercial licenses. + +CWL is well suited for describing large-scale workflows in cluster, +cloud and high performance computing environments where tasks are scheduled +in parallel across many nodes. + +% TODO: add a link to the Core Concepts -> Requirements section below? + + +```{graphviz} +:name: specification-and-implementations-graph +:caption: CWL specification, implementations, and other tools. +:align: center + +digraph G { + compound=true; + rankdir="LR"; + ranksep=0.75; + fontname="Verdana"; + fontsize="10"; + graph [splines=ortho]; + node [fontname="Verdana", fontsize="10", shape=box]; + edge [fontname="Verdana", fontsize="10"]; + subgraph cluster_0 { + label="Implementations"; + ranksep=0.25; + + cwltool; + toil; + Arvados; + runner_others[label="..."]; + label="CWL Runners"; + } + + subgraph cluster_1 { + label="Tools"; + ranksep=0.25; + + subgraph cluster_2 { + "vscode-cwl"; + "vim-cwl"; + benten; + editor_others[label="..."]; + label="Editors"; + } + + subgraph cluster_3 { + "CWL Viewer"; + "vue-cwl"; + viewer_others[label="..."]; + label="Viewers"; + } + + "And more"; + } + cwltool -> "CWL Specification" [ltail=cluster_0, dir=back]; + "CWL Specification" -> "vscode-cwl" [lhead=cluster_1]; + "vscode-cwl" -> "CWL Viewer" [style=invis]; + "CWL Viewer" -> "And more" [style=invis]; +} + +``` + +## Processes and Requirements + +A process is a computing unit that takes inputs and produces outputs. The +behavior of a process can be affected by the inputs, requirements, and hints. +There are four types of processes defined in the CWL specification +{{ cwl_version }}: + +- A command-line tool. +- An expression tool. +- An operation. +- A workflow. + +{{ CWL_PROCESSING_UNITS_GRAPH }} + +A command-line tool is a wrapper for a command-line utility like `echo`, +`ls`, and `tar`. A command-line tool can be called from a workflow. + +An expression tool is a wrapper for a JavaScript expression. It can +be used to simplify workflows and command-line tools, moving common +parts of a workflow execution into reusable JavaScript code that +takes inputs and produces outputs like a command-line tool. + +Operation is an abstract process that also takes inputs, produces +outputs, and can be used in a workflow. But it is a special operation +not so commonly used. It is discussed in the [Operations section](../topics/operations.md) of this user guide. + +The workflow is a process that contains steps. Steps can be other +workflows (nested workflows), command-line tools, or expression tools. +The inputs of a workflow can be passed to any of its steps, while +the outputs produced by its steps can be used in the final output +of the workflow. + +The CWL specification allows for implementations to provide extra +functionality and specify prerequisites to workflows through *requirements*. +There are many requirements defined in the CWL specification, for instance: + +- [`InlineJavascriptRequirement`](https://w3id.org/cwl/Workflow.html#InlineJavascriptRequirement) - enables JavaScript in expressions. +- [`SubworkflowFeatureRequirement`](https://w3id.org/cwl/Workflow.html#SubworkflowFeatureRequirement) - enables nested workflows. +- [`InitialWorkDirRequirement`](https://w3id.org/cwl/Workflow.html#InitialWorkDirRequirement) - controls staging files in the input directory. + +Some CWL runners may provide requirements that are not in the specification. +For example, GPU requirements are supported in `cwltool` through the +`cwltool:CUDARequirement` requirement, but it is not part of the +{{ cwl_version }} specification and may not be supported by other CWL +runners. + +Hints are similar to requirements, but while requirements list features +that are required, hints list optional features. Requirements are explained +in detail in the [Requirements](../topics/requirements-and-hints.md) section. + +## FAIR Workflows + +> The FAIR principles have laid a foundation for sharing and publishing +> digital assets, and in particular, data. The FAIR principles emphasize +> machine accessibility and that all digital assets should be Findable, +> Accessible, Interoperable, and Reusable. Workflows encode the methods +> by which the scientific process is conducted and via which data are +> created. It is thus important that workflows both support the creation +> of FAIR data and themselves adhere to the FAIR principles. +> — [FAIR Computational Workflows](https://workflows.community/groups/fair/), +> Workflows Community Initiative. + +CWL has roots in "make" and many similar tools that determine order of +execution, based on dependencies between tasks. However, unlike "make", CWL +tasks are isolated, and you must be explicit about your inputs and outputs. + +The benefit of explicitness and isolation are flexibility, portability, and +scalability; tools and workflows described with CWL can transparently leverage +technologies such as Docker and be used with CWL implementations from different +vendors. + +`cwltool` also uses the PROV-O standard ontology for data provenance. + +## Learn More + +- Semantic Versioning - +- The CWL Specification page in the CWL website: +- The Command Line Tool Description Standard: +- The current CWL specification on GitHub: {{ ''.format(cwl_version_text) }} +- The list of Implementations in the CWL website: +- PROV-O: The PROV Ontology - +- CWL Operations are covered in the [Operations](../topics/operations.md) section of this user guide. diff --git a/_sources/introduction/index.md.txt b/_sources/introduction/index.md.txt new file mode 100644 index 00000000..78d32ad3 --- /dev/null +++ b/_sources/introduction/index.md.txt @@ -0,0 +1,14 @@ +# Introduction + +This section will guide you through a short introduction to CWL, +the prerequisites for following this user guide, and some +basic concepts that are useful to know before reading the rest of the +user guide. + +```{toctree} +:maxdepth: 2 + +quick-start.md +prerequisites.md +basic-concepts.md +``` diff --git a/_sources/introduction/prerequisites.md.txt b/_sources/introduction/prerequisites.md.txt new file mode 100644 index 00000000..1dc47954 --- /dev/null +++ b/_sources/introduction/prerequisites.md.txt @@ -0,0 +1,186 @@ +# Prerequisites + +% This page supersedes the old setup page: setup.md. We used that page as a reference while +% writing this documentation. + +The software and configurations listed in this section are prerequisites for +following this user guide. The CWL standards are implemented by many different +workflow runners and platforms. This list of requirements focuses on the CWL reference runner, +`cwltool`. You can use another CWL-compatible runner or workflow system, but the results and +interface may look different (though the exact workflow outputs should be identical). + +```{admonition} CWL Implementations + +There are many implementations of the CWL standards. Some are complete CWL runners, while +others could be plug-ins or extensions to workflow engines. We have a better +explanation in the [Implementations](basic-concepts.md#implementations) section. +``` + +## Operating System + +We recommend using an up-to-date operating system. You can choose any +of the following options for your operating system: + +- Linux +- macOS +- Windows + +```{note} +If you are using Windows, you will have to install the Windows Subsystem for Linux 2 as documented in the +[`cwltool` documentation for Microsoft Windows users](https://github.com/common-workflow-language/cwltool/blob/main/README.rst#ms-windows-users). +Your operating system also needs internet access and a recent version of Python (3.6+). +``` + +## CWL Runner + +% https://github.com/common-workflow-language/user_guide/issues/166 +% https://www.synapse.org/#!Synapse:syn2813589/wiki/401462 + +The first thing you will need for running CWL workflows is a CWL runner. +`cwltool` is a Python Open Source project maintained by the CWL community. It +is also the CWL reference runner, which means it must support everything in the +current CWL specification, {{ cwl_version }}. + +`cwltool` can be installed with `pip`, `apt`, or `conda`. We recommend using a virtual environment +like `venv` or `conda`. + +```{note} +Visit the `cwltool` [documentation](https://cwltool.readthedocs.io/en/latest/#install) +for details on installing `cwltool`. +``` + +Let's use a simple CWL tool description `true.cwl` with `cwltool`. + +```{literalinclude} /_includes/cwl/true.cwl +:language: yaml +:caption: "`true.cwl`" +:name: true.cwl +``` + +The `cwltool` command has an option to validate CWL tool and workflow descriptions. This option will parse the +CWL document, look for syntax errors, and verify that the workflow descriptions are compliant +with the CWL standards. However, these actions will be performed without running the document. To validate CWL workflows (or even a +standalone command line tool description like the above) pass the `--validate` option +to the `cwltool` command: + +```{runcmd} cwltool --validate true.cwl +:name: validating-truecwl-with-cwltool +:caption: Validating `true.cwl` with `cwltool`. +``` + +You can run the CWL tool description by omitting the `--validate` option: + +```{runcmd} cwltool true.cwl +:name: running-true.cwl-with-cwltool +:caption: Running `true.cwl` with `cwltool`. +``` + +### Generic ``cwl-runner`` alias + +`cwl-runner` is an implementation-agnostic alias for any CWL compliant runner. This simply means +that the `cwl-runner` alias command can be invoked independently, and is not reliant on a particular +CWL runner program name. +Users can invoke `cwl-runner` instead of invoking a CWL runner like `cwltool` +directly. The `cwl-runner` is installed by a system administrator or user to point to the preferred +CWL implementation. +This is convenient for environments with multiple CWL runners. + +The CWL community publishes a Python package with the name `cwlref-runner` that installs +an alias for `cwltool` under the name `cwl-runner`. + +```{code-block} console +:name: installing-cwlrunner-with-pip +:caption: Installing `cwl-runner` alias for cwltool with `pip`. + +$ pip install cwlref-runner +``` + +Now you can validate and run your workflow with the `cwl-runner` executable, +which will invoke `cwltool`. You should have the same results and output +as in the previous section. + +```{runcmd} cwl-runner --validate true.cwl +:name: validating-true.cwl-with-cwl-runner +:caption: Validating `true.cwl` with `cwl-runner`. +``` + +```{runcmd} cwl-runner true.cwl +:name: running-true.cwl-with-cwl-runner +:caption: Running `true.cwl` with `cwl-runner`. +``` + +Another way to execute `cwl-runner` is by invoking the file directly. For that, +the first thing you need to do is copy `true.cwl` workflow into a new file: +`true_shebang.cwl`, and include a special first line, a *shebang*: + +```{literalinclude} /_includes/cwl/true_shebang.cwl +:language: cwl +:name: "true_shebang.cwl" +:caption: "`true_shebang.cwl`" +``` + +Now you can make the file `true_shebang.cwl` executable with `chmod u+x`. + +```{code-block} console +:name: making-true.cwl-executable +:caption: Making `true.cwl` executable. + +$ chmod u+x true.cwl +``` + +And finally, you can execute it directly in the command-line. On execution, the program +specified in the shebang (`cwl-runner`) will be used to execute the +rest of the file. + +```{runcmd} ./true_shebang.cwl +:name: running-true_shebang.cwl-with-a-shebang +:caption: Running `true_shebang.cwl` with a shebang. +``` + +```{note} +The *shebang* is the two-character sequence `#!` at the beginning of a +script. When the script is executable, the operating system will execute +the script using the executable specified after the shebang. It is +considered a good practice to use `/usr/bin/env [executable]` rather than using a hard-coded location, since `/usr/bin/env [executable]` +looks for the `[executable]` program in the system `PATH`, +``` + +## Text Editor + +You can use any text editor with CWL, but for syntax highlighting we recommend +an editor with YAML support. Popular editors are Visual Studio Code, Sublime, +WebStorm, vim/neovim, and Emacs. + +There are extensions for Visual Studio Code and WebStorm that provide +integration with CWL, and features such as customized syntax highlighting and better +auto-complete: + +- Visual Studio Code with the Benten (CWL) plugin - +- cwl-plugin for IntelliJ - + +The CWL community also maintains a list of editors and viewers: + + +## Docker + +% https://github.com/common-workflow-language/user_guide/issues/119 + +`cwltool` uses Docker to run tools, workflows, and workflow steps that specify a software container. +Follow the instructions in the Docker documentation to install it for your +operating system: . + +You do not need to know how to write and build Docker containers. In the +rest of the user guide, we will use existing Docker images for running +examples, and to clarify the differences between the execution models +with and without containers. + +```{note} +`cwltool` supports running containers with Docker, Podman, udocker, and +Singularity. You can also use alternative container registries for pulling +images. +``` + +## Learn More + +- The [Implementations](basic-concepts.md#implementations) topic in the next section, Basic Concepts. +- The Python `venv` module: diff --git a/_sources/introduction/quick-start.md.txt b/_sources/introduction/quick-start.md.txt new file mode 100644 index 00000000..0e18127b --- /dev/null +++ b/_sources/introduction/quick-start.md.txt @@ -0,0 +1,107 @@ +# Quick Start + +This section will show you a brief overview of what CWL is, and where you +can learn more about it. No previous knowledge of CWL is required, but you +must be comfortable following instructions for the command-line. + +## “Hello World” + +```{include} /_includes/what-is-cwl.md +``` + +CWL documents are written in [YAML](../topics/index.md) (and/or JSON). +The example below shows a simple CWL “Hello World” workflow annotated +with comments. Note that comments start with `#`: + +```{literalinclude} /_includes/cwl/hello_world.cwl +:language: cwl +:name: hello_world.cwl +:caption: "`hello_world.cwl`" +``` + +The example above is just a wrapper for the `echo` command-line tool. +Running the workflow above with the default input values will produce the same result as the +command-line `echo "Hello World"`. + +```{note} +In CWL, there is a distinction between a command-line tool and a workflow. But +for the sake of simplicity, we are using the term “workflow” here. You will learn +more about this in the [basic concepts](basic-concepts.md) section. +``` + +## Installing a CWL Runner + +`cwltool` is an implementation of the CWL specification. It is also the +CWL *Reference Runner* for the specification, and it is compliant with the +latest version of the specification: {{ cwl_version }}. You can install +`cwltool` using `pip`: + +```{code-block} console +:name: installing-cwltool-with-pip +:caption: Installing `cwltool` with `pip`. + +$ pip install cwltool +``` + +```{note} +If installing the cwltool using the pip command doesn't work for you, the [prerequisites](prerequisites.md) section contains other ways to install `cwltool` and a more detailed list +of software and libraries used for following the rest of this user guide. +``` + +## Running "Hello World" + +The usage of the `cwltool` command-line executable is basically +`cwltool [OPTIONS] [CWL_DOCUMENT] [INPUTS_OBJECT]`. You can run the +`hello_world.cwl` workflow without specifying any option: + +```{runcmd} cwltool hello_world.cwl +:name: running-hello_world.cwl-with-cwltool +:caption: Running `hello_world.cwl` with `cwltool`. +``` + +Or you can override the default value of the input parameter `message`, similar +to how you would change the argument of the `echo` base command: + +```{runcmd} cwltool hello_world.cwl --message="Hola mundo" +:name: running-hello_world.cwl-with-cwltool-passing-an-input-parameter +:caption: Running `hello_world.cwl` with `cwltool` passing an input parameter. +``` + +Another way of passing values to your workflow input parameters is via an +*Inputs Object*. This is a file containing the input fields with their +corresponding values. The Inputs Objects file can be written in JSON or YAML. For example: + +```{literalinclude} /_includes/cwl/hello_world-job.json +:language: json +:name: hello_world-job.json +:caption: "`hello_world-job.json`" +``` + +You can use this Inputs Object file now to execute the “Hello World” workflow: + +```{runcmd} cwltool hello_world.cwl hello_world-job.json +:name: passing-an-inputs-object-file-to-cwltool +:caption: Passing an Inputs Object file to `cwltool`. +``` + +```{note} +We used a similar file name for the workflow and for the Inputs Object files. +The *-job.json* suffix is very common in Inputs Object files, but it is not +a requirement. You can choose any name for your workflows and Inputs Object +files. +``` + +## Learn More + +Continue reading the next sections of this User Guide! +- [List of CWL Implementations](https://www.commonwl.org/implementations). +- The [`common-workflow-language` organization](https://github.com/common-workflow-language) at GitHub. +- [Common Workflow Language at Wikipedia](https://en.wikipedia.org/wiki/Common_Workflow_Language). +- [YAML.org](http://yaml.org/) and [YAML at Wikipedia](https://en.wikipedia.org/wiki/YAML). +- The {{'[CWL Specification VERSION](https://www.commonwl.org/VERSION)'.replace('VERSION', cwl_version_text) }}. +- [Workflow management system at Wikipedia](https://en.wikipedia.org/wiki/Workflow_management_system). + +% N.B.: Wondering what's up with this syntax in the CWL Specification link above? +% It's necessary as MyST Parser does not allow substitutions in links, for more: +% - https://myst-parser.readthedocs.io/en/latest/syntax/optional.html#substitutions-and-urls +% - https://github.com/executablebooks/MyST-Parser/issues/279 diff --git a/_sources/setup.md.txt b/_sources/setup.md.txt new file mode 100644 index 00000000..dc8d3f26 --- /dev/null +++ b/_sources/setup.md.txt @@ -0,0 +1,12 @@ +--- +orphan: true +--- + +# This page has moved + +```{attention} + +This page is out-of-date and was kept here to preserve the links of the old +User Guide. The information on this page has been migrated to the +[FAQ](/faq.md) section of the new user guide. +``` diff --git a/_sources/topics/additional-arguments-and-parameters.md.txt b/_sources/topics/additional-arguments-and-parameters.md.txt new file mode 100644 index 00000000..fb39ae06 --- /dev/null +++ b/_sources/topics/additional-arguments-and-parameters.md.txt @@ -0,0 +1,51 @@ +# Additional Arguments and Parameters + +Sometimes tools require additional command line options that don't +correspond exactly to input parameters. + +In this example, we will wrap the Java compiler to compile a java source +file to a class file. By default, "javac" will create the class files in +the same directory as the source file. However, CWL input files (and the +directories in which they appear) may be read-only, so we need to +instruct "javac" to write the class file to the designated output directory +instead. + +```{literalinclude} /_includes/cwl/additional-arguments-and-parameters/arguments.cwl +:language: cwl +:caption: "`arguments.cwl`" +:name: arguments.cwl +``` + +```{literalinclude} /_includes/cwl/additional-arguments-and-parameters/arguments-job.yml +:language: yaml +:caption: "`arguments-job.yml`" +``` + +Next, create a sample Java file to use with the command-line tool. + +```{code-block} console +$ echo "public class Hello {}" > Hello.java +``` + +And now invoke `cwltool` providing the tool description and the input object on the command line: + +```{runcmd} cwltool arguments.cwl arguments-job.yml +:working-directory: src/_includes/cwl/additional-arguments-and-parameters +``` + +Here we use the `arguments` field to add an additional argument to the +command line that isn't tied to a specific input parameter. + +```cwl +arguments: ["-d", $(runtime.outdir)] +``` + +This example references a runtime parameter. Runtime parameters provide +information about the hardware or software environment when the tool is +actually executed. The `$(runtime.outdir)` parameter is the path to the +designated output directory. Other parameters include `$(runtime.tmpdir)`, +`$(runtime.ram)`, `$(runtime.cores)`, `$(runtime.outdirSize)`, and +`$(runtime.tmpdirSize)`. See the [Runtime Environment][runtime] section of the +CWL specification for details. + +[runtime]: https://www.commonwl.org/v1.0/CommandLineTool.html#Runtime_environment diff --git a/_sources/topics/best-practices.md.txt b/_sources/topics/best-practices.md.txt new file mode 100644 index 00000000..52bb5097 --- /dev/null +++ b/_sources/topics/best-practices.md.txt @@ -0,0 +1,115 @@ +# Best Practices + +The following are a set of recommended good practices to keep in mind when writing a +Common Workflow Language description for a tool or workflow. These guidelines +are presented for consideration on a scale of usefulness: although more is better, not +all are required. + +- No `type: string` parameters for names of input or reference + files/directories; use `type: File` or `type: Directory` as appropriate. + +- A CWL document (in conjunction with any external components like `Dockerfile`s) is software code. + Workflow developers should be aware that the usual rules of software licensing apply to this + document. For example, if the workflow is shared publicly, licensing terms must be clear so that + a future user understands under what conditions they can run the workflow, modify it and/or + combine it with other workflows. For this reason, please consider including a license field in the + document. The authors of this guide urge you to choose a pre-existing license rather than trying + to write your own (see the link below to learn more about choosing a license), and our recommended + practice is to choose a license that allows for re-use by anyone, e.g. [Apache 2.0][apache-license]. + + If possible, the license should be specified with its corresponding [SPDX identifier][spdx]. + Construct the metadata field for the license by providing a URL of the form + `https://spdx.org/licenses/[SPDX-ID]` where `SPDX-ID` is taken from the list of identifiers + linked above. See the example snippet below for guidance. For non-standard licenses without an SPDX + identifier, provide a URL to the license. + + Useful reading: "[A Quick Guide to Software Licensing for the Scientist-Programmer][sci-license]" + + _Example of metadata field for license with SPDX identifier:_ + + ```cwl + $namespaces: + s: https://schema.org/ + s:license: https://spdx.org/licenses/Apache-2.0 + # other s: declarations + ``` + + For more examples of providing metadata within CWL descriptions, see + [the Metadata and Authorship section of this User Guide](../topics/metadata-and-authorship.md). + +- Include [attribution information][license-example] for the author(s) of + the CWL tool or workflow description. Use unambiguous identifiers like + [ORCID][orcid]. + +- In tool descriptions, list dependencies using short name(s) under + [`SoftwareRequirement`](https://w3id.org/cwl/CommandLineTool.html#SoftwareRequirement). + +- Include [SciCrunch][scicrunch] identifiers for dependencies in + `https://identifiers.org/rrid/RRID:SCR_NNNNNN` format. + +- All `input` and `output` identifiers should reflect their conceptual + identity. Use informative names like `unaligned_sequences`, `reference_genome`, + `phylogeny`, or `aligned_sequences` instead of `foo_input`, `foo_file`, + `result`, `input`, `output`, and so forth. + +- In tool descriptions, include a list of version(s) of the tool that are + known to work with this description under [`SoftwareRequirement`](https://w3id.org/cwl/CommandLineTool.html#SoftwareRequirement). + +- `format` should be specified for all input and output `File`s. + Bioinformatics tools should use format identifiers from [EDAM][edam-example]. + See also `iana:text/plain`, `iana:text/tab-separated-values` with + `$namespaces: { iana: "https://www.iana.org/assignments/media-types/" }`. + [Full IANA media type list][iana-types] (also known as MIME types). For + non-bioinformatics tools, use or build an appropriate ontology/controlled + vocabulary in the same way. Please edit this page to let us know about it. + +- Mark all input and output `File`s that are read from or written to in a + streaming compatible way (only once, no random-access), as `streamable: true`. + +- Each [`CommandLineTool`](https://w3id.org/cwl/CommandLineTool.html#CommandLineTool) description should focus on a single operation + only, even if the (sub)command is capable of more. Don't overcomplicate your + tool descriptions with options that you don't need or use. + +- Custom types should be defined with one external YAML per type + definition for re-use. + +- Include a top-level short `label` summarising the tool/workflow. + +- If useful, include a top-level `doc` as well. This should provide a + longer, more detailed description than was provided in the top-level `label` + (see above). + +- Use `type: enum` instead of `type: string` for elements with a fixed + list of valid values. + +- Evaluate all use of JavaScript for possible elimination or replacement. + One common example: manipulating `File` names and paths? Consider whether one + of the [built in `File` properties][file-prop] like `basename`, `nameroot`, + `nameext`, etc., could be used instead. + +- Give the tool description to a colleague (preferably at a different + institution) to test and provide feedback. + +- Complex workflows with individual components which can be abstracted + should utilise the [`SubworkflowFeatureRequirement`][subworkflow] to make their + workflow modular and allow sections of them to be easily reused. + +- Software containers should be made to be conformant to the ["Recommendations for the packaging and containerizing of bioinformatics software"][containers] (also useful to other disciplines). + +[containers]: https://doi.org/10.12688/f1000research.15140.1 +[apache-license]: https://spdx.org/licenses/Apache-2.0.html +[license-example]: https://github.com/ProteinsWebTeam/ebi-metagenomics-cwl/blob/master/workflows/emg-assembly.cwl#L200 +[scicrunch]: https://scicrunch.org +[edam-example]: http://edamontology.org/format_1915 +[iana-types]: https://www.iana.org/assignments/media-types/media-types.xhtml +[file-prop]: https://www.commonwl.org/v1.0/CommandLineTool.html#File +[orcid]: https://orcid.org +[subworkflow]: https://www.commonwl.org/v1.0/Workflow.html#SubworkflowFeatureRequirement +[spdx]: https://spdx.org/licenses/ +[sci-license]: https://doi.org/10.1371/journal.pcbi.1002598 + +% TODO +% +% - Writing CWL workflows (include existing docs from https://github.com/common-workflow-library/cwl-patterns/blob/main/README.md) +% - FAIR best practices with CWL +% - Docker best practices with CWL - https://github.com/common-workflow-language/common-workflow-language/issues/347 diff --git a/_sources/topics/command-line-tool.md.txt b/_sources/topics/command-line-tool.md.txt new file mode 100644 index 00000000..c4391994 --- /dev/null +++ b/_sources/topics/command-line-tool.md.txt @@ -0,0 +1,86 @@ +# Command Line Tool + +A command-line tool is a type of Process object that can be run by +itself or as a Workflow step. It is a wrapper for a command like +`ls`, `echo`, `tar`, etc. The command-line tool is defined in the +`baseCommand` attribute of the command-line tool CWL document. + +A CWL command-line tool must also have `inputs` and `outputs`. +The following example contains a minimal example of a CWL +command-line tool for the `echo` Linux command, using inputs and +outputs. + +% TODO: Fix the missing link the graph below. We cannot have +% it here as this file is included in two other files. +% Sphinx prohibits it for the case where this could lead +% to duplicate anchors in a page (e.g. single-html). +% :name: command-line-tool-graph + +```{graphviz} +:caption: CWL command-line tool. +:align: center + +digraph G { + compound=true; + rankdir="LR"; + fontname="Verdana"; + fontsize="10"; + graph [splines=ortho]; + + node [fontname="Verdana", fontsize="10", shape=box]; + edge [fontname="Verdana", fontsize="10"]; + + subgraph cluster_0 { + command[style="filled" label=<echo>]; + label="baseCommand"; + fill=gray; + } + + inputs -> command [lhead=cluster_0]; + command -> outputs [ltail=cluster_0]; +} +``` + +% TODO: Fix the missing link the code below. We cannot have +% it here as this file is included in two other files. +% Sphinx prohibits it for the case where this could lead +% to duplicate anchors in a page (e.g. single-html). +% :name: echo.cwl + +```{literalinclude} /_includes/cwl/echo.cwl +:language: cwl +:caption: "`echo.cwl`" +``` + +```{note} + +The example above uses a simplified form to define inputs and outputs. +You will learn more about in the [Inputs](../topics/inputs.md) +and in the [Outputs](../topics/outputs.md) sections. +``` + +% TODO +% +% - Spaces in commands https://github.com/common-workflow-language/user_guide/issues/39 +% - Arguments (tell the reader the different use cases for arguments and inputs, tell them there is a section about inputs) + + +## Network Access +This indicates whether a process requires outgoing IPv4/IPv6 network +access. Starting with CWL v1.1, programs are not granted network +access by default, so you must include the requirement for network +access in the specification of your tool. + +```cwl +cwlVersion: v1.2 +class: CommandLineTool + +requirements: + NetworkAccess: + networkAccess: true +``` + +```{note} +CWL v1.0 command-line tools that are upgraded to v1.1 +or v1.2 or v1.2 will have `networkAccess: true` set automatically. +``` diff --git a/_sources/topics/creating-files-at-runtime.md.txt b/_sources/topics/creating-files-at-runtime.md.txt new file mode 100644 index 00000000..b2929e2e --- /dev/null +++ b/_sources/topics/creating-files-at-runtime.md.txt @@ -0,0 +1,63 @@ +# Creating Files at Runtime + +Sometimes you need to create a file on the fly from input parameters, +such as tools that expect to read their input configuration from a file +rather than the command line parameters, or need a small wrapper shell script. + +To generate such files, we can use the [`InitialWorkDirRequirement`](https://w3id.org/cwl/CommandLineTool.html#InitialWorkDirRequirement). + +```{literalinclude} /_includes/cwl/creating-files-at-runtime/createfile.cwl +:language: cwl +:caption: "`createfile.cwl`" +:name: createfile.cwl +``` + +Any [expressions](../topics/expressions.md) like `$(inputs.message)` are +expanded by the CWL engine before creating the file. +Here, insert the value at the input `message`. + +```{tip} +The _CWL expressions_ are independent of any _shell variables_ +used later during command line tool invocation. That means that any genuine +need for the character `$` must be **escaped** with `\`. +For instance, `\${PREFIX}` above is expanded to `${PREFIX}` in the generated file +to be evaluated by the shell script instead of the CWL engine. +``` + +To test the above CWL tool, use this job to provide the input value `message`: + +```{literalinclude} /_includes/cwl/creating-files-at-runtime/echo-job.yml +:language: yaml +:caption: "`echo-job.yml`" +:name: echo-job.yml +``` + +Before we run this, let us look at each step in a little more detail. +The base command `baseCommand: ["sh", "example.sh"]` +will execute the command `sh example.sh`. +This will run the file we create in the shell. + +`InitialWorkDirRequirement` requires a `listing`. +As the `listing` is a YAML array, we need a `-` on the first line of +each element of the array, in this case we have just one element. +`entryname:` can have any value, +but it must match what was specified in the `baseCommand`. +The final part is `entry:`, this is followed by `|-` +which is YAML quoting syntax, and means that you are using a multiline string +(without it, we would need to write the whole script on one line). + +```{note} + +See the [YAML Guide](../topics/yaml-guide.md#maps) for more about the formatting. +``` + +Now invoke `cwltool` with the tool description and the input object on the +command line: + +```{runcmd} cwltool createfile.cwl echo-job.yml +:working-directory: src/_includes/cwl/creating-files-at-runtime/ +``` + +```{runcmd} cat output.txt +:working-directory: src/_includes/cwl/creating-files-at-runtime/ +``` diff --git a/_sources/topics/custom-types.md.txt b/_sources/topics/custom-types.md.txt new file mode 100644 index 00000000..1dca7d44 --- /dev/null +++ b/_sources/topics/custom-types.md.txt @@ -0,0 +1,92 @@ +# Custom Types + +Sometimes you may want to write your own custom types for use and reuse in CWL +descriptions. Use of such custom types can reduce redundancy between multiple +descriptions that all use the same type, and also allow for additional +customisation/configuration of a tool/analysis without the need to fiddle with +the CWL description directly. + +The example below is a CWL description of the [biom convert format][biom] tool for +converting a standard biom table file to hdf5 format. + +```{literalinclude} /_includes/cwl/custom-types/custom-types.cwl +:language: cwl +:caption: "`custom-types.cwl`" +:name: custom-types.cwl +``` + +```{literalinclude} /_includes/cwl/custom-types/custom-types.yml +:language: yaml +:caption: "`custom-types.yml`" +:name: custom-types.yml +``` + +___Note:___ To follow the example below, you need to [download the example input file](https://github.com/common-workflow-language/user_guide/blob/main/src/_includes/cwl/custom-types/rich_sparse_otu_table.biom), *rich_sparse_otu_table.biom* e.g. via `wget`: + +```{code-block} console +$ wget https://github.com/common-workflow-language/user_guide/raw/main/src/_includes/cwl/custom-types/rich_sparse_otu_table.biom +``` + +On line 29, in `inputs:table_type`, a list of allowable table options to be used in the +table conversion are imported as a custom object: + +```cwl +inputs: + biom: + type: File + format: edam:format_3746 # BIOM + inputBinding: + prefix: --input-fp + table_type: + type: biom-convert-table.yaml#table_type + inputBinding: + prefix: --table-type +``` + +The reference to a custom type is a combination of the name of the file in which +the object is defined (`biom-convert-table.yaml`) and the name of the object +within that file (`table_type`) that defines the custom type. In this case the `symbols` +array from the imported `biom-convert-table.yaml` file define the allowable table options. +For example, in `custom-types.yml`, we pass `OTU table` as an `input` that +tells the tool to create an OTU table in hdf5 format. + +The contents of the YAML file describing the custom type are given below: + +```{literalinclude} /_includes/cwl/custom-types/biom-convert-table.yaml +:language: yaml +:caption: "`biom-convert-table.yaml`" +:name: biom-convert-table.yaml +``` + +In order for the custom type to be used in the CWL description, it must be +imported. Imports are described in `requirements:SchemaDefRequirement`, as +below in the example `custom-types.cwl` description: + +```cwl +requirements: + InlineJavascriptRequirement: {} + ResourceRequirement: + coresMax: 1 + ramMin: 100 + SchemaDefRequirement: + types: + - $import: biom-convert-table.yaml +``` + +Note also that the author of this CWL description has also included +[`ResourceRequirement`](https://w3id.org/cwl/CommandLineTool.html#ResourceRequirement)s, specifying the minimum amount of RAM and number of cores +required for the tool to run successfully, as well as details of the version of +the software that the description was written for and other useful metadata. +These features are discussed further in other chapters of this user guide. + +[biom]: http://biom-format.org/ + +% TODO (enums) +% +% - https://github.com/common-workflow-language/user_guide/issues/155 +% - Maybe show an example with booleans, pros and cons - https://github.com/common-workflow-language/user_guide/issues/89 +% +% TODO (records) +% +% - https://github.com/common-workflow-language/common-workflow-language/issues/202 +% - Document corner cases & workarounds - https://github.com/common-workflow-language/common-workflow-language/issues/241 diff --git a/_sources/topics/environment-variables.md.txt b/_sources/topics/environment-variables.md.txt new file mode 100644 index 00000000..a2228029 --- /dev/null +++ b/_sources/topics/environment-variables.md.txt @@ -0,0 +1,27 @@ +# Environment Variables + +Tools run in a restricted environment and do not inherit most environment +variables from the parent process. You can set environment variables for +the tool using `EnvVarRequirement`. + +```{literalinclude} /_includes/cwl/environment-variables/env.cwl +:language: cwl +:caption: "`env.cwl`" +:name: env.cwl +``` + +```{literalinclude} /_includes/cwl/environment-variables/echo-job.yml +:language: yaml +:caption: "`echo-job.yml`" +``` + +Now invoke `cwltool` with the tool description and the input object on the +command line: + +```{runcmd} cwltool env.cwl echo-job.yml +:working-directory: src/_includes/cwl/environment-variables/ +``` + +```{runcmd} cat output.txt +:working-directory: src/_includes/cwl/environment-variables/ +``` diff --git a/_sources/topics/expression-tool.md.txt b/_sources/topics/expression-tool.md.txt new file mode 100644 index 00000000..85cdce3a --- /dev/null +++ b/_sources/topics/expression-tool.md.txt @@ -0,0 +1,74 @@ +# Expression Tool + +An expression tool is a type of Process that can be run by itself or +as a Workflow step. It executes a pure JavaScript expression. It is +meant to be used as a way to isolate complex JavaScript expressions +that need to operate on input data and produce some result as output. + +Similar to the command-line tool it requires `inputs` and `outputs`. +But instead of `baseCommand`, it requires an [`expression`](https://w3id.org/cwl/CommandLineTool.html#Expressions_(Optional)) attribute. + +% TODO: Fix the missing link the graph below. We cannot have +% it here as this file is included in two other files. +% Sphinx prohibits it for the case where this could lead +% to duplicate anchors in a page (e.g. single-html). +% :name: expression-tool-graph + +```{graphviz} +:caption: CWL expression tool. +:align: center + +digraph G { + compound=true; + rankdir="LR"; + fontname="Verdana"; + fontsize="10"; + graph [splines=ortho]; + + node [fontname="Verdana", fontsize="10", shape=box]; + edge [fontname="Verdana", fontsize="10"]; + + subgraph cluster_0 { + expression[style="filled" label="JavaScript"]; + label="expression"; + fill=gray; + } + + inputs -> expression [lhead=cluster_0]; + expression -> outputs [ltail=cluster_0]; +} +``` + +% TODO: Fix the missing link the code below. We cannot have +% it here as this file is included in two other files. +% Sphinx prohibits it for the case where this could lead +% to duplicate anchors in a page (e.g. single-html). +% :name: uppercase.cwl + +```{code-block} cwl +:caption: "`uppercase.cwl`" +cwlVersion: v1.2 +class: ExpressionTool + +requirements: + InlineJavascriptRequirement: {} + +inputs: + message: string +outputs: + uppercase_message: string + +expression: | + ${ return {"uppercase_message": inputs.message.toUpperCase()}; } +``` + +```{note} + +We had to use an [`InlineJavascriptRequirement`](https://w3id.org/cwl/CommandLineTool.html#InlineJavascriptRequirement) as our expression +contains a JavaScript call in `.toUpperCase()`. This means to tools +using the expression tool that JavaScript is a requirement. +``` + +% TODO: +% +% - Explain better with more examples. diff --git a/_sources/topics/expressions.md.txt b/_sources/topics/expressions.md.txt new file mode 100644 index 00000000..a2dc79ae --- /dev/null +++ b/_sources/topics/expressions.md.txt @@ -0,0 +1,203 @@ +# Expressions + +If you need to manipulate input parameters, include the requirement +[`InlineJavascriptRequirement`](https://w3id.org/cwl/CommandLineTool.html#InlineJavascriptRequirement) and then anywhere a parameter reference is +legal you can provide a fragment of Javascript that will be evaluated by +the CWL runner. + +```{important} +JavaScript expressions should only be used when absolutely necessary. +When manipulating file names, extensions, paths etc, consider whether one of the +[built in `File` properties][file-prop] like `basename`, `nameroot`, `nameext`, +etc, could be used instead. +See the [list of best practices](best-practices.md). +``` + +```{literalinclude} /_includes/cwl/expressions/expression.cwl +:language: cwl +:caption: "`expression.cwl`" +:name: expression.cwl +``` + +As this tool does not require any `inputs` we can run it with an (almost) empty +job file: + +```{literalinclude} /_includes/cwl/expressions/empty.yml +:language: yaml +:caption: "`empty.yml`" +:name: empty.cwl +``` + +`empty.yml` contains a description of an empty JSON object. JSON objects +descriptions are contained inside curly brackets `{}`, so an empty object is +represented simply by a set of empty brackets. + +We can then run `expression.cwl`: + +```{runcmd} cwltool expression.cwl empty.yml +:name: running-expression.cwl +:caption: Running `expression.cwl` +:working-directory: src/_includes/cwl/expressions/ +``` + +```{runcmd} cat output.txt +:working-directory: src/_includes/cwl/expressions/ +``` + +Note that requirements can be provided with the map syntax, as in the example above: + +```cwl +requirements: + InlineJavascriptRequirement: {} +``` + +Or as an array, with each entry (in this case, only `class: InlineJavascriptRequirement`) marked by a `-`. +The same syntax is used to describe the additional command line arguments. + +```cwl +requirements: + - class: InlineJavascriptRequirement +``` + +```{admonition} Where are JavaScript expressions allowed? + +Just like [parameter references](parameter-references.md), you can use JavaScript Expressions +only in certain fields. These are: +- From [`CommandLineTool`](https://www.commonwl.org/v1.0/CommandLineTool.html#CommandLineTool) + - `arguments` + - `valueFrom` + - `stdin` + - `stdout` + - `stderr` + - From [CommandInputParameter](https://www.commonwl.org/v1.0/CommandLineTool.html#CommandInputParameter) + - `format` + - `secondaryFiles` + - From [`inputBinding`](https://www.commonwl.org/v1.0/CommandLineTool.html#CommandLineBinding) + - `valueFrom` + - From [CommandOutputParamater](https://www.commonwl.org/v1.0/CommandLineTool.html#CommandOutputParameter) + - `format` + - `secondaryFiles` + - From [CommandOutputBinding](https://www.commonwl.org/v1.0/CommandLineTool.html#CommandOutputBinding) + - `glob` + - `outputEval` +- From [`Workflow`](https://w3id.org/cwl/Workflow.html) + - From [InputParameter](https://www.commonwl.org/v1.0/Workflow.html#InputParameter) and [WorkflowOutputParameter](https://www.commonwl.org/v1.0/Workflow.html#WorkflowOutputParameter) + - `format` + - `secondaryFiles` + - From `steps` + - From [WorkflowStepInput](https://www.commonwl.org/v1.0/Workflow.html#WorkflowStepInput) + - `valueFrom` +- From [ExpressionTool](https://www.commonwl.org/v1.0/Workflow.html#ExpressionTool) + - `expression` + - From [InputParameter](https://www.commonwl.org/v1.0/Workflow.html#InputParameter) and [ExpressionToolOutputParameter](https://www.commonwl.org/v1.0/Workflow.html#ExpressionToolOutputParameter) + - `format` + - `secondaryFiles` +- From [`ResourceRequirement`](https://www.commonwl.org/v1.0/CommandLineTool.html#ResourceRequirement) + - `coresMin` + - `coresMax` + - `ramMin` + - `ramMax` + - `tmpdirMin` + - `tmpdirMax` + - `outdirMin` + - `outdirMax` +- From [`InitialWorkDirRequirement`](https://www.commonwl.org/v1.0/CommandLineTool.html#InitialWorkDirRequirement) + - `listing` + - in [Dirent](https://www.commonwl.org/v1.0/CommandLineTool.html#Dirent) + - `entry` + - `entryname` +- From `EnvVarRequirement` + - From [EnvironmentDef](https://www.commonwl.org/v1.0/CommandLineTool.html#EnvironmentDef) + - `envValue` +``` + +[file-prop]: https://www.commonwl.org/v1.0/CommandLineTool.html#File + +## Using External Libraries and Inline JavaScript Code with `expressionLib` + +The requirement [`InlineJavascriptRequirement`](https://w3id.org/cwl/CommandLineTool.html#InlineJavascriptRequirement) supports an `expressionLib` attribute +that allows users to load external JavaScript files, or to provide inline JavaScript +code. + +Entries added to the `expressionLib` attribute are parsed with the JavaScript engine +of a CWL runner. This can be used to include external files or to create JavaScript +functions that can be called in other parts of the CWL document. + +```{note} + +The CWL standards (versions 1.0 through 1.2) [states](https://www.commonwl.org/v1.0/CommandLineTool.html#Expressions) + that the only version of JavaScript valid in CWL expressions is +[ECMAScript 5.1](https://262.ecma-international.org/5.1/). This means that any +code that you include or write in your CWL Document must be compliant with +ECMAScript 5.1. +``` + +For example, we can use `InlineJavascriptRequirement` and write a JavaScript function +inline in `expressionLib`. That function can then be used in other parts of the +CWL document: + +```{literalinclude} /_includes/cwl/expressions/hello-world-expressionlib-inline.cwl +:language: cwl +:caption: "`hello-world-expressionlib-inline.cwl`" +:name: "`hello-world-expressionlib-inline.cwl`" +:emphasize-lines: 5, 14, 32 +``` + +Running this CWL workflow will invoke the JavaScript function and result in +the `echo` command printing the input message with capital initial letters: + +```{runcmd} cwltool hello-world-expressionlib-inline.cwl --message "hello world" +:caption: "Running `hello-world-expressionlib-inline.cwl`." +:name: running-hell-world-expressionlib-inline-cwl +:working-directory: src/_includes/cwl/expressions/ +``` + +Let's move the `capitalizeWords` function to an external file, `custom-functions.js`, and +import it in our CWL document: + +```{literalinclude} /_includes/cwl/expressions/custom-functions.js +:language: javascript +:caption: "`custom-functions.js`" +:name: "`custom-functions.js`" +``` + +```{literalinclude} /_includes/cwl/expressions/hello-world-expressionlib-external.cwl +:language: cwl +:caption: "`hello-world-expressionlib-external.cwl`" +:name: "`hello-world-expressionlib-external.cwl`" +:emphasize-lines: 5-6, 14 +``` + +The `custom-functions.js` file is included in the CWL document with the `$include: custom-functions.js` +statement. That makes the functions and variables available to be used in other parts of +the CWL document. + +```{runcmd} cwltool hello-world-expressionlib-external.cwl --message "hello world" +:caption: "Running `hello-world-expressionlib-external.cwl`." +:name: running-hell-world-expressionlib-external-cwl +:working-directory: src/_includes/cwl/expressions/ +``` + +Finally, note that you can have both inline and external JavaScript code in your +CWL document. In this final example we have added another entry to the `expressionLib` +attribute with the new function `createHelloWorldMessage`, that calls the `capitalizeWords` +function from the external file `custom-functions.js`. + +```{literalinclude} /_includes/cwl/expressions/hello-world-expressionlib.cwl +:language: cwl +:caption: "`hello-world-expressionlib.cwl`" +:name: "`hello-world-expressionlib.cwl`" +:emphasize-lines: 5-17, 25 +``` + +```{runcmd} cwltool hello-world-expressionlib.cwl --message "hello world" +:caption: "Running `hello-world-expressionlib.cwl`." +:name: running-hell-world-expressionlib-cwl +:working-directory: src/_includes/cwl/expressions/ +``` + +```{note} +The `$include` statement can be used to include a file from the local disk or from a remote location. +It works with both relative and absolute paths. Read the [text about `$include`](https://www.commonwl.org/v1.0/SchemaSalad.html#Include) +from the CWL specification to learn more about it. +``` diff --git a/_sources/topics/file-formats.md.txt b/_sources/topics/file-formats.md.txt new file mode 100644 index 00000000..e1d0f5fa --- /dev/null +++ b/_sources/topics/file-formats.md.txt @@ -0,0 +1,60 @@ +# File Formats + +Tools and workflows can take [`File`](https://w3id.org/cwl/CommandLineTool.html#File) types as input and produce them as output. +We also recommend indicating the format for [`File`](https://w3id.org/cwl/CommandLineTool.html#File) types. This helps document +for others how to use your tool while allowing you to do some simple +type-checking when creating parameter files. + +For file formats, we recommend referencing existing ontologies (like EDAM in +our example), reference a local ontology for your institution, or do not add +a file format initially for quick development before sharing your tool with +others. You can browse existing [IANA file format listings][IANA] and +[EDAM file format listings][EDAM] on their websites. + +In the next tutorial, we explain the `$namespaces` and `$schemas` section of the +document in greater detail, so don't worry about these for now. + +Note that for added value `cwltool` can do some basic reasoning based on file +formats and warn you if there seem to be some obvious mismatches. + +```{literalinclude} /_includes/cwl/file-formats/metadata_example.cwl +:language: cwl +:caption: "`metadata_example.cwl`" +:name: metadata_example.cwl +``` + +The equivalent of this CWL description in command line format is: + +```{code-block} console +$ wc -l /path/to/aligned_sequences.ext > output.txt +``` + +## Sample Parameter Files + +Below is an example of a parameter file for the example above. We encourage +checking in working examples of parameter files for your tool. This allows +others to quickly work with your tool, starting from a "known good" +parameterization. + +```{literalinclude} /_includes/cwl/file-formats/sample.yml +:language: yaml +:caption: "`sample.yml`" +:name: sample.yml +``` + +___Note:___ To follow the example below, you need to download the example input file, *file-formats.bam*. The file is available from + and can be downloaded e.g. via `wget`: + +```{code-block} +$ wget https://github.com/common-workflow-language/user_guide/raw/main/src/_includes/cwl/file-formats/file-formats.bam +``` + +Now invoke `cwltool` with the tool description and the input object on the +command line: + +```{runcmd} cwltool metadata_example.cwl sample.yml +:working-directory: src/_includes/cwl/file-formats/ +``` + +[IANA]: https://www.iana.org/assignments/media-types/media-types.xhtml +[EDAM]: https://www.ebi.ac.uk/ols/ontologies/edam/terms?iri=http%3A%2F%2Fedamontology.org%2Fformat_1915 diff --git a/_sources/topics/index.md.txt b/_sources/topics/index.md.txt new file mode 100644 index 00000000..09ec4142 --- /dev/null +++ b/_sources/topics/index.md.txt @@ -0,0 +1,25 @@ +# Topics + +```{toctree} +:maxdepth: 2 +yaml-guide.md +command-line-tool.md +expressions.md +inputs.md +additional-arguments-and-parameters.md +parameter-references.md +outputs.md +custom-types.md +expression-tool.md +workflows.md +operations.md +environment-variables.md +using-containers.md +creating-files-at-runtime.md +staging-input-files.md +best-practices.md +file-formats.md +metadata-and-authorship.md +specifying-software-requirements.md +troubleshooting.md +``` diff --git a/_sources/topics/inputs.md.txt b/_sources/topics/inputs.md.txt new file mode 100644 index 00000000..e4e162b9 --- /dev/null +++ b/_sources/topics/inputs.md.txt @@ -0,0 +1,309 @@ +# Inputs + +## Essential Input Parameters + +The `inputs` of a tool is a list of input parameters that control how to +run the tool. Each parameter has an `id` for the name of parameter, and +`type` describing what types of values are valid for that parameter. + +Available primitive types are *string*, *boolean*, *int*, *long*, *float*, *double*, +and *null*; complex types are *array* and *record*; in addition there are +special types *File*, *Directory* and *Any*. + +The following example demonstrates some input parameters with different +types and appearing on the command line in different ways. + +First, create a file called `inp.cwl`, containing the following: + +```{literalinclude} /_includes/cwl/inputs/inp.cwl +:language: cwl +:caption: "`inp.cwl`" +:name: inp.cwl +``` + +Create a file called `inp-job.yml`: + +```{literalinclude} /_includes/cwl/inputs/inp-job.yml +:language: yaml +:caption: "`inp-job.yml`" +:name: inp-job.yml +``` + +````{note} +You can use `cwltool` to create a template input object. That saves you from having +to type all the input parameters in an input object file: + +```{runcmd} cwltool --make-template inp.cwl +:working-directory: src/_includes/cwl/inputs +``` + +You can redirect the output to a file, i.e. `cwltool --make-template inp.cwl > inp-job.yml`, +and then modify the default values with your desired input values. +```` + +Notice that "example_file", as a `File` type, must be provided as an +object with the fields `class: File` and `path`. + +Next, create a whale.txt using [touch] by typing `touch whale.txt` on the command line. + +```{code-block} console +$ touch whale.txt +``` + +Now invoke `cwltool` with the tool description and the input object on the command line, +using the command `cwltool inp.cwl inp-job.yml`. The following boxed text describes these +two commands and the expected output from the command line: + +```{runcmd} cwltool inp.cwl inp-job.yml +:working-directory: src/_includes/cwl/inputs +``` + +```{tip} +

Where did those `/tmp` paths come from?

+ +The CWL reference runner (cwltool) and other runners create temporary +directories with symbolic ("soft") links to your input files to ensure that +the tools aren't accidentally accessing files that were not explicitly +specified +``` + +The field [`inputBinding`](https://w3id.org/cwl/CommandLineTool.html#Input_binding) is optional and indicates whether and how the +input parameter should appear on the tool's command line. If +`inputBinding` is missing, the parameter does not appear on the command +line. Let's look at each example in detail. + +```cwl +example_flag: + type: boolean + inputBinding: + position: 1 + prefix: -f +``` + +Boolean types are treated as a flag. If the input parameter +"example_flag" is "true", then `prefix` will be added to the +command line. If false, no flag is added. + +```cwl +example_string: + type: string + inputBinding: + position: 3 + prefix: --example-string +``` + +String types appear on the command line as literal values. The `prefix` +is optional, if provided, it appears as a separate argument on the +command line before the parameter . In the example above, this is +rendered as `--example-string hello`. + +```cwl +example_int: + type: int + inputBinding: + position: 2 + prefix: -i + separate: false +``` + +Integer (and floating point) types appear on the command line with +decimal text representation. When the option `separate` is false (the +default value is true), the prefix and value are combined into a single +argument. In the example above, this is rendered as `-i42`. + + +```cwl +example_file: + type: File? + inputBinding: + prefix: --file= + separate: false + position: 4 +``` + +File types appear on the command line as the path to the file. When the +parameter type ends with a question mark `?` it indicates that the +parameter is optional. In the example above, this is rendered as +`--file=/tmp/random/path/whale.txt`. However, if the "example_file" +parameter were not provided in the input, nothing would appear on the +command line. + +Input files are read-only. If you wish to update an input file, you must +[first copy it to the output directory](staging-input-files.md). + +The value of `position` is used to determine where parameter should +appear on the command line. Positions are relative to one another, not +absolute. As a result, positions do not have to be sequential, three +parameters with positions 1, 3, 5 will result in the same command +line as 1, 2, 3. More than one parameter can have the same position +(ties are broken using the parameter name), and the position field itself +is optional. The default position is 0. + +The `baseCommand` field will always appear in the final command line before the parameters. + +[touch]: http://www.linfo.org/touch.html + +## Array Inputs + +It is easy to add arrays of input parameters represented to the command +line. There are two ways to specify an array parameter. First is to provide +`type` field with `type: array` and `items` defining the valid data types +that may appear in the array. Alternatively, brackets `[]` may be added after +the type name to indicate that input parameter is array of that type. + +```{literalinclude} /_includes/cwl/inputs/array-inputs.cwl +:language: cwl +:caption: "`array-inputs.cwl`" +:name: array-inputs.cwl +``` + +```{literalinclude} /_includes/cwl/inputs/array-inputs-job.yml +:language: yaml +:caption: "`array-inputs-job.yml`" +:name: array-inputs-job.yml +``` + +Now invoke `cwltool` providing the tool description and the input object +on the command line: + +```{runcmd} cwltool array-inputs.cwl array-inputs-job.yml +:working-directory: src/_includes/cwl/inputs/ +``` + +```{code-block} console +$ cat output.txt +-A one two three -B=four -B=five -B=six -C=seven,eight,nine +``` + +The `inputBinding` can appear either on the outer array parameter definition +or the inner array element definition, and these produce different behavior when +constructing the command line, as shown above. +In addition, the `itemSeparator` field, if provided, specifies that array +values should be concatenated into a single argument separated by the item +separator string. + +Note that the arrays of inputs are specified inside square brackets `[]` in `array-inputs-job.yml`. Arrays can also be expressed over multiple lines, where +array values that are not defined with an associated key are marked by a leading `-`. +This will be demonstrated in the next lesson +and is discussed in more detail in the [YAML Guide](yaml-guide.md#arrays). +You can specify arrays of arrays, arrays of records, and other complex types. + +## Inclusive and Exclusive Inputs + +Sometimes an underlying tool has several arguments that must be provided +together (they are dependent) or several arguments that cannot be provided +together (they are exclusive). You can use records and type unions to group +parameters together to describe these two conditions. + +```{literalinclude} /_includes/cwl/inputs/record.cwl +:language: cwl +:caption: "`record.cwl`" +:name: record.cwl +``` + +```{literalinclude} /_includes/cwl/inputs/record-job1.yml +:language: yaml +:caption: "`record-job1.yml`" +:name: record-job1.yml +``` + +```{runcmd} cwltool record.cwl record-job1.yml +:working-directory: src/_includes/cwl/inputs/ +:emphasize-lines: 6-7 +``` + +In the first example, you can't provide `itemA` without also providing `itemB`. + +```{literalinclude} /_includes/cwl/inputs/record-job2.yml +:language: yaml +:caption: "`record-job2.yml`" +:name: record-job2.yml +``` + +```{runcmd} cwltool record.cwl record-job2.yml +:working-directory: src/_includes/cwl/inputs +:emphasize-lines: 4, 10-11, 23 +``` + +```{code-block} console +$ cat output.txt +-A one -B two -C three +``` + +In the second example, `itemC` and `itemD` are exclusive, so only the first +matching item (`itemC`) is added to the command line and remaining item (`itemD`) is ignored. + +```{literalinclude} /_includes/cwl/inputs/record-job3.yml +:language: yaml +:caption: "`record-job3.yml`" +:name: record-job3.yml +``` + +```{runcmd} cwltool record.cwl record-job3.yml +:working-directory: src/_includes/cwl/inputs +:emphasize-lines: 9-10, 21 +``` + +```{code-block} console +$ cat output.txt +-A one -B two -D four +``` + +In the third example, only `itemD` is provided, so it appears on the +command line. + +### Exclusive Input Parameters with Expressions + +If you use exclusive input parameters and reference them in expressions, you +need to be aware that the `inputs` JavaScript object will contain one of the +possible, mutually-exclusive input values. Because the types of these exclusive +values may differ, you may need to check which type is in use when you +reference the properties of the `input` object. + +Let's use an example that contains an exclusive `file_format` input parameter +that accepts `null` (i.e. no value provided), or any value from an enum. + +```{literalinclude} /_includes/cwl/inputs/exclusive-parameter-expressions.cwl +:language: cwl +:caption: "`exclusive-parameter-expressions.cwl`" +:name: exclusive-parameter-expressions.cwl +``` + +Note how the JavaScript expression uses the value of the exclusive input +parameter without taking into consideration a `null` value. If you provide a +valid value, such as `fasta` (one of the possible values of the enum), your +command should execute successfully: + +```{runcmd} cwltool exclusive-parameter-expressions.cwl --file_format fasta +:working-directory: src/_includes/cwl/inputs +``` + +However, if you do not provide any input value, then `file_format` will be +evaluated to `null`, which does not match the expected type for the +output field (a `string`), resulting in failure when running your workflow. + +```{runcmd} cwltool exclusive-parameter-expressions.cwl +:working-directory: src/_includes/cwl/inputs +:emphasize-lines: 5-10 +``` + +To correct it, you should explicitly handle the possibility of a `null` value. +For example, the expression could be changed to `$(inputs.file_format || +'auto')`, to have a default value `"auto"` if none was provided in the command +line or job input file. + +Here, the boolean “or” operator `||` in JavaScript is used for its +_short-circuiting_ property. If `inputs.file_format` is “true” in a boolean +context (e.g. a valid non-empty string from the enum), the evaluation of the +expression stops at the first operand of `||`; it “short-circuits”. If however +`inputs.file_format` is `null`, the whole expression’s value becomes that of +the second operand, which is why a reasonable default can be provided there. + +% TODO +% +% - Explain its fields, such as default, valueFrom, etc. - https://github.com/common-workflow-language/common-workflow-language/issues/359 +% - Optional Inputs https://github.com/common-workflow-language/user_guide/issues/44 +% - Several ways of defining inputs/arguments to tools and workflows - https://github.com/common-workflow-language/user_guide/issues/33 +% - Using an input output in another input - https://github.com/common-workflow-language/user_guide/issues/90 +% - How to use linkMerge - https://github.com/common-workflow-language/user_guide/issues/117 (or maybe move to Advanced?) +% - Secondary files - https://github.com/common-workflow-language/common-workflow-language/issues/270 diff --git a/_sources/topics/metadata-and-authorship.md.txt b/_sources/topics/metadata-and-authorship.md.txt new file mode 100644 index 00000000..57850533 --- /dev/null +++ b/_sources/topics/metadata-and-authorship.md.txt @@ -0,0 +1,42 @@ +# Metadata and Authorship + +Implementation extensions not required for correct execution (for example, +fields related to GUI presentation) and metadata about the tool or workflow +itself (for example, authorship for use in citations) may be provided as +additional fields on any object. Such extensions fields (e.g. `format: edam:format_2572`) +can use a namespace prefix listed in the `$namespaces` section of the document +(e.g. edam: http://edamontology.org/) as described in the [Schema Salad specification][schema-salad]. +Once you add the namespace prefix, you can access it anywhere in the document as shown below. +Otherwise, one must use full URLs: `format: http://edamontology.org/format_2572`. + + +For all developers, we recommend the following minimal metadata for your tool +and workflows. This example includes metadata allowing others to cite your tool. + +```{literalinclude} /_includes/cwl/metadata-and-authorship/metadata_example2.cwl +:language: cwl +:caption: "`metadata_example2.cwl`" +:name: metadata_example2.cwl +``` + +The equivalent of this CWL description in command line format is: + +```{code-block} +$ wc -l /path/to/aligned_sequences.ext > output.txt +``` + +## Extended Example + +For those that are highly motivated, it is also possible to annotate your tool +with a much larger amount of metadata. This example includes EDAM ontology tags +as keywords (allowing the grouping of related tools), hints at hardware +requirements in order to use the tool, and a few more metadata fields. + +```{literalinclude} /_includes/cwl/metadata-and-authorship/metadata_example3.cwl +:language: cwl +:caption: "`metadata_example3.cwl`" +:name: metadata_example3.cwl +:emphasize-lines: 8-10, 47-48 +``` + +[schema-salad]: https://www.commonwl.org/v1.0/SchemaSalad.html#Explicit_context diff --git a/_sources/topics/operations.md.txt b/_sources/topics/operations.md.txt new file mode 100644 index 00000000..1d601eba --- /dev/null +++ b/_sources/topics/operations.md.txt @@ -0,0 +1,69 @@ +# Operations + +An Operation is a type of CWL process, just like a workflow, a command-line tool, or +an expression tool. It is a step of a workflow that specifies inputs and outputs, +but it does not provide enough information to be executed. + +You can create operations to visualize a workflow during development, before +you are ready to submit the workflow to a CWL runner: + +```{literalinclude} /_includes/cwl/operations/operations.cwl +:language: cwl +:name: operations.cwl +:caption: "`operations.cwl`" +``` + +The `uppercase` step of the workflow is an operation. It can appear where a +command line tool or an expression is expected. You can also plot it with the +CWL Viewer or `cwltool`: + +```{runcmd} cwltool --print-dot operations.cwl +:working-directory: src/_includes/cwl/operations/ +``` + +The output of the command above can be rendered `cwltool --print-dot operations.cwl | dot -Tsvg > +operations.svg ; open operations.svg`. + +```{graphviz} + +digraph G { +bgcolor="#eeeeee"; +clusterrank=local; +labeljust=right; +labelloc=bottom; +"echo" [fillcolor=lightgoldenrodyellow, label=echo, shape=record, style=filled]; +"uppercase" [fillcolor=lightgoldenrodyellow, label=uppercase, shape=record, style=dashed]; +"echo" -> "uppercase"; +subgraph cluster_inputs { +label="Workflow Inputs"; +rank=same; +style=dashed; +"message" [fillcolor="#94DDF4", label=message, shape=record, style=filled]; +} + +"message" -> "echo"; +subgraph cluster_outputs { +label="Workflow Outputs"; +labelloc=b; +rank=same; +style=dashed; +} + +} +``` + +The operation file will fail to run with `cwltool` because `cwltool` +lacks the necessary information to execute it: + +```{runcmd} cwltool operations.cwl --message Hello +:working-directory: src/_includes/cwl/operations/ +:name: operations-output-error-cwltool +:caption: "`cwltool` does not know how to run operations" +``` + +```{note} + +CWL runners may come up with ways to bind operations to concrete steps. +A CWL runner could, for instance, use abstract operations with ID's that +correspond to steps executed by a different workflow engine. +``` diff --git a/_sources/topics/outputs.md.txt b/_sources/topics/outputs.md.txt new file mode 100644 index 00000000..b2513f32 --- /dev/null +++ b/_sources/topics/outputs.md.txt @@ -0,0 +1,123 @@ +# Outputs + +## Returning Output Files + +The `outputs` of a tool is a list of output parameters that should be +returned after running the tool. Each parameter has an `id` for the name +of parameter, and `type` describing what types of values are valid for +that parameter. + +When a tool runs under CWL, the starting working directory is the +designated output directory. The underlying tool or script must record +its results in the form of files created in the output directory. The +output parameters returned by the CWL tool are either the output files +themselves, or the result of examining the content of those files. + +The following example demonstrates how to return a file that has been extracted from a tar file. + +```{tip} +Passing mandatory arguments to the `baseCommand` + +In previous examples, the `baseCommand` was just a string, with any arguments +passed as CWL inputs. Instead of a single string, we can use an _array of +strings_ as the value of `baseCommand`. The first element of the array is the +command to run, and any subsequent elements are mandatory command line +arguments +``` + +```{literalinclude} /_includes/cwl/outputs/tar.cwl +:language: cwl +:caption: "`tar.cwl`" +:name: tar.cwl +``` + +```{literalinclude} /_includes/cwl/outputs/tar-job.yml +:language: yaml +:caption: "`tar-job.yml`" +:name: tar-job.yml +``` + +Next, create a tar file for the example. + +```{code-block} console +$ touch hello.txt && tar -cvf hello.tar hello.txt +hello.txt +``` + +And now invoke `cwltool` with the tool description and the input object on the command line: + +```{runcmd} cwltool tar.cwl tar-job.yml +:working-directory: src/_includes/cwl/outputs/ +``` + +The field [`outputBinding`](https://w3id.org/cwl/CommandLineTool.html#CommandOutputBinding) describes how to set the value of each +output parameter. + +```cwl +outputs: + example_out: + type: File + outputBinding: + glob: hello.txt +``` + +The [`glob`](https://w3id.org/cwl/CommandLineTool.html#CommandOutputBinding) +field consists of the pattern to match file names in the output directory. +This can simply be the file's exact name. But if you don't know the name of the +file in advance, you can use a wildcard pattern like `glob: '*.txt'`. + +## Capturing Standard Output + +To capture a tool's standard output stream, add the [`stdout`](https://w3id.org/cwl/CommandLineTool.html#stdout) field with +the name of the file where the output stream should go. Then add `type: +stdout` on the corresponding output parameter. + +```{literalinclude} /_includes/cwl/outputs/stdout.cwl +:language: cwl +:caption: "`stdout.cwl`" +:name: stdout.cwl +``` + +```{literalinclude} /_includes/cwl/outputs/echo-job.yml +:language: yaml +:caption: "`echo-job.yml`" +``` + +Now invoke `cwltool` providing the tool description and the input object +on the command line: + +```{runcmd} cwltool stdout.cwl echo-job.yml +:working-directory: src/_includes/cwl/outputs/ +``` + +## Array Outputs + +You can also capture multiple output files into an array of files using `glob`. + +```{literalinclude} /_includes/cwl/outputs/array-outputs.cwl +:language: cwl +:caption: "`array-outputs.cwl`" +:name: array-outputs.cwl +``` + +```{literalinclude} /_includes/cwl/outputs/array-outputs-job.yml +:language: yaml +:caption: "`array-outputs-job.yml`" +:name: array-outputs-job.yml +``` + +Now invoke `cwltool` providing the tool description and the input object +on the command line: + +```{runcmd} cwltool array-outputs.cwl array-outputs-job.yml +:working-directory: src/_includes/cwl/outputs/ +``` + +As described in the [YAML Guide](yaml-guide.md#arrays), +the array of expected outputs is specified in `array-outputs-job.yml` with each +entry marked by a leading `-`. This format can also be used in CWL descriptions +to mark entries in arrays, as demonstrated in several of the upcoming sections. + +% TODO +% +% - Creating files at runtime - https://github.com/common-workflow-language/user_guide/issues/134 diff --git a/_sources/topics/parameter-references.md.txt b/_sources/topics/parameter-references.md.txt new file mode 100644 index 00000000..d901029e --- /dev/null +++ b/_sources/topics/parameter-references.md.txt @@ -0,0 +1,109 @@ +# Parameter References + +In a previous example, we extracted a file using the "tar" program. +However, that example was very limited because it assumed that the file +we were interested in was called "hello.txt", and this was written into the +`.cwl` file. This is not the best way to do this, as the "hello.txt" filename +may vary or be dependent on the input file(s) used. To avoid this we can +specify the name of the file we want in the job parameters file (`.yml`). In +this example, you will see how to reference the value of input parameters +dynamically from other fields, which will allow us to then specify the name of +the file to extract. + +```{literalinclude} /_includes/cwl/parameter-references/tar-param.cwl +:language: cwl +:caption: "`tar-param.cwl`" +:name: tar-param.cwl +``` + +```{literalinclude} /_includes/cwl/parameter-references/tar-param-job.yml +:language: yaml +:caption: "`tar-param-job.yml`" +:name: tar-param-job.yml +``` + +Create your input files and invoke `cwltool` with the tool description and the +input object on the command line: + +```{code-block} console +$ rm hello.tar || true && touch goodbye.txt && tar -cvf hello.tar goodbye.txt +``` + +```{runcmd} cwltool tar-param.cwl tar-param-job.yml +:working-directory: src/_includes/cwl/parameter-references +``` + +Certain fields permit parameter references which are enclosed in `$(...)`. +These are evaluated and replaced with value being referenced. + +```cwl +outputs: + extracted_out: + type: File + outputBinding: + glob: $(inputs.extractfile) +``` + +References are written using a subset of Javascript syntax. In this +example, `$(inputs.extractfile)`, `$(inputs["extractfile"])`, and +`$(inputs['extractfile'])` are equivalent. + +The value of the "inputs" variable is the input object provided when the +CWL tool was invoked. + +Note that because `File` parameters are objects, to get the path to an +input file you must reference the path field on a file object; to +reference the path to the tar file in the above example you would write +`$(inputs.tarfile.path)`. + +```{admonition} Where are parameter references allowed? + +You can only use parameter references in certain fields. These are: + +- From [`CommandLineTool`](http://www.commonwl.org/v1.0/CommandLineTool.html#CommandLineTool) + - `arguments` + - `valueFrom` + - `stdin` + - `stdout` + - `stderr` + - From [CommandInputParameter](http://www.commonwl.org/v1.0/CommandLineTool.html#CommandInputParameter) + - `format` + - `secondaryFiles` + - From [`inputBinding`](http://www.commonwl.org/v1.0/CommandLineTool.html#CommandLineBinding) + - `valueFrom` + - From [CommandOutputParamater](http://www.commonwl.org/v1.0/CommandLineTool.html#CommandOutputParameter) + - `format` + - `secondaryFiles` + - From [CommandOutputBinding](http://www.commonwl.org/v1.0/CommandLineTool.html#CommandOutputBinding) + - `glob` + - `outputEval` +- From [`Workflow`](https://w3id.org/cwl/Workflow.html) + - From [InputParameter](http://www.commonwl.org/v1.0/Workflow.html#InputParameter) and [WorkflowOutputParameter](http://www.commonwl.org/v1.0/Workflow.html#WorkflowOutputParameter) + - `format` + - `secondaryFiles` + - From `steps` + - From [WorkflowStepInput](http://www.commonwl.org/v1.0/Workflow.html#WorkflowStepInput) + - `valueFrom` +- From [ExpressionTool](https://www.commonwl.org/v1.0/Workflow.html#ExpressionTool) + - `expression` + - From [InputParameter](http://www.commonwl.org/v1.0/Workflow.html#InputParameter) and [ExpressionToolOutputParameter](http://www.commonwl.org/v1.0/Workflow.html#ExpressionToolOutputParameter) + - `format` + - `secondaryFiles` +- From [`ResourceRequirement`](http://www.commonwl.org/v1.0/CommandLineTool.html#ResourceRequirement) + - `coresMin` + - `coresMax` + - `ramMin` + - `ramMax` + - `tmpdirMin` + - `tmpdirMax` + - `outdirMin` + - `outdirMax` +- From [`InitialWorkDirRequirement`](http://www.commonwl.org/v1.0/CommandLineTool.html#InitialWorkDirRequirement) + - `listing` + - in [Dirent](http://www.commonwl.org/v1.0/CommandLineTool.html#Dirent) + - `entry` + - `entryname` +- From `EnvVarRequirement` + - From [EnvironmentDef](http://www.commonwl.org/v1.0/CommandLineTool.html#EnvironmentDef) + - `envValue` +``` diff --git a/_sources/topics/requirements-and-hints.md.txt b/_sources/topics/requirements-and-hints.md.txt new file mode 100644 index 00000000..c46c96d9 --- /dev/null +++ b/_sources/topics/requirements-and-hints.md.txt @@ -0,0 +1,28 @@ +--- +orphan: true +--- + +# Requirements and Hints + +% TODO +% +% - InlineJavascriptRequirement +% - Maybe list cases where it is not really necessary? e.g. https://github.com/common-workflow-language/common-workflow-language/issues/389 +% - Covered by the **episode 13** of the current User Guide - https://www.commonwl.org/user_guide/13-expressions/index.html +% - InitialWorkDirRequirement +% - Staging Files (a common topic, and appears in questions on discourse/element... maybe it deserves a more prominent location?) +% - Writable inputs - https://github.com/common-workflow-language/user_guide/issues/36 +% - Creating files at runtime, from **episode 14** of the current User Guide - https://www.commonwl.org/user_guide/14-runtime/index.html +% - There is a whole **episode 15** in the current User Guide about it - https://www.commonwl.org/user_guide/15-staging/index.html +% - DockerRequirement +% - Covered in the **episode 7** of the current User Guide - https://www.commonwl.org/user_guide/07-containers/index.html +% - SchemaDefRequirement and input schemas +% - The **episode 19** from the current User Guide covers it - https://www.commonwl.org/user_guide/19-custom-types/index.html +% - ShellCommandRequirement - https://github.com/common-workflow-language/user_guide/issues/159 +% - SoftwareRequirement - From the **20** from the current User Guide - episode https://www.commonwl.org/user_guide/20-software-requirements/index.html +% - MultipleInputFeatureRequirement +% - Also in **episode 24** of the current User Guide - https://www.commonwl.org/user_guide/24_conditional-workflow/index.html +% - SubworkflowFeatureRequirement +% - Also in **episode 22** of the current User Guide - https://www.commonwl.org/user_guide/22-nested-workflows/index.html +% - ScatterFeatureRequirement +% - Also in **episode 23** of the current User Guide - https://www.commonwl.org/user_guide/23-scatter-workflow/index.html diff --git a/_sources/topics/specifying-software-requirements.md.txt b/_sources/topics/specifying-software-requirements.md.txt new file mode 100644 index 00000000..bebd3596 --- /dev/null +++ b/_sources/topics/specifying-software-requirements.md.txt @@ -0,0 +1,44 @@ +# Specifying Software Requirements + +Often, tool descriptions will be written for a specific version of a software. To +make it easier for others to use your descriptions, you can include a +[`SoftwareRequirement`](https://w3id.org/cwl/CommandLineTool.html#SoftwareRequirement) field in the `hints` section. +This may also help to avoid confusion about which version of a tool the +description was written for. + +```{literalinclude} /_includes/cwl/specifying-software-requirements/custom-types.cwl +:language: cwl +``` + +In this example, the software requirement being described is InterProScan +version 5.21-60. + +```cwl +hints: + SoftwareRequirement: + packages: + interproscan: + specs: [ "https://identifiers.org/rrid/RRID:SCR_005829" ] + version: [ "5.21-60" ] +``` + +Depending on your CWL runner, these hints may be used to check +that the required software is installed and available before the job is run. To enable +these checks with the reference implementation, use the [dependency resolvers configuration][dependencies]. + +As well as a version number, a unique resource identifier (URI) for the tool is +given in the form of an [RRID][rrid]. Resources with RRIDs can be looked up in the +[SciCrunch][scicrunch] registry, which provides a portal for finding, tracking, +and referring to scientific resources consistently. If you want to specify a +tool as a [`SoftwareRequirement`](https://w3id.org/cwl/CommandLineTool.html#SoftwareRequirement), search for the tool on SciCrunch and use the +RRID that it has been assigned in the registry. (Follow this [Adding a Resource Tutorial][scicrunch-add-tool] to add a tool to SciCrunch). You can use this RRID to refer +to the tool (via [identifiers.org][identifiers]) in the `specs` field of your +requirement description. Other good choices, in order of preference, are to +include the DOI for the main tool citation and the URL to the tool. + + +[rrid]: https://scicrunch.org/resources/about/resource +[scicrunch]: https://scicrunch.org/ +[dependencies]: https://github.com/common-workflow-language/cwltool#leveraging-softwarerequirements-beta +[identifiers]: https://identifiers.org/ +[scicrunch-add-tool]: https://scicrunch.org/page/tutorials/336 diff --git a/_sources/topics/staging-input-files.md.txt b/_sources/topics/staging-input-files.md.txt new file mode 100644 index 00000000..8d4812b2 --- /dev/null +++ b/_sources/topics/staging-input-files.md.txt @@ -0,0 +1,25 @@ +# Staging Input Files + +Normally, input files are located in a read-only directory separate from +the output directory. This causes problems if the underlying tool expects to +write its output files alongside the input file in the same directory. You use [`InitialWorkDirRequirement`](https://w3id.org/cwl/CommandLineTool.html#InitialWorkDirRequirement) to stage input files into the output directory. +In this example, we use a JavaScript expression to extract the base name of the +input file from its leading directory path. + +```{literalinclude} /_includes/cwl/staging-input-files/linkfile.cwl +:language: cwl +:caption: "`linkfile.cwl`" +:name: linkfile.cwl +``` + +```{literalinclude} /_includes/cwl/staging-input-files/arguments-job.yml +:language: yaml +:caption: "`arguments-job.yml`" +``` + +Now invoke `cwltool` with the tool description and the input object on the +command line: + +```{runcmd} cwltool linkfile.cwl arguments-job.yml +:working-directory: src/_includes/cwl/staging-input-files/ +``` diff --git a/_sources/topics/troubleshooting.md.txt b/_sources/topics/troubleshooting.md.txt new file mode 100644 index 00000000..d9543fa8 --- /dev/null +++ b/_sources/topics/troubleshooting.md.txt @@ -0,0 +1,63 @@ +# Troubleshooting + +In this section you will find ways to troubleshoot when you have problems executing CWL. +We focus on `cwltool` here but some of these techniques may apply to other CWL Runners. + +## Run `cwltool` with `cachedir` + +You can use the `--cachedir` option when running a workflow to tell `cwltool` to +cache intermediate files (files that are not input nor output files, but created +while your workflow is running). By default, these files are created in a +temporary directory but writing them to a separate directory makes accessing +them easier. + +In the following example `troubleshooting-wf1.cwl` we have two steps, `step_a` and `step_b`. +The workflow is equivalent to `echo "Hello World" | rev`, which would print the message +"Hello World" reversed, i.e. "dlroW olleH". However, the second step, `step_b`, **has a typo**, +where instead of executing the `rev` command it tries to execute `revv`, which +fails. + +```{literalinclude} /_includes/cwl/troubleshooting/troubleshooting-wf1.cwl +:language: cwl +:name: "`troubleshooting-wf1.cwl`" +:caption: "`troubleshooting-wf1.cwl`" +:emphasize-lines: 42 +``` + +Let's execute this workflow with `/tmp/cachedir/` as the `--cachedir` value (`cwltool` will +create the directory for you if it does not exist already): + +```{runcmd} cwltool --cachedir /tmp/cachedir/ troubleshooting-wf1.cwl +:working-directory: src/_includes/cwl/troubleshooting +:emphasize-lines: 13-15, 18-20 +``` + +The workflow is in the `permanentFail` status due to `step_b` failing to execute the +non-existent `revv` command. The `step_a` was executed successfully and its output +has been cached in your `cachedir` location. You can inspect the intermediate files +created: + +```{runcmd} tree /tmp/cachedir +:emphasize-lines: 4 +``` + +Each workflow step has received a unique ID (the long value that looks like a hash). +The `${HASH}.status` files display the status of each step executed by the workflow. +And the `step_a` output file `stdout.txt` is visible in the output of the command above. + +Now fix the typo so `step_b` executes `rev` (i.e. replace `revv` by `rev` in the +`step_b`). After fixing the typo, when you execute `cwltool` with the same arguments +as the previous time, note that now `cwltool` output contains information about +pre-cached outputs for `step_a`, and about a new cache entry for the output of `step_b`. +Also note that the status of `step_b` is now of success. + +```{runcmd} cwltool --cachedir /tmp/cachedir/ troubleshooting-wf1-stepb-fixed.cwl +:working-directory: src/_includes/cwl/troubleshooting +:emphasize-lines: 12-16 +``` + +In this example the workflow step `step_a` was not re-evaluated as it had been cached, and +there was no change in its execution or output. Furthermore, `cwltool` was able to recognize +when it had to re-evaluate `step_b` after we fixed the executable name. This technique is +useful for troubleshooting your CWL documents and also as a way to prevent `cwltool` to +re-evaluate steps unnecessarily. diff --git a/_sources/topics/using-containers.md.txt b/_sources/topics/using-containers.md.txt new file mode 100644 index 00000000..5b47df68 --- /dev/null +++ b/_sources/topics/using-containers.md.txt @@ -0,0 +1,76 @@ +# Using Containers + +## Running Tools Inside Docker + +[Docker][docker] containers simplify software installation by providing a +complete known-good runtime for software and its dependencies. However, +containers are also purposefully isolated from the host system, so in +order to run a tool inside a Docker container there is additional work to +ensure that input files are available inside the container and output +files can be recovered from the container. A CWL runner can perform this work +automatically, allowing you to use Docker to simplify your software +management while avoiding the complexity of invoking and managing Docker +containers. + +One of the responsibilities of the CWL runner is to adjust the paths of +input files to reflect the location where they appear inside the container. + +This example runs a simple Node.js script inside a Docker container which will +then print "Hello World" to the standard output. + +```{literalinclude} /_includes/cwl/using-containers/docker.cwl +:language: cwl +:caption: "`docker.cwl`" +:name: docker.cwl +``` + +```{literalinclude} /_includes/cwl/using-containers/docker-job.yml +:language: yaml +:caption: "`docker-job.yml`" +:name: docker-job.yml +``` + +Before we run this, let's just break it down and see what some bits do. Most of this +has been explained in previous sections, the only part that is really new is the [`dockerRequirement`](https://w3id.org/cwl/CommandLineTool.html#DockerRequirement) +section. + +```cwl +baseCommand: node +hints: + DockerRequirement: + dockerPull: node:slim +``` + +`baseCommand: node` tells CWL that we will be running this command using the Node Js runtime that is meant for Javascript files. We +then need to specify some `hints` for how to find the container we want. In this case we list +just our requirements for the docker container in `DockerRequirements`. The `dockerPull:` +parameter takes the same value that you would pass to a `docker pull` command. That is, +the name of the container image (you can even specify the tag, which is good idea for +best practices when using containers for reproducible research). In this case we have +used a container called `node:slim`. + +Create a Javascript file named "hello.js" and invoke `cwltool` providing the tool description and the +input object on the command line: + +```{literalinclude} /_includes/cwl/using-containers/hello.js +:language: javascript +:caption: "`hello.js`" +:name: hello.js +``` + +```{runcmd} cwltool docker.cwl docker-job.yml +:working-directory: src/_includes/cwl/using-containers/ +``` + +```{runcmd} cat output.txt +:working-directory: src/_includes/cwl/using-containers/ +``` + +Notice the CWL runner has constructed a Docker command line to run the +script. + +In this example, the path to the script `hello.js` is `/home/me/cwl/user_guide/hello.js` +outside the container but `/var/lib/cwl/job369354770_examples/hello.js` inside +the container, as reflected in the invocation of the `node` command. + +[docker]: https://docker.io diff --git a/_sources/topics/workflows.md.txt b/_sources/topics/workflows.md.txt new file mode 100644 index 00000000..ff7c02d5 --- /dev/null +++ b/_sources/topics/workflows.md.txt @@ -0,0 +1,651 @@ +# Workflows + +A workflow is a CWL processing unit that executes command-line tools, +expression tools, or workflows (sub-workflows) as steps. It must have +`inputs`, `outputs`, and `steps` defined in the CWL document. + +% TODO: Fix the missing link the graph below. We cannot have +% it here as this file is included in two other files. +% Sphinx prohibits it for the case where this could lead +% to duplicate anchors in a page (e.g. single-html). +% :name: workflow-graph + +```{graphviz} +:caption: CWL workflow. +:align: center + +digraph G { + compound=true; + rankdir="LR"; + fontname="Verdana"; + fontsize="10"; + graph [splines=ortho]; + + node [fontname="Verdana", fontsize="10", shape=box]; + edge [fontname="Verdana", fontsize="10"]; + + subgraph cluster_0 { + node [width = 1.75]; + steps_0[style="filled" label="Command-line tools"]; + steps_1[style="filled" label="Expression tools"]; + steps_2[style="filled" label="Sub-workflows"]; + label="steps"; + fill=gray; + } + + inputs -> steps_1 [lhead=cluster_0]; + steps_1 -> outputs [ltail=cluster_0]; +} +``` + +The CWL document `echo-uppercase.cwl` defines a workflow that runs +the command-line tool, and the expression tool showed in the earlier +examples. + +% TODO: Fix the missing link the code below. We cannot have +% it here as this file is included in two other files. +% Sphinx prohibits it for the case where this could lead +% to duplicate anchors in a page (e.g. single-html). +% :name: echo-uppercase.cwl + +```{code-block} cwl +:caption: "`echo-uppercase.cwl`" +cwlVersion: v1.2 +class: Workflow + +requirements: + InlineJavascriptRequirement: {} + +inputs: + message: string + +outputs: + out: + type: string + outputSource: uppercase/uppercase_message + +steps: + echo: + run: echo.cwl + in: + message: message + out: [out] + uppercase: + run: uppercase.cwl + in: + message: + source: echo/out + out: [uppercase_message] +``` + +A command-line tool or expression tool can also be written directly +in the same CWL document as the workflow. For example, we can rewrite +the `echo-uppercase.cwl` workflow as a single file: + +% TODO: Fix the missing link the code below. We cannot have +% it here as this file is included in two other files. +% Sphinx prohibits it for the case where this could lead +% to duplicate anchors in a page (e.g. single-html). +% :name: echo-uppercase-single-file.cwl + +```{code-block} cwl +:caption: "`echo-uppercase-single-file.cwl`" +cwlVersion: v1.2 +class: Workflow + +requirements: + InlineJavascriptRequirement: {} + +inputs: + message: string + +outputs: + out: + type: string + outputSource: uppercase/uppercase_message + +steps: + echo: + run: + class: CommandLineTool + + baseCommand: echo + + stdout: output.txt + + inputs: + message: + type: string + inputBinding: {} + outputs: + out: + type: string + outputBinding: + glob: output.txt + loadContents: true + outputEval: $(self[0].contents) + in: + message: message + out: [out] + uppercase: + run: + class: ExpressionTool + + requirements: + InlineJavascriptRequirement: {} + + inputs: + message: string + outputs: + uppercase_message: string + + expression: | + ${ return {"uppercase_message": inputs.message.toUpperCase()}; } + in: + message: + source: echo/out + out: [uppercase_message] +``` + +Having separate files helps with modularity and code organization. But +it can be helpful writing everything in a single file for development. +There are other ways to combine multiple files into a single file +(e.g. `cwltool --pack`) discussed further in other sections of this +user guide. + +% TODO: add a link to the page about SubworkflowFeatureRequirement + +```{note} + +For a sub-workflows you need to enable the requirement +`SubworkflowFeatureRequirement`. It is covered in another section +of this user guide in more detail. +``` + +## Writing Workflows + +This workflow extracts a java source file from a tar file and then +compiles it. + +```{literalinclude} /_includes/cwl/workflows/1st-workflow.cwl +:language: cwl +:caption: "`1st-workflow.cwl`" +:name: 1st-workflow.cwl +``` + +% TODO: The link below is for a previous commit with the workflow above. Ideally, I think we should either use `cwltool` +% or Python to add the graph here. Or, maybe re-create the graph for the latest main version? + +```{admonition} Visualization of 1st-workflow.cwl +[![Visualization of 1st-workflow.cwl](https://view.commonwl.org/graph/png/github.com/common-workflow-language/user_guide/blob/a29e7eae0006660946fc705a310b37a21a7e1edc/_includes/cwl/21-1st-workflow/1st-workflow.cwl)](https://view.commonwl.org/graph/png/github.com/common-workflow-language/user_guide/blob/a29e7eae0006660946fc705a310b37a21a7e1edc/_includes/cwl/21-1st-workflow/1st-workflow.cwl) +``` + +Use a YAML or a JSON object in a separate file to describe the input of a run: + +```{literalinclude} /_includes/cwl/workflows/1st-workflow-job.yml +:language: yaml +:caption: "`1st-workflow-job.yml`" +:name: 1st-workflow-job.yml +``` + +Next, create a sample Java file and add it to a tar file to use with the command-line tool. + +```{code-block} console +$ echo "public class Hello {}" > Hello.java && tar -cvf hello.tar Hello.java +Hello.java +``` + +Now invoke `cwltool` with the tool description and the input object on the +command line: + +```{runcmd} cwltool 1st-workflow.cwl 1st-workflow-job.yml +:working-directory: src/_includes/cwl/workflows/ +``` + +What's going on here? Let's break it down: + +```cwl +cwlVersion: v1.0 +class: Workflow +``` + +The `cwlVersion` field indicates the version of the CWL spec used by the +document. The `class` field indicates this document describes a workflow. + +```cwl +inputs: + tarball: File + name_of_file_to_extract: string +``` + +The `inputs` section describes the inputs of the workflow. This is a +list of input parameters where each parameter consists of an identifier +and a data type. These parameters can be used as sources for input to +specific workflows steps. + +```cwl +outputs: + compiled_class: + type: File + outputSource: compile/classfile +``` + +The `outputs` section describes the outputs of the workflow. This is a +list of output parameters where each parameter consists of an identifier +and a data type. The `outputSource` connects the output parameter `classfile` +of the `compile` step to the workflow output parameter `compiled_class`. + +```cwl +steps: + untar: + run: tar-param.cwl + in: + tarfile: tarball + extractfile: name_of_file_to_extract + out: [extracted_file] +``` + +The `steps` section describes the actual steps of the workflow. In this +example, the first step extracts a file from a tar file, and the second +step compiles the file from the first step using the java compiler. +Workflow steps are not necessarily run in the order they are listed, +instead the order is determined by the dependencies between steps (using +`source`). In addition, workflow steps which do not depend on one +another may run in parallel. + +The first step, `untar` runs `tar-param.cwl` (described previously in +[Parameter References](parameter-references.md)). +This tool has two input parameters, `tarfile` and `extractfile` and one output +parameter `extracted_file`. + +The ``in`` section of the workflow step connects these two input parameters to +the inputs of the workflow, `tarball` and `name_of_file_to_extract` using +`source`. This means that when the workflow step is executed, the values +assigned to `tarball` and `name_of_file_to_extract` will be used for the +parameters `tarfile` and `extractfile` in order to run the tool. + +The `out` section of the workflow step lists the output parameters that are +expected from the tool. + +```cwl + compile: + run: arguments.cwl + in: + src: untar/extracted_file + out: [classfile] +``` + +The second step `compile` depends on the results from the first step by +connecting the input parameter `src` to the output parameter of `untar` using +`untar/extracted_file`. It runs `arguments.cwl` (described previously in +[Additional Arguments and Parameters](additional-arguments-and-parameters.md)). +The output of this step `classfile` is connected to the +`outputs` section for the Workflow, described above. + +## Nested Workflows + +Workflows are ways to combine multiple tools to perform a larger operations. +We can also think of a workflow as being a tool itself; a CWL workflow can be +used as a step in another CWL workflow, if the workflow engine supports the +`SubworkflowFeatureRequirement`: + +```cwl +requirements: + SubworkflowFeatureRequirement: {} +``` + +Here's an example workflow that uses our `1st-workflow.cwl` as a nested +workflow: + +```{literalinclude} /_includes/cwl/workflows/nestedworkflows.cwl +:language: cwl +:caption: "`nestedworkflows.cwl`" +:name: nestedworkflows.cwl +``` + +```{note} +

Visualization of the workflow and the inner workflow from its `compile` step + +This two-step workflow starts with the `create-tar` step which is connected to +the `compile` step in orange; `compile` is another workflow, diagrammed on the +right. In purple we see the fixed string `"Hello.java"` being supplied as the +`name_of_file_to_extract`. + + + +``` + +A CWL `Workflow` can be used as a `step` just like a `CommandLineTool`, its CWL +file is included with `run`. The workflow inputs (`tarball` and `name_of_file_to_extract`) and outputs +(`compiled_class`) then can be mapped to become the step's input/outputs. + +```cwl + compile: + run: 1st-workflow.cwl + in: + tarball: create-tar/tar_compressed_java_file + name_of_file_to_extract: + default: "Hello.java" + out: [compiled_class] +``` + +Our `1st-workflow.cwl` was parameterized with workflow inputs, so when running +it we had to provide a job file to denote the tar file and `*.java` filename. +This is generally best-practice, as it means it can be reused in multiple parent +workflows, or even in multiple steps within the same workflow. + +Here we use `default:` to hard-code `"Hello.java"` as the `name_of_file_to_extract` +input, however our workflow also requires a tar file at `tarball`, which we will +prepare in the `create-tar` step. At this point it is probably a good idea to refactor +`1st-workflow.cwl` to have more specific input/output names, as those also +appear in its usage as a tool. + +It is also possible to do a less generic approach and avoid external +dependencies in the job file. So in this workflow we can generate a hard-coded +`Hello.java` file using the previously mentioned `InitialWorkDirRequirement` +requirement, before adding it to a tar file. + +```cwl + create-tar: + requirements: + InitialWorkDirRequirement: + listing: + - entryname: Hello.java + entry: | + public class Hello { + public static void main(String[] argv) { + System.out.println("Hello from Java"); + } + } +``` + +In this case our step can assume `Hello.java` rather than be parameterized, so +we can use hardcoded values `hello.tar` and `Hello.java` in a `baseCommand` and +the resulting `outputs`: + +```cwl + run: + class: CommandLineTool + inputs: [] + baseCommand: [tar, --create, --file=hello.tar, Hello.java] + outputs: + tar_compressed_java_file: + type: File + streamable: true + outputBinding: + glob: "hello.tar" +``` + +Did you notice that we didn't split out the `tar --create` tool to a separate file, +but rather embedded it within the CWL Workflow file? This is generally not best +practice, as the tool then can't be reused. The reason for doing it in this case +is because the command line is hard-coded with filenames that only make sense +within this workflow. + +In this example we had to prepare a tar file outside, but only because our inner +workflow was designed to take that as an input. A better refactoring of the +inner workflow would be to take a list of Java files to compile, which would +simplify its usage as a tool step in other workflows. + +Nested workflows can be a powerful feature to generate higher-level functional +and reusable workflow units - but just like for creating a CWL Tool description, +care must be taken to improve its usability in multiple workflows. + +## Scattering Steps + +Now that we know how to write workflows, we can start utilizing the `ScatterFeatureRequirement`. +This feature tells the runner that you wish to run a tool or workflow multiple times over a list +of inputs. The workflow then takes the input(s) as an array and will run the specified step(s) +on each element of the array as if it were a single input. This allows you to run the same workflow +on multiple inputs without having to generate many different commands or input yaml files. + +```cwl +requirements: + ScatterFeatureRequirement: {} +``` + +The most common reason a new user might want to use scatter is to perform the same analysis on +different samples. Let's start with a simple workflow that calls our first example +(`hello_world.cwl`) and takes an array of strings as input to the workflow: + +```{literalinclude} /_includes/cwl/workflows/scatter-workflow.cwl +:language: cwl +:caption: "`scatter-workflow.cwl`" +:name: scatter-workflow.cwl +``` + +Aside from the `requirements` section including `ScatterFeatureRequirement`, what is +going on here? + +```cwl +inputs: + message_array: string[] +``` + +First of all, notice that the main workflow level input here requires an array of strings. + +```cwl +steps: + echo: + run: hello_world.cwl + scatter: message + in: + message: message_array + out: [] +``` + +Here we've added a new field to the step `echo` called `scatter`. This field tells the +runner that we'd like to scatter over this input for this particular step. Note that +the input name listed after scatter is the one of the step's input, not a workflow level input. + +For our first scatter, it's as simple as that! Since our tool doesn't collect any outputs, we +still use `outputs: []` in our workflow, but if you expect that the final output of your +workflow will now have multiple outputs to collect, be sure to update that to an array type +as well! + +Using the following input file: + +```{literalinclude} /_includes/cwl/workflows/scatter-job.yml +:language: yaml +:caption: "`scatter-job.yml`" +:name: scatter-job.yml +``` + +As a reminder, [`hello_world.cwl`](../introduction/quick-start.md) simply calls the command +`echo` on a message. If we invoke `cwltool scatter-workflow.cwl scatter-job.yml` on the +command line: + +```{runcmd} cwltool scatter-workflow.cwl scatter-job.yml +:working-directory: src/_includes/cwl/workflows/ +``` + +You can see that the workflow calls echo multiple times on each element of our +`message_array`. Ok, so how about if we want to scatter over two steps in a workflow? + +Let's perform a simple echo like above, but capturing `stdout` by adding the following +lines instead of `outputs: []` + +```{code-block} cwl +:caption: "`hello_world_to_stdout.cwl`" +:name: hello_world_to_stdout.cwl +outputs: + echo_out: + type: stdout +``` + +And add a second step that uses `wc` to count the characters in each file. See the tool +below: + +```{literalinclude} /_includes/cwl/workflows/wc-tool.cwl +:language: cwl +:caption: "`wc-tool.cwl`" +:name: wc-tool.cwl +``` + +Now, how do we incorporate scatter? Remember the scatter field is under each step: + +```{literalinclude} /_includes/cwl/workflows/scatter-two-steps.cwl +:language: cwl +:caption: "`scatter-two-steps.cwl`" +:name: scatter-two-steps.cwl +``` + +Here we have placed the scatter field under each step. This is fine for this example since +it runs quickly, but if you're running many samples for a more complex workflow, you may +wish to consider an alternative. Here we are running scatter on each step independently, but +since the second step is not dependent on the first step completing all languages, we aren't +using the scatter functionality efficiently. The second step expects an array as input from +the first step, so it will wait until everything in step one is finished before doing anything. +Pretend that `echo Hello World!` takes 1 minute to perform, `wc -c` on the output takes 3 minutes +and that `echo Hallo welt!` takes 5 minutes to perform, and `wc` on that output takes 3 minutes. +Even though `echo Hello World!` could finish in 4 minutes, it will actually finish in 8 minutes +because the first step must wait on `echo Hallo welt!`. You can see how this might not scale +well. + +Ok, so how do we scatter on steps that can proceed independent of other samples? Remember from +[Nested Workflows](#nested-workflows), that we can make an entire workflow a single step in another workflow! Convert our +two-step workflow to a single step subworkflow: + +```{literalinclude} /_includes/cwl/workflows/scatter-nested-workflow.cwl +:language: cwl +:caption: "`scatter-nested-workflow.cwl`" +:name: scatter-nested-workflow.cwl +``` + +Now the scatter acts on a single step, but that step consists of two steps so each step is performed +in parallel. + +## Conditional Workflows + +This workflow contains a conditional step and is executed based on the input. +This allows workflows to skip additional steps based on input parameters given at the start of the program or by previous steps. + +```{code-block} cwl +:caption: "`conditional-workflow.cwl`" +:name: conditional-workflow.cwl +class: Workflow +cwlVersion: v1.2 +inputs: + val: int + +steps: + + step1: + in: + in1: val + a_new_var: val + run: foo.cwl + when: $(inputs.in1 < 1) + out: [out1] + + step2: + in: + in1: val + a_new_var: val + run: foo.cwl + when: $(inputs.a_new_var > 2) + out: [out1] + +outputs: + out1: + type: string + outputSource: + - step1/out1 + - step2/out1 + pickValue: first_non_null + +requirements: + InlineJavascriptRequirement: {} + MultipleInputFeatureRequirement: {} +``` + +The first thing you'll notice is that this workflow is only compatible for version 1.2 or greater of the CWL standards. + +```cwl +class: Workflow +cwlVersion: v1.2 +``` + +The first step of the workflow (step1) contains two input properties and will execute foo.cwl when the conditions are met. The new property `when` is where the condition validation takes place. In this case only when `in1` from the workflow contains a value `< 1` this step will be executed. + +```cwl +steps: + + step1: + in: + in1: val + a_new_var: val + run: foo.cwl + when: $(inputs.in1 < 1) + out: [out1] +``` + +Using the following command `cwltool cond-wf-003.1.cwl --val 0` the value will pass the first conditional step and will therefore be executed and is shown in the log by `INFO [step step1] start` whereas the second step is skipped as indicated by `INFO [step step2] will be skipped`. + +```{code-block} console +INFO [workflow ] start +INFO [workflow ] starting step step1 +INFO [step step1] start +INFO [job step1] /private/tmp/docker_tmpdcyoto2d$ echo + +INFO [job step1] completed success +INFO [step step1] completed success +INFO [workflow ] starting step step2 +INFO [step step2] will be skipped +INFO [step step2] completed skipped +INFO [workflow ] completed success +{ + "out1": "foo 0" +} +INFO Final process status is success +``` + +When a value of 3 is given the first conditional step will not be executed but the second step will `cwltool cond-wf-003.1.cwl --val 3`. + +```{code-block} console +INFO [workflow ] start +INFO [workflow ] starting step step1 +INFO [step step1] will be skipped +INFO [step step1] completed skipped +INFO [workflow ] starting step step2 +INFO [step step2] start +INFO [job step2] /private/tmp/docker_tmpqwr93mxx$ echo + +INFO [job step2] completed success +INFO [step step2] completed success +INFO [workflow ] completed success +{ + "out1": "foo 3" +} +INFO Final process status is success +``` + +If no conditions are met for example when using `--val 2` the workflow will raise a permanentFail. + +```{code-block} console +$ cwltool cond-wf-003.1.cwl --val 2 + +INFO [workflow ] start +INFO [workflow ] starting step step1 +INFO [step step1] will be skipped +INFO [step step1] completed skipped +INFO [workflow ] starting step step2 +INFO [step step2] will be skipped +INFO [step step2] completed skipped +ERROR [workflow ] Cannot collect workflow output: All sources for 'out1' are null +INFO [workflow ] completed permanentFail +WARNING Final process status is permanentFail +``` + +% TODO +% - Scatter +% - ScatterMethod https://github.com/common-workflow-language/user_guide/issues/29 +% - Also in the **episode 23** of the current User Guide - https://www.commonwl.org/user_guide/workflows/index.html +% - Subworkflows/nested workflows +% - Covered in the **episode 22** from the current User Guide - https://www.commonwl.org/user_guide/workflows/index.html +% - Conditionals https://github.com/common-workflow-language/user_guide/issues/191 & https://github.com/common-workflow-language/user_guide/issues/188 +% - Also in the **episode 24** of the current User Guide - https://www.commonwl.org/user_guide/24_conditional-workflow/index.html diff --git a/_sources/topics/yaml-guide.md.txt b/_sources/topics/yaml-guide.md.txt new file mode 100644 index 00000000..9475f83a --- /dev/null +++ b/_sources/topics/yaml-guide.md.txt @@ -0,0 +1,203 @@ +# YAML Guide + + + + +[YAML][yaml] is a file format +designed to be readable by both computers and humans. +This guide introduces the features of YAML that are +relevant when writing CWL descriptions and input parameter files. + +```{note} + +You can skip this section if you are already comfortable with YAML. +``` + +## Contents + +- [Key-Value Pairs](#key-value-pairs) +- [Comments](#comments) +- [Maps](#maps) +- [Arrays](#arrays) +- [JSON Style](#json-style) + +## Key-Value Pairs + +Fundamentally, a file written in YAML consists of a set of _key-value pairs_. +Each pair is written as `key: value`, +where whitespace after the `:` is required. +Key names in CWL files should not contain whitespace - +[_camelCase_][camelCase] is used for multi-word key names +that have special meaning in the CWL specification +and underscored key names otherwise. +For example: + +```yaml +first_name: Bilbo +last_name: Baggins +age_years: 111 +home: Bag End, Hobbiton +``` + +The YAML above defines four keys - +`first_name`, `last_name`, `age_years`, and `home` - +with their four respective values. +Values can be +character strings, +numeric (integer, floating point, or scientific representation), +Boolean (`true` or `false`), +or more complex nested types (see below). + +Values may be wrapped in quotation marks, +but be aware that this may change the way that they are interpreted +i.e. `"1234"` will be treated as a character string +, while `1234` will be treated as an integer. +This distinction can be important, +for example when describing parameters to a command: +in CWL all parts of `baseCommand` must be strings so, +if you want to specify a fixed numeric value to a command, +make sure that you wrap that numeric value in quotes: `baseCommand: [echo, "42"]`. + +## Comments + +You may use `#` to add comments to your CWL and parameter files. +Any characters to the right of ` #` will be ignored by the program interpreting +the YAML. +For example: + +```yaml +first_name: Bilbo +last_name: Baggins +age_years: 111 +# this line will be ignored by the interpreter +home: Bag End, Hobbiton # this is ignored too +``` + +If there is anything on the line before the comment, +be sure to add at least one space before the `#`! + +## Maps + +When describing a tool or workflow with CWL, +it is usually necessary to construct more complex, nested representations. +Referred to as _maps_, +these hierarchical structures are described in YAML by providing +additional key-value pairs as the value of any key. +These pairs (sometimes referred to as "children") are written +on new lines under the key to which they belong (the "parent"), +and should be indented with two spaces +(⇥tab characters are not allowed). +For example: + +```yaml +cwlVersion: v1.0 +class: CommandLineTool +baseCommand: echo +inputs: # this key has an object value + example_flag: # so does this one + type: boolean + inputBinding: # and this one too + position: 1 + prefix: -f +``` + +The YAML above illustrates how to build up complex nested object +descriptions relatively quickly. +The `inputs` map contains a single key, `example_flag`, +which itself contains two keys, `type` and `inputBinding`, +while one of these children, `inputBinding`, +contains a further two key-value pairs (`position` and `prefix`). +See the [Arrays](#arrays) section below for more information about providing multiple +values/key-value pairs for a single key. +For comparison with the example YAML above, +here is a graphical representation of the `inputs` object it describes. + +

+graph TD + inputs --> example_flag + example_flag --> type + type --- bool((boolean)) + example_flag --> inputBinding + inputBinding --> position + inputBinding --> prefix + position --- posval((1)) + prefix --- prefval(('-f')) +
+ +## Arrays + +In certain circumstances, it is necessary to provide +multiple values or objects for a single key. +As we've already seen in the [Maps](#maps) section above, +more than one key-value pair can be mapped to a single key. +However, it is also possible to define multiple values for a key +without having to provide a unique key for each value. +We can achieve this with an _array_, +where each value is defined on its own line and preceded by `-`. +For example: + +```yaml +touchfiles: + - foo.txt + - bar.dat + - baz.txt +``` + +and a more complex example combining maps and arrays: + +```yaml +exclusive_parameters: + type: + - type: record + name: itemC + fields: + itemC: + type: string + inputBinding: + prefix: -C + - type: record + name: itemD + fields: + itemD: + type: string + inputBinding: + prefix: -D +``` + +## JSON Style + +YAML is based on [JavaScript Object Notation (JSON)][json]. +Maps and arrays can also be defined in YAML using the native JSON syntax. +For example: + +```yaml +touchfiles: [foo.txt, bar.dat, baz.txt] # equivalent to first Arrays example +``` + +and: + +```yaml +# equivalent to the `inputs` example in "Maps" above +inputs: {example_flag: {type: boolean, inputBinding: {position: 1, prefix: -f}}} +``` + +Native JSON can be useful +in indicating where a field is intentionally left empty +(such as `[]` for an empty array), +as well as where it makes more sense +for the values to be located on the same line +(For example, when providing option flags and their values in a shell command). +However, as the second example above shows, +it can severely affect the readability of a YAML file, +and should be used sparingly. + +## Reference + +The [Learn YAML in Y Minutes][yaml-y-mins] reference was very helpful for us +while we wrote this guide, +though it also covers features that are not valid in CWL. + +[camelCase]: https://en.wikipedia.org/wiki/Camel_case +[json]: http://json.org/ +[yaml]: http://yaml.org/ +[yaml-y-mins]: https://learnxinyminutes.com/docs/yaml/ diff --git a/_sources/tutorials.md.txt b/_sources/tutorials.md.txt new file mode 100644 index 00000000..750e5454 --- /dev/null +++ b/_sources/tutorials.md.txt @@ -0,0 +1,19 @@ +# Tutorials + +% https://github.com/common-workflow-language/user_guide/issues/160 + +This is a list of tutorials provided by the CWL community. Use the `Edit this page` link in the menu if you would like to add another tutorial to the list. + +## Beginner Tutorials + +- [Introduction to Workflows with Common Workflow Language: For novices.](https://carpentries-incubator.github.io/cwl-novice-tutorial/) + +## Advanced Tutorials + +- [Typescript in CWL](https://github.com/umccr/cwl-ica/wiki/TypeScript) + +## Bioinformatics Tutorials + +- [rnaseq with CWL](https://arvados.github.io/rnaseq-cwl-training/) + +% - Running CWL in Production (on Linux, HPC, with containers, k8s, etc.? We can link existing docs) diff --git a/_static/CWL-Logo-HD-cropped2.png b/_static/CWL-Logo-HD-cropped2.png new file mode 100644 index 00000000..f7df48db Binary files /dev/null and b/_static/CWL-Logo-HD-cropped2.png differ diff --git a/_static/basic.css b/_static/basic.css new file mode 100644 index 00000000..2af6139e --- /dev/null +++ b/_static/basic.css @@ -0,0 +1,925 @@ +/* + * basic.css + * ~~~~~~~~~ + * + * Sphinx stylesheet -- basic theme. + * + * :copyright: Copyright 2007-2024 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +/* -- main layout ----------------------------------------------------------- */ + +div.clearer { + clear: both; +} + +div.section::after { + display: block; + content: ''; + clear: left; +} + +/* -- relbar ---------------------------------------------------------------- */ + +div.related { + width: 100%; + font-size: 90%; +} + +div.related h3 { + display: none; +} + +div.related ul { + margin: 0; + padding: 0 0 0 10px; + list-style: none; +} + +div.related li { + display: inline; +} + +div.related li.right { + float: right; + margin-right: 5px; +} + +/* -- sidebar --------------------------------------------------------------- */ + +div.sphinxsidebarwrapper { + padding: 10px 5px 0 10px; +} + +div.sphinxsidebar { + float: left; + width: 270px; + margin-left: -100%; + font-size: 90%; + word-wrap: break-word; + overflow-wrap : break-word; +} + +div.sphinxsidebar ul { + list-style: none; +} + +div.sphinxsidebar ul ul, +div.sphinxsidebar ul.want-points { + margin-left: 20px; + list-style: square; +} + +div.sphinxsidebar ul ul { + margin-top: 0; + margin-bottom: 0; +} + +div.sphinxsidebar form { + margin-top: 10px; +} + +div.sphinxsidebar input { + border: 1px solid #98dbcc; + font-family: sans-serif; + font-size: 1em; +} + +div.sphinxsidebar #searchbox form.search { + overflow: hidden; +} + +div.sphinxsidebar #searchbox input[type="text"] { + float: left; + width: 80%; + padding: 0.25em; + box-sizing: border-box; +} + +div.sphinxsidebar #searchbox input[type="submit"] { + float: left; + width: 20%; + border-left: none; + padding: 0.25em; + box-sizing: border-box; +} + + +img { + border: 0; + max-width: 100%; +} + +/* -- search page ----------------------------------------------------------- */ + +ul.search { + margin: 10px 0 0 20px; + padding: 0; +} + +ul.search li { + padding: 5px 0 5px 20px; + background-image: url(file.png); + background-repeat: no-repeat; + background-position: 0 7px; +} + +ul.search li a { + font-weight: bold; +} + +ul.search li p.context { + color: #888; + margin: 2px 0 0 30px; + text-align: left; +} + +ul.keywordmatches li.goodmatch a { + font-weight: bold; +} + +/* -- index page ------------------------------------------------------------ */ + +table.contentstable { + width: 90%; + margin-left: auto; + margin-right: auto; +} + +table.contentstable p.biglink { + line-height: 150%; +} + +a.biglink { + font-size: 1.3em; +} + +span.linkdescr { + font-style: italic; + padding-top: 5px; + font-size: 90%; +} + +/* -- general index --------------------------------------------------------- */ + +table.indextable { + width: 100%; +} + +table.indextable td { + text-align: left; + vertical-align: top; +} + +table.indextable ul { + margin-top: 0; + margin-bottom: 0; + list-style-type: none; +} + +table.indextable > tbody > tr > td > ul { + padding-left: 0em; +} + +table.indextable tr.pcap { + height: 10px; +} + +table.indextable tr.cap { + margin-top: 10px; + background-color: #f2f2f2; +} + +img.toggler { + margin-right: 3px; + margin-top: 3px; + cursor: pointer; +} + +div.modindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +div.genindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +/* -- domain module index --------------------------------------------------- */ + +table.modindextable td { + padding: 2px; + border-collapse: collapse; +} + +/* -- general body styles --------------------------------------------------- */ + +div.body { + min-width: 360px; + max-width: 800px; +} + +div.body p, div.body dd, div.body li, div.body blockquote { + -moz-hyphens: auto; + -ms-hyphens: auto; + -webkit-hyphens: auto; + hyphens: auto; +} + +a.headerlink { + visibility: hidden; +} + +a:visited { + color: #551A8B; +} + +h1:hover > a.headerlink, +h2:hover > a.headerlink, +h3:hover > a.headerlink, +h4:hover > a.headerlink, +h5:hover > a.headerlink, +h6:hover > a.headerlink, +dt:hover > a.headerlink, +caption:hover > a.headerlink, +p.caption:hover > a.headerlink, +div.code-block-caption:hover > a.headerlink { + visibility: visible; +} + +div.body p.caption { + text-align: inherit; +} + +div.body td { + text-align: left; +} + +.first { + margin-top: 0 !important; +} + +p.rubric { + margin-top: 30px; + font-weight: bold; +} + +img.align-left, figure.align-left, .figure.align-left, object.align-left { + clear: left; + float: left; + margin-right: 1em; +} + +img.align-right, figure.align-right, .figure.align-right, object.align-right { + clear: right; + float: right; + margin-left: 1em; +} + +img.align-center, figure.align-center, .figure.align-center, object.align-center { + display: block; + margin-left: auto; + margin-right: auto; +} + +img.align-default, figure.align-default, .figure.align-default { + display: block; + margin-left: auto; + margin-right: auto; +} + +.align-left { + text-align: left; +} + +.align-center { + text-align: center; +} + +.align-default { + text-align: center; +} + +.align-right { + text-align: right; +} + +/* -- sidebars -------------------------------------------------------------- */ + +div.sidebar, +aside.sidebar { + margin: 0 0 0.5em 1em; + border: 1px solid #ddb; + padding: 7px; + background-color: #ffe; + width: 40%; + float: right; + clear: right; + overflow-x: auto; +} + +p.sidebar-title { + font-weight: bold; +} + +nav.contents, +aside.topic, +div.admonition, div.topic, blockquote { + clear: left; +} + +/* -- topics ---------------------------------------------------------------- */ + +nav.contents, +aside.topic, +div.topic { + border: 1px solid #ccc; + padding: 7px; + margin: 10px 0 10px 0; +} + +p.topic-title { + font-size: 1.1em; + font-weight: bold; + margin-top: 10px; +} + +/* -- admonitions ----------------------------------------------------------- */ + +div.admonition { + margin-top: 10px; + margin-bottom: 10px; + padding: 7px; +} + +div.admonition dt { + font-weight: bold; +} + +p.admonition-title { + margin: 0px 10px 5px 0px; + font-weight: bold; +} + +div.body p.centered { + text-align: center; + margin-top: 25px; +} + +/* -- content of sidebars/topics/admonitions -------------------------------- */ + +div.sidebar > :last-child, +aside.sidebar > :last-child, +nav.contents > :last-child, +aside.topic > :last-child, +div.topic > :last-child, +div.admonition > :last-child { + margin-bottom: 0; +} + +div.sidebar::after, +aside.sidebar::after, +nav.contents::after, +aside.topic::after, +div.topic::after, +div.admonition::after, +blockquote::after { + display: block; + content: ''; + clear: both; +} + +/* -- tables ---------------------------------------------------------------- */ + +table.docutils { + margin-top: 10px; + margin-bottom: 10px; + border: 0; + border-collapse: collapse; +} + +table.align-center { + margin-left: auto; + margin-right: auto; +} + +table.align-default { + margin-left: auto; + margin-right: auto; +} + +table caption span.caption-number { + font-style: italic; +} + +table caption span.caption-text { +} + +table.docutils td, table.docutils th { + padding: 1px 8px 1px 5px; + border-top: 0; + border-left: 0; + border-right: 0; + border-bottom: 1px solid #aaa; +} + +th { + text-align: left; + padding-right: 5px; +} + +table.citation { + border-left: solid 1px gray; + margin-left: 1px; +} + +table.citation td { + border-bottom: none; +} + +th > :first-child, +td > :first-child { + margin-top: 0px; +} + +th > :last-child, +td > :last-child { + margin-bottom: 0px; +} + +/* -- figures --------------------------------------------------------------- */ + +div.figure, figure { + margin: 0.5em; + padding: 0.5em; +} + +div.figure p.caption, figcaption { + padding: 0.3em; +} + +div.figure p.caption span.caption-number, +figcaption span.caption-number { + font-style: italic; +} + +div.figure p.caption span.caption-text, +figcaption span.caption-text { +} + +/* -- field list styles ----------------------------------------------------- */ + +table.field-list td, table.field-list th { + border: 0 !important; +} + +.field-list ul { + margin: 0; + padding-left: 1em; +} + +.field-list p { + margin: 0; +} + +.field-name { + -moz-hyphens: manual; + -ms-hyphens: manual; + -webkit-hyphens: manual; + hyphens: manual; +} + +/* -- hlist styles ---------------------------------------------------------- */ + +table.hlist { + margin: 1em 0; +} + +table.hlist td { + vertical-align: top; +} + +/* -- object description styles --------------------------------------------- */ + +.sig { + font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; +} + +.sig-name, code.descname { + background-color: transparent; + font-weight: bold; +} + +.sig-name { + font-size: 1.1em; +} + +code.descname { + font-size: 1.2em; +} + +.sig-prename, code.descclassname { + background-color: transparent; +} + +.optional { + font-size: 1.3em; +} + +.sig-paren { + font-size: larger; +} + +.sig-param.n { + font-style: italic; +} + +/* C++ specific styling */ + +.sig-inline.c-texpr, +.sig-inline.cpp-texpr { + font-family: unset; +} + +.sig.c .k, .sig.c .kt, +.sig.cpp .k, .sig.cpp .kt { + color: #0033B3; +} + +.sig.c .m, +.sig.cpp .m { + color: #1750EB; +} + +.sig.c .s, .sig.c .sc, +.sig.cpp .s, .sig.cpp .sc { + color: #067D17; +} + + +/* -- other body styles ----------------------------------------------------- */ + +ol.arabic { + list-style: decimal; +} + +ol.loweralpha { + list-style: lower-alpha; +} + +ol.upperalpha { + list-style: upper-alpha; +} + +ol.lowerroman { + list-style: lower-roman; +} + +ol.upperroman { + list-style: upper-roman; +} + +:not(li) > ol > li:first-child > :first-child, +:not(li) > ul > li:first-child > :first-child { + margin-top: 0px; +} + +:not(li) > ol > li:last-child > :last-child, +:not(li) > ul > li:last-child > :last-child { + margin-bottom: 0px; +} + +ol.simple ol p, +ol.simple ul p, +ul.simple ol p, +ul.simple ul p { + margin-top: 0; +} + +ol.simple > li:not(:first-child) > p, +ul.simple > li:not(:first-child) > p { + margin-top: 0; +} + +ol.simple p, +ul.simple p { + margin-bottom: 0; +} + +aside.footnote > span, +div.citation > span { + float: left; +} +aside.footnote > span:last-of-type, +div.citation > span:last-of-type { + padding-right: 0.5em; +} +aside.footnote > p { + margin-left: 2em; +} +div.citation > p { + margin-left: 4em; +} +aside.footnote > p:last-of-type, +div.citation > p:last-of-type { + margin-bottom: 0em; +} +aside.footnote > p:last-of-type:after, +div.citation > p:last-of-type:after { + content: ""; + clear: both; +} + +dl.field-list { + display: grid; + grid-template-columns: fit-content(30%) auto; +} + +dl.field-list > dt { + font-weight: bold; + word-break: break-word; + padding-left: 0.5em; + padding-right: 5px; +} + +dl.field-list > dd { + padding-left: 0.5em; + margin-top: 0em; + margin-left: 0em; + margin-bottom: 0em; +} + +dl { + margin-bottom: 15px; +} + +dd > :first-child { + margin-top: 0px; +} + +dd ul, dd table { + margin-bottom: 10px; +} + +dd { + margin-top: 3px; + margin-bottom: 10px; + margin-left: 30px; +} + +.sig dd { + margin-top: 0px; + margin-bottom: 0px; +} + +.sig dl { + margin-top: 0px; + margin-bottom: 0px; +} + +dl > dd:last-child, +dl > dd:last-child > :last-child { + margin-bottom: 0; +} + +dt:target, span.highlighted { + background-color: #fbe54e; +} + +rect.highlighted { + fill: #fbe54e; +} + +dl.glossary dt { + font-weight: bold; + font-size: 1.1em; +} + +.versionmodified { + font-style: italic; +} + +.system-message { + background-color: #fda; + padding: 5px; + border: 3px solid red; +} + +.footnote:target { + background-color: #ffa; +} + +.line-block { + display: block; + margin-top: 1em; + margin-bottom: 1em; +} + +.line-block .line-block { + margin-top: 0; + margin-bottom: 0; + margin-left: 1.5em; +} + +.guilabel, .menuselection { + font-family: sans-serif; +} + +.accelerator { + text-decoration: underline; +} + +.classifier { + font-style: oblique; +} + +.classifier:before { + font-style: normal; + margin: 0 0.5em; + content: ":"; + display: inline-block; +} + +abbr, acronym { + border-bottom: dotted 1px; + cursor: help; +} + +.translated { + background-color: rgba(207, 255, 207, 0.2) +} + +.untranslated { + background-color: rgba(255, 207, 207, 0.2) +} + +/* -- code displays --------------------------------------------------------- */ + +pre { + overflow: auto; + overflow-y: hidden; /* fixes display issues on Chrome browsers */ +} + +pre, div[class*="highlight-"] { + clear: both; +} + +span.pre { + -moz-hyphens: none; + -ms-hyphens: none; + -webkit-hyphens: none; + hyphens: none; + white-space: nowrap; +} + +div[class*="highlight-"] { + margin: 1em 0; +} + +td.linenos pre { + border: 0; + background-color: transparent; + color: #aaa; +} + +table.highlighttable { + display: block; +} + +table.highlighttable tbody { + display: block; +} + +table.highlighttable tr { + display: flex; +} + +table.highlighttable td { + margin: 0; + padding: 0; +} + +table.highlighttable td.linenos { + padding-right: 0.5em; +} + +table.highlighttable td.code { + flex: 1; + overflow: hidden; +} + +.highlight .hll { + display: block; +} + +div.highlight pre, +table.highlighttable pre { + margin: 0; +} + +div.code-block-caption + div { + margin-top: 0; +} + +div.code-block-caption { + margin-top: 1em; + padding: 2px 5px; + font-size: small; +} + +div.code-block-caption code { + background-color: transparent; +} + +table.highlighttable td.linenos, +span.linenos, +div.highlight span.gp { /* gp: Generic.Prompt */ + user-select: none; + -webkit-user-select: text; /* Safari fallback only */ + -webkit-user-select: none; /* Chrome/Safari */ + -moz-user-select: none; /* Firefox */ + -ms-user-select: none; /* IE10+ */ +} + +div.code-block-caption span.caption-number { + padding: 0.1em 0.3em; + font-style: italic; +} + +div.code-block-caption span.caption-text { +} + +div.literal-block-wrapper { + margin: 1em 0; +} + +code.xref, a code { + background-color: transparent; + font-weight: bold; +} + +h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { + background-color: transparent; +} + +.viewcode-link { + float: right; +} + +.viewcode-back { + float: right; + font-family: sans-serif; +} + +div.viewcode-block:target { + margin: -1px -10px; + padding: 0 10px; +} + +/* -- math display ---------------------------------------------------------- */ + +img.math { + vertical-align: middle; +} + +div.body div.math p { + text-align: center; +} + +span.eqno { + float: right; +} + +span.eqno a.headerlink { + position: absolute; + z-index: 1; +} + +div.math:hover a.headerlink { + visibility: visible; +} + +/* -- printout stylesheet --------------------------------------------------- */ + +@media print { + div.document, + div.documentwrapper, + div.bodywrapper { + margin: 0 !important; + width: 100%; + } + + div.sphinxsidebar, + div.related, + div.footer, + #top-link { + display: none; + } +} \ No newline at end of file diff --git a/_static/css/custom.css b/_static/css/custom.css new file mode 100644 index 00000000..9f53adff --- /dev/null +++ b/_static/css/custom.css @@ -0,0 +1,10 @@ +body { + /* + * These settings are copied from the https://commonwl.org website style + * for consistency. + */ + font-family: system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", "Liberation Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; + font-size: 16px; + line-height: 24px; + color: rgb(33, 37, 41); +} diff --git a/_static/doctools.js b/_static/doctools.js new file mode 100644 index 00000000..4d67807d --- /dev/null +++ b/_static/doctools.js @@ -0,0 +1,156 @@ +/* + * doctools.js + * ~~~~~~~~~~~ + * + * Base JavaScript utilities for all Sphinx HTML documentation. + * + * :copyright: Copyright 2007-2024 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"use strict"; + +const BLACKLISTED_KEY_CONTROL_ELEMENTS = new Set([ + "TEXTAREA", + "INPUT", + "SELECT", + "BUTTON", +]); + +const _ready = (callback) => { + if (document.readyState !== "loading") { + callback(); + } else { + document.addEventListener("DOMContentLoaded", callback); + } +}; + +/** + * Small JavaScript module for the documentation. + */ +const Documentation = { + init: () => { + Documentation.initDomainIndexTable(); + Documentation.initOnKeyListeners(); + }, + + /** + * i18n support + */ + TRANSLATIONS: {}, + PLURAL_EXPR: (n) => (n === 1 ? 0 : 1), + LOCALE: "unknown", + + // gettext and ngettext don't access this so that the functions + // can safely bound to a different name (_ = Documentation.gettext) + gettext: (string) => { + const translated = Documentation.TRANSLATIONS[string]; + switch (typeof translated) { + case "undefined": + return string; // no translation + case "string": + return translated; // translation exists + default: + return translated[0]; // (singular, plural) translation tuple exists + } + }, + + ngettext: (singular, plural, n) => { + const translated = Documentation.TRANSLATIONS[singular]; + if (typeof translated !== "undefined") + return translated[Documentation.PLURAL_EXPR(n)]; + return n === 1 ? singular : plural; + }, + + addTranslations: (catalog) => { + Object.assign(Documentation.TRANSLATIONS, catalog.messages); + Documentation.PLURAL_EXPR = new Function( + "n", + `return (${catalog.plural_expr})` + ); + Documentation.LOCALE = catalog.locale; + }, + + /** + * helper function to focus on search bar + */ + focusSearchBar: () => { + document.querySelectorAll("input[name=q]")[0]?.focus(); + }, + + /** + * Initialise the domain index toggle buttons + */ + initDomainIndexTable: () => { + const toggler = (el) => { + const idNumber = el.id.substr(7); + const toggledRows = document.querySelectorAll(`tr.cg-${idNumber}`); + if (el.src.substr(-9) === "minus.png") { + el.src = `${el.src.substr(0, el.src.length - 9)}plus.png`; + toggledRows.forEach((el) => (el.style.display = "none")); + } else { + el.src = `${el.src.substr(0, el.src.length - 8)}minus.png`; + toggledRows.forEach((el) => (el.style.display = "")); + } + }; + + const togglerElements = document.querySelectorAll("img.toggler"); + togglerElements.forEach((el) => + el.addEventListener("click", (event) => toggler(event.currentTarget)) + ); + togglerElements.forEach((el) => (el.style.display = "")); + if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) togglerElements.forEach(toggler); + }, + + initOnKeyListeners: () => { + // only install a listener if it is really needed + if ( + !DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS && + !DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS + ) + return; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.altKey || event.ctrlKey || event.metaKey) return; + + if (!event.shiftKey) { + switch (event.key) { + case "ArrowLeft": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const prevLink = document.querySelector('link[rel="prev"]'); + if (prevLink && prevLink.href) { + window.location.href = prevLink.href; + event.preventDefault(); + } + break; + case "ArrowRight": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const nextLink = document.querySelector('link[rel="next"]'); + if (nextLink && nextLink.href) { + window.location.href = nextLink.href; + event.preventDefault(); + } + break; + } + } + + // some keyboard layouts may need Shift to get / + switch (event.key) { + case "/": + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) break; + Documentation.focusSearchBar(); + event.preventDefault(); + } + }); + }, +}; + +// quick alias for translations +const _ = Documentation.gettext; + +_ready(Documentation.init); diff --git a/_static/documentation_options.js b/_static/documentation_options.js new file mode 100644 index 00000000..e21c068c --- /dev/null +++ b/_static/documentation_options.js @@ -0,0 +1,13 @@ +const DOCUMENTATION_OPTIONS = { + VERSION: '0.1', + LANGUAGE: 'en', + COLLAPSE_INDEX: false, + BUILDER: 'html', + FILE_SUFFIX: '.html', + LINK_SUFFIX: '.html', + HAS_SOURCE: true, + SOURCELINK_SUFFIX: '.txt', + NAVIGATION_WITH_KEYS: false, + SHOW_SEARCH_SUMMARY: true, + ENABLE_SEARCH_SHORTCUTS: true, +}; \ No newline at end of file diff --git a/assets/favicons/cwl/favicon.ico b/_static/favicon.ico similarity index 100% rename from assets/favicons/cwl/favicon.ico rename to _static/favicon.ico diff --git a/_static/file.png b/_static/file.png new file mode 100644 index 00000000..a858a410 Binary files /dev/null and b/_static/file.png differ diff --git a/_static/graphviz.css b/_static/graphviz.css new file mode 100644 index 00000000..027576e3 --- /dev/null +++ b/_static/graphviz.css @@ -0,0 +1,19 @@ +/* + * graphviz.css + * ~~~~~~~~~~~~ + * + * Sphinx stylesheet -- graphviz extension. + * + * :copyright: Copyright 2007-2024 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +img.graphviz { + border: 0; + max-width: 100%; +} + +object.graphviz { + max-width: 100%; +} diff --git a/assets/favicons/cwl/android-icon-144x144.png b/_static/images/favicons/cwl/android-icon-144x144.png similarity index 100% rename from assets/favicons/cwl/android-icon-144x144.png rename to _static/images/favicons/cwl/android-icon-144x144.png diff --git a/assets/favicons/cwl/android-icon-192x192.png b/_static/images/favicons/cwl/android-icon-192x192.png similarity index 100% rename from assets/favicons/cwl/android-icon-192x192.png rename to _static/images/favicons/cwl/android-icon-192x192.png diff --git a/assets/favicons/cwl/android-icon-36x36.png b/_static/images/favicons/cwl/android-icon-36x36.png similarity index 100% rename from assets/favicons/cwl/android-icon-36x36.png rename to _static/images/favicons/cwl/android-icon-36x36.png diff --git a/assets/favicons/cwl/android-icon-48x48.png b/_static/images/favicons/cwl/android-icon-48x48.png similarity index 100% rename from assets/favicons/cwl/android-icon-48x48.png rename to _static/images/favicons/cwl/android-icon-48x48.png diff --git a/assets/favicons/cwl/android-icon-72x72.png b/_static/images/favicons/cwl/android-icon-72x72.png similarity index 100% rename from assets/favicons/cwl/android-icon-72x72.png rename to _static/images/favicons/cwl/android-icon-72x72.png diff --git a/assets/favicons/cwl/android-icon-96x96.png b/_static/images/favicons/cwl/android-icon-96x96.png similarity index 100% rename from assets/favicons/cwl/android-icon-96x96.png rename to _static/images/favicons/cwl/android-icon-96x96.png diff --git a/assets/favicons/cwl/apple-icon-180x180.png b/_static/images/favicons/cwl/apple-icon-180x180.png similarity index 100% rename from assets/favicons/cwl/apple-icon-180x180.png rename to _static/images/favicons/cwl/apple-icon-180x180.png diff --git a/assets/favicons/cwl/apple-icon-precomposed.png b/_static/images/favicons/cwl/apple-icon-precomposed.png similarity index 100% rename from assets/favicons/cwl/apple-icon-precomposed.png rename to _static/images/favicons/cwl/apple-icon-precomposed.png diff --git a/assets/favicons/cwl/apple-icon.png b/_static/images/favicons/cwl/apple-icon.png similarity index 100% rename from assets/favicons/cwl/apple-icon.png rename to _static/images/favicons/cwl/apple-icon.png diff --git a/assets/favicons/cwl/apple-touch-icon-114x114.png b/_static/images/favicons/cwl/apple-touch-icon-114x114.png similarity index 100% rename from assets/favicons/cwl/apple-touch-icon-114x114.png rename to _static/images/favicons/cwl/apple-touch-icon-114x114.png diff --git a/assets/favicons/cwl/apple-touch-icon-120x120.png b/_static/images/favicons/cwl/apple-touch-icon-120x120.png similarity index 100% rename from assets/favicons/cwl/apple-touch-icon-120x120.png rename to _static/images/favicons/cwl/apple-touch-icon-120x120.png diff --git a/assets/favicons/cwl/apple-touch-icon-144x144.png b/_static/images/favicons/cwl/apple-touch-icon-144x144.png similarity index 100% rename from assets/favicons/cwl/apple-touch-icon-144x144.png rename to _static/images/favicons/cwl/apple-touch-icon-144x144.png diff --git a/assets/favicons/cwl/apple-touch-icon-152x152.png b/_static/images/favicons/cwl/apple-touch-icon-152x152.png similarity index 100% rename from assets/favicons/cwl/apple-touch-icon-152x152.png rename to _static/images/favicons/cwl/apple-touch-icon-152x152.png diff --git a/assets/favicons/cwl/apple-touch-icon-57x57.png b/_static/images/favicons/cwl/apple-touch-icon-57x57.png similarity index 100% rename from assets/favicons/cwl/apple-touch-icon-57x57.png rename to _static/images/favicons/cwl/apple-touch-icon-57x57.png diff --git a/assets/favicons/cwl/apple-touch-icon-60x60.png b/_static/images/favicons/cwl/apple-touch-icon-60x60.png similarity index 100% rename from assets/favicons/cwl/apple-touch-icon-60x60.png rename to _static/images/favicons/cwl/apple-touch-icon-60x60.png diff --git a/assets/favicons/cwl/apple-touch-icon-72x72.png b/_static/images/favicons/cwl/apple-touch-icon-72x72.png similarity index 100% rename from assets/favicons/cwl/apple-touch-icon-72x72.png rename to _static/images/favicons/cwl/apple-touch-icon-72x72.png diff --git a/assets/favicons/cwl/apple-touch-icon-76x76.png b/_static/images/favicons/cwl/apple-touch-icon-76x76.png similarity index 100% rename from assets/favicons/cwl/apple-touch-icon-76x76.png rename to _static/images/favicons/cwl/apple-touch-icon-76x76.png diff --git a/assets/favicons/cwl/favicon-128.png b/_static/images/favicons/cwl/favicon-128.png similarity index 100% rename from assets/favicons/cwl/favicon-128.png rename to _static/images/favicons/cwl/favicon-128.png diff --git a/assets/favicons/cwl/favicon-16x16.png b/_static/images/favicons/cwl/favicon-16x16.png similarity index 100% rename from assets/favicons/cwl/favicon-16x16.png rename to _static/images/favicons/cwl/favicon-16x16.png diff --git a/assets/favicons/cwl/favicon-196x196.png b/_static/images/favicons/cwl/favicon-196x196.png similarity index 100% rename from assets/favicons/cwl/favicon-196x196.png rename to _static/images/favicons/cwl/favicon-196x196.png diff --git a/assets/favicons/cwl/favicon-32x32.png b/_static/images/favicons/cwl/favicon-32x32.png similarity index 100% rename from assets/favicons/cwl/favicon-32x32.png rename to _static/images/favicons/cwl/favicon-32x32.png diff --git a/assets/favicons/cwl/favicon-96x96.png b/_static/images/favicons/cwl/favicon-96x96.png similarity index 100% rename from assets/favicons/cwl/favicon-96x96.png rename to _static/images/favicons/cwl/favicon-96x96.png diff --git a/_static/images/favicons/cwl/favicon.ico b/_static/images/favicons/cwl/favicon.ico new file mode 100644 index 00000000..1c09d4fd Binary files /dev/null and b/_static/images/favicons/cwl/favicon.ico differ diff --git a/assets/favicons/cwl/ms-icon-144x144.png b/_static/images/favicons/cwl/ms-icon-144x144.png similarity index 100% rename from assets/favicons/cwl/ms-icon-144x144.png rename to _static/images/favicons/cwl/ms-icon-144x144.png diff --git a/assets/favicons/cwl/ms-icon-150x150.png b/_static/images/favicons/cwl/ms-icon-150x150.png similarity index 100% rename from assets/favicons/cwl/ms-icon-150x150.png rename to _static/images/favicons/cwl/ms-icon-150x150.png diff --git a/assets/favicons/cwl/ms-icon-310x310.png b/_static/images/favicons/cwl/ms-icon-310x310.png similarity index 100% rename from assets/favicons/cwl/ms-icon-310x310.png rename to _static/images/favicons/cwl/ms-icon-310x310.png diff --git a/assets/favicons/cwl/ms-icon-70x70.png b/_static/images/favicons/cwl/ms-icon-70x70.png similarity index 100% rename from assets/favicons/cwl/ms-icon-70x70.png rename to _static/images/favicons/cwl/ms-icon-70x70.png diff --git a/_static/images/logos/cwl/CWL-Logo-HD-cropped2.png b/_static/images/logos/cwl/CWL-Logo-HD-cropped2.png new file mode 100644 index 00000000..f7df48db Binary files /dev/null and b/_static/images/logos/cwl/CWL-Logo-HD-cropped2.png differ diff --git a/assets/img/cwl-icon.png b/_static/images/logos/cwl/cwl-icon.png similarity index 100% rename from assets/img/cwl-icon.png rename to _static/images/logos/cwl/cwl-icon.png diff --git a/_static/language_data.js b/_static/language_data.js new file mode 100644 index 00000000..367b8ed8 --- /dev/null +++ b/_static/language_data.js @@ -0,0 +1,199 @@ +/* + * language_data.js + * ~~~~~~~~~~~~~~~~ + * + * This script contains the language-specific data used by searchtools.js, + * namely the list of stopwords, stemmer, scorer and splitter. + * + * :copyright: Copyright 2007-2024 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +var stopwords = ["a", "and", "are", "as", "at", "be", "but", "by", "for", "if", "in", "into", "is", "it", "near", "no", "not", "of", "on", "or", "such", "that", "the", "their", "then", "there", "these", "they", "this", "to", "was", "will", "with"]; + + +/* Non-minified version is copied as a separate JS file, if available */ + +/** + * Porter Stemmer + */ +var Stemmer = function() { + + var step2list = { + ational: 'ate', + tional: 'tion', + enci: 'ence', + anci: 'ance', + izer: 'ize', + bli: 'ble', + alli: 'al', + entli: 'ent', + eli: 'e', + ousli: 'ous', + ization: 'ize', + ation: 'ate', + ator: 'ate', + alism: 'al', + iveness: 'ive', + fulness: 'ful', + ousness: 'ous', + aliti: 'al', + iviti: 'ive', + biliti: 'ble', + logi: 'log' + }; + + var step3list = { + icate: 'ic', + ative: '', + alize: 'al', + iciti: 'ic', + ical: 'ic', + ful: '', + ness: '' + }; + + var c = "[^aeiou]"; // consonant + var v = "[aeiouy]"; // vowel + var C = c + "[^aeiouy]*"; // consonant sequence + var V = v + "[aeiou]*"; // vowel sequence + + var mgr0 = "^(" + C + ")?" + V + C; // [C]VC... is m>0 + var meq1 = "^(" + C + ")?" + V + C + "(" + V + ")?$"; // [C]VC[V] is m=1 + var mgr1 = "^(" + C + ")?" + V + C + V + C; // [C]VCVC... is m>1 + var s_v = "^(" + C + ")?" + v; // vowel in stem + + this.stemWord = function (w) { + var stem; + var suffix; + var firstch; + var origword = w; + + if (w.length < 3) + return w; + + var re; + var re2; + var re3; + var re4; + + firstch = w.substr(0,1); + if (firstch == "y") + w = firstch.toUpperCase() + w.substr(1); + + // Step 1a + re = /^(.+?)(ss|i)es$/; + re2 = /^(.+?)([^s])s$/; + + if (re.test(w)) + w = w.replace(re,"$1$2"); + else if (re2.test(w)) + w = w.replace(re2,"$1$2"); + + // Step 1b + re = /^(.+?)eed$/; + re2 = /^(.+?)(ed|ing)$/; + if (re.test(w)) { + var fp = re.exec(w); + re = new RegExp(mgr0); + if (re.test(fp[1])) { + re = /.$/; + w = w.replace(re,""); + } + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1]; + re2 = new RegExp(s_v); + if (re2.test(stem)) { + w = stem; + re2 = /(at|bl|iz)$/; + re3 = new RegExp("([^aeiouylsz])\\1$"); + re4 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re2.test(w)) + w = w + "e"; + else if (re3.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + else if (re4.test(w)) + w = w + "e"; + } + } + + // Step 1c + re = /^(.+?)y$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(s_v); + if (re.test(stem)) + w = stem + "i"; + } + + // Step 2 + re = /^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step2list[suffix]; + } + + // Step 3 + re = /^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step3list[suffix]; + } + + // Step 4 + re = /^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/; + re2 = /^(.+?)(s|t)(ion)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + if (re.test(stem)) + w = stem; + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1] + fp[2]; + re2 = new RegExp(mgr1); + if (re2.test(stem)) + w = stem; + } + + // Step 5 + re = /^(.+?)e$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + re2 = new RegExp(meq1); + re3 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re.test(stem) || (re2.test(stem) && !(re3.test(stem)))) + w = stem; + } + re = /ll$/; + re2 = new RegExp(mgr1); + if (re.test(w) && re2.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + + // and turn initial Y back to y + if (firstch == "y") + w = firstch.toLowerCase() + w.substr(1); + return w; + } +} + diff --git a/_static/minus.png b/_static/minus.png new file mode 100644 index 00000000..d96755fd Binary files /dev/null and b/_static/minus.png differ diff --git a/_static/plus.png b/_static/plus.png new file mode 100644 index 00000000..7107cec9 Binary files /dev/null and b/_static/plus.png differ diff --git a/_static/pygments.css b/_static/pygments.css new file mode 100644 index 00000000..012e6a00 --- /dev/null +++ b/_static/pygments.css @@ -0,0 +1,152 @@ +html[data-theme="light"] .highlight pre { line-height: 125%; } +html[data-theme="light"] .highlight td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +html[data-theme="light"] .highlight span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +html[data-theme="light"] .highlight td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +html[data-theme="light"] .highlight span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +html[data-theme="light"] .highlight .hll { background-color: #fae4c2 } +html[data-theme="light"] .highlight { background: #fefefe; color: #080808 } +html[data-theme="light"] .highlight .c { color: #515151 } /* Comment */ +html[data-theme="light"] .highlight .err { color: #a12236 } /* Error */ +html[data-theme="light"] .highlight .k { color: #6730c5 } /* Keyword */ +html[data-theme="light"] .highlight .l { color: #7f4707 } /* Literal */ +html[data-theme="light"] .highlight .n { color: #080808 } /* Name */ +html[data-theme="light"] .highlight .o { color: #00622f } /* Operator */ +html[data-theme="light"] .highlight .p { color: #080808 } /* Punctuation */ +html[data-theme="light"] .highlight .ch { color: #515151 } /* Comment.Hashbang */ +html[data-theme="light"] .highlight .cm { color: #515151 } /* Comment.Multiline */ +html[data-theme="light"] .highlight .cp { color: #515151 } /* Comment.Preproc */ +html[data-theme="light"] .highlight .cpf { color: #515151 } /* Comment.PreprocFile */ +html[data-theme="light"] .highlight .c1 { color: #515151 } /* Comment.Single */ +html[data-theme="light"] .highlight .cs { color: #515151 } /* Comment.Special */ +html[data-theme="light"] .highlight .gd { color: #005b82 } /* Generic.Deleted */ +html[data-theme="light"] .highlight .ge { font-style: italic } /* Generic.Emph */ +html[data-theme="light"] .highlight .gh { color: #005b82 } /* Generic.Heading */ +html[data-theme="light"] .highlight .gs { font-weight: bold } /* Generic.Strong */ +html[data-theme="light"] .highlight .gu { color: #005b82 } /* Generic.Subheading */ +html[data-theme="light"] .highlight .kc { color: #6730c5 } /* Keyword.Constant */ +html[data-theme="light"] .highlight .kd { color: #6730c5 } /* Keyword.Declaration */ +html[data-theme="light"] .highlight .kn { color: #6730c5 } /* Keyword.Namespace */ +html[data-theme="light"] .highlight .kp { color: #6730c5 } /* Keyword.Pseudo */ +html[data-theme="light"] .highlight .kr { color: #6730c5 } /* Keyword.Reserved */ +html[data-theme="light"] .highlight .kt { color: #7f4707 } /* Keyword.Type */ +html[data-theme="light"] .highlight .ld { color: #7f4707 } /* Literal.Date */ +html[data-theme="light"] .highlight .m { color: #7f4707 } /* Literal.Number */ +html[data-theme="light"] .highlight .s { color: #00622f } /* Literal.String */ +html[data-theme="light"] .highlight .na { color: #912583 } /* Name.Attribute */ +html[data-theme="light"] .highlight .nb { color: #7f4707 } /* Name.Builtin */ +html[data-theme="light"] .highlight .nc { color: #005b82 } /* Name.Class */ +html[data-theme="light"] .highlight .no { color: #005b82 } /* Name.Constant */ +html[data-theme="light"] .highlight .nd { color: #7f4707 } /* Name.Decorator */ +html[data-theme="light"] .highlight .ni { color: #00622f } /* Name.Entity */ +html[data-theme="light"] .highlight .ne { color: #6730c5 } /* Name.Exception */ +html[data-theme="light"] .highlight .nf { color: #005b82 } /* Name.Function */ +html[data-theme="light"] .highlight .nl { color: #7f4707 } /* Name.Label */ +html[data-theme="light"] .highlight .nn { color: #080808 } /* Name.Namespace */ +html[data-theme="light"] .highlight .nx { color: #080808 } /* Name.Other */ +html[data-theme="light"] .highlight .py { color: #005b82 } /* Name.Property */ +html[data-theme="light"] .highlight .nt { color: #005b82 } /* Name.Tag */ +html[data-theme="light"] .highlight .nv { color: #a12236 } /* Name.Variable */ +html[data-theme="light"] .highlight .ow { color: #6730c5 } /* Operator.Word */ +html[data-theme="light"] .highlight .pm { color: #080808 } /* Punctuation.Marker */ +html[data-theme="light"] .highlight .w { color: #080808 } /* Text.Whitespace */ +html[data-theme="light"] .highlight .mb { color: #7f4707 } /* Literal.Number.Bin */ +html[data-theme="light"] .highlight .mf { color: #7f4707 } /* Literal.Number.Float */ +html[data-theme="light"] .highlight .mh { color: #7f4707 } /* Literal.Number.Hex */ +html[data-theme="light"] .highlight .mi { color: #7f4707 } /* Literal.Number.Integer */ +html[data-theme="light"] .highlight .mo { color: #7f4707 } /* Literal.Number.Oct */ +html[data-theme="light"] .highlight .sa { color: #00622f } /* Literal.String.Affix */ +html[data-theme="light"] .highlight .sb { color: #00622f } /* Literal.String.Backtick */ +html[data-theme="light"] .highlight .sc { color: #00622f } /* Literal.String.Char */ +html[data-theme="light"] .highlight .dl { color: #00622f } /* Literal.String.Delimiter */ +html[data-theme="light"] .highlight .sd { color: #00622f } /* Literal.String.Doc */ +html[data-theme="light"] .highlight .s2 { color: #00622f } /* Literal.String.Double */ +html[data-theme="light"] .highlight .se { color: #00622f } /* Literal.String.Escape */ +html[data-theme="light"] .highlight .sh { color: #00622f } /* Literal.String.Heredoc */ +html[data-theme="light"] .highlight .si { color: #00622f } /* Literal.String.Interpol */ +html[data-theme="light"] .highlight .sx { color: #00622f } /* Literal.String.Other */ +html[data-theme="light"] .highlight .sr { color: #a12236 } /* Literal.String.Regex */ +html[data-theme="light"] .highlight .s1 { color: #00622f } /* Literal.String.Single */ +html[data-theme="light"] .highlight .ss { color: #005b82 } /* Literal.String.Symbol */ +html[data-theme="light"] .highlight .bp { color: #7f4707 } /* Name.Builtin.Pseudo */ +html[data-theme="light"] .highlight .fm { color: #005b82 } /* Name.Function.Magic */ +html[data-theme="light"] .highlight .vc { color: #a12236 } /* Name.Variable.Class */ +html[data-theme="light"] .highlight .vg { color: #a12236 } /* Name.Variable.Global */ +html[data-theme="light"] .highlight .vi { color: #a12236 } /* Name.Variable.Instance */ +html[data-theme="light"] .highlight .vm { color: #7f4707 } /* Name.Variable.Magic */ +html[data-theme="light"] .highlight .il { color: #7f4707 } /* Literal.Number.Integer.Long */ +html[data-theme="dark"] .highlight pre { line-height: 125%; } +html[data-theme="dark"] .highlight td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +html[data-theme="dark"] .highlight span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +html[data-theme="dark"] .highlight td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +html[data-theme="dark"] .highlight span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +html[data-theme="dark"] .highlight .hll { background-color: #ffd9002e } +html[data-theme="dark"] .highlight { background: #2b2b2b; color: #f8f8f2 } +html[data-theme="dark"] .highlight .c { color: #ffd900 } /* Comment */ +html[data-theme="dark"] .highlight .err { color: #ffa07a } /* Error */ +html[data-theme="dark"] .highlight .k { color: #dcc6e0 } /* Keyword */ +html[data-theme="dark"] .highlight .l { color: #ffd900 } /* Literal */ +html[data-theme="dark"] .highlight .n { color: #f8f8f2 } /* Name */ +html[data-theme="dark"] .highlight .o { color: #abe338 } /* Operator */ +html[data-theme="dark"] .highlight .p { color: #f8f8f2 } /* Punctuation */ +html[data-theme="dark"] .highlight .ch { color: #ffd900 } /* Comment.Hashbang */ +html[data-theme="dark"] .highlight .cm { color: #ffd900 } /* Comment.Multiline */ +html[data-theme="dark"] .highlight .cp { color: #ffd900 } /* Comment.Preproc */ +html[data-theme="dark"] .highlight .cpf { color: #ffd900 } /* Comment.PreprocFile */ +html[data-theme="dark"] .highlight .c1 { color: #ffd900 } /* Comment.Single */ +html[data-theme="dark"] .highlight .cs { color: #ffd900 } /* Comment.Special */ +html[data-theme="dark"] .highlight .gd { color: #00e0e0 } /* Generic.Deleted */ +html[data-theme="dark"] .highlight .ge { font-style: italic } /* Generic.Emph */ +html[data-theme="dark"] .highlight .gh { color: #00e0e0 } /* Generic.Heading */ +html[data-theme="dark"] .highlight .gs { font-weight: bold } /* Generic.Strong */ +html[data-theme="dark"] .highlight .gu { color: #00e0e0 } /* Generic.Subheading */ +html[data-theme="dark"] .highlight .kc { color: #dcc6e0 } /* Keyword.Constant */ +html[data-theme="dark"] .highlight .kd { color: #dcc6e0 } /* Keyword.Declaration */ +html[data-theme="dark"] .highlight .kn { color: #dcc6e0 } /* Keyword.Namespace */ +html[data-theme="dark"] .highlight .kp { color: #dcc6e0 } /* Keyword.Pseudo */ +html[data-theme="dark"] .highlight .kr { color: #dcc6e0 } /* Keyword.Reserved */ +html[data-theme="dark"] .highlight .kt { color: #ffd900 } /* Keyword.Type */ +html[data-theme="dark"] .highlight .ld { color: #ffd900 } /* Literal.Date */ +html[data-theme="dark"] .highlight .m { color: #ffd900 } /* Literal.Number */ +html[data-theme="dark"] .highlight .s { color: #abe338 } /* Literal.String */ +html[data-theme="dark"] .highlight .na { color: #ffd900 } /* Name.Attribute */ +html[data-theme="dark"] .highlight .nb { color: #ffd900 } /* Name.Builtin */ +html[data-theme="dark"] .highlight .nc { color: #00e0e0 } /* Name.Class */ +html[data-theme="dark"] .highlight .no { color: #00e0e0 } /* Name.Constant */ +html[data-theme="dark"] .highlight .nd { color: #ffd900 } /* Name.Decorator */ +html[data-theme="dark"] .highlight .ni { color: #abe338 } /* Name.Entity */ +html[data-theme="dark"] .highlight .ne { color: #dcc6e0 } /* Name.Exception */ +html[data-theme="dark"] .highlight .nf { color: #00e0e0 } /* Name.Function */ +html[data-theme="dark"] .highlight .nl { color: #ffd900 } /* Name.Label */ +html[data-theme="dark"] .highlight .nn { color: #f8f8f2 } /* Name.Namespace */ +html[data-theme="dark"] .highlight .nx { color: #f8f8f2 } /* Name.Other */ +html[data-theme="dark"] .highlight .py { color: #00e0e0 } /* Name.Property */ +html[data-theme="dark"] .highlight .nt { color: #00e0e0 } /* Name.Tag */ +html[data-theme="dark"] .highlight .nv { color: #ffa07a } /* Name.Variable */ +html[data-theme="dark"] .highlight .ow { color: #dcc6e0 } /* Operator.Word */ +html[data-theme="dark"] .highlight .pm { color: #f8f8f2 } /* Punctuation.Marker */ +html[data-theme="dark"] .highlight .w { color: #f8f8f2 } /* Text.Whitespace */ +html[data-theme="dark"] .highlight .mb { color: #ffd900 } /* Literal.Number.Bin */ +html[data-theme="dark"] .highlight .mf { color: #ffd900 } /* Literal.Number.Float */ +html[data-theme="dark"] .highlight .mh { color: #ffd900 } /* Literal.Number.Hex */ +html[data-theme="dark"] .highlight .mi { color: #ffd900 } /* Literal.Number.Integer */ +html[data-theme="dark"] .highlight .mo { color: #ffd900 } /* Literal.Number.Oct */ +html[data-theme="dark"] .highlight .sa { color: #abe338 } /* Literal.String.Affix */ +html[data-theme="dark"] .highlight .sb { color: #abe338 } /* Literal.String.Backtick */ +html[data-theme="dark"] .highlight .sc { color: #abe338 } /* Literal.String.Char */ +html[data-theme="dark"] .highlight .dl { color: #abe338 } /* Literal.String.Delimiter */ +html[data-theme="dark"] .highlight .sd { color: #abe338 } /* Literal.String.Doc */ +html[data-theme="dark"] .highlight .s2 { color: #abe338 } /* Literal.String.Double */ +html[data-theme="dark"] .highlight .se { color: #abe338 } /* Literal.String.Escape */ +html[data-theme="dark"] .highlight .sh { color: #abe338 } /* Literal.String.Heredoc */ +html[data-theme="dark"] .highlight .si { color: #abe338 } /* Literal.String.Interpol */ +html[data-theme="dark"] .highlight .sx { color: #abe338 } /* Literal.String.Other */ +html[data-theme="dark"] .highlight .sr { color: #ffa07a } /* Literal.String.Regex */ +html[data-theme="dark"] .highlight .s1 { color: #abe338 } /* Literal.String.Single */ +html[data-theme="dark"] .highlight .ss { color: #00e0e0 } /* Literal.String.Symbol */ +html[data-theme="dark"] .highlight .bp { color: #ffd900 } /* Name.Builtin.Pseudo */ +html[data-theme="dark"] .highlight .fm { color: #00e0e0 } /* Name.Function.Magic */ +html[data-theme="dark"] .highlight .vc { color: #ffa07a } /* Name.Variable.Class */ +html[data-theme="dark"] .highlight .vg { color: #ffa07a } /* Name.Variable.Global */ +html[data-theme="dark"] .highlight .vi { color: #ffa07a } /* Name.Variable.Instance */ +html[data-theme="dark"] .highlight .vm { color: #ffd900 } /* Name.Variable.Magic */ +html[data-theme="dark"] .highlight .il { color: #ffd900 } /* Literal.Number.Integer.Long */ \ No newline at end of file diff --git a/_static/scripts/bootstrap.js b/_static/scripts/bootstrap.js new file mode 100644 index 00000000..4e209b0e --- /dev/null +++ b/_static/scripts/bootstrap.js @@ -0,0 +1,3 @@ +/*! For license information please see bootstrap.js.LICENSE.txt */ +(()=>{"use strict";var t={d:(e,i)=>{for(var n in i)t.o(i,n)&&!t.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:i[n]})},o:(t,e)=>Object.prototype.hasOwnProperty.call(t,e),r:t=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})}},e={};t.r(e),t.d(e,{afterMain:()=>E,afterRead:()=>v,afterWrite:()=>C,applyStyles:()=>$,arrow:()=>J,auto:()=>a,basePlacements:()=>l,beforeMain:()=>y,beforeRead:()=>_,beforeWrite:()=>A,bottom:()=>s,clippingParents:()=>d,computeStyles:()=>it,createPopper:()=>Dt,createPopperBase:()=>St,createPopperLite:()=>$t,detectOverflow:()=>_t,end:()=>h,eventListeners:()=>st,flip:()=>bt,hide:()=>wt,left:()=>r,main:()=>w,modifierPhases:()=>O,offset:()=>Et,placements:()=>g,popper:()=>f,popperGenerator:()=>Lt,popperOffsets:()=>At,preventOverflow:()=>Tt,read:()=>b,reference:()=>p,right:()=>o,start:()=>c,top:()=>n,variationPlacements:()=>m,viewport:()=>u,write:()=>T});var i={};t.r(i),t.d(i,{Alert:()=>Oe,Button:()=>ke,Carousel:()=>ri,Collapse:()=>yi,Dropdown:()=>Vi,Modal:()=>xn,Offcanvas:()=>Vn,Popover:()=>fs,ScrollSpy:()=>Ts,Tab:()=>Ks,Toast:()=>lo,Tooltip:()=>hs});var n="top",s="bottom",o="right",r="left",a="auto",l=[n,s,o,r],c="start",h="end",d="clippingParents",u="viewport",f="popper",p="reference",m=l.reduce((function(t,e){return t.concat([e+"-"+c,e+"-"+h])}),[]),g=[].concat(l,[a]).reduce((function(t,e){return t.concat([e,e+"-"+c,e+"-"+h])}),[]),_="beforeRead",b="read",v="afterRead",y="beforeMain",w="main",E="afterMain",A="beforeWrite",T="write",C="afterWrite",O=[_,b,v,y,w,E,A,T,C];function x(t){return t?(t.nodeName||"").toLowerCase():null}function k(t){if(null==t)return window;if("[object Window]"!==t.toString()){var e=t.ownerDocument;return e&&e.defaultView||window}return t}function L(t){return t instanceof k(t).Element||t instanceof Element}function S(t){return t instanceof k(t).HTMLElement||t instanceof HTMLElement}function D(t){return"undefined"!=typeof ShadowRoot&&(t instanceof k(t).ShadowRoot||t instanceof ShadowRoot)}const $={name:"applyStyles",enabled:!0,phase:"write",fn:function(t){var e=t.state;Object.keys(e.elements).forEach((function(t){var i=e.styles[t]||{},n=e.attributes[t]||{},s=e.elements[t];S(s)&&x(s)&&(Object.assign(s.style,i),Object.keys(n).forEach((function(t){var e=n[t];!1===e?s.removeAttribute(t):s.setAttribute(t,!0===e?"":e)})))}))},effect:function(t){var e=t.state,i={popper:{position:e.options.strategy,left:"0",top:"0",margin:"0"},arrow:{position:"absolute"},reference:{}};return Object.assign(e.elements.popper.style,i.popper),e.styles=i,e.elements.arrow&&Object.assign(e.elements.arrow.style,i.arrow),function(){Object.keys(e.elements).forEach((function(t){var n=e.elements[t],s=e.attributes[t]||{},o=Object.keys(e.styles.hasOwnProperty(t)?e.styles[t]:i[t]).reduce((function(t,e){return t[e]="",t}),{});S(n)&&x(n)&&(Object.assign(n.style,o),Object.keys(s).forEach((function(t){n.removeAttribute(t)})))}))}},requires:["computeStyles"]};function I(t){return t.split("-")[0]}var N=Math.max,P=Math.min,M=Math.round;function j(){var t=navigator.userAgentData;return null!=t&&t.brands&&Array.isArray(t.brands)?t.brands.map((function(t){return t.brand+"/"+t.version})).join(" "):navigator.userAgent}function F(){return!/^((?!chrome|android).)*safari/i.test(j())}function H(t,e,i){void 0===e&&(e=!1),void 0===i&&(i=!1);var n=t.getBoundingClientRect(),s=1,o=1;e&&S(t)&&(s=t.offsetWidth>0&&M(n.width)/t.offsetWidth||1,o=t.offsetHeight>0&&M(n.height)/t.offsetHeight||1);var r=(L(t)?k(t):window).visualViewport,a=!F()&&i,l=(n.left+(a&&r?r.offsetLeft:0))/s,c=(n.top+(a&&r?r.offsetTop:0))/o,h=n.width/s,d=n.height/o;return{width:h,height:d,top:c,right:l+h,bottom:c+d,left:l,x:l,y:c}}function B(t){var e=H(t),i=t.offsetWidth,n=t.offsetHeight;return Math.abs(e.width-i)<=1&&(i=e.width),Math.abs(e.height-n)<=1&&(n=e.height),{x:t.offsetLeft,y:t.offsetTop,width:i,height:n}}function W(t,e){var i=e.getRootNode&&e.getRootNode();if(t.contains(e))return!0;if(i&&D(i)){var n=e;do{if(n&&t.isSameNode(n))return!0;n=n.parentNode||n.host}while(n)}return!1}function z(t){return k(t).getComputedStyle(t)}function R(t){return["table","td","th"].indexOf(x(t))>=0}function q(t){return((L(t)?t.ownerDocument:t.document)||window.document).documentElement}function V(t){return"html"===x(t)?t:t.assignedSlot||t.parentNode||(D(t)?t.host:null)||q(t)}function Y(t){return S(t)&&"fixed"!==z(t).position?t.offsetParent:null}function K(t){for(var e=k(t),i=Y(t);i&&R(i)&&"static"===z(i).position;)i=Y(i);return i&&("html"===x(i)||"body"===x(i)&&"static"===z(i).position)?e:i||function(t){var e=/firefox/i.test(j());if(/Trident/i.test(j())&&S(t)&&"fixed"===z(t).position)return null;var i=V(t);for(D(i)&&(i=i.host);S(i)&&["html","body"].indexOf(x(i))<0;){var n=z(i);if("none"!==n.transform||"none"!==n.perspective||"paint"===n.contain||-1!==["transform","perspective"].indexOf(n.willChange)||e&&"filter"===n.willChange||e&&n.filter&&"none"!==n.filter)return i;i=i.parentNode}return null}(t)||e}function Q(t){return["top","bottom"].indexOf(t)>=0?"x":"y"}function X(t,e,i){return N(t,P(e,i))}function U(t){return Object.assign({},{top:0,right:0,bottom:0,left:0},t)}function G(t,e){return e.reduce((function(e,i){return e[i]=t,e}),{})}const J={name:"arrow",enabled:!0,phase:"main",fn:function(t){var e,i=t.state,a=t.name,c=t.options,h=i.elements.arrow,d=i.modifiersData.popperOffsets,u=I(i.placement),f=Q(u),p=[r,o].indexOf(u)>=0?"height":"width";if(h&&d){var m=function(t,e){return U("number"!=typeof(t="function"==typeof t?t(Object.assign({},e.rects,{placement:e.placement})):t)?t:G(t,l))}(c.padding,i),g=B(h),_="y"===f?n:r,b="y"===f?s:o,v=i.rects.reference[p]+i.rects.reference[f]-d[f]-i.rects.popper[p],y=d[f]-i.rects.reference[f],w=K(h),E=w?"y"===f?w.clientHeight||0:w.clientWidth||0:0,A=v/2-y/2,T=m[_],C=E-g[p]-m[b],O=E/2-g[p]/2+A,x=X(T,O,C),k=f;i.modifiersData[a]=((e={})[k]=x,e.centerOffset=x-O,e)}},effect:function(t){var e=t.state,i=t.options.element,n=void 0===i?"[data-popper-arrow]":i;null!=n&&("string"!=typeof n||(n=e.elements.popper.querySelector(n)))&&W(e.elements.popper,n)&&(e.elements.arrow=n)},requires:["popperOffsets"],requiresIfExists:["preventOverflow"]};function Z(t){return t.split("-")[1]}var tt={top:"auto",right:"auto",bottom:"auto",left:"auto"};function et(t){var e,i=t.popper,a=t.popperRect,l=t.placement,c=t.variation,d=t.offsets,u=t.position,f=t.gpuAcceleration,p=t.adaptive,m=t.roundOffsets,g=t.isFixed,_=d.x,b=void 0===_?0:_,v=d.y,y=void 0===v?0:v,w="function"==typeof m?m({x:b,y}):{x:b,y};b=w.x,y=w.y;var E=d.hasOwnProperty("x"),A=d.hasOwnProperty("y"),T=r,C=n,O=window;if(p){var x=K(i),L="clientHeight",S="clientWidth";x===k(i)&&"static"!==z(x=q(i)).position&&"absolute"===u&&(L="scrollHeight",S="scrollWidth"),(l===n||(l===r||l===o)&&c===h)&&(C=s,y-=(g&&x===O&&O.visualViewport?O.visualViewport.height:x[L])-a.height,y*=f?1:-1),l!==r&&(l!==n&&l!==s||c!==h)||(T=o,b-=(g&&x===O&&O.visualViewport?O.visualViewport.width:x[S])-a.width,b*=f?1:-1)}var D,$=Object.assign({position:u},p&&tt),I=!0===m?function(t,e){var i=t.x,n=t.y,s=e.devicePixelRatio||1;return{x:M(i*s)/s||0,y:M(n*s)/s||0}}({x:b,y},k(i)):{x:b,y};return b=I.x,y=I.y,f?Object.assign({},$,((D={})[C]=A?"0":"",D[T]=E?"0":"",D.transform=(O.devicePixelRatio||1)<=1?"translate("+b+"px, "+y+"px)":"translate3d("+b+"px, "+y+"px, 0)",D)):Object.assign({},$,((e={})[C]=A?y+"px":"",e[T]=E?b+"px":"",e.transform="",e))}const it={name:"computeStyles",enabled:!0,phase:"beforeWrite",fn:function(t){var e=t.state,i=t.options,n=i.gpuAcceleration,s=void 0===n||n,o=i.adaptive,r=void 0===o||o,a=i.roundOffsets,l=void 0===a||a,c={placement:I(e.placement),variation:Z(e.placement),popper:e.elements.popper,popperRect:e.rects.popper,gpuAcceleration:s,isFixed:"fixed"===e.options.strategy};null!=e.modifiersData.popperOffsets&&(e.styles.popper=Object.assign({},e.styles.popper,et(Object.assign({},c,{offsets:e.modifiersData.popperOffsets,position:e.options.strategy,adaptive:r,roundOffsets:l})))),null!=e.modifiersData.arrow&&(e.styles.arrow=Object.assign({},e.styles.arrow,et(Object.assign({},c,{offsets:e.modifiersData.arrow,position:"absolute",adaptive:!1,roundOffsets:l})))),e.attributes.popper=Object.assign({},e.attributes.popper,{"data-popper-placement":e.placement})},data:{}};var nt={passive:!0};const st={name:"eventListeners",enabled:!0,phase:"write",fn:function(){},effect:function(t){var e=t.state,i=t.instance,n=t.options,s=n.scroll,o=void 0===s||s,r=n.resize,a=void 0===r||r,l=k(e.elements.popper),c=[].concat(e.scrollParents.reference,e.scrollParents.popper);return o&&c.forEach((function(t){t.addEventListener("scroll",i.update,nt)})),a&&l.addEventListener("resize",i.update,nt),function(){o&&c.forEach((function(t){t.removeEventListener("scroll",i.update,nt)})),a&&l.removeEventListener("resize",i.update,nt)}},data:{}};var ot={left:"right",right:"left",bottom:"top",top:"bottom"};function rt(t){return t.replace(/left|right|bottom|top/g,(function(t){return ot[t]}))}var at={start:"end",end:"start"};function lt(t){return t.replace(/start|end/g,(function(t){return at[t]}))}function ct(t){var e=k(t);return{scrollLeft:e.pageXOffset,scrollTop:e.pageYOffset}}function ht(t){return H(q(t)).left+ct(t).scrollLeft}function dt(t){var e=z(t),i=e.overflow,n=e.overflowX,s=e.overflowY;return/auto|scroll|overlay|hidden/.test(i+s+n)}function ut(t){return["html","body","#document"].indexOf(x(t))>=0?t.ownerDocument.body:S(t)&&dt(t)?t:ut(V(t))}function ft(t,e){var i;void 0===e&&(e=[]);var n=ut(t),s=n===(null==(i=t.ownerDocument)?void 0:i.body),o=k(n),r=s?[o].concat(o.visualViewport||[],dt(n)?n:[]):n,a=e.concat(r);return s?a:a.concat(ft(V(r)))}function pt(t){return Object.assign({},t,{left:t.x,top:t.y,right:t.x+t.width,bottom:t.y+t.height})}function mt(t,e,i){return e===u?pt(function(t,e){var i=k(t),n=q(t),s=i.visualViewport,o=n.clientWidth,r=n.clientHeight,a=0,l=0;if(s){o=s.width,r=s.height;var c=F();(c||!c&&"fixed"===e)&&(a=s.offsetLeft,l=s.offsetTop)}return{width:o,height:r,x:a+ht(t),y:l}}(t,i)):L(e)?function(t,e){var i=H(t,!1,"fixed"===e);return i.top=i.top+t.clientTop,i.left=i.left+t.clientLeft,i.bottom=i.top+t.clientHeight,i.right=i.left+t.clientWidth,i.width=t.clientWidth,i.height=t.clientHeight,i.x=i.left,i.y=i.top,i}(e,i):pt(function(t){var e,i=q(t),n=ct(t),s=null==(e=t.ownerDocument)?void 0:e.body,o=N(i.scrollWidth,i.clientWidth,s?s.scrollWidth:0,s?s.clientWidth:0),r=N(i.scrollHeight,i.clientHeight,s?s.scrollHeight:0,s?s.clientHeight:0),a=-n.scrollLeft+ht(t),l=-n.scrollTop;return"rtl"===z(s||i).direction&&(a+=N(i.clientWidth,s?s.clientWidth:0)-o),{width:o,height:r,x:a,y:l}}(q(t)))}function gt(t){var e,i=t.reference,a=t.element,l=t.placement,d=l?I(l):null,u=l?Z(l):null,f=i.x+i.width/2-a.width/2,p=i.y+i.height/2-a.height/2;switch(d){case n:e={x:f,y:i.y-a.height};break;case s:e={x:f,y:i.y+i.height};break;case o:e={x:i.x+i.width,y:p};break;case r:e={x:i.x-a.width,y:p};break;default:e={x:i.x,y:i.y}}var m=d?Q(d):null;if(null!=m){var g="y"===m?"height":"width";switch(u){case c:e[m]=e[m]-(i[g]/2-a[g]/2);break;case h:e[m]=e[m]+(i[g]/2-a[g]/2)}}return e}function _t(t,e){void 0===e&&(e={});var i=e,r=i.placement,a=void 0===r?t.placement:r,c=i.strategy,h=void 0===c?t.strategy:c,m=i.boundary,g=void 0===m?d:m,_=i.rootBoundary,b=void 0===_?u:_,v=i.elementContext,y=void 0===v?f:v,w=i.altBoundary,E=void 0!==w&&w,A=i.padding,T=void 0===A?0:A,C=U("number"!=typeof T?T:G(T,l)),O=y===f?p:f,k=t.rects.popper,D=t.elements[E?O:y],$=function(t,e,i,n){var s="clippingParents"===e?function(t){var e=ft(V(t)),i=["absolute","fixed"].indexOf(z(t).position)>=0&&S(t)?K(t):t;return L(i)?e.filter((function(t){return L(t)&&W(t,i)&&"body"!==x(t)})):[]}(t):[].concat(e),o=[].concat(s,[i]),r=o[0],a=o.reduce((function(e,i){var s=mt(t,i,n);return e.top=N(s.top,e.top),e.right=P(s.right,e.right),e.bottom=P(s.bottom,e.bottom),e.left=N(s.left,e.left),e}),mt(t,r,n));return a.width=a.right-a.left,a.height=a.bottom-a.top,a.x=a.left,a.y=a.top,a}(L(D)?D:D.contextElement||q(t.elements.popper),g,b,h),I=H(t.elements.reference),M=gt({reference:I,element:k,strategy:"absolute",placement:a}),j=pt(Object.assign({},k,M)),F=y===f?j:I,B={top:$.top-F.top+C.top,bottom:F.bottom-$.bottom+C.bottom,left:$.left-F.left+C.left,right:F.right-$.right+C.right},R=t.modifiersData.offset;if(y===f&&R){var Y=R[a];Object.keys(B).forEach((function(t){var e=[o,s].indexOf(t)>=0?1:-1,i=[n,s].indexOf(t)>=0?"y":"x";B[t]+=Y[i]*e}))}return B}const bt={name:"flip",enabled:!0,phase:"main",fn:function(t){var e=t.state,i=t.options,h=t.name;if(!e.modifiersData[h]._skip){for(var d=i.mainAxis,u=void 0===d||d,f=i.altAxis,p=void 0===f||f,_=i.fallbackPlacements,b=i.padding,v=i.boundary,y=i.rootBoundary,w=i.altBoundary,E=i.flipVariations,A=void 0===E||E,T=i.allowedAutoPlacements,C=e.options.placement,O=I(C),x=_||(O!==C&&A?function(t){if(I(t)===a)return[];var e=rt(t);return[lt(t),e,lt(e)]}(C):[rt(C)]),k=[C].concat(x).reduce((function(t,i){return t.concat(I(i)===a?function(t,e){void 0===e&&(e={});var i=e,n=i.placement,s=i.boundary,o=i.rootBoundary,r=i.padding,a=i.flipVariations,c=i.allowedAutoPlacements,h=void 0===c?g:c,d=Z(n),u=d?a?m:m.filter((function(t){return Z(t)===d})):l,f=u.filter((function(t){return h.indexOf(t)>=0}));0===f.length&&(f=u);var p=f.reduce((function(e,i){return e[i]=_t(t,{placement:i,boundary:s,rootBoundary:o,padding:r})[I(i)],e}),{});return Object.keys(p).sort((function(t,e){return p[t]-p[e]}))}(e,{placement:i,boundary:v,rootBoundary:y,padding:b,flipVariations:A,allowedAutoPlacements:T}):i)}),[]),L=e.rects.reference,S=e.rects.popper,D=new Map,$=!0,N=k[0],P=0;P=0,B=H?"width":"height",W=_t(e,{placement:M,boundary:v,rootBoundary:y,altBoundary:w,padding:b}),z=H?F?o:r:F?s:n;L[B]>S[B]&&(z=rt(z));var R=rt(z),q=[];if(u&&q.push(W[j]<=0),p&&q.push(W[z]<=0,W[R]<=0),q.every((function(t){return t}))){N=M,$=!1;break}D.set(M,q)}if($)for(var V=function(t){var e=k.find((function(e){var i=D.get(e);if(i)return i.slice(0,t).every((function(t){return t}))}));if(e)return N=e,"break"},Y=A?3:1;Y>0&&"break"!==V(Y);Y--);e.placement!==N&&(e.modifiersData[h]._skip=!0,e.placement=N,e.reset=!0)}},requiresIfExists:["offset"],data:{_skip:!1}};function vt(t,e,i){return void 0===i&&(i={x:0,y:0}),{top:t.top-e.height-i.y,right:t.right-e.width+i.x,bottom:t.bottom-e.height+i.y,left:t.left-e.width-i.x}}function yt(t){return[n,o,s,r].some((function(e){return t[e]>=0}))}const wt={name:"hide",enabled:!0,phase:"main",requiresIfExists:["preventOverflow"],fn:function(t){var e=t.state,i=t.name,n=e.rects.reference,s=e.rects.popper,o=e.modifiersData.preventOverflow,r=_t(e,{elementContext:"reference"}),a=_t(e,{altBoundary:!0}),l=vt(r,n),c=vt(a,s,o),h=yt(l),d=yt(c);e.modifiersData[i]={referenceClippingOffsets:l,popperEscapeOffsets:c,isReferenceHidden:h,hasPopperEscaped:d},e.attributes.popper=Object.assign({},e.attributes.popper,{"data-popper-reference-hidden":h,"data-popper-escaped":d})}},Et={name:"offset",enabled:!0,phase:"main",requires:["popperOffsets"],fn:function(t){var e=t.state,i=t.options,s=t.name,a=i.offset,l=void 0===a?[0,0]:a,c=g.reduce((function(t,i){return t[i]=function(t,e,i){var s=I(t),a=[r,n].indexOf(s)>=0?-1:1,l="function"==typeof i?i(Object.assign({},e,{placement:t})):i,c=l[0],h=l[1];return c=c||0,h=(h||0)*a,[r,o].indexOf(s)>=0?{x:h,y:c}:{x:c,y:h}}(i,e.rects,l),t}),{}),h=c[e.placement],d=h.x,u=h.y;null!=e.modifiersData.popperOffsets&&(e.modifiersData.popperOffsets.x+=d,e.modifiersData.popperOffsets.y+=u),e.modifiersData[s]=c}},At={name:"popperOffsets",enabled:!0,phase:"read",fn:function(t){var e=t.state,i=t.name;e.modifiersData[i]=gt({reference:e.rects.reference,element:e.rects.popper,strategy:"absolute",placement:e.placement})},data:{}},Tt={name:"preventOverflow",enabled:!0,phase:"main",fn:function(t){var e=t.state,i=t.options,a=t.name,l=i.mainAxis,h=void 0===l||l,d=i.altAxis,u=void 0!==d&&d,f=i.boundary,p=i.rootBoundary,m=i.altBoundary,g=i.padding,_=i.tether,b=void 0===_||_,v=i.tetherOffset,y=void 0===v?0:v,w=_t(e,{boundary:f,rootBoundary:p,padding:g,altBoundary:m}),E=I(e.placement),A=Z(e.placement),T=!A,C=Q(E),O="x"===C?"y":"x",x=e.modifiersData.popperOffsets,k=e.rects.reference,L=e.rects.popper,S="function"==typeof y?y(Object.assign({},e.rects,{placement:e.placement})):y,D="number"==typeof S?{mainAxis:S,altAxis:S}:Object.assign({mainAxis:0,altAxis:0},S),$=e.modifiersData.offset?e.modifiersData.offset[e.placement]:null,M={x:0,y:0};if(x){if(h){var j,F="y"===C?n:r,H="y"===C?s:o,W="y"===C?"height":"width",z=x[C],R=z+w[F],q=z-w[H],V=b?-L[W]/2:0,Y=A===c?k[W]:L[W],U=A===c?-L[W]:-k[W],G=e.elements.arrow,J=b&&G?B(G):{width:0,height:0},tt=e.modifiersData["arrow#persistent"]?e.modifiersData["arrow#persistent"].padding:{top:0,right:0,bottom:0,left:0},et=tt[F],it=tt[H],nt=X(0,k[W],J[W]),st=T?k[W]/2-V-nt-et-D.mainAxis:Y-nt-et-D.mainAxis,ot=T?-k[W]/2+V+nt+it+D.mainAxis:U+nt+it+D.mainAxis,rt=e.elements.arrow&&K(e.elements.arrow),at=rt?"y"===C?rt.clientTop||0:rt.clientLeft||0:0,lt=null!=(j=null==$?void 0:$[C])?j:0,ct=z+ot-lt,ht=X(b?P(R,z+st-lt-at):R,z,b?N(q,ct):q);x[C]=ht,M[C]=ht-z}if(u){var dt,ut="x"===C?n:r,ft="x"===C?s:o,pt=x[O],mt="y"===O?"height":"width",gt=pt+w[ut],bt=pt-w[ft],vt=-1!==[n,r].indexOf(E),yt=null!=(dt=null==$?void 0:$[O])?dt:0,wt=vt?gt:pt-k[mt]-L[mt]-yt+D.altAxis,Et=vt?pt+k[mt]+L[mt]-yt-D.altAxis:bt,At=b&&vt?function(t,e,i){var n=X(t,e,i);return n>i?i:n}(wt,pt,Et):X(b?wt:gt,pt,b?Et:bt);x[O]=At,M[O]=At-pt}e.modifiersData[a]=M}},requiresIfExists:["offset"]};function Ct(t,e,i){void 0===i&&(i=!1);var n,s,o=S(e),r=S(e)&&function(t){var e=t.getBoundingClientRect(),i=M(e.width)/t.offsetWidth||1,n=M(e.height)/t.offsetHeight||1;return 1!==i||1!==n}(e),a=q(e),l=H(t,r,i),c={scrollLeft:0,scrollTop:0},h={x:0,y:0};return(o||!o&&!i)&&(("body"!==x(e)||dt(a))&&(c=(n=e)!==k(n)&&S(n)?{scrollLeft:(s=n).scrollLeft,scrollTop:s.scrollTop}:ct(n)),S(e)?((h=H(e,!0)).x+=e.clientLeft,h.y+=e.clientTop):a&&(h.x=ht(a))),{x:l.left+c.scrollLeft-h.x,y:l.top+c.scrollTop-h.y,width:l.width,height:l.height}}function Ot(t){var e=new Map,i=new Set,n=[];function s(t){i.add(t.name),[].concat(t.requires||[],t.requiresIfExists||[]).forEach((function(t){if(!i.has(t)){var n=e.get(t);n&&s(n)}})),n.push(t)}return t.forEach((function(t){e.set(t.name,t)})),t.forEach((function(t){i.has(t.name)||s(t)})),n}var xt={placement:"bottom",modifiers:[],strategy:"absolute"};function kt(){for(var t=arguments.length,e=new Array(t),i=0;iIt.has(t)&&It.get(t).get(e)||null,remove(t,e){if(!It.has(t))return;const i=It.get(t);i.delete(e),0===i.size&&It.delete(t)}},Pt="transitionend",Mt=t=>(t&&window.CSS&&window.CSS.escape&&(t=t.replace(/#([^\s"#']+)/g,((t,e)=>`#${CSS.escape(e)}`))),t),jt=t=>{t.dispatchEvent(new Event(Pt))},Ft=t=>!(!t||"object"!=typeof t)&&(void 0!==t.jquery&&(t=t[0]),void 0!==t.nodeType),Ht=t=>Ft(t)?t.jquery?t[0]:t:"string"==typeof t&&t.length>0?document.querySelector(Mt(t)):null,Bt=t=>{if(!Ft(t)||0===t.getClientRects().length)return!1;const e="visible"===getComputedStyle(t).getPropertyValue("visibility"),i=t.closest("details:not([open])");if(!i)return e;if(i!==t){const e=t.closest("summary");if(e&&e.parentNode!==i)return!1;if(null===e)return!1}return e},Wt=t=>!t||t.nodeType!==Node.ELEMENT_NODE||!!t.classList.contains("disabled")||(void 0!==t.disabled?t.disabled:t.hasAttribute("disabled")&&"false"!==t.getAttribute("disabled")),zt=t=>{if(!document.documentElement.attachShadow)return null;if("function"==typeof t.getRootNode){const e=t.getRootNode();return e instanceof ShadowRoot?e:null}return t instanceof ShadowRoot?t:t.parentNode?zt(t.parentNode):null},Rt=()=>{},qt=t=>{t.offsetHeight},Vt=()=>window.jQuery&&!document.body.hasAttribute("data-bs-no-jquery")?window.jQuery:null,Yt=[],Kt=()=>"rtl"===document.documentElement.dir,Qt=t=>{var e;e=()=>{const e=Vt();if(e){const i=t.NAME,n=e.fn[i];e.fn[i]=t.jQueryInterface,e.fn[i].Constructor=t,e.fn[i].noConflict=()=>(e.fn[i]=n,t.jQueryInterface)}},"loading"===document.readyState?(Yt.length||document.addEventListener("DOMContentLoaded",(()=>{for(const t of Yt)t()})),Yt.push(e)):e()},Xt=(t,e=[],i=t)=>"function"==typeof t?t(...e):i,Ut=(t,e,i=!0)=>{if(!i)return void Xt(t);const n=(t=>{if(!t)return 0;let{transitionDuration:e,transitionDelay:i}=window.getComputedStyle(t);const n=Number.parseFloat(e),s=Number.parseFloat(i);return n||s?(e=e.split(",")[0],i=i.split(",")[0],1e3*(Number.parseFloat(e)+Number.parseFloat(i))):0})(e)+5;let s=!1;const o=({target:i})=>{i===e&&(s=!0,e.removeEventListener(Pt,o),Xt(t))};e.addEventListener(Pt,o),setTimeout((()=>{s||jt(e)}),n)},Gt=(t,e,i,n)=>{const s=t.length;let o=t.indexOf(e);return-1===o?!i&&n?t[s-1]:t[0]:(o+=i?1:-1,n&&(o=(o+s)%s),t[Math.max(0,Math.min(o,s-1))])},Jt=/[^.]*(?=\..*)\.|.*/,Zt=/\..*/,te=/::\d+$/,ee={};let ie=1;const ne={mouseenter:"mouseover",mouseleave:"mouseout"},se=new Set(["click","dblclick","mouseup","mousedown","contextmenu","mousewheel","DOMMouseScroll","mouseover","mouseout","mousemove","selectstart","selectend","keydown","keypress","keyup","orientationchange","touchstart","touchmove","touchend","touchcancel","pointerdown","pointermove","pointerup","pointerleave","pointercancel","gesturestart","gesturechange","gestureend","focus","blur","change","reset","select","submit","focusin","focusout","load","unload","beforeunload","resize","move","DOMContentLoaded","readystatechange","error","abort","scroll"]);function oe(t,e){return e&&`${e}::${ie++}`||t.uidEvent||ie++}function re(t){const e=oe(t);return t.uidEvent=e,ee[e]=ee[e]||{},ee[e]}function ae(t,e,i=null){return Object.values(t).find((t=>t.callable===e&&t.delegationSelector===i))}function le(t,e,i){const n="string"==typeof e,s=n?i:e||i;let o=ue(t);return se.has(o)||(o=t),[n,s,o]}function ce(t,e,i,n,s){if("string"!=typeof e||!t)return;let[o,r,a]=le(e,i,n);if(e in ne){const t=t=>function(e){if(!e.relatedTarget||e.relatedTarget!==e.delegateTarget&&!e.delegateTarget.contains(e.relatedTarget))return t.call(this,e)};r=t(r)}const l=re(t),c=l[a]||(l[a]={}),h=ae(c,r,o?i:null);if(h)return void(h.oneOff=h.oneOff&&s);const d=oe(r,e.replace(Jt,"")),u=o?function(t,e,i){return function n(s){const o=t.querySelectorAll(e);for(let{target:r}=s;r&&r!==this;r=r.parentNode)for(const a of o)if(a===r)return pe(s,{delegateTarget:r}),n.oneOff&&fe.off(t,s.type,e,i),i.apply(r,[s])}}(t,i,r):function(t,e){return function i(n){return pe(n,{delegateTarget:t}),i.oneOff&&fe.off(t,n.type,e),e.apply(t,[n])}}(t,r);u.delegationSelector=o?i:null,u.callable=r,u.oneOff=s,u.uidEvent=d,c[d]=u,t.addEventListener(a,u,o)}function he(t,e,i,n,s){const o=ae(e[i],n,s);o&&(t.removeEventListener(i,o,Boolean(s)),delete e[i][o.uidEvent])}function de(t,e,i,n){const s=e[i]||{};for(const[o,r]of Object.entries(s))o.includes(n)&&he(t,e,i,r.callable,r.delegationSelector)}function ue(t){return t=t.replace(Zt,""),ne[t]||t}const fe={on(t,e,i,n){ce(t,e,i,n,!1)},one(t,e,i,n){ce(t,e,i,n,!0)},off(t,e,i,n){if("string"!=typeof e||!t)return;const[s,o,r]=le(e,i,n),a=r!==e,l=re(t),c=l[r]||{},h=e.startsWith(".");if(void 0===o){if(h)for(const i of Object.keys(l))de(t,l,i,e.slice(1));for(const[i,n]of Object.entries(c)){const s=i.replace(te,"");a&&!e.includes(s)||he(t,l,r,n.callable,n.delegationSelector)}}else{if(!Object.keys(c).length)return;he(t,l,r,o,s?i:null)}},trigger(t,e,i){if("string"!=typeof e||!t)return null;const n=Vt();let s=null,o=!0,r=!0,a=!1;e!==ue(e)&&n&&(s=n.Event(e,i),n(t).trigger(s),o=!s.isPropagationStopped(),r=!s.isImmediatePropagationStopped(),a=s.isDefaultPrevented());const l=pe(new Event(e,{bubbles:o,cancelable:!0}),i);return a&&l.preventDefault(),r&&t.dispatchEvent(l),l.defaultPrevented&&s&&s.preventDefault(),l}};function pe(t,e={}){for(const[i,n]of Object.entries(e))try{t[i]=n}catch(e){Object.defineProperty(t,i,{configurable:!0,get:()=>n})}return t}function me(t){if("true"===t)return!0;if("false"===t)return!1;if(t===Number(t).toString())return Number(t);if(""===t||"null"===t)return null;if("string"!=typeof t)return t;try{return JSON.parse(decodeURIComponent(t))}catch(e){return t}}function ge(t){return t.replace(/[A-Z]/g,(t=>`-${t.toLowerCase()}`))}const _e={setDataAttribute(t,e,i){t.setAttribute(`data-bs-${ge(e)}`,i)},removeDataAttribute(t,e){t.removeAttribute(`data-bs-${ge(e)}`)},getDataAttributes(t){if(!t)return{};const e={},i=Object.keys(t.dataset).filter((t=>t.startsWith("bs")&&!t.startsWith("bsConfig")));for(const n of i){let i=n.replace(/^bs/,"");i=i.charAt(0).toLowerCase()+i.slice(1,i.length),e[i]=me(t.dataset[n])}return e},getDataAttribute:(t,e)=>me(t.getAttribute(`data-bs-${ge(e)}`))};class be{static get Default(){return{}}static get DefaultType(){return{}}static get NAME(){throw new Error('You have to implement the static method "NAME", for each component!')}_getConfig(t){return t=this._mergeConfigObj(t),t=this._configAfterMerge(t),this._typeCheckConfig(t),t}_configAfterMerge(t){return t}_mergeConfigObj(t,e){const i=Ft(e)?_e.getDataAttribute(e,"config"):{};return{...this.constructor.Default,..."object"==typeof i?i:{},...Ft(e)?_e.getDataAttributes(e):{},..."object"==typeof t?t:{}}}_typeCheckConfig(t,e=this.constructor.DefaultType){for(const[n,s]of Object.entries(e)){const e=t[n],o=Ft(e)?"element":null==(i=e)?`${i}`:Object.prototype.toString.call(i).match(/\s([a-z]+)/i)[1].toLowerCase();if(!new RegExp(s).test(o))throw new TypeError(`${this.constructor.NAME.toUpperCase()}: Option "${n}" provided type "${o}" but expected type "${s}".`)}var i}}class ve extends be{constructor(t,e){super(),(t=Ht(t))&&(this._element=t,this._config=this._getConfig(e),Nt.set(this._element,this.constructor.DATA_KEY,this))}dispose(){Nt.remove(this._element,this.constructor.DATA_KEY),fe.off(this._element,this.constructor.EVENT_KEY);for(const t of Object.getOwnPropertyNames(this))this[t]=null}_queueCallback(t,e,i=!0){Ut(t,e,i)}_getConfig(t){return t=this._mergeConfigObj(t,this._element),t=this._configAfterMerge(t),this._typeCheckConfig(t),t}static getInstance(t){return Nt.get(Ht(t),this.DATA_KEY)}static getOrCreateInstance(t,e={}){return this.getInstance(t)||new this(t,"object"==typeof e?e:null)}static get VERSION(){return"5.3.2"}static get DATA_KEY(){return`bs.${this.NAME}`}static get EVENT_KEY(){return`.${this.DATA_KEY}`}static eventName(t){return`${t}${this.EVENT_KEY}`}}const ye=t=>{let e=t.getAttribute("data-bs-target");if(!e||"#"===e){let i=t.getAttribute("href");if(!i||!i.includes("#")&&!i.startsWith("."))return null;i.includes("#")&&!i.startsWith("#")&&(i=`#${i.split("#")[1]}`),e=i&&"#"!==i?Mt(i.trim()):null}return e},we={find:(t,e=document.documentElement)=>[].concat(...Element.prototype.querySelectorAll.call(e,t)),findOne:(t,e=document.documentElement)=>Element.prototype.querySelector.call(e,t),children:(t,e)=>[].concat(...t.children).filter((t=>t.matches(e))),parents(t,e){const i=[];let n=t.parentNode.closest(e);for(;n;)i.push(n),n=n.parentNode.closest(e);return i},prev(t,e){let i=t.previousElementSibling;for(;i;){if(i.matches(e))return[i];i=i.previousElementSibling}return[]},next(t,e){let i=t.nextElementSibling;for(;i;){if(i.matches(e))return[i];i=i.nextElementSibling}return[]},focusableChildren(t){const e=["a","button","input","textarea","select","details","[tabindex]",'[contenteditable="true"]'].map((t=>`${t}:not([tabindex^="-"])`)).join(",");return this.find(e,t).filter((t=>!Wt(t)&&Bt(t)))},getSelectorFromElement(t){const e=ye(t);return e&&we.findOne(e)?e:null},getElementFromSelector(t){const e=ye(t);return e?we.findOne(e):null},getMultipleElementsFromSelector(t){const e=ye(t);return e?we.find(e):[]}},Ee=(t,e="hide")=>{const i=`click.dismiss${t.EVENT_KEY}`,n=t.NAME;fe.on(document,i,`[data-bs-dismiss="${n}"]`,(function(i){if(["A","AREA"].includes(this.tagName)&&i.preventDefault(),Wt(this))return;const s=we.getElementFromSelector(this)||this.closest(`.${n}`);t.getOrCreateInstance(s)[e]()}))},Ae=".bs.alert",Te=`close${Ae}`,Ce=`closed${Ae}`;class Oe extends ve{static get NAME(){return"alert"}close(){if(fe.trigger(this._element,Te).defaultPrevented)return;this._element.classList.remove("show");const t=this._element.classList.contains("fade");this._queueCallback((()=>this._destroyElement()),this._element,t)}_destroyElement(){this._element.remove(),fe.trigger(this._element,Ce),this.dispose()}static jQueryInterface(t){return this.each((function(){const e=Oe.getOrCreateInstance(this);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t](this)}}))}}Ee(Oe,"close"),Qt(Oe);const xe='[data-bs-toggle="button"]';class ke extends ve{static get NAME(){return"button"}toggle(){this._element.setAttribute("aria-pressed",this._element.classList.toggle("active"))}static jQueryInterface(t){return this.each((function(){const e=ke.getOrCreateInstance(this);"toggle"===t&&e[t]()}))}}fe.on(document,"click.bs.button.data-api",xe,(t=>{t.preventDefault();const e=t.target.closest(xe);ke.getOrCreateInstance(e).toggle()})),Qt(ke);const Le=".bs.swipe",Se=`touchstart${Le}`,De=`touchmove${Le}`,$e=`touchend${Le}`,Ie=`pointerdown${Le}`,Ne=`pointerup${Le}`,Pe={endCallback:null,leftCallback:null,rightCallback:null},Me={endCallback:"(function|null)",leftCallback:"(function|null)",rightCallback:"(function|null)"};class je extends be{constructor(t,e){super(),this._element=t,t&&je.isSupported()&&(this._config=this._getConfig(e),this._deltaX=0,this._supportPointerEvents=Boolean(window.PointerEvent),this._initEvents())}static get Default(){return Pe}static get DefaultType(){return Me}static get NAME(){return"swipe"}dispose(){fe.off(this._element,Le)}_start(t){this._supportPointerEvents?this._eventIsPointerPenTouch(t)&&(this._deltaX=t.clientX):this._deltaX=t.touches[0].clientX}_end(t){this._eventIsPointerPenTouch(t)&&(this._deltaX=t.clientX-this._deltaX),this._handleSwipe(),Xt(this._config.endCallback)}_move(t){this._deltaX=t.touches&&t.touches.length>1?0:t.touches[0].clientX-this._deltaX}_handleSwipe(){const t=Math.abs(this._deltaX);if(t<=40)return;const e=t/this._deltaX;this._deltaX=0,e&&Xt(e>0?this._config.rightCallback:this._config.leftCallback)}_initEvents(){this._supportPointerEvents?(fe.on(this._element,Ie,(t=>this._start(t))),fe.on(this._element,Ne,(t=>this._end(t))),this._element.classList.add("pointer-event")):(fe.on(this._element,Se,(t=>this._start(t))),fe.on(this._element,De,(t=>this._move(t))),fe.on(this._element,$e,(t=>this._end(t))))}_eventIsPointerPenTouch(t){return this._supportPointerEvents&&("pen"===t.pointerType||"touch"===t.pointerType)}static isSupported(){return"ontouchstart"in document.documentElement||navigator.maxTouchPoints>0}}const Fe=".bs.carousel",He=".data-api",Be="next",We="prev",ze="left",Re="right",qe=`slide${Fe}`,Ve=`slid${Fe}`,Ye=`keydown${Fe}`,Ke=`mouseenter${Fe}`,Qe=`mouseleave${Fe}`,Xe=`dragstart${Fe}`,Ue=`load${Fe}${He}`,Ge=`click${Fe}${He}`,Je="carousel",Ze="active",ti=".active",ei=".carousel-item",ii=ti+ei,ni={ArrowLeft:Re,ArrowRight:ze},si={interval:5e3,keyboard:!0,pause:"hover",ride:!1,touch:!0,wrap:!0},oi={interval:"(number|boolean)",keyboard:"boolean",pause:"(string|boolean)",ride:"(boolean|string)",touch:"boolean",wrap:"boolean"};class ri extends ve{constructor(t,e){super(t,e),this._interval=null,this._activeElement=null,this._isSliding=!1,this.touchTimeout=null,this._swipeHelper=null,this._indicatorsElement=we.findOne(".carousel-indicators",this._element),this._addEventListeners(),this._config.ride===Je&&this.cycle()}static get Default(){return si}static get DefaultType(){return oi}static get NAME(){return"carousel"}next(){this._slide(Be)}nextWhenVisible(){!document.hidden&&Bt(this._element)&&this.next()}prev(){this._slide(We)}pause(){this._isSliding&&jt(this._element),this._clearInterval()}cycle(){this._clearInterval(),this._updateInterval(),this._interval=setInterval((()=>this.nextWhenVisible()),this._config.interval)}_maybeEnableCycle(){this._config.ride&&(this._isSliding?fe.one(this._element,Ve,(()=>this.cycle())):this.cycle())}to(t){const e=this._getItems();if(t>e.length-1||t<0)return;if(this._isSliding)return void fe.one(this._element,Ve,(()=>this.to(t)));const i=this._getItemIndex(this._getActive());if(i===t)return;const n=t>i?Be:We;this._slide(n,e[t])}dispose(){this._swipeHelper&&this._swipeHelper.dispose(),super.dispose()}_configAfterMerge(t){return t.defaultInterval=t.interval,t}_addEventListeners(){this._config.keyboard&&fe.on(this._element,Ye,(t=>this._keydown(t))),"hover"===this._config.pause&&(fe.on(this._element,Ke,(()=>this.pause())),fe.on(this._element,Qe,(()=>this._maybeEnableCycle()))),this._config.touch&&je.isSupported()&&this._addTouchEventListeners()}_addTouchEventListeners(){for(const t of we.find(".carousel-item img",this._element))fe.on(t,Xe,(t=>t.preventDefault()));const t={leftCallback:()=>this._slide(this._directionToOrder(ze)),rightCallback:()=>this._slide(this._directionToOrder(Re)),endCallback:()=>{"hover"===this._config.pause&&(this.pause(),this.touchTimeout&&clearTimeout(this.touchTimeout),this.touchTimeout=setTimeout((()=>this._maybeEnableCycle()),500+this._config.interval))}};this._swipeHelper=new je(this._element,t)}_keydown(t){if(/input|textarea/i.test(t.target.tagName))return;const e=ni[t.key];e&&(t.preventDefault(),this._slide(this._directionToOrder(e)))}_getItemIndex(t){return this._getItems().indexOf(t)}_setActiveIndicatorElement(t){if(!this._indicatorsElement)return;const e=we.findOne(ti,this._indicatorsElement);e.classList.remove(Ze),e.removeAttribute("aria-current");const i=we.findOne(`[data-bs-slide-to="${t}"]`,this._indicatorsElement);i&&(i.classList.add(Ze),i.setAttribute("aria-current","true"))}_updateInterval(){const t=this._activeElement||this._getActive();if(!t)return;const e=Number.parseInt(t.getAttribute("data-bs-interval"),10);this._config.interval=e||this._config.defaultInterval}_slide(t,e=null){if(this._isSliding)return;const i=this._getActive(),n=t===Be,s=e||Gt(this._getItems(),i,n,this._config.wrap);if(s===i)return;const o=this._getItemIndex(s),r=e=>fe.trigger(this._element,e,{relatedTarget:s,direction:this._orderToDirection(t),from:this._getItemIndex(i),to:o});if(r(qe).defaultPrevented)return;if(!i||!s)return;const a=Boolean(this._interval);this.pause(),this._isSliding=!0,this._setActiveIndicatorElement(o),this._activeElement=s;const l=n?"carousel-item-start":"carousel-item-end",c=n?"carousel-item-next":"carousel-item-prev";s.classList.add(c),qt(s),i.classList.add(l),s.classList.add(l),this._queueCallback((()=>{s.classList.remove(l,c),s.classList.add(Ze),i.classList.remove(Ze,c,l),this._isSliding=!1,r(Ve)}),i,this._isAnimated()),a&&this.cycle()}_isAnimated(){return this._element.classList.contains("slide")}_getActive(){return we.findOne(ii,this._element)}_getItems(){return we.find(ei,this._element)}_clearInterval(){this._interval&&(clearInterval(this._interval),this._interval=null)}_directionToOrder(t){return Kt()?t===ze?We:Be:t===ze?Be:We}_orderToDirection(t){return Kt()?t===We?ze:Re:t===We?Re:ze}static jQueryInterface(t){return this.each((function(){const e=ri.getOrCreateInstance(this,t);if("number"!=typeof t){if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t]()}}else e.to(t)}))}}fe.on(document,Ge,"[data-bs-slide], [data-bs-slide-to]",(function(t){const e=we.getElementFromSelector(this);if(!e||!e.classList.contains(Je))return;t.preventDefault();const i=ri.getOrCreateInstance(e),n=this.getAttribute("data-bs-slide-to");return n?(i.to(n),void i._maybeEnableCycle()):"next"===_e.getDataAttribute(this,"slide")?(i.next(),void i._maybeEnableCycle()):(i.prev(),void i._maybeEnableCycle())})),fe.on(window,Ue,(()=>{const t=we.find('[data-bs-ride="carousel"]');for(const e of t)ri.getOrCreateInstance(e)})),Qt(ri);const ai=".bs.collapse",li=`show${ai}`,ci=`shown${ai}`,hi=`hide${ai}`,di=`hidden${ai}`,ui=`click${ai}.data-api`,fi="show",pi="collapse",mi="collapsing",gi=`:scope .${pi} .${pi}`,_i='[data-bs-toggle="collapse"]',bi={parent:null,toggle:!0},vi={parent:"(null|element)",toggle:"boolean"};class yi extends ve{constructor(t,e){super(t,e),this._isTransitioning=!1,this._triggerArray=[];const i=we.find(_i);for(const t of i){const e=we.getSelectorFromElement(t),i=we.find(e).filter((t=>t===this._element));null!==e&&i.length&&this._triggerArray.push(t)}this._initializeChildren(),this._config.parent||this._addAriaAndCollapsedClass(this._triggerArray,this._isShown()),this._config.toggle&&this.toggle()}static get Default(){return bi}static get DefaultType(){return vi}static get NAME(){return"collapse"}toggle(){this._isShown()?this.hide():this.show()}show(){if(this._isTransitioning||this._isShown())return;let t=[];if(this._config.parent&&(t=this._getFirstLevelChildren(".collapse.show, .collapse.collapsing").filter((t=>t!==this._element)).map((t=>yi.getOrCreateInstance(t,{toggle:!1})))),t.length&&t[0]._isTransitioning)return;if(fe.trigger(this._element,li).defaultPrevented)return;for(const e of t)e.hide();const e=this._getDimension();this._element.classList.remove(pi),this._element.classList.add(mi),this._element.style[e]=0,this._addAriaAndCollapsedClass(this._triggerArray,!0),this._isTransitioning=!0;const i=`scroll${e[0].toUpperCase()+e.slice(1)}`;this._queueCallback((()=>{this._isTransitioning=!1,this._element.classList.remove(mi),this._element.classList.add(pi,fi),this._element.style[e]="",fe.trigger(this._element,ci)}),this._element,!0),this._element.style[e]=`${this._element[i]}px`}hide(){if(this._isTransitioning||!this._isShown())return;if(fe.trigger(this._element,hi).defaultPrevented)return;const t=this._getDimension();this._element.style[t]=`${this._element.getBoundingClientRect()[t]}px`,qt(this._element),this._element.classList.add(mi),this._element.classList.remove(pi,fi);for(const t of this._triggerArray){const e=we.getElementFromSelector(t);e&&!this._isShown(e)&&this._addAriaAndCollapsedClass([t],!1)}this._isTransitioning=!0,this._element.style[t]="",this._queueCallback((()=>{this._isTransitioning=!1,this._element.classList.remove(mi),this._element.classList.add(pi),fe.trigger(this._element,di)}),this._element,!0)}_isShown(t=this._element){return t.classList.contains(fi)}_configAfterMerge(t){return t.toggle=Boolean(t.toggle),t.parent=Ht(t.parent),t}_getDimension(){return this._element.classList.contains("collapse-horizontal")?"width":"height"}_initializeChildren(){if(!this._config.parent)return;const t=this._getFirstLevelChildren(_i);for(const e of t){const t=we.getElementFromSelector(e);t&&this._addAriaAndCollapsedClass([e],this._isShown(t))}}_getFirstLevelChildren(t){const e=we.find(gi,this._config.parent);return we.find(t,this._config.parent).filter((t=>!e.includes(t)))}_addAriaAndCollapsedClass(t,e){if(t.length)for(const i of t)i.classList.toggle("collapsed",!e),i.setAttribute("aria-expanded",e)}static jQueryInterface(t){const e={};return"string"==typeof t&&/show|hide/.test(t)&&(e.toggle=!1),this.each((function(){const i=yi.getOrCreateInstance(this,e);if("string"==typeof t){if(void 0===i[t])throw new TypeError(`No method named "${t}"`);i[t]()}}))}}fe.on(document,ui,_i,(function(t){("A"===t.target.tagName||t.delegateTarget&&"A"===t.delegateTarget.tagName)&&t.preventDefault();for(const t of we.getMultipleElementsFromSelector(this))yi.getOrCreateInstance(t,{toggle:!1}).toggle()})),Qt(yi);const wi="dropdown",Ei=".bs.dropdown",Ai=".data-api",Ti="ArrowUp",Ci="ArrowDown",Oi=`hide${Ei}`,xi=`hidden${Ei}`,ki=`show${Ei}`,Li=`shown${Ei}`,Si=`click${Ei}${Ai}`,Di=`keydown${Ei}${Ai}`,$i=`keyup${Ei}${Ai}`,Ii="show",Ni='[data-bs-toggle="dropdown"]:not(.disabled):not(:disabled)',Pi=`${Ni}.${Ii}`,Mi=".dropdown-menu",ji=Kt()?"top-end":"top-start",Fi=Kt()?"top-start":"top-end",Hi=Kt()?"bottom-end":"bottom-start",Bi=Kt()?"bottom-start":"bottom-end",Wi=Kt()?"left-start":"right-start",zi=Kt()?"right-start":"left-start",Ri={autoClose:!0,boundary:"clippingParents",display:"dynamic",offset:[0,2],popperConfig:null,reference:"toggle"},qi={autoClose:"(boolean|string)",boundary:"(string|element)",display:"string",offset:"(array|string|function)",popperConfig:"(null|object|function)",reference:"(string|element|object)"};class Vi extends ve{constructor(t,e){super(t,e),this._popper=null,this._parent=this._element.parentNode,this._menu=we.next(this._element,Mi)[0]||we.prev(this._element,Mi)[0]||we.findOne(Mi,this._parent),this._inNavbar=this._detectNavbar()}static get Default(){return Ri}static get DefaultType(){return qi}static get NAME(){return wi}toggle(){return this._isShown()?this.hide():this.show()}show(){if(Wt(this._element)||this._isShown())return;const t={relatedTarget:this._element};if(!fe.trigger(this._element,ki,t).defaultPrevented){if(this._createPopper(),"ontouchstart"in document.documentElement&&!this._parent.closest(".navbar-nav"))for(const t of[].concat(...document.body.children))fe.on(t,"mouseover",Rt);this._element.focus(),this._element.setAttribute("aria-expanded",!0),this._menu.classList.add(Ii),this._element.classList.add(Ii),fe.trigger(this._element,Li,t)}}hide(){if(Wt(this._element)||!this._isShown())return;const t={relatedTarget:this._element};this._completeHide(t)}dispose(){this._popper&&this._popper.destroy(),super.dispose()}update(){this._inNavbar=this._detectNavbar(),this._popper&&this._popper.update()}_completeHide(t){if(!fe.trigger(this._element,Oi,t).defaultPrevented){if("ontouchstart"in document.documentElement)for(const t of[].concat(...document.body.children))fe.off(t,"mouseover",Rt);this._popper&&this._popper.destroy(),this._menu.classList.remove(Ii),this._element.classList.remove(Ii),this._element.setAttribute("aria-expanded","false"),_e.removeDataAttribute(this._menu,"popper"),fe.trigger(this._element,xi,t)}}_getConfig(t){if("object"==typeof(t=super._getConfig(t)).reference&&!Ft(t.reference)&&"function"!=typeof t.reference.getBoundingClientRect)throw new TypeError(`${wi.toUpperCase()}: Option "reference" provided type "object" without a required "getBoundingClientRect" method.`);return t}_createPopper(){if(void 0===e)throw new TypeError("Bootstrap's dropdowns require Popper (https://popper.js.org)");let t=this._element;"parent"===this._config.reference?t=this._parent:Ft(this._config.reference)?t=Ht(this._config.reference):"object"==typeof this._config.reference&&(t=this._config.reference);const i=this._getPopperConfig();this._popper=Dt(t,this._menu,i)}_isShown(){return this._menu.classList.contains(Ii)}_getPlacement(){const t=this._parent;if(t.classList.contains("dropend"))return Wi;if(t.classList.contains("dropstart"))return zi;if(t.classList.contains("dropup-center"))return"top";if(t.classList.contains("dropdown-center"))return"bottom";const e="end"===getComputedStyle(this._menu).getPropertyValue("--bs-position").trim();return t.classList.contains("dropup")?e?Fi:ji:e?Bi:Hi}_detectNavbar(){return null!==this._element.closest(".navbar")}_getOffset(){const{offset:t}=this._config;return"string"==typeof t?t.split(",").map((t=>Number.parseInt(t,10))):"function"==typeof t?e=>t(e,this._element):t}_getPopperConfig(){const t={placement:this._getPlacement(),modifiers:[{name:"preventOverflow",options:{boundary:this._config.boundary}},{name:"offset",options:{offset:this._getOffset()}}]};return(this._inNavbar||"static"===this._config.display)&&(_e.setDataAttribute(this._menu,"popper","static"),t.modifiers=[{name:"applyStyles",enabled:!1}]),{...t,...Xt(this._config.popperConfig,[t])}}_selectMenuItem({key:t,target:e}){const i=we.find(".dropdown-menu .dropdown-item:not(.disabled):not(:disabled)",this._menu).filter((t=>Bt(t)));i.length&&Gt(i,e,t===Ci,!i.includes(e)).focus()}static jQueryInterface(t){return this.each((function(){const e=Vi.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}}))}static clearMenus(t){if(2===t.button||"keyup"===t.type&&"Tab"!==t.key)return;const e=we.find(Pi);for(const i of e){const e=Vi.getInstance(i);if(!e||!1===e._config.autoClose)continue;const n=t.composedPath(),s=n.includes(e._menu);if(n.includes(e._element)||"inside"===e._config.autoClose&&!s||"outside"===e._config.autoClose&&s)continue;if(e._menu.contains(t.target)&&("keyup"===t.type&&"Tab"===t.key||/input|select|option|textarea|form/i.test(t.target.tagName)))continue;const o={relatedTarget:e._element};"click"===t.type&&(o.clickEvent=t),e._completeHide(o)}}static dataApiKeydownHandler(t){const e=/input|textarea/i.test(t.target.tagName),i="Escape"===t.key,n=[Ti,Ci].includes(t.key);if(!n&&!i)return;if(e&&!i)return;t.preventDefault();const s=this.matches(Ni)?this:we.prev(this,Ni)[0]||we.next(this,Ni)[0]||we.findOne(Ni,t.delegateTarget.parentNode),o=Vi.getOrCreateInstance(s);if(n)return t.stopPropagation(),o.show(),void o._selectMenuItem(t);o._isShown()&&(t.stopPropagation(),o.hide(),s.focus())}}fe.on(document,Di,Ni,Vi.dataApiKeydownHandler),fe.on(document,Di,Mi,Vi.dataApiKeydownHandler),fe.on(document,Si,Vi.clearMenus),fe.on(document,$i,Vi.clearMenus),fe.on(document,Si,Ni,(function(t){t.preventDefault(),Vi.getOrCreateInstance(this).toggle()})),Qt(Vi);const Yi="backdrop",Ki="show",Qi=`mousedown.bs.${Yi}`,Xi={className:"modal-backdrop",clickCallback:null,isAnimated:!1,isVisible:!0,rootElement:"body"},Ui={className:"string",clickCallback:"(function|null)",isAnimated:"boolean",isVisible:"boolean",rootElement:"(element|string)"};class Gi extends be{constructor(t){super(),this._config=this._getConfig(t),this._isAppended=!1,this._element=null}static get Default(){return Xi}static get DefaultType(){return Ui}static get NAME(){return Yi}show(t){if(!this._config.isVisible)return void Xt(t);this._append();const e=this._getElement();this._config.isAnimated&&qt(e),e.classList.add(Ki),this._emulateAnimation((()=>{Xt(t)}))}hide(t){this._config.isVisible?(this._getElement().classList.remove(Ki),this._emulateAnimation((()=>{this.dispose(),Xt(t)}))):Xt(t)}dispose(){this._isAppended&&(fe.off(this._element,Qi),this._element.remove(),this._isAppended=!1)}_getElement(){if(!this._element){const t=document.createElement("div");t.className=this._config.className,this._config.isAnimated&&t.classList.add("fade"),this._element=t}return this._element}_configAfterMerge(t){return t.rootElement=Ht(t.rootElement),t}_append(){if(this._isAppended)return;const t=this._getElement();this._config.rootElement.append(t),fe.on(t,Qi,(()=>{Xt(this._config.clickCallback)})),this._isAppended=!0}_emulateAnimation(t){Ut(t,this._getElement(),this._config.isAnimated)}}const Ji=".bs.focustrap",Zi=`focusin${Ji}`,tn=`keydown.tab${Ji}`,en="backward",nn={autofocus:!0,trapElement:null},sn={autofocus:"boolean",trapElement:"element"};class on extends be{constructor(t){super(),this._config=this._getConfig(t),this._isActive=!1,this._lastTabNavDirection=null}static get Default(){return nn}static get DefaultType(){return sn}static get NAME(){return"focustrap"}activate(){this._isActive||(this._config.autofocus&&this._config.trapElement.focus(),fe.off(document,Ji),fe.on(document,Zi,(t=>this._handleFocusin(t))),fe.on(document,tn,(t=>this._handleKeydown(t))),this._isActive=!0)}deactivate(){this._isActive&&(this._isActive=!1,fe.off(document,Ji))}_handleFocusin(t){const{trapElement:e}=this._config;if(t.target===document||t.target===e||e.contains(t.target))return;const i=we.focusableChildren(e);0===i.length?e.focus():this._lastTabNavDirection===en?i[i.length-1].focus():i[0].focus()}_handleKeydown(t){"Tab"===t.key&&(this._lastTabNavDirection=t.shiftKey?en:"forward")}}const rn=".fixed-top, .fixed-bottom, .is-fixed, .sticky-top",an=".sticky-top",ln="padding-right",cn="margin-right";class hn{constructor(){this._element=document.body}getWidth(){const t=document.documentElement.clientWidth;return Math.abs(window.innerWidth-t)}hide(){const t=this.getWidth();this._disableOverFlow(),this._setElementAttributes(this._element,ln,(e=>e+t)),this._setElementAttributes(rn,ln,(e=>e+t)),this._setElementAttributes(an,cn,(e=>e-t))}reset(){this._resetElementAttributes(this._element,"overflow"),this._resetElementAttributes(this._element,ln),this._resetElementAttributes(rn,ln),this._resetElementAttributes(an,cn)}isOverflowing(){return this.getWidth()>0}_disableOverFlow(){this._saveInitialAttribute(this._element,"overflow"),this._element.style.overflow="hidden"}_setElementAttributes(t,e,i){const n=this.getWidth();this._applyManipulationCallback(t,(t=>{if(t!==this._element&&window.innerWidth>t.clientWidth+n)return;this._saveInitialAttribute(t,e);const s=window.getComputedStyle(t).getPropertyValue(e);t.style.setProperty(e,`${i(Number.parseFloat(s))}px`)}))}_saveInitialAttribute(t,e){const i=t.style.getPropertyValue(e);i&&_e.setDataAttribute(t,e,i)}_resetElementAttributes(t,e){this._applyManipulationCallback(t,(t=>{const i=_e.getDataAttribute(t,e);null!==i?(_e.removeDataAttribute(t,e),t.style.setProperty(e,i)):t.style.removeProperty(e)}))}_applyManipulationCallback(t,e){if(Ft(t))e(t);else for(const i of we.find(t,this._element))e(i)}}const dn=".bs.modal",un=`hide${dn}`,fn=`hidePrevented${dn}`,pn=`hidden${dn}`,mn=`show${dn}`,gn=`shown${dn}`,_n=`resize${dn}`,bn=`click.dismiss${dn}`,vn=`mousedown.dismiss${dn}`,yn=`keydown.dismiss${dn}`,wn=`click${dn}.data-api`,En="modal-open",An="show",Tn="modal-static",Cn={backdrop:!0,focus:!0,keyboard:!0},On={backdrop:"(boolean|string)",focus:"boolean",keyboard:"boolean"};class xn extends ve{constructor(t,e){super(t,e),this._dialog=we.findOne(".modal-dialog",this._element),this._backdrop=this._initializeBackDrop(),this._focustrap=this._initializeFocusTrap(),this._isShown=!1,this._isTransitioning=!1,this._scrollBar=new hn,this._addEventListeners()}static get Default(){return Cn}static get DefaultType(){return On}static get NAME(){return"modal"}toggle(t){return this._isShown?this.hide():this.show(t)}show(t){this._isShown||this._isTransitioning||fe.trigger(this._element,mn,{relatedTarget:t}).defaultPrevented||(this._isShown=!0,this._isTransitioning=!0,this._scrollBar.hide(),document.body.classList.add(En),this._adjustDialog(),this._backdrop.show((()=>this._showElement(t))))}hide(){this._isShown&&!this._isTransitioning&&(fe.trigger(this._element,un).defaultPrevented||(this._isShown=!1,this._isTransitioning=!0,this._focustrap.deactivate(),this._element.classList.remove(An),this._queueCallback((()=>this._hideModal()),this._element,this._isAnimated())))}dispose(){fe.off(window,dn),fe.off(this._dialog,dn),this._backdrop.dispose(),this._focustrap.deactivate(),super.dispose()}handleUpdate(){this._adjustDialog()}_initializeBackDrop(){return new Gi({isVisible:Boolean(this._config.backdrop),isAnimated:this._isAnimated()})}_initializeFocusTrap(){return new on({trapElement:this._element})}_showElement(t){document.body.contains(this._element)||document.body.append(this._element),this._element.style.display="block",this._element.removeAttribute("aria-hidden"),this._element.setAttribute("aria-modal",!0),this._element.setAttribute("role","dialog"),this._element.scrollTop=0;const e=we.findOne(".modal-body",this._dialog);e&&(e.scrollTop=0),qt(this._element),this._element.classList.add(An),this._queueCallback((()=>{this._config.focus&&this._focustrap.activate(),this._isTransitioning=!1,fe.trigger(this._element,gn,{relatedTarget:t})}),this._dialog,this._isAnimated())}_addEventListeners(){fe.on(this._element,yn,(t=>{"Escape"===t.key&&(this._config.keyboard?this.hide():this._triggerBackdropTransition())})),fe.on(window,_n,(()=>{this._isShown&&!this._isTransitioning&&this._adjustDialog()})),fe.on(this._element,vn,(t=>{fe.one(this._element,bn,(e=>{this._element===t.target&&this._element===e.target&&("static"!==this._config.backdrop?this._config.backdrop&&this.hide():this._triggerBackdropTransition())}))}))}_hideModal(){this._element.style.display="none",this._element.setAttribute("aria-hidden",!0),this._element.removeAttribute("aria-modal"),this._element.removeAttribute("role"),this._isTransitioning=!1,this._backdrop.hide((()=>{document.body.classList.remove(En),this._resetAdjustments(),this._scrollBar.reset(),fe.trigger(this._element,pn)}))}_isAnimated(){return this._element.classList.contains("fade")}_triggerBackdropTransition(){if(fe.trigger(this._element,fn).defaultPrevented)return;const t=this._element.scrollHeight>document.documentElement.clientHeight,e=this._element.style.overflowY;"hidden"===e||this._element.classList.contains(Tn)||(t||(this._element.style.overflowY="hidden"),this._element.classList.add(Tn),this._queueCallback((()=>{this._element.classList.remove(Tn),this._queueCallback((()=>{this._element.style.overflowY=e}),this._dialog)}),this._dialog),this._element.focus())}_adjustDialog(){const t=this._element.scrollHeight>document.documentElement.clientHeight,e=this._scrollBar.getWidth(),i=e>0;if(i&&!t){const t=Kt()?"paddingLeft":"paddingRight";this._element.style[t]=`${e}px`}if(!i&&t){const t=Kt()?"paddingRight":"paddingLeft";this._element.style[t]=`${e}px`}}_resetAdjustments(){this._element.style.paddingLeft="",this._element.style.paddingRight=""}static jQueryInterface(t,e){return this.each((function(){const i=xn.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===i[t])throw new TypeError(`No method named "${t}"`);i[t](e)}}))}}fe.on(document,wn,'[data-bs-toggle="modal"]',(function(t){const e=we.getElementFromSelector(this);["A","AREA"].includes(this.tagName)&&t.preventDefault(),fe.one(e,mn,(t=>{t.defaultPrevented||fe.one(e,pn,(()=>{Bt(this)&&this.focus()}))}));const i=we.findOne(".modal.show");i&&xn.getInstance(i).hide(),xn.getOrCreateInstance(e).toggle(this)})),Ee(xn),Qt(xn);const kn=".bs.offcanvas",Ln=".data-api",Sn=`load${kn}${Ln}`,Dn="show",$n="showing",In="hiding",Nn=".offcanvas.show",Pn=`show${kn}`,Mn=`shown${kn}`,jn=`hide${kn}`,Fn=`hidePrevented${kn}`,Hn=`hidden${kn}`,Bn=`resize${kn}`,Wn=`click${kn}${Ln}`,zn=`keydown.dismiss${kn}`,Rn={backdrop:!0,keyboard:!0,scroll:!1},qn={backdrop:"(boolean|string)",keyboard:"boolean",scroll:"boolean"};class Vn extends ve{constructor(t,e){super(t,e),this._isShown=!1,this._backdrop=this._initializeBackDrop(),this._focustrap=this._initializeFocusTrap(),this._addEventListeners()}static get Default(){return Rn}static get DefaultType(){return qn}static get NAME(){return"offcanvas"}toggle(t){return this._isShown?this.hide():this.show(t)}show(t){this._isShown||fe.trigger(this._element,Pn,{relatedTarget:t}).defaultPrevented||(this._isShown=!0,this._backdrop.show(),this._config.scroll||(new hn).hide(),this._element.setAttribute("aria-modal",!0),this._element.setAttribute("role","dialog"),this._element.classList.add($n),this._queueCallback((()=>{this._config.scroll&&!this._config.backdrop||this._focustrap.activate(),this._element.classList.add(Dn),this._element.classList.remove($n),fe.trigger(this._element,Mn,{relatedTarget:t})}),this._element,!0))}hide(){this._isShown&&(fe.trigger(this._element,jn).defaultPrevented||(this._focustrap.deactivate(),this._element.blur(),this._isShown=!1,this._element.classList.add(In),this._backdrop.hide(),this._queueCallback((()=>{this._element.classList.remove(Dn,In),this._element.removeAttribute("aria-modal"),this._element.removeAttribute("role"),this._config.scroll||(new hn).reset(),fe.trigger(this._element,Hn)}),this._element,!0)))}dispose(){this._backdrop.dispose(),this._focustrap.deactivate(),super.dispose()}_initializeBackDrop(){const t=Boolean(this._config.backdrop);return new Gi({className:"offcanvas-backdrop",isVisible:t,isAnimated:!0,rootElement:this._element.parentNode,clickCallback:t?()=>{"static"!==this._config.backdrop?this.hide():fe.trigger(this._element,Fn)}:null})}_initializeFocusTrap(){return new on({trapElement:this._element})}_addEventListeners(){fe.on(this._element,zn,(t=>{"Escape"===t.key&&(this._config.keyboard?this.hide():fe.trigger(this._element,Fn))}))}static jQueryInterface(t){return this.each((function(){const e=Vn.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t](this)}}))}}fe.on(document,Wn,'[data-bs-toggle="offcanvas"]',(function(t){const e=we.getElementFromSelector(this);if(["A","AREA"].includes(this.tagName)&&t.preventDefault(),Wt(this))return;fe.one(e,Hn,(()=>{Bt(this)&&this.focus()}));const i=we.findOne(Nn);i&&i!==e&&Vn.getInstance(i).hide(),Vn.getOrCreateInstance(e).toggle(this)})),fe.on(window,Sn,(()=>{for(const t of we.find(Nn))Vn.getOrCreateInstance(t).show()})),fe.on(window,Bn,(()=>{for(const t of we.find("[aria-modal][class*=show][class*=offcanvas-]"))"fixed"!==getComputedStyle(t).position&&Vn.getOrCreateInstance(t).hide()})),Ee(Vn),Qt(Vn);const Yn={"*":["class","dir","id","lang","role",/^aria-[\w-]*$/i],a:["target","href","title","rel"],area:[],b:[],br:[],col:[],code:[],div:[],em:[],hr:[],h1:[],h2:[],h3:[],h4:[],h5:[],h6:[],i:[],img:["src","srcset","alt","title","width","height"],li:[],ol:[],p:[],pre:[],s:[],small:[],span:[],sub:[],sup:[],strong:[],u:[],ul:[]},Kn=new Set(["background","cite","href","itemtype","longdesc","poster","src","xlink:href"]),Qn=/^(?!javascript:)(?:[a-z0-9+.-]+:|[^&:/?#]*(?:[/?#]|$))/i,Xn=(t,e)=>{const i=t.nodeName.toLowerCase();return e.includes(i)?!Kn.has(i)||Boolean(Qn.test(t.nodeValue)):e.filter((t=>t instanceof RegExp)).some((t=>t.test(i)))},Un={allowList:Yn,content:{},extraClass:"",html:!1,sanitize:!0,sanitizeFn:null,template:"
"},Gn={allowList:"object",content:"object",extraClass:"(string|function)",html:"boolean",sanitize:"boolean",sanitizeFn:"(null|function)",template:"string"},Jn={entry:"(string|element|function|null)",selector:"(string|element)"};class Zn extends be{constructor(t){super(),this._config=this._getConfig(t)}static get Default(){return Un}static get DefaultType(){return Gn}static get NAME(){return"TemplateFactory"}getContent(){return Object.values(this._config.content).map((t=>this._resolvePossibleFunction(t))).filter(Boolean)}hasContent(){return this.getContent().length>0}changeContent(t){return this._checkContent(t),this._config.content={...this._config.content,...t},this}toHtml(){const t=document.createElement("div");t.innerHTML=this._maybeSanitize(this._config.template);for(const[e,i]of Object.entries(this._config.content))this._setContent(t,i,e);const e=t.children[0],i=this._resolvePossibleFunction(this._config.extraClass);return i&&e.classList.add(...i.split(" ")),e}_typeCheckConfig(t){super._typeCheckConfig(t),this._checkContent(t.content)}_checkContent(t){for(const[e,i]of Object.entries(t))super._typeCheckConfig({selector:e,entry:i},Jn)}_setContent(t,e,i){const n=we.findOne(i,t);n&&((e=this._resolvePossibleFunction(e))?Ft(e)?this._putElementInTemplate(Ht(e),n):this._config.html?n.innerHTML=this._maybeSanitize(e):n.textContent=e:n.remove())}_maybeSanitize(t){return this._config.sanitize?function(t,e,i){if(!t.length)return t;if(i&&"function"==typeof i)return i(t);const n=(new window.DOMParser).parseFromString(t,"text/html"),s=[].concat(...n.body.querySelectorAll("*"));for(const t of s){const i=t.nodeName.toLowerCase();if(!Object.keys(e).includes(i)){t.remove();continue}const n=[].concat(...t.attributes),s=[].concat(e["*"]||[],e[i]||[]);for(const e of n)Xn(e,s)||t.removeAttribute(e.nodeName)}return n.body.innerHTML}(t,this._config.allowList,this._config.sanitizeFn):t}_resolvePossibleFunction(t){return Xt(t,[this])}_putElementInTemplate(t,e){if(this._config.html)return e.innerHTML="",void e.append(t);e.textContent=t.textContent}}const ts=new Set(["sanitize","allowList","sanitizeFn"]),es="fade",is="show",ns=".modal",ss="hide.bs.modal",os="hover",rs="focus",as={AUTO:"auto",TOP:"top",RIGHT:Kt()?"left":"right",BOTTOM:"bottom",LEFT:Kt()?"right":"left"},ls={allowList:Yn,animation:!0,boundary:"clippingParents",container:!1,customClass:"",delay:0,fallbackPlacements:["top","right","bottom","left"],html:!1,offset:[0,6],placement:"top",popperConfig:null,sanitize:!0,sanitizeFn:null,selector:!1,template:'',title:"",trigger:"hover focus"},cs={allowList:"object",animation:"boolean",boundary:"(string|element)",container:"(string|element|boolean)",customClass:"(string|function)",delay:"(number|object)",fallbackPlacements:"array",html:"boolean",offset:"(array|string|function)",placement:"(string|function)",popperConfig:"(null|object|function)",sanitize:"boolean",sanitizeFn:"(null|function)",selector:"(string|boolean)",template:"string",title:"(string|element|function)",trigger:"string"};class hs extends ve{constructor(t,i){if(void 0===e)throw new TypeError("Bootstrap's tooltips require Popper (https://popper.js.org)");super(t,i),this._isEnabled=!0,this._timeout=0,this._isHovered=null,this._activeTrigger={},this._popper=null,this._templateFactory=null,this._newContent=null,this.tip=null,this._setListeners(),this._config.selector||this._fixTitle()}static get Default(){return ls}static get DefaultType(){return cs}static get NAME(){return"tooltip"}enable(){this._isEnabled=!0}disable(){this._isEnabled=!1}toggleEnabled(){this._isEnabled=!this._isEnabled}toggle(){this._isEnabled&&(this._activeTrigger.click=!this._activeTrigger.click,this._isShown()?this._leave():this._enter())}dispose(){clearTimeout(this._timeout),fe.off(this._element.closest(ns),ss,this._hideModalHandler),this._element.getAttribute("data-bs-original-title")&&this._element.setAttribute("title",this._element.getAttribute("data-bs-original-title")),this._disposePopper(),super.dispose()}show(){if("none"===this._element.style.display)throw new Error("Please use show on visible elements");if(!this._isWithContent()||!this._isEnabled)return;const t=fe.trigger(this._element,this.constructor.eventName("show")),e=(zt(this._element)||this._element.ownerDocument.documentElement).contains(this._element);if(t.defaultPrevented||!e)return;this._disposePopper();const i=this._getTipElement();this._element.setAttribute("aria-describedby",i.getAttribute("id"));const{container:n}=this._config;if(this._element.ownerDocument.documentElement.contains(this.tip)||(n.append(i),fe.trigger(this._element,this.constructor.eventName("inserted"))),this._popper=this._createPopper(i),i.classList.add(is),"ontouchstart"in document.documentElement)for(const t of[].concat(...document.body.children))fe.on(t,"mouseover",Rt);this._queueCallback((()=>{fe.trigger(this._element,this.constructor.eventName("shown")),!1===this._isHovered&&this._leave(),this._isHovered=!1}),this.tip,this._isAnimated())}hide(){if(this._isShown()&&!fe.trigger(this._element,this.constructor.eventName("hide")).defaultPrevented){if(this._getTipElement().classList.remove(is),"ontouchstart"in document.documentElement)for(const t of[].concat(...document.body.children))fe.off(t,"mouseover",Rt);this._activeTrigger.click=!1,this._activeTrigger[rs]=!1,this._activeTrigger[os]=!1,this._isHovered=null,this._queueCallback((()=>{this._isWithActiveTrigger()||(this._isHovered||this._disposePopper(),this._element.removeAttribute("aria-describedby"),fe.trigger(this._element,this.constructor.eventName("hidden")))}),this.tip,this._isAnimated())}}update(){this._popper&&this._popper.update()}_isWithContent(){return Boolean(this._getTitle())}_getTipElement(){return this.tip||(this.tip=this._createTipElement(this._newContent||this._getContentForTemplate())),this.tip}_createTipElement(t){const e=this._getTemplateFactory(t).toHtml();if(!e)return null;e.classList.remove(es,is),e.classList.add(`bs-${this.constructor.NAME}-auto`);const i=(t=>{do{t+=Math.floor(1e6*Math.random())}while(document.getElementById(t));return t})(this.constructor.NAME).toString();return e.setAttribute("id",i),this._isAnimated()&&e.classList.add(es),e}setContent(t){this._newContent=t,this._isShown()&&(this._disposePopper(),this.show())}_getTemplateFactory(t){return this._templateFactory?this._templateFactory.changeContent(t):this._templateFactory=new Zn({...this._config,content:t,extraClass:this._resolvePossibleFunction(this._config.customClass)}),this._templateFactory}_getContentForTemplate(){return{".tooltip-inner":this._getTitle()}}_getTitle(){return this._resolvePossibleFunction(this._config.title)||this._element.getAttribute("data-bs-original-title")}_initializeOnDelegatedTarget(t){return this.constructor.getOrCreateInstance(t.delegateTarget,this._getDelegateConfig())}_isAnimated(){return this._config.animation||this.tip&&this.tip.classList.contains(es)}_isShown(){return this.tip&&this.tip.classList.contains(is)}_createPopper(t){const e=Xt(this._config.placement,[this,t,this._element]),i=as[e.toUpperCase()];return Dt(this._element,t,this._getPopperConfig(i))}_getOffset(){const{offset:t}=this._config;return"string"==typeof t?t.split(",").map((t=>Number.parseInt(t,10))):"function"==typeof t?e=>t(e,this._element):t}_resolvePossibleFunction(t){return Xt(t,[this._element])}_getPopperConfig(t){const e={placement:t,modifiers:[{name:"flip",options:{fallbackPlacements:this._config.fallbackPlacements}},{name:"offset",options:{offset:this._getOffset()}},{name:"preventOverflow",options:{boundary:this._config.boundary}},{name:"arrow",options:{element:`.${this.constructor.NAME}-arrow`}},{name:"preSetPlacement",enabled:!0,phase:"beforeMain",fn:t=>{this._getTipElement().setAttribute("data-popper-placement",t.state.placement)}}]};return{...e,...Xt(this._config.popperConfig,[e])}}_setListeners(){const t=this._config.trigger.split(" ");for(const e of t)if("click"===e)fe.on(this._element,this.constructor.eventName("click"),this._config.selector,(t=>{this._initializeOnDelegatedTarget(t).toggle()}));else if("manual"!==e){const t=e===os?this.constructor.eventName("mouseenter"):this.constructor.eventName("focusin"),i=e===os?this.constructor.eventName("mouseleave"):this.constructor.eventName("focusout");fe.on(this._element,t,this._config.selector,(t=>{const e=this._initializeOnDelegatedTarget(t);e._activeTrigger["focusin"===t.type?rs:os]=!0,e._enter()})),fe.on(this._element,i,this._config.selector,(t=>{const e=this._initializeOnDelegatedTarget(t);e._activeTrigger["focusout"===t.type?rs:os]=e._element.contains(t.relatedTarget),e._leave()}))}this._hideModalHandler=()=>{this._element&&this.hide()},fe.on(this._element.closest(ns),ss,this._hideModalHandler)}_fixTitle(){const t=this._element.getAttribute("title");t&&(this._element.getAttribute("aria-label")||this._element.textContent.trim()||this._element.setAttribute("aria-label",t),this._element.setAttribute("data-bs-original-title",t),this._element.removeAttribute("title"))}_enter(){this._isShown()||this._isHovered?this._isHovered=!0:(this._isHovered=!0,this._setTimeout((()=>{this._isHovered&&this.show()}),this._config.delay.show))}_leave(){this._isWithActiveTrigger()||(this._isHovered=!1,this._setTimeout((()=>{this._isHovered||this.hide()}),this._config.delay.hide))}_setTimeout(t,e){clearTimeout(this._timeout),this._timeout=setTimeout(t,e)}_isWithActiveTrigger(){return Object.values(this._activeTrigger).includes(!0)}_getConfig(t){const e=_e.getDataAttributes(this._element);for(const t of Object.keys(e))ts.has(t)&&delete e[t];return t={...e,..."object"==typeof t&&t?t:{}},t=this._mergeConfigObj(t),t=this._configAfterMerge(t),this._typeCheckConfig(t),t}_configAfterMerge(t){return t.container=!1===t.container?document.body:Ht(t.container),"number"==typeof t.delay&&(t.delay={show:t.delay,hide:t.delay}),"number"==typeof t.title&&(t.title=t.title.toString()),"number"==typeof t.content&&(t.content=t.content.toString()),t}_getDelegateConfig(){const t={};for(const[e,i]of Object.entries(this._config))this.constructor.Default[e]!==i&&(t[e]=i);return t.selector=!1,t.trigger="manual",t}_disposePopper(){this._popper&&(this._popper.destroy(),this._popper=null),this.tip&&(this.tip.remove(),this.tip=null)}static jQueryInterface(t){return this.each((function(){const e=hs.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}}))}}Qt(hs);const ds={...hs.Default,content:"",offset:[0,8],placement:"right",template:'',trigger:"click"},us={...hs.DefaultType,content:"(null|string|element|function)"};class fs extends hs{static get Default(){return ds}static get DefaultType(){return us}static get NAME(){return"popover"}_isWithContent(){return this._getTitle()||this._getContent()}_getContentForTemplate(){return{".popover-header":this._getTitle(),".popover-body":this._getContent()}}_getContent(){return this._resolvePossibleFunction(this._config.content)}static jQueryInterface(t){return this.each((function(){const e=fs.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}}))}}Qt(fs);const ps=".bs.scrollspy",ms=`activate${ps}`,gs=`click${ps}`,_s=`load${ps}.data-api`,bs="active",vs="[href]",ys=".nav-link",ws=`${ys}, .nav-item > ${ys}, .list-group-item`,Es={offset:null,rootMargin:"0px 0px -25%",smoothScroll:!1,target:null,threshold:[.1,.5,1]},As={offset:"(number|null)",rootMargin:"string",smoothScroll:"boolean",target:"element",threshold:"array"};class Ts extends ve{constructor(t,e){super(t,e),this._targetLinks=new Map,this._observableSections=new Map,this._rootElement="visible"===getComputedStyle(this._element).overflowY?null:this._element,this._activeTarget=null,this._observer=null,this._previousScrollData={visibleEntryTop:0,parentScrollTop:0},this.refresh()}static get Default(){return Es}static get DefaultType(){return As}static get NAME(){return"scrollspy"}refresh(){this._initializeTargetsAndObservables(),this._maybeEnableSmoothScroll(),this._observer?this._observer.disconnect():this._observer=this._getNewObserver();for(const t of this._observableSections.values())this._observer.observe(t)}dispose(){this._observer.disconnect(),super.dispose()}_configAfterMerge(t){return t.target=Ht(t.target)||document.body,t.rootMargin=t.offset?`${t.offset}px 0px -30%`:t.rootMargin,"string"==typeof t.threshold&&(t.threshold=t.threshold.split(",").map((t=>Number.parseFloat(t)))),t}_maybeEnableSmoothScroll(){this._config.smoothScroll&&(fe.off(this._config.target,gs),fe.on(this._config.target,gs,vs,(t=>{const e=this._observableSections.get(t.target.hash);if(e){t.preventDefault();const i=this._rootElement||window,n=e.offsetTop-this._element.offsetTop;if(i.scrollTo)return void i.scrollTo({top:n,behavior:"smooth"});i.scrollTop=n}})))}_getNewObserver(){const t={root:this._rootElement,threshold:this._config.threshold,rootMargin:this._config.rootMargin};return new IntersectionObserver((t=>this._observerCallback(t)),t)}_observerCallback(t){const e=t=>this._targetLinks.get(`#${t.target.id}`),i=t=>{this._previousScrollData.visibleEntryTop=t.target.offsetTop,this._process(e(t))},n=(this._rootElement||document.documentElement).scrollTop,s=n>=this._previousScrollData.parentScrollTop;this._previousScrollData.parentScrollTop=n;for(const o of t){if(!o.isIntersecting){this._activeTarget=null,this._clearActiveClass(e(o));continue}const t=o.target.offsetTop>=this._previousScrollData.visibleEntryTop;if(s&&t){if(i(o),!n)return}else s||t||i(o)}}_initializeTargetsAndObservables(){this._targetLinks=new Map,this._observableSections=new Map;const t=we.find(vs,this._config.target);for(const e of t){if(!e.hash||Wt(e))continue;const t=we.findOne(decodeURI(e.hash),this._element);Bt(t)&&(this._targetLinks.set(decodeURI(e.hash),e),this._observableSections.set(e.hash,t))}}_process(t){this._activeTarget!==t&&(this._clearActiveClass(this._config.target),this._activeTarget=t,t.classList.add(bs),this._activateParents(t),fe.trigger(this._element,ms,{relatedTarget:t}))}_activateParents(t){if(t.classList.contains("dropdown-item"))we.findOne(".dropdown-toggle",t.closest(".dropdown")).classList.add(bs);else for(const e of we.parents(t,".nav, .list-group"))for(const t of we.prev(e,ws))t.classList.add(bs)}_clearActiveClass(t){t.classList.remove(bs);const e=we.find(`${vs}.${bs}`,t);for(const t of e)t.classList.remove(bs)}static jQueryInterface(t){return this.each((function(){const e=Ts.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t]()}}))}}fe.on(window,_s,(()=>{for(const t of we.find('[data-bs-spy="scroll"]'))Ts.getOrCreateInstance(t)})),Qt(Ts);const Cs=".bs.tab",Os=`hide${Cs}`,xs=`hidden${Cs}`,ks=`show${Cs}`,Ls=`shown${Cs}`,Ss=`click${Cs}`,Ds=`keydown${Cs}`,$s=`load${Cs}`,Is="ArrowLeft",Ns="ArrowRight",Ps="ArrowUp",Ms="ArrowDown",js="Home",Fs="End",Hs="active",Bs="fade",Ws="show",zs=".dropdown-toggle",Rs=`:not(${zs})`,qs='[data-bs-toggle="tab"], [data-bs-toggle="pill"], [data-bs-toggle="list"]',Vs=`.nav-link${Rs}, .list-group-item${Rs}, [role="tab"]${Rs}, ${qs}`,Ys=`.${Hs}[data-bs-toggle="tab"], .${Hs}[data-bs-toggle="pill"], .${Hs}[data-bs-toggle="list"]`;class Ks extends ve{constructor(t){super(t),this._parent=this._element.closest('.list-group, .nav, [role="tablist"]'),this._parent&&(this._setInitialAttributes(this._parent,this._getChildren()),fe.on(this._element,Ds,(t=>this._keydown(t))))}static get NAME(){return"tab"}show(){const t=this._element;if(this._elemIsActive(t))return;const e=this._getActiveElem(),i=e?fe.trigger(e,Os,{relatedTarget:t}):null;fe.trigger(t,ks,{relatedTarget:e}).defaultPrevented||i&&i.defaultPrevented||(this._deactivate(e,t),this._activate(t,e))}_activate(t,e){t&&(t.classList.add(Hs),this._activate(we.getElementFromSelector(t)),this._queueCallback((()=>{"tab"===t.getAttribute("role")?(t.removeAttribute("tabindex"),t.setAttribute("aria-selected",!0),this._toggleDropDown(t,!0),fe.trigger(t,Ls,{relatedTarget:e})):t.classList.add(Ws)}),t,t.classList.contains(Bs)))}_deactivate(t,e){t&&(t.classList.remove(Hs),t.blur(),this._deactivate(we.getElementFromSelector(t)),this._queueCallback((()=>{"tab"===t.getAttribute("role")?(t.setAttribute("aria-selected",!1),t.setAttribute("tabindex","-1"),this._toggleDropDown(t,!1),fe.trigger(t,xs,{relatedTarget:e})):t.classList.remove(Ws)}),t,t.classList.contains(Bs)))}_keydown(t){if(![Is,Ns,Ps,Ms,js,Fs].includes(t.key))return;t.stopPropagation(),t.preventDefault();const e=this._getChildren().filter((t=>!Wt(t)));let i;if([js,Fs].includes(t.key))i=e[t.key===js?0:e.length-1];else{const n=[Ns,Ms].includes(t.key);i=Gt(e,t.target,n,!0)}i&&(i.focus({preventScroll:!0}),Ks.getOrCreateInstance(i).show())}_getChildren(){return we.find(Vs,this._parent)}_getActiveElem(){return this._getChildren().find((t=>this._elemIsActive(t)))||null}_setInitialAttributes(t,e){this._setAttributeIfNotExists(t,"role","tablist");for(const t of e)this._setInitialAttributesOnChild(t)}_setInitialAttributesOnChild(t){t=this._getInnerElement(t);const e=this._elemIsActive(t),i=this._getOuterElement(t);t.setAttribute("aria-selected",e),i!==t&&this._setAttributeIfNotExists(i,"role","presentation"),e||t.setAttribute("tabindex","-1"),this._setAttributeIfNotExists(t,"role","tab"),this._setInitialAttributesOnTargetPanel(t)}_setInitialAttributesOnTargetPanel(t){const e=we.getElementFromSelector(t);e&&(this._setAttributeIfNotExists(e,"role","tabpanel"),t.id&&this._setAttributeIfNotExists(e,"aria-labelledby",`${t.id}`))}_toggleDropDown(t,e){const i=this._getOuterElement(t);if(!i.classList.contains("dropdown"))return;const n=(t,n)=>{const s=we.findOne(t,i);s&&s.classList.toggle(n,e)};n(zs,Hs),n(".dropdown-menu",Ws),i.setAttribute("aria-expanded",e)}_setAttributeIfNotExists(t,e,i){t.hasAttribute(e)||t.setAttribute(e,i)}_elemIsActive(t){return t.classList.contains(Hs)}_getInnerElement(t){return t.matches(Vs)?t:we.findOne(Vs,t)}_getOuterElement(t){return t.closest(".nav-item, .list-group-item")||t}static jQueryInterface(t){return this.each((function(){const e=Ks.getOrCreateInstance(this);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t]()}}))}}fe.on(document,Ss,qs,(function(t){["A","AREA"].includes(this.tagName)&&t.preventDefault(),Wt(this)||Ks.getOrCreateInstance(this).show()})),fe.on(window,$s,(()=>{for(const t of we.find(Ys))Ks.getOrCreateInstance(t)})),Qt(Ks);const Qs=".bs.toast",Xs=`mouseover${Qs}`,Us=`mouseout${Qs}`,Gs=`focusin${Qs}`,Js=`focusout${Qs}`,Zs=`hide${Qs}`,to=`hidden${Qs}`,eo=`show${Qs}`,io=`shown${Qs}`,no="hide",so="show",oo="showing",ro={animation:"boolean",autohide:"boolean",delay:"number"},ao={animation:!0,autohide:!0,delay:5e3};class lo extends ve{constructor(t,e){super(t,e),this._timeout=null,this._hasMouseInteraction=!1,this._hasKeyboardInteraction=!1,this._setListeners()}static get Default(){return ao}static get DefaultType(){return ro}static get NAME(){return"toast"}show(){fe.trigger(this._element,eo).defaultPrevented||(this._clearTimeout(),this._config.animation&&this._element.classList.add("fade"),this._element.classList.remove(no),qt(this._element),this._element.classList.add(so,oo),this._queueCallback((()=>{this._element.classList.remove(oo),fe.trigger(this._element,io),this._maybeScheduleHide()}),this._element,this._config.animation))}hide(){this.isShown()&&(fe.trigger(this._element,Zs).defaultPrevented||(this._element.classList.add(oo),this._queueCallback((()=>{this._element.classList.add(no),this._element.classList.remove(oo,so),fe.trigger(this._element,to)}),this._element,this._config.animation)))}dispose(){this._clearTimeout(),this.isShown()&&this._element.classList.remove(so),super.dispose()}isShown(){return this._element.classList.contains(so)}_maybeScheduleHide(){this._config.autohide&&(this._hasMouseInteraction||this._hasKeyboardInteraction||(this._timeout=setTimeout((()=>{this.hide()}),this._config.delay)))}_onInteraction(t,e){switch(t.type){case"mouseover":case"mouseout":this._hasMouseInteraction=e;break;case"focusin":case"focusout":this._hasKeyboardInteraction=e}if(e)return void this._clearTimeout();const i=t.relatedTarget;this._element===i||this._element.contains(i)||this._maybeScheduleHide()}_setListeners(){fe.on(this._element,Xs,(t=>this._onInteraction(t,!0))),fe.on(this._element,Us,(t=>this._onInteraction(t,!1))),fe.on(this._element,Gs,(t=>this._onInteraction(t,!0))),fe.on(this._element,Js,(t=>this._onInteraction(t,!1)))}_clearTimeout(){clearTimeout(this._timeout),this._timeout=null}static jQueryInterface(t){return this.each((function(){const e=lo.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t](this)}}))}}function co(t){"loading"!=document.readyState?t():document.addEventListener("DOMContentLoaded",t)}Ee(lo),Qt(lo),co((function(){[].slice.call(document.querySelectorAll('[data-bs-toggle="tooltip"]')).map((function(t){return new hs(t,{delay:{show:500,hide:100}})}))})),co((function(){document.getElementById("pst-back-to-top").addEventListener("click",(function(){document.body.scrollTop=0,document.documentElement.scrollTop=0}))})),co((function(){var t=document.getElementById("pst-back-to-top"),e=document.getElementsByClassName("bd-header")[0].getBoundingClientRect();window.addEventListener("scroll",(function(){this.oldScroll>this.scrollY&&this.scrollY>e.bottom?t.style.display="block":t.style.display="none",this.oldScroll=this.scrollY}))})),window.bootstrap=i})(); +//# sourceMappingURL=bootstrap.js.map \ No newline at end of file diff --git a/_static/scripts/bootstrap.js.LICENSE.txt b/_static/scripts/bootstrap.js.LICENSE.txt new file mode 100644 index 00000000..10f979d0 --- /dev/null +++ b/_static/scripts/bootstrap.js.LICENSE.txt @@ -0,0 +1,5 @@ +/*! + * Bootstrap v5.3.2 (https://getbootstrap.com/) + * Copyright 2011-2023 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + */ diff --git a/_static/scripts/bootstrap.js.map b/_static/scripts/bootstrap.js.map new file mode 100644 index 00000000..64e212b1 --- /dev/null +++ b/_static/scripts/bootstrap.js.map @@ -0,0 +1 @@ +{"version":3,"file":"scripts/bootstrap.js","mappings":"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","sources":["webpack://pydata_sphinx_theme/webpack/bootstrap","webpack://pydata_sphinx_theme/webpack/runtime/define property getters","webpack://pydata_sphinx_theme/webpack/runtime/hasOwnProperty shorthand","webpack://pydata_sphinx_theme/webpack/runtime/make namespace object","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/enums.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/getNodeName.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/getWindow.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/instanceOf.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/modifiers/applyStyles.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/getBasePlacement.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/math.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/userAgent.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/isLayoutViewport.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/getBoundingClientRect.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/getLayoutRect.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/contains.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/getComputedStyle.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/isTableElement.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/getDocumentElement.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/getParentNode.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/getOffsetParent.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/getMainAxisFromPlacement.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/within.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/mergePaddingObject.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/getFreshSideObject.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/expandToHashMap.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/modifiers/arrow.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/getVariation.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/modifiers/computeStyles.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/modifiers/eventListeners.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/getOppositePlacement.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/getOppositeVariationPlacement.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/getWindowScroll.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/getWindowScrollBarX.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/isScrollParent.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/getScrollParent.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/listScrollParents.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/rectToClientRect.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/getClippingRect.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/getViewportRect.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/getDocumentRect.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/computeOffsets.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/detectOverflow.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/modifiers/flip.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/computeAutoPlacement.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/modifiers/hide.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/modifiers/offset.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/modifiers/popperOffsets.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/modifiers/preventOverflow.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/getAltAxis.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/getCompositeRect.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/getNodeScroll.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/getHTMLElementScroll.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/orderModifiers.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/createPopper.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/debounce.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/mergeByName.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/popper.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/popper-lite.js","webpack://pydata_sphinx_theme/./node_modules/bootstrap/dist/js/bootstrap.esm.js","webpack://pydata_sphinx_theme/./src/pydata_sphinx_theme/assets/scripts/mixin.js","webpack://pydata_sphinx_theme/./src/pydata_sphinx_theme/assets/scripts/bootstrap.js"],"sourcesContent":["// The require scope\nvar __webpack_require__ = {};\n\n","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","export var top = 'top';\nexport var bottom = 'bottom';\nexport var right = 'right';\nexport var left = 'left';\nexport var auto = 'auto';\nexport var basePlacements = [top, bottom, right, left];\nexport var start = 'start';\nexport var end = 'end';\nexport var clippingParents = 'clippingParents';\nexport var viewport = 'viewport';\nexport var popper = 'popper';\nexport var reference = 'reference';\nexport var variationPlacements = /*#__PURE__*/basePlacements.reduce(function (acc, placement) {\n return acc.concat([placement + \"-\" + start, placement + \"-\" + end]);\n}, []);\nexport var placements = /*#__PURE__*/[].concat(basePlacements, [auto]).reduce(function (acc, placement) {\n return acc.concat([placement, placement + \"-\" + start, placement + \"-\" + end]);\n}, []); // modifiers that need to read the DOM\n\nexport var beforeRead = 'beforeRead';\nexport var read = 'read';\nexport var afterRead = 'afterRead'; // pure-logic modifiers\n\nexport var beforeMain = 'beforeMain';\nexport var main = 'main';\nexport var afterMain = 'afterMain'; // modifier with the purpose to write to the DOM (or write into a framework state)\n\nexport var beforeWrite = 'beforeWrite';\nexport var write = 'write';\nexport var afterWrite = 'afterWrite';\nexport var modifierPhases = [beforeRead, read, afterRead, beforeMain, main, afterMain, beforeWrite, write, afterWrite];","export default function getNodeName(element) {\n return element ? (element.nodeName || '').toLowerCase() : null;\n}","export default function getWindow(node) {\n if (node == null) {\n return window;\n }\n\n if (node.toString() !== '[object Window]') {\n var ownerDocument = node.ownerDocument;\n return ownerDocument ? ownerDocument.defaultView || window : window;\n }\n\n return node;\n}","import getWindow from \"./getWindow.js\";\n\nfunction isElement(node) {\n var OwnElement = getWindow(node).Element;\n return node instanceof OwnElement || node instanceof Element;\n}\n\nfunction isHTMLElement(node) {\n var OwnElement = getWindow(node).HTMLElement;\n return node instanceof OwnElement || node instanceof HTMLElement;\n}\n\nfunction isShadowRoot(node) {\n // IE 11 has no ShadowRoot\n if (typeof ShadowRoot === 'undefined') {\n return false;\n }\n\n var OwnElement = getWindow(node).ShadowRoot;\n return node instanceof OwnElement || node instanceof ShadowRoot;\n}\n\nexport { isElement, isHTMLElement, isShadowRoot };","import getNodeName from \"../dom-utils/getNodeName.js\";\nimport { isHTMLElement } from \"../dom-utils/instanceOf.js\"; // This modifier takes the styles prepared by the `computeStyles` modifier\n// and applies them to the HTMLElements such as popper and arrow\n\nfunction applyStyles(_ref) {\n var state = _ref.state;\n Object.keys(state.elements).forEach(function (name) {\n var style = state.styles[name] || {};\n var attributes = state.attributes[name] || {};\n var element = state.elements[name]; // arrow is optional + virtual elements\n\n if (!isHTMLElement(element) || !getNodeName(element)) {\n return;\n } // Flow doesn't support to extend this property, but it's the most\n // effective way to apply styles to an HTMLElement\n // $FlowFixMe[cannot-write]\n\n\n Object.assign(element.style, style);\n Object.keys(attributes).forEach(function (name) {\n var value = attributes[name];\n\n if (value === false) {\n element.removeAttribute(name);\n } else {\n element.setAttribute(name, value === true ? '' : value);\n }\n });\n });\n}\n\nfunction effect(_ref2) {\n var state = _ref2.state;\n var initialStyles = {\n popper: {\n position: state.options.strategy,\n left: '0',\n top: '0',\n margin: '0'\n },\n arrow: {\n position: 'absolute'\n },\n reference: {}\n };\n Object.assign(state.elements.popper.style, initialStyles.popper);\n state.styles = initialStyles;\n\n if (state.elements.arrow) {\n Object.assign(state.elements.arrow.style, initialStyles.arrow);\n }\n\n return function () {\n Object.keys(state.elements).forEach(function (name) {\n var element = state.elements[name];\n var attributes = state.attributes[name] || {};\n var styleProperties = Object.keys(state.styles.hasOwnProperty(name) ? state.styles[name] : initialStyles[name]); // Set all values to an empty string to unset them\n\n var style = styleProperties.reduce(function (style, property) {\n style[property] = '';\n return style;\n }, {}); // arrow is optional + virtual elements\n\n if (!isHTMLElement(element) || !getNodeName(element)) {\n return;\n }\n\n Object.assign(element.style, style);\n Object.keys(attributes).forEach(function (attribute) {\n element.removeAttribute(attribute);\n });\n });\n };\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'applyStyles',\n enabled: true,\n phase: 'write',\n fn: applyStyles,\n effect: effect,\n requires: ['computeStyles']\n};","import { auto } from \"../enums.js\";\nexport default function getBasePlacement(placement) {\n return placement.split('-')[0];\n}","export var max = Math.max;\nexport var min = Math.min;\nexport var round = Math.round;","export default function getUAString() {\n var uaData = navigator.userAgentData;\n\n if (uaData != null && uaData.brands && Array.isArray(uaData.brands)) {\n return uaData.brands.map(function (item) {\n return item.brand + \"/\" + item.version;\n }).join(' ');\n }\n\n return navigator.userAgent;\n}","import getUAString from \"../utils/userAgent.js\";\nexport default function isLayoutViewport() {\n return !/^((?!chrome|android).)*safari/i.test(getUAString());\n}","import { isElement, isHTMLElement } from \"./instanceOf.js\";\nimport { round } from \"../utils/math.js\";\nimport getWindow from \"./getWindow.js\";\nimport isLayoutViewport from \"./isLayoutViewport.js\";\nexport default function getBoundingClientRect(element, includeScale, isFixedStrategy) {\n if (includeScale === void 0) {\n includeScale = false;\n }\n\n if (isFixedStrategy === void 0) {\n isFixedStrategy = false;\n }\n\n var clientRect = element.getBoundingClientRect();\n var scaleX = 1;\n var scaleY = 1;\n\n if (includeScale && isHTMLElement(element)) {\n scaleX = element.offsetWidth > 0 ? round(clientRect.width) / element.offsetWidth || 1 : 1;\n scaleY = element.offsetHeight > 0 ? round(clientRect.height) / element.offsetHeight || 1 : 1;\n }\n\n var _ref = isElement(element) ? getWindow(element) : window,\n visualViewport = _ref.visualViewport;\n\n var addVisualOffsets = !isLayoutViewport() && isFixedStrategy;\n var x = (clientRect.left + (addVisualOffsets && visualViewport ? visualViewport.offsetLeft : 0)) / scaleX;\n var y = (clientRect.top + (addVisualOffsets && visualViewport ? visualViewport.offsetTop : 0)) / scaleY;\n var width = clientRect.width / scaleX;\n var height = clientRect.height / scaleY;\n return {\n width: width,\n height: height,\n top: y,\n right: x + width,\n bottom: y + height,\n left: x,\n x: x,\n y: y\n };\n}","import getBoundingClientRect from \"./getBoundingClientRect.js\"; // Returns the layout rect of an element relative to its offsetParent. Layout\n// means it doesn't take into account transforms.\n\nexport default function getLayoutRect(element) {\n var clientRect = getBoundingClientRect(element); // Use the clientRect sizes if it's not been transformed.\n // Fixes https://github.com/popperjs/popper-core/issues/1223\n\n var width = element.offsetWidth;\n var height = element.offsetHeight;\n\n if (Math.abs(clientRect.width - width) <= 1) {\n width = clientRect.width;\n }\n\n if (Math.abs(clientRect.height - height) <= 1) {\n height = clientRect.height;\n }\n\n return {\n x: element.offsetLeft,\n y: element.offsetTop,\n width: width,\n height: height\n };\n}","import { isShadowRoot } from \"./instanceOf.js\";\nexport default function contains(parent, child) {\n var rootNode = child.getRootNode && child.getRootNode(); // First, attempt with faster native method\n\n if (parent.contains(child)) {\n return true;\n } // then fallback to custom implementation with Shadow DOM support\n else if (rootNode && isShadowRoot(rootNode)) {\n var next = child;\n\n do {\n if (next && parent.isSameNode(next)) {\n return true;\n } // $FlowFixMe[prop-missing]: need a better way to handle this...\n\n\n next = next.parentNode || next.host;\n } while (next);\n } // Give up, the result is false\n\n\n return false;\n}","import getWindow from \"./getWindow.js\";\nexport default function getComputedStyle(element) {\n return getWindow(element).getComputedStyle(element);\n}","import getNodeName from \"./getNodeName.js\";\nexport default function isTableElement(element) {\n return ['table', 'td', 'th'].indexOf(getNodeName(element)) >= 0;\n}","import { isElement } from \"./instanceOf.js\";\nexport default function getDocumentElement(element) {\n // $FlowFixMe[incompatible-return]: assume body is always available\n return ((isElement(element) ? element.ownerDocument : // $FlowFixMe[prop-missing]\n element.document) || window.document).documentElement;\n}","import getNodeName from \"./getNodeName.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport { isShadowRoot } from \"./instanceOf.js\";\nexport default function getParentNode(element) {\n if (getNodeName(element) === 'html') {\n return element;\n }\n\n return (// this is a quicker (but less type safe) way to save quite some bytes from the bundle\n // $FlowFixMe[incompatible-return]\n // $FlowFixMe[prop-missing]\n element.assignedSlot || // step into the shadow DOM of the parent of a slotted node\n element.parentNode || ( // DOM Element detected\n isShadowRoot(element) ? element.host : null) || // ShadowRoot detected\n // $FlowFixMe[incompatible-call]: HTMLElement is a Node\n getDocumentElement(element) // fallback\n\n );\n}","import getWindow from \"./getWindow.js\";\nimport getNodeName from \"./getNodeName.js\";\nimport getComputedStyle from \"./getComputedStyle.js\";\nimport { isHTMLElement, isShadowRoot } from \"./instanceOf.js\";\nimport isTableElement from \"./isTableElement.js\";\nimport getParentNode from \"./getParentNode.js\";\nimport getUAString from \"../utils/userAgent.js\";\n\nfunction getTrueOffsetParent(element) {\n if (!isHTMLElement(element) || // https://github.com/popperjs/popper-core/issues/837\n getComputedStyle(element).position === 'fixed') {\n return null;\n }\n\n return element.offsetParent;\n} // `.offsetParent` reports `null` for fixed elements, while absolute elements\n// return the containing block\n\n\nfunction getContainingBlock(element) {\n var isFirefox = /firefox/i.test(getUAString());\n var isIE = /Trident/i.test(getUAString());\n\n if (isIE && isHTMLElement(element)) {\n // In IE 9, 10 and 11 fixed elements containing block is always established by the viewport\n var elementCss = getComputedStyle(element);\n\n if (elementCss.position === 'fixed') {\n return null;\n }\n }\n\n var currentNode = getParentNode(element);\n\n if (isShadowRoot(currentNode)) {\n currentNode = currentNode.host;\n }\n\n while (isHTMLElement(currentNode) && ['html', 'body'].indexOf(getNodeName(currentNode)) < 0) {\n var css = getComputedStyle(currentNode); // This is non-exhaustive but covers the most common CSS properties that\n // create a containing block.\n // https://developer.mozilla.org/en-US/docs/Web/CSS/Containing_block#identifying_the_containing_block\n\n if (css.transform !== 'none' || css.perspective !== 'none' || css.contain === 'paint' || ['transform', 'perspective'].indexOf(css.willChange) !== -1 || isFirefox && css.willChange === 'filter' || isFirefox && css.filter && css.filter !== 'none') {\n return currentNode;\n } else {\n currentNode = currentNode.parentNode;\n }\n }\n\n return null;\n} // Gets the closest ancestor positioned element. Handles some edge cases,\n// such as table ancestors and cross browser bugs.\n\n\nexport default function getOffsetParent(element) {\n var window = getWindow(element);\n var offsetParent = getTrueOffsetParent(element);\n\n while (offsetParent && isTableElement(offsetParent) && getComputedStyle(offsetParent).position === 'static') {\n offsetParent = getTrueOffsetParent(offsetParent);\n }\n\n if (offsetParent && (getNodeName(offsetParent) === 'html' || getNodeName(offsetParent) === 'body' && getComputedStyle(offsetParent).position === 'static')) {\n return window;\n }\n\n return offsetParent || getContainingBlock(element) || window;\n}","export default function getMainAxisFromPlacement(placement) {\n return ['top', 'bottom'].indexOf(placement) >= 0 ? 'x' : 'y';\n}","import { max as mathMax, min as mathMin } from \"./math.js\";\nexport function within(min, value, max) {\n return mathMax(min, mathMin(value, max));\n}\nexport function withinMaxClamp(min, value, max) {\n var v = within(min, value, max);\n return v > max ? max : v;\n}","import getFreshSideObject from \"./getFreshSideObject.js\";\nexport default function mergePaddingObject(paddingObject) {\n return Object.assign({}, getFreshSideObject(), paddingObject);\n}","export default function getFreshSideObject() {\n return {\n top: 0,\n right: 0,\n bottom: 0,\n left: 0\n };\n}","export default function expandToHashMap(value, keys) {\n return keys.reduce(function (hashMap, key) {\n hashMap[key] = value;\n return hashMap;\n }, {});\n}","import getBasePlacement from \"../utils/getBasePlacement.js\";\nimport getLayoutRect from \"../dom-utils/getLayoutRect.js\";\nimport contains from \"../dom-utils/contains.js\";\nimport getOffsetParent from \"../dom-utils/getOffsetParent.js\";\nimport getMainAxisFromPlacement from \"../utils/getMainAxisFromPlacement.js\";\nimport { within } from \"../utils/within.js\";\nimport mergePaddingObject from \"../utils/mergePaddingObject.js\";\nimport expandToHashMap from \"../utils/expandToHashMap.js\";\nimport { left, right, basePlacements, top, bottom } from \"../enums.js\"; // eslint-disable-next-line import/no-unused-modules\n\nvar toPaddingObject = function toPaddingObject(padding, state) {\n padding = typeof padding === 'function' ? padding(Object.assign({}, state.rects, {\n placement: state.placement\n })) : padding;\n return mergePaddingObject(typeof padding !== 'number' ? padding : expandToHashMap(padding, basePlacements));\n};\n\nfunction arrow(_ref) {\n var _state$modifiersData$;\n\n var state = _ref.state,\n name = _ref.name,\n options = _ref.options;\n var arrowElement = state.elements.arrow;\n var popperOffsets = state.modifiersData.popperOffsets;\n var basePlacement = getBasePlacement(state.placement);\n var axis = getMainAxisFromPlacement(basePlacement);\n var isVertical = [left, right].indexOf(basePlacement) >= 0;\n var len = isVertical ? 'height' : 'width';\n\n if (!arrowElement || !popperOffsets) {\n return;\n }\n\n var paddingObject = toPaddingObject(options.padding, state);\n var arrowRect = getLayoutRect(arrowElement);\n var minProp = axis === 'y' ? top : left;\n var maxProp = axis === 'y' ? bottom : right;\n var endDiff = state.rects.reference[len] + state.rects.reference[axis] - popperOffsets[axis] - state.rects.popper[len];\n var startDiff = popperOffsets[axis] - state.rects.reference[axis];\n var arrowOffsetParent = getOffsetParent(arrowElement);\n var clientSize = arrowOffsetParent ? axis === 'y' ? arrowOffsetParent.clientHeight || 0 : arrowOffsetParent.clientWidth || 0 : 0;\n var centerToReference = endDiff / 2 - startDiff / 2; // Make sure the arrow doesn't overflow the popper if the center point is\n // outside of the popper bounds\n\n var min = paddingObject[minProp];\n var max = clientSize - arrowRect[len] - paddingObject[maxProp];\n var center = clientSize / 2 - arrowRect[len] / 2 + centerToReference;\n var offset = within(min, center, max); // Prevents breaking syntax highlighting...\n\n var axisProp = axis;\n state.modifiersData[name] = (_state$modifiersData$ = {}, _state$modifiersData$[axisProp] = offset, _state$modifiersData$.centerOffset = offset - center, _state$modifiersData$);\n}\n\nfunction effect(_ref2) {\n var state = _ref2.state,\n options = _ref2.options;\n var _options$element = options.element,\n arrowElement = _options$element === void 0 ? '[data-popper-arrow]' : _options$element;\n\n if (arrowElement == null) {\n return;\n } // CSS selector\n\n\n if (typeof arrowElement === 'string') {\n arrowElement = state.elements.popper.querySelector(arrowElement);\n\n if (!arrowElement) {\n return;\n }\n }\n\n if (!contains(state.elements.popper, arrowElement)) {\n return;\n }\n\n state.elements.arrow = arrowElement;\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'arrow',\n enabled: true,\n phase: 'main',\n fn: arrow,\n effect: effect,\n requires: ['popperOffsets'],\n requiresIfExists: ['preventOverflow']\n};","export default function getVariation(placement) {\n return placement.split('-')[1];\n}","import { top, left, right, bottom, end } from \"../enums.js\";\nimport getOffsetParent from \"../dom-utils/getOffsetParent.js\";\nimport getWindow from \"../dom-utils/getWindow.js\";\nimport getDocumentElement from \"../dom-utils/getDocumentElement.js\";\nimport getComputedStyle from \"../dom-utils/getComputedStyle.js\";\nimport getBasePlacement from \"../utils/getBasePlacement.js\";\nimport getVariation from \"../utils/getVariation.js\";\nimport { round } from \"../utils/math.js\"; // eslint-disable-next-line import/no-unused-modules\n\nvar unsetSides = {\n top: 'auto',\n right: 'auto',\n bottom: 'auto',\n left: 'auto'\n}; // Round the offsets to the nearest suitable subpixel based on the DPR.\n// Zooming can change the DPR, but it seems to report a value that will\n// cleanly divide the values into the appropriate subpixels.\n\nfunction roundOffsetsByDPR(_ref, win) {\n var x = _ref.x,\n y = _ref.y;\n var dpr = win.devicePixelRatio || 1;\n return {\n x: round(x * dpr) / dpr || 0,\n y: round(y * dpr) / dpr || 0\n };\n}\n\nexport function mapToStyles(_ref2) {\n var _Object$assign2;\n\n var popper = _ref2.popper,\n popperRect = _ref2.popperRect,\n placement = _ref2.placement,\n variation = _ref2.variation,\n offsets = _ref2.offsets,\n position = _ref2.position,\n gpuAcceleration = _ref2.gpuAcceleration,\n adaptive = _ref2.adaptive,\n roundOffsets = _ref2.roundOffsets,\n isFixed = _ref2.isFixed;\n var _offsets$x = offsets.x,\n x = _offsets$x === void 0 ? 0 : _offsets$x,\n _offsets$y = offsets.y,\n y = _offsets$y === void 0 ? 0 : _offsets$y;\n\n var _ref3 = typeof roundOffsets === 'function' ? roundOffsets({\n x: x,\n y: y\n }) : {\n x: x,\n y: y\n };\n\n x = _ref3.x;\n y = _ref3.y;\n var hasX = offsets.hasOwnProperty('x');\n var hasY = offsets.hasOwnProperty('y');\n var sideX = left;\n var sideY = top;\n var win = window;\n\n if (adaptive) {\n var offsetParent = getOffsetParent(popper);\n var heightProp = 'clientHeight';\n var widthProp = 'clientWidth';\n\n if (offsetParent === getWindow(popper)) {\n offsetParent = getDocumentElement(popper);\n\n if (getComputedStyle(offsetParent).position !== 'static' && position === 'absolute') {\n heightProp = 'scrollHeight';\n widthProp = 'scrollWidth';\n }\n } // $FlowFixMe[incompatible-cast]: force type refinement, we compare offsetParent with window above, but Flow doesn't detect it\n\n\n offsetParent = offsetParent;\n\n if (placement === top || (placement === left || placement === right) && variation === end) {\n sideY = bottom;\n var offsetY = isFixed && offsetParent === win && win.visualViewport ? win.visualViewport.height : // $FlowFixMe[prop-missing]\n offsetParent[heightProp];\n y -= offsetY - popperRect.height;\n y *= gpuAcceleration ? 1 : -1;\n }\n\n if (placement === left || (placement === top || placement === bottom) && variation === end) {\n sideX = right;\n var offsetX = isFixed && offsetParent === win && win.visualViewport ? win.visualViewport.width : // $FlowFixMe[prop-missing]\n offsetParent[widthProp];\n x -= offsetX - popperRect.width;\n x *= gpuAcceleration ? 1 : -1;\n }\n }\n\n var commonStyles = Object.assign({\n position: position\n }, adaptive && unsetSides);\n\n var _ref4 = roundOffsets === true ? roundOffsetsByDPR({\n x: x,\n y: y\n }, getWindow(popper)) : {\n x: x,\n y: y\n };\n\n x = _ref4.x;\n y = _ref4.y;\n\n if (gpuAcceleration) {\n var _Object$assign;\n\n return Object.assign({}, commonStyles, (_Object$assign = {}, _Object$assign[sideY] = hasY ? '0' : '', _Object$assign[sideX] = hasX ? '0' : '', _Object$assign.transform = (win.devicePixelRatio || 1) <= 1 ? \"translate(\" + x + \"px, \" + y + \"px)\" : \"translate3d(\" + x + \"px, \" + y + \"px, 0)\", _Object$assign));\n }\n\n return Object.assign({}, commonStyles, (_Object$assign2 = {}, _Object$assign2[sideY] = hasY ? y + \"px\" : '', _Object$assign2[sideX] = hasX ? x + \"px\" : '', _Object$assign2.transform = '', _Object$assign2));\n}\n\nfunction computeStyles(_ref5) {\n var state = _ref5.state,\n options = _ref5.options;\n var _options$gpuAccelerat = options.gpuAcceleration,\n gpuAcceleration = _options$gpuAccelerat === void 0 ? true : _options$gpuAccelerat,\n _options$adaptive = options.adaptive,\n adaptive = _options$adaptive === void 0 ? true : _options$adaptive,\n _options$roundOffsets = options.roundOffsets,\n roundOffsets = _options$roundOffsets === void 0 ? true : _options$roundOffsets;\n var commonStyles = {\n placement: getBasePlacement(state.placement),\n variation: getVariation(state.placement),\n popper: state.elements.popper,\n popperRect: state.rects.popper,\n gpuAcceleration: gpuAcceleration,\n isFixed: state.options.strategy === 'fixed'\n };\n\n if (state.modifiersData.popperOffsets != null) {\n state.styles.popper = Object.assign({}, state.styles.popper, mapToStyles(Object.assign({}, commonStyles, {\n offsets: state.modifiersData.popperOffsets,\n position: state.options.strategy,\n adaptive: adaptive,\n roundOffsets: roundOffsets\n })));\n }\n\n if (state.modifiersData.arrow != null) {\n state.styles.arrow = Object.assign({}, state.styles.arrow, mapToStyles(Object.assign({}, commonStyles, {\n offsets: state.modifiersData.arrow,\n position: 'absolute',\n adaptive: false,\n roundOffsets: roundOffsets\n })));\n }\n\n state.attributes.popper = Object.assign({}, state.attributes.popper, {\n 'data-popper-placement': state.placement\n });\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'computeStyles',\n enabled: true,\n phase: 'beforeWrite',\n fn: computeStyles,\n data: {}\n};","import getWindow from \"../dom-utils/getWindow.js\"; // eslint-disable-next-line import/no-unused-modules\n\nvar passive = {\n passive: true\n};\n\nfunction effect(_ref) {\n var state = _ref.state,\n instance = _ref.instance,\n options = _ref.options;\n var _options$scroll = options.scroll,\n scroll = _options$scroll === void 0 ? true : _options$scroll,\n _options$resize = options.resize,\n resize = _options$resize === void 0 ? true : _options$resize;\n var window = getWindow(state.elements.popper);\n var scrollParents = [].concat(state.scrollParents.reference, state.scrollParents.popper);\n\n if (scroll) {\n scrollParents.forEach(function (scrollParent) {\n scrollParent.addEventListener('scroll', instance.update, passive);\n });\n }\n\n if (resize) {\n window.addEventListener('resize', instance.update, passive);\n }\n\n return function () {\n if (scroll) {\n scrollParents.forEach(function (scrollParent) {\n scrollParent.removeEventListener('scroll', instance.update, passive);\n });\n }\n\n if (resize) {\n window.removeEventListener('resize', instance.update, passive);\n }\n };\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'eventListeners',\n enabled: true,\n phase: 'write',\n fn: function fn() {},\n effect: effect,\n data: {}\n};","var hash = {\n left: 'right',\n right: 'left',\n bottom: 'top',\n top: 'bottom'\n};\nexport default function getOppositePlacement(placement) {\n return placement.replace(/left|right|bottom|top/g, function (matched) {\n return hash[matched];\n });\n}","var hash = {\n start: 'end',\n end: 'start'\n};\nexport default function getOppositeVariationPlacement(placement) {\n return placement.replace(/start|end/g, function (matched) {\n return hash[matched];\n });\n}","import getWindow from \"./getWindow.js\";\nexport default function getWindowScroll(node) {\n var win = getWindow(node);\n var scrollLeft = win.pageXOffset;\n var scrollTop = win.pageYOffset;\n return {\n scrollLeft: scrollLeft,\n scrollTop: scrollTop\n };\n}","import getBoundingClientRect from \"./getBoundingClientRect.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport getWindowScroll from \"./getWindowScroll.js\";\nexport default function getWindowScrollBarX(element) {\n // If has a CSS width greater than the viewport, then this will be\n // incorrect for RTL.\n // Popper 1 is broken in this case and never had a bug report so let's assume\n // it's not an issue. I don't think anyone ever specifies width on \n // anyway.\n // Browsers where the left scrollbar doesn't cause an issue report `0` for\n // this (e.g. Edge 2019, IE11, Safari)\n return getBoundingClientRect(getDocumentElement(element)).left + getWindowScroll(element).scrollLeft;\n}","import getComputedStyle from \"./getComputedStyle.js\";\nexport default function isScrollParent(element) {\n // Firefox wants us to check `-x` and `-y` variations as well\n var _getComputedStyle = getComputedStyle(element),\n overflow = _getComputedStyle.overflow,\n overflowX = _getComputedStyle.overflowX,\n overflowY = _getComputedStyle.overflowY;\n\n return /auto|scroll|overlay|hidden/.test(overflow + overflowY + overflowX);\n}","import getParentNode from \"./getParentNode.js\";\nimport isScrollParent from \"./isScrollParent.js\";\nimport getNodeName from \"./getNodeName.js\";\nimport { isHTMLElement } from \"./instanceOf.js\";\nexport default function getScrollParent(node) {\n if (['html', 'body', '#document'].indexOf(getNodeName(node)) >= 0) {\n // $FlowFixMe[incompatible-return]: assume body is always available\n return node.ownerDocument.body;\n }\n\n if (isHTMLElement(node) && isScrollParent(node)) {\n return node;\n }\n\n return getScrollParent(getParentNode(node));\n}","import getScrollParent from \"./getScrollParent.js\";\nimport getParentNode from \"./getParentNode.js\";\nimport getWindow from \"./getWindow.js\";\nimport isScrollParent from \"./isScrollParent.js\";\n/*\ngiven a DOM element, return the list of all scroll parents, up the list of ancesors\nuntil we get to the top window object. This list is what we attach scroll listeners\nto, because if any of these parent elements scroll, we'll need to re-calculate the\nreference element's position.\n*/\n\nexport default function listScrollParents(element, list) {\n var _element$ownerDocumen;\n\n if (list === void 0) {\n list = [];\n }\n\n var scrollParent = getScrollParent(element);\n var isBody = scrollParent === ((_element$ownerDocumen = element.ownerDocument) == null ? void 0 : _element$ownerDocumen.body);\n var win = getWindow(scrollParent);\n var target = isBody ? [win].concat(win.visualViewport || [], isScrollParent(scrollParent) ? scrollParent : []) : scrollParent;\n var updatedList = list.concat(target);\n return isBody ? updatedList : // $FlowFixMe[incompatible-call]: isBody tells us target will be an HTMLElement here\n updatedList.concat(listScrollParents(getParentNode(target)));\n}","export default function rectToClientRect(rect) {\n return Object.assign({}, rect, {\n left: rect.x,\n top: rect.y,\n right: rect.x + rect.width,\n bottom: rect.y + rect.height\n });\n}","import { viewport } from \"../enums.js\";\nimport getViewportRect from \"./getViewportRect.js\";\nimport getDocumentRect from \"./getDocumentRect.js\";\nimport listScrollParents from \"./listScrollParents.js\";\nimport getOffsetParent from \"./getOffsetParent.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport getComputedStyle from \"./getComputedStyle.js\";\nimport { isElement, isHTMLElement } from \"./instanceOf.js\";\nimport getBoundingClientRect from \"./getBoundingClientRect.js\";\nimport getParentNode from \"./getParentNode.js\";\nimport contains from \"./contains.js\";\nimport getNodeName from \"./getNodeName.js\";\nimport rectToClientRect from \"../utils/rectToClientRect.js\";\nimport { max, min } from \"../utils/math.js\";\n\nfunction getInnerBoundingClientRect(element, strategy) {\n var rect = getBoundingClientRect(element, false, strategy === 'fixed');\n rect.top = rect.top + element.clientTop;\n rect.left = rect.left + element.clientLeft;\n rect.bottom = rect.top + element.clientHeight;\n rect.right = rect.left + element.clientWidth;\n rect.width = element.clientWidth;\n rect.height = element.clientHeight;\n rect.x = rect.left;\n rect.y = rect.top;\n return rect;\n}\n\nfunction getClientRectFromMixedType(element, clippingParent, strategy) {\n return clippingParent === viewport ? rectToClientRect(getViewportRect(element, strategy)) : isElement(clippingParent) ? getInnerBoundingClientRect(clippingParent, strategy) : rectToClientRect(getDocumentRect(getDocumentElement(element)));\n} // A \"clipping parent\" is an overflowable container with the characteristic of\n// clipping (or hiding) overflowing elements with a position different from\n// `initial`\n\n\nfunction getClippingParents(element) {\n var clippingParents = listScrollParents(getParentNode(element));\n var canEscapeClipping = ['absolute', 'fixed'].indexOf(getComputedStyle(element).position) >= 0;\n var clipperElement = canEscapeClipping && isHTMLElement(element) ? getOffsetParent(element) : element;\n\n if (!isElement(clipperElement)) {\n return [];\n } // $FlowFixMe[incompatible-return]: https://github.com/facebook/flow/issues/1414\n\n\n return clippingParents.filter(function (clippingParent) {\n return isElement(clippingParent) && contains(clippingParent, clipperElement) && getNodeName(clippingParent) !== 'body';\n });\n} // Gets the maximum area that the element is visible in due to any number of\n// clipping parents\n\n\nexport default function getClippingRect(element, boundary, rootBoundary, strategy) {\n var mainClippingParents = boundary === 'clippingParents' ? getClippingParents(element) : [].concat(boundary);\n var clippingParents = [].concat(mainClippingParents, [rootBoundary]);\n var firstClippingParent = clippingParents[0];\n var clippingRect = clippingParents.reduce(function (accRect, clippingParent) {\n var rect = getClientRectFromMixedType(element, clippingParent, strategy);\n accRect.top = max(rect.top, accRect.top);\n accRect.right = min(rect.right, accRect.right);\n accRect.bottom = min(rect.bottom, accRect.bottom);\n accRect.left = max(rect.left, accRect.left);\n return accRect;\n }, getClientRectFromMixedType(element, firstClippingParent, strategy));\n clippingRect.width = clippingRect.right - clippingRect.left;\n clippingRect.height = clippingRect.bottom - clippingRect.top;\n clippingRect.x = clippingRect.left;\n clippingRect.y = clippingRect.top;\n return clippingRect;\n}","import getWindow from \"./getWindow.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport getWindowScrollBarX from \"./getWindowScrollBarX.js\";\nimport isLayoutViewport from \"./isLayoutViewport.js\";\nexport default function getViewportRect(element, strategy) {\n var win = getWindow(element);\n var html = getDocumentElement(element);\n var visualViewport = win.visualViewport;\n var width = html.clientWidth;\n var height = html.clientHeight;\n var x = 0;\n var y = 0;\n\n if (visualViewport) {\n width = visualViewport.width;\n height = visualViewport.height;\n var layoutViewport = isLayoutViewport();\n\n if (layoutViewport || !layoutViewport && strategy === 'fixed') {\n x = visualViewport.offsetLeft;\n y = visualViewport.offsetTop;\n }\n }\n\n return {\n width: width,\n height: height,\n x: x + getWindowScrollBarX(element),\n y: y\n };\n}","import getDocumentElement from \"./getDocumentElement.js\";\nimport getComputedStyle from \"./getComputedStyle.js\";\nimport getWindowScrollBarX from \"./getWindowScrollBarX.js\";\nimport getWindowScroll from \"./getWindowScroll.js\";\nimport { max } from \"../utils/math.js\"; // Gets the entire size of the scrollable document area, even extending outside\n// of the `` and `` rect bounds if horizontally scrollable\n\nexport default function getDocumentRect(element) {\n var _element$ownerDocumen;\n\n var html = getDocumentElement(element);\n var winScroll = getWindowScroll(element);\n var body = (_element$ownerDocumen = element.ownerDocument) == null ? void 0 : _element$ownerDocumen.body;\n var width = max(html.scrollWidth, html.clientWidth, body ? body.scrollWidth : 0, body ? body.clientWidth : 0);\n var height = max(html.scrollHeight, html.clientHeight, body ? body.scrollHeight : 0, body ? body.clientHeight : 0);\n var x = -winScroll.scrollLeft + getWindowScrollBarX(element);\n var y = -winScroll.scrollTop;\n\n if (getComputedStyle(body || html).direction === 'rtl') {\n x += max(html.clientWidth, body ? body.clientWidth : 0) - width;\n }\n\n return {\n width: width,\n height: height,\n x: x,\n y: y\n };\n}","import getBasePlacement from \"./getBasePlacement.js\";\nimport getVariation from \"./getVariation.js\";\nimport getMainAxisFromPlacement from \"./getMainAxisFromPlacement.js\";\nimport { top, right, bottom, left, start, end } from \"../enums.js\";\nexport default function computeOffsets(_ref) {\n var reference = _ref.reference,\n element = _ref.element,\n placement = _ref.placement;\n var basePlacement = placement ? getBasePlacement(placement) : null;\n var variation = placement ? getVariation(placement) : null;\n var commonX = reference.x + reference.width / 2 - element.width / 2;\n var commonY = reference.y + reference.height / 2 - element.height / 2;\n var offsets;\n\n switch (basePlacement) {\n case top:\n offsets = {\n x: commonX,\n y: reference.y - element.height\n };\n break;\n\n case bottom:\n offsets = {\n x: commonX,\n y: reference.y + reference.height\n };\n break;\n\n case right:\n offsets = {\n x: reference.x + reference.width,\n y: commonY\n };\n break;\n\n case left:\n offsets = {\n x: reference.x - element.width,\n y: commonY\n };\n break;\n\n default:\n offsets = {\n x: reference.x,\n y: reference.y\n };\n }\n\n var mainAxis = basePlacement ? getMainAxisFromPlacement(basePlacement) : null;\n\n if (mainAxis != null) {\n var len = mainAxis === 'y' ? 'height' : 'width';\n\n switch (variation) {\n case start:\n offsets[mainAxis] = offsets[mainAxis] - (reference[len] / 2 - element[len] / 2);\n break;\n\n case end:\n offsets[mainAxis] = offsets[mainAxis] + (reference[len] / 2 - element[len] / 2);\n break;\n\n default:\n }\n }\n\n return offsets;\n}","import getClippingRect from \"../dom-utils/getClippingRect.js\";\nimport getDocumentElement from \"../dom-utils/getDocumentElement.js\";\nimport getBoundingClientRect from \"../dom-utils/getBoundingClientRect.js\";\nimport computeOffsets from \"./computeOffsets.js\";\nimport rectToClientRect from \"./rectToClientRect.js\";\nimport { clippingParents, reference, popper, bottom, top, right, basePlacements, viewport } from \"../enums.js\";\nimport { isElement } from \"../dom-utils/instanceOf.js\";\nimport mergePaddingObject from \"./mergePaddingObject.js\";\nimport expandToHashMap from \"./expandToHashMap.js\"; // eslint-disable-next-line import/no-unused-modules\n\nexport default function detectOverflow(state, options) {\n if (options === void 0) {\n options = {};\n }\n\n var _options = options,\n _options$placement = _options.placement,\n placement = _options$placement === void 0 ? state.placement : _options$placement,\n _options$strategy = _options.strategy,\n strategy = _options$strategy === void 0 ? state.strategy : _options$strategy,\n _options$boundary = _options.boundary,\n boundary = _options$boundary === void 0 ? clippingParents : _options$boundary,\n _options$rootBoundary = _options.rootBoundary,\n rootBoundary = _options$rootBoundary === void 0 ? viewport : _options$rootBoundary,\n _options$elementConte = _options.elementContext,\n elementContext = _options$elementConte === void 0 ? popper : _options$elementConte,\n _options$altBoundary = _options.altBoundary,\n altBoundary = _options$altBoundary === void 0 ? false : _options$altBoundary,\n _options$padding = _options.padding,\n padding = _options$padding === void 0 ? 0 : _options$padding;\n var paddingObject = mergePaddingObject(typeof padding !== 'number' ? padding : expandToHashMap(padding, basePlacements));\n var altContext = elementContext === popper ? reference : popper;\n var popperRect = state.rects.popper;\n var element = state.elements[altBoundary ? altContext : elementContext];\n var clippingClientRect = getClippingRect(isElement(element) ? element : element.contextElement || getDocumentElement(state.elements.popper), boundary, rootBoundary, strategy);\n var referenceClientRect = getBoundingClientRect(state.elements.reference);\n var popperOffsets = computeOffsets({\n reference: referenceClientRect,\n element: popperRect,\n strategy: 'absolute',\n placement: placement\n });\n var popperClientRect = rectToClientRect(Object.assign({}, popperRect, popperOffsets));\n var elementClientRect = elementContext === popper ? popperClientRect : referenceClientRect; // positive = overflowing the clipping rect\n // 0 or negative = within the clipping rect\n\n var overflowOffsets = {\n top: clippingClientRect.top - elementClientRect.top + paddingObject.top,\n bottom: elementClientRect.bottom - clippingClientRect.bottom + paddingObject.bottom,\n left: clippingClientRect.left - elementClientRect.left + paddingObject.left,\n right: elementClientRect.right - clippingClientRect.right + paddingObject.right\n };\n var offsetData = state.modifiersData.offset; // Offsets can be applied only to the popper element\n\n if (elementContext === popper && offsetData) {\n var offset = offsetData[placement];\n Object.keys(overflowOffsets).forEach(function (key) {\n var multiply = [right, bottom].indexOf(key) >= 0 ? 1 : -1;\n var axis = [top, bottom].indexOf(key) >= 0 ? 'y' : 'x';\n overflowOffsets[key] += offset[axis] * multiply;\n });\n }\n\n return overflowOffsets;\n}","import getOppositePlacement from \"../utils/getOppositePlacement.js\";\nimport getBasePlacement from \"../utils/getBasePlacement.js\";\nimport getOppositeVariationPlacement from \"../utils/getOppositeVariationPlacement.js\";\nimport detectOverflow from \"../utils/detectOverflow.js\";\nimport computeAutoPlacement from \"../utils/computeAutoPlacement.js\";\nimport { bottom, top, start, right, left, auto } from \"../enums.js\";\nimport getVariation from \"../utils/getVariation.js\"; // eslint-disable-next-line import/no-unused-modules\n\nfunction getExpandedFallbackPlacements(placement) {\n if (getBasePlacement(placement) === auto) {\n return [];\n }\n\n var oppositePlacement = getOppositePlacement(placement);\n return [getOppositeVariationPlacement(placement), oppositePlacement, getOppositeVariationPlacement(oppositePlacement)];\n}\n\nfunction flip(_ref) {\n var state = _ref.state,\n options = _ref.options,\n name = _ref.name;\n\n if (state.modifiersData[name]._skip) {\n return;\n }\n\n var _options$mainAxis = options.mainAxis,\n checkMainAxis = _options$mainAxis === void 0 ? true : _options$mainAxis,\n _options$altAxis = options.altAxis,\n checkAltAxis = _options$altAxis === void 0 ? true : _options$altAxis,\n specifiedFallbackPlacements = options.fallbackPlacements,\n padding = options.padding,\n boundary = options.boundary,\n rootBoundary = options.rootBoundary,\n altBoundary = options.altBoundary,\n _options$flipVariatio = options.flipVariations,\n flipVariations = _options$flipVariatio === void 0 ? true : _options$flipVariatio,\n allowedAutoPlacements = options.allowedAutoPlacements;\n var preferredPlacement = state.options.placement;\n var basePlacement = getBasePlacement(preferredPlacement);\n var isBasePlacement = basePlacement === preferredPlacement;\n var fallbackPlacements = specifiedFallbackPlacements || (isBasePlacement || !flipVariations ? [getOppositePlacement(preferredPlacement)] : getExpandedFallbackPlacements(preferredPlacement));\n var placements = [preferredPlacement].concat(fallbackPlacements).reduce(function (acc, placement) {\n return acc.concat(getBasePlacement(placement) === auto ? computeAutoPlacement(state, {\n placement: placement,\n boundary: boundary,\n rootBoundary: rootBoundary,\n padding: padding,\n flipVariations: flipVariations,\n allowedAutoPlacements: allowedAutoPlacements\n }) : placement);\n }, []);\n var referenceRect = state.rects.reference;\n var popperRect = state.rects.popper;\n var checksMap = new Map();\n var makeFallbackChecks = true;\n var firstFittingPlacement = placements[0];\n\n for (var i = 0; i < placements.length; i++) {\n var placement = placements[i];\n\n var _basePlacement = getBasePlacement(placement);\n\n var isStartVariation = getVariation(placement) === start;\n var isVertical = [top, bottom].indexOf(_basePlacement) >= 0;\n var len = isVertical ? 'width' : 'height';\n var overflow = detectOverflow(state, {\n placement: placement,\n boundary: boundary,\n rootBoundary: rootBoundary,\n altBoundary: altBoundary,\n padding: padding\n });\n var mainVariationSide = isVertical ? isStartVariation ? right : left : isStartVariation ? bottom : top;\n\n if (referenceRect[len] > popperRect[len]) {\n mainVariationSide = getOppositePlacement(mainVariationSide);\n }\n\n var altVariationSide = getOppositePlacement(mainVariationSide);\n var checks = [];\n\n if (checkMainAxis) {\n checks.push(overflow[_basePlacement] <= 0);\n }\n\n if (checkAltAxis) {\n checks.push(overflow[mainVariationSide] <= 0, overflow[altVariationSide] <= 0);\n }\n\n if (checks.every(function (check) {\n return check;\n })) {\n firstFittingPlacement = placement;\n makeFallbackChecks = false;\n break;\n }\n\n checksMap.set(placement, checks);\n }\n\n if (makeFallbackChecks) {\n // `2` may be desired in some cases – research later\n var numberOfChecks = flipVariations ? 3 : 1;\n\n var _loop = function _loop(_i) {\n var fittingPlacement = placements.find(function (placement) {\n var checks = checksMap.get(placement);\n\n if (checks) {\n return checks.slice(0, _i).every(function (check) {\n return check;\n });\n }\n });\n\n if (fittingPlacement) {\n firstFittingPlacement = fittingPlacement;\n return \"break\";\n }\n };\n\n for (var _i = numberOfChecks; _i > 0; _i--) {\n var _ret = _loop(_i);\n\n if (_ret === \"break\") break;\n }\n }\n\n if (state.placement !== firstFittingPlacement) {\n state.modifiersData[name]._skip = true;\n state.placement = firstFittingPlacement;\n state.reset = true;\n }\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'flip',\n enabled: true,\n phase: 'main',\n fn: flip,\n requiresIfExists: ['offset'],\n data: {\n _skip: false\n }\n};","import getVariation from \"./getVariation.js\";\nimport { variationPlacements, basePlacements, placements as allPlacements } from \"../enums.js\";\nimport detectOverflow from \"./detectOverflow.js\";\nimport getBasePlacement from \"./getBasePlacement.js\";\nexport default function computeAutoPlacement(state, options) {\n if (options === void 0) {\n options = {};\n }\n\n var _options = options,\n placement = _options.placement,\n boundary = _options.boundary,\n rootBoundary = _options.rootBoundary,\n padding = _options.padding,\n flipVariations = _options.flipVariations,\n _options$allowedAutoP = _options.allowedAutoPlacements,\n allowedAutoPlacements = _options$allowedAutoP === void 0 ? allPlacements : _options$allowedAutoP;\n var variation = getVariation(placement);\n var placements = variation ? flipVariations ? variationPlacements : variationPlacements.filter(function (placement) {\n return getVariation(placement) === variation;\n }) : basePlacements;\n var allowedPlacements = placements.filter(function (placement) {\n return allowedAutoPlacements.indexOf(placement) >= 0;\n });\n\n if (allowedPlacements.length === 0) {\n allowedPlacements = placements;\n } // $FlowFixMe[incompatible-type]: Flow seems to have problems with two array unions...\n\n\n var overflows = allowedPlacements.reduce(function (acc, placement) {\n acc[placement] = detectOverflow(state, {\n placement: placement,\n boundary: boundary,\n rootBoundary: rootBoundary,\n padding: padding\n })[getBasePlacement(placement)];\n return acc;\n }, {});\n return Object.keys(overflows).sort(function (a, b) {\n return overflows[a] - overflows[b];\n });\n}","import { top, bottom, left, right } from \"../enums.js\";\nimport detectOverflow from \"../utils/detectOverflow.js\";\n\nfunction getSideOffsets(overflow, rect, preventedOffsets) {\n if (preventedOffsets === void 0) {\n preventedOffsets = {\n x: 0,\n y: 0\n };\n }\n\n return {\n top: overflow.top - rect.height - preventedOffsets.y,\n right: overflow.right - rect.width + preventedOffsets.x,\n bottom: overflow.bottom - rect.height + preventedOffsets.y,\n left: overflow.left - rect.width - preventedOffsets.x\n };\n}\n\nfunction isAnySideFullyClipped(overflow) {\n return [top, right, bottom, left].some(function (side) {\n return overflow[side] >= 0;\n });\n}\n\nfunction hide(_ref) {\n var state = _ref.state,\n name = _ref.name;\n var referenceRect = state.rects.reference;\n var popperRect = state.rects.popper;\n var preventedOffsets = state.modifiersData.preventOverflow;\n var referenceOverflow = detectOverflow(state, {\n elementContext: 'reference'\n });\n var popperAltOverflow = detectOverflow(state, {\n altBoundary: true\n });\n var referenceClippingOffsets = getSideOffsets(referenceOverflow, referenceRect);\n var popperEscapeOffsets = getSideOffsets(popperAltOverflow, popperRect, preventedOffsets);\n var isReferenceHidden = isAnySideFullyClipped(referenceClippingOffsets);\n var hasPopperEscaped = isAnySideFullyClipped(popperEscapeOffsets);\n state.modifiersData[name] = {\n referenceClippingOffsets: referenceClippingOffsets,\n popperEscapeOffsets: popperEscapeOffsets,\n isReferenceHidden: isReferenceHidden,\n hasPopperEscaped: hasPopperEscaped\n };\n state.attributes.popper = Object.assign({}, state.attributes.popper, {\n 'data-popper-reference-hidden': isReferenceHidden,\n 'data-popper-escaped': hasPopperEscaped\n });\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'hide',\n enabled: true,\n phase: 'main',\n requiresIfExists: ['preventOverflow'],\n fn: hide\n};","import getBasePlacement from \"../utils/getBasePlacement.js\";\nimport { top, left, right, placements } from \"../enums.js\"; // eslint-disable-next-line import/no-unused-modules\n\nexport function distanceAndSkiddingToXY(placement, rects, offset) {\n var basePlacement = getBasePlacement(placement);\n var invertDistance = [left, top].indexOf(basePlacement) >= 0 ? -1 : 1;\n\n var _ref = typeof offset === 'function' ? offset(Object.assign({}, rects, {\n placement: placement\n })) : offset,\n skidding = _ref[0],\n distance = _ref[1];\n\n skidding = skidding || 0;\n distance = (distance || 0) * invertDistance;\n return [left, right].indexOf(basePlacement) >= 0 ? {\n x: distance,\n y: skidding\n } : {\n x: skidding,\n y: distance\n };\n}\n\nfunction offset(_ref2) {\n var state = _ref2.state,\n options = _ref2.options,\n name = _ref2.name;\n var _options$offset = options.offset,\n offset = _options$offset === void 0 ? [0, 0] : _options$offset;\n var data = placements.reduce(function (acc, placement) {\n acc[placement] = distanceAndSkiddingToXY(placement, state.rects, offset);\n return acc;\n }, {});\n var _data$state$placement = data[state.placement],\n x = _data$state$placement.x,\n y = _data$state$placement.y;\n\n if (state.modifiersData.popperOffsets != null) {\n state.modifiersData.popperOffsets.x += x;\n state.modifiersData.popperOffsets.y += y;\n }\n\n state.modifiersData[name] = data;\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'offset',\n enabled: true,\n phase: 'main',\n requires: ['popperOffsets'],\n fn: offset\n};","import computeOffsets from \"../utils/computeOffsets.js\";\n\nfunction popperOffsets(_ref) {\n var state = _ref.state,\n name = _ref.name;\n // Offsets are the actual position the popper needs to have to be\n // properly positioned near its reference element\n // This is the most basic placement, and will be adjusted by\n // the modifiers in the next step\n state.modifiersData[name] = computeOffsets({\n reference: state.rects.reference,\n element: state.rects.popper,\n strategy: 'absolute',\n placement: state.placement\n });\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'popperOffsets',\n enabled: true,\n phase: 'read',\n fn: popperOffsets,\n data: {}\n};","import { top, left, right, bottom, start } from \"../enums.js\";\nimport getBasePlacement from \"../utils/getBasePlacement.js\";\nimport getMainAxisFromPlacement from \"../utils/getMainAxisFromPlacement.js\";\nimport getAltAxis from \"../utils/getAltAxis.js\";\nimport { within, withinMaxClamp } from \"../utils/within.js\";\nimport getLayoutRect from \"../dom-utils/getLayoutRect.js\";\nimport getOffsetParent from \"../dom-utils/getOffsetParent.js\";\nimport detectOverflow from \"../utils/detectOverflow.js\";\nimport getVariation from \"../utils/getVariation.js\";\nimport getFreshSideObject from \"../utils/getFreshSideObject.js\";\nimport { min as mathMin, max as mathMax } from \"../utils/math.js\";\n\nfunction preventOverflow(_ref) {\n var state = _ref.state,\n options = _ref.options,\n name = _ref.name;\n var _options$mainAxis = options.mainAxis,\n checkMainAxis = _options$mainAxis === void 0 ? true : _options$mainAxis,\n _options$altAxis = options.altAxis,\n checkAltAxis = _options$altAxis === void 0 ? false : _options$altAxis,\n boundary = options.boundary,\n rootBoundary = options.rootBoundary,\n altBoundary = options.altBoundary,\n padding = options.padding,\n _options$tether = options.tether,\n tether = _options$tether === void 0 ? true : _options$tether,\n _options$tetherOffset = options.tetherOffset,\n tetherOffset = _options$tetherOffset === void 0 ? 0 : _options$tetherOffset;\n var overflow = detectOverflow(state, {\n boundary: boundary,\n rootBoundary: rootBoundary,\n padding: padding,\n altBoundary: altBoundary\n });\n var basePlacement = getBasePlacement(state.placement);\n var variation = getVariation(state.placement);\n var isBasePlacement = !variation;\n var mainAxis = getMainAxisFromPlacement(basePlacement);\n var altAxis = getAltAxis(mainAxis);\n var popperOffsets = state.modifiersData.popperOffsets;\n var referenceRect = state.rects.reference;\n var popperRect = state.rects.popper;\n var tetherOffsetValue = typeof tetherOffset === 'function' ? tetherOffset(Object.assign({}, state.rects, {\n placement: state.placement\n })) : tetherOffset;\n var normalizedTetherOffsetValue = typeof tetherOffsetValue === 'number' ? {\n mainAxis: tetherOffsetValue,\n altAxis: tetherOffsetValue\n } : Object.assign({\n mainAxis: 0,\n altAxis: 0\n }, tetherOffsetValue);\n var offsetModifierState = state.modifiersData.offset ? state.modifiersData.offset[state.placement] : null;\n var data = {\n x: 0,\n y: 0\n };\n\n if (!popperOffsets) {\n return;\n }\n\n if (checkMainAxis) {\n var _offsetModifierState$;\n\n var mainSide = mainAxis === 'y' ? top : left;\n var altSide = mainAxis === 'y' ? bottom : right;\n var len = mainAxis === 'y' ? 'height' : 'width';\n var offset = popperOffsets[mainAxis];\n var min = offset + overflow[mainSide];\n var max = offset - overflow[altSide];\n var additive = tether ? -popperRect[len] / 2 : 0;\n var minLen = variation === start ? referenceRect[len] : popperRect[len];\n var maxLen = variation === start ? -popperRect[len] : -referenceRect[len]; // We need to include the arrow in the calculation so the arrow doesn't go\n // outside the reference bounds\n\n var arrowElement = state.elements.arrow;\n var arrowRect = tether && arrowElement ? getLayoutRect(arrowElement) : {\n width: 0,\n height: 0\n };\n var arrowPaddingObject = state.modifiersData['arrow#persistent'] ? state.modifiersData['arrow#persistent'].padding : getFreshSideObject();\n var arrowPaddingMin = arrowPaddingObject[mainSide];\n var arrowPaddingMax = arrowPaddingObject[altSide]; // If the reference length is smaller than the arrow length, we don't want\n // to include its full size in the calculation. If the reference is small\n // and near the edge of a boundary, the popper can overflow even if the\n // reference is not overflowing as well (e.g. virtual elements with no\n // width or height)\n\n var arrowLen = within(0, referenceRect[len], arrowRect[len]);\n var minOffset = isBasePlacement ? referenceRect[len] / 2 - additive - arrowLen - arrowPaddingMin - normalizedTetherOffsetValue.mainAxis : minLen - arrowLen - arrowPaddingMin - normalizedTetherOffsetValue.mainAxis;\n var maxOffset = isBasePlacement ? -referenceRect[len] / 2 + additive + arrowLen + arrowPaddingMax + normalizedTetherOffsetValue.mainAxis : maxLen + arrowLen + arrowPaddingMax + normalizedTetherOffsetValue.mainAxis;\n var arrowOffsetParent = state.elements.arrow && getOffsetParent(state.elements.arrow);\n var clientOffset = arrowOffsetParent ? mainAxis === 'y' ? arrowOffsetParent.clientTop || 0 : arrowOffsetParent.clientLeft || 0 : 0;\n var offsetModifierValue = (_offsetModifierState$ = offsetModifierState == null ? void 0 : offsetModifierState[mainAxis]) != null ? _offsetModifierState$ : 0;\n var tetherMin = offset + minOffset - offsetModifierValue - clientOffset;\n var tetherMax = offset + maxOffset - offsetModifierValue;\n var preventedOffset = within(tether ? mathMin(min, tetherMin) : min, offset, tether ? mathMax(max, tetherMax) : max);\n popperOffsets[mainAxis] = preventedOffset;\n data[mainAxis] = preventedOffset - offset;\n }\n\n if (checkAltAxis) {\n var _offsetModifierState$2;\n\n var _mainSide = mainAxis === 'x' ? top : left;\n\n var _altSide = mainAxis === 'x' ? bottom : right;\n\n var _offset = popperOffsets[altAxis];\n\n var _len = altAxis === 'y' ? 'height' : 'width';\n\n var _min = _offset + overflow[_mainSide];\n\n var _max = _offset - overflow[_altSide];\n\n var isOriginSide = [top, left].indexOf(basePlacement) !== -1;\n\n var _offsetModifierValue = (_offsetModifierState$2 = offsetModifierState == null ? void 0 : offsetModifierState[altAxis]) != null ? _offsetModifierState$2 : 0;\n\n var _tetherMin = isOriginSide ? _min : _offset - referenceRect[_len] - popperRect[_len] - _offsetModifierValue + normalizedTetherOffsetValue.altAxis;\n\n var _tetherMax = isOriginSide ? _offset + referenceRect[_len] + popperRect[_len] - _offsetModifierValue - normalizedTetherOffsetValue.altAxis : _max;\n\n var _preventedOffset = tether && isOriginSide ? withinMaxClamp(_tetherMin, _offset, _tetherMax) : within(tether ? _tetherMin : _min, _offset, tether ? _tetherMax : _max);\n\n popperOffsets[altAxis] = _preventedOffset;\n data[altAxis] = _preventedOffset - _offset;\n }\n\n state.modifiersData[name] = data;\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'preventOverflow',\n enabled: true,\n phase: 'main',\n fn: preventOverflow,\n requiresIfExists: ['offset']\n};","export default function getAltAxis(axis) {\n return axis === 'x' ? 'y' : 'x';\n}","import getBoundingClientRect from \"./getBoundingClientRect.js\";\nimport getNodeScroll from \"./getNodeScroll.js\";\nimport getNodeName from \"./getNodeName.js\";\nimport { isHTMLElement } from \"./instanceOf.js\";\nimport getWindowScrollBarX from \"./getWindowScrollBarX.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport isScrollParent from \"./isScrollParent.js\";\nimport { round } from \"../utils/math.js\";\n\nfunction isElementScaled(element) {\n var rect = element.getBoundingClientRect();\n var scaleX = round(rect.width) / element.offsetWidth || 1;\n var scaleY = round(rect.height) / element.offsetHeight || 1;\n return scaleX !== 1 || scaleY !== 1;\n} // Returns the composite rect of an element relative to its offsetParent.\n// Composite means it takes into account transforms as well as layout.\n\n\nexport default function getCompositeRect(elementOrVirtualElement, offsetParent, isFixed) {\n if (isFixed === void 0) {\n isFixed = false;\n }\n\n var isOffsetParentAnElement = isHTMLElement(offsetParent);\n var offsetParentIsScaled = isHTMLElement(offsetParent) && isElementScaled(offsetParent);\n var documentElement = getDocumentElement(offsetParent);\n var rect = getBoundingClientRect(elementOrVirtualElement, offsetParentIsScaled, isFixed);\n var scroll = {\n scrollLeft: 0,\n scrollTop: 0\n };\n var offsets = {\n x: 0,\n y: 0\n };\n\n if (isOffsetParentAnElement || !isOffsetParentAnElement && !isFixed) {\n if (getNodeName(offsetParent) !== 'body' || // https://github.com/popperjs/popper-core/issues/1078\n isScrollParent(documentElement)) {\n scroll = getNodeScroll(offsetParent);\n }\n\n if (isHTMLElement(offsetParent)) {\n offsets = getBoundingClientRect(offsetParent, true);\n offsets.x += offsetParent.clientLeft;\n offsets.y += offsetParent.clientTop;\n } else if (documentElement) {\n offsets.x = getWindowScrollBarX(documentElement);\n }\n }\n\n return {\n x: rect.left + scroll.scrollLeft - offsets.x,\n y: rect.top + scroll.scrollTop - offsets.y,\n width: rect.width,\n height: rect.height\n };\n}","import getWindowScroll from \"./getWindowScroll.js\";\nimport getWindow from \"./getWindow.js\";\nimport { isHTMLElement } from \"./instanceOf.js\";\nimport getHTMLElementScroll from \"./getHTMLElementScroll.js\";\nexport default function getNodeScroll(node) {\n if (node === getWindow(node) || !isHTMLElement(node)) {\n return getWindowScroll(node);\n } else {\n return getHTMLElementScroll(node);\n }\n}","export default function getHTMLElementScroll(element) {\n return {\n scrollLeft: element.scrollLeft,\n scrollTop: element.scrollTop\n };\n}","import { modifierPhases } from \"../enums.js\"; // source: https://stackoverflow.com/questions/49875255\n\nfunction order(modifiers) {\n var map = new Map();\n var visited = new Set();\n var result = [];\n modifiers.forEach(function (modifier) {\n map.set(modifier.name, modifier);\n }); // On visiting object, check for its dependencies and visit them recursively\n\n function sort(modifier) {\n visited.add(modifier.name);\n var requires = [].concat(modifier.requires || [], modifier.requiresIfExists || []);\n requires.forEach(function (dep) {\n if (!visited.has(dep)) {\n var depModifier = map.get(dep);\n\n if (depModifier) {\n sort(depModifier);\n }\n }\n });\n result.push(modifier);\n }\n\n modifiers.forEach(function (modifier) {\n if (!visited.has(modifier.name)) {\n // check for visited object\n sort(modifier);\n }\n });\n return result;\n}\n\nexport default function orderModifiers(modifiers) {\n // order based on dependencies\n var orderedModifiers = order(modifiers); // order based on phase\n\n return modifierPhases.reduce(function (acc, phase) {\n return acc.concat(orderedModifiers.filter(function (modifier) {\n return modifier.phase === phase;\n }));\n }, []);\n}","import getCompositeRect from \"./dom-utils/getCompositeRect.js\";\nimport getLayoutRect from \"./dom-utils/getLayoutRect.js\";\nimport listScrollParents from \"./dom-utils/listScrollParents.js\";\nimport getOffsetParent from \"./dom-utils/getOffsetParent.js\";\nimport orderModifiers from \"./utils/orderModifiers.js\";\nimport debounce from \"./utils/debounce.js\";\nimport mergeByName from \"./utils/mergeByName.js\";\nimport detectOverflow from \"./utils/detectOverflow.js\";\nimport { isElement } from \"./dom-utils/instanceOf.js\";\nvar DEFAULT_OPTIONS = {\n placement: 'bottom',\n modifiers: [],\n strategy: 'absolute'\n};\n\nfunction areValidElements() {\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n return !args.some(function (element) {\n return !(element && typeof element.getBoundingClientRect === 'function');\n });\n}\n\nexport function popperGenerator(generatorOptions) {\n if (generatorOptions === void 0) {\n generatorOptions = {};\n }\n\n var _generatorOptions = generatorOptions,\n _generatorOptions$def = _generatorOptions.defaultModifiers,\n defaultModifiers = _generatorOptions$def === void 0 ? [] : _generatorOptions$def,\n _generatorOptions$def2 = _generatorOptions.defaultOptions,\n defaultOptions = _generatorOptions$def2 === void 0 ? DEFAULT_OPTIONS : _generatorOptions$def2;\n return function createPopper(reference, popper, options) {\n if (options === void 0) {\n options = defaultOptions;\n }\n\n var state = {\n placement: 'bottom',\n orderedModifiers: [],\n options: Object.assign({}, DEFAULT_OPTIONS, defaultOptions),\n modifiersData: {},\n elements: {\n reference: reference,\n popper: popper\n },\n attributes: {},\n styles: {}\n };\n var effectCleanupFns = [];\n var isDestroyed = false;\n var instance = {\n state: state,\n setOptions: function setOptions(setOptionsAction) {\n var options = typeof setOptionsAction === 'function' ? setOptionsAction(state.options) : setOptionsAction;\n cleanupModifierEffects();\n state.options = Object.assign({}, defaultOptions, state.options, options);\n state.scrollParents = {\n reference: isElement(reference) ? listScrollParents(reference) : reference.contextElement ? listScrollParents(reference.contextElement) : [],\n popper: listScrollParents(popper)\n }; // Orders the modifiers based on their dependencies and `phase`\n // properties\n\n var orderedModifiers = orderModifiers(mergeByName([].concat(defaultModifiers, state.options.modifiers))); // Strip out disabled modifiers\n\n state.orderedModifiers = orderedModifiers.filter(function (m) {\n return m.enabled;\n });\n runModifierEffects();\n return instance.update();\n },\n // Sync update – it will always be executed, even if not necessary. This\n // is useful for low frequency updates where sync behavior simplifies the\n // logic.\n // For high frequency updates (e.g. `resize` and `scroll` events), always\n // prefer the async Popper#update method\n forceUpdate: function forceUpdate() {\n if (isDestroyed) {\n return;\n }\n\n var _state$elements = state.elements,\n reference = _state$elements.reference,\n popper = _state$elements.popper; // Don't proceed if `reference` or `popper` are not valid elements\n // anymore\n\n if (!areValidElements(reference, popper)) {\n return;\n } // Store the reference and popper rects to be read by modifiers\n\n\n state.rects = {\n reference: getCompositeRect(reference, getOffsetParent(popper), state.options.strategy === 'fixed'),\n popper: getLayoutRect(popper)\n }; // Modifiers have the ability to reset the current update cycle. The\n // most common use case for this is the `flip` modifier changing the\n // placement, which then needs to re-run all the modifiers, because the\n // logic was previously ran for the previous placement and is therefore\n // stale/incorrect\n\n state.reset = false;\n state.placement = state.options.placement; // On each update cycle, the `modifiersData` property for each modifier\n // is filled with the initial data specified by the modifier. This means\n // it doesn't persist and is fresh on each update.\n // To ensure persistent data, use `${name}#persistent`\n\n state.orderedModifiers.forEach(function (modifier) {\n return state.modifiersData[modifier.name] = Object.assign({}, modifier.data);\n });\n\n for (var index = 0; index < state.orderedModifiers.length; index++) {\n if (state.reset === true) {\n state.reset = false;\n index = -1;\n continue;\n }\n\n var _state$orderedModifie = state.orderedModifiers[index],\n fn = _state$orderedModifie.fn,\n _state$orderedModifie2 = _state$orderedModifie.options,\n _options = _state$orderedModifie2 === void 0 ? {} : _state$orderedModifie2,\n name = _state$orderedModifie.name;\n\n if (typeof fn === 'function') {\n state = fn({\n state: state,\n options: _options,\n name: name,\n instance: instance\n }) || state;\n }\n }\n },\n // Async and optimistically optimized update – it will not be executed if\n // not necessary (debounced to run at most once-per-tick)\n update: debounce(function () {\n return new Promise(function (resolve) {\n instance.forceUpdate();\n resolve(state);\n });\n }),\n destroy: function destroy() {\n cleanupModifierEffects();\n isDestroyed = true;\n }\n };\n\n if (!areValidElements(reference, popper)) {\n return instance;\n }\n\n instance.setOptions(options).then(function (state) {\n if (!isDestroyed && options.onFirstUpdate) {\n options.onFirstUpdate(state);\n }\n }); // Modifiers have the ability to execute arbitrary code before the first\n // update cycle runs. They will be executed in the same order as the update\n // cycle. This is useful when a modifier adds some persistent data that\n // other modifiers need to use, but the modifier is run after the dependent\n // one.\n\n function runModifierEffects() {\n state.orderedModifiers.forEach(function (_ref) {\n var name = _ref.name,\n _ref$options = _ref.options,\n options = _ref$options === void 0 ? {} : _ref$options,\n effect = _ref.effect;\n\n if (typeof effect === 'function') {\n var cleanupFn = effect({\n state: state,\n name: name,\n instance: instance,\n options: options\n });\n\n var noopFn = function noopFn() {};\n\n effectCleanupFns.push(cleanupFn || noopFn);\n }\n });\n }\n\n function cleanupModifierEffects() {\n effectCleanupFns.forEach(function (fn) {\n return fn();\n });\n effectCleanupFns = [];\n }\n\n return instance;\n };\n}\nexport var createPopper = /*#__PURE__*/popperGenerator(); // eslint-disable-next-line import/no-unused-modules\n\nexport { detectOverflow };","export default function debounce(fn) {\n var pending;\n return function () {\n if (!pending) {\n pending = new Promise(function (resolve) {\n Promise.resolve().then(function () {\n pending = undefined;\n resolve(fn());\n });\n });\n }\n\n return pending;\n };\n}","export default function mergeByName(modifiers) {\n var merged = modifiers.reduce(function (merged, current) {\n var existing = merged[current.name];\n merged[current.name] = existing ? Object.assign({}, existing, current, {\n options: Object.assign({}, existing.options, current.options),\n data: Object.assign({}, existing.data, current.data)\n }) : current;\n return merged;\n }, {}); // IE11 does not support Object.values\n\n return Object.keys(merged).map(function (key) {\n return merged[key];\n });\n}","import { popperGenerator, detectOverflow } from \"./createPopper.js\";\nimport eventListeners from \"./modifiers/eventListeners.js\";\nimport popperOffsets from \"./modifiers/popperOffsets.js\";\nimport computeStyles from \"./modifiers/computeStyles.js\";\nimport applyStyles from \"./modifiers/applyStyles.js\";\nimport offset from \"./modifiers/offset.js\";\nimport flip from \"./modifiers/flip.js\";\nimport preventOverflow from \"./modifiers/preventOverflow.js\";\nimport arrow from \"./modifiers/arrow.js\";\nimport hide from \"./modifiers/hide.js\";\nvar defaultModifiers = [eventListeners, popperOffsets, computeStyles, applyStyles, offset, flip, preventOverflow, arrow, hide];\nvar createPopper = /*#__PURE__*/popperGenerator({\n defaultModifiers: defaultModifiers\n}); // eslint-disable-next-line import/no-unused-modules\n\nexport { createPopper, popperGenerator, defaultModifiers, detectOverflow }; // eslint-disable-next-line import/no-unused-modules\n\nexport { createPopper as createPopperLite } from \"./popper-lite.js\"; // eslint-disable-next-line import/no-unused-modules\n\nexport * from \"./modifiers/index.js\";","import { popperGenerator, detectOverflow } from \"./createPopper.js\";\nimport eventListeners from \"./modifiers/eventListeners.js\";\nimport popperOffsets from \"./modifiers/popperOffsets.js\";\nimport computeStyles from \"./modifiers/computeStyles.js\";\nimport applyStyles from \"./modifiers/applyStyles.js\";\nvar defaultModifiers = [eventListeners, popperOffsets, computeStyles, applyStyles];\nvar createPopper = /*#__PURE__*/popperGenerator({\n defaultModifiers: defaultModifiers\n}); // eslint-disable-next-line import/no-unused-modules\n\nexport { createPopper, popperGenerator, defaultModifiers, detectOverflow };","/*!\n * Bootstrap v5.3.2 (https://getbootstrap.com/)\n * Copyright 2011-2023 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n */\nimport * as Popper from '@popperjs/core';\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap dom/data.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n/**\n * Constants\n */\n\nconst elementMap = new Map();\nconst Data = {\n set(element, key, instance) {\n if (!elementMap.has(element)) {\n elementMap.set(element, new Map());\n }\n const instanceMap = elementMap.get(element);\n\n // make it clear we only want one instance per element\n // can be removed later when multiple key/instances are fine to be used\n if (!instanceMap.has(key) && instanceMap.size !== 0) {\n // eslint-disable-next-line no-console\n console.error(`Bootstrap doesn't allow more than one instance per element. Bound instance: ${Array.from(instanceMap.keys())[0]}.`);\n return;\n }\n instanceMap.set(key, instance);\n },\n get(element, key) {\n if (elementMap.has(element)) {\n return elementMap.get(element).get(key) || null;\n }\n return null;\n },\n remove(element, key) {\n if (!elementMap.has(element)) {\n return;\n }\n const instanceMap = elementMap.get(element);\n instanceMap.delete(key);\n\n // free up element references if there are no instances left for an element\n if (instanceMap.size === 0) {\n elementMap.delete(element);\n }\n }\n};\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap util/index.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nconst MAX_UID = 1000000;\nconst MILLISECONDS_MULTIPLIER = 1000;\nconst TRANSITION_END = 'transitionend';\n\n/**\n * Properly escape IDs selectors to handle weird IDs\n * @param {string} selector\n * @returns {string}\n */\nconst parseSelector = selector => {\n if (selector && window.CSS && window.CSS.escape) {\n // document.querySelector needs escaping to handle IDs (html5+) containing for instance /\n selector = selector.replace(/#([^\\s\"#']+)/g, (match, id) => `#${CSS.escape(id)}`);\n }\n return selector;\n};\n\n// Shout-out Angus Croll (https://goo.gl/pxwQGp)\nconst toType = object => {\n if (object === null || object === undefined) {\n return `${object}`;\n }\n return Object.prototype.toString.call(object).match(/\\s([a-z]+)/i)[1].toLowerCase();\n};\n\n/**\n * Public Util API\n */\n\nconst getUID = prefix => {\n do {\n prefix += Math.floor(Math.random() * MAX_UID);\n } while (document.getElementById(prefix));\n return prefix;\n};\nconst getTransitionDurationFromElement = element => {\n if (!element) {\n return 0;\n }\n\n // Get transition-duration of the element\n let {\n transitionDuration,\n transitionDelay\n } = window.getComputedStyle(element);\n const floatTransitionDuration = Number.parseFloat(transitionDuration);\n const floatTransitionDelay = Number.parseFloat(transitionDelay);\n\n // Return 0 if element or transition duration is not found\n if (!floatTransitionDuration && !floatTransitionDelay) {\n return 0;\n }\n\n // If multiple durations are defined, take the first\n transitionDuration = transitionDuration.split(',')[0];\n transitionDelay = transitionDelay.split(',')[0];\n return (Number.parseFloat(transitionDuration) + Number.parseFloat(transitionDelay)) * MILLISECONDS_MULTIPLIER;\n};\nconst triggerTransitionEnd = element => {\n element.dispatchEvent(new Event(TRANSITION_END));\n};\nconst isElement = object => {\n if (!object || typeof object !== 'object') {\n return false;\n }\n if (typeof object.jquery !== 'undefined') {\n object = object[0];\n }\n return typeof object.nodeType !== 'undefined';\n};\nconst getElement = object => {\n // it's a jQuery object or a node element\n if (isElement(object)) {\n return object.jquery ? object[0] : object;\n }\n if (typeof object === 'string' && object.length > 0) {\n return document.querySelector(parseSelector(object));\n }\n return null;\n};\nconst isVisible = element => {\n if (!isElement(element) || element.getClientRects().length === 0) {\n return false;\n }\n const elementIsVisible = getComputedStyle(element).getPropertyValue('visibility') === 'visible';\n // Handle `details` element as its content may falsie appear visible when it is closed\n const closedDetails = element.closest('details:not([open])');\n if (!closedDetails) {\n return elementIsVisible;\n }\n if (closedDetails !== element) {\n const summary = element.closest('summary');\n if (summary && summary.parentNode !== closedDetails) {\n return false;\n }\n if (summary === null) {\n return false;\n }\n }\n return elementIsVisible;\n};\nconst isDisabled = element => {\n if (!element || element.nodeType !== Node.ELEMENT_NODE) {\n return true;\n }\n if (element.classList.contains('disabled')) {\n return true;\n }\n if (typeof element.disabled !== 'undefined') {\n return element.disabled;\n }\n return element.hasAttribute('disabled') && element.getAttribute('disabled') !== 'false';\n};\nconst findShadowRoot = element => {\n if (!document.documentElement.attachShadow) {\n return null;\n }\n\n // Can find the shadow root otherwise it'll return the document\n if (typeof element.getRootNode === 'function') {\n const root = element.getRootNode();\n return root instanceof ShadowRoot ? root : null;\n }\n if (element instanceof ShadowRoot) {\n return element;\n }\n\n // when we don't find a shadow root\n if (!element.parentNode) {\n return null;\n }\n return findShadowRoot(element.parentNode);\n};\nconst noop = () => {};\n\n/**\n * Trick to restart an element's animation\n *\n * @param {HTMLElement} element\n * @return void\n *\n * @see https://www.charistheo.io/blog/2021/02/restart-a-css-animation-with-javascript/#restarting-a-css-animation\n */\nconst reflow = element => {\n element.offsetHeight; // eslint-disable-line no-unused-expressions\n};\n\nconst getjQuery = () => {\n if (window.jQuery && !document.body.hasAttribute('data-bs-no-jquery')) {\n return window.jQuery;\n }\n return null;\n};\nconst DOMContentLoadedCallbacks = [];\nconst onDOMContentLoaded = callback => {\n if (document.readyState === 'loading') {\n // add listener on the first call when the document is in loading state\n if (!DOMContentLoadedCallbacks.length) {\n document.addEventListener('DOMContentLoaded', () => {\n for (const callback of DOMContentLoadedCallbacks) {\n callback();\n }\n });\n }\n DOMContentLoadedCallbacks.push(callback);\n } else {\n callback();\n }\n};\nconst isRTL = () => document.documentElement.dir === 'rtl';\nconst defineJQueryPlugin = plugin => {\n onDOMContentLoaded(() => {\n const $ = getjQuery();\n /* istanbul ignore if */\n if ($) {\n const name = plugin.NAME;\n const JQUERY_NO_CONFLICT = $.fn[name];\n $.fn[name] = plugin.jQueryInterface;\n $.fn[name].Constructor = plugin;\n $.fn[name].noConflict = () => {\n $.fn[name] = JQUERY_NO_CONFLICT;\n return plugin.jQueryInterface;\n };\n }\n });\n};\nconst execute = (possibleCallback, args = [], defaultValue = possibleCallback) => {\n return typeof possibleCallback === 'function' ? possibleCallback(...args) : defaultValue;\n};\nconst executeAfterTransition = (callback, transitionElement, waitForTransition = true) => {\n if (!waitForTransition) {\n execute(callback);\n return;\n }\n const durationPadding = 5;\n const emulatedDuration = getTransitionDurationFromElement(transitionElement) + durationPadding;\n let called = false;\n const handler = ({\n target\n }) => {\n if (target !== transitionElement) {\n return;\n }\n called = true;\n transitionElement.removeEventListener(TRANSITION_END, handler);\n execute(callback);\n };\n transitionElement.addEventListener(TRANSITION_END, handler);\n setTimeout(() => {\n if (!called) {\n triggerTransitionEnd(transitionElement);\n }\n }, emulatedDuration);\n};\n\n/**\n * Return the previous/next element of a list.\n *\n * @param {array} list The list of elements\n * @param activeElement The active element\n * @param shouldGetNext Choose to get next or previous element\n * @param isCycleAllowed\n * @return {Element|elem} The proper element\n */\nconst getNextActiveElement = (list, activeElement, shouldGetNext, isCycleAllowed) => {\n const listLength = list.length;\n let index = list.indexOf(activeElement);\n\n // if the element does not exist in the list return an element\n // depending on the direction and if cycle is allowed\n if (index === -1) {\n return !shouldGetNext && isCycleAllowed ? list[listLength - 1] : list[0];\n }\n index += shouldGetNext ? 1 : -1;\n if (isCycleAllowed) {\n index = (index + listLength) % listLength;\n }\n return list[Math.max(0, Math.min(index, listLength - 1))];\n};\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap dom/event-handler.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Constants\n */\n\nconst namespaceRegex = /[^.]*(?=\\..*)\\.|.*/;\nconst stripNameRegex = /\\..*/;\nconst stripUidRegex = /::\\d+$/;\nconst eventRegistry = {}; // Events storage\nlet uidEvent = 1;\nconst customEvents = {\n mouseenter: 'mouseover',\n mouseleave: 'mouseout'\n};\nconst nativeEvents = new Set(['click', 'dblclick', 'mouseup', 'mousedown', 'contextmenu', 'mousewheel', 'DOMMouseScroll', 'mouseover', 'mouseout', 'mousemove', 'selectstart', 'selectend', 'keydown', 'keypress', 'keyup', 'orientationchange', 'touchstart', 'touchmove', 'touchend', 'touchcancel', 'pointerdown', 'pointermove', 'pointerup', 'pointerleave', 'pointercancel', 'gesturestart', 'gesturechange', 'gestureend', 'focus', 'blur', 'change', 'reset', 'select', 'submit', 'focusin', 'focusout', 'load', 'unload', 'beforeunload', 'resize', 'move', 'DOMContentLoaded', 'readystatechange', 'error', 'abort', 'scroll']);\n\n/**\n * Private methods\n */\n\nfunction makeEventUid(element, uid) {\n return uid && `${uid}::${uidEvent++}` || element.uidEvent || uidEvent++;\n}\nfunction getElementEvents(element) {\n const uid = makeEventUid(element);\n element.uidEvent = uid;\n eventRegistry[uid] = eventRegistry[uid] || {};\n return eventRegistry[uid];\n}\nfunction bootstrapHandler(element, fn) {\n return function handler(event) {\n hydrateObj(event, {\n delegateTarget: element\n });\n if (handler.oneOff) {\n EventHandler.off(element, event.type, fn);\n }\n return fn.apply(element, [event]);\n };\n}\nfunction bootstrapDelegationHandler(element, selector, fn) {\n return function handler(event) {\n const domElements = element.querySelectorAll(selector);\n for (let {\n target\n } = event; target && target !== this; target = target.parentNode) {\n for (const domElement of domElements) {\n if (domElement !== target) {\n continue;\n }\n hydrateObj(event, {\n delegateTarget: target\n });\n if (handler.oneOff) {\n EventHandler.off(element, event.type, selector, fn);\n }\n return fn.apply(target, [event]);\n }\n }\n };\n}\nfunction findHandler(events, callable, delegationSelector = null) {\n return Object.values(events).find(event => event.callable === callable && event.delegationSelector === delegationSelector);\n}\nfunction normalizeParameters(originalTypeEvent, handler, delegationFunction) {\n const isDelegated = typeof handler === 'string';\n // TODO: tooltip passes `false` instead of selector, so we need to check\n const callable = isDelegated ? delegationFunction : handler || delegationFunction;\n let typeEvent = getTypeEvent(originalTypeEvent);\n if (!nativeEvents.has(typeEvent)) {\n typeEvent = originalTypeEvent;\n }\n return [isDelegated, callable, typeEvent];\n}\nfunction addHandler(element, originalTypeEvent, handler, delegationFunction, oneOff) {\n if (typeof originalTypeEvent !== 'string' || !element) {\n return;\n }\n let [isDelegated, callable, typeEvent] = normalizeParameters(originalTypeEvent, handler, delegationFunction);\n\n // in case of mouseenter or mouseleave wrap the handler within a function that checks for its DOM position\n // this prevents the handler from being dispatched the same way as mouseover or mouseout does\n if (originalTypeEvent in customEvents) {\n const wrapFunction = fn => {\n return function (event) {\n if (!event.relatedTarget || event.relatedTarget !== event.delegateTarget && !event.delegateTarget.contains(event.relatedTarget)) {\n return fn.call(this, event);\n }\n };\n };\n callable = wrapFunction(callable);\n }\n const events = getElementEvents(element);\n const handlers = events[typeEvent] || (events[typeEvent] = {});\n const previousFunction = findHandler(handlers, callable, isDelegated ? handler : null);\n if (previousFunction) {\n previousFunction.oneOff = previousFunction.oneOff && oneOff;\n return;\n }\n const uid = makeEventUid(callable, originalTypeEvent.replace(namespaceRegex, ''));\n const fn = isDelegated ? bootstrapDelegationHandler(element, handler, callable) : bootstrapHandler(element, callable);\n fn.delegationSelector = isDelegated ? handler : null;\n fn.callable = callable;\n fn.oneOff = oneOff;\n fn.uidEvent = uid;\n handlers[uid] = fn;\n element.addEventListener(typeEvent, fn, isDelegated);\n}\nfunction removeHandler(element, events, typeEvent, handler, delegationSelector) {\n const fn = findHandler(events[typeEvent], handler, delegationSelector);\n if (!fn) {\n return;\n }\n element.removeEventListener(typeEvent, fn, Boolean(delegationSelector));\n delete events[typeEvent][fn.uidEvent];\n}\nfunction removeNamespacedHandlers(element, events, typeEvent, namespace) {\n const storeElementEvent = events[typeEvent] || {};\n for (const [handlerKey, event] of Object.entries(storeElementEvent)) {\n if (handlerKey.includes(namespace)) {\n removeHandler(element, events, typeEvent, event.callable, event.delegationSelector);\n }\n }\n}\nfunction getTypeEvent(event) {\n // allow to get the native events from namespaced events ('click.bs.button' --> 'click')\n event = event.replace(stripNameRegex, '');\n return customEvents[event] || event;\n}\nconst EventHandler = {\n on(element, event, handler, delegationFunction) {\n addHandler(element, event, handler, delegationFunction, false);\n },\n one(element, event, handler, delegationFunction) {\n addHandler(element, event, handler, delegationFunction, true);\n },\n off(element, originalTypeEvent, handler, delegationFunction) {\n if (typeof originalTypeEvent !== 'string' || !element) {\n return;\n }\n const [isDelegated, callable, typeEvent] = normalizeParameters(originalTypeEvent, handler, delegationFunction);\n const inNamespace = typeEvent !== originalTypeEvent;\n const events = getElementEvents(element);\n const storeElementEvent = events[typeEvent] || {};\n const isNamespace = originalTypeEvent.startsWith('.');\n if (typeof callable !== 'undefined') {\n // Simplest case: handler is passed, remove that listener ONLY.\n if (!Object.keys(storeElementEvent).length) {\n return;\n }\n removeHandler(element, events, typeEvent, callable, isDelegated ? handler : null);\n return;\n }\n if (isNamespace) {\n for (const elementEvent of Object.keys(events)) {\n removeNamespacedHandlers(element, events, elementEvent, originalTypeEvent.slice(1));\n }\n }\n for (const [keyHandlers, event] of Object.entries(storeElementEvent)) {\n const handlerKey = keyHandlers.replace(stripUidRegex, '');\n if (!inNamespace || originalTypeEvent.includes(handlerKey)) {\n removeHandler(element, events, typeEvent, event.callable, event.delegationSelector);\n }\n }\n },\n trigger(element, event, args) {\n if (typeof event !== 'string' || !element) {\n return null;\n }\n const $ = getjQuery();\n const typeEvent = getTypeEvent(event);\n const inNamespace = event !== typeEvent;\n let jQueryEvent = null;\n let bubbles = true;\n let nativeDispatch = true;\n let defaultPrevented = false;\n if (inNamespace && $) {\n jQueryEvent = $.Event(event, args);\n $(element).trigger(jQueryEvent);\n bubbles = !jQueryEvent.isPropagationStopped();\n nativeDispatch = !jQueryEvent.isImmediatePropagationStopped();\n defaultPrevented = jQueryEvent.isDefaultPrevented();\n }\n const evt = hydrateObj(new Event(event, {\n bubbles,\n cancelable: true\n }), args);\n if (defaultPrevented) {\n evt.preventDefault();\n }\n if (nativeDispatch) {\n element.dispatchEvent(evt);\n }\n if (evt.defaultPrevented && jQueryEvent) {\n jQueryEvent.preventDefault();\n }\n return evt;\n }\n};\nfunction hydrateObj(obj, meta = {}) {\n for (const [key, value] of Object.entries(meta)) {\n try {\n obj[key] = value;\n } catch (_unused) {\n Object.defineProperty(obj, key, {\n configurable: true,\n get() {\n return value;\n }\n });\n }\n }\n return obj;\n}\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap dom/manipulator.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nfunction normalizeData(value) {\n if (value === 'true') {\n return true;\n }\n if (value === 'false') {\n return false;\n }\n if (value === Number(value).toString()) {\n return Number(value);\n }\n if (value === '' || value === 'null') {\n return null;\n }\n if (typeof value !== 'string') {\n return value;\n }\n try {\n return JSON.parse(decodeURIComponent(value));\n } catch (_unused) {\n return value;\n }\n}\nfunction normalizeDataKey(key) {\n return key.replace(/[A-Z]/g, chr => `-${chr.toLowerCase()}`);\n}\nconst Manipulator = {\n setDataAttribute(element, key, value) {\n element.setAttribute(`data-bs-${normalizeDataKey(key)}`, value);\n },\n removeDataAttribute(element, key) {\n element.removeAttribute(`data-bs-${normalizeDataKey(key)}`);\n },\n getDataAttributes(element) {\n if (!element) {\n return {};\n }\n const attributes = {};\n const bsKeys = Object.keys(element.dataset).filter(key => key.startsWith('bs') && !key.startsWith('bsConfig'));\n for (const key of bsKeys) {\n let pureKey = key.replace(/^bs/, '');\n pureKey = pureKey.charAt(0).toLowerCase() + pureKey.slice(1, pureKey.length);\n attributes[pureKey] = normalizeData(element.dataset[key]);\n }\n return attributes;\n },\n getDataAttribute(element, key) {\n return normalizeData(element.getAttribute(`data-bs-${normalizeDataKey(key)}`));\n }\n};\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap util/config.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Class definition\n */\n\nclass Config {\n // Getters\n static get Default() {\n return {};\n }\n static get DefaultType() {\n return {};\n }\n static get NAME() {\n throw new Error('You have to implement the static method \"NAME\", for each component!');\n }\n _getConfig(config) {\n config = this._mergeConfigObj(config);\n config = this._configAfterMerge(config);\n this._typeCheckConfig(config);\n return config;\n }\n _configAfterMerge(config) {\n return config;\n }\n _mergeConfigObj(config, element) {\n const jsonConfig = isElement(element) ? Manipulator.getDataAttribute(element, 'config') : {}; // try to parse\n\n return {\n ...this.constructor.Default,\n ...(typeof jsonConfig === 'object' ? jsonConfig : {}),\n ...(isElement(element) ? Manipulator.getDataAttributes(element) : {}),\n ...(typeof config === 'object' ? config : {})\n };\n }\n _typeCheckConfig(config, configTypes = this.constructor.DefaultType) {\n for (const [property, expectedTypes] of Object.entries(configTypes)) {\n const value = config[property];\n const valueType = isElement(value) ? 'element' : toType(value);\n if (!new RegExp(expectedTypes).test(valueType)) {\n throw new TypeError(`${this.constructor.NAME.toUpperCase()}: Option \"${property}\" provided type \"${valueType}\" but expected type \"${expectedTypes}\".`);\n }\n }\n }\n}\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap base-component.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Constants\n */\n\nconst VERSION = '5.3.2';\n\n/**\n * Class definition\n */\n\nclass BaseComponent extends Config {\n constructor(element, config) {\n super();\n element = getElement(element);\n if (!element) {\n return;\n }\n this._element = element;\n this._config = this._getConfig(config);\n Data.set(this._element, this.constructor.DATA_KEY, this);\n }\n\n // Public\n dispose() {\n Data.remove(this._element, this.constructor.DATA_KEY);\n EventHandler.off(this._element, this.constructor.EVENT_KEY);\n for (const propertyName of Object.getOwnPropertyNames(this)) {\n this[propertyName] = null;\n }\n }\n _queueCallback(callback, element, isAnimated = true) {\n executeAfterTransition(callback, element, isAnimated);\n }\n _getConfig(config) {\n config = this._mergeConfigObj(config, this._element);\n config = this._configAfterMerge(config);\n this._typeCheckConfig(config);\n return config;\n }\n\n // Static\n static getInstance(element) {\n return Data.get(getElement(element), this.DATA_KEY);\n }\n static getOrCreateInstance(element, config = {}) {\n return this.getInstance(element) || new this(element, typeof config === 'object' ? config : null);\n }\n static get VERSION() {\n return VERSION;\n }\n static get DATA_KEY() {\n return `bs.${this.NAME}`;\n }\n static get EVENT_KEY() {\n return `.${this.DATA_KEY}`;\n }\n static eventName(name) {\n return `${name}${this.EVENT_KEY}`;\n }\n}\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap dom/selector-engine.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nconst getSelector = element => {\n let selector = element.getAttribute('data-bs-target');\n if (!selector || selector === '#') {\n let hrefAttribute = element.getAttribute('href');\n\n // The only valid content that could double as a selector are IDs or classes,\n // so everything starting with `#` or `.`. If a \"real\" URL is used as the selector,\n // `document.querySelector` will rightfully complain it is invalid.\n // See https://github.com/twbs/bootstrap/issues/32273\n if (!hrefAttribute || !hrefAttribute.includes('#') && !hrefAttribute.startsWith('.')) {\n return null;\n }\n\n // Just in case some CMS puts out a full URL with the anchor appended\n if (hrefAttribute.includes('#') && !hrefAttribute.startsWith('#')) {\n hrefAttribute = `#${hrefAttribute.split('#')[1]}`;\n }\n selector = hrefAttribute && hrefAttribute !== '#' ? parseSelector(hrefAttribute.trim()) : null;\n }\n return selector;\n};\nconst SelectorEngine = {\n find(selector, element = document.documentElement) {\n return [].concat(...Element.prototype.querySelectorAll.call(element, selector));\n },\n findOne(selector, element = document.documentElement) {\n return Element.prototype.querySelector.call(element, selector);\n },\n children(element, selector) {\n return [].concat(...element.children).filter(child => child.matches(selector));\n },\n parents(element, selector) {\n const parents = [];\n let ancestor = element.parentNode.closest(selector);\n while (ancestor) {\n parents.push(ancestor);\n ancestor = ancestor.parentNode.closest(selector);\n }\n return parents;\n },\n prev(element, selector) {\n let previous = element.previousElementSibling;\n while (previous) {\n if (previous.matches(selector)) {\n return [previous];\n }\n previous = previous.previousElementSibling;\n }\n return [];\n },\n // TODO: this is now unused; remove later along with prev()\n next(element, selector) {\n let next = element.nextElementSibling;\n while (next) {\n if (next.matches(selector)) {\n return [next];\n }\n next = next.nextElementSibling;\n }\n return [];\n },\n focusableChildren(element) {\n const focusables = ['a', 'button', 'input', 'textarea', 'select', 'details', '[tabindex]', '[contenteditable=\"true\"]'].map(selector => `${selector}:not([tabindex^=\"-\"])`).join(',');\n return this.find(focusables, element).filter(el => !isDisabled(el) && isVisible(el));\n },\n getSelectorFromElement(element) {\n const selector = getSelector(element);\n if (selector) {\n return SelectorEngine.findOne(selector) ? selector : null;\n }\n return null;\n },\n getElementFromSelector(element) {\n const selector = getSelector(element);\n return selector ? SelectorEngine.findOne(selector) : null;\n },\n getMultipleElementsFromSelector(element) {\n const selector = getSelector(element);\n return selector ? SelectorEngine.find(selector) : [];\n }\n};\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap util/component-functions.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nconst enableDismissTrigger = (component, method = 'hide') => {\n const clickEvent = `click.dismiss${component.EVENT_KEY}`;\n const name = component.NAME;\n EventHandler.on(document, clickEvent, `[data-bs-dismiss=\"${name}\"]`, function (event) {\n if (['A', 'AREA'].includes(this.tagName)) {\n event.preventDefault();\n }\n if (isDisabled(this)) {\n return;\n }\n const target = SelectorEngine.getElementFromSelector(this) || this.closest(`.${name}`);\n const instance = component.getOrCreateInstance(target);\n\n // Method argument is left, for Alert and only, as it doesn't implement the 'hide' method\n instance[method]();\n });\n};\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap alert.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Constants\n */\n\nconst NAME$f = 'alert';\nconst DATA_KEY$a = 'bs.alert';\nconst EVENT_KEY$b = `.${DATA_KEY$a}`;\nconst EVENT_CLOSE = `close${EVENT_KEY$b}`;\nconst EVENT_CLOSED = `closed${EVENT_KEY$b}`;\nconst CLASS_NAME_FADE$5 = 'fade';\nconst CLASS_NAME_SHOW$8 = 'show';\n\n/**\n * Class definition\n */\n\nclass Alert extends BaseComponent {\n // Getters\n static get NAME() {\n return NAME$f;\n }\n\n // Public\n close() {\n const closeEvent = EventHandler.trigger(this._element, EVENT_CLOSE);\n if (closeEvent.defaultPrevented) {\n return;\n }\n this._element.classList.remove(CLASS_NAME_SHOW$8);\n const isAnimated = this._element.classList.contains(CLASS_NAME_FADE$5);\n this._queueCallback(() => this._destroyElement(), this._element, isAnimated);\n }\n\n // Private\n _destroyElement() {\n this._element.remove();\n EventHandler.trigger(this._element, EVENT_CLOSED);\n this.dispose();\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Alert.getOrCreateInstance(this);\n if (typeof config !== 'string') {\n return;\n }\n if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {\n throw new TypeError(`No method named \"${config}\"`);\n }\n data[config](this);\n });\n }\n}\n\n/**\n * Data API implementation\n */\n\nenableDismissTrigger(Alert, 'close');\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Alert);\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap button.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Constants\n */\n\nconst NAME$e = 'button';\nconst DATA_KEY$9 = 'bs.button';\nconst EVENT_KEY$a = `.${DATA_KEY$9}`;\nconst DATA_API_KEY$6 = '.data-api';\nconst CLASS_NAME_ACTIVE$3 = 'active';\nconst SELECTOR_DATA_TOGGLE$5 = '[data-bs-toggle=\"button\"]';\nconst EVENT_CLICK_DATA_API$6 = `click${EVENT_KEY$a}${DATA_API_KEY$6}`;\n\n/**\n * Class definition\n */\n\nclass Button extends BaseComponent {\n // Getters\n static get NAME() {\n return NAME$e;\n }\n\n // Public\n toggle() {\n // Toggle class and sync the `aria-pressed` attribute with the return value of the `.toggle()` method\n this._element.setAttribute('aria-pressed', this._element.classList.toggle(CLASS_NAME_ACTIVE$3));\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Button.getOrCreateInstance(this);\n if (config === 'toggle') {\n data[config]();\n }\n });\n }\n}\n\n/**\n * Data API implementation\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API$6, SELECTOR_DATA_TOGGLE$5, event => {\n event.preventDefault();\n const button = event.target.closest(SELECTOR_DATA_TOGGLE$5);\n const data = Button.getOrCreateInstance(button);\n data.toggle();\n});\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Button);\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap util/swipe.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Constants\n */\n\nconst NAME$d = 'swipe';\nconst EVENT_KEY$9 = '.bs.swipe';\nconst EVENT_TOUCHSTART = `touchstart${EVENT_KEY$9}`;\nconst EVENT_TOUCHMOVE = `touchmove${EVENT_KEY$9}`;\nconst EVENT_TOUCHEND = `touchend${EVENT_KEY$9}`;\nconst EVENT_POINTERDOWN = `pointerdown${EVENT_KEY$9}`;\nconst EVENT_POINTERUP = `pointerup${EVENT_KEY$9}`;\nconst POINTER_TYPE_TOUCH = 'touch';\nconst POINTER_TYPE_PEN = 'pen';\nconst CLASS_NAME_POINTER_EVENT = 'pointer-event';\nconst SWIPE_THRESHOLD = 40;\nconst Default$c = {\n endCallback: null,\n leftCallback: null,\n rightCallback: null\n};\nconst DefaultType$c = {\n endCallback: '(function|null)',\n leftCallback: '(function|null)',\n rightCallback: '(function|null)'\n};\n\n/**\n * Class definition\n */\n\nclass Swipe extends Config {\n constructor(element, config) {\n super();\n this._element = element;\n if (!element || !Swipe.isSupported()) {\n return;\n }\n this._config = this._getConfig(config);\n this._deltaX = 0;\n this._supportPointerEvents = Boolean(window.PointerEvent);\n this._initEvents();\n }\n\n // Getters\n static get Default() {\n return Default$c;\n }\n static get DefaultType() {\n return DefaultType$c;\n }\n static get NAME() {\n return NAME$d;\n }\n\n // Public\n dispose() {\n EventHandler.off(this._element, EVENT_KEY$9);\n }\n\n // Private\n _start(event) {\n if (!this._supportPointerEvents) {\n this._deltaX = event.touches[0].clientX;\n return;\n }\n if (this._eventIsPointerPenTouch(event)) {\n this._deltaX = event.clientX;\n }\n }\n _end(event) {\n if (this._eventIsPointerPenTouch(event)) {\n this._deltaX = event.clientX - this._deltaX;\n }\n this._handleSwipe();\n execute(this._config.endCallback);\n }\n _move(event) {\n this._deltaX = event.touches && event.touches.length > 1 ? 0 : event.touches[0].clientX - this._deltaX;\n }\n _handleSwipe() {\n const absDeltaX = Math.abs(this._deltaX);\n if (absDeltaX <= SWIPE_THRESHOLD) {\n return;\n }\n const direction = absDeltaX / this._deltaX;\n this._deltaX = 0;\n if (!direction) {\n return;\n }\n execute(direction > 0 ? this._config.rightCallback : this._config.leftCallback);\n }\n _initEvents() {\n if (this._supportPointerEvents) {\n EventHandler.on(this._element, EVENT_POINTERDOWN, event => this._start(event));\n EventHandler.on(this._element, EVENT_POINTERUP, event => this._end(event));\n this._element.classList.add(CLASS_NAME_POINTER_EVENT);\n } else {\n EventHandler.on(this._element, EVENT_TOUCHSTART, event => this._start(event));\n EventHandler.on(this._element, EVENT_TOUCHMOVE, event => this._move(event));\n EventHandler.on(this._element, EVENT_TOUCHEND, event => this._end(event));\n }\n }\n _eventIsPointerPenTouch(event) {\n return this._supportPointerEvents && (event.pointerType === POINTER_TYPE_PEN || event.pointerType === POINTER_TYPE_TOUCH);\n }\n\n // Static\n static isSupported() {\n return 'ontouchstart' in document.documentElement || navigator.maxTouchPoints > 0;\n }\n}\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap carousel.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Constants\n */\n\nconst NAME$c = 'carousel';\nconst DATA_KEY$8 = 'bs.carousel';\nconst EVENT_KEY$8 = `.${DATA_KEY$8}`;\nconst DATA_API_KEY$5 = '.data-api';\nconst ARROW_LEFT_KEY$1 = 'ArrowLeft';\nconst ARROW_RIGHT_KEY$1 = 'ArrowRight';\nconst TOUCHEVENT_COMPAT_WAIT = 500; // Time for mouse compat events to fire after touch\n\nconst ORDER_NEXT = 'next';\nconst ORDER_PREV = 'prev';\nconst DIRECTION_LEFT = 'left';\nconst DIRECTION_RIGHT = 'right';\nconst EVENT_SLIDE = `slide${EVENT_KEY$8}`;\nconst EVENT_SLID = `slid${EVENT_KEY$8}`;\nconst EVENT_KEYDOWN$1 = `keydown${EVENT_KEY$8}`;\nconst EVENT_MOUSEENTER$1 = `mouseenter${EVENT_KEY$8}`;\nconst EVENT_MOUSELEAVE$1 = `mouseleave${EVENT_KEY$8}`;\nconst EVENT_DRAG_START = `dragstart${EVENT_KEY$8}`;\nconst EVENT_LOAD_DATA_API$3 = `load${EVENT_KEY$8}${DATA_API_KEY$5}`;\nconst EVENT_CLICK_DATA_API$5 = `click${EVENT_KEY$8}${DATA_API_KEY$5}`;\nconst CLASS_NAME_CAROUSEL = 'carousel';\nconst CLASS_NAME_ACTIVE$2 = 'active';\nconst CLASS_NAME_SLIDE = 'slide';\nconst CLASS_NAME_END = 'carousel-item-end';\nconst CLASS_NAME_START = 'carousel-item-start';\nconst CLASS_NAME_NEXT = 'carousel-item-next';\nconst CLASS_NAME_PREV = 'carousel-item-prev';\nconst SELECTOR_ACTIVE = '.active';\nconst SELECTOR_ITEM = '.carousel-item';\nconst SELECTOR_ACTIVE_ITEM = SELECTOR_ACTIVE + SELECTOR_ITEM;\nconst SELECTOR_ITEM_IMG = '.carousel-item img';\nconst SELECTOR_INDICATORS = '.carousel-indicators';\nconst SELECTOR_DATA_SLIDE = '[data-bs-slide], [data-bs-slide-to]';\nconst SELECTOR_DATA_RIDE = '[data-bs-ride=\"carousel\"]';\nconst KEY_TO_DIRECTION = {\n [ARROW_LEFT_KEY$1]: DIRECTION_RIGHT,\n [ARROW_RIGHT_KEY$1]: DIRECTION_LEFT\n};\nconst Default$b = {\n interval: 5000,\n keyboard: true,\n pause: 'hover',\n ride: false,\n touch: true,\n wrap: true\n};\nconst DefaultType$b = {\n interval: '(number|boolean)',\n // TODO:v6 remove boolean support\n keyboard: 'boolean',\n pause: '(string|boolean)',\n ride: '(boolean|string)',\n touch: 'boolean',\n wrap: 'boolean'\n};\n\n/**\n * Class definition\n */\n\nclass Carousel extends BaseComponent {\n constructor(element, config) {\n super(element, config);\n this._interval = null;\n this._activeElement = null;\n this._isSliding = false;\n this.touchTimeout = null;\n this._swipeHelper = null;\n this._indicatorsElement = SelectorEngine.findOne(SELECTOR_INDICATORS, this._element);\n this._addEventListeners();\n if (this._config.ride === CLASS_NAME_CAROUSEL) {\n this.cycle();\n }\n }\n\n // Getters\n static get Default() {\n return Default$b;\n }\n static get DefaultType() {\n return DefaultType$b;\n }\n static get NAME() {\n return NAME$c;\n }\n\n // Public\n next() {\n this._slide(ORDER_NEXT);\n }\n nextWhenVisible() {\n // FIXME TODO use `document.visibilityState`\n // Don't call next when the page isn't visible\n // or the carousel or its parent isn't visible\n if (!document.hidden && isVisible(this._element)) {\n this.next();\n }\n }\n prev() {\n this._slide(ORDER_PREV);\n }\n pause() {\n if (this._isSliding) {\n triggerTransitionEnd(this._element);\n }\n this._clearInterval();\n }\n cycle() {\n this._clearInterval();\n this._updateInterval();\n this._interval = setInterval(() => this.nextWhenVisible(), this._config.interval);\n }\n _maybeEnableCycle() {\n if (!this._config.ride) {\n return;\n }\n if (this._isSliding) {\n EventHandler.one(this._element, EVENT_SLID, () => this.cycle());\n return;\n }\n this.cycle();\n }\n to(index) {\n const items = this._getItems();\n if (index > items.length - 1 || index < 0) {\n return;\n }\n if (this._isSliding) {\n EventHandler.one(this._element, EVENT_SLID, () => this.to(index));\n return;\n }\n const activeIndex = this._getItemIndex(this._getActive());\n if (activeIndex === index) {\n return;\n }\n const order = index > activeIndex ? ORDER_NEXT : ORDER_PREV;\n this._slide(order, items[index]);\n }\n dispose() {\n if (this._swipeHelper) {\n this._swipeHelper.dispose();\n }\n super.dispose();\n }\n\n // Private\n _configAfterMerge(config) {\n config.defaultInterval = config.interval;\n return config;\n }\n _addEventListeners() {\n if (this._config.keyboard) {\n EventHandler.on(this._element, EVENT_KEYDOWN$1, event => this._keydown(event));\n }\n if (this._config.pause === 'hover') {\n EventHandler.on(this._element, EVENT_MOUSEENTER$1, () => this.pause());\n EventHandler.on(this._element, EVENT_MOUSELEAVE$1, () => this._maybeEnableCycle());\n }\n if (this._config.touch && Swipe.isSupported()) {\n this._addTouchEventListeners();\n }\n }\n _addTouchEventListeners() {\n for (const img of SelectorEngine.find(SELECTOR_ITEM_IMG, this._element)) {\n EventHandler.on(img, EVENT_DRAG_START, event => event.preventDefault());\n }\n const endCallBack = () => {\n if (this._config.pause !== 'hover') {\n return;\n }\n\n // If it's a touch-enabled device, mouseenter/leave are fired as\n // part of the mouse compatibility events on first tap - the carousel\n // would stop cycling until user tapped out of it;\n // here, we listen for touchend, explicitly pause the carousel\n // (as if it's the second time we tap on it, mouseenter compat event\n // is NOT fired) and after a timeout (to allow for mouse compatibility\n // events to fire) we explicitly restart cycling\n\n this.pause();\n if (this.touchTimeout) {\n clearTimeout(this.touchTimeout);\n }\n this.touchTimeout = setTimeout(() => this._maybeEnableCycle(), TOUCHEVENT_COMPAT_WAIT + this._config.interval);\n };\n const swipeConfig = {\n leftCallback: () => this._slide(this._directionToOrder(DIRECTION_LEFT)),\n rightCallback: () => this._slide(this._directionToOrder(DIRECTION_RIGHT)),\n endCallback: endCallBack\n };\n this._swipeHelper = new Swipe(this._element, swipeConfig);\n }\n _keydown(event) {\n if (/input|textarea/i.test(event.target.tagName)) {\n return;\n }\n const direction = KEY_TO_DIRECTION[event.key];\n if (direction) {\n event.preventDefault();\n this._slide(this._directionToOrder(direction));\n }\n }\n _getItemIndex(element) {\n return this._getItems().indexOf(element);\n }\n _setActiveIndicatorElement(index) {\n if (!this._indicatorsElement) {\n return;\n }\n const activeIndicator = SelectorEngine.findOne(SELECTOR_ACTIVE, this._indicatorsElement);\n activeIndicator.classList.remove(CLASS_NAME_ACTIVE$2);\n activeIndicator.removeAttribute('aria-current');\n const newActiveIndicator = SelectorEngine.findOne(`[data-bs-slide-to=\"${index}\"]`, this._indicatorsElement);\n if (newActiveIndicator) {\n newActiveIndicator.classList.add(CLASS_NAME_ACTIVE$2);\n newActiveIndicator.setAttribute('aria-current', 'true');\n }\n }\n _updateInterval() {\n const element = this._activeElement || this._getActive();\n if (!element) {\n return;\n }\n const elementInterval = Number.parseInt(element.getAttribute('data-bs-interval'), 10);\n this._config.interval = elementInterval || this._config.defaultInterval;\n }\n _slide(order, element = null) {\n if (this._isSliding) {\n return;\n }\n const activeElement = this._getActive();\n const isNext = order === ORDER_NEXT;\n const nextElement = element || getNextActiveElement(this._getItems(), activeElement, isNext, this._config.wrap);\n if (nextElement === activeElement) {\n return;\n }\n const nextElementIndex = this._getItemIndex(nextElement);\n const triggerEvent = eventName => {\n return EventHandler.trigger(this._element, eventName, {\n relatedTarget: nextElement,\n direction: this._orderToDirection(order),\n from: this._getItemIndex(activeElement),\n to: nextElementIndex\n });\n };\n const slideEvent = triggerEvent(EVENT_SLIDE);\n if (slideEvent.defaultPrevented) {\n return;\n }\n if (!activeElement || !nextElement) {\n // Some weirdness is happening, so we bail\n // TODO: change tests that use empty divs to avoid this check\n return;\n }\n const isCycling = Boolean(this._interval);\n this.pause();\n this._isSliding = true;\n this._setActiveIndicatorElement(nextElementIndex);\n this._activeElement = nextElement;\n const directionalClassName = isNext ? CLASS_NAME_START : CLASS_NAME_END;\n const orderClassName = isNext ? CLASS_NAME_NEXT : CLASS_NAME_PREV;\n nextElement.classList.add(orderClassName);\n reflow(nextElement);\n activeElement.classList.add(directionalClassName);\n nextElement.classList.add(directionalClassName);\n const completeCallBack = () => {\n nextElement.classList.remove(directionalClassName, orderClassName);\n nextElement.classList.add(CLASS_NAME_ACTIVE$2);\n activeElement.classList.remove(CLASS_NAME_ACTIVE$2, orderClassName, directionalClassName);\n this._isSliding = false;\n triggerEvent(EVENT_SLID);\n };\n this._queueCallback(completeCallBack, activeElement, this._isAnimated());\n if (isCycling) {\n this.cycle();\n }\n }\n _isAnimated() {\n return this._element.classList.contains(CLASS_NAME_SLIDE);\n }\n _getActive() {\n return SelectorEngine.findOne(SELECTOR_ACTIVE_ITEM, this._element);\n }\n _getItems() {\n return SelectorEngine.find(SELECTOR_ITEM, this._element);\n }\n _clearInterval() {\n if (this._interval) {\n clearInterval(this._interval);\n this._interval = null;\n }\n }\n _directionToOrder(direction) {\n if (isRTL()) {\n return direction === DIRECTION_LEFT ? ORDER_PREV : ORDER_NEXT;\n }\n return direction === DIRECTION_LEFT ? ORDER_NEXT : ORDER_PREV;\n }\n _orderToDirection(order) {\n if (isRTL()) {\n return order === ORDER_PREV ? DIRECTION_LEFT : DIRECTION_RIGHT;\n }\n return order === ORDER_PREV ? DIRECTION_RIGHT : DIRECTION_LEFT;\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Carousel.getOrCreateInstance(this, config);\n if (typeof config === 'number') {\n data.to(config);\n return;\n }\n if (typeof config === 'string') {\n if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {\n throw new TypeError(`No method named \"${config}\"`);\n }\n data[config]();\n }\n });\n }\n}\n\n/**\n * Data API implementation\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API$5, SELECTOR_DATA_SLIDE, function (event) {\n const target = SelectorEngine.getElementFromSelector(this);\n if (!target || !target.classList.contains(CLASS_NAME_CAROUSEL)) {\n return;\n }\n event.preventDefault();\n const carousel = Carousel.getOrCreateInstance(target);\n const slideIndex = this.getAttribute('data-bs-slide-to');\n if (slideIndex) {\n carousel.to(slideIndex);\n carousel._maybeEnableCycle();\n return;\n }\n if (Manipulator.getDataAttribute(this, 'slide') === 'next') {\n carousel.next();\n carousel._maybeEnableCycle();\n return;\n }\n carousel.prev();\n carousel._maybeEnableCycle();\n});\nEventHandler.on(window, EVENT_LOAD_DATA_API$3, () => {\n const carousels = SelectorEngine.find(SELECTOR_DATA_RIDE);\n for (const carousel of carousels) {\n Carousel.getOrCreateInstance(carousel);\n }\n});\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Carousel);\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap collapse.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Constants\n */\n\nconst NAME$b = 'collapse';\nconst DATA_KEY$7 = 'bs.collapse';\nconst EVENT_KEY$7 = `.${DATA_KEY$7}`;\nconst DATA_API_KEY$4 = '.data-api';\nconst EVENT_SHOW$6 = `show${EVENT_KEY$7}`;\nconst EVENT_SHOWN$6 = `shown${EVENT_KEY$7}`;\nconst EVENT_HIDE$6 = `hide${EVENT_KEY$7}`;\nconst EVENT_HIDDEN$6 = `hidden${EVENT_KEY$7}`;\nconst EVENT_CLICK_DATA_API$4 = `click${EVENT_KEY$7}${DATA_API_KEY$4}`;\nconst CLASS_NAME_SHOW$7 = 'show';\nconst CLASS_NAME_COLLAPSE = 'collapse';\nconst CLASS_NAME_COLLAPSING = 'collapsing';\nconst CLASS_NAME_COLLAPSED = 'collapsed';\nconst CLASS_NAME_DEEPER_CHILDREN = `:scope .${CLASS_NAME_COLLAPSE} .${CLASS_NAME_COLLAPSE}`;\nconst CLASS_NAME_HORIZONTAL = 'collapse-horizontal';\nconst WIDTH = 'width';\nconst HEIGHT = 'height';\nconst SELECTOR_ACTIVES = '.collapse.show, .collapse.collapsing';\nconst SELECTOR_DATA_TOGGLE$4 = '[data-bs-toggle=\"collapse\"]';\nconst Default$a = {\n parent: null,\n toggle: true\n};\nconst DefaultType$a = {\n parent: '(null|element)',\n toggle: 'boolean'\n};\n\n/**\n * Class definition\n */\n\nclass Collapse extends BaseComponent {\n constructor(element, config) {\n super(element, config);\n this._isTransitioning = false;\n this._triggerArray = [];\n const toggleList = SelectorEngine.find(SELECTOR_DATA_TOGGLE$4);\n for (const elem of toggleList) {\n const selector = SelectorEngine.getSelectorFromElement(elem);\n const filterElement = SelectorEngine.find(selector).filter(foundElement => foundElement === this._element);\n if (selector !== null && filterElement.length) {\n this._triggerArray.push(elem);\n }\n }\n this._initializeChildren();\n if (!this._config.parent) {\n this._addAriaAndCollapsedClass(this._triggerArray, this._isShown());\n }\n if (this._config.toggle) {\n this.toggle();\n }\n }\n\n // Getters\n static get Default() {\n return Default$a;\n }\n static get DefaultType() {\n return DefaultType$a;\n }\n static get NAME() {\n return NAME$b;\n }\n\n // Public\n toggle() {\n if (this._isShown()) {\n this.hide();\n } else {\n this.show();\n }\n }\n show() {\n if (this._isTransitioning || this._isShown()) {\n return;\n }\n let activeChildren = [];\n\n // find active children\n if (this._config.parent) {\n activeChildren = this._getFirstLevelChildren(SELECTOR_ACTIVES).filter(element => element !== this._element).map(element => Collapse.getOrCreateInstance(element, {\n toggle: false\n }));\n }\n if (activeChildren.length && activeChildren[0]._isTransitioning) {\n return;\n }\n const startEvent = EventHandler.trigger(this._element, EVENT_SHOW$6);\n if (startEvent.defaultPrevented) {\n return;\n }\n for (const activeInstance of activeChildren) {\n activeInstance.hide();\n }\n const dimension = this._getDimension();\n this._element.classList.remove(CLASS_NAME_COLLAPSE);\n this._element.classList.add(CLASS_NAME_COLLAPSING);\n this._element.style[dimension] = 0;\n this._addAriaAndCollapsedClass(this._triggerArray, true);\n this._isTransitioning = true;\n const complete = () => {\n this._isTransitioning = false;\n this._element.classList.remove(CLASS_NAME_COLLAPSING);\n this._element.classList.add(CLASS_NAME_COLLAPSE, CLASS_NAME_SHOW$7);\n this._element.style[dimension] = '';\n EventHandler.trigger(this._element, EVENT_SHOWN$6);\n };\n const capitalizedDimension = dimension[0].toUpperCase() + dimension.slice(1);\n const scrollSize = `scroll${capitalizedDimension}`;\n this._queueCallback(complete, this._element, true);\n this._element.style[dimension] = `${this._element[scrollSize]}px`;\n }\n hide() {\n if (this._isTransitioning || !this._isShown()) {\n return;\n }\n const startEvent = EventHandler.trigger(this._element, EVENT_HIDE$6);\n if (startEvent.defaultPrevented) {\n return;\n }\n const dimension = this._getDimension();\n this._element.style[dimension] = `${this._element.getBoundingClientRect()[dimension]}px`;\n reflow(this._element);\n this._element.classList.add(CLASS_NAME_COLLAPSING);\n this._element.classList.remove(CLASS_NAME_COLLAPSE, CLASS_NAME_SHOW$7);\n for (const trigger of this._triggerArray) {\n const element = SelectorEngine.getElementFromSelector(trigger);\n if (element && !this._isShown(element)) {\n this._addAriaAndCollapsedClass([trigger], false);\n }\n }\n this._isTransitioning = true;\n const complete = () => {\n this._isTransitioning = false;\n this._element.classList.remove(CLASS_NAME_COLLAPSING);\n this._element.classList.add(CLASS_NAME_COLLAPSE);\n EventHandler.trigger(this._element, EVENT_HIDDEN$6);\n };\n this._element.style[dimension] = '';\n this._queueCallback(complete, this._element, true);\n }\n _isShown(element = this._element) {\n return element.classList.contains(CLASS_NAME_SHOW$7);\n }\n\n // Private\n _configAfterMerge(config) {\n config.toggle = Boolean(config.toggle); // Coerce string values\n config.parent = getElement(config.parent);\n return config;\n }\n _getDimension() {\n return this._element.classList.contains(CLASS_NAME_HORIZONTAL) ? WIDTH : HEIGHT;\n }\n _initializeChildren() {\n if (!this._config.parent) {\n return;\n }\n const children = this._getFirstLevelChildren(SELECTOR_DATA_TOGGLE$4);\n for (const element of children) {\n const selected = SelectorEngine.getElementFromSelector(element);\n if (selected) {\n this._addAriaAndCollapsedClass([element], this._isShown(selected));\n }\n }\n }\n _getFirstLevelChildren(selector) {\n const children = SelectorEngine.find(CLASS_NAME_DEEPER_CHILDREN, this._config.parent);\n // remove children if greater depth\n return SelectorEngine.find(selector, this._config.parent).filter(element => !children.includes(element));\n }\n _addAriaAndCollapsedClass(triggerArray, isOpen) {\n if (!triggerArray.length) {\n return;\n }\n for (const element of triggerArray) {\n element.classList.toggle(CLASS_NAME_COLLAPSED, !isOpen);\n element.setAttribute('aria-expanded', isOpen);\n }\n }\n\n // Static\n static jQueryInterface(config) {\n const _config = {};\n if (typeof config === 'string' && /show|hide/.test(config)) {\n _config.toggle = false;\n }\n return this.each(function () {\n const data = Collapse.getOrCreateInstance(this, _config);\n if (typeof config === 'string') {\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`);\n }\n data[config]();\n }\n });\n }\n}\n\n/**\n * Data API implementation\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API$4, SELECTOR_DATA_TOGGLE$4, function (event) {\n // preventDefault only for elements (which change the URL) not inside the collapsible element\n if (event.target.tagName === 'A' || event.delegateTarget && event.delegateTarget.tagName === 'A') {\n event.preventDefault();\n }\n for (const element of SelectorEngine.getMultipleElementsFromSelector(this)) {\n Collapse.getOrCreateInstance(element, {\n toggle: false\n }).toggle();\n }\n});\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Collapse);\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap dropdown.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Constants\n */\n\nconst NAME$a = 'dropdown';\nconst DATA_KEY$6 = 'bs.dropdown';\nconst EVENT_KEY$6 = `.${DATA_KEY$6}`;\nconst DATA_API_KEY$3 = '.data-api';\nconst ESCAPE_KEY$2 = 'Escape';\nconst TAB_KEY$1 = 'Tab';\nconst ARROW_UP_KEY$1 = 'ArrowUp';\nconst ARROW_DOWN_KEY$1 = 'ArrowDown';\nconst RIGHT_MOUSE_BUTTON = 2; // MouseEvent.button value for the secondary button, usually the right button\n\nconst EVENT_HIDE$5 = `hide${EVENT_KEY$6}`;\nconst EVENT_HIDDEN$5 = `hidden${EVENT_KEY$6}`;\nconst EVENT_SHOW$5 = `show${EVENT_KEY$6}`;\nconst EVENT_SHOWN$5 = `shown${EVENT_KEY$6}`;\nconst EVENT_CLICK_DATA_API$3 = `click${EVENT_KEY$6}${DATA_API_KEY$3}`;\nconst EVENT_KEYDOWN_DATA_API = `keydown${EVENT_KEY$6}${DATA_API_KEY$3}`;\nconst EVENT_KEYUP_DATA_API = `keyup${EVENT_KEY$6}${DATA_API_KEY$3}`;\nconst CLASS_NAME_SHOW$6 = 'show';\nconst CLASS_NAME_DROPUP = 'dropup';\nconst CLASS_NAME_DROPEND = 'dropend';\nconst CLASS_NAME_DROPSTART = 'dropstart';\nconst CLASS_NAME_DROPUP_CENTER = 'dropup-center';\nconst CLASS_NAME_DROPDOWN_CENTER = 'dropdown-center';\nconst SELECTOR_DATA_TOGGLE$3 = '[data-bs-toggle=\"dropdown\"]:not(.disabled):not(:disabled)';\nconst SELECTOR_DATA_TOGGLE_SHOWN = `${SELECTOR_DATA_TOGGLE$3}.${CLASS_NAME_SHOW$6}`;\nconst SELECTOR_MENU = '.dropdown-menu';\nconst SELECTOR_NAVBAR = '.navbar';\nconst SELECTOR_NAVBAR_NAV = '.navbar-nav';\nconst SELECTOR_VISIBLE_ITEMS = '.dropdown-menu .dropdown-item:not(.disabled):not(:disabled)';\nconst PLACEMENT_TOP = isRTL() ? 'top-end' : 'top-start';\nconst PLACEMENT_TOPEND = isRTL() ? 'top-start' : 'top-end';\nconst PLACEMENT_BOTTOM = isRTL() ? 'bottom-end' : 'bottom-start';\nconst PLACEMENT_BOTTOMEND = isRTL() ? 'bottom-start' : 'bottom-end';\nconst PLACEMENT_RIGHT = isRTL() ? 'left-start' : 'right-start';\nconst PLACEMENT_LEFT = isRTL() ? 'right-start' : 'left-start';\nconst PLACEMENT_TOPCENTER = 'top';\nconst PLACEMENT_BOTTOMCENTER = 'bottom';\nconst Default$9 = {\n autoClose: true,\n boundary: 'clippingParents',\n display: 'dynamic',\n offset: [0, 2],\n popperConfig: null,\n reference: 'toggle'\n};\nconst DefaultType$9 = {\n autoClose: '(boolean|string)',\n boundary: '(string|element)',\n display: 'string',\n offset: '(array|string|function)',\n popperConfig: '(null|object|function)',\n reference: '(string|element|object)'\n};\n\n/**\n * Class definition\n */\n\nclass Dropdown extends BaseComponent {\n constructor(element, config) {\n super(element, config);\n this._popper = null;\n this._parent = this._element.parentNode; // dropdown wrapper\n // TODO: v6 revert #37011 & change markup https://getbootstrap.com/docs/5.3/forms/input-group/\n this._menu = SelectorEngine.next(this._element, SELECTOR_MENU)[0] || SelectorEngine.prev(this._element, SELECTOR_MENU)[0] || SelectorEngine.findOne(SELECTOR_MENU, this._parent);\n this._inNavbar = this._detectNavbar();\n }\n\n // Getters\n static get Default() {\n return Default$9;\n }\n static get DefaultType() {\n return DefaultType$9;\n }\n static get NAME() {\n return NAME$a;\n }\n\n // Public\n toggle() {\n return this._isShown() ? this.hide() : this.show();\n }\n show() {\n if (isDisabled(this._element) || this._isShown()) {\n return;\n }\n const relatedTarget = {\n relatedTarget: this._element\n };\n const showEvent = EventHandler.trigger(this._element, EVENT_SHOW$5, relatedTarget);\n if (showEvent.defaultPrevented) {\n return;\n }\n this._createPopper();\n\n // If this is a touch-enabled device we add extra\n // empty mouseover listeners to the body's immediate children;\n // only needed because of broken event delegation on iOS\n // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html\n if ('ontouchstart' in document.documentElement && !this._parent.closest(SELECTOR_NAVBAR_NAV)) {\n for (const element of [].concat(...document.body.children)) {\n EventHandler.on(element, 'mouseover', noop);\n }\n }\n this._element.focus();\n this._element.setAttribute('aria-expanded', true);\n this._menu.classList.add(CLASS_NAME_SHOW$6);\n this._element.classList.add(CLASS_NAME_SHOW$6);\n EventHandler.trigger(this._element, EVENT_SHOWN$5, relatedTarget);\n }\n hide() {\n if (isDisabled(this._element) || !this._isShown()) {\n return;\n }\n const relatedTarget = {\n relatedTarget: this._element\n };\n this._completeHide(relatedTarget);\n }\n dispose() {\n if (this._popper) {\n this._popper.destroy();\n }\n super.dispose();\n }\n update() {\n this._inNavbar = this._detectNavbar();\n if (this._popper) {\n this._popper.update();\n }\n }\n\n // Private\n _completeHide(relatedTarget) {\n const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE$5, relatedTarget);\n if (hideEvent.defaultPrevented) {\n return;\n }\n\n // If this is a touch-enabled device we remove the extra\n // empty mouseover listeners we added for iOS support\n if ('ontouchstart' in document.documentElement) {\n for (const element of [].concat(...document.body.children)) {\n EventHandler.off(element, 'mouseover', noop);\n }\n }\n if (this._popper) {\n this._popper.destroy();\n }\n this._menu.classList.remove(CLASS_NAME_SHOW$6);\n this._element.classList.remove(CLASS_NAME_SHOW$6);\n this._element.setAttribute('aria-expanded', 'false');\n Manipulator.removeDataAttribute(this._menu, 'popper');\n EventHandler.trigger(this._element, EVENT_HIDDEN$5, relatedTarget);\n }\n _getConfig(config) {\n config = super._getConfig(config);\n if (typeof config.reference === 'object' && !isElement(config.reference) && typeof config.reference.getBoundingClientRect !== 'function') {\n // Popper virtual elements require a getBoundingClientRect method\n throw new TypeError(`${NAME$a.toUpperCase()}: Option \"reference\" provided type \"object\" without a required \"getBoundingClientRect\" method.`);\n }\n return config;\n }\n _createPopper() {\n if (typeof Popper === 'undefined') {\n throw new TypeError('Bootstrap\\'s dropdowns require Popper (https://popper.js.org)');\n }\n let referenceElement = this._element;\n if (this._config.reference === 'parent') {\n referenceElement = this._parent;\n } else if (isElement(this._config.reference)) {\n referenceElement = getElement(this._config.reference);\n } else if (typeof this._config.reference === 'object') {\n referenceElement = this._config.reference;\n }\n const popperConfig = this._getPopperConfig();\n this._popper = Popper.createPopper(referenceElement, this._menu, popperConfig);\n }\n _isShown() {\n return this._menu.classList.contains(CLASS_NAME_SHOW$6);\n }\n _getPlacement() {\n const parentDropdown = this._parent;\n if (parentDropdown.classList.contains(CLASS_NAME_DROPEND)) {\n return PLACEMENT_RIGHT;\n }\n if (parentDropdown.classList.contains(CLASS_NAME_DROPSTART)) {\n return PLACEMENT_LEFT;\n }\n if (parentDropdown.classList.contains(CLASS_NAME_DROPUP_CENTER)) {\n return PLACEMENT_TOPCENTER;\n }\n if (parentDropdown.classList.contains(CLASS_NAME_DROPDOWN_CENTER)) {\n return PLACEMENT_BOTTOMCENTER;\n }\n\n // We need to trim the value because custom properties can also include spaces\n const isEnd = getComputedStyle(this._menu).getPropertyValue('--bs-position').trim() === 'end';\n if (parentDropdown.classList.contains(CLASS_NAME_DROPUP)) {\n return isEnd ? PLACEMENT_TOPEND : PLACEMENT_TOP;\n }\n return isEnd ? PLACEMENT_BOTTOMEND : PLACEMENT_BOTTOM;\n }\n _detectNavbar() {\n return this._element.closest(SELECTOR_NAVBAR) !== null;\n }\n _getOffset() {\n const {\n offset\n } = this._config;\n if (typeof offset === 'string') {\n return offset.split(',').map(value => Number.parseInt(value, 10));\n }\n if (typeof offset === 'function') {\n return popperData => offset(popperData, this._element);\n }\n return offset;\n }\n _getPopperConfig() {\n const defaultBsPopperConfig = {\n placement: this._getPlacement(),\n modifiers: [{\n name: 'preventOverflow',\n options: {\n boundary: this._config.boundary\n }\n }, {\n name: 'offset',\n options: {\n offset: this._getOffset()\n }\n }]\n };\n\n // Disable Popper if we have a static display or Dropdown is in Navbar\n if (this._inNavbar || this._config.display === 'static') {\n Manipulator.setDataAttribute(this._menu, 'popper', 'static'); // TODO: v6 remove\n defaultBsPopperConfig.modifiers = [{\n name: 'applyStyles',\n enabled: false\n }];\n }\n return {\n ...defaultBsPopperConfig,\n ...execute(this._config.popperConfig, [defaultBsPopperConfig])\n };\n }\n _selectMenuItem({\n key,\n target\n }) {\n const items = SelectorEngine.find(SELECTOR_VISIBLE_ITEMS, this._menu).filter(element => isVisible(element));\n if (!items.length) {\n return;\n }\n\n // if target isn't included in items (e.g. when expanding the dropdown)\n // allow cycling to get the last item in case key equals ARROW_UP_KEY\n getNextActiveElement(items, target, key === ARROW_DOWN_KEY$1, !items.includes(target)).focus();\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Dropdown.getOrCreateInstance(this, config);\n if (typeof config !== 'string') {\n return;\n }\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`);\n }\n data[config]();\n });\n }\n static clearMenus(event) {\n if (event.button === RIGHT_MOUSE_BUTTON || event.type === 'keyup' && event.key !== TAB_KEY$1) {\n return;\n }\n const openToggles = SelectorEngine.find(SELECTOR_DATA_TOGGLE_SHOWN);\n for (const toggle of openToggles) {\n const context = Dropdown.getInstance(toggle);\n if (!context || context._config.autoClose === false) {\n continue;\n }\n const composedPath = event.composedPath();\n const isMenuTarget = composedPath.includes(context._menu);\n if (composedPath.includes(context._element) || context._config.autoClose === 'inside' && !isMenuTarget || context._config.autoClose === 'outside' && isMenuTarget) {\n continue;\n }\n\n // Tab navigation through the dropdown menu or events from contained inputs shouldn't close the menu\n if (context._menu.contains(event.target) && (event.type === 'keyup' && event.key === TAB_KEY$1 || /input|select|option|textarea|form/i.test(event.target.tagName))) {\n continue;\n }\n const relatedTarget = {\n relatedTarget: context._element\n };\n if (event.type === 'click') {\n relatedTarget.clickEvent = event;\n }\n context._completeHide(relatedTarget);\n }\n }\n static dataApiKeydownHandler(event) {\n // If not an UP | DOWN | ESCAPE key => not a dropdown command\n // If input/textarea && if key is other than ESCAPE => not a dropdown command\n\n const isInput = /input|textarea/i.test(event.target.tagName);\n const isEscapeEvent = event.key === ESCAPE_KEY$2;\n const isUpOrDownEvent = [ARROW_UP_KEY$1, ARROW_DOWN_KEY$1].includes(event.key);\n if (!isUpOrDownEvent && !isEscapeEvent) {\n return;\n }\n if (isInput && !isEscapeEvent) {\n return;\n }\n event.preventDefault();\n\n // TODO: v6 revert #37011 & change markup https://getbootstrap.com/docs/5.3/forms/input-group/\n const getToggleButton = this.matches(SELECTOR_DATA_TOGGLE$3) ? this : SelectorEngine.prev(this, SELECTOR_DATA_TOGGLE$3)[0] || SelectorEngine.next(this, SELECTOR_DATA_TOGGLE$3)[0] || SelectorEngine.findOne(SELECTOR_DATA_TOGGLE$3, event.delegateTarget.parentNode);\n const instance = Dropdown.getOrCreateInstance(getToggleButton);\n if (isUpOrDownEvent) {\n event.stopPropagation();\n instance.show();\n instance._selectMenuItem(event);\n return;\n }\n if (instance._isShown()) {\n // else is escape and we check if it is shown\n event.stopPropagation();\n instance.hide();\n getToggleButton.focus();\n }\n }\n}\n\n/**\n * Data API implementation\n */\n\nEventHandler.on(document, EVENT_KEYDOWN_DATA_API, SELECTOR_DATA_TOGGLE$3, Dropdown.dataApiKeydownHandler);\nEventHandler.on(document, EVENT_KEYDOWN_DATA_API, SELECTOR_MENU, Dropdown.dataApiKeydownHandler);\nEventHandler.on(document, EVENT_CLICK_DATA_API$3, Dropdown.clearMenus);\nEventHandler.on(document, EVENT_KEYUP_DATA_API, Dropdown.clearMenus);\nEventHandler.on(document, EVENT_CLICK_DATA_API$3, SELECTOR_DATA_TOGGLE$3, function (event) {\n event.preventDefault();\n Dropdown.getOrCreateInstance(this).toggle();\n});\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Dropdown);\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap util/backdrop.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Constants\n */\n\nconst NAME$9 = 'backdrop';\nconst CLASS_NAME_FADE$4 = 'fade';\nconst CLASS_NAME_SHOW$5 = 'show';\nconst EVENT_MOUSEDOWN = `mousedown.bs.${NAME$9}`;\nconst Default$8 = {\n className: 'modal-backdrop',\n clickCallback: null,\n isAnimated: false,\n isVisible: true,\n // if false, we use the backdrop helper without adding any element to the dom\n rootElement: 'body' // give the choice to place backdrop under different elements\n};\n\nconst DefaultType$8 = {\n className: 'string',\n clickCallback: '(function|null)',\n isAnimated: 'boolean',\n isVisible: 'boolean',\n rootElement: '(element|string)'\n};\n\n/**\n * Class definition\n */\n\nclass Backdrop extends Config {\n constructor(config) {\n super();\n this._config = this._getConfig(config);\n this._isAppended = false;\n this._element = null;\n }\n\n // Getters\n static get Default() {\n return Default$8;\n }\n static get DefaultType() {\n return DefaultType$8;\n }\n static get NAME() {\n return NAME$9;\n }\n\n // Public\n show(callback) {\n if (!this._config.isVisible) {\n execute(callback);\n return;\n }\n this._append();\n const element = this._getElement();\n if (this._config.isAnimated) {\n reflow(element);\n }\n element.classList.add(CLASS_NAME_SHOW$5);\n this._emulateAnimation(() => {\n execute(callback);\n });\n }\n hide(callback) {\n if (!this._config.isVisible) {\n execute(callback);\n return;\n }\n this._getElement().classList.remove(CLASS_NAME_SHOW$5);\n this._emulateAnimation(() => {\n this.dispose();\n execute(callback);\n });\n }\n dispose() {\n if (!this._isAppended) {\n return;\n }\n EventHandler.off(this._element, EVENT_MOUSEDOWN);\n this._element.remove();\n this._isAppended = false;\n }\n\n // Private\n _getElement() {\n if (!this._element) {\n const backdrop = document.createElement('div');\n backdrop.className = this._config.className;\n if (this._config.isAnimated) {\n backdrop.classList.add(CLASS_NAME_FADE$4);\n }\n this._element = backdrop;\n }\n return this._element;\n }\n _configAfterMerge(config) {\n // use getElement() with the default \"body\" to get a fresh Element on each instantiation\n config.rootElement = getElement(config.rootElement);\n return config;\n }\n _append() {\n if (this._isAppended) {\n return;\n }\n const element = this._getElement();\n this._config.rootElement.append(element);\n EventHandler.on(element, EVENT_MOUSEDOWN, () => {\n execute(this._config.clickCallback);\n });\n this._isAppended = true;\n }\n _emulateAnimation(callback) {\n executeAfterTransition(callback, this._getElement(), this._config.isAnimated);\n }\n}\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap util/focustrap.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Constants\n */\n\nconst NAME$8 = 'focustrap';\nconst DATA_KEY$5 = 'bs.focustrap';\nconst EVENT_KEY$5 = `.${DATA_KEY$5}`;\nconst EVENT_FOCUSIN$2 = `focusin${EVENT_KEY$5}`;\nconst EVENT_KEYDOWN_TAB = `keydown.tab${EVENT_KEY$5}`;\nconst TAB_KEY = 'Tab';\nconst TAB_NAV_FORWARD = 'forward';\nconst TAB_NAV_BACKWARD = 'backward';\nconst Default$7 = {\n autofocus: true,\n trapElement: null // The element to trap focus inside of\n};\n\nconst DefaultType$7 = {\n autofocus: 'boolean',\n trapElement: 'element'\n};\n\n/**\n * Class definition\n */\n\nclass FocusTrap extends Config {\n constructor(config) {\n super();\n this._config = this._getConfig(config);\n this._isActive = false;\n this._lastTabNavDirection = null;\n }\n\n // Getters\n static get Default() {\n return Default$7;\n }\n static get DefaultType() {\n return DefaultType$7;\n }\n static get NAME() {\n return NAME$8;\n }\n\n // Public\n activate() {\n if (this._isActive) {\n return;\n }\n if (this._config.autofocus) {\n this._config.trapElement.focus();\n }\n EventHandler.off(document, EVENT_KEY$5); // guard against infinite focus loop\n EventHandler.on(document, EVENT_FOCUSIN$2, event => this._handleFocusin(event));\n EventHandler.on(document, EVENT_KEYDOWN_TAB, event => this._handleKeydown(event));\n this._isActive = true;\n }\n deactivate() {\n if (!this._isActive) {\n return;\n }\n this._isActive = false;\n EventHandler.off(document, EVENT_KEY$5);\n }\n\n // Private\n _handleFocusin(event) {\n const {\n trapElement\n } = this._config;\n if (event.target === document || event.target === trapElement || trapElement.contains(event.target)) {\n return;\n }\n const elements = SelectorEngine.focusableChildren(trapElement);\n if (elements.length === 0) {\n trapElement.focus();\n } else if (this._lastTabNavDirection === TAB_NAV_BACKWARD) {\n elements[elements.length - 1].focus();\n } else {\n elements[0].focus();\n }\n }\n _handleKeydown(event) {\n if (event.key !== TAB_KEY) {\n return;\n }\n this._lastTabNavDirection = event.shiftKey ? TAB_NAV_BACKWARD : TAB_NAV_FORWARD;\n }\n}\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap util/scrollBar.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Constants\n */\n\nconst SELECTOR_FIXED_CONTENT = '.fixed-top, .fixed-bottom, .is-fixed, .sticky-top';\nconst SELECTOR_STICKY_CONTENT = '.sticky-top';\nconst PROPERTY_PADDING = 'padding-right';\nconst PROPERTY_MARGIN = 'margin-right';\n\n/**\n * Class definition\n */\n\nclass ScrollBarHelper {\n constructor() {\n this._element = document.body;\n }\n\n // Public\n getWidth() {\n // https://developer.mozilla.org/en-US/docs/Web/API/Window/innerWidth#usage_notes\n const documentWidth = document.documentElement.clientWidth;\n return Math.abs(window.innerWidth - documentWidth);\n }\n hide() {\n const width = this.getWidth();\n this._disableOverFlow();\n // give padding to element to balance the hidden scrollbar width\n this._setElementAttributes(this._element, PROPERTY_PADDING, calculatedValue => calculatedValue + width);\n // trick: We adjust positive paddingRight and negative marginRight to sticky-top elements to keep showing fullwidth\n this._setElementAttributes(SELECTOR_FIXED_CONTENT, PROPERTY_PADDING, calculatedValue => calculatedValue + width);\n this._setElementAttributes(SELECTOR_STICKY_CONTENT, PROPERTY_MARGIN, calculatedValue => calculatedValue - width);\n }\n reset() {\n this._resetElementAttributes(this._element, 'overflow');\n this._resetElementAttributes(this._element, PROPERTY_PADDING);\n this._resetElementAttributes(SELECTOR_FIXED_CONTENT, PROPERTY_PADDING);\n this._resetElementAttributes(SELECTOR_STICKY_CONTENT, PROPERTY_MARGIN);\n }\n isOverflowing() {\n return this.getWidth() > 0;\n }\n\n // Private\n _disableOverFlow() {\n this._saveInitialAttribute(this._element, 'overflow');\n this._element.style.overflow = 'hidden';\n }\n _setElementAttributes(selector, styleProperty, callback) {\n const scrollbarWidth = this.getWidth();\n const manipulationCallBack = element => {\n if (element !== this._element && window.innerWidth > element.clientWidth + scrollbarWidth) {\n return;\n }\n this._saveInitialAttribute(element, styleProperty);\n const calculatedValue = window.getComputedStyle(element).getPropertyValue(styleProperty);\n element.style.setProperty(styleProperty, `${callback(Number.parseFloat(calculatedValue))}px`);\n };\n this._applyManipulationCallback(selector, manipulationCallBack);\n }\n _saveInitialAttribute(element, styleProperty) {\n const actualValue = element.style.getPropertyValue(styleProperty);\n if (actualValue) {\n Manipulator.setDataAttribute(element, styleProperty, actualValue);\n }\n }\n _resetElementAttributes(selector, styleProperty) {\n const manipulationCallBack = element => {\n const value = Manipulator.getDataAttribute(element, styleProperty);\n // We only want to remove the property if the value is `null`; the value can also be zero\n if (value === null) {\n element.style.removeProperty(styleProperty);\n return;\n }\n Manipulator.removeDataAttribute(element, styleProperty);\n element.style.setProperty(styleProperty, value);\n };\n this._applyManipulationCallback(selector, manipulationCallBack);\n }\n _applyManipulationCallback(selector, callBack) {\n if (isElement(selector)) {\n callBack(selector);\n return;\n }\n for (const sel of SelectorEngine.find(selector, this._element)) {\n callBack(sel);\n }\n }\n}\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap modal.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Constants\n */\n\nconst NAME$7 = 'modal';\nconst DATA_KEY$4 = 'bs.modal';\nconst EVENT_KEY$4 = `.${DATA_KEY$4}`;\nconst DATA_API_KEY$2 = '.data-api';\nconst ESCAPE_KEY$1 = 'Escape';\nconst EVENT_HIDE$4 = `hide${EVENT_KEY$4}`;\nconst EVENT_HIDE_PREVENTED$1 = `hidePrevented${EVENT_KEY$4}`;\nconst EVENT_HIDDEN$4 = `hidden${EVENT_KEY$4}`;\nconst EVENT_SHOW$4 = `show${EVENT_KEY$4}`;\nconst EVENT_SHOWN$4 = `shown${EVENT_KEY$4}`;\nconst EVENT_RESIZE$1 = `resize${EVENT_KEY$4}`;\nconst EVENT_CLICK_DISMISS = `click.dismiss${EVENT_KEY$4}`;\nconst EVENT_MOUSEDOWN_DISMISS = `mousedown.dismiss${EVENT_KEY$4}`;\nconst EVENT_KEYDOWN_DISMISS$1 = `keydown.dismiss${EVENT_KEY$4}`;\nconst EVENT_CLICK_DATA_API$2 = `click${EVENT_KEY$4}${DATA_API_KEY$2}`;\nconst CLASS_NAME_OPEN = 'modal-open';\nconst CLASS_NAME_FADE$3 = 'fade';\nconst CLASS_NAME_SHOW$4 = 'show';\nconst CLASS_NAME_STATIC = 'modal-static';\nconst OPEN_SELECTOR$1 = '.modal.show';\nconst SELECTOR_DIALOG = '.modal-dialog';\nconst SELECTOR_MODAL_BODY = '.modal-body';\nconst SELECTOR_DATA_TOGGLE$2 = '[data-bs-toggle=\"modal\"]';\nconst Default$6 = {\n backdrop: true,\n focus: true,\n keyboard: true\n};\nconst DefaultType$6 = {\n backdrop: '(boolean|string)',\n focus: 'boolean',\n keyboard: 'boolean'\n};\n\n/**\n * Class definition\n */\n\nclass Modal extends BaseComponent {\n constructor(element, config) {\n super(element, config);\n this._dialog = SelectorEngine.findOne(SELECTOR_DIALOG, this._element);\n this._backdrop = this._initializeBackDrop();\n this._focustrap = this._initializeFocusTrap();\n this._isShown = false;\n this._isTransitioning = false;\n this._scrollBar = new ScrollBarHelper();\n this._addEventListeners();\n }\n\n // Getters\n static get Default() {\n return Default$6;\n }\n static get DefaultType() {\n return DefaultType$6;\n }\n static get NAME() {\n return NAME$7;\n }\n\n // Public\n toggle(relatedTarget) {\n return this._isShown ? this.hide() : this.show(relatedTarget);\n }\n show(relatedTarget) {\n if (this._isShown || this._isTransitioning) {\n return;\n }\n const showEvent = EventHandler.trigger(this._element, EVENT_SHOW$4, {\n relatedTarget\n });\n if (showEvent.defaultPrevented) {\n return;\n }\n this._isShown = true;\n this._isTransitioning = true;\n this._scrollBar.hide();\n document.body.classList.add(CLASS_NAME_OPEN);\n this._adjustDialog();\n this._backdrop.show(() => this._showElement(relatedTarget));\n }\n hide() {\n if (!this._isShown || this._isTransitioning) {\n return;\n }\n const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE$4);\n if (hideEvent.defaultPrevented) {\n return;\n }\n this._isShown = false;\n this._isTransitioning = true;\n this._focustrap.deactivate();\n this._element.classList.remove(CLASS_NAME_SHOW$4);\n this._queueCallback(() => this._hideModal(), this._element, this._isAnimated());\n }\n dispose() {\n EventHandler.off(window, EVENT_KEY$4);\n EventHandler.off(this._dialog, EVENT_KEY$4);\n this._backdrop.dispose();\n this._focustrap.deactivate();\n super.dispose();\n }\n handleUpdate() {\n this._adjustDialog();\n }\n\n // Private\n _initializeBackDrop() {\n return new Backdrop({\n isVisible: Boolean(this._config.backdrop),\n // 'static' option will be translated to true, and booleans will keep their value,\n isAnimated: this._isAnimated()\n });\n }\n _initializeFocusTrap() {\n return new FocusTrap({\n trapElement: this._element\n });\n }\n _showElement(relatedTarget) {\n // try to append dynamic modal\n if (!document.body.contains(this._element)) {\n document.body.append(this._element);\n }\n this._element.style.display = 'block';\n this._element.removeAttribute('aria-hidden');\n this._element.setAttribute('aria-modal', true);\n this._element.setAttribute('role', 'dialog');\n this._element.scrollTop = 0;\n const modalBody = SelectorEngine.findOne(SELECTOR_MODAL_BODY, this._dialog);\n if (modalBody) {\n modalBody.scrollTop = 0;\n }\n reflow(this._element);\n this._element.classList.add(CLASS_NAME_SHOW$4);\n const transitionComplete = () => {\n if (this._config.focus) {\n this._focustrap.activate();\n }\n this._isTransitioning = false;\n EventHandler.trigger(this._element, EVENT_SHOWN$4, {\n relatedTarget\n });\n };\n this._queueCallback(transitionComplete, this._dialog, this._isAnimated());\n }\n _addEventListeners() {\n EventHandler.on(this._element, EVENT_KEYDOWN_DISMISS$1, event => {\n if (event.key !== ESCAPE_KEY$1) {\n return;\n }\n if (this._config.keyboard) {\n this.hide();\n return;\n }\n this._triggerBackdropTransition();\n });\n EventHandler.on(window, EVENT_RESIZE$1, () => {\n if (this._isShown && !this._isTransitioning) {\n this._adjustDialog();\n }\n });\n EventHandler.on(this._element, EVENT_MOUSEDOWN_DISMISS, event => {\n // a bad trick to segregate clicks that may start inside dialog but end outside, and avoid listen to scrollbar clicks\n EventHandler.one(this._element, EVENT_CLICK_DISMISS, event2 => {\n if (this._element !== event.target || this._element !== event2.target) {\n return;\n }\n if (this._config.backdrop === 'static') {\n this._triggerBackdropTransition();\n return;\n }\n if (this._config.backdrop) {\n this.hide();\n }\n });\n });\n }\n _hideModal() {\n this._element.style.display = 'none';\n this._element.setAttribute('aria-hidden', true);\n this._element.removeAttribute('aria-modal');\n this._element.removeAttribute('role');\n this._isTransitioning = false;\n this._backdrop.hide(() => {\n document.body.classList.remove(CLASS_NAME_OPEN);\n this._resetAdjustments();\n this._scrollBar.reset();\n EventHandler.trigger(this._element, EVENT_HIDDEN$4);\n });\n }\n _isAnimated() {\n return this._element.classList.contains(CLASS_NAME_FADE$3);\n }\n _triggerBackdropTransition() {\n const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE_PREVENTED$1);\n if (hideEvent.defaultPrevented) {\n return;\n }\n const isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight;\n const initialOverflowY = this._element.style.overflowY;\n // return if the following background transition hasn't yet completed\n if (initialOverflowY === 'hidden' || this._element.classList.contains(CLASS_NAME_STATIC)) {\n return;\n }\n if (!isModalOverflowing) {\n this._element.style.overflowY = 'hidden';\n }\n this._element.classList.add(CLASS_NAME_STATIC);\n this._queueCallback(() => {\n this._element.classList.remove(CLASS_NAME_STATIC);\n this._queueCallback(() => {\n this._element.style.overflowY = initialOverflowY;\n }, this._dialog);\n }, this._dialog);\n this._element.focus();\n }\n\n /**\n * The following methods are used to handle overflowing modals\n */\n\n _adjustDialog() {\n const isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight;\n const scrollbarWidth = this._scrollBar.getWidth();\n const isBodyOverflowing = scrollbarWidth > 0;\n if (isBodyOverflowing && !isModalOverflowing) {\n const property = isRTL() ? 'paddingLeft' : 'paddingRight';\n this._element.style[property] = `${scrollbarWidth}px`;\n }\n if (!isBodyOverflowing && isModalOverflowing) {\n const property = isRTL() ? 'paddingRight' : 'paddingLeft';\n this._element.style[property] = `${scrollbarWidth}px`;\n }\n }\n _resetAdjustments() {\n this._element.style.paddingLeft = '';\n this._element.style.paddingRight = '';\n }\n\n // Static\n static jQueryInterface(config, relatedTarget) {\n return this.each(function () {\n const data = Modal.getOrCreateInstance(this, config);\n if (typeof config !== 'string') {\n return;\n }\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`);\n }\n data[config](relatedTarget);\n });\n }\n}\n\n/**\n * Data API implementation\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API$2, SELECTOR_DATA_TOGGLE$2, function (event) {\n const target = SelectorEngine.getElementFromSelector(this);\n if (['A', 'AREA'].includes(this.tagName)) {\n event.preventDefault();\n }\n EventHandler.one(target, EVENT_SHOW$4, showEvent => {\n if (showEvent.defaultPrevented) {\n // only register focus restorer if modal will actually get shown\n return;\n }\n EventHandler.one(target, EVENT_HIDDEN$4, () => {\n if (isVisible(this)) {\n this.focus();\n }\n });\n });\n\n // avoid conflict when clicking modal toggler while another one is open\n const alreadyOpen = SelectorEngine.findOne(OPEN_SELECTOR$1);\n if (alreadyOpen) {\n Modal.getInstance(alreadyOpen).hide();\n }\n const data = Modal.getOrCreateInstance(target);\n data.toggle(this);\n});\nenableDismissTrigger(Modal);\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Modal);\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap offcanvas.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Constants\n */\n\nconst NAME$6 = 'offcanvas';\nconst DATA_KEY$3 = 'bs.offcanvas';\nconst EVENT_KEY$3 = `.${DATA_KEY$3}`;\nconst DATA_API_KEY$1 = '.data-api';\nconst EVENT_LOAD_DATA_API$2 = `load${EVENT_KEY$3}${DATA_API_KEY$1}`;\nconst ESCAPE_KEY = 'Escape';\nconst CLASS_NAME_SHOW$3 = 'show';\nconst CLASS_NAME_SHOWING$1 = 'showing';\nconst CLASS_NAME_HIDING = 'hiding';\nconst CLASS_NAME_BACKDROP = 'offcanvas-backdrop';\nconst OPEN_SELECTOR = '.offcanvas.show';\nconst EVENT_SHOW$3 = `show${EVENT_KEY$3}`;\nconst EVENT_SHOWN$3 = `shown${EVENT_KEY$3}`;\nconst EVENT_HIDE$3 = `hide${EVENT_KEY$3}`;\nconst EVENT_HIDE_PREVENTED = `hidePrevented${EVENT_KEY$3}`;\nconst EVENT_HIDDEN$3 = `hidden${EVENT_KEY$3}`;\nconst EVENT_RESIZE = `resize${EVENT_KEY$3}`;\nconst EVENT_CLICK_DATA_API$1 = `click${EVENT_KEY$3}${DATA_API_KEY$1}`;\nconst EVENT_KEYDOWN_DISMISS = `keydown.dismiss${EVENT_KEY$3}`;\nconst SELECTOR_DATA_TOGGLE$1 = '[data-bs-toggle=\"offcanvas\"]';\nconst Default$5 = {\n backdrop: true,\n keyboard: true,\n scroll: false\n};\nconst DefaultType$5 = {\n backdrop: '(boolean|string)',\n keyboard: 'boolean',\n scroll: 'boolean'\n};\n\n/**\n * Class definition\n */\n\nclass Offcanvas extends BaseComponent {\n constructor(element, config) {\n super(element, config);\n this._isShown = false;\n this._backdrop = this._initializeBackDrop();\n this._focustrap = this._initializeFocusTrap();\n this._addEventListeners();\n }\n\n // Getters\n static get Default() {\n return Default$5;\n }\n static get DefaultType() {\n return DefaultType$5;\n }\n static get NAME() {\n return NAME$6;\n }\n\n // Public\n toggle(relatedTarget) {\n return this._isShown ? this.hide() : this.show(relatedTarget);\n }\n show(relatedTarget) {\n if (this._isShown) {\n return;\n }\n const showEvent = EventHandler.trigger(this._element, EVENT_SHOW$3, {\n relatedTarget\n });\n if (showEvent.defaultPrevented) {\n return;\n }\n this._isShown = true;\n this._backdrop.show();\n if (!this._config.scroll) {\n new ScrollBarHelper().hide();\n }\n this._element.setAttribute('aria-modal', true);\n this._element.setAttribute('role', 'dialog');\n this._element.classList.add(CLASS_NAME_SHOWING$1);\n const completeCallBack = () => {\n if (!this._config.scroll || this._config.backdrop) {\n this._focustrap.activate();\n }\n this._element.classList.add(CLASS_NAME_SHOW$3);\n this._element.classList.remove(CLASS_NAME_SHOWING$1);\n EventHandler.trigger(this._element, EVENT_SHOWN$3, {\n relatedTarget\n });\n };\n this._queueCallback(completeCallBack, this._element, true);\n }\n hide() {\n if (!this._isShown) {\n return;\n }\n const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE$3);\n if (hideEvent.defaultPrevented) {\n return;\n }\n this._focustrap.deactivate();\n this._element.blur();\n this._isShown = false;\n this._element.classList.add(CLASS_NAME_HIDING);\n this._backdrop.hide();\n const completeCallback = () => {\n this._element.classList.remove(CLASS_NAME_SHOW$3, CLASS_NAME_HIDING);\n this._element.removeAttribute('aria-modal');\n this._element.removeAttribute('role');\n if (!this._config.scroll) {\n new ScrollBarHelper().reset();\n }\n EventHandler.trigger(this._element, EVENT_HIDDEN$3);\n };\n this._queueCallback(completeCallback, this._element, true);\n }\n dispose() {\n this._backdrop.dispose();\n this._focustrap.deactivate();\n super.dispose();\n }\n\n // Private\n _initializeBackDrop() {\n const clickCallback = () => {\n if (this._config.backdrop === 'static') {\n EventHandler.trigger(this._element, EVENT_HIDE_PREVENTED);\n return;\n }\n this.hide();\n };\n\n // 'static' option will be translated to true, and booleans will keep their value\n const isVisible = Boolean(this._config.backdrop);\n return new Backdrop({\n className: CLASS_NAME_BACKDROP,\n isVisible,\n isAnimated: true,\n rootElement: this._element.parentNode,\n clickCallback: isVisible ? clickCallback : null\n });\n }\n _initializeFocusTrap() {\n return new FocusTrap({\n trapElement: this._element\n });\n }\n _addEventListeners() {\n EventHandler.on(this._element, EVENT_KEYDOWN_DISMISS, event => {\n if (event.key !== ESCAPE_KEY) {\n return;\n }\n if (this._config.keyboard) {\n this.hide();\n return;\n }\n EventHandler.trigger(this._element, EVENT_HIDE_PREVENTED);\n });\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Offcanvas.getOrCreateInstance(this, config);\n if (typeof config !== 'string') {\n return;\n }\n if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {\n throw new TypeError(`No method named \"${config}\"`);\n }\n data[config](this);\n });\n }\n}\n\n/**\n * Data API implementation\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API$1, SELECTOR_DATA_TOGGLE$1, function (event) {\n const target = SelectorEngine.getElementFromSelector(this);\n if (['A', 'AREA'].includes(this.tagName)) {\n event.preventDefault();\n }\n if (isDisabled(this)) {\n return;\n }\n EventHandler.one(target, EVENT_HIDDEN$3, () => {\n // focus on trigger when it is closed\n if (isVisible(this)) {\n this.focus();\n }\n });\n\n // avoid conflict when clicking a toggler of an offcanvas, while another is open\n const alreadyOpen = SelectorEngine.findOne(OPEN_SELECTOR);\n if (alreadyOpen && alreadyOpen !== target) {\n Offcanvas.getInstance(alreadyOpen).hide();\n }\n const data = Offcanvas.getOrCreateInstance(target);\n data.toggle(this);\n});\nEventHandler.on(window, EVENT_LOAD_DATA_API$2, () => {\n for (const selector of SelectorEngine.find(OPEN_SELECTOR)) {\n Offcanvas.getOrCreateInstance(selector).show();\n }\n});\nEventHandler.on(window, EVENT_RESIZE, () => {\n for (const element of SelectorEngine.find('[aria-modal][class*=show][class*=offcanvas-]')) {\n if (getComputedStyle(element).position !== 'fixed') {\n Offcanvas.getOrCreateInstance(element).hide();\n }\n }\n});\nenableDismissTrigger(Offcanvas);\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Offcanvas);\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap util/sanitizer.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n// js-docs-start allow-list\nconst ARIA_ATTRIBUTE_PATTERN = /^aria-[\\w-]*$/i;\nconst DefaultAllowlist = {\n // Global attributes allowed on any supplied element below.\n '*': ['class', 'dir', 'id', 'lang', 'role', ARIA_ATTRIBUTE_PATTERN],\n a: ['target', 'href', 'title', 'rel'],\n area: [],\n b: [],\n br: [],\n col: [],\n code: [],\n div: [],\n em: [],\n hr: [],\n h1: [],\n h2: [],\n h3: [],\n h4: [],\n h5: [],\n h6: [],\n i: [],\n img: ['src', 'srcset', 'alt', 'title', 'width', 'height'],\n li: [],\n ol: [],\n p: [],\n pre: [],\n s: [],\n small: [],\n span: [],\n sub: [],\n sup: [],\n strong: [],\n u: [],\n ul: []\n};\n// js-docs-end allow-list\n\nconst uriAttributes = new Set(['background', 'cite', 'href', 'itemtype', 'longdesc', 'poster', 'src', 'xlink:href']);\n\n/**\n * A pattern that recognizes URLs that are safe wrt. XSS in URL navigation\n * contexts.\n *\n * Shout-out to Angular https://github.com/angular/angular/blob/15.2.8/packages/core/src/sanitization/url_sanitizer.ts#L38\n */\n// eslint-disable-next-line unicorn/better-regex\nconst SAFE_URL_PATTERN = /^(?!javascript:)(?:[a-z0-9+.-]+:|[^&:/?#]*(?:[/?#]|$))/i;\nconst allowedAttribute = (attribute, allowedAttributeList) => {\n const attributeName = attribute.nodeName.toLowerCase();\n if (allowedAttributeList.includes(attributeName)) {\n if (uriAttributes.has(attributeName)) {\n return Boolean(SAFE_URL_PATTERN.test(attribute.nodeValue));\n }\n return true;\n }\n\n // Check if a regular expression validates the attribute.\n return allowedAttributeList.filter(attributeRegex => attributeRegex instanceof RegExp).some(regex => regex.test(attributeName));\n};\nfunction sanitizeHtml(unsafeHtml, allowList, sanitizeFunction) {\n if (!unsafeHtml.length) {\n return unsafeHtml;\n }\n if (sanitizeFunction && typeof sanitizeFunction === 'function') {\n return sanitizeFunction(unsafeHtml);\n }\n const domParser = new window.DOMParser();\n const createdDocument = domParser.parseFromString(unsafeHtml, 'text/html');\n const elements = [].concat(...createdDocument.body.querySelectorAll('*'));\n for (const element of elements) {\n const elementName = element.nodeName.toLowerCase();\n if (!Object.keys(allowList).includes(elementName)) {\n element.remove();\n continue;\n }\n const attributeList = [].concat(...element.attributes);\n const allowedAttributes = [].concat(allowList['*'] || [], allowList[elementName] || []);\n for (const attribute of attributeList) {\n if (!allowedAttribute(attribute, allowedAttributes)) {\n element.removeAttribute(attribute.nodeName);\n }\n }\n }\n return createdDocument.body.innerHTML;\n}\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap util/template-factory.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Constants\n */\n\nconst NAME$5 = 'TemplateFactory';\nconst Default$4 = {\n allowList: DefaultAllowlist,\n content: {},\n // { selector : text , selector2 : text2 , }\n extraClass: '',\n html: false,\n sanitize: true,\n sanitizeFn: null,\n template: '
'\n};\nconst DefaultType$4 = {\n allowList: 'object',\n content: 'object',\n extraClass: '(string|function)',\n html: 'boolean',\n sanitize: 'boolean',\n sanitizeFn: '(null|function)',\n template: 'string'\n};\nconst DefaultContentType = {\n entry: '(string|element|function|null)',\n selector: '(string|element)'\n};\n\n/**\n * Class definition\n */\n\nclass TemplateFactory extends Config {\n constructor(config) {\n super();\n this._config = this._getConfig(config);\n }\n\n // Getters\n static get Default() {\n return Default$4;\n }\n static get DefaultType() {\n return DefaultType$4;\n }\n static get NAME() {\n return NAME$5;\n }\n\n // Public\n getContent() {\n return Object.values(this._config.content).map(config => this._resolvePossibleFunction(config)).filter(Boolean);\n }\n hasContent() {\n return this.getContent().length > 0;\n }\n changeContent(content) {\n this._checkContent(content);\n this._config.content = {\n ...this._config.content,\n ...content\n };\n return this;\n }\n toHtml() {\n const templateWrapper = document.createElement('div');\n templateWrapper.innerHTML = this._maybeSanitize(this._config.template);\n for (const [selector, text] of Object.entries(this._config.content)) {\n this._setContent(templateWrapper, text, selector);\n }\n const template = templateWrapper.children[0];\n const extraClass = this._resolvePossibleFunction(this._config.extraClass);\n if (extraClass) {\n template.classList.add(...extraClass.split(' '));\n }\n return template;\n }\n\n // Private\n _typeCheckConfig(config) {\n super._typeCheckConfig(config);\n this._checkContent(config.content);\n }\n _checkContent(arg) {\n for (const [selector, content] of Object.entries(arg)) {\n super._typeCheckConfig({\n selector,\n entry: content\n }, DefaultContentType);\n }\n }\n _setContent(template, content, selector) {\n const templateElement = SelectorEngine.findOne(selector, template);\n if (!templateElement) {\n return;\n }\n content = this._resolvePossibleFunction(content);\n if (!content) {\n templateElement.remove();\n return;\n }\n if (isElement(content)) {\n this._putElementInTemplate(getElement(content), templateElement);\n return;\n }\n if (this._config.html) {\n templateElement.innerHTML = this._maybeSanitize(content);\n return;\n }\n templateElement.textContent = content;\n }\n _maybeSanitize(arg) {\n return this._config.sanitize ? sanitizeHtml(arg, this._config.allowList, this._config.sanitizeFn) : arg;\n }\n _resolvePossibleFunction(arg) {\n return execute(arg, [this]);\n }\n _putElementInTemplate(element, templateElement) {\n if (this._config.html) {\n templateElement.innerHTML = '';\n templateElement.append(element);\n return;\n }\n templateElement.textContent = element.textContent;\n }\n}\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap tooltip.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Constants\n */\n\nconst NAME$4 = 'tooltip';\nconst DISALLOWED_ATTRIBUTES = new Set(['sanitize', 'allowList', 'sanitizeFn']);\nconst CLASS_NAME_FADE$2 = 'fade';\nconst CLASS_NAME_MODAL = 'modal';\nconst CLASS_NAME_SHOW$2 = 'show';\nconst SELECTOR_TOOLTIP_INNER = '.tooltip-inner';\nconst SELECTOR_MODAL = `.${CLASS_NAME_MODAL}`;\nconst EVENT_MODAL_HIDE = 'hide.bs.modal';\nconst TRIGGER_HOVER = 'hover';\nconst TRIGGER_FOCUS = 'focus';\nconst TRIGGER_CLICK = 'click';\nconst TRIGGER_MANUAL = 'manual';\nconst EVENT_HIDE$2 = 'hide';\nconst EVENT_HIDDEN$2 = 'hidden';\nconst EVENT_SHOW$2 = 'show';\nconst EVENT_SHOWN$2 = 'shown';\nconst EVENT_INSERTED = 'inserted';\nconst EVENT_CLICK$1 = 'click';\nconst EVENT_FOCUSIN$1 = 'focusin';\nconst EVENT_FOCUSOUT$1 = 'focusout';\nconst EVENT_MOUSEENTER = 'mouseenter';\nconst EVENT_MOUSELEAVE = 'mouseleave';\nconst AttachmentMap = {\n AUTO: 'auto',\n TOP: 'top',\n RIGHT: isRTL() ? 'left' : 'right',\n BOTTOM: 'bottom',\n LEFT: isRTL() ? 'right' : 'left'\n};\nconst Default$3 = {\n allowList: DefaultAllowlist,\n animation: true,\n boundary: 'clippingParents',\n container: false,\n customClass: '',\n delay: 0,\n fallbackPlacements: ['top', 'right', 'bottom', 'left'],\n html: false,\n offset: [0, 6],\n placement: 'top',\n popperConfig: null,\n sanitize: true,\n sanitizeFn: null,\n selector: false,\n template: '
' + '
' + '
' + '
',\n title: '',\n trigger: 'hover focus'\n};\nconst DefaultType$3 = {\n allowList: 'object',\n animation: 'boolean',\n boundary: '(string|element)',\n container: '(string|element|boolean)',\n customClass: '(string|function)',\n delay: '(number|object)',\n fallbackPlacements: 'array',\n html: 'boolean',\n offset: '(array|string|function)',\n placement: '(string|function)',\n popperConfig: '(null|object|function)',\n sanitize: 'boolean',\n sanitizeFn: '(null|function)',\n selector: '(string|boolean)',\n template: 'string',\n title: '(string|element|function)',\n trigger: 'string'\n};\n\n/**\n * Class definition\n */\n\nclass Tooltip extends BaseComponent {\n constructor(element, config) {\n if (typeof Popper === 'undefined') {\n throw new TypeError('Bootstrap\\'s tooltips require Popper (https://popper.js.org)');\n }\n super(element, config);\n\n // Private\n this._isEnabled = true;\n this._timeout = 0;\n this._isHovered = null;\n this._activeTrigger = {};\n this._popper = null;\n this._templateFactory = null;\n this._newContent = null;\n\n // Protected\n this.tip = null;\n this._setListeners();\n if (!this._config.selector) {\n this._fixTitle();\n }\n }\n\n // Getters\n static get Default() {\n return Default$3;\n }\n static get DefaultType() {\n return DefaultType$3;\n }\n static get NAME() {\n return NAME$4;\n }\n\n // Public\n enable() {\n this._isEnabled = true;\n }\n disable() {\n this._isEnabled = false;\n }\n toggleEnabled() {\n this._isEnabled = !this._isEnabled;\n }\n toggle() {\n if (!this._isEnabled) {\n return;\n }\n this._activeTrigger.click = !this._activeTrigger.click;\n if (this._isShown()) {\n this._leave();\n return;\n }\n this._enter();\n }\n dispose() {\n clearTimeout(this._timeout);\n EventHandler.off(this._element.closest(SELECTOR_MODAL), EVENT_MODAL_HIDE, this._hideModalHandler);\n if (this._element.getAttribute('data-bs-original-title')) {\n this._element.setAttribute('title', this._element.getAttribute('data-bs-original-title'));\n }\n this._disposePopper();\n super.dispose();\n }\n show() {\n if (this._element.style.display === 'none') {\n throw new Error('Please use show on visible elements');\n }\n if (!(this._isWithContent() && this._isEnabled)) {\n return;\n }\n const showEvent = EventHandler.trigger(this._element, this.constructor.eventName(EVENT_SHOW$2));\n const shadowRoot = findShadowRoot(this._element);\n const isInTheDom = (shadowRoot || this._element.ownerDocument.documentElement).contains(this._element);\n if (showEvent.defaultPrevented || !isInTheDom) {\n return;\n }\n\n // TODO: v6 remove this or make it optional\n this._disposePopper();\n const tip = this._getTipElement();\n this._element.setAttribute('aria-describedby', tip.getAttribute('id'));\n const {\n container\n } = this._config;\n if (!this._element.ownerDocument.documentElement.contains(this.tip)) {\n container.append(tip);\n EventHandler.trigger(this._element, this.constructor.eventName(EVENT_INSERTED));\n }\n this._popper = this._createPopper(tip);\n tip.classList.add(CLASS_NAME_SHOW$2);\n\n // If this is a touch-enabled device we add extra\n // empty mouseover listeners to the body's immediate children;\n // only needed because of broken event delegation on iOS\n // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html\n if ('ontouchstart' in document.documentElement) {\n for (const element of [].concat(...document.body.children)) {\n EventHandler.on(element, 'mouseover', noop);\n }\n }\n const complete = () => {\n EventHandler.trigger(this._element, this.constructor.eventName(EVENT_SHOWN$2));\n if (this._isHovered === false) {\n this._leave();\n }\n this._isHovered = false;\n };\n this._queueCallback(complete, this.tip, this._isAnimated());\n }\n hide() {\n if (!this._isShown()) {\n return;\n }\n const hideEvent = EventHandler.trigger(this._element, this.constructor.eventName(EVENT_HIDE$2));\n if (hideEvent.defaultPrevented) {\n return;\n }\n const tip = this._getTipElement();\n tip.classList.remove(CLASS_NAME_SHOW$2);\n\n // If this is a touch-enabled device we remove the extra\n // empty mouseover listeners we added for iOS support\n if ('ontouchstart' in document.documentElement) {\n for (const element of [].concat(...document.body.children)) {\n EventHandler.off(element, 'mouseover', noop);\n }\n }\n this._activeTrigger[TRIGGER_CLICK] = false;\n this._activeTrigger[TRIGGER_FOCUS] = false;\n this._activeTrigger[TRIGGER_HOVER] = false;\n this._isHovered = null; // it is a trick to support manual triggering\n\n const complete = () => {\n if (this._isWithActiveTrigger()) {\n return;\n }\n if (!this._isHovered) {\n this._disposePopper();\n }\n this._element.removeAttribute('aria-describedby');\n EventHandler.trigger(this._element, this.constructor.eventName(EVENT_HIDDEN$2));\n };\n this._queueCallback(complete, this.tip, this._isAnimated());\n }\n update() {\n if (this._popper) {\n this._popper.update();\n }\n }\n\n // Protected\n _isWithContent() {\n return Boolean(this._getTitle());\n }\n _getTipElement() {\n if (!this.tip) {\n this.tip = this._createTipElement(this._newContent || this._getContentForTemplate());\n }\n return this.tip;\n }\n _createTipElement(content) {\n const tip = this._getTemplateFactory(content).toHtml();\n\n // TODO: remove this check in v6\n if (!tip) {\n return null;\n }\n tip.classList.remove(CLASS_NAME_FADE$2, CLASS_NAME_SHOW$2);\n // TODO: v6 the following can be achieved with CSS only\n tip.classList.add(`bs-${this.constructor.NAME}-auto`);\n const tipId = getUID(this.constructor.NAME).toString();\n tip.setAttribute('id', tipId);\n if (this._isAnimated()) {\n tip.classList.add(CLASS_NAME_FADE$2);\n }\n return tip;\n }\n setContent(content) {\n this._newContent = content;\n if (this._isShown()) {\n this._disposePopper();\n this.show();\n }\n }\n _getTemplateFactory(content) {\n if (this._templateFactory) {\n this._templateFactory.changeContent(content);\n } else {\n this._templateFactory = new TemplateFactory({\n ...this._config,\n // the `content` var has to be after `this._config`\n // to override config.content in case of popover\n content,\n extraClass: this._resolvePossibleFunction(this._config.customClass)\n });\n }\n return this._templateFactory;\n }\n _getContentForTemplate() {\n return {\n [SELECTOR_TOOLTIP_INNER]: this._getTitle()\n };\n }\n _getTitle() {\n return this._resolvePossibleFunction(this._config.title) || this._element.getAttribute('data-bs-original-title');\n }\n\n // Private\n _initializeOnDelegatedTarget(event) {\n return this.constructor.getOrCreateInstance(event.delegateTarget, this._getDelegateConfig());\n }\n _isAnimated() {\n return this._config.animation || this.tip && this.tip.classList.contains(CLASS_NAME_FADE$2);\n }\n _isShown() {\n return this.tip && this.tip.classList.contains(CLASS_NAME_SHOW$2);\n }\n _createPopper(tip) {\n const placement = execute(this._config.placement, [this, tip, this._element]);\n const attachment = AttachmentMap[placement.toUpperCase()];\n return Popper.createPopper(this._element, tip, this._getPopperConfig(attachment));\n }\n _getOffset() {\n const {\n offset\n } = this._config;\n if (typeof offset === 'string') {\n return offset.split(',').map(value => Number.parseInt(value, 10));\n }\n if (typeof offset === 'function') {\n return popperData => offset(popperData, this._element);\n }\n return offset;\n }\n _resolvePossibleFunction(arg) {\n return execute(arg, [this._element]);\n }\n _getPopperConfig(attachment) {\n const defaultBsPopperConfig = {\n placement: attachment,\n modifiers: [{\n name: 'flip',\n options: {\n fallbackPlacements: this._config.fallbackPlacements\n }\n }, {\n name: 'offset',\n options: {\n offset: this._getOffset()\n }\n }, {\n name: 'preventOverflow',\n options: {\n boundary: this._config.boundary\n }\n }, {\n name: 'arrow',\n options: {\n element: `.${this.constructor.NAME}-arrow`\n }\n }, {\n name: 'preSetPlacement',\n enabled: true,\n phase: 'beforeMain',\n fn: data => {\n // Pre-set Popper's placement attribute in order to read the arrow sizes properly.\n // Otherwise, Popper mixes up the width and height dimensions since the initial arrow style is for top placement\n this._getTipElement().setAttribute('data-popper-placement', data.state.placement);\n }\n }]\n };\n return {\n ...defaultBsPopperConfig,\n ...execute(this._config.popperConfig, [defaultBsPopperConfig])\n };\n }\n _setListeners() {\n const triggers = this._config.trigger.split(' ');\n for (const trigger of triggers) {\n if (trigger === 'click') {\n EventHandler.on(this._element, this.constructor.eventName(EVENT_CLICK$1), this._config.selector, event => {\n const context = this._initializeOnDelegatedTarget(event);\n context.toggle();\n });\n } else if (trigger !== TRIGGER_MANUAL) {\n const eventIn = trigger === TRIGGER_HOVER ? this.constructor.eventName(EVENT_MOUSEENTER) : this.constructor.eventName(EVENT_FOCUSIN$1);\n const eventOut = trigger === TRIGGER_HOVER ? this.constructor.eventName(EVENT_MOUSELEAVE) : this.constructor.eventName(EVENT_FOCUSOUT$1);\n EventHandler.on(this._element, eventIn, this._config.selector, event => {\n const context = this._initializeOnDelegatedTarget(event);\n context._activeTrigger[event.type === 'focusin' ? TRIGGER_FOCUS : TRIGGER_HOVER] = true;\n context._enter();\n });\n EventHandler.on(this._element, eventOut, this._config.selector, event => {\n const context = this._initializeOnDelegatedTarget(event);\n context._activeTrigger[event.type === 'focusout' ? TRIGGER_FOCUS : TRIGGER_HOVER] = context._element.contains(event.relatedTarget);\n context._leave();\n });\n }\n }\n this._hideModalHandler = () => {\n if (this._element) {\n this.hide();\n }\n };\n EventHandler.on(this._element.closest(SELECTOR_MODAL), EVENT_MODAL_HIDE, this._hideModalHandler);\n }\n _fixTitle() {\n const title = this._element.getAttribute('title');\n if (!title) {\n return;\n }\n if (!this._element.getAttribute('aria-label') && !this._element.textContent.trim()) {\n this._element.setAttribute('aria-label', title);\n }\n this._element.setAttribute('data-bs-original-title', title); // DO NOT USE IT. Is only for backwards compatibility\n this._element.removeAttribute('title');\n }\n _enter() {\n if (this._isShown() || this._isHovered) {\n this._isHovered = true;\n return;\n }\n this._isHovered = true;\n this._setTimeout(() => {\n if (this._isHovered) {\n this.show();\n }\n }, this._config.delay.show);\n }\n _leave() {\n if (this._isWithActiveTrigger()) {\n return;\n }\n this._isHovered = false;\n this._setTimeout(() => {\n if (!this._isHovered) {\n this.hide();\n }\n }, this._config.delay.hide);\n }\n _setTimeout(handler, timeout) {\n clearTimeout(this._timeout);\n this._timeout = setTimeout(handler, timeout);\n }\n _isWithActiveTrigger() {\n return Object.values(this._activeTrigger).includes(true);\n }\n _getConfig(config) {\n const dataAttributes = Manipulator.getDataAttributes(this._element);\n for (const dataAttribute of Object.keys(dataAttributes)) {\n if (DISALLOWED_ATTRIBUTES.has(dataAttribute)) {\n delete dataAttributes[dataAttribute];\n }\n }\n config = {\n ...dataAttributes,\n ...(typeof config === 'object' && config ? config : {})\n };\n config = this._mergeConfigObj(config);\n config = this._configAfterMerge(config);\n this._typeCheckConfig(config);\n return config;\n }\n _configAfterMerge(config) {\n config.container = config.container === false ? document.body : getElement(config.container);\n if (typeof config.delay === 'number') {\n config.delay = {\n show: config.delay,\n hide: config.delay\n };\n }\n if (typeof config.title === 'number') {\n config.title = config.title.toString();\n }\n if (typeof config.content === 'number') {\n config.content = config.content.toString();\n }\n return config;\n }\n _getDelegateConfig() {\n const config = {};\n for (const [key, value] of Object.entries(this._config)) {\n if (this.constructor.Default[key] !== value) {\n config[key] = value;\n }\n }\n config.selector = false;\n config.trigger = 'manual';\n\n // In the future can be replaced with:\n // const keysWithDifferentValues = Object.entries(this._config).filter(entry => this.constructor.Default[entry[0]] !== this._config[entry[0]])\n // `Object.fromEntries(keysWithDifferentValues)`\n return config;\n }\n _disposePopper() {\n if (this._popper) {\n this._popper.destroy();\n this._popper = null;\n }\n if (this.tip) {\n this.tip.remove();\n this.tip = null;\n }\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Tooltip.getOrCreateInstance(this, config);\n if (typeof config !== 'string') {\n return;\n }\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`);\n }\n data[config]();\n });\n }\n}\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Tooltip);\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap popover.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Constants\n */\n\nconst NAME$3 = 'popover';\nconst SELECTOR_TITLE = '.popover-header';\nconst SELECTOR_CONTENT = '.popover-body';\nconst Default$2 = {\n ...Tooltip.Default,\n content: '',\n offset: [0, 8],\n placement: 'right',\n template: '
' + '
' + '

' + '
' + '
',\n trigger: 'click'\n};\nconst DefaultType$2 = {\n ...Tooltip.DefaultType,\n content: '(null|string|element|function)'\n};\n\n/**\n * Class definition\n */\n\nclass Popover extends Tooltip {\n // Getters\n static get Default() {\n return Default$2;\n }\n static get DefaultType() {\n return DefaultType$2;\n }\n static get NAME() {\n return NAME$3;\n }\n\n // Overrides\n _isWithContent() {\n return this._getTitle() || this._getContent();\n }\n\n // Private\n _getContentForTemplate() {\n return {\n [SELECTOR_TITLE]: this._getTitle(),\n [SELECTOR_CONTENT]: this._getContent()\n };\n }\n _getContent() {\n return this._resolvePossibleFunction(this._config.content);\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Popover.getOrCreateInstance(this, config);\n if (typeof config !== 'string') {\n return;\n }\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`);\n }\n data[config]();\n });\n }\n}\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Popover);\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap scrollspy.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Constants\n */\n\nconst NAME$2 = 'scrollspy';\nconst DATA_KEY$2 = 'bs.scrollspy';\nconst EVENT_KEY$2 = `.${DATA_KEY$2}`;\nconst DATA_API_KEY = '.data-api';\nconst EVENT_ACTIVATE = `activate${EVENT_KEY$2}`;\nconst EVENT_CLICK = `click${EVENT_KEY$2}`;\nconst EVENT_LOAD_DATA_API$1 = `load${EVENT_KEY$2}${DATA_API_KEY}`;\nconst CLASS_NAME_DROPDOWN_ITEM = 'dropdown-item';\nconst CLASS_NAME_ACTIVE$1 = 'active';\nconst SELECTOR_DATA_SPY = '[data-bs-spy=\"scroll\"]';\nconst SELECTOR_TARGET_LINKS = '[href]';\nconst SELECTOR_NAV_LIST_GROUP = '.nav, .list-group';\nconst SELECTOR_NAV_LINKS = '.nav-link';\nconst SELECTOR_NAV_ITEMS = '.nav-item';\nconst SELECTOR_LIST_ITEMS = '.list-group-item';\nconst SELECTOR_LINK_ITEMS = `${SELECTOR_NAV_LINKS}, ${SELECTOR_NAV_ITEMS} > ${SELECTOR_NAV_LINKS}, ${SELECTOR_LIST_ITEMS}`;\nconst SELECTOR_DROPDOWN = '.dropdown';\nconst SELECTOR_DROPDOWN_TOGGLE$1 = '.dropdown-toggle';\nconst Default$1 = {\n offset: null,\n // TODO: v6 @deprecated, keep it for backwards compatibility reasons\n rootMargin: '0px 0px -25%',\n smoothScroll: false,\n target: null,\n threshold: [0.1, 0.5, 1]\n};\nconst DefaultType$1 = {\n offset: '(number|null)',\n // TODO v6 @deprecated, keep it for backwards compatibility reasons\n rootMargin: 'string',\n smoothScroll: 'boolean',\n target: 'element',\n threshold: 'array'\n};\n\n/**\n * Class definition\n */\n\nclass ScrollSpy extends BaseComponent {\n constructor(element, config) {\n super(element, config);\n\n // this._element is the observablesContainer and config.target the menu links wrapper\n this._targetLinks = new Map();\n this._observableSections = new Map();\n this._rootElement = getComputedStyle(this._element).overflowY === 'visible' ? null : this._element;\n this._activeTarget = null;\n this._observer = null;\n this._previousScrollData = {\n visibleEntryTop: 0,\n parentScrollTop: 0\n };\n this.refresh(); // initialize\n }\n\n // Getters\n static get Default() {\n return Default$1;\n }\n static get DefaultType() {\n return DefaultType$1;\n }\n static get NAME() {\n return NAME$2;\n }\n\n // Public\n refresh() {\n this._initializeTargetsAndObservables();\n this._maybeEnableSmoothScroll();\n if (this._observer) {\n this._observer.disconnect();\n } else {\n this._observer = this._getNewObserver();\n }\n for (const section of this._observableSections.values()) {\n this._observer.observe(section);\n }\n }\n dispose() {\n this._observer.disconnect();\n super.dispose();\n }\n\n // Private\n _configAfterMerge(config) {\n // TODO: on v6 target should be given explicitly & remove the {target: 'ss-target'} case\n config.target = getElement(config.target) || document.body;\n\n // TODO: v6 Only for backwards compatibility reasons. Use rootMargin only\n config.rootMargin = config.offset ? `${config.offset}px 0px -30%` : config.rootMargin;\n if (typeof config.threshold === 'string') {\n config.threshold = config.threshold.split(',').map(value => Number.parseFloat(value));\n }\n return config;\n }\n _maybeEnableSmoothScroll() {\n if (!this._config.smoothScroll) {\n return;\n }\n\n // unregister any previous listeners\n EventHandler.off(this._config.target, EVENT_CLICK);\n EventHandler.on(this._config.target, EVENT_CLICK, SELECTOR_TARGET_LINKS, event => {\n const observableSection = this._observableSections.get(event.target.hash);\n if (observableSection) {\n event.preventDefault();\n const root = this._rootElement || window;\n const height = observableSection.offsetTop - this._element.offsetTop;\n if (root.scrollTo) {\n root.scrollTo({\n top: height,\n behavior: 'smooth'\n });\n return;\n }\n\n // Chrome 60 doesn't support `scrollTo`\n root.scrollTop = height;\n }\n });\n }\n _getNewObserver() {\n const options = {\n root: this._rootElement,\n threshold: this._config.threshold,\n rootMargin: this._config.rootMargin\n };\n return new IntersectionObserver(entries => this._observerCallback(entries), options);\n }\n\n // The logic of selection\n _observerCallback(entries) {\n const targetElement = entry => this._targetLinks.get(`#${entry.target.id}`);\n const activate = entry => {\n this._previousScrollData.visibleEntryTop = entry.target.offsetTop;\n this._process(targetElement(entry));\n };\n const parentScrollTop = (this._rootElement || document.documentElement).scrollTop;\n const userScrollsDown = parentScrollTop >= this._previousScrollData.parentScrollTop;\n this._previousScrollData.parentScrollTop = parentScrollTop;\n for (const entry of entries) {\n if (!entry.isIntersecting) {\n this._activeTarget = null;\n this._clearActiveClass(targetElement(entry));\n continue;\n }\n const entryIsLowerThanPrevious = entry.target.offsetTop >= this._previousScrollData.visibleEntryTop;\n // if we are scrolling down, pick the bigger offsetTop\n if (userScrollsDown && entryIsLowerThanPrevious) {\n activate(entry);\n // if parent isn't scrolled, let's keep the first visible item, breaking the iteration\n if (!parentScrollTop) {\n return;\n }\n continue;\n }\n\n // if we are scrolling up, pick the smallest offsetTop\n if (!userScrollsDown && !entryIsLowerThanPrevious) {\n activate(entry);\n }\n }\n }\n _initializeTargetsAndObservables() {\n this._targetLinks = new Map();\n this._observableSections = new Map();\n const targetLinks = SelectorEngine.find(SELECTOR_TARGET_LINKS, this._config.target);\n for (const anchor of targetLinks) {\n // ensure that the anchor has an id and is not disabled\n if (!anchor.hash || isDisabled(anchor)) {\n continue;\n }\n const observableSection = SelectorEngine.findOne(decodeURI(anchor.hash), this._element);\n\n // ensure that the observableSection exists & is visible\n if (isVisible(observableSection)) {\n this._targetLinks.set(decodeURI(anchor.hash), anchor);\n this._observableSections.set(anchor.hash, observableSection);\n }\n }\n }\n _process(target) {\n if (this._activeTarget === target) {\n return;\n }\n this._clearActiveClass(this._config.target);\n this._activeTarget = target;\n target.classList.add(CLASS_NAME_ACTIVE$1);\n this._activateParents(target);\n EventHandler.trigger(this._element, EVENT_ACTIVATE, {\n relatedTarget: target\n });\n }\n _activateParents(target) {\n // Activate dropdown parents\n if (target.classList.contains(CLASS_NAME_DROPDOWN_ITEM)) {\n SelectorEngine.findOne(SELECTOR_DROPDOWN_TOGGLE$1, target.closest(SELECTOR_DROPDOWN)).classList.add(CLASS_NAME_ACTIVE$1);\n return;\n }\n for (const listGroup of SelectorEngine.parents(target, SELECTOR_NAV_LIST_GROUP)) {\n // Set triggered links parents as active\n // With both
    and