diff --git a/404.html b/404.html index d9a37913..d5e227c3 100644 --- a/404.html +++ b/404.html @@ -5,18 +5,19 @@ 404 | Kano - + + - - + + -
Skip to content

404

PAGE NOT FOUND

But if you don't change your direction, and if you keep looking, you may end up where you are heading.
- +
Skip to content

404

PAGE NOT FOUND

But if you don't change your direction, and if you keep looking, you may end up where you are heading.
+ \ No newline at end of file diff --git a/about/contact.html b/about/contact.html index 38203106..694ad39e 100644 --- a/about/contact.html +++ b/about/contact.html @@ -5,21 +5,22 @@ Contact | Kano - + + - - - - - + + + + + -
Skip to content

Contact

Please feel free to join our slack channel using the invitation link.

- +
Skip to content

Contact

Please feel free to join our slack channel using the invitation link.

+ \ No newline at end of file diff --git a/about/contributing.html b/about/contributing.html index 1e319790..4a56da2d 100644 --- a/about/contributing.html +++ b/about/contributing.html @@ -5,21 +5,22 @@ Contributing | Kano - + + - - - - - + + + + + -
Skip to content

Contributing

Submission guidelines

Report a bug

Before creating an issue please make sure you have checked out the docs, you might want to also try searching Github. It's pretty likely someone has already asked a similar question.

Issues can be reported in the issue tracker.

Pull Requests

We love pull requests and we're continually working to make it as easy as possible for people to contribute.

We prefer small pull requests with minimal code changes. The smaller they are the easier they are to review and merge. A core team member will pick up your PR and review it as soon as they can. They may ask for changes or reject your pull request. This is not a reflection of you as an engineer or a person. Please accept feedback graciously as we will also try to be sensitive when providing it.

Although we generally accept many PRs they can be rejected for many reasons. We will be as transparent as possible but it may simply be that you do not have the same context or information regarding the roadmap that the core team members have. We value the time you take to put together any contributions so we pledge to always be respectful of that time and will try to be as open as possible so that you don't waste it.

Commit message guidelines

We follow the Conventional commits specifications which provides a set of rules to make commit messages more readable when looking through the project history. But also, we use the git commit messages to generate the change log.

Commit message format

The commit message should be structured as follows:

<type>: <subject> [optional `breaking`]
<type>: <subject> [optional `breaking`]

Where type must be one of the following:

  • build: changes that affect the build system (external dependencies)
  • ci: changes to our CI configuration files and scripts
  • chore: changes that affect the project structure
  • docs: changes that affect the documentation only
  • feat: a new feature
  • fix: a bug fix
  • perf: a code change that improves performance
  • refactor: a code change that neither fixes a bug nor adds a feature
  • revert: revert changes
  • style: changes that do not affect the meaning of the code (lint issues)
  • test: adding missing tests or correcting existing tests

Use the optional [ breaking ] keyword to declare a BREAKING CHANGE.

Examples

  • Commit message with description and breaking change in body
feat: allow provided config object to extend other configs [ breaking ]
feat: allow provided config object to extend other configs [ breaking ]
  • Commit message with no body
docs: correct spelling in the contributing.md file
docs: correct spelling in the contributing.md file
  • Commit message for a fix using an issue number.
fix: fix minor issue in code (#12)
fix: fix minor issue in code (#12)

Versioning guidelines

We rely on Semantic Versioning for versioning a release. Indeed, given a version number MAJOR.MINOR.PATCH, increment the:

  • MAJOR version when you make a major evolution leading to breaking changes,
  • MINOR version when you add functionality in a backwards-compatible manner
  • PATCH version when you make backwards-compatible bug fixes.

The command npm run release:<type>, where <type> is either patch, minor or major, helps you to do the release.

It performs the following task for you:

  • increase the package version number in the package.json file
  • generate the change log
  • create a tag accordingly in the git repository and push it

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.

We are committed to making participation in this project a harassment-free experience for everyone, regardless of level of experience, gender, gender identity and expression, sexual orientation, disability, personal appearance, body size, race, ethnicity, age, or religion.

Examples of unacceptable behavior by participants include the use of sexual language or imagery, derogatory comments or personal attacks, trolling, public or private harassment, insults, or other unprofessional conduct.

Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct. Project maintainers who do not follow the Code of Conduct may be removed from the project team.

Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by opening an issue or contacting one or more of the project maintainers.

This Code of Conduct is adapted from the Contributor Covenant, version 1.0.0, available at http://contributor-covenant.org/version/1/0/0/

- +
Skip to content

Contributing

Submission guidelines

Report a bug

Before creating an issue please make sure you have checked out the docs, you might want to also try searching Github. It's pretty likely someone has already asked a similar question.

Issues can be reported in the issue tracker.

Pull Requests

We love pull requests and we're continually working to make it as easy as possible for people to contribute.

We prefer small pull requests with minimal code changes. The smaller they are the easier they are to review and merge. A core team member will pick up your PR and review it as soon as they can. They may ask for changes or reject your pull request. This is not a reflection of you as an engineer or a person. Please accept feedback graciously as we will also try to be sensitive when providing it.

Although we generally accept many PRs they can be rejected for many reasons. We will be as transparent as possible but it may simply be that you do not have the same context or information regarding the roadmap that the core team members have. We value the time you take to put together any contributions so we pledge to always be respectful of that time and will try to be as open as possible so that you don't waste it.

Commit message guidelines

We follow the Conventional commits specifications which provides a set of rules to make commit messages more readable when looking through the project history. But also, we use the git commit messages to generate the change log.

Commit message format

The commit message should be structured as follows:

<type>: <subject> [optional `breaking`]

Where type must be one of the following:

  • build: changes that affect the build system (external dependencies)
  • ci: changes to our CI configuration files and scripts
  • chore: changes that affect the project structure
  • docs: changes that affect the documentation only
  • feat: a new feature
  • fix: a bug fix
  • perf: a code change that improves performance
  • refactor: a code change that neither fixes a bug nor adds a feature
  • revert: revert changes
  • style: changes that do not affect the meaning of the code (lint issues)
  • test: adding missing tests or correcting existing tests

Use the optional [ breaking ] keyword to declare a BREAKING CHANGE.

Examples

  • Commit message with description and breaking change in body
feat: allow provided config object to extend other configs [ breaking ]
  • Commit message with no body
docs: correct spelling in the contributing.md file
  • Commit message for a fix using an issue number.
fix: fix minor issue in code (#12)

Versioning guidelines

We rely on Semantic Versioning for versioning a release. Indeed, given a version number MAJOR.MINOR.PATCH, increment the:

  • MAJOR version when you make a major evolution leading to breaking changes,
  • MINOR version when you add functionality in a backwards-compatible manner
  • PATCH version when you make backwards-compatible bug fixes.

The command npm run release:<type>, where <type> is either patch, minor or major, helps you to do the release.

It performs the following task for you:

  • increase the package version number in the package.json file
  • generate the change log
  • create a tag accordingly in the git repository and push it

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.

We are committed to making participation in this project a harassment-free experience for everyone, regardless of level of experience, gender, gender identity and expression, sexual orientation, disability, personal appearance, body size, race, ethnicity, age, or religion.

Examples of unacceptable behavior by participants include the use of sexual language or imagery, derogatory comments or personal attacks, trolling, public or private harassment, insults, or other unprofessional conduct.

Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct. Project maintainers who do not follow the Code of Conduct may be removed from the project team.

Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by opening an issue or contacting one or more of the project maintainers.

This Code of Conduct is adapted from the Contributor Covenant, version 1.0.0, available at http://contributor-covenant.org/version/1/0/0/

+ \ No newline at end of file diff --git a/about/introduction.html b/about/introduction.html index eb95e8cc..21c453f2 100644 --- a/about/introduction.html +++ b/about/introduction.html @@ -5,21 +5,22 @@ Introduction | Kano - + + - - - - - + + + + + -
Skip to content

Introduction

Kano is a powerful application that can be used to visualize any time-varying geospatial data, notably served by Kargo.

kano-screenshot

TIP

This application is based on the Kalisio Development Kit.

- +
Skip to content

Introduction

Kano is a powerful application that can be used to visualize any time-varying geospatial data, notably served by Kargo.

kano-screenshot

TIP

This application is based on the Kalisio Development Kit.

+ \ No newline at end of file diff --git a/about/license.html b/about/license.html index 376b87fb..caa6a9c2 100644 --- a/about/license.html +++ b/about/license.html @@ -5,21 +5,22 @@ License | Kano - + + - - - - - + + + + + -
Skip to content

License

MIT License

Copyright (c) 2017-2020 Kalisio

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

- +
Skip to content

License

MIT License

Copyright (c) 2017-2020 Kalisio

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

+ \ No newline at end of file diff --git a/about/roadmap.html b/about/roadmap.html index 7f936ea5..acb559fd 100644 --- a/about/roadmap.html +++ b/about/roadmap.html @@ -5,21 +5,22 @@ Roadmap | Kano - + + - - - - - + + + + + -
Skip to content

Roadmap

The roadmap is available on Github.

Milestones

The milestones are available on Github

Release Notes

The changelog is available in Github

- +
Skip to content

Roadmap

The roadmap is available on Github.

Milestones

The milestones are available on Github

Release Notes

The changelog is available in Github

+ \ No newline at end of file diff --git a/assets/about_contact.md.0cffa98c.js b/assets/about_contact.md.0cffa98c.js deleted file mode 100644 index 7471b10e..00000000 --- a/assets/about_contact.md.0cffa98c.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as a,o,c as n,k as t,a as e}from"./chunks/framework.f7d371db.js";const u=JSON.parse('{"title":"Contact","description":"","frontmatter":{"sidebarDepth":3},"headers":[],"relativePath":"about/contact.md","filePath":"about/contact.md"}'),c={name:"about/contact.md"},r=t("h1",{id:"contact",tabindex:"-1"},[e("Contact "),t("a",{class:"header-anchor",href:"#contact","aria-label":'Permalink to "Contact"'},"​")],-1),s=t("p",null,[e("Please feel free to join our "),t("a",{href:"https://kalisio.slack.com/",target:"_blank",rel:"noreferrer"},"slack channel"),e(" using the "),t("a",{href:"https://join.slack.com/t/kalisio/shared_invite/zt-mfyu6evk-ehKFK7wSle4lX9imk5huew",target:"_blank",rel:"noreferrer"},"invitation link"),e(".")],-1),i=[r,s];function l(h,d,_,f,p,k){return o(),n("div",null,i)}const b=a(c,[["render",l]]);export{u as __pageData,b as default}; diff --git a/assets/about_contact.md.0cffa98c.lean.js b/assets/about_contact.md.0cffa98c.lean.js deleted file mode 100644 index 7471b10e..00000000 --- a/assets/about_contact.md.0cffa98c.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as a,o,c as n,k as t,a as e}from"./chunks/framework.f7d371db.js";const u=JSON.parse('{"title":"Contact","description":"","frontmatter":{"sidebarDepth":3},"headers":[],"relativePath":"about/contact.md","filePath":"about/contact.md"}'),c={name:"about/contact.md"},r=t("h1",{id:"contact",tabindex:"-1"},[e("Contact "),t("a",{class:"header-anchor",href:"#contact","aria-label":'Permalink to "Contact"'},"​")],-1),s=t("p",null,[e("Please feel free to join our "),t("a",{href:"https://kalisio.slack.com/",target:"_blank",rel:"noreferrer"},"slack channel"),e(" using the "),t("a",{href:"https://join.slack.com/t/kalisio/shared_invite/zt-mfyu6evk-ehKFK7wSle4lX9imk5huew",target:"_blank",rel:"noreferrer"},"invitation link"),e(".")],-1),i=[r,s];function l(h,d,_,f,p,k){return o(),n("div",null,i)}const b=a(c,[["render",l]]);export{u as __pageData,b as default}; diff --git a/assets/about_contact.md.MLWlmPcp.js b/assets/about_contact.md.MLWlmPcp.js new file mode 100644 index 00000000..119ee329 --- /dev/null +++ b/assets/about_contact.md.MLWlmPcp.js @@ -0,0 +1 @@ +import{_ as a,c as o,o as n,m as t,a as e}from"./chunks/framework.J61Sinzt.js";const u=JSON.parse('{"title":"Contact","description":"","frontmatter":{"sidebarDepth":3},"headers":[],"relativePath":"about/contact.md","filePath":"about/contact.md"}'),c={name:"about/contact.md"},r=t("h1",{id:"contact",tabindex:"-1"},[e("Contact "),t("a",{class:"header-anchor",href:"#contact","aria-label":'Permalink to "Contact"'},"​")],-1),s=t("p",null,[e("Please feel free to join our "),t("a",{href:"https://kalisio.slack.com/",target:"_blank",rel:"noreferrer"},"slack channel"),e(" using the "),t("a",{href:"https://join.slack.com/t/kalisio/shared_invite/zt-mfyu6evk-ehKFK7wSle4lX9imk5huew",target:"_blank",rel:"noreferrer"},"invitation link"),e(".")],-1),i=[r,s];function l(h,d,_,f,m,p){return n(),o("div",null,i)}const b=a(c,[["render",l]]);export{u as __pageData,b as default}; diff --git a/assets/about_contact.md.MLWlmPcp.lean.js b/assets/about_contact.md.MLWlmPcp.lean.js new file mode 100644 index 00000000..119ee329 --- /dev/null +++ b/assets/about_contact.md.MLWlmPcp.lean.js @@ -0,0 +1 @@ +import{_ as a,c as o,o as n,m as t,a as e}from"./chunks/framework.J61Sinzt.js";const u=JSON.parse('{"title":"Contact","description":"","frontmatter":{"sidebarDepth":3},"headers":[],"relativePath":"about/contact.md","filePath":"about/contact.md"}'),c={name:"about/contact.md"},r=t("h1",{id:"contact",tabindex:"-1"},[e("Contact "),t("a",{class:"header-anchor",href:"#contact","aria-label":'Permalink to "Contact"'},"​")],-1),s=t("p",null,[e("Please feel free to join our "),t("a",{href:"https://kalisio.slack.com/",target:"_blank",rel:"noreferrer"},"slack channel"),e(" using the "),t("a",{href:"https://join.slack.com/t/kalisio/shared_invite/zt-mfyu6evk-ehKFK7wSle4lX9imk5huew",target:"_blank",rel:"noreferrer"},"invitation link"),e(".")],-1),i=[r,s];function l(h,d,_,f,m,p){return n(),o("div",null,i)}const b=a(c,[["render",l]]);export{u as __pageData,b as default}; diff --git a/assets/about_contributing.md.Q-A41HE2.js b/assets/about_contributing.md.Q-A41HE2.js new file mode 100644 index 00000000..4c3c6c23 --- /dev/null +++ b/assets/about_contributing.md.Q-A41HE2.js @@ -0,0 +1 @@ +import{_ as e,c as t,o as a,V as o}from"./chunks/framework.J61Sinzt.js";const m=JSON.parse('{"title":"Contributing","description":"","frontmatter":{"sidebarDepth":3},"headers":[],"relativePath":"about/contributing.md","filePath":"about/contributing.md"}'),i={name:"about/contributing.md"},s=o('

Contributing

Submission guidelines

Report a bug

Before creating an issue please make sure you have checked out the docs, you might want to also try searching Github. It's pretty likely someone has already asked a similar question.

Issues can be reported in the issue tracker.

Pull Requests

We love pull requests and we're continually working to make it as easy as possible for people to contribute.

We prefer small pull requests with minimal code changes. The smaller they are the easier they are to review and merge. A core team member will pick up your PR and review it as soon as they can. They may ask for changes or reject your pull request. This is not a reflection of you as an engineer or a person. Please accept feedback graciously as we will also try to be sensitive when providing it.

Although we generally accept many PRs they can be rejected for many reasons. We will be as transparent as possible but it may simply be that you do not have the same context or information regarding the roadmap that the core team members have. We value the time you take to put together any contributions so we pledge to always be respectful of that time and will try to be as open as possible so that you don't waste it.

Commit message guidelines

We follow the Conventional commits specifications which provides a set of rules to make commit messages more readable when looking through the project history. But also, we use the git commit messages to generate the change log.

Commit message format

The commit message should be structured as follows:

<type>: <subject> [optional `breaking`]

Where type must be one of the following:

Use the optional [ breaking ] keyword to declare a BREAKING CHANGE.

Examples

feat: allow provided config object to extend other configs [ breaking ]
docs: correct spelling in the contributing.md file
fix: fix minor issue in code (#12)

Versioning guidelines

We rely on Semantic Versioning for versioning a release. Indeed, given a version number MAJOR.MINOR.PATCH, increment the:

The command npm run release:<type>, where <type> is either patch, minor or major, helps you to do the release.

It performs the following task for you:

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.

We are committed to making participation in this project a harassment-free experience for everyone, regardless of level of experience, gender, gender identity and expression, sexual orientation, disability, personal appearance, body size, race, ethnicity, age, or religion.

Examples of unacceptable behavior by participants include the use of sexual language or imagery, derogatory comments or personal attacks, trolling, public or private harassment, insults, or other unprofessional conduct.

Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct. Project maintainers who do not follow the Code of Conduct may be removed from the project team.

Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by opening an issue or contacting one or more of the project maintainers.

This Code of Conduct is adapted from the Contributor Covenant, version 1.0.0, available at http://contributor-covenant.org/version/1/0/0/

',37),n=[s];function r(l,c,d,h,u,p){return a(),t("div",null,n)}const b=e(i,[["render",r]]);export{m as __pageData,b as default}; diff --git a/assets/about_contributing.md.Q-A41HE2.lean.js b/assets/about_contributing.md.Q-A41HE2.lean.js new file mode 100644 index 00000000..6c45c1a1 --- /dev/null +++ b/assets/about_contributing.md.Q-A41HE2.lean.js @@ -0,0 +1 @@ +import{_ as e,c as t,o as a,V as o}from"./chunks/framework.J61Sinzt.js";const m=JSON.parse('{"title":"Contributing","description":"","frontmatter":{"sidebarDepth":3},"headers":[],"relativePath":"about/contributing.md","filePath":"about/contributing.md"}'),i={name:"about/contributing.md"},s=o("",37),n=[s];function r(l,c,d,h,u,p){return a(),t("div",null,n)}const b=e(i,[["render",r]]);export{m as __pageData,b as default}; diff --git a/assets/about_contributing.md.a0ea6fa4.js b/assets/about_contributing.md.a0ea6fa4.js deleted file mode 100644 index 21214572..00000000 --- a/assets/about_contributing.md.a0ea6fa4.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as e,o as t,c as o,Q as a}from"./chunks/framework.f7d371db.js";const m=JSON.parse('{"title":"Contributing","description":"","frontmatter":{"sidebarDepth":3},"headers":[],"relativePath":"about/contributing.md","filePath":"about/contributing.md"}'),i={name:"about/contributing.md"},s=a('

Contributing

Submission guidelines

Report a bug

Before creating an issue please make sure you have checked out the docs, you might want to also try searching Github. It's pretty likely someone has already asked a similar question.

Issues can be reported in the issue tracker.

Pull Requests

We love pull requests and we're continually working to make it as easy as possible for people to contribute.

We prefer small pull requests with minimal code changes. The smaller they are the easier they are to review and merge. A core team member will pick up your PR and review it as soon as they can. They may ask for changes or reject your pull request. This is not a reflection of you as an engineer or a person. Please accept feedback graciously as we will also try to be sensitive when providing it.

Although we generally accept many PRs they can be rejected for many reasons. We will be as transparent as possible but it may simply be that you do not have the same context or information regarding the roadmap that the core team members have. We value the time you take to put together any contributions so we pledge to always be respectful of that time and will try to be as open as possible so that you don't waste it.

Commit message guidelines

We follow the Conventional commits specifications which provides a set of rules to make commit messages more readable when looking through the project history. But also, we use the git commit messages to generate the change log.

Commit message format

The commit message should be structured as follows:

<type>: <subject> [optional `breaking`]
<type>: <subject> [optional `breaking`]

Where type must be one of the following:

Use the optional [ breaking ] keyword to declare a BREAKING CHANGE.

Examples

feat: allow provided config object to extend other configs [ breaking ]
feat: allow provided config object to extend other configs [ breaking ]
docs: correct spelling in the contributing.md file
docs: correct spelling in the contributing.md file
fix: fix minor issue in code (#12)
fix: fix minor issue in code (#12)

Versioning guidelines

We rely on Semantic Versioning for versioning a release. Indeed, given a version number MAJOR.MINOR.PATCH, increment the:

The command npm run release:<type>, where <type> is either patch, minor or major, helps you to do the release.

It performs the following task for you:

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.

We are committed to making participation in this project a harassment-free experience for everyone, regardless of level of experience, gender, gender identity and expression, sexual orientation, disability, personal appearance, body size, race, ethnicity, age, or religion.

Examples of unacceptable behavior by participants include the use of sexual language or imagery, derogatory comments or personal attacks, trolling, public or private harassment, insults, or other unprofessional conduct.

Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct. Project maintainers who do not follow the Code of Conduct may be removed from the project team.

Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by opening an issue or contacting one or more of the project maintainers.

This Code of Conduct is adapted from the Contributor Covenant, version 1.0.0, available at http://contributor-covenant.org/version/1/0/0/

',37),n=[s];function r(l,c,d,p,h,u){return t(),o("div",null,n)}const b=e(i,[["render",r]]);export{m as __pageData,b as default}; diff --git a/assets/about_contributing.md.a0ea6fa4.lean.js b/assets/about_contributing.md.a0ea6fa4.lean.js deleted file mode 100644 index 65226d5e..00000000 --- a/assets/about_contributing.md.a0ea6fa4.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as e,o as t,c as o,Q as a}from"./chunks/framework.f7d371db.js";const m=JSON.parse('{"title":"Contributing","description":"","frontmatter":{"sidebarDepth":3},"headers":[],"relativePath":"about/contributing.md","filePath":"about/contributing.md"}'),i={name:"about/contributing.md"},s=a("",37),n=[s];function r(l,c,d,p,h,u){return t(),o("div",null,n)}const b=e(i,[["render",r]]);export{m as __pageData,b as default}; diff --git a/assets/about_introduction.md.18715ba7.js b/assets/about_introduction.md.18715ba7.js deleted file mode 100644 index 8c12fa25..00000000 --- a/assets/about_introduction.md.18715ba7.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as t,o,c as a,Q as e}from"./chunks/framework.f7d371db.js";const i="/kano/assets/kano-screenshot.8676a0d8.png",m=JSON.parse('{"title":"Introduction","description":"","frontmatter":{"sidebarDepth":3},"headers":[],"relativePath":"about/introduction.md","filePath":"about/introduction.md"}'),n={name:"about/introduction.md"},r=e('

Introduction

Kano is a powerful application that can be used to visualize any time-varying geospatial data, notably served by Kargo.

kano-screenshot

TIP

This application is based on the Kalisio Development Kit.

',4),s=[r];function c(d,l,p,_,u,h){return o(),a("div",null,s)}const k=t(n,[["render",c]]);export{m as __pageData,k as default}; diff --git a/assets/about_introduction.md.18715ba7.lean.js b/assets/about_introduction.md.18715ba7.lean.js deleted file mode 100644 index 42d1ff72..00000000 --- a/assets/about_introduction.md.18715ba7.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as t,o,c as a,Q as e}from"./chunks/framework.f7d371db.js";const i="/kano/assets/kano-screenshot.8676a0d8.png",m=JSON.parse('{"title":"Introduction","description":"","frontmatter":{"sidebarDepth":3},"headers":[],"relativePath":"about/introduction.md","filePath":"about/introduction.md"}'),n={name:"about/introduction.md"},r=e("",4),s=[r];function c(d,l,p,_,u,h){return o(),a("div",null,s)}const k=t(n,[["render",c]]);export{m as __pageData,k as default}; diff --git a/assets/about_introduction.md.ZchEHfVq.js b/assets/about_introduction.md.ZchEHfVq.js new file mode 100644 index 00000000..4ff02a01 --- /dev/null +++ b/assets/about_introduction.md.ZchEHfVq.js @@ -0,0 +1 @@ +import{_ as t,c as o,o as a,V as e}from"./chunks/framework.J61Sinzt.js";const i="/kano/assets/kano-screenshot.JiubhQ4J.png",m=JSON.parse('{"title":"Introduction","description":"","frontmatter":{"sidebarDepth":3},"headers":[],"relativePath":"about/introduction.md","filePath":"about/introduction.md"}'),n={name:"about/introduction.md"},r=e('

Introduction

Kano is a powerful application that can be used to visualize any time-varying geospatial data, notably served by Kargo.

kano-screenshot

TIP

This application is based on the Kalisio Development Kit.

',4),s=[r];function c(d,l,p,_,u,h){return a(),o("div",null,s)}const k=t(n,[["render",c]]);export{m as __pageData,k as default}; diff --git a/assets/about_introduction.md.ZchEHfVq.lean.js b/assets/about_introduction.md.ZchEHfVq.lean.js new file mode 100644 index 00000000..e4b1b86f --- /dev/null +++ b/assets/about_introduction.md.ZchEHfVq.lean.js @@ -0,0 +1 @@ +import{_ as t,c as o,o as a,V as e}from"./chunks/framework.J61Sinzt.js";const i="/kano/assets/kano-screenshot.JiubhQ4J.png",m=JSON.parse('{"title":"Introduction","description":"","frontmatter":{"sidebarDepth":3},"headers":[],"relativePath":"about/introduction.md","filePath":"about/introduction.md"}'),n={name:"about/introduction.md"},r=e("",4),s=[r];function c(d,l,p,_,u,h){return a(),o("div",null,s)}const k=t(n,[["render",c]]);export{m as __pageData,k as default}; diff --git a/assets/about_license.md.6b7312ac.js b/assets/about_license.md.6b7312ac.js deleted file mode 100644 index 5ec927cf..00000000 --- a/assets/about_license.md.6b7312ac.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as t,o,c as s,k as e,a as i}from"./chunks/framework.f7d371db.js";const u=JSON.parse('{"title":"License","description":"","frontmatter":{"sidebarDepth":3},"headers":[],"relativePath":"about/license.md","filePath":"about/license.md"}'),n={name:"about/license.md"},a=e("h1",{id:"license",tabindex:"-1"},[i("License "),e("a",{class:"header-anchor",href:"#license","aria-label":'Permalink to "License"'},"​")],-1),c=e("p",null,"MIT License",-1),r=e("p",null,"Copyright (c) 2017-2020 Kalisio",-1),l=e("p",null,'Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:',-1),T=e("p",null,"The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.",-1),d=e("p",null,'THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.',-1),h=[a,c,r,l,T,d];function O(E,I,R,N,p,A){return o(),s("div",null,h)}const _=t(n,[["render",O]]);export{u as __pageData,_ as default}; diff --git a/assets/about_license.md.6b7312ac.lean.js b/assets/about_license.md.6b7312ac.lean.js deleted file mode 100644 index 5ec927cf..00000000 --- a/assets/about_license.md.6b7312ac.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as t,o,c as s,k as e,a as i}from"./chunks/framework.f7d371db.js";const u=JSON.parse('{"title":"License","description":"","frontmatter":{"sidebarDepth":3},"headers":[],"relativePath":"about/license.md","filePath":"about/license.md"}'),n={name:"about/license.md"},a=e("h1",{id:"license",tabindex:"-1"},[i("License "),e("a",{class:"header-anchor",href:"#license","aria-label":'Permalink to "License"'},"​")],-1),c=e("p",null,"MIT License",-1),r=e("p",null,"Copyright (c) 2017-2020 Kalisio",-1),l=e("p",null,'Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:',-1),T=e("p",null,"The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.",-1),d=e("p",null,'THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.',-1),h=[a,c,r,l,T,d];function O(E,I,R,N,p,A){return o(),s("div",null,h)}const _=t(n,[["render",O]]);export{u as __pageData,_ as default}; diff --git a/assets/about_license.md.U9MC9N0n.js b/assets/about_license.md.U9MC9N0n.js new file mode 100644 index 00000000..06f53831 --- /dev/null +++ b/assets/about_license.md.U9MC9N0n.js @@ -0,0 +1 @@ +import{_ as t,c as o,o as s,m as e,a as i}from"./chunks/framework.J61Sinzt.js";const u=JSON.parse('{"title":"License","description":"","frontmatter":{"sidebarDepth":3},"headers":[],"relativePath":"about/license.md","filePath":"about/license.md"}'),n={name:"about/license.md"},a=e("h1",{id:"license",tabindex:"-1"},[i("License "),e("a",{class:"header-anchor",href:"#license","aria-label":'Permalink to "License"'},"​")],-1),c=e("p",null,"MIT License",-1),r=e("p",null,"Copyright (c) 2017-2020 Kalisio",-1),l=e("p",null,'Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:',-1),T=e("p",null,"The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.",-1),d=e("p",null,'THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.',-1),h=[a,c,r,l,T,d];function O(E,I,R,N,p,A){return s(),o("div",null,h)}const _=t(n,[["render",O]]);export{u as __pageData,_ as default}; diff --git a/assets/about_license.md.U9MC9N0n.lean.js b/assets/about_license.md.U9MC9N0n.lean.js new file mode 100644 index 00000000..06f53831 --- /dev/null +++ b/assets/about_license.md.U9MC9N0n.lean.js @@ -0,0 +1 @@ +import{_ as t,c as o,o as s,m as e,a as i}from"./chunks/framework.J61Sinzt.js";const u=JSON.parse('{"title":"License","description":"","frontmatter":{"sidebarDepth":3},"headers":[],"relativePath":"about/license.md","filePath":"about/license.md"}'),n={name:"about/license.md"},a=e("h1",{id:"license",tabindex:"-1"},[i("License "),e("a",{class:"header-anchor",href:"#license","aria-label":'Permalink to "License"'},"​")],-1),c=e("p",null,"MIT License",-1),r=e("p",null,"Copyright (c) 2017-2020 Kalisio",-1),l=e("p",null,'Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:',-1),T=e("p",null,"The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.",-1),d=e("p",null,'THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.',-1),h=[a,c,r,l,T,d];function O(E,I,R,N,p,A){return s(),o("div",null,h)}const _=t(n,[["render",O]]);export{u as __pageData,_ as default}; diff --git a/assets/about_roadmap.md.b9242f49.js b/assets/about_roadmap.md.Tsa-l91W.js similarity index 84% rename from assets/about_roadmap.md.b9242f49.js rename to assets/about_roadmap.md.Tsa-l91W.js index 90a045f1..a40cb423 100644 --- a/assets/about_roadmap.md.b9242f49.js +++ b/assets/about_roadmap.md.Tsa-l91W.js @@ -1 +1 @@ -import{_ as a,o as e,c as t,Q as o}from"./chunks/framework.f7d371db.js";const b=JSON.parse('{"title":"Roadmap","description":"","frontmatter":{"sidebarDepth":3},"headers":[],"relativePath":"about/roadmap.md","filePath":"about/roadmap.md"}'),r={name:"about/roadmap.md"},s=o('

Roadmap

The roadmap is available on Github.

Milestones

The milestones are available on Github

Release Notes

The changelog is available in Github

',6),i=[s];function l(n,h,d,p,m,c){return e(),t("div",null,i)}const u=a(r,[["render",l]]);export{b as __pageData,u as default}; +import{_ as a,c as e,o as t,V as o}from"./chunks/framework.J61Sinzt.js";const b=JSON.parse('{"title":"Roadmap","description":"","frontmatter":{"sidebarDepth":3},"headers":[],"relativePath":"about/roadmap.md","filePath":"about/roadmap.md"}'),r={name:"about/roadmap.md"},s=o('

Roadmap

The roadmap is available on Github.

Milestones

The milestones are available on Github

Release Notes

The changelog is available in Github

',6),i=[s];function l(n,h,d,p,m,c){return t(),e("div",null,i)}const u=a(r,[["render",l]]);export{b as __pageData,u as default}; diff --git a/assets/about_roadmap.md.Tsa-l91W.lean.js b/assets/about_roadmap.md.Tsa-l91W.lean.js new file mode 100644 index 00000000..b2162a8c --- /dev/null +++ b/assets/about_roadmap.md.Tsa-l91W.lean.js @@ -0,0 +1 @@ +import{_ as a,c as e,o as t,V as o}from"./chunks/framework.J61Sinzt.js";const b=JSON.parse('{"title":"Roadmap","description":"","frontmatter":{"sidebarDepth":3},"headers":[],"relativePath":"about/roadmap.md","filePath":"about/roadmap.md"}'),r={name:"about/roadmap.md"},s=o("",6),i=[s];function l(n,h,d,p,m,c){return t(),e("div",null,i)}const u=a(r,[["render",l]]);export{b as __pageData,u as default}; diff --git a/assets/about_roadmap.md.b9242f49.lean.js b/assets/about_roadmap.md.b9242f49.lean.js deleted file mode 100644 index e8d46ca9..00000000 --- a/assets/about_roadmap.md.b9242f49.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as a,o as e,c as t,Q as o}from"./chunks/framework.f7d371db.js";const b=JSON.parse('{"title":"Roadmap","description":"","frontmatter":{"sidebarDepth":3},"headers":[],"relativePath":"about/roadmap.md","filePath":"about/roadmap.md"}'),r={name:"about/roadmap.md"},s=o("",6),i=[s];function l(n,h,d,p,m,c){return e(),t("div",null,i)}const u=a(r,[["render",l]]);export{b as __pageData,u as default}; diff --git a/assets/app.535d05bd.js b/assets/app.535d05bd.js deleted file mode 100644 index 9034df07..00000000 --- a/assets/app.535d05bd.js +++ /dev/null @@ -1 +0,0 @@ -import{j as c,o as p,c as l,k as n,N as m,g as f,Q as h,u,s as r,Z as g,$ as _,a0 as y,a1 as w,a2 as v,a3 as b,a4 as k,a5 as A,a6 as S,a7 as x,a8 as R,d as P,y as C,a9 as E,aa as j,ab as z,ac as B}from"./chunks/framework.f7d371db.js";import{t as D}from"./chunks/theme.d24cb4fa.js";const T=["src"],$={__name:"Maps",props:{source:{type:String,default:"https://kano.dev.kalisio.xyz"},token:{type:String,default:""},cssStyle:{type:String,default:"width: 100%; height: 50vh"}},setup(e){const t=e;return c(()=>{const o=document.getElementById("maps").contentWindow;if(typeof postRobot>"u"){let a=document.createElement("script");a.setAttribute("src","https://cdn.jsdelivr.net/npm/post-robot@10.0.42/dist/post-robot.min.js"),a.onload=()=>{postRobot.on("maps-ready",()=>{t.token!==""&&postRobot.send(o,"setLocalStorage",{"maps-jwt":t.token})})},document.head.appendChild(a)}}),(o,a)=>(p(),l("div",null,[n("iframe",{id:"maps",title:"Maps",allow:"geolocation *",allowfullscreen:"",frameBorder:"0",style:m(e.cssStyle),src:e.source},null,12,T)]))}};const F={style:{"margin-top":"50px"}},L=h('
  

',4),V={href:"https://kalisio.com"},M=["src"],N={__name:"HomeFooter",setup(e){const t=f(()=>u().isDark.value?"https://s3.eu-central-1.amazonaws.com/kalisioscope/kalisio/kalisio-logo-white-256x84.png":"https://s3.eu-central-1.amazonaws.com/kalisioscope/kalisio/kalisio-logo-black-256x84.png");return(o,a)=>(p(),l("div",F,[L,n("a",V,[n("img",{class:"logo-footer",src:t.value},null,8,M)])]))}};const O={extends:D,enhanceApp({app:e}){e.component("home-footer",N),e.component("maps",$)}};function d(e){if(e.extends){const t=d(e.extends);return{...t,...e,async enhanceApp(o){t.enhanceApp&&await t.enhanceApp(o),e.enhanceApp&&await e.enhanceApp(o)}}}return e}const s=d(O),H=P({name:"VitePressApp",setup(){const{site:e}=u();return c(()=>{C(()=>{document.documentElement.lang=e.value.lang,document.documentElement.dir=e.value.dir})}),E(),j(),z(),s.setup&&s.setup(),()=>B(s.Layout)}});async function I(){const e=Q(),t=G();t.provide(_,e);const o=y(e.route);return t.provide(w,o),t.component("Content",v),t.component("ClientOnly",b),Object.defineProperties(t.config.globalProperties,{$frontmatter:{get(){return o.frontmatter.value}},$params:{get(){return o.page.value.params}}}),s.enhanceApp&&await s.enhanceApp({app:t,router:e,siteData:k}),{app:t,router:e,data:o}}function G(){return A(H)}function Q(){let e=r,t;return S(o=>{let a=x(o),i=null;return a&&(e&&(t=a),(e||t===a)&&(a=a.replace(/\.js$/,".lean.js")),i=R(()=>import(a),[])),r&&(e=!1),i},s.NotFound)}r&&I().then(({app:e,router:t,data:o})=>{t.go().then(()=>{g(t.route,o.site),e.mount("#app")})});export{I as createApp}; diff --git a/assets/app.sWWhHtSw.js b/assets/app.sWWhHtSw.js new file mode 100644 index 00000000..b4c887ab --- /dev/null +++ b/assets/app.sWWhHtSw.js @@ -0,0 +1,7 @@ +import{j as o,ak as i,al as u,am as l,an as c,ao as f,ap as d,aq as m,ar as h,as as A,at as g,aj as v,d as P,u as w,l as y,z as C,au as _,av as E,aw as R,a2 as b}from"./chunks/framework.J61Sinzt.js";import{t as j}from"./chunks/theme._JEaWtrq.js";function p(e){if(e.extends){const a=p(e.extends);return{...a,...e,async enhanceApp(t){a.enhanceApp&&await a.enhanceApp(t),e.enhanceApp&&await e.enhanceApp(t)}}}return e}const s=p(j),D=P({name:"VitePressApp",setup(){const{site:e,lang:a,dir:t}=w();return y(()=>{C(()=>{document.documentElement.lang=a.value,document.documentElement.dir=t.value})}),e.value.router.prefetchLinks&&_(),E(),R(),s.setup&&s.setup(),()=>b(s.Layout)}});async function L(){const e=S(),a=O();a.provide(u,e);const t=l(e.route);return a.provide(c,t),a.component("Content",f),a.component("ClientOnly",d),Object.defineProperties(a.config.globalProperties,{$frontmatter:{get(){return t.frontmatter.value}},$params:{get(){return t.page.value.params}}}),s.enhanceApp&&await s.enhanceApp({app:a,router:e,siteData:m}),{app:a,router:e,data:t}}function O(){return h(D)}function S(){let e=o,a;return A(t=>{let n=g(t),r=null;return n&&(e&&(a=n),(e||a===n)&&(n=n.replace(/\.js$/,".lean.js")),r=v(()=>import(n),__vite__mapDeps([]))),o&&(e=!1),r},s.NotFound)}o&&L().then(({app:e,router:a,data:t})=>{a.go().then(()=>{i(a.route,t.site),e.mount("#app")})});export{L as createApp}; +function __vite__mapDeps(indexes) { + if (!__vite__mapDeps.viteFileDeps) { + __vite__mapDeps.viteFileDeps = [] + } + return indexes.map((i) => __vite__mapDeps.viteFileDeps[i]) +} diff --git a/assets/chunks/framework.J61Sinzt.js b/assets/chunks/framework.J61Sinzt.js new file mode 100644 index 00000000..d493931c --- /dev/null +++ b/assets/chunks/framework.J61Sinzt.js @@ -0,0 +1,17 @@ +/** +* @vue/shared v3.4.15 +* (c) 2018-present Yuxi (Evan) You and Vue contributors +* @license MIT +**/function xs(e,t){const n=new Set(e.split(","));return t?s=>n.has(s.toLowerCase()):s=>n.has(s)}const ee={},_t=[],xe=()=>{},Ti=()=>!1,Gt=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&(e.charCodeAt(2)>122||e.charCodeAt(2)<97),Ts=e=>e.startsWith("onUpdate:"),ie=Object.assign,Ss=(e,t)=>{const n=e.indexOf(t);n>-1&&e.splice(n,1)},Si=Object.prototype.hasOwnProperty,Y=(e,t)=>Si.call(e,t),U=Array.isArray,bt=e=>zt(e)==="[object Map]",Gr=e=>zt(e)==="[object Set]",Ai=e=>zt(e)==="[object RegExp]",q=e=>typeof e=="function",ne=e=>typeof e=="string",Tt=e=>typeof e=="symbol",Z=e=>e!==null&&typeof e=="object",zr=e=>(Z(e)||q(e))&&q(e.then)&&q(e.catch),Xr=Object.prototype.toString,zt=e=>Xr.call(e),Ri=e=>zt(e).slice(8,-1),Yr=e=>zt(e)==="[object Object]",As=e=>ne(e)&&e!=="NaN"&&e[0]!=="-"&&""+parseInt(e,10)===e,Mt=xs(",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted"),Rn=e=>{const t=Object.create(null);return n=>t[n]||(t[n]=e(n))},Li=/-(\w)/g,Pe=Rn(e=>e.replace(Li,(t,n)=>n?n.toUpperCase():"")),Oi=/\B([A-Z])/g,ft=Rn(e=>e.replace(Oi,"-$1").toLowerCase()),Ln=Rn(e=>e.charAt(0).toUpperCase()+e.slice(1)),pn=Rn(e=>e?`on${Ln(e)}`:""),et=(e,t)=>!Object.is(e,t),It=(e,t)=>{for(let n=0;n{Object.defineProperty(e,t,{configurable:!0,enumerable:!1,value:n})},Mi=e=>{const t=parseFloat(e);return isNaN(t)?e:t},Ii=e=>{const t=ne(e)?Number(e):NaN;return isNaN(t)?e:t};let Zs;const Jr=()=>Zs||(Zs=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:typeof global<"u"?global:{});function Rs(e){if(U(e)){const t={};for(let n=0;n{if(n){const s=n.split(Fi);s.length>1&&(t[s[0].trim()]=s[1].trim())}}),t}function Ls(e){let t="";if(ne(e))t=e;else if(U(e))for(let n=0;nne(e)?e:e==null?"":U(e)||Z(e)&&(e.toString===Xr||!q(e.toString))?JSON.stringify(e,Zr,2):String(e),Zr=(e,t)=>t&&t.__v_isRef?Zr(e,t.value):bt(t)?{[`Map(${t.size})`]:[...t.entries()].reduce((n,[s,r],o)=>(n[Gn(s,o)+" =>"]=r,n),{})}:Gr(t)?{[`Set(${t.size})`]:[...t.values()].map(n=>Gn(n))}:Tt(t)?Gn(t):Z(t)&&!U(t)&&!Yr(t)?String(t):t,Gn=(e,t="")=>{var n;return Tt(e)?`Symbol(${(n=e.description)!=null?n:t})`:e};/** +* @vue/reactivity v3.4.15 +* (c) 2018-present Yuxi (Evan) You and Vue contributors +* @license MIT +**/let ve;class Vi{constructor(t=!1){this.detached=t,this._active=!0,this.effects=[],this.cleanups=[],this.parent=ve,!t&&ve&&(this.index=(ve.scopes||(ve.scopes=[])).push(this)-1)}get active(){return this._active}run(t){if(this._active){const n=ve;try{return ve=this,t()}finally{ve=n}}}on(){ve=this}off(){ve=this.parent}stop(t){if(this._active){let n,s;for(n=0,s=this.effects.length;n=2))break}this._dirtyLevel<2&&(this._dirtyLevel=0),ht()}return this._dirtyLevel>=2}set dirty(t){this._dirtyLevel=t?2:0}run(){if(this._dirtyLevel=0,!this.active)return this.fn();let t=Ye,n=lt;try{return Ye=!0,lt=this,this._runnings++,er(this),this.fn()}finally{tr(this),this._runnings--,lt=n,Ye=t}}stop(){var t;this.active&&(er(this),tr(this),(t=this.onStop)==null||t.call(this),this.active=!1)}}function Bi(e){return e.value}function er(e){e._trackId++,e._depsLength=0}function tr(e){if(e.deps&&e.deps.length>e._depsLength){for(let t=e._depsLength;t{const n=new Map;return n.cleanup=e,n.computed=t,n},_n=new WeakMap,ct=Symbol(""),fs=Symbol("");function _e(e,t,n){if(Ye&<){let s=_n.get(e);s||_n.set(e,s=new Map);let r=s.get(n);r||s.set(n,r=io(()=>s.delete(n))),so(lt,r)}}function $e(e,t,n,s,r,o){const i=_n.get(e);if(!i)return;let l=[];if(t==="clear")l=[...i.values()];else if(n==="length"&&U(e)){const c=Number(s);i.forEach((u,f)=>{(f==="length"||!Tt(f)&&f>=c)&&l.push(u)})}else switch(n!==void 0&&l.push(i.get(n)),t){case"add":U(e)?As(n)&&l.push(i.get("length")):(l.push(i.get(ct)),bt(e)&&l.push(i.get(fs)));break;case"delete":U(e)||(l.push(i.get(ct)),bt(e)&&l.push(i.get(fs)));break;case"set":bt(e)&&l.push(i.get(ct));break}Ms();for(const c of l)c&&ro(c,2);Is()}function Ui(e,t){var n;return(n=_n.get(e))==null?void 0:n.get(t)}const Ki=xs("__proto__,__v_isRef,__isVue"),lo=new Set(Object.getOwnPropertyNames(Symbol).filter(e=>e!=="arguments"&&e!=="caller").map(e=>Symbol[e]).filter(Tt)),nr=Wi();function Wi(){const e={};return["includes","indexOf","lastIndexOf"].forEach(t=>{e[t]=function(...n){const s=J(this);for(let o=0,i=this.length;o{e[t]=function(...n){dt(),Ms();const s=J(this)[t].apply(this,n);return Is(),ht(),s}}),e}function qi(e){const t=J(this);return _e(t,"has",e),t.hasOwnProperty(e)}class co{constructor(t=!1,n=!1){this._isReadonly=t,this._shallow=n}get(t,n,s){const r=this._isReadonly,o=this._shallow;if(n==="__v_isReactive")return!r;if(n==="__v_isReadonly")return r;if(n==="__v_isShallow")return o;if(n==="__v_raw")return s===(r?o?ol:ho:o?fo:uo).get(t)||Object.getPrototypeOf(t)===Object.getPrototypeOf(s)?t:void 0;const i=U(t);if(!r){if(i&&Y(nr,n))return Reflect.get(nr,n,s);if(n==="hasOwnProperty")return qi}const l=Reflect.get(t,n,s);return(Tt(n)?lo.has(n):Ki(n))||(r||_e(t,"get",n),o)?l:he(l)?i&&As(n)?l:l.value:Z(l)?r?In(l):Mn(l):l}}class ao extends co{constructor(t=!1){super(!1,t)}set(t,n,s,r){let o=t[n];if(!this._shallow){const c=Ct(o);if(!bn(s)&&!Ct(s)&&(o=J(o),s=J(s)),!U(t)&&he(o)&&!he(s))return c?!1:(o.value=s,!0)}const i=U(t)&&As(n)?Number(n)e,On=e=>Reflect.getPrototypeOf(e);function Zt(e,t,n=!1,s=!1){e=e.__v_raw;const r=J(e),o=J(t);n||(et(t,o)&&_e(r,"get",t),_e(r,"get",o));const{has:i}=On(r),l=s?Ps:n?$s:Dt;if(i.call(r,t))return l(e.get(t));if(i.call(r,o))return l(e.get(o));e!==r&&e.get(t)}function en(e,t=!1){const n=this.__v_raw,s=J(n),r=J(e);return t||(et(e,r)&&_e(s,"has",e),_e(s,"has",r)),e===r?n.has(e):n.has(e)||n.has(r)}function tn(e,t=!1){return e=e.__v_raw,!t&&_e(J(e),"iterate",ct),Reflect.get(e,"size",e)}function sr(e){e=J(e);const t=J(this);return On(t).has.call(t,e)||(t.add(e),$e(t,"add",e,e)),this}function rr(e,t){t=J(t);const n=J(this),{has:s,get:r}=On(n);let o=s.call(n,e);o||(e=J(e),o=s.call(n,e));const i=r.call(n,e);return n.set(e,t),o?et(t,i)&&$e(n,"set",e,t):$e(n,"add",e,t),this}function or(e){const t=J(this),{has:n,get:s}=On(t);let r=n.call(t,e);r||(e=J(e),r=n.call(t,e)),s&&s.call(t,e);const o=t.delete(e);return r&&$e(t,"delete",e,void 0),o}function ir(){const e=J(this),t=e.size!==0,n=e.clear();return t&&$e(e,"clear",void 0,void 0),n}function nn(e,t){return function(s,r){const o=this,i=o.__v_raw,l=J(i),c=t?Ps:e?$s:Dt;return!e&&_e(l,"iterate",ct),i.forEach((u,f)=>s.call(r,c(u),c(f),o))}}function sn(e,t,n){return function(...s){const r=this.__v_raw,o=J(r),i=bt(o),l=e==="entries"||e===Symbol.iterator&&i,c=e==="keys"&&i,u=r[e](...s),f=n?Ps:t?$s:Dt;return!t&&_e(o,"iterate",c?fs:ct),{next(){const{value:p,done:m}=u.next();return m?{value:p,done:m}:{value:l?[f(p[0]),f(p[1])]:f(p),done:m}},[Symbol.iterator](){return this}}}}function De(e){return function(...t){return e==="delete"?!1:e==="clear"?void 0:this}}function Ji(){const e={get(o){return Zt(this,o)},get size(){return tn(this)},has:en,add:sr,set:rr,delete:or,clear:ir,forEach:nn(!1,!1)},t={get(o){return Zt(this,o,!1,!0)},get size(){return tn(this)},has:en,add:sr,set:rr,delete:or,clear:ir,forEach:nn(!1,!0)},n={get(o){return Zt(this,o,!0)},get size(){return tn(this,!0)},has(o){return en.call(this,o,!0)},add:De("add"),set:De("set"),delete:De("delete"),clear:De("clear"),forEach:nn(!0,!1)},s={get(o){return Zt(this,o,!0,!0)},get size(){return tn(this,!0)},has(o){return en.call(this,o,!0)},add:De("add"),set:De("set"),delete:De("delete"),clear:De("clear"),forEach:nn(!0,!0)};return["keys","values","entries",Symbol.iterator].forEach(o=>{e[o]=sn(o,!1,!1),n[o]=sn(o,!0,!1),t[o]=sn(o,!1,!0),s[o]=sn(o,!0,!0)}),[e,n,t,s]}const[Qi,Zi,el,tl]=Ji();function Fs(e,t){const n=t?e?tl:el:e?Zi:Qi;return(s,r,o)=>r==="__v_isReactive"?!e:r==="__v_isReadonly"?e:r==="__v_raw"?s:Reflect.get(Y(n,r)&&r in s?n:s,r,o)}const nl={get:Fs(!1,!1)},sl={get:Fs(!1,!0)},rl={get:Fs(!0,!1)},uo=new WeakMap,fo=new WeakMap,ho=new WeakMap,ol=new WeakMap;function il(e){switch(e){case"Object":case"Array":return 1;case"Map":case"Set":case"WeakMap":case"WeakSet":return 2;default:return 0}}function ll(e){return e.__v_skip||!Object.isExtensible(e)?0:il(Ri(e))}function Mn(e){return Ct(e)?e:Ns(e,!1,zi,nl,uo)}function cl(e){return Ns(e,!1,Yi,sl,fo)}function In(e){return Ns(e,!0,Xi,rl,ho)}function Ns(e,t,n,s,r){if(!Z(e)||e.__v_raw&&!(t&&e.__v_isReactive))return e;const o=r.get(e);if(o)return o;const i=ll(e);if(i===0)return e;const l=new Proxy(e,i===2?s:n);return r.set(e,l),l}function vt(e){return Ct(e)?vt(e.__v_raw):!!(e&&e.__v_isReactive)}function Ct(e){return!!(e&&e.__v_isReadonly)}function bn(e){return!!(e&&e.__v_isShallow)}function po(e){return vt(e)||Ct(e)}function J(e){const t=e&&e.__v_raw;return t?J(t):e}function Pt(e){return yn(e,"__v_skip",!0),e}const Dt=e=>Z(e)?Mn(e):e,$s=e=>Z(e)?In(e):e;class go{constructor(t,n,s,r){this._setter=n,this.dep=void 0,this.__v_isRef=!0,this.__v_isReadonly=!1,this.effect=new Os(()=>t(this._value),()=>Ft(this,1),()=>this.dep&&oo(this.dep)),this.effect.computed=this,this.effect.active=this._cacheable=!r,this.__v_isReadonly=s}get value(){const t=J(this);return(!t._cacheable||t.effect.dirty)&&et(t._value,t._value=t.effect.run())&&Ft(t,2),Hs(t),t.effect._dirtyLevel>=1&&Ft(t,1),t._value}set value(t){this._setter(t)}get _dirty(){return this.effect.dirty}set _dirty(t){this.effect.dirty=t}}function al(e,t,n=!1){let s,r;const o=q(e);return o?(s=e,r=xe):(s=e.get,r=e.set),new go(s,r,o||!r,n)}function Hs(e){Ye&<&&(e=J(e),so(lt,e.dep||(e.dep=io(()=>e.dep=void 0,e instanceof go?e:void 0))))}function Ft(e,t=2,n){e=J(e);const s=e.dep;s&&ro(s,t)}function he(e){return!!(e&&e.__v_isRef===!0)}function ye(e){return yo(e,!1)}function mo(e){return yo(e,!0)}function yo(e,t){return he(e)?e:new ul(e,t)}class ul{constructor(t,n){this.__v_isShallow=n,this.dep=void 0,this.__v_isRef=!0,this._rawValue=n?t:J(t),this._value=n?t:Dt(t)}get value(){return Hs(this),this._value}set value(t){const n=this.__v_isShallow||bn(t)||Ct(t);t=n?t:J(t),et(t,this._rawValue)&&(this._rawValue=t,this._value=n?t:Dt(t),Ft(this,2))}}function _o(e){return he(e)?e.value:e}const fl={get:(e,t,n)=>_o(Reflect.get(e,t,n)),set:(e,t,n,s)=>{const r=e[t];return he(r)&&!he(n)?(r.value=n,!0):Reflect.set(e,t,n,s)}};function bo(e){return vt(e)?e:new Proxy(e,fl)}class dl{constructor(t){this.dep=void 0,this.__v_isRef=!0;const{get:n,set:s}=t(()=>Hs(this),()=>Ft(this));this._get=n,this._set=s}get value(){return this._get()}set value(t){this._set(t)}}function hl(e){return new dl(e)}class pl{constructor(t,n,s){this._object=t,this._key=n,this._defaultValue=s,this.__v_isRef=!0}get value(){const t=this._object[this._key];return t===void 0?this._defaultValue:t}set value(t){this._object[this._key]=t}get dep(){return Ui(J(this._object),this._key)}}class gl{constructor(t){this._getter=t,this.__v_isRef=!0,this.__v_isReadonly=!0}get value(){return this._getter()}}function ml(e,t,n){return he(e)?e:q(e)?new gl(e):Z(e)&&arguments.length>1?yl(e,t,n):ye(e)}function yl(e,t,n){const s=e[t];return he(s)?s:new pl(e,t,n)}/** +* @vue/runtime-core v3.4.15 +* (c) 2018-present Yuxi (Evan) You and Vue contributors +* @license MIT +**/function Je(e,t,n,s){let r;try{r=s?e(...s):e()}catch(o){Pn(o,t,n)}return r}function Te(e,t,n,s){if(q(e)){const o=Je(e,t,n,s);return o&&zr(o)&&o.catch(i=>{Pn(i,t,n)}),o}const r=[];for(let o=0;o>>1,r=de[s],o=Ut(r);oIe&&de.splice(t,1)}function wl(e){U(e)?wt.push(...e):(!We||!We.includes(e,e.allowRecurse?ot+1:ot))&&wt.push(e),wo()}function lr(e,t,n=Bt?Ie+1:0){for(;nUt(n)-Ut(s));if(wt.length=0,We){We.push(...t);return}for(We=t,ot=0;ote.id==null?1/0:e.id,El=(e,t)=>{const n=Ut(e)-Ut(t);if(n===0){if(e.pre&&!t.pre)return-1;if(t.pre&&!e.pre)return 1}return n};function Eo(e){ds=!1,Bt=!0,de.sort(El);try{for(Ie=0;Iene(_)?_.trim():_)),p&&(r=n.map(Mi))}let l,c=s[l=pn(t)]||s[l=pn(Pe(t))];!c&&o&&(c=s[l=pn(ft(t))]),c&&Te(c,e,6,r);const u=s[l+"Once"];if(u){if(!e.emitted)e.emitted={};else if(e.emitted[l])return;e.emitted[l]=!0,Te(u,e,6,r)}}function Co(e,t,n=!1){const s=t.emitsCache,r=s.get(e);if(r!==void 0)return r;const o=e.emits;let i={},l=!1;if(!q(e)){const c=u=>{const f=Co(u,t,!0);f&&(l=!0,ie(i,f))};!n&&t.mixins.length&&t.mixins.forEach(c),e.extends&&c(e.extends),e.mixins&&e.mixins.forEach(c)}return!o&&!l?(Z(e)&&s.set(e,null),null):(U(o)?o.forEach(c=>i[c]=null):ie(i,o),Z(e)&&s.set(e,i),i)}function Nn(e,t){return!e||!Gt(t)?!1:(t=t.slice(2).replace(/Once$/,""),Y(e,t[0].toLowerCase()+t.slice(1))||Y(e,ft(t))||Y(e,t))}let oe=null,$n=null;function wn(e){const t=oe;return oe=e,$n=e&&e.type.__scopeId||null,t}function Qa(e){$n=e}function Za(){$n=null}function xl(e,t=oe,n){if(!t||e._n)return e;const s=(...r)=>{s._d&&wr(-1);const o=wn(t);let i;try{i=e(...r)}finally{wn(o),s._d&&wr(1)}return i};return s._n=!0,s._c=!0,s._d=!0,s}function zn(e){const{type:t,vnode:n,proxy:s,withProxy:r,props:o,propsOptions:[i],slots:l,attrs:c,emit:u,render:f,renderCache:p,data:m,setupState:_,ctx:O,inheritAttrs:I}=e;let H,K;const M=wn(e);try{if(n.shapeFlag&4){const g=r||s,R=g;H=Ae(f.call(R,g,p,o,_,m,O)),K=c}else{const g=t;H=Ae(g.length>1?g(o,{attrs:c,slots:l,emit:u}):g(o,null)),K=t.props?c:Tl(c)}}catch(g){jt.length=0,Pn(g,e,1),H=fe(we)}let h=H;if(K&&I!==!1){const g=Object.keys(K),{shapeFlag:R}=h;g.length&&R&7&&(i&&g.some(Ts)&&(K=Sl(K,i)),h=je(h,K))}return n.dirs&&(h=je(h),h.dirs=h.dirs?h.dirs.concat(n.dirs):n.dirs),n.transition&&(h.transition=n.transition),H=h,wn(M),H}const Tl=e=>{let t;for(const n in e)(n==="class"||n==="style"||Gt(n))&&((t||(t={}))[n]=e[n]);return t},Sl=(e,t)=>{const n={};for(const s in e)(!Ts(s)||!(s.slice(9)in t))&&(n[s]=e[s]);return n};function Al(e,t,n){const{props:s,children:r,component:o}=e,{props:i,children:l,patchFlag:c}=t,u=o.emitsOptions;if(t.dirs||t.transition)return!0;if(n&&c>=0){if(c&1024)return!0;if(c&16)return s?cr(s,i,u):!!i;if(c&8){const f=t.dynamicProps;for(let p=0;pe.__isSuspense;function Ao(e,t){t&&t.pendingBranch?U(e)?t.effects.push(...e):t.effects.push(e):wl(e)}const Ll=Symbol.for("v-scx"),Ol=()=>Et(Ll);function Ro(e,t){return Hn(e,null,t)}function nu(e,t){return Hn(e,null,{flush:"post"})}const rn={};function He(e,t,n){return Hn(e,t,n)}function Hn(e,t,{immediate:n,deep:s,flush:r,once:o,onTrack:i,onTrigger:l}=ee){if(t&&o){const C=t;t=(...N)=>{C(...N),R()}}const c=ue,u=C=>s===!0?C:it(C,s===!1?1:void 0);let f,p=!1,m=!1;if(he(e)?(f=()=>e.value,p=bn(e)):vt(e)?(f=()=>u(e),p=!0):U(e)?(m=!0,p=e.some(C=>vt(C)||bn(C)),f=()=>e.map(C=>{if(he(C))return C.value;if(vt(C))return u(C);if(q(C))return Je(C,c,2)})):q(e)?t?f=()=>Je(e,c,2):f=()=>(_&&_(),Te(e,c,3,[O])):f=xe,t&&s){const C=f;f=()=>it(C())}let _,O=C=>{_=h.onStop=()=>{Je(C,c,4),_=h.onStop=void 0}},I;if(Bn)if(O=xe,t?n&&Te(t,c,3,[f(),m?[]:void 0,O]):f(),r==="sync"){const C=Ol();I=C.__watcherHandles||(C.__watcherHandles=[])}else return xe;let H=m?new Array(e.length).fill(rn):rn;const K=()=>{if(!(!h.active||!h.dirty))if(t){const C=h.run();(s||p||(m?C.some((N,x)=>et(N,H[x])):et(C,H)))&&(_&&_(),Te(t,c,3,[C,H===rn?void 0:m&&H[0]===rn?[]:H,O]),H=C)}else h.run()};K.allowRecurse=!!t;let M;r==="sync"?M=K:r==="post"?M=()=>ae(K,c&&c.suspense):(K.pre=!0,c&&(K.id=c.uid),M=()=>Vs(K));const h=new Os(f,xe,M),g=eo(),R=()=>{h.stop(),g&&Ss(g.effects,h)};return t?n?K():H=h.run():r==="post"?ae(h.run.bind(h),c&&c.suspense):h.run(),I&&I.push(R),R}function Ml(e,t,n){const s=this.proxy,r=ne(e)?e.includes(".")?Lo(s,e):()=>s[e]:e.bind(s,s);let o;q(t)?o=t:(o=t.handler,n=t);const i=Yt(this),l=Hn(r,o.bind(s),n);return i(),l}function Lo(e,t){const n=t.split(".");return()=>{let s=e;for(let r=0;r0){if(n>=t)return e;n++}if(s=s||new Set,s.has(e))return e;if(s.add(e),he(e))it(e.value,t,n,s);else if(U(e))for(let r=0;r{it(r,t,n,s)});else if(Yr(e))for(const r in e)it(e[r],t,n,s);return e}function su(e,t){if(oe===null)return e;const n=Un(oe)||oe.proxy,s=e.dirs||(e.dirs=[]);for(let r=0;r{e.isMounted=!0}),Ds(()=>{e.isUnmounting=!0}),e}const Ee=[Function,Array],Oo={mode:String,appear:Boolean,persisted:Boolean,onBeforeEnter:Ee,onEnter:Ee,onAfterEnter:Ee,onEnterCancelled:Ee,onBeforeLeave:Ee,onLeave:Ee,onAfterLeave:Ee,onLeaveCancelled:Ee,onBeforeAppear:Ee,onAppear:Ee,onAfterAppear:Ee,onAppearCancelled:Ee},Pl={name:"BaseTransition",props:Oo,setup(e,{slots:t}){const n=Xt(),s=Il();let r;return()=>{const o=t.default&&Io(t.default(),!0);if(!o||!o.length)return;let i=o[0];if(o.length>1){for(const I of o)if(I.type!==we){i=I;break}}const l=J(e),{mode:c}=l;if(s.isLeaving)return Xn(i);const u=ur(i);if(!u)return Xn(i);const f=hs(u,l,s,n);En(u,f);const p=n.subTree,m=p&&ur(p);let _=!1;const{getTransitionKey:O}=u.type;if(O){const I=O();r===void 0?r=I:I!==r&&(r=I,_=!0)}if(m&&m.type!==we&&(!Xe(u,m)||_)){const I=hs(m,l,s,n);if(En(m,I),c==="out-in")return s.isLeaving=!0,I.afterLeave=()=>{s.isLeaving=!1,n.update.active!==!1&&(n.effect.dirty=!0,n.update())},Xn(i);c==="in-out"&&u.type!==we&&(I.delayLeave=(H,K,M)=>{const h=Mo(s,m);h[String(m.key)]=m,H[qe]=()=>{K(),H[qe]=void 0,delete f.delayedLeave},f.delayedLeave=M})}return i}}},Fl=Pl;function Mo(e,t){const{leavingVNodes:n}=e;let s=n.get(t.type);return s||(s=Object.create(null),n.set(t.type,s)),s}function hs(e,t,n,s){const{appear:r,mode:o,persisted:i=!1,onBeforeEnter:l,onEnter:c,onAfterEnter:u,onEnterCancelled:f,onBeforeLeave:p,onLeave:m,onAfterLeave:_,onLeaveCancelled:O,onBeforeAppear:I,onAppear:H,onAfterAppear:K,onAppearCancelled:M}=t,h=String(e.key),g=Mo(n,e),R=(x,S)=>{x&&Te(x,s,9,S)},C=(x,S)=>{const E=S[1];R(x,S),U(x)?x.every(B=>B.length<=1)&&E():x.length<=1&&E()},N={mode:o,persisted:i,beforeEnter(x){let S=l;if(!n.isMounted)if(r)S=I||l;else return;x[qe]&&x[qe](!0);const E=g[h];E&&Xe(e,E)&&E.el[qe]&&E.el[qe](),R(S,[x])},enter(x){let S=c,E=u,B=f;if(!n.isMounted)if(r)S=H||c,E=K||u,B=M||f;else return;let F=!1;const G=x[on]=re=>{F||(F=!0,re?R(B,[x]):R(E,[x]),N.delayedLeave&&N.delayedLeave(),x[on]=void 0)};S?C(S,[x,G]):G()},leave(x,S){const E=String(e.key);if(x[on]&&x[on](!0),n.isUnmounting)return S();R(p,[x]);let B=!1;const F=x[qe]=G=>{B||(B=!0,S(),G?R(O,[x]):R(_,[x]),x[qe]=void 0,g[E]===e&&delete g[E])};g[E]=e,m?C(m,[x,F]):F()},clone(x){return hs(x,t,n,s)}};return N}function Xn(e){if(jn(e))return e=je(e),e.children=null,e}function ur(e){return jn(e)?e.children?e.children[0]:void 0:e}function En(e,t){e.shapeFlag&6&&e.component?En(e.component.subTree,t):e.shapeFlag&128?(e.ssContent.transition=t.clone(e.ssContent),e.ssFallback.transition=t.clone(e.ssFallback)):e.transition=t}function Io(e,t=!1,n){let s=[],r=0;for(let o=0;o1)for(let o=0;o!!e.type.__asyncLoader,jn=e=>e.type.__isKeepAlive,Nl={name:"KeepAlive",__isKeepAlive:!0,props:{include:[String,RegExp,Array],exclude:[String,RegExp,Array],max:[String,Number]},setup(e,{slots:t}){const n=Xt(),s=n.ctx;if(!s.renderer)return()=>{const M=t.default&&t.default();return M&&M.length===1?M[0]:M};const r=new Map,o=new Set;let i=null;const l=n.suspense,{renderer:{p:c,m:u,um:f,o:{createElement:p}}}=s,m=p("div");s.activate=(M,h,g,R,C)=>{const N=M.component;u(M,h,g,0,l),c(N.vnode,M,h,g,N,l,R,M.slotScopeIds,C),ae(()=>{N.isDeactivated=!1,N.a&&It(N.a);const x=M.props&&M.props.onVnodeMounted;x&&ge(x,N.parent,M)},l)},s.deactivate=M=>{const h=M.component;u(M,m,null,1,l),ae(()=>{h.da&&It(h.da);const g=M.props&&M.props.onVnodeUnmounted;g&&ge(g,h.parent,M),h.isDeactivated=!0},l)};function _(M){Yn(M),f(M,n,l,!0)}function O(M){r.forEach((h,g)=>{const R=vs(h.type);R&&(!M||!M(R))&&I(g)})}function I(M){const h=r.get(M);!i||!Xe(h,i)?_(h):i&&Yn(i),r.delete(M),o.delete(M)}He(()=>[e.include,e.exclude],([M,h])=>{M&&O(g=>Lt(M,g)),h&&O(g=>!Lt(h,g))},{flush:"post",deep:!0});let H=null;const K=()=>{H!=null&&r.set(H,Jn(n.subTree))};return pt(K),No(K),Ds(()=>{r.forEach(M=>{const{subTree:h,suspense:g}=n,R=Jn(h);if(M.type===R.type&&M.key===R.key){Yn(R);const C=R.component.da;C&&ae(C,g);return}_(M)})}),()=>{if(H=null,!t.default)return null;const M=t.default(),h=M[0];if(M.length>1)return i=null,M;if(!Wt(h)||!(h.shapeFlag&4)&&!(h.shapeFlag&128))return i=null,h;let g=Jn(h);const R=g.type,C=vs(at(g)?g.type.__asyncResolved||{}:R),{include:N,exclude:x,max:S}=e;if(N&&(!C||!Lt(N,C))||x&&C&&Lt(x,C))return i=g,h;const E=g.key==null?R:g.key,B=r.get(E);return g.el&&(g=je(g),h.shapeFlag&128&&(h.ssContent=g)),H=E,B?(g.el=B.el,g.component=B.component,g.transition&&En(g,g.transition),g.shapeFlag|=512,o.delete(E),o.add(E)):(o.add(E),S&&o.size>parseInt(S,10)&&I(o.values().next().value)),g.shapeFlag|=256,i=g,So(h.type)?h:g}}},ru=Nl;function Lt(e,t){return U(e)?e.some(n=>Lt(n,t)):ne(e)?e.split(",").includes(t):Ai(e)?e.test(t):!1}function $l(e,t){Fo(e,"a",t)}function Hl(e,t){Fo(e,"da",t)}function Fo(e,t,n=ue){const s=e.__wdc||(e.__wdc=()=>{let r=n;for(;r;){if(r.isDeactivated)return;r=r.parent}return e()});if(Vn(t,s,n),n){let r=n.parent;for(;r&&r.parent;)jn(r.parent.vnode)&&jl(s,t,n,r),r=r.parent}}function jl(e,t,n,s){const r=Vn(t,e,s,!0);kn(()=>{Ss(s[t],r)},n)}function Yn(e){e.shapeFlag&=-257,e.shapeFlag&=-513}function Jn(e){return e.shapeFlag&128?e.ssContent:e}function Vn(e,t,n=ue,s=!1){if(n){const r=n[e]||(n[e]=[]),o=t.__weh||(t.__weh=(...i)=>{if(n.isUnmounted)return;dt();const l=Yt(n),c=Te(t,n,e,i);return l(),ht(),c});return s?r.unshift(o):r.push(o),o}}const ke=e=>(t,n=ue)=>(!Bn||e==="sp")&&Vn(e,(...s)=>t(...s),n),Vl=ke("bm"),pt=ke("m"),kl=ke("bu"),No=ke("u"),Ds=ke("bum"),kn=ke("um"),Dl=ke("sp"),Bl=ke("rtg"),Ul=ke("rtc");function Kl(e,t=ue){Vn("ec",e,t)}function ou(e,t,n,s){let r;const o=n&&n[s];if(U(e)||ne(e)){r=new Array(e.length);for(let i=0,l=e.length;it(i,l,void 0,o&&o[l]));else{const i=Object.keys(e);r=new Array(i.length);for(let l=0,c=i.length;lWt(t)?!(t.type===we||t.type===me&&!$o(t.children)):!0)?e:null}function lu(e,t){const n={};for(const s in e)n[t&&/[A-Z]/.test(s)?`on:${s}`:pn(s)]=e[s];return n}const ps=e=>e?ei(e)?Un(e)||e.proxy:ps(e.parent):null,Nt=ie(Object.create(null),{$:e=>e,$el:e=>e.vnode.el,$data:e=>e.data,$props:e=>e.props,$attrs:e=>e.attrs,$slots:e=>e.slots,$refs:e=>e.refs,$parent:e=>ps(e.parent),$root:e=>ps(e.root),$emit:e=>e.emit,$options:e=>Bs(e),$forceUpdate:e=>e.f||(e.f=()=>{e.effect.dirty=!0,Vs(e.update)}),$nextTick:e=>e.n||(e.n=Fn.bind(e.proxy)),$watch:e=>Ml.bind(e)}),Qn=(e,t)=>e!==ee&&!e.__isScriptSetup&&Y(e,t),Wl={get({_:e},t){const{ctx:n,setupState:s,data:r,props:o,accessCache:i,type:l,appContext:c}=e;let u;if(t[0]!=="$"){const _=i[t];if(_!==void 0)switch(_){case 1:return s[t];case 2:return r[t];case 4:return n[t];case 3:return o[t]}else{if(Qn(s,t))return i[t]=1,s[t];if(r!==ee&&Y(r,t))return i[t]=2,r[t];if((u=e.propsOptions[0])&&Y(u,t))return i[t]=3,o[t];if(n!==ee&&Y(n,t))return i[t]=4,n[t];gs&&(i[t]=0)}}const f=Nt[t];let p,m;if(f)return t==="$attrs"&&_e(e,"get",t),f(e);if((p=l.__cssModules)&&(p=p[t]))return p;if(n!==ee&&Y(n,t))return i[t]=4,n[t];if(m=c.config.globalProperties,Y(m,t))return m[t]},set({_:e},t,n){const{data:s,setupState:r,ctx:o}=e;return Qn(r,t)?(r[t]=n,!0):s!==ee&&Y(s,t)?(s[t]=n,!0):Y(e.props,t)||t[0]==="$"&&t.slice(1)in e?!1:(o[t]=n,!0)},has({_:{data:e,setupState:t,accessCache:n,ctx:s,appContext:r,propsOptions:o}},i){let l;return!!n[i]||e!==ee&&Y(e,i)||Qn(t,i)||(l=o[0])&&Y(l,i)||Y(s,i)||Y(Nt,i)||Y(r.config.globalProperties,i)},defineProperty(e,t,n){return n.get!=null?e._.accessCache[t]=0:Y(n,"value")&&this.set(e,t,n.value,null),Reflect.defineProperty(e,t,n)}};function cu(){return ql().slots}function ql(){const e=Xt();return e.setupContext||(e.setupContext=ni(e))}function fr(e){return U(e)?e.reduce((t,n)=>(t[n]=null,t),{}):e}let gs=!0;function Gl(e){const t=Bs(e),n=e.proxy,s=e.ctx;gs=!1,t.beforeCreate&&dr(t.beforeCreate,e,"bc");const{data:r,computed:o,methods:i,watch:l,provide:c,inject:u,created:f,beforeMount:p,mounted:m,beforeUpdate:_,updated:O,activated:I,deactivated:H,beforeDestroy:K,beforeUnmount:M,destroyed:h,unmounted:g,render:R,renderTracked:C,renderTriggered:N,errorCaptured:x,serverPrefetch:S,expose:E,inheritAttrs:B,components:F,directives:G,filters:re}=t;if(u&&zl(u,s,null),i)for(const X in i){const V=i[X];q(V)&&(s[X]=V.bind(n))}if(r){const X=r.call(n,n);Z(X)&&(e.data=Mn(X))}if(gs=!0,o)for(const X in o){const V=o[X],Fe=q(V)?V.bind(n,n):q(V.get)?V.get.bind(n,n):xe,Jt=!q(V)&&q(V.set)?V.set.bind(n):xe,tt=se({get:Fe,set:Jt});Object.defineProperty(s,X,{enumerable:!0,configurable:!0,get:()=>tt.value,set:Le=>tt.value=Le})}if(l)for(const X in l)Ho(l[X],s,n,X);if(c){const X=q(c)?c.call(n):c;Reflect.ownKeys(X).forEach(V=>{ec(V,X[V])})}f&&dr(f,e,"c");function k(X,V){U(V)?V.forEach(Fe=>X(Fe.bind(n))):V&&X(V.bind(n))}if(k(Vl,p),k(pt,m),k(kl,_),k(No,O),k($l,I),k(Hl,H),k(Kl,x),k(Ul,C),k(Bl,N),k(Ds,M),k(kn,g),k(Dl,S),U(E))if(E.length){const X=e.exposed||(e.exposed={});E.forEach(V=>{Object.defineProperty(X,V,{get:()=>n[V],set:Fe=>n[V]=Fe})})}else e.exposed||(e.exposed={});R&&e.render===xe&&(e.render=R),B!=null&&(e.inheritAttrs=B),F&&(e.components=F),G&&(e.directives=G)}function zl(e,t,n=xe){U(e)&&(e=ms(e));for(const s in e){const r=e[s];let o;Z(r)?"default"in r?o=Et(r.from||s,r.default,!0):o=Et(r.from||s):o=Et(r),he(o)?Object.defineProperty(t,s,{enumerable:!0,configurable:!0,get:()=>o.value,set:i=>o.value=i}):t[s]=o}}function dr(e,t,n){Te(U(e)?e.map(s=>s.bind(t.proxy)):e.bind(t.proxy),t,n)}function Ho(e,t,n,s){const r=s.includes(".")?Lo(n,s):()=>n[s];if(ne(e)){const o=t[e];q(o)&&He(r,o)}else if(q(e))He(r,e.bind(n));else if(Z(e))if(U(e))e.forEach(o=>Ho(o,t,n,s));else{const o=q(e.handler)?e.handler.bind(n):t[e.handler];q(o)&&He(r,o,e)}}function Bs(e){const t=e.type,{mixins:n,extends:s}=t,{mixins:r,optionsCache:o,config:{optionMergeStrategies:i}}=e.appContext,l=o.get(t);let c;return l?c=l:!r.length&&!n&&!s?c=t:(c={},r.length&&r.forEach(u=>Cn(c,u,i,!0)),Cn(c,t,i)),Z(t)&&o.set(t,c),c}function Cn(e,t,n,s=!1){const{mixins:r,extends:o}=t;o&&Cn(e,o,n,!0),r&&r.forEach(i=>Cn(e,i,n,!0));for(const i in t)if(!(s&&i==="expose")){const l=Xl[i]||n&&n[i];e[i]=l?l(e[i],t[i]):t[i]}return e}const Xl={data:hr,props:pr,emits:pr,methods:Ot,computed:Ot,beforeCreate:pe,created:pe,beforeMount:pe,mounted:pe,beforeUpdate:pe,updated:pe,beforeDestroy:pe,beforeUnmount:pe,destroyed:pe,unmounted:pe,activated:pe,deactivated:pe,errorCaptured:pe,serverPrefetch:pe,components:Ot,directives:Ot,watch:Jl,provide:hr,inject:Yl};function hr(e,t){return t?e?function(){return ie(q(e)?e.call(this,this):e,q(t)?t.call(this,this):t)}:t:e}function Yl(e,t){return Ot(ms(e),ms(t))}function ms(e){if(U(e)){const t={};for(let n=0;n1)return n&&q(t)?t.call(s&&s.proxy):t}}function tc(e,t,n,s=!1){const r={},o={};yn(o,Dn,1),e.propsDefaults=Object.create(null),Vo(e,t,r,o);for(const i in e.propsOptions[0])i in r||(r[i]=void 0);n?e.props=s?r:cl(r):e.type.props?e.props=r:e.props=o,e.attrs=o}function nc(e,t,n,s){const{props:r,attrs:o,vnode:{patchFlag:i}}=e,l=J(r),[c]=e.propsOptions;let u=!1;if((s||i>0)&&!(i&16)){if(i&8){const f=e.vnode.dynamicProps;for(let p=0;p{c=!0;const[m,_]=ko(p,t,!0);ie(i,m),_&&l.push(..._)};!n&&t.mixins.length&&t.mixins.forEach(f),e.extends&&f(e.extends),e.mixins&&e.mixins.forEach(f)}if(!o&&!c)return Z(e)&&s.set(e,_t),_t;if(U(o))for(let f=0;f-1,_[1]=I<0||O-1||Y(_,"default"))&&l.push(p)}}}const u=[i,l];return Z(e)&&s.set(e,u),u}function gr(e){return e[0]!=="$"}function mr(e){const t=e&&e.toString().match(/^\s*(function|class) (\w+)/);return t?t[2]:e===null?"null":""}function yr(e,t){return mr(e)===mr(t)}function _r(e,t){return U(t)?t.findIndex(n=>yr(n,e)):q(t)&&yr(t,e)?0:-1}const Do=e=>e[0]==="_"||e==="$stable",Us=e=>U(e)?e.map(Ae):[Ae(e)],sc=(e,t,n)=>{if(t._n)return t;const s=xl((...r)=>Us(t(...r)),n);return s._c=!1,s},Bo=(e,t,n)=>{const s=e._ctx;for(const r in e){if(Do(r))continue;const o=e[r];if(q(o))t[r]=sc(r,o,s);else if(o!=null){const i=Us(o);t[r]=()=>i}}},Uo=(e,t)=>{const n=Us(t);e.slots.default=()=>n},rc=(e,t)=>{if(e.vnode.shapeFlag&32){const n=t._;n?(e.slots=J(t),yn(t,"_",n)):Bo(t,e.slots={})}else e.slots={},t&&Uo(e,t);yn(e.slots,Dn,1)},oc=(e,t,n)=>{const{vnode:s,slots:r}=e;let o=!0,i=ee;if(s.shapeFlag&32){const l=t._;l?n&&l===1?o=!1:(ie(r,t),!n&&l===1&&delete r._):(o=!t.$stable,Bo(t,r)),i=t}else t&&(Uo(e,t),i={default:1});if(o)for(const l in r)!Do(l)&&i[l]==null&&delete r[l]};function Tn(e,t,n,s,r=!1){if(U(e)){e.forEach((m,_)=>Tn(m,t&&(U(t)?t[_]:t),n,s,r));return}if(at(s)&&!r)return;const o=s.shapeFlag&4?Un(s.component)||s.component.proxy:s.el,i=r?null:o,{i:l,r:c}=e,u=t&&t.r,f=l.refs===ee?l.refs={}:l.refs,p=l.setupState;if(u!=null&&u!==c&&(ne(u)?(f[u]=null,Y(p,u)&&(p[u]=null)):he(u)&&(u.value=null)),q(c))Je(c,l,12,[i,f]);else{const m=ne(c),_=he(c),O=e.f;if(m||_){const I=()=>{if(O){const H=m?Y(p,c)?p[c]:f[c]:c.value;r?U(H)&&Ss(H,o):U(H)?H.includes(o)||H.push(o):m?(f[c]=[o],Y(p,c)&&(p[c]=f[c])):(c.value=[o],e.k&&(f[e.k]=c.value))}else m?(f[c]=i,Y(p,c)&&(p[c]=i)):_&&(c.value=i,e.k&&(f[e.k]=i))};r||O?I():(I.id=-1,ae(I,n))}}}let Be=!1;const ic=e=>e.namespaceURI.includes("svg")&&e.tagName!=="foreignObject",lc=e=>e.namespaceURI.includes("MathML"),ln=e=>{if(ic(e))return"svg";if(lc(e))return"mathml"},cn=e=>e.nodeType===8;function cc(e){const{mt:t,p:n,o:{patchProp:s,createText:r,nextSibling:o,parentNode:i,remove:l,insert:c,createComment:u}}=e,f=(h,g)=>{if(!g.hasChildNodes()){n(null,h,g),vn(),g._vnode=h;return}Be=!1,p(g.firstChild,h,null,null,null),vn(),g._vnode=h,Be&&console.error("Hydration completed but contains mismatches.")},p=(h,g,R,C,N,x=!1)=>{const S=cn(h)&&h.data==="[",E=()=>I(h,g,R,C,N,S),{type:B,ref:F,shapeFlag:G,patchFlag:re}=g;let ce=h.nodeType;g.el=h,re===-2&&(x=!1,g.dynamicChildren=null);let k=null;switch(B){case xt:ce!==3?g.children===""?(c(g.el=r(""),i(h),h),k=h):k=E():(h.data!==g.children&&(Be=!0,h.data=g.children),k=o(h));break;case we:M(h)?(k=o(h),K(g.el=h.content.firstChild,h,R)):ce!==8||S?k=E():k=o(h);break;case Ht:if(S&&(h=o(h),ce=h.nodeType),ce===1||ce===3){k=h;const X=!g.children.length;for(let V=0;V{x=x||!!g.dynamicChildren;const{type:S,props:E,patchFlag:B,shapeFlag:F,dirs:G,transition:re}=g,ce=S==="input"||S==="option";if(ce||B!==-1){G&&Me(g,null,R,"created");let k=!1;if(M(h)){k=Wo(C,re)&&R&&R.vnode.props&&R.vnode.props.appear;const V=h.content.firstChild;k&&re.beforeEnter(V),K(V,h,R),g.el=h=V}if(F&16&&!(E&&(E.innerHTML||E.textContent))){let V=_(h.firstChild,g,h,R,C,N,x);for(;V;){Be=!0;const Fe=V;V=V.nextSibling,l(Fe)}}else F&8&&h.textContent!==g.children&&(Be=!0,h.textContent=g.children);if(E)if(ce||!x||B&48)for(const V in E)(ce&&(V.endsWith("value")||V==="indeterminate")||Gt(V)&&!Mt(V)||V[0]===".")&&s(h,V,null,E[V],void 0,void 0,R);else E.onClick&&s(h,"onClick",null,E.onClick,void 0,void 0,R);let X;(X=E&&E.onVnodeBeforeMount)&&ge(X,R,g),G&&Me(g,null,R,"beforeMount"),((X=E&&E.onVnodeMounted)||G||k)&&Ao(()=>{X&&ge(X,R,g),k&&re.enter(h),G&&Me(g,null,R,"mounted")},C)}return h.nextSibling},_=(h,g,R,C,N,x,S)=>{S=S||!!g.dynamicChildren;const E=g.children,B=E.length;for(let F=0;F{const{slotScopeIds:S}=g;S&&(N=N?N.concat(S):S);const E=i(h),B=_(o(h),g,E,R,C,N,x);return B&&cn(B)&&B.data==="]"?o(g.anchor=B):(Be=!0,c(g.anchor=u("]"),E,B),B)},I=(h,g,R,C,N,x)=>{if(Be=!0,g.el=null,x){const B=H(h);for(;;){const F=o(h);if(F&&F!==B)l(F);else break}}const S=o(h),E=i(h);return l(h),n(null,g,E,S,R,C,ln(E),N),S},H=(h,g="[",R="]")=>{let C=0;for(;h;)if(h=o(h),h&&cn(h)&&(h.data===g&&C++,h.data===R)){if(C===0)return o(h);C--}return h},K=(h,g,R)=>{const C=g.parentNode;C&&C.replaceChild(h,g);let N=R;for(;N;)N.vnode.el===g&&(N.vnode.el=N.subTree.el=h),N=N.parent},M=h=>h.nodeType===1&&h.tagName.toLowerCase()==="template";return[f,p]}const ae=Ao;function ac(e){return Ko(e)}function uc(e){return Ko(e,cc)}function Ko(e,t){const n=Jr();n.__VUE__=!0;const{insert:s,remove:r,patchProp:o,createElement:i,createText:l,createComment:c,setText:u,setElementText:f,parentNode:p,nextSibling:m,setScopeId:_=xe,insertStaticContent:O}=e,I=(a,d,y,b=null,v=null,A=null,P=void 0,T=null,L=!!d.dynamicChildren)=>{if(a===d)return;a&&!Xe(a,d)&&(b=Qt(a),Le(a,v,A,!0),a=null),d.patchFlag===-2&&(L=!1,d.dynamicChildren=null);const{type:w,ref:$,shapeFlag:D}=d;switch(w){case xt:H(a,d,y,b);break;case we:K(a,d,y,b);break;case Ht:a==null&&M(d,y,b,P);break;case me:F(a,d,y,b,v,A,P,T,L);break;default:D&1?R(a,d,y,b,v,A,P,T,L):D&6?G(a,d,y,b,v,A,P,T,L):(D&64||D&128)&&w.process(a,d,y,b,v,A,P,T,L,gt)}$!=null&&v&&Tn($,a&&a.ref,A,d||a,!d)},H=(a,d,y,b)=>{if(a==null)s(d.el=l(d.children),y,b);else{const v=d.el=a.el;d.children!==a.children&&u(v,d.children)}},K=(a,d,y,b)=>{a==null?s(d.el=c(d.children||""),y,b):d.el=a.el},M=(a,d,y,b)=>{[a.el,a.anchor]=O(a.children,d,y,b,a.el,a.anchor)},h=({el:a,anchor:d},y,b)=>{let v;for(;a&&a!==d;)v=m(a),s(a,y,b),a=v;s(d,y,b)},g=({el:a,anchor:d})=>{let y;for(;a&&a!==d;)y=m(a),r(a),a=y;r(d)},R=(a,d,y,b,v,A,P,T,L)=>{d.type==="svg"?P="svg":d.type==="math"&&(P="mathml"),a==null?C(d,y,b,v,A,P,T,L):S(a,d,v,A,P,T,L)},C=(a,d,y,b,v,A,P,T)=>{let L,w;const{props:$,shapeFlag:D,transition:j,dirs:W}=a;if(L=a.el=i(a.type,A,$&&$.is,$),D&8?f(L,a.children):D&16&&x(a.children,L,null,b,v,Zn(a,A),P,T),W&&Me(a,null,b,"created"),N(L,a,a.scopeId,P,b),$){for(const Q in $)Q!=="value"&&!Mt(Q)&&o(L,Q,null,$[Q],A,a.children,b,v,Ne);"value"in $&&o(L,"value",null,$.value,A),(w=$.onVnodeBeforeMount)&&ge(w,b,a)}W&&Me(a,null,b,"beforeMount");const z=Wo(v,j);z&&j.beforeEnter(L),s(L,d,y),((w=$&&$.onVnodeMounted)||z||W)&&ae(()=>{w&&ge(w,b,a),z&&j.enter(L),W&&Me(a,null,b,"mounted")},v)},N=(a,d,y,b,v)=>{if(y&&_(a,y),b)for(let A=0;A{for(let w=L;w{const T=d.el=a.el;let{patchFlag:L,dynamicChildren:w,dirs:$}=d;L|=a.patchFlag&16;const D=a.props||ee,j=d.props||ee;let W;if(y&&nt(y,!1),(W=j.onVnodeBeforeUpdate)&&ge(W,y,d,a),$&&Me(d,a,y,"beforeUpdate"),y&&nt(y,!0),w?E(a.dynamicChildren,w,T,y,b,Zn(d,v),A):P||V(a,d,T,null,y,b,Zn(d,v),A,!1),L>0){if(L&16)B(T,d,D,j,y,b,v);else if(L&2&&D.class!==j.class&&o(T,"class",null,j.class,v),L&4&&o(T,"style",D.style,j.style,v),L&8){const z=d.dynamicProps;for(let Q=0;Q{W&&ge(W,y,d,a),$&&Me(d,a,y,"updated")},b)},E=(a,d,y,b,v,A,P)=>{for(let T=0;T{if(y!==b){if(y!==ee)for(const T in y)!Mt(T)&&!(T in b)&&o(a,T,y[T],null,P,d.children,v,A,Ne);for(const T in b){if(Mt(T))continue;const L=b[T],w=y[T];L!==w&&T!=="value"&&o(a,T,w,L,P,d.children,v,A,Ne)}"value"in b&&o(a,"value",y.value,b.value,P)}},F=(a,d,y,b,v,A,P,T,L)=>{const w=d.el=a?a.el:l(""),$=d.anchor=a?a.anchor:l("");let{patchFlag:D,dynamicChildren:j,slotScopeIds:W}=d;W&&(T=T?T.concat(W):W),a==null?(s(w,y,b),s($,y,b),x(d.children||[],y,$,v,A,P,T,L)):D>0&&D&64&&j&&a.dynamicChildren?(E(a.dynamicChildren,j,y,v,A,P,T),(d.key!=null||v&&d===v.subTree)&&Ks(a,d,!0)):V(a,d,y,$,v,A,P,T,L)},G=(a,d,y,b,v,A,P,T,L)=>{d.slotScopeIds=T,a==null?d.shapeFlag&512?v.ctx.activate(d,y,b,P,L):re(d,y,b,v,A,P,L):ce(a,d,L)},re=(a,d,y,b,v,A,P)=>{const T=a.component=wc(a,b,v);if(jn(a)&&(T.ctx.renderer=gt),Ec(T),T.asyncDep){if(v&&v.registerDep(T,k),!a.el){const L=T.subTree=fe(we);K(null,L,d,y)}}else k(T,a,d,y,v,A,P)},ce=(a,d,y)=>{const b=d.component=a.component;if(Al(a,d,y))if(b.asyncDep&&!b.asyncResolved){X(b,d,y);return}else b.next=d,vl(b.update),b.effect.dirty=!0,b.update();else d.el=a.el,b.vnode=d},k=(a,d,y,b,v,A,P)=>{const T=()=>{if(a.isMounted){let{next:$,bu:D,u:j,parent:W,vnode:z}=a;{const mt=qo(a);if(mt){$&&($.el=z.el,X(a,$,P)),mt.asyncDep.then(()=>{a.isUnmounted||T()});return}}let Q=$,te;nt(a,!1),$?($.el=z.el,X(a,$,P)):$=z,D&&It(D),(te=$.props&&$.props.onVnodeBeforeUpdate)&&ge(te,W,$,z),nt(a,!0);const le=zn(a),Se=a.subTree;a.subTree=le,I(Se,le,p(Se.el),Qt(Se),a,v,A),$.el=le.el,Q===null&&Rl(a,le.el),j&&ae(j,v),(te=$.props&&$.props.onVnodeUpdated)&&ae(()=>ge(te,W,$,z),v)}else{let $;const{el:D,props:j}=d,{bm:W,m:z,parent:Q}=a,te=at(d);if(nt(a,!1),W&&It(W),!te&&($=j&&j.onVnodeBeforeMount)&&ge($,Q,d),nt(a,!0),D&&qn){const le=()=>{a.subTree=zn(a),qn(D,a.subTree,a,v,null)};te?d.type.__asyncLoader().then(()=>!a.isUnmounted&&le()):le()}else{const le=a.subTree=zn(a);I(null,le,y,b,a,v,A),d.el=le.el}if(z&&ae(z,v),!te&&($=j&&j.onVnodeMounted)){const le=d;ae(()=>ge($,Q,le),v)}(d.shapeFlag&256||Q&&at(Q.vnode)&&Q.vnode.shapeFlag&256)&&a.a&&ae(a.a,v),a.isMounted=!0,d=y=b=null}},L=a.effect=new Os(T,xe,()=>Vs(w),a.scope),w=a.update=()=>{L.dirty&&L.run()};w.id=a.uid,nt(a,!0),w()},X=(a,d,y)=>{d.component=a;const b=a.vnode.props;a.vnode=d,a.next=null,nc(a,d.props,b,y),oc(a,d.children,y),dt(),lr(a),ht()},V=(a,d,y,b,v,A,P,T,L=!1)=>{const w=a&&a.children,$=a?a.shapeFlag:0,D=d.children,{patchFlag:j,shapeFlag:W}=d;if(j>0){if(j&128){Jt(w,D,y,b,v,A,P,T,L);return}else if(j&256){Fe(w,D,y,b,v,A,P,T,L);return}}W&8?($&16&&Ne(w,v,A),D!==w&&f(y,D)):$&16?W&16?Jt(w,D,y,b,v,A,P,T,L):Ne(w,v,A,!0):($&8&&f(y,""),W&16&&x(D,y,b,v,A,P,T,L))},Fe=(a,d,y,b,v,A,P,T,L)=>{a=a||_t,d=d||_t;const w=a.length,$=d.length,D=Math.min(w,$);let j;for(j=0;j$?Ne(a,v,A,!0,!1,D):x(d,y,b,v,A,P,T,L,D)},Jt=(a,d,y,b,v,A,P,T,L)=>{let w=0;const $=d.length;let D=a.length-1,j=$-1;for(;w<=D&&w<=j;){const W=a[w],z=d[w]=L?Ge(d[w]):Ae(d[w]);if(Xe(W,z))I(W,z,y,null,v,A,P,T,L);else break;w++}for(;w<=D&&w<=j;){const W=a[D],z=d[j]=L?Ge(d[j]):Ae(d[j]);if(Xe(W,z))I(W,z,y,null,v,A,P,T,L);else break;D--,j--}if(w>D){if(w<=j){const W=j+1,z=W<$?d[W].el:b;for(;w<=j;)I(null,d[w]=L?Ge(d[w]):Ae(d[w]),y,z,v,A,P,T,L),w++}}else if(w>j)for(;w<=D;)Le(a[w],v,A,!0),w++;else{const W=w,z=w,Q=new Map;for(w=z;w<=j;w++){const be=d[w]=L?Ge(d[w]):Ae(d[w]);be.key!=null&&Q.set(be.key,w)}let te,le=0;const Se=j-z+1;let mt=!1,Ys=0;const St=new Array(Se);for(w=0;w=Se){Le(be,v,A,!0);continue}let Oe;if(be.key!=null)Oe=Q.get(be.key);else for(te=z;te<=j;te++)if(St[te-z]===0&&Xe(be,d[te])){Oe=te;break}Oe===void 0?Le(be,v,A,!0):(St[Oe-z]=w+1,Oe>=Ys?Ys=Oe:mt=!0,I(be,d[Oe],y,null,v,A,P,T,L),le++)}const Js=mt?fc(St):_t;for(te=Js.length-1,w=Se-1;w>=0;w--){const be=z+w,Oe=d[be],Qs=be+1<$?d[be+1].el:b;St[w]===0?I(null,Oe,y,Qs,v,A,P,T,L):mt&&(te<0||w!==Js[te]?tt(Oe,y,Qs,2):te--)}}},tt=(a,d,y,b,v=null)=>{const{el:A,type:P,transition:T,children:L,shapeFlag:w}=a;if(w&6){tt(a.component.subTree,d,y,b);return}if(w&128){a.suspense.move(d,y,b);return}if(w&64){P.move(a,d,y,gt);return}if(P===me){s(A,d,y);for(let D=0;DT.enter(A),v);else{const{leave:D,delayLeave:j,afterLeave:W}=T,z=()=>s(A,d,y),Q=()=>{D(A,()=>{z(),W&&W()})};j?j(A,z,Q):Q()}else s(A,d,y)},Le=(a,d,y,b=!1,v=!1)=>{const{type:A,props:P,ref:T,children:L,dynamicChildren:w,shapeFlag:$,patchFlag:D,dirs:j}=a;if(T!=null&&Tn(T,null,y,a,!0),$&256){d.ctx.deactivate(a);return}const W=$&1&&j,z=!at(a);let Q;if(z&&(Q=P&&P.onVnodeBeforeUnmount)&&ge(Q,d,a),$&6)xi(a.component,y,b);else{if($&128){a.suspense.unmount(y,b);return}W&&Me(a,null,d,"beforeUnmount"),$&64?a.type.remove(a,d,y,v,gt,b):w&&(A!==me||D>0&&D&64)?Ne(w,d,y,!1,!0):(A===me&&D&384||!v&&$&16)&&Ne(L,d,y),b&&zs(a)}(z&&(Q=P&&P.onVnodeUnmounted)||W)&&ae(()=>{Q&&ge(Q,d,a),W&&Me(a,null,d,"unmounted")},y)},zs=a=>{const{type:d,el:y,anchor:b,transition:v}=a;if(d===me){Ci(y,b);return}if(d===Ht){g(a);return}const A=()=>{r(y),v&&!v.persisted&&v.afterLeave&&v.afterLeave()};if(a.shapeFlag&1&&v&&!v.persisted){const{leave:P,delayLeave:T}=v,L=()=>P(y,A);T?T(a.el,A,L):L()}else A()},Ci=(a,d)=>{let y;for(;a!==d;)y=m(a),r(a),a=y;r(d)},xi=(a,d,y)=>{const{bum:b,scope:v,update:A,subTree:P,um:T}=a;b&&It(b),v.stop(),A&&(A.active=!1,Le(P,a,d,y)),T&&ae(T,d),ae(()=>{a.isUnmounted=!0},d),d&&d.pendingBranch&&!d.isUnmounted&&a.asyncDep&&!a.asyncResolved&&a.suspenseId===d.pendingId&&(d.deps--,d.deps===0&&d.resolve())},Ne=(a,d,y,b=!1,v=!1,A=0)=>{for(let P=A;Pa.shapeFlag&6?Qt(a.component.subTree):a.shapeFlag&128?a.suspense.next():m(a.anchor||a.el);let Kn=!1;const Xs=(a,d,y)=>{a==null?d._vnode&&Le(d._vnode,null,null,!0):I(d._vnode||null,a,d,null,null,null,y),Kn||(Kn=!0,lr(),vn(),Kn=!1),d._vnode=a},gt={p:I,um:Le,m:tt,r:zs,mt:re,mc:x,pc:V,pbc:E,n:Qt,o:e};let Wn,qn;return t&&([Wn,qn]=t(gt)),{render:Xs,hydrate:Wn,createApp:Zl(Xs,Wn)}}function Zn({type:e,props:t},n){return n==="svg"&&e==="foreignObject"||n==="mathml"&&e==="annotation-xml"&&t&&t.encoding&&t.encoding.includes("html")?void 0:n}function nt({effect:e,update:t},n){e.allowRecurse=t.allowRecurse=n}function Wo(e,t){return(!e||e&&!e.pendingBranch)&&t&&!t.persisted}function Ks(e,t,n=!1){const s=e.children,r=t.children;if(U(s)&&U(r))for(let o=0;o>1,e[n[l]]0&&(t[s]=n[o-1]),n[o]=s)}}for(o=n.length,i=n[o-1];o-- >0;)n[o]=i,i=t[i];return n}function qo(e){const t=e.subTree.component;if(t)return t.asyncDep&&!t.asyncResolved?t:qo(t)}const dc=e=>e.__isTeleport,$t=e=>e&&(e.disabled||e.disabled===""),br=e=>typeof SVGElement<"u"&&e instanceof SVGElement,vr=e=>typeof MathMLElement=="function"&&e instanceof MathMLElement,_s=(e,t)=>{const n=e&&e.to;return ne(n)?t?t(n):null:n},hc={name:"Teleport",__isTeleport:!0,process(e,t,n,s,r,o,i,l,c,u){const{mc:f,pc:p,pbc:m,o:{insert:_,querySelector:O,createText:I,createComment:H}}=u,K=$t(t.props);let{shapeFlag:M,children:h,dynamicChildren:g}=t;if(e==null){const R=t.el=I(""),C=t.anchor=I("");_(R,n,s),_(C,n,s);const N=t.target=_s(t.props,O),x=t.targetAnchor=I("");N&&(_(x,N),i==="svg"||br(N)?i="svg":(i==="mathml"||vr(N))&&(i="mathml"));const S=(E,B)=>{M&16&&f(h,E,B,r,o,i,l,c)};K?S(n,C):N&&S(N,x)}else{t.el=e.el;const R=t.anchor=e.anchor,C=t.target=e.target,N=t.targetAnchor=e.targetAnchor,x=$t(e.props),S=x?n:C,E=x?R:N;if(i==="svg"||br(C)?i="svg":(i==="mathml"||vr(C))&&(i="mathml"),g?(m(e.dynamicChildren,g,S,r,o,i,l),Ks(e,t,!0)):c||p(e,t,S,E,r,o,i,l,!1),K)x?t.props&&e.props&&t.props.to!==e.props.to&&(t.props.to=e.props.to):an(t,n,R,u,1);else if((t.props&&t.props.to)!==(e.props&&e.props.to)){const B=t.target=_s(t.props,O);B&&an(t,B,null,u,0)}else x&&an(t,C,N,u,1)}Go(t)},remove(e,t,n,s,{um:r,o:{remove:o}},i){const{shapeFlag:l,children:c,anchor:u,targetAnchor:f,target:p,props:m}=e;if(p&&o(f),i&&o(u),l&16){const _=i||!$t(m);for(let O=0;O0?Re||_t:null,gc(),Kt>0&&Re&&Re.push(e),e}function uu(e,t,n,s,r,o){return Xo(Qo(e,t,n,s,r,o,!0))}function Yo(e,t,n,s,r){return Xo(fe(e,t,n,s,r,!0))}function Wt(e){return e?e.__v_isVNode===!0:!1}function Xe(e,t){return e.type===t.type&&e.key===t.key}const Dn="__vInternal",Jo=({key:e})=>e??null,gn=({ref:e,ref_key:t,ref_for:n})=>(typeof e=="number"&&(e=""+e),e!=null?ne(e)||he(e)||q(e)?{i:oe,r:e,k:t,f:!!n}:e:null);function Qo(e,t=null,n=null,s=0,r=null,o=e===me?0:1,i=!1,l=!1){const c={__v_isVNode:!0,__v_skip:!0,type:e,props:t,key:t&&Jo(t),ref:t&&gn(t),scopeId:$n,slotScopeIds:null,children:n,component:null,suspense:null,ssContent:null,ssFallback:null,dirs:null,transition:null,el:null,anchor:null,target:null,targetAnchor:null,staticCount:0,shapeFlag:o,patchFlag:s,dynamicProps:r,dynamicChildren:null,appContext:null,ctx:oe};return l?(Ws(c,n),o&128&&e.normalize(c)):n&&(c.shapeFlag|=ne(n)?8:16),Kt>0&&!i&&Re&&(c.patchFlag>0||o&6)&&c.patchFlag!==32&&Re.push(c),c}const fe=mc;function mc(e,t=null,n=null,s=0,r=null,o=!1){if((!e||e===xo)&&(e=we),Wt(e)){const l=je(e,t,!0);return n&&Ws(l,n),Kt>0&&!o&&Re&&(l.shapeFlag&6?Re[Re.indexOf(e)]=l:Re.push(l)),l.patchFlag|=-2,l}if(Tc(e)&&(e=e.__vccOpts),t){t=yc(t);let{class:l,style:c}=t;l&&!ne(l)&&(t.class=Ls(l)),Z(c)&&(po(c)&&!U(c)&&(c=ie({},c)),t.style=Rs(c))}const i=ne(e)?1:So(e)?128:dc(e)?64:Z(e)?4:q(e)?2:0;return Qo(e,t,n,s,r,i,o,!0)}function yc(e){return e?po(e)||Dn in e?ie({},e):e:null}function je(e,t,n=!1){const{props:s,ref:r,patchFlag:o,children:i}=e,l=t?_c(s||{},t):s;return{__v_isVNode:!0,__v_skip:!0,type:e.type,props:l,key:l&&Jo(l),ref:t&&t.ref?n&&r?U(r)?r.concat(gn(t)):[r,gn(t)]:gn(t):r,scopeId:e.scopeId,slotScopeIds:e.slotScopeIds,children:i,target:e.target,targetAnchor:e.targetAnchor,staticCount:e.staticCount,shapeFlag:e.shapeFlag,patchFlag:t&&e.type!==me?o===-1?16:o|16:o,dynamicProps:e.dynamicProps,dynamicChildren:e.dynamicChildren,appContext:e.appContext,dirs:e.dirs,transition:e.transition,component:e.component,suspense:e.suspense,ssContent:e.ssContent&&je(e.ssContent),ssFallback:e.ssFallback&&je(e.ssFallback),el:e.el,anchor:e.anchor,ctx:e.ctx,ce:e.ce}}function Zo(e=" ",t=0){return fe(xt,null,e,t)}function fu(e,t){const n=fe(Ht,null,e);return n.staticCount=t,n}function du(e="",t=!1){return t?(zo(),Yo(we,null,e)):fe(we,null,e)}function Ae(e){return e==null||typeof e=="boolean"?fe(we):U(e)?fe(me,null,e.slice()):typeof e=="object"?Ge(e):fe(xt,null,String(e))}function Ge(e){return e.el===null&&e.patchFlag!==-1||e.memo?e:je(e)}function Ws(e,t){let n=0;const{shapeFlag:s}=e;if(t==null)t=null;else if(U(t))n=16;else if(typeof t=="object")if(s&65){const r=t.default;r&&(r._c&&(r._d=!1),Ws(e,r()),r._c&&(r._d=!0));return}else{n=32;const r=t._;!r&&!(Dn in t)?t._ctx=oe:r===3&&oe&&(oe.slots._===1?t._=1:(t._=2,e.patchFlag|=1024))}else q(t)?(t={default:t,_ctx:oe},n=32):(t=String(t),s&64?(n=16,t=[Zo(t)]):n=8);e.children=t,e.shapeFlag|=n}function _c(...e){const t={};for(let n=0;nue||oe;let Sn,bs;{const e=Jr(),t=(n,s)=>{let r;return(r=e[n])||(r=e[n]=[]),r.push(s),o=>{r.length>1?r.forEach(i=>i(o)):r[0](o)}};Sn=t("__VUE_INSTANCE_SETTERS__",n=>ue=n),bs=t("__VUE_SSR_SETTERS__",n=>Bn=n)}const Yt=e=>{const t=ue;return Sn(e),e.scope.on(),()=>{e.scope.off(),Sn(t)}},Er=()=>{ue&&ue.scope.off(),Sn(null)};function ei(e){return e.vnode.shapeFlag&4}let Bn=!1;function Ec(e,t=!1){t&&bs(t);const{props:n,children:s}=e.vnode,r=ei(e);tc(e,n,r,t),rc(e,s);const o=r?Cc(e,t):void 0;return t&&bs(!1),o}function Cc(e,t){const n=e.type;e.accessCache=Object.create(null),e.proxy=Pt(new Proxy(e.ctx,Wl));const{setup:s}=n;if(s){const r=e.setupContext=s.length>1?ni(e):null,o=Yt(e);dt();const i=Je(s,e,0,[e.props,r]);if(ht(),o(),zr(i)){if(i.then(Er,Er),t)return i.then(l=>{Cr(e,l,t)}).catch(l=>{Pn(l,e,0)});e.asyncDep=i}else Cr(e,i,t)}else ti(e,t)}function Cr(e,t,n){q(t)?e.type.__ssrInlineRender?e.ssrRender=t:e.render=t:Z(t)&&(e.setupState=bo(t)),ti(e,n)}let xr;function ti(e,t,n){const s=e.type;if(!e.render){if(!t&&xr&&!s.render){const r=s.template||Bs(e).template;if(r){const{isCustomElement:o,compilerOptions:i}=e.appContext.config,{delimiters:l,compilerOptions:c}=s,u=ie(ie({isCustomElement:o,delimiters:l},i),c);s.render=xr(r,u)}}e.render=s.render||xe}{const r=Yt(e);dt();try{Gl(e)}finally{ht(),r()}}}function xc(e){return e.attrsProxy||(e.attrsProxy=new Proxy(e.attrs,{get(t,n){return _e(e,"get","$attrs"),t[n]}}))}function ni(e){const t=n=>{e.exposed=n||{}};return{get attrs(){return xc(e)},slots:e.slots,emit:e.emit,expose:t}}function Un(e){if(e.exposed)return e.exposeProxy||(e.exposeProxy=new Proxy(bo(Pt(e.exposed)),{get(t,n){if(n in t)return t[n];if(n in Nt)return Nt[n](e)},has(t,n){return n in t||n in Nt}}))}function vs(e,t=!0){return q(e)?e.displayName||e.name:e.name||t&&e.__name}function Tc(e){return q(e)&&"__vccOpts"in e}const se=(e,t)=>al(e,t,Bn);function ws(e,t,n){const s=arguments.length;return s===2?Z(t)&&!U(t)?Wt(t)?fe(e,null,[t]):fe(e,t):fe(e,null,t):(s>3?n=Array.prototype.slice.call(arguments,2):s===3&&Wt(n)&&(n=[n]),fe(e,t,n))}const Sc="3.4.15";/** +* @vue/runtime-dom v3.4.15 +* (c) 2018-present Yuxi (Evan) You and Vue contributors +* @license MIT +**/const Ac="http://www.w3.org/2000/svg",Rc="http://www.w3.org/1998/Math/MathML",ze=typeof document<"u"?document:null,Tr=ze&&ze.createElement("template"),Lc={insert:(e,t,n)=>{t.insertBefore(e,n||null)},remove:e=>{const t=e.parentNode;t&&t.removeChild(e)},createElement:(e,t,n,s)=>{const r=t==="svg"?ze.createElementNS(Ac,e):t==="mathml"?ze.createElementNS(Rc,e):ze.createElement(e,n?{is:n}:void 0);return e==="select"&&s&&s.multiple!=null&&r.setAttribute("multiple",s.multiple),r},createText:e=>ze.createTextNode(e),createComment:e=>ze.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>ze.querySelector(e),setScopeId(e,t){e.setAttribute(t,"")},insertStaticContent(e,t,n,s,r,o){const i=n?n.previousSibling:t.lastChild;if(r&&(r===o||r.nextSibling))for(;t.insertBefore(r.cloneNode(!0),n),!(r===o||!(r=r.nextSibling)););else{Tr.innerHTML=s==="svg"?`${e}`:s==="mathml"?`${e}`:e;const l=Tr.content;if(s==="svg"||s==="mathml"){const c=l.firstChild;for(;c.firstChild;)l.appendChild(c.firstChild);l.removeChild(c)}t.insertBefore(l,n)}return[i?i.nextSibling:t.firstChild,n?n.previousSibling:t.lastChild]}},Ue="transition",At="animation",qt=Symbol("_vtc"),si=(e,{slots:t})=>ws(Fl,Oc(e),t);si.displayName="Transition";const ri={name:String,type:String,css:{type:Boolean,default:!0},duration:[String,Number,Object],enterFromClass:String,enterActiveClass:String,enterToClass:String,appearFromClass:String,appearActiveClass:String,appearToClass:String,leaveFromClass:String,leaveActiveClass:String,leaveToClass:String};si.props=ie({},Oo,ri);const st=(e,t=[])=>{U(e)?e.forEach(n=>n(...t)):e&&e(...t)},Sr=e=>e?U(e)?e.some(t=>t.length>1):e.length>1:!1;function Oc(e){const t={};for(const F in e)F in ri||(t[F]=e[F]);if(e.css===!1)return t;const{name:n="v",type:s,duration:r,enterFromClass:o=`${n}-enter-from`,enterActiveClass:i=`${n}-enter-active`,enterToClass:l=`${n}-enter-to`,appearFromClass:c=o,appearActiveClass:u=i,appearToClass:f=l,leaveFromClass:p=`${n}-leave-from`,leaveActiveClass:m=`${n}-leave-active`,leaveToClass:_=`${n}-leave-to`}=e,O=Mc(r),I=O&&O[0],H=O&&O[1],{onBeforeEnter:K,onEnter:M,onEnterCancelled:h,onLeave:g,onLeaveCancelled:R,onBeforeAppear:C=K,onAppear:N=M,onAppearCancelled:x=h}=t,S=(F,G,re)=>{rt(F,G?f:l),rt(F,G?u:i),re&&re()},E=(F,G)=>{F._isLeaving=!1,rt(F,p),rt(F,_),rt(F,m),G&&G()},B=F=>(G,re)=>{const ce=F?N:M,k=()=>S(G,F,re);st(ce,[G,k]),Ar(()=>{rt(G,F?c:o),Ke(G,F?f:l),Sr(ce)||Rr(G,s,I,k)})};return ie(t,{onBeforeEnter(F){st(K,[F]),Ke(F,o),Ke(F,i)},onBeforeAppear(F){st(C,[F]),Ke(F,c),Ke(F,u)},onEnter:B(!1),onAppear:B(!0),onLeave(F,G){F._isLeaving=!0;const re=()=>E(F,G);Ke(F,p),Fc(),Ke(F,m),Ar(()=>{F._isLeaving&&(rt(F,p),Ke(F,_),Sr(g)||Rr(F,s,H,re))}),st(g,[F,re])},onEnterCancelled(F){S(F,!1),st(h,[F])},onAppearCancelled(F){S(F,!0),st(x,[F])},onLeaveCancelled(F){E(F),st(R,[F])}})}function Mc(e){if(e==null)return null;if(Z(e))return[es(e.enter),es(e.leave)];{const t=es(e);return[t,t]}}function es(e){return Ii(e)}function Ke(e,t){t.split(/\s+/).forEach(n=>n&&e.classList.add(n)),(e[qt]||(e[qt]=new Set)).add(t)}function rt(e,t){t.split(/\s+/).forEach(s=>s&&e.classList.remove(s));const n=e[qt];n&&(n.delete(t),n.size||(e[qt]=void 0))}function Ar(e){requestAnimationFrame(()=>{requestAnimationFrame(e)})}let Ic=0;function Rr(e,t,n,s){const r=e._endId=++Ic,o=()=>{r===e._endId&&s()};if(n)return setTimeout(o,n);const{type:i,timeout:l,propCount:c}=Pc(e,t);if(!i)return s();const u=i+"end";let f=0;const p=()=>{e.removeEventListener(u,m),o()},m=_=>{_.target===e&&++f>=c&&p()};setTimeout(()=>{f(n[O]||"").split(", "),r=s(`${Ue}Delay`),o=s(`${Ue}Duration`),i=Lr(r,o),l=s(`${At}Delay`),c=s(`${At}Duration`),u=Lr(l,c);let f=null,p=0,m=0;t===Ue?i>0&&(f=Ue,p=i,m=o.length):t===At?u>0&&(f=At,p=u,m=c.length):(p=Math.max(i,u),f=p>0?i>u?Ue:At:null,m=f?f===Ue?o.length:c.length:0);const _=f===Ue&&/\b(transform|all)(,|$)/.test(s(`${Ue}Property`).toString());return{type:f,timeout:p,propCount:m,hasTransform:_}}function Lr(e,t){for(;e.lengthOr(n)+Or(e[s])))}function Or(e){return e==="auto"?0:Number(e.slice(0,-1).replace(",","."))*1e3}function Fc(){return document.body.offsetHeight}function Nc(e,t,n){const s=e[qt];s&&(t=(t?[t,...s]:[...s]).join(" ")),t==null?e.removeAttribute("class"):n?e.setAttribute("class",t):e.className=t}const qs=Symbol("_vod"),hu={beforeMount(e,{value:t},{transition:n}){e[qs]=e.style.display==="none"?"":e.style.display,n&&t?n.beforeEnter(e):Rt(e,t)},mounted(e,{value:t},{transition:n}){n&&t&&n.enter(e)},updated(e,{value:t,oldValue:n},{transition:s}){!t!=!n&&(s?t?(s.beforeEnter(e),Rt(e,!0),s.enter(e)):s.leave(e,()=>{Rt(e,!1)}):Rt(e,t))},beforeUnmount(e,{value:t}){Rt(e,t)}};function Rt(e,t){e.style.display=t?e[qs]:"none"}const $c=Symbol("");function Hc(e,t,n){const s=e.style,r=s.display,o=ne(n);if(n&&!o){if(t&&!ne(t))for(const i in t)n[i]==null&&Es(s,i,"");for(const i in n)Es(s,i,n[i])}else if(o){if(t!==n){const i=s[$c];i&&(n+=";"+i),s.cssText=n}}else t&&e.removeAttribute("style");qs in e&&(s.display=r)}const Mr=/\s*!important$/;function Es(e,t,n){if(U(n))n.forEach(s=>Es(e,t,s));else if(n==null&&(n=""),t.startsWith("--"))e.setProperty(t,n);else{const s=jc(e,t);Mr.test(n)?e.setProperty(ft(s),n.replace(Mr,""),"important"):e[s]=n}}const Ir=["Webkit","Moz","ms"],ts={};function jc(e,t){const n=ts[t];if(n)return n;let s=Pe(t);if(s!=="filter"&&s in e)return ts[t]=s;s=Ln(s);for(let r=0;rns||(Wc.then(()=>ns=0),ns=Date.now());function Gc(e,t){const n=s=>{if(!s._vts)s._vts=Date.now();else if(s._vts<=n.attached)return;Te(zc(s,n.value),t,5,[s])};return n.value=e,n.attached=qc(),n}function zc(e,t){if(U(t)){const n=e.stopImmediatePropagation;return e.stopImmediatePropagation=()=>{n.call(e),e._stopped=!0},t.map(s=>r=>!r._stopped&&s&&s(r))}else return t}const $r=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&e.charCodeAt(2)>96&&e.charCodeAt(2)<123,Xc=(e,t,n,s,r,o,i,l,c)=>{const u=r==="svg";t==="class"?Nc(e,s,u):t==="style"?Hc(e,n,s):Gt(t)?Ts(t)||Uc(e,t,n,s,i):(t[0]==="."?(t=t.slice(1),!0):t[0]==="^"?(t=t.slice(1),!1):Yc(e,t,s,u))?kc(e,t,s,o,i,l,c):(t==="true-value"?e._trueValue=s:t==="false-value"&&(e._falseValue=s),Vc(e,t,s,u))};function Yc(e,t,n,s){if(s)return!!(t==="innerHTML"||t==="textContent"||t in e&&$r(t)&&q(n));if(t==="spellcheck"||t==="draggable"||t==="translate"||t==="form"||t==="list"&&e.tagName==="INPUT"||t==="type"&&e.tagName==="TEXTAREA")return!1;if(t==="width"||t==="height"){const r=e.tagName;if(r==="IMG"||r==="VIDEO"||r==="CANVAS"||r==="SOURCE")return!1}return $r(t)&&ne(n)?!1:t in e}const Jc=["ctrl","shift","alt","meta"],Qc={stop:e=>e.stopPropagation(),prevent:e=>e.preventDefault(),self:e=>e.target!==e.currentTarget,ctrl:e=>!e.ctrlKey,shift:e=>!e.shiftKey,alt:e=>!e.altKey,meta:e=>!e.metaKey,left:e=>"button"in e&&e.button!==0,middle:e=>"button"in e&&e.button!==1,right:e=>"button"in e&&e.button!==2,exact:(e,t)=>Jc.some(n=>e[`${n}Key`]&&!t.includes(n))},pu=(e,t)=>{const n=e._withMods||(e._withMods={}),s=t.join(".");return n[s]||(n[s]=(r,...o)=>{for(let i=0;i{const n=e._withKeys||(e._withKeys={}),s=t.join(".");return n[s]||(n[s]=r=>{if(!("key"in r))return;const o=ft(r.key);if(t.some(i=>i===o||Zc[i]===o))return e(r)})},oi=ie({patchProp:Xc},Lc);let Vt,Hr=!1;function ea(){return Vt||(Vt=ac(oi))}function ta(){return Vt=Hr?Vt:uc(oi),Hr=!0,Vt}const mu=(...e)=>{const t=ea().createApp(...e),{mount:n}=t;return t.mount=s=>{const r=li(s);if(!r)return;const o=t._component;!q(o)&&!o.render&&!o.template&&(o.template=r.innerHTML),r.innerHTML="";const i=n(r,!1,ii(r));return r instanceof Element&&(r.removeAttribute("v-cloak"),r.setAttribute("data-v-app","")),i},t},yu=(...e)=>{const t=ta().createApp(...e),{mount:n}=t;return t.mount=s=>{const r=li(s);if(r)return n(r,!0,ii(r))},t};function ii(e){if(e instanceof SVGElement)return"svg";if(typeof MathMLElement=="function"&&e instanceof MathMLElement)return"mathml"}function li(e){return ne(e)?document.querySelector(e):e}const _u=(e,t)=>{const n=e.__vccOpts||e;for(const[s,r]of t)n[s]=r;return n},na="modulepreload",sa=function(e){return"/kano/"+e},jr={},bu=function(t,n,s){let r=Promise.resolve();if(n&&n.length>0){const o=document.getElementsByTagName("link");r=Promise.all(n.map(i=>{if(i=sa(i),i in jr)return;jr[i]=!0;const l=i.endsWith(".css"),c=l?'[rel="stylesheet"]':"";if(!!s)for(let p=o.length-1;p>=0;p--){const m=o[p];if(m.href===i&&(!l||m.rel==="stylesheet"))return}else if(document.querySelector(`link[href="${i}"]${c}`))return;const f=document.createElement("link");if(f.rel=l?"stylesheet":na,l||(f.as="script",f.crossOrigin=""),f.href=i,document.head.appendChild(f),l)return new Promise((p,m)=>{f.addEventListener("load",p),f.addEventListener("error",()=>m(new Error(`Unable to preload CSS for ${i}`)))})}))}return r.then(()=>t()).catch(o=>{const i=new Event("vite:preloadError",{cancelable:!0});if(i.payload=o,window.dispatchEvent(i),!i.defaultPrevented)throw o})},ra=window.__VP_SITE_DATA__;function Gs(e){return eo()?(Di(e),!0):!1}function Qe(e){return typeof e=="function"?e():_o(e)}const ci=typeof window<"u"&&typeof document<"u";typeof WorkerGlobalScope<"u"&&globalThis instanceof WorkerGlobalScope;const oa=Object.prototype.toString,ia=e=>oa.call(e)==="[object Object]",kt=()=>{},Cs=la();function la(){var e,t;return ci&&((e=window==null?void 0:window.navigator)==null?void 0:e.userAgent)&&(/iP(ad|hone|od)/.test(window.navigator.userAgent)||((t=window==null?void 0:window.navigator)==null?void 0:t.maxTouchPoints)>2&&/iPad|Macintosh/.test(window==null?void 0:window.navigator.userAgent))}function ca(e,t){function n(...s){return new Promise((r,o)=>{Promise.resolve(e(()=>t.apply(this,s),{fn:t,thisArg:this,args:s})).then(r).catch(o)})}return n}const ai=e=>e();function aa(e=ai){const t=ye(!0);function n(){t.value=!1}function s(){t.value=!0}const r=(...o)=>{t.value&&e(...o)};return{isActive:In(t),pause:n,resume:s,eventFilter:r}}function ua(e){return e||Xt()}function ui(...e){if(e.length!==1)return ml(...e);const t=e[0];return typeof t=="function"?In(hl(()=>({get:t,set:kt}))):ye(t)}function fa(e,t,n={}){const{eventFilter:s=ai,...r}=n;return He(e,ca(s,t),r)}function da(e,t,n={}){const{eventFilter:s,...r}=n,{eventFilter:o,pause:i,resume:l,isActive:c}=aa(s);return{stop:fa(e,t,{...r,eventFilter:o}),pause:i,resume:l,isActive:c}}function fi(e,t=!0,n){ua()?pt(e,n):t?e():Fn(e)}function yt(e){var t;const n=Qe(e);return(t=n==null?void 0:n.$el)!=null?t:n}const Ve=ci?window:void 0;function Ze(...e){let t,n,s,r;if(typeof e[0]=="string"||Array.isArray(e[0])?([n,s,r]=e,t=Ve):[t,n,s,r]=e,!t)return kt;Array.isArray(n)||(n=[n]),Array.isArray(s)||(s=[s]);const o=[],i=()=>{o.forEach(f=>f()),o.length=0},l=(f,p,m,_)=>(f.addEventListener(p,m,_),()=>f.removeEventListener(p,m,_)),c=He(()=>[yt(t),Qe(r)],([f,p])=>{if(i(),!f)return;const m=ia(p)?{...p}:p;o.push(...n.flatMap(_=>s.map(O=>l(f,_,O,m))))},{immediate:!0,flush:"post"}),u=()=>{c(),i()};return Gs(u),u}let Vr=!1;function vu(e,t,n={}){const{window:s=Ve,ignore:r=[],capture:o=!0,detectIframe:i=!1}=n;if(!s)return kt;Cs&&!Vr&&(Vr=!0,Array.from(s.document.body.children).forEach(m=>m.addEventListener("click",kt)),s.document.documentElement.addEventListener("click",kt));let l=!0;const c=m=>r.some(_=>{if(typeof _=="string")return Array.from(s.document.querySelectorAll(_)).some(O=>O===m.target||m.composedPath().includes(O));{const O=yt(_);return O&&(m.target===O||m.composedPath().includes(O))}}),f=[Ze(s,"click",m=>{const _=yt(e);if(!(!_||_===m.target||m.composedPath().includes(_))){if(m.detail===0&&(l=!c(m)),!l){l=!0;return}t(m)}},{passive:!0,capture:o}),Ze(s,"pointerdown",m=>{const _=yt(e);l=!c(m)&&!!(_&&!m.composedPath().includes(_))},{passive:!0}),i&&Ze(s,"blur",m=>{setTimeout(()=>{var _;const O=yt(e);((_=s.document.activeElement)==null?void 0:_.tagName)==="IFRAME"&&!(O!=null&&O.contains(s.document.activeElement))&&t(m)},0)})].filter(Boolean);return()=>f.forEach(m=>m())}function ha(e){return typeof e=="function"?e:typeof e=="string"?t=>t.key===e:Array.isArray(e)?t=>e.includes(t.key):()=>!0}function wu(...e){let t,n,s={};e.length===3?(t=e[0],n=e[1],s=e[2]):e.length===2?typeof e[1]=="object"?(t=!0,n=e[0],s=e[1]):(t=e[0],n=e[1]):(t=!0,n=e[0]);const{target:r=Ve,eventName:o="keydown",passive:i=!1,dedupe:l=!1}=s,c=ha(t);return Ze(r,o,f=>{f.repeat&&Qe(l)||c(f)&&n(f)},i)}function pa(){const e=ye(!1);return Xt()&&pt(()=>{e.value=!0}),e}function ga(e){const t=pa();return se(()=>(t.value,!!e()))}function ma(e,t={}){const{window:n=Ve}=t,s=ga(()=>n&&"matchMedia"in n&&typeof n.matchMedia=="function");let r;const o=ye(!1),i=u=>{o.value=u.matches},l=()=>{r&&("removeEventListener"in r?r.removeEventListener("change",i):r.removeListener(i))},c=Ro(()=>{s.value&&(l(),r=n.matchMedia(Qe(e)),"addEventListener"in r?r.addEventListener("change",i):r.addListener(i),o.value=r.matches)});return Gs(()=>{c(),l(),r=void 0}),o}const un=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{},fn="__vueuse_ssr_handlers__",ya=_a();function _a(){return fn in un||(un[fn]=un[fn]||{}),un[fn]}function di(e,t){return ya[e]||t}function ba(e){return e==null?"any":e instanceof Set?"set":e instanceof Map?"map":e instanceof Date?"date":typeof e=="boolean"?"boolean":typeof e=="string"?"string":typeof e=="object"?"object":Number.isNaN(e)?"any":"number"}const va={boolean:{read:e=>e==="true",write:e=>String(e)},object:{read:e=>JSON.parse(e),write:e=>JSON.stringify(e)},number:{read:e=>Number.parseFloat(e),write:e=>String(e)},any:{read:e=>e,write:e=>String(e)},string:{read:e=>e,write:e=>String(e)},map:{read:e=>new Map(JSON.parse(e)),write:e=>JSON.stringify(Array.from(e.entries()))},set:{read:e=>new Set(JSON.parse(e)),write:e=>JSON.stringify(Array.from(e))},date:{read:e=>new Date(e),write:e=>e.toISOString()}},kr="vueuse-storage";function wa(e,t,n,s={}){var r;const{flush:o="pre",deep:i=!0,listenToStorageChanges:l=!0,writeDefaults:c=!0,mergeDefaults:u=!1,shallow:f,window:p=Ve,eventFilter:m,onError:_=S=>{console.error(S)},initOnMounted:O}=s,I=(f?mo:ye)(typeof t=="function"?t():t);if(!n)try{n=di("getDefaultStorage",()=>{var S;return(S=Ve)==null?void 0:S.localStorage})()}catch(S){_(S)}if(!n)return I;const H=Qe(t),K=ba(H),M=(r=s.serializer)!=null?r:va[K],{pause:h,resume:g}=da(I,()=>R(I.value),{flush:o,deep:i,eventFilter:m});return p&&l&&fi(()=>{Ze(p,"storage",x),Ze(p,kr,N),O&&x()}),O||x(),I;function R(S){try{if(S==null)n.removeItem(e);else{const E=M.write(S),B=n.getItem(e);B!==E&&(n.setItem(e,E),p&&p.dispatchEvent(new CustomEvent(kr,{detail:{key:e,oldValue:B,newValue:E,storageArea:n}})))}}catch(E){_(E)}}function C(S){const E=S?S.newValue:n.getItem(e);if(E==null)return c&&H!=null&&n.setItem(e,M.write(H)),H;if(!S&&u){const B=M.read(E);return typeof u=="function"?u(B,H):K==="object"&&!Array.isArray(B)?{...H,...B}:B}else return typeof E!="string"?E:M.read(E)}function N(S){x(S.detail)}function x(S){if(!(S&&S.storageArea!==n)){if(S&&S.key==null){I.value=H;return}if(!(S&&S.key!==e)){h();try{(S==null?void 0:S.newValue)!==M.write(I.value)&&(I.value=C(S))}catch(E){_(E)}finally{S?Fn(g):g()}}}}}function hi(e){return ma("(prefers-color-scheme: dark)",e)}function Ea(e={}){const{selector:t="html",attribute:n="class",initialValue:s="auto",window:r=Ve,storage:o,storageKey:i="vueuse-color-scheme",listenToStorageChanges:l=!0,storageRef:c,emitAuto:u,disableTransition:f=!0}=e,p={auto:"",light:"light",dark:"dark",...e.modes||{}},m=hi({window:r}),_=se(()=>m.value?"dark":"light"),O=c||(i==null?ui(s):wa(i,s,o,{window:r,listenToStorageChanges:l})),I=se(()=>O.value==="auto"?_.value:O.value),H=di("updateHTMLAttrs",(g,R,C)=>{const N=typeof g=="string"?r==null?void 0:r.document.querySelector(g):yt(g);if(!N)return;let x;if(f&&(x=r.document.createElement("style"),x.appendChild(document.createTextNode("*,*::before,*::after{-webkit-transition:none!important;-moz-transition:none!important;-o-transition:none!important;-ms-transition:none!important;transition:none!important}")),r.document.head.appendChild(x)),R==="class"){const S=C.split(/\s/g);Object.values(p).flatMap(E=>(E||"").split(/\s/g)).filter(Boolean).forEach(E=>{S.includes(E)?N.classList.add(E):N.classList.remove(E)})}else N.setAttribute(R,C);f&&(r.getComputedStyle(x).opacity,document.head.removeChild(x))});function K(g){var R;H(t,n,(R=p[g])!=null?R:g)}function M(g){e.onChanged?e.onChanged(g,K):K(g)}He(I,M,{flush:"post",immediate:!0}),fi(()=>M(I.value));const h=se({get(){return u?O.value:I.value},set(g){O.value=g}});try{return Object.assign(h,{store:O,system:_,state:I})}catch{return h}}function Ca(e={}){const{valueDark:t="dark",valueLight:n="",window:s=Ve}=e,r=Ea({...e,onChanged:(l,c)=>{var u;e.onChanged?(u=e.onChanged)==null||u.call(e,l==="dark",c,l):c(l)},modes:{dark:t,light:n}}),o=se(()=>r.system?r.system.value:hi({window:s}).value?"dark":"light");return se({get(){return r.value==="dark"},set(l){const c=l?"dark":"light";o.value===c?r.value="auto":r.value=c}})}function ss(e){return typeof Window<"u"&&e instanceof Window?e.document.documentElement:typeof Document<"u"&&e instanceof Document?e.documentElement:e}function pi(e){const t=window.getComputedStyle(e);if(t.overflowX==="scroll"||t.overflowY==="scroll"||t.overflowX==="auto"&&e.clientWidth1?!0:(t.preventDefault&&t.preventDefault(),!1)}const dn=new WeakMap;function Eu(e,t=!1){const n=ye(t);let s=null,r;He(ui(e),l=>{const c=ss(Qe(l));if(c){const u=c;dn.get(u)||dn.set(u,r),n.value&&(u.style.overflow="hidden")}},{immediate:!0});const o=()=>{const l=ss(Qe(e));!l||n.value||(Cs&&(s=Ze(l,"touchmove",c=>{xa(c)},{passive:!1})),l.style.overflow="hidden",n.value=!0)},i=()=>{var l;const c=ss(Qe(e));!c||!n.value||(Cs&&(s==null||s()),c.style.overflow=(l=dn.get(c))!=null?l:"",dn.delete(c),n.value=!1)};return Gs(i),se({get(){return n.value},set(l){l?o():i()}})}function Cu(e={}){const{window:t=Ve,behavior:n="auto"}=e;if(!t)return{x:ye(0),y:ye(0)};const s=ye(t.scrollX),r=ye(t.scrollY),o=se({get(){return s.value},set(l){scrollTo({left:l,behavior:n})}}),i=se({get(){return r.value},set(l){scrollTo({top:l,behavior:n})}});return Ze(t,"scroll",()=>{s.value=t.scrollX,r.value=t.scrollY},{capture:!1,passive:!0}),{x:o,y:i}}var rs={BASE_URL:"/kano/",MODE:"production",DEV:!1,PROD:!0,SSR:!1},Ta={};const gi=/^(?:[a-z]+:|\/\/)/i,Sa="vitepress-theme-appearance",mi=/#.*$/,Aa=/(index)?\.(md|html)$/,Ce=typeof document<"u",yi={relativePath:"",filePath:"",title:"404",description:"Not Found",headers:[],frontmatter:{sidebar:!1,layout:"page"},lastUpdated:0,isNotFound:!0};function Ra(e,t,n=!1){if(t===void 0)return!1;if(e=Dr(`/${e}`),n)return new RegExp(t).test(e);if(Dr(t)!==e)return!1;const s=t.match(mi);return s?(Ce?location.hash:"")===s[0]:!0}function Dr(e){return decodeURI(e).replace(mi,"").replace(Aa,"")}function La(e){return gi.test(e)}function Oa(e,t){var s,r,o,i,l,c,u;const n=Object.keys(e.locales).find(f=>f!=="root"&&!La(f)&&Ra(t,`/${f}/`,!0))||"root";return Object.assign({},e,{localeIndex:n,lang:((s=e.locales[n])==null?void 0:s.lang)??e.lang,dir:((r=e.locales[n])==null?void 0:r.dir)??e.dir,title:((o=e.locales[n])==null?void 0:o.title)??e.title,titleTemplate:((i=e.locales[n])==null?void 0:i.titleTemplate)??e.titleTemplate,description:((l=e.locales[n])==null?void 0:l.description)??e.description,head:bi(e.head,((c=e.locales[n])==null?void 0:c.head)??[]),themeConfig:{...e.themeConfig,...(u=e.locales[n])==null?void 0:u.themeConfig}})}function _i(e,t){const n=t.title||e.title,s=t.titleTemplate??e.titleTemplate;if(typeof s=="string"&&s.includes(":title"))return s.replace(/:title/g,n);const r=Ma(e.title,s);return n===r.slice(3)?n:`${n}${r}`}function Ma(e,t){return t===!1?"":t===!0||t===void 0?` | ${e}`:e===t?"":` | ${t}`}function Ia(e,t){const[n,s]=t;if(n!=="meta")return!1;const r=Object.entries(s)[0];return r==null?!1:e.some(([o,i])=>o===n&&i[r[0]]===r[1])}function bi(e,t){return[...e.filter(n=>!Ia(t,n)),...t]}const Pa=/[\u0000-\u001F"#$&*+,:;<=>?[\]^`{|}\u007F]/g,Fa=/^[a-z]:/i;function Br(e){const t=Fa.exec(e),n=t?t[0]:"";return n+e.slice(n.length).replace(Pa,"_").replace(/(^|\/)_+(?=[^/]*$)/,"$1")}const os=typeof process=="object"&&Ta.VITE_EXTRA_EXTENSIONS||(rs==null?void 0:rs.VITE_EXTRA_EXTENSIONS)||"",Na=new Set(("3g2,3gp,aac,ai,apng,au,avif,bin,bmp,cer,class,conf,crl,css,csv,dll,doc,eps,epub,exe,gif,gz,ics,ief,jar,jpe,jpeg,jpg,js,json,jsonld,m4a,man,mid,midi,mjs,mov,mp2,mp3,mp4,mpe,mpeg,mpg,mpp,oga,ogg,ogv,ogx,opus,otf,p10,p7c,p7m,p7s,pdf,png,ps,qt,roff,rtf,rtx,ser,svg,t,tif,tiff,tr,ts,tsv,ttf,txt,vtt,wav,weba,webm,webp,woff,woff2,xhtml,xml,yaml,yml,zip"+(os&&typeof os=="string"?","+os:"")).split(","));function $a(e){const t=e.split(".").pop();return t==null||!Na.has(t.toLowerCase())}const Ha=Symbol(),ut=mo(ra);function xu(e){const t=se(()=>Oa(ut.value,e.data.relativePath)),n=t.value.appearance,s=n==="force-dark"?ye(!0):n?Ca({storageKey:Sa,initialValue:()=>typeof n=="string"?n:"auto",...typeof n=="object"?n:{}}):ye(!1);return{site:t,theme:se(()=>t.value.themeConfig),page:se(()=>e.data),frontmatter:se(()=>e.data.frontmatter),params:se(()=>e.data.params),lang:se(()=>t.value.lang),dir:se(()=>e.data.frontmatter.dir||t.value.dir),localeIndex:se(()=>t.value.localeIndex||"root"),title:se(()=>_i(t.value,e.data)),description:se(()=>e.data.description||t.value.description),isDark:s}}function ja(){const e=Et(Ha);if(!e)throw new Error("vitepress data not properly injected in app");return e}function Va(e,t){return`${e}${t}`.replace(/\/+/g,"/")}function Ur(e){return gi.test(e)||!e.startsWith("/")?e:Va(ut.value.base,e)}function ka(e){let t=e.replace(/\.html$/,"");if(t=decodeURIComponent(t),t=t.replace(/\/$/,"/index"),Ce){const n="/kano/";t=Br(t.slice(n.length).replace(/\//g,"_")||"index")+".md";let s=__VP_HASH_MAP__[t.toLowerCase()];if(s||(t=t.endsWith("_index.md")?t.slice(0,-9)+".md":t.slice(0,-3)+"_index.md",s=__VP_HASH_MAP__[t.toLowerCase()]),!s)return null;t=`${n}assets/${t}.${s}.js`}else t=`./${Br(t.slice(1).replace(/\//g,"_"))}.md.js`;return t}let mn=[];function Tu(e){mn.push(e),kn(()=>{mn=mn.filter(t=>t!==e)})}function Da(){let e=ut.value.scrollOffset,t=0,n=24;if(typeof e=="object"&&"padding"in e&&(n=e.padding,e=e.selector),typeof e=="number")t=e;else if(typeof e=="string")t=Kr(e,n);else if(Array.isArray(e))for(const s of e){const r=Kr(s,n);if(r){t=r;break}}return t}function Kr(e,t){const n=document.querySelector(e);if(!n)return 0;const s=n.getBoundingClientRect().bottom;return s<0?0:s+t}const Ba=Symbol(),vi="http://a.com",Ua=()=>({path:"/",component:null,data:yi});function Su(e,t){const n=Mn(Ua()),s={route:n,go:r};async function r(l=Ce?location.href:"/"){var c,u;l=An(l),await((c=s.onBeforeRouteChange)==null?void 0:c.call(s,l))!==!1&&(qr(l),await i(l),await((u=s.onAfterRouteChanged)==null?void 0:u.call(s,l)))}let o=null;async function i(l,c=0,u=!1){var m;if(await((m=s.onBeforePageLoad)==null?void 0:m.call(s,l))===!1)return;const f=new URL(l,vi),p=o=f.pathname;try{let _=await e(p);if(!_)throw new Error(`Page not found: ${p}`);if(o===p){o=null;const{default:O,__pageData:I}=_;if(!O)throw new Error(`Invalid route component: ${O}`);n.path=Ce?p:Ur(p),n.component=Pt(O),n.data=Pt(I),Ce&&Fn(()=>{let H=ut.value.base+I.relativePath.replace(/(?:(^|\/)index)?\.md$/,"$1");if(!ut.value.cleanUrls&&!H.endsWith("/")&&(H+=".html"),H!==f.pathname&&(f.pathname=H,l=H+f.search+f.hash,history.replaceState(null,"",l)),f.hash&&!c){let K=null;try{K=document.getElementById(decodeURIComponent(f.hash).slice(1))}catch(M){console.warn(M)}if(K){Wr(K,f.hash);return}}window.scrollTo(0,c)})}}catch(_){if(!/fetch|Page not found/.test(_.message)&&!/^\/404(\.html|\/)?$/.test(l)&&console.error(_),!u)try{const O=await fetch(ut.value.base+"hashmap.json");window.__VP_HASH_MAP__=await O.json(),await i(l,c,!0);return}catch{}o===p&&(o=null,n.path=Ce?p:Ur(p),n.component=t?Pt(t):null,n.data=yi)}}return Ce&&(window.addEventListener("click",l=>{if(l.target.closest("button"))return;const u=l.target.closest("a");if(u&&!u.closest(".vp-raw")&&(u instanceof SVGElement||!u.download)){const{target:f}=u,{href:p,origin:m,pathname:_,hash:O,search:I}=new URL(u.href instanceof SVGAnimatedString?u.href.animVal:u.href,u.baseURI),H=window.location;!l.ctrlKey&&!l.shiftKey&&!l.altKey&&!l.metaKey&&!f&&m===H.origin&&$a(_)&&(l.preventDefault(),_===H.pathname&&I===H.search?(O!==H.hash&&(history.pushState(null,"",O),window.dispatchEvent(new Event("hashchange"))),O?Wr(u,O,u.classList.contains("header-anchor")):(qr(p),window.scrollTo(0,0))):r(p))}},{capture:!0}),window.addEventListener("popstate",async l=>{var c;await i(An(location.href),l.state&&l.state.scrollPosition||0),(c=s.onAfterRouteChanged)==null||c.call(s,location.href)}),window.addEventListener("hashchange",l=>{l.preventDefault()})),s}function Ka(){const e=Et(Ba);if(!e)throw new Error("useRouter() is called without provider.");return e}function wi(){return Ka().route}function Wr(e,t,n=!1){let s=null;try{s=e.classList.contains("header-anchor")?e:document.getElementById(decodeURIComponent(t).slice(1))}catch(r){console.warn(r)}if(s){let r=function(){!n||Math.abs(i-window.scrollY)>window.innerHeight?window.scrollTo(0,i):window.scrollTo({left:0,top:i,behavior:"smooth"})};const o=parseInt(window.getComputedStyle(s).paddingTop,10),i=window.scrollY+s.getBoundingClientRect().top-Da()+o;requestAnimationFrame(r)}}function qr(e){Ce&&An(e)!==An(location.href)&&(history.replaceState({scrollPosition:window.scrollY},document.title),history.pushState(null,"",e))}function An(e){const t=new URL(e,vi);return t.pathname=t.pathname.replace(/(^|\/)index(\.html)?$/,"$1"),ut.value.cleanUrls?t.pathname=t.pathname.replace(/\.html$/,""):!t.pathname.endsWith("/")&&!t.pathname.endsWith(".html")&&(t.pathname+=".html"),t.pathname+t.search+t.hash}const is=()=>mn.forEach(e=>e()),Au=Po({name:"VitePressContent",props:{as:{type:[Object,String],default:"div"}},setup(e){const t=wi(),{site:n}=ja();return()=>ws(e.as,n.value.contentProps??{style:{position:"relative"}},[t.component?ws(t.component,{onVnodeMounted:is,onVnodeUpdated:is,onVnodeUnmounted:is}):"404 Page Not Found"])}}),Ru=Po({setup(e,{slots:t}){const n=ye(!1);return pt(()=>{n.value=!0}),()=>n.value&&t.default?t.default():null}});function Lu(){Ce&&window.addEventListener("click",e=>{var n;const t=e.target;if(t.matches(".vp-code-group input")){const s=(n=t.parentElement)==null?void 0:n.parentElement;if(!s)return;const r=Array.from(s.querySelectorAll("input")).indexOf(t);if(r<0)return;const o=s.querySelector(".blocks");if(!o)return;const i=Array.from(o.children).find(u=>u.classList.contains("active"));if(!i)return;const l=o.children[r];if(!l||i===l)return;i.classList.remove("active"),l.classList.add("active");const c=s==null?void 0:s.querySelector(`label[for="${t.id}"]`);c==null||c.scrollIntoView({block:"nearest"})}})}function Ou(){if(Ce){const e=new WeakMap;window.addEventListener("click",t=>{var s;const n=t.target;if(n.matches('div[class*="language-"] > button.copy')){const r=n.parentElement,o=(s=n.nextElementSibling)==null?void 0:s.nextElementSibling;if(!r||!o)return;const i=/language-(shellscript|shell|bash|sh|zsh)/.test(r.className),l=[".vp-copy-ignore",".diff.remove"],c=o.cloneNode(!0);c.querySelectorAll(l.join(",")).forEach(f=>f.remove());let u=c.textContent||"";i&&(u=u.replace(/^ *(\$|>) /gm,"").trim()),Wa(u).then(()=>{n.classList.add("copied"),clearTimeout(e.get(n));const f=setTimeout(()=>{n.classList.remove("copied"),n.blur(),e.delete(n)},2e3);e.set(n,f)})}})}}async function Wa(e){try{return navigator.clipboard.writeText(e)}catch{const t=document.createElement("textarea"),n=document.activeElement;t.value=e,t.setAttribute("readonly",""),t.style.contain="strict",t.style.position="absolute",t.style.left="-9999px",t.style.fontSize="12pt";const s=document.getSelection(),r=s?s.rangeCount>0&&s.getRangeAt(0):null;document.body.appendChild(t),t.select(),t.selectionStart=0,t.selectionEnd=e.length,document.execCommand("copy"),document.body.removeChild(t),r&&(s.removeAllRanges(),s.addRange(r)),n&&n.focus()}}function Mu(e,t){let n=!0,s=[];const r=o=>{if(n){n=!1,o.forEach(l=>{const c=ls(l);for(const u of document.head.children)if(u.isEqualNode(c)){s.push(u);return}});return}const i=o.map(ls);s.forEach((l,c)=>{const u=i.findIndex(f=>f==null?void 0:f.isEqualNode(l??null));u!==-1?delete i[u]:(l==null||l.remove(),delete s[c])}),i.forEach(l=>l&&document.head.appendChild(l)),s=[...s,...i].filter(Boolean)};Ro(()=>{const o=e.data,i=t.value,l=o&&o.description,c=o&&o.frontmatter.head||[],u=_i(i,o);u!==document.title&&(document.title=u);const f=l||i.description;let p=document.querySelector("meta[name=description]");p?p.getAttribute("content")!==f&&p.setAttribute("content",f):ls(["meta",{name:"description",content:f}]),r(bi(i.head,Ga(c)))})}function ls([e,t,n]){const s=document.createElement(e);for(const r in t)s.setAttribute(r,t[r]);return n&&(s.innerHTML=n),e==="script"&&!t.async&&(s.async=!1),s}function qa(e){return e[0]==="meta"&&e[1]&&e[1].name==="description"}function Ga(e){return e.filter(t=>!qa(t))}const cs=new Set,Ei=()=>document.createElement("link"),za=e=>{const t=Ei();t.rel="prefetch",t.href=e,document.head.appendChild(t)},Xa=e=>{const t=new XMLHttpRequest;t.open("GET",e,t.withCredentials=!0),t.send()};let hn;const Ya=Ce&&(hn=Ei())&&hn.relList&&hn.relList.supports&&hn.relList.supports("prefetch")?za:Xa;function Iu(){if(!Ce||!window.IntersectionObserver)return;let e;if((e=navigator.connection)&&(e.saveData||/2g/.test(e.effectiveType)))return;const t=window.requestIdleCallback||setTimeout;let n=null;const s=()=>{n&&n.disconnect(),n=new IntersectionObserver(o=>{o.forEach(i=>{if(i.isIntersecting){const l=i.target;n.unobserve(l);const{pathname:c}=l;if(!cs.has(c)){cs.add(c);const u=ka(c);u&&Ya(u)}}})}),t(()=>{document.querySelectorAll("#app a").forEach(o=>{const{hostname:i,pathname:l}=new URL(o.href instanceof SVGAnimatedString?o.href.animVal:o.href,o.baseURI),c=l.match(/\.\w+$/);c&&c[0]!==".html"||o.target!=="_blank"&&i===location.hostname&&(l!==location.pathname?n.observe(o):cs.add(l))})})};pt(s);const r=wi();He(()=>r.path,s),kn(()=>{n&&n.disconnect()})}export{gu as $,kn as A,nu as B,No as C,Da as D,eu as E,me as F,ou as G,mo as H,Tu as I,fe as J,gi as K,tu as L,wi as M,_c as N,Et as O,vu as P,wu as Q,Rs as R,Fn as S,si as T,Cu as U,fu as V,In as W,Eu as X,ec as Y,lu as Z,_u as _,Zo as a,pu as a0,cu as a1,ws as a2,cl as a3,Xt as a4,Ds as a5,kl as a6,Mn as a7,Pt as a8,J as a9,su as aa,Hl as ab,$l as ac,Vl as ad,ru as ae,mu as af,au as ag,he as ah,hu as ai,bu as aj,Mu as ak,Ba as al,xu as am,Ha as an,Au as ao,Ru as ap,ut as aq,yu as ar,Su as as,ka as at,Iu as au,Ou as av,Lu as aw,Yo as b,uu as c,Po as d,du as e,$a as f,Ur as g,ye as h,La as i,Ce as j,se as k,pt as l,Qo as m,Ls as n,zo as o,_o as p,Qa as q,iu as r,Za as s,Ja as t,ja as u,Ra as v,xl as w,ma as x,He as y,Ro as z}; diff --git a/assets/chunks/framework.f7d371db.js b/assets/chunks/framework.f7d371db.js deleted file mode 100644 index 150a64c7..00000000 --- a/assets/chunks/framework.f7d371db.js +++ /dev/null @@ -1,2 +0,0 @@ -function ns(e,t){const n=Object.create(null),s=e.split(",");for(let r=0;r!!n[r.toLowerCase()]:r=>!!n[r]}const te={},dt=[],Pe=()=>{},Vi=()=>!1,qi=/^on[^a-z]/,Bt=e=>qi.test(e),ss=e=>e.startsWith("onUpdate:"),ie=Object.assign,rs=(e,t)=>{const n=e.indexOf(t);n>-1&&e.splice(n,1)},zi=Object.prototype.hasOwnProperty,z=(e,t)=>zi.call(e,t),j=Array.isArray,ht=e=>pn(e)==="[object Map]",Tr=e=>pn(e)==="[object Set]",K=e=>typeof e=="function",se=e=>typeof e=="string",is=e=>typeof e=="symbol",ee=e=>e!==null&&typeof e=="object",Ar=e=>ee(e)&&K(e.then)&&K(e.catch),Sr=Object.prototype.toString,pn=e=>Sr.call(e),Yi=e=>pn(e).slice(8,-1),Or=e=>pn(e)==="[object Object]",os=e=>se(e)&&e!=="NaN"&&e[0]!=="-"&&""+parseInt(e,10)===e,Pt=ns(",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted"),gn=e=>{const t=Object.create(null);return n=>t[n]||(t[n]=e(n))},Ji=/-(\w)/g,Le=gn(e=>e.replace(Ji,(t,n)=>n?n.toUpperCase():"")),Xi=/\B([A-Z])/g,lt=gn(e=>e.replace(Xi,"-$1").toLowerCase()),mn=gn(e=>e.charAt(0).toUpperCase()+e.slice(1)),en=gn(e=>e?`on${mn(e)}`:""),Lt=(e,t)=>!Object.is(e,t),Fn=(e,t)=>{for(let n=0;n{Object.defineProperty(e,t,{configurable:!0,enumerable:!1,value:n})},Qi=e=>{const t=parseFloat(e);return isNaN(t)?e:t},Zi=e=>{const t=se(e)?Number(e):NaN;return isNaN(t)?e:t};let Fs;const Un=()=>Fs||(Fs=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:typeof global<"u"?global:{});function ls(e){if(j(e)){const t={};for(let n=0;n{if(n){const s=n.split(eo);s.length>1&&(t[s[0].trim()]=s[1].trim())}}),t}function cs(e){let t="";if(se(e))t=e;else if(j(e))for(let n=0;nse(e)?e:e==null?"":j(e)||ee(e)&&(e.toString===Sr||!K(e.toString))?JSON.stringify(e,Rr,2):String(e),Rr=(e,t)=>t&&t.__v_isRef?Rr(e,t.value):ht(t)?{[`Map(${t.size})`]:[...t.entries()].reduce((n,[s,r])=>(n[`${s} =>`]=r,n),{})}:Tr(t)?{[`Set(${t.size})`]:[...t.values()]}:ee(t)&&!j(t)&&!Or(t)?String(t):t;let be;class io{constructor(t=!1){this.detached=t,this._active=!0,this.effects=[],this.cleanups=[],this.parent=be,!t&&be&&(this.index=(be.scopes||(be.scopes=[])).push(this)-1)}get active(){return this._active}run(t){if(this._active){const n=be;try{return be=this,t()}finally{be=n}}}on(){be=this}off(){be=this.parent}stop(t){if(this._active){let n,s;for(n=0,s=this.effects.length;n{const t=new Set(e);return t.w=0,t.n=0,t},Fr=e=>(e.w&ze)>0,Mr=e=>(e.n&ze)>0,co=({deps:e})=>{if(e.length)for(let t=0;t{const{deps:t}=e;if(t.length){let n=0;for(let s=0;s{(d==="length"||d>=c)&&l.push(u)})}else switch(n!==void 0&&l.push(o.get(n)),t){case"add":j(e)?os(n)&&l.push(o.get("length")):(l.push(o.get(st)),ht(e)&&l.push(o.get(Wn)));break;case"delete":j(e)||(l.push(o.get(st)),ht(e)&&l.push(o.get(Wn)));break;case"set":ht(e)&&l.push(o.get(st));break}if(l.length===1)l[0]&&Vn(l[0]);else{const c=[];for(const u of l)u&&c.push(...u);Vn(as(c))}}function Vn(e,t){const n=j(e)?e:[...e];for(const s of n)s.computed&&Ls(s);for(const s of n)s.computed||Ls(s)}function Ls(e,t){(e!==Se||e.allowRecurse)&&(e.scheduler?e.scheduler():e.run())}function uo(e,t){var n;return(n=rn.get(e))==null?void 0:n.get(t)}const fo=ns("__proto__,__v_isRef,__isVue"),$r=new Set(Object.getOwnPropertyNames(Symbol).filter(e=>e!=="arguments"&&e!=="caller").map(e=>Symbol[e]).filter(is)),ho=fs(),po=fs(!1,!0),go=fs(!0),Ns=mo();function mo(){const e={};return["includes","indexOf","lastIndexOf"].forEach(t=>{e[t]=function(...n){const s=Y(this);for(let i=0,o=this.length;i{e[t]=function(...n){Ct();const s=Y(this)[t].apply(this,n);return Et(),s}}),e}function _o(e){const t=Y(this);return me(t,"has",e),t.hasOwnProperty(e)}function fs(e=!1,t=!1){return function(s,r,i){if(r==="__v_isReactive")return!e;if(r==="__v_isReadonly")return e;if(r==="__v_isShallow")return t;if(r==="__v_raw"&&i===(e?t?Mo:kr:t?Br:Dr).get(s))return s;const o=j(s);if(!e){if(o&&z(Ns,r))return Reflect.get(Ns,r,i);if(r==="hasOwnProperty")return _o}const l=Reflect.get(s,r,i);return(is(r)?$r.has(r):fo(r))||(e||me(s,"get",r),t)?l:le(l)?o&&os(r)?l:l.value:ee(l)?e?bn(l):yn(l):l}}const yo=Hr(),bo=Hr(!0);function Hr(e=!1){return function(n,s,r,i){let o=n[s];if(yt(o)&&le(o)&&!le(r))return!1;if(!e&&(!on(r)&&!yt(r)&&(o=Y(o),r=Y(r)),!j(n)&&le(o)&&!le(r)))return o.value=r,!0;const l=j(n)&&os(s)?Number(s)e,_n=e=>Reflect.getPrototypeOf(e);function Kt(e,t,n=!1,s=!1){e=e.__v_raw;const r=Y(e),i=Y(t);n||(t!==i&&me(r,"get",t),me(r,"get",i));const{has:o}=_n(r),l=s?ds:n?gs:Nt;if(o.call(r,t))return l(e.get(t));if(o.call(r,i))return l(e.get(i));e!==r&&e.get(t)}function Wt(e,t=!1){const n=this.__v_raw,s=Y(n),r=Y(e);return t||(e!==r&&me(s,"has",e),me(s,"has",r)),e===r?n.has(e):n.has(e)||n.has(r)}function Vt(e,t=!1){return e=e.__v_raw,!t&&me(Y(e),"iterate",st),Reflect.get(e,"size",e)}function $s(e){e=Y(e);const t=Y(this);return _n(t).has.call(t,e)||(t.add(e),He(t,"add",e,e)),this}function Hs(e,t){t=Y(t);const n=Y(this),{has:s,get:r}=_n(n);let i=s.call(n,e);i||(e=Y(e),i=s.call(n,e));const o=r.call(n,e);return n.set(e,t),i?Lt(t,o)&&He(n,"set",e,t):He(n,"add",e,t),this}function js(e){const t=Y(this),{has:n,get:s}=_n(t);let r=n.call(t,e);r||(e=Y(e),r=n.call(t,e)),s&&s.call(t,e);const i=t.delete(e);return r&&He(t,"delete",e,void 0),i}function Ds(){const e=Y(this),t=e.size!==0,n=e.clear();return t&&He(e,"clear",void 0,void 0),n}function qt(e,t){return function(s,r){const i=this,o=i.__v_raw,l=Y(o),c=t?ds:e?gs:Nt;return!e&&me(l,"iterate",st),o.forEach((u,d)=>s.call(r,c(u),c(d),i))}}function zt(e,t,n){return function(...s){const r=this.__v_raw,i=Y(r),o=ht(i),l=e==="entries"||e===Symbol.iterator&&o,c=e==="keys"&&o,u=r[e](...s),d=n?ds:t?gs:Nt;return!t&&me(i,"iterate",c?Wn:st),{next(){const{value:h,done:b}=u.next();return b?{value:h,done:b}:{value:l?[d(h[0]),d(h[1])]:d(h),done:b}},[Symbol.iterator](){return this}}}}function De(e){return function(...t){return e==="delete"?!1:this}}function To(){const e={get(i){return Kt(this,i)},get size(){return Vt(this)},has:Wt,add:$s,set:Hs,delete:js,clear:Ds,forEach:qt(!1,!1)},t={get(i){return Kt(this,i,!1,!0)},get size(){return Vt(this)},has:Wt,add:$s,set:Hs,delete:js,clear:Ds,forEach:qt(!1,!0)},n={get(i){return Kt(this,i,!0)},get size(){return Vt(this,!0)},has(i){return Wt.call(this,i,!0)},add:De("add"),set:De("set"),delete:De("delete"),clear:De("clear"),forEach:qt(!0,!1)},s={get(i){return Kt(this,i,!0,!0)},get size(){return Vt(this,!0)},has(i){return Wt.call(this,i,!0)},add:De("add"),set:De("set"),delete:De("delete"),clear:De("clear"),forEach:qt(!0,!0)};return["keys","values","entries",Symbol.iterator].forEach(i=>{e[i]=zt(i,!1,!1),n[i]=zt(i,!0,!1),t[i]=zt(i,!1,!0),s[i]=zt(i,!0,!0)}),[e,n,t,s]}const[Ao,So,Oo,Po]=To();function hs(e,t){const n=t?e?Po:Oo:e?So:Ao;return(s,r,i)=>r==="__v_isReactive"?!e:r==="__v_isReadonly"?e:r==="__v_raw"?s:Reflect.get(z(n,r)&&r in s?n:s,r,i)}const Ro={get:hs(!1,!1)},Io={get:hs(!1,!0)},Fo={get:hs(!0,!1)},Dr=new WeakMap,Br=new WeakMap,kr=new WeakMap,Mo=new WeakMap;function Lo(e){switch(e){case"Object":case"Array":return 1;case"Map":case"Set":case"WeakMap":case"WeakSet":return 2;default:return 0}}function No(e){return e.__v_skip||!Object.isExtensible(e)?0:Lo(Yi(e))}function yn(e){return yt(e)?e:ps(e,!1,jr,Ro,Dr)}function $o(e){return ps(e,!1,xo,Io,Br)}function bn(e){return ps(e,!0,Eo,Fo,kr)}function ps(e,t,n,s,r){if(!ee(e)||e.__v_raw&&!(t&&e.__v_isReactive))return e;const i=r.get(e);if(i)return i;const o=No(e);if(o===0)return e;const l=new Proxy(e,o===2?s:n);return r.set(e,l),l}function pt(e){return yt(e)?pt(e.__v_raw):!!(e&&e.__v_isReactive)}function yt(e){return!!(e&&e.__v_isReadonly)}function on(e){return!!(e&&e.__v_isShallow)}function Ur(e){return pt(e)||yt(e)}function Y(e){const t=e&&e.__v_raw;return t?Y(t):e}function Rt(e){return sn(e,"__v_skip",!0),e}const Nt=e=>ee(e)?yn(e):e,gs=e=>ee(e)?bn(e):e;function ms(e){We&&Se&&(e=Y(e),Nr(e.dep||(e.dep=as())))}function _s(e,t){e=Y(e);const n=e.dep;n&&Vn(n)}function le(e){return!!(e&&e.__v_isRef===!0)}function ge(e){return Wr(e,!1)}function Kr(e){return Wr(e,!0)}function Wr(e,t){return le(e)?e:new Ho(e,t)}class Ho{constructor(t,n){this.__v_isShallow=n,this.dep=void 0,this.__v_isRef=!0,this._rawValue=n?t:Y(t),this._value=n?t:Nt(t)}get value(){return ms(this),this._value}set value(t){const n=this.__v_isShallow||on(t)||yt(t);t=n?t:Y(t),Lt(t,this._rawValue)&&(this._rawValue=t,this._value=n?t:Nt(t),_s(this))}}function Vr(e){return le(e)?e.value:e}const jo={get:(e,t,n)=>Vr(Reflect.get(e,t,n)),set:(e,t,n,s)=>{const r=e[t];return le(r)&&!le(n)?(r.value=n,!0):Reflect.set(e,t,n,s)}};function qr(e){return pt(e)?e:new Proxy(e,jo)}class Do{constructor(t){this.dep=void 0,this.__v_isRef=!0;const{get:n,set:s}=t(()=>ms(this),()=>_s(this));this._get=n,this._set=s}get value(){return this._get()}set value(t){this._set(t)}}function Bo(e){return new Do(e)}class ko{constructor(t,n,s){this._object=t,this._key=n,this._defaultValue=s,this.__v_isRef=!0}get value(){const t=this._object[this._key];return t===void 0?this._defaultValue:t}set value(t){this._object[this._key]=t}get dep(){return uo(Y(this._object),this._key)}}class Uo{constructor(t){this._getter=t,this.__v_isRef=!0,this.__v_isReadonly=!0}get value(){return this._getter()}}function Ko(e,t,n){return le(e)?e:K(e)?new Uo(e):ee(e)&&arguments.length>1?Wo(e,t,n):ge(e)}function Wo(e,t,n){const s=e[t];return le(s)?s:new ko(e,t,n)}class Vo{constructor(t,n,s,r){this._setter=n,this.dep=void 0,this.__v_isRef=!0,this.__v_isReadonly=!1,this._dirty=!0,this.effect=new us(t,()=>{this._dirty||(this._dirty=!0,_s(this))}),this.effect.computed=this,this.effect.active=this._cacheable=!r,this.__v_isReadonly=s}get value(){const t=Y(this);return ms(t),(t._dirty||!t._cacheable)&&(t._dirty=!1,t._value=t.effect.run()),t._value}set value(t){this._setter(t)}}function qo(e,t,n=!1){let s,r;const i=K(e);return i?(s=e,r=Pe):(s=e.get,r=e.set),new Vo(s,r,i||!r,n)}function Ve(e,t,n,s){let r;try{r=s?e(...s):e()}catch(i){vn(i,t,n)}return r}function xe(e,t,n,s){if(K(e)){const i=Ve(e,t,n,s);return i&&Ar(i)&&i.catch(o=>{vn(o,t,n)}),i}const r=[];for(let i=0;i>>1;Ht(ue[s])Me&&ue.splice(t,1)}function Xo(e){j(e)?gt.push(...e):(!$e||!$e.includes(e,e.allowRecurse?et+1:et))&>.push(e),Yr()}function Bs(e,t=$t?Me+1:0){for(;tHt(n)-Ht(s)),et=0;et<$e.length;et++)$e[et]();$e=null,et=0}}const Ht=e=>e.id==null?1/0:e.id,Qo=(e,t)=>{const n=Ht(e)-Ht(t);if(n===0){if(e.pre&&!t.pre)return-1;if(t.pre&&!e.pre)return 1}return n};function Jr(e){qn=!1,$t=!0,ue.sort(Qo);const t=Pe;try{for(Me=0;Mese(A)?A.trim():A)),h&&(r=n.map(Qi))}let l,c=s[l=en(t)]||s[l=en(Le(t))];!c&&i&&(c=s[l=en(lt(t))]),c&&xe(c,e,6,r);const u=s[l+"Once"];if(u){if(!e.emitted)e.emitted={};else if(e.emitted[l])return;e.emitted[l]=!0,xe(u,e,6,r)}}function Xr(e,t,n=!1){const s=t.emitsCache,r=s.get(e);if(r!==void 0)return r;const i=e.emits;let o={},l=!1;if(!K(e)){const c=u=>{const d=Xr(u,t,!0);d&&(l=!0,ie(o,d))};!n&&t.mixins.length&&t.mixins.forEach(c),e.extends&&c(e.extends),e.mixins&&e.mixins.forEach(c)}return!i&&!l?(ee(e)&&s.set(e,null),null):(j(i)?i.forEach(c=>o[c]=null):ie(o,i),ee(e)&&s.set(e,o),o)}function Cn(e,t){return!e||!Bt(t)?!1:(t=t.slice(2).replace(/Once$/,""),z(e,t[0].toLowerCase()+t.slice(1))||z(e,lt(t))||z(e,t))}let fe=null,En=null;function cn(e){const t=fe;return fe=e,En=e&&e.type.__scopeId||null,t}function va(e){En=e}function wa(){En=null}function Go(e,t=fe,n){if(!t||e._n)return e;const s=(...r)=>{s._d&&Zs(-1);const i=cn(t);let o;try{o=e(...r)}finally{cn(i),s._d&&Zs(1)}return o};return s._n=!0,s._c=!0,s._d=!0,s}function Mn(e){const{type:t,vnode:n,proxy:s,withProxy:r,props:i,propsOptions:[o],slots:l,attrs:c,emit:u,render:d,renderCache:h,data:b,setupState:A,ctx:P,inheritAttrs:O}=e;let B,g;const w=cn(e);try{if(n.shapeFlag&4){const x=r||s;B=Ae(d.call(x,x,h,i,A,b,P)),g=c}else{const x=t;B=Ae(x.length>1?x(i,{attrs:c,slots:l,emit:u}):x(i,null)),g=t.props?c:el(c)}}catch(x){Mt.length=0,vn(x,e,1),B=ae(ve)}let H=B;if(g&&O!==!1){const x=Object.keys(g),{shapeFlag:D}=H;x.length&&D&7&&(o&&x.some(ss)&&(g=tl(g,o)),H=Ye(H,g))}return n.dirs&&(H=Ye(H),H.dirs=H.dirs?H.dirs.concat(n.dirs):n.dirs),n.transition&&(H.transition=n.transition),B=H,cn(w),B}const el=e=>{let t;for(const n in e)(n==="class"||n==="style"||Bt(n))&&((t||(t={}))[n]=e[n]);return t},tl=(e,t)=>{const n={};for(const s in e)(!ss(s)||!(s.slice(9)in t))&&(n[s]=e[s]);return n};function nl(e,t,n){const{props:s,children:r,component:i}=e,{props:o,children:l,patchFlag:c}=t,u=i.emitsOptions;if(t.dirs||t.transition)return!0;if(n&&c>=0){if(c&1024)return!0;if(c&16)return s?ks(s,o,u):!!o;if(c&8){const d=t.dynamicProps;for(let h=0;he.__isSuspense;function Qr(e,t){t&&t.pendingBranch?j(e)?t.effects.push(...e):t.effects.push(e):Xo(e)}function Zr(e,t){return xn(e,null,t)}function Ca(e,t){return xn(e,null,{flush:"post"})}const Yt={};function qe(e,t,n){return xn(e,t,n)}function xn(e,t,{immediate:n,deep:s,flush:r,onTrack:i,onTrigger:o}=te){var l;const c=Ir()===((l=oe)==null?void 0:l.scope)?oe:null;let u,d=!1,h=!1;if(le(e)?(u=()=>e.value,d=on(e)):pt(e)?(u=()=>e,s=!0):j(e)?(h=!0,d=e.some(x=>pt(x)||on(x)),u=()=>e.map(x=>{if(le(x))return x.value;if(pt(x))return ft(x);if(K(x))return Ve(x,c,2)})):K(e)?t?u=()=>Ve(e,c,2):u=()=>{if(!(c&&c.isUnmounted))return b&&b(),xe(e,c,3,[A])}:u=Pe,t&&s){const x=u;u=()=>ft(x())}let b,A=x=>{b=w.onStop=()=>{Ve(x,c,4)}},P;if(Dt)if(A=Pe,t?n&&xe(t,c,3,[u(),h?[]:void 0,A]):u(),r==="sync"){const x=Zl();P=x.__watcherHandles||(x.__watcherHandles=[])}else return Pe;let O=h?new Array(e.length).fill(Yt):Yt;const B=()=>{if(w.active)if(t){const x=w.run();(s||d||(h?x.some((D,q)=>Lt(D,O[q])):Lt(x,O)))&&(b&&b(),xe(t,c,3,[x,O===Yt?void 0:h&&O[0]===Yt?[]:O,A]),O=x)}else w.run()};B.allowRecurse=!!t;let g;r==="sync"?g=B:r==="post"?g=()=>he(B,c&&c.suspense):(B.pre=!0,c&&(B.id=c.uid),g=()=>bs(B));const w=new us(u,g);t?n?B():O=w.run():r==="post"?he(w.run.bind(w),c&&c.suspense):w.run();const H=()=>{w.stop(),c&&c.scope&&rs(c.scope.effects,w)};return P&&P.push(H),H}function il(e,t,n){const s=this.proxy,r=se(e)?e.includes(".")?Gr(s,e):()=>s[e]:e.bind(s,s);let i;K(t)?i=t:(i=t.handler,n=t);const o=oe;vt(this);const l=xn(r,i.bind(s),n);return o?vt(o):rt(),l}function Gr(e,t){const n=t.split(".");return()=>{let s=e;for(let r=0;r{ft(n,t)});else if(Or(e))for(const n in e)ft(e[n],t);return e}function Fe(e,t,n,s){const r=e.dirs,i=t&&t.dirs;for(let o=0;o{e.isMounted=!0}),ii(()=>{e.isUnmounting=!0}),e}const we=[Function,Array],ei={mode:String,appear:Boolean,persisted:Boolean,onBeforeEnter:we,onEnter:we,onAfterEnter:we,onEnterCancelled:we,onBeforeLeave:we,onLeave:we,onAfterLeave:we,onLeaveCancelled:we,onBeforeAppear:we,onAppear:we,onAfterAppear:we,onAppearCancelled:we},ll={name:"BaseTransition",props:ei,setup(e,{slots:t}){const n=Pn(),s=ol();let r;return()=>{const i=t.default&&ni(t.default(),!0);if(!i||!i.length)return;let o=i[0];if(i.length>1){for(const O of i)if(O.type!==ve){o=O;break}}const l=Y(e),{mode:c}=l;if(s.isLeaving)return Ln(o);const u=Us(o);if(!u)return Ln(o);const d=zn(u,l,s,n);Yn(u,d);const h=n.subTree,b=h&&Us(h);let A=!1;const{getTransitionKey:P}=u.type;if(P){const O=P();r===void 0?r=O:O!==r&&(r=O,A=!0)}if(b&&b.type!==ve&&(!tt(u,b)||A)){const O=zn(b,l,s,n);if(Yn(b,O),c==="out-in")return s.isLeaving=!0,O.afterLeave=()=>{s.isLeaving=!1,n.update.active!==!1&&n.update()},Ln(o);c==="in-out"&&u.type!==ve&&(O.delayLeave=(B,g,w)=>{const H=ti(s,b);H[String(b.key)]=b,B._leaveCb=()=>{g(),B._leaveCb=void 0,delete d.delayedLeave},d.delayedLeave=w})}return o}}},cl=ll;function ti(e,t){const{leavingVNodes:n}=e;let s=n.get(t.type);return s||(s=Object.create(null),n.set(t.type,s)),s}function zn(e,t,n,s){const{appear:r,mode:i,persisted:o=!1,onBeforeEnter:l,onEnter:c,onAfterEnter:u,onEnterCancelled:d,onBeforeLeave:h,onLeave:b,onAfterLeave:A,onLeaveCancelled:P,onBeforeAppear:O,onAppear:B,onAfterAppear:g,onAppearCancelled:w}=t,H=String(e.key),x=ti(n,e),D=(m,F)=>{m&&xe(m,s,9,F)},q=(m,F)=>{const M=F[1];D(m,F),j(m)?m.every(J=>J.length<=1)&&M():m.length<=1&&M()},U={mode:i,persisted:o,beforeEnter(m){let F=l;if(!n.isMounted)if(r)F=O||l;else return;m._leaveCb&&m._leaveCb(!0);const M=x[H];M&&tt(e,M)&&M.el._leaveCb&&M.el._leaveCb(),D(F,[m])},enter(m){let F=c,M=u,J=d;if(!n.isMounted)if(r)F=B||c,M=g||u,J=w||d;else return;let R=!1;const W=m._enterCb=L=>{R||(R=!0,L?D(J,[m]):D(M,[m]),U.delayedLeave&&U.delayedLeave(),m._enterCb=void 0)};F?q(F,[m,W]):W()},leave(m,F){const M=String(e.key);if(m._enterCb&&m._enterCb(!0),n.isUnmounting)return F();D(h,[m]);let J=!1;const R=m._leaveCb=W=>{J||(J=!0,F(),W?D(P,[m]):D(A,[m]),m._leaveCb=void 0,x[M]===e&&delete x[M])};x[M]=e,b?q(b,[m,R]):R()},clone(m){return zn(m,t,n,s)}};return U}function Ln(e){if(Tn(e))return e=Ye(e),e.children=null,e}function Us(e){return Tn(e)?e.children?e.children[0]:void 0:e}function Yn(e,t){e.shapeFlag&6&&e.component?Yn(e.component.subTree,t):e.shapeFlag&128?(e.ssContent.transition=t.clone(e.ssContent),e.ssFallback.transition=t.clone(e.ssFallback)):e.transition=t}function ni(e,t=!1,n){let s=[],r=0;for(let i=0;i1)for(let i=0;iie({name:e.name},t,{setup:e}))():e}const mt=e=>!!e.type.__asyncLoader,Tn=e=>e.type.__isKeepAlive;function al(e,t){ri(e,"a",t)}function ul(e,t){ri(e,"da",t)}function ri(e,t,n=oe){const s=e.__wdc||(e.__wdc=()=>{let r=n;for(;r;){if(r.isDeactivated)return;r=r.parent}return e()});if(An(t,s,n),n){let r=n.parent;for(;r&&r.parent;)Tn(r.parent.vnode)&&fl(s,t,n,r),r=r.parent}}function fl(e,t,n,s){const r=An(t,e,s,!0);Sn(()=>{rs(s[t],r)},n)}function An(e,t,n=oe,s=!1){if(n){const r=n[e]||(n[e]=[]),i=t.__weh||(t.__weh=(...o)=>{if(n.isUnmounted)return;Ct(),vt(n);const l=xe(t,n,e,o);return rt(),Et(),l});return s?r.unshift(i):r.push(i),i}}const je=e=>(t,n=oe)=>(!Dt||e==="sp")&&An(e,(...s)=>t(...s),n),dl=je("bm"),xt=je("m"),hl=je("bu"),pl=je("u"),ii=je("bum"),Sn=je("um"),gl=je("sp"),ml=je("rtg"),_l=je("rtc");function yl(e,t=oe){An("ec",e,t)}const vs="components";function Ea(e,t){return li(vs,e,!0,t)||e}const oi=Symbol.for("v-ndc");function xa(e){return se(e)?li(vs,e,!1)||e:e||oi}function li(e,t,n=!0,s=!1){const r=fe||oe;if(r){const i=r.type;if(e===vs){const l=Jl(i,!1);if(l&&(l===t||l===Le(t)||l===mn(Le(t))))return i}const o=Ks(r[e]||i[e],t)||Ks(r.appContext[e],t);return!o&&s?i:o}}function Ks(e,t){return e&&(e[t]||e[Le(t)]||e[mn(Le(t))])}function Ta(e,t,n,s){let r;const i=n&&n[s];if(j(e)||se(e)){r=new Array(e.length);for(let o=0,l=e.length;ot(o,l,void 0,i&&i[l]));else{const o=Object.keys(e);r=new Array(o.length);for(let l=0,c=o.length;ldn(t)?!(t.type===ve||t.type===pe&&!ci(t.children)):!0)?e:null}function Sa(e,t){const n={};for(const s in e)n[t&&/[A-Z]/.test(s)?`on:${s}`:en(s)]=e[s];return n}const Jn=e=>e?Ei(e)?Ts(e)||e.proxy:Jn(e.parent):null,It=ie(Object.create(null),{$:e=>e,$el:e=>e.vnode.el,$data:e=>e.data,$props:e=>e.props,$attrs:e=>e.attrs,$slots:e=>e.slots,$refs:e=>e.refs,$parent:e=>Jn(e.parent),$root:e=>Jn(e.root),$emit:e=>e.emit,$options:e=>ws(e),$forceUpdate:e=>e.f||(e.f=()=>bs(e.update)),$nextTick:e=>e.n||(e.n=wn.bind(e.proxy)),$watch:e=>il.bind(e)}),Nn=(e,t)=>e!==te&&!e.__isScriptSetup&&z(e,t),bl={get({_:e},t){const{ctx:n,setupState:s,data:r,props:i,accessCache:o,type:l,appContext:c}=e;let u;if(t[0]!=="$"){const A=o[t];if(A!==void 0)switch(A){case 1:return s[t];case 2:return r[t];case 4:return n[t];case 3:return i[t]}else{if(Nn(s,t))return o[t]=1,s[t];if(r!==te&&z(r,t))return o[t]=2,r[t];if((u=e.propsOptions[0])&&z(u,t))return o[t]=3,i[t];if(n!==te&&z(n,t))return o[t]=4,n[t];Xn&&(o[t]=0)}}const d=It[t];let h,b;if(d)return t==="$attrs"&&me(e,"get",t),d(e);if((h=l.__cssModules)&&(h=h[t]))return h;if(n!==te&&z(n,t))return o[t]=4,n[t];if(b=c.config.globalProperties,z(b,t))return b[t]},set({_:e},t,n){const{data:s,setupState:r,ctx:i}=e;return Nn(r,t)?(r[t]=n,!0):s!==te&&z(s,t)?(s[t]=n,!0):z(e.props,t)||t[0]==="$"&&t.slice(1)in e?!1:(i[t]=n,!0)},has({_:{data:e,setupState:t,accessCache:n,ctx:s,appContext:r,propsOptions:i}},o){let l;return!!n[o]||e!==te&&z(e,o)||Nn(t,o)||(l=i[0])&&z(l,o)||z(s,o)||z(It,o)||z(r.config.globalProperties,o)},defineProperty(e,t,n){return n.get!=null?e._.accessCache[t]=0:z(n,"value")&&this.set(e,t,n.value,null),Reflect.defineProperty(e,t,n)}};function Oa(){return vl().slots}function vl(){const e=Pn();return e.setupContext||(e.setupContext=Ti(e))}function Ws(e){return j(e)?e.reduce((t,n)=>(t[n]=null,t),{}):e}let Xn=!0;function wl(e){const t=ws(e),n=e.proxy,s=e.ctx;Xn=!1,t.beforeCreate&&Vs(t.beforeCreate,e,"bc");const{data:r,computed:i,methods:o,watch:l,provide:c,inject:u,created:d,beforeMount:h,mounted:b,beforeUpdate:A,updated:P,activated:O,deactivated:B,beforeDestroy:g,beforeUnmount:w,destroyed:H,unmounted:x,render:D,renderTracked:q,renderTriggered:U,errorCaptured:m,serverPrefetch:F,expose:M,inheritAttrs:J,components:R,directives:W,filters:L}=t;if(u&&Cl(u,s,null),o)for(const ne in o){const Z=o[ne];K(Z)&&(s[ne]=Z.bind(n))}if(r){const ne=r.call(n,n);ee(ne)&&(e.data=yn(ne))}if(Xn=!0,i)for(const ne in i){const Z=i[ne],Je=K(Z)?Z.bind(n,n):K(Z.get)?Z.get.bind(n,n):Pe,kt=!K(Z)&&K(Z.set)?Z.set.bind(n):Pe,Xe=ce({get:Je,set:kt});Object.defineProperty(s,ne,{enumerable:!0,configurable:!0,get:()=>Xe.value,set:Re=>Xe.value=Re})}if(l)for(const ne in l)ai(l[ne],s,n,ne);if(c){const ne=K(c)?c.call(n):c;Reflect.ownKeys(ne).forEach(Z=>{Ol(Z,ne[Z])})}d&&Vs(d,e,"c");function X(ne,Z){j(Z)?Z.forEach(Je=>ne(Je.bind(n))):Z&&ne(Z.bind(n))}if(X(dl,h),X(xt,b),X(hl,A),X(pl,P),X(al,O),X(ul,B),X(yl,m),X(_l,q),X(ml,U),X(ii,w),X(Sn,x),X(gl,F),j(M))if(M.length){const ne=e.exposed||(e.exposed={});M.forEach(Z=>{Object.defineProperty(ne,Z,{get:()=>n[Z],set:Je=>n[Z]=Je})})}else e.exposed||(e.exposed={});D&&e.render===Pe&&(e.render=D),J!=null&&(e.inheritAttrs=J),R&&(e.components=R),W&&(e.directives=W)}function Cl(e,t,n=Pe){j(e)&&(e=Qn(e));for(const s in e){const r=e[s];let i;ee(r)?"default"in r?i=_t(r.from||s,r.default,!0):i=_t(r.from||s):i=_t(r),le(i)?Object.defineProperty(t,s,{enumerable:!0,configurable:!0,get:()=>i.value,set:o=>i.value=o}):t[s]=i}}function Vs(e,t,n){xe(j(e)?e.map(s=>s.bind(t.proxy)):e.bind(t.proxy),t,n)}function ai(e,t,n,s){const r=s.includes(".")?Gr(n,s):()=>n[s];if(se(e)){const i=t[e];K(i)&&qe(r,i)}else if(K(e))qe(r,e.bind(n));else if(ee(e))if(j(e))e.forEach(i=>ai(i,t,n,s));else{const i=K(e.handler)?e.handler.bind(n):t[e.handler];K(i)&&qe(r,i,e)}}function ws(e){const t=e.type,{mixins:n,extends:s}=t,{mixins:r,optionsCache:i,config:{optionMergeStrategies:o}}=e.appContext,l=i.get(t);let c;return l?c=l:!r.length&&!n&&!s?c=t:(c={},r.length&&r.forEach(u=>an(c,u,o,!0)),an(c,t,o)),ee(t)&&i.set(t,c),c}function an(e,t,n,s=!1){const{mixins:r,extends:i}=t;i&&an(e,i,n,!0),r&&r.forEach(o=>an(e,o,n,!0));for(const o in t)if(!(s&&o==="expose")){const l=El[o]||n&&n[o];e[o]=l?l(e[o],t[o]):t[o]}return e}const El={data:qs,props:zs,emits:zs,methods:Ot,computed:Ot,beforeCreate:de,created:de,beforeMount:de,mounted:de,beforeUpdate:de,updated:de,beforeDestroy:de,beforeUnmount:de,destroyed:de,unmounted:de,activated:de,deactivated:de,errorCaptured:de,serverPrefetch:de,components:Ot,directives:Ot,watch:Tl,provide:qs,inject:xl};function qs(e,t){return t?e?function(){return ie(K(e)?e.call(this,this):e,K(t)?t.call(this,this):t)}:t:e}function xl(e,t){return Ot(Qn(e),Qn(t))}function Qn(e){if(j(e)){const t={};for(let n=0;n1)return n&&K(t)?t.call(s&&s.proxy):t}}function Pl(e,t,n,s=!1){const r={},i={};sn(i,On,1),e.propsDefaults=Object.create(null),fi(e,t,r,i);for(const o in e.propsOptions[0])o in r||(r[o]=void 0);n?e.props=s?r:$o(r):e.type.props?e.props=r:e.props=i,e.attrs=i}function Rl(e,t,n,s){const{props:r,attrs:i,vnode:{patchFlag:o}}=e,l=Y(r),[c]=e.propsOptions;let u=!1;if((s||o>0)&&!(o&16)){if(o&8){const d=e.vnode.dynamicProps;for(let h=0;h{c=!0;const[b,A]=di(h,t,!0);ie(o,b),A&&l.push(...A)};!n&&t.mixins.length&&t.mixins.forEach(d),e.extends&&d(e.extends),e.mixins&&e.mixins.forEach(d)}if(!i&&!c)return ee(e)&&s.set(e,dt),dt;if(j(i))for(let d=0;d-1,A[1]=O<0||P-1||z(A,"default"))&&l.push(h)}}}const u=[o,l];return ee(e)&&s.set(e,u),u}function Ys(e){return e[0]!=="$"}function Js(e){const t=e&&e.toString().match(/^\s*(function|class) (\w+)/);return t?t[2]:e===null?"null":""}function Xs(e,t){return Js(e)===Js(t)}function Qs(e,t){return j(t)?t.findIndex(n=>Xs(n,e)):K(t)&&Xs(t,e)?0:-1}const hi=e=>e[0]==="_"||e==="$stable",Cs=e=>j(e)?e.map(Ae):[Ae(e)],Il=(e,t,n)=>{if(t._n)return t;const s=Go((...r)=>Cs(t(...r)),n);return s._c=!1,s},pi=(e,t,n)=>{const s=e._ctx;for(const r in e){if(hi(r))continue;const i=e[r];if(K(i))t[r]=Il(r,i,s);else if(i!=null){const o=Cs(i);t[r]=()=>o}}},gi=(e,t)=>{const n=Cs(t);e.slots.default=()=>n},Fl=(e,t)=>{if(e.vnode.shapeFlag&32){const n=t._;n?(e.slots=Y(t),sn(t,"_",n)):pi(t,e.slots={})}else e.slots={},t&&gi(e,t);sn(e.slots,On,1)},Ml=(e,t,n)=>{const{vnode:s,slots:r}=e;let i=!0,o=te;if(s.shapeFlag&32){const l=t._;l?n&&l===1?i=!1:(ie(r,t),!n&&l===1&&delete r._):(i=!t.$stable,pi(t,r)),o=t}else t&&(gi(e,t),o={default:1});if(i)for(const l in r)!hi(l)&&!(l in o)&&delete r[l]};function fn(e,t,n,s,r=!1){if(j(e)){e.forEach((b,A)=>fn(b,t&&(j(t)?t[A]:t),n,s,r));return}if(mt(s)&&!r)return;const i=s.shapeFlag&4?Ts(s.component)||s.component.proxy:s.el,o=r?null:i,{i:l,r:c}=e,u=t&&t.r,d=l.refs===te?l.refs={}:l.refs,h=l.setupState;if(u!=null&&u!==c&&(se(u)?(d[u]=null,z(h,u)&&(h[u]=null)):le(u)&&(u.value=null)),K(c))Ve(c,l,12,[o,d]);else{const b=se(c),A=le(c);if(b||A){const P=()=>{if(e.f){const O=b?z(h,c)?h[c]:d[c]:c.value;r?j(O)&&rs(O,i):j(O)?O.includes(i)||O.push(i):b?(d[c]=[i],z(h,c)&&(h[c]=d[c])):(c.value=[i],e.k&&(d[e.k]=c.value))}else b?(d[c]=o,z(h,c)&&(h[c]=o)):A&&(c.value=o,e.k&&(d[e.k]=o))};o?(P.id=-1,he(P,n)):P()}}}let Be=!1;const Jt=e=>/svg/.test(e.namespaceURI)&&e.tagName!=="foreignObject",Xt=e=>e.nodeType===8;function Ll(e){const{mt:t,p:n,o:{patchProp:s,createText:r,nextSibling:i,parentNode:o,remove:l,insert:c,createComment:u}}=e,d=(g,w)=>{if(!w.hasChildNodes()){n(null,g,w),ln(),w._vnode=g;return}Be=!1,h(w.firstChild,g,null,null,null),ln(),w._vnode=g,Be&&console.error("Hydration completed but contains mismatches.")},h=(g,w,H,x,D,q=!1)=>{const U=Xt(g)&&g.data==="[",m=()=>O(g,w,H,x,D,U),{type:F,ref:M,shapeFlag:J,patchFlag:R}=w;let W=g.nodeType;w.el=g,R===-2&&(q=!1,w.dynamicChildren=null);let L=null;switch(F){case bt:W!==3?w.children===""?(c(w.el=r(""),o(g),g),L=g):L=m():(g.data!==w.children&&(Be=!0,g.data=w.children),L=i(g));break;case ve:W!==8||U?L=m():L=i(g);break;case Ft:if(U&&(g=i(g),W=g.nodeType),W===1||W===3){L=g;const _e=!w.children.length;for(let X=0;X{q=q||!!w.dynamicChildren;const{type:U,props:m,patchFlag:F,shapeFlag:M,dirs:J}=w,R=U==="input"&&J||U==="option";if(R||F!==-1){if(J&&Fe(w,null,H,"created"),m)if(R||!q||F&48)for(const L in m)(R&&L.endsWith("value")||Bt(L)&&!Pt(L))&&s(g,L,null,m[L],!1,void 0,H);else m.onClick&&s(g,"onClick",null,m.onClick,!1,void 0,H);let W;if((W=m&&m.onVnodeBeforeMount)&&Ce(W,H,w),J&&Fe(w,null,H,"beforeMount"),((W=m&&m.onVnodeMounted)||J)&&Qr(()=>{W&&Ce(W,H,w),J&&Fe(w,null,H,"mounted")},x),M&16&&!(m&&(m.innerHTML||m.textContent))){let L=A(g.firstChild,w,g,H,x,D,q);for(;L;){Be=!0;const _e=L;L=L.nextSibling,l(_e)}}else M&8&&g.textContent!==w.children&&(Be=!0,g.textContent=w.children)}return g.nextSibling},A=(g,w,H,x,D,q,U)=>{U=U||!!w.dynamicChildren;const m=w.children,F=m.length;for(let M=0;M{const{slotScopeIds:U}=w;U&&(D=D?D.concat(U):U);const m=o(g),F=A(i(g),w,m,H,x,D,q);return F&&Xt(F)&&F.data==="]"?i(w.anchor=F):(Be=!0,c(w.anchor=u("]"),m,F),F)},O=(g,w,H,x,D,q)=>{if(Be=!0,w.el=null,q){const F=B(g);for(;;){const M=i(g);if(M&&M!==F)l(M);else break}}const U=i(g),m=o(g);return l(g),n(null,w,m,U,H,x,Jt(m),D),U},B=g=>{let w=0;for(;g;)if(g=i(g),g&&Xt(g)&&(g.data==="["&&w++,g.data==="]")){if(w===0)return i(g);w--}return g};return[d,h]}const he=Qr;function Nl(e){return $l(e,Ll)}function $l(e,t){const n=Un();n.__VUE__=!0;const{insert:s,remove:r,patchProp:i,createElement:o,createText:l,createComment:c,setText:u,setElementText:d,parentNode:h,nextSibling:b,setScopeId:A=Pe,insertStaticContent:P}=e,O=(a,f,p,y=null,_=null,E=null,S=!1,C=null,T=!!f.dynamicChildren)=>{if(a===f)return;a&&!tt(a,f)&&(y=Ut(a),Re(a,_,E,!0),a=null),f.patchFlag===-2&&(T=!1,f.dynamicChildren=null);const{type:v,ref:N,shapeFlag:I}=f;switch(v){case bt:B(a,f,p,y);break;case ve:g(a,f,p,y);break;case Ft:a==null&&w(f,p,y,S);break;case pe:R(a,f,p,y,_,E,S,C,T);break;default:I&1?D(a,f,p,y,_,E,S,C,T):I&6?W(a,f,p,y,_,E,S,C,T):(I&64||I&128)&&v.process(a,f,p,y,_,E,S,C,T,ct)}N!=null&&_&&fn(N,a&&a.ref,E,f||a,!f)},B=(a,f,p,y)=>{if(a==null)s(f.el=l(f.children),p,y);else{const _=f.el=a.el;f.children!==a.children&&u(_,f.children)}},g=(a,f,p,y)=>{a==null?s(f.el=c(f.children||""),p,y):f.el=a.el},w=(a,f,p,y)=>{[a.el,a.anchor]=P(a.children,f,p,y,a.el,a.anchor)},H=({el:a,anchor:f},p,y)=>{let _;for(;a&&a!==f;)_=b(a),s(a,p,y),a=_;s(f,p,y)},x=({el:a,anchor:f})=>{let p;for(;a&&a!==f;)p=b(a),r(a),a=p;r(f)},D=(a,f,p,y,_,E,S,C,T)=>{S=S||f.type==="svg",a==null?q(f,p,y,_,E,S,C,T):F(a,f,_,E,S,C,T)},q=(a,f,p,y,_,E,S,C)=>{let T,v;const{type:N,props:I,shapeFlag:$,transition:k,dirs:V}=a;if(T=a.el=o(a.type,E,I&&I.is,I),$&8?d(T,a.children):$&16&&m(a.children,T,null,y,_,E&&N!=="foreignObject",S,C),V&&Fe(a,null,y,"created"),U(T,a,a.scopeId,S,y),I){for(const Q in I)Q!=="value"&&!Pt(Q)&&i(T,Q,null,I[Q],E,a.children,y,_,Ne);"value"in I&&i(T,"value",null,I.value),(v=I.onVnodeBeforeMount)&&Ce(v,y,a)}V&&Fe(a,null,y,"beforeMount");const G=(!_||_&&!_.pendingBranch)&&k&&!k.persisted;G&&k.beforeEnter(T),s(T,f,p),((v=I&&I.onVnodeMounted)||G||V)&&he(()=>{v&&Ce(v,y,a),G&&k.enter(T),V&&Fe(a,null,y,"mounted")},_)},U=(a,f,p,y,_)=>{if(p&&A(a,p),y)for(let E=0;E{for(let v=T;v{const C=f.el=a.el;let{patchFlag:T,dynamicChildren:v,dirs:N}=f;T|=a.patchFlag&16;const I=a.props||te,$=f.props||te;let k;p&&Qe(p,!1),(k=$.onVnodeBeforeUpdate)&&Ce(k,p,f,a),N&&Fe(f,a,p,"beforeUpdate"),p&&Qe(p,!0);const V=_&&f.type!=="foreignObject";if(v?M(a.dynamicChildren,v,C,p,y,V,E):S||Z(a,f,C,null,p,y,V,E,!1),T>0){if(T&16)J(C,f,I,$,p,y,_);else if(T&2&&I.class!==$.class&&i(C,"class",null,$.class,_),T&4&&i(C,"style",I.style,$.style,_),T&8){const G=f.dynamicProps;for(let Q=0;Q{k&&Ce(k,p,f,a),N&&Fe(f,a,p,"updated")},y)},M=(a,f,p,y,_,E,S)=>{for(let C=0;C{if(p!==y){if(p!==te)for(const C in p)!Pt(C)&&!(C in y)&&i(a,C,p[C],null,S,f.children,_,E,Ne);for(const C in y){if(Pt(C))continue;const T=y[C],v=p[C];T!==v&&C!=="value"&&i(a,C,v,T,S,f.children,_,E,Ne)}"value"in y&&i(a,"value",p.value,y.value)}},R=(a,f,p,y,_,E,S,C,T)=>{const v=f.el=a?a.el:l(""),N=f.anchor=a?a.anchor:l("");let{patchFlag:I,dynamicChildren:$,slotScopeIds:k}=f;k&&(C=C?C.concat(k):k),a==null?(s(v,p,y),s(N,p,y),m(f.children,p,N,_,E,S,C,T)):I>0&&I&64&&$&&a.dynamicChildren?(M(a.dynamicChildren,$,p,_,E,S,C),(f.key!=null||_&&f===_.subTree)&&mi(a,f,!0)):Z(a,f,p,N,_,E,S,C,T)},W=(a,f,p,y,_,E,S,C,T)=>{f.slotScopeIds=C,a==null?f.shapeFlag&512?_.ctx.activate(f,p,y,S,T):L(f,p,y,_,E,S,T):_e(a,f,T)},L=(a,f,p,y,_,E,S)=>{const C=a.component=Vl(a,y,_);if(Tn(a)&&(C.ctx.renderer=ct),ql(C),C.asyncDep){if(_&&_.registerDep(C,X),!a.el){const T=C.subTree=ae(ve);g(null,T,f,p)}return}X(C,a,f,p,_,E,S)},_e=(a,f,p)=>{const y=f.component=a.component;if(nl(a,f,p))if(y.asyncDep&&!y.asyncResolved){ne(y,f,p);return}else y.next=f,Jo(y.update),y.update();else f.el=a.el,y.vnode=f},X=(a,f,p,y,_,E,S)=>{const C=()=>{if(a.isMounted){let{next:N,bu:I,u:$,parent:k,vnode:V}=a,G=N,Q;Qe(a,!1),N?(N.el=V.el,ne(a,N,S)):N=V,I&&Fn(I),(Q=N.props&&N.props.onVnodeBeforeUpdate)&&Ce(Q,k,N,V),Qe(a,!0);const re=Mn(a),Te=a.subTree;a.subTree=re,O(Te,re,h(Te.el),Ut(Te),a,_,E),N.el=re.el,G===null&&sl(a,re.el),$&&he($,_),(Q=N.props&&N.props.onVnodeUpdated)&&he(()=>Ce(Q,k,N,V),_)}else{let N;const{el:I,props:$}=f,{bm:k,m:V,parent:G}=a,Q=mt(f);if(Qe(a,!1),k&&Fn(k),!Q&&(N=$&&$.onVnodeBeforeMount)&&Ce(N,G,f),Qe(a,!0),I&&In){const re=()=>{a.subTree=Mn(a),In(I,a.subTree,a,_,null)};Q?f.type.__asyncLoader().then(()=>!a.isUnmounted&&re()):re()}else{const re=a.subTree=Mn(a);O(null,re,p,y,a,_,E),f.el=re.el}if(V&&he(V,_),!Q&&(N=$&&$.onVnodeMounted)){const re=f;he(()=>Ce(N,G,re),_)}(f.shapeFlag&256||G&&mt(G.vnode)&&G.vnode.shapeFlag&256)&&a.a&&he(a.a,_),a.isMounted=!0,f=p=y=null}},T=a.effect=new us(C,()=>bs(v),a.scope),v=a.update=()=>T.run();v.id=a.uid,Qe(a,!0),v()},ne=(a,f,p)=>{f.component=a;const y=a.vnode.props;a.vnode=f,a.next=null,Rl(a,f.props,y,p),Ml(a,f.children,p),Ct(),Bs(),Et()},Z=(a,f,p,y,_,E,S,C,T=!1)=>{const v=a&&a.children,N=a?a.shapeFlag:0,I=f.children,{patchFlag:$,shapeFlag:k}=f;if($>0){if($&128){kt(v,I,p,y,_,E,S,C,T);return}else if($&256){Je(v,I,p,y,_,E,S,C,T);return}}k&8?(N&16&&Ne(v,_,E),I!==v&&d(p,I)):N&16?k&16?kt(v,I,p,y,_,E,S,C,T):Ne(v,_,E,!0):(N&8&&d(p,""),k&16&&m(I,p,y,_,E,S,C,T))},Je=(a,f,p,y,_,E,S,C,T)=>{a=a||dt,f=f||dt;const v=a.length,N=f.length,I=Math.min(v,N);let $;for($=0;$N?Ne(a,_,E,!0,!1,I):m(f,p,y,_,E,S,C,T,I)},kt=(a,f,p,y,_,E,S,C,T)=>{let v=0;const N=f.length;let I=a.length-1,$=N-1;for(;v<=I&&v<=$;){const k=a[v],V=f[v]=T?Ke(f[v]):Ae(f[v]);if(tt(k,V))O(k,V,p,null,_,E,S,C,T);else break;v++}for(;v<=I&&v<=$;){const k=a[I],V=f[$]=T?Ke(f[$]):Ae(f[$]);if(tt(k,V))O(k,V,p,null,_,E,S,C,T);else break;I--,$--}if(v>I){if(v<=$){const k=$+1,V=k$)for(;v<=I;)Re(a[v],_,E,!0),v++;else{const k=v,V=v,G=new Map;for(v=V;v<=$;v++){const ye=f[v]=T?Ke(f[v]):Ae(f[v]);ye.key!=null&&G.set(ye.key,v)}let Q,re=0;const Te=$-V+1;let at=!1,Ps=0;const Tt=new Array(Te);for(v=0;v=Te){Re(ye,_,E,!0);continue}let Ie;if(ye.key!=null)Ie=G.get(ye.key);else for(Q=V;Q<=$;Q++)if(Tt[Q-V]===0&&tt(ye,f[Q])){Ie=Q;break}Ie===void 0?Re(ye,_,E,!0):(Tt[Ie-V]=v+1,Ie>=Ps?Ps=Ie:at=!0,O(ye,f[Ie],p,null,_,E,S,C,T),re++)}const Rs=at?Hl(Tt):dt;for(Q=Rs.length-1,v=Te-1;v>=0;v--){const ye=V+v,Ie=f[ye],Is=ye+1{const{el:E,type:S,transition:C,children:T,shapeFlag:v}=a;if(v&6){Xe(a.component.subTree,f,p,y);return}if(v&128){a.suspense.move(f,p,y);return}if(v&64){S.move(a,f,p,ct);return}if(S===pe){s(E,f,p);for(let I=0;IC.enter(E),_);else{const{leave:I,delayLeave:$,afterLeave:k}=C,V=()=>s(E,f,p),G=()=>{I(E,()=>{V(),k&&k()})};$?$(E,V,G):G()}else s(E,f,p)},Re=(a,f,p,y=!1,_=!1)=>{const{type:E,props:S,ref:C,children:T,dynamicChildren:v,shapeFlag:N,patchFlag:I,dirs:$}=a;if(C!=null&&fn(C,null,p,a,!0),N&256){f.ctx.deactivate(a);return}const k=N&1&&$,V=!mt(a);let G;if(V&&(G=S&&S.onVnodeBeforeUnmount)&&Ce(G,f,a),N&6)Wi(a.component,p,y);else{if(N&128){a.suspense.unmount(p,y);return}k&&Fe(a,null,f,"beforeUnmount"),N&64?a.type.remove(a,f,p,_,ct,y):v&&(E!==pe||I>0&&I&64)?Ne(v,f,p,!1,!0):(E===pe&&I&384||!_&&N&16)&&Ne(T,f,p),y&&Ss(a)}(V&&(G=S&&S.onVnodeUnmounted)||k)&&he(()=>{G&&Ce(G,f,a),k&&Fe(a,null,f,"unmounted")},p)},Ss=a=>{const{type:f,el:p,anchor:y,transition:_}=a;if(f===pe){Ki(p,y);return}if(f===Ft){x(a);return}const E=()=>{r(p),_&&!_.persisted&&_.afterLeave&&_.afterLeave()};if(a.shapeFlag&1&&_&&!_.persisted){const{leave:S,delayLeave:C}=_,T=()=>S(p,E);C?C(a.el,E,T):T()}else E()},Ki=(a,f)=>{let p;for(;a!==f;)p=b(a),r(a),a=p;r(f)},Wi=(a,f,p)=>{const{bum:y,scope:_,update:E,subTree:S,um:C}=a;y&&Fn(y),_.stop(),E&&(E.active=!1,Re(S,a,f,p)),C&&he(C,f),he(()=>{a.isUnmounted=!0},f),f&&f.pendingBranch&&!f.isUnmounted&&a.asyncDep&&!a.asyncResolved&&a.suspenseId===f.pendingId&&(f.deps--,f.deps===0&&f.resolve())},Ne=(a,f,p,y=!1,_=!1,E=0)=>{for(let S=E;Sa.shapeFlag&6?Ut(a.component.subTree):a.shapeFlag&128?a.suspense.next():b(a.anchor||a.el),Os=(a,f,p)=>{a==null?f._vnode&&Re(f._vnode,null,null,!0):O(f._vnode||null,a,f,null,null,null,p),Bs(),ln(),f._vnode=a},ct={p:O,um:Re,m:Xe,r:Ss,mt:L,mc:m,pc:Z,pbc:M,n:Ut,o:e};let Rn,In;return t&&([Rn,In]=t(ct)),{render:Os,hydrate:Rn,createApp:Sl(Os,Rn)}}function Qe({effect:e,update:t},n){e.allowRecurse=t.allowRecurse=n}function mi(e,t,n=!1){const s=e.children,r=t.children;if(j(s)&&j(r))for(let i=0;i>1,e[n[l]]0&&(t[s]=n[i-1]),n[i]=s)}}for(i=n.length,o=n[i-1];i-- >0;)n[i]=o,o=t[o];return n}const jl=e=>e.__isTeleport,pe=Symbol.for("v-fgt"),bt=Symbol.for("v-txt"),ve=Symbol.for("v-cmt"),Ft=Symbol.for("v-stc"),Mt=[];let Oe=null;function _i(e=!1){Mt.push(Oe=e?null:[])}function Dl(){Mt.pop(),Oe=Mt[Mt.length-1]||null}let jt=1;function Zs(e){jt+=e}function yi(e){return e.dynamicChildren=jt>0?Oe||dt:null,Dl(),jt>0&&Oe&&Oe.push(e),e}function Pa(e,t,n,s,r,i){return yi(wi(e,t,n,s,r,i,!0))}function bi(e,t,n,s,r){return yi(ae(e,t,n,s,r,!0))}function dn(e){return e?e.__v_isVNode===!0:!1}function tt(e,t){return e.type===t.type&&e.key===t.key}const On="__vInternal",vi=({key:e})=>e??null,tn=({ref:e,ref_key:t,ref_for:n})=>(typeof e=="number"&&(e=""+e),e!=null?se(e)||le(e)||K(e)?{i:fe,r:e,k:t,f:!!n}:e:null);function wi(e,t=null,n=null,s=0,r=null,i=e===pe?0:1,o=!1,l=!1){const c={__v_isVNode:!0,__v_skip:!0,type:e,props:t,key:t&&vi(t),ref:t&&tn(t),scopeId:En,slotScopeIds:null,children:n,component:null,suspense:null,ssContent:null,ssFallback:null,dirs:null,transition:null,el:null,anchor:null,target:null,targetAnchor:null,staticCount:0,shapeFlag:i,patchFlag:s,dynamicProps:r,dynamicChildren:null,appContext:null,ctx:fe};return l?(Es(c,n),i&128&&e.normalize(c)):n&&(c.shapeFlag|=se(n)?8:16),jt>0&&!o&&Oe&&(c.patchFlag>0||i&6)&&c.patchFlag!==32&&Oe.push(c),c}const ae=Bl;function Bl(e,t=null,n=null,s=0,r=null,i=!1){if((!e||e===oi)&&(e=ve),dn(e)){const l=Ye(e,t,!0);return n&&Es(l,n),jt>0&&!i&&Oe&&(l.shapeFlag&6?Oe[Oe.indexOf(e)]=l:Oe.push(l)),l.patchFlag|=-2,l}if(Xl(e)&&(e=e.__vccOpts),t){t=kl(t);let{class:l,style:c}=t;l&&!se(l)&&(t.class=cs(l)),ee(c)&&(Ur(c)&&!j(c)&&(c=ie({},c)),t.style=ls(c))}const o=se(e)?1:rl(e)?128:jl(e)?64:ee(e)?4:K(e)?2:0;return wi(e,t,n,s,r,o,i,!0)}function kl(e){return e?Ur(e)||On in e?ie({},e):e:null}function Ye(e,t,n=!1){const{props:s,ref:r,patchFlag:i,children:o}=e,l=t?Ul(s||{},t):s;return{__v_isVNode:!0,__v_skip:!0,type:e.type,props:l,key:l&&vi(l),ref:t&&t.ref?n&&r?j(r)?r.concat(tn(t)):[r,tn(t)]:tn(t):r,scopeId:e.scopeId,slotScopeIds:e.slotScopeIds,children:o,target:e.target,targetAnchor:e.targetAnchor,staticCount:e.staticCount,shapeFlag:e.shapeFlag,patchFlag:t&&e.type!==pe?i===-1?16:i|16:i,dynamicProps:e.dynamicProps,dynamicChildren:e.dynamicChildren,appContext:e.appContext,dirs:e.dirs,transition:e.transition,component:e.component,suspense:e.suspense,ssContent:e.ssContent&&Ye(e.ssContent),ssFallback:e.ssFallback&&Ye(e.ssFallback),el:e.el,anchor:e.anchor,ctx:e.ctx,ce:e.ce}}function Ci(e=" ",t=0){return ae(bt,null,e,t)}function Ra(e,t){const n=ae(Ft,null,e);return n.staticCount=t,n}function Ia(e="",t=!1){return t?(_i(),bi(ve,null,e)):ae(ve,null,e)}function Ae(e){return e==null||typeof e=="boolean"?ae(ve):j(e)?ae(pe,null,e.slice()):typeof e=="object"?Ke(e):ae(bt,null,String(e))}function Ke(e){return e.el===null&&e.patchFlag!==-1||e.memo?e:Ye(e)}function Es(e,t){let n=0;const{shapeFlag:s}=e;if(t==null)t=null;else if(j(t))n=16;else if(typeof t=="object")if(s&65){const r=t.default;r&&(r._c&&(r._d=!1),Es(e,r()),r._c&&(r._d=!0));return}else{n=32;const r=t._;!r&&!(On in t)?t._ctx=fe:r===3&&fe&&(fe.slots._===1?t._=1:(t._=2,e.patchFlag|=1024))}else K(t)?(t={default:t,_ctx:fe},n=32):(t=String(t),s&64?(n=16,t=[Ci(t)]):n=8);e.children=t,e.shapeFlag|=n}function Ul(...e){const t={};for(let n=0;noe||fe;let xs,ut,Gs="__VUE_INSTANCE_SETTERS__";(ut=Un()[Gs])||(ut=Un()[Gs]=[]),ut.push(e=>oe=e),xs=e=>{ut.length>1?ut.forEach(t=>t(e)):ut[0](e)};const vt=e=>{xs(e),e.scope.on()},rt=()=>{oe&&oe.scope.off(),xs(null)};function Ei(e){return e.vnode.shapeFlag&4}let Dt=!1;function ql(e,t=!1){Dt=t;const{props:n,children:s}=e.vnode,r=Ei(e);Pl(e,n,r,t),Fl(e,s);const i=r?zl(e,t):void 0;return Dt=!1,i}function zl(e,t){const n=e.type;e.accessCache=Object.create(null),e.proxy=Rt(new Proxy(e.ctx,bl));const{setup:s}=n;if(s){const r=e.setupContext=s.length>1?Ti(e):null;vt(e),Ct();const i=Ve(s,e,0,[e.props,r]);if(Et(),rt(),Ar(i)){if(i.then(rt,rt),t)return i.then(o=>{er(e,o,t)}).catch(o=>{vn(o,e,0)});e.asyncDep=i}else er(e,i,t)}else xi(e,t)}function er(e,t,n){K(t)?e.type.__ssrInlineRender?e.ssrRender=t:e.render=t:ee(t)&&(e.setupState=qr(t)),xi(e,n)}let tr;function xi(e,t,n){const s=e.type;if(!e.render){if(!t&&tr&&!s.render){const r=s.template||ws(e).template;if(r){const{isCustomElement:i,compilerOptions:o}=e.appContext.config,{delimiters:l,compilerOptions:c}=s,u=ie(ie({isCustomElement:i,delimiters:l},o),c);s.render=tr(r,u)}}e.render=s.render||Pe}vt(e),Ct(),wl(e),Et(),rt()}function Yl(e){return e.attrsProxy||(e.attrsProxy=new Proxy(e.attrs,{get(t,n){return me(e,"get","$attrs"),t[n]}}))}function Ti(e){const t=n=>{e.exposed=n||{}};return{get attrs(){return Yl(e)},slots:e.slots,emit:e.emit,expose:t}}function Ts(e){if(e.exposed)return e.exposeProxy||(e.exposeProxy=new Proxy(qr(Rt(e.exposed)),{get(t,n){if(n in t)return t[n];if(n in It)return It[n](e)},has(t,n){return n in t||n in It}}))}function Jl(e,t=!0){return K(e)?e.displayName||e.name:e.name||t&&e.__name}function Xl(e){return K(e)&&"__vccOpts"in e}const ce=(e,t)=>qo(e,t,Dt);function Gn(e,t,n){const s=arguments.length;return s===2?ee(t)&&!j(t)?dn(t)?ae(e,null,[t]):ae(e,t):ae(e,null,t):(s>3?n=Array.prototype.slice.call(arguments,2):s===3&&dn(n)&&(n=[n]),ae(e,t,n))}const Ql=Symbol.for("v-scx"),Zl=()=>_t(Ql),Gl="3.3.4",ec="http://www.w3.org/2000/svg",nt=typeof document<"u"?document:null,nr=nt&&nt.createElement("template"),tc={insert:(e,t,n)=>{t.insertBefore(e,n||null)},remove:e=>{const t=e.parentNode;t&&t.removeChild(e)},createElement:(e,t,n,s)=>{const r=t?nt.createElementNS(ec,e):nt.createElement(e,n?{is:n}:void 0);return e==="select"&&s&&s.multiple!=null&&r.setAttribute("multiple",s.multiple),r},createText:e=>nt.createTextNode(e),createComment:e=>nt.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>nt.querySelector(e),setScopeId(e,t){e.setAttribute(t,"")},insertStaticContent(e,t,n,s,r,i){const o=n?n.previousSibling:t.lastChild;if(r&&(r===i||r.nextSibling))for(;t.insertBefore(r.cloneNode(!0),n),!(r===i||!(r=r.nextSibling)););else{nr.innerHTML=s?`${e}`:e;const l=nr.content;if(s){const c=l.firstChild;for(;c.firstChild;)l.appendChild(c.firstChild);l.removeChild(c)}t.insertBefore(l,n)}return[o?o.nextSibling:t.firstChild,n?n.previousSibling:t.lastChild]}};function nc(e,t,n){const s=e._vtc;s&&(t=(t?[t,...s]:[...s]).join(" ")),t==null?e.removeAttribute("class"):n?e.setAttribute("class",t):e.className=t}function sc(e,t,n){const s=e.style,r=se(n);if(n&&!r){if(t&&!se(t))for(const i in t)n[i]==null&&es(s,i,"");for(const i in n)es(s,i,n[i])}else{const i=s.display;r?t!==n&&(s.cssText=n):t&&e.removeAttribute("style"),"_vod"in e&&(s.display=i)}}const sr=/\s*!important$/;function es(e,t,n){if(j(n))n.forEach(s=>es(e,t,s));else if(n==null&&(n=""),t.startsWith("--"))e.setProperty(t,n);else{const s=rc(e,t);sr.test(n)?e.setProperty(lt(s),n.replace(sr,""),"important"):e[s]=n}}const rr=["Webkit","Moz","ms"],$n={};function rc(e,t){const n=$n[t];if(n)return n;let s=Le(t);if(s!=="filter"&&s in e)return $n[t]=s;s=mn(s);for(let r=0;rHn||(fc.then(()=>Hn=0),Hn=Date.now());function hc(e,t){const n=s=>{if(!s._vts)s._vts=Date.now();else if(s._vts<=n.attached)return;xe(pc(s,n.value),t,5,[s])};return n.value=e,n.attached=dc(),n}function pc(e,t){if(j(t)){const n=e.stopImmediatePropagation;return e.stopImmediatePropagation=()=>{n.call(e),e._stopped=!0},t.map(s=>r=>!r._stopped&&s&&s(r))}else return t}const lr=/^on[a-z]/,gc=(e,t,n,s,r=!1,i,o,l,c)=>{t==="class"?nc(e,s,r):t==="style"?sc(e,n,s):Bt(t)?ss(t)||ac(e,t,n,s,o):(t[0]==="."?(t=t.slice(1),!0):t[0]==="^"?(t=t.slice(1),!1):mc(e,t,s,r))?oc(e,t,s,i,o,l,c):(t==="true-value"?e._trueValue=s:t==="false-value"&&(e._falseValue=s),ic(e,t,s,r))};function mc(e,t,n,s){return s?!!(t==="innerHTML"||t==="textContent"||t in e&&lr.test(t)&&K(n)):t==="spellcheck"||t==="draggable"||t==="translate"||t==="form"||t==="list"&&e.tagName==="INPUT"||t==="type"&&e.tagName==="TEXTAREA"||lr.test(t)&&se(n)?!1:t in e}const ke="transition",At="animation",Ai=(e,{slots:t})=>Gn(cl,_c(e),t);Ai.displayName="Transition";const Si={name:String,type:String,css:{type:Boolean,default:!0},duration:[String,Number,Object],enterFromClass:String,enterActiveClass:String,enterToClass:String,appearFromClass:String,appearActiveClass:String,appearToClass:String,leaveFromClass:String,leaveActiveClass:String,leaveToClass:String};Ai.props=ie({},ei,Si);const Ze=(e,t=[])=>{j(e)?e.forEach(n=>n(...t)):e&&e(...t)},cr=e=>e?j(e)?e.some(t=>t.length>1):e.length>1:!1;function _c(e){const t={};for(const R in e)R in Si||(t[R]=e[R]);if(e.css===!1)return t;const{name:n="v",type:s,duration:r,enterFromClass:i=`${n}-enter-from`,enterActiveClass:o=`${n}-enter-active`,enterToClass:l=`${n}-enter-to`,appearFromClass:c=i,appearActiveClass:u=o,appearToClass:d=l,leaveFromClass:h=`${n}-leave-from`,leaveActiveClass:b=`${n}-leave-active`,leaveToClass:A=`${n}-leave-to`}=e,P=yc(r),O=P&&P[0],B=P&&P[1],{onBeforeEnter:g,onEnter:w,onEnterCancelled:H,onLeave:x,onLeaveCancelled:D,onBeforeAppear:q=g,onAppear:U=w,onAppearCancelled:m=H}=t,F=(R,W,L)=>{Ge(R,W?d:l),Ge(R,W?u:o),L&&L()},M=(R,W)=>{R._isLeaving=!1,Ge(R,h),Ge(R,A),Ge(R,b),W&&W()},J=R=>(W,L)=>{const _e=R?U:w,X=()=>F(W,R,L);Ze(_e,[W,X]),ar(()=>{Ge(W,R?c:i),Ue(W,R?d:l),cr(_e)||ur(W,s,O,X)})};return ie(t,{onBeforeEnter(R){Ze(g,[R]),Ue(R,i),Ue(R,o)},onBeforeAppear(R){Ze(q,[R]),Ue(R,c),Ue(R,u)},onEnter:J(!1),onAppear:J(!0),onLeave(R,W){R._isLeaving=!0;const L=()=>M(R,W);Ue(R,h),wc(),Ue(R,b),ar(()=>{R._isLeaving&&(Ge(R,h),Ue(R,A),cr(x)||ur(R,s,B,L))}),Ze(x,[R,L])},onEnterCancelled(R){F(R,!1),Ze(H,[R])},onAppearCancelled(R){F(R,!0),Ze(m,[R])},onLeaveCancelled(R){M(R),Ze(D,[R])}})}function yc(e){if(e==null)return null;if(ee(e))return[jn(e.enter),jn(e.leave)];{const t=jn(e);return[t,t]}}function jn(e){return Zi(e)}function Ue(e,t){t.split(/\s+/).forEach(n=>n&&e.classList.add(n)),(e._vtc||(e._vtc=new Set)).add(t)}function Ge(e,t){t.split(/\s+/).forEach(s=>s&&e.classList.remove(s));const{_vtc:n}=e;n&&(n.delete(t),n.size||(e._vtc=void 0))}function ar(e){requestAnimationFrame(()=>{requestAnimationFrame(e)})}let bc=0;function ur(e,t,n,s){const r=e._endId=++bc,i=()=>{r===e._endId&&s()};if(n)return setTimeout(i,n);const{type:o,timeout:l,propCount:c}=vc(e,t);if(!o)return s();const u=o+"end";let d=0;const h=()=>{e.removeEventListener(u,b),i()},b=A=>{A.target===e&&++d>=c&&h()};setTimeout(()=>{d(n[P]||"").split(", "),r=s(`${ke}Delay`),i=s(`${ke}Duration`),o=fr(r,i),l=s(`${At}Delay`),c=s(`${At}Duration`),u=fr(l,c);let d=null,h=0,b=0;t===ke?o>0&&(d=ke,h=o,b=i.length):t===At?u>0&&(d=At,h=u,b=c.length):(h=Math.max(o,u),d=h>0?o>u?ke:At:null,b=d?d===ke?i.length:c.length:0);const A=d===ke&&/\b(transform|all)(,|$)/.test(s(`${ke}Property`).toString());return{type:d,timeout:h,propCount:b,hasTransform:A}}function fr(e,t){for(;e.lengthdr(n)+dr(e[s])))}function dr(e){return Number(e.slice(0,-1).replace(",","."))*1e3}function wc(){return document.body.offsetHeight}const Cc=["ctrl","shift","alt","meta"],Ec={stop:e=>e.stopPropagation(),prevent:e=>e.preventDefault(),self:e=>e.target!==e.currentTarget,ctrl:e=>!e.ctrlKey,shift:e=>!e.shiftKey,alt:e=>!e.altKey,meta:e=>!e.metaKey,left:e=>"button"in e&&e.button!==0,middle:e=>"button"in e&&e.button!==1,right:e=>"button"in e&&e.button!==2,exact:(e,t)=>Cc.some(n=>e[`${n}Key`]&&!t.includes(n))},Fa=(e,t)=>(n,...s)=>{for(let r=0;rn=>{if(!("key"in n))return;const s=lt(n.key);if(t.some(r=>r===s||xc[r]===s))return e(n)},Tc=ie({patchProp:gc},tc);let Dn,hr=!1;function Ac(){return Dn=hr?Dn:Nl(Tc),hr=!0,Dn}const La=(...e)=>{const t=Ac().createApp(...e),{mount:n}=t;return t.mount=s=>{const r=Sc(s);if(r)return n(r,!0,r instanceof SVGElement)},t};function Sc(e){return se(e)?document.querySelector(e):e}const Na=(e,t)=>{const n=e.__vccOpts||e;for(const[s,r]of t)n[s]=r;return n},Oc="modulepreload",Pc=function(e){return"/kano/"+e},pr={},$a=function(t,n,s){if(!n||n.length===0)return t();const r=document.getElementsByTagName("link");return Promise.all(n.map(i=>{if(i=Pc(i),i in pr)return;pr[i]=!0;const o=i.endsWith(".css"),l=o?'[rel="stylesheet"]':"";if(!!s)for(let d=r.length-1;d>=0;d--){const h=r[d];if(h.href===i&&(!o||h.rel==="stylesheet"))return}else if(document.querySelector(`link[href="${i}"]${l}`))return;const u=document.createElement("link");if(u.rel=o?"stylesheet":Oc,o||(u.as="script",u.crossOrigin=""),u.href=i,document.head.appendChild(u),o)return new Promise((d,h)=>{u.addEventListener("load",d),u.addEventListener("error",()=>h(new Error(`Unable to preload CSS for ${i}`)))})})).then(()=>t()).catch(i=>{const o=new Event("vite:preloadError",{cancelable:!0});if(o.payload=i,window.dispatchEvent(o),!o.defaultPrevented)throw i})},Rc=window.__VP_SITE_DATA__;function As(e){return Ir()?(lo(e),!0):!1}function it(e){return typeof e=="function"?e():Vr(e)}const Oi=typeof window<"u"&&typeof document<"u",Ic=Object.prototype.toString,Fc=e=>Ic.call(e)==="[object Object]",Pi=()=>{},gr=Mc();function Mc(){var e;return Oi&&((e=window==null?void 0:window.navigator)==null?void 0:e.userAgent)&&/iP(ad|hone|od)/.test(window.navigator.userAgent)}function Lc(e,t){function n(...s){return new Promise((r,i)=>{Promise.resolve(e(()=>t.apply(this,s),{fn:t,thisArg:this,args:s})).then(r).catch(i)})}return n}const Ri=e=>e();function Nc(e=Ri){const t=ge(!0);function n(){t.value=!1}function s(){t.value=!0}const r=(...i)=>{t.value&&e(...i)};return{isActive:bn(t),pause:n,resume:s,eventFilter:r}}function Ii(...e){if(e.length!==1)return Ko(...e);const t=e[0];return typeof t=="function"?bn(Bo(()=>({get:t,set:Pi}))):ge(t)}function $c(e,t,n={}){const{eventFilter:s=Ri,...r}=n;return qe(e,Lc(s,t),r)}function Hc(e,t,n={}){const{eventFilter:s,...r}=n,{eventFilter:i,pause:o,resume:l,isActive:c}=Nc(s);return{stop:$c(e,t,{...r,eventFilter:i}),pause:o,resume:l,isActive:c}}function jc(e,t=!0){Pn()?xt(e):t?e():wn(e)}function Fi(e){var t;const n=it(e);return(t=n==null?void 0:n.$el)!=null?t:n}const wt=Oi?window:void 0;function hn(...e){let t,n,s,r;if(typeof e[0]=="string"||Array.isArray(e[0])?([n,s,r]=e,t=wt):[t,n,s,r]=e,!t)return Pi;Array.isArray(n)||(n=[n]),Array.isArray(s)||(s=[s]);const i=[],o=()=>{i.forEach(d=>d()),i.length=0},l=(d,h,b,A)=>(d.addEventListener(h,b,A),()=>d.removeEventListener(h,b,A)),c=qe(()=>[Fi(t),it(r)],([d,h])=>{if(o(),!d)return;const b=Fc(h)?{...h}:h;i.push(...n.flatMap(A=>s.map(P=>l(d,A,P,b))))},{immediate:!0,flush:"post"}),u=()=>{c(),o()};return As(u),u}function Dc(){const e=ge(!1);return Pn()&&xt(()=>{e.value=!0}),e}function Bc(e){const t=Dc();return ce(()=>(t.value,!!e()))}function kc(e,t={}){const{window:n=wt}=t,s=Bc(()=>n&&"matchMedia"in n&&typeof n.matchMedia=="function");let r;const i=ge(!1),o=u=>{i.value=u.matches},l=()=>{r&&("removeEventListener"in r?r.removeEventListener("change",o):r.removeListener(o))},c=Zr(()=>{s.value&&(l(),r=n.matchMedia(it(e)),"addEventListener"in r?r.addEventListener("change",o):r.addListener(o),i.value=r.matches)});return As(()=>{c(),l(),r=void 0}),i}const Qt=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{},Zt="__vueuse_ssr_handlers__",Uc=Kc();function Kc(){return Zt in Qt||(Qt[Zt]=Qt[Zt]||{}),Qt[Zt]}function Mi(e,t){return Uc[e]||t}function Wc(e){return e==null?"any":e instanceof Set?"set":e instanceof Map?"map":e instanceof Date?"date":typeof e=="boolean"?"boolean":typeof e=="string"?"string":typeof e=="object"?"object":Number.isNaN(e)?"any":"number"}const Vc={boolean:{read:e=>e==="true",write:e=>String(e)},object:{read:e=>JSON.parse(e),write:e=>JSON.stringify(e)},number:{read:e=>Number.parseFloat(e),write:e=>String(e)},any:{read:e=>e,write:e=>String(e)},string:{read:e=>e,write:e=>String(e)},map:{read:e=>new Map(JSON.parse(e)),write:e=>JSON.stringify(Array.from(e.entries()))},set:{read:e=>new Set(JSON.parse(e)),write:e=>JSON.stringify(Array.from(e))},date:{read:e=>new Date(e),write:e=>e.toISOString()}},mr="vueuse-storage";function qc(e,t,n,s={}){var r;const{flush:i="pre",deep:o=!0,listenToStorageChanges:l=!0,writeDefaults:c=!0,mergeDefaults:u=!1,shallow:d,window:h=wt,eventFilter:b,onError:A=m=>{console.error(m)}}=s,P=(d?Kr:ge)(t);if(!n)try{n=Mi("getDefaultStorage",()=>{var m;return(m=wt)==null?void 0:m.localStorage})()}catch(m){A(m)}if(!n)return P;const O=it(t),B=Wc(O),g=(r=s.serializer)!=null?r:Vc[B],{pause:w,resume:H}=Hc(P,()=>x(P.value),{flush:i,deep:o,eventFilter:b});return h&&l&&(hn(h,"storage",U),hn(h,mr,q)),U(),P;function x(m){try{if(m==null)n.removeItem(e);else{const F=g.write(m),M=n.getItem(e);M!==F&&(n.setItem(e,F),h&&h.dispatchEvent(new CustomEvent(mr,{detail:{key:e,oldValue:M,newValue:F,storageArea:n}})))}}catch(F){A(F)}}function D(m){const F=m?m.newValue:n.getItem(e);if(F==null)return c&&O!==null&&n.setItem(e,g.write(O)),O;if(!m&&u){const M=g.read(F);return typeof u=="function"?u(M,O):B==="object"&&!Array.isArray(M)?{...O,...M}:M}else return typeof F!="string"?F:g.read(F)}function q(m){U(m.detail)}function U(m){if(!(m&&m.storageArea!==n)){if(m&&m.key==null){P.value=O;return}if(!(m&&m.key!==e)){w();try{(m==null?void 0:m.newValue)!==g.write(P.value)&&(P.value=D(m))}catch(F){A(F)}finally{m?wn(H):H()}}}}}function zc(e){return kc("(prefers-color-scheme: dark)",e)}function Yc(e={}){const{selector:t="html",attribute:n="class",initialValue:s="auto",window:r=wt,storage:i,storageKey:o="vueuse-color-scheme",listenToStorageChanges:l=!0,storageRef:c,emitAuto:u,disableTransition:d=!0}=e,h={auto:"",light:"light",dark:"dark",...e.modes||{}},b=zc({window:r}),A=ce(()=>b.value?"dark":"light"),P=c||(o==null?Ii(s):qc(o,s,i,{window:r,listenToStorageChanges:l})),O=ce(()=>P.value==="auto"?A.value:P.value),B=Mi("updateHTMLAttrs",(x,D,q)=>{const U=typeof x=="string"?r==null?void 0:r.document.querySelector(x):Fi(x);if(!U)return;let m;if(d){m=r.document.createElement("style");const F="*,*::before,*::after{-webkit-transition:none!important;-moz-transition:none!important;-o-transition:none!important;-ms-transition:none!important;transition:none!important}";m.appendChild(document.createTextNode(F)),r.document.head.appendChild(m)}if(D==="class"){const F=q.split(/\s/g);Object.values(h).flatMap(M=>(M||"").split(/\s/g)).filter(Boolean).forEach(M=>{F.includes(M)?U.classList.add(M):U.classList.remove(M)})}else U.setAttribute(D,q);d&&(r.getComputedStyle(m).opacity,document.head.removeChild(m))});function g(x){var D;B(t,n,(D=h[x])!=null?D:x)}function w(x){e.onChanged?e.onChanged(x,g):g(x)}qe(O,w,{flush:"post",immediate:!0}),jc(()=>w(O.value));const H=ce({get(){return u?P.value:O.value},set(x){P.value=x}});try{return Object.assign(H,{store:P,system:A,state:O})}catch{return H}}function Jc(e={}){const{valueDark:t="dark",valueLight:n=""}=e,s=Yc({...e,onChanged:(i,o)=>{var l;e.onChanged?(l=e.onChanged)==null||l.call(e,i==="dark",o,i):o(i)},modes:{dark:t,light:n}});return ce({get(){return s.value==="dark"},set(i){const o=i?"dark":"light";s.system.value===o?s.value="auto":s.value=o}})}function Bn(e){return typeof Window<"u"&&e instanceof Window?e.document.documentElement:typeof Document<"u"&&e instanceof Document?e.documentElement:e}function Li(e){const t=window.getComputedStyle(e);if(t.overflowX==="scroll"||t.overflowY==="scroll"||t.overflowX==="auto"&&e.clientWidth1?!0:(t.preventDefault&&t.preventDefault(),!1)}function Ha(e,t=!1){const n=ge(t);let s=null,r;qe(Ii(e),l=>{const c=Bn(it(l));if(c){const u=c;r=u.style.overflow,n.value&&(u.style.overflow="hidden")}},{immediate:!0});const i=()=>{const l=Bn(it(e));!l||n.value||(gr&&(s=hn(l,"touchmove",c=>{Xc(c)},{passive:!1})),l.style.overflow="hidden",n.value=!0)},o=()=>{const l=Bn(it(e));!l||!n.value||(gr&&(s==null||s()),l.style.overflow=r,n.value=!1)};return As(o),ce({get(){return n.value},set(l){l?i():o()}})}function ja({window:e=wt}={}){if(!e)return{x:ge(0),y:ge(0)};const t=ge(e.scrollX),n=ge(e.scrollY);return hn(e,"scroll",()=>{t.value=e.scrollX,n.value=e.scrollY},{capture:!1,passive:!0}),{x:t,y:n}}const Ni=/^[a-z]+:/i,Qc="vitepress-theme-appearance",$i=/#.*$/,Zc=/(index)?\.(md|html)$/,Ee=typeof document<"u",Hi={relativePath:"",filePath:"",title:"404",description:"Not Found",headers:[],frontmatter:{sidebar:!1,layout:"page"},lastUpdated:0,isNotFound:!0};function Gc(e,t,n=!1){if(t===void 0)return!1;if(e=_r(`/${e}`),n)return new RegExp(t).test(e);if(_r(t)!==e)return!1;const s=t.match($i);return s?(Ee?location.hash:"")===s[0]:!0}function _r(e){return decodeURI(e).replace($i,"").replace(Zc,"")}function ea(e){return Ni.test(e)}function ta(e,t){var s,r,i,o,l,c,u;const n=Object.keys(e.locales).find(d=>d!=="root"&&!ea(d)&&Gc(t,`/${d}/`,!0))||"root";return Object.assign({},e,{localeIndex:n,lang:((s=e.locales[n])==null?void 0:s.lang)??e.lang,dir:((r=e.locales[n])==null?void 0:r.dir)??e.dir,title:((i=e.locales[n])==null?void 0:i.title)??e.title,titleTemplate:((o=e.locales[n])==null?void 0:o.titleTemplate)??e.titleTemplate,description:((l=e.locales[n])==null?void 0:l.description)??e.description,head:Di(e.head,((c=e.locales[n])==null?void 0:c.head)??[]),themeConfig:{...e.themeConfig,...(u=e.locales[n])==null?void 0:u.themeConfig}})}function ji(e,t){const n=t.title||e.title,s=t.titleTemplate??e.titleTemplate;if(typeof s=="string"&&s.includes(":title"))return s.replace(/:title/g,n);const r=na(e.title,s);return`${n}${r}`}function na(e,t){return t===!1?"":t===!0||t===void 0?` | ${e}`:e===t?"":` | ${t}`}function sa(e,t){const[n,s]=t;if(n!=="meta")return!1;const r=Object.entries(s)[0];return r==null?!1:e.some(([i,o])=>i===n&&o[r[0]]===r[1])}function Di(e,t){return[...e.filter(n=>!sa(t,n)),...t]}const ra=/[\u0000-\u001F"#$&*+,:;<=>?[\]^`{|}\u007F]/g,ia=/^[a-z]:/i;function yr(e){const t=ia.exec(e),n=t?t[0]:"";return n+e.slice(n.length).replace(ra,"_").replace(/(^|\/)_+(?=[^/]*$)/,"$1")}const oa=Symbol(),ot=Kr(Rc);function Da(e){const t=ce(()=>ta(ot.value,e.data.relativePath)),n=t.value.appearance,s=n==="force-dark"?ge(!0):n?Jc({storageKey:Qc,initialValue:()=>typeof n=="string"?n:"auto",...typeof n=="object"?n:{}}):ge(!1);return{site:t,theme:ce(()=>t.value.themeConfig),page:ce(()=>e.data),frontmatter:ce(()=>e.data.frontmatter),params:ce(()=>e.data.params),lang:ce(()=>t.value.lang),dir:ce(()=>t.value.dir),localeIndex:ce(()=>t.value.localeIndex||"root"),title:ce(()=>ji(t.value,e.data)),description:ce(()=>e.data.description||t.value.description),isDark:s}}function la(){const e=_t(oa);if(!e)throw new Error("vitepress data not properly injected in app");return e}function ca(e,t){return`${e}${t}`.replace(/\/+/g,"/")}function br(e){return Ni.test(e)||!e.startsWith("/")?e:ca(ot.value.base,e)}function aa(e){let t=e.replace(/\.html$/,"");if(t=decodeURIComponent(t),t=t.replace(/\/$/,"/index"),Ee){const n="/kano/";t=yr(t.slice(n.length).replace(/\//g,"_")||"index")+".md";let s=__VP_HASH_MAP__[t.toLowerCase()];if(s||(t=t.endsWith("_index.md")?t.slice(0,-9)+".md":t.slice(0,-3)+"_index.md",s=__VP_HASH_MAP__[t.toLowerCase()]),!s)return null;t=`${n}assets/${t}.${s}.js`}else t=`./${yr(t.slice(1).replace(/\//g,"_"))}.md.js`;return t}let nn=[];function Ba(e){nn.push(e),Sn(()=>{nn=nn.filter(t=>t!==e)})}const ua=Symbol(),Bi="http://a.com",fa=()=>({path:"/",component:null,data:Hi});function ka(e,t){const n=yn(fa()),s={route:n,go:r};async function r(l=Ee?location.href:"/"){var c,u;l=ts(l),await((c=s.onBeforeRouteChange)==null?void 0:c.call(s,l))!==!1&&(Cr(l),await o(l),await((u=s.onAfterRouteChanged)==null?void 0:u.call(s,l)))}let i=null;async function o(l,c=0,u=!1){var b;if(await((b=s.onBeforePageLoad)==null?void 0:b.call(s,l))===!1)return;const d=new URL(l,Bi),h=i=d.pathname;try{let A=await e(h);if(!A)throw new Error(`Page not found: ${h}`);if(i===h){i=null;const{default:P,__pageData:O}=A;if(!P)throw new Error(`Invalid route component: ${P}`);n.path=Ee?h:br(h),n.component=Rt(P),n.data=Rt(O),Ee&&wn(()=>{let B=ot.value.base+O.relativePath.replace(/(?:(^|\/)index)?\.md$/,"$1");if(!ot.value.cleanUrls&&!B.endsWith("/")&&(B+=".html"),B!==d.pathname&&(d.pathname=B,l=B+d.search+d.hash,history.replaceState(null,"",l)),d.hash&&!c){let g=null;try{g=document.getElementById(decodeURIComponent(d.hash).slice(1))}catch(w){console.warn(w)}if(g){vr(g,d.hash);return}}window.scrollTo(0,c)})}}catch(A){if(!/fetch|Page not found/.test(A.message)&&!/^\/404(\.html|\/)?$/.test(l)&&console.error(A),!u)try{const P=await fetch(ot.value.base+"hashmap.json");window.__VP_HASH_MAP__=await P.json(),await o(l,c,!0);return}catch{}i===h&&(i=null,n.path=Ee?h:br(h),n.component=t?Rt(t):null,n.data=Hi)}}return Ee&&(window.addEventListener("click",l=>{if(l.target.closest("button"))return;const u=l.target.closest("a");if(u&&!u.closest(".vp-raw")&&(u instanceof SVGElement||!u.download)){const{target:d}=u,{href:h,origin:b,pathname:A,hash:P,search:O}=new URL(u.href instanceof SVGAnimatedString?u.href.animVal:u.href,u.baseURI),B=window.location,g=A.match(/\.\w+$/);!l.ctrlKey&&!l.shiftKey&&!l.altKey&&!l.metaKey&&!d&&b===B.origin&&!(g&&g[0]!==".html")&&(l.preventDefault(),A===B.pathname&&O===B.search?(P!==B.hash&&(history.pushState(null,"",P),window.dispatchEvent(new Event("hashchange"))),P?vr(u,P,u.classList.contains("header-anchor")):(Cr(h),window.scrollTo(0,0))):r(h))}},{capture:!0}),window.addEventListener("popstate",l=>{o(ts(location.href),l.state&&l.state.scrollPosition||0)}),window.addEventListener("hashchange",l=>{l.preventDefault()})),s}function da(){const e=_t(ua);if(!e)throw new Error("useRouter() is called without provider.");return e}function ki(){return da().route}function vr(e,t,n=!1){let s=null;try{s=e.classList.contains("header-anchor")?e:document.getElementById(decodeURIComponent(t).slice(1))}catch(r){console.warn(r)}if(s){let u=function(){!n||Math.abs(c-window.scrollY)>window.innerHeight?window.scrollTo(0,c):window.scrollTo({left:0,top:c,behavior:"smooth"})},r=ot.value.scrollOffset,i=0,o=24;if(typeof r=="object"&&"padding"in r&&(o=r.padding,r=r.selector),typeof r=="number")i=r;else if(typeof r=="string")i=wr(r,o);else if(Array.isArray(r))for(const d of r){const h=wr(d,o);if(h){i=h;break}}const l=parseInt(window.getComputedStyle(s).paddingTop,10),c=window.scrollY+s.getBoundingClientRect().top-i+l;requestAnimationFrame(u)}}function wr(e,t){const n=document.querySelector(e);if(!n)return 0;const s=n.getBoundingClientRect().bottom;return s<0?0:s+t}function Cr(e){Ee&&e!==ts(location.href)&&(history.replaceState({scrollPosition:window.scrollY},document.title),history.pushState(null,"",e))}function ts(e){const t=new URL(e,Bi);return t.pathname=t.pathname.replace(/(^|\/)index(\.html)?$/,"$1"),ot.value.cleanUrls?t.pathname=t.pathname.replace(/\.html$/,""):!t.pathname.endsWith("/")&&!t.pathname.endsWith(".html")&&(t.pathname+=".html"),t.pathname+t.search+t.hash}const Er=()=>nn.forEach(e=>e()),Ua=si({name:"VitePressContent",props:{as:{type:[Object,String],default:"div"}},setup(e){const t=ki(),{site:n}=la();return()=>Gn(e.as,n.value.contentProps??{style:{position:"relative"}},[t.component?Gn(t.component,{onVnodeMounted:Er,onVnodeUpdated:Er}):"404 Page Not Found"])}}),Ka=si({setup(e,{slots:t}){const n=ge(!1);return xt(()=>{n.value=!0}),()=>n.value&&t.default?t.default():null}});function Wa(){Ee&&window.addEventListener("click",e=>{var n;const t=e.target;if(t.matches(".vp-code-group input")){const s=(n=t.parentElement)==null?void 0:n.parentElement;if(!s)return;const r=Array.from(s.querySelectorAll("input")).indexOf(t);if(r<0)return;const i=s.querySelector(".blocks");if(!i)return;const o=Array.from(i.children).find(u=>u.classList.contains("active"));if(!o)return;const l=i.children[r];if(!l||o===l)return;o.classList.remove("active"),l.classList.add("active");const c=s==null?void 0:s.querySelector(`label[for="${t.id}"]`);c==null||c.scrollIntoView({block:"nearest"})}})}function Va(){if(Ee){const e=new WeakMap;window.addEventListener("click",t=>{var s;const n=t.target;if(n.matches('div[class*="language-"] > button.copy')){const r=n.parentElement,i=(s=n.nextElementSibling)==null?void 0:s.nextElementSibling;if(!r||!i)return;const o=/language-(shellscript|shell|bash|sh|zsh)/.test(r.className);let l="";i.querySelectorAll("span.line:not(.diff.remove)").forEach(c=>l+=(c.textContent||"")+` -`),l=l.slice(0,-1),o&&(l=l.replace(/^ *(\$|>) /gm,"").trim()),ha(l).then(()=>{n.classList.add("copied"),clearTimeout(e.get(n));const c=setTimeout(()=>{n.classList.remove("copied"),n.blur(),e.delete(n)},2e3);e.set(n,c)})}})}}async function ha(e){try{return navigator.clipboard.writeText(e)}catch{const t=document.createElement("textarea"),n=document.activeElement;t.value=e,t.setAttribute("readonly",""),t.style.contain="strict",t.style.position="absolute",t.style.left="-9999px",t.style.fontSize="12pt";const s=document.getSelection(),r=s?s.rangeCount>0&&s.getRangeAt(0):null;document.body.appendChild(t),t.select(),t.selectionStart=0,t.selectionEnd=e.length,document.execCommand("copy"),document.body.removeChild(t),r&&(s.removeAllRanges(),s.addRange(r)),n&&n.focus()}}function qa(e,t){let n=[],s=!0;const r=i=>{if(s){s=!1;return}n.forEach(o=>document.head.removeChild(o)),n=[],i.forEach(o=>{const l=xr(o);document.head.appendChild(l),n.push(l)})};Zr(()=>{const i=e.data,o=t.value,l=i&&i.description,c=i&&i.frontmatter.head||[];document.title=ji(o,i);const u=l||o.description;let d=document.querySelector("meta[name=description]");d?d.setAttribute("content",u):xr(["meta",{name:"description",content:u}]),r(Di(o.head,ga(c)))})}function xr([e,t,n]){const s=document.createElement(e);for(const r in t)s.setAttribute(r,t[r]);return n&&(s.innerHTML=n),e==="script"&&!t.async&&(s.async=!1),s}function pa(e){return e[0]==="meta"&&e[1]&&e[1].name==="description"}function ga(e){return e.filter(t=>!pa(t))}const kn=new Set,Ui=()=>document.createElement("link"),ma=e=>{const t=Ui();t.rel="prefetch",t.href=e,document.head.appendChild(t)},_a=e=>{const t=new XMLHttpRequest;t.open("GET",e,t.withCredentials=!0),t.send()};let Gt;const ya=Ee&&(Gt=Ui())&&Gt.relList&&Gt.relList.supports&&Gt.relList.supports("prefetch")?ma:_a;function za(){if(!Ee||!window.IntersectionObserver)return;let e;if((e=navigator.connection)&&(e.saveData||/2g/.test(e.effectiveType)))return;const t=window.requestIdleCallback||setTimeout;let n=null;const s=()=>{n&&n.disconnect(),n=new IntersectionObserver(i=>{i.forEach(o=>{if(o.isIntersecting){const l=o.target;n.unobserve(l);const{pathname:c}=l;if(!kn.has(c)){kn.add(c);const u=aa(c);u&&ya(u)}}})}),t(()=>{document.querySelectorAll("#app a").forEach(i=>{const{hostname:o,pathname:l}=new URL(i.href instanceof SVGAnimatedString?i.href.animVal:i.href,i.baseURI),c=l.match(/\.\w+$/);c&&c[0]!==".html"||i.target!=="_blank"&&o===location.hostname&&(l!==location.pathname?n.observe(i):kn.add(l))})})};xt(s);const r=ki();qe(()=>r.path,s),Sn(()=>{n&&n.disconnect()})}export{ua as $,Ca as A,pl as B,Ea as C,Ta as D,Kr as E,pe as F,Ba as G,ae as H,xa as I,Ni as J,ki as K,Ul as L,_t as M,ls as N,wn as O,ja as P,Ra as Q,bn as R,Ha as S,Ai as T,Ol as U,Sa as V,Ma as W,Fa as X,Oa as Y,qa as Z,Na as _,Ci as a,Da as a0,oa as a1,Ua as a2,Ka as a3,ot as a4,La as a5,ka as a6,aa as a7,$a as a8,za as a9,Va as aa,Wa as ab,Gn as ac,bi as b,Pa as c,si as d,Ia as e,br as f,ce as g,ge as h,ea as i,xt as j,wi as k,Vr as l,wa as m,cs as n,_i as o,va as p,Gc as q,Aa as r,Ee as s,ba as t,la as u,kc as v,Go as w,qe as x,Zr as y,Sn as z}; diff --git a/assets/chunks/theme._JEaWtrq.js b/assets/chunks/theme._JEaWtrq.js new file mode 100644 index 00000000..aabbd601 --- /dev/null +++ b/assets/chunks/theme._JEaWtrq.js @@ -0,0 +1,169 @@ +import{d as rt,o as ie,c as ye,r as Pe,n as sn,a as Zn,t as Ut,b as ht,w as Fe,e as Je,T as yn,_ as at,u as Tl,i as hx,f as mx,g as Bc,h as X,j as Dr,k as f,l as jt,m as Ce,p as he,q as No,s as Ho,v as Ja,x as mc,y as _e,z as xs,A as Ml,B as mp,C as gp,D as gx,E as Ta,F as en,G as Nn,H as bp,I as Ss,J as We,K as yp,L as Ya,M as ks,N as Wi,O as Fn,P as bx,Q as yx,R as _p,S as Tt,U as wp,V as _x,W as wx,X as xp,Y as Do,Z as xx,$ as Sx,a0 as kx,a1 as Cx,a2 as d,a3 as qx,a4 as Ve,a5 as qt,a6 as Ll,a7 as Lr,a8 as Sp,a9 as ra,aa as Bo,ab as ia,ac as nr,ad as Ec,ae as kp,af as $x,ag as Tx,ah as Mx,ai as Cp,aj as vl}from"./framework.J61Sinzt.js";const Lx=rt({__name:"VPBadge",props:{text:{},type:{default:"tip"}},setup(e){return(t,n)=>(ie(),ye("span",{class:sn(["VPBadge",t.type])},[Pe(t.$slots,"default",{},()=>[Zn(Ut(t.text),1)])],2))}}),Ax={key:0,class:"VPBackdrop"},Px=rt({__name:"VPBackdrop",props:{show:{type:Boolean}},setup(e){return(t,n)=>(ie(),ht(yn,{name:"fade"},{default:Fe(()=>[t.show?(ie(),ye("div",Ax)):Je("",!0)]),_:1}))}}),Bx=at(Px,[["__scopeId","data-v-54a304ca"]]),At=Tl;function Ex(e,t){let n,r=!1;return()=>{n&&clearTimeout(n),r?n=setTimeout(e,t):(e(),(r=!0)&&setTimeout(()=>r=!1,t))}}function gc(e){return/^\//.test(e)?e:`/${e}`}function Fc(e){const{pathname:t,search:n,hash:r,protocol:l}=new URL(e,"http://a.com");if(hx(e)||e.startsWith("#")||!l.startsWith("http")||!mx(t))return e;const{site:i}=At(),c=t.endsWith("/")||t.endsWith(".html")?e:e.replace(/(?:(^\.+)\/)?.*$/,`$1${t.replace(/(\.md)?$/,i.value.cleanUrls?"":".html")}${n}${r}`);return Bc(c)}const Vc=X(Dr?location.hash:"");Dr&&window.addEventListener("hashchange",()=>{Vc.value=location.hash});function Al({removeCurrent:e=!0,correspondingLink:t=!1}={}){const{site:n,localeIndex:r,page:l,theme:i}=At(),c=f(()=>{var v,m;return{label:(v=n.value.locales[r.value])==null?void 0:v.label,link:((m=n.value.locales[r.value])==null?void 0:m.link)||(r.value==="root"?"/":`/${r.value}/`)}});return{localeLinks:f(()=>Object.entries(n.value.locales).flatMap(([v,m])=>e&&c.value.label===m.label?[]:{text:m.label,link:Fx(m.link||(v==="root"?"/":`/${v}/`),i.value.i18nRouting!==!1&&t,l.value.relativePath.slice(c.value.link.length-1),!n.value.cleanUrls)+Vc.value})),currentLang:c}}function Fx(e,t,n,r){return t?e.replace(/\/$/,"")+gc(n.replace(/(^|\/)index\.md$/,"$1").replace(/\.md$/,r?".html":"")):e}const Vx=e=>(No("data-v-b9c0c15a"),e=e(),Ho(),e),Ix={class:"NotFound"},Ox={class:"code"},Rx={class:"title"},zx=Vx(()=>Ce("div",{class:"divider"},null,-1)),Nx={class:"quote"},Hx={class:"action"},Dx=["href","aria-label"],Qx=rt({__name:"NotFound",setup(e){const{site:t,theme:n}=At(),{localeLinks:r}=Al({removeCurrent:!1}),l=X("/");return jt(()=>{var c;const i=window.location.pathname.replace(t.value.base,"").replace(/(^.*?\/).*$/,"/$1");r.value.length&&(l.value=((c=r.value.find(({link:u})=>u.startsWith(i)))==null?void 0:c.link)||r.value[0].link)}),(i,c)=>{var u,v,m,p,y;return ie(),ye("div",Ix,[Ce("p",Ox,Ut(((u=he(n).notFound)==null?void 0:u.code)??"404"),1),Ce("h1",Rx,Ut(((v=he(n).notFound)==null?void 0:v.title)??"PAGE NOT FOUND"),1),zx,Ce("blockquote",Nx,Ut(((m=he(n).notFound)==null?void 0:m.quote)??"But if you don't change your direction, and if you keep looking, you may end up where you are heading."),1),Ce("div",Hx,[Ce("a",{class:"link",href:he(Bc)(l.value),"aria-label":((p=he(n).notFound)==null?void 0:p.linkLabel)??"go to home"},Ut(((y=he(n).notFound)==null?void 0:y.linkText)??"Take me home"),9,Dx)])])}}}),Ux=at(Qx,[["__scopeId","data-v-b9c0c15a"]]);function qp(e,t){if(Array.isArray(e))return Ki(e);if(e==null)return[];t=gc(t);const n=Object.keys(e).sort((l,i)=>i.split("/").length-l.split("/").length).find(l=>t.startsWith(gc(l))),r=n?e[n]:[];return Array.isArray(r)?Ki(r):Ki(r.items,r.base)}function jx(e){const t=[];let n=0;for(const r in e){const l=e[r];if(l.items){n=t.push(l);continue}t[n]||t.push({items:[]}),t[n].items.push(l)}return t}function Wx(e){const t=[];function n(r){for(const l of r)l.text&&l.link&&t.push({text:l.text,link:l.link,docFooterText:l.docFooterText}),l.items&&n(l.items)}return n(e),t}function bc(e,t){return Array.isArray(t)?t.some(n=>bc(e,n)):Ja(e,t.link)?!0:t.items?bc(e,t.items):!1}function Ki(e,t){return[...e].map(n=>{const r={...n},l=r.base||t;return l&&r.link&&(r.link=l+r.link),r.items&&(r.items=Ki(r.items,l)),r})}function sa(){const{frontmatter:e,page:t,theme:n}=At(),r=mc("(min-width: 960px)"),l=X(!1),i=f(()=>{const L=n.value.sidebar,$=t.value.relativePath;return L?qp(L,$):[]}),c=X(i.value);_e(i,(L,$)=>{JSON.stringify(L)!==JSON.stringify($)&&(c.value=i.value)});const u=f(()=>e.value.sidebar!==!1&&c.value.length>0&&e.value.layout!=="home"),v=f(()=>m?e.value.aside==null?n.value.aside==="left":e.value.aside==="left":!1),m=f(()=>e.value.layout==="home"?!1:e.value.aside!=null?!!e.value.aside:n.value.aside!==!1),p=f(()=>u.value&&r.value),y=f(()=>u.value?jx(c.value):[]);function b(){l.value=!0}function g(){l.value=!1}function w(){l.value?g():b()}return{isOpen:l,sidebar:c,sidebarGroups:y,hasSidebar:u,hasAside:m,leftAside:v,isSidebarEnabled:p,open:b,close:g,toggle:w}}function Kx(e,t){let n;xs(()=>{n=e.value?document.activeElement:void 0}),jt(()=>{window.addEventListener("keyup",r)}),Ml(()=>{window.removeEventListener("keyup",r)});function r(l){l.key==="Escape"&&e.value&&(t(),n==null||n.focus())}}function Yx(e){const{page:t}=At(),n=X(!1),r=f(()=>e.value.collapsed!=null),l=f(()=>!!e.value.link),i=X(!1),c=()=>{i.value=Ja(t.value.relativePath,e.value.link)};_e([t,e,Vc],c),jt(c);const u=f(()=>i.value?!0:e.value.items?bc(t.value.relativePath,e.value.items):!1),v=f(()=>!!(e.value.items&&e.value.items.length));xs(()=>{n.value=!!(r.value&&e.value.collapsed)}),mp(()=>{(i.value||u.value)&&(n.value=!1)});function m(){r.value&&(n.value=!n.value)}return{collapsed:n,collapsible:r,isLink:l,isActiveLink:i,hasActiveLink:u,hasChildren:v,toggle:m}}function Gx(){const{hasSidebar:e}=sa(),t=mc("(min-width: 960px)"),n=mc("(min-width: 1280px)");return{isAsideEnabled:f(()=>!n.value&&!t.value?!1:e.value?n.value:t.value)}}const yc=[];function $p(e){return typeof e.outline=="object"&&!Array.isArray(e.outline)&&e.outline.label||e.outlineTitle||"On this page"}function Ic(e){const t=[...document.querySelectorAll(".VPDoc :where(h1,h2,h3,h4,h5,h6)")].filter(n=>n.id&&n.hasChildNodes()).map(n=>{const r=Number(n.tagName[1]);return{element:n,title:Xx(n),link:"#"+n.id,level:r}});return Zx(t,e)}function Xx(e){let t="";for(const n of e.childNodes)if(n.nodeType===1){if(n.classList.contains("VPBadge")||n.classList.contains("header-anchor")||n.classList.contains("ignore-header"))continue;t+=n.textContent}else n.nodeType===3&&(t+=n.textContent);return t.trim()}function Zx(e,t){if(t===!1)return[];const n=(typeof t=="object"&&!Array.isArray(t)?t.level:t)||2,[r,l]=typeof n=="number"?[n,n]:n==="deep"?[2,6]:n;e=e.filter(c=>c.level>=r&&c.level<=l),yc.length=0;for(const{element:c,link:u}of e)yc.push({element:c,link:u});const i=[];e:for(let c=0;c=0;v--){const m=e[v];if(m.level{requestAnimationFrame(i),window.addEventListener("scroll",r)}),gp(()=>{c(location.hash)}),Ml(()=>{window.removeEventListener("scroll",r)});function i(){if(!n.value)return;const u=window.scrollY,v=window.innerHeight,m=document.body.offsetHeight,p=Math.abs(u+v-m)<1,y=yc.map(({element:g,link:w})=>({link:w,top:eS(g)})).filter(({top:g})=>!Number.isNaN(g)).sort((g,w)=>g.top-w.top);if(!y.length){c(null);return}if(u<1){c(null);return}if(p){c(y[y.length-1].link);return}let b=null;for(const{link:g,top:w}of y){if(w>u+gx()+4)break;b=g}c(b)}function c(u){l&&l.classList.remove("active"),u==null?l=null:l=e.value.querySelector(`a[href="${decodeURIComponent(u)}"]`);const v=l;v?(v.classList.add("active"),t.value.style.top=v.offsetTop+39+"px",t.value.style.opacity="1"):(t.value.style.top="33px",t.value.style.opacity="0")}}function eS(e){let t=0;for(;e!==document.body;){if(e===null)return NaN;t+=e.offsetTop,e=e.offsetParent}return t}const tS=["href","title"],nS=rt({__name:"VPDocOutlineItem",props:{headers:{},root:{type:Boolean}},setup(e){function t({target:n}){const r=n.href.split("#")[1],l=document.getElementById(decodeURIComponent(r));l==null||l.focus({preventScroll:!0})}return(n,r)=>{const l=Ta("VPDocOutlineItem",!0);return ie(),ye("ul",{class:sn(["VPDocOutlineItem",n.root?"root":"nested"])},[(ie(!0),ye(en,null,Nn(n.headers,({children:i,link:c,title:u})=>(ie(),ye("li",null,[Ce("a",{class:"outline-link",href:c,onClick:t,title:u},Ut(u),9,tS),i!=null&&i.length?(ie(),ht(l,{key:0,headers:i},null,8,["headers"])):Je("",!0)]))),256))],2)}}}),Tp=at(nS,[["__scopeId","data-v-53c99d69"]]),oS=e=>(No("data-v-6b52fe58"),e=e(),Ho(),e),aS={class:"content"},rS={class:"outline-title",role:"heading","aria-level":"2"},lS={"aria-labelledby":"doc-outline-aria-label"},iS=oS(()=>Ce("span",{class:"visually-hidden",id:"doc-outline-aria-label"}," Table of Contents for current page ",-1)),sS=rt({__name:"VPDocAsideOutline",setup(e){const{frontmatter:t,theme:n}=At(),r=bp([]);Ss(()=>{r.value=Ic(t.value.outline??n.value.outline)});const l=X(),i=X();return Jx(l,i),(c,u)=>(ie(),ye("div",{class:sn(["VPDocAsideOutline",{"has-outline":r.value.length>0}]),ref_key:"container",ref:l,role:"navigation"},[Ce("div",aS,[Ce("div",{class:"outline-marker",ref_key:"marker",ref:i},null,512),Ce("div",rS,Ut(he($p)(he(n))),1),Ce("nav",lS,[iS,We(Tp,{headers:r.value,root:!0},null,8,["headers"])])])],2))}}),uS=at(sS,[["__scopeId","data-v-6b52fe58"]]),cS={class:"VPDocAsideCarbonAds"},dS=rt({__name:"VPDocAsideCarbonAds",props:{carbonAds:{}},setup(e){const t=()=>null;return(n,r)=>(ie(),ye("div",cS,[We(he(t),{"carbon-ads":n.carbonAds},null,8,["carbon-ads"])]))}}),vS=e=>(No("data-v-cb998dce"),e=e(),Ho(),e),fS={class:"VPDocAside"},pS=vS(()=>Ce("div",{class:"spacer"},null,-1)),hS=rt({__name:"VPDocAside",setup(e){const{theme:t}=At();return(n,r)=>(ie(),ye("div",fS,[Pe(n.$slots,"aside-top",{},void 0,!0),Pe(n.$slots,"aside-outline-before",{},void 0,!0),We(uS),Pe(n.$slots,"aside-outline-after",{},void 0,!0),pS,Pe(n.$slots,"aside-ads-before",{},void 0,!0),he(t).carbonAds?(ie(),ht(dS,{key:0,"carbon-ads":he(t).carbonAds},null,8,["carbon-ads"])):Je("",!0),Pe(n.$slots,"aside-ads-after",{},void 0,!0),Pe(n.$slots,"aside-bottom",{},void 0,!0)]))}}),mS=at(hS,[["__scopeId","data-v-cb998dce"]]);function gS(){const{theme:e,page:t}=At();return f(()=>{const{text:n="Edit this page",pattern:r=""}=e.value.editLink||{};let l;return typeof r=="function"?l=r(t.value):l=r.replace(/:path/g,t.value.filePath),{url:l,text:n}})}function bS(){const{page:e,theme:t,frontmatter:n}=At();return f(()=>{var v,m,p,y,b,g,w,L;const r=qp(t.value.sidebar,e.value.relativePath),l=Wx(r),i=l.findIndex($=>Ja(e.value.relativePath,$.link)),c=((v=t.value.docFooter)==null?void 0:v.prev)===!1&&!n.value.prev||n.value.prev===!1,u=((m=t.value.docFooter)==null?void 0:m.next)===!1&&!n.value.next||n.value.next===!1;return{prev:c?void 0:{text:(typeof n.value.prev=="string"?n.value.prev:typeof n.value.prev=="object"?n.value.prev.text:void 0)??((p=l[i-1])==null?void 0:p.docFooterText)??((y=l[i-1])==null?void 0:y.text),link:(typeof n.value.prev=="object"?n.value.prev.link:void 0)??((b=l[i-1])==null?void 0:b.link)},next:u?void 0:{text:(typeof n.value.next=="string"?n.value.next:typeof n.value.next=="object"?n.value.next.text:void 0)??((g=l[i+1])==null?void 0:g.docFooterText)??((w=l[i+1])==null?void 0:w.text),link:(typeof n.value.next=="object"?n.value.next.link:void 0)??((L=l[i+1])==null?void 0:L.link)}}})}const yS={},_S={xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24"},wS=Ce("path",{d:"M18,23H4c-1.7,0-3-1.3-3-3V6c0-1.7,1.3-3,3-3h7c0.6,0,1,0.4,1,1s-0.4,1-1,1H4C3.4,5,3,5.4,3,6v14c0,0.6,0.4,1,1,1h14c0.6,0,1-0.4,1-1v-7c0-0.6,0.4-1,1-1s1,0.4,1,1v7C21,21.7,19.7,23,18,23z"},null,-1),xS=Ce("path",{d:"M8,17c-0.3,0-0.5-0.1-0.7-0.3C7,16.5,6.9,16.1,7,15.8l1-4c0-0.2,0.1-0.3,0.3-0.5l9.5-9.5c1.2-1.2,3.2-1.2,4.4,0c1.2,1.2,1.2,3.2,0,4.4l-9.5,9.5c-0.1,0.1-0.3,0.2-0.5,0.3l-4,1C8.2,17,8.1,17,8,17zM9.9,12.5l-0.5,2.1l2.1-0.5l9.3-9.3c0.4-0.4,0.4-1.1,0-1.6c-0.4-0.4-1.2-0.4-1.6,0l0,0L9.9,12.5z M18.5,2.5L18.5,2.5L18.5,2.5z"},null,-1),SS=[wS,xS];function kS(e,t){return ie(),ye("svg",_S,SS)}const CS=at(yS,[["render",kS]]),zo=rt({__name:"VPLink",props:{tag:{},href:{},noIcon:{type:Boolean},target:{},rel:{}},setup(e){const t=e,n=f(()=>t.tag??(t.href?"a":"span")),r=f(()=>t.href&&yp.test(t.href));return(l,i)=>(ie(),ht(Ya(n.value),{class:sn(["VPLink",{link:l.href,"vp-external-link-icon":r.value,"no-icon":l.noIcon}]),href:l.href?he(Fc)(l.href):void 0,target:l.target??(r.value?"_blank":void 0),rel:l.rel??(r.value?"noreferrer":void 0)},{default:Fe(()=>[Pe(l.$slots,"default")]),_:3},8,["class","href","target","rel"]))}}),qS={class:"VPLastUpdated"},$S=["datetime"],TS=rt({__name:"VPDocFooterLastUpdated",setup(e){const{theme:t,page:n,frontmatter:r,lang:l}=At(),i=f(()=>new Date(r.value.lastUpdated??n.value.lastUpdated)),c=f(()=>i.value.toISOString()),u=X("");return jt(()=>{xs(()=>{var v,m,p;u.value=new Intl.DateTimeFormat((m=(v=t.value.lastUpdated)==null?void 0:v.formatOptions)!=null&&m.forceLocale?l.value:void 0,((p=t.value.lastUpdated)==null?void 0:p.formatOptions)??{dateStyle:"short",timeStyle:"short"}).format(i.value)})}),(v,m)=>{var p;return ie(),ye("p",qS,[Zn(Ut(((p=he(t).lastUpdated)==null?void 0:p.text)||he(t).lastUpdatedText||"Last updated")+": ",1),Ce("time",{datetime:c.value},Ut(u.value),9,$S)])}}}),MS=at(TS,[["__scopeId","data-v-19a7ae4e"]]),LS={key:0,class:"VPDocFooter"},AS={key:0,class:"edit-info"},PS={key:0,class:"edit-link"},BS={key:1,class:"last-updated"},ES={key:1,class:"prev-next"},FS={class:"pager"},VS=["innerHTML"],IS=["innerHTML"],OS={class:"pager"},RS=["innerHTML"],zS=["innerHTML"],NS=rt({__name:"VPDocFooter",setup(e){const{theme:t,page:n,frontmatter:r}=At(),l=gS(),i=bS(),c=f(()=>t.value.editLink&&r.value.editLink!==!1),u=f(()=>n.value.lastUpdated&&r.value.lastUpdated!==!1),v=f(()=>c.value||u.value||i.value.prev||i.value.next);return(m,p)=>{var y,b,g,w;return v.value?(ie(),ye("footer",LS,[Pe(m.$slots,"doc-footer-before",{},void 0,!0),c.value||u.value?(ie(),ye("div",AS,[c.value?(ie(),ye("div",PS,[We(zo,{class:"edit-link-button",href:he(l).url,"no-icon":!0},{default:Fe(()=>[We(CS,{class:"edit-link-icon","aria-label":"edit icon"}),Zn(" "+Ut(he(l).text),1)]),_:1},8,["href"])])):Je("",!0),u.value?(ie(),ye("div",BS,[We(MS)])):Je("",!0)])):Je("",!0),(y=he(i).prev)!=null&&y.link||(b=he(i).next)!=null&&b.link?(ie(),ye("nav",ES,[Ce("div",FS,[(g=he(i).prev)!=null&&g.link?(ie(),ht(zo,{key:0,class:"pager-link prev",href:he(i).prev.link},{default:Fe(()=>{var L;return[Ce("span",{class:"desc",innerHTML:((L=he(t).docFooter)==null?void 0:L.prev)||"Previous page"},null,8,VS),Ce("span",{class:"title",innerHTML:he(i).prev.text},null,8,IS)]}),_:1},8,["href"])):Je("",!0)]),Ce("div",OS,[(w=he(i).next)!=null&&w.link?(ie(),ht(zo,{key:0,class:"pager-link next",href:he(i).next.link},{default:Fe(()=>{var L;return[Ce("span",{class:"desc",innerHTML:((L=he(t).docFooter)==null?void 0:L.next)||"Next page"},null,8,RS),Ce("span",{class:"title",innerHTML:he(i).next.text},null,8,zS)]}),_:1},8,["href"])):Je("",!0)])])):Je("",!0)])):Je("",!0)}}}),HS=at(NS,[["__scopeId","data-v-b4b63abf"]]),DS=e=>(No("data-v-e6f2a212"),e=e(),Ho(),e),QS={class:"container"},US=DS(()=>Ce("div",{class:"aside-curtain"},null,-1)),jS={class:"aside-container"},WS={class:"aside-content"},KS={class:"content"},YS={class:"content-container"},GS={class:"main"},XS=rt({__name:"VPDoc",setup(e){const{theme:t}=At(),n=ks(),{hasSidebar:r,hasAside:l,leftAside:i}=sa(),c=f(()=>n.path.replace(/[./]+/g,"_").replace(/_html$/,""));return(u,v)=>{const m=Ta("Content");return ie(),ye("div",{class:sn(["VPDoc",{"has-sidebar":he(r),"has-aside":he(l)}])},[Pe(u.$slots,"doc-top",{},void 0,!0),Ce("div",QS,[he(l)?(ie(),ye("div",{key:0,class:sn(["aside",{"left-aside":he(i)}])},[US,Ce("div",jS,[Ce("div",WS,[We(mS,null,{"aside-top":Fe(()=>[Pe(u.$slots,"aside-top",{},void 0,!0)]),"aside-bottom":Fe(()=>[Pe(u.$slots,"aside-bottom",{},void 0,!0)]),"aside-outline-before":Fe(()=>[Pe(u.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":Fe(()=>[Pe(u.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":Fe(()=>[Pe(u.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":Fe(()=>[Pe(u.$slots,"aside-ads-after",{},void 0,!0)]),_:3})])])],2)):Je("",!0),Ce("div",KS,[Ce("div",YS,[Pe(u.$slots,"doc-before",{},void 0,!0),Ce("main",GS,[We(m,{class:sn(["vp-doc",[c.value,he(t).externalLinkIcon&&"external-link-icon-enabled"]])},null,8,["class"])]),We(HS,null,{"doc-footer-before":Fe(()=>[Pe(u.$slots,"doc-footer-before",{},void 0,!0)]),_:3}),Pe(u.$slots,"doc-after",{},void 0,!0)])])]),Pe(u.$slots,"doc-bottom",{},void 0,!0)],2)}}}),ZS=at(XS,[["__scopeId","data-v-e6f2a212"]]),JS=rt({__name:"VPButton",props:{tag:{},size:{default:"medium"},theme:{default:"brand"},text:{},href:{}},setup(e){const t=e,n=f(()=>t.href&&yp.test(t.href)),r=f(()=>t.tag||t.href?"a":"button");return(l,i)=>(ie(),ht(Ya(r.value),{class:sn(["VPButton",[l.size,l.theme]]),href:l.href?he(Fc)(l.href):void 0,target:n.value?"_blank":void 0,rel:n.value?"noreferrer":void 0},{default:Fe(()=>[Zn(Ut(l.text),1)]),_:1},8,["class","href","target","rel"]))}}),ek=at(JS,[["__scopeId","data-v-1e76fe75"]]),tk=["src","alt"],nk=rt({inheritAttrs:!1,__name:"VPImage",props:{image:{},alt:{}},setup(e){return(t,n)=>{const r=Ta("VPImage",!0);return t.image?(ie(),ye(en,{key:0},[typeof t.image=="string"||"src"in t.image?(ie(),ye("img",Wi({key:0,class:"VPImage"},typeof t.image=="string"?t.$attrs:{...t.image,...t.$attrs},{src:he(Bc)(typeof t.image=="string"?t.image:t.image.src),alt:t.alt??(typeof t.image=="string"?"":t.image.alt||"")}),null,16,tk)):(ie(),ye(en,{key:1},[We(r,Wi({class:"dark",image:t.image.dark,alt:t.image.alt},t.$attrs),null,16,["image","alt"]),We(r,Wi({class:"light",image:t.image.light,alt:t.image.alt},t.$attrs),null,16,["image","alt"])],64))],64)):Je("",!0)}}}),es=at(nk,[["__scopeId","data-v-ab19afbb"]]),ok=e=>(No("data-v-5a3e9999"),e=e(),Ho(),e),ak={class:"container"},rk={class:"main"},lk={key:0,class:"name"},ik=["innerHTML"],sk=["innerHTML"],uk=["innerHTML"],ck={key:0,class:"actions"},dk={key:0,class:"image"},vk={class:"image-container"},fk=ok(()=>Ce("div",{class:"image-bg"},null,-1)),pk=rt({__name:"VPHero",props:{name:{},text:{},tagline:{},image:{},actions:{}},setup(e){const t=Fn("hero-image-slot-exists");return(n,r)=>(ie(),ye("div",{class:sn(["VPHero",{"has-image":n.image||he(t)}])},[Ce("div",ak,[Ce("div",rk,[Pe(n.$slots,"home-hero-info",{},()=>[n.name?(ie(),ye("h1",lk,[Ce("span",{innerHTML:n.name,class:"clip"},null,8,ik)])):Je("",!0),n.text?(ie(),ye("p",{key:1,innerHTML:n.text,class:"text"},null,8,sk)):Je("",!0),n.tagline?(ie(),ye("p",{key:2,innerHTML:n.tagline,class:"tagline"},null,8,uk)):Je("",!0)],!0),n.actions?(ie(),ye("div",ck,[(ie(!0),ye(en,null,Nn(n.actions,l=>(ie(),ye("div",{key:l.link,class:"action"},[We(ek,{tag:"a",size:"medium",theme:l.theme,text:l.text,href:l.link},null,8,["theme","text","href"])]))),128))])):Je("",!0)]),n.image||he(t)?(ie(),ye("div",dk,[Ce("div",vk,[fk,Pe(n.$slots,"home-hero-image",{},()=>[n.image?(ie(),ht(es,{key:0,class:"image-src",image:n.image},null,8,["image"])):Je("",!0)],!0)])])):Je("",!0)])],2))}}),hk=at(pk,[["__scopeId","data-v-5a3e9999"]]),mk=rt({__name:"VPHomeHero",setup(e){const{frontmatter:t}=At();return(n,r)=>he(t).hero?(ie(),ht(hk,{key:0,class:"VPHomeHero",name:he(t).hero.name,text:he(t).hero.text,tagline:he(t).hero.tagline,image:he(t).hero.image,actions:he(t).hero.actions},{"home-hero-info":Fe(()=>[Pe(n.$slots,"home-hero-info")]),"home-hero-image":Fe(()=>[Pe(n.$slots,"home-hero-image")]),_:3},8,["name","text","tagline","image","actions"])):Je("",!0)}}),gk={},bk={xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24"},yk=Ce("path",{d:"M19.9,12.4c0.1-0.2,0.1-0.5,0-0.8c-0.1-0.1-0.1-0.2-0.2-0.3l-7-7c-0.4-0.4-1-0.4-1.4,0s-0.4,1,0,1.4l5.3,5.3H5c-0.6,0-1,0.4-1,1s0.4,1,1,1h11.6l-5.3,5.3c-0.4,0.4-0.4,1,0,1.4c0.2,0.2,0.5,0.3,0.7,0.3s0.5-0.1,0.7-0.3l7-7C19.8,12.6,19.9,12.5,19.9,12.4z"},null,-1),_k=[yk];function wk(e,t){return ie(),ye("svg",bk,_k)}const xk=at(gk,[["render",wk]]),Sk={class:"box"},kk={key:0,class:"icon"},Ck=["innerHTML"],qk=["innerHTML"],$k=["innerHTML"],Tk={key:4,class:"link-text"},Mk={class:"link-text-value"},Lk=rt({__name:"VPFeature",props:{icon:{},title:{},details:{},link:{},linkText:{},rel:{},target:{}},setup(e){return(t,n)=>(ie(),ht(zo,{class:"VPFeature",href:t.link,rel:t.rel,target:t.target,"no-icon":!0,tag:t.link?"a":"div"},{default:Fe(()=>[Ce("article",Sk,[typeof t.icon=="object"&&t.icon.wrap?(ie(),ye("div",kk,[We(es,{image:t.icon,alt:t.icon.alt,height:t.icon.height||48,width:t.icon.width||48},null,8,["image","alt","height","width"])])):typeof t.icon=="object"?(ie(),ht(es,{key:1,image:t.icon,alt:t.icon.alt,height:t.icon.height||48,width:t.icon.width||48},null,8,["image","alt","height","width"])):t.icon?(ie(),ye("div",{key:2,class:"icon",innerHTML:t.icon},null,8,Ck)):Je("",!0),Ce("h2",{class:"title",innerHTML:t.title},null,8,qk),t.details?(ie(),ye("p",{key:3,class:"details",innerHTML:t.details},null,8,$k)):Je("",!0),t.linkText?(ie(),ye("div",Tk,[Ce("p",Mk,[Zn(Ut(t.linkText)+" ",1),We(xk,{class:"link-text-icon"})])])):Je("",!0)])]),_:1},8,["href","rel","target","tag"]))}}),Ak=at(Lk,[["__scopeId","data-v-ee984185"]]),Pk={key:0,class:"VPFeatures"},Bk={class:"container"},Ek={class:"items"},Fk=rt({__name:"VPFeatures",props:{features:{}},setup(e){const t=e,n=f(()=>{const r=t.features.length;if(r){if(r===2)return"grid-2";if(r===3)return"grid-3";if(r%3===0)return"grid-6";if(r>3)return"grid-4"}else return});return(r,l)=>r.features?(ie(),ye("div",Pk,[Ce("div",Bk,[Ce("div",Ek,[(ie(!0),ye(en,null,Nn(r.features,i=>(ie(),ye("div",{key:i.title,class:sn(["item",[n.value]])},[We(Ak,{icon:i.icon,title:i.title,details:i.details,link:i.link,"link-text":i.linkText,rel:i.rel,target:i.target},null,8,["icon","title","details","link","link-text","rel","target"])],2))),128))])])])):Je("",!0)}}),Vk=at(Fk,[["__scopeId","data-v-b1eea84a"]]),Ik=rt({__name:"VPHomeFeatures",setup(e){const{frontmatter:t}=At();return(n,r)=>he(t).features?(ie(),ht(Vk,{key:0,class:"VPHomeFeatures",features:he(t).features},null,8,["features"])):Je("",!0)}}),Ok={class:"VPHome"},Rk=rt({__name:"VPHome",setup(e){return(t,n)=>{const r=Ta("Content");return ie(),ye("div",Ok,[Pe(t.$slots,"home-hero-before",{},void 0,!0),We(mk,null,{"home-hero-info":Fe(()=>[Pe(t.$slots,"home-hero-info",{},void 0,!0)]),"home-hero-image":Fe(()=>[Pe(t.$slots,"home-hero-image",{},void 0,!0)]),_:3}),Pe(t.$slots,"home-hero-after",{},void 0,!0),Pe(t.$slots,"home-features-before",{},void 0,!0),We(Ik),Pe(t.$slots,"home-features-after",{},void 0,!0),We(r)])}}}),zk=at(Rk,[["__scopeId","data-v-20eabd3a"]]),Nk={},Hk={class:"VPPage"};function Dk(e,t){const n=Ta("Content");return ie(),ye("div",Hk,[Pe(e.$slots,"page-top"),We(n),Pe(e.$slots,"page-bottom")])}const Qk=at(Nk,[["render",Dk]]),Uk=rt({__name:"VPContent",setup(e){const{page:t,frontmatter:n}=At(),{hasSidebar:r}=sa();return(l,i)=>(ie(),ye("div",{class:sn(["VPContent",{"has-sidebar":he(r),"is-home":he(n).layout==="home"}]),id:"VPContent"},[he(t).isNotFound?Pe(l.$slots,"not-found",{key:0},()=>[We(Ux)],!0):he(n).layout==="page"?(ie(),ht(Qk,{key:1},{"page-top":Fe(()=>[Pe(l.$slots,"page-top",{},void 0,!0)]),"page-bottom":Fe(()=>[Pe(l.$slots,"page-bottom",{},void 0,!0)]),_:3})):he(n).layout==="home"?(ie(),ht(zk,{key:2},{"home-hero-before":Fe(()=>[Pe(l.$slots,"home-hero-before",{},void 0,!0)]),"home-hero-info":Fe(()=>[Pe(l.$slots,"home-hero-info",{},void 0,!0)]),"home-hero-image":Fe(()=>[Pe(l.$slots,"home-hero-image",{},void 0,!0)]),"home-hero-after":Fe(()=>[Pe(l.$slots,"home-hero-after",{},void 0,!0)]),"home-features-before":Fe(()=>[Pe(l.$slots,"home-features-before",{},void 0,!0)]),"home-features-after":Fe(()=>[Pe(l.$slots,"home-features-after",{},void 0,!0)]),_:3})):he(n).layout&&he(n).layout!=="doc"?(ie(),ht(Ya(he(n).layout),{key:3})):(ie(),ht(ZS,{key:4},{"doc-top":Fe(()=>[Pe(l.$slots,"doc-top",{},void 0,!0)]),"doc-bottom":Fe(()=>[Pe(l.$slots,"doc-bottom",{},void 0,!0)]),"doc-footer-before":Fe(()=>[Pe(l.$slots,"doc-footer-before",{},void 0,!0)]),"doc-before":Fe(()=>[Pe(l.$slots,"doc-before",{},void 0,!0)]),"doc-after":Fe(()=>[Pe(l.$slots,"doc-after",{},void 0,!0)]),"aside-top":Fe(()=>[Pe(l.$slots,"aside-top",{},void 0,!0)]),"aside-outline-before":Fe(()=>[Pe(l.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":Fe(()=>[Pe(l.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":Fe(()=>[Pe(l.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":Fe(()=>[Pe(l.$slots,"aside-ads-after",{},void 0,!0)]),"aside-bottom":Fe(()=>[Pe(l.$slots,"aside-bottom",{},void 0,!0)]),_:3}))],2))}}),jk=at(Uk,[["__scopeId","data-v-3cf691b6"]]),Wk={class:"container"},Kk=["innerHTML"],Yk=["innerHTML"],Gk=rt({__name:"VPFooter",setup(e){const{theme:t,frontmatter:n}=At(),{hasSidebar:r}=sa();return(l,i)=>he(t).footer&&he(n).footer!==!1?(ie(),ye("footer",{key:0,class:sn(["VPFooter",{"has-sidebar":he(r)}])},[Ce("div",Wk,[he(t).footer.message?(ie(),ye("p",{key:0,class:"message",innerHTML:he(t).footer.message},null,8,Kk)):Je("",!0),he(t).footer.copyright?(ie(),ye("p",{key:1,class:"copyright",innerHTML:he(t).footer.copyright},null,8,Yk)):Je("",!0)])],2)):Je("",!0)}}),Xk=at(Gk,[["__scopeId","data-v-566314d4"]]);function Mp(){const{theme:e,frontmatter:t}=At(),n=bp([]),r=f(()=>n.value.length>0);return Ss(()=>{n.value=Ic(t.value.outline??e.value.outline)}),{headers:n,hasLocalNav:r}}const Zk={},Jk={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},e5=Ce("path",{d:"M9,19c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l5.3-5.3L8.3,6.7c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l6,6c0.4,0.4,0.4,1,0,1.4l-6,6C9.5,18.9,9.3,19,9,19z"},null,-1),t5=[e5];function n5(e,t){return ie(),ye("svg",Jk,t5)}const Lp=at(Zk,[["render",n5]]),o5={class:"header"},a5={class:"outline"},r5=rt({__name:"VPLocalNavOutlineDropdown",props:{headers:{},navHeight:{}},setup(e){const t=e,{theme:n}=At(),r=X(!1),l=X(0),i=X(),c=X();bx(i,()=>{r.value=!1}),yx("Escape",()=>{r.value=!1}),Ss(()=>{r.value=!1});function u(){r.value=!r.value,l.value=window.innerHeight+Math.min(window.scrollY-t.navHeight,0)}function v(p){p.target.classList.contains("outline-link")&&(c.value&&(c.value.style.transition="none"),Tt(()=>{r.value=!1}))}function m(){r.value=!1,window.scrollTo({top:0,left:0,behavior:"smooth"})}return(p,y)=>(ie(),ye("div",{class:"VPLocalNavOutlineDropdown",style:_p({"--vp-vh":l.value+"px"}),ref_key:"main",ref:i},[p.headers.length>0?(ie(),ye("button",{key:0,onClick:u,class:sn({open:r.value})},[Zn(Ut(he($p)(he(n)))+" ",1),We(Lp,{class:"icon"})],2)):(ie(),ye("button",{key:1,onClick:m},Ut(he(n).returnToTopLabel||"Return to top"),1)),We(yn,{name:"flyout"},{default:Fe(()=>[r.value?(ie(),ye("div",{key:0,ref_key:"items",ref:c,class:"items",onClick:v},[Ce("div",o5,[Ce("a",{class:"top-link",href:"#",onClick:m},Ut(he(n).returnToTopLabel||"Return to top"),1)]),Ce("div",a5,[We(Tp,{headers:p.headers},null,8,["headers"])])],512)):Je("",!0)]),_:1})],4))}}),l5=at(r5,[["__scopeId","data-v-2744f6e0"]]),i5={},s5={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},u5=Ce("path",{d:"M17,11H3c-0.6,0-1-0.4-1-1s0.4-1,1-1h14c0.6,0,1,0.4,1,1S17.6,11,17,11z"},null,-1),c5=Ce("path",{d:"M21,7H3C2.4,7,2,6.6,2,6s0.4-1,1-1h18c0.6,0,1,0.4,1,1S21.6,7,21,7z"},null,-1),d5=Ce("path",{d:"M21,15H3c-0.6,0-1-0.4-1-1s0.4-1,1-1h18c0.6,0,1,0.4,1,1S21.6,15,21,15z"},null,-1),v5=Ce("path",{d:"M17,19H3c-0.6,0-1-0.4-1-1s0.4-1,1-1h14c0.6,0,1,0.4,1,1S17.6,19,17,19z"},null,-1),f5=[u5,c5,d5,v5];function p5(e,t){return ie(),ye("svg",s5,f5)}const h5=at(i5,[["render",p5]]),m5={class:"container"},g5=["aria-expanded"],b5={class:"menu-text"},y5=rt({__name:"VPLocalNav",props:{open:{type:Boolean}},emits:["open-menu"],setup(e){const{theme:t,frontmatter:n}=At(),{hasSidebar:r}=sa(),{headers:l}=Mp(),{y:i}=wp(),c=X(0);jt(()=>{c.value=parseInt(getComputedStyle(document.documentElement).getPropertyValue("--vp-nav-height"))}),Ss(()=>{l.value=Ic(n.value.outline??t.value.outline)});const u=f(()=>l.value.length===0),v=f(()=>u.value&&!r.value),m=f(()=>({VPLocalNav:!0,"has-sidebar":r.value,empty:u.value,fixed:v.value}));return(p,y)=>he(n).layout!=="home"&&(!v.value||he(i)>=c.value)?(ie(),ye("div",{key:0,class:sn(m.value)},[Ce("div",m5,[he(r)?(ie(),ye("button",{key:0,class:"menu","aria-expanded":p.open,"aria-controls":"VPSidebarNav",onClick:y[0]||(y[0]=b=>p.$emit("open-menu"))},[We(h5,{class:"menu-icon"}),Ce("span",b5,Ut(he(t).sidebarMenuLabel||"Menu"),1)],8,g5)):Je("",!0),We(l5,{headers:he(l),navHeight:c.value},null,8,["headers","navHeight"])])],2)):Je("",!0)}}),_5=at(y5,[["__scopeId","data-v-b979e4d9"]]);function w5(){const e=X(!1);function t(){e.value=!0,window.addEventListener("resize",l)}function n(){e.value=!1,window.removeEventListener("resize",l)}function r(){e.value?n():t()}function l(){window.outerWidth>=768&&n()}const i=ks();return _e(()=>i.path,n),{isScreenOpen:e,openScreen:t,closeScreen:n,toggleScreen:r}}const x5={},S5={class:"VPSwitch",type:"button",role:"switch"},k5={class:"check"},C5={key:0,class:"icon"};function q5(e,t){return ie(),ye("button",S5,[Ce("span",k5,[e.$slots.default?(ie(),ye("span",C5,[Pe(e.$slots,"default",{},void 0,!0)])):Je("",!0)])])}const $5=at(x5,[["render",q5],["__scopeId","data-v-1c29e291"]]),T5={},M5={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},L5=Ce("path",{d:"M12.1,22c-0.3,0-0.6,0-0.9,0c-5.5-0.5-9.5-5.4-9-10.9c0.4-4.8,4.2-8.6,9-9c0.4,0,0.8,0.2,1,0.5c0.2,0.3,0.2,0.8-0.1,1.1c-2,2.7-1.4,6.4,1.3,8.4c2.1,1.6,5,1.6,7.1,0c0.3-0.2,0.7-0.3,1.1-0.1c0.3,0.2,0.5,0.6,0.5,1c-0.2,2.7-1.5,5.1-3.6,6.8C16.6,21.2,14.4,22,12.1,22zM9.3,4.4c-2.9,1-5,3.6-5.2,6.8c-0.4,4.4,2.8,8.3,7.2,8.7c2.1,0.2,4.2-0.4,5.8-1.8c1.1-0.9,1.9-2.1,2.4-3.4c-2.5,0.9-5.3,0.5-7.5-1.1C9.2,11.4,8.1,7.7,9.3,4.4z"},null,-1),A5=[L5];function P5(e,t){return ie(),ye("svg",M5,A5)}const B5=at(T5,[["render",P5]]),E5={},F5={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},V5=_x('',9),I5=[V5];function O5(e,t){return ie(),ye("svg",F5,I5)}const R5=at(E5,[["render",O5]]),z5=rt({__name:"VPSwitchAppearance",setup(e){const{isDark:t,theme:n}=At(),r=Fn("toggle-appearance",()=>{t.value=!t.value}),l=f(()=>t.value?n.value.lightModeSwitchTitle||"Switch to light theme":n.value.darkModeSwitchTitle||"Switch to dark theme");return(i,c)=>(ie(),ht($5,{title:l.value,class:"VPSwitchAppearance","aria-checked":he(t),onClick:he(r)},{default:Fe(()=>[We(R5,{class:"sun"}),We(B5,{class:"moon"})]),_:1},8,["title","aria-checked","onClick"]))}}),Oc=at(z5,[["__scopeId","data-v-d80abb8e"]]),N5={key:0,class:"VPNavBarAppearance"},H5=rt({__name:"VPNavBarAppearance",setup(e){const{site:t}=At();return(n,r)=>he(t).appearance&&he(t).appearance!=="force-dark"?(ie(),ye("div",N5,[We(Oc)])):Je("",!0)}}),D5=at(H5,[["__scopeId","data-v-283b26e9"]]),Rc=X();let Ap=!1,Wu=0;function Q5(e){const t=X(!1);if(Dr){!Ap&&U5(),Wu++;const n=_e(Rc,r=>{var l,i,c;r===e.el.value||(l=e.el.value)!=null&&l.contains(r)?(t.value=!0,(i=e.onFocus)==null||i.call(e)):(t.value=!1,(c=e.onBlur)==null||c.call(e))});Ml(()=>{n(),Wu--,Wu||j5()})}return wx(t)}function U5(){document.addEventListener("focusin",Pp),Ap=!0,Rc.value=document.activeElement}function j5(){document.removeEventListener("focusin",Pp)}function Pp(){Rc.value=document.activeElement}const W5={},K5={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},Y5=Ce("path",{d:"M12,16c-0.3,0-0.5-0.1-0.7-0.3l-6-6c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l5.3,5.3l5.3-5.3c0.4-0.4,1-0.4,1.4,0s0.4,1,0,1.4l-6,6C12.5,15.9,12.3,16,12,16z"},null,-1),G5=[Y5];function X5(e,t){return ie(),ye("svg",K5,G5)}const Bp=at(W5,[["render",X5]]),Z5={},J5={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},eC=Ce("circle",{cx:"12",cy:"12",r:"2"},null,-1),tC=Ce("circle",{cx:"19",cy:"12",r:"2"},null,-1),nC=Ce("circle",{cx:"5",cy:"12",r:"2"},null,-1),oC=[eC,tC,nC];function aC(e,t){return ie(),ye("svg",J5,oC)}const rC=at(Z5,[["render",aC]]),lC={class:"VPMenuLink"},iC=rt({__name:"VPMenuLink",props:{item:{}},setup(e){const{page:t}=At();return(n,r)=>(ie(),ye("div",lC,[We(zo,{class:sn({active:he(Ja)(he(t).relativePath,n.item.activeMatch||n.item.link,!!n.item.activeMatch)}),href:n.item.link,target:n.item.target,rel:n.item.rel},{default:Fe(()=>[Zn(Ut(n.item.text),1)]),_:1},8,["class","href","target","rel"])]))}}),Cs=at(iC,[["__scopeId","data-v-f51f088d"]]),sC={class:"VPMenuGroup"},uC={key:0,class:"title"},cC=rt({__name:"VPMenuGroup",props:{text:{},items:{}},setup(e){return(t,n)=>(ie(),ye("div",sC,[t.text?(ie(),ye("p",uC,Ut(t.text),1)):Je("",!0),(ie(!0),ye(en,null,Nn(t.items,r=>(ie(),ye(en,null,["link"in r?(ie(),ht(Cs,{key:0,item:r},null,8,["item"])):Je("",!0)],64))),256))]))}}),dC=at(cC,[["__scopeId","data-v-a6b0397c"]]),vC={class:"VPMenu"},fC={key:0,class:"items"},pC=rt({__name:"VPMenu",props:{items:{}},setup(e){return(t,n)=>(ie(),ye("div",vC,[t.items?(ie(),ye("div",fC,[(ie(!0),ye(en,null,Nn(t.items,r=>(ie(),ye(en,{key:r.text},["link"in r?(ie(),ht(Cs,{key:0,item:r},null,8,["item"])):(ie(),ht(dC,{key:1,text:r.text,items:r.items},null,8,["text","items"]))],64))),128))])):Je("",!0),Pe(t.$slots,"default",{},void 0,!0)]))}}),hC=at(pC,[["__scopeId","data-v-e42ed9b3"]]),mC=["aria-expanded","aria-label"],gC={key:0,class:"text"},bC=["innerHTML"],yC={class:"menu"},_C=rt({__name:"VPFlyout",props:{icon:{},button:{},label:{},items:{}},setup(e){const t=X(!1),n=X();Q5({el:n,onBlur:r});function r(){t.value=!1}return(l,i)=>(ie(),ye("div",{class:"VPFlyout",ref_key:"el",ref:n,onMouseenter:i[1]||(i[1]=c=>t.value=!0),onMouseleave:i[2]||(i[2]=c=>t.value=!1)},[Ce("button",{type:"button",class:"button","aria-haspopup":"true","aria-expanded":t.value,"aria-label":l.label,onClick:i[0]||(i[0]=c=>t.value=!t.value)},[l.button||l.icon?(ie(),ye("span",gC,[l.icon?(ie(),ht(Ya(l.icon),{key:0,class:"option-icon"})):Je("",!0),l.button?(ie(),ye("span",{key:1,innerHTML:l.button},null,8,bC)):Je("",!0),We(Bp,{class:"text-icon"})])):(ie(),ht(rC,{key:1,class:"icon"}))],8,mC),Ce("div",yC,[We(hC,{items:l.items},{default:Fe(()=>[Pe(l.$slots,"default",{},void 0,!0)]),_:3},8,["items"])])],544))}}),zc=at(_C,[["__scopeId","data-v-aa8de344"]]),wC={discord:'Discord',facebook:'Facebook',github:'GitHub',instagram:'Instagram',linkedin:'LinkedIn',mastodon:'Mastodon',npm:'npm',slack:'Slack',twitter:'Twitter',x:'X',youtube:'YouTube'},xC=["href","aria-label","innerHTML"],SC=rt({__name:"VPSocialLink",props:{icon:{},link:{},ariaLabel:{}},setup(e){const t=e,n=f(()=>typeof t.icon=="object"?t.icon.svg:wC[t.icon]);return(r,l)=>(ie(),ye("a",{class:"VPSocialLink no-icon",href:r.link,"aria-label":r.ariaLabel??(typeof r.icon=="string"?r.icon:""),target:"_blank",rel:"noopener",innerHTML:n.value},null,8,xC))}}),kC=at(SC,[["__scopeId","data-v-16cf740a"]]),CC={class:"VPSocialLinks"},qC=rt({__name:"VPSocialLinks",props:{links:{}},setup(e){return(t,n)=>(ie(),ye("div",CC,[(ie(!0),ye(en,null,Nn(t.links,({link:r,icon:l,ariaLabel:i})=>(ie(),ht(kC,{key:r,icon:l,link:r,ariaLabel:i},null,8,["icon","link","ariaLabel"]))),128))]))}}),Nc=at(qC,[["__scopeId","data-v-e71e869c"]]),$C={key:0,class:"group translations"},TC={class:"trans-title"},MC={key:1,class:"group"},LC={class:"item appearance"},AC={class:"label"},PC={class:"appearance-action"},BC={key:2,class:"group"},EC={class:"item social-links"},FC=rt({__name:"VPNavBarExtra",setup(e){const{site:t,theme:n}=At(),{localeLinks:r,currentLang:l}=Al({correspondingLink:!0}),i=f(()=>r.value.length&&l.value.label||t.value.appearance||n.value.socialLinks);return(c,u)=>i.value?(ie(),ht(zc,{key:0,class:"VPNavBarExtra",label:"extra navigation"},{default:Fe(()=>[he(r).length&&he(l).label?(ie(),ye("div",$C,[Ce("p",TC,Ut(he(l).label),1),(ie(!0),ye(en,null,Nn(he(r),v=>(ie(),ht(Cs,{key:v.link,item:v},null,8,["item"]))),128))])):Je("",!0),he(t).appearance&&he(t).appearance!=="force-dark"?(ie(),ye("div",MC,[Ce("div",LC,[Ce("p",AC,Ut(he(n).darkModeSwitchLabel||"Appearance"),1),Ce("div",PC,[We(Oc)])])])):Je("",!0),he(n).socialLinks?(ie(),ye("div",BC,[Ce("div",EC,[We(Nc,{class:"social-links-list",links:he(n).socialLinks},null,8,["links"])])])):Je("",!0)]),_:1})):Je("",!0)}}),VC=at(FC,[["__scopeId","data-v-8e87c032"]]),IC=e=>(No("data-v-6bee1efd"),e=e(),Ho(),e),OC=["aria-expanded"],RC=IC(()=>Ce("span",{class:"container"},[Ce("span",{class:"top"}),Ce("span",{class:"middle"}),Ce("span",{class:"bottom"})],-1)),zC=[RC],NC=rt({__name:"VPNavBarHamburger",props:{active:{type:Boolean}},emits:["click"],setup(e){return(t,n)=>(ie(),ye("button",{type:"button",class:sn(["VPNavBarHamburger",{active:t.active}]),"aria-label":"mobile navigation","aria-expanded":t.active,"aria-controls":"VPNavScreen",onClick:n[0]||(n[0]=r=>t.$emit("click"))},zC,10,OC))}}),HC=at(NC,[["__scopeId","data-v-6bee1efd"]]),DC=["innerHTML"],QC=rt({__name:"VPNavBarMenuLink",props:{item:{}},setup(e){const{page:t}=At();return(n,r)=>(ie(),ht(zo,{class:sn({VPNavBarMenuLink:!0,active:he(Ja)(he(t).relativePath,n.item.activeMatch||n.item.link,!!n.item.activeMatch)}),href:n.item.link,target:n.item.target,rel:n.item.rel,tabindex:"0"},{default:Fe(()=>[Ce("span",{innerHTML:n.item.text},null,8,DC)]),_:1},8,["class","href","target","rel"]))}}),UC=at(QC,[["__scopeId","data-v-cb318fec"]]),jC=rt({__name:"VPNavBarMenuGroup",props:{item:{}},setup(e){const t=e,{page:n}=At(),r=i=>"link"in i?Ja(n.value.relativePath,i.link,!!t.item.activeMatch):i.items.some(r),l=f(()=>r(t.item));return(i,c)=>(ie(),ht(zc,{class:sn({VPNavBarMenuGroup:!0,active:he(Ja)(he(n).relativePath,i.item.activeMatch,!!i.item.activeMatch)||l.value}),button:i.item.text,items:i.item.items},null,8,["class","button","items"]))}}),WC=e=>(No("data-v-f732b5d0"),e=e(),Ho(),e),KC={key:0,"aria-labelledby":"main-nav-aria-label",class:"VPNavBarMenu"},YC=WC(()=>Ce("span",{id:"main-nav-aria-label",class:"visually-hidden"},"Main Navigation",-1)),GC=rt({__name:"VPNavBarMenu",setup(e){const{theme:t}=At();return(n,r)=>he(t).nav?(ie(),ye("nav",KC,[YC,(ie(!0),ye(en,null,Nn(he(t).nav,l=>(ie(),ye(en,{key:l.text},["link"in l?(ie(),ht(UC,{key:0,item:l},null,8,["item"])):(ie(),ht(jC,{key:1,item:l},null,8,["item"]))],64))),128))])):Je("",!0)}}),XC=at(GC,[["__scopeId","data-v-f732b5d0"]]);function ZC(e){const{localeIndex:t,theme:n}=At();function r(l){var w,L,$;const i=l.split("."),c=(w=n.value.search)==null?void 0:w.options,u=c&&typeof c=="object",v=u&&(($=(L=c.locales)==null?void 0:L[t.value])==null?void 0:$.translations)||null,m=u&&c.translations||null;let p=v,y=m,b=e;const g=i.pop();for(const F of i){let A=null;const S=b==null?void 0:b[F];S&&(A=b=S);const x=y==null?void 0:y[F];x&&(A=y=x);const P=p==null?void 0:p[F];P&&(A=p=P),S||(b=A),x||(y=A),P||(p=A)}return(p==null?void 0:p[g])??(y==null?void 0:y[g])??(b==null?void 0:b[g])??""}return r}const JC=["aria-label"],e3={class:"DocSearch-Button-Container"},t3=Ce("svg",{class:"DocSearch-Search-Icon",width:"20",height:"20",viewBox:"0 0 20 20","aria-label":"search icon"},[Ce("path",{d:"M14.386 14.386l4.0877 4.0877-4.0877-4.0877c-2.9418 2.9419-7.7115 2.9419-10.6533 0-2.9419-2.9418-2.9419-7.7115 0-10.6533 2.9418-2.9419 7.7115-2.9419 10.6533 0 2.9419 2.9418 2.9419 7.7115 0 10.6533z",stroke:"currentColor",fill:"none","fill-rule":"evenodd","stroke-linecap":"round","stroke-linejoin":"round"})],-1),n3={class:"DocSearch-Button-Placeholder"},o3=Ce("span",{class:"DocSearch-Button-Keys"},[Ce("kbd",{class:"DocSearch-Button-Key"}),Ce("kbd",{class:"DocSearch-Button-Key"},"K")],-1),Qv=rt({__name:"VPNavBarSearchButton",setup(e){const n=ZC({button:{buttonText:"Search",buttonAriaLabel:"Search"}});return(r,l)=>(ie(),ye("button",{type:"button",class:"DocSearch DocSearch-Button","aria-label":he(n)("button.buttonAriaLabel")},[Ce("span",e3,[t3,Ce("span",n3,Ut(he(n)("button.buttonText")),1)]),o3],8,JC))}}),a3={class:"VPNavBarSearch"},r3={id:"local-search"},l3={key:1,id:"docsearch"},i3=rt({__name:"VPNavBarSearch",setup(e){const t=()=>null,n=()=>null,{theme:r}=At(),l=X(!1),i=X(!1);jt(()=>{});function c(){l.value||(l.value=!0,setTimeout(u,16))}function u(){const p=new Event("keydown");p.key="k",p.metaKey=!0,window.dispatchEvent(p),setTimeout(()=>{document.querySelector(".DocSearch-Modal")||u()},16)}const v=X(!1),m="";return(p,y)=>{var b;return ie(),ye("div",a3,[he(m)==="local"?(ie(),ye(en,{key:0},[v.value?(ie(),ht(he(t),{key:0,onClose:y[0]||(y[0]=g=>v.value=!1)})):Je("",!0),Ce("div",r3,[We(Qv,{onClick:y[1]||(y[1]=g=>v.value=!0)})])],64)):he(m)==="algolia"?(ie(),ye(en,{key:1},[l.value?(ie(),ht(he(n),{key:0,algolia:((b=he(r).search)==null?void 0:b.options)??he(r).algolia,onVnodeBeforeMount:y[2]||(y[2]=g=>i.value=!0)},null,8,["algolia"])):Je("",!0),i.value?Je("",!0):(ie(),ye("div",l3,[We(Qv,{onClick:c})]))],64)):Je("",!0)])}}}),s3=rt({__name:"VPNavBarSocialLinks",setup(e){const{theme:t}=At();return(n,r)=>he(t).socialLinks?(ie(),ht(Nc,{key:0,class:"VPNavBarSocialLinks",links:he(t).socialLinks},null,8,["links"])):Je("",!0)}}),u3=at(s3,[["__scopeId","data-v-ef6192dc"]]),c3=["href","rel","target"],d3=rt({__name:"VPNavBarTitle",setup(e){const{site:t,theme:n}=At(),{hasSidebar:r}=sa(),{currentLang:l}=Al(),i=f(()=>{var v;return typeof n.value.logoLink=="string"?n.value.logoLink:(v=n.value.logoLink)==null?void 0:v.link}),c=f(()=>{var v;return typeof n.value.logoLink=="string"||(v=n.value.logoLink)==null?void 0:v.rel}),u=f(()=>{var v;return typeof n.value.logoLink=="string"||(v=n.value.logoLink)==null?void 0:v.target});return(v,m)=>(ie(),ye("div",{class:sn(["VPNavBarTitle",{"has-sidebar":he(r)}])},[Ce("a",{class:"title",href:i.value??he(Fc)(he(l).link),rel:c.value,target:u.value},[Pe(v.$slots,"nav-bar-title-before",{},void 0,!0),he(n).logo?(ie(),ht(es,{key:0,class:"logo",image:he(n).logo},null,8,["image"])):Je("",!0),he(n).siteTitle?(ie(),ye(en,{key:1},[Zn(Ut(he(n).siteTitle),1)],64)):he(n).siteTitle===void 0?(ie(),ye(en,{key:2},[Zn(Ut(he(t).title),1)],64)):Je("",!0),Pe(v.$slots,"nav-bar-title-after",{},void 0,!0)],8,c3)],2))}}),v3=at(d3,[["__scopeId","data-v-e4cade88"]]),f3={},p3={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},h3=Ce("path",{d:"M0 0h24v24H0z",fill:"none"},null,-1),m3=Ce("path",{d:" M12.87 15.07l-2.54-2.51.03-.03c1.74-1.94 2.98-4.17 3.71-6.53H17V4h-7V2H8v2H1v1.99h11.17C11.5 7.92 10.44 9.75 9 11.35 8.07 10.32 7.3 9.19 6.69 8h-2c.73 1.63 1.73 3.17 2.98 4.56l-5.09 5.02L4 19l5-5 3.11 3.11.76-2.04zM18.5 10h-2L12 22h2l1.12-3h4.75L21 22h2l-4.5-12zm-2.62 7l1.62-4.33L19.12 17h-3.24z ",class:"css-c4d79v"},null,-1),g3=[h3,m3];function b3(e,t){return ie(),ye("svg",p3,g3)}const Ep=at(f3,[["render",b3]]),y3={class:"items"},_3={class:"title"},w3=rt({__name:"VPNavBarTranslations",setup(e){const{theme:t}=At(),{localeLinks:n,currentLang:r}=Al({correspondingLink:!0});return(l,i)=>he(n).length&&he(r).label?(ie(),ht(zc,{key:0,class:"VPNavBarTranslations",icon:Ep,label:he(t).langMenuLabel||"Change language"},{default:Fe(()=>[Ce("div",y3,[Ce("p",_3,Ut(he(r).label),1),(ie(!0),ye(en,null,Nn(he(n),c=>(ie(),ht(Cs,{key:c.link,item:c},null,8,["item"]))),128))])]),_:1},8,["label"])):Je("",!0)}}),x3=at(w3,[["__scopeId","data-v-ff4524ae"]]),S3=e=>(No("data-v-3efcd581"),e=e(),Ho(),e),k3={class:"wrapper"},C3={class:"container"},q3={class:"title"},$3={class:"content"},T3={class:"content-body"},M3=S3(()=>Ce("div",{class:"divider"},[Ce("div",{class:"divider-line"})],-1)),L3=rt({__name:"VPNavBar",props:{isScreenOpen:{type:Boolean}},emits:["toggle-screen"],setup(e){const{y:t}=wp(),{hasSidebar:n}=sa(),{hasLocalNav:r}=Mp(),{frontmatter:l}=At(),i=X({});return mp(()=>{i.value={"has-sidebar":n.value,"has-local-nav":r.value,top:l.value.layout==="home"&&t.value===0}}),(c,u)=>(ie(),ye("div",{class:sn(["VPNavBar",i.value])},[Ce("div",k3,[Ce("div",C3,[Ce("div",q3,[We(v3,null,{"nav-bar-title-before":Fe(()=>[Pe(c.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":Fe(()=>[Pe(c.$slots,"nav-bar-title-after",{},void 0,!0)]),_:3})]),Ce("div",$3,[Ce("div",T3,[Pe(c.$slots,"nav-bar-content-before",{},void 0,!0),We(i3,{class:"search"}),We(XC,{class:"menu"}),We(x3,{class:"translations"}),We(D5,{class:"appearance"}),We(u3,{class:"social-links"}),We(VC,{class:"extra"}),Pe(c.$slots,"nav-bar-content-after",{},void 0,!0),We(HC,{class:"hamburger",active:c.isScreenOpen,onClick:u[0]||(u[0]=v=>c.$emit("toggle-screen"))},null,8,["active"])])])])]),M3],2))}}),A3=at(L3,[["__scopeId","data-v-3efcd581"]]),P3={key:0,class:"VPNavScreenAppearance"},B3={class:"text"},E3=rt({__name:"VPNavScreenAppearance",setup(e){const{site:t,theme:n}=At();return(r,l)=>he(t).appearance&&he(t).appearance!=="force-dark"?(ie(),ye("div",P3,[Ce("p",B3,Ut(he(n).darkModeSwitchLabel||"Appearance"),1),We(Oc)])):Je("",!0)}}),F3=at(E3,[["__scopeId","data-v-338d9b48"]]),V3=rt({__name:"VPNavScreenMenuLink",props:{item:{}},setup(e){const t=Fn("close-screen");return(n,r)=>(ie(),ht(zo,{class:"VPNavScreenMenuLink",href:n.item.link,target:n.item.target,rel:n.item.rel,onClick:he(t)},{default:Fe(()=>[Zn(Ut(n.item.text),1)]),_:1},8,["href","target","rel","onClick"]))}}),I3=at(V3,[["__scopeId","data-v-fe523e3d"]]),O3={},R3={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},z3=Ce("path",{d:"M18.9,10.9h-6v-6c0-0.6-0.4-1-1-1s-1,0.4-1,1v6h-6c-0.6,0-1,0.4-1,1s0.4,1,1,1h6v6c0,0.6,0.4,1,1,1s1-0.4,1-1v-6h6c0.6,0,1-0.4,1-1S19.5,10.9,18.9,10.9z"},null,-1),N3=[z3];function H3(e,t){return ie(),ye("svg",R3,N3)}const D3=at(O3,[["render",H3]]),Q3=rt({__name:"VPNavScreenMenuGroupLink",props:{item:{}},setup(e){const t=Fn("close-screen");return(n,r)=>(ie(),ht(zo,{class:"VPNavScreenMenuGroupLink",href:n.item.link,target:n.item.target,rel:n.item.rel,onClick:he(t)},{default:Fe(()=>[Zn(Ut(n.item.text),1)]),_:1},8,["href","target","rel","onClick"]))}}),Fp=at(Q3,[["__scopeId","data-v-aea78dd1"]]),U3={class:"VPNavScreenMenuGroupSection"},j3={key:0,class:"title"},W3=rt({__name:"VPNavScreenMenuGroupSection",props:{text:{},items:{}},setup(e){return(t,n)=>(ie(),ye("div",U3,[t.text?(ie(),ye("p",j3,Ut(t.text),1)):Je("",!0),(ie(!0),ye(en,null,Nn(t.items,r=>(ie(),ht(Fp,{key:r.text,item:r},null,8,["item"]))),128))]))}}),K3=at(W3,[["__scopeId","data-v-f60dbfa7"]]),Y3=["aria-controls","aria-expanded"],G3=["innerHTML"],X3=["id"],Z3={key:1,class:"group"},J3=rt({__name:"VPNavScreenMenuGroup",props:{text:{},items:{}},setup(e){const t=e,n=X(!1),r=f(()=>`NavScreenGroup-${t.text.replace(" ","-").toLowerCase()}`);function l(){n.value=!n.value}return(i,c)=>(ie(),ye("div",{class:sn(["VPNavScreenMenuGroup",{open:n.value}])},[Ce("button",{class:"button","aria-controls":r.value,"aria-expanded":n.value,onClick:l},[Ce("span",{class:"button-text",innerHTML:i.text},null,8,G3),We(D3,{class:"button-icon"})],8,Y3),Ce("div",{id:r.value,class:"items"},[(ie(!0),ye(en,null,Nn(i.items,u=>(ie(),ye(en,{key:u.text},["link"in u?(ie(),ye("div",{key:u.text,class:"item"},[We(Fp,{item:u},null,8,["item"])])):(ie(),ye("div",Z3,[We(K3,{text:u.text,items:u.items},null,8,["text","items"])]))],64))),128))],8,X3)],2))}}),e4=at(J3,[["__scopeId","data-v-32e4a89c"]]),t4={key:0,class:"VPNavScreenMenu"},n4=rt({__name:"VPNavScreenMenu",setup(e){const{theme:t}=At();return(n,r)=>he(t).nav?(ie(),ye("nav",t4,[(ie(!0),ye(en,null,Nn(he(t).nav,l=>(ie(),ye(en,{key:l.text},["link"in l?(ie(),ht(I3,{key:0,item:l},null,8,["item"])):(ie(),ht(e4,{key:1,text:l.text||"",items:l.items},null,8,["text","items"]))],64))),128))])):Je("",!0)}}),o4=rt({__name:"VPNavScreenSocialLinks",setup(e){const{theme:t}=At();return(n,r)=>he(t).socialLinks?(ie(),ht(Nc,{key:0,class:"VPNavScreenSocialLinks",links:he(t).socialLinks},null,8,["links"])):Je("",!0)}}),a4={class:"list"},r4=rt({__name:"VPNavScreenTranslations",setup(e){const{localeLinks:t,currentLang:n}=Al({correspondingLink:!0}),r=X(!1);function l(){r.value=!r.value}return(i,c)=>he(t).length&&he(n).label?(ie(),ye("div",{key:0,class:sn(["VPNavScreenTranslations",{open:r.value}])},[Ce("button",{class:"title",onClick:l},[We(Ep,{class:"icon lang"}),Zn(" "+Ut(he(n).label)+" ",1),We(Bp,{class:"icon chevron"})]),Ce("ul",a4,[(ie(!0),ye(en,null,Nn(he(t),u=>(ie(),ye("li",{key:u.link,class:"item"},[We(zo,{class:"link",href:u.link},{default:Fe(()=>[Zn(Ut(u.text),1)]),_:2},1032,["href"])]))),128))])],2)):Je("",!0)}}),l4=at(r4,[["__scopeId","data-v-41505286"]]),i4={class:"container"},s4=rt({__name:"VPNavScreen",props:{open:{type:Boolean}},setup(e){const t=X(null),n=xp(Dr?document.body:null);return(r,l)=>(ie(),ht(yn,{name:"fade",onEnter:l[0]||(l[0]=i=>n.value=!0),onAfterLeave:l[1]||(l[1]=i=>n.value=!1)},{default:Fe(()=>[r.open?(ie(),ye("div",{key:0,class:"VPNavScreen",ref_key:"screen",ref:t,id:"VPNavScreen"},[Ce("div",i4,[Pe(r.$slots,"nav-screen-content-before",{},void 0,!0),We(n4,{class:"menu"}),We(l4,{class:"translations"}),We(F3,{class:"appearance"}),We(o4,{class:"social-links"}),Pe(r.$slots,"nav-screen-content-after",{},void 0,!0)])],512)):Je("",!0)]),_:3}))}}),u4=at(s4,[["__scopeId","data-v-57cce842"]]),c4={key:0,class:"VPNav"},d4=rt({__name:"VPNav",setup(e){const{isScreenOpen:t,closeScreen:n,toggleScreen:r}=w5(),{frontmatter:l}=At(),i=f(()=>l.value.navbar!==!1);return Do("close-screen",n),xs(()=>{Dr&&document.documentElement.classList.toggle("hide-nav",!i.value)}),(c,u)=>i.value?(ie(),ye("header",c4,[We(A3,{"is-screen-open":he(t),onToggleScreen:he(r)},{"nav-bar-title-before":Fe(()=>[Pe(c.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":Fe(()=>[Pe(c.$slots,"nav-bar-title-after",{},void 0,!0)]),"nav-bar-content-before":Fe(()=>[Pe(c.$slots,"nav-bar-content-before",{},void 0,!0)]),"nav-bar-content-after":Fe(()=>[Pe(c.$slots,"nav-bar-content-after",{},void 0,!0)]),_:3},8,["is-screen-open","onToggleScreen"]),We(u4,{open:he(t)},{"nav-screen-content-before":Fe(()=>[Pe(c.$slots,"nav-screen-content-before",{},void 0,!0)]),"nav-screen-content-after":Fe(()=>[Pe(c.$slots,"nav-screen-content-after",{},void 0,!0)]),_:3},8,["open"])])):Je("",!0)}}),v4=at(d4,[["__scopeId","data-v-7ad780c2"]]),f4=e=>(No("data-v-bd01e0d5"),e=e(),Ho(),e),p4=["role","tabindex"],h4=f4(()=>Ce("div",{class:"indicator"},null,-1)),m4={key:1,class:"items"},g4=rt({__name:"VPSidebarItem",props:{item:{},depth:{}},setup(e){const t=e,{collapsed:n,collapsible:r,isLink:l,isActiveLink:i,hasActiveLink:c,hasChildren:u,toggle:v}=Yx(f(()=>t.item)),m=f(()=>u.value?"section":"div"),p=f(()=>l.value?"a":"div"),y=f(()=>u.value?t.depth+2===7?"p":`h${t.depth+2}`:"p"),b=f(()=>l.value?void 0:"button"),g=f(()=>[[`level-${t.depth}`],{collapsible:r.value},{collapsed:n.value},{"is-link":l.value},{"is-active":i.value},{"has-active":c.value}]);function w($){"key"in $&&$.key!=="Enter"||!t.item.link&&v()}function L(){t.item.link&&v()}return($,F)=>{const A=Ta("VPSidebarItem",!0);return ie(),ht(Ya(m.value),{class:sn(["VPSidebarItem",g.value])},{default:Fe(()=>[$.item.text?(ie(),ye("div",Wi({key:0,class:"item",role:b.value},xx($.item.items?{click:w,keydown:w}:{},!0),{tabindex:$.item.items&&0}),[h4,$.item.link?(ie(),ht(zo,{key:0,tag:p.value,class:"link",href:$.item.link,rel:$.item.rel,target:$.item.target},{default:Fe(()=>[(ie(),ht(Ya(y.value),{class:"text",innerHTML:$.item.text},null,8,["innerHTML"]))]),_:1},8,["tag","href","rel","target"])):(ie(),ht(Ya(y.value),{key:1,class:"text",innerHTML:$.item.text},null,8,["innerHTML"])),$.item.collapsed!=null?(ie(),ye("div",{key:2,class:"caret",role:"button","aria-label":"toggle section",onClick:L,onKeydown:Sx(L,["enter"]),tabindex:"0"},[We(Lp,{class:"caret-icon"})],32)):Je("",!0)],16,p4)):Je("",!0),$.item.items&&$.item.items.length?(ie(),ye("div",m4,[$.depth<5?(ie(!0),ye(en,{key:0},Nn($.item.items,S=>(ie(),ht(A,{key:S.text,item:S,depth:$.depth+1},null,8,["item","depth"]))),128)):Je("",!0)])):Je("",!0)]),_:1},8,["class"])}}}),b4=at(g4,[["__scopeId","data-v-bd01e0d5"]]),Vp=e=>(No("data-v-4871f9f5"),e=e(),Ho(),e),y4=Vp(()=>Ce("div",{class:"curtain"},null,-1)),_4={class:"nav",id:"VPSidebarNav","aria-labelledby":"sidebar-aria-label",tabindex:"-1"},w4=Vp(()=>Ce("span",{class:"visually-hidden",id:"sidebar-aria-label"}," Sidebar Navigation ",-1)),x4=rt({__name:"VPSidebar",props:{open:{type:Boolean}},setup(e){const{sidebarGroups:t,hasSidebar:n}=sa(),r=e,l=X(null),i=xp(Dr?document.body:null);return _e([r,l],()=>{var c;r.open?(i.value=!0,(c=l.value)==null||c.focus()):i.value=!1},{immediate:!0,flush:"post"}),(c,u)=>he(n)?(ie(),ye("aside",{key:0,class:sn(["VPSidebar",{open:c.open}]),ref_key:"navEl",ref:l,onClick:u[0]||(u[0]=kx(()=>{},["stop"]))},[y4,Ce("nav",_4,[w4,Pe(c.$slots,"sidebar-nav-before",{},void 0,!0),(ie(!0),ye(en,null,Nn(he(t),v=>(ie(),ye("div",{key:v.text,class:"group"},[We(b4,{item:v,depth:0},null,8,["item"])]))),128)),Pe(c.$slots,"sidebar-nav-after",{},void 0,!0)])],2)):Je("",!0)}}),S4=at(x4,[["__scopeId","data-v-4871f9f5"]]),k4=rt({__name:"VPSkipLink",setup(e){const t=ks(),n=X();_e(()=>t.path,()=>n.value.focus());function r({target:l}){const i=document.getElementById(decodeURIComponent(l.hash).slice(1));if(i){const c=()=>{i.removeAttribute("tabindex"),i.removeEventListener("blur",c)};i.setAttribute("tabindex","-1"),i.addEventListener("blur",c),i.focus(),window.scrollTo(0,0)}}return(l,i)=>(ie(),ye(en,null,[Ce("span",{ref_key:"backToTop",ref:n,tabindex:"-1"},null,512),Ce("a",{href:"#VPContent",class:"VPSkipLink visually-hidden",onClick:r}," Skip to content ")],64))}}),C4=at(k4,[["__scopeId","data-v-c8291ffa"]]),q4=rt({__name:"Layout",setup(e){const{isOpen:t,open:n,close:r}=sa(),l=ks();_e(()=>l.path,r),Kx(t,r);const{frontmatter:i}=At(),c=Cx(),u=f(()=>!!c["home-hero-image"]);return Do("hero-image-slot-exists",u),(v,m)=>{const p=Ta("Content");return he(i).layout!==!1?(ie(),ye("div",{key:0,class:sn(["Layout",he(i).pageClass])},[Pe(v.$slots,"layout-top",{},void 0,!0),We(C4),We(Bx,{class:"backdrop",show:he(t),onClick:he(r)},null,8,["show","onClick"]),We(v4,null,{"nav-bar-title-before":Fe(()=>[Pe(v.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":Fe(()=>[Pe(v.$slots,"nav-bar-title-after",{},void 0,!0)]),"nav-bar-content-before":Fe(()=>[Pe(v.$slots,"nav-bar-content-before",{},void 0,!0)]),"nav-bar-content-after":Fe(()=>[Pe(v.$slots,"nav-bar-content-after",{},void 0,!0)]),"nav-screen-content-before":Fe(()=>[Pe(v.$slots,"nav-screen-content-before",{},void 0,!0)]),"nav-screen-content-after":Fe(()=>[Pe(v.$slots,"nav-screen-content-after",{},void 0,!0)]),_:3}),We(_5,{open:he(t),onOpenMenu:he(n)},null,8,["open","onOpenMenu"]),We(S4,{open:he(t)},{"sidebar-nav-before":Fe(()=>[Pe(v.$slots,"sidebar-nav-before",{},void 0,!0)]),"sidebar-nav-after":Fe(()=>[Pe(v.$slots,"sidebar-nav-after",{},void 0,!0)]),_:3},8,["open"]),We(jk,null,{"page-top":Fe(()=>[Pe(v.$slots,"page-top",{},void 0,!0)]),"page-bottom":Fe(()=>[Pe(v.$slots,"page-bottom",{},void 0,!0)]),"not-found":Fe(()=>[Pe(v.$slots,"not-found",{},void 0,!0)]),"home-hero-before":Fe(()=>[Pe(v.$slots,"home-hero-before",{},void 0,!0)]),"home-hero-info":Fe(()=>[Pe(v.$slots,"home-hero-info",{},void 0,!0)]),"home-hero-image":Fe(()=>[Pe(v.$slots,"home-hero-image",{},void 0,!0)]),"home-hero-after":Fe(()=>[Pe(v.$slots,"home-hero-after",{},void 0,!0)]),"home-features-before":Fe(()=>[Pe(v.$slots,"home-features-before",{},void 0,!0)]),"home-features-after":Fe(()=>[Pe(v.$slots,"home-features-after",{},void 0,!0)]),"doc-footer-before":Fe(()=>[Pe(v.$slots,"doc-footer-before",{},void 0,!0)]),"doc-before":Fe(()=>[Pe(v.$slots,"doc-before",{},void 0,!0)]),"doc-after":Fe(()=>[Pe(v.$slots,"doc-after",{},void 0,!0)]),"doc-top":Fe(()=>[Pe(v.$slots,"doc-top",{},void 0,!0)]),"doc-bottom":Fe(()=>[Pe(v.$slots,"doc-bottom",{},void 0,!0)]),"aside-top":Fe(()=>[Pe(v.$slots,"aside-top",{},void 0,!0)]),"aside-bottom":Fe(()=>[Pe(v.$slots,"aside-bottom",{},void 0,!0)]),"aside-outline-before":Fe(()=>[Pe(v.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":Fe(()=>[Pe(v.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":Fe(()=>[Pe(v.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":Fe(()=>[Pe(v.$slots,"aside-ads-after",{},void 0,!0)]),_:3}),We(Xk),Pe(v.$slots,"layout-bottom",{},void 0,!0)],2)):(ie(),ht(p,{key:1}))}}}),$4=at(q4,[["__scopeId","data-v-9d8abc1e"]]),Ip={Layout:$4,enhanceApp:({app:e})=>{e.component("Badge",Lx)}};/*! + * Quasar Framework v2.14.2 + * (c) 2015-present Razvan Stoenescu + * Released under the MIT License. + */function qn(e,t,n,r){return Object.defineProperty(e,t,{get:n,set:r,enumerable:!0}),e}function Op(e,t){for(const n in t)qn(e,n,t[n]);return e}const so=X(!1);let qs;function T4(e,t){const n=/(edg|edge|edga|edgios)\/([\w.]+)/.exec(e)||/(opr)[\/]([\w.]+)/.exec(e)||/(vivaldi)[\/]([\w.]+)/.exec(e)||/(chrome|crios)[\/]([\w.]+)/.exec(e)||/(version)(applewebkit)[\/]([\w.]+).*(safari)[\/]([\w.]+)/.exec(e)||/(webkit)[\/]([\w.]+).*(version)[\/]([\w.]+).*(safari)[\/]([\w.]+)/.exec(e)||/(firefox|fxios)[\/]([\w.]+)/.exec(e)||/(webkit)[\/]([\w.]+)/.exec(e)||/(opera)(?:.*version|)[\/]([\w.]+)/.exec(e)||[];return{browser:n[5]||n[3]||n[1]||"",version:n[2]||n[4]||"0",versionNumber:n[4]||n[2]||"0",platform:t[0]||""}}function M4(e){return/(ipad)/.exec(e)||/(ipod)/.exec(e)||/(windows phone)/.exec(e)||/(iphone)/.exec(e)||/(kindle)/.exec(e)||/(silk)/.exec(e)||/(android)/.exec(e)||/(win)/.exec(e)||/(mac)/.exec(e)||/(linux)/.exec(e)||/(cros)/.exec(e)||/(playbook)/.exec(e)||/(bb)/.exec(e)||/(blackberry)/.exec(e)||[]}const Rp="ontouchstart"in window||window.navigator.maxTouchPoints>0;function L4(e){qs={is:{...e}},delete e.mac,delete e.desktop;const t=Math.min(window.innerHeight,window.innerWidth)>414?"ipad":"iphone";Object.assign(e,{mobile:!0,ios:!0,platform:t,[t]:!0})}function A4(e){const t=e.toLowerCase(),n=M4(t),r=T4(t,n),l={};r.browser&&(l[r.browser]=!0,l.version=r.version,l.versionNumber=parseInt(r.versionNumber,10)),r.platform&&(l[r.platform]=!0);const i=l.android||l.ios||l.bb||l.blackberry||l.ipad||l.iphone||l.ipod||l.kindle||l.playbook||l.silk||l["windows phone"];return i===!0||t.indexOf("mobile")>-1?(l.mobile=!0,l.edga||l.edgios?(l.edge=!0,r.browser="edge"):l.crios?(l.chrome=!0,r.browser="chrome"):l.fxios&&(l.firefox=!0,r.browser="firefox")):l.desktop=!0,(l.ipod||l.ipad||l.iphone)&&(l.ios=!0),l["windows phone"]&&(l.winphone=!0,delete l["windows phone"]),(l.chrome||l.opr||l.safari||l.vivaldi||l.mobile===!0&&l.ios!==!0&&i!==!0)&&(l.webkit=!0),l.edg&&(r.browser="edgechromium",l.edgeChromium=!0),(l.safari&&l.blackberry||l.bb)&&(r.browser="blackberry",l.blackberry=!0),l.safari&&l.playbook&&(r.browser="playbook",l.playbook=!0),l.opr&&(r.browser="opera",l.opera=!0),l.safari&&l.android&&(r.browser="android",l.android=!0),l.safari&&l.kindle&&(r.browser="kindle",l.kindle=!0),l.safari&&l.silk&&(r.browser="silk",l.silk=!0),l.vivaldi&&(r.browser="vivaldi",l.vivaldi=!0),l.name=r.browser,l.platform=r.platform,t.indexOf("electron")>-1?l.electron=!0:document.location.href.indexOf("-extension://")>-1?l.bex=!0:(window.Capacitor!==void 0?(l.capacitor=!0,l.nativeMobile=!0,l.nativeMobileWrapper="capacitor"):window._cordovaNative===void 0&&window.cordova===void 0||(l.cordova=!0,l.nativeMobile=!0,l.nativeMobileWrapper="cordova"),Rp===!0&&l.mac===!0&&(l.desktop===!0&&l.safari===!0||l.nativeMobile===!0&&l.android!==!0&&l.ios!==!0&&l.ipad!==!0)&&L4(l)),l}const Uv=navigator.userAgent||navigator.vendor||window.opera,P4={has:{touch:!1,webStorage:!1},within:{iframe:!1}},ut={userAgent:Uv,is:A4(Uv),has:{touch:Rp},within:{iframe:window.self!==window.top}},ts={install(e){const{$q:t}=e;so.value===!0?(e.onSSRHydrated.push(()=>{Object.assign(t.platform,ut),so.value=!1,qs=void 0}),t.platform=Lr(this)):t.platform=this}};{let e;qn(ut.has,"webStorage",()=>{if(e!==void 0)return e;try{if(window.localStorage)return e=!0,!0}catch{}return e=!1,!1}),ut.is.ios===!0&&window.navigator.vendor.toLowerCase().indexOf("apple"),so.value===!0?Object.assign(ts,ut,qs,P4):Object.assign(ts,ut)}var Ma=(e,t)=>{const n=Lr(e);for(const r in e)qn(t,r,()=>n[r],l=>{n[r]=l});return t};const Zt={hasPassive:!1,passiveCapture:!0,notPassiveCapture:!0};try{const e=Object.defineProperty({},"passive",{get(){Object.assign(Zt,{hasPassive:!0,passive:{passive:!0},notPassive:{passive:!1},passiveCapture:{passive:!0,capture:!0},notPassiveCapture:{passive:!1,capture:!0}})}});window.addEventListener("qtest",null,e),window.removeEventListener("qtest",null,e)}catch{}function pn(){}function $s(e){return e.button===0}function jn(e){return e.touches&&e.touches[0]?e=e.touches[0]:e.changedTouches&&e.changedTouches[0]?e=e.changedTouches[0]:e.targetTouches&&e.targetTouches[0]&&(e=e.targetTouches[0]),{top:e.clientY,left:e.clientX}}function B4(e){if(e.path)return e.path;if(e.composedPath)return e.composedPath();const t=[];let n=e.target;for(;n;){if(t.push(n),n.tagName==="HTML")return t.push(document),t.push(window),t;n=n.parentElement}}function dn(e){e.stopPropagation()}function $n(e){e.cancelable!==!1&&e.preventDefault()}function bt(e){e.cancelable!==!1&&e.preventDefault(),e.stopPropagation()}function Br(e,t){if(e===void 0||t===!0&&e.__dragPrevented===!0)return;const n=t===!0?r=>{r.__dragPrevented=!0,r.addEventListener("dragstart",$n,Zt.notPassiveCapture)}:r=>{delete r.__dragPrevented,r.removeEventListener("dragstart",$n,Zt.notPassiveCapture)};e.querySelectorAll("a, img").forEach(n)}function fn(e,t,n){const r=`__q_${t}_evt`;e[r]=e[r]!==void 0?e[r].concat(n):n,n.forEach(l=>{l[0].addEventListener(l[1],e[l[2]],Zt[l[3]])})}function zn(e,t){const n=`__q_${t}_evt`;e[n]!==void 0&&(e[n].forEach(r=>{r[0].removeEventListener(r[1],e[r[2]],Zt[r[3]])}),e[n]=void 0)}function Qr(e,t=250,n){let r=null;function l(){const i=arguments,c=()=>{r=null,n!==!0&&e.apply(this,i)};r!==null?clearTimeout(r):n===!0&&e.apply(this,i),r=setTimeout(c,t)}return l.cancel=()=>{r!==null&&clearTimeout(r)},l}const Ku=["sm","md","lg","xl"],{passive:jv}=Zt;var E4=Ma({width:0,height:0,name:"xs",sizes:{sm:600,md:1024,lg:1440,xl:1920},lt:{sm:!0,md:!0,lg:!0,xl:!0},gt:{xs:!1,sm:!1,md:!1,lg:!1},xs:!0,sm:!1,md:!1,lg:!1,xl:!1},{setSizes:pn,setDebounce:pn,install({$q:e,onSSRHydrated:t}){if(e.screen=this,this.__installed===!0)return void(e.config.screen!==void 0&&(e.config.screen.bodyClasses===!1?document.body.classList.remove(`screen--${this.name}`):this.__update(!0)));const{visualViewport:n}=window,r=n||window,l=document.scrollingElement||document.documentElement,i=n===void 0||ut.is.mobile===!0?()=>[Math.max(window.innerWidth,l.clientWidth),Math.max(window.innerHeight,l.clientHeight)]:()=>[n.width*n.scale+window.innerWidth-l.clientWidth,n.height*n.scale+window.innerHeight-l.clientHeight],c=e.config.screen!==void 0&&e.config.screen.bodyClasses===!0;this.__update=y=>{const[b,g]=i();if(g!==this.height&&(this.height=g),b!==this.width)this.width=b;else if(y!==!0)return;let w=this.sizes;this.gt.xs=b>=w.sm,this.gt.sm=b>=w.md,this.gt.md=b>=w.lg,this.gt.lg=b>=w.xl,this.lt.sm=b{Ku.forEach(b=>{y[b]!==void 0&&(v[b]=y[b])})},this.setDebounce=y=>{m=y};const p=()=>{const y=getComputedStyle(document.body);y.getPropertyValue("--q-size-sm")&&Ku.forEach(b=>{this.sizes[b]=parseInt(y.getPropertyValue(`--q-size-${b}`),10)}),this.setSizes=b=>{Ku.forEach(g=>{b[g]&&(this.sizes[g]=b[g])}),this.__update(!0)},this.setDebounce=b=>{u!==void 0&&r.removeEventListener("resize",u,jv),u=b>0?Qr(this.__update,b):this.__update,r.addEventListener("resize",u,jv)},this.setDebounce(m),Object.keys(v).length!==0?(this.setSizes(v),v=void 0):this.__update(),c===!0&&this.name==="xs"&&document.body.classList.add("screen--xs")};so.value===!0?t.push(p):p()}});const On=Ma({isActive:!1,mode:!1},{__media:void 0,set(e){On.mode=e,e==="auto"?(On.__media===void 0&&(On.__media=window.matchMedia("(prefers-color-scheme: dark)"),On.__updateMedia=()=>{On.set("auto")},On.__media.addListener(On.__updateMedia)),e=On.__media.matches):On.__media!==void 0&&(On.__media.removeListener(On.__updateMedia),On.__media=void 0),On.isActive=e===!0,document.body.classList.remove(`body--${e===!0?"light":"dark"}`),document.body.classList.add(`body--${e===!0?"dark":"light"}`)},toggle(){On.set(On.isActive===!1)},install({$q:e,onSSRHydrated:t,ssrContext:n}){const{dark:r}=e.config;if(e.dark=this,this.__installed===!0&&r===void 0)return;this.isActive=r===!0;const l=r!==void 0&&r;if(so.value===!0){const i=u=>{this.__fromSSR=u},c=this.set;this.set=i,i(l),t.push(()=>{this.set=c,this.set(this.__fromSSR)})}else this.set(l)}}),zp=()=>!0;function F4(e){return typeof e=="string"&&e!==""&&e!=="/"&&e!=="#/"}function V4(e){return e.startsWith("#")===!0&&(e=e.substring(1)),e.startsWith("/")===!1&&(e="/"+e),e.endsWith("/")===!0&&(e=e.substring(0,e.length-1)),"#"+e}function I4(e){if(e.backButtonExit===!1)return()=>!1;if(e.backButtonExit==="*")return zp;const t=["#/"];return Array.isArray(e.backButtonExit)===!0&&t.push(...e.backButtonExit.filter(F4).map(V4)),()=>t.includes(window.location.hash)}var kl={__history:[],add:pn,remove:pn,install({$q:e}){if(this.__installed===!0)return;const{cordova:t,capacitor:n}=ut.is;if(t!==!0&&n!==!0)return;const r=e.config[t===!0?"cordova":"capacitor"];if(r!==void 0&&r.backButton===!1||n===!0&&(window.Capacitor===void 0||window.Capacitor.Plugins.App===void 0))return;this.add=c=>{c.condition===void 0&&(c.condition=zp),this.__history.push(c)},this.remove=c=>{const u=this.__history.indexOf(c);u>=0&&this.__history.splice(u,1)};const l=I4(Object.assign({backButtonExit:!0},r)),i=()=>{if(this.__history.length){const c=this.__history[this.__history.length-1];c.condition()===!0&&(this.__history.pop(),c.handler())}else l()===!0?navigator.app.exitApp():window.history.back()};t===!0?document.addEventListener("deviceready",()=>{document.addEventListener("backbutton",i,!1)}):window.Capacitor.Plugins.App.addListener("backButton",i)}},_c={isoName:"en-US",nativeName:"English (US)",label:{clear:"Clear",ok:"OK",cancel:"Cancel",close:"Close",set:"Set",select:"Select",reset:"Reset",remove:"Remove",update:"Update",create:"Create",search:"Search",filter:"Filter",refresh:"Refresh",expand:e=>e?`Expand "${e}"`:"Expand",collapse:e=>e?`Collapse "${e}"`:"Collapse"},date:{days:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),daysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),firstDayOfWeek:0,format24h:!1,pluralDay:"days"},table:{noData:"No data available",noResults:"No matching records found",loading:"Loading...",selectedRecords:e=>e===1?"1 record selected.":(e===0?"No":e)+" records selected.",recordsPerPage:"Records per page:",allRows:"All",pagination:(e,t,n)=>e+"-"+t+" of "+n,columns:"Columns"},editor:{url:"URL",bold:"Bold",italic:"Italic",strikethrough:"Strikethrough",underline:"Underline",unorderedList:"Unordered List",orderedList:"Ordered List",subscript:"Subscript",superscript:"Superscript",hyperlink:"Hyperlink",toggleFullscreen:"Toggle Fullscreen",quote:"Quote",left:"Left align",center:"Center align",right:"Right align",justify:"Justify align",print:"Print",outdent:"Decrease indentation",indent:"Increase indentation",removeFormat:"Remove formatting",formatting:"Formatting",fontSize:"Font Size",align:"Align",hr:"Insert Horizontal Rule",undo:"Undo",redo:"Redo",heading1:"Heading 1",heading2:"Heading 2",heading3:"Heading 3",heading4:"Heading 4",heading5:"Heading 5",heading6:"Heading 6",paragraph:"Paragraph",code:"Code",size1:"Very small",size2:"A bit small",size3:"Normal",size4:"Medium-large",size5:"Big",size6:"Very big",size7:"Maximum",defaultFont:"Default Font",viewSource:"View Source"},tree:{noNodes:"No nodes available",noResults:"No matching nodes found"}};function Wv(){const e=Array.isArray(navigator.languages)===!0&&navigator.languages.length!==0?navigator.languages[0]:navigator.language;if(typeof e=="string")return e.split(/[-_]/).map((t,n)=>n===0?t.toLowerCase():n>1||t.length<4?t.toUpperCase():t[0].toUpperCase()+t.slice(1).toLowerCase()).join("-")}const ro=Ma({__langPack:{}},{getLocale:Wv,set(e=_c,t){const n={...e,rtl:e.rtl===!0,getLocale:Wv};if(n.set=ro.set,ro.__langConfig===void 0||ro.__langConfig.noHtmlAttrs!==!0){const r=document.documentElement;r.setAttribute("dir",n.rtl===!0?"rtl":"ltr"),r.setAttribute("lang",n.isoName)}Object.assign(ro.__langPack,n),ro.props=n,ro.isoName=n.isoName,ro.nativeName=n.nativeName},install({$q:e,lang:t,ssrContext:n}){e.lang=ro.__langPack,ro.__langConfig=e.config.lang,this.__installed===!0?t!==void 0&&this.set(t):this.set(t||_c)}});function O4(e,t,n=document.body){if(typeof e!="string")throw new TypeError("Expected a string as propName");if(typeof t!="string")throw new TypeError("Expected a string as value");if(!(n instanceof Element))throw new TypeError("Expected a DOM element");n.style.setProperty(`--q-${e}`,t)}let Np=!1;function R4(e){Np=e.isComposing===!0}function or(e){return Np===!0||e!==Object(e)||e.isComposing===!0||e.qKeyEvent===!0}function wo(e,t){return or(e)!==!0&&[].concat(t).includes(e.keyCode)}function Hp(e){return e.ios===!0?"ios":e.android===!0?"android":void 0}function z4({is:e,has:t,within:n},r){const l=[e.desktop===!0?"desktop":"mobile",`${t.touch===!1?"no-":""}touch`];if(e.mobile===!0){const i=Hp(e);i!==void 0&&l.push("platform-"+i)}if(e.nativeMobile===!0){const i=e.nativeMobileWrapper;l.push(i),l.push("native-mobile"),e.ios!==!0||r[i]!==void 0&&r[i].iosStatusBarPadding===!1||l.push("q-ios-padding")}else e.electron===!0?l.push("electron"):e.bex===!0&&l.push("bex");return n.iframe===!0&&l.push("within-iframe"),l}function N4(){const{is:e}=ut,t=document.body.className,n=new Set(t.replace(/ {2}/g," ").split(" "));if(qs!==void 0)n.delete("desktop"),n.add("platform-ios"),n.add("mobile");else if(e.nativeMobile!==!0&&e.electron!==!0&&e.bex!==!0){if(e.desktop===!0)n.delete("mobile"),n.delete("platform-ios"),n.delete("platform-android"),n.add("desktop");else if(e.mobile===!0){n.delete("desktop"),n.add("mobile");const l=Hp(e);l!==void 0?(n.add(`platform-${l}`),n.delete(`platform-${l==="ios"?"android":"ios"}`)):(n.delete("platform-ios"),n.delete("platform-android"))}}ut.has.touch===!0&&(n.delete("no-touch"),n.add("touch")),ut.within.iframe===!0&&n.add("within-iframe");const r=Array.from(n).join(" ");t!==r&&(document.body.className=r)}function H4(e){for(const t in e)O4(t,e[t])}var D4={install(e){if(this.__installed!==!0){if(so.value===!0)N4();else{const{$q:t}=e;t.config.brand!==void 0&&H4(t.config.brand);const n=z4(ut,t.config);document.body.classList.add.apply(document.body.classList,n)}ut.is.ios===!0&&document.body.addEventListener("touchstart",pn),window.addEventListener("keydown",R4,!0)}}},Q4={name:"material-icons",type:{positive:"check_circle",negative:"warning",info:"info",warning:"priority_high"},arrow:{up:"arrow_upward",right:"arrow_forward",down:"arrow_downward",left:"arrow_back",dropdown:"arrow_drop_down"},chevron:{left:"chevron_left",right:"chevron_right"},colorPicker:{spectrum:"gradient",tune:"tune",palette:"style"},pullToRefresh:{icon:"refresh"},carousel:{left:"chevron_left",right:"chevron_right",up:"keyboard_arrow_up",down:"keyboard_arrow_down",navigationIcon:"lens"},chip:{remove:"cancel",selected:"check"},datetime:{arrowLeft:"chevron_left",arrowRight:"chevron_right",now:"access_time",today:"today"},editor:{bold:"format_bold",italic:"format_italic",strikethrough:"strikethrough_s",underline:"format_underlined",unorderedList:"format_list_bulleted",orderedList:"format_list_numbered",subscript:"vertical_align_bottom",superscript:"vertical_align_top",hyperlink:"link",toggleFullscreen:"fullscreen",quote:"format_quote",left:"format_align_left",center:"format_align_center",right:"format_align_right",justify:"format_align_justify",print:"print",outdent:"format_indent_decrease",indent:"format_indent_increase",removeFormat:"format_clear",formatting:"text_format",fontSize:"format_size",align:"format_align_left",hr:"remove",undo:"undo",redo:"redo",heading:"format_size",code:"code",size:"format_size",font:"font_download",viewSource:"code"},expansionItem:{icon:"keyboard_arrow_down",denseIcon:"arrow_drop_down"},fab:{icon:"add",activeIcon:"close"},field:{clear:"cancel",error:"error"},pagination:{first:"first_page",prev:"keyboard_arrow_left",next:"keyboard_arrow_right",last:"last_page"},rating:{icon:"grade"},stepper:{done:"check",active:"edit",error:"warning"},tabs:{left:"chevron_left",right:"chevron_right",up:"keyboard_arrow_up",down:"keyboard_arrow_down"},table:{arrowUp:"arrow_upward",warning:"warning",firstPage:"first_page",prevPage:"chevron_left",nextPage:"chevron_right",lastPage:"last_page"},tree:{icon:"play_arrow"},uploader:{done:"done",clear:"clear",add:"add_box",upload:"cloud_upload",removeQueue:"clear_all",removeUploaded:"done_all"}};const ns=Ma({iconMapFn:null,__icons:{}},{set(e,t){const n={...e,rtl:e.rtl===!0};n.set=ns.set,Object.assign(ns.__icons,n)},install({$q:e,iconSet:t,ssrContext:n}){e.config.iconMapFn!==void 0&&(this.iconMapFn=e.config.iconMapFn),e.iconSet=this.__icons,qn(e,"iconMapFn",()=>this.iconMapFn,r=>{this.iconMapFn=r}),this.__installed===!0?t!==void 0&&this.set(t):this.set(t||Q4)}}),U4="_q_",Dp="_q_t_",Qp="_q_s_",ar="_q_l_",Up="_q_pc_",jp="_q_f_",Ar="_q_fo_",Wp="_q_tabs_",Kp="_q_u_",Nt=()=>{},os={};let Yp=!1;function j4(){Yp=!0}function Ao(e,t){if(e===t)return!0;if(e!==null&&t!==null&&typeof e=="object"&&typeof t=="object"){if(e.constructor!==t.constructor)return!1;let n,r;if(e.constructor===Array){if(n=e.length,n!==t.length)return!1;for(r=n;r--!==0;)if(Ao(e[r],t[r])!==!0)return!1;return!0}if(e.constructor===Map){if(e.size!==t.size)return!1;let i=e.entries();for(r=i.next();r.done!==!0;){if(t.has(r.value[0])!==!0)return!1;r=i.next()}for(i=e.entries(),r=i.next();r.done!==!0;){if(Ao(r.value[1],t.get(r.value[0]))!==!0)return!1;r=i.next()}return!0}if(e.constructor===Set){if(e.size!==t.size)return!1;const i=e.entries();for(r=i.next();r.done!==!0;){if(t.has(r.value[0])!==!0)return!1;r=i.next()}return!0}if(e.buffer!=null&&e.buffer.constructor===ArrayBuffer){if(n=e.length,n!==t.length)return!1;for(r=n;r--!==0;)if(e[r]!==t[r])return!1;return!0}if(e.constructor===RegExp)return e.source===t.source&&e.flags===t.flags;if(e.valueOf!==Object.prototype.valueOf)return e.valueOf()===t.valueOf();if(e.toString!==Object.prototype.toString)return e.toString()===t.toString();const l=Object.keys(e).filter(i=>e[i]!==void 0);if(n=l.length,n!==Object.keys(t).filter(i=>t[i]!==void 0).length)return!1;for(r=n;r--!==0;){const i=l[r];if(Ao(e[i],t[i])!==!0)return!1}return!0}return e!==e&&t!==t}function En(e){return e!==null&&typeof e=="object"&&Array.isArray(e)!==!0}function wc(e){return Object.prototype.toString.call(e)==="[object Date]"}function W4(e){return Object.prototype.toString.call(e)==="[object RegExp]"}function Cl(e){return typeof e=="number"&&isFinite(e)}const Kv=[ts,D4,On,E4,kl,ro,ns];function Gp(e,t){const n=$x(e);n.config.globalProperties=t.config.globalProperties;const{reload:r,...l}=t._context;return Object.assign(n._context,l),n}function Yv(e,t){t.forEach(n=>{n.install(e),n.__installed=!0})}function K4(e,t,n){e.config.globalProperties.$q=n.$q,e.provide(U4,n.$q),Yv(n,Kv),t.components!==void 0&&Object.values(t.components).forEach(r=>{En(r)===!0&&r.name!==void 0&&e.component(r.name,r)}),t.directives!==void 0&&Object.values(t.directives).forEach(r=>{En(r)===!0&&r.name!==void 0&&e.directive(r.name,r)}),t.plugins!==void 0&&Yv(n,Object.values(t.plugins).filter(r=>typeof r.install=="function"&&Kv.includes(r)===!1)),so.value===!0&&(n.$q.onSSRHydrated=()=>{n.onSSRHydrated.forEach(r=>{r()}),n.$q.onSSRHydrated=()=>{}})}var Y4=function(e,t={}){const n={version:"2.14.2"};Yp===!1?(t.config!==void 0&&Object.assign(os,t.config),n.config={...os},j4()):n.config=t.config||{},K4(e,t,{parentApp:e,$q:n,lang:t.lang,iconSet:t.iconSet,onSSRHydrated:[]})};const we=e=>Sp(rt(e)),Eo=e=>Sp(e),Gv=["B","KB","MB","GB","TB","PB"];function xc(e){let t=0;for(;parseInt(e,10)>=1024&&t=t?r:new Array(t-r.length+1).join(n)+r}const Hc=XMLHttpRequest,Xp=Hc.prototype.open,G4=["top","right","bottom","left"];let rs=[],wl=0;function X4({p:e,pos:t,active:n,horiz:r,reverse:l,dir:i}){let c=1,u=1;return r===!0?(l===!0&&(c=-1),t==="bottom"&&(u=-1),{transform:`translate3d(${c*(e-100)}%,${n?0:-200*u}%,0)`}):(l===!0&&(u=-1),t==="right"&&(c=-1),{transform:`translate3d(${n?0:i*c*-200}%,${u*(e-100)}%,0)`})}function Z4(e,t){return typeof t!="number"&&(t=e<25?3*Math.random()+3:e<65?3*Math.random():e<85?2*Math.random():e<99?.6:0),Jt(e+t,0,100)}function J4(e){wl++,rs.push(e),wl>1||(Hc.prototype.open=function(t,n){const r=[],l=()=>{rs.forEach(c=>{c.hijackFilter.value!==null&&c.hijackFilter.value(n)!==!0||(c.start(),r.push(c.stop))})},i=()=>{r.forEach(c=>{c()})};this.addEventListener("loadstart",l,{once:!0}),this.addEventListener("loadend",i,{once:!0}),Xp.apply(this,arguments)})}function eq(e){rs=rs.filter(t=>t.start!==e),wl=Math.max(0,wl-1),wl===0&&(Hc.prototype.open=Xp)}var Zp=we({name:"QAjaxBar",props:{position:{type:String,default:"top",validator:e=>G4.includes(e)},size:{type:String,default:"2px"},color:String,skipHijack:Boolean,reverse:Boolean,hijackFilter:Function},emits:["start","stop"],setup(e,{emit:t}){const{proxy:n}=Ve(),r=X(0),l=X(!1),i=X(!0);let c,u=0,v=null;const m=f(()=>`q-loading-bar q-loading-bar--${e.position}`+(e.color!==void 0?` bg-${e.color}`:"")+(i.value===!0?"":" no-transition")),p=f(()=>e.position==="top"||e.position==="bottom"),y=f(()=>p.value===!0?"height":"width"),b=f(()=>{const S=l.value,x=X4({p:r.value,pos:e.position,active:S,horiz:p.value,reverse:n.$q.lang.rtl===!0&&["top","bottom"].includes(e.position)?e.reverse===!1:e.reverse,dir:n.$q.lang.rtl===!0?-1:1});return x[y.value]=e.size,x.opacity=S?1:0,x}),g=f(()=>l.value===!0?{role:"progressbar","aria-valuemin":0,"aria-valuemax":100,"aria-valuenow":r.value}:{"aria-hidden":"true"});function w(S=300){const x=c;return c=Math.max(0,S)||0,u++,u>1?(x===0&&S>0?F():v!==null&&x>0&&S<=0&&(clearTimeout(v),v=null),u):(v!==null&&clearTimeout(v),t("start"),r.value=0,v=setTimeout(()=>{v=null,i.value=!0,S>0&&F()},l.value===!0?500:1),l.value!==!0&&(l.value=!0,i.value=!1),u)}function L(S){return u>0&&(r.value=Z4(r.value,S)),u}function $(){if(u=Math.max(0,u-1),u>0)return u;v!==null&&(clearTimeout(v),v=null),t("stop");const S=()=>{i.value=!0,r.value=100,v=setTimeout(()=>{v=null,l.value=!1},1e3)};return r.value===0?v=setTimeout(S,1):S(),u}function F(){r.value<100&&(v=setTimeout(()=>{v=null,L(),F()},c))}let A;return jt(()=>{e.skipHijack!==!0&&(A=!0,J4({start:w,stop:$,hijackFilter:f(()=>e.hijackFilter||null)}))}),qt(()=>{v!==null&&clearTimeout(v),A===!0&&eq(w)}),Object.assign(n,{start:w,stop:$,increment:L}),()=>d("div",{class:m.value,style:b.value,...g.value})}});const Sc={xs:18,sm:24,md:32,lg:38,xl:46},ua={size:String};function ca(e,t=Sc){return f(()=>e.size!==void 0?{fontSize:e.size in t?`${t[e.size]}px`:e.size}:null)}function Ge(e,t){return e!==void 0&&e()||t}function Pl(e,t){if(e!==void 0){const n=e();if(n!=null)return n.slice()}return t}function hn(e,t){return e!==void 0?t.concat(e()):t}function Dc(e,t){return e===void 0?t:t!==void 0?t.concat(e()):e()}function xo(e,t,n,r,l,i){t.key=r+l;const c=d(e,t,n);return l===!0?Bo(c,i()):c}const Xv="0 0 24 24",Zv=e=>e,Yu=e=>`ionicons ${e}`,Jp={"mdi-":e=>`mdi ${e}`,"icon-":Zv,"bt-":e=>`bt ${e}`,"eva-":e=>`eva ${e}`,"ion-md":Yu,"ion-ios":Yu,"ion-logo":Yu,"iconfont ":Zv,"ti-":e=>`themify-icon ${e}`,"bi-":e=>`bootstrap-icons ${e}`},eh={o_:"-outlined",r_:"-round",s_:"-sharp"},th={sym_o_:"-outlined",sym_r_:"-rounded",sym_s_:"-sharp"},tq=new RegExp("^("+Object.keys(Jp).join("|")+")"),nq=new RegExp("^("+Object.keys(eh).join("|")+")"),Jv=new RegExp("^("+Object.keys(th).join("|")+")"),oq=/^[Mm]\s?[-+]?\.?\d/,aq=/^img:/,rq=/^svguse:/,lq=/^ion-/,iq=/^(fa-(sharp|solid|regular|light|brands|duotone|thin)|[lf]a[srlbdk]?) /;var Et=we({name:"QIcon",props:{...ua,tag:{type:String,default:"i"},name:String,color:String,left:Boolean,right:Boolean},setup(e,{slots:t}){const{proxy:{$q:n}}=Ve(),r=ca(e),l=f(()=>"q-icon"+(e.left===!0?" on-left":"")+(e.right===!0?" on-right":"")+(e.color!==void 0?` text-${e.color}`:"")),i=f(()=>{let c,u=e.name;if(u==="none"||!u)return{none:!0};if(n.iconMapFn!==null){const p=n.iconMapFn(u);if(p!==void 0){if(p.icon===void 0)return{cls:p.cls,content:p.content!==void 0?p.content:" "};if(u=p.icon,u==="none"||!u)return{none:!0}}}if(oq.test(u)===!0){const[p,y=Xv]=u.split("|");return{svg:!0,viewBox:y,nodes:p.split("&&").map(b=>{const[g,w,L]=b.split("@@");return d("path",{style:w,d:g,transform:L})})}}if(aq.test(u)===!0)return{img:!0,src:u.substring(4)};if(rq.test(u)===!0){const[p,y=Xv]=u.split("|");return{svguse:!0,src:p.substring(7),viewBox:y}}let v=" ";const m=u.match(tq);if(m!==null)c=Jp[m[1]](u);else if(iq.test(u)===!0)c=u;else if(lq.test(u)===!0)c=`ionicons ion-${n.platform.is.ios===!0?"ios":"md"}${u.substring(3)}`;else if(Jv.test(u)===!0){c="notranslate material-symbols";const p=u.match(Jv);p!==null&&(u=u.substring(6),c+=th[p[1]]),v=u}else{c="notranslate material-icons";const p=u.match(nq);p!==null&&(u=u.substring(2),c+=eh[p[1]]),v=u}return{cls:c,content:v}});return()=>{const c={class:l.value,style:r.value,"aria-hidden":"true",role:"presentation"};return i.value.none===!0?d(e.tag,c,Ge(t.default)):i.value.img===!0?d("span",c,hn(t.default,[d("img",{src:i.value.src})])):i.value.svg===!0?d("span",c,hn(t.default,[d("svg",{viewBox:i.value.viewBox||"0 0 24 24"},i.value.nodes)])):i.value.svguse===!0?d("span",c,hn(t.default,[d("svg",{viewBox:i.value.viewBox},[d("use",{"xlink:href":i.value.src})])])):(i.value.cls!==void 0&&(c.class+=" "+i.value.cls),d(e.tag,c,hn(t.default,[i.value.content])))}}}),sq=we({name:"QAvatar",props:{...ua,fontSize:String,color:String,textColor:String,icon:String,square:Boolean,rounded:Boolean},setup(e,{slots:t}){const n=ca(e),r=f(()=>"q-avatar"+(e.color?` bg-${e.color}`:"")+(e.textColor?` text-${e.textColor} q-chip--colored`:"")+(e.square===!0?" q-avatar--square":e.rounded===!0?" rounded-borders":"")),l=f(()=>e.fontSize?{fontSize:e.fontSize}:null);return()=>{const i=e.icon!==void 0?[d(Et,{name:e.icon})]:void 0;return d("div",{class:r.value,style:n.value},[d("div",{class:"q-avatar__content row flex-center overflow-hidden",style:l.value},Dc(t.default,i))])}}});const uq=["top","middle","bottom"];var cq=we({name:"QBadge",props:{color:String,textColor:String,floating:Boolean,transparent:Boolean,multiLine:Boolean,outline:Boolean,rounded:Boolean,label:[Number,String],align:{type:String,validator:e=>uq.includes(e)}},setup(e,{slots:t}){const n=f(()=>e.align!==void 0?{verticalAlign:e.align}:null),r=f(()=>{const l=e.outline===!0&&e.color||e.textColor;return`q-badge flex inline items-center no-wrap q-badge--${e.multiLine===!0?"multi":"single"}-line`+(e.outline===!0?" q-badge--outline":e.color!==void 0?` bg-${e.color}`:"")+(l!==void 0?` text-${l}`:"")+(e.floating===!0?" q-badge--floating":"")+(e.rounded===!0?" q-badge--rounded":"")+(e.transparent===!0?" q-badge--transparent":"")});return()=>d("div",{class:r.value,style:n.value,role:"status","aria-label":e.label},hn(t.default,e.label!==void 0?[e.label]:[]))}});const Ft={dark:{type:Boolean,default:null}};function Vt(e,t){return f(()=>e.dark===null?t.dark.isActive:e.dark)}var dq=we({name:"QBanner",props:{...Ft,inlineActions:Boolean,dense:Boolean,rounded:Boolean},setup(e,{slots:t}){const{proxy:{$q:n}}=Ve(),r=Vt(e,n),l=f(()=>"q-banner row items-center"+(e.dense===!0?" q-banner--dense":"")+(r.value===!0?" q-banner--dark q-dark":"")+(e.rounded===!0?" rounded-borders":"")),i=f(()=>`q-banner__actions row items-center justify-end col-${e.inlineActions===!0?"auto":"all"}`);return()=>{const c=[d("div",{class:"q-banner__avatar col-auto row items-center self-start"},Ge(t.avatar)),d("div",{class:"q-banner__content col text-body2"},Ge(t.default))],u=Ge(t.action);return u!==void 0&&c.push(d("div",{class:i.value},u)),d("div",{class:l.value+(e.inlineActions===!1&&u!==void 0?" q-banner--top-padding":""),role:"alert"},c)}}}),vq=we({name:"QBar",props:{...Ft,dense:Boolean},setup(e,{slots:t}){const{proxy:{$q:n}}=Ve(),r=Vt(e,n),l=f(()=>`q-bar row no-wrap items-center q-bar--${e.dense===!0?"dense":"standard"} q-bar--${r.value===!0?"dark":"light"}`);return()=>d("div",{class:l.value,role:"toolbar"},Ge(t.default))}});const nh={left:"start",center:"center",right:"end",between:"between",around:"around",evenly:"evenly",stretch:"stretch"},fq=Object.keys(nh),Qc={align:{type:String,validator:e=>fq.includes(e)}};function Uc(e){return f(()=>{const t=e.align===void 0?e.vertical===!0?"stretch":"left":e.align;return`${e.vertical===!0?"items":"justify"}-${nh[t]}`})}function Yi(e){if(Object(e.$parent)===e.$parent)return e.$parent;let{parent:t}=e.$;for(;Object(t)===t;){if(Object(t.proxy)===t.proxy)return t.proxy;t=t.parent}}function oh(e,t){typeof t.type=="symbol"?Array.isArray(t.children)===!0&&t.children.forEach(n=>{oh(e,n)}):e.add(t)}function jc(e){const t=new Set;return e.forEach(n=>{oh(t,n)}),Array.from(t)}function Wc(e){return e.appContext.config.globalProperties.$router!==void 0}function Bl(e){return e.isUnmounted===!0||e.isDeactivated===!0}const pq=["",!0];var hq=we({name:"QBreadcrumbs",props:{...Qc,separator:{type:String,default:"/"},separatorColor:String,activeColor:{type:String,default:"primary"},gutter:{type:String,validator:e=>["none","xs","sm","md","lg","xl"].includes(e),default:"sm"}},setup(e,{slots:t}){const n=Uc(e),r=f(()=>`flex items-center ${n.value}${e.gutter==="none"?"":` q-gutter-${e.gutter}`}`),l=f(()=>e.separatorColor?` text-${e.separatorColor}`:""),i=f(()=>` text-${e.activeColor}`);return()=>{const c=jc(Ge(t.default));if(c.length===0)return;let u=1;const v=[],m=c.filter(y=>y.type!==void 0&&y.type.name==="QBreadcrumbsEl").length,p=t.separator!==void 0?t.separator:()=>e.separator;return c.forEach(y=>{if(y.type!==void 0&&y.type.name==="QBreadcrumbsEl"){const b=ui!==l[c]))return!1}return!0}function nf(e,t){return Array.isArray(t)===!0?e.length===t.length&&e.every((n,r)=>n===t[r]):e.length===1&&e[0]===t}function gq(e,t){return Array.isArray(e)===!0?nf(e,t):Array.isArray(t)===!0?nf(t,e):e===t}function bq(e,t){if(Object.keys(e).length!==Object.keys(t).length)return!1;for(const n in e)if(gq(e[n],t[n])===!1)return!1;return!0}const Ur={to:[String,Object],replace:Boolean,exact:Boolean,activeClass:{type:String,default:"q-router-link--active"},exactActiveClass:{type:String,default:"q-router-link--exact-active"},href:String,target:String,disable:Boolean};function Ts({fallbackTag:e,useDisableForRouterLinkProps:t=!0}={}){const n=Ve(),{props:r,proxy:l,emit:i}=n,c=Wc(n),u=f(()=>r.disable!==!0&&r.href!==void 0),v=f(t===!0?()=>c===!0&&r.disable!==!0&&u.value!==!0&&r.to!==void 0&&r.to!==null&&r.to!=="":()=>c===!0&&u.value!==!0&&r.to!==void 0&&r.to!==null&&r.to!==""),m=f(()=>v.value===!0?A(r.to):null),p=f(()=>m.value!==null),y=f(()=>u.value===!0||p.value===!0),b=f(()=>r.type==="a"||y.value===!0?"a":r.tag||e||"div"),g=f(()=>u.value===!0?{href:r.href,target:r.target}:p.value===!0?{href:m.value.href,target:r.target}:{}),w=f(()=>{if(p.value===!1)return-1;const{matched:P}=m.value,{length:M}=P,E=P[M-1];if(E===void 0)return-1;const D=l.$route.matched;if(D.length===0)return-1;const z=D.findIndex(tf.bind(null,E));if(z>-1)return z;const I=ef(P[M-2]);return M>1&&ef(E)===I&&D[D.length-1].path!==I?D.findIndex(tf.bind(null,P[M-2])):z}),L=f(()=>p.value===!0&&w.value!==-1&&mq(l.$route.params,m.value.params)),$=f(()=>L.value===!0&&w.value===l.$route.matched.length-1&&bq(l.$route.params,m.value.params)),F=f(()=>p.value===!0?$.value===!0?` ${r.exactActiveClass} ${r.activeClass}`:r.exact===!0?"":L.value===!0?` ${r.activeClass}`:"":"");function A(P){try{return l.$router.resolve(P)}catch{}return null}function S(P,{returnRouterError:M,to:E=r.to,replace:D=r.replace}={}){if(r.disable===!0)return P.preventDefault(),Promise.resolve(!1);if(P.metaKey||P.altKey||P.ctrlKey||P.shiftKey||P.button!==void 0&&P.button!==0||r.target==="_blank")return Promise.resolve(!1);P.preventDefault();const z=l.$router[D===!0?"replace":"push"](E);return M===!0?z:z.then(()=>{}).catch(()=>{})}function x(P){if(p.value===!0){const M=E=>S(P,E);i("click",P,M),P.defaultPrevented!==!0&&M()}else i("click",P)}return{hasRouterLink:p,hasHrefLink:u,hasLink:y,linkTag:b,resolvedLink:m,linkIsActive:L,linkIsExactActive:$,linkClass:F,linkAttrs:g,getLink:A,navigateToRouterLink:S,navigateOnClick:x}}var yq=we({name:"QBreadcrumbsEl",props:{...Ur,label:String,icon:String,tag:{type:String,default:"span"}},emits:["click"],setup(e,{slots:t}){const{linkTag:n,linkAttrs:r,linkClass:l,navigateOnClick:i}=Ts(),c=f(()=>({class:"q-breadcrumbs__el q-link flex inline items-center relative-position "+(e.disable!==!0?"q-link--focusable"+l.value:"q-breadcrumbs__el--disable"),...r.value,onClick:i})),u=f(()=>"q-breadcrumbs__el-icon"+(e.label!==void 0?" q-breadcrumbs__el-icon--with-label":""));return()=>{const v=[];return e.icon!==void 0&&v.push(d(Et,{class:u.value,name:e.icon})),e.label!==void 0&&v.push(e.label),d(n.value,{...c.value},hn(t.default,v))}}});const mn={size:{type:[Number,String],default:"1em"},color:String};function gn(e){return{cSize:f(()=>e.size in Sc?`${Sc[e.size]}px`:e.size),classes:f(()=>"q-spinner"+(e.color?` text-${e.color}`:""))}}var So=we({name:"QSpinner",props:{...mn,thickness:{type:Number,default:5}},setup(e){const{cSize:t,classes:n}=gn(e);return()=>d("svg",{class:n.value+" q-spinner-mat",width:t.value,height:t.value,viewBox:"25 25 50 50"},[d("circle",{class:"path",cx:"50",cy:"50",r:"20",fill:"none",stroke:"currentColor","stroke-width":e.thickness,"stroke-miterlimit":"10"})])}});function ls(e){if(e===window)return{top:0,left:0};const{top:t,left:n}=e.getBoundingClientRect();return{top:t,left:n}}function zr(e){return e===window?window.innerHeight:e.getBoundingClientRect().height}function kc(e,t){const n=e.style;for(const r in t)n[r]=t[r]}function _q(e){if(e==null)return;if(typeof e=="string")try{return document.querySelector(e)||void 0}catch{return}const t=he(e);return t?t.$el||t:void 0}function ah(e,t){if(e==null||e.contains(t)===!0)return!0;for(let n=e.nextElementSibling;n!==null;n=n.nextElementSibling)if(n.contains(t))return!0;return!1}function rh(e,t=250){let n,r=!1;return function(){return r===!1&&(r=!0,setTimeout(()=>{r=!1},t),n=e.apply(this,arguments)),n}}function of(e,t,n,r){n.modifiers.stop===!0&&dn(e);const l=n.modifiers.color;let i=n.modifiers.center;i=i===!0||r===!0;const c=document.createElement("span"),u=document.createElement("span"),v=jn(e),{left:m,top:p,width:y,height:b}=t.getBoundingClientRect(),g=Math.sqrt(y*y+b*b),w=g/2,L=`${(y-g)/2}px`,$=i?L:`${v.left-m-w}px`,F=`${(b-g)/2}px`,A=i?F:`${v.top-p-w}px`;u.className="q-ripple__inner",kc(u,{height:`${g}px`,width:`${g}px`,transform:`translate3d(${$},${A},0) scale3d(.2,.2,1)`,opacity:0}),c.className=`q-ripple${l?" text-"+l:""}`,c.setAttribute("dir","ltr"),c.appendChild(u),t.appendChild(c);const S=()=>{c.remove(),clearTimeout(x)};n.abort.push(S);let x=setTimeout(()=>{u.classList.add("q-ripple__inner--enter"),u.style.transform=`translate3d(${L},${F},0) scale3d(1,1,1)`,u.style.opacity=.2,x=setTimeout(()=>{u.classList.remove("q-ripple__inner--enter"),u.classList.add("q-ripple__inner--leave"),u.style.opacity=0,x=setTimeout(()=>{c.remove(),n.abort.splice(n.abort.indexOf(S),1)},275)},250)},50)}function af(e,{modifiers:t,value:n,arg:r}){const l=Object.assign({},e.cfg.ripple,t,n);e.modifiers={early:l.early===!0,stop:l.stop===!0,center:l.center===!0,color:l.color||r,keyCodes:[].concat(l.keyCodes||13)}}var El=Eo({name:"ripple",beforeMount(e,t){const n=t.instance.$.appContext.config.globalProperties.$q.config||{};if(n.ripple===!1)return;const r={cfg:n,enabled:t.value!==!1,modifiers:{},abort:[],start(l){r.enabled===!0&&l.qSkipRipple!==!0&&l.type===(r.modifiers.early===!0?"pointerdown":"click")&&of(l,e,r,l.qKeyEvent===!0)},keystart:rh(l=>{r.enabled===!0&&l.qSkipRipple!==!0&&wo(l,r.modifiers.keyCodes)===!0&&l.type===`key${r.modifiers.early===!0?"down":"up"}`&&of(l,e,r,!0)},300)};af(r,t),e.__qripple=r,fn(r,"main",[[e,"pointerdown","start","passive"],[e,"click","start","passive"],[e,"keydown","keystart","passive"],[e,"keyup","keystart","passive"]])},updated(e,t){if(t.oldValue!==t.value){const n=e.__qripple;n!==void 0&&(n.enabled=t.value!==!1,n.enabled===!0&&Object(t.value)===t.value&&af(n,t))}},beforeUnmount(e){const t=e.__qripple;t!==void 0&&(t.abort.forEach(n=>{n()}),zn(t,"main"),delete e._qripple)}});const is={none:0,xs:4,sm:8,md:16,lg:24,xl:32},wq={xs:8,sm:10,md:14,lg:20,xl:24},xq=["button","submit","reset"],Sq=/[^\s]\/[^\s]/,lh=["flat","outline","push","unelevated"],Kc=(e,t)=>e.flat===!0?"flat":e.outline===!0?"outline":e.push===!0?"push":e.unelevated===!0?"unelevated":t,ih=e=>{const t=Kc(e);return t!==void 0?{[t]:!0}:{}},Yc={...ua,...Ur,type:{type:String,default:"button"},label:[Number,String],icon:String,iconRight:String,...lh.reduce((e,t)=>(e[t]=Boolean)&&e,{}),square:Boolean,round:Boolean,rounded:Boolean,glossy:Boolean,size:String,fab:Boolean,fabMini:Boolean,padding:String,color:String,textColor:String,noCaps:Boolean,noWrap:Boolean,dense:Boolean,tabindex:[Number,String],ripple:{type:[Boolean,Object],default:!0},align:{...Qc.align,default:"center"},stack:Boolean,stretch:Boolean,loading:{type:Boolean,default:null},disable:Boolean};function kq(e){const t=ca(e,wq),n=Uc(e),{hasRouterLink:r,hasLink:l,linkTag:i,linkAttrs:c,navigateOnClick:u}=Ts({fallbackTag:"button"}),v=f(()=>{const $=e.fab===!1&&e.fabMini===!1?t.value:{};return e.padding!==void 0?Object.assign({},$,{padding:e.padding.split(/\s+/).map(F=>F in is?is[F]+"px":F).join(" "),minWidth:"0",minHeight:"0"}):$}),m=f(()=>e.rounded===!0||e.fab===!0||e.fabMini===!0),p=f(()=>e.disable!==!0&&e.loading!==!0),y=f(()=>p.value===!0?e.tabindex||0:-1),b=f(()=>Kc(e,"standard")),g=f(()=>{const $={tabindex:y.value};return l.value===!0?Object.assign($,c.value):xq.includes(e.type)===!0&&($.type=e.type),i.value==="a"?(e.disable===!0?$["aria-disabled"]="true":$.href===void 0&&($.role="button"),r.value!==!0&&Sq.test(e.type)===!0&&($.type=e.type)):e.disable===!0&&($.disabled="",$["aria-disabled"]="true"),e.loading===!0&&e.percentage!==void 0&&Object.assign($,{role:"progressbar","aria-valuemin":0,"aria-valuemax":100,"aria-valuenow":e.percentage}),$}),w=f(()=>{let $;e.color!==void 0?$=e.flat===!0||e.outline===!0?`text-${e.textColor||e.color}`:`bg-${e.color} text-${e.textColor||"white"}`:e.textColor&&($=`text-${e.textColor}`);const F=e.round===!0?"round":`rectangle${m.value===!0?" q-btn--rounded":e.square===!0?" q-btn--square":""}`;return`q-btn--${b.value} q-btn--${F}`+($!==void 0?" "+$:"")+(p.value===!0?" q-btn--actionable q-focusable q-hoverable":e.disable===!0?" disabled":"")+(e.fab===!0?" q-btn--fab":e.fabMini===!0?" q-btn--fab-mini":"")+(e.noCaps===!0?" q-btn--no-uppercase":"")+(e.dense===!0?" q-btn--dense":"")+(e.stretch===!0?" no-border-radius self-stretch":"")+(e.glossy===!0?" glossy":"")+(e.square?" q-btn--square":"")}),L=f(()=>n.value+(e.stack===!0?" column":" row")+(e.noWrap===!0?" no-wrap text-no-wrap":"")+(e.loading===!0?" q-btn__content--hidden":""));return{classes:w,style:v,innerClasses:L,attributes:g,hasLink:l,linkTag:i,navigateOnClick:u,isActionable:p}}const{passiveCapture:yo}=Zt;let _r=null,wr=null,xr=null;var Rt=we({name:"QBtn",props:{...Yc,percentage:Number,darkPercentage:Boolean,onTouchstart:[Function,Array]},emits:["click","keydown","mousedown","keyup"],setup(e,{slots:t,emit:n}){const{proxy:r}=Ve(),{classes:l,style:i,innerClasses:c,attributes:u,hasLink:v,linkTag:m,navigateOnClick:p,isActionable:y}=kq(e),b=X(null),g=X(null);let w,L=null,$=null;const F=f(()=>e.label!==void 0&&e.label!==null&&e.label!==""),A=f(()=>e.disable!==!0&&e.ripple!==!1&&{keyCodes:v.value===!0?[13,32]:[13],...e.ripple===!0?{}:e.ripple}),S=f(()=>({center:e.round})),x=f(()=>{const O=Math.max(0,Math.min(100,e.percentage));return O>0?{transition:"transform 0.6s",transform:`translateX(${O-100}%)`}:{}}),P=f(()=>{if(e.loading===!0)return{onMousedown:T,onTouchstart:T,onClick:T,onKeydown:T,onKeyup:T};if(y.value===!0){const O={onClick:E,onKeydown:D,onMousedown:I};if(r.$q.platform.has.touch===!0){const J=e.onTouchstart!==void 0?"":"Passive";O[`onTouchstart${J}`]=z}return O}return{onClick:bt}}),M=f(()=>({ref:b,class:"q-btn q-btn-item non-selectable no-outline "+l.value,style:i.value,...u.value,...P.value}));function E(O){if(b.value!==null){if(O!==void 0){if(O.defaultPrevented===!0)return;const J=document.activeElement;if(e.type==="submit"&&J!==document.body&&b.value.contains(J)===!1&&J.contains(b.value)===!1){b.value.focus();const se=()=>{document.removeEventListener("keydown",bt,!0),document.removeEventListener("keyup",se,yo),b.value!==null&&b.value.removeEventListener("blur",se,yo)};document.addEventListener("keydown",bt,!0),document.addEventListener("keyup",se,yo),b.value.addEventListener("blur",se,yo)}}p(O)}}function D(O){b.value!==null&&(n("keydown",O),wo(O,[13,32])===!0&&wr!==b.value&&(wr!==null&&H(),O.defaultPrevented!==!0&&(b.value.focus(),wr=b.value,b.value.classList.add("q-btn--active"),document.addEventListener("keyup",N,!0),b.value.addEventListener("blur",N,yo)),bt(O)))}function z(O){b.value!==null&&(n("touchstart",O),O.defaultPrevented!==!0&&(_r!==b.value&&(_r!==null&&H(),_r=b.value,L=O.target,L.addEventListener("touchcancel",N,yo),L.addEventListener("touchend",N,yo)),w=!0,$!==null&&clearTimeout($),$=setTimeout(()=>{$=null,w=!1},200)))}function I(O){b.value!==null&&(O.qSkipRipple=w===!0,n("mousedown",O),O.defaultPrevented!==!0&&xr!==b.value&&(xr!==null&&H(),xr=b.value,b.value.classList.add("q-btn--active"),document.addEventListener("mouseup",N,yo)))}function N(O){if(b.value!==null&&(O===void 0||O.type!=="blur"||document.activeElement!==b.value)){if(O!==void 0&&O.type==="keyup"){if(wr===b.value&&wo(O,[13,32])===!0){const J=new MouseEvent("click",O);J.qKeyEvent=!0,O.defaultPrevented===!0&&$n(J),O.cancelBubble===!0&&dn(J),b.value.dispatchEvent(J),bt(O),O.qKeyEvent=!0}n("keyup",O)}H()}}function H(O){const J=g.value;O===!0||_r!==b.value&&xr!==b.value||J===null||J===document.activeElement||(J.setAttribute("tabindex",-1),J.focus()),_r===b.value&&(L!==null&&(L.removeEventListener("touchcancel",N,yo),L.removeEventListener("touchend",N,yo)),_r=L=null),xr===b.value&&(document.removeEventListener("mouseup",N,yo),xr=null),wr===b.value&&(document.removeEventListener("keyup",N,!0),b.value!==null&&b.value.removeEventListener("blur",N,yo),wr=null),b.value!==null&&b.value.classList.remove("q-btn--active")}function T(O){bt(O),O.qSkipRipple=!0}return qt(()=>{H(!0)}),Object.assign(r,{click:E}),()=>{let O=[];e.icon!==void 0&&O.push(d(Et,{name:e.icon,left:e.stack!==!0&&F.value===!0,role:"img","aria-hidden":"true"})),F.value===!0&&O.push(d("span",{class:"block"},[e.label])),O=hn(t.default,O),e.iconRight!==void 0&&e.round===!1&&O.push(d(Et,{name:e.iconRight,right:e.stack!==!0&&F.value===!0,role:"img","aria-hidden":"true"}));const J=[d("span",{class:"q-focus-helper",ref:g})];return e.loading===!0&&e.percentage!==void 0&&J.push(d("span",{class:"q-btn__progress absolute-full overflow-hidden"+(e.darkPercentage===!0?" q-btn__progress--dark":"")},[d("span",{class:"q-btn__progress-indicator fit block",style:x.value})])),J.push(d("span",{class:"q-btn__content text-center col items-center q-anchor--skip "+c.value},O)),e.loading!==null&&J.push(d(yn,{name:"q-transition--fade"},()=>e.loading===!0?[d("span",{key:"loading",class:"absolute-full flex flex-center"},t.loading!==void 0?t.loading():[d(So)])]:null)),Bo(d(m.value,M.value,J),[[El,A.value,void 0,S.value]])}}}),Gc=we({name:"QBtnGroup",props:{unelevated:Boolean,outline:Boolean,flat:Boolean,rounded:Boolean,square:Boolean,push:Boolean,stretch:Boolean,glossy:Boolean,spread:Boolean},setup(e,{slots:t}){const n=f(()=>{const r=["unelevated","outline","flat","rounded","square","push","stretch","glossy"].filter(l=>e[l]===!0).map(l=>`q-btn-group--${l}`).join(" ");return`q-btn-group row no-wrap${r.length!==0?" "+r:""}`+(e.spread===!0?" q-btn-group--spread":" inline")});return()=>d("div",{class:n.value},Ge(t.default))}});function Po(){if(window.getSelection!==void 0){const e=window.getSelection();e.empty!==void 0?e.empty():e.removeAllRanges!==void 0&&(e.removeAllRanges(),ts.is.mobile!==!0&&e.addRange(document.createRange()))}else document.selection!==void 0&&document.selection.empty()}const Xc={target:{default:!0},noParentEvent:Boolean,contextMenu:Boolean};function Zc({showing:e,avoidEmit:t,configureAnchorEl:n}){const{props:r,proxy:l,emit:i}=Ve(),c=X(null);let u=null;function v(g){return c.value!==null&&(g===void 0||g.touches===void 0||g.touches.length<=1)}const m={};function p(){zn(m,"anchor")}function y(g){for(c.value=g;c.value.classList.contains("q-anchor--skip");)c.value=c.value.parentNode;n()}function b(){if(r.target===!1||r.target===""||l.$el.parentNode===null)c.value=null;else if(r.target===!0)y(l.$el.parentNode);else{let g=r.target;if(typeof r.target=="string")try{g=document.querySelector(r.target)}catch{g=void 0}g!=null?(c.value=g.$el||g,n()):(c.value=null,console.error(`Anchor: target "${r.target}" not found`))}}return n===void 0&&(Object.assign(m,{hide(g){l.hide(g)},toggle(g){l.toggle(g),g.qAnchorHandled=!0},toggleKey(g){wo(g,13)===!0&&m.toggle(g)},contextClick(g){l.hide(g),$n(g),Tt(()=>{l.show(g),g.qAnchorHandled=!0})},prevent:$n,mobileTouch(g){if(m.mobileCleanup(g),v(g)!==!0)return;l.hide(g),c.value.classList.add("non-selectable");const w=g.target;fn(m,"anchor",[[w,"touchmove","mobileCleanup","passive"],[w,"touchend","mobileCleanup","passive"],[w,"touchcancel","mobileCleanup","passive"],[c.value,"contextmenu","prevent","notPassive"]]),u=setTimeout(()=>{u=null,l.show(g),g.qAnchorHandled=!0},300)},mobileCleanup(g){c.value.classList.remove("non-selectable"),u!==null&&(clearTimeout(u),u=null),e.value===!0&&g!==void 0&&Po()}}),n=function(g=r.contextMenu){if(r.noParentEvent===!0||c.value===null)return;let w;w=g===!0?l.$q.platform.is.mobile===!0?[[c.value,"touchstart","mobileTouch","passive"]]:[[c.value,"mousedown","hide","passive"],[c.value,"contextmenu","contextClick","notPassive"]]:[[c.value,"click","toggle","passive"],[c.value,"keyup","toggleKey","passive"]],fn(m,"anchor",w)}),_e(()=>r.contextMenu,g=>{c.value!==null&&(p(),n(g))}),_e(()=>r.target,()=>{c.value!==null&&p(),b()}),_e(()=>r.noParentEvent,g=>{c.value!==null&&(g===!0?p():n())}),jt(()=>{b(),t!==!0&&r.modelValue===!0&&c.value===null&&i("update:modelValue",!1)}),qt(()=>{u!==null&&clearTimeout(u),p()}),{anchorEl:c,canShow:v,anchorEvents:m}}function sh(e,t){const n=X(null);let r;function l(u,v){const m=`${v!==void 0?"add":"remove"}EventListener`,p=v!==void 0?v:r;u!==window&&u[m]("scroll",p,Zt.passive),window[m]("scroll",p,Zt.passive),r=v}function i(){n.value!==null&&(l(n.value),n.value=null)}const c=_e(()=>e.noParentEvent,()=>{n.value!==null&&(i(),t())});return qt(c),{localScrollTarget:n,unconfigureScrollTarget:i,changeScrollEvent:l}}const jr={modelValue:{type:Boolean,default:null},"onUpdate:modelValue":[Function,Array]},Wr=["beforeShow","show","beforeHide","hide"];function Kr({showing:e,canShow:t,hideOnRouteChange:n,handleShow:r,handleHide:l,processOnMount:i}){const c=Ve(),{props:u,emit:v,proxy:m}=c;let p;function y(A){e.value===!0?w(A):b(A)}function b(A){if(u.disable===!0||A!==void 0&&A.qAnchorHandled===!0||t!==void 0&&t(A)!==!0)return;const S=u["onUpdate:modelValue"]!==void 0;S===!0&&(v("update:modelValue",!0),p=A,Tt(()=>{p===A&&(p=void 0)})),u.modelValue!==null&&S!==!1||g(A)}function g(A){e.value!==!0&&(e.value=!0,v("beforeShow",A),r!==void 0?r(A):v("show",A))}function w(A){if(u.disable===!0)return;const S=u["onUpdate:modelValue"]!==void 0;S===!0&&(v("update:modelValue",!1),p=A,Tt(()=>{p===A&&(p=void 0)})),u.modelValue!==null&&S!==!1||L(A)}function L(A){e.value!==!1&&(e.value=!1,v("beforeHide",A),l!==void 0?l(A):v("hide",A))}function $(A){u.disable===!0&&A===!0?u["onUpdate:modelValue"]!==void 0&&v("update:modelValue",!1):A===!0!==e.value&&(A===!0?g:L)(p)}_e(()=>u.modelValue,$),n!==void 0&&Wc(c)===!0&&_e(()=>m.$route.fullPath,()=>{n.value===!0&&e.value===!0&&w()}),i===!0&&jt(()=>{$(u.modelValue)});const F={show:b,hide:w,toggle:y};return Object.assign(m,F),F}let Wa=[],ql=[];function uh(e){ql=ql.filter(t=>t!==e)}function Cq(e){uh(e),ql.push(e)}function rf(e){uh(e),ql.length===0&&Wa.length!==0&&(Wa[Wa.length-1](),Wa=[])}function Yr(e){ql.length===0?e():Wa.push(e)}function qq(e){Wa=Wa.filter(t=>t!==e)}const Er=[],xl=[];let $q=1,xa=document.body;function Jc(e,t){const n=document.createElement("div");if(n.id=t!==void 0?`q-portal--${t}--${$q++}`:e,os.globalNodes!==void 0){const r=os.globalNodes.class;r!==void 0&&(n.className=r)}return xa.appendChild(n),Er.push(n),xl.push(t),n}function ch(e){const t=Er.indexOf(e);Er.splice(t,1),xl.splice(t,1),e.remove()}function Tq(e){if(e===xa)return;if(xa=e,xa===document.body||xl.reduce((n,r)=>r==="dialog"?n+1:n,0)<2)return void Er.forEach(n=>{n.contains(xa)===!1&&xa.appendChild(n)});const t=xl.lastIndexOf("dialog");for(let n=0;nt.contentEl!==null&&t.contentEl.contains(e))}function dh(e,t){do{if(e.$options.name==="QMenu"){if(e.hide(t),e.$props.separateClosePopup===!0)return Yi(e)}else if(e.__qPortal===!0){const n=Yi(e);return n!==void 0&&n.$options.name==="QPopupProxy"?(e.hide(t),n):e}e=Yi(e)}while(e!=null)}function Lq(e,t,n){for(;n!==0&&e!==void 0&&e!==null;){if(e.__qPortal===!0){if(n--,e.$options.name==="QMenu"){e=dh(e,t);continue}e.hide(t)}e=Yi(e)}}function Aq(e){for(e=e.parent;e!=null;){if(e.type.name==="QGlobalDialog")return!0;if(e.type.name==="QDialog"||e.type.name==="QMenu")return!1;e=e.parent}return!1}function ed(e,t,n,r){const l=X(!1),i=X(!1);let c=null;const u={},v=r==="dialog"&&Aq(e);function m(y){if(y===!0)return rf(u),void(i.value=!0);i.value=!1,l.value===!1&&(v===!1&&c===null&&(c=Jc(!1,r)),l.value=!0,Fr.push(e.proxy),Cq(u))}function p(y){if(i.value=!1,y!==!0)return;rf(u),l.value=!1;const b=Fr.indexOf(e.proxy);b!==-1&&Fr.splice(b,1),c!==null&&(ch(c),c=null)}return Ml(()=>{p(!0)}),e.proxy.__qPortal=!0,qn(e.proxy,"contentEl",()=>t.value),{showPortal:m,hidePortal:p,portalIsActive:l,portalIsAccessible:i,renderPortal:()=>v===!0?n():l.value===!0?[d(Tx,{to:c},n())]:void 0}}const Fl={transitionShow:{type:String,default:"fade"},transitionHide:{type:String,default:"fade"},transitionDuration:{type:[String,Number],default:300}};function Ms(e,t=()=>{},n=()=>{}){return{transitionProps:f(()=>{const r=`q-transition--${e.transitionShow||t()}`,l=`q-transition--${e.transitionHide||n()}`;return{appear:!0,enterFromClass:`${r}-enter-from`,enterActiveClass:`${r}-enter-active`,enterToClass:`${r}-enter-to`,leaveFromClass:`${l}-leave-from`,leaveActiveClass:`${l}-leave-active`,leaveToClass:`${l}-leave-to`}}),transitionStyle:f(()=>`--q-transition-duration: ${e.transitionDuration}ms`)}}function Vr(){let e;const t=Ve();function n(){e=void 0}return ia(n),qt(n),{removeTick:n,registerTick(r){e=r,Tt(()=>{e===r&&(Bl(t)===!1&&e(),e=void 0)})}}}function Nr(){let e=null;const t=Ve();function n(){e!==null&&(clearTimeout(e),e=null)}return ia(n),qt(n),{removeTimeout:n,registerTimeout(r,l){n(),Bl(t)===!1&&(e=setTimeout(r,l))}}}const Pq=[null,document,document.body,document.scrollingElement,document.documentElement];function Qo(e,t){let n=_q(t);if(n===void 0){if(e==null)return window;n=e.closest(".scroll,.scroll-y,.overflow-auto")}return Pq.includes(n)?window:n}function Pi(e){return(e===window?document.body:e).scrollHeight}function Ca(e){return e===window?window.pageYOffset||window.scrollY||document.body.scrollTop||0:e.scrollTop}function Ls(e){return e===window?window.pageXOffset||window.scrollX||document.body.scrollLeft||0:e.scrollLeft}function vh(e,t,n=0){const r=arguments[3]===void 0?performance.now():arguments[3],l=Ca(e);n<=0?l!==t&&Cc(e,t):requestAnimationFrame(i=>{const c=i-r,u=l+(t-l)/Math.max(c,n)*c;Cc(e,u),u!==t&&vh(e,t,n-c,i)})}function fh(e,t,n=0){const r=arguments[3]===void 0?performance.now():arguments[3],l=Ls(e);n<=0?l!==t&&qc(e,t):requestAnimationFrame(i=>{const c=i-r,u=l+(t-l)/Math.max(c,n)*c;qc(e,u),u!==t&&fh(e,t,n-c,i)})}function Cc(e,t){e!==window?e.scrollTop=t:window.scrollTo(window.pageXOffset||window.scrollX||document.body.scrollLeft||0,t)}function qc(e,t){e!==window?e.scrollLeft=t:window.scrollTo(t,window.pageYOffset||window.scrollY||document.body.scrollTop||0)}function Ir(e,t,n){n?vh(e,t,n):Cc(e,t)}function Gu(e,t,n){n?fh(e,t,n):qc(e,t)}let Bi;function Gi(){if(Bi!==void 0)return Bi;const e=document.createElement("p"),t=document.createElement("div");kc(e,{width:"100%",height:"200px"}),kc(t,{position:"absolute",top:"0px",left:"0px",visibility:"hidden",width:"200px",height:"150px",overflow:"hidden"}),t.appendChild(e),document.body.appendChild(t);const n=e.offsetWidth;t.style.overflow="scroll";let r=e.offsetWidth;return n===r&&(r=t.clientWidth),t.remove(),Bi=n-r,Bi}function Bq(e,t=!0){return!(!e||e.nodeType!==Node.ELEMENT_NODE)&&(t?e.scrollHeight>e.clientHeight&&(e.classList.contains("scroll")||e.classList.contains("overflow-auto")||["auto","scroll"].includes(window.getComputedStyle(e)["overflow-y"])):e.scrollWidth>e.clientWidth&&(e.classList.contains("scroll")||e.classList.contains("overflow-auto")||["auto","scroll"].includes(window.getComputedStyle(e)["overflow-x"])))}const Ga=[];let Hr;function Eq(e){Hr=e.keyCode===27}function Fq(){Hr===!0&&(Hr=!1)}function Vq(e){Hr===!0&&(Hr=!1,wo(e,27)===!0&&Ga[Ga.length-1](e))}function ph(e){window[e]("keydown",Eq),window[e]("blur",Fq),window[e]("keyup",Vq),Hr=!1}function hh(e){ut.is.desktop===!0&&(Ga.push(e),Ga.length===1&&ph("addEventListener"))}function ss(e){const t=Ga.indexOf(e);t>-1&&(Ga.splice(t,1),Ga.length===0&&ph("removeEventListener"))}const Xa=[];function mh(e){Xa[Xa.length-1](e)}function gh(e){ut.is.desktop===!0&&(Xa.push(e),Xa.length===1&&document.body.addEventListener("focusin",mh))}function $c(e){const t=Xa.indexOf(e);t>-1&&(Xa.splice(t,1),Xa.length===0&&document.body.removeEventListener("focusin",mh))}const{notPassiveCapture:us}=Zt,Za=[];function cs(e){const t=e.target;if(t===void 0||t.nodeType===8||t.classList.contains("no-pointer-events")===!0)return;let n=Fr.length-1;for(;n>=0;){const r=Fr[n].$;if(r.type.name!=="QTooltip"){if(r.type.name!=="QDialog")break;if(r.props.seamless!==!0)return;n--}else n--}for(let r=Za.length-1;r>=0;r--){const l=Za[r];if(l.anchorEl.value!==null&&l.anchorEl.value.contains(t)!==!1||t!==document.body&&(l.innerRef.value===null||l.innerRef.value.contains(t)!==!1))return;e.qClickOutside=!0,l.onClickOutside(e)}}function bh(e){Za.push(e),Za.length===1&&(document.addEventListener("mousedown",cs,us),document.addEventListener("touchstart",cs,us))}function ds(e){const t=Za.findIndex(n=>n===e);t>-1&&(Za.splice(t,1),Za.length===0&&(document.removeEventListener("mousedown",cs,us),document.removeEventListener("touchstart",cs,us)))}let lf,sf;function vs(e){const t=e.split(" ");return t.length===2&&(["top","center","bottom"].includes(t[0])!==!0?(console.error("Anchor/Self position must start with one of top/center/bottom"),!1):["left","middle","right","start","end"].includes(t[1])===!0||(console.error("Anchor/Self position must end with one of left/middle/right/start/end"),!1))}function yh(e){return!e||e.length===2&&typeof e[0]=="number"&&typeof e[1]=="number"}const Tc={"start#ltr":"left","start#rtl":"right","end#ltr":"right","end#rtl":"left"};function fs(e,t){const n=e.split(" ");return{vertical:n[0],horizontal:Tc[`${n[1]}#${t===!0?"rtl":"ltr"}`]}}function Iq(e,t){let{top:n,left:r,right:l,bottom:i,width:c,height:u}=e.getBoundingClientRect();return t!==void 0&&(n-=t[1],r-=t[0],i+=t[1],l+=t[0],c+=t[0],u+=t[1]),{top:n,bottom:i,height:u,left:r,right:l,width:c,middle:r+(l-r)/2,center:n+(i-n)/2}}function Oq(e,t,n){let{top:r,left:l}=e.getBoundingClientRect();return r+=t.top,l+=t.left,n!==void 0&&(r+=n[1],l+=n[0]),{top:r,bottom:r+1,height:1,left:l,right:l+1,width:1,middle:l,center:r}}function Rq(e,t){return{top:0,center:t/2,bottom:t,left:0,middle:e/2,right:e}}function uf(e,t,n,r){return{top:e[n.vertical]-t[r.vertical],left:e[n.horizontal]-t[r.horizontal]}}function td(e,t=0){if(e.targetEl===null||e.anchorEl===null||t>5)return;if(e.targetEl.offsetHeight===0||e.targetEl.offsetWidth===0)return void setTimeout(()=>{td(e,t+1)},10);const{targetEl:n,offset:r,anchorEl:l,anchorOrigin:i,selfOrigin:c,absoluteOffset:u,fit:v,cover:m,maxHeight:p,maxWidth:y}=e;if(ut.is.ios===!0&&window.visualViewport!==void 0){const M=document.body.style,{offsetLeft:E,offsetTop:D}=window.visualViewport;E!==lf&&(M.setProperty("--q-pe-left",E+"px"),lf=E),D!==sf&&(M.setProperty("--q-pe-top",D+"px"),sf=D)}const{scrollLeft:b,scrollTop:g}=n,w=u===void 0?Iq(l,m===!0?[0,0]:r):Oq(l,u,r);Object.assign(n.style,{top:0,left:0,minWidth:null,minHeight:null,maxWidth:y||"100vw",maxHeight:p||"100vh",visibility:"visible"});const{offsetWidth:L,offsetHeight:$}=n,{elWidth:F,elHeight:A}=v===!0||m===!0?{elWidth:Math.max(w.width,L),elHeight:m===!0?Math.max(w.height,$):$}:{elWidth:L,elHeight:$};let S={maxWidth:y,maxHeight:p};v!==!0&&m!==!0||(S.minWidth=w.width+"px",m===!0&&(S.minHeight=w.height+"px")),Object.assign(n.style,S);const x=Rq(F,A);let P=uf(w,x,i,c);if(u===void 0||r===void 0)Xu(P,w,x,i,c);else{const{top:M,left:E}=P;Xu(P,w,x,i,c);let D=!1;if(P.top!==M){D=!0;const z=2*r[1];w.center=w.top-=z,w.bottom-=z+2}if(P.left!==E){D=!0;const z=2*r[0];w.middle=w.left-=z,w.right-=z+2}D===!0&&(P=uf(w,x,i,c),Xu(P,w,x,i,c))}S={top:P.top+"px",left:P.left+"px"},P.maxHeight!==void 0&&(S.maxHeight=P.maxHeight+"px",w.height>P.maxHeight&&(S.minHeight=S.maxHeight)),P.maxWidth!==void 0&&(S.maxWidth=P.maxWidth+"px",w.width>P.maxWidth&&(S.minWidth=S.maxWidth)),Object.assign(n.style,S),n.scrollTop!==g&&(n.scrollTop=g),n.scrollLeft!==b&&(n.scrollLeft=b)}function Xu(e,t,n,r,l){const i=n.bottom,c=n.right,u=Gi(),v=window.innerHeight-u,m=document.body.clientWidth;if(e.top<0||e.top+i>v)if(l.vertical==="center")e.top=t[r.vertical]>v/2?Math.max(0,v-i):0,e.maxHeight=Math.min(i,v);else if(t[r.vertical]>v/2){const p=Math.min(v,r.vertical==="center"?t.center:r.vertical===l.vertical?t.bottom:t.top);e.maxHeight=Math.min(i,p),e.top=Math.max(0,p-i)}else e.top=Math.max(0,r.vertical==="center"?t.center:r.vertical===l.vertical?t.top:t.bottom),e.maxHeight=Math.min(i,v-e.top);if(e.left<0||e.left+c>m)if(e.maxWidth=Math.min(c,m),l.horizontal==="middle")e.left=t[r.horizontal]>m/2?Math.max(0,m-c):0;else if(t[r.horizontal]>m/2){const p=Math.min(m,r.horizontal==="middle"?t.middle:r.horizontal===l.horizontal?t.right:t.left);e.maxWidth=Math.min(c,p),e.left=Math.max(0,p-e.maxWidth)}else e.left=Math.max(0,r.horizontal==="middle"?t.middle:r.horizontal===l.horizontal?t.left:t.right),e.maxWidth=Math.min(c,m-e.left)}["left","middle","right"].forEach(e=>{Tc[`${e}#ltr`]=e,Tc[`${e}#rtl`]=e});var Vl=we({name:"QMenu",inheritAttrs:!1,props:{...Xc,...jr,...Ft,...Fl,persistent:Boolean,autoClose:Boolean,separateClosePopup:Boolean,noRouteDismiss:Boolean,noRefocus:Boolean,noFocus:Boolean,fit:Boolean,cover:Boolean,square:Boolean,anchor:{type:String,validator:vs},self:{type:String,validator:vs},offset:{type:Array,validator:yh},scrollTarget:{default:void 0},touchPosition:Boolean,maxHeight:{type:String,default:null},maxWidth:{type:String,default:null}},emits:[...Wr,"click","escapeKey"],setup(e,{slots:t,emit:n,attrs:r}){let l,i,c,u=null;const v=Ve(),{proxy:m}=v,{$q:p}=m,y=X(null),b=X(!1),g=f(()=>e.persistent!==!0&&e.noRouteDismiss!==!0),w=Vt(e,p),{registerTick:L,removeTick:$}=Vr(),{registerTimeout:F}=Nr(),{transitionProps:A,transitionStyle:S}=Ms(e),{localScrollTarget:x,changeScrollEvent:P,unconfigureScrollTarget:M}=sh(e,j),{anchorEl:E,canShow:D}=Zc({showing:b}),{hide:z}=Kr({showing:b,canShow:D,handleShow:Se,handleHide:k,hideOnRouteChange:g,processOnMount:!0}),{showPortal:I,hidePortal:N,renderPortal:H}=ed(v,y,W,"menu"),T={anchorEl:E,innerRef:y,onClickOutside(C){if(e.persistent!==!0&&b.value===!0)return z(C),(C.type==="touchstart"||C.target.classList.contains("q-dialog__backdrop"))&&bt(C),!0}},O=f(()=>fs(e.anchor||(e.cover===!0?"center middle":"bottom start"),p.lang.rtl)),J=f(()=>e.cover===!0?O.value:fs(e.self||"top start",p.lang.rtl)),se=f(()=>(e.square===!0?" q-menu--square":"")+(w.value===!0?" q-menu--dark q-dark":"")),R=f(()=>e.autoClose===!0?{onClick:U}:{}),oe=f(()=>b.value===!0&&e.persistent!==!0);function le(){Yr(()=>{let C=y.value;C&&C.contains(document.activeElement)!==!0&&(C=C.querySelector("[autofocus][tabindex], [data-autofocus][tabindex]")||C.querySelector("[autofocus] [tabindex], [data-autofocus] [tabindex]")||C.querySelector("[autofocus], [data-autofocus]")||C,C.focus({preventScroll:!0}))})}function Se(C){if(u=e.noRefocus===!1?document.activeElement:null,gh(K),I(),j(),l=void 0,C!==void 0&&(e.touchPosition||e.contextMenu)){const Z=jn(C);if(Z.left!==void 0){const{top:ce,left:ge}=E.value.getBoundingClientRect();l={left:Z.left-ge,top:Z.top-ce}}}i===void 0&&(i=_e(()=>p.screen.width+"|"+p.screen.height+"|"+e.self+"|"+e.anchor+"|"+p.lang.rtl,ne)),e.noFocus!==!0&&document.activeElement.blur(),L(()=>{ne(),e.noFocus!==!0&&le()}),F(()=>{p.platform.is.ios===!0&&(c=e.autoClose,y.value.click()),ne(),I(!0),n("show",C)},e.transitionDuration)}function k(C){$(),N(),_(!0),u===null||C!==void 0&&C.qClickOutside===!0||(((C&&C.type.indexOf("key")===0?u.closest('[tabindex]:not([tabindex^="-"])'):void 0)||u).focus(),u=null),F(()=>{N(!0),n("hide",C)},e.transitionDuration)}function _(C){l=void 0,i!==void 0&&(i(),i=void 0),C!==!0&&b.value!==!0||($c(K),M(),ds(T),ss(G)),C!==!0&&(u=null)}function j(){E.value===null&&e.scrollTarget===void 0||(x.value=Qo(E.value,e.scrollTarget),P(x.value,ne))}function U(C){c!==!0?(dh(m,C),n("click",C)):c=!1}function K(C){oe.value===!0&&e.noFocus!==!0&&ah(y.value,C.target)!==!0&&le()}function G(C){n("escapeKey"),z(C)}function ne(){td({targetEl:y.value,offset:e.offset,anchorEl:E.value,anchorOrigin:O.value,selfOrigin:J.value,absoluteOffset:l,fit:e.fit,cover:e.cover,maxHeight:e.maxHeight,maxWidth:e.maxWidth})}function W(){return d(yn,A.value,()=>b.value===!0?d("div",{role:"menu",...r,ref:y,tabindex:-1,class:["q-menu q-position-engine scroll"+se.value,r.class],style:[r.style,S.value],...R.value},Ge(t.default)):null)}return _e(oe,C=>{C===!0?(hh(G),bh(T)):(ss(G),ds(T))}),qt(_),Object.assign(m,{focus:le,updatePosition:ne}),H}});let Zu,Ei=0;const Bn=new Array(256);for(let e=0;e<256;e++)Bn[e]=(e+256).toString(16).substring(1);const zq=(()=>{const e=typeof crypto<"u"?crypto:typeof window<"u"?window.crypto||window.msCrypto:void 0;if(e!==void 0){if(e.randomBytes!==void 0)return e.randomBytes;if(e.getRandomValues!==void 0)return t=>{const n=new Uint8Array(t);return e.getRandomValues(n),n}}return t=>{const n=[];for(let r=t;r>0;r--)n.push(Math.floor(256*Math.random()));return n}})(),cf=4096;function er(){(Zu===void 0||Ei+16>cf)&&(Ei=0,Zu=zq(cf));const e=Array.prototype.slice.call(Zu,Ei,Ei+=16);return e[6]=15&e[6]|64,e[8]=63&e[8]|128,Bn[e[0]]+Bn[e[1]]+Bn[e[2]]+Bn[e[3]]+"-"+Bn[e[4]]+Bn[e[5]]+"-"+Bn[e[6]]+Bn[e[7]]+"-"+Bn[e[8]]+Bn[e[9]]+"-"+Bn[e[10]]+Bn[e[11]]+Bn[e[12]]+Bn[e[13]]+Bn[e[14]]+Bn[e[15]]}const Nq=Object.keys(Yc),Hq=e=>Nq.reduce((t,n)=>{const r=e[n];return r!==void 0&&(t[n]=r),t},{});var _h=we({name:"QBtnDropdown",props:{...Yc,...Fl,modelValue:Boolean,split:Boolean,dropdownIcon:String,contentClass:[Array,String,Object],contentStyle:[Array,String,Object],cover:Boolean,persistent:Boolean,noRouteDismiss:Boolean,autoClose:Boolean,menuAnchor:{type:String,default:"bottom end"},menuSelf:{type:String,default:"top end"},menuOffset:Array,disableMainBtn:Boolean,disableDropdown:Boolean,noIconAnimation:Boolean,toggleAriaLabel:String},emits:["update:modelValue","click","beforeShow","show","beforeHide","hide"],setup(e,{slots:t,emit:n}){const{proxy:r}=Ve(),l=X(e.modelValue),i=X(null),c=er(),u=f(()=>{const x={"aria-expanded":l.value===!0?"true":"false","aria-haspopup":"true","aria-controls":c,"aria-label":e.toggleAriaLabel||r.$q.lang.label[l.value===!0?"collapse":"expand"](e.label)};return(e.disable===!0||e.split===!1&&e.disableMainBtn===!0||e.disableDropdown===!0)&&(x["aria-disabled"]="true"),x}),v=f(()=>"q-btn-dropdown__arrow"+(l.value===!0&&e.noIconAnimation===!1?" rotate-180":"")+(e.split===!1?" q-btn-dropdown__arrow-container":"")),m=f(()=>ih(e)),p=f(()=>Hq(e));function y(x){l.value=!0,n("beforeShow",x)}function b(x){n("show",x),n("update:modelValue",!0)}function g(x){l.value=!1,n("beforeHide",x)}function w(x){n("hide",x),n("update:modelValue",!1)}function L(x){n("click",x)}function $(x){dn(x),S(),n("click",x)}function F(x){i.value!==null&&i.value.toggle(x)}function A(x){i.value!==null&&i.value.show(x)}function S(x){i.value!==null&&i.value.hide(x)}return _e(()=>e.modelValue,x=>{i.value!==null&&i.value[x?"show":"hide"]()}),_e(()=>e.split,S),Object.assign(r,{show:A,hide:S,toggle:F}),jt(()=>{e.modelValue===!0&&A()}),()=>{const x=[d(Et,{class:v.value,name:e.dropdownIcon||r.$q.iconSet.arrow.dropdown})];return e.disableDropdown!==!0&&x.push(d(Vl,{ref:i,id:c,class:e.contentClass,style:e.contentStyle,cover:e.cover,fit:!0,persistent:e.persistent,noRouteDismiss:e.noRouteDismiss,autoClose:e.autoClose,anchor:e.menuAnchor,self:e.menuSelf,offset:e.menuOffset,separateClosePopup:!0,transitionShow:e.transitionShow,transitionHide:e.transitionHide,transitionDuration:e.transitionDuration,onBeforeShow:y,onShow:b,onBeforeHide:g,onHide:w},t.default)),e.split===!1?d(Rt,{class:"q-btn-dropdown q-btn-dropdown--simple",...p.value,...u.value,disable:e.disable===!0||e.disableMainBtn===!0,noWrap:!0,round:!1,onClick:L},{default:()=>Ge(t.label,[]).concat(x),loading:t.loading}):d(Gc,{class:"q-btn-dropdown q-btn-dropdown--split no-wrap q-btn-item",rounded:e.rounded,square:e.square,...m.value,glossy:e.glossy,stretch:e.stretch},()=>[d(Rt,{class:"q-btn-dropdown--current",...p.value,disable:e.disable===!0||e.disableMainBtn===!0,noWrap:!0,round:!1,onClick:$},{default:t.label,loading:t.loading}),d(Rt,{class:"q-btn-dropdown__arrow-container q-anchor--skip",...u.value,...m.value,disable:e.disable===!0||e.disableDropdown===!0,rounded:e.rounded,color:e.color,textColor:e.textColor,dense:e.dense,size:e.size,padding:e.padding,ripple:e.ripple},()=>x)])}}});const ko={name:String};function Il(e){return f(()=>({type:"hidden",name:e.name,value:e.modelValue}))}function La(e={}){return(t,n,r)=>{t[n](d("input",{class:"hidden"+(r||""),...e.value}))}}function nd(e){return f(()=>e.name||e.for)}var Dq=we({name:"QBtnToggle",props:{...ko,modelValue:{required:!0},options:{type:Array,required:!0,validator:e=>e.every(t=>("label"in t||"icon"in t||"slot"in t)&&"value"in t)},color:String,textColor:String,toggleColor:{type:String,default:"primary"},toggleTextColor:String,outline:Boolean,flat:Boolean,unelevated:Boolean,rounded:Boolean,push:Boolean,glossy:Boolean,size:String,padding:String,noCaps:Boolean,noWrap:Boolean,dense:Boolean,readonly:Boolean,disable:Boolean,stack:Boolean,stretch:Boolean,spread:Boolean,clearable:Boolean,ripple:{type:[Boolean,Object],default:!0}},emits:["update:modelValue","clear","click"],setup(e,{slots:t,emit:n}){const r=f(()=>e.options.find(b=>b.value===e.modelValue)!==void 0),l=f(()=>({type:"hidden",name:e.name,value:e.modelValue})),i=La(l),c=f(()=>ih(e)),u=f(()=>({rounded:e.rounded,dense:e.dense,...c.value})),v=f(()=>e.options.map((b,g)=>{const{attrs:w,value:L,slot:$,...F}=b;return{slot:$,props:{key:g,"aria-pressed":L===e.modelValue?"true":"false",...w,...F,...u.value,disable:e.disable===!0||F.disable===!0,color:L===e.modelValue?p(F,"toggleColor"):p(F,"color"),textColor:L===e.modelValue?p(F,"toggleTextColor"):p(F,"textColor"),noCaps:p(F,"noCaps")===!0,noWrap:p(F,"noWrap")===!0,size:p(F,"size"),padding:p(F,"padding"),ripple:p(F,"ripple"),stack:p(F,"stack")===!0,stretch:p(F,"stretch")===!0,onClick(A){m(L,b,A)}}}}));function m(b,g,w){e.readonly!==!0&&(e.modelValue===b?e.clearable===!0&&(n("update:modelValue",null,null),n("clear")):n("update:modelValue",b,g),n("click",w))}function p(b,g){return b[g]===void 0?e[g]:b[g]}function y(){const b=v.value.map(g=>d(Rt,g.props,g.slot!==void 0?t[g.slot]:void 0));return e.name!==void 0&&e.disable!==!0&&r.value===!0&&i(b,"push"),hn(t.default,b)}return()=>d(Gc,{class:"q-btn-toggle",...c.value,rounded:e.rounded,stretch:e.stretch,glossy:e.glossy,spread:e.spread},y)}}),od=we({name:"QCard",props:{...Ft,tag:{type:String,default:"div"},square:Boolean,flat:Boolean,bordered:Boolean},setup(e,{slots:t}){const{proxy:{$q:n}}=Ve(),r=Vt(e,n),l=f(()=>"q-card"+(r.value===!0?" q-card--dark q-dark":"")+(e.bordered===!0?" q-card--bordered":"")+(e.square===!0?" q-card--square no-border-radius":"")+(e.flat===!0?" q-card--flat no-shadow":""));return()=>d(e.tag,{class:l.value},Ge(t.default))}}),Sa=we({name:"QCardSection",props:{tag:{type:String,default:"div"},horizontal:Boolean},setup(e,{slots:t}){const n=f(()=>`q-card__section q-card__section--${e.horizontal===!0?"horiz row no-wrap":"vert"}`);return()=>d(e.tag,{class:n.value},Ge(t.default))}}),wh=we({name:"QCardActions",props:{...Qc,vertical:Boolean},setup(e,{slots:t}){const n=Uc(e),r=f(()=>`q-card__actions ${n.value} q-card__actions--${e.vertical===!0?"vert column":"horiz row"}`);return()=>d("div",{class:r.value},Ge(t.default))}});const ad={left:!0,right:!0,up:!0,down:!0,horizontal:!0,vertical:!0},Qq=Object.keys(ad);function ps(e){const t={};for(const n of Qq)e[n]===!0&&(t[n]=!0);return Object.keys(t).length===0?ad:(t.horizontal===!0?t.left=t.right=!0:t.left===!0&&t.right===!0&&(t.horizontal=!0),t.vertical===!0?t.up=t.down=!0:t.up===!0&&t.down===!0&&(t.vertical=!0),t.horizontal===!0&&t.vertical===!0&&(t.all=!0),t)}ad.all=!0;const Uq=["INPUT","TEXTAREA"];function hs(e,t){return t.event===void 0&&e.target!==void 0&&e.target.draggable!==!0&&typeof t.handler=="function"&&Uq.includes(e.target.nodeName.toUpperCase())===!1&&(e.qClonedBy===void 0||e.qClonedBy.indexOf(t.uid)===-1)}function jq(e){const t=[.06,6,50];return typeof e=="string"&&e.length&&e.split(":").forEach((n,r)=>{const l=parseFloat(n);l&&(t[r]=l)}),t}var xh=Eo({name:"touch-swipe",beforeMount(e,{value:t,arg:n,modifiers:r}){if(r.mouse!==!0&&ut.has.touch!==!0)return;const l=r.mouseCapture===!0?"Capture":"",i={handler:t,sensitivity:jq(n),direction:ps(r),noop:pn,mouseStart(c){hs(c,i)&&$s(c)&&(fn(i,"temp",[[document,"mousemove","move",`notPassive${l}`],[document,"mouseup","end","notPassiveCapture"]]),i.start(c,!0))},touchStart(c){if(hs(c,i)){const u=c.target;fn(i,"temp",[[u,"touchmove","move","notPassiveCapture"],[u,"touchcancel","end","notPassiveCapture"],[u,"touchend","end","notPassiveCapture"]]),i.start(c)}},start(c,u){ut.is.firefox===!0&&Br(e,!0);const v=jn(c);i.event={x:v.left,y:v.top,time:Date.now(),mouse:u===!0,dir:!1}},move(c){if(i.event===void 0)return;if(i.event.dir!==!1)return void bt(c);const u=Date.now()-i.event.time;if(u===0)return;const v=jn(c),m=v.left-i.event.x,p=Math.abs(m),y=v.top-i.event.y,b=Math.abs(y);if(i.event.mouse!==!0){if(pi.sensitivity[0]&&(i.event.dir=y<0?"up":"down"),i.direction.horizontal===!0&&p>b&&b<100&&g>i.sensitivity[0]&&(i.event.dir=m<0?"left":"right"),i.direction.up===!0&&pi.sensitivity[0]&&(i.event.dir="up"),i.direction.down===!0&&p0&&p<100&&w>i.sensitivity[0]&&(i.event.dir="down"),i.direction.left===!0&&p>b&&m<0&&b<100&&g>i.sensitivity[0]&&(i.event.dir="left"),i.direction.right===!0&&p>b&&m>0&&b<100&&g>i.sensitivity[0]&&(i.event.dir="right"),i.event.dir!==!1?(bt(c),i.event.mouse===!0&&(document.body.classList.add("no-pointer-events--children"),document.body.classList.add("non-selectable"),Po(),i.styleCleanup=L=>{i.styleCleanup=void 0,document.body.classList.remove("non-selectable");const $=()=>{document.body.classList.remove("no-pointer-events--children")};L===!0?setTimeout($,50):$()}),i.handler({evt:c,touch:i.event.mouse!==!0,mouse:i.event.mouse,direction:i.event.dir,duration:u,distance:{x:p,y:b}})):i.end(c)},end(c){i.event!==void 0&&(zn(i,"temp"),ut.is.firefox===!0&&Br(e,!1),i.styleCleanup!==void 0&&i.styleCleanup(!0),c!==void 0&&i.event.dir!==!1&&bt(c),i.event=void 0)}};if(e.__qtouchswipe=i,r.mouse===!0){const c=r.mouseCapture===!0||r.mousecapture===!0?"Capture":"";fn(i,"main",[[e,"mousedown","mouseStart",`passive${c}`]])}ut.has.touch===!0&&fn(i,"main",[[e,"touchstart","touchStart",`passive${r.capture===!0?"Capture":""}`],[e,"touchmove","noop","notPassiveCapture"]])},updated(e,t){const n=e.__qtouchswipe;n!==void 0&&(t.oldValue!==t.value&&(typeof t.value!="function"&&n.end(),n.handler=t.value),n.direction=ps(t.modifiers))},beforeUnmount(e){const t=e.__qtouchswipe;t!==void 0&&(zn(t,"main"),zn(t,"temp"),ut.is.firefox===!0&&Br(e,!1),t.styleCleanup!==void 0&&t.styleCleanup(),delete e.__qtouchswipe)}});function Ol(){const e=new Map;return{getCache:function(t,n){return e[t]===void 0?e[t]=n:e[t]},getCacheWithFn:function(t,n){return e[t]===void 0?e[t]=n():e[t]}}}const rd={name:{required:!0},disable:Boolean},df={setup(e,{slots:t}){return()=>d("div",{class:"q-panel scroll",role:"tabpanel"},Ge(t.default))}},ld={modelValue:{required:!0},animated:Boolean,infinite:Boolean,swipeable:Boolean,vertical:Boolean,transitionPrev:String,transitionNext:String,transitionDuration:{type:[String,Number],default:300},keepAlive:Boolean,keepAliveInclude:[String,Array,RegExp],keepAliveExclude:[String,Array,RegExp],keepAliveMax:Number},id=["update:modelValue","beforeTransition","transition"];function sd(){const{props:e,emit:t,proxy:n}=Ve(),{getCacheWithFn:r}=Ol();let l,i;const c=X(null),u=X(null);function v(T){const O=e.vertical===!0?"up":"left";E((n.$q.lang.rtl===!0?-1:1)*(T.direction===O?1:-1))}const m=f(()=>[[xh,v,void 0,{horizontal:e.vertical!==!0,vertical:e.vertical,mouse:!0}]]),p=f(()=>e.transitionPrev||`slide-${e.vertical===!0?"down":"right"}`),y=f(()=>e.transitionNext||`slide-${e.vertical===!0?"up":"left"}`),b=f(()=>`--q-transition-duration: ${e.transitionDuration}ms`),g=f(()=>typeof e.modelValue=="string"||typeof e.modelValue=="number"?e.modelValue:String(e.modelValue)),w=f(()=>({include:e.keepAliveInclude,exclude:e.keepAliveExclude,max:e.keepAliveMax})),L=f(()=>e.keepAliveInclude!==void 0||e.keepAliveExclude!==void 0);function $(){E(1)}function F(){E(-1)}function A(T){t("update:modelValue",T)}function S(T){return T!=null&&T!==""}function x(T){return l.findIndex(O=>O.props.name===T&&O.props.disable!==""&&O.props.disable!==!0)}function P(){return l.filter(T=>T.props.disable!==""&&T.props.disable!==!0)}function M(T){const O=T!==0&&e.animated===!0&&c.value!==-1?"q-transition--"+(T===-1?p.value:y.value):null;u.value!==O&&(u.value=O)}function E(T,O=c.value){let J=O+T;for(;J>-1&&J{i=!1});J+=T}e.infinite===!0&&l.length!==0&&O!==-1&&O!==l.length&&E(T,T===-1?l.length:-1)}function D(){const T=x(e.modelValue);return c.value!==T&&(c.value=T),!0}function z(){const T=S(e.modelValue)===!0&&D()&&l[c.value];return e.keepAlive===!0?[d(kp,w.value,[d(L.value===!0?r(g.value,()=>({...df,name:g.value})):df,{key:g.value,style:b.value},()=>T)])]:[d("div",{class:"q-panel scroll",style:b.value,key:g.value,role:"tabpanel"},[T])]}function I(){if(l.length!==0)return e.animated===!0?[d(yn,{name:u.value},z)]:z()}function N(T){return l=jc(Ge(T.default,[])).filter(O=>O.props!==null&&O.props.slot===void 0&&S(O.props.name)===!0),l.length}function H(){return l}return _e(()=>e.modelValue,(T,O)=>{const J=S(T)===!0?x(T):-1;i!==!0&&M(J===-1?0:J{t("transition",T,O)}))}),Object.assign(n,{next:$,previous:F,goTo:A}),{panelIndex:c,panelDirectives:m,updatePanelsList:N,updatePanelIndex:D,getPanelContent:I,getEnabledPanels:P,getPanels:H,isValidPanelName:S,keepAliveProps:w,needsUniqueKeepAliveWrapper:L,goToPanelByOffset:E,goToPanel:A,nextPanel:$,previousPanel:F}}let fl=0;const ud={fullscreen:Boolean,noRouteFullscreenExit:Boolean},cd=["update:fullscreen","fullscreen"];function dd(){const e=Ve(),{props:t,emit:n,proxy:r}=e;let l,i,c;const u=X(!1);function v(){u.value===!0?p():m()}function m(){u.value!==!0&&(u.value=!0,c=r.$el.parentNode,c.replaceChild(i,r.$el),document.body.appendChild(r.$el),fl++,fl===1&&document.body.classList.add("q-body--fullscreen-mixin"),l={handler:p},kl.add(l))}function p(){u.value===!0&&(l!==void 0&&(kl.remove(l),l=void 0),c.replaceChild(r.$el,i),u.value=!1,fl=Math.max(0,fl-1),fl===0&&(document.body.classList.remove("q-body--fullscreen-mixin"),r.$el.scrollIntoView!==void 0&&setTimeout(()=>{r.$el.scrollIntoView()})))}return Wc(e)===!0&&_e(()=>r.$route.fullPath,()=>{t.noRouteFullscreenExit!==!0&&p()}),_e(()=>t.fullscreen,y=>{u.value!==y&&v()}),_e(u,y=>{n("update:fullscreen",y),n("fullscreen",y)}),Ec(()=>{i=document.createElement("span")}),jt(()=>{t.fullscreen===!0&&m()}),qt(p),Object.assign(r,{toggleFullscreen:v,setFullscreen:m,exitFullscreen:p}),{inFullscreen:u,toggleFullscreen:v}}const Wq=["top","right","bottom","left"],Kq=["regular","flat","outline","push","unelevated"];var Yq=we({name:"QCarousel",props:{...Ft,...ld,...ud,transitionPrev:{type:String,default:"fade"},transitionNext:{type:String,default:"fade"},height:String,padding:Boolean,controlColor:String,controlTextColor:String,controlType:{type:String,validator:e=>Kq.includes(e),default:"flat"},autoplay:[Number,Boolean],arrows:Boolean,prevIcon:String,nextIcon:String,navigation:Boolean,navigationPosition:{type:String,validator:e=>Wq.includes(e)},navigationIcon:String,navigationActiveIcon:String,thumbnails:Boolean},emits:[...cd,...id],setup(e,{slots:t}){const{proxy:{$q:n}}=Ve(),r=Vt(e,n);let l,i=null;const{updatePanelsList:c,getPanelContent:u,panelDirectives:v,goToPanel:m,previousPanel:p,nextPanel:y,getEnabledPanels:b,panelIndex:g}=sd(),{inFullscreen:w}=dd(),L=f(()=>w.value!==!0&&e.height!==void 0?{height:e.height}:{}),$=f(()=>e.vertical===!0?"vertical":"horizontal"),F=f(()=>`q-carousel q-panel-parent q-carousel--with${e.padding===!0?"":"out"}-padding`+(w.value===!0?" fullscreen":"")+(r.value===!0?" q-carousel--dark q-dark":"")+(e.arrows===!0?` q-carousel--arrows-${$.value}`:"")+(e.navigation===!0?` q-carousel--navigation-${P.value}`:"")),A=f(()=>{const I=[e.prevIcon||n.iconSet.carousel[e.vertical===!0?"up":"left"],e.nextIcon||n.iconSet.carousel[e.vertical===!0?"down":"right"]];return e.vertical===!1&&n.lang.rtl===!0?I.reverse():I}),S=f(()=>e.navigationIcon||n.iconSet.carousel.navigationIcon),x=f(()=>e.navigationActiveIcon||S.value),P=f(()=>e.navigationPosition||(e.vertical===!0?"right":"bottom")),M=f(()=>({color:e.controlColor,textColor:e.controlTextColor,round:!0,[e.controlType]:!0,dense:!0}));function E(){const I=Cl(e.autoplay)===!0?Math.abs(e.autoplay):5e3;i!==null&&clearTimeout(i),i=setTimeout(()=>{i=null,I>=0?y():p()},I)}function D(I,N){return d("div",{class:`q-carousel__control q-carousel__navigation no-wrap absolute flex q-carousel__navigation--${I} q-carousel__navigation--${P.value}`+(e.controlColor!==void 0?` text-${e.controlColor}`:"")},[d("div",{class:"q-carousel__navigation-inner flex flex-center no-wrap"},b().map(N))])}function z(){const I=[];if(e.navigation===!0){const N=t["navigation-icon"]!==void 0?t["navigation-icon"]:T=>d(Rt,{key:"nav"+T.name,class:`q-carousel__navigation-icon q-carousel__navigation-icon--${T.active===!0?"":"in"}active`,...T.btnProps,onClick:T.onClick}),H=l-1;I.push(D("buttons",(T,O)=>{const J=T.props.name,se=g.value===O;return N({index:O,maxIndex:H,name:J,active:se,btnProps:{icon:se===!0?x.value:S.value,size:"sm",...M.value},onClick:()=>{m(J)}})}))}else if(e.thumbnails===!0){const N=e.controlColor!==void 0?` text-${e.controlColor}`:"";I.push(D("thumbnails",H=>{const T=H.props;return d("img",{key:"tmb#"+T.name,class:`q-carousel__thumbnail q-carousel__thumbnail--${T.name===e.modelValue?"":"in"}active`+N,src:T.imgSrc||T["img-src"],onClick:()=>{m(T.name)}})}))}return e.arrows===!0&&g.value>=0&&((e.infinite===!0||g.value>0)&&I.push(d("div",{key:"prev",class:`q-carousel__control q-carousel__arrow q-carousel__prev-arrow q-carousel__prev-arrow--${$.value} absolute flex flex-center`},[d(Rt,{icon:A.value[0],...M.value,onClick:p})])),(e.infinite===!0||g.valuee.modelValue,()=>{e.autoplay&&E()}),_e(()=>e.autoplay,I=>{I?E():i!==null&&(clearTimeout(i),i=null)}),jt(()=>{e.autoplay&&E()}),qt(()=>{i!==null&&clearTimeout(i)}),()=>(l=c(t),d("div",{class:F.value,style:L.value},[xo("div",{class:"q-carousel__slides-container"},u(),"sl-cont",e.swipeable,()=>v.value)].concat(z())))}}),Gq=we({name:"QCarouselSlide",props:{...rd,imgSrc:String},setup(e,{slots:t}){const n=f(()=>e.imgSrc?{backgroundImage:`url("${e.imgSrc}")`}:{});return()=>d("div",{class:"q-carousel__slide",style:n.value},Ge(t.default))}}),Xq=we({name:"QCarouselControl",props:{position:{type:String,default:"bottom-right",validator:e=>["top-right","top-left","bottom-right","bottom-left","top","right","bottom","left"].includes(e)},offset:{type:Array,default:()=>[18,18],validator:e=>e.length===2}},setup(e,{slots:t}){const n=f(()=>`q-carousel__control absolute absolute-${e.position}`),r=f(()=>({margin:`${e.offset[1]}px ${e.offset[0]}px`}));return()=>d("div",{class:n.value,style:r.value},Ge(t.default))}}),Zq=we({name:"QChatMessage",props:{sent:Boolean,label:String,bgColor:String,textColor:String,name:String,avatar:String,text:Array,stamp:String,size:String,labelHtml:Boolean,nameHtml:Boolean,textHtml:Boolean,stampHtml:Boolean},setup(e,{slots:t}){const n=f(()=>e.sent===!0?"sent":"received"),r=f(()=>`q-message-text-content q-message-text-content--${n.value}`+(e.textColor!==void 0?` text-${e.textColor}`:"")),l=f(()=>`q-message-text q-message-text--${n.value}`+(e.bgColor!==void 0?` text-${e.bgColor}`:"")),i=f(()=>"q-message-container row items-end no-wrap"+(e.sent===!0?" reverse":"")),c=f(()=>e.size!==void 0?`col-${e.size}`:""),u=f(()=>({msg:e.textHtml===!0?"innerHTML":"textContent",stamp:e.stampHtml===!0?"innerHTML":"textContent",name:e.nameHtml===!0?"innerHTML":"textContent",label:e.labelHtml===!0?"innerHTML":"textContent"}));function v(p){return t.stamp!==void 0?[p,d("div",{class:"q-message-stamp"},t.stamp())]:e.stamp?[p,d("div",{class:"q-message-stamp",[u.value.stamp]:e.stamp})]:[p]}function m(p,y){const b=y===!0?p.length>1?g=>g:g=>d("div",[g]):g=>d("div",{[u.value.msg]:g});return p.map((g,w)=>d("div",{key:w,class:l.value},[d("div",{class:r.value},v(b(g)))]))}return()=>{const p=[];t.avatar!==void 0?p.push(t.avatar()):e.avatar!==void 0&&p.push(d("img",{class:`q-message-avatar q-message-avatar--${n.value}`,src:e.avatar,"aria-hidden":"true"}));const y=[];t.name!==void 0?y.push(d("div",{class:`q-message-name q-message-name--${n.value}`},t.name())):e.name!==void 0&&y.push(d("div",{class:`q-message-name q-message-name--${n.value}`,[u.value.name]:e.name})),t.default!==void 0?y.push(m(jc(t.default()),!0)):e.text!==void 0&&y.push(m(e.text)),p.push(d("div",{class:c.value},y));const b=[];return t.label!==void 0?b.push(d("div",{class:"q-message-label"},t.label())):e.label!==void 0&&b.push(d("div",{class:"q-message-label",[u.value.label]:e.label})),b.push(d("div",{class:i.value},p)),d("div",{class:`q-message q-message-${n.value}`},b)}}});function Sh(e,t){const n=X(null),r=f(()=>e.disable===!0?null:d("span",{ref:n,class:"no-outline",tabindex:-1}));function l(i){const c=t.value;i!==void 0&&i.type.indexOf("key")===0?c!==null&&document.activeElement!==c&&c.contains(document.activeElement)===!0&&c.focus():n.value!==null&&(i===void 0||c!==null&&c.contains(i.target)===!0)&&n.value.focus()}return{refocusTargetEl:r,refocusTarget:l}}var kh={xs:30,sm:35,md:40,lg:50,xl:60};const Ch={...Ft,...ua,...ko,modelValue:{required:!0,default:null},val:{},trueValue:{default:!0},falseValue:{default:!1},indeterminateValue:{default:null},checkedIcon:String,uncheckedIcon:String,indeterminateIcon:String,toggleOrder:{type:String,validator:e=>e==="tf"||e==="ft"},toggleIndeterminate:Boolean,label:String,leftLabel:Boolean,color:String,keepColor:Boolean,dense:Boolean,disable:Boolean,tabindex:[String,Number]},qh=["update:modelValue"];function $h(e,t){const{props:n,slots:r,emit:l,proxy:i}=Ve(),{$q:c}=i,u=Vt(n,c),v=X(null),{refocusTargetEl:m,refocusTarget:p}=Sh(n,v),y=ca(n,kh),b=f(()=>n.val!==void 0&&Array.isArray(n.modelValue)),g=f(()=>{const H=ra(n.val);return b.value===!0?n.modelValue.findIndex(T=>ra(T)===H):-1}),w=f(()=>b.value===!0?g.value>-1:ra(n.modelValue)===ra(n.trueValue)),L=f(()=>b.value===!0?g.value===-1:ra(n.modelValue)===ra(n.falseValue)),$=f(()=>w.value===!1&&L.value===!1),F=f(()=>n.disable===!0?-1:n.tabindex||0),A=f(()=>`q-${e} cursor-pointer no-outline row inline no-wrap items-center`+(n.disable===!0?" disabled":"")+(u.value===!0?` q-${e}--dark`:"")+(n.dense===!0?` q-${e}--dense`:"")+(n.leftLabel===!0?" reverse":"")),S=f(()=>{const H=w.value===!0?"truthy":L.value===!0?"falsy":"indet",T=n.color===void 0||n.keepColor!==!0&&(e==="toggle"?w.value!==!0:L.value===!0)?"":` text-${n.color}`;return`q-${e}__inner relative-position non-selectable q-${e}__inner--${H}${T}`}),x=f(()=>{const H={type:"checkbox"};return n.name!==void 0&&Object.assign(H,{".checked":w.value,"^checked":w.value===!0?"checked":void 0,name:n.name,value:b.value===!0?n.val:n.trueValue}),H}),P=La(x),M=f(()=>{const H={tabindex:F.value,role:e==="toggle"?"switch":"checkbox","aria-label":n.label,"aria-checked":$.value===!0?"mixed":w.value===!0?"true":"false"};return n.disable===!0&&(H["aria-disabled"]="true"),H});function E(H){H!==void 0&&(bt(H),p(H)),n.disable!==!0&&l("update:modelValue",D(),H)}function D(){if(b.value===!0){if(w.value===!0){const H=n.modelValue.slice();return H.splice(g.value,1),H}return n.modelValue.concat([n.val])}if(w.value===!0){if(n.toggleOrder!=="ft"||n.toggleIndeterminate===!1)return n.falseValue}else{if(L.value!==!0)return n.toggleOrder!=="ft"?n.trueValue:n.falseValue;if(n.toggleOrder==="ft"||n.toggleIndeterminate===!1)return n.trueValue}return n.indeterminateValue}function z(H){H.keyCode!==13&&H.keyCode!==32||bt(H)}function I(H){H.keyCode!==13&&H.keyCode!==32||E(H)}const N=t(w,$);return Object.assign(i,{toggle:E}),()=>{const H=N();n.disable!==!0&&P(H,"unshift",` q-${e}__native absolute q-ma-none q-pa-none`);const T=[d("div",{class:S.value,style:y.value,"aria-hidden":"true"},H)];m.value!==null&&T.push(m.value);const O=n.label!==void 0?hn(r.default,[n.label]):Ge(r.default);return O!==void 0&&T.push(d("div",{class:`q-${e}__label q-anchor--skip`},O)),d("div",{ref:v,class:A.value,...M.value,onClick:E,onKeydown:z,onKeyup:I},T)}}const Jq=d("div",{key:"svg",class:"q-checkbox__bg absolute"},[d("svg",{class:"q-checkbox__svg fit absolute-full",viewBox:"0 0 24 24"},[d("path",{class:"q-checkbox__truthy",fill:"none",d:"M1.73,12.91 8.1,19.28 22.79,4.59"}),d("path",{class:"q-checkbox__indet",d:"M4,14H20V10H4"})])]);var Or=we({name:"QCheckbox",props:Ch,emits:qh,setup(e){function t(n,r){const l=f(()=>(n.value===!0?e.checkedIcon:r.value===!0?e.indeterminateIcon:e.uncheckedIcon)||null);return()=>l.value!==null?[d("div",{key:"icon",class:"q-checkbox__icon-container absolute-full flex flex-center no-wrap"},[d(Et,{class:"q-checkbox__icon",name:l.value})])]:[Jq]}return $h("checkbox",t)}});const e$={xs:8,sm:10,md:14,lg:20,xl:24};var vd=we({name:"QChip",props:{...Ft,...ua,dense:Boolean,icon:String,iconRight:String,iconRemove:String,iconSelected:String,label:[String,Number],color:String,textColor:String,modelValue:{type:Boolean,default:!0},selected:{type:Boolean,default:null},square:Boolean,outline:Boolean,clickable:Boolean,removable:Boolean,removeAriaLabel:String,tabindex:[String,Number],disable:Boolean,ripple:{type:[Boolean,Object],default:!0}},emits:["update:modelValue","update:selected","remove","click"],setup(e,{slots:t,emit:n}){const{proxy:{$q:r}}=Ve(),l=Vt(e,r),i=ca(e,e$),c=f(()=>e.selected===!0||e.icon!==void 0),u=f(()=>e.selected===!0?e.iconSelected||r.iconSet.chip.selected:e.icon),v=f(()=>e.iconRemove||r.iconSet.chip.remove),m=f(()=>e.disable===!1&&(e.clickable===!0||e.selected!==null)),p=f(()=>{const $=e.outline===!0&&e.color||e.textColor;return"q-chip row inline no-wrap items-center"+(e.outline===!1&&e.color!==void 0?` bg-${e.color}`:"")+($?` text-${$} q-chip--colored`:"")+(e.disable===!0?" disabled":"")+(e.dense===!0?" q-chip--dense":"")+(e.outline===!0?" q-chip--outline":"")+(e.selected===!0?" q-chip--selected":"")+(m.value===!0?" q-chip--clickable cursor-pointer non-selectable q-hoverable":"")+(e.square===!0?" q-chip--square":"")+(l.value===!0?" q-chip--dark q-dark":"")}),y=f(()=>{const $=e.disable===!0?{tabindex:-1,"aria-disabled":"true"}:{tabindex:e.tabindex||0},F={...$,role:"button","aria-hidden":"false","aria-label":e.removeAriaLabel||r.lang.label.remove};return{chip:$,remove:F}});function b($){$.keyCode===13&&g($)}function g($){e.disable||(n("update:selected",!e.selected),n("click",$))}function w($){$.keyCode!==void 0&&$.keyCode!==13||(bt($),e.disable===!1&&(n("update:modelValue",!1),n("remove")))}function L(){const $=[];m.value===!0&&$.push(d("div",{class:"q-focus-helper"})),c.value===!0&&$.push(d(Et,{class:"q-chip__icon q-chip__icon--left",name:u.value}));const F=e.label!==void 0?[d("div",{class:"ellipsis"},[e.label])]:void 0;return $.push(d("div",{class:"q-chip__content col row no-wrap items-center q-anchor--skip"},Dc(t.default,F))),e.iconRight&&$.push(d(Et,{class:"q-chip__icon q-chip__icon--right",name:e.iconRight})),e.removable===!0&&$.push(d(Et,{class:"q-chip__icon q-chip__icon--remove cursor-pointer",name:v.value,...y.value.remove,onClick:w,onKeyup:w})),$}return()=>{if(e.modelValue===!1)return;const $={class:p.value,style:i.value};return m.value===!0&&Object.assign($,y.value.chip,{onClick:g,onKeyup:b}),xo("div",$,L(),"ripple",e.ripple!==!1&&e.disable!==!0,()=>[[El,e.ripple]])}}});const fd={...ua,min:{type:Number,default:0},max:{type:Number,default:100},color:String,centerColor:String,trackColor:String,fontSize:String,rounded:Boolean,thickness:{type:Number,default:.2,validator:e=>e>=0&&e<=1},angle:{type:Number,default:0},showValue:Boolean,reverse:Boolean,instantFeedback:Boolean},Mc=50,Th=2*Mc,Mh=Th*Math.PI,t$=Math.round(1e3*Mh)/1e3;var pd=we({name:"QCircularProgress",props:{...fd,value:{type:Number,default:0},animationSpeed:{type:[String,Number],default:600},indeterminate:Boolean},setup(e,{slots:t}){const{proxy:{$q:n}}=Ve(),r=ca(e),l=f(()=>{const g=(n.lang.rtl===!0?-1:1)*e.angle;return{transform:e.reverse!==(n.lang.rtl===!0)?`scale3d(-1, 1, 1) rotate3d(0, 0, 1, ${-90-g}deg)`:`rotate3d(0, 0, 1, ${g-90}deg)`}}),i=f(()=>e.instantFeedback!==!0&&e.indeterminate!==!0?{transition:`stroke-dashoffset ${e.animationSpeed}ms ease 0s, stroke ${e.animationSpeed}ms ease`}:""),c=f(()=>Th/(1-e.thickness/2)),u=f(()=>`${c.value/2} ${c.value/2} ${c.value} ${c.value}`),v=f(()=>Jt(e.value,e.min,e.max)),m=f(()=>e.max-e.min),p=f(()=>e.thickness/2*c.value),y=f(()=>{const g=(e.max-v.value)/m.value,w=e.rounded===!0&&v.value{const g=[];e.centerColor!==void 0&&e.centerColor!=="transparent"&&g.push(d("circle",{class:`q-circular-progress__center text-${e.centerColor}`,fill:"currentColor",r:Mc-p.value/2,cx:c.value,cy:c.value})),e.trackColor!==void 0&&e.trackColor!=="transparent"&&g.push(b({cls:"track",thickness:p.value,offset:0,color:e.trackColor})),g.push(b({cls:"circle",thickness:p.value,offset:y.value,color:e.color,rounded:e.rounded===!0?"round":void 0}));const w=[d("svg",{class:"q-circular-progress__svg",style:l.value,viewBox:u.value,"aria-hidden":"true"},g)];return e.showValue===!0&&w.push(d("div",{class:"q-circular-progress__text absolute-full row flex-center content-center",style:{fontSize:e.fontSize}},t.default!==void 0?t.default():[d("div",v.value)])),d("div",{class:`q-circular-progress q-circular-progress--${e.indeterminate===!0?"in":""}determinate`,style:r.value,role:"progressbar","aria-valuemin":e.min,"aria-valuemax":e.max,"aria-valuenow":e.indeterminate===!0?void 0:v.value},Dc(t.internal,w))}}});function Ju(e,t,n){const r=jn(e);let l,i=r.left-t.event.x,c=r.top-t.event.y,u=Math.abs(i),v=Math.abs(c);const m=t.direction;m.horizontal===!0&&m.vertical!==!0?l=i<0?"left":"right":m.horizontal!==!0&&m.vertical===!0?l=c<0?"up":"down":m.up===!0&&c<0?(l="up",u>v&&(m.left===!0&&i<0?l="left":m.right===!0&&i>0&&(l="right"))):m.down===!0&&c>0?(l="down",u>v&&(m.left===!0&&i<0?l="left":m.right===!0&&i>0&&(l="right"))):m.left===!0&&i<0?(l="left",u0&&(l="down"))):m.right===!0&&i>0&&(l="right",u0&&(l="down")));let p=!1;if(l===void 0&&n===!1){if(t.event.isFirst===!0||t.event.lastDir===void 0)return{};l=t.event.lastDir,p=!0,l==="left"||l==="right"?(r.left-=i,u=0,i=0):(r.top-=c,v=0,c=0)}return{synthetic:p,payload:{evt:e,touch:t.event.mouse!==!0,mouse:t.event.mouse===!0,position:r,direction:l,isFirst:t.event.isFirst,isFinal:n===!0,duration:Date.now()-t.event.time,distance:{x:u,y:v},offset:{x:i,y:c},delta:{x:r.left-t.event.lastX,y:r.top-t.event.lastY}}}}let n$=0;var io=Eo({name:"touch-pan",beforeMount(e,{value:t,modifiers:n}){if(n.mouse!==!0&&ut.has.touch!==!0)return;function r(i,c){n.mouse===!0&&c===!0?bt(i):(n.stop===!0&&dn(i),n.prevent===!0&&$n(i))}const l={uid:"qvtp_"+n$++,handler:t,modifiers:n,direction:ps(n),noop:pn,mouseStart(i){hs(i,l)&&$s(i)&&(fn(l,"temp",[[document,"mousemove","move","notPassiveCapture"],[document,"mouseup","end","passiveCapture"]]),l.start(i,!0))},touchStart(i){if(hs(i,l)){const c=i.target;fn(l,"temp",[[c,"touchmove","move","notPassiveCapture"],[c,"touchcancel","end","passiveCapture"],[c,"touchend","end","passiveCapture"]]),l.start(i)}},start(i,c){if(ut.is.firefox===!0&&Br(e,!0),l.lastEvt=i,c===!0||n.stop===!0){if(l.direction.all!==!0&&(c!==!0||l.modifiers.mouseAllDir!==!0&&l.modifiers.mousealldir!==!0)){const m=i.type.indexOf("mouse")>-1?new MouseEvent(i.type,i):new TouchEvent(i.type,i);i.defaultPrevented===!0&&$n(m),i.cancelBubble===!0&&dn(m),Object.assign(m,{qKeyEvent:i.qKeyEvent,qClickOutside:i.qClickOutside,qAnchorHandled:i.qAnchorHandled,qClonedBy:i.qClonedBy===void 0?[l.uid]:i.qClonedBy.concat(l.uid)}),l.initialEvent={target:i.target,event:m}}dn(i)}const{left:u,top:v}=jn(i);l.event={x:u,y:v,time:Date.now(),mouse:c===!0,detected:!1,isFirst:!0,isFinal:!1,lastX:u,lastY:v}},move(i){if(l.event===void 0)return;const c=jn(i),u=c.left-l.event.x,v=c.top-l.event.y;if(u===0&&v===0)return;l.lastEvt=i;const m=l.event.mouse===!0,p=()=>{let g;r(i,m),n.preserveCursor!==!0&&n.preservecursor!==!0&&(g=document.documentElement.style.cursor||"",document.documentElement.style.cursor="grabbing"),m===!0&&document.body.classList.add("no-pointer-events--children"),document.body.classList.add("non-selectable"),Po(),l.styleCleanup=w=>{if(l.styleCleanup=void 0,g!==void 0&&(document.documentElement.style.cursor=g),document.body.classList.remove("non-selectable"),m===!0){const L=()=>{document.body.classList.remove("no-pointer-events--children")};w!==void 0?setTimeout(()=>{L(),w()},50):L()}else w!==void 0&&w()}};if(l.event.detected===!0){l.event.isFirst!==!0&&r(i,l.event.mouse);const{payload:g,synthetic:w}=Ju(i,l,!1);return void(g!==void 0&&(l.handler(g)===!1?l.end(i):(l.styleCleanup===void 0&&l.event.isFirst===!0&&p(),l.event.lastX=g.position.left,l.event.lastY=g.position.top,l.event.lastDir=w===!0?void 0:g.direction,l.event.isFirst=!1)))}if(l.direction.all===!0||m===!0&&(l.modifiers.mouseAllDir===!0||l.modifiers.mousealldir===!0))return p(),l.event.detected=!0,void l.move(i);const y=Math.abs(u),b=Math.abs(v);y!==b&&(l.direction.horizontal===!0&&y>b||l.direction.vertical===!0&&y0||l.direction.left===!0&&y>b&&u<0||l.direction.right===!0&&y>b&&u>0?(l.event.detected=!0,l.move(i)):l.end(i,!0))},end(i,c){if(l.event!==void 0){if(zn(l,"temp"),ut.is.firefox===!0&&Br(e,!1),c===!0)l.styleCleanup!==void 0&&l.styleCleanup(),l.event.detected!==!0&&l.initialEvent!==void 0&&l.initialEvent.target.dispatchEvent(l.initialEvent.event);else if(l.event.detected===!0){l.event.isFirst===!0&&l.handler(Ju(i===void 0?l.lastEvt:i,l).payload);const{payload:u}=Ju(i===void 0?l.lastEvt:i,l,!0),v=()=>{l.handler(u)};l.styleCleanup!==void 0?l.styleCleanup(v):v()}l.event=void 0,l.initialEvent=void 0,l.lastEvt=void 0}}};if(e.__qtouchpan=l,n.mouse===!0){const i=n.mouseCapture===!0||n.mousecapture===!0?"Capture":"";fn(l,"main",[[e,"mousedown","mouseStart",`passive${i}`]])}ut.has.touch===!0&&fn(l,"main",[[e,"touchstart","touchStart",`passive${n.capture===!0?"Capture":""}`],[e,"touchmove","noop","notPassiveCapture"]])},updated(e,t){const n=e.__qtouchpan;n!==void 0&&(t.oldValue!==t.value&&(typeof value!="function"&&n.end(),n.handler=t.value),n.direction=ps(t.modifiers))},beforeUnmount(e){const t=e.__qtouchpan;t!==void 0&&(t.event!==void 0&&t.end(),zn(t,"main"),zn(t,"temp"),ut.is.firefox===!0&&Br(e,!1),t.styleCleanup!==void 0&&t.styleCleanup(),delete e.__qtouchpan)}});const vf="q-slider__marker-labels",o$=e=>({value:e}),a$=({marker:e})=>d("div",{key:e.value,style:e.style,class:e.classes},e.label),hd=[34,37,40,33,39,38],Lh={...Ft,...ko,min:{type:Number,default:0},max:{type:Number,default:100},innerMin:Number,innerMax:Number,step:{type:Number,default:1,validator:e=>e>=0},snap:Boolean,vertical:Boolean,reverse:Boolean,hideSelection:Boolean,color:String,markerLabelsClass:String,label:Boolean,labelColor:String,labelTextColor:String,labelAlways:Boolean,switchLabelSide:Boolean,markers:[Boolean,Number],markerLabels:[Boolean,Array,Object,Function],switchMarkerLabelsSide:Boolean,trackImg:String,trackColor:String,innerTrackImg:String,innerTrackColor:String,selectionColor:String,selectionImg:String,thumbSize:{type:String,default:"20px"},trackSize:{type:String,default:"4px"},disable:Boolean,readonly:Boolean,dense:Boolean,tabindex:[String,Number],thumbColor:String,thumbPath:{type:String,default:"M 4, 10 a 6,6 0 1,0 12,0 a 6,6 0 1,0 -12,0"}},Ah=["pan","update:modelValue","change"];function Ph({updateValue:e,updatePosition:t,getDragging:n,formAttrs:r}){const{props:l,emit:i,slots:c,proxy:{$q:u}}=Ve(),v=Vt(l,u),m=La(r),p=X(!1),y=X(!1),b=X(!1),g=X(!1),w=f(()=>l.vertical===!0?"--v":"--h"),L=f(()=>"-"+(l.switchLabelSide===!0?"switched":"standard")),$=f(()=>l.vertical===!0?l.reverse===!0:l.reverse!==(u.lang.rtl===!0)),F=f(()=>isNaN(l.innerMin)===!0||l.innerMinisNaN(l.innerMax)===!0||l.innerMax>l.max?l.max:l.innerMax),S=f(()=>l.disable!==!0&&l.readonly!==!0&&F.value{if(l.step===0)return $e=>$e;const de=(String(l.step).trim().split(".")[1]||"").length;return $e=>parseFloat($e.toFixed(de))}),P=f(()=>l.step===0?1:l.step),M=f(()=>S.value===!0?l.tabindex||0:-1),E=f(()=>l.max-l.min),D=f(()=>A.value-F.value),z=f(()=>ce(F.value)),I=f(()=>ce(A.value)),N=f(()=>l.vertical===!0?$.value===!0?"bottom":"top":$.value===!0?"right":"left"),H=f(()=>l.vertical===!0?"height":"width"),T=f(()=>l.vertical===!0?"width":"height"),O=f(()=>l.vertical===!0?"vertical":"horizontal"),J=f(()=>{const de={role:"slider","aria-valuemin":F.value,"aria-valuemax":A.value,"aria-orientation":O.value,"data-step":l.step};return l.disable===!0?de["aria-disabled"]="true":l.readonly===!0&&(de["aria-readonly"]="true"),de}),se=f(()=>`q-slider q-slider${w.value} q-slider--${p.value===!0?"":"in"}active inline no-wrap `+(l.vertical===!0?"row":"column")+(l.disable===!0?" disabled":" q-slider--enabled"+(S.value===!0?" q-slider--editable":""))+(b.value==="both"?" q-slider--focus":"")+(l.label||l.labelAlways===!0?" q-slider--label":"")+(l.labelAlways===!0?" q-slider--label-always":"")+(v.value===!0?" q-slider--dark":"")+(l.dense===!0?" q-slider--dense q-slider--dense"+w.value:""));function R(de){const $e="q-slider__"+de;return`${$e} ${$e}${w.value} ${$e}${w.value}${L.value}`}function oe(de){const $e="q-slider__"+de;return`${$e} ${$e}${w.value}`}const le=f(()=>{const de=l.selectionColor||l.color;return"q-slider__selection absolute"+(de!==void 0?` text-${de}`:"")}),Se=f(()=>oe("markers")+" absolute overflow-hidden"),k=f(()=>oe("track-container")),_=f(()=>R("pin")),j=f(()=>R("label")),U=f(()=>R("text-container")),K=f(()=>R("marker-labels-container")+(l.markerLabelsClass!==void 0?` ${l.markerLabelsClass}`:"")),G=f(()=>"q-slider__track relative-position no-outline"+(l.trackColor!==void 0?` bg-${l.trackColor}`:"")),ne=f(()=>{const de={[T.value]:l.trackSize};return l.trackImg!==void 0&&(de.backgroundImage=`url(${l.trackImg}) !important`),de}),W=f(()=>"q-slider__inner absolute"+(l.innerTrackColor!==void 0?` bg-${l.innerTrackColor}`:"")),C=f(()=>{const de=I.value-z.value,$e={[N.value]:`${100*z.value}%`,[H.value]:de===0?"2px":`${100*de}%`};return l.innerTrackImg!==void 0&&($e.backgroundImage=`url(${l.innerTrackImg}) !important`),$e});function Z(de){const{min:$e,max:Xe,step:dt}=l;let Qe=$e+de*(Xe-$e);if(dt>0){const xt=(Qe-F.value)%dt;Qe+=(Math.abs(xt)>=dt/2?(xt<0?-1:1)*dt:0)-xt}return Qe=x.value(Qe),Jt(Qe,F.value,A.value)}function ce(de){return E.value===0?0:(de-l.min)/E.value}function ge(de,$e){const Xe=jn(de),dt=l.vertical===!0?Jt((Xe.top-$e.top)/$e.height,0,1):Jt((Xe.left-$e.left)/$e.width,0,1);return Jt($.value===!0?1-dt:dt,z.value,I.value)}const Ee=f(()=>Cl(l.markers)===!0?l.markers:P.value),Me=f(()=>{const de=[],$e=Ee.value,Xe=l.max;let dt=l.min;do de.push(dt),dt+=$e;while(dt{const de=` ${vf}${w.value}-`;return vf+`${de}${l.switchMarkerLabelsSide===!0?"switched":"standard"}${de}${$.value===!0?"rtl":"ltr"}`}),Ke=f(()=>l.markerLabels===!1?null:Pt(l.markerLabels).map((de,$e)=>({index:$e,value:de.value,label:de.label||de.value,classes:je.value+(de.classes!==void 0?" "+de.classes:""),style:{...pt(de.value),...de.style||{}}}))),Oe=f(()=>({markerList:Ke.value,markerMap:ke.value,classes:je.value,getStyle:pt})),ct=f(()=>{const de=D.value===0?"2px":100*Ee.value/D.value;return{...C.value,backgroundSize:l.vertical===!0?`2px ${de}%`:`${de}% 2px`}});function Pt(de){if(de===!1)return null;if(de===!0)return Me.value.map(o$);if(typeof de=="function")return Me.value.map(Xe=>{const dt=de(Xe);return En(dt)===!0?{...dt,value:Xe}:{value:Xe,label:dt}});const $e=({value:Xe})=>Xe>=l.min&&Xe<=l.max;return Array.isArray(de)===!0?de.map(Xe=>En(Xe)===!0?Xe:{value:Xe}).filter($e):Object.keys(de).map(Xe=>{const dt=de[Xe],Qe=Number(Xe);return En(dt)===!0?{...dt,value:Qe}:{value:Qe,label:dt}}).filter($e)}function pt(de){return{[N.value]:`${100*(de-l.min)/E.value}%`}}const ke=f(()=>{if(l.markerLabels===!1)return null;const de={};return Ke.value.forEach($e=>{de[$e.value]=$e}),de});function Be(){if(c["marker-label-group"]!==void 0)return c["marker-label-group"](Oe.value);const de=c["marker-label"]||a$;return Ke.value.map($e=>de({marker:$e,...Oe.value}))}const ve=f(()=>[[io,ze,void 0,{[O.value]:!0,prevent:!0,stop:!0,mouse:!0,mouseAllDir:!0}]]);function ze(de){de.isFinal===!0?(g.value!==void 0&&(t(de.evt),de.touch===!0&&e(!0),g.value=void 0,i("pan","end")),p.value=!1,b.value=!1):de.isFirst===!0?(g.value=n(de.evt),t(de.evt),e(),p.value=!0,i("pan","start")):(t(de.evt),e())}function tt(){b.value=!1}function lt(de){t(de,n(de)),e(),y.value=!0,p.value=!0,document.addEventListener("mouseup",nt,!0)}function nt(){y.value=!1,p.value=!1,e(!0),tt(),document.removeEventListener("mouseup",nt,!0)}function kt(de){t(de,n(de)),e(!0)}function Ht(de){hd.includes(de.keyCode)&&e(!0)}function Dt(de){if(l.vertical===!0)return null;const $e=u.lang.rtl!==l.reverse?1-de:de;return{transform:`translateX(calc(${2*$e-1} * ${l.thumbSize} / 2 + ${50-100*$e}%))`}}function me(de){const $e=f(()=>y.value!==!1||b.value!==de.focusValue&&b.value!=="both"?"":" q-slider--focus"),Xe=f(()=>`q-slider__thumb q-slider__thumb${w.value} q-slider__thumb${w.value}-${$.value===!0?"rtl":"ltr"} absolute non-selectable`+$e.value+(de.thumbColor.value!==void 0?` text-${de.thumbColor.value}`:"")),dt=f(()=>({width:l.thumbSize,height:l.thumbSize,[N.value]:`${100*de.ratio.value}%`,zIndex:b.value===de.focusValue?2:void 0})),Qe=f(()=>de.labelColor.value!==void 0?` text-${de.labelColor.value}`:""),xt=f(()=>Dt(de.ratio.value)),Gt=f(()=>"q-slider__text"+(de.labelTextColor.value!==void 0?` text-${de.labelTextColor.value}`:""));return()=>{const tn=[d("svg",{class:"q-slider__thumb-shape absolute-full",viewBox:"0 0 20 20","aria-hidden":"true"},[d("path",{d:l.thumbPath})]),d("div",{class:"q-slider__focus-ring fit"})];return l.label!==!0&&l.labelAlways!==!0||(tn.push(d("div",{class:_.value+" absolute fit no-pointer-events"+Qe.value},[d("div",{class:j.value,style:{minWidth:l.thumbSize}},[d("div",{class:U.value,style:xt.value},[d("span",{class:Gt.value},de.label.value)])])])),l.name!==void 0&&l.disable!==!0&&m(tn,"push")),d("div",{class:Xe.value,style:dt.value,...de.getNodeData()},tn)}}function Le(de,$e,Xe,dt){const Qe=[];l.innerTrackColor!=="transparent"&&Qe.push(d("div",{key:"inner",class:W.value,style:C.value})),l.selectionColor!=="transparent"&&Qe.push(d("div",{key:"selection",class:le.value,style:de.value})),l.markers!==!1&&Qe.push(d("div",{key:"marker",class:Se.value,style:ct.value})),dt(Qe);const xt=[xo("div",{key:"trackC",class:k.value,tabindex:$e.value,...Xe.value},[d("div",{class:G.value,style:ne.value},Qe)],"slide",S.value,()=>ve.value)];if(l.markerLabels!==!1){const Gt=l.switchMarkerLabelsSide===!0?"unshift":"push";xt[Gt](d("div",{key:"markerL",class:K.value},Be()))}return xt}return qt(()=>{document.removeEventListener("mouseup",nt,!0)}),{state:{active:p,focus:b,preventFocus:y,dragging:g,editable:S,classes:se,tabindex:M,attributes:J,roundValueFn:x,keyStep:P,trackLen:E,innerMin:F,innerMinRatio:z,innerMax:A,innerMaxRatio:I,positionProp:N,sizeProp:H,isReversed:$},methods:{onActivate:lt,onMobileClick:kt,onBlur:tt,onKeyup:Ht,getContent:Le,getThumbRenderFn:me,convertRatioToModel:Z,convertModelToRatio:ce,getDraggingRatio:ge}}}const r$=()=>({});var Ua=we({name:"QSlider",props:{...Lh,modelValue:{required:!0,default:null,validator:e=>typeof e=="number"||e===null},labelValue:[String,Number]},emits:Ah,setup(e,{emit:t}){const{proxy:{$q:n}}=Ve(),{state:r,methods:l}=Ph({updateValue:w,updatePosition:$,getDragging:L,formAttrs:Il(e)}),i=X(null),c=X(0),u=X(0);function v(){u.value=e.modelValue===null?r.innerMin.value:Jt(e.modelValue,r.innerMin.value,r.innerMax.value)}_e(()=>`${e.modelValue}|${r.innerMin.value}|${r.innerMax.value}`,v),v();const m=f(()=>l.convertModelToRatio(u.value)),p=f(()=>r.active.value===!0?c.value:m.value),y=f(()=>{const S={[r.positionProp.value]:`${100*r.innerMinRatio.value}%`,[r.sizeProp.value]:`${100*(p.value-r.innerMinRatio.value)}%`};return e.selectionImg!==void 0&&(S.backgroundImage=`url(${e.selectionImg}) !important`),S}),b=l.getThumbRenderFn({focusValue:!0,getNodeData:r$,ratio:p,label:f(()=>e.labelValue!==void 0?e.labelValue:u.value),thumbColor:f(()=>e.thumbColor||e.color),labelColor:f(()=>e.labelColor),labelTextColor:f(()=>e.labelTextColor)}),g=f(()=>r.editable.value!==!0?{}:n.platform.is.mobile===!0?{onClick:l.onMobileClick}:{onMousedown:l.onActivate,onFocus:F,onBlur:l.onBlur,onKeydown:A,onKeyup:l.onKeyup});function w(S){u.value!==e.modelValue&&t("update:modelValue",u.value),S===!0&&t("change",u.value)}function L(){return i.value.getBoundingClientRect()}function $(S,x=r.dragging.value){const P=l.getDraggingRatio(S,x);u.value=l.convertRatioToModel(P),c.value=e.snap!==!0||e.step===0?P:l.convertModelToRatio(u.value)}function F(){r.focus.value=!0}function A(S){if(!hd.includes(S.keyCode))return;bt(S);const x=([34,33].includes(S.keyCode)?10:1)*r.keyStep.value,P=([34,37,40].includes(S.keyCode)?-1:1)*(r.isReversed.value===!0?-1:1)*(e.vertical===!0?-1:1)*x;u.value=Jt(r.roundValueFn.value(u.value+P),r.innerMin.value,r.innerMax.value),w()}return()=>{const S=l.getContent(y,r.tabindex,g,x=>{x.push(b())});return d("div",{ref:i,class:r.classes.value+(e.modelValue===null?" q-slider--no-value":""),...r.attributes.value,"aria-valuenow":e.modelValue},S)}}});function Bh(){const e=X(!so.value);return e.value===!1&&jt(()=>{e.value=!0}),e}const Eh=typeof ResizeObserver<"u",ff=Eh===!0?{}:{style:"display:block;position:absolute;top:0;left:0;right:0;bottom:0;height:100%;width:100%;overflow:hidden;pointer-events:none;z-index:-1;",url:"about:blank"};var qa=we({name:"QResizeObserver",props:{debounce:{type:[String,Number],default:100}},emits:["resize"],setup(e,{emit:t}){let n,r=null,l={width:-1,height:-1};function i(v){v===!0||e.debounce===0||e.debounce==="0"?c():r===null&&(r=setTimeout(c,e.debounce))}function c(){if(r!==null&&(clearTimeout(r),r=null),n){const{offsetWidth:v,offsetHeight:m}=n;v===l.width&&m===l.height||(l={width:v,height:m},t("resize",l))}}const{proxy:u}=Ve();if(u.trigger=i,Eh===!0){let v;const m=p=>{n=u.$el.parentNode,n?(v=new ResizeObserver(i),v.observe(n),c()):p!==!0&&Tt(()=>{m(!0)})};return jt(()=>{m()}),qt(()=>{r!==null&&clearTimeout(r),v!==void 0&&(v.disconnect!==void 0?v.disconnect():n&&v.unobserve(n))}),pn}{let p=function(){r!==null&&(clearTimeout(r),r=null),m!==void 0&&(m.removeEventListener!==void 0&&m.removeEventListener("resize",i,Zt.passive),m=void 0)},y=function(){p(),n&&n.contentDocument&&(m=n.contentDocument.defaultView,m.addEventListener("resize",i,Zt.passive),c())};const v=Bh();let m;return jt(()=>{Tt(()=>{n=u.$el,n&&y()})}),qt(p),()=>{if(v.value===!0)return d("object",{style:ff.style,tabindex:-1,type:"text/html",data:ff.url,"aria-hidden":"true",onLoad:y})}}}});let $l=!1;{const e=document.createElement("div");e.setAttribute("dir","rtl"),Object.assign(e.style,{width:"1px",height:"1px",overflow:"auto"});const t=document.createElement("div");Object.assign(t.style,{width:"1000px",height:"1px"}),document.body.appendChild(e),e.appendChild(t),e.scrollLeft=-1e3,$l=e.scrollLeft>=0,e.remove()}function l$(e,t,n){const r=n===!0?["left","right"]:["top","bottom"];return`absolute-${t===!0?r[0]:r[1]}${e?` text-${e}`:""}`}const i$=["left","center","right","justify"];var Lc=we({name:"QTabs",props:{modelValue:[Number,String],align:{type:String,default:"center",validator:e=>i$.includes(e)},breakpoint:{type:[String,Number],default:600},vertical:Boolean,shrink:Boolean,stretch:Boolean,activeClass:String,activeColor:String,activeBgColor:String,indicatorColor:String,leftIcon:String,rightIcon:String,outsideArrows:Boolean,mobileArrows:Boolean,switchIndicator:Boolean,narrowIndicator:Boolean,inlineLabel:Boolean,noCaps:Boolean,dense:Boolean,contentClass:String,"onUpdate:modelValue":[Function,Array]},setup(e,{slots:t,emit:n}){const{proxy:r}=Ve(),{$q:l}=r,{registerTick:i}=Vr(),{registerTick:c}=Vr(),{registerTick:u}=Vr(),{registerTimeout:v,removeTimeout:m}=Nr(),{registerTimeout:p,removeTimeout:y}=Nr(),b=X(null),g=X(null),w=X(e.modelValue),L=X(!1),$=X(!0),F=X(!1),A=X(!1),S=[],x=X(0),P=X(!1);let M,E=null,D=null;const z=f(()=>({activeClass:e.activeClass,activeColor:e.activeColor,activeBgColor:e.activeBgColor,indicatorClass:l$(e.indicatorColor,e.switchIndicator,e.vertical),narrowIndicator:e.narrowIndicator,inlineLabel:e.inlineLabel,noCaps:e.noCaps})),I=f(()=>{const ke=x.value,Be=w.value;for(let ve=0;ve`q-tabs__content--align-${L.value===!0?"left":A.value===!0?"justify":e.align}`),H=f(()=>`q-tabs row no-wrap items-center q-tabs--${L.value===!0?"":"not-"}scrollable q-tabs--${e.vertical===!0?"vertical":"horizontal"} q-tabs__arrows--${e.outsideArrows===!0?"outside":"inside"} q-tabs--mobile-with${e.mobileArrows===!0?"":"out"}-arrows`+(e.dense===!0?" q-tabs--dense":"")+(e.shrink===!0?" col-shrink":"")+(e.stretch===!0?" self-stretch":"")),T=f(()=>"q-tabs__content scroll--mobile row no-wrap items-center self-stretch hide-scrollbar relative-position "+N.value+(e.contentClass!==void 0?` ${e.contentClass}`:"")),O=f(()=>e.vertical===!0?{container:"height",content:"offsetHeight",scroll:"scrollHeight"}:{container:"width",content:"offsetWidth",scroll:"scrollWidth"}),J=f(()=>e.vertical!==!0&&l.lang.rtl===!0),se=f(()=>$l===!1&&J.value===!0);function R({name:ke,setCurrent:Be,skipEmit:ve}){w.value!==ke&&(ve!==!0&&e["onUpdate:modelValue"]!==void 0&&n("update:modelValue",ke),Be!==!0&&e["onUpdate:modelValue"]!==void 0||(Se(w.value,ke),w.value=ke))}function oe(){i(()=>{le({width:b.value.offsetWidth,height:b.value.offsetHeight})})}function le(ke){if(O.value===void 0||g.value===null)return;const Be=ke[O.value.container],ve=Math.min(g.value[O.value.scroll],Array.prototype.reduce.call(g.value.children,(tt,lt)=>tt+(lt[O.value.content]||0),0)),ze=Be>0&&ve>Be;L.value=ze,ze===!0&&c(_),A.value=Bett.name.value===ke):null,ze=Be!=null&&Be!==""?S.find(tt=>tt.name.value===Be):null;if(ve&&ze){const tt=ve.tabIndicatorRef.value,lt=ze.tabIndicatorRef.value;E!==null&&(clearTimeout(E),E=null),tt.style.transition="none",tt.style.transform="none",lt.style.transition="none",lt.style.transform="none";const nt=tt.getBoundingClientRect(),kt=lt.getBoundingClientRect();lt.style.transform=e.vertical===!0?`translate3d(0,${nt.top-kt.top}px,0) scale3d(1,${kt.height?nt.height/kt.height:1},1)`:`translate3d(${nt.left-kt.left}px,0,0) scale3d(${kt.width?nt.width/kt.width:1},1,1)`,u(()=>{E=setTimeout(()=>{E=null,lt.style.transition="transform .25s cubic-bezier(.4, 0, .2, 1)",lt.style.transform="none"},70)})}ze&&L.value===!0&&k(ze.rootRef.value)}function k(ke){const{left:Be,width:ve,top:ze,height:tt}=g.value.getBoundingClientRect(),lt=ke.getBoundingClientRect();let nt=e.vertical===!0?lt.top-ze:lt.left-Be;if(nt<0)return g.value[e.vertical===!0?"scrollTop":"scrollLeft"]+=Math.floor(nt),void _();nt+=e.vertical===!0?lt.height-tt:lt.width-ve,nt>0&&(g.value[e.vertical===!0?"scrollTop":"scrollLeft"]+=Math.ceil(nt),_())}function _(){const ke=g.value;if(ke===null)return;const Be=ke.getBoundingClientRect(),ve=e.vertical===!0?ke.scrollTop:Math.abs(ke.scrollLeft);J.value===!0?($.value=Math.ceil(ve+Be.width)0):($.value=ve>0,F.value=e.vertical===!0?Math.ceil(ve+Be.height){C(ke)===!0&&G()},5)}function U(){j(se.value===!0?Number.MAX_SAFE_INTEGER:0)}function K(){j(se.value===!0?0:Number.MAX_SAFE_INTEGER)}function G(){D!==null&&(clearInterval(D),D=null)}function ne(ke,Be){const ve=Array.prototype.filter.call(g.value.children,kt=>kt===Be||kt.matches&&kt.matches(".q-tab.q-focusable")===!0),ze=ve.length;if(ze===0)return;if(ke===36)return k(ve[0]),ve[0].focus(),!0;if(ke===35)return k(ve[ze-1]),ve[ze-1].focus(),!0;const tt=ke===(e.vertical===!0?38:37),lt=ke===(e.vertical===!0?40:39),nt=tt===!0?-1:lt===!0?1:void 0;if(nt!==void 0){const kt=J.value===!0?-1:1,Ht=ve.indexOf(Be)+nt*kt;return Ht>=0&&Hte.modelValue,ke=>{R({name:ke,setCurrent:!0,skipEmit:!0})}),_e(()=>e.outsideArrows,oe);const W=f(()=>se.value===!0?{get:ke=>Math.abs(ke.scrollLeft),set:(ke,Be)=>{ke.scrollLeft=-Be}}:e.vertical===!0?{get:ke=>ke.scrollTop,set:(ke,Be)=>{ke.scrollTop=Be}}:{get:ke=>ke.scrollLeft,set:(ke,Be)=>{ke.scrollLeft=Be}});function C(ke){const Be=g.value,{get:ve,set:ze}=W.value;let tt=!1,lt=ve(Be);const nt=ke=ke)&&(tt=!0,lt=ke),ze(Be,lt),_(),tt}function Z(ke,Be){for(const ve in ke)if(ke[ve]!==Be[ve])return!1;return!0}function ce(){let ke=null,Be={matchedLen:0,queryDiff:9999,hrefLen:0};const ve=S.filter(nt=>nt.routeData!==void 0&&nt.routeData.hasRouterLink.value===!0),{hash:ze,query:tt}=r.$route,lt=Object.keys(tt).length;for(const nt of ve){const kt=nt.routeData.exact.value===!0;if(nt.routeData[kt===!0?"linkIsExactActive":"linkIsActive"].value!==!0)continue;const{hash:Ht,query:Dt,matched:me,href:Le}=nt.routeData.resolvedLink.value,de=Object.keys(Dt).length;if(kt===!0){if(Ht!==ze||de!==lt||Z(tt,Dt)===!1)continue;ke=nt.name.value;break}if(Ht!==""&&Ht!==ze||de!==0&&Z(Dt,tt)===!1)continue;const $e={matchedLen:me.length,queryDiff:lt-de,hrefLen:Le.length-Ht.length};if($e.matchedLen>Be.matchedLen)ke=nt.name.value,Be=$e;else if($e.matchedLen===Be.matchedLen){if($e.queryDiffBe.hrefLen&&(ke=nt.name.value,Be=$e)}}ke===null&&S.some(nt=>nt.routeData===void 0&&nt.name.value===w.value)===!0||R({name:ke,setCurrent:!0})}function ge(ke){if(m(),P.value!==!0&&b.value!==null&&ke.target&&typeof ke.target.closest=="function"){const Be=ke.target.closest(".q-tab");Be&&b.value.contains(Be)===!0&&(P.value=!0,L.value===!0&&k(Be))}}function Ee(){v(()=>{P.value=!1},30)}function Me(){ct.avoidRouteWatcher===!1?p(ce):y()}function je(){if(M===void 0){const ke=_e(()=>r.$route.fullPath,Me);M=()=>{ke(),M=void 0}}}function Ke(ke){S.push(ke),x.value++,oe(),ke.routeData===void 0||r.$route===void 0?p(()=>{if(L.value===!0){const Be=w.value,ve=Be!=null&&Be!==""?S.find(ze=>ze.name.value===Be):null;ve&&k(ve.rootRef.value)}}):(je(),ke.routeData.hasRouterLink.value===!0&&Me())}function Oe(ke){S.splice(S.indexOf(ke),1),x.value--,oe(),M!==void 0&&ke.routeData!==void 0&&(S.every(Be=>Be.routeData===void 0)===!0&&M(),Me())}const ct={currentModel:w,tabProps:z,hasFocus:P,hasActiveTab:I,registerTab:Ke,unregisterTab:Oe,verifyRouteModel:Me,updateModel:R,onKbdNavigate:ne,avoidRouteWatcher:!1};function Pt(){E!==null&&clearTimeout(E),G(),M!==void 0&&M()}let pt;return Do(Wp,ct),qt(Pt),ia(()=>{pt=M!==void 0,Pt()}),nr(()=>{pt===!0&&je(),oe()}),()=>d("div",{ref:b,class:H.value,role:"tablist",onFocusin:ge,onFocusout:Ee},[d(qa,{onResize:le}),d("div",{ref:g,class:T.value,onScroll:_},Ge(t.default)),d(Et,{class:"q-tabs__arrow q-tabs__arrow--left absolute q-tab__icon"+($.value===!0?"":" q-tabs__arrow--faded"),name:e.leftIcon||l.iconSet.tabs[e.vertical===!0?"up":"left"],onMousedownPassive:U,onTouchstartPassive:U,onMouseupPassive:G,onMouseleavePassive:G,onTouchendPassive:G}),d(Et,{class:"q-tabs__arrow q-tabs__arrow--right absolute q-tab__icon"+(F.value===!0?"":" q-tabs__arrow--faded"),name:e.rightIcon||l.iconSet.tabs[e.vertical===!0?"down":"right"],onMousedownPassive:K,onTouchstartPassive:K,onMouseupPassive:G,onMouseleavePassive:G,onTouchendPassive:G})])}});let s$=0;const Fh=["click","keydown"],Vh={icon:String,label:[Number,String],alert:[Boolean,String],alertIcon:String,name:{type:[Number,String],default:()=>`t_${s$++}`},noCaps:Boolean,tabindex:[String,Number],disable:Boolean,contentClass:String,ripple:{type:[Boolean,Object],default:!0}};function Ih(e,t,n,r){const l=Fn(Wp,Nt);if(l===Nt)return console.error("QTab/QRouteTab component needs to be child of QTabs"),Nt;const{proxy:i}=Ve(),c=X(null),u=X(null),v=X(null),m=f(()=>e.disable!==!0&&e.ripple!==!1&&Object.assign({keyCodes:[13,32],early:!0},e.ripple===!0?{}:e.ripple)),p=f(()=>l.currentModel.value===e.name),y=f(()=>"q-tab relative-position self-stretch flex flex-center text-center"+(p.value===!0?" q-tab--active"+(l.tabProps.value.activeClass?" "+l.tabProps.value.activeClass:"")+(l.tabProps.value.activeColor?` text-${l.tabProps.value.activeColor}`:"")+(l.tabProps.value.activeBgColor?` bg-${l.tabProps.value.activeBgColor}`:""):" q-tab--inactive")+(e.icon&&e.label&&l.tabProps.value.inlineLabel===!1?" q-tab--full":"")+(e.noCaps===!0||l.tabProps.value.noCaps===!0?" q-tab--no-caps":"")+(e.disable===!0?" disabled":" q-focusable q-hoverable cursor-pointer")+(r!==void 0?r.linkClass.value:"")),b=f(()=>"q-tab__content self-stretch flex-center relative-position q-anchor--skip non-selectable "+(l.tabProps.value.inlineLabel===!0?"row no-wrap q-tab__content--inline":"column")+(e.contentClass!==void 0?` ${e.contentClass}`:"")),g=f(()=>e.disable===!0||l.hasFocus.value===!0||p.value===!1&&l.hasActiveTab.value===!0?-1:e.tabindex||0);function w(S,x){if(x!==!0&&c.value!==null&&c.value.focus(),e.disable!==!0){if(r===void 0)return l.updateModel({name:e.name}),void n("click",S);if(r.hasRouterLink.value===!0){const P=(M={})=>{let E;const D=M.to===void 0||Ao(M.to,e.to)===!0?l.avoidRouteWatcher=er():null;return r.navigateToRouterLink(S,{...M,returnRouterError:!0}).catch(z=>{E=z}).then(z=>{if(D===l.avoidRouteWatcher&&(l.avoidRouteWatcher=!1,E!==void 0||z!==void 0&&z.message.startsWith("Avoided redundant navigation")!==!0||l.updateModel({name:e.name})),M.returnRouterError===!0)return E!==void 0?Promise.reject(E):z})};return n("click",S,P),void(S.defaultPrevented!==!0&&P())}n("click",S)}else r!==void 0&&r.hasRouterLink.value===!0&&bt(S)}function L(S){wo(S,[13,32])?w(S,!0):or(S)!==!0&&S.keyCode>=35&&S.keyCode<=40&&S.altKey!==!0&&S.metaKey!==!0&&l.onKbdNavigate(S.keyCode,i.$el)===!0&&bt(S),n("keydown",S)}function $(){const S=l.tabProps.value.narrowIndicator,x=[],P=d("div",{ref:v,class:["q-tab__indicator",l.tabProps.value.indicatorClass]});e.icon!==void 0&&x.push(d(Et,{class:"q-tab__icon",name:e.icon})),e.label!==void 0&&x.push(d("div",{class:"q-tab__label"},e.label)),e.alert!==!1&&x.push(e.alertIcon!==void 0?d(Et,{class:"q-tab__alert-icon",color:e.alert!==!0?e.alert:void 0,name:e.alertIcon}):d("div",{class:"q-tab__alert"+(e.alert!==!0?` text-${e.alert}`:"")})),S===!0&&x.push(P);const M=[d("div",{class:"q-focus-helper",tabindex:-1,ref:c}),d("div",{class:b.value},hn(t.default,x))];return S===!1&&M.push(P),M}const F={name:f(()=>e.name),rootRef:u,tabIndicatorRef:v,routeData:r};function A(S,x){const P={ref:u,class:y.value,tabindex:g.value,role:"tab","aria-selected":p.value===!0?"true":"false","aria-disabled":e.disable===!0?"true":void 0,onClick:w,onKeydown:L,...x};return Bo(d(S,P,$()),[[El,m.value]])}return qt(()=>{l.unregisterTab(F)}),jt(()=>{l.registerTab(F)}),{renderTab:A,$tabs:l}}var Tr=we({name:"QTab",props:Vh,emits:Fh,setup(e,{slots:t,emit:n}){const{renderTab:r}=Ih(e,t,n);return()=>r("div")}}),Oh=we({name:"QTabPanels",props:{...ld,...Ft},emits:id,setup(e,{slots:t}){const n=Ve(),r=Vt(e,n.proxy.$q),{updatePanelsList:l,getPanelContent:i,panelDirectives:c}=sd(),u=f(()=>"q-tab-panels q-panel-parent"+(r.value===!0?" q-tab-panels--dark q-dark":""));return()=>(l(t),xo("div",{class:u.value},i(),"pan",e.swipeable,()=>c.value))}}),Xi=we({name:"QTabPanel",props:rd,setup(e,{slots:t}){return()=>d("div",{class:"q-tab-panel",role:"tabpanel"},Ge(t.default))}});const pf=/^#[0-9a-fA-F]{3}([0-9a-fA-F]{3})?$/,hf=/^#[0-9a-fA-F]{4}([0-9a-fA-F]{4})?$/,mf=/^#([0-9a-fA-F]{3}|[0-9a-fA-F]{4}|[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$/,Fi=/^rgb\(((0|[1-9][\d]?|1[\d]{0,2}|2[\d]?|2[0-4][\d]|25[0-5]),){2}(0|[1-9][\d]?|1[\d]{0,2}|2[\d]?|2[0-4][\d]|25[0-5])\)$/,Vi=/^rgba\(((0|[1-9][\d]?|1[\d]{0,2}|2[\d]?|2[0-4][\d]|25[0-5]),){2}(0|[1-9][\d]?|1[\d]{0,2}|2[\d]?|2[0-4][\d]|25[0-5]),(0|0\.[0-9]+[1-9]|0\.[1-9]+|1)\)$/,Zi={date:e=>/^-?[\d]+\/[0-1]\d\/[0-3]\d$/.test(e),time:e=>/^([0-1]?\d|2[0-3]):[0-5]\d$/.test(e),fulltime:e=>/^([0-1]?\d|2[0-3]):[0-5]\d:[0-5]\d$/.test(e),timeOrFulltime:e=>/^([0-1]?\d|2[0-3]):[0-5]\d(:[0-5]\d)?$/.test(e),email:e=>/^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/.test(e),hexColor:e=>pf.test(e),hexaColor:e=>hf.test(e),hexOrHexaColor:e=>mf.test(e),rgbColor:e=>Fi.test(e),rgbaColor:e=>Vi.test(e),rgbOrRgbaColor:e=>Fi.test(e)||Vi.test(e),hexOrRgbColor:e=>pf.test(e)||Fi.test(e),hexaOrRgbaColor:e=>hf.test(e)||Vi.test(e),anyColor:e=>mf.test(e)||Fi.test(e)||Vi.test(e)},u$=/^rgb(a)?\((\d{1,3}),(\d{1,3}),(\d{1,3}),?([01]?\.?\d*?)?\)$/;function gf({r:e,g:t,b:n,a:r}){const l=r!==void 0;if(e=Math.round(e),t=Math.round(t),n=Math.round(n),e>255||t>255||n>255||l&&r>100)throw new TypeError("Expected 3 numbers below 256 (and optionally one below 100)");return r=l?(256|Math.round(255*r/100)).toString(16).slice(1):"","#"+(n|t<<8|e<<16|1<<24).toString(16).slice(1)+r}function bf({r:e,g:t,b:n,a:r}){return`rgb${r!==void 0?"a":""}(${e},${t},${n}${r!==void 0?","+r/100:""})`}function Rh(e){if(typeof e!="string")throw new TypeError("Expected a string");e=e.replace(/^#/,""),e.length===3?e=e[0]+e[0]+e[1]+e[1]+e[2]+e[2]:e.length===4&&(e=e[0]+e[0]+e[1]+e[1]+e[2]+e[2]+e[3]+e[3]);const t=parseInt(e,16);return e.length>6?{r:t>>24&255,g:t>>16&255,b:t>>8&255,a:Math.round((255&t)/2.55)}:{r:t>>16,g:t>>8&255,b:255&t}}function yf({h:e,s:t,v:n,a:r}){let l,i,c;t/=100,n/=100,e/=360;const u=Math.floor(6*e),v=6*e-u,m=n*(1-t),p=n*(1-v*t),y=n*(1-(1-v)*t);switch(u%6){case 0:l=n,i=y,c=m;break;case 1:l=p,i=n,c=m;break;case 2:l=m,i=n,c=y;break;case 3:l=m,i=p,c=n;break;case 4:l=y,i=m,c=n;break;case 5:l=n,i=m,c=p;break}return{r:Math.round(255*l),g:Math.round(255*i),b:Math.round(255*c),a:r}}function ec({r:e,g:t,b:n,a:r}){const l=Math.max(e,t,n),i=Math.min(e,t,n),c=l-i,u=l===0?0:c/l,v=l/255;let m;switch(l){case i:m=0;break;case e:m=t-n+c*(t["spectrum","tune","palette"].includes(e)},formatModel:{type:String,default:"auto",validator:e=>["auto","hex","rgb","hexa","rgba"].includes(e)},palette:Array,noHeader:Boolean,noHeaderTabs:Boolean,noFooter:Boolean,square:Boolean,flat:Boolean,bordered:Boolean,disable:Boolean,readonly:Boolean},emits:["update:modelValue","change"],setup(e,{emit:t}){const{proxy:n}=Ve(),{$q:r}=n,l=Vt(e,r),{getCache:i}=Ol(),c=X(null),u=X(null),v=f(()=>e.formatModel==="auto"?null:e.formatModel.indexOf("hex")>-1),m=f(()=>e.formatModel==="auto"?null:e.formatModel.indexOf("a")>-1),p=X(e.formatModel==="auto"?e.modelValue===void 0||e.modelValue===null||e.modelValue===""||e.modelValue.startsWith("#")?"hex":"rgb":e.formatModel.startsWith("hex")?"hex":"rgb"),y=X(e.defaultView),b=X(H(e.modelValue||e.defaultValue)),g=f(()=>e.disable!==!0&&e.readonly!==!0),w=f(()=>e.modelValue===void 0||e.modelValue===null||e.modelValue===""||e.modelValue.startsWith("#")),L=f(()=>v.value!==null?v.value:w.value),$=f(()=>({type:"hidden",name:e.name,value:b.value[L.value===!0?"hex":"rgb"]})),F=La($),A=f(()=>m.value!==null?m.value:b.value.a!==void 0),S=f(()=>({backgroundColor:b.value.rgb||"#000"})),x=f(()=>`q-color-picker__header-content q-color-picker__header-content--${b.value.a!==void 0&&b.value.a<65||c$(b.value)>.4?"light":"dark"}`),P=f(()=>({background:`hsl(${b.value.h},100%,50%)`})),M=f(()=>({top:`${100-b.value.v}%`,[r.lang.rtl===!0?"right":"left"]:`${b.value.s}%`})),E=f(()=>e.palette!==void 0&&e.palette.length!==0?e.palette:d$),D=f(()=>"q-color-picker"+(e.bordered===!0?" q-color-picker--bordered":"")+(e.square===!0?" q-color-picker--square no-border-radius":"")+(e.flat===!0?" q-color-picker--flat no-shadow":"")+(e.disable===!0?" disabled":"")+(l.value===!0?" q-color-picker--dark q-dark":"")),z=f(()=>e.disable===!0?{"aria-disabled":"true"}:{}),I=f(()=>[[io,oe,void 0,{prevent:!0,stop:!0,mouse:!0}]]);function N(C,Z){b.value.hex=gf(C),b.value.rgb=bf(C),b.value.r=C.r,b.value.g=C.g,b.value.b=C.b,b.value.a=C.a;const ce=b.value[L.value===!0?"hex":"rgb"];t("update:modelValue",ce),Z===!0&&t("change",ce)}function H(C){const Z=m.value!==void 0?m.value:e.formatModel==="auto"?null:e.formatModel.indexOf("a")>-1;if(typeof C!="string"||C.length===0||Zi.anyColor(C.replace(/ /g,""))!==!0)return{h:0,s:0,v:0,r:0,g:0,b:0,a:Z===!0?100:void 0,hex:void 0,rgb:void 0};const ce=zh(C);return Z===!0&&ce.a===void 0&&(ce.a=100),ce.hex=gf(ce),ce.rgb=bf(ce),Object.assign(ce,ec(ce))}function T(C,Z,ce){const ge=c.value;if(ge===null)return;const Ee=ge.clientWidth,Me=ge.clientHeight,je=ge.getBoundingClientRect();let Ke=Math.min(Ee,Math.max(0,C-je.left));r.lang.rtl===!0&&(Ke=Ee-Ke);const Oe=Math.min(Me,Math.max(0,Z-je.top)),ct=Math.round(100*Ke/Ee),Pt=Math.round(100*Math.max(0,Math.min(1,-Oe/Me+1))),pt=yf({h:b.value.h,s:ct,v:Pt,a:A.value===!0?b.value.a:void 0});b.value.s=ct,b.value.v=Pt,N(pt,ce)}function O(C,Z){const ce=Math.round(C),ge=yf({h:ce,s:b.value.s,v:b.value.v,a:A.value===!0?b.value.a:void 0});b.value.h=ce,N(ge,Z)}function J(C,Z,ce,ge,Ee){if(ge!==void 0&&dn(ge),!/^[0-9]+$/.test(C))return void(Ee===!0&&n.$forceUpdate());const Me=Math.floor(Number(C));if(Me<0||Me>ce)return void(Ee===!0&&n.$forceUpdate());const je={r:Z==="r"?Me:b.value.r,g:Z==="g"?Me:b.value.g,b:Z==="b"?Me:b.value.b,a:A.value===!0?Z==="a"?Me:b.value.a:void 0};if(Z!=="a"){const Ke=ec(je);b.value.h=Ke.h,b.value.s=Ke.s,b.value.v=Ke.v}if(N(je,Ee),ge!==void 0&&Ee!==!0&&ge.target.selectionEnd!==void 0){const Ke=ge.target.selectionEnd;Tt(()=>{ge.target.setSelectionRange(Ke,Ke)})}}function se(C,Z){let ce;const ge=C.target.value;if(dn(C),p.value==="hex"){if(ge.length!==(A.value===!0?9:7)||!/^#[0-9A-Fa-f]+$/.test(ge))return!0;ce=Rh(ge)}else{let Me;if(!ge.endsWith(")"))return!0;if(A.value!==!0&&ge.startsWith("rgb(")){if(Me=ge.substring(4,ge.length-1).split(",").map(je=>parseInt(je,10)),Me.length!==3||!/^rgb\([0-9]{1,3},[0-9]{1,3},[0-9]{1,3}\)$/.test(ge))return!0}else{if(A.value!==!0||!ge.startsWith("rgba("))return!0;{if(Me=ge.substring(5,ge.length-1).split(","),Me.length!==4||!/^rgba\([0-9]{1,3},[0-9]{1,3},[0-9]{1,3},(0|0\.[0-9]+[1-9]|0\.[1-9]+|1)\)$/.test(ge))return!0;for(let Ke=0;Ke<3;Ke++){const Oe=parseInt(Me[Ke],10);if(Oe<0||Oe>255)return!0;Me[Ke]=Oe}const je=parseFloat(Me[3]);if(je<0||je>1)return!0;Me[3]=je}}if(Me[0]<0||Me[0]>255||Me[1]<0||Me[1]>255||Me[2]<0||Me[2]>255||A.value===!0&&(Me[3]<0||Me[3]>1))return!0;ce={r:Me[0],g:Me[1],b:Me[2],a:A.value===!0?100*Me[3]:void 0}}const Ee=ec(ce);if(b.value.h=Ee.h,b.value.s=Ee.s,b.value.v=Ee.v,N(ce,Z),Z!==!0){const Me=C.target.selectionEnd;Tt(()=>{C.target.setSelectionRange(Me,Me)})}}function R(C){const Z=H(C),ce={r:Z.r,g:Z.g,b:Z.b,a:Z.a};ce.a===void 0&&(ce.a=b.value.a),b.value.h=Z.h,b.value.s=Z.s,b.value.v=Z.v,N(ce,!0)}function oe(C){C.isFinal?T(C.position.left,C.position.top,!0):le(C)}_e(()=>e.modelValue,C=>{const Z=H(C||e.defaultValue);Z.hex!==b.value.hex&&(b.value=Z)}),_e(()=>e.defaultValue,C=>{if(!e.modelValue&&C){const Z=H(C);Z.hex!==b.value.hex&&(b.value=Z)}});const le=rh(C=>{T(C.position.left,C.position.top)},20);function Se(C){T(C.pageX-window.pageXOffset,C.pageY-window.pageYOffset,!0)}function k(C){T(C.pageX-window.pageXOffset,C.pageY-window.pageYOffset)}function _(C){u.value!==null&&(u.value.$el.style.opacity=C?1:0)}function j(){const C=[];return e.noHeaderTabs!==!0&&C.push(d(Lc,{class:"q-color-picker__header-tabs",modelValue:p.value,dense:!0,align:"justify",...i("topVTab",{"onUpdate:modelValue":Z=>{p.value=Z}})},()=>[d(Tr,{label:"HEX"+(A.value===!0?"A":""),name:"hex",ripple:!1}),d(Tr,{label:"RGB"+(A.value===!0?"A":""),name:"rgb",ripple:!1})])),C.push(d("div",{class:"q-color-picker__header-banner row flex-center no-wrap"},[d("input",{class:"fit",value:b.value[p.value],...g.value!==!0?{readonly:!0}:{},...i("topIn",{onInput:Z=>{_(se(Z)===!0)},onChange:dn,onBlur:Z=>{se(Z,!0)===!0&&n.$forceUpdate(),_(!1)}})}),d(Et,{ref:u,class:"q-color-picker__error-icon absolute no-pointer-events",name:r.iconSet.type.negative})])),d("div",{class:"q-color-picker__header relative-position overflow-hidden"},[d("div",{class:"q-color-picker__header-bg absolute-full"}),d("div",{class:x.value,style:S.value},C)])}function U(){return d(Oh,{modelValue:y.value,animated:!0},()=>[d(Xi,{class:"q-color-picker__spectrum-tab overflow-hidden",name:"spectrum"},G),d(Xi,{class:"q-pa-md q-color-picker__tune-tab",name:"tune"},ne),d(Xi,{class:"q-color-picker__palette-tab",name:"palette"},W)])}function K(){return d("div",{class:"q-color-picker__footer relative-position overflow-hidden"},[d(Lc,{class:"absolute-full",modelValue:y.value,dense:!0,align:"justify",...i("ftIn",{"onUpdate:modelValue":C=>{y.value=C}})},()=>[d(Tr,{icon:r.iconSet.colorPicker.spectrum,name:"spectrum",ripple:!1}),d(Tr,{icon:r.iconSet.colorPicker.tune,name:"tune",ripple:!1}),d(Tr,{icon:r.iconSet.colorPicker.palette,name:"palette",ripple:!1})])])}function G(){const C={ref:c,class:"q-color-picker__spectrum non-selectable relative-position cursor-pointer"+(g.value!==!0?" readonly":""),style:P.value,...g.value===!0?{onClick:Se,onMousedown:k}:{}},Z=[d("div",{style:{paddingBottom:"100%"}}),d("div",{class:"q-color-picker__spectrum-white absolute-full"}),d("div",{class:"q-color-picker__spectrum-black absolute-full"}),d("div",{class:"absolute",style:M.value},[b.value.hex!==void 0?d("div",{class:"q-color-picker__spectrum-circle"}):null])],ce=[d(Ua,{class:"q-color-picker__hue non-selectable",modelValue:b.value.h,min:0,max:360,trackSize:"8px",innerTrackColor:"transparent",selectionColor:"transparent",readonly:g.value!==!0,thumbPath:_f,"onUpdate:modelValue":O,...i("lazyhue",{onChange:ge=>O(ge,!0)})})];return A.value===!0&&ce.push(d(Ua,{class:"q-color-picker__alpha non-selectable",modelValue:b.value.a,min:0,max:100,trackSize:"8px",trackColor:"white",innerTrackColor:"transparent",selectionColor:"transparent",trackImg:v$,readonly:g.value!==!0,hideSelection:!0,thumbPath:_f,...i("alphaSlide",{"onUpdate:modelValue":ge=>J(ge,"a",100),onChange:ge=>J(ge,"a",100,void 0,!0)})})),[xo("div",C,Z,"spec",g.value,()=>I.value),d("div",{class:"q-color-picker__sliders"},ce)]}function ne(){return[d("div",{class:"row items-center no-wrap"},[d("div","R"),d(Ua,{modelValue:b.value.r,min:0,max:255,color:"red",dark:l.value,readonly:g.value!==!0,...i("rSlide",{"onUpdate:modelValue":C=>J(C,"r",255),onChange:C=>J(C,"r",255,void 0,!0)})}),d("input",{value:b.value.r,maxlength:3,readonly:g.value!==!0,onChange:dn,...i("rIn",{onInput:C=>J(C.target.value,"r",255,C),onBlur:C=>J(C.target.value,"r",255,C,!0)})})]),d("div",{class:"row items-center no-wrap"},[d("div","G"),d(Ua,{modelValue:b.value.g,min:0,max:255,color:"green",dark:l.value,readonly:g.value!==!0,...i("gSlide",{"onUpdate:modelValue":C=>J(C,"g",255),onChange:C=>J(C,"g",255,void 0,!0)})}),d("input",{value:b.value.g,maxlength:3,readonly:g.value!==!0,onChange:dn,...i("gIn",{onInput:C=>J(C.target.value,"g",255,C),onBlur:C=>J(C.target.value,"g",255,C,!0)})})]),d("div",{class:"row items-center no-wrap"},[d("div","B"),d(Ua,{modelValue:b.value.b,min:0,max:255,color:"blue",readonly:g.value!==!0,dark:l.value,...i("bSlide",{"onUpdate:modelValue":C=>J(C,"b",255),onChange:C=>J(C,"b",255,void 0,!0)})}),d("input",{value:b.value.b,maxlength:3,readonly:g.value!==!0,onChange:dn,...i("bIn",{onInput:C=>J(C.target.value,"b",255,C),onBlur:C=>J(C.target.value,"b",255,C,!0)})})]),A.value===!0?d("div",{class:"row items-center no-wrap"},[d("div","A"),d(Ua,{modelValue:b.value.a,color:"grey",readonly:g.value!==!0,dark:l.value,...i("aSlide",{"onUpdate:modelValue":C=>J(C,"a",100),onChange:C=>J(C,"a",100,void 0,!0)})}),d("input",{value:b.value.a,maxlength:3,readonly:g.value!==!0,onChange:dn,...i("aIn",{onInput:C=>J(C.target.value,"a",100,C),onBlur:C=>J(C.target.value,"a",100,C,!0)})})]):null]}function W(){const C=Z=>d("div",{class:"q-color-picker__cube col-auto",style:{backgroundColor:Z},...g.value===!0?i("palette#"+Z,{onClick:()=>{R(Z)}}):{}});return[d("div",{class:"row items-center q-color-picker__palette-rows"+(g.value===!0?" q-color-picker__palette-rows--editable":"")},E.value.map(C))]}return()=>{const C=[U()];return e.name!==void 0&&e.disable!==!0&&F(C,"push"),e.noHeader!==!0&&C.unshift(j()),e.noFooter!==!0&&C.push(K()),d("div",{class:D.value,...z.value},C)}}});const ka=[-61,9,38,199,426,686,756,818,1111,1181,1210,1635,2060,2097,2192,2262,2324,2394,2456,3178];function p$(e,t,n){return Object.prototype.toString.call(e)==="[object Date]"&&(n=e.getDate(),t=e.getMonth()+1,e=e.getFullYear()),b$(md(e,t,n))}function wf(e,t,n){return Hh(g$(e,t,n))}function h$(e){return m$(e)===0}function Ji(e,t){return t<=6?31:t<=11||h$(e)?30:29}function m$(e){const t=ka.length;let n,r,l,i,c,u=ka[0];if(e=ka[t-1])throw new Error("Invalid Jalaali year "+e);for(c=1;c=ka[n-1])throw new Error("Invalid Jalaali year "+e);for(v=1;v=0){if(l<=185)return r=1+ln(l,31),n=lo(l,31)+1,{jy:i,jm:r,jd:n};l-=186}else i-=1,l+=179,c.leap===1&&(l+=1);return r=7+ln(l,30),n=lo(l,30)+1,{jy:i,jm:r,jd:n}}function md(e,t,n){let r=ln(1461*(e+ln(t-8,6)+100100),4)+ln(153*lo(t+9,12)+2,5)+n-34840408;return r=r-ln(3*ln(e+100100+ln(t-8,6),100),4)+752,r}function Hh(e){let t=4*e+139361631;t=t+4*ln(3*ln(4*e+183187720,146097),4)-3908;const n=5*ln(lo(t,1461),4)+308,r=ln(lo(n,153),5)+1,l=lo(ln(n,153),12)+1;return{gy:ln(t,1461)-100100+ln(8-l,6),gm:l,gd:r}}function ln(e,t){return~~(e/t)}function lo(e,t){return e-~~(e/t)*t}const y$=["gregorian","persian"],Dh={modelValue:{required:!0},mask:{type:String},locale:Object,calendar:{type:String,validator:e=>y$.includes(e),default:"gregorian"},landscape:Boolean,color:String,textColor:String,square:Boolean,flat:Boolean,bordered:Boolean,readonly:Boolean,disable:Boolean},Qh=["update:modelValue"];function oa(e){return e.year+"/"+zt(e.month)+"/"+zt(e.day)}function Uh(e,t){const n=f(()=>e.disable!==!0&&e.readonly!==!0),r=f(()=>n.value===!0?0:-1),l=f(()=>{const u=[];return e.color!==void 0&&u.push(`bg-${e.color}`),e.textColor!==void 0&&u.push(`text-${e.textColor}`),u.join(" ")});function i(){return e.locale!==void 0?{...t.lang.date,...e.locale}:t.lang.date}function c(u){const v=new Date,m=u===!0?null:0;if(e.calendar==="persian"){const p=p$(v);return{year:p.jy,month:p.jm,day:p.jd}}return{year:v.getFullYear(),month:v.getMonth()+1,day:v.getDate(),hour:m,minute:m,second:m,millisecond:m}}return{editable:n,tabindex:r,headerClass:l,getLocale:i,getCurrentDate:c}}const jh=864e5,_$=36e5,Ac=6e4,Wh="YYYY-MM-DDTHH:mm:ss.SSSZ",w$=/\[((?:[^\]\\]|\\]|\\)*)\]|d{1,4}|M{1,4}|m{1,2}|w{1,2}|Qo|Do|D{1,4}|YY(?:YY)?|H{1,2}|h{1,2}|s{1,2}|S{1,3}|Z{1,2}|a{1,2}|[AQExX]/g,x$=/(\[[^\]]*\])|d{1,4}|M{1,4}|m{1,2}|w{1,2}|Qo|Do|D{1,4}|YY(?:YY)?|H{1,2}|h{1,2}|s{1,2}|S{1,3}|Z{1,2}|a{1,2}|[AQExX]|([.*+:?^,\s${}()|\\]+)/g,tc={};function S$(e,t){const n="("+t.days.join("|")+")",r=e+n;if(tc[r]!==void 0)return tc[r];const l="("+t.daysShort.join("|")+")",i="("+t.months.join("|")+")",c="("+t.monthsShort.join("|")+")",u={};let v=0;const m=e.replace(x$,y=>{switch(v++,y){case"YY":return u.YY=v,"(-?\\d{1,2})";case"YYYY":return u.YYYY=v,"(-?\\d{1,4})";case"M":return u.M=v,"(\\d{1,2})";case"MM":return u.M=v,"(\\d{2})";case"MMM":return u.MMM=v,c;case"MMMM":return u.MMMM=v,i;case"D":return u.D=v,"(\\d{1,2})";case"Do":return u.D=v++,"(\\d{1,2}(st|nd|rd|th))";case"DD":return u.D=v,"(\\d{2})";case"H":return u.H=v,"(\\d{1,2})";case"HH":return u.H=v,"(\\d{2})";case"h":return u.h=v,"(\\d{1,2})";case"hh":return u.h=v,"(\\d{2})";case"m":return u.m=v,"(\\d{1,2})";case"mm":return u.m=v,"(\\d{2})";case"s":return u.s=v,"(\\d{1,2})";case"ss":return u.s=v,"(\\d{2})";case"S":return u.S=v,"(\\d{1})";case"SS":return u.S=v,"(\\d{2})";case"SSS":return u.S=v,"(\\d{3})";case"A":return u.A=v,"(AM|PM)";case"a":return u.a=v,"(am|pm)";case"aa":return u.aa=v,"(a\\.m\\.|p\\.m\\.)";case"ddd":return l;case"dddd":return n;case"Q":case"d":case"E":return"(\\d{1})";case"Qo":return"(1st|2nd|3rd|4th)";case"DDD":case"DDDD":return"(\\d{1,3})";case"w":return"(\\d{1,2})";case"ww":return"(\\d{2})";case"Z":return u.Z=v,"(Z|[+-]\\d{2}:\\d{2})";case"ZZ":return u.ZZ=v,"(Z|[+-]\\d{2}\\d{2})";case"X":return u.X=v,"(-?\\d+)";case"x":return u.x=v,"(-?\\d{4,})";default:return v--,y[0]==="["&&(y=y.substring(1,y.length-1)),y.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}}),p={map:u,regex:new RegExp("^"+m)};return tc[r]=p,p}function Kh(e,t){return e!==void 0?e:t!==void 0?t.date:_c.date}function xf(e,t=""){const n=e>0?"-":"+",r=Math.abs(e),l=Math.floor(r/60),i=r%60;return n+zt(l)+t+zt(i)}function bl(e,t,n,r,l){const i={year:null,month:null,day:null,hour:null,minute:null,second:null,millisecond:null,timezoneOffset:null,dateHash:null,timeHash:null};if(l!==void 0&&Object.assign(i,l),e==null||e===""||typeof e!="string")return i;t===void 0&&(t=Wh);const c=Kh(n,ro.props),u=c.months,v=c.monthsShort,{regex:m,map:p}=S$(t,c),y=e.match(m);if(y===null)return i;let b="";if(p.X!==void 0||p.x!==void 0){const g=parseInt(y[p.X!==void 0?p.X:p.x],10);if(isNaN(g)===!0||g<0)return i;const w=new Date(g*(p.X!==void 0?1e3:1));i.year=w.getFullYear(),i.month=w.getMonth()+1,i.day=w.getDate(),i.hour=w.getHours(),i.minute=w.getMinutes(),i.second=w.getSeconds(),i.millisecond=w.getMilliseconds()}else{if(p.YYYY!==void 0)i.year=parseInt(y[p.YYYY],10);else if(p.YY!==void 0){const g=parseInt(y[p.YY],10);i.year=g<0?g:2e3+g}if(p.M!==void 0){if(i.month=parseInt(y[p.M],10),i.month<1||i.month>12)return i}else p.MMM!==void 0?i.month=v.indexOf(y[p.MMM])+1:p.MMMM!==void 0&&(i.month=u.indexOf(y[p.MMMM])+1);if(p.D!==void 0){if(i.day=parseInt(y[p.D],10),i.year===null||i.month===null||i.day<1)return i;const g=r!=="persian"?new Date(i.year,i.month,0).getDate():Ji(i.year,i.month);if(i.day>g)return i}p.H!==void 0?i.hour=parseInt(y[p.H],10)%24:p.h!==void 0&&(i.hour=parseInt(y[p.h],10)%12,(p.A&&y[p.A]==="PM"||p.a&&y[p.a]==="pm"||p.aa&&y[p.aa]==="p.m.")&&(i.hour+=12),i.hour=i.hour%24),p.m!==void 0&&(i.minute=parseInt(y[p.m],10)%60),p.s!==void 0&&(i.second=parseInt(y[p.s],10)%60),p.S!==void 0&&(i.millisecond=parseInt(y[p.S],10)*10**(3-y[p.S].length)),p.Z===void 0&&p.ZZ===void 0||(b=p.Z!==void 0?y[p.Z].replace(":",""):y[p.ZZ],i.timezoneOffset=(b[0]==="+"?-1:1)*(60*b.slice(1,3)+1*b.slice(3,5)))}return i.dateHash=zt(i.year,6)+"/"+zt(i.month)+"/"+zt(i.day),i.timeHash=zt(i.hour)+":"+zt(i.minute)+":"+zt(i.second)+b,i}function Sf(e){const t=new Date(e.getFullYear(),e.getMonth(),e.getDate());t.setDate(t.getDate()-(t.getDay()+6)%7+3);const n=new Date(t.getFullYear(),0,4);n.setDate(n.getDate()-(n.getDay()+6)%7+3);const r=t.getTimezoneOffset()-n.getTimezoneOffset();t.setHours(t.getHours()-r);const l=(t-n)/(7*jh);return 1+Math.floor(l)}function aa(e,t,n){const r=new Date(e),l=`set${n===!0?"UTC":""}`;switch(t){case"year":case"years":r[`${l}Month`](0);case"month":case"months":r[`${l}Date`](1);case"day":case"days":case"date":r[`${l}Hours`](0);case"hour":case"hours":r[`${l}Minutes`](0);case"minute":case"minutes":r[`${l}Seconds`](0);case"second":case"seconds":r[`${l}Milliseconds`](0)}return r}function Ii(e,t,n){return(e.getTime()-e.getTimezoneOffset()*Ac-(t.getTime()-t.getTimezoneOffset()*Ac))/n}function Yh(e,t,n="days"){const r=new Date(e),l=new Date(t);switch(n){case"years":case"year":return r.getFullYear()-l.getFullYear();case"months":case"month":return 12*(r.getFullYear()-l.getFullYear())+r.getMonth()-l.getMonth();case"days":case"day":case"date":return Ii(aa(r,"day"),aa(l,"day"),jh);case"hours":case"hour":return Ii(aa(r,"hour"),aa(l,"hour"),_$);case"minutes":case"minute":return Ii(aa(r,"minute"),aa(l,"minute"),Ac);case"seconds":case"second":return Ii(aa(r,"second"),aa(l,"second"),1e3)}}function kf(e){return Yh(e,aa(e,"year"),"days")+1}function Cf(e){if(e>=11&&e<=13)return`${e}th`;switch(e%10){case 1:return`${e}st`;case 2:return`${e}nd`;case 3:return`${e}rd`}return`${e}th`}const qf={YY(e,t,n){const r=this.YYYY(e,t,n)%100;return r>=0?zt(r):"-"+zt(Math.abs(r))},YYYY(e,t,n){return n??e.getFullYear()},M(e){return e.getMonth()+1},MM(e){return zt(e.getMonth()+1)},MMM(e,t){return t.monthsShort[e.getMonth()]},MMMM(e,t){return t.months[e.getMonth()]},Q(e){return Math.ceil((e.getMonth()+1)/3)},Qo(e){return Cf(this.Q(e))},D(e){return e.getDate()},Do(e){return Cf(e.getDate())},DD(e){return zt(e.getDate())},DDD(e){return kf(e)},DDDD(e){return zt(kf(e),3)},d(e){return e.getDay()},dd(e,t){return this.dddd(e,t).slice(0,2)},ddd(e,t){return t.daysShort[e.getDay()]},dddd(e,t){return t.days[e.getDay()]},E(e){return e.getDay()||7},w(e){return Sf(e)},ww(e){return zt(Sf(e))},H(e){return e.getHours()},HH(e){return zt(e.getHours())},h(e){const t=e.getHours();return t===0?12:t>12?t%12:t},hh(e){return zt(this.h(e))},m(e){return e.getMinutes()},mm(e){return zt(e.getMinutes())},s(e){return e.getSeconds()},ss(e){return zt(e.getSeconds())},S(e){return Math.floor(e.getMilliseconds()/100)},SS(e){return zt(Math.floor(e.getMilliseconds()/10))},SSS(e){return zt(e.getMilliseconds(),3)},A(e){return this.H(e)<12?"AM":"PM"},a(e){return this.H(e)<12?"am":"pm"},aa(e){return this.H(e)<12?"a.m.":"p.m."},Z(e,t,n,r){const l=r??e.getTimezoneOffset();return xf(l,":")},ZZ(e,t,n,r){const l=r??e.getTimezoneOffset();return xf(l)},X(e){return Math.floor(e.getTime()/1e3)},x(e){return e.getTime()}};function Gh(e,t,n,r,l){if(e!==0&&!e||e===1/0||e===-1/0)return;const i=new Date(e);if(isNaN(i))return;t===void 0&&(t=Wh);const c=Kh(n,ro.props);return t.replace(w$,(u,v)=>u in qf?qf[u](i,c,r,l):v===void 0?u:v.split("\\]").join("]"))}const za=20,k$=["Calendar","Years","Months"],$f=e=>k$.includes(e),nc=e=>/^-?[\d]+\/[0-1]\d$/.test(e),Sr=" — ";function _a(e){return e.year+"/"+zt(e.month)}var C$=we({name:"QDate",props:{...Dh,...ko,...Ft,multiple:Boolean,range:Boolean,title:String,subtitle:String,mask:{default:"YYYY/MM/DD"},defaultYearMonth:{type:String,validator:nc},yearsInMonthView:Boolean,events:[Array,Function],eventColor:[String,Function],emitImmediately:Boolean,options:[Array,Function],navigationMinYearMonth:{type:String,validator:nc},navigationMaxYearMonth:{type:String,validator:nc},noUnset:Boolean,firstDayOfWeek:[String,Number],todayBtn:Boolean,minimal:Boolean,defaultView:{type:String,default:"Calendar",validator:$f}},emits:[...Qh,"rangeStart","rangeEnd","navigation"],setup(e,{slots:t,emit:n}){const{proxy:r}=Ve(),{$q:l}=r,i=Vt(e,l),{getCache:c}=Ol(),{tabindex:u,headerClass:v,getLocale:m,getCurrentDate:p}=Uh(e,l);let y;const b=Il(e),g=La(b),w=X(null),L=X(kt()),$=X(m()),F=f(()=>kt()),A=f(()=>m()),S=f(()=>p()),x=X(Dt(L.value,$.value)),P=X(e.defaultView),M=l.lang.rtl===!0?"right":"left",E=X(M.value),D=X(M.value),z=x.value.year,I=X(z-z%za-(z<0?za:0)),N=X(null),H=f(()=>{const Q=e.landscape===!0?"landscape":"portrait";return`q-date q-date--${Q} q-date--${Q}-${e.minimal===!0?"minimal":"standard"}`+(i.value===!0?" q-date--dark q-dark":"")+(e.bordered===!0?" q-date--bordered":"")+(e.square===!0?" q-date--square no-border-radius":"")+(e.flat===!0?" q-date--flat no-shadow":"")+(e.disable===!0?" disabled":e.readonly===!0?" q-date--readonly":"")}),T=f(()=>e.color||"primary"),O=f(()=>e.textColor||"white"),J=f(()=>e.emitImmediately===!0&&e.multiple!==!0&&e.range!==!0),se=f(()=>Array.isArray(e.modelValue)===!0?e.modelValue:e.modelValue!==null&&e.modelValue!==void 0?[e.modelValue]:[]),R=f(()=>se.value.filter(Q=>typeof Q=="string").map(Q=>Ht(Q,L.value,$.value)).filter(Q=>Q.dateHash!==null&&Q.day!==null&&Q.month!==null&&Q.year!==null)),oe=f(()=>{const Q=ae=>Ht(ae,L.value,$.value);return se.value.filter(ae=>En(ae)===!0&&ae.from!==void 0&&ae.to!==void 0).map(ae=>({from:Q(ae.from),to:Q(ae.to)})).filter(ae=>ae.from.dateHash!==null&&ae.to.dateHash!==null&&ae.from.dateHashe.calendar!=="persian"?Q=>new Date(Q.year,Q.month-1,Q.day):Q=>{const ae=wf(Q.year,Q.month,Q.day);return new Date(ae.gy,ae.gm-1,ae.gd)}),Se=f(()=>e.calendar==="persian"?oa:(Q,ae,fe)=>Gh(new Date(Q.year,Q.month-1,Q.day,Q.hour,Q.minute,Q.second,Q.millisecond),ae===void 0?L.value:ae,fe===void 0?$.value:fe,Q.year,Q.timezoneOffset)),k=f(()=>R.value.length+oe.value.reduce((Q,ae)=>Q+1+Yh(le.value(ae.to),le.value(ae.from)),0)),_=f(()=>{if(e.title!==void 0&&e.title!==null&&e.title.length!==0)return e.title;if(N.value!==null){const fe=N.value.init,Ie=le.value(fe);return $.value.daysShort[Ie.getDay()]+", "+$.value.monthsShort[fe.month-1]+" "+fe.day+Sr+"?"}if(k.value===0)return Sr;if(k.value>1)return`${k.value} ${$.value.pluralDay}`;const Q=R.value[0],ae=le.value(Q);return isNaN(ae.valueOf())===!0?Sr:$.value.headerTitle!==void 0?$.value.headerTitle(ae,Q):$.value.daysShort[ae.getDay()]+", "+$.value.monthsShort[Q.month-1]+" "+Q.day}),j=f(()=>R.value.concat(oe.value.map(ae=>ae.from)).sort((ae,fe)=>ae.year-fe.year||ae.month-fe.month)[0]),U=f(()=>R.value.concat(oe.value.map(ae=>ae.to)).sort((ae,fe)=>fe.year-ae.year||fe.month-ae.month)[0]),K=f(()=>{if(e.subtitle!==void 0&&e.subtitle!==null&&e.subtitle.length!==0)return e.subtitle;if(k.value===0)return Sr;if(k.value>1){const Q=j.value,ae=U.value,fe=$.value.monthsShort;return fe[Q.month-1]+(Q.year!==ae.year?" "+Q.year+Sr+fe[ae.month-1]+" ":Q.month!==ae.month?Sr+fe[ae.month-1]:"")+" "+ae.year}return R.value[0].year}),G=f(()=>{const Q=[l.iconSet.datetime.arrowLeft,l.iconSet.datetime.arrowRight];return l.lang.rtl===!0?Q.reverse():Q}),ne=f(()=>e.firstDayOfWeek!==void 0?Number(e.firstDayOfWeek):$.value.firstDayOfWeek),W=f(()=>{const Q=$.value.daysShort,ae=ne.value;return ae>0?Q.slice(ae,7).concat(Q.slice(0,ae)):Q}),C=f(()=>{const Q=x.value;return e.calendar!=="persian"?new Date(Q.year,Q.month,0).getDate():Ji(Q.year,Q.month)}),Z=f(()=>typeof e.eventColor=="function"?e.eventColor:()=>e.eventColor),ce=f(()=>{if(e.navigationMinYearMonth===void 0)return null;const Q=e.navigationMinYearMonth.split("/");return{year:parseInt(Q[0],10),month:parseInt(Q[1],10)}}),ge=f(()=>{if(e.navigationMaxYearMonth===void 0)return null;const Q=e.navigationMaxYearMonth.split("/");return{year:parseInt(Q[0],10),month:parseInt(Q[1],10)}}),Ee=f(()=>{const Q={month:{prev:!0,next:!0},year:{prev:!0,next:!0}};return ce.value!==null&&ce.value.year>=x.value.year&&(Q.year.prev=!1,ce.value.year===x.value.year&&ce.value.month>=x.value.month&&(Q.month.prev=!1)),ge.value!==null&&ge.value.year<=x.value.year&&(Q.year.next=!1,ge.value.year===x.value.year&&ge.value.month<=x.value.month&&(Q.month.next=!1)),Q}),Me=f(()=>{const Q={};return R.value.forEach(ae=>{const fe=_a(ae);Q[fe]===void 0&&(Q[fe]=[]),Q[fe].push(ae.day)}),Q}),je=f(()=>{const Q={};return oe.value.forEach(ae=>{const fe=_a(ae.from),Ie=_a(ae.to);if(Q[fe]===void 0&&(Q[fe]=[]),Q[fe].push({from:ae.from.day,to:fe===Ie?ae.to.day:void 0,range:ae}),fe12&&(yt.year++,yt.month=1)}}),Q}),Ke=f(()=>{if(N.value===null)return;const{init:Q,initHash:ae,final:fe,finalHash:Ie}=N.value,[Re,Mt]=ae<=Ie?[Q,fe]:[fe,Q],et=_a(Re),yt=_a(Mt);if(et!==Oe.value&&yt!==Oe.value)return;const Ot={};return et===Oe.value?(Ot.from=Re.day,Ot.includeFrom=!0):Ot.from=1,yt===Oe.value?(Ot.to=Mt.day,Ot.includeTo=!0):Ot.to=C.value,Ot}),Oe=f(()=>_a(x.value)),ct=f(()=>{const Q={};if(e.options===void 0){for(let fe=1;fe<=C.value;fe++)Q[fe]=!0;return Q}const ae=typeof e.options=="function"?e.options:fe=>e.options.includes(fe);for(let fe=1;fe<=C.value;fe++){const Ie=Oe.value+"/"+zt(fe);Q[fe]=ae(Ie)}return Q}),Pt=f(()=>{const Q={};if(e.events===void 0)for(let ae=1;ae<=C.value;ae++)Q[ae]=!1;else{const ae=typeof e.events=="function"?e.events:fe=>e.events.includes(fe);for(let fe=1;fe<=C.value;fe++){const Ie=Oe.value+"/"+zt(fe);Q[fe]=ae(Ie)===!0&&Z.value(Ie)}}return Q}),pt=f(()=>{let Q,ae;const{year:fe,month:Ie}=x.value;if(e.calendar!=="persian")Q=new Date(fe,Ie-1,1),ae=new Date(fe,Ie-1,0).getDate();else{const Re=wf(fe,Ie,1);Q=new Date(Re.gy,Re.gm-1,Re.gd);let Mt=Ie-1,et=fe;Mt===0&&(Mt=12,et--),ae=Ji(et,Mt)}return{days:Q.getDay()-ne.value-1,endDay:ae}}),ke=f(()=>{const Q=[],{days:ae,endDay:fe}=pt.value,Ie=ae<0?ae+7:ae;if(Ie<6)for(let et=fe-Ie;et<=fe;et++)Q.push({i:et,fill:!0});const Re=Q.length;for(let et=1;et<=C.value;et++){const yt={i:et,event:Pt.value[et],classes:[]};ct.value[et]===!0&&(yt.in=!0,yt.flat=!0),Q.push(yt)}if(Me.value[Oe.value]!==void 0&&Me.value[Oe.value].forEach(et=>{const yt=Re+et-1;Object.assign(Q[yt],{selected:!0,unelevated:!0,flat:!1,color:T.value,textColor:O.value})}),je.value[Oe.value]!==void 0&&je.value[Oe.value].forEach(et=>{if(et.from!==void 0){const yt=Re+et.from-1,Ot=Re+(et.to||C.value)-1;for(let Wn=yt;Wn<=Ot;Wn++)Object.assign(Q[Wn],{range:et.range,unelevated:!0,color:T.value,textColor:O.value});Object.assign(Q[yt],{rangeFrom:!0,flat:!1}),et.to!==void 0&&Object.assign(Q[Ot],{rangeTo:!0,flat:!1})}else if(et.to!==void 0){const yt=Re+et.to-1;for(let Ot=Re;Ot<=yt;Ot++)Object.assign(Q[Ot],{range:et.range,unelevated:!0,color:T.value,textColor:O.value});Object.assign(Q[yt],{flat:!1,rangeTo:!0})}else{const yt=Re+C.value-1;for(let Ot=Re;Ot<=yt;Ot++)Object.assign(Q[Ot],{range:et.range,unelevated:!0,color:T.value,textColor:O.value})}}),Ke.value!==void 0){const et=Re+Ke.value.from-1,yt=Re+Ke.value.to-1;for(let Ot=et;Ot<=yt;Ot++)Q[Ot].color=T.value,Q[Ot].editRange=!0;Ke.value.includeFrom===!0&&(Q[et].editRangeFrom=!0),Ke.value.includeTo===!0&&(Q[yt].editRangeTo=!0)}x.value.year===S.value.year&&x.value.month===S.value.month&&(Q[Re+S.value.day-1].today=!0);const Mt=Q.length%7;if(Mt>0){const et=7-Mt;for(let yt=1;yt<=et;yt++)Q.push({i:yt,fill:!0})}return Q.forEach(et=>{let yt="q-date__calendar-item ";et.fill===!0?yt+="q-date__calendar-item--fill":(yt+=`q-date__calendar-item--${et.in===!0?"in":"out"}`,et.range!==void 0&&(yt+=` q-date__range${et.rangeTo===!0?"-to":et.rangeFrom===!0?"-from":""}`),et.editRange===!0&&(yt+=` q-date__edit-range${et.editRangeFrom===!0?"-from":""}${et.editRangeTo===!0?"-to":""}`),et.range===void 0&&et.editRange!==!0||(yt+=` text-${et.color}`)),et.classes=yt}),Q}),Be=f(()=>e.disable===!0?{"aria-disabled":"true"}:{});function ve(){const{year:Q,month:ae,day:fe}=S.value,Ie={...x.value,year:Q,month:ae,day:fe},Re=Me.value[_a(Ie)];Re!==void 0&&Re.includes(Ie.day)!==!1||Co(Ie),lt(Ie.year,Ie.month)}function ze(Q){$f(Q)===!0&&(P.value=Q)}function tt(Q,ae){["month","year"].includes(Q)&&(Q==="month"?Le:de)(ae===!0?-1:1)}function lt(Q,ae){P.value="Calendar",xt(Q,ae)}function nt(Q,ae){if(e.range===!1||!Q)return void(N.value=null);const fe=Object.assign({...x.value},Q),Ie=ae!==void 0?Object.assign({...x.value},ae):fe;N.value={init:fe,initHash:oa(fe),final:Ie,finalHash:oa(Ie)},lt(fe.year,fe.month)}function kt(){return e.calendar==="persian"?"YYYY/MM/DD":e.mask}function Ht(Q,ae,fe){return bl(Q,ae,fe,e.calendar,{hour:0,minute:0,second:0,millisecond:0})}function Dt(Q,ae){const fe=Array.isArray(e.modelValue)===!0?e.modelValue:e.modelValue?[e.modelValue]:[];if(fe.length===0)return me();const Ie=fe[fe.length-1],Re=Ht(Ie.from!==void 0?Ie.from:Ie,Q,ae);return Re.dateHash===null?me():Re}function me(){let Q,ae;if(e.defaultYearMonth!==void 0){const fe=e.defaultYearMonth.split("/");Q=parseInt(fe[0],10),ae=parseInt(fe[1],10)}else{const fe=S.value!==void 0?S.value:p();Q=fe.year,ae=fe.month}return{year:Q,month:ae,day:1,hour:0,minute:0,second:0,millisecond:0,dateHash:Q+"/"+zt(ae)+"/01"}}function Le(Q){let ae=x.value.year,fe=Number(x.value.month)+Q;fe===13?(fe=1,ae++):fe===0&&(fe=12,ae--),xt(ae,fe),J.value===!0&&tn("month")}function de(Q){const ae=Number(x.value.year)+Q;xt(ae,x.value.month),J.value===!0&&tn("year")}function $e(Q){xt(Q,x.value.month),P.value=e.defaultView==="Years"?"Months":"Calendar",J.value===!0&&tn("year")}function Xe(Q){xt(x.value.year,Q),P.value="Calendar",J.value===!0&&tn("month")}function dt(Q,ae){const fe=Me.value[ae];(fe!==void 0&&fe.includes(Q.day)===!0?uo:Co)(Q)}function Qe(Q){return{year:Q.year,month:Q.month,day:Q.day}}function xt(Q,ae,fe){if(ce.value!==null&&Q<=ce.value.year&&((ae=ge.value.year&&((ae>ge.value.month||Q>ge.value.year)&&(ae=ge.value.month),Q=ge.value.year),fe!==void 0){const{hour:Re,minute:Mt,second:et,millisecond:yt,timezoneOffset:Ot,timeHash:Wn}=fe;Object.assign(x.value,{hour:Re,minute:Mt,second:et,millisecond:yt,timezoneOffset:Ot,timeHash:Wn})}const Ie=Q+"/"+zt(ae)+"/01";Ie!==x.value.dateHash&&(E.value=x.value.dateHash{I.value=Q-Q%za-(Q<0?za:0),Object.assign(x.value,{year:Q,month:ae,day:1,dateHash:Ie})}))}function Gt(Q,ae,fe){const Ie=Q!==null&&Q.length===1&&e.multiple===!1?Q[0]:Q;y=Ie;const{reason:Re,details:Mt}=Tn(ae,fe);n("update:modelValue",Ie,Re,Mt)}function tn(Q){const ae=R.value[0]!==void 0&&R.value[0].dateHash!==null?{...R.value[0]}:{...x.value};Tt(()=>{ae.year=x.value.year,ae.month=x.value.month;const fe=e.calendar!=="persian"?new Date(ae.year,ae.month,0).getDate():Ji(ae.year,ae.month);ae.day=Math.min(Math.max(1,ae.day),fe);const Ie=Hn(ae);y=Ie;const{details:Re}=Tn("",ae);n("update:modelValue",Ie,Q,Re)})}function Tn(Q,ae){return ae.from!==void 0?{reason:`${Q}-range`,details:{...Qe(ae.target),from:Qe(ae.from),to:Qe(ae.to)}}:{reason:`${Q}-day`,details:Qe(ae)}}function Hn(Q,ae,fe){return Q.from!==void 0?{from:Se.value(Q.from,ae,fe),to:Se.value(Q.to,ae,fe)}:Se.value(Q,ae,fe)}function Co(Q){let ae;if(e.multiple===!0)if(Q.from!==void 0){const fe=oa(Q.from),Ie=oa(Q.to),Re=R.value.filter(et=>et.dateHashIe),Mt=oe.value.filter(({from:et,to:yt})=>yt.dateHashIe);ae=Re.concat(Mt).concat(Q).map(et=>Hn(et))}else{const fe=se.value.slice();fe.push(Hn(Q)),ae=fe}else ae=Hn(Q);Gt(ae,"add",Q)}function uo(Q){if(e.noUnset===!0)return;let ae=null;if(e.multiple===!0&&Array.isArray(e.modelValue)===!0){const fe=Hn(Q);ae=Q.from!==void 0?e.modelValue.filter(Ie=>Ie.from===void 0||Ie.from!==fe.from&&Ie.to!==fe.to):e.modelValue.filter(Ie=>Ie!==fe),ae.length===0&&(ae=null)}Gt(ae,"remove",Q)}function be(Q,ae,fe){const Ie=R.value.concat(oe.value).map(Re=>Hn(Re,Q,ae)).filter(Re=>Re.from!==void 0?Re.from.dateHash!==null&&Re.to.dateHash!==null:Re.dateHash!==null);n("update:modelValue",(e.multiple===!0?Ie:Ie[0])||null,fe)}function Ne(){if(e.minimal!==!0)return d("div",{class:"q-date__header "+v.value},[d("div",{class:"relative-position"},[d(yn,{name:"q-transition--fade"},()=>d("div",{key:"h-yr-"+K.value,class:"q-date__header-subtitle q-date__header-link "+(P.value==="Years"?"q-date__header-link--active":"cursor-pointer"),tabindex:u.value,...c("vY",{onClick(){P.value="Years"},onKeyup(Q){Q.keyCode===13&&(P.value="Years")}})},[K.value]))]),d("div",{class:"q-date__header-title relative-position flex no-wrap"},[d("div",{class:"relative-position col"},[d(yn,{name:"q-transition--fade"},()=>d("div",{key:"h-sub"+_.value,class:"q-date__header-title-label q-date__header-link "+(P.value==="Calendar"?"q-date__header-link--active":"cursor-pointer"),tabindex:u.value,...c("vC",{onClick(){P.value="Calendar"},onKeyup(Q){Q.keyCode===13&&(P.value="Calendar")}})},[_.value]))]),e.todayBtn===!0?d(Rt,{class:"q-date__header-today self-start",icon:l.iconSet.datetime.today,flat:!0,size:"sm",round:!0,tabindex:u.value,onClick:ve}):null])])}function Ze({label:Q,type:ae,key:fe,dir:Ie,goTo:Re,boundaries:Mt,cls:et}){return[d("div",{class:"row items-center q-date__arrow"},[d(Rt,{round:!0,dense:!0,size:"sm",flat:!0,icon:G.value[0],tabindex:u.value,disable:Mt.prev===!1,...c("go-#"+ae,{onClick(){Re(-1)}})})]),d("div",{class:"relative-position overflow-hidden flex flex-center"+et},[d(yn,{name:"q-transition--jump-"+Ie},()=>d("div",{key:fe},[d(Rt,{flat:!0,dense:!0,noCaps:!0,label:Q,tabindex:u.value,...c("view#"+ae,{onClick:()=>{P.value=ae}})})]))]),d("div",{class:"row items-center q-date__arrow"},[d(Rt,{round:!0,dense:!0,size:"sm",flat:!0,icon:G.value[1],tabindex:u.value,disable:Mt.next===!1,...c("go+#"+ae,{onClick(){Re(1)}})})])]}_e(()=>e.modelValue,Q=>{if(y===Q)y=0;else{const ae=Dt(L.value,$.value);xt(ae.year,ae.month,ae)}}),_e(P,()=>{w.value!==null&&r.$el.contains(document.activeElement)===!0&&w.value.focus()}),_e(()=>x.value.year+"|"+x.value.month,()=>{n("navigation",{year:x.value.year,month:x.value.month})}),_e(F,Q=>{be(Q,$.value,"mask"),L.value=Q}),_e(A,Q=>{be(L.value,Q,"locale"),$.value=Q});const it={Calendar:()=>[d("div",{key:"calendar-view",class:"q-date__view q-date__calendar"},[d("div",{class:"q-date__navigation row items-center no-wrap"},Ze({label:$.value.months[x.value.month-1],type:"Months",key:x.value.month,dir:E.value,goTo:Le,boundaries:Ee.value.month,cls:" col"}).concat(Ze({label:x.value.year,type:"Years",key:x.value.year,dir:D.value,goTo:de,boundaries:Ee.value.year,cls:""}))),d("div",{class:"q-date__calendar-weekdays row items-center no-wrap"},W.value.map(Q=>d("div",{class:"q-date__calendar-item"},[d("div",Q)]))),d("div",{class:"q-date__calendar-days-container relative-position overflow-hidden"},[d(yn,{name:"q-transition--slide-"+E.value},()=>d("div",{key:Oe.value,class:"q-date__calendar-days fit"},ke.value.map(Q=>d("div",{class:Q.classes},[Q.in===!0?d(Rt,{class:Q.today===!0?"q-date__today":"",dense:!0,flat:Q.flat,unelevated:Q.unelevated,color:Q.color,textColor:Q.textColor,label:Q.i,tabindex:u.value,...c("day#"+Q.i,{onClick:()=>{mt(Q.i)},onMouseover:()=>{nn(Q.i)}})},Q.event!==!1?()=>d("div",{class:"q-date__event bg-"+Q.event}):null):d("div",""+Q.i)]))))])])],Months(){const Q=x.value.year===S.value.year,ae=Ie=>ce.value!==null&&x.value.year===ce.value.year&&ce.value.month>Ie||ge.value!==null&&x.value.year===ge.value.year&&ge.value.month{const Mt=x.value.month===Re+1;return d("div",{class:"q-date__months-item flex flex-center"},[d(Rt,{class:Q===!0&&S.value.month===Re+1?"q-date__today":null,flat:Mt!==!0,label:Ie,unelevated:Mt,color:Mt===!0?T.value:null,textColor:Mt===!0?O.value:null,tabindex:u.value,disable:ae(Re+1),...c("month#"+Re,{onClick:()=>{Xe(Re+1)}})})])});return e.yearsInMonthView===!0&&fe.unshift(d("div",{class:"row no-wrap full-width"},[Ze({label:x.value.year,type:"Years",key:x.value.year,dir:D.value,goTo:de,boundaries:Ee.value.year,cls:" col"})])),d("div",{key:"months-view",class:"q-date__view q-date__months flex flex-center"},fe)},Years(){const Q=I.value,ae=Q+za,fe=[],Ie=Re=>ce.value!==null&&ce.value.year>Re||ge.value!==null&&ge.value.year{$e(Re)}})})]))}return d("div",{class:"q-date__view q-date__years flex flex-center"},[d("div",{class:"col-auto"},[d(Rt,{round:!0,dense:!0,flat:!0,icon:G.value[0],tabindex:u.value,disable:Ie(Q),...c("y-",{onClick:()=>{I.value-=za}})})]),d("div",{class:"q-date__years-content col self-stretch row items-center"},fe),d("div",{class:"col-auto"},[d(Rt,{round:!0,dense:!0,flat:!0,icon:G.value[1],tabindex:u.value,disable:Ie(ae),...c("y+",{onClick:()=>{I.value+=za}})})])])}};function mt(Q){const ae={...x.value,day:Q};if(e.range!==!1)if(N.value===null){const fe=ke.value.find(Re=>Re.fill!==!0&&Re.i===Q);if(e.noUnset!==!0&&fe.range!==void 0)return void uo({target:ae,from:fe.range.from,to:fe.range.to});if(fe.selected===!0)return void uo(ae);const Ie=oa(ae);N.value={init:ae,initHash:Ie,final:ae,finalHash:Ie},n("rangeStart",Qe(ae))}else{const fe=N.value.initHash,Ie=oa(ae),Re=fe<=Ie?{from:N.value.init,to:ae}:{from:ae,to:N.value.init};N.value=null,Co(fe===Ie?ae:{target:ae,...Re}),n("rangeEnd",{from:Qe(Re.from),to:Qe(Re.to)})}else dt(ae,Oe.value)}function nn(Q){if(N.value!==null){const ae={...x.value,day:Q};Object.assign(N.value,{final:ae,finalHash:oa(ae)})}}return Object.assign(r,{setToday:ve,setView:ze,offsetCalendar:tt,setCalendarTo:lt,setEditingRange:nt}),()=>{const Q=[d("div",{class:"q-date__content col relative-position"},[d(yn,{name:"q-transition--fade"},it[P.value])])],ae=Ge(t.default);return ae!==void 0&&Q.push(d("div",{class:"q-date__actions"},ae)),e.name!==void 0&&e.disable!==!0&&g(Q,"push"),d("div",{class:H.value,...Be.value},[Ne(),d("div",{ref:w,class:"q-date__main col column",tabindex:-1},Q)])}}});function Xh(e,t,n){let r;function l(){r!==void 0&&(kl.remove(r),r=void 0)}return qt(()=>{e.value===!0&&l()}),{removeFromHistory:l,addToHistory(){r={condition:()=>n.value===!0,handler:t},kl.add(r)}}}let oc,ac,yl,Tf,Mf,Lf,pl=0,rc=!1,Na=null;function q$(e){$$(e)&&bt(e)}function $$(e){if(e.target===document.body||e.target.classList.contains("q-layout__backdrop"))return!0;const t=B4(e),n=e.shiftKey&&!e.deltaX,r=!n&&Math.abs(e.deltaX)<=Math.abs(e.deltaY),l=n||r?e.deltaY:e.deltaX;for(let i=0;i0&&c.scrollTop+c.clientHeight===c.scrollHeight:l<0&&c.scrollLeft===0||l>0&&c.scrollLeft+c.clientWidth===c.scrollWidth}return!0}function Af(e){e.target===document&&(document.scrollingElement.scrollTop=document.scrollingElement.scrollTop)}function Oi(e){rc!==!0&&(rc=!0,requestAnimationFrame(()=>{rc=!1;const{height:t}=e.target,{clientHeight:n,scrollTop:r}=document.scrollingElement;yl!==void 0&&t===window.innerHeight||(yl=n-t,document.scrollingElement.scrollTop=r),r>yl&&(document.scrollingElement.scrollTop-=Math.ceil((r-yl)/8))}))}function Pf(e){const t=document.body,n=window.visualViewport!==void 0;if(e==="add"){const{overflowY:r,overflowX:l}=window.getComputedStyle(t);oc=Ls(window),ac=Ca(window),Tf=t.style.left,Mf=t.style.top,Lf=window.location.href,t.style.left=`-${oc}px`,t.style.top=`-${ac}px`,l!=="hidden"&&(l==="scroll"||t.scrollWidth>window.innerWidth)&&t.classList.add("q-body--force-scrollbar-x"),r!=="hidden"&&(r==="scroll"||t.scrollHeight>window.innerHeight)&&t.classList.add("q-body--force-scrollbar-y"),t.classList.add("q-body--prevent-scroll"),document.qScrollPrevented=!0,ut.is.ios===!0&&(n===!0?(window.scrollTo(0,0),window.visualViewport.addEventListener("resize",Oi,Zt.passiveCapture),window.visualViewport.addEventListener("scroll",Oi,Zt.passiveCapture),window.scrollTo(0,0)):window.addEventListener("scroll",Af,Zt.passiveCapture))}ut.is.desktop===!0&&ut.is.mac===!0&&window[`${e}EventListener`]("wheel",q$,Zt.notPassive),e==="remove"&&(ut.is.ios===!0&&(n===!0?(window.visualViewport.removeEventListener("resize",Oi,Zt.passiveCapture),window.visualViewport.removeEventListener("scroll",Oi,Zt.passiveCapture)):window.removeEventListener("scroll",Af,Zt.passiveCapture)),t.classList.remove("q-body--prevent-scroll"),t.classList.remove("q-body--force-scrollbar-x"),t.classList.remove("q-body--force-scrollbar-y"),document.qScrollPrevented=!1,t.style.left=Tf,t.style.top=Mf,window.location.href===Lf&&window.scrollTo(oc,ac),yl=void 0)}function Pc(e){let t="add";if(e===!0){if(pl++,Na!==null)return clearTimeout(Na),void(Na=null);if(pl>1)return}else{if(pl===0||(pl--,pl>0))return;if(t="remove",ut.is.ios===!0&&ut.is.nativeMobile===!0)return Na!==null&&clearTimeout(Na),void(Na=setTimeout(()=>{Pf(t),Na=null},100))}Pf(t)}function Zh(){let e;return{preventBodyScroll(t){t===e||e===void 0&&t!==!0||(e=t,Pc(t))}}}let Ri=0;const T$={standard:"fixed-full flex-center",top:"fixed-top justify-center",bottom:"fixed-bottom justify-center",right:"fixed-right items-center",left:"fixed-left items-center"},Bf={standard:["scale","scale"],top:["slide-down","slide-up"],bottom:["slide-up","slide-down"],right:["slide-left","slide-right"],left:["slide-right","slide-left"]};var Rl=we({name:"QDialog",inheritAttrs:!1,props:{...jr,...Fl,transitionShow:String,transitionHide:String,persistent:Boolean,autoClose:Boolean,allowFocusOutside:Boolean,noEscDismiss:Boolean,noBackdropDismiss:Boolean,noRouteDismiss:Boolean,noRefocus:Boolean,noFocus:Boolean,noShake:Boolean,seamless:Boolean,maximized:Boolean,fullWidth:Boolean,fullHeight:Boolean,square:Boolean,position:{type:String,default:"standard",validator:e=>e==="standard"||["top","bottom","left","right"].includes(e)}},emits:[...Wr,"shake","click","escapeKey"],setup(e,{slots:t,emit:n,attrs:r}){const l=Ve(),i=X(null),c=X(!1),u=X(!1);let v,m,p=null,y=null;const b=f(()=>e.persistent!==!0&&e.noRouteDismiss!==!0&&e.seamless!==!0),{preventBodyScroll:g}=Zh(),{registerTimeout:w}=Nr(),{registerTick:L,removeTick:$}=Vr(),{transitionProps:F,transitionStyle:A}=Ms(e,()=>Bf[e.position][0],()=>Bf[e.position][1]),{showPortal:S,hidePortal:x,portalIsAccessible:P,renderPortal:M}=ed(l,i,U,"dialog"),{hide:E}=Kr({showing:c,hideOnRouteChange:b,handleShow:O,handleHide:J,processOnMount:!0}),{addToHistory:D,removeFromHistory:z}=Xh(c,E,b),I=f(()=>`q-dialog__inner flex no-pointer-events q-dialog__inner--${e.maximized===!0?"maximized":"minimized"} q-dialog__inner--${e.position} ${T$[e.position]}`+(u.value===!0?" q-dialog__inner--animating":"")+(e.fullWidth===!0?" q-dialog__inner--fullwidth":"")+(e.fullHeight===!0?" q-dialog__inner--fullheight":"")+(e.square===!0?" q-dialog__inner--square":"")),N=f(()=>c.value===!0&&e.seamless!==!0),H=f(()=>e.autoClose===!0?{onClick:k}:{}),T=f(()=>[`q-dialog fullscreen no-pointer-events q-dialog--${N.value===!0?"modal":"seamless"}`,r.class]);function O(K){D(),y=e.noRefocus===!1&&document.activeElement!==null?document.activeElement:null,Se(e.maximized),S(),u.value=!0,e.noFocus!==!0?(document.activeElement!==null&&document.activeElement.blur(),L(se)):$(),w(()=>{if(l.proxy.$q.platform.is.ios===!0){if(e.seamless!==!0&&document.activeElement){const{top:G,bottom:ne}=document.activeElement.getBoundingClientRect(),{innerHeight:W}=window,C=window.visualViewport!==void 0?window.visualViewport.height:W;G>0&&ne>C/2&&(document.scrollingElement.scrollTop=Math.min(document.scrollingElement.scrollHeight-C,ne>=W?1/0:Math.ceil(document.scrollingElement.scrollTop+ne-C/2))),document.activeElement.scrollIntoView()}m=!0,i.value.click(),m=!1}S(!0),u.value=!1,n("show",K)},e.transitionDuration)}function J(K){$(),z(),le(!0),u.value=!0,x(),y!==null&&(((K&&K.type.indexOf("key")===0?y.closest('[tabindex]:not([tabindex^="-"])'):void 0)||y).focus(),y=null),w(()=>{x(!0),u.value=!1,n("hide",K)},e.transitionDuration)}function se(K){Yr(()=>{let G=i.value;G!==null&&G.contains(document.activeElement)!==!0&&(G=(K!==""?G.querySelector(K):null)||G.querySelector("[autofocus][tabindex], [data-autofocus][tabindex]")||G.querySelector("[autofocus] [tabindex], [data-autofocus] [tabindex]")||G.querySelector("[autofocus], [data-autofocus]")||G,G.focus({preventScroll:!0}))})}function R(K){K&&typeof K.focus=="function"?K.focus({preventScroll:!0}):se(),n("shake");const G=i.value;G!==null&&(G.classList.remove("q-animate--scale"),G.classList.add("q-animate--scale"),p!==null&&clearTimeout(p),p=setTimeout(()=>{p=null,i.value!==null&&(G.classList.remove("q-animate--scale"),se())},170))}function oe(){e.seamless!==!0&&(e.persistent===!0||e.noEscDismiss===!0?e.maximized!==!0&&e.noShake!==!0&&R():(n("escapeKey"),E()))}function le(K){p!==null&&(clearTimeout(p),p=null),K!==!0&&c.value!==!0||(Se(!1),e.seamless!==!0&&(g(!1),$c(j),ss(oe))),K!==!0&&(y=null)}function Se(K){K===!0?v!==!0&&(Ri<1&&document.body.classList.add("q-body--dialog"),Ri++,v=!0):v===!0&&(Ri<2&&document.body.classList.remove("q-body--dialog"),Ri--,v=!1)}function k(K){m!==!0&&(E(K),n("click",K))}function _(K){e.persistent!==!0&&e.noBackdropDismiss!==!0?E(K):e.noShake!==!0&&R()}function j(K){e.allowFocusOutside!==!0&&P.value===!0&&ah(i.value,K.target)!==!0&&se('[tabindex]:not([tabindex="-1"])')}function U(){return d("div",{role:"dialog","aria-modal":N.value===!0?"true":"false",...r,class:T.value},[d(yn,{name:"q-transition--fade",appear:!0},()=>N.value===!0?d("div",{class:"q-dialog__backdrop fixed-full",style:A.value,"aria-hidden":"true",tabindex:-1,onClick:_}):null),d(yn,F.value,()=>c.value===!0?d("div",{ref:i,class:I.value,style:A.value,tabindex:-1,...H.value},Ge(t.default)):null)])}return _e(()=>e.maximized,K=>{c.value===!0&&Se(K)}),_e(N,K=>{g(K),K===!0?(gh(j),hh(oe)):($c(j),ss(oe))}),Object.assign(l.proxy,{focus:se,shake:R,__updateRefocusTarget(K){y=K||null}}),qt(le),M}});const Ef=150;var M$=we({name:"QDrawer",inheritAttrs:!1,props:{...jr,...Ft,side:{type:String,default:"left",validator:e=>["left","right"].includes(e)},width:{type:Number,default:300},mini:Boolean,miniToOverlay:Boolean,miniWidth:{type:Number,default:57},noMiniAnimation:Boolean,breakpoint:{type:Number,default:1023},showIfAbove:Boolean,behavior:{type:String,validator:e=>["default","desktop","mobile"].includes(e),default:"default"},bordered:Boolean,elevated:Boolean,overlay:Boolean,persistent:Boolean,noSwipeOpen:Boolean,noSwipeClose:Boolean,noSwipeBackdrop:Boolean},emits:[...Wr,"onLayout","miniState"],setup(e,{slots:t,emit:n,attrs:r}){const l=Ve(),{proxy:{$q:i}}=l,c=Vt(e,i),{preventBodyScroll:u}=Zh(),{registerTimeout:v,removeTimeout:m}=Nr(),p=Fn(ar,Nt);if(p===Nt)return console.error("QDrawer needs to be child of QLayout"),Nt;let y,b,g=null;const w=X(e.behavior==="mobile"||e.behavior!=="desktop"&&p.totalWidth.value<=e.breakpoint),L=f(()=>e.mini===!0&&w.value!==!0),$=f(()=>L.value===!0?e.miniWidth:e.width),F=X(e.showIfAbove===!0&&w.value===!1||e.modelValue===!0),A=f(()=>e.persistent!==!0&&(w.value===!0||Se.value===!0));function S(ve,ze){if(E(),ve!==!1&&p.animate(),Ee(0),w.value===!0){const tt=p.instances[se.value];tt!==void 0&&tt.belowBreakpoint===!0&&tt.hide(!1),Me(1),p.isContainer.value!==!0&&u(!0)}else Me(0),ve!==!1&&je(!1);v(()=>{ve!==!1&&je(!0),ze!==!0&&n("show",ve)},Ef)}function x(ve,ze){D(),ve!==!1&&p.animate(),Me(0),Ee(N.value*$.value),Pt(),ze!==!0?v(()=>{n("hide",ve)},Ef):m()}const{show:P,hide:M}=Kr({showing:F,hideOnRouteChange:A,handleShow:S,handleHide:x}),{addToHistory:E,removeFromHistory:D}=Xh(F,M,A),z={belowBreakpoint:w,hide:M},I=f(()=>e.side==="right"),N=f(()=>(i.lang.rtl===!0?-1:1)*(I.value===!0?1:-1)),H=X(0),T=X(!1),O=X(!1),J=X($.value*N.value),se=f(()=>I.value===!0?"left":"right"),R=f(()=>F.value===!0&&w.value===!1&&e.overlay===!1?e.miniToOverlay===!0?e.miniWidth:$.value:0),oe=f(()=>e.overlay===!0||e.miniToOverlay===!0||p.view.value.indexOf(I.value?"R":"L")>-1||i.platform.is.ios===!0&&p.isContainer.value===!0),le=f(()=>e.overlay===!1&&F.value===!0&&w.value===!1),Se=f(()=>e.overlay===!0&&F.value===!0&&w.value===!1),k=f(()=>"fullscreen q-drawer__backdrop"+(F.value===!1&&T.value===!1?" hidden":"")),_=f(()=>({backgroundColor:`rgba(0,0,0,${.4*H.value})`})),j=f(()=>I.value===!0?p.rows.value.top[2]==="r":p.rows.value.top[0]==="l"),U=f(()=>I.value===!0?p.rows.value.bottom[2]==="r":p.rows.value.bottom[0]==="l"),K=f(()=>{const ve={};return p.header.space===!0&&j.value===!1&&(oe.value===!0?ve.top=`${p.header.offset}px`:p.header.space===!0&&(ve.top=`${p.header.size}px`)),p.footer.space===!0&&U.value===!1&&(oe.value===!0?ve.bottom=`${p.footer.offset}px`:p.footer.space===!0&&(ve.bottom=`${p.footer.size}px`)),ve}),G=f(()=>{const ve={width:`${$.value}px`,transform:`translateX(${J.value}px)`};return w.value===!0?ve:Object.assign(ve,K.value)}),ne=f(()=>"q-drawer__content fit "+(p.isContainer.value!==!0?"scroll":"overflow-auto")),W=f(()=>`q-drawer q-drawer--${e.side}`+(O.value===!0?" q-drawer--mini-animate":"")+(e.bordered===!0?" q-drawer--bordered":"")+(c.value===!0?" q-drawer--dark q-dark":"")+(T.value===!0?" no-transition":F.value===!0?"":" q-layout--prevent-focus")+(w.value===!0?" fixed q-drawer--on-top q-drawer--mobile q-drawer--top-padding":` q-drawer--${L.value===!0?"mini":"standard"}`+(oe.value===!0||le.value!==!0?" fixed":"")+(e.overlay===!0||e.miniToOverlay===!0?" q-drawer--on-top":"")+(j.value===!0?" q-drawer--top-padding":""))),C=f(()=>{const ve=i.lang.rtl===!0?e.side:se.value;return[[io,Oe,void 0,{[ve]:!0,mouse:!0}]]}),Z=f(()=>{const ve=i.lang.rtl===!0?se.value:e.side;return[[io,ct,void 0,{[ve]:!0,mouse:!0}]]}),ce=f(()=>{const ve=i.lang.rtl===!0?se.value:e.side;return[[io,ct,void 0,{[ve]:!0,mouse:!0,mouseAllDir:!0}]]});function ge(){ke(w,e.behavior==="mobile"||e.behavior!=="desktop"&&p.totalWidth.value<=e.breakpoint)}function Ee(ve){ve===void 0?Tt(()=>{ve=F.value===!0?0:$.value,Ee(N.value*ve)}):(p.isContainer.value!==!0||I.value!==!0||w.value!==!0&&Math.abs(ve)!==$.value||(ve+=N.value*p.scrollbarWidth.value),J.value=ve)}function Me(ve){H.value=ve}function je(ve){const ze=ve===!0?"remove":p.isContainer.value!==!0?"add":"";ze!==""&&document.body.classList[ze]("q-body--drawer-toggle")}function Ke(){g!==null&&clearTimeout(g),l.proxy&&l.proxy.$el&&l.proxy.$el.classList.add("q-drawer--mini-animate"),O.value=!0,g=setTimeout(()=>{g=null,O.value=!1,l&&l.proxy&&l.proxy.$el&&l.proxy.$el.classList.remove("q-drawer--mini-animate")},150)}function Oe(ve){if(F.value!==!1)return;const ze=$.value,tt=Jt(ve.distance.x,0,ze);if(ve.isFinal===!0)return tt>=Math.min(75,ze)===!0?P():(p.animate(),Me(0),Ee(N.value*ze)),void(T.value=!1);Ee((i.lang.rtl===!0?I.value!==!0:I.value)?Math.max(ze-tt,0):Math.min(0,tt-ze)),Me(Jt(tt/ze,0,1)),ve.isFirst===!0&&(T.value=!0)}function ct(ve){if(F.value!==!0)return;const ze=$.value,tt=ve.direction===e.side,lt=(i.lang.rtl===!0?tt!==!0:tt)?Jt(ve.distance.x,0,ze):0;if(ve.isFinal===!0)return Math.abs(lt){ve===!0?(y=F.value,F.value===!0&&M(!1)):e.overlay===!1&&e.behavior!=="mobile"&&y!==!1&&(F.value===!0?(Ee(0),Me(0),Pt()):P(!1))}),_e(()=>e.side,(ve,ze)=>{p.instances[ze]===z&&(p.instances[ze]=void 0,p[ze].space=!1,p[ze].offset=0),p.instances[ve]=z,p[ve].size=$.value,p[ve].space=le.value,p[ve].offset=R.value}),_e(p.totalWidth,()=>{p.isContainer.value!==!0&&document.qScrollPrevented===!0||ge()}),_e(()=>e.behavior+e.breakpoint,ge),_e(p.isContainer,ve=>{F.value===!0&&u(ve!==!0),ve===!0&&ge()}),_e(p.scrollbarWidth,()=>{Ee(F.value===!0?0:void 0)}),_e(R,ve=>{pt("offset",ve)}),_e(le,ve=>{n("onLayout",ve),pt("space",ve)}),_e(I,()=>{Ee()}),_e($,ve=>{Ee(),Be(e.miniToOverlay,ve)}),_e(()=>e.miniToOverlay,ve=>{Be(ve,$.value)}),_e(()=>i.lang.rtl,()=>{Ee()}),_e(()=>e.mini,()=>{e.noMiniAnimation||e.modelValue===!0&&(Ke(),p.animate())}),_e(L,ve=>{n("miniState",ve)}),p.instances[e.side]=z,Be(e.miniToOverlay,$.value),pt("space",le.value),pt("offset",R.value),e.showIfAbove===!0&&e.modelValue!==!0&&F.value===!0&&e["onUpdate:modelValue"]!==void 0&&n("update:modelValue",!0),jt(()=>{n("onLayout",le.value),n("miniState",L.value),y=e.showIfAbove===!0;const ve=()=>{(F.value===!0?S:x)(!1,!0)};p.totalWidth.value===0?b=_e(p.totalWidth,()=>{b(),b=void 0,F.value===!1&&e.showIfAbove===!0&&w.value===!1?P(!1):ve()}):Tt(ve)}),qt(()=>{b!==void 0&&b(),g!==null&&(clearTimeout(g),g=null),F.value===!0&&Pt(),p.instances[e.side]===z&&(p.instances[e.side]=void 0,pt("size",0),pt("offset",0),pt("space",!1))}),()=>{const ve=[];w.value===!0&&(e.noSwipeOpen===!1&&ve.push(Bo(d("div",{key:"open",class:`q-drawer__opener fixed-${e.side}`,"aria-hidden":"true"}),C.value)),ve.push(xo("div",{ref:"backdrop",class:k.value,style:_.value,"aria-hidden":"true",onClick:M},void 0,"backdrop",e.noSwipeBackdrop!==!0&&F.value===!0,()=>ce.value)));const ze=L.value===!0&&t.mini!==void 0,tt=[d("div",{...r,key:""+ze,class:[ne.value,r.class]},ze===!0?t.mini():Ge(t.default))];return e.elevated===!0&&F.value===!0&&tt.push(d("div",{class:"q-layout__shadow absolute-full overflow-hidden no-pointer-events"})),ve.push(xo("aside",{ref:"content",class:W.value,style:G.value},tt,"contentclose",e.noSwipeClose!==!0&&w.value===!0,()=>Z.value)),d("div",{class:"q-drawer-container"},ve)}}});function Jh(e,t){if(t&&e===t)return null;const n=e.nodeName.toLowerCase();if(["div","li","ul","ol","blockquote"].includes(n)===!0)return e;const r=window.getComputedStyle?window.getComputedStyle(e):e.currentStyle,l=r.display;return l==="block"||l==="table"?e:Jh(e.parentNode)}function lc(e,t,n){return!(!e||e===document.body)&&(n===!0&&e===t||(t===document?document.body:t).contains(e.parentNode))}function em(e,t,n){if(n||(n=document.createRange(),n.selectNode(e),n.setStart(e,0)),t.count===0)n.setEnd(e,t.count);else if(t.count>0)if(e.nodeType===Node.TEXT_NODE)e.textContent.length0&&this.savedPos + + + Print - ${document.title} + + +
${this.el.innerHTML}
+ + + `),l.print(),void l.close()}if(t==="link"){const l=this.getParentAttribute("href");if(l===null){const i=this.selectWord(this.selection),c=i?i.toString():"";if(!c.length&&(!this.range||!this.range.cloneContents().querySelector("img")))return;this.eVm.editLinkUrl.value=L$.test(c)?c:"https://",document.execCommand("createLink",!1,this.eVm.editLinkUrl.value),this.save(i.getRangeAt(0))}else this.eVm.editLinkUrl.value=l,this.range.selectNodeContents(this.parent),this.save();return}if(t==="fullscreen")return this.eVm.toggleFullscreen(),void r();if(t==="viewsource")return this.eVm.isViewingSource.value=this.eVm.isViewingSource.value===!1,this.eVm.setContent(this.eVm.props.modelValue),void r()}document.execCommand(t,!1,n),r()}selectWord(t){if(t===null||t.isCollapsed!==!0||t.modify===void 0)return t;const n=document.createRange();n.setStart(t.anchorNode,t.anchorOffset),n.setEnd(t.focusNode,t.focusOffset);const r=n.collapsed?["backward","forward"]:["forward","backward"];n.detach();const l=t.focusNode,i=t.focusOffset;return t.collapse(t.anchorNode,t.anchorOffset),t.modify("move",r[0],"character"),t.modify("move",r[1],"word"),t.extend(l,i),t.modify("extend",r[1],"character"),t.modify("extend",r[0],"word"),t}}var tm=we({name:"QTooltip",inheritAttrs:!1,props:{...Xc,...jr,...Fl,maxHeight:{type:String,default:null},maxWidth:{type:String,default:null},transitionShow:{default:"jump-down"},transitionHide:{default:"jump-up"},anchor:{type:String,default:"bottom middle",validator:vs},self:{type:String,default:"top middle",validator:vs},offset:{type:Array,default:()=>[14,14],validator:yh},scrollTarget:{default:void 0},delay:{type:Number,default:0},hideDelay:{type:Number,default:0}},emits:[...Wr],setup(e,{slots:t,emit:n,attrs:r}){let l,i;const c=Ve(),{proxy:{$q:u}}=c,v=X(null),m=X(!1),p=f(()=>fs(e.anchor,u.lang.rtl)),y=f(()=>fs(e.self,u.lang.rtl)),b=f(()=>e.persistent!==!0),{registerTick:g,removeTick:w}=Vr(),{registerTimeout:L}=Nr(),{transitionProps:$,transitionStyle:F}=Ms(e),{localScrollTarget:A,changeScrollEvent:S,unconfigureScrollTarget:x}=sh(e,Se),{anchorEl:P,canShow:M,anchorEvents:E}=Zc({showing:m,configureAnchorEl:le}),{show:D,hide:z}=Kr({showing:m,canShow:M,handleShow:T,handleHide:O,hideOnRouteChange:b,processOnMount:!0});Object.assign(E,{delayShow:R,delayHide:oe});const{showPortal:I,hidePortal:N,renderPortal:H}=ed(c,v,_,"tooltip");if(u.platform.is.mobile===!0){const j={anchorEl:P,innerRef:v,onClickOutside(K){return z(K),K.target.classList.contains("q-dialog__backdrop")&&bt(K),!0}},U=f(()=>e.modelValue===null&&e.persistent!==!0&&m.value===!0);_e(U,K=>{(K===!0?bh:ds)(j)}),qt(()=>{ds(j)})}function T(j){I(),g(()=>{i=new MutationObserver(()=>se()),i.observe(v.value,{attributes:!1,childList:!0,characterData:!0,subtree:!0}),se(),Se()}),l===void 0&&(l=_e(()=>u.screen.width+"|"+u.screen.height+"|"+e.self+"|"+e.anchor+"|"+u.lang.rtl,se)),L(()=>{I(!0),n("show",j)},e.transitionDuration)}function O(j){w(),N(),J(),L(()=>{N(!0),n("hide",j)},e.transitionDuration)}function J(){i!==void 0&&(i.disconnect(),i=void 0),l!==void 0&&(l(),l=void 0),x(),zn(E,"tooltipTemp")}function se(){td({targetEl:v.value,offset:e.offset,anchorEl:P.value,anchorOrigin:p.value,selfOrigin:y.value,maxHeight:e.maxHeight,maxWidth:e.maxWidth})}function R(j){if(u.platform.is.mobile===!0){Po(),document.body.classList.add("non-selectable");const U=P.value,K=["touchmove","touchcancel","touchend","click"].map(G=>[U,G,"delayHide","passiveCapture"]);fn(E,"tooltipTemp",K)}L(()=>{D(j)},e.delay)}function oe(j){u.platform.is.mobile===!0&&(zn(E,"tooltipTemp"),Po(),setTimeout(()=>{document.body.classList.remove("non-selectable")},10)),L(()=>{z(j)},e.hideDelay)}function le(){if(e.noParentEvent===!0||P.value===null)return;const j=u.platform.is.mobile===!0?[[P.value,"touchstart","delayShow","passive"]]:[[P.value,"mouseenter","delayShow","passive"],[P.value,"mouseleave","delayHide","passive"]];fn(E,"anchor",j)}function Se(){if(P.value!==null||e.scrollTarget!==void 0){A.value=Qo(P.value,e.scrollTarget);const j=e.noParentEvent===!0?se:z;S(A.value,j)}}function k(){return m.value===!0?d("div",{...r,ref:v,class:["q-tooltip q-tooltip--style q-position-engine no-pointer-events",r.class],style:[r.style,F.value],role:"tooltip"},Ge(t.default)):null}function _(){return d(yn,$.value,k)}return qt(J),Object.assign(c.proxy,{updatePosition:se}),H}}),zl=we({name:"QItem",props:{...Ft,...Ur,tag:{type:String,default:"div"},active:{type:Boolean,default:null},clickable:Boolean,dense:Boolean,insetLevel:Number,tabindex:[String,Number],focused:Boolean,manualFocus:Boolean},emits:["click","keyup"],setup(e,{slots:t,emit:n}){const{proxy:{$q:r}}=Ve(),l=Vt(e,r),{hasLink:i,linkAttrs:c,linkClass:u,linkTag:v,navigateOnClick:m}=Ts(),p=X(null),y=X(null),b=f(()=>e.clickable===!0||i.value===!0||e.tag==="label"),g=f(()=>e.disable!==!0&&b.value===!0),w=f(()=>"q-item q-item-type row no-wrap"+(e.dense===!0?" q-item--dense":"")+(l.value===!0?" q-item--dark":"")+(i.value===!0&&e.active===null?u.value:e.active===!0?` q-item--active${e.activeClass!==void 0?` ${e.activeClass}`:""}`:"")+(e.disable===!0?" disabled":"")+(g.value===!0?" q-item--clickable q-link cursor-pointer "+(e.manualFocus===!0?"q-manual-focusable":"q-focusable q-hoverable")+(e.focused===!0?" q-manual-focusable--focused":""):"")),L=f(()=>e.insetLevel===void 0?null:{["padding"+(r.lang.rtl===!0?"Right":"Left")]:16+56*e.insetLevel+"px"});function $(S){g.value===!0&&(y.value!==null&&(S.qKeyEvent!==!0&&document.activeElement===p.value?y.value.focus():document.activeElement===y.value&&p.value.focus()),m(S))}function F(S){if(g.value===!0&&wo(S,[13,32])===!0){bt(S),S.qKeyEvent=!0;const x=new MouseEvent("click",S);x.qKeyEvent=!0,p.value.dispatchEvent(x)}n("keyup",S)}function A(){const S=Pl(t.default,[]);return g.value===!0&&S.unshift(d("div",{class:"q-focus-helper",tabindex:-1,ref:y})),S}return()=>{const S={ref:p,class:w.value,style:L.value,role:"listitem",onClick:$,onKeyup:F};return g.value===!0?(S.tabindex=e.tabindex||"0",Object.assign(S,c.value)):b.value===!0&&(S["aria-disabled"]="true"),d(v.value,S,A())}}}),la=we({name:"QItemSection",props:{avatar:Boolean,thumbnail:Boolean,side:Boolean,top:Boolean,noWrap:Boolean},setup(e,{slots:t}){const n=f(()=>`q-item__section column q-item__section--${e.avatar===!0||e.side===!0||e.thumbnail===!0?"side":"main"}`+(e.top===!0?" q-item__section--top justify-start":" justify-center")+(e.avatar===!0?" q-item__section--avatar":"")+(e.thumbnail===!0?" q-item__section--thumbnail":"")+(e.noWrap===!0?" q-item__section--nowrap":""));return()=>d("div",{class:n.value},Ge(t.default))}});function nm(e,t,n){t.handler?t.handler(e,n,n.caret):n.runCmd(t.cmd,t.param)}function gd(e){return d("div",{class:"q-editor__toolbar-group"},e)}function om(e,t,n,r=!1){const l=r||t.type==="toggle"&&(t.toggled?t.toggled(e):t.cmd&&e.caret.is(t.cmd,t.param)),i=[];if(t.tip&&e.$q.platform.is.desktop){const c=t.key?d("div",[d("small",`(CTRL + ${String.fromCharCode(t.key)})`)]):null;i.push(d(tm,{delay:1e3},()=>[d("div",{innerHTML:t.tip}),c]))}return d(Rt,{...e.buttonProps.value,icon:t.icon!==null?t.icon:void 0,color:l?t.toggleColor||e.props.toolbarToggleColor:t.color||e.props.toolbarColor,textColor:l&&!e.props.toolbarPush?null:t.textColor||e.props.toolbarTextColor,label:t.label,disable:!!t.disable&&(typeof t.disable!="function"||t.disable(e)),size:"sm",onClick(c){n&&n(),nm(c,t,e)}},()=>i)}function P$(e,t){const n=t.list==="only-icons";let r,l,i=t.label,c=t.icon!==null?t.icon:void 0;function u(){m.component.proxy.hide()}if(n)l=t.options.map(p=>{const y=p.type===void 0&&e.caret.is(p.cmd,p.param);return y&&(i=p.tip,c=p.icon!==null?p.icon:void 0),om(e,p,u,y)}),r=e.toolbarBackgroundClass.value,l=[gd(l)];else{const p=e.props.toolbarToggleColor!==void 0?`text-${e.props.toolbarToggleColor}`:null,y=e.props.toolbarTextColor!==void 0?`text-${e.props.toolbarTextColor}`:null,b=t.list==="no-icons";l=t.options.map(g=>{const w=!!g.disable&&g.disable(e),L=g.type===void 0&&e.caret.is(g.cmd,g.param);L&&(i=g.tip,c=g.icon!==null?g.icon:void 0);const $=g.htmlTip;return d(zl,{active:L,activeClass:p,clickable:!0,disable:w,dense:!0,onClick(F){u(),e.contentRef.value!==null&&e.contentRef.value.focus(),e.caret.restore(),nm(F,g,e)}},()=>[b===!0?null:d(la,{class:L?p:y,side:!0},()=>d(Et,{name:g.icon!==null?g.icon:void 0})),d(la,$?()=>d("div",{class:"text-no-wrap",innerHTML:g.htmlTip}):g.tip?()=>d("div",{class:"text-no-wrap"},g.tip):void 0)])}),r=[e.toolbarBackgroundClass.value,y]}const v=t.highlight&&i!==t.label,m=d(_h,{...e.buttonProps.value,noCaps:!0,noWrap:!0,color:v?e.props.toolbarToggleColor:e.props.toolbarColor,textColor:v&&!e.props.toolbarPush?null:e.props.toolbarTextColor,label:t.fixedLabel?t.label:i,icon:t.fixedIcon?t.icon!==null?t.icon:void 0:c,contentClass:r,onShow:p=>e.emit("dropdownShow",p),onHide:p=>e.emit("dropdownHide",p),onBeforeShow:p=>e.emit("dropdownBeforeShow",p),onBeforeHide:p=>e.emit("dropdownBeforeHide",p)},()=>l);return m}function B$(e){if(e.caret)return e.buttons.value.filter(t=>!e.isViewingSource.value||t.find(n=>n.cmd==="viewsource")).map(t=>gd(t.map(n=>(!e.isViewingSource.value||n.cmd==="viewsource")&&(n.type==="slot"?Ge(e.slots[n.slot]):n.type==="dropdown"?P$(e,n):om(e,n)))))}function E$(e,t,n,r={}){const l=Object.keys(r);if(l.length===0)return{};const i={default_font:{cmd:"fontName",param:e,icon:n,tip:t}};return l.forEach(c=>{const u=r[c];i[c]={cmd:"fontName",param:u,icon:n,tip:u,htmlTip:`${u}`}}),i}function F$(e){if(e.caret){const t=e.props.toolbarColor||e.props.toolbarTextColor;let n=e.editLinkUrl.value;const r=()=>{e.caret.restore(),n!==e.editLinkUrl.value&&document.execCommand("createLink",!1,n===""?" ":n),e.editLinkUrl.value=null};return[d("div",{class:`q-mx-xs text-${t}`},`${e.$q.lang.editor.url}: `),d("input",{key:"qedt_btm_input",class:"col q-editor__link-input",value:n,onInput:l=>{dn(l),n=l.target.value},onKeydown:l=>{if(or(l)!==!0)switch(l.keyCode){case 13:return $n(l),r();case 27:$n(l),e.caret.restore(),e.editLinkUrl.value&&e.editLinkUrl.value!=="https://"||document.execCommand("unlink"),e.editLinkUrl.value=null;break}}}),gd([d(Rt,{key:"qedt_btm_rem",tabindex:-1,...e.buttonProps.value,label:e.$q.lang.label.remove,noCaps:!0,onClick:()=>{e.caret.restore(),document.execCommand("unlink"),e.editLinkUrl.value=null}}),d(Rt,{key:"qedt_btm_upd",...e.buttonProps.value,label:e.$q.lang.label.update,noCaps:!0,onClick:r})])]}}const Ff=/^on[A-Z]/;function am(e,t){const n={listeners:X({}),attributes:X({})};function r(){const l={},i={};for(const c in e)c!=="class"&&c!=="style"&&Ff.test(c)===!1&&(l[c]=e[c]);for(const c in t.props)Ff.test(c)===!0&&(i[c]=t.props[c]);n.attributes.value=l,n.listeners.value=i}return Ll(r),r(),n}const V$=Object.prototype.toString,ic=Object.prototype.hasOwnProperty,I$=new Set(["Boolean","Number","String","Function","Array","Date","RegExp"].map(e=>"[object "+e+"]"));function Vf(e){if(e!==Object(e)||I$.has(V$.call(e))===!0||e.constructor&&ic.call(e,"constructor")===!1&&ic.call(e.constructor.prototype,"isPrototypeOf")===!1)return!1;let t;for(t in e);return t===void 0||ic.call(e,t)}function rm(){let e,t,n,r,l,i,c=arguments[0]||{},u=1,v=!1;const m=arguments.length;for(typeof c=="boolean"&&(v=c,c=arguments[1]||{},u=2),Object(c)!==c&&typeof c!="function"&&(c={}),m===u&&(c=this,u--);ue.length===0||e.every(t=>t.length),default(){return[["left","center","right","justify"],["bold","italic","underline","strike"],["undo","redo"]]}},toolbarColor:String,toolbarBg:String,toolbarTextColor:String,toolbarToggleColor:{type:String,default:"primary"},toolbarOutline:Boolean,toolbarPush:Boolean,toolbarRounded:Boolean,paragraphTag:{type:String,validator:e=>["div","p"].includes(e),default:"div"},contentStyle:Object,contentClass:[Object,Array,String],square:Boolean,flat:Boolean,dense:Boolean},emits:[...cd,"update:modelValue","keydown","click","mouseup","keyup","touchend","focus","blur","dropdownShow","dropdownHide","dropdownBeforeShow","dropdownBeforeHide","linkShow","linkHide"],setup(e,{slots:t,emit:n,attrs:r}){const{proxy:l,vnode:i}=Ve(),{$q:c}=l,u=Vt(e,c),{inFullscreen:v,toggleFullscreen:m}=dd(),p=am(r,i),y=X(null),b=X(null),g=X(null),w=X(!1),L=f(()=>!e.readonly&&!e.disable);let $,F,A=e.modelValue;document.execCommand("defaultParagraphSeparator",!1,e.paragraphTag),$=window.getComputedStyle(document.body).fontFamily;const S=f(()=>e.toolbarBg?` bg-${e.toolbarBg}`:""),x=f(()=>({type:"a",flat:e.toolbarOutline!==!0&&e.toolbarPush!==!0,noWrap:!0,outline:e.toolbarOutline,push:e.toolbarPush,rounded:e.toolbarRounded,dense:!0,color:e.toolbarColor,disable:!L.value,size:"sm"})),P=f(()=>{const W=c.lang.editor,C=c.iconSet.editor;return{bold:{cmd:"bold",icon:C.bold,tip:W.bold,key:66},italic:{cmd:"italic",icon:C.italic,tip:W.italic,key:73},strike:{cmd:"strikeThrough",icon:C.strikethrough,tip:W.strikethrough,key:83},underline:{cmd:"underline",icon:C.underline,tip:W.underline,key:85},unordered:{cmd:"insertUnorderedList",icon:C.unorderedList,tip:W.unorderedList},ordered:{cmd:"insertOrderedList",icon:C.orderedList,tip:W.orderedList},subscript:{cmd:"subscript",icon:C.subscript,tip:W.subscript,htmlTip:"x2"},superscript:{cmd:"superscript",icon:C.superscript,tip:W.superscript,htmlTip:"x2"},link:{cmd:"link",disable:Z=>Z.caret&&!Z.caret.can("link"),icon:C.hyperlink,tip:W.hyperlink,key:76},fullscreen:{cmd:"fullscreen",icon:C.toggleFullscreen,tip:W.toggleFullscreen,key:70},viewsource:{cmd:"viewsource",icon:C.viewSource,tip:W.viewSource},quote:{cmd:"formatBlock",param:"BLOCKQUOTE",icon:C.quote,tip:W.quote,key:81},left:{cmd:"justifyLeft",icon:C.left,tip:W.left},center:{cmd:"justifyCenter",icon:C.center,tip:W.center},right:{cmd:"justifyRight",icon:C.right,tip:W.right},justify:{cmd:"justifyFull",icon:C.justify,tip:W.justify},print:{type:"no-state",cmd:"print",icon:C.print,tip:W.print,key:80},outdent:{type:"no-state",disable:Z=>Z.caret&&!Z.caret.can("outdent"),cmd:"outdent",icon:C.outdent,tip:W.outdent},indent:{type:"no-state",disable:Z=>Z.caret&&!Z.caret.can("indent"),cmd:"indent",icon:C.indent,tip:W.indent},removeFormat:{type:"no-state",cmd:"removeFormat",icon:C.removeFormat,tip:W.removeFormat},hr:{type:"no-state",cmd:"insertHorizontalRule",icon:C.hr,tip:W.hr},undo:{type:"no-state",cmd:"undo",icon:C.undo,tip:W.undo,key:90},redo:{type:"no-state",cmd:"redo",icon:C.redo,tip:W.redo,key:89},h1:{cmd:"formatBlock",param:"H1",icon:C.heading1||C.heading,tip:W.heading1,htmlTip:`

${W.heading1}

`},h2:{cmd:"formatBlock",param:"H2",icon:C.heading2||C.heading,tip:W.heading2,htmlTip:`

${W.heading2}

`},h3:{cmd:"formatBlock",param:"H3",icon:C.heading3||C.heading,tip:W.heading3,htmlTip:`

${W.heading3}

`},h4:{cmd:"formatBlock",param:"H4",icon:C.heading4||C.heading,tip:W.heading4,htmlTip:`

${W.heading4}

`},h5:{cmd:"formatBlock",param:"H5",icon:C.heading5||C.heading,tip:W.heading5,htmlTip:`
${W.heading5}
`},h6:{cmd:"formatBlock",param:"H6",icon:C.heading6||C.heading,tip:W.heading6,htmlTip:`
${W.heading6}
`},p:{cmd:"formatBlock",param:e.paragraphTag,icon:C.heading,tip:W.paragraph},code:{cmd:"formatBlock",param:"PRE",icon:C.code,htmlTip:`${W.code}`},"size-1":{cmd:"fontSize",param:"1",icon:C.size1||C.size,tip:W.size1,htmlTip:`${W.size1}`},"size-2":{cmd:"fontSize",param:"2",icon:C.size2||C.size,tip:W.size2,htmlTip:`${W.size2}`},"size-3":{cmd:"fontSize",param:"3",icon:C.size3||C.size,tip:W.size3,htmlTip:`${W.size3}`},"size-4":{cmd:"fontSize",param:"4",icon:C.size4||C.size,tip:W.size4,htmlTip:`${W.size4}`},"size-5":{cmd:"fontSize",param:"5",icon:C.size5||C.size,tip:W.size5,htmlTip:`${W.size5}`},"size-6":{cmd:"fontSize",param:"6",icon:C.size6||C.size,tip:W.size6,htmlTip:`${W.size6}`},"size-7":{cmd:"fontSize",param:"7",icon:C.size7||C.size,tip:W.size7,htmlTip:`${W.size7}`}}}),M=f(()=>{const W=e.definitions||{},C=e.definitions||e.fonts?rm(!0,{},P.value,W,E$($,c.lang.editor.defaultFont,c.iconSet.editor.font,e.fonts)):P.value;return e.toolbar.map(Z=>Z.map(ce=>{if(ce.options)return{type:"dropdown",icon:ce.icon,label:ce.label,size:"sm",dense:!0,fixedLabel:ce.fixedLabel,fixedIcon:ce.fixedIcon,highlight:ce.highlight,list:ce.list,options:ce.options.map(Ee=>C[Ee])};const ge=C[ce];return ge?ge.type==="no-state"||W[ce]&&(ge.cmd===void 0||P.value[ge.cmd]&&P.value[ge.cmd].type==="no-state")?ge:Object.assign({type:"toggle"},ge):{type:"slot",slot:ce}}))}),E={$q:c,props:e,slots:t,emit:n,inFullscreen:v,toggleFullscreen:m,runCmd:U,isViewingSource:w,editLinkUrl:g,toolbarBackgroundClass:S,buttonProps:x,contentRef:b,buttons:M,setContent:j};_e(()=>e.modelValue,W=>{A!==W&&(A=W,j(W,!0))}),_e(g,W=>{n(`link${W?"Show":"Hide"}`)});const D=f(()=>e.toolbar&&e.toolbar.length!==0),z=f(()=>{const W={},C=Z=>{Z.key&&(W[Z.key]={cmd:Z.cmd,param:Z.param})};return M.value.forEach(Z=>{Z.forEach(ce=>{ce.options?ce.options.forEach(C):C(ce)})}),W}),I=f(()=>v.value?e.contentStyle:[{minHeight:e.minHeight,height:e.height,maxHeight:e.maxHeight},e.contentStyle]),N=f(()=>`q-editor q-editor--${w.value===!0?"source":"default"}`+(e.disable===!0?" disabled":"")+(v.value===!0?" fullscreen column":"")+(e.square===!0?" q-editor--square no-border-radius":"")+(e.flat===!0?" q-editor--flat":"")+(e.dense===!0?" q-editor--dense":"")+(u.value===!0?" q-editor--dark q-dark":"")),H=f(()=>[e.contentClass,"q-editor__content",{col:v.value,"overflow-auto":v.value||e.maxHeight}]),T=f(()=>e.disable===!0?{"aria-disabled":"true"}:{});function O(){if(b.value!==null){const W=`inner${w.value===!0?"Text":"HTML"}`,C=b.value[W];C!==e.modelValue&&(A=C,n("update:modelValue",C))}}function J(W){if(n("keydown",W),W.ctrlKey!==!0||or(W)===!0)return void K();const C=W.keyCode,Z=z.value[C];if(Z!==void 0){const{cmd:ce,param:ge}=Z;bt(W),U(ce,ge,!1)}}function se(W){K(),n("click",W)}function R(W){if(b.value!==null){const{scrollTop:C,scrollHeight:Z}=b.value;F=Z-C}E.caret.save(),n("blur",W)}function oe(W){Tt(()=>{b.value!==null&&F!==void 0&&(b.value.scrollTop=b.value.scrollHeight-F)}),n("focus",W)}function le(W){const C=y.value;if(C!==null&&C.contains(W.target)===!0&&(W.relatedTarget===null||C.contains(W.relatedTarget)!==!0)){const Z=`inner${w.value===!0?"Text":"HTML"}`;E.caret.restorePosition(b.value[Z].length),K()}}function Se(W){const C=y.value;C===null||C.contains(W.target)!==!0||W.relatedTarget!==null&&C.contains(W.relatedTarget)===!0||(E.caret.savePosition(),K())}function k(){F=void 0}function _(W){E.caret.save()}function j(W,C){if(b.value!==null){C===!0&&E.caret.savePosition();const Z=`inner${w.value===!0?"Text":"HTML"}`;b.value[Z]=W,C===!0&&(E.caret.restorePosition(b.value[Z].length),K())}}function U(W,C,Z=!0){G(),E.caret.restore(),E.caret.apply(W,C,()=>{G(),E.caret.save(),Z&&K()})}function K(){setTimeout(()=>{g.value=null,l.$forceUpdate()},1)}function G(){Yr(()=>{b.value!==null&&b.value.focus({preventScroll:!0})})}function ne(){return b.value}return jt(()=>{E.caret=l.caret=new A$(b.value,E),j(e.modelValue),K(),document.addEventListener("selectionchange",_)}),qt(()=>{document.removeEventListener("selectionchange",_)}),Object.assign(l,{runCmd:U,refreshToolbar:K,focus:G,getContentEl:ne}),()=>{let W;if(D.value){const C=[d("div",{key:"qedt_top",class:"q-editor__toolbar row no-wrap scroll-x"+S.value},B$(E))];g.value!==null&&C.push(d("div",{key:"qedt_btm",class:"q-editor__toolbar row no-wrap items-center scroll-x"+S.value},F$(E))),W=d("div",{key:"toolbar_ctainer",class:"q-editor__toolbars-container"},C)}return d("div",{ref:y,class:N.value,style:{height:v.value===!0?"100%":null},...T.value,onFocusin:le,onFocusout:Se},[W,d("div",{ref:b,style:I.value,class:H.value,contenteditable:L.value,placeholder:e.placeholder,...p.listeners.value,onInput:O,onKeydown:J,onClick:se,onBlur:R,onFocus:oe,onMousedown:k,onTouchstartPassive:k})])}}}),ms=we({name:"QItemLabel",props:{overline:Boolean,caption:Boolean,header:Boolean,lines:[Number,String]},setup(e,{slots:t}){const n=f(()=>parseInt(e.lines,10)),r=f(()=>"q-item__label"+(e.overline===!0?" q-item__label--overline text-overline":"")+(e.caption===!0?" q-item__label--caption text-caption":"")+(e.header===!0?" q-item__label--header":"")+(n.value===1?" ellipsis":"")),l=f(()=>e.lines!==void 0&&n.value>1?{overflow:"hidden",display:"-webkit-box","-webkit-box-orient":"vertical","-webkit-line-clamp":n.value}:null);return()=>d("div",{style:l.value,class:r.value},Ge(t.default))}}),As=we({name:"QSlideTransition",props:{appear:Boolean,duration:{type:Number,default:300}},emits:["show","hide"],setup(e,{slots:t,emit:n}){let r,l,i,c,u=!1,v=null,m=null;function p(){r&&r(),r=null,u=!1,v!==null&&(clearTimeout(v),v=null),m!==null&&(clearTimeout(m),m=null),l!==void 0&&l.removeEventListener("transitionend",i),i=null}function y(L,$,F){$!==void 0&&(L.style.height=`${$}px`),L.style.transition=`height ${e.duration}ms cubic-bezier(.25, .8, .50, 1)`,u=!0,r=F}function b(L,$){L.style.overflowY=null,L.style.height=null,L.style.transition=null,p(),$!==c&&n($)}function g(L,$){let F=0;l=L,u===!0?(p(),F=L.offsetHeight===L.scrollHeight?0:void 0):(c="hide",L.style.overflowY="hidden"),y(L,F,$),v=setTimeout(()=>{v=null,L.style.height=`${L.scrollHeight}px`,i=A=>{m=null,Object(A)===A&&A.target!==L||b(L,"show")},L.addEventListener("transitionend",i),m=setTimeout(i,1.1*e.duration)},100)}function w(L,$){let F;l=L,u===!0?p():(c="show",L.style.overflowY="hidden",F=L.scrollHeight),y(L,F,$),v=setTimeout(()=>{v=null,L.style.height=0,i=A=>{m=null,Object(A)===A&&A.target!==L||b(L,"hide")},L.addEventListener("transitionend",i),m=setTimeout(i,1.1*e.duration)},100)}return qt(()=>{u===!0&&p()}),()=>d(yn,{css:!1,appear:e.appear,onEnter:g,onLeave:w},t.default)}});const R$={true:"inset",item:"item-inset","item-thumbnail":"item-thumbnail-inset"},sc={xs:2,sm:4,md:8,lg:16,xl:24};var $a=we({name:"QSeparator",props:{...Ft,spaced:[Boolean,String],inset:[Boolean,String],vertical:Boolean,color:String,size:String},setup(e){const t=Ve(),n=Vt(e,t.proxy.$q),r=f(()=>e.vertical===!0?"vertical":"horizontal"),l=f(()=>` q-separator--${r.value}`),i=f(()=>e.inset!==!1?`${l.value}-${R$[e.inset]}`:""),c=f(()=>`q-separator${l.value}${i.value}`+(e.color!==void 0?` bg-${e.color}`:"")+(n.value===!0?" q-separator--dark":"")),u=f(()=>{const v={};if(e.size!==void 0&&(v[e.vertical===!0?"width":"height"]=e.size),e.spaced!==!1){const m=e.spaced===!0?`${sc.md}px`:e.spaced in sc?`${sc[e.spaced]}px`:e.spaced,p=e.vertical===!0?["Left","Right"]:["Top","Bottom"];v[`margin${p[0]}`]=v[`margin${p[1]}`]=m}return v});return()=>d("hr",{class:c.value,style:u.value,"aria-orientation":r.value})}});const Ha=qx({}),z$=Object.keys(Ur);var N$=we({name:"QExpansionItem",props:{...Ur,...jr,...Ft,icon:String,label:String,labelLines:[Number,String],caption:String,captionLines:[Number,String],dense:Boolean,toggleAriaLabel:String,expandIcon:String,expandedIcon:String,expandIconClass:[Array,String,Object],duration:Number,headerInsetLevel:Number,contentInsetLevel:Number,expandSeparator:Boolean,defaultOpened:Boolean,hideExpandIcon:Boolean,expandIconToggle:Boolean,switchToggleSide:Boolean,denseToggle:Boolean,group:String,popup:Boolean,headerStyle:[Array,String,Object],headerClass:[Array,String,Object]},emits:[...Wr,"click","afterShow","afterHide"],setup(e,{slots:t,emit:n}){const{proxy:{$q:r}}=Ve(),l=Vt(e,r),i=X(e.modelValue!==null?e.modelValue:e.defaultOpened),c=X(null),u=er(),{show:v,hide:m,toggle:p}=Kr({showing:i});let y,b;const g=f(()=>`q-expansion-item q-item-type q-expansion-item--${i.value===!0?"expanded":"collapsed"} q-expansion-item--${e.popup===!0?"popup":"standard"}`),w=f(()=>e.contentInsetLevel===void 0?null:{["padding"+(r.lang.rtl===!0?"Right":"Left")]:56*e.contentInsetLevel+"px"}),L=f(()=>e.disable!==!0&&(e.href!==void 0||e.to!==void 0&&e.to!==null&&e.to!=="")),$=f(()=>{const R={};return z$.forEach(oe=>{R[oe]=e[oe]}),R}),F=f(()=>L.value===!0||e.expandIconToggle!==!0),A=f(()=>e.expandedIcon!==void 0&&i.value===!0?e.expandedIcon:e.expandIcon||r.iconSet.expansionItem[e.denseToggle===!0?"denseIcon":"icon"]),S=f(()=>e.disable!==!0&&(L.value===!0||e.expandIconToggle===!0)),x=f(()=>({expanded:i.value===!0,detailsId:e.targetUid,toggle:p,show:v,hide:m})),P=f(()=>{const R=e.toggleAriaLabel!==void 0?e.toggleAriaLabel:r.lang.label[i.value===!0?"collapse":"expand"](e.label);return{role:"button","aria-expanded":i.value===!0?"true":"false","aria-controls":u,"aria-label":R}});function M(R){L.value!==!0&&p(R),n("click",R)}function E(R){R.keyCode===13&&D(R,!0)}function D(R,oe){oe!==!0&&c.value!==null&&c.value.focus(),p(R),bt(R)}function z(){n("afterShow")}function I(){n("afterHide")}function N(){y===void 0&&(y=er()),i.value===!0&&(Ha[e.group]=y);const R=_e(i,le=>{le===!0?Ha[e.group]=y:Ha[e.group]===y&&delete Ha[e.group]}),oe=_e(()=>Ha[e.group],(le,Se)=>{Se===y&&le!==void 0&&le!==y&&m()});b=()=>{R(),oe(),Ha[e.group]===y&&delete Ha[e.group],b=void 0}}function H(){const R={class:[`q-focusable relative-position cursor-pointer${e.denseToggle===!0&&e.switchToggleSide===!0?" items-end":""}`,e.expandIconClass],side:e.switchToggleSide!==!0,avatar:e.switchToggleSide},oe=[d(Et,{class:"q-expansion-item__toggle-icon"+(e.expandedIcon===void 0&&i.value===!0?" q-expansion-item__toggle-icon--rotated":""),name:A.value})];return S.value===!0&&(Object.assign(R,{tabindex:0,...P.value,onClick:D,onKeyup:E}),oe.unshift(d("div",{ref:c,class:"q-expansion-item__toggle-focus q-icon q-focus-helper q-focus-helper--rounded",tabindex:-1}))),d(la,R,()=>oe)}function T(){let R;return t.header!==void 0?R=[].concat(t.header(x.value)):(R=[d(la,()=>[d(ms,{lines:e.labelLines},()=>e.label||""),e.caption?d(ms,{lines:e.captionLines,caption:!0},()=>e.caption):null])],e.icon&&R[e.switchToggleSide===!0?"push":"unshift"](d(la,{side:e.switchToggleSide===!0,avatar:e.switchToggleSide!==!0},()=>d(Et,{name:e.icon})))),e.disable!==!0&&e.hideExpandIcon!==!0&&R[e.switchToggleSide===!0?"unshift":"push"](H()),R}function O(){const R={ref:"item",style:e.headerStyle,class:e.headerClass,dark:l.value,disable:e.disable,dense:e.dense,insetLevel:e.headerInsetLevel};return F.value===!0&&(R.clickable=!0,R.onClick=M,Object.assign(R,L.value===!0?$.value:P.value)),d(zl,R,T)}function J(){return Bo(d("div",{key:"e-content",class:"q-expansion-item__content relative-position",style:w.value,id:u},Ge(t.default)),[[Cp,i.value]])}function se(){const R=[O(),d(As,{duration:e.duration,onShow:z,onHide:I},J)];return e.expandSeparator===!0&&R.push(d($a,{class:"q-expansion-item__border q-expansion-item__border--top absolute-top",dark:l.value}),d($a,{class:"q-expansion-item__border q-expansion-item__border--bottom absolute-bottom",dark:l.value})),R}return _e(()=>e.group,R=>{b!==void 0&&b(),R!==void 0&&N()}),e.group!==void 0&&N(),qt(()=>{b!==void 0&&b()}),()=>d("div",{class:g.value},[d("div",{class:"q-expansion-item__container relative-position"},se())])}});const H$=["top","right","bottom","left"],lm={type:{type:String,default:"a"},outline:Boolean,push:Boolean,flat:Boolean,unelevated:Boolean,color:String,textColor:String,glossy:Boolean,square:Boolean,padding:String,label:{type:[String,Number],default:""},labelPosition:{type:String,default:"right",validator:e=>H$.includes(e)},externalLabel:Boolean,hideLabel:{type:Boolean},labelClass:[Array,String,Object],labelStyle:[Array,String,Object],disable:Boolean,tabindex:[Number,String]};function im(e,t){return{formClass:f(()=>`q-fab--form-${e.square===!0?"square":"rounded"}`),stacked:f(()=>e.externalLabel===!1&&["top","bottom"].includes(e.labelPosition)),labelProps:f(()=>{if(e.externalLabel===!0){const n=e.hideLabel===null?t.value===!1:e.hideLabel;return{action:"push",data:{class:[e.labelClass,`q-fab__label q-tooltip--style q-fab__label--external q-fab__label--external-${e.labelPosition}`+(n===!0?" q-fab__label--external-hidden":"")],style:e.labelStyle}}}return{action:["left","top"].includes(e.labelPosition)?"unshift":"push",data:{class:[e.labelClass,`q-fab__label q-fab__label--internal q-fab__label--internal-${e.labelPosition}`+(e.hideLabel===!0?" q-fab__label--internal-hidden":"")],style:e.labelStyle}}})}}const D$=["up","right","down","left"],Q$=["left","center","right"];var U$=we({name:"QFab",props:{...lm,...jr,icon:String,activeIcon:String,hideIcon:Boolean,hideLabel:{default:null},direction:{type:String,default:"right",validator:e=>D$.includes(e)},persistent:Boolean,verticalActionsAlign:{type:String,default:"center",validator:e=>Q$.includes(e)}},emits:Wr,setup(e,{slots:t}){const n=X(null),r=X(e.modelValue===!0),l=er(),{proxy:{$q:i}}=Ve(),{formClass:c,labelProps:u}=im(e,r),v=f(()=>e.persistent!==!0),{hide:m,toggle:p}=Kr({showing:r,hideOnRouteChange:v}),y=f(()=>({opened:r.value})),b=f(()=>`q-fab z-fab row inline justify-center q-fab--align-${e.verticalActionsAlign} ${c.value}`+(r.value===!0?" q-fab--opened":" q-fab--closed")),g=f(()=>`q-fab__actions flex no-wrap inline q-fab__actions--${e.direction} q-fab__actions--${r.value===!0?"opened":"closed"}`),w=f(()=>{const A={id:l,role:"menu"};return r.value!==!0&&(A["aria-hidden"]="true"),A}),L=f(()=>`q-fab__icon-holder q-fab__icon-holder--${r.value===!0?"opened":"closed"}`);function $(A,S){const x=t[A],P=`q-fab__${A} absolute-full`;return x===void 0?d(Et,{class:P,name:e[S]||i.iconSet.fab[S]}):d("div",{class:P},x(y.value))}function F(){const A=[];return e.hideIcon!==!0&&A.push(d("div",{class:L.value},[$("icon","icon"),$("active-icon","activeIcon")])),e.label===""&&t.label===void 0||A[u.value.action](d("div",u.value.data,t.label!==void 0?t.label(y.value):[e.label])),hn(t.tooltip,A)}return Do(jp,{showing:r,onChildClick(A){m(A),n.value!==null&&n.value.$el.focus()}}),()=>d("div",{class:b.value},[d(Rt,{ref:n,class:c.value,...e,noWrap:!0,stack:e.stacked,align:void 0,icon:void 0,label:void 0,noCaps:!0,fab:!0,"aria-expanded":r.value===!0?"true":"false","aria-haspopup":"true","aria-controls":l,onClick:p},F),d("div",{class:g.value,...w.value},Ge(t.default))])}});const sm={start:"self-end",center:"self-center",end:"self-start"},j$=Object.keys(sm);var W$=we({name:"QFabAction",props:{...lm,icon:{type:String,default:""},anchor:{type:String,validator:e=>j$.includes(e)},to:[String,Object],replace:Boolean},emits:["click"],setup(e,{slots:t,emit:n}){const r=Fn(jp,()=>({showing:{value:!0},onChildClick:pn})),{formClass:l,labelProps:i}=im(e,r.showing),c=f(()=>{const y=sm[e.anchor];return l.value+(y!==void 0?` ${y}`:"")}),u=f(()=>e.disable===!0||r.showing.value!==!0);function v(y){r.onChildClick(y),n("click",y)}function m(){const y=[];return t.icon!==void 0?y.push(t.icon()):e.icon!==""&&y.push(d(Et,{name:e.icon})),e.label===""&&t.label===void 0||y[i.value.action](d("div",i.value.data,t.label!==void 0?t.label():[e.label])),hn(t.default,y)}const p=Ve();return Object.assign(p.proxy,{click:v}),()=>d(Rt,{class:c.value,...e,noWrap:!0,stack:e.stacked,icon:void 0,label:void 0,noCaps:!0,fabMini:!0,disable:u.value,onClick:v},m)}});function K$({validate:e,resetValidation:t,requiresQForm:n}){const r=Fn(Ar,!1);if(r!==!1){const{props:l,proxy:i}=Ve();Object.assign(i,{validate:e,resetValidation:t}),_e(()=>l.disable,c=>{c===!0?(typeof t=="function"&&t(),r.unbindComponent(i)):r.bindComponent(i)}),jt(()=>{l.disable!==!0&&r.bindComponent(i)}),qt(()=>{l.disable!==!0&&r.unbindComponent(i)})}else n===!0&&console.error("Parent QForm not found on useFormChild()!")}const Y$=[!0,!1,"ondemand"],G$={modelValue:{},error:{type:Boolean,default:null},errorMessage:String,noErrorIcon:Boolean,rules:Array,reactiveRules:Boolean,lazyRules:{type:[Boolean,String],default:!1,validator:e=>Y$.includes(e)}};function X$(e,t){const{props:n,proxy:r}=Ve(),l=X(!1),i=X(null),c=X(null);K$({validate:w,resetValidation:g});let u,v=0;const m=f(()=>n.rules!==void 0&&n.rules!==null&&n.rules.length!==0),p=f(()=>n.disable!==!0&&m.value===!0&&t.value===!1),y=f(()=>n.error===!0||l.value===!0),b=f(()=>typeof n.errorMessage=="string"&&n.errorMessage.length!==0?n.errorMessage:i.value);function g(){v++,t.value=!1,c.value=null,l.value=!1,i.value=null,L.cancel()}function w($=n.modelValue){if(n.disable===!0||m.value===!1)return!0;const F=++v,A=t.value!==!0?()=>{c.value=!0}:()=>{},S=(P,M)=>{P===!0&&A(),l.value=P,i.value=M||null,t.value=!1},x=[];for(let P=0;P{if(P===void 0||Array.isArray(P)===!1||P.length===0)return F===v&&S(!1),!0;const M=P.find(E=>E===!1||typeof E=="string");return F===v&&S(M!==void 0,M),M===void 0},P=>(F===v&&(console.error(P),S(!0)),!1)))}_e(()=>n.modelValue,()=>{c.value=!0,p.value===!0&&n.lazyRules===!1&&L()}),_e(()=>n.reactiveRules,$=>{$===!0?u===void 0&&(u=_e(()=>n.rules,()=>{p.value===!0&&c.value===!0&&n.lazyRules!=="ondemand"&&L()},{immediate:!0})):u!==void 0&&(u(),u=void 0)},{immediate:!0}),_e(()=>n.lazyRules,$=>{$===!1&&p.value===!0&&c.value===!0&&L()}),_e(e,$=>{$===!0?c.value===null&&(c.value=n.lazyRules===!0):p.value===!0&&(n.lazyRules===!1||n.lazyRules===!0&&c.value===!0)&&L()});const L=Qr(w,0);return qt(()=>{u!==void 0&&u(),L.cancel()}),Object.assign(r,{resetValidation:g,validate:w}),qn(r,"hasError",()=>y.value),{isDirtyModel:c,hasRules:m,hasError:y,errorMessage:b,validate:w,resetValidation:g}}function um(e,t){return e===void 0?t===!0?`f_${er()}`:void 0:e}function tr(e){return e!=null&&(""+e).length!==0}const Nl={...Ft,...G$,label:String,stackLabel:Boolean,hint:String,hideHint:Boolean,prefix:String,suffix:String,labelColor:String,color:String,bgColor:String,filled:Boolean,outlined:Boolean,borderless:Boolean,standout:[Boolean,String],square:Boolean,loading:Boolean,labelSlot:Boolean,bottomSlots:Boolean,hideBottomSpace:Boolean,rounded:Boolean,dense:Boolean,itemAligned:Boolean,counter:Boolean,clearable:Boolean,clearIcon:String,disable:Boolean,readonly:Boolean,autofocus:Boolean,for:String,maxlength:[Number,String]},Ps=["update:modelValue","clear","focus","blur","popupShow","popupHide"];function Bs({requiredForAttr:e=!0,tagProp:t}={}){const{props:n,attrs:r,proxy:l,vnode:i}=Ve(),c=Vt(n,l.$q);return{requiredForAttr:e,tag:t===!0?f(()=>n.tag):{value:"label"},isDark:c,editable:f(()=>n.disable!==!0&&n.readonly!==!0),innerLoading:X(!1),focused:X(!1),hasPopupOpen:!1,splitAttrs:am(r,i),targetUid:X(um(n.for,e)),rootRef:X(null),targetRef:X(null),controlRef:X(null)}}function Es(e){const{props:t,emit:n,slots:r,attrs:l,proxy:i}=Ve(),{$q:c}=i;let u=null;e.hasValue===void 0&&(e.hasValue=f(()=>tr(t.modelValue))),e.emitValue===void 0&&(e.emitValue=R=>{n("update:modelValue",R)}),e.controlEvents===void 0&&(e.controlEvents={onFocusin:z,onFocusout:I}),Object.assign(e,{clearValue:N,onControlFocusin:z,onControlFocusout:I,focus:E}),e.computedCounter===void 0&&(e.computedCounter=f(()=>{if(t.counter!==!1){const R=typeof t.modelValue=="string"||typeof t.modelValue=="number"?(""+t.modelValue).length:Array.isArray(t.modelValue)===!0?t.modelValue.length:0,oe=t.maxlength!==void 0?t.maxlength:t.maxValues;return R+(oe!==void 0?" / "+oe:"")}}));const{isDirtyModel:v,hasRules:m,hasError:p,errorMessage:y,resetValidation:b}=X$(e.focused,e.innerLoading),g=e.floatingLabel!==void 0?f(()=>t.stackLabel===!0||e.focused.value===!0||e.floatingLabel.value===!0):f(()=>t.stackLabel===!0||e.focused.value===!0||e.hasValue.value===!0),w=f(()=>t.bottomSlots===!0||t.hint!==void 0||m.value===!0||t.counter===!0||t.error!==null),L=f(()=>t.filled===!0?"filled":t.outlined===!0?"outlined":t.borderless===!0?"borderless":t.standout?"standout":"standard"),$=f(()=>`q-field row no-wrap items-start q-field--${L.value}`+(e.fieldClass!==void 0?` ${e.fieldClass.value}`:"")+(t.rounded===!0?" q-field--rounded":"")+(t.square===!0?" q-field--square":"")+(g.value===!0?" q-field--float":"")+(A.value===!0?" q-field--labeled":"")+(t.dense===!0?" q-field--dense":"")+(t.itemAligned===!0?" q-field--item-aligned q-item-type":"")+(e.isDark.value===!0?" q-field--dark":"")+(e.getControl===void 0?" q-field--auto-height":"")+(e.focused.value===!0?" q-field--focused":"")+(p.value===!0?" q-field--error":"")+(p.value===!0||e.focused.value===!0?" q-field--highlighted":"")+(t.hideBottomSpace!==!0&&w.value===!0?" q-field--with-bottom":"")+(t.disable===!0?" q-field--disabled":t.readonly===!0?" q-field--readonly":"")),F=f(()=>"q-field__control relative-position row no-wrap"+(t.bgColor!==void 0?` bg-${t.bgColor}`:"")+(p.value===!0?" text-negative":typeof t.standout=="string"&&t.standout.length!==0&&e.focused.value===!0?` ${t.standout}`:t.color!==void 0?` text-${t.color}`:"")),A=f(()=>t.labelSlot===!0||t.label!==void 0),S=f(()=>"q-field__label no-pointer-events absolute ellipsis"+(t.labelColor!==void 0&&p.value!==!0?` text-${t.labelColor}`:"")),x=f(()=>({id:e.targetUid.value,editable:e.editable.value,focused:e.focused.value,floatingLabel:g.value,modelValue:t.modelValue,emitValue:e.emitValue})),P=f(()=>{const R={for:e.targetUid.value};return t.disable===!0&&(R["aria-disabled"]="true"),R});function M(){const R=document.activeElement;let oe=e.targetRef!==void 0&&e.targetRef.value;!oe||R!==null&&R.id===e.targetUid.value||(oe.hasAttribute("tabindex")===!0||(oe=oe.querySelector("[tabindex]")),oe&&oe!==R&&oe.focus({preventScroll:!0}))}function E(){Yr(M)}function D(){qq(M);const R=document.activeElement;R!==null&&e.rootRef.value.contains(R)&&R.blur()}function z(R){u!==null&&(clearTimeout(u),u=null),e.editable.value===!0&&e.focused.value===!1&&(e.focused.value=!0,n("focus",R))}function I(R,oe){u!==null&&clearTimeout(u),u=setTimeout(()=>{u=null,(document.hasFocus()!==!0||e.hasPopupOpen!==!0&&e.controlRef!==void 0&&e.controlRef.value!==null&&e.controlRef.value.contains(document.activeElement)===!1)&&(e.focused.value===!0&&(e.focused.value=!1,n("blur",R)),oe!==void 0&&oe())})}function N(R){bt(R),c.platform.is.mobile!==!0?(e.targetRef!==void 0&&e.targetRef.value||e.rootRef.value).focus():e.rootRef.value.contains(document.activeElement)===!0&&document.activeElement.blur(),t.type==="file"&&(e.inputRef.value.value=null),n("update:modelValue",null),n("clear",t.modelValue),Tt(()=>{b(),c.platform.is.mobile!==!0&&(v.value=!1)})}function H(){const R=[];return r.prepend!==void 0&&R.push(d("div",{class:"q-field__prepend q-field__marginal row no-wrap items-center",key:"prepend",onClick:$n},r.prepend())),R.push(d("div",{class:"q-field__control-container col relative-position row no-wrap q-anchor--skip"},T())),p.value===!0&&t.noErrorIcon===!1&&R.push(J("error",[d(Et,{name:c.iconSet.field.error,color:"negative"})])),t.loading===!0||e.innerLoading.value===!0?R.push(J("inner-loading-append",r.loading!==void 0?r.loading():[d(So,{color:t.color})])):t.clearable===!0&&e.hasValue.value===!0&&e.editable.value===!0&&R.push(J("inner-clearable-append",[d(Et,{class:"q-field__focusable-action",tag:"button",name:t.clearIcon||c.iconSet.field.clear,tabindex:0,type:"button","aria-hidden":null,role:null,onClick:N})])),r.append!==void 0&&R.push(d("div",{class:"q-field__append q-field__marginal row no-wrap items-center",key:"append",onClick:$n},r.append())),e.getInnerAppend!==void 0&&R.push(J("inner-append",e.getInnerAppend())),e.getControlChild!==void 0&&R.push(e.getControlChild()),R}function T(){const R=[];return t.prefix!==void 0&&t.prefix!==null&&R.push(d("div",{class:"q-field__prefix no-pointer-events row items-center"},t.prefix)),e.getShadowControl!==void 0&&e.hasShadow.value===!0&&R.push(e.getShadowControl()),e.getControl!==void 0?R.push(e.getControl()):r.rawControl!==void 0?R.push(r.rawControl()):r.control!==void 0&&R.push(d("div",{ref:e.targetRef,class:"q-field__native row",tabindex:-1,...e.splitAttrs.attributes.value,"data-autofocus":t.autofocus===!0||void 0},r.control(x.value))),A.value===!0&&R.push(d("div",{class:S.value},Ge(r.label,t.label))),t.suffix!==void 0&&t.suffix!==null&&R.push(d("div",{class:"q-field__suffix no-pointer-events row items-center"},t.suffix)),R.concat(Ge(r.default))}function O(){let R,oe;p.value===!0?y.value!==null?(R=[d("div",{role:"alert"},y.value)],oe=`q--slot-error-${y.value}`):(R=Ge(r.error),oe="q--slot-error"):t.hideHint===!0&&e.focused.value!==!0||(t.hint!==void 0?(R=[d("div",t.hint)],oe=`q--slot-hint-${t.hint}`):(R=Ge(r.hint),oe="q--slot-hint"));const le=t.counter===!0||r.counter!==void 0;if(t.hideBottomSpace===!0&&le===!1&&R===void 0)return;const Se=d("div",{key:oe,class:"q-field__messages col"},R);return d("div",{class:"q-field__bottom row items-start q-field__bottom--"+(t.hideBottomSpace!==!0?"animated":"stale"),onClick:$n},[t.hideBottomSpace===!0?Se:d(yn,{name:"q-transition--field-message"},()=>Se),le===!0?d("div",{class:"q-field__counter"},r.counter!==void 0?r.counter():e.computedCounter.value):null])}function J(R,oe){return oe===null?null:d("div",{key:R,class:"q-field__append q-field__marginal row no-wrap items-center q-anchor--skip"},oe)}_e(()=>t.for,R=>{e.targetUid.value=um(R,e.requiredForAttr)});let se=!1;return ia(()=>{se=!0}),nr(()=>{se===!0&&t.autofocus===!0&&i.focus()}),jt(()=>{so.value===!0&&e.requiredForAttr===!0&&t.for===void 0&&(e.targetUid.value=`f_${er()}`),t.autofocus===!0&&i.focus()}),qt(()=>{u!==null&&clearTimeout(u)}),Object.assign(i,{focus:E,blur:D}),function(){const R=e.getControl===void 0&&r.control===void 0?{...e.splitAttrs.attributes.value,"data-autofocus":t.autofocus===!0||void 0,...P.value}:P.value;return d(e.tag.value,{ref:e.rootRef,class:[$.value,l.class],style:l.style,...R},[r.before!==void 0?d("div",{class:"q-field__before q-field__marginal row no-wrap items-center",onClick:$n},r.before()):null,d("div",{class:"q-field__inner relative-position col self-stretch"},[d("div",{ref:e.controlRef,class:F.value,tabindex:-1,...e.controlEvents},H()),w.value===!0?O():null]),r.after!==void 0?d("div",{class:"q-field__after q-field__marginal row no-wrap items-center",onClick:$n},r.after()):null])}}var cm=we({name:"QField",inheritAttrs:!1,props:{...Nl,tag:{type:String,default:"label"}},emits:Ps,setup(){return Es(Bs({requiredForAttr:!1,tagProp:!0}))}});function kr(e,t,n,r){const l=[];return e.forEach(i=>{r(i)===!0?l.push(i):t.push({failedPropValidation:n,file:i})}),l}function zi(e){e&&e.dataTransfer&&(e.dataTransfer.dropEffect="copy"),bt(e)}const dm={multiple:Boolean,accept:String,capture:String,maxFileSize:[Number,String],maxTotalSize:[Number,String],maxFiles:[Number,String],filter:Function},vm=["rejected"];function fm({editable:e,dnd:t,getFileInput:n,addFilesToQueue:r}){const{props:l,emit:i,proxy:c}=Ve(),u=X(null),v=f(()=>l.accept!==void 0?l.accept.split(",").map(A=>(A=A.trim(),A==="*"?"*/":(A.endsWith("/*")&&(A=A.slice(0,A.length-1)),A.toUpperCase()))):null),m=f(()=>parseInt(l.maxFiles,10)),p=f(()=>parseInt(l.maxTotalSize,10));function y(A){if(e.value)if(A!==Object(A)&&(A={target:null}),A.target!==null&&A.target.matches('input[type="file"]')===!0)A.clientX===0&&A.clientY===0&&dn(A);else{const S=n();S&&S!==A.target&&S.click(A)}}function b(A){e.value&&A&&r(null,A)}function g(A,S,x,P){let M=Array.from(S||A.target.files);const E=[],D=()=>{E.length!==0&&i("rejected",E)};if(l.accept!==void 0&&v.value.indexOf("*/")===-1&&(M=kr(M,E,"accept",z=>v.value.some(I=>z.type.toUpperCase().startsWith(I)||z.name.toUpperCase().endsWith(I))),M.length===0))return D();if(l.maxFileSize!==void 0){const z=parseInt(l.maxFileSize,10);if(M=kr(M,E,"max-file-size",I=>I.size<=z),M.length===0)return D()}if(l.multiple!==!0&&M.length!==0&&(M=[M[0]]),M.forEach(z=>{z.__key=z.webkitRelativePath+z.lastModified+z.name+z.size}),P===!0){const z=x.map(I=>I.__key);M=kr(M,E,"duplicate",I=>z.includes(I.__key)===!1)}if(M.length===0)return D();if(l.maxTotalSize!==void 0){let z=P===!0?x.reduce((I,N)=>I+N.size,0):0;if(M=kr(M,E,"max-total-size",I=>(z+=I.size,z<=p.value)),M.length===0)return D()}if(typeof l.filter=="function"){const z=l.filter(M);M=kr(M,E,"filter",I=>z.includes(I))}if(l.maxFiles!==void 0){let z=P===!0?x.length:0;if(M=kr(M,E,"max-files",()=>(z++,z<=m.value)),M.length===0)return D()}return D(),M.length!==0?M:void 0}function w(A){zi(A),t.value!==!0&&(t.value=!0)}function L(A){bt(A),(A.relatedTarget!==null||ut.is.safari!==!0?A.relatedTarget!==u.value:document.elementsFromPoint(A.clientX,A.clientY).includes(u.value)===!1)===!0&&(t.value=!1)}function $(A){zi(A);const S=A.dataTransfer.files;S.length!==0&&r(null,S),t.value=!1}function F(A){if(t.value===!0)return d("div",{ref:u,class:`q-${A}__dnd absolute-full`,onDragenter:zi,onDragover:zi,onDragleave:L,onDrop:$})}return Object.assign(c,{pickFiles:y,addFiles:b}),{pickFiles:y,addFiles:b,onDragover:w,onDragleave:L,processFiles:g,getDndNode:F,maxFilesNumber:m,maxTotalSizeNumber:p}}function pm(e,t){function n(){const r=e.modelValue;try{const l="DataTransfer"in window?new DataTransfer:"ClipboardEvent"in window?new ClipboardEvent("").clipboardData:void 0;return Object(r)===r&&("length"in r?Array.from(r):[r]).forEach(i=>{l.items.add(i)}),{files:l.files}}catch{return{files:void 0}}}return f(t===!0?()=>{if(e.type==="file")return n()}:n)}var Z$=we({name:"QFile",inheritAttrs:!1,props:{...Nl,...ko,...dm,modelValue:[File,FileList,Array],append:Boolean,useChips:Boolean,displayValue:[String,Number],tabindex:{type:[String,Number],default:0},counterLabel:Function,inputClass:[Array,String,Object],inputStyle:[Array,String,Object]},emits:[...Ps,...vm],setup(e,{slots:t,emit:n,attrs:r}){const{proxy:l}=Ve(),i=Bs(),c=X(null),u=X(!1),v=nd(e),{pickFiles:m,onDragover:p,onDragleave:y,processFiles:b,getDndNode:g}=fm({editable:i.editable,dnd:u,getFileInput:H,addFilesToQueue:T}),w=pm(e),L=f(()=>Object(e.modelValue)===e.modelValue?"length"in e.modelValue?Array.from(e.modelValue):[e.modelValue]:[]),$=f(()=>tr(L.value)),F=f(()=>L.value.map(R=>R.name).join(", ")),A=f(()=>xc(L.value.reduce((R,oe)=>R+oe.size,0))),S=f(()=>({totalSize:A.value,filesNumber:L.value.length,maxFiles:e.maxFiles})),x=f(()=>({tabindex:-1,type:"file",title:"",accept:e.accept,capture:e.capture,name:v.value,...r,id:i.targetUid.value,disabled:i.editable.value!==!0})),P=f(()=>"q-file q-field--auto-height"+(u.value===!0?" q-file--dnd":"")),M=f(()=>e.multiple===!0&&e.append===!0);function E(R){const oe=L.value.slice();oe.splice(R,1),z(oe)}function D(R){const oe=L.value.indexOf(R);oe>-1&&E(oe)}function z(R){n("update:modelValue",e.multiple===!0?R:R[0])}function I(R){R.keyCode===13&&$n(R)}function N(R){R.keyCode!==13&&R.keyCode!==32||m(R)}function H(){return c.value}function T(R,oe){const le=b(R,oe,L.value,M.value),Se=H();Se!=null&&(Se.value=""),le!==void 0&&((e.multiple===!0?e.modelValue&&le.every(k=>L.value.includes(k)):e.modelValue===le[0])||z(M.value===!0?L.value.concat(le):le))}function O(){return[d("input",{class:[e.inputClass,"q-file__filler"],style:e.inputStyle})]}function J(){if(t.file!==void 0)return L.value.length===0?O():L.value.map((oe,le)=>t.file({index:le,file:oe,ref:this}));if(t.selected!==void 0)return L.value.length===0?O():t.selected({files:L.value,ref:this});if(e.useChips===!0)return L.value.length===0?O():L.value.map((oe,le)=>d(vd,{key:"file-"+le,removable:i.editable.value,dense:!0,textColor:e.color,tabindex:e.tabindex,onRemove:()=>{E(le)}},()=>d("span",{class:"ellipsis",textContent:oe.name})));const R=e.displayValue!==void 0?e.displayValue:F.value;return R.length!==0?[d("div",{class:e.inputClass,style:e.inputStyle,textContent:R})]:O()}function se(){const R={ref:c,...x.value,...w.value,class:"q-field__input fit absolute-full cursor-pointer",onChange:T};return e.multiple===!0&&(R.multiple=!0),d("input",R)}return Object.assign(i,{fieldClass:P,emitValue:z,hasValue:$,inputRef:c,innerValue:L,floatingLabel:f(()=>$.value===!0||tr(e.displayValue)),computedCounter:f(()=>{if(e.counterLabel!==void 0)return e.counterLabel(S.value);const R=e.maxFiles;return`${L.value.length}${R!==void 0?" / "+R:""} (${A.value})`}),getControlChild:()=>g("file"),getControl:()=>{const R={ref:i.targetRef,class:"q-field__native row items-center cursor-pointer",tabindex:e.tabindex};return i.editable.value===!0&&Object.assign(R,{onDragover:p,onDragleave:y,onKeydown:I,onKeyup:N}),d("div",R,[se()].concat(J()))}}),Object.assign(l,{removeAtIndex:E,removeFile:D,getNativeElement:()=>c.value}),qn(l,"nativeEl",()=>c.value),Es(i)}}),J$=we({name:"QFooter",props:{modelValue:{type:Boolean,default:!0},reveal:Boolean,bordered:Boolean,elevated:Boolean,heightHint:{type:[String,Number],default:50}},emits:["reveal","focusin"],setup(e,{slots:t,emit:n}){const{proxy:{$q:r}}=Ve(),l=Fn(ar,Nt);if(l===Nt)return console.error("QFooter needs to be child of QLayout"),Nt;const i=X(parseInt(e.heightHint,10)),c=X(!0),u=X(so.value===!0||l.isContainer.value===!0?0:window.innerHeight),v=f(()=>e.reveal===!0||l.view.value.indexOf("F")>-1||r.platform.is.ios&&l.isContainer.value===!0),m=f(()=>l.isContainer.value===!0?l.containerHeight.value:u.value),p=f(()=>{if(e.modelValue!==!0)return 0;if(v.value===!0)return c.value===!0?i.value:0;const P=l.scroll.value.position+m.value+i.value-l.height.value;return P>0?P:0}),y=f(()=>e.modelValue!==!0||v.value===!0&&c.value!==!0),b=f(()=>e.modelValue===!0&&y.value===!0&&e.reveal===!0),g=f(()=>"q-footer q-layout__section--marginal "+(v.value===!0?"fixed":"absolute")+"-bottom"+(e.bordered===!0?" q-footer--bordered":"")+(y.value===!0?" q-footer--hidden":"")+(e.modelValue!==!0?" q-layout--prevent-focus"+(v.value!==!0?" hidden":""):"")),w=f(()=>{const P=l.rows.value.bottom,M={};return P[0]==="l"&&l.left.space===!0&&(M[r.lang.rtl===!0?"right":"left"]=`${l.left.size}px`),P[2]==="r"&&l.right.space===!0&&(M[r.lang.rtl===!0?"left":"right"]=`${l.right.size}px`),M});function L(P,M){l.update("footer",P,M)}function $(P,M){P.value!==M&&(P.value=M)}function F({height:P}){$(i,P),L("size",P)}function A(){if(e.reveal!==!0)return;const{direction:P,position:M,inflectionPoint:E}=l.scroll.value;$(c,P==="up"||M-E<100||l.height.value-m.value-M-i.value<300)}function S(P){b.value===!0&&$(c,!0),n("focusin",P)}_e(()=>e.modelValue,P=>{L("space",P),$(c,!0),l.animate()}),_e(p,P=>{L("offset",P)}),_e(()=>e.reveal,P=>{P===!1&&$(c,e.modelValue)}),_e(c,P=>{l.animate(),n("reveal",P)}),_e([i,l.scroll,l.height],A),_e(()=>r.screen.height,P=>{l.isContainer.value!==!0&&$(u,P)});const x={};return l.instances.footer=x,e.modelValue===!0&&L("size",i.value),L("space",e.modelValue),L("offset",p.value),qt(()=>{l.instances.footer===x&&(l.instances.footer=void 0,L("size",0),L("offset",0),L("space",!1))}),()=>{const P=hn(t.default,[d(qa,{debounce:0,onResize:F})]);return e.elevated===!0&&P.push(d("div",{class:"q-layout__shadow absolute-full overflow-hidden no-pointer-events"})),d("footer",{class:g.value,style:w.value,onFocusin:S},P)}}}),e6=we({name:"QForm",props:{autofocus:Boolean,noErrorFocus:Boolean,noResetFocus:Boolean,greedy:Boolean,onSubmit:Function},emits:["reset","validationSuccess","validationError"],setup(e,{slots:t,emit:n}){const r=Ve(),l=X(null);let i=0;const c=[];function u(g){const w=typeof g=="boolean"?g:e.noErrorFocus!==!0,L=++i,$=(S,x)=>{n("validation"+(S===!0?"Success":"Error"),x)},F=S=>{const x=S.validate();return typeof x.then=="function"?x.then(P=>({valid:P,comp:S}),P=>({valid:!1,comp:S,err:P})):Promise.resolve({valid:x,comp:S})};return(e.greedy===!0?Promise.all(c.map(F)).then(S=>S.filter(x=>x.valid!==!0)):c.reduce((S,x)=>S.then(()=>F(x).then(P=>{if(P.valid===!1)return Promise.reject(P)})),Promise.resolve()).catch(S=>[S])).then(S=>{if(S===void 0||S.length===0)return L===i&&$(!0),!0;if(L===i){const{comp:x,err:P}=S[0];if(P!==void 0&&console.error(P),$(!1,x),w===!0){const M=S.find(({comp:E})=>typeof E.focus=="function"&&Bl(E.$)===!1);M!==void 0&&M.comp.focus()}}return!1})}function v(){i++,c.forEach(g=>{typeof g.resetValidation=="function"&&g.resetValidation()})}function m(g){g!==void 0&&bt(g);const w=i+1;u().then(L=>{w===i&&L===!0&&(e.onSubmit!==void 0?n("submit",g):g!==void 0&&g.target!==void 0&&typeof g.target.submit=="function"&&g.target.submit())})}function p(g){g!==void 0&&bt(g),n("reset"),Tt(()=>{v(),e.autofocus===!0&&e.noResetFocus!==!0&&y()})}function y(){Yr(()=>{if(l.value===null)return;const g=l.value.querySelector("[autofocus][tabindex], [data-autofocus][tabindex]")||l.value.querySelector("[autofocus] [tabindex], [data-autofocus] [tabindex]")||l.value.querySelector("[autofocus], [data-autofocus]")||Array.prototype.find.call(l.value.querySelectorAll("[tabindex]"),w=>w.tabIndex>-1);g!=null&&g.focus({preventScroll:!0})})}Do(Ar,{bindComponent(g){c.push(g)},unbindComponent(g){const w=c.indexOf(g);w>-1&&c.splice(w,1)}});let b=!1;return ia(()=>{b=!0}),nr(()=>{b===!0&&e.autofocus===!0&&y()}),jt(()=>{e.autofocus===!0&&y()}),Object.assign(r.proxy,{validate:u,resetValidation:v,submit:m,reset:p,focus:y,getValidationComponents:()=>c}),()=>d("form",{class:"q-form",ref:l,onSubmit:m,onReset:p},Ge(t.default))}}),t6={inject:{[Ar]:{default:pn}},watch:{disable(e){const t=this.$.provides[Ar];t!==void 0&&(e===!0?(this.resetValidation(),t.unbindComponent(this)):t.bindComponent(this))}},methods:{validate(){},resetValidation(){}},mounted(){const e=this.$.provides[Ar];e!==void 0&&this.disable!==!0&&e.bindComponent(this)},beforeUnmount(){const e=this.$.provides[Ar];e!==void 0&&this.disable!==!0&&e.unbindComponent(this)}},n6=we({name:"QHeader",props:{modelValue:{type:Boolean,default:!0},reveal:Boolean,revealOffset:{type:Number,default:250},bordered:Boolean,elevated:Boolean,heightHint:{type:[String,Number],default:50}},emits:["reveal","focusin"],setup(e,{slots:t,emit:n}){const{proxy:{$q:r}}=Ve(),l=Fn(ar,Nt);if(l===Nt)return console.error("QHeader needs to be child of QLayout"),Nt;const i=X(parseInt(e.heightHint,10)),c=X(!0),u=f(()=>e.reveal===!0||l.view.value.indexOf("H")>-1||r.platform.is.ios&&l.isContainer.value===!0),v=f(()=>{if(e.modelValue!==!0)return 0;if(u.value===!0)return c.value===!0?i.value:0;const A=i.value-l.scroll.value.position;return A>0?A:0}),m=f(()=>e.modelValue!==!0||u.value===!0&&c.value!==!0),p=f(()=>e.modelValue===!0&&m.value===!0&&e.reveal===!0),y=f(()=>"q-header q-layout__section--marginal "+(u.value===!0?"fixed":"absolute")+"-top"+(e.bordered===!0?" q-header--bordered":"")+(m.value===!0?" q-header--hidden":"")+(e.modelValue!==!0?" q-layout--prevent-focus":"")),b=f(()=>{const A=l.rows.value.top,S={};return A[0]==="l"&&l.left.space===!0&&(S[r.lang.rtl===!0?"right":"left"]=`${l.left.size}px`),A[2]==="r"&&l.right.space===!0&&(S[r.lang.rtl===!0?"left":"right"]=`${l.right.size}px`),S});function g(A,S){l.update("header",A,S)}function w(A,S){A.value!==S&&(A.value=S)}function L({height:A}){w(i,A),g("size",A)}function $(A){p.value===!0&&w(c,!0),n("focusin",A)}_e(()=>e.modelValue,A=>{g("space",A),w(c,!0),l.animate()}),_e(v,A=>{g("offset",A)}),_e(()=>e.reveal,A=>{A===!1&&w(c,e.modelValue)}),_e(c,A=>{l.animate(),n("reveal",A)}),_e(l.scroll,A=>{e.reveal===!0&&w(c,A.direction==="up"||A.position<=e.revealOffset||A.position-A.inflectionPoint<100)});const F={};return l.instances.header=F,e.modelValue===!0&&g("size",i.value),g("space",e.modelValue),g("offset",v.value),qt(()=>{l.instances.header===F&&(l.instances.header=void 0,g("size",0),g("offset",0),g("space",!1))}),()=>{const A=Pl(t.default,[]);return e.elevated===!0&&A.push(d("div",{class:"q-layout__shadow absolute-full overflow-hidden no-pointer-events"})),A.push(d(qa,{debounce:0,onResize:L})),d("header",{class:y.value,style:b.value,onFocusin:$},A)}}});const bd={ratio:[String,Number]};function yd(e,t){return f(()=>{const n=Number(e.ratio||(t!==void 0?t.value:void 0));return isNaN(n)!==!0&&n>0?{paddingBottom:`${100/n}%`}:null})}const o6=16/9;var a6=we({name:"QImg",props:{...bd,src:String,srcset:String,sizes:String,alt:String,crossorigin:String,decoding:String,referrerpolicy:String,draggable:Boolean,loading:{type:String,default:"lazy"},fetchpriority:{type:String,default:"auto"},width:String,height:String,initialRatio:{type:[Number,String],default:o6},placeholderSrc:String,fit:{type:String,default:"cover"},position:{type:String,default:"50% 50%"},imgClass:String,imgStyle:Object,noSpinner:Boolean,noNativeMenu:Boolean,noTransition:Boolean,spinnerColor:String,spinnerSize:String},emits:["load","error"],setup(e,{slots:t,emit:n}){const r=X(e.initialRatio),l=yd(e,r);let i=null,c=!1;const u=[X(null),X($())],v=X(0),m=X(!1),p=X(!1),y=f(()=>`q-img q-img--${e.noNativeMenu===!0?"no-":""}menu`),b=f(()=>({width:e.width,height:e.height})),g=f(()=>`q-img__image ${e.imgClass!==void 0?e.imgClass+" ":""}q-img__image--with${e.noTransition===!0?"out":""}-transition`),w=f(()=>({...e.imgStyle,objectFit:e.fit,objectPosition:e.position}));function L(){return e.src||e.srcset||e.sizes?{src:e.src,srcset:e.srcset,sizes:e.sizes}:null}function $(){return e.placeholderSrc!==void 0?{src:e.placeholderSrc}:null}function F(D){i!==null&&(clearTimeout(i),i=null),p.value=!1,D===null?(m.value=!1,u[1^v.value].value=$()):m.value=!0,u[v.value].value=D}function A({target:D}){c!==!0&&(i!==null&&(clearTimeout(i),i=null),r.value=D.naturalHeight===0?.5:D.naturalWidth/D.naturalHeight,S(D,1))}function S(D,z){c!==!0&&z!==1e3&&(D.complete===!0?x(D):i=setTimeout(()=>{i=null,S(D,z+1)},50))}function x(D){c!==!0&&(v.value=1^v.value,u[v.value].value=null,m.value=!1,p.value=!1,n("load",D.currentSrc||D.src))}function P(D){i!==null&&(clearTimeout(i),i=null),m.value=!1,p.value=!0,u[v.value].value=null,u[1^v.value].value=$(),n("error",D)}function M(D){const z=u[D].value,I={key:"img_"+D,class:g.value,style:w.value,crossorigin:e.crossorigin,decoding:e.decoding,referrerpolicy:e.referrerpolicy,height:e.height,width:e.width,loading:e.loading,fetchpriority:e.fetchpriority,"aria-hidden":"true",draggable:e.draggable,...z};return v.value===D?(I.class+=" q-img__image--waiting",Object.assign(I,{onLoad:A,onError:P})):I.class+=" q-img__image--loaded",d("div",{class:"q-img__container absolute-full",key:"img"+D},d("img",I))}function E(){return m.value!==!0?d("div",{key:"content",class:"q-img__content absolute-full q-anchor--skip"},Ge(t[p.value===!0?"error":"default"])):d("div",{key:"loading",class:"q-img__loading absolute-full flex flex-center"},t.loading!==void 0?t.loading():e.noSpinner===!0?void 0:[d(So,{color:e.spinnerColor,size:e.spinnerSize})])}return _e(()=>L(),F),F(L()),qt(()=>{c=!0,i!==null&&(clearTimeout(i),i=null)}),()=>{const D=[];return l.value!==null&&D.push(d("div",{key:"filler",style:l.value})),p.value!==!0&&(u[0].value!==null&&D.push(M(0)),u[1].value!==null&&D.push(M(1))),D.push(d(yn,{name:"q-transition--fade"},E)),d("div",{class:y.value,style:b.value,role:"img","aria-label":e.alt},D)}}});const{passive:Da}=Zt;var r6=we({name:"QInfiniteScroll",props:{offset:{type:Number,default:500},debounce:{type:[String,Number],default:100},scrollTarget:{default:void 0},initialIndex:Number,disable:Boolean,reverse:Boolean},emits:["load"],setup(e,{slots:t,emit:n}){const r=X(!1),l=X(!0),i=X(null),c=X(null);let u,v,m=e.initialIndex||0;const p=f(()=>"q-infinite-scroll__loading"+(r.value===!0?"":" invisible"));function y(){if(e.disable===!0||r.value===!0||l.value===!1)return;const E=Pi(u),D=Ca(u),z=zr(u);e.reverse===!1?Math.round(D+z+e.offset)>=Math.round(E)&&b():Math.round(D)<=e.offset&&b()}function b(){if(e.disable===!0||r.value===!0||l.value===!1)return;m++,r.value=!0;const E=Pi(u);n("load",m,D=>{l.value===!0&&(r.value=!1,Tt(()=>{if(e.reverse===!0){const z=Pi(u),I=Ca(u),N=z-E;Ir(u,I+N)}D===!0?L():i.value&&i.value.closest("body")&&v()}))})}function g(){m=0}function w(){l.value===!1&&(l.value=!0,u.addEventListener("scroll",v,Da)),y()}function L(){l.value===!0&&(l.value=!1,r.value=!1,u.removeEventListener("scroll",v,Da),v!==void 0&&v.cancel!==void 0&&v.cancel())}function $(){if(u&&l.value===!0&&u.removeEventListener("scroll",v,Da),u=Qo(i.value,e.scrollTarget),l.value===!0){if(u.addEventListener("scroll",v,Da),e.reverse===!0){const E=Pi(u),D=zr(u);Ir(u,E-D)}y()}}function F(E){m=E}function A(E){E=parseInt(E,10);const D=v;v=E<=0?y:Qr(y,isNaN(E)===!0?100:E),u&&l.value===!0&&(D!==void 0&&u.removeEventListener("scroll",D,Da),u.addEventListener("scroll",v,Da))}function S(E){if(x.value===!0){if(c.value===null)return void(E!==!0&&Tt(()=>{S(!0)}));const D=`${r.value===!0?"un":""}pauseAnimations`;Array.from(c.value.getElementsByTagName("svg")).forEach(z=>{z[D]()})}}const x=f(()=>e.disable!==!0&&l.value===!0);_e([r,x],()=>{S()}),_e(()=>e.disable,E=>{E===!0?L():w()}),_e(()=>e.reverse,()=>{r.value===!1&&l.value===!0&&y()}),_e(()=>e.scrollTarget,$),_e(()=>e.debounce,A);let P=!1;nr(()=>{P!==!1&&u&&Ir(u,P)}),ia(()=>{P=!!u&&Ca(u)}),qt(()=>{l.value===!0&&u.removeEventListener("scroll",v,Da)}),jt(()=>{A(e.debounce),$(),r.value===!1&&S()});const M=Ve();return Object.assign(M.proxy,{poll:()=>{v!==void 0&&v()},trigger:b,stop:L,reset:g,resume:w,setIndex:F}),()=>{const E=Pl(t.default,[]);return x.value===!0&&E[e.reverse===!1?"push":"unshift"](d("div",{ref:c,class:p.value},Ge(t.loading))),d("div",{class:"q-infinite-scroll",ref:i},E)}}}),l6=we({name:"QInnerLoading",props:{...Ft,...Fl,showing:Boolean,color:String,size:{type:[String,Number],default:42},label:String,labelClass:String,labelStyle:[String,Array,Object]},setup(e,{slots:t}){const n=Ve(),r=Vt(e,n.proxy.$q),{transitionProps:l,transitionStyle:i}=Ms(e),c=f(()=>"q-inner-loading absolute-full column flex-center"+(r.value===!0?" q-inner-loading--dark":"")),u=f(()=>"q-inner-loading__label"+(e.labelClass!==void 0?` ${e.labelClass}`:""));function v(){const p=[d(So,{size:e.size,color:e.color})];return e.label!==void 0&&p.push(d("div",{class:u.value,style:e.labelStyle},[e.label])),p}function m(){return e.showing===!0?d("div",{class:c.value,style:i.value},t.default!==void 0?t.default():v()):null}return()=>d(yn,l.value,m)}});const If={date:"####/##/##",datetime:"####/##/## ##:##",time:"##:##",fulltime:"##:##:##",phone:"(###) ### - ####",card:"#### #### #### ####"},gs={"#":{pattern:"[\\d]",negate:"[^\\d]"},S:{pattern:"[a-zA-Z]",negate:"[^a-zA-Z]"},N:{pattern:"[0-9a-zA-Z]",negate:"[^0-9a-zA-Z]"},A:{pattern:"[a-zA-Z]",negate:"[^a-zA-Z]",transform:e=>e.toLocaleUpperCase()},a:{pattern:"[a-zA-Z]",negate:"[^a-zA-Z]",transform:e=>e.toLocaleLowerCase()},X:{pattern:"[0-9a-zA-Z]",negate:"[^0-9a-zA-Z]",transform:e=>e.toLocaleUpperCase()},x:{pattern:"[0-9a-zA-Z]",negate:"[^0-9a-zA-Z]",transform:e=>e.toLocaleLowerCase()}},hm=Object.keys(gs);hm.forEach(e=>{gs[e].regex=new RegExp(gs[e].pattern)});const i6=new RegExp("\\\\([^.*+?^${}()|([\\]])|([.*+?^${}()|[\\]])|(["+hm.join("")+"])|(.)","g"),Of=/[.*+?^${}()|[\]\\]/g,Sn="",s6={mask:String,reverseFillMask:Boolean,fillMask:[Boolean,String],unmaskedValue:Boolean};function u6(e,t,n,r){let l,i,c,u,v,m;const p=X(null),y=X(g());function b(){return e.autogrow===!0||["textarea","text","search","url","tel","password"].includes(e.type)}function g(){if(L(),p.value===!0){const z=P(E(e.modelValue));return e.fillMask!==!1?D(z):z}return e.modelValue}function w(z){if(z-1){for(let T=z-N.length;T>0;T--)I+=Sn;N=N.slice(0,H)+I+N.slice(H)}return N}function L(){if(p.value=e.mask!==void 0&&e.mask.length!==0&&b(),p.value===!1)return u=void 0,l="",void(i="");const z=If[e.mask]===void 0?e.mask:If[e.mask],I=typeof e.fillMask=="string"&&e.fillMask.length!==0?e.fillMask.slice(0,1):"_",N=I.replace(Of,"\\$&"),H=[],T=[],O=[];let J=e.reverseFillMask===!0,se="",R="";z.replace(i6,(k,_,j,U,K)=>{if(U!==void 0){const G=gs[U];O.push(G),R=G.negate,J===!0&&(T.push("(?:"+R+"+)?("+G.pattern+"+)?(?:"+R+"+)?("+G.pattern+"+)?"),J=!1),T.push("(?:"+R+"+)?("+G.pattern+")?")}else if(j!==void 0)se="\\"+(j==="\\"?"":j),O.push(j),H.push("([^"+se+"]+)?"+se+"?");else{const G=_!==void 0?_:K;se=G==="\\"?"\\\\\\\\":G.replace(Of,"\\\\$&"),O.push(G),H.push("([^"+se+"]+)?"+se+"?")}});const oe=new RegExp("^"+H.join("")+"("+(se===""?".":"[^"+se+"]")+"+)?"+(se===""?"":"["+se+"]*")+"$"),le=T.length-1,Se=T.map((k,_)=>_===0&&e.reverseFillMask===!0?new RegExp("^"+N+"*"+k):_===le?new RegExp("^"+k+"("+(R===""?".":R)+"+)?"+(e.reverseFillMask===!0?"$":N+"*")):new RegExp("^"+k));c=O,u=k=>{const _=oe.exec(e.reverseFillMask===!0?k:k.slice(0,O.length+1));_!==null&&(k=_.slice(1).join(""));const j=[],U=Se.length;for(let K=0,G=k;Ktypeof k=="string"?k:Sn).join(""),i=l.split(Sn).join(I)}function $(z,I,N){const H=r.value,T=H.selectionEnd,O=H.value.length-T,J=E(z);I===!0&&L();const se=P(J),R=e.fillMask!==!1?D(se):se,oe=y.value!==R;H.value!==R&&(H.value=R),oe===!0&&(y.value=R),document.activeElement===H&&Tt(()=>{if(R!==i)if(N!=="insertFromPaste"||e.reverseFillMask===!0)if(["deleteContentBackward","deleteContentForward"].indexOf(N)>-1){const Se=e.reverseFillMask===!0?T===0?R.length>se.length?1:0:Math.max(0,R.length-(R===i?0:Math.min(se.length,O)+1))+1:T;H.setSelectionRange(Se,Se,"forward")}else if(e.reverseFillMask===!0)if(oe===!0){const Se=Math.max(0,R.length-(R===i?0:Math.min(se.length,O+1)));Se===1&&T===1?H.setSelectionRange(Se,Se,"forward"):A.rightReverse(H,Se)}else{const Se=R.length-O;H.setSelectionRange(Se,Se,"backward")}else if(oe===!0){const Se=Math.max(0,l.indexOf(Sn),Math.min(se.length,T)-1);A.right(H,Se)}else{const Se=T-1;A.right(H,Se)}else{const Se=H.selectionEnd;let k=T-1;for(let _=v;_<=k&&_e.type+e.autogrow,L),_e(()=>e.mask,z=>{if(z!==void 0)$(y.value,!0);else{const I=E(y.value);L(),e.modelValue!==I&&t("update:modelValue",I)}}),_e(()=>e.fillMask+e.reverseFillMask,()=>{p.value===!0&&$(y.value,!0)}),_e(()=>e.unmaskedValue,()=>{p.value===!0&&$(y.value)});const A={left(z,I){const N=l.slice(I-1).indexOf(Sn)===-1;let H=Math.max(0,I-1);for(;H>=0;H--)if(l[H]===Sn){I=H,N===!0&&I++;break}if(H<0&&l[I]!==void 0&&l[I]!==Sn)return A.right(z,0);I>=0&&z.setSelectionRange(I,I,"backward")},right(z,I){const N=z.value.length;let H=Math.min(N,I+1);for(;H<=N;H++){if(l[H]===Sn){I=H;break}l[H-1]===Sn&&(I=H)}if(H>N&&l[I-1]!==void 0&&l[I-1]!==Sn)return A.left(z,N);z.setSelectionRange(I,I,"forward")},leftReverse(z,I){const N=w(z.value.length);let H=Math.max(0,I-1);for(;H>=0;H--){if(N[H-1]===Sn){I=H;break}if(N[H]===Sn&&(I=H,H===0))break}if(H<0&&N[I]!==void 0&&N[I]!==Sn)return A.rightReverse(z,0);I>=0&&z.setSelectionRange(I,I,"backward")},rightReverse(z,I){const N=z.value.length,H=w(N),T=H.slice(0,I+1).indexOf(Sn)===-1;let O=Math.min(N,I+1);for(;O<=N;O++)if(H[O-1]===Sn){I=O,I>0&&T===!0&&I--;break}if(O>N&&H[I-1]!==void 0&&H[I-1]!==Sn)return A.leftReverse(z,N);z.setSelectionRange(I,I,"forward")}};function S(z){t("click",z),m=void 0}function x(z){if(t("keydown",z),or(z)===!0||z.altKey===!0)return;const I=r.value,N=I.selectionStart,H=I.selectionEnd;if(z.shiftKey||(m=void 0),z.keyCode===37||z.keyCode===39){z.shiftKey&&m===void 0&&(m=I.selectionDirection==="forward"?N:H);const T=A[(z.keyCode===39?"right":"left")+(e.reverseFillMask===!0?"Reverse":"")];if(z.preventDefault(),T(I,m===N?H:N),z.shiftKey){const O=I.selectionStart;I.setSelectionRange(Math.min(m,O),Math.max(m,O),"forward")}}else z.keyCode===8&&e.reverseFillMask!==!0&&N===H?(A.left(I,N),I.setSelectionRange(I.selectionStart,H,"backward")):z.keyCode===46&&e.reverseFillMask===!0&&N===H&&(A.rightReverse(I,H),I.setSelectionRange(N,I.selectionEnd,"forward"))}function P(z){if(z==null||z==="")return"";if(e.reverseFillMask===!0)return M(z);const I=c;let N=0,H="";for(let T=0;T=0&&H>-1;O--){const J=I[O];let se=z[H];if(typeof J=="string")T=J+T,se===J&&H--;else{if(se===void 0||!J.regex.test(se))return T;do T=(J.transform!==void 0?J.transform(se):se)+T,H--,se=z[H];while(N===O&&se!==void 0&&J.regex.test(se))}}return T}function E(z){return typeof z!="string"||u===void 0?typeof z=="number"?u(""+z):z:u(z)}function D(z){return i.length-z.length<=0?z:e.reverseFillMask===!0&&z.length!==0?i.slice(0,-z.length)+z:z+i.slice(z.length)}return{innerValue:y,hasMask:p,moveCursorForPaste:F,updateMaskValue:$,onMaskedKeydown:x,onMaskedClick:S}}const c6=/[\u3000-\u303f\u3040-\u309f\u30a0-\u30ff\uff00-\uff9f\u4e00-\u9faf\u3400-\u4dbf]/,d6=/[\u4e00-\u9fff\u3400-\u4dbf\u{20000}-\u{2a6df}\u{2a700}-\u{2b73f}\u{2b740}-\u{2b81f}\u{2b820}-\u{2ceaf}\uf900-\ufaff\u3300-\u33ff\ufe30-\ufe4f\uf900-\ufaff\u{2f800}-\u{2fa1f}]/u,v6=/[\u3131-\u314e\u314f-\u3163\uac00-\ud7a3]/,f6=/[a-z0-9_ -]$/i;function mm(e){return function(t){if(t.type==="compositionend"||t.type==="change"){if(t.target.qComposing!==!0)return;t.target.qComposing=!1,e(t)}else t.type==="compositionupdate"&&t.target.qComposing!==!0&&typeof t.data=="string"&&(ut.is.firefox===!0?f6.test(t.data)===!1:c6.test(t.data)===!0||d6.test(t.data)===!0||v6.test(t.data)===!0)===!0&&(t.target.qComposing=!0)}}var _d=we({name:"QInput",inheritAttrs:!1,props:{...Nl,...s6,...ko,modelValue:{required:!1},shadowText:String,type:{type:String,default:"text"},debounce:[String,Number],autogrow:Boolean,inputClass:[Array,String,Object],inputStyle:[Array,String,Object]},emits:[...Ps,"paste","change","keydown","click","animationend"],setup(e,{emit:t,attrs:n}){const{proxy:r}=Ve(),{$q:l}=r,i={};let c,u,v,m=NaN,p=null;const y=X(null),b=nd(e),{innerValue:g,hasMask:w,moveCursorForPaste:L,updateMaskValue:$,onMaskedKeydown:F,onMaskedClick:A}=u6(e,t,se,y),S=pm(e,!0),x=f(()=>tr(g.value)),P=mm(O),M=Bs(),E=f(()=>e.type==="textarea"||e.autogrow===!0),D=f(()=>E.value===!0||["text","search","url","tel","password"].includes(e.type)),z=f(()=>{const _={...M.splitAttrs.listeners.value,onInput:O,onPaste:T,onChange:oe,onBlur:le,onFocus:dn};return _.onCompositionstart=_.onCompositionupdate=_.onCompositionend=P,w.value===!0&&(_.onKeydown=F,_.onClick=A),e.autogrow===!0&&(_.onAnimationend=J),_}),I=f(()=>{const _={tabindex:0,"data-autofocus":e.autofocus===!0||void 0,rows:e.type==="textarea"?6:void 0,"aria-label":e.label,name:b.value,...M.splitAttrs.attributes.value,id:M.targetUid.value,maxlength:e.maxlength,disabled:e.disable===!0,readonly:e.readonly===!0};return E.value===!1&&(_.type=e.type),e.autogrow===!0&&(_.rows=1),_});function N(){Yr(()=>{const _=document.activeElement;y.value===null||y.value===_||_!==null&&_.id===M.targetUid.value||y.value.focus({preventScroll:!0})})}function H(){y.value!==null&&y.value.select()}function T(_){if(w.value===!0&&e.reverseFillMask!==!0){const j=_.target;L(j,j.selectionStart,j.selectionEnd)}t("paste",_)}function O(_){if(!_||!_.target)return;if(e.type==="file")return void t("update:modelValue",_.target.files);const j=_.target.value;if(_.target.qComposing!==!0){if(w.value===!0)$(j,!1,_.inputType);else if(se(j),D.value===!0&&_.target===document.activeElement){const{selectionStart:U,selectionEnd:K}=_.target;U!==void 0&&K!==void 0&&Tt(()=>{_.target===document.activeElement&&j.indexOf(_.target.value)===0&&_.target.setSelectionRange(U,K)})}e.autogrow===!0&&R()}else i.value=j}function J(_){t("animationend",_),R()}function se(_,j){v=()=>{p=null,e.type!=="number"&&i.hasOwnProperty("value")===!0&&delete i.value,e.modelValue!==_&&m!==_&&(m=_,j===!0&&(u=!0),t("update:modelValue",_),Tt(()=>{m===_&&(m=NaN)})),v=void 0},e.type==="number"&&(c=!0,i.value=_),e.debounce!==void 0?(p!==null&&clearTimeout(p),i.value=_,p=setTimeout(v,e.debounce)):v()}function R(){requestAnimationFrame(()=>{const _=y.value;if(_!==null){const j=_.parentNode.style,{scrollTop:U}=_,{overflowY:K,maxHeight:G}=l.platform.is.firefox===!0?{}:window.getComputedStyle(_),ne=K!==void 0&&K!=="scroll";ne===!0&&(_.style.overflowY="hidden"),j.marginBottom=_.scrollHeight-1+"px",_.style.height="1px",_.style.height=_.scrollHeight+"px",ne===!0&&(_.style.overflowY=parseInt(G,10)<_.scrollHeight?"auto":"hidden"),j.marginBottom="",_.scrollTop=U}})}function oe(_){P(_),p!==null&&(clearTimeout(p),p=null),v!==void 0&&v(),t("change",_.target.value)}function le(_){_!==void 0&&dn(_),p!==null&&(clearTimeout(p),p=null),v!==void 0&&v(),c=!1,u=!1,delete i.value,e.type!=="file"&&setTimeout(()=>{y.value!==null&&(y.value.value=g.value!==void 0?g.value:"")})}function Se(){return i.hasOwnProperty("value")===!0?i.value:g.value!==void 0?g.value:""}_e(()=>e.type,()=>{y.value&&(y.value.value=e.modelValue)}),_e(()=>e.modelValue,_=>{if(w.value===!0){if(u===!0&&(u=!1,String(_)===m))return;$(_)}else g.value!==_&&(g.value=_,e.type==="number"&&i.hasOwnProperty("value")===!0&&(c===!0?c=!1:delete i.value));e.autogrow===!0&&Tt(R)}),_e(()=>e.autogrow,_=>{_===!0?Tt(R):y.value!==null&&n.rows>0&&(y.value.style.height="auto")}),_e(()=>e.dense,()=>{e.autogrow===!0&&Tt(R)}),qt(()=>{le()}),jt(()=>{e.autogrow===!0&&R()}),Object.assign(M,{innerValue:g,fieldClass:f(()=>`q-${E.value===!0?"textarea":"input"}`+(e.autogrow===!0?" q-textarea--autogrow":"")),hasShadow:f(()=>e.type!=="file"&&typeof e.shadowText=="string"&&e.shadowText.length!==0),inputRef:y,emitValue:se,hasValue:x,floatingLabel:f(()=>x.value===!0&&(e.type!=="number"||isNaN(g.value)===!1)||tr(e.displayValue)),getControl:()=>d(E.value===!0?"textarea":"input",{ref:y,class:["q-field__native q-placeholder",e.inputClass],style:e.inputStyle,...I.value,...z.value,...e.type!=="file"?{value:Se()}:S.value}),getShadowControl:()=>d("div",{class:"q-field__native q-field__shadow absolute-bottom no-pointer-events"+(E.value===!0?"":" text-no-wrap")},[d("span",{class:"invisible"},Se()),d("span",e.shadowText)])});const k=Es(M);return Object.assign(r,{focus:N,select:H,getNativeElement:()=>y.value}),qn(r,"nativeEl",()=>y.value),k}});const Rf={threshold:0,root:null,rootMargin:"0px"};function zf(e,t,n){let r,l,i;typeof n=="function"?(r=n,l=Rf,i=t.cfg===void 0):(r=n.handler,l=Object.assign({},Rf,n.cfg),i=t.cfg===void 0||Ao(t.cfg,l)===!1),t.handler!==r&&(t.handler=r),i===!0&&(t.cfg=l,t.observer!==void 0&&t.observer.unobserve(e),t.observer=new IntersectionObserver(([c])=>{if(typeof t.handler=="function"){if(c.rootBounds===null&&document.body.contains(e)===!0)return t.observer.unobserve(e),void t.observer.observe(e);(t.handler(c,t.observer)===!1||t.once===!0&&c.isIntersecting===!0)&&gm(e)}},l),t.observer.observe(e))}function gm(e){const t=e.__qvisible;t!==void 0&&(t.observer!==void 0&&t.observer.unobserve(e),delete e.__qvisible)}var bm=Eo({name:"intersection",mounted(e,{modifiers:t,value:n}){const r={once:t.once===!0};zf(e,r,n),e.__qvisible=r},updated(e,t){const n=e.__qvisible;n!==void 0&&zf(e,n,t.value)},beforeUnmount:gm}),p6=we({name:"QIntersection",props:{tag:{type:String,default:"div"},once:Boolean,transition:String,transitionDuration:{type:[String,Number],default:300},ssrPrerender:Boolean,margin:String,threshold:[Number,Array],root:{default:null},disable:Boolean,onVisibility:Function},setup(e,{slots:t,emit:n}){const r=X(so.value===!0&&e.ssrPrerender),l=f(()=>e.root!==void 0||e.margin!==void 0||e.threshold!==void 0?{handler:v,cfg:{root:e.root,rootMargin:e.margin,threshold:e.threshold}}:v),i=f(()=>e.disable!==!0&&(so.value!==!0||e.once!==!0||e.ssrPrerender!==!0)),c=f(()=>[[bm,l.value,void 0,{once:e.once}]]),u=f(()=>`--q-transition-duration: ${e.transitionDuration}ms`);function v(p){r.value!==p.isIntersecting&&(r.value=p.isIntersecting,e.onVisibility!==void 0&&n("visibility",r.value))}function m(){return r.value===!0?[d("div",{key:"content",style:u.value},Ge(t.default))]:t.hidden!==void 0?[d("div",{key:"hidden",style:u.value},t.hidden())]:void 0}return()=>{const p=e.transition?[d(yn,{name:"q-transition--"+e.transition},m)]:m();return xo(e.tag,{class:"q-intersection"},p,"main",i.value,()=>c.value)}}}),ym=we({name:"QList",props:{...Ft,bordered:Boolean,dense:Boolean,separator:Boolean,padding:Boolean,tag:{type:String,default:"div"}},setup(e,{slots:t}){const n=Ve(),r=Vt(e,n.proxy.$q),l=f(()=>"q-list"+(e.bordered===!0?" q-list--bordered":"")+(e.dense===!0?" q-list--dense":"")+(e.separator===!0?" q-list--separator":"")+(r.value===!0?" q-list--dark":"")+(e.padding===!0?" q-list--padding":""));return()=>d(e.tag,{class:l.value},Ge(t.default))}});const Nf=[34,37,40,33,39,38],h6=Object.keys(fd);var m6=we({name:"QKnob",props:{...ko,...fd,modelValue:{type:Number,required:!0},innerMin:Number,innerMax:Number,step:{type:Number,default:1,validator:e=>e>=0},tabindex:{type:[Number,String],default:0},disable:Boolean,readonly:Boolean},emits:["update:modelValue","change","dragValue"],setup(e,{slots:t,emit:n}){const{proxy:r}=Ve(),{$q:l}=r,i=X(e.modelValue),c=X(!1),u=f(()=>isNaN(e.innerMin)===!0||e.innerMinisNaN(e.innerMax)===!0||e.innerMax>e.max?e.max:e.innerMax);let m;function p(){i.value=e.modelValue===null?u.value:Jt(e.modelValue,u.value,v.value),N(!0)}_e(()=>`${e.modelValue}|${u.value}|${v.value}`,p),p();const y=f(()=>e.disable===!1&&e.readonly===!1),b=f(()=>"q-knob non-selectable"+(y.value===!0?" q-knob--editable":e.disable===!0?" disabled":"")),g=f(()=>(String(e.step).trim().split(".")[1]||"").length),w=f(()=>e.step===0?1:e.step),L=f(()=>e.instantFeedback===!0||c.value===!0),$=l.platform.is.mobile===!0?f(()=>y.value===!0?{onClick:E}:{}):f(()=>y.value===!0?{onMousedown:M,onClick:E,onKeydown:D,onKeyup:I}:{}),F=f(()=>y.value===!0?{tabindex:e.tabindex}:{[`aria-${e.disable===!0?"disabled":"readonly"}`]:"true"}),A=f(()=>{const O={};return h6.forEach(J=>{O[J]=e[J]}),O});function S(O){O.isFinal?(z(O.evt,!0),c.value=!1):(O.isFirst&&(P(),c.value=!0),z(O.evt))}const x=f(()=>[[io,S,void 0,{prevent:!0,stop:!0,mouse:!0}]]);function P(){const{top:O,left:J,width:se,height:R}=r.$el.getBoundingClientRect();m={top:O+R/2,left:J+se/2}}function M(O){P(),z(O)}function E(O){P(),z(O,!0)}function D(O){if(!Nf.includes(O.keyCode))return;bt(O);const J=([34,33].includes(O.keyCode)?10:1)*w.value,se=[34,37,40].includes(O.keyCode)?-J:J;i.value=Jt(parseFloat((i.value+se).toFixed(g.value)),u.value,v.value),N()}function z(O,J){const se=jn(O),R=Math.abs(se.top-m.top),oe=Math.sqrt(R**2+Math.abs(se.left-m.left)**2);let le=Math.asin(R/oe)*(180/Math.PI);le=se.top=w.value/2?(k<0?-1:1)*w.value:0),Se=parseFloat(Se.toFixed(g.value))}Se=Jt(Se,u.value,v.value),n("dragValue",Se),i.value!==Se&&(i.value=Se),N(J)}function I(O){Nf.includes(O.keyCode)&&N(!0)}function N(O){e.modelValue!==i.value&&n("update:modelValue",i.value),O===!0&&n("change",i.value)}const H=Il(e);function T(){return d("input",H.value)}return()=>{const O={class:b.value,role:"slider","aria-valuemin":u.value,"aria-valuemax":v.value,"aria-valuenow":e.modelValue,...F.value,...A.value,value:i.value,instantFeedback:L.value,...$.value},J={default:t.default};return y.value===!0&&e.name!==void 0&&(J.internal=T),xo(pd,O,J,"knob",y.value,()=>x.value)}}});const{passive:Hf}=Zt,g6=["both","horizontal","vertical"];var wd=we({name:"QScrollObserver",props:{axis:{type:String,validator:e=>g6.includes(e),default:"vertical"},debounce:[String,Number],scrollTarget:{default:void 0}},emits:["scroll"],setup(e,{emit:t}){const n={position:{top:0,left:0},direction:"down",directionChanged:!1,delta:{top:0,left:0},inflectionPoint:{top:0,left:0}};let r,l,i=null;function c(){i!==null&&i();const y=Math.max(0,Ca(r)),b=Ls(r),g={top:y-n.position.top,left:b-n.position.left};if(e.axis==="vertical"&&g.top===0||e.axis==="horizontal"&&g.left===0)return;const w=Math.abs(g.top)>=Math.abs(g.left)?g.top<0?"up":"down":g.left<0?"left":"right";n.position={top:y,left:b},n.directionChanged=n.direction!==w,n.delta=g,n.directionChanged===!0&&(n.direction=w,n.inflectionPoint=n.position),t("scroll",{...n})}function u(){r=Qo(l,e.scrollTarget),r.addEventListener("scroll",m,Hf),m(!0)}function v(){r!==void 0&&(r.removeEventListener("scroll",m,Hf),r=void 0)}function m(y){if(y===!0||e.debounce===0||e.debounce==="0")c();else if(i===null){const[b,g]=e.debounce?[setTimeout(c,e.debounce),clearTimeout]:[requestAnimationFrame(c),cancelAnimationFrame];i=()=>{g(b),i=null}}}_e(()=>e.scrollTarget,()=>{v(),u()});const{proxy:p}=Ve();return _e(()=>p.$q.lang.rtl,c),jt(()=>{l=p.$el.parentNode,u()}),qt(()=>{i!==null&&i(),v()}),Object.assign(p,{trigger:m,getPosition:()=>n}),pn}}),b6=we({name:"QLayout",props:{container:Boolean,view:{type:String,default:"hhh lpr fff",validator:e=>/^(h|l)h(h|r) lpr (f|l)f(f|r)$/.test(e.toLowerCase())},onScroll:Function,onScrollHeight:Function,onResize:Function},setup(e,{slots:t,emit:n}){const{proxy:{$q:r}}=Ve(),l=X(null),i=X(r.screen.height),c=X(e.container===!0?0:r.screen.width),u=X({position:0,direction:"down",inflectionPoint:0}),v=X(0),m=X(so.value===!0?0:Gi()),p=f(()=>"q-layout q-layout--"+(e.container===!0?"containerized":"standard")),y=f(()=>e.container===!1?{minHeight:r.screen.height+"px"}:null),b=f(()=>m.value!==0?{[r.lang.rtl===!0?"left":"right"]:`${m.value}px`}:null),g=f(()=>m.value!==0?{[r.lang.rtl===!0?"right":"left"]:0,[r.lang.rtl===!0?"left":"right"]:`-${m.value}px`,width:`calc(100% + ${m.value}px)`}:null);function w(x){if(e.container===!0||document.qScrollPrevented!==!0){const P={position:x.position.top,direction:x.direction,directionChanged:x.directionChanged,inflectionPoint:x.inflectionPoint.top,delta:x.delta.top};u.value=P,e.onScroll!==void 0&&n("scroll",P)}}function L(x){const{height:P,width:M}=x;let E=!1;i.value!==P&&(E=!0,i.value=P,e.onScrollHeight!==void 0&&n("scrollHeight",P),F()),c.value!==M&&(E=!0,c.value=M),E===!0&&e.onResize!==void 0&&n("resize",x)}function $({height:x}){v.value!==x&&(v.value=x,F())}function F(){if(e.container===!0){const x=i.value>v.value?Gi():0;m.value!==x&&(m.value=x)}}let A=null;const S={instances:{},view:f(()=>e.view),isContainer:f(()=>e.container),rootRef:l,height:i,containerHeight:v,scrollbarWidth:m,totalWidth:f(()=>c.value+m.value),rows:f(()=>{const x=e.view.toLowerCase().split(" ");return{top:x[0].split(""),middle:x[1].split(""),bottom:x[2].split("")}}),header:Lr({size:0,offset:0,space:!1}),right:Lr({size:300,offset:0,space:!1}),footer:Lr({size:0,offset:0,space:!1}),left:Lr({size:300,offset:0,space:!1}),scroll:u,animate(){A!==null?clearTimeout(A):document.body.classList.add("q-body--layout-animate"),A=setTimeout(()=>{A=null,document.body.classList.remove("q-body--layout-animate")},155)},update(x,P,M){S[x][P]=M}};if(Do(ar,S),Gi()>0){let M=function(){x=null,P.classList.remove("hide-scrollbar")},E=function(){if(x===null){if(P.scrollHeight>r.screen.height)return;P.classList.add("hide-scrollbar")}else clearTimeout(x);x=setTimeout(M,300)},D=function(z){x!==null&&z==="remove"&&(clearTimeout(x),M()),window[`${z}EventListener`]("resize",E)},x=null;const P=document.body;_e(()=>e.container!==!0?"add":"remove",D),e.container!==!0&&D("add"),Ml(()=>{D("remove")})}return()=>{const x=hn(t.default,[d(wd,{onScroll:w}),d(qa,{onResize:L})]),P=d("div",{class:p.value,style:y.value,ref:e.container===!0?void 0:l,tabindex:-1},x);return e.container===!0?d("div",{class:"q-layout-container overflow-hidden",ref:l},[d(qa,{onResize:$}),d("div",{class:"absolute-full",style:b.value},[d("div",{class:"scroll",style:g.value},[P])])]):P}}});const y6=["horizontal","vertical","cell","none"];var _m=we({name:"QMarkupTable",props:{...Ft,dense:Boolean,flat:Boolean,bordered:Boolean,square:Boolean,wrapCells:Boolean,separator:{type:String,default:"horizontal",validator:e=>y6.includes(e)}},setup(e,{slots:t}){const n=Ve(),r=Vt(e,n.proxy.$q),l=f(()=>`q-markup-table q-table__container q-table__card q-table--${e.separator}-separator`+(r.value===!0?" q-table--dark q-table__card--dark q-dark":"")+(e.dense===!0?" q-table--dense":"")+(e.flat===!0?" q-table--flat":"")+(e.bordered===!0?" q-table--bordered":"")+(e.square===!0?" q-table--square":"")+(e.wrapCells===!1?" q-table--no-wrap":""));return()=>d("div",{class:l.value},[d("table",{class:"q-table"},Ge(t.default))])}}),_6=we({name:"QNoSsr",props:{tag:{type:String,default:"div"},placeholder:String},setup(e,{slots:t}){const n=Bh();return()=>{const r={};if(n.value===!0){const i=Ge(t.default);return i===void 0?i:i.length>1?d(e.tag,r,i):i[0]}r.class="q-no-ssr-placeholder";const l=Ge(t.placeholder);return l!==void 0?l.length>1?d(e.tag,r,l):l[0]:e.placeholder!==void 0?d(e.tag,r,e.placeholder):void 0}}});const w6=d("svg",{key:"svg",class:"q-radio__bg absolute non-selectable",viewBox:"0 0 24 24"},[d("path",{d:"M12,22a10,10 0 0 1 -10,-10a10,10 0 0 1 10,-10a10,10 0 0 1 10,10a10,10 0 0 1 -10,10m0,-22a12,12 0 0 0 -12,12a12,12 0 0 0 12,12a12,12 0 0 0 12,-12a12,12 0 0 0 -12,-12"}),d("path",{class:"q-radio__check",d:"M12,6a6,6 0 0 0 -6,6a6,6 0 0 0 6,6a6,6 0 0 0 6,-6a6,6 0 0 0 -6,-6"})]);var wm=we({name:"QRadio",props:{...Ft,...ua,...ko,modelValue:{required:!0},val:{required:!0},label:String,leftLabel:Boolean,checkedIcon:String,uncheckedIcon:String,color:String,keepColor:Boolean,dense:Boolean,disable:Boolean,tabindex:[String,Number]},emits:["update:modelValue"],setup(e,{slots:t,emit:n}){const{proxy:r}=Ve(),l=Vt(e,r.$q),i=ca(e,kh),c=X(null),{refocusTargetEl:u,refocusTarget:v}=Sh(e,c),m=f(()=>ra(e.modelValue)===ra(e.val)),p=f(()=>"q-radio cursor-pointer no-outline row inline no-wrap items-center"+(e.disable===!0?" disabled":"")+(l.value===!0?" q-radio--dark":"")+(e.dense===!0?" q-radio--dense":"")+(e.leftLabel===!0?" reverse":"")),y=f(()=>{const S=e.color===void 0||e.keepColor!==!0&&m.value!==!0?"":` text-${e.color}`;return`q-radio__inner relative-position q-radio__inner--${m.value===!0?"truthy":"falsy"}${S}`}),b=f(()=>(m.value===!0?e.checkedIcon:e.uncheckedIcon)||null),g=f(()=>e.disable===!0?-1:e.tabindex||0),w=f(()=>{const S={type:"radio"};return e.name!==void 0&&Object.assign(S,{".checked":m.value===!0,"^checked":m.value===!0?"checked":void 0,name:e.name,value:e.val}),S}),L=La(w);function $(S){S!==void 0&&(bt(S),v(S)),e.disable!==!0&&m.value!==!0&&n("update:modelValue",e.val,S)}function F(S){S.keyCode!==13&&S.keyCode!==32||bt(S)}function A(S){S.keyCode!==13&&S.keyCode!==32||$(S)}return Object.assign(r,{set:$}),()=>{const S=b.value!==null?[d("div",{key:"icon",class:"q-radio__icon-container absolute-full flex flex-center no-wrap"},[d(Et,{class:"q-radio__icon",name:b.value})])]:[w6];e.disable!==!0&&L(S,"unshift"," q-radio__native q-ma-none q-pa-none");const x=[d("div",{class:y.value,style:i.value,"aria-hidden":"true"},S)];u.value!==null&&x.push(u.value);const P=e.label!==void 0?hn(t.default,[e.label]):Ge(t.default);return P!==void 0&&x.push(d("div",{class:"q-radio__label q-anchor--skip"},P)),d("div",{ref:c,class:p.value,tabindex:g.value,role:"radio","aria-label":e.label,"aria-checked":m.value===!0?"true":"false","aria-disabled":e.disable===!0?"true":void 0,onClick:$,onKeydown:F,onKeyup:A},x)}}}),xm=we({name:"QToggle",props:{...Ch,icon:String,iconColor:String},emits:qh,setup(e){function t(n,r){const l=f(()=>(n.value===!0?e.checkedIcon:r.value===!0?e.indeterminateIcon:e.uncheckedIcon)||e.icon),i=f(()=>n.value===!0?e.iconColor:null);return()=>[d("div",{class:"q-toggle__track"}),d("div",{class:"q-toggle__thumb absolute flex flex-center no-wrap"},l.value!==void 0?[d(Et,{name:l.value,color:i.value})]:void 0)]}return $h("toggle",t)}});const Sm={radio:wm,checkbox:Or,toggle:xm},x6=Object.keys(Sm);var km=we({name:"QOptionGroup",props:{...Ft,modelValue:{required:!0},options:{type:Array,validator:e=>e.every(t=>"value"in t&&"label"in t)},name:String,type:{default:"radio",validator:e=>x6.includes(e)},color:String,keepColor:Boolean,dense:Boolean,size:String,leftLabel:Boolean,inline:Boolean,disable:Boolean},emits:["update:modelValue"],setup(e,{emit:t,slots:n}){const{proxy:{$q:r}}=Ve(),l=Array.isArray(e.modelValue);e.type==="radio"?l===!0&&console.error("q-option-group: model should not be array"):l===!1&&console.error("q-option-group: model should be array in your case");const i=Vt(e,r),c=f(()=>Sm[e.type]),u=f(()=>"q-option-group q-gutter-x-sm"+(e.inline===!0?" q-option-group--inline":"")),v=f(()=>{const p={role:"group"};return e.type==="radio"&&(p.role="radiogroup",e.disable===!0&&(p["aria-disabled"]="true")),p});function m(p){t("update:modelValue",p)}return()=>d("div",{class:u.value,...v.value},e.options.map((p,y)=>{const b=n["label-"+y]!==void 0?()=>n["label-"+y](p):n.label!==void 0?()=>n.label(p):void 0;return d("div",[d(c.value,{modelValue:e.modelValue,val:p.value,name:p.name===void 0?e.name:p.name,disable:e.disable||p.disable,label:b===void 0?p.label:null,leftLabel:p.leftLabel===void 0?e.leftLabel:p.leftLabel,color:p.color===void 0?e.color:p.color,checkedIcon:p.checkedIcon,uncheckedIcon:p.uncheckedIcon,dark:p.dark||i.value,size:p.size===void 0?e.size:p.size,dense:e.dense,keepColor:p.keepColor===void 0?e.keepColor:p.keepColor,"onUpdate:modelValue":m},b)])}))}}),S6=we({name:"QPage",props:{padding:Boolean,styleFn:Function},setup(e,{slots:t}){const{proxy:{$q:n}}=Ve(),r=Fn(ar,Nt);if(r===Nt)return console.error("QPage needs to be a deep child of QLayout"),Nt;if(Fn(Up,Nt)===Nt)return console.error("QPage needs to be child of QPageContainer"),Nt;const i=f(()=>{const u=(r.header.space===!0?r.header.size:0)+(r.footer.space===!0?r.footer.size:0);if(typeof e.styleFn=="function"){const v=r.isContainer.value===!0?r.containerHeight.value:n.screen.height;return e.styleFn(u,v)}return{minHeight:r.isContainer.value===!0?r.containerHeight.value-u+"px":n.screen.height===0?u!==0?`calc(100vh - ${u}px)`:"100vh":n.screen.height-u+"px"}}),c=f(()=>`q-page${e.padding===!0?" q-layout-padding":""}`);return()=>d("main",{class:c.value,style:i.value},Ge(t.default))}}),k6=we({name:"QPageContainer",setup(e,{slots:t}){const{proxy:{$q:n}}=Ve(),r=Fn(ar,Nt);if(r===Nt)return console.error("QPageContainer needs to be child of QLayout"),Nt;Do(Up,!0);const l=f(()=>{const i={};return r.header.space===!0&&(i.paddingTop=`${r.header.size}px`),r.right.space===!0&&(i[`padding${n.lang.rtl===!0?"Left":"Right"}`]=`${r.right.size}px`),r.footer.space===!0&&(i.paddingBottom=`${r.footer.size}px`),r.left.space===!0&&(i[`padding${n.lang.rtl===!0?"Right":"Left"}`]=`${r.left.size}px`),i});return()=>d("div",{class:"q-page-container",style:l.value},Ge(t.default))}});const Cm={position:{type:String,default:"bottom-right",validator:e=>["top-right","top-left","bottom-right","bottom-left","top","right","bottom","left"].includes(e)},offset:{type:Array,validator:e=>e.length===2},expand:Boolean};function qm(){const{props:e,proxy:{$q:t}}=Ve(),n=Fn(ar,Nt);if(n===Nt)return console.error("QPageSticky needs to be child of QLayout"),Nt;const r=f(()=>{const y=e.position;return{top:y.indexOf("top")>-1,right:y.indexOf("right")>-1,bottom:y.indexOf("bottom")>-1,left:y.indexOf("left")>-1,vertical:y==="top"||y==="bottom",horizontal:y==="left"||y==="right"}}),l=f(()=>n.header.offset),i=f(()=>n.right.offset),c=f(()=>n.footer.offset),u=f(()=>n.left.offset),v=f(()=>{let y=0,b=0;const g=r.value,w=t.lang.rtl===!0?-1:1;g.top===!0&&l.value!==0?b=`${l.value}px`:g.bottom===!0&&c.value!==0&&(b=`${-c.value}px`),g.left===!0&&u.value!==0?y=`${w*u.value}px`:g.right===!0&&i.value!==0&&(y=`${-w*i.value}px`);const L={transform:`translate(${y}, ${b})`};return e.offset&&(L.margin=`${e.offset[1]}px ${e.offset[0]}px`),g.vertical===!0?(u.value!==0&&(L[t.lang.rtl===!0?"right":"left"]=`${u.value}px`),i.value!==0&&(L[t.lang.rtl===!0?"left":"right"]=`${i.value}px`)):g.horizontal===!0&&(l.value!==0&&(L.top=`${l.value}px`),c.value!==0&&(L.bottom=`${c.value}px`)),L}),m=f(()=>`q-page-sticky row flex-center fixed-${e.position} q-page-sticky--${e.expand===!0?"expand":"shrink"}`);function p(y){const b=Ge(y.default);return d("div",{class:m.value,style:v.value},e.expand===!0?b:[d("div",b)])}return{$layout:n,getStickyContent:p}}var C6=we({name:"QPageScroller",props:{...Cm,scrollOffset:{type:Number,default:1e3},reverse:Boolean,duration:{type:Number,default:300},offset:{default:()=>[18,18]}},emits:["click"],setup(e,{slots:t,emit:n}){const{proxy:{$q:r}}=Ve(),{$layout:l,getStickyContent:i}=qm(),c=X(null);let u;const v=f(()=>l.height.value-(l.isContainer.value===!0?l.containerHeight.value:r.screen.height));function m(){return e.reverse===!0?v.value-l.scroll.value.position>e.scrollOffset:l.scroll.value.position>e.scrollOffset}const p=X(m());function y(){const $=m();p.value!==$&&(p.value=$)}function b(){e.reverse===!0?u===void 0&&(u=_e(v,y)):g()}function g(){u!==void 0&&(u(),u=void 0)}function w($){const F=Qo(l.isContainer.value===!0?c.value:l.rootRef.value);Ir(F,e.reverse===!0?l.height.value:0,e.duration),n("click",$)}function L(){return p.value===!0?d("div",{ref:c,class:"q-page-scroller",onClick:w},i(t)):null}return _e(l.scroll,y),_e(()=>e.reverse,b),b(),qt(g),()=>d(yn,{name:"q-transition--fade"},L)}}),q6=we({name:"QPageSticky",props:Cm,setup(e,{slots:t}){const{getStickyContent:n}=qm();return()=>n(t)}});function Ni(e,t){return[!0,!1].includes(e)?e:t}var $6=we({name:"QPagination",props:{...Ft,modelValue:{type:Number,required:!0},min:{type:[Number,String],default:1},max:{type:[Number,String],required:!0},maxPages:{type:[Number,String],default:0,validator:e=>(typeof e=="string"?parseInt(e,10):e)>=0},inputStyle:[Array,String,Object],inputClass:[Array,String,Object],size:String,disable:Boolean,input:Boolean,iconPrev:String,iconNext:String,iconFirst:String,iconLast:String,toFn:Function,boundaryLinks:{type:Boolean,default:null},boundaryNumbers:{type:Boolean,default:null},directionLinks:{type:Boolean,default:null},ellipses:{type:Boolean,default:null},ripple:{type:[Boolean,Object],default:null},round:Boolean,rounded:Boolean,flat:Boolean,outline:Boolean,unelevated:Boolean,push:Boolean,glossy:Boolean,color:{type:String,default:"primary"},textColor:String,activeDesign:{type:String,default:"",values:e=>e===""||lh.includes(e)},activeColor:String,activeTextColor:String,gutter:String,padding:{type:String,default:"3px 2px"}},emits:["update:modelValue"],setup(e,{emit:t}){const{proxy:n}=Ve(),{$q:r}=n,l=Vt(e,r),i=f(()=>parseInt(e.min,10)),c=f(()=>parseInt(e.max,10)),u=f(()=>parseInt(e.maxPages,10)),v=f(()=>w.value+" / "+c.value),m=f(()=>Ni(e.boundaryLinks,e.input)),p=f(()=>Ni(e.boundaryNumbers,!e.input)),y=f(()=>Ni(e.directionLinks,e.input)),b=f(()=>Ni(e.ellipses,!e.input)),g=X(null),w=f({get:()=>e.modelValue,set:T=>{if(T=parseInt(T,10),e.disable||isNaN(T))return;const O=Jt(T,i.value,c.value);e.modelValue!==O&&t("update:modelValue",O)}});_e(()=>`${i.value}|${c.value}`,()=>{w.value=e.modelValue});const L=f(()=>"q-pagination row no-wrap items-center"+(e.disable===!0?" disabled":"")),$=f(()=>e.gutter in is?`${is[e.gutter]}px`:e.gutter||null),F=f(()=>$.value!==null?`--q-pagination-gutter-parent:-${$.value};--q-pagination-gutter-child:${$.value}`:null),A=f(()=>{const T=[e.iconFirst||r.iconSet.pagination.first,e.iconPrev||r.iconSet.pagination.prev,e.iconNext||r.iconSet.pagination.next,e.iconLast||r.iconSet.pagination.last];return r.lang.rtl===!0?T.reverse():T}),S=f(()=>({"aria-disabled":e.disable===!0?"true":"false",role:"navigation"})),x=f(()=>Kc(e,"flat")),P=f(()=>({[x.value]:!0,round:e.round,rounded:e.rounded,padding:e.padding,color:e.color,textColor:e.textColor,size:e.size,ripple:e.ripple===null||e.ripple})),M=f(()=>{const T={[x.value]:!1};return e.activeDesign!==""&&(T[e.activeDesign]=!0),T}),E=f(()=>({...M.value,color:e.activeColor||e.color,textColor:e.activeTextColor||e.textColor})),D=f(()=>{let T=Math.max(u.value,1+(b.value?2:0)+(p.value?2:0));const O={pgFrom:i.value,pgTo:c.value,ellipsesStart:!1,ellipsesEnd:!1,boundaryStart:!1,boundaryEnd:!1,marginalStyle:{minWidth:`${Math.max(2,String(c.value).length)}em`}};return u.value&&Ti.value+(p.value?1:0)&&(O.ellipsesStart=!0,O.pgFrom++),p.value&&(O.boundaryEnd=!0,O.pgTo--),b.value&&O.pgTo{function T(){w.value=g.value,g.value=null}return{"onUpdate:modelValue":O=>{g.value=O},onKeyup:O=>{wo(O,13)===!0&&T()},onBlur:T}});function H(T,O,J){const se={"aria-label":O,"aria-current":"false",...P.value,...T};return J===!0&&Object.assign(se,{"aria-current":"true",...E.value}),O!==void 0&&(e.toFn!==void 0?se.to=e.toFn(O):se.onClick=()=>{z(O)}),d(Rt,se)}return Object.assign(n,{set:z,setByOffset:I}),()=>{const T=[],O=[];let J;if(m.value===!0&&(T.push(H({key:"bls",disable:e.disable||e.modelValue<=i.value,icon:A.value[0]},i.value)),O.unshift(H({key:"ble",disable:e.disable||e.modelValue>=c.value,icon:A.value[3]},c.value))),y.value===!0&&(T.push(H({key:"bdp",disable:e.disable||e.modelValue<=i.value,icon:A.value[1]},e.modelValue-1)),O.unshift(H({key:"bdn",disable:e.disable||e.modelValue>=c.value,icon:A.value[2]},e.modelValue+1))),e.input!==!0){J=[];const{pgFrom:se,pgTo:R,marginalStyle:oe}=D.value;if(D.value.boundaryStart===!0){const le=i.value===e.modelValue;T.push(H({key:"bns",style:oe,disable:e.disable,label:i.value},i.value,le))}if(D.value.boundaryEnd===!0){const le=c.value===e.modelValue;O.unshift(H({key:"bne",style:oe,disable:e.disable,label:c.value},c.value,le))}D.value.ellipsesStart===!0&&T.push(H({key:"bes",style:oe,disable:e.disable,label:"…",ripple:!1},se-1)),D.value.ellipsesEnd===!0&&O.unshift(H({key:"bee",style:oe,disable:e.disable,label:"…",ripple:!1},R+1));for(let le=se;le<=R;le++)J.push(H({key:`bpg${le}`,style:oe,disable:e.disable,label:le},le,le===e.modelValue))}return d("div",{class:L.value,...S.value},[d("div",{class:"q-pagination__content row no-wrap items-center",style:F.value},[...T,e.input===!0?d(_d,{class:"inline",style:{width:`${v.value.length/1.5}em`},type:"number",dense:!0,value:g.value,disable:e.disable,dark:l.value,borderless:!0,inputClass:e.inputClass,inputStyle:e.inputStyle,placeholder:v.value,min:i.value,max:c.value,...N.value}):d("div",{class:"q-pagination__middle row justify-center"},J),...O])])}}});function uc(e){let t,n,r=!1;function l(){n=arguments,r!==!0&&(r=!0,t=requestAnimationFrame(()=>{e.apply(this,n),n=void 0,r=!1}))}return l.cancel=()=>{window.cancelAnimationFrame(t),r=!1},l}const{passive:Hi}=Zt;var T6=we({name:"QParallax",props:{src:String,height:{type:Number,default:500},speed:{type:Number,default:1,validator:e=>e>=0&&e<=1},scrollTarget:{default:void 0},onScroll:Function},setup(e,{slots:t,emit:n}){const r=X(0),l=X(null),i=X(null),c=X(null);let u,v,m,p,y,b;_e(()=>e.height,()=>{u===!0&&w()}),_e(()=>e.scrollTarget,()=>{u===!0&&(A(),F())});let g=S=>{r.value=S,e.onScroll!==void 0&&n("scroll",S)};function w(){let S,x,P;b===window?(S=0,P=x=window.innerHeight):(S=ls(b).top,x=zr(b),P=S+x);const M=ls(l.value).top,E=M+e.height;if(y!==void 0||E>S&&M{v.style.transform=`translate3d(-50%,${Math.round(S)}px,0)`};function $(){m=v.naturalHeight||v.videoHeight||zr(v),u===!0&&w()}function F(){u=!0,b=Qo(l.value,e.scrollTarget),b.addEventListener("scroll",w,Hi),window.addEventListener("resize",p,Hi),w()}function A(){u===!0&&(u=!1,b.removeEventListener("scroll",w,Hi),window.removeEventListener("resize",p,Hi),b=void 0,L.cancel(),g.cancel(),p.cancel())}return jt(()=>{L=uc(L),g=uc(g),p=uc($),v=t.media!==void 0?i.value.children[0]:c.value,v.onload=v.onloadstart=v.loadedmetadata=$,$(),v.style.display="initial",window.IntersectionObserver!==void 0?(y=new IntersectionObserver(S=>{(S[0].isIntersecting===!0?F:A)()}),y.observe(l.value)):F()}),qt(()=>{A(),y!==void 0&&y.disconnect(),v.onload=v.onloadstart=v.loadedmetadata=null}),()=>d("div",{ref:l,class:"q-parallax",style:{height:`${e.height}px`}},[d("div",{ref:i,class:"q-parallax__media absolute-full"},t.media!==void 0?t.media():[d("img",{ref:c,src:e.src})]),d("div",{class:"q-parallax__content absolute-full column flex-center"},t.content!==void 0?t.content({percentScrolled:r.value}):Ge(t.default))])}});function Sl(e,t=new WeakMap){if(Object(e)!==e)return e;if(t.has(e))return t.get(e);const n=e instanceof Date?new Date(e):e instanceof RegExp?new RegExp(e.source,e.flags):e instanceof Set?new Set:e instanceof Map?new Map:typeof e.constructor!="function"?Object.create(null):e.prototype!==void 0&&typeof e.prototype.constructor=="function"?e:new e.constructor;if(typeof e.constructor=="function"&&typeof e.valueOf=="function"){const r=e.valueOf();if(Object(r)!==r){const l=new e.constructor(r);return t.set(e,l),l}}return t.set(e,n),e instanceof Set?e.forEach(r=>{n.add(Sl(r,t))}):e instanceof Map&&e.forEach((r,l)=>{n.set(l,Sl(r,t))}),Object.assign(n,...Object.keys(e).map(r=>({[r]:Sl(e[r],t)})))}var M6=we({name:"QPopupEdit",props:{modelValue:{required:!0},title:String,buttons:Boolean,labelSet:String,labelCancel:String,color:{type:String,default:"primary"},validate:{type:Function,default:()=>!0},autoSave:Boolean,cover:{type:Boolean,default:!0},disable:Boolean},emits:["update:modelValue","save","cancel","beforeShow","show","beforeHide","hide"],setup(e,{slots:t,emit:n}){const{proxy:r}=Ve(),{$q:l}=r,i=X(null),c=X(""),u=X("");let v=!1;const m=f(()=>qn({initialValue:c.value,validate:e.validate,set:p,cancel:y,updatePosition:b},"value",()=>u.value,x=>{u.value=x}));function p(){e.validate(u.value)!==!1&&(g()===!0&&(n("save",u.value,c.value),n("update:modelValue",u.value)),w())}function y(){g()===!0&&n("cancel",u.value,c.value),w()}function b(){Tt(()=>{i.value.updatePosition()})}function g(){return Ao(u.value,c.value)===!1}function w(){v=!0,i.value.hide()}function L(){v=!1,c.value=Sl(e.modelValue),u.value=Sl(e.modelValue),n("beforeShow")}function $(){n("show")}function F(){v===!1&&g()===!0&&(e.autoSave===!0&&e.validate(u.value)===!0?(n("save",u.value,c.value),n("update:modelValue",u.value)):n("cancel",u.value,c.value)),n("beforeHide")}function A(){n("hide")}function S(){const x=t.default!==void 0?[].concat(t.default(m.value)):[];return e.title&&x.unshift(d("div",{class:"q-dialog__title q-mt-sm q-mb-sm"},e.title)),e.buttons===!0&&x.push(d("div",{class:"q-popup-edit__buttons row justify-center no-wrap"},[d(Rt,{flat:!0,color:e.color,label:e.labelCancel||l.lang.label.cancel,onClick:y}),d(Rt,{flat:!0,color:e.color,label:e.labelSet||l.lang.label.set,onClick:p})])),x}return Object.assign(r,{set:p,cancel:y,show(x){i.value!==null&&i.value.show(x)},hide(x){i.value!==null&&i.value.hide(x)},updatePosition:b}),()=>{if(e.disable!==!0)return d(Vl,{ref:i,class:"q-popup-edit",cover:e.cover,onBeforeShow:L,onShow:$,onBeforeHide:F,onHide:A,onEscapeKey:y},S)}}}),L6=we({name:"QPopupProxy",props:{...Xc,breakpoint:{type:[String,Number],default:450}},emits:["show","hide"],setup(e,{slots:t,emit:n,attrs:r}){const{proxy:l}=Ve(),{$q:i}=l,c=X(!1),u=X(null),v=f(()=>parseInt(e.breakpoint,10)),{canShow:m}=Zc({showing:c});function p(){return i.screen.widthy.value==="menu"?{maxHeight:"99vh"}:{});function g(L){c.value=!0,n("show",L)}function w(L){c.value=!1,y.value=p(),n("hide",L)}return _e(()=>p(),L=>{c.value!==!0&&(y.value=L)}),Object.assign(l,{show(L){m(L)===!0&&u.value.show(L)},hide(L){u.value.hide(L)},toggle(L){u.value.toggle(L)}}),qn(l,"currentComponent",()=>({type:y.value,ref:u.value})),()=>{const L={ref:u,...b.value,...r,onShow:g,onHide:w};let $;return y.value==="dialog"?$=Rl:($=Vl,Object.assign(L,{target:e.target,contextMenu:e.contextMenu,noParentEvent:!0,separateClosePopup:!0})),d($,L,t.default)}}});const A6={xs:2,sm:4,md:6,lg:10,xl:14};function Df(e,t,n){return{transform:t===!0?`translateX(${n.lang.rtl===!0?"-":""}100%) scale3d(${-e},1,1)`:`scale3d(${e},1,1)`}}var $m=we({name:"QLinearProgress",props:{...Ft,...ua,value:{type:Number,default:0},buffer:Number,color:String,trackColor:String,reverse:Boolean,stripe:Boolean,indeterminate:Boolean,query:Boolean,rounded:Boolean,animationSpeed:{type:[String,Number],default:2100},instantFeedback:Boolean},setup(e,{slots:t}){const{proxy:n}=Ve(),r=Vt(e,n.$q),l=ca(e,A6),i=f(()=>e.indeterminate===!0||e.query===!0),c=f(()=>e.reverse!==e.query),u=f(()=>({...l.value!==null?l.value:{},"--q-linear-progress-speed":`${e.animationSpeed}ms`})),v=f(()=>"q-linear-progress"+(e.color!==void 0?` text-${e.color}`:"")+(e.reverse===!0||e.query===!0?" q-linear-progress--reverse":"")+(e.rounded===!0?" rounded-borders":"")),m=f(()=>Df(e.buffer!==void 0?e.buffer:1,c.value,n.$q)),p=f(()=>`with${e.instantFeedback===!0?"out":""}-transition`),y=f(()=>`q-linear-progress__track absolute-full q-linear-progress__track--${p.value} q-linear-progress__track--${r.value===!0?"dark":"light"}`+(e.trackColor!==void 0?` bg-${e.trackColor}`:"")),b=f(()=>Df(i.value===!0?1:e.value,c.value,n.$q)),g=f(()=>`q-linear-progress__model absolute-full q-linear-progress__model--${p.value} q-linear-progress__model--${i.value===!0?"in":""}determinate`),w=f(()=>({width:`${100*e.value}%`})),L=f(()=>`q-linear-progress__stripe absolute-${e.reverse===!0?"right":"left"} q-linear-progress__stripe--${p.value}`);return()=>{const $=[d("div",{class:y.value,style:m.value}),d("div",{class:g.value,style:b.value})];return e.stripe===!0&&i.value===!1&&$.push(d("div",{class:L.value,style:w.value})),d("div",{class:v.value,style:u.value,role:"progressbar","aria-valuemin":0,"aria-valuemax":1,"aria-valuenow":e.indeterminate===!0?void 0:e.value},hn(t.default,$))}}});const Cr=40,cc=20;var P6=we({name:"QPullToRefresh",props:{color:String,bgColor:String,icon:String,noMouse:Boolean,disable:Boolean,scrollTarget:{default:void 0}},emits:["refresh"],setup(e,{slots:t,emit:n}){const{proxy:r}=Ve(),{$q:l}=r,i=X("pull"),c=X(0),u=X(!1),v=X(-Cr),m=X(!1),p=X({}),y=f(()=>({opacity:c.value,transform:`translateY(${v.value}px) rotate(${360*c.value}deg)`})),b=f(()=>"q-pull-to-refresh__puller row flex-center"+(m.value===!0?" q-pull-to-refresh__puller--animating":"")+(e.bgColor!==void 0?` bg-${e.bgColor}`:""));function g(M){if(M.isFinal===!0)return void(u.value===!0&&(u.value=!1,i.value==="pulled"?(i.value="refreshing",x({pos:cc}),$()):i.value==="pull"&&x({pos:-Cr,ratio:0})));if(m.value===!0||i.value==="refreshing")return!1;if(M.isFirst===!0){if(Ca(A)!==0||M.direction!=="down")return u.value===!0&&(u.value=!1,i.value="pull",x({pos:-Cr,ratio:0})),!1;u.value=!0;const{top:z,left:I}=F.getBoundingClientRect();p.value={top:z+"px",left:I+"px",width:window.getComputedStyle(F).getPropertyValue("width")}}$n(M.evt);const E=Math.min(140,Math.max(0,M.distance.y));v.value=E-Cr,c.value=Jt(E/(cc+Cr),0,1);const D=v.value>cc?"pulled":"pull";i.value!==D&&(i.value=D)}const w=f(()=>{const M={down:!0};return e.noMouse!==!0&&(M.mouse=!0),[[io,g,void 0,M]]}),L=f(()=>`q-pull-to-refresh__content${u.value===!0?" no-pointer-events":""}`);function $(){n("refresh",()=>{x({pos:-Cr,ratio:0},()=>{i.value="pull"})})}let F,A,S=null;function x({pos:M,ratio:E},D){m.value=!0,v.value=M,E!==void 0&&(c.value=E),S!==null&&clearTimeout(S),S=setTimeout(()=>{S=null,m.value=!1,D&&D()},300)}function P(){A=Qo(F,e.scrollTarget)}return _e(()=>e.scrollTarget,P),jt(()=>{F=r.$el,P()}),qt(()=>{S!==null&&clearTimeout(S)}),Object.assign(r,{trigger:$,updateScrollTarget:P}),()=>{const M=[d("div",{class:L.value},Ge(t.default)),d("div",{class:"q-pull-to-refresh__puller-container fixed row flex-center no-pointer-events z-top",style:p.value},[d("div",{class:b.value,style:y.value},[i.value!=="refreshing"?d(Et,{name:e.icon||l.iconSet.pullToRefresh.icon,color:e.color,size:"32px"}):d(So,{size:"24px",color:e.color})])])];return xo("div",{class:"q-pull-to-refresh"},M,"main",e.disable===!1,()=>w.value)}}});const wa={MIN:0,RANGE:1,MAX:2};var B6=we({name:"QRange",props:{...Lh,modelValue:{type:Object,default:()=>({min:null,max:null}),validator:e=>"min"in e&&"max"in e},dragRange:Boolean,dragOnlyRange:Boolean,leftLabelColor:String,leftLabelTextColor:String,rightLabelColor:String,rightLabelTextColor:String,leftLabelValue:[String,Number],rightLabelValue:[String,Number],leftThumbColor:String,rightThumbColor:String},emits:Ah,setup(e,{emit:t}){const{proxy:{$q:n}}=Ve(),{state:r,methods:l}=Ph({updateValue:D,updatePosition:I,getDragging:z,formAttrs:f(()=>({type:"hidden",name:e.name,value:`${e.modelValue.min}|${e.modelValue.max}`}))}),i=X(null),c=X(0),u=X(0),v=X({min:0,max:0});function m(){v.value.min=e.modelValue.min===null?r.innerMin.value:Jt(e.modelValue.min,r.innerMin.value,r.innerMax.value),v.value.max=e.modelValue.max===null?r.innerMax.value:Jt(e.modelValue.max,r.innerMin.value,r.innerMax.value)}_e(()=>`${e.modelValue.min}|${e.modelValue.max}|${r.innerMin.value}|${r.innerMax.value}`,m),m();const p=f(()=>l.convertModelToRatio(v.value.min)),y=f(()=>l.convertModelToRatio(v.value.max)),b=f(()=>r.active.value===!0?c.value:p.value),g=f(()=>r.active.value===!0?u.value:y.value),w=f(()=>{const H={[r.positionProp.value]:`${100*b.value}%`,[r.sizeProp.value]:`${100*(g.value-b.value)}%`};return e.selectionImg!==void 0&&(H.backgroundImage=`url(${e.selectionImg}) !important`),H}),L=f(()=>{if(r.editable.value!==!0)return{};if(n.platform.is.mobile===!0)return{onClick:l.onMobileClick};const H={onMousedown:l.onActivate};return e.dragRange!==!0&&e.dragOnlyRange!==!0||Object.assign(H,{onFocus:()=>{r.focus.value="both"},onBlur:l.onBlur,onKeydown:N,onKeyup:l.onKeyup}),H});function $(H){return n.platform.is.mobile!==!0&&r.editable.value===!0&&e.dragOnlyRange!==!0?{onFocus:()=>{r.focus.value=H},onBlur:l.onBlur,onKeydown:N,onKeyup:l.onKeyup}:{}}const F=f(()=>e.dragOnlyRange!==!0?r.tabindex.value:null),A=f(()=>n.platform.is.mobile===!0||!e.dragRange&&e.dragOnlyRange!==!0?null:r.tabindex.value),S=X(null),x=f(()=>$("min")),P=l.getThumbRenderFn({focusValue:"min",getNodeData:()=>({ref:S,key:"tmin",...x.value,tabindex:F.value}),ratio:b,label:f(()=>e.leftLabelValue!==void 0?e.leftLabelValue:v.value.min),thumbColor:f(()=>e.leftThumbColor||e.thumbColor||e.color),labelColor:f(()=>e.leftLabelColor||e.labelColor),labelTextColor:f(()=>e.leftLabelTextColor||e.labelTextColor)}),M=f(()=>$("max")),E=l.getThumbRenderFn({focusValue:"max",getNodeData:()=>({...M.value,key:"tmax",tabindex:F.value}),ratio:g,label:f(()=>e.rightLabelValue!==void 0?e.rightLabelValue:v.value.max),thumbColor:f(()=>e.rightThumbColor||e.thumbColor||e.color),labelColor:f(()=>e.rightLabelColor||e.labelColor),labelTextColor:f(()=>e.rightLabelTextColor||e.labelTextColor)});function D(H){v.value.min===e.modelValue.min&&v.value.max===e.modelValue.max||t("update:modelValue",{...v.value}),H===!0&&t("change",{...v.value})}function z(H){const{left:T,top:O,width:J,height:se}=i.value.getBoundingClientRect(),R=e.dragOnlyRange===!0?0:e.vertical===!0?S.value.offsetHeight/(2*se):S.value.offsetWidth/(2*J),oe={left:T,top:O,width:J,height:se,valueMin:v.value.min,valueMax:v.value.max,ratioMin:p.value,ratioMax:y.value},le=l.getDraggingRatio(H,oe);return e.dragOnlyRange!==!0&&le=T.ratioMin?(O={minR:T.ratioMin,maxR:J,min:T.valueMin,max:se},r.focus.value="max"):(O={minR:J,maxR:T.ratioMin,min:se,max:T.valueMin},r.focus.value="min");break;case wa.RANGE:const R=J-T.offsetRatio,oe=Jt(T.ratioMin+R,r.innerMinRatio.value,r.innerMaxRatio.value-T.rangeRatio),le=se-T.offsetModel,Se=Jt(T.valueMin+le,r.innerMin.value,r.innerMax.value-T.rangeValue);O={minR:oe,maxR:oe+T.rangeRatio,min:r.roundValueFn.value(Se),max:r.roundValueFn.value(Se+T.rangeValue)},r.focus.value="both";break}v.value=v.value.min===null||v.value.max===null?{min:O.min||e.min,max:O.max||e.max}:{min:O.min,max:O.max},e.snap!==!0||e.step===0?(c.value=O.minR,u.value=O.maxR):(c.value=l.convertModelToRatio(v.value.min),u.value=l.convertModelToRatio(v.value.max))}function N(H){if(!hd.includes(H.keyCode))return;bt(H);const T=([34,33].includes(H.keyCode)?10:1)*r.keyStep.value,O=([34,37,40].includes(H.keyCode)?-1:1)*(r.isReversed.value===!0?-1:1)*(e.vertical===!0?-1:1)*T;if(r.focus.value==="both"){const J=v.value.max-v.value.min,se=Jt(r.roundValueFn.value(v.value.min+O),r.innerMin.value,r.innerMax.value-J);v.value={min:se,max:r.roundValueFn.value(se+J)}}else{if(r.focus.value===!1)return;{const J=r.focus.value;v.value={...v.value,[J]:Jt(r.roundValueFn.value(v.value[J]+O),J==="min"?r.innerMin.value:v.value.min,J==="max"?r.innerMax.value:v.value.max)}}}D()}return()=>{const H=l.getContent(w,A,L,T=>{T.push(P(),E())});return d("div",{ref:i,class:"q-range "+r.classes.value+(e.modelValue.min===null||e.modelValue.max===null?" q-slider--no-value":""),...r.attributes.value,"aria-valuenow":e.modelValue.min+"|"+e.modelValue.max},H)}}}),E6=we({name:"QRating",props:{...ua,...ko,modelValue:{type:Number,required:!0},max:{type:[String,Number],default:5},icon:[String,Array],iconHalf:[String,Array],iconSelected:[String,Array],iconAriaLabel:[String,Array],color:[String,Array],colorHalf:[String,Array],colorSelected:[String,Array],noReset:Boolean,noDimming:Boolean,readonly:Boolean,disable:Boolean},emits:["update:modelValue"],setup(e,{slots:t,emit:n}){const{proxy:{$q:r}}=Ve(),l=ca(e),i=Il(e),c=La(i),u=X(0);let v={};const m=f(()=>e.readonly!==!0&&e.disable!==!0),p=f(()=>`q-rating row inline items-center q-rating--${m.value===!0?"":"non-"}editable`+(e.noDimming===!0?" q-rating--no-dimming":"")+(e.disable===!0?" disabled":"")+(e.color!==void 0&&Array.isArray(e.color)===!1?` text-${e.color}`:"")),y=f(()=>{const S=Array.isArray(e.icon)===!0?e.icon.length:0,x=Array.isArray(e.iconSelected)===!0?e.iconSelected.length:0,P=Array.isArray(e.iconHalf)===!0?e.iconHalf.length:0,M=Array.isArray(e.color)===!0?e.color.length:0,E=Array.isArray(e.colorSelected)===!0?e.colorSelected.length:0,D=Array.isArray(e.colorHalf)===!0?e.colorHalf.length:0;return{iconLen:S,icon:S>0?e.icon[S-1]:e.icon,selIconLen:x,selIcon:x>0?e.iconSelected[x-1]:e.iconSelected,halfIconLen:P,halfIcon:P>0?e.iconHalf[x-1]:e.iconHalf,colorLen:M,color:M>0?e.color[M-1]:e.color,selColorLen:E,selColor:E>0?e.colorSelected[E-1]:e.colorSelected,halfColorLen:D,halfColor:D>0?e.colorHalf[D-1]:e.colorHalf}}),b=f(()=>{if(typeof e.iconAriaLabel=="string"){const S=e.iconAriaLabel.length!==0?`${e.iconAriaLabel} `:"";return x=>`${S}${x}`}if(Array.isArray(e.iconAriaLabel)===!0){const S=e.iconAriaLabel.length;if(S>0)return x=>e.iconAriaLabel[Math.min(x,S)-1]}return(S,x)=>`${x} ${S}`}),g=f(()=>{const S=[],x=y.value,P=Math.ceil(e.modelValue),M=m.value===!0?0:null,E=e.iconHalf===void 0||P===e.modelValue?-1:P;for(let D=1;D<=e.max;D++){const z=u.value===0&&e.modelValue>=D||u.value>0&&u.value>=D,I=E===D&&u.value0&&(I===!0?P:e.modelValue)>=D&&u.value{const S={role:"radiogroup"};return e.disable===!0&&(S["aria-disabled"]="true"),e.readonly===!0&&(S["aria-readonly"]="true"),S});function L(S){if(m.value===!0){const x=Jt(parseInt(S,10),1,parseInt(e.max,10)),P=e.noReset!==!0&&e.modelValue===x?0:x;P!==e.modelValue&&n("update:modelValue",P),u.value=0}}function $(S){m.value===!0&&(u.value=S)}function F(S,x){switch(S.keyCode){case 13:case 32:return L(x),bt(S);case 37:case 40:return v[`rt${x-1}`]&&v[`rt${x-1}`].focus(),bt(S);case 39:case 38:return v[`rt${x+1}`]&&v[`rt${x+1}`].focus(),bt(S)}}function A(){u.value=0}return Ll(()=>{v={}}),()=>{const S=[];return g.value.forEach(({iconClass:x,name:P,attrs:M},E)=>{const D=E+1;S.push(d("div",{key:D,ref:z=>{v[`rt${D}`]=z},class:"q-rating__icon-container flex flex-center",...M,onClick(){L(D)},onMouseover(){$(D)},onMouseout:A,onFocus(){$(D)},onBlur:A,onKeyup(z){F(z,D)}},hn(t[`tip-${D}`],[d(Et,{class:x,name:P})])))}),e.name!==void 0&&e.disable!==!0&&c(S,"push"),d("div",{class:p.value,style:l.value,...w.value},S)}}}),F6=we({name:"QResponsive",props:bd,setup(e,{slots:t}){const n=yd(e);return()=>d("div",{class:"q-responsive"},[d("div",{class:"q-responsive__filler overflow-hidden"},[d("div",{style:n.value})]),d("div",{class:"q-responsive__content absolute-full fit"},Ge(t.default))])}});const Qf=["vertical","horizontal"],dc={vertical:{offset:"offsetY",scroll:"scrollTop",dir:"down",dist:"y"},horizontal:{offset:"offsetX",scroll:"scrollLeft",dir:"right",dist:"x"}},Uf={prevent:!0,mouse:!0,mouseAllDir:!0},jf=e=>e>=250?50:Math.ceil(e/5);var V6=we({name:"QScrollArea",props:{...Ft,thumbStyle:Object,verticalThumbStyle:Object,horizontalThumbStyle:Object,barStyle:[Array,String,Object],verticalBarStyle:[Array,String,Object],horizontalBarStyle:[Array,String,Object],contentStyle:[Array,String,Object],contentActiveStyle:[Array,String,Object],delay:{type:[String,Number],default:1e3},visible:{type:Boolean,default:null},tabindex:[String,Number],onScroll:Function},setup(e,{slots:t,emit:n}){const r=X(!1),l=X(!1),i=X(!1),c={vertical:X(0),horizontal:X(0)},u={vertical:{ref:X(null),position:X(0),size:X(0)},horizontal:{ref:X(null),position:X(0),size:X(0)}},{proxy:v}=Ve(),m=Vt(e,v.$q);let p,y=null;const b=X(null),g=f(()=>"q-scrollarea"+(m.value===!0?" q-scrollarea--dark":""));u.vertical.percentage=f(()=>{const R=u.vertical.size.value-c.vertical.value;if(R<=0)return 0;const oe=Jt(u.vertical.position.value/R,0,1);return Math.round(1e4*oe)/1e4}),u.vertical.thumbHidden=f(()=>(e.visible===null?i.value:e.visible)!==!0&&r.value===!1&&l.value===!1||u.vertical.size.value<=c.vertical.value+1),u.vertical.thumbStart=f(()=>u.vertical.percentage.value*(c.vertical.value-u.vertical.thumbSize.value)),u.vertical.thumbSize=f(()=>Math.round(Jt(c.vertical.value*c.vertical.value/u.vertical.size.value,jf(c.vertical.value),c.vertical.value))),u.vertical.style=f(()=>({...e.thumbStyle,...e.verticalThumbStyle,top:`${u.vertical.thumbStart.value}px`,height:`${u.vertical.thumbSize.value}px`})),u.vertical.thumbClass=f(()=>"q-scrollarea__thumb q-scrollarea__thumb--v absolute-right"+(u.vertical.thumbHidden.value===!0?" q-scrollarea__thumb--invisible":"")),u.vertical.barClass=f(()=>"q-scrollarea__bar q-scrollarea__bar--v absolute-right"+(u.vertical.thumbHidden.value===!0?" q-scrollarea__bar--invisible":"")),u.horizontal.percentage=f(()=>{const R=u.horizontal.size.value-c.horizontal.value;if(R<=0)return 0;const oe=Jt(Math.abs(u.horizontal.position.value)/R,0,1);return Math.round(1e4*oe)/1e4}),u.horizontal.thumbHidden=f(()=>(e.visible===null?i.value:e.visible)!==!0&&r.value===!1&&l.value===!1||u.horizontal.size.value<=c.horizontal.value+1),u.horizontal.thumbStart=f(()=>u.horizontal.percentage.value*(c.horizontal.value-u.horizontal.thumbSize.value)),u.horizontal.thumbSize=f(()=>Math.round(Jt(c.horizontal.value*c.horizontal.value/u.horizontal.size.value,jf(c.horizontal.value),c.horizontal.value))),u.horizontal.style=f(()=>({...e.thumbStyle,...e.horizontalThumbStyle,[v.$q.lang.rtl===!0?"right":"left"]:`${u.horizontal.thumbStart.value}px`,width:`${u.horizontal.thumbSize.value}px`})),u.horizontal.thumbClass=f(()=>"q-scrollarea__thumb q-scrollarea__thumb--h absolute-bottom"+(u.horizontal.thumbHidden.value===!0?" q-scrollarea__thumb--invisible":"")),u.horizontal.barClass=f(()=>"q-scrollarea__bar q-scrollarea__bar--h absolute-bottom"+(u.horizontal.thumbHidden.value===!0?" q-scrollarea__bar--invisible":""));const w=f(()=>u.vertical.thumbHidden.value===!0&&u.horizontal.thumbHidden.value===!0?e.contentStyle:e.contentActiveStyle),L=[[io,R=>{E(R,"vertical")},void 0,{vertical:!0,...Uf}]],$=[[io,R=>{E(R,"horizontal")},void 0,{horizontal:!0,...Uf}]];function F(){const R={};return Qf.forEach(oe=>{const le=u[oe];R[oe+"Position"]=le.position.value,R[oe+"Percentage"]=le.percentage.value,R[oe+"Size"]=le.size.value,R[oe+"ContainerSize"]=c[oe].value}),R}const A=Qr(()=>{const R=F();R.ref=v,n("scroll",R)},0);function S(R,oe,le){if(Qf.includes(R)===!1)return void console.error("[QScrollArea]: wrong first param of setScrollPosition (vertical/horizontal)");(R==="vertical"?Ir:Gu)(b.value,oe,le)}function x({height:R,width:oe}){let le=!1;c.vertical.value!==R&&(c.vertical.value=R,le=!0),c.horizontal.value!==oe&&(c.horizontal.value=oe,le=!0),le===!0&&N()}function P({position:R}){let oe=!1;u.vertical.position.value!==R.top&&(u.vertical.position.value=R.top,oe=!0),u.horizontal.position.value!==R.left&&(u.horizontal.position.value=R.left,oe=!0),oe===!0&&N()}function M({height:R,width:oe}){u.horizontal.size.value!==oe&&(u.horizontal.size.value=oe,N()),u.vertical.size.value!==R&&(u.vertical.size.value=R,N())}function E(R,oe){const le=u[oe];if(R.isFirst===!0){if(le.thumbHidden.value===!0)return;p=le.position.value,l.value=!0}else if(l.value!==!0)return;R.isFinal===!0&&(l.value=!1);const Se=dc[oe],k=c[oe].value,_=(le.size.value-k)/(k-le.thumbSize.value),j=R.distance[Se.dist],U=p+(R.direction===Se.dir?1:-1)*j*_;H(U,oe)}function D(R,oe){const le=u[oe];if(le.thumbHidden.value!==!0){const Se=R[dc[oe].offset];if(Sele.thumbStart.value+le.thumbSize.value){const k=Se-le.thumbSize.value/2;H(k/c[oe].value*le.size.value,oe)}le.ref.value!==null&&le.ref.value.dispatchEvent(new MouseEvent(R.type,R))}}function z(R){D(R,"vertical")}function I(R){D(R,"horizontal")}function N(){r.value=!0,y!==null&&clearTimeout(y),y=setTimeout(()=>{y=null,r.value=!1},e.delay),e.onScroll!==void 0&&A()}function H(R,oe){b.value[dc[oe].scroll]=R}let T=null;function O(){T!==null&&clearTimeout(T),T=setTimeout(()=>{T=null,i.value=!0},v.$q.platform.is.ios?50:0)}function J(){T!==null&&(clearTimeout(T),T=null),i.value=!1}let se=null;return _e(()=>v.$q.lang.rtl,R=>{b.value!==null&&Gu(b.value,Math.abs(u.horizontal.position.value)*(R===!0?-1:1))}),ia(()=>{se={top:u.vertical.position.value,left:u.horizontal.position.value}}),nr(()=>{if(se===null)return;const R=b.value;R!==null&&(Gu(R,se.left),Ir(R,se.top))}),qt(A.cancel),Object.assign(v,{getScrollTarget:()=>b.value,getScroll:F,getScrollPosition:()=>({top:u.vertical.position.value,left:u.horizontal.position.value}),getScrollPercentage:()=>({top:u.vertical.percentage.value,left:u.horizontal.percentage.value}),setScrollPosition:S,setScrollPercentage(R,oe,le){S(R,oe*(u[R].size.value-c[R].value)*(R==="horizontal"&&v.$q.lang.rtl===!0?-1:1),le)}}),()=>d("div",{class:g.value,onMouseenter:O,onMouseleave:J},[d("div",{ref:b,class:"q-scrollarea__container scroll relative-position fit hide-scrollbar",tabindex:e.tabindex!==void 0?e.tabindex:void 0},[d("div",{class:"q-scrollarea__content absolute",style:w.value},hn(t.default,[d(qa,{debounce:0,onResize:M})])),d(wd,{axis:"both",onScroll:P})]),d(qa,{debounce:0,onResize:x}),d("div",{class:u.vertical.barClass.value,style:[e.barStyle,e.verticalBarStyle],"aria-hidden":"true",onMousedown:z}),d("div",{class:u.horizontal.barClass.value,style:[e.barStyle,e.horizontalBarStyle],"aria-hidden":"true",onMousedown:I}),Bo(d("div",{ref:u.vertical.ref,class:u.vertical.thumbClass.value,style:u.vertical.style.value,"aria-hidden":"true"}),L),Bo(d("div",{ref:u.horizontal.ref,class:u.horizontal.thumbClass.value,style:u.horizontal.style.value,"aria-hidden":"true"}),$)])}});const Lo=1e3,I6=["start","center","end","start-force","center-force","end-force"],Tm=Array.prototype.filter,O6=window.getComputedStyle(document.body).overflowAnchor===void 0?pn:function(e,t){e!==null&&(e._qOverflowAnimationFrame!==void 0&&cancelAnimationFrame(e._qOverflowAnimationFrame),e._qOverflowAnimationFrame=requestAnimationFrame(()=>{if(e===null)return;e._qOverflowAnimationFrame=void 0;const n=e.children||[];Tm.call(n,l=>l.dataset&&l.dataset.qVsAnchor!==void 0).forEach(l=>{delete l.dataset.qVsAnchor});const r=n[t];r&&r.dataset&&(r.dataset.qVsAnchor="")}))};function Rr(e,t){return e+t}function vc(e,t,n,r,l,i,c,u){const v=e===window?document.scrollingElement||document.documentElement:e,m=l===!0?"offsetWidth":"offsetHeight",p={scrollStart:0,scrollViewSize:-c-u,scrollMaxSize:0,offsetStart:-c,offsetEnd:-u};if(l===!0?(e===window?(p.scrollStart=window.pageXOffset||window.scrollX||document.body.scrollLeft||0,p.scrollViewSize+=document.documentElement.clientWidth):(p.scrollStart=v.scrollLeft,p.scrollViewSize+=v.clientWidth),p.scrollMaxSize=v.scrollWidth,i===!0&&(p.scrollStart=($l===!0?p.scrollMaxSize-p.scrollViewSize:0)-p.scrollStart)):(e===window?(p.scrollStart=window.pageYOffset||window.scrollY||document.body.scrollTop||0,p.scrollViewSize+=document.documentElement.clientHeight):(p.scrollStart=v.scrollTop,p.scrollViewSize+=v.clientHeight),p.scrollMaxSize=v.scrollHeight),n!==null)for(let y=n.previousElementSibling;y!==null;y=y.previousElementSibling)y.classList.contains("q-virtual-scroll--skip")===!1&&(p.offsetStart+=y[m]);if(r!==null)for(let y=r.nextElementSibling;y!==null;y=y.nextElementSibling)y.classList.contains("q-virtual-scroll--skip")===!1&&(p.offsetEnd+=y[m]);if(t!==e){const y=v.getBoundingClientRect(),b=t.getBoundingClientRect();l===!0?(p.offsetStart+=b.left-y.left,p.offsetEnd-=b.width):(p.offsetStart+=b.top-y.top,p.offsetEnd-=b.height),e!==window&&(p.offsetStart+=p.scrollStart),p.offsetEnd+=p.scrollMaxSize-p.offsetStart}return p}function Wf(e,t,n,r){t==="end"&&(t=(e===window?document.body:e)[n===!0?"scrollWidth":"scrollHeight"]),e===window?n===!0?(r===!0&&(t=($l===!0?document.body.scrollWidth-document.documentElement.clientWidth:0)-t),window.scrollTo(t,window.pageYOffset||window.scrollY||document.body.scrollTop||0)):window.scrollTo(window.pageXOffset||window.scrollX||document.body.scrollLeft||0,t):n===!0?(r===!0&&(t=($l===!0?e.scrollWidth-e.offsetWidth:0)-t),e.scrollLeft=t):e.scrollTop=t}function hl(e,t,n,r){if(n>=r)return 0;const l=t.length,i=Math.floor(n/Lo),c=Math.floor((r-1)/Lo)+1;let u=e.slice(i,c).reduce(Rr,0);return n%Lo!==0&&(u-=t.slice(i*Lo,n).reduce(Rr,0)),r%Lo!==0&&r!==l&&(u-=t.slice(r,c*Lo).reduce(Rr,0)),u}const Mm={virtualScrollSliceSize:{type:[Number,String],default:null},virtualScrollSliceRatioBefore:{type:[Number,String],default:1},virtualScrollSliceRatioAfter:{type:[Number,String],default:1},virtualScrollItemSize:{type:[Number,String],default:24},virtualScrollStickySizeStart:{type:[Number,String],default:0},virtualScrollStickySizeEnd:{type:[Number,String],default:0},tableColspan:[Number,String]},Lm=Object.keys(Mm),Am={virtualScrollHorizontal:Boolean,onVirtualScroll:Function,...Mm};function Pm({virtualScrollLength:e,getVirtualScrollTarget:t,getVirtualScrollEl:n,virtualScrollItemSizeComputed:r}){const l=Ve(),{props:i,emit:c,proxy:u}=l,{$q:v}=u;let m,p,y,b,g=[];const w=X(0),L=X(0),$=X({}),F=X(null),A=X(null),S=X(null),x=X({from:0,to:0}),P=f(()=>i.tableColspan!==void 0?i.tableColspan:100);r===void 0&&(r=f(()=>i.virtualScrollItemSize));const M=f(()=>r.value+";"+i.virtualScrollHorizontal),E=f(()=>M.value+";"+i.virtualScrollSliceRatioBefore+";"+i.virtualScrollSliceRatioAfter);function D(){J(p,!0)}function z(k){J(k===void 0?p:k)}function I(k,_){const j=t();if(j==null||j.nodeType===8)return;const U=vc(j,n(),F.value,A.value,i.virtualScrollHorizontal,v.lang.rtl,i.virtualScrollStickySizeStart,i.virtualScrollStickySizeEnd);y!==U.scrollViewSize&&se(U.scrollViewSize),H(j,U,Math.min(e.value-1,Math.max(0,parseInt(k,10)||0)),0,I6.indexOf(_)>-1?_:p>-1&&k>p?"end":"start")}function N(){const k=t();if(k==null||k.nodeType===8)return;const _=vc(k,n(),F.value,A.value,i.virtualScrollHorizontal,v.lang.rtl,i.virtualScrollStickySizeStart,i.virtualScrollStickySizeEnd),j=e.value-1,U=_.scrollMaxSize-_.offsetStart-_.offsetEnd-L.value;if(m===_.scrollStart)return;if(_.scrollMaxSize<=0)return void H(k,_,0,0);y!==_.scrollViewSize&&se(_.scrollViewSize),T(x.value.from);const K=Math.floor(_.scrollMaxSize-Math.max(_.scrollViewSize,_.offsetEnd)-Math.min(b[j],_.scrollViewSize/2));if(K>0&&Math.ceil(_.scrollStart)>=K)return void H(k,_,j,_.scrollMaxSize-_.offsetEnd-g.reduce(Rr,0));let G=0,ne=_.scrollStart-_.offsetStart,W=ne;if(ne<=U&&ne+_.scrollViewSize>=w.value)ne-=w.value,G=x.value.from,W=ne;else for(let C=0;ne>=g[C]&&G0&&G-_.scrollViewSize?(G++,W=ne):W=b[G]+ne;H(k,_,G,W)}function H(k,_,j,U,K){const G=typeof K=="string"&&K.indexOf("-force")>-1,ne=G===!0?K.replace("-force",""):K,W=ne!==void 0?ne:"start";let C=Math.max(0,j-$.value[W]),Z=C+$.value.total;Z>e.value&&(Z=e.value,C=Math.max(0,Z-$.value.total)),m=_.scrollStart;const ce=C!==x.value.from||Z!==x.value.to;if(ce===!1&&ne===void 0)return void oe(j);const{activeElement:ge}=document,Ee=S.value;ce===!0&&Ee!==null&&Ee!==ge&&Ee.contains(ge)===!0&&(Ee.addEventListener("focusout",O),setTimeout(()=>{Ee!==null&&Ee.removeEventListener("focusout",O)})),O6(Ee,j-C);const Me=ne!==void 0?b.slice(C,j).reduce(Rr,0):0;if(ce===!0){const je=Z>=x.value.from&&C<=x.value.to?x.value.to:Z;x.value={from:C,to:je},w.value=hl(g,b,0,C),L.value=hl(g,b,Z,e.value),requestAnimationFrame(()=>{x.value.to!==Z&&m===_.scrollStart&&(x.value={from:x.value.from,to:Z},L.value=hl(g,b,Z,e.value))})}requestAnimationFrame(()=>{if(m!==_.scrollStart)return;ce===!0&&T(C);const je=b.slice(C,j).reduce(Rr,0),Ke=je+_.offsetStart+w.value,Oe=Ke+b[j];let ct=Ke+U;if(ne!==void 0){const Pt=je-Me,pt=_.scrollStart+Pt;ct=G!==!0&&ptC.classList&&C.classList.contains("q-virtual-scroll--skip")===!1),U=j.length,K=i.virtualScrollHorizontal===!0?C=>C.getBoundingClientRect().width:C=>C.offsetHeight;let G,ne,W=k;for(let C=0;C=U;G--)b[G]=j;const K=Math.floor((e.value-1)/Lo);g=[];for(let G=0;G<=K;G++){let ne=0;const W=Math.min((G+1)*Lo,e.value);for(let C=G*Lo;C=0?(T(x.value.from),Tt(()=>{I(k)})):le()}function se(k){if(k===void 0&&typeof window<"u"){const ne=t();ne!=null&&ne.nodeType!==8&&(k=vc(ne,n(),F.value,A.value,i.virtualScrollHorizontal,v.lang.rtl,i.virtualScrollStickySizeStart,i.virtualScrollStickySizeEnd).scrollViewSize)}y=k;const _=parseFloat(i.virtualScrollSliceRatioBefore)||0,j=parseFloat(i.virtualScrollSliceRatioAfter)||0,U=1+_+j,K=k===void 0||k<=0?1:Math.ceil(k/r.value),G=Math.max(1,K,Math.ceil((i.virtualScrollSliceSize>0?i.virtualScrollSliceSize:10)/U));$.value={total:Math.ceil(G*U),start:Math.ceil(G*_),center:Math.ceil(G*(.5+_)),end:Math.ceil(G*(1+_)),view:K}}function R(k,_){const j=i.virtualScrollHorizontal===!0?"width":"height",U={["--q-virtual-scroll-item-"+j]:r.value+"px"};return[k==="tbody"?d(k,{class:"q-virtual-scroll__padding",key:"before",ref:F},[d("tr",[d("td",{style:{[j]:`${w.value}px`,...U},colspan:P.value})])]):d(k,{class:"q-virtual-scroll__padding",key:"before",ref:F,style:{[j]:`${w.value}px`,...U}}),d(k,{class:"q-virtual-scroll__content",key:"content",ref:S,tabindex:-1},_.flat()),k==="tbody"?d(k,{class:"q-virtual-scroll__padding",key:"after",ref:A},[d("tr",[d("td",{style:{[j]:`${L.value}px`,...U},colspan:P.value})])]):d(k,{class:"q-virtual-scroll__padding",key:"after",ref:A,style:{[j]:`${L.value}px`,...U}})]}function oe(k){p!==k&&(i.onVirtualScroll!==void 0&&c("virtualScroll",{index:k,from:x.value.from,to:x.value.to-1,direction:k{se()}),_e(M,D),se();const le=Qr(N,v.platform.is.ios===!0?120:35);Ec(()=>{se()});let Se=!1;return ia(()=>{Se=!0}),nr(()=>{if(Se!==!0)return;const k=t();m!==void 0&&k!==void 0&&k!==null&&k.nodeType!==8?Wf(k,m,i.virtualScrollHorizontal,v.lang.rtl):I(p)}),qt(()=>{le.cancel()}),Object.assign(u,{scrollTo:I,reset:D,refresh:z}),{virtualScrollSliceRange:x,virtualScrollSliceSizeComputed:$,setVirtualScrollSize:se,onVirtualScrollEvt:le,localResetVirtualScroll:J,padVirtualScroll:R,scrollTo:I,reset:D,refresh:z}}const Kf=e=>["add","add-unique","toggle"].includes(e),R6=".*+?^${}()|[]\\",z6=Object.keys(Nl);var Bm=we({name:"QSelect",inheritAttrs:!1,props:{...Am,...ko,...Nl,modelValue:{required:!0},multiple:Boolean,displayValue:[String,Number],displayValueHtml:Boolean,dropdownIcon:String,options:{type:Array,default:()=>[]},optionValue:[Function,String],optionLabel:[Function,String],optionDisable:[Function,String],hideSelected:Boolean,hideDropdownIcon:Boolean,fillInput:Boolean,maxValues:[Number,String],optionsDense:Boolean,optionsDark:{type:Boolean,default:null},optionsSelectedClass:String,optionsHtml:Boolean,optionsCover:Boolean,menuShrink:Boolean,menuAnchor:String,menuSelf:String,menuOffset:Array,popupContentClass:String,popupContentStyle:[String,Array,Object],useInput:Boolean,useChips:Boolean,newValueMode:{type:String,validator:Kf},mapOptions:Boolean,emitValue:Boolean,inputDebounce:{type:[Number,String],default:500},inputClass:[Array,String,Object],inputStyle:[Array,String,Object],tabindex:{type:[String,Number],default:0},autocomplete:String,transitionShow:String,transitionHide:String,transitionDuration:[String,Number],behavior:{type:String,validator:e=>["default","menu","dialog"].includes(e),default:"default"},virtualScrollItemSize:{type:[Number,String],default:void 0},onNewValue:Function,onFilter:Function},emits:[...Ps,"add","remove","inputValue","newValue","keyup","keypress","keydown","filterAbort"],setup(e,{slots:t,emit:n}){const{proxy:r}=Ve(),{$q:l}=r,i=X(!1),c=X(!1),u=X(-1),v=X(""),m=X(!1),p=X(!1);let y,b,g,w,L,$,F,A=null,S=null,x=null;const P=X(null),M=X(null),E=X(null),D=X(null),z=X(null),I=nd(e),N=mm(Ne),H=f(()=>Array.isArray(e.options)?e.options.length:0),T=f(()=>e.virtualScrollItemSize===void 0?e.optionsDense===!0?24:48:e.virtualScrollItemSize),{virtualScrollSliceRange:O,virtualScrollSliceSizeComputed:J,localResetVirtualScroll:se,padVirtualScroll:R,onVirtualScrollEvt:oe,scrollTo:le,setVirtualScrollSize:Se}=Pm({virtualScrollLength:H,getVirtualScrollTarget:Hn,getVirtualScrollEl:Tn,virtualScrollItemSizeComputed:T}),k=Bs(),_=f(()=>{const ee=e.mapOptions===!0&&e.multiple!==!0,Ue=e.modelValue===void 0||e.modelValue===null&&ee!==!0?[]:e.multiple===!0&&Array.isArray(e.modelValue)?e.modelValue:[e.modelValue];if(e.mapOptions===!0&&Array.isArray(e.options)===!0){const He=e.mapOptions===!0&&y!==void 0?y:[],gt=Ue.map(Xt=>de(Xt,He));return e.modelValue===null&&ee===!0?gt.filter(Xt=>Xt!==null):gt}return Ue}),j=f(()=>{const ee={};return z6.forEach(Ue=>{const He=e[Ue];He!==void 0&&(ee[Ue]=He)}),ee}),U=f(()=>e.optionsDark===null?k.isDark.value:e.optionsDark),K=f(()=>tr(_.value)),G=f(()=>{let ee="q-field__input q-placeholder col";return e.hideSelected===!0||_.value.length===0?[ee,e.inputClass]:(ee+=" q-field__input--padding",e.inputClass===void 0?ee:[ee,e.inputClass])}),ne=f(()=>(e.virtualScrollHorizontal===!0?"q-virtual-scroll--horizontal":"")+(e.popupContentClass?" "+e.popupContentClass:"")),W=f(()=>H.value===0),C=f(()=>_.value.map(ee=>Be.value(ee)).join(", ")),Z=f(()=>e.displayValue!==void 0?e.displayValue:C.value),ce=f(()=>e.optionsHtml===!0?()=>!0:ee=>ee!=null&&ee.html===!0),ge=f(()=>e.displayValueHtml===!0||e.displayValue===void 0&&(e.optionsHtml===!0||_.value.some(ce.value))),Ee=f(()=>k.focused.value===!0?e.tabindex:-1),Me=f(()=>{const ee={tabindex:e.tabindex,role:"combobox","aria-label":e.label,"aria-readonly":e.readonly===!0?"true":"false","aria-autocomplete":e.useInput===!0?"list":"none","aria-expanded":i.value===!0?"true":"false","aria-controls":`${k.targetUid.value}_lb`};return u.value>=0&&(ee["aria-activedescendant"]=`${k.targetUid.value}_${u.value}`),ee}),je=f(()=>({id:`${k.targetUid.value}_lb`,role:"listbox","aria-multiselectable":e.multiple===!0?"true":"false"})),Ke=f(()=>_.value.map((ee,Ue)=>({index:Ue,opt:ee,html:ce.value(ee),selected:!0,removeAtIndex:kt,toggleOption:Dt,tabindex:Ee.value}))),Oe=f(()=>{if(H.value===0)return[];const{from:ee,to:Ue}=O.value;return e.options.slice(ee,Ue).map((He,gt)=>{const Xt=ve.value(He)===!0,Kt=Xe(He)===!0,xn=ee+gt,un={clickable:!0,active:Kt,activeClass:pt.value,manualFocus:!0,focused:!1,disable:Xt,tabindex:-1,dense:e.optionsDense,dark:U.value,role:"option","aria-selected":Kt===!0?"true":"false",id:`${k.targetUid.value}_${xn}`,onClick:()=>{Dt(He)}};return Xt!==!0&&(u.value===xn&&(un.focused=!0),l.platform.is.desktop===!0&&(un.onMousemove=()=>{i.value===!0&&me(xn)})),{index:xn,opt:He,html:ce.value(He),label:Be.value(He),selected:un.active,focused:un.focused,toggleOption:Dt,setOptionIndex:me,itemProps:un}})}),ct=f(()=>e.dropdownIcon!==void 0?e.dropdownIcon:l.iconSet.arrow.dropdown),Pt=f(()=>e.optionsCover===!1&&e.outlined!==!0&&e.standout!==!0&&e.borderless!==!0&&e.rounded!==!0),pt=f(()=>e.optionsSelectedClass!==void 0?e.optionsSelectedClass:e.color!==void 0?`text-${e.color}`:""),ke=f(()=>$e(e.optionValue,"value")),Be=f(()=>$e(e.optionLabel,"label")),ve=f(()=>$e(e.optionDisable,"disable")),ze=f(()=>_.value.map(ee=>ke.value(ee))),tt=f(()=>{const ee={onInput:Ne,onChange:N,onKeydown:tn,onKeyup:xt,onKeypress:Gt,onFocus:dt,onClick(Ue){b===!0&&dn(Ue)}};return ee.onCompositionstart=ee.onCompositionupdate=ee.onCompositionend=N,ee});function lt(ee){return e.emitValue===!0?ke.value(ee):ee}function nt(ee){if(ee>-1&&ee<_.value.length)if(e.multiple===!0){const Ue=e.modelValue.slice();n("remove",{index:ee,value:Ue.splice(ee,1)[0]}),n("update:modelValue",Ue)}else n("update:modelValue",null)}function kt(ee){nt(ee),k.focus()}function Ht(ee,Ue){const He=lt(ee);if(e.multiple!==!0)return e.fillInput===!0&&it(Be.value(ee),!0,!0),void n("update:modelValue",He);if(_.value.length===0)return n("add",{index:0,value:He}),void n("update:modelValue",e.multiple===!0?[He]:He);if(Ue===!0&&Xe(ee)===!0||e.maxValues!==void 0&&e.modelValue.length>=e.maxValues)return;const gt=e.modelValue.slice();n("add",{index:gt.length,value:He}),gt.push(He),n("update:modelValue",gt)}function Dt(ee,Ue){if(k.editable.value!==!0||ee===void 0||ve.value(ee)===!0)return;const He=ke.value(ee);if(e.multiple!==!0)return Ue!==!0&&(it(e.fillInput===!0?Be.value(ee):"",!0,!0),Uo()),M.value!==null&&M.value.focus(),void(_.value.length!==0&&Ao(ke.value(_.value[0]),He)===!0||n("update:modelValue",e.emitValue===!0?He:ee));if((b!==!0||m.value===!0)&&k.focus(),dt(),_.value.length===0){const Kt=e.emitValue===!0?He:ee;return n("add",{index:0,value:Kt}),void n("update:modelValue",e.multiple===!0?[Kt]:Kt)}const gt=e.modelValue.slice(),Xt=ze.value.findIndex(Kt=>Ao(Kt,He));if(Xt>-1)n("remove",{index:Xt,value:gt.splice(Xt,1)[0]});else{if(e.maxValues!==void 0&>.length>=e.maxValues)return;const Kt=e.emitValue===!0?He:ee;n("add",{index:gt.length,value:Kt}),gt.push(Kt)}n("update:modelValue",gt)}function me(ee){if(l.platform.is.desktop!==!0)return;const Ue=ee>-1&&ee=0?Be.value(e.options[He]):w,!0))}}function de(ee,Ue){const He=gt=>Ao(ke.value(gt),ee);return e.options.find(He)||Ue.find(He)||ee}function $e(ee,Ue){const He=ee!==void 0?ee:Ue;return typeof He=="function"?He:gt=>gt!==null&&typeof gt=="object"&&He in gt?gt[He]:gt}function Xe(ee){const Ue=ke.value(ee);return ze.value.find(He=>Ao(He,Ue))!==void 0}function dt(ee){e.useInput===!0&&M.value!==null&&(ee===void 0||M.value===ee.target&&ee.target.value===C.value)&&M.value.select()}function Qe(ee){wo(ee,27)===!0&&i.value===!0&&(dn(ee),Uo(),jo()),n("keyup",ee)}function xt(ee){const{value:Ue}=ee.target;if(ee.keyCode===void 0)if(ee.target.value="",A!==null&&(clearTimeout(A),A=null),S!==null&&(clearTimeout(S),S=null),jo(),typeof Ue=="string"&&Ue.length!==0){const He=Ue.toLocaleLowerCase(),gt=Kt=>{const xn=e.options.find(un=>Kt.value(un).toLocaleLowerCase()===He);return xn!==void 0&&(_.value.indexOf(xn)===-1?Dt(xn):Uo(),!0)},Xt=Kt=>{gt(ke)!==!0&>(Be)!==!0&&Kt!==!0&&mt(Ue,!0,()=>Xt(!0))};Xt()}else k.clearValue(ee);else Qe(ee)}function Gt(ee){n("keypress",ee)}function tn(ee){if(n("keydown",ee),or(ee)===!0)return;const Ue=v.value.length!==0&&(e.newValueMode!==void 0||e.onNewValue!==void 0),He=ee.shiftKey!==!0&&e.multiple!==!0&&(u.value>-1||Ue===!0);if(ee.keyCode===27)return void $n(ee);if(ee.keyCode===9&&He===!1)return void Ot();if(ee.target===void 0||ee.target.id!==k.targetUid.value||k.editable.value!==!0)return;if(ee.keyCode===40&&k.innerLoading.value!==!0&&i.value===!1)return bt(ee),void Wn();if(ee.keyCode===8&&(e.useChips===!0||e.clearable===!0)&&e.hideSelected!==!0&&v.value.length===0)return void(e.multiple===!0&&Array.isArray(e.modelValue)===!0?nt(e.modelValue.length-1):e.multiple!==!0&&e.modelValue!==null&&n("update:modelValue",null));ee.keyCode!==35&&ee.keyCode!==36||typeof v.value=="string"&&v.value.length!==0||(bt(ee),u.value=-1,Le(ee.keyCode===36?1:-1,e.multiple)),ee.keyCode!==33&&ee.keyCode!==34||J.value===void 0||(bt(ee),u.value=Math.max(-1,Math.min(H.value,u.value+(ee.keyCode===33?-1:1)*J.value.view)),Le(ee.keyCode===33?1:-1,e.multiple)),ee.keyCode!==38&&ee.keyCode!==40||(bt(ee),Le(ee.keyCode===38?-1:1,e.multiple));const gt=H.value;if(($===void 0||F0&&e.useInput!==!0&&ee.key!==void 0&&ee.key.length===1&&ee.altKey===!1&&ee.ctrlKey===!1&&ee.metaKey===!1&&(ee.keyCode!==32||$.length!==0)){i.value!==!0&&Wn(ee);const Xt=ee.key.toLocaleLowerCase(),Kt=$.length===1&&$[0]===Xt;F=Date.now()+1500,Kt===!1&&(bt(ee),$+=Xt);const xn=new RegExp("^"+$.split("").map(rr=>R6.indexOf(rr)>-1?"\\"+rr:rr).join(".*"),"i");let un=u.value;if(Kt===!0||un<0||xn.test(Be.value(e.options[un]))!==!0)do un=as(un+1,-1,gt-1);while(un!==u.value&&(ve.value(e.options[un])===!0||xn.test(Be.value(e.options[un]))!==!0));u.value!==un&&Tt(()=>{me(un),le(un),un>=0&&e.useInput===!0&&e.fillInput===!0&&Ze(Be.value(e.options[un]),!0)})}else if(ee.keyCode===13||ee.keyCode===32&&e.useInput!==!0&&$===""||ee.keyCode===9&&He!==!1)if(ee.keyCode!==9&&bt(ee),u.value>-1&&u.value{if(xn){if(Kf(xn)!==!0)return}else xn=e.newValueMode;if(it("",e.multiple!==!0,!0),Kt==null)return;(xn==="toggle"?Dt:Ht)(Kt,xn==="add-unique"),e.multiple!==!0&&(M.value!==null&&M.value.focus(),Uo())};if(e.onNewValue!==void 0?n("newValue",v.value,Xt):Xt(v.value),e.multiple!==!0)return}i.value===!0?Ot():k.innerLoading.value!==!0&&Wn()}}function Tn(){return b===!0?z.value:E.value!==null&&E.value.contentEl!==null?E.value.contentEl:void 0}function Hn(){return Tn()}function Co(){return e.hideSelected===!0?[]:t["selected-item"]!==void 0?Ke.value.map(ee=>t["selected-item"](ee)).slice():t.selected!==void 0?[].concat(t.selected()):e.useChips===!0?Ke.value.map((ee,Ue)=>d(vd,{key:"option-"+Ue,removable:k.editable.value===!0&&ve.value(ee.opt)!==!0,dense:!0,textColor:e.color,tabindex:Ee.value,onRemove(){ee.removeAtIndex(Ue)}},()=>d("span",{class:"ellipsis",[ee.html===!0?"innerHTML":"textContent"]:Be.value(ee.opt)}))):[d("span",{[ge.value===!0?"innerHTML":"textContent"]:Z.value})]}function uo(){if(W.value===!0)return t["no-option"]!==void 0?t["no-option"]({inputValue:v.value}):void 0;const ee=t.option!==void 0?t.option:He=>d(zl,{key:He.index,...He.itemProps},()=>d(la,()=>d(ms,()=>d("span",{[He.html===!0?"innerHTML":"textContent"]:He.label}))));let Ue=R("div",Oe.value.map(ee));return t["before-options"]!==void 0&&(Ue=t["before-options"]().concat(Ue)),hn(t["after-options"],Ue)}function be(ee,Ue){const He=Ue===!0?{...Me.value,...k.splitAttrs.attributes.value}:void 0,gt={ref:Ue===!0?M:void 0,key:"i_t",class:G.value,style:e.inputStyle,value:v.value!==void 0?v.value:"",type:"search",...He,id:Ue===!0?k.targetUid.value:void 0,maxlength:e.maxlength,autocomplete:e.autocomplete,"data-autofocus":ee===!0||e.autofocus===!0||void 0,disabled:e.disable===!0,readonly:e.readonly===!0,...tt.value};return ee!==!0&&b===!0&&(Array.isArray(gt.class)===!0?gt.class=[...gt.class,"no-pointer-events"]:gt.class+=" no-pointer-events"),d("input",gt)}function Ne(ee){A!==null&&(clearTimeout(A),A=null),S!==null&&(clearTimeout(S),S=null),ee&&ee.target&&ee.target.qComposing===!0||(Ze(ee.target.value||""),g=!0,w=v.value,k.focused.value===!0||b===!0&&m.value!==!0||k.focus(),e.onFilter!==void 0&&(A=setTimeout(()=>{A=null,mt(v.value)},e.inputDebounce)))}function Ze(ee,Ue){v.value!==ee&&(v.value=ee,Ue===!0||e.inputDebounce===0||e.inputDebounce==="0"?n("inputValue",ee):S=setTimeout(()=>{S=null,n("inputValue",ee)},e.inputDebounce))}function it(ee,Ue,He){g=He!==!0,e.useInput===!0&&(Ze(ee,!0),Ue!==!0&&He===!0||(w=ee),Ue!==!0&&mt(ee))}function mt(ee,Ue,He){if(e.onFilter===void 0||Ue!==!0&&k.focused.value!==!0)return;k.innerLoading.value===!0?n("filterAbort"):(k.innerLoading.value=!0,p.value=!0),ee!==""&&e.multiple!==!0&&_.value.length!==0&&g!==!0&&ee===Be.value(_.value[0])&&(ee="");const gt=setTimeout(()=>{i.value===!0&&(i.value=!1)},10);x!==null&&clearTimeout(x),x=gt,n("filter",ee,(Xt,Kt)=>{Ue!==!0&&k.focused.value!==!0||x!==gt||(clearTimeout(x),typeof Xt=="function"&&Xt(),p.value=!1,Tt(()=>{k.innerLoading.value=!1,k.editable.value===!0&&(Ue===!0?i.value===!0&&Uo():i.value===!0?Gr(!0):i.value=!0),typeof Kt=="function"&&Tt(()=>{Kt(r)}),typeof He=="function"&&Tt(()=>{He(r)})}))},()=>{k.focused.value===!0&&x===gt&&(clearTimeout(x),k.innerLoading.value=!1,p.value=!1),i.value===!0&&(i.value=!1)})}function nn(){return d(Vl,{ref:E,class:ne.value,style:e.popupContentStyle,modelValue:i.value,fit:e.menuShrink!==!0,cover:e.optionsCover===!0&&W.value!==!0&&e.useInput!==!0,anchor:e.menuAnchor,self:e.menuSelf,offset:e.menuOffset,dark:U.value,noParentEvent:!0,noRefocus:!0,noFocus:!0,square:Pt.value,transitionShow:e.transitionShow,transitionHide:e.transitionHide,transitionDuration:e.transitionDuration,separateClosePopup:!0,...je.value,onScrollPassive:oe,onBeforeShow:Dl,onBeforeHide:Q,onShow:ae},uo)}function Q(ee){Ql(ee),Ot()}function ae(){Se()}function fe(ee){dn(ee),M.value!==null&&M.value.focus(),m.value=!0,window.scrollTo(window.pageXOffset||window.scrollX||document.body.scrollLeft||0,0)}function Ie(ee){dn(ee),Tt(()=>{m.value=!1})}function Re(){const ee=[d(cm,{class:`col-auto ${k.fieldClass.value}`,...j.value,for:k.targetUid.value,dark:U.value,square:!0,loading:p.value,itemAligned:!1,filled:!0,stackLabel:v.value.length!==0,...k.splitAttrs.listeners.value,onFocus:fe,onBlur:Ie},{...t,rawControl:()=>k.getControl(!0),before:void 0,after:void 0})];return i.value===!0&&ee.push(d("div",{ref:z,class:ne.value+" scroll",style:e.popupContentStyle,...je.value,onClick:$n,onScrollPassive:oe},uo())),d(Rl,{ref:D,modelValue:c.value,position:e.useInput===!0?"top":void 0,transitionShow:L,transitionHide:e.transitionHide,transitionDuration:e.transitionDuration,onBeforeShow:Dl,onBeforeHide:Mt,onHide:et,onShow:yt},()=>d("div",{class:"q-select__dialog"+(U.value===!0?" q-select__dialog--dark q-dark":"")+(m.value===!0?" q-select__dialog--focused":"")},ee))}function Mt(ee){Ql(ee),D.value!==null&&D.value.__updateRefocusTarget(k.rootRef.value.querySelector(".q-field__native > [tabindex]:last-child")),k.focused.value=!1}function et(ee){Uo(),k.focused.value===!1&&n("blur",ee),jo()}function yt(){const ee=document.activeElement;ee!==null&&ee.id===k.targetUid.value||M.value===null||M.value===ee||M.value.focus(),Se()}function Ot(){c.value!==!0&&(u.value=-1,i.value===!0&&(i.value=!1),k.focused.value===!1&&(x!==null&&(clearTimeout(x),x=null),k.innerLoading.value===!0&&(n("filterAbort"),k.innerLoading.value=!1,p.value=!1)))}function Wn(ee){k.editable.value===!0&&(b===!0?(k.onControlFocusin(ee),c.value=!0,Tt(()=>{k.focus()})):k.focus(),e.onFilter!==void 0?mt(v.value):W.value===!0&&t["no-option"]===void 0||(i.value=!0))}function Uo(){c.value=!1,Ot()}function jo(){e.useInput===!0&&it(e.multiple!==!0&&e.fillInput===!0&&_.value.length!==0&&Be.value(_.value[0])||"",!0,!0)}function Gr(ee){let Ue=-1;if(ee===!0){if(_.value.length!==0){const He=ke.value(_.value[0]);Ue=e.options.findIndex(gt=>Ao(ke.value(gt),He))}se(Ue)}me(Ue)}function Vs(ee,Ue){i.value===!0&&k.innerLoading.value===!1&&(se(-1,!0),Tt(()=>{i.value===!0&&k.innerLoading.value===!1&&(ee>Ue?se():Gr(!0))}))}function Hl(){c.value===!1&&E.value!==null&&E.value.updatePosition()}function Dl(ee){ee!==void 0&&dn(ee),n("popupShow",ee),k.hasPopupOpen=!0,k.onControlFocusin(ee)}function Ql(ee){ee!==void 0&&dn(ee),n("popupHide",ee),k.hasPopupOpen=!1,k.onControlFocusout(ee)}function Ul(){b=(l.platform.is.mobile===!0||e.behavior==="dialog")&&e.behavior!=="menu"&&(e.useInput!==!0||t["no-option"]!==void 0||e.onFilter!==void 0||W.value===!1),L=l.platform.is.ios===!0&&b===!0&&e.useInput===!0?"fade":e.transitionShow}return _e(_,ee=>{y=ee,e.useInput===!0&&e.fillInput===!0&&e.multiple!==!0&&k.innerLoading.value!==!0&&(c.value!==!0&&i.value!==!0||K.value!==!0)&&(g!==!0&&jo(),c.value!==!0&&i.value!==!0||mt(""))},{immediate:!0}),_e(()=>e.fillInput,jo),_e(i,Gr),_e(H,Vs),Ll(Ul),gp(Hl),Ul(),qt(()=>{A!==null&&clearTimeout(A),S!==null&&clearTimeout(S)}),Object.assign(r,{showPopup:Wn,hidePopup:Uo,removeAtIndex:nt,add:Ht,toggleOption:Dt,getOptionIndex:()=>u.value,setOptionIndex:me,moveOptionSelection:Le,filter:mt,updateMenuPosition:Hl,updateInputValue:it,isOptionSelected:Xe,getEmittingOptionValue:lt,isOptionDisabled:(...ee)=>ve.value.apply(null,ee)===!0,getOptionValue:(...ee)=>ke.value.apply(null,ee),getOptionLabel:(...ee)=>Be.value.apply(null,ee)}),Object.assign(k,{innerValue:_,fieldClass:f(()=>`q-select q-field--auto-height q-select--with${e.useInput!==!0?"out":""}-input q-select--with${e.useChips!==!0?"out":""}-chips q-select--${e.multiple===!0?"multiple":"single"}`),inputRef:P,targetRef:M,hasValue:K,showPopup:Wn,floatingLabel:f(()=>e.hideSelected!==!0&&K.value===!0||typeof v.value=="number"||v.value.length!==0||tr(e.displayValue)),getControlChild:()=>{if(k.editable.value!==!1&&(c.value===!0||W.value!==!0||t["no-option"]!==void 0))return b===!0?Re():nn();k.hasPopupOpen===!0&&(k.hasPopupOpen=!1)},controlEvents:{onFocusin(ee){k.onControlFocusin(ee)},onFocusout(ee){k.onControlFocusout(ee,()=>{jo(),Ot()})},onClick(ee){if($n(ee),b!==!0&&i.value===!0)return Ot(),void(M.value!==null&&M.value.focus());Wn(ee)}},getControl:ee=>{const Ue=Co(),He=ee===!0||c.value!==!0||b!==!0;if(e.useInput===!0)Ue.push(be(ee,He));else if(k.editable.value===!0){const Xt=He===!0?Me.value:void 0;Ue.push(d("input",{ref:He===!0?M:void 0,key:"d_t",class:"q-select__focus-target",id:He===!0?k.targetUid.value:void 0,value:Z.value,readonly:!0,"data-autofocus":ee===!0||e.autofocus===!0||void 0,...Xt,onKeydown:tn,onKeyup:Qe,onKeypress:Gt})),He===!0&&typeof e.autocomplete=="string"&&e.autocomplete.length!==0&&Ue.push(d("input",{class:"q-select__autocomplete-input",autocomplete:e.autocomplete,tabindex:-1,onKeyup:xt}))}if(I.value!==void 0&&e.disable!==!0&&ze.value.length!==0){const Xt=ze.value.map(Kt=>d("option",{value:Kt,selected:!0}));Ue.push(d("select",{class:"hidden",name:I.value,multiple:e.multiple},Xt))}const gt=e.useInput===!0||He!==!0?void 0:k.splitAttrs.attributes.value;return d("div",{class:"q-field__native row items-center",...gt,...k.splitAttrs.listeners.value},Ue)},getInnerAppend:()=>e.loading!==!0&&p.value!==!0&&e.hideDropdownIcon!==!0?[d(Et,{class:"q-select__dropdown-icon"+(i.value===!0?" rotate-180":""),name:ct.value})]:null}),Es(k)}});const N6=["text","rect","circle","QBtn","QBadge","QChip","QToolbar","QCheckbox","QRadio","QToggle","QSlider","QRange","QInput","QAvatar"],H6=["wave","pulse","pulse-x","pulse-y","fade","blink","none"];var D6=we({name:"QSkeleton",props:{...Ft,tag:{type:String,default:"div"},type:{type:String,validator:e=>N6.includes(e),default:"rect"},animation:{type:String,validator:e=>H6.includes(e),default:"wave"},animationSpeed:{type:[String,Number],default:1500},square:Boolean,bordered:Boolean,size:String,width:String,height:String},setup(e,{slots:t}){const n=Ve(),r=Vt(e,n.proxy.$q),l=f(()=>{const c=e.size!==void 0?[e.size,e.size]:[e.width,e.height];return{"--q-skeleton-speed":`${e.animationSpeed}ms`,width:c[0],height:c[1]}}),i=f(()=>`q-skeleton q-skeleton--${r.value===!0?"dark":"light"} q-skeleton--type-${e.type}`+(e.animation!=="none"?` q-skeleton--anim q-skeleton--anim-${e.animation}`:"")+(e.square===!0?" q-skeleton--square":"")+(e.bordered===!0?" q-skeleton--bordered":""));return()=>d(e.tag,{class:i.value,style:l.value},Ge(t.default))}});const Yf=[["left","center","start","width"],["right","center","end","width"],["top","start","center","height"],["bottom","end","center","height"]];var Q6=we({name:"QSlideItem",props:{...Ft,leftColor:String,rightColor:String,topColor:String,bottomColor:String,onSlide:Function},emits:["action","top","right","bottom","left"],setup(e,{slots:t,emit:n}){const{proxy:r}=Ve(),{$q:l}=r,i=Vt(e,l),{getCacheWithFn:c}=Ol(),u=X(null);let v=null,m={},p={},y={};const b=f(()=>l.lang.rtl===!0?{left:"right",right:"left"}:{left:"left",right:"right"}),g=f(()=>"q-slide-item q-item-type overflow-hidden"+(i.value===!0?" q-slide-item--dark q-dark":""));function w(){u.value.style.transform="translate(0,0)"}function L(F,A,S){e.onSlide!==void 0&&n("slide",{side:F,ratio:A,isReset:S})}function $(F){const A=u.value;if(F.isFirst)m={dir:null,size:{left:0,right:0,top:0,bottom:0},scale:0},A.classList.add("no-transition"),Yf.forEach(M=>{if(t[M[0]]!==void 0){const E=y[M[0]];E.style.transform="scale(1)",m.size[M[0]]=E.getBoundingClientRect()[M[3]]}}),m.axis=F.direction==="up"||F.direction==="down"?"Y":"X";else{if(F.isFinal)return A.classList.remove("no-transition"),void(m.scale===1?(A.style.transform=`translate${m.axis}(${100*m.dir}%)`,v!==null&&clearTimeout(v),v=setTimeout(()=>{v=null,n(m.showing,{reset:w}),n("action",{side:m.showing,reset:w})},230)):(A.style.transform="translate(0,0)",L(m.showing,0,!0)));F.direction=m.axis==="X"?F.offset.x<0?"left":"right":F.offset.y<0?"up":"down"}if(t.left===void 0&&F.direction===b.value.right||t.right===void 0&&F.direction===b.value.left||t.top===void 0&&F.direction==="down"||t.bottom===void 0&&F.direction==="up")return void(A.style.transform="translate(0,0)");let S,x,P;m.axis==="X"?(x=F.direction==="left"?-1:1,S=x===1?b.value.left:b.value.right,P=F.distance.x):(x=F.direction==="up"?-2:2,S=x===2?"top":"bottom",P=F.distance.y),m.dir!==null&&Math.abs(x)!==Math.abs(m.dir)||(m.dir!==x&&(["left","right","top","bottom"].forEach(M=>{p[M]&&(p[M].style.visibility=S===M?"visible":"hidden")}),m.showing=S,m.dir=x),m.scale=Math.max(0,Math.min(1,(P-40)/m.size[S])),A.style.transform=`translate${m.axis}(${P*x/Math.abs(x)}px)`,y[S].style.transform=`scale(${m.scale})`,L(S,m.scale,!1))}return Ll(()=>{p={},y={}}),qt(()=>{v!==null&&clearTimeout(v)}),Object.assign(r,{reset:w}),()=>{const F=[],A={left:t[b.value.right]!==void 0,right:t[b.value.left]!==void 0,up:t.bottom!==void 0,down:t.top!==void 0},S=Object.keys(A).filter(P=>A[P]===!0);Yf.forEach(P=>{const M=P[0];t[M]!==void 0&&F.push(d("div",{ref:E=>{p[M]=E},class:`q-slide-item__${M} absolute-full row no-wrap items-${P[1]} justify-${P[2]}`+(e[M+"Color"]!==void 0?` bg-${e[M+"Color"]}`:"")},[d("div",{ref:E=>{y[M]=E}},t[M]())]))});const x=d("div",{key:`${S.length===0?"only-":""} content`,ref:u,class:"q-slide-item__content"},Ge(t.default));return S.length===0?F.push(x):F.push(Bo(x,c("dir#"+S.join(""),()=>{const P={prevent:!0,stop:!0,mouse:!0};return S.forEach(M=>{P[M]=!0}),[[io,$,void 0,P]]}))),d("div",{class:g.value},F)}}});const U6=d("div",{class:"q-space"});var j6=we({name:"QSpace",setup(){return()=>U6}});const W6=[d("g",{transform:"matrix(1 0 0 -1 0 80)"},[d("rect",{width:"10",height:"20",rx:"3"},[d("animate",{attributeName:"height",begin:"0s",dur:"4.3s",values:"20;45;57;80;64;32;66;45;64;23;66;13;64;56;34;34;2;23;76;79;20",calcMode:"linear",repeatCount:"indefinite"})]),d("rect",{x:"15",width:"10",height:"80",rx:"3"},[d("animate",{attributeName:"height",begin:"0s",dur:"2s",values:"80;55;33;5;75;23;73;33;12;14;60;80",calcMode:"linear",repeatCount:"indefinite"})]),d("rect",{x:"30",width:"10",height:"50",rx:"3"},[d("animate",{attributeName:"height",begin:"0s",dur:"1.4s",values:"50;34;78;23;56;23;34;76;80;54;21;50",calcMode:"linear",repeatCount:"indefinite"})]),d("rect",{x:"45",width:"10",height:"30",rx:"3"},[d("animate",{attributeName:"height",begin:"0s",dur:"2s",values:"30;45;13;80;56;72;45;76;34;23;67;30",calcMode:"linear",repeatCount:"indefinite"})])])];var K6=we({name:"QSpinnerAudio",props:mn,setup(e){const{cSize:t,classes:n}=gn(e);return()=>d("svg",{class:n.value,fill:"currentColor",width:t.value,height:t.value,viewBox:"0 0 55 80",xmlns:"http://www.w3.org/2000/svg"},W6)}});const Y6=[d("g",{transform:"translate(1 1)","stroke-width":"2",fill:"none","fill-rule":"evenodd"},[d("circle",{cx:"5",cy:"50",r:"5"},[d("animate",{attributeName:"cy",begin:"0s",dur:"2.2s",values:"50;5;50;50",calcMode:"linear",repeatCount:"indefinite"}),d("animate",{attributeName:"cx",begin:"0s",dur:"2.2s",values:"5;27;49;5",calcMode:"linear",repeatCount:"indefinite"})]),d("circle",{cx:"27",cy:"5",r:"5"},[d("animate",{attributeName:"cy",begin:"0s",dur:"2.2s",from:"5",to:"5",values:"5;50;50;5",calcMode:"linear",repeatCount:"indefinite"}),d("animate",{attributeName:"cx",begin:"0s",dur:"2.2s",from:"27",to:"27",values:"27;49;5;27",calcMode:"linear",repeatCount:"indefinite"})]),d("circle",{cx:"49",cy:"50",r:"5"},[d("animate",{attributeName:"cy",begin:"0s",dur:"2.2s",values:"50;50;5;50",calcMode:"linear",repeatCount:"indefinite"}),d("animate",{attributeName:"cx",from:"49",to:"49",begin:"0s",dur:"2.2s",values:"49;5;27;49",calcMode:"linear",repeatCount:"indefinite"})])])];var G6=we({name:"QSpinnerBall",props:mn,setup(e){const{cSize:t,classes:n}=gn(e);return()=>d("svg",{class:n.value,stroke:"currentColor",width:t.value,height:t.value,viewBox:"0 0 57 57",xmlns:"http://www.w3.org/2000/svg"},Y6)}});const X6=[d("rect",{y:"10",width:"15",height:"120",rx:"6"},[d("animate",{attributeName:"height",begin:"0.5s",dur:"1s",values:"120;110;100;90;80;70;60;50;40;140;120",calcMode:"linear",repeatCount:"indefinite"}),d("animate",{attributeName:"y",begin:"0.5s",dur:"1s",values:"10;15;20;25;30;35;40;45;50;0;10",calcMode:"linear",repeatCount:"indefinite"})]),d("rect",{x:"30",y:"10",width:"15",height:"120",rx:"6"},[d("animate",{attributeName:"height",begin:"0.25s",dur:"1s",values:"120;110;100;90;80;70;60;50;40;140;120",calcMode:"linear",repeatCount:"indefinite"}),d("animate",{attributeName:"y",begin:"0.25s",dur:"1s",values:"10;15;20;25;30;35;40;45;50;0;10",calcMode:"linear",repeatCount:"indefinite"})]),d("rect",{x:"60",width:"15",height:"140",rx:"6"},[d("animate",{attributeName:"height",begin:"0s",dur:"1s",values:"120;110;100;90;80;70;60;50;40;140;120",calcMode:"linear",repeatCount:"indefinite"}),d("animate",{attributeName:"y",begin:"0s",dur:"1s",values:"10;15;20;25;30;35;40;45;50;0;10",calcMode:"linear",repeatCount:"indefinite"})]),d("rect",{x:"90",y:"10",width:"15",height:"120",rx:"6"},[d("animate",{attributeName:"height",begin:"0.25s",dur:"1s",values:"120;110;100;90;80;70;60;50;40;140;120",calcMode:"linear",repeatCount:"indefinite"}),d("animate",{attributeName:"y",begin:"0.25s",dur:"1s",values:"10;15;20;25;30;35;40;45;50;0;10",calcMode:"linear",repeatCount:"indefinite"})]),d("rect",{x:"120",y:"10",width:"15",height:"120",rx:"6"},[d("animate",{attributeName:"height",begin:"0.5s",dur:"1s",values:"120;110;100;90;80;70;60;50;40;140;120",calcMode:"linear",repeatCount:"indefinite"}),d("animate",{attributeName:"y",begin:"0.5s",dur:"1s",values:"10;15;20;25;30;35;40;45;50;0;10",calcMode:"linear",repeatCount:"indefinite"})])];var Z6=we({name:"QSpinnerBars",props:mn,setup(e){const{cSize:t,classes:n}=gn(e);return()=>d("svg",{class:n.value,fill:"currentColor",width:t.value,height:t.value,viewBox:"0 0 135 140",xmlns:"http://www.w3.org/2000/svg"},X6)}});const J6=[d("rect",{x:"25",y:"25",width:"50",height:"50",fill:"none","stroke-width":"4",stroke:"currentColor"},[d("animateTransform",{id:"spinnerBox",attributeName:"transform",type:"rotate",from:"0 50 50",to:"180 50 50",dur:"0.5s",begin:"rectBox.end"})]),d("rect",{x:"27",y:"27",width:"46",height:"50",fill:"currentColor"},[d("animate",{id:"rectBox",attributeName:"height",begin:"0s;spinnerBox.end",dur:"1.3s",from:"50",to:"0",fill:"freeze"})])];var eT=we({name:"QSpinnerBox",props:mn,setup(e){const{cSize:t,classes:n}=gn(e);return()=>d("svg",{class:n.value,width:t.value,height:t.value,viewBox:"0 0 100 100",preserveAspectRatio:"xMidYMid",xmlns:"http://www.w3.org/2000/svg"},J6)}});const tT=[d("circle",{cx:"50",cy:"50",r:"48",fill:"none","stroke-width":"4","stroke-miterlimit":"10",stroke:"currentColor"}),d("line",{"stroke-linecap":"round","stroke-width":"4","stroke-miterlimit":"10",stroke:"currentColor",x1:"50",y1:"50",x2:"85",y2:"50.5"},[d("animateTransform",{attributeName:"transform",type:"rotate",from:"0 50 50",to:"360 50 50",dur:"2s",repeatCount:"indefinite"})]),d("line",{"stroke-linecap":"round","stroke-width":"4","stroke-miterlimit":"10",stroke:"currentColor",x1:"50",y1:"50",x2:"49.5",y2:"74"},[d("animateTransform",{attributeName:"transform",type:"rotate",from:"0 50 50",to:"360 50 50",dur:"15s",repeatCount:"indefinite"})])];var nT=we({name:"QSpinnerClock",props:mn,setup(e){const{cSize:t,classes:n}=gn(e);return()=>d("svg",{class:n.value,width:t.value,height:t.value,viewBox:"0 0 100 100",preserveAspectRatio:"xMidYMid",xmlns:"http://www.w3.org/2000/svg"},tT)}});const oT=[d("rect",{x:"0",y:"0",width:"100",height:"100",fill:"none"}),d("path",{d:"M78,19H22c-6.6,0-12,5.4-12,12v31c0,6.6,5.4,12,12,12h37.2c0.4,3,1.8,5.6,3.7,7.6c2.4,2.5,5.1,4.1,9.1,4 c-1.4-2.1-2-7.2-2-10.3c0-0.4,0-0.8,0-1.3h8c6.6,0,12-5.4,12-12V31C90,24.4,84.6,19,78,19z",fill:"currentColor"}),d("circle",{cx:"30",cy:"47",r:"5",fill:"#fff"},[d("animate",{attributeName:"opacity",from:"0",to:"1",values:"0;1;1",keyTimes:"0;0.2;1",dur:"1s",repeatCount:"indefinite"})]),d("circle",{cx:"50",cy:"47",r:"5",fill:"#fff"},[d("animate",{attributeName:"opacity",from:"0",to:"1",values:"0;0;1;1",keyTimes:"0;0.2;0.4;1",dur:"1s",repeatCount:"indefinite"})]),d("circle",{cx:"70",cy:"47",r:"5",fill:"#fff"},[d("animate",{attributeName:"opacity",from:"0",to:"1",values:"0;0;1;1",keyTimes:"0;0.4;0.6;1",dur:"1s",repeatCount:"indefinite"})])];var aT=we({name:"QSpinnerComment",props:mn,setup(e){const{cSize:t,classes:n}=gn(e);return()=>d("svg",{class:n.value,width:t.value,height:t.value,xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 100 100",preserveAspectRatio:"xMidYMid"},oT)}});const rT=[d("rect",{x:"0",y:"0",width:"100",height:"100",fill:"none"}),d("g",{transform:"translate(25 25)"},[d("rect",{x:"-20",y:"-20",width:"40",height:"40",fill:"currentColor",opacity:"0.9"},[d("animateTransform",{attributeName:"transform",type:"scale",from:"1.5",to:"1",repeatCount:"indefinite",begin:"0s",dur:"1s",calcMode:"spline",keySplines:"0.2 0.8 0.2 0.8",keyTimes:"0;1"})])]),d("g",{transform:"translate(75 25)"},[d("rect",{x:"-20",y:"-20",width:"40",height:"40",fill:"currentColor",opacity:"0.8"},[d("animateTransform",{attributeName:"transform",type:"scale",from:"1.5",to:"1",repeatCount:"indefinite",begin:"0.1s",dur:"1s",calcMode:"spline",keySplines:"0.2 0.8 0.2 0.8",keyTimes:"0;1"})])]),d("g",{transform:"translate(25 75)"},[d("rect",{x:"-20",y:"-20",width:"40",height:"40",fill:"currentColor",opacity:"0.7"},[d("animateTransform",{attributeName:"transform",type:"scale",from:"1.5",to:"1",repeatCount:"indefinite",begin:"0.3s",dur:"1s",calcMode:"spline",keySplines:"0.2 0.8 0.2 0.8",keyTimes:"0;1"})])]),d("g",{transform:"translate(75 75)"},[d("rect",{x:"-20",y:"-20",width:"40",height:"40",fill:"currentColor",opacity:"0.6"},[d("animateTransform",{attributeName:"transform",type:"scale",from:"1.5",to:"1",repeatCount:"indefinite",begin:"0.2s",dur:"1s",calcMode:"spline",keySplines:"0.2 0.8 0.2 0.8",keyTimes:"0;1"})])])];var lT=we({name:"QSpinnerCube",props:mn,setup(e){const{cSize:t,classes:n}=gn(e);return()=>d("svg",{class:n.value,width:t.value,height:t.value,xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 100 100",preserveAspectRatio:"xMidYMid"},rT)}});const iT=[d("circle",{cx:"15",cy:"15",r:"15"},[d("animate",{attributeName:"r",from:"15",to:"15",begin:"0s",dur:"0.8s",values:"15;9;15",calcMode:"linear",repeatCount:"indefinite"}),d("animate",{attributeName:"fill-opacity",from:"1",to:"1",begin:"0s",dur:"0.8s",values:"1;.5;1",calcMode:"linear",repeatCount:"indefinite"})]),d("circle",{cx:"60",cy:"15",r:"9","fill-opacity":".3"},[d("animate",{attributeName:"r",from:"9",to:"9",begin:"0s",dur:"0.8s",values:"9;15;9",calcMode:"linear",repeatCount:"indefinite"}),d("animate",{attributeName:"fill-opacity",from:".5",to:".5",begin:"0s",dur:"0.8s",values:".5;1;.5",calcMode:"linear",repeatCount:"indefinite"})]),d("circle",{cx:"105",cy:"15",r:"15"},[d("animate",{attributeName:"r",from:"15",to:"15",begin:"0s",dur:"0.8s",values:"15;9;15",calcMode:"linear",repeatCount:"indefinite"}),d("animate",{attributeName:"fill-opacity",from:"1",to:"1",begin:"0s",dur:"0.8s",values:"1;.5;1",calcMode:"linear",repeatCount:"indefinite"})])];var sT=we({name:"QSpinnerDots",props:mn,setup(e){const{cSize:t,classes:n}=gn(e);return()=>d("svg",{class:n.value,fill:"currentColor",width:t.value,height:t.value,viewBox:"0 0 120 30",xmlns:"http://www.w3.org/2000/svg"},iT)}});const uT=[d("g",{transform:"translate(20 50)"},[d("rect",{x:"-10",y:"-30",width:"20",height:"60",fill:"currentColor",opacity:"0.6"},[d("animateTransform",{attributeName:"transform",type:"scale",from:"2",to:"1",begin:"0s",repeatCount:"indefinite",dur:"1s",calcMode:"spline",keySplines:"0.1 0.9 0.4 1",keyTimes:"0;1",values:"2;1"})])]),d("g",{transform:"translate(50 50)"},[d("rect",{x:"-10",y:"-30",width:"20",height:"60",fill:"currentColor",opacity:"0.8"},[d("animateTransform",{attributeName:"transform",type:"scale",from:"2",to:"1",begin:"0.1s",repeatCount:"indefinite",dur:"1s",calcMode:"spline",keySplines:"0.1 0.9 0.4 1",keyTimes:"0;1",values:"2;1"})])]),d("g",{transform:"translate(80 50)"},[d("rect",{x:"-10",y:"-30",width:"20",height:"60",fill:"currentColor",opacity:"0.9"},[d("animateTransform",{attributeName:"transform",type:"scale",from:"2",to:"1",begin:"0.2s",repeatCount:"indefinite",dur:"1s",calcMode:"spline",keySplines:"0.1 0.9 0.4 1",keyTimes:"0;1",values:"2;1"})])])];var cT=we({name:"QSpinnerFacebook",props:mn,setup(e){const{cSize:t,classes:n}=gn(e);return()=>d("svg",{class:n.value,width:t.value,height:t.value,viewBox:"0 0 100 100",xmlns:"http://www.w3.org/2000/svg",preserveAspectRatio:"xMidYMid"},uT)}});const dT=[d("g",{transform:"translate(-20,-20)"},[d("path",{d:"M79.9,52.6C80,51.8,80,50.9,80,50s0-1.8-0.1-2.6l-5.1-0.4c-0.3-2.4-0.9-4.6-1.8-6.7l4.2-2.9c-0.7-1.6-1.6-3.1-2.6-4.5 L70,35c-1.4-1.9-3.1-3.5-4.9-4.9l2.2-4.6c-1.4-1-2.9-1.9-4.5-2.6L59.8,27c-2.1-0.9-4.4-1.5-6.7-1.8l-0.4-5.1C51.8,20,50.9,20,50,20 s-1.8,0-2.6,0.1l-0.4,5.1c-2.4,0.3-4.6,0.9-6.7,1.8l-2.9-4.1c-1.6,0.7-3.1,1.6-4.5,2.6l2.1,4.6c-1.9,1.4-3.5,3.1-5,4.9l-4.5-2.1 c-1,1.4-1.9,2.9-2.6,4.5l4.1,2.9c-0.9,2.1-1.5,4.4-1.8,6.8l-5,0.4C20,48.2,20,49.1,20,50s0,1.8,0.1,2.6l5,0.4 c0.3,2.4,0.9,4.7,1.8,6.8l-4.1,2.9c0.7,1.6,1.6,3.1,2.6,4.5l4.5-2.1c1.4,1.9,3.1,3.5,5,4.9l-2.1,4.6c1.4,1,2.9,1.9,4.5,2.6l2.9-4.1 c2.1,0.9,4.4,1.5,6.7,1.8l0.4,5.1C48.2,80,49.1,80,50,80s1.8,0,2.6-0.1l0.4-5.1c2.3-0.3,4.6-0.9,6.7-1.8l2.9,4.2 c1.6-0.7,3.1-1.6,4.5-2.6L65,69.9c1.9-1.4,3.5-3,4.9-4.9l4.6,2.2c1-1.4,1.9-2.9,2.6-4.5L73,59.8c0.9-2.1,1.5-4.4,1.8-6.7L79.9,52.6 z M50,65c-8.3,0-15-6.7-15-15c0-8.3,6.7-15,15-15s15,6.7,15,15C65,58.3,58.3,65,50,65z",fill:"currentColor"},[d("animateTransform",{attributeName:"transform",type:"rotate",from:"90 50 50",to:"0 50 50",dur:"1s",repeatCount:"indefinite"})])]),d("g",{transform:"translate(20,20) rotate(15 50 50)"},[d("path",{d:"M79.9,52.6C80,51.8,80,50.9,80,50s0-1.8-0.1-2.6l-5.1-0.4c-0.3-2.4-0.9-4.6-1.8-6.7l4.2-2.9c-0.7-1.6-1.6-3.1-2.6-4.5 L70,35c-1.4-1.9-3.1-3.5-4.9-4.9l2.2-4.6c-1.4-1-2.9-1.9-4.5-2.6L59.8,27c-2.1-0.9-4.4-1.5-6.7-1.8l-0.4-5.1C51.8,20,50.9,20,50,20 s-1.8,0-2.6,0.1l-0.4,5.1c-2.4,0.3-4.6,0.9-6.7,1.8l-2.9-4.1c-1.6,0.7-3.1,1.6-4.5,2.6l2.1,4.6c-1.9,1.4-3.5,3.1-5,4.9l-4.5-2.1 c-1,1.4-1.9,2.9-2.6,4.5l4.1,2.9c-0.9,2.1-1.5,4.4-1.8,6.8l-5,0.4C20,48.2,20,49.1,20,50s0,1.8,0.1,2.6l5,0.4 c0.3,2.4,0.9,4.7,1.8,6.8l-4.1,2.9c0.7,1.6,1.6,3.1,2.6,4.5l4.5-2.1c1.4,1.9,3.1,3.5,5,4.9l-2.1,4.6c1.4,1,2.9,1.9,4.5,2.6l2.9-4.1 c2.1,0.9,4.4,1.5,6.7,1.8l0.4,5.1C48.2,80,49.1,80,50,80s1.8,0,2.6-0.1l0.4-5.1c2.3-0.3,4.6-0.9,6.7-1.8l2.9,4.2 c1.6-0.7,3.1-1.6,4.5-2.6L65,69.9c1.9-1.4,3.5-3,4.9-4.9l4.6,2.2c1-1.4,1.9-2.9,2.6-4.5L73,59.8c0.9-2.1,1.5-4.4,1.8-6.7L79.9,52.6 z M50,65c-8.3,0-15-6.7-15-15c0-8.3,6.7-15,15-15s15,6.7,15,15C65,58.3,58.3,65,50,65z",fill:"currentColor"},[d("animateTransform",{attributeName:"transform",type:"rotate",from:"0 50 50",to:"90 50 50",dur:"1s",repeatCount:"indefinite"})])])];var vT=we({name:"QSpinnerGears",props:mn,setup(e){const{cSize:t,classes:n}=gn(e);return()=>d("svg",{class:n.value,width:t.value,height:t.value,viewBox:"0 0 100 100",preserveAspectRatio:"xMidYMid",xmlns:"http://www.w3.org/2000/svg"},dT)}});const fT=[d("circle",{cx:"12.5",cy:"12.5",r:"12.5"},[d("animate",{attributeName:"fill-opacity",begin:"0s",dur:"1s",values:"1;.2;1",calcMode:"linear",repeatCount:"indefinite"})]),d("circle",{cx:"12.5",cy:"52.5",r:"12.5","fill-opacity":".5"},[d("animate",{attributeName:"fill-opacity",begin:"100ms",dur:"1s",values:"1;.2;1",calcMode:"linear",repeatCount:"indefinite"})]),d("circle",{cx:"52.5",cy:"12.5",r:"12.5"},[d("animate",{attributeName:"fill-opacity",begin:"300ms",dur:"1s",values:"1;.2;1",calcMode:"linear",repeatCount:"indefinite"})]),d("circle",{cx:"52.5",cy:"52.5",r:"12.5"},[d("animate",{attributeName:"fill-opacity",begin:"600ms",dur:"1s",values:"1;.2;1",calcMode:"linear",repeatCount:"indefinite"})]),d("circle",{cx:"92.5",cy:"12.5",r:"12.5"},[d("animate",{attributeName:"fill-opacity",begin:"800ms",dur:"1s",values:"1;.2;1",calcMode:"linear",repeatCount:"indefinite"})]),d("circle",{cx:"92.5",cy:"52.5",r:"12.5"},[d("animate",{attributeName:"fill-opacity",begin:"400ms",dur:"1s",values:"1;.2;1",calcMode:"linear",repeatCount:"indefinite"})]),d("circle",{cx:"12.5",cy:"92.5",r:"12.5"},[d("animate",{attributeName:"fill-opacity",begin:"700ms",dur:"1s",values:"1;.2;1",calcMode:"linear",repeatCount:"indefinite"})]),d("circle",{cx:"52.5",cy:"92.5",r:"12.5"},[d("animate",{attributeName:"fill-opacity",begin:"500ms",dur:"1s",values:"1;.2;1",calcMode:"linear",repeatCount:"indefinite"})]),d("circle",{cx:"92.5",cy:"92.5",r:"12.5"},[d("animate",{attributeName:"fill-opacity",begin:"200ms",dur:"1s",values:"1;.2;1",calcMode:"linear",repeatCount:"indefinite"})])];var pT=we({name:"QSpinnerGrid",props:mn,setup(e){const{cSize:t,classes:n}=gn(e);return()=>d("svg",{class:n.value,fill:"currentColor",width:t.value,height:t.value,viewBox:"0 0 105 105",xmlns:"http://www.w3.org/2000/svg"},fT)}});const hT=[d("path",{d:"M30.262 57.02L7.195 40.723c-5.84-3.976-7.56-12.06-3.842-18.063 3.715-6 11.467-7.65 17.306-3.68l4.52 3.76 2.6-5.274c3.716-6.002 11.47-7.65 17.304-3.68 5.84 3.97 7.56 12.054 3.842 18.062L34.49 56.118c-.897 1.512-2.793 1.915-4.228.9z","fill-opacity":".5"},[d("animate",{attributeName:"fill-opacity",begin:"0s",dur:"1.4s",values:"0.5;1;0.5",calcMode:"linear",repeatCount:"indefinite"})]),d("path",{d:"M105.512 56.12l-14.44-24.272c-3.716-6.008-1.996-14.093 3.843-18.062 5.835-3.97 13.588-2.322 17.306 3.68l2.6 5.274 4.52-3.76c5.84-3.97 13.593-2.32 17.308 3.68 3.718 6.003 1.998 14.088-3.842 18.064L109.74 57.02c-1.434 1.014-3.33.61-4.228-.9z","fill-opacity":".5"},[d("animate",{attributeName:"fill-opacity",begin:"0.7s",dur:"1.4s",values:"0.5;1;0.5",calcMode:"linear",repeatCount:"indefinite"})]),d("path",{d:"M67.408 57.834l-23.01-24.98c-5.864-6.15-5.864-16.108 0-22.248 5.86-6.14 15.37-6.14 21.234 0L70 16.168l4.368-5.562c5.863-6.14 15.375-6.14 21.235 0 5.863 6.14 5.863 16.098 0 22.247l-23.007 24.98c-1.43 1.556-3.757 1.556-5.188 0z"})];var mT=we({name:"QSpinnerHearts",props:mn,setup(e){const{cSize:t,classes:n}=gn(e);return()=>d("svg",{class:n.value,fill:"currentColor",width:t.value,height:t.value,viewBox:"0 0 140 64",xmlns:"http://www.w3.org/2000/svg"},hT)}});const gT=[d("g",[d("path",{fill:"none",stroke:"currentColor","stroke-width":"5","stroke-miterlimit":"10",d:"M58.4,51.7c-0.9-0.9-1.4-2-1.4-2.3s0.5-0.4,1.4-1.4 C70.8,43.8,79.8,30.5,80,15.5H70H30H20c0.2,15,9.2,28.1,21.6,32.3c0.9,0.9,1.4,1.2,1.4,1.5s-0.5,1.6-1.4,2.5 C29.2,56.1,20.2,69.5,20,85.5h10h40h10C79.8,69.5,70.8,55.9,58.4,51.7z"}),d("clipPath",{id:"uil-hourglass-clip1"},[d("rect",{x:"15",y:"20",width:"70",height:"25"},[d("animate",{attributeName:"height",from:"25",to:"0",dur:"1s",repeatCount:"indefinite",values:"25;0;0",keyTimes:"0;0.5;1"}),d("animate",{attributeName:"y",from:"20",to:"45",dur:"1s",repeatCount:"indefinite",values:"20;45;45",keyTimes:"0;0.5;1"})])]),d("clipPath",{id:"uil-hourglass-clip2"},[d("rect",{x:"15",y:"55",width:"70",height:"25"},[d("animate",{attributeName:"height",from:"0",to:"25",dur:"1s",repeatCount:"indefinite",values:"0;25;25",keyTimes:"0;0.5;1"}),d("animate",{attributeName:"y",from:"80",to:"55",dur:"1s",repeatCount:"indefinite",values:"80;55;55",keyTimes:"0;0.5;1"})])]),d("path",{d:"M29,23c3.1,11.4,11.3,19.5,21,19.5S67.9,34.4,71,23H29z","clip-path":"url(#uil-hourglass-clip1)",fill:"currentColor"}),d("path",{d:"M71.6,78c-3-11.6-11.5-20-21.5-20s-18.5,8.4-21.5,20H71.6z","clip-path":"url(#uil-hourglass-clip2)",fill:"currentColor"}),d("animateTransform",{attributeName:"transform",type:"rotate",from:"0 50 50",to:"180 50 50",repeatCount:"indefinite",dur:"1s",values:"0 50 50;0 50 50;180 50 50",keyTimes:"0;0.7;1"})])];var bT=we({name:"QSpinnerHourglass",props:mn,setup(e){const{cSize:t,classes:n}=gn(e);return()=>d("svg",{class:n.value,width:t.value,height:t.value,viewBox:"0 0 100 100",preserveAspectRatio:"xMidYMid",xmlns:"http://www.w3.org/2000/svg"},gT)}});const yT=[d("path",{d:"M24.3,30C11.4,30,5,43.3,5,50s6.4,20,19.3,20c19.3,0,32.1-40,51.4-40C88.6,30,95,43.3,95,50s-6.4,20-19.3,20C56.4,70,43.6,30,24.3,30z",fill:"none",stroke:"currentColor","stroke-width":"8","stroke-dasharray":"10.691205342610678 10.691205342610678","stroke-dashoffset":"0"},[d("animate",{attributeName:"stroke-dashoffset",from:"0",to:"21.382410685221355",begin:"0",dur:"2s",repeatCount:"indefinite",fill:"freeze"})])];var _T=we({name:"QSpinnerInfinity",props:mn,setup(e){const{cSize:t,classes:n}=gn(e);return()=>d("svg",{class:n.value,width:t.value,height:t.value,viewBox:"0 0 100 100",preserveAspectRatio:"xMidYMid"},yT)}});const wT=[d("g",{"stroke-width":"4","stroke-linecap":"round"},[d("line",{y1:"17",y2:"29",transform:"translate(32,32) rotate(180)"},[d("animate",{attributeName:"stroke-opacity",dur:"750ms",values:"1;.85;.7;.65;.55;.45;.35;.25;.15;.1;0;1",repeatCount:"indefinite"})]),d("line",{y1:"17",y2:"29",transform:"translate(32,32) rotate(210)"},[d("animate",{attributeName:"stroke-opacity",dur:"750ms",values:"0;1;.85;.7;.65;.55;.45;.35;.25;.15;.1;0",repeatCount:"indefinite"})]),d("line",{y1:"17",y2:"29",transform:"translate(32,32) rotate(240)"},[d("animate",{attributeName:"stroke-opacity",dur:"750ms",values:".1;0;1;.85;.7;.65;.55;.45;.35;.25;.15;.1",repeatCount:"indefinite"})]),d("line",{y1:"17",y2:"29",transform:"translate(32,32) rotate(270)"},[d("animate",{attributeName:"stroke-opacity",dur:"750ms",values:".15;.1;0;1;.85;.7;.65;.55;.45;.35;.25;.15",repeatCount:"indefinite"})]),d("line",{y1:"17",y2:"29",transform:"translate(32,32) rotate(300)"},[d("animate",{attributeName:"stroke-opacity",dur:"750ms",values:".25;.15;.1;0;1;.85;.7;.65;.55;.45;.35;.25",repeatCount:"indefinite"})]),d("line",{y1:"17",y2:"29",transform:"translate(32,32) rotate(330)"},[d("animate",{attributeName:"stroke-opacity",dur:"750ms",values:".35;.25;.15;.1;0;1;.85;.7;.65;.55;.45;.35",repeatCount:"indefinite"})]),d("line",{y1:"17",y2:"29",transform:"translate(32,32) rotate(0)"},[d("animate",{attributeName:"stroke-opacity",dur:"750ms",values:".45;.35;.25;.15;.1;0;1;.85;.7;.65;.55;.45",repeatCount:"indefinite"})]),d("line",{y1:"17",y2:"29",transform:"translate(32,32) rotate(30)"},[d("animate",{attributeName:"stroke-opacity",dur:"750ms",values:".55;.45;.35;.25;.15;.1;0;1;.85;.7;.65;.55",repeatCount:"indefinite"})]),d("line",{y1:"17",y2:"29",transform:"translate(32,32) rotate(60)"},[d("animate",{attributeName:"stroke-opacity",dur:"750ms",values:".65;.55;.45;.35;.25;.15;.1;0;1;.85;.7;.65",repeatCount:"indefinite"})]),d("line",{y1:"17",y2:"29",transform:"translate(32,32) rotate(90)"},[d("animate",{attributeName:"stroke-opacity",dur:"750ms",values:".7;.65;.55;.45;.35;.25;.15;.1;0;1;.85;.7",repeatCount:"indefinite"})]),d("line",{y1:"17",y2:"29",transform:"translate(32,32) rotate(120)"},[d("animate",{attributeName:"stroke-opacity",dur:"750ms",values:".85;.7;.65;.55;.45;.35;.25;.15;.1;0;1;.85",repeatCount:"indefinite"})]),d("line",{y1:"17",y2:"29",transform:"translate(32,32) rotate(150)"},[d("animate",{attributeName:"stroke-opacity",dur:"750ms",values:"1;.85;.7;.65;.55;.45;.35;.25;.15;.1;0;1",repeatCount:"indefinite"})])])];var xT=we({name:"QSpinnerIos",props:mn,setup(e){const{cSize:t,classes:n}=gn(e);return()=>d("svg",{class:n.value,width:t.value,height:t.value,stroke:"currentColor",fill:"currentColor",viewBox:"0 0 64 64"},wT)}});const ST=[d("circle",{cx:"50",cy:"50",r:"44",fill:"none","stroke-width":"4","stroke-opacity":".5",stroke:"currentColor"}),d("circle",{cx:"8",cy:"54",r:"6",fill:"currentColor","stroke-width":"3",stroke:"currentColor"},[d("animateTransform",{attributeName:"transform",type:"rotate",from:"0 50 48",to:"360 50 52",dur:"2s",repeatCount:"indefinite"})])];var kT=we({name:"QSpinnerOrbit",props:mn,setup(e){const{cSize:t,classes:n}=gn(e);return()=>d("svg",{class:n.value,width:t.value,height:t.value,viewBox:"0 0 100 100",preserveAspectRatio:"xMidYMid",xmlns:"http://www.w3.org/2000/svg"},ST)}});const CT=[d("g",{transform:"translate(1 1)","stroke-width":"2",fill:"none","fill-rule":"evenodd"},[d("circle",{"stroke-opacity":".5",cx:"18",cy:"18",r:"18"}),d("path",{d:"M36 18c0-9.94-8.06-18-18-18"},[d("animateTransform",{attributeName:"transform",type:"rotate",from:"0 18 18",to:"360 18 18",dur:"1s",repeatCount:"indefinite"})])])];var qT=we({name:"QSpinnerOval",props:mn,setup(e){const{cSize:t,classes:n}=gn(e);return()=>d("svg",{class:n.value,stroke:"currentColor",width:t.value,height:t.value,viewBox:"0 0 38 38",xmlns:"http://www.w3.org/2000/svg"},CT)}});const $T=[d("path",{d:"M0 50A50 50 0 0 1 50 0L50 50L0 50",fill:"currentColor",opacity:"0.5"},[d("animateTransform",{attributeName:"transform",type:"rotate",from:"0 50 50",to:"360 50 50",dur:"0.8s",repeatCount:"indefinite"})]),d("path",{d:"M50 0A50 50 0 0 1 100 50L50 50L50 0",fill:"currentColor",opacity:"0.5"},[d("animateTransform",{attributeName:"transform",type:"rotate",from:"0 50 50",to:"360 50 50",dur:"1.6s",repeatCount:"indefinite"})]),d("path",{d:"M100 50A50 50 0 0 1 50 100L50 50L100 50",fill:"currentColor",opacity:"0.5"},[d("animateTransform",{attributeName:"transform",type:"rotate",from:"0 50 50",to:"360 50 50",dur:"2.4s",repeatCount:"indefinite"})]),d("path",{d:"M50 100A50 50 0 0 1 0 50L50 50L50 100",fill:"currentColor",opacity:"0.5"},[d("animateTransform",{attributeName:"transform",type:"rotate",from:"0 50 50",to:"360 50 50",dur:"3.2s",repeatCount:"indefinite"})])];var TT=we({name:"QSpinnerPie",props:mn,setup(e){const{cSize:t,classes:n}=gn(e);return()=>d("svg",{class:n.value,width:t.value,height:t.value,viewBox:"0 0 100 100",preserveAspectRatio:"xMidYMid",xmlns:"http://www.w3.org/2000/svg"},$T)}});const MT=[d("g",{fill:"none","fill-rule":"evenodd","stroke-width":"2"},[d("circle",{cx:"22",cy:"22",r:"1"},[d("animate",{attributeName:"r",begin:"0s",dur:"1.8s",values:"1; 20",calcMode:"spline",keyTimes:"0; 1",keySplines:"0.165, 0.84, 0.44, 1",repeatCount:"indefinite"}),d("animate",{attributeName:"stroke-opacity",begin:"0s",dur:"1.8s",values:"1; 0",calcMode:"spline",keyTimes:"0; 1",keySplines:"0.3, 0.61, 0.355, 1",repeatCount:"indefinite"})]),d("circle",{cx:"22",cy:"22",r:"1"},[d("animate",{attributeName:"r",begin:"-0.9s",dur:"1.8s",values:"1; 20",calcMode:"spline",keyTimes:"0; 1",keySplines:"0.165, 0.84, 0.44, 1",repeatCount:"indefinite"}),d("animate",{attributeName:"stroke-opacity",begin:"-0.9s",dur:"1.8s",values:"1; 0",calcMode:"spline",keyTimes:"0; 1",keySplines:"0.3, 0.61, 0.355, 1",repeatCount:"indefinite"})])])];var LT=we({name:"QSpinnerPuff",props:mn,setup(e){const{cSize:t,classes:n}=gn(e);return()=>d("svg",{class:n.value,stroke:"currentColor",width:t.value,height:t.value,viewBox:"0 0 44 44",xmlns:"http://www.w3.org/2000/svg"},MT)}});const AT=[d("g",{transform:"scale(0.55)"},[d("circle",{cx:"30",cy:"150",r:"30",fill:"currentColor"},[d("animate",{attributeName:"opacity",from:"0",to:"1",dur:"1s",begin:"0",repeatCount:"indefinite",keyTimes:"0;0.5;1",values:"0;1;1"})]),d("path",{d:"M90,150h30c0-49.7-40.3-90-90-90v30C63.1,90,90,116.9,90,150z",fill:"currentColor"},[d("animate",{attributeName:"opacity",from:"0",to:"1",dur:"1s",begin:"0.1",repeatCount:"indefinite",keyTimes:"0;0.5;1",values:"0;1;1"})]),d("path",{d:"M150,150h30C180,67.2,112.8,0,30,0v30C96.3,30,150,83.7,150,150z",fill:"currentColor"},[d("animate",{attributeName:"opacity",from:"0",to:"1",dur:"1s",begin:"0.2",repeatCount:"indefinite",keyTimes:"0;0.5;1",values:"0;1;1"})])])];var PT=we({name:"QSpinnerRadio",props:mn,setup(e){const{cSize:t,classes:n}=gn(e);return()=>d("svg",{class:n.value,width:t.value,height:t.value,viewBox:"0 0 100 100",preserveAspectRatio:"xMidYMid",xmlns:"http://www.w3.org/2000/svg"},AT)}});const BT=[d("g",{fill:"none","fill-rule":"evenodd",transform:"translate(1 1)","stroke-width":"2"},[d("circle",{cx:"22",cy:"22",r:"6"},[d("animate",{attributeName:"r",begin:"1.5s",dur:"3s",values:"6;22",calcMode:"linear",repeatCount:"indefinite"}),d("animate",{attributeName:"stroke-opacity",begin:"1.5s",dur:"3s",values:"1;0",calcMode:"linear",repeatCount:"indefinite"}),d("animate",{attributeName:"stroke-width",begin:"1.5s",dur:"3s",values:"2;0",calcMode:"linear",repeatCount:"indefinite"})]),d("circle",{cx:"22",cy:"22",r:"6"},[d("animate",{attributeName:"r",begin:"3s",dur:"3s",values:"6;22",calcMode:"linear",repeatCount:"indefinite"}),d("animate",{attributeName:"stroke-opacity",begin:"3s",dur:"3s",values:"1;0",calcMode:"linear",repeatCount:"indefinite"}),d("animate",{attributeName:"stroke-width",begin:"3s",dur:"3s",values:"2;0",calcMode:"linear",repeatCount:"indefinite"})]),d("circle",{cx:"22",cy:"22",r:"8"},[d("animate",{attributeName:"r",begin:"0s",dur:"1.5s",values:"6;1;2;3;4;5;6",calcMode:"linear",repeatCount:"indefinite"})])])];var ET=we({name:"QSpinnerRings",props:mn,setup(e){const{cSize:t,classes:n}=gn(e);return()=>d("svg",{class:n.value,stroke:"currentColor",width:t.value,height:t.value,viewBox:"0 0 45 45",xmlns:"http://www.w3.org/2000/svg"},BT)}});const FT=[d("defs",[d("linearGradient",{x1:"8.042%",y1:"0%",x2:"65.682%",y2:"23.865%",id:"a"},[d("stop",{"stop-color":"currentColor","stop-opacity":"0",offset:"0%"}),d("stop",{"stop-color":"currentColor","stop-opacity":".631",offset:"63.146%"}),d("stop",{"stop-color":"currentColor",offset:"100%"})])]),d("g",{transform:"translate(1 1)",fill:"none","fill-rule":"evenodd"},[d("path",{d:"M36 18c0-9.94-8.06-18-18-18",stroke:"url(#a)","stroke-width":"2"},[d("animateTransform",{attributeName:"transform",type:"rotate",from:"0 18 18",to:"360 18 18",dur:"0.9s",repeatCount:"indefinite"})]),d("circle",{fill:"currentColor",cx:"36",cy:"18",r:"1"},[d("animateTransform",{attributeName:"transform",type:"rotate",from:"0 18 18",to:"360 18 18",dur:"0.9s",repeatCount:"indefinite"})])])];var VT=we({name:"QSpinnerTail",props:mn,setup(e){const{cSize:t,classes:n}=gn(e);return()=>d("svg",{class:n.value,width:t.value,height:t.value,viewBox:"0 0 38 38",xmlns:"http://www.w3.org/2000/svg"},FT)}}),IT=we({name:"QSplitter",props:{...Ft,modelValue:{type:Number,required:!0},reverse:Boolean,unit:{type:String,default:"%",validator:e=>["%","px"].includes(e)},limits:{type:Array,validator:e=>e.length===2&&typeof e[0]=="number"&&typeof e[1]=="number"&&e[0]>=0&&e[0]<=e[1]},emitImmediately:Boolean,horizontal:Boolean,disable:Boolean,beforeClass:[Array,String,Object],afterClass:[Array,String,Object],separatorClass:[Array,String,Object],separatorStyle:[Array,String,Object]},emits:["update:modelValue"],setup(e,{slots:t,emit:n}){const{proxy:{$q:r}}=Ve(),l=Vt(e,r),i=X(null),c={before:X(null),after:X(null)},u=f(()=>`q-splitter no-wrap ${e.horizontal===!0?"q-splitter--horizontal column":"q-splitter--vertical row"} q-splitter--${e.disable===!0?"disabled":"workable"}`+(l.value===!0?" q-splitter--dark":"")),v=f(()=>e.horizontal===!0?"height":"width"),m=f(()=>e.reverse!==!0?"before":"after"),p=f(()=>e.limits!==void 0?e.limits:e.unit==="%"?[10,90]:[50,1/0]);function y(P){return(e.unit==="%"?P:Math.round(P))+e.unit}const b=f(()=>({[m.value]:{[v.value]:y(e.modelValue)}}));let g,w,L,$,F;function A(P){if(P.isFirst===!0){const E=i.value.getBoundingClientRect()[v.value];return g=e.horizontal===!0?"up":"left",w=e.unit==="%"?100:E,L=Math.min(w,p.value[1],Math.max(p.value[0],e.modelValue)),$=(e.reverse!==!0?1:-1)*(e.horizontal===!0?1:r.lang.rtl===!0?-1:1)*(e.unit==="%"?E===0?0:100/E:1),void i.value.classList.add("q-splitter--active")}if(P.isFinal===!0)return F!==e.modelValue&&n("update:modelValue",F),void i.value.classList.remove("q-splitter--active");const M=L+$*(P.direction===g?-1:1)*P.distance[e.horizontal===!0?"y":"x"];F=Math.min(w,p.value[1],Math.max(p.value[0],M)),c[m.value].value.style[v.value]=y(F),e.emitImmediately===!0&&e.modelValue!==F&&n("update:modelValue",F)}const S=f(()=>[[io,A,void 0,{[e.horizontal===!0?"vertical":"horizontal"]:!0,prevent:!0,stop:!0,mouse:!0,mouseAllDir:!0}]]);function x(P,M){PM[1]&&n("update:modelValue",M[1])}return _e(()=>e.modelValue,P=>{x(P,p.value)}),_e(()=>e.limits,()=>{Tt(()=>{x(e.modelValue,p.value)})}),()=>{const P=[d("div",{ref:c.before,class:["q-splitter__panel q-splitter__before"+(e.reverse===!0?" col":""),e.beforeClass],style:b.value.before},Ge(t.before)),d("div",{class:["q-splitter__separator",e.separatorClass],style:e.separatorStyle,"aria-disabled":e.disable===!0?"true":void 0},[xo("div",{class:"q-splitter__separator-area absolute-full"},Ge(t.separator),"sep",e.disable!==!0,()=>S.value)]),d("div",{ref:c.after,class:["q-splitter__panel q-splitter__after"+(e.reverse===!0?"":" col"),e.afterClass],style:b.value.after},Ge(t.after))];return d("div",{class:u.value,ref:i},hn(t.default,P))}}}),Em=we({name:"StepHeader",props:{stepper:{},step:{},goToPanel:Function},setup(e,{attrs:t}){const{proxy:{$q:n}}=Ve(),r=X(null),l=f(()=>e.stepper.modelValue===e.step.name),i=f(()=>{const $=e.step.disable;return $===!0||$===""}),c=f(()=>{const $=e.step.error;return $===!0||$===""}),u=f(()=>{const $=e.step.done;return i.value===!1&&($===!0||$==="")}),v=f(()=>{const $=e.step.headerNav,F=$===!0||$===""||$===void 0;return i.value===!1&&e.stepper.headerNav&&F}),m=f(()=>e.step.prefix&&(l.value===!1||e.stepper.activeIcon==="none")&&(c.value===!1||e.stepper.errorIcon==="none")&&(u.value===!1||e.stepper.doneIcon==="none")),p=f(()=>{const $=e.step.icon||e.stepper.inactiveIcon;if(l.value===!0){const F=e.step.activeIcon||e.stepper.activeIcon;return F==="none"?$:F||n.iconSet.stepper.active}if(c.value===!0){const F=e.step.errorIcon||e.stepper.errorIcon;return F==="none"?$:F||n.iconSet.stepper.error}if(i.value===!1&&u.value===!0){const F=e.step.doneIcon||e.stepper.doneIcon;return F==="none"?$:F||n.iconSet.stepper.done}return $}),y=f(()=>{const $=c.value===!0?e.step.errorColor||e.stepper.errorColor:void 0;if(l.value===!0){const F=e.step.activeColor||e.stepper.activeColor||e.step.color;return F!==void 0?F:$}return $!==void 0?$:i.value===!1&&u.value===!0?e.step.doneColor||e.stepper.doneColor||e.step.color||e.stepper.inactiveColor:e.step.color||e.stepper.inactiveColor}),b=f(()=>"q-stepper__tab col-grow flex items-center no-wrap relative-position"+(y.value!==void 0?` text-${y.value}`:"")+(c.value===!0?" q-stepper__tab--error q-stepper__tab--error-with-"+(m.value===!0?"prefix":"icon"):"")+(l.value===!0?" q-stepper__tab--active":"")+(u.value===!0?" q-stepper__tab--done":"")+(v.value===!0?" q-stepper__tab--navigation q-focusable q-hoverable":"")+(i.value===!0?" q-stepper__tab--disabled":"")),g=f(()=>e.stepper.headerNav===!0&&v.value);function w(){r.value!==null&&r.value.focus(),l.value===!1&&e.goToPanel(e.step.name)}function L($){$.keyCode===13&&l.value===!1&&e.goToPanel(e.step.name)}return()=>{const $={class:b.value};v.value===!0&&($.onClick=w,$.onKeyup=L,Object.assign($,i.value===!0?{tabindex:-1,"aria-disabled":"true"}:{tabindex:t.tabindex||0}));const F=[d("div",{class:"q-focus-helper",tabindex:-1,ref:r}),d("div",{class:"q-stepper__dot row flex-center q-stepper__line relative-position"},[d("span",{class:"row flex-center"},[m.value===!0?e.step.prefix:d(Et,{name:p.value})])])];if(e.step.title!==void 0&&e.step.title!==null){const A=[d("div",{class:"q-stepper__title"},e.step.title)];e.step.caption!==void 0&&e.step.caption!==null&&A.push(d("div",{class:"q-stepper__caption"},e.step.caption)),F.push(d("div",{class:"q-stepper__label q-stepper__line relative-position"},A))}return Bo(d("div",$,F),[[El,g.value]])}}});function Fm(e){return d("div",{class:"q-stepper__step-content"},[d("div",{class:"q-stepper__step-inner"},Ge(e.default))])}const Gf={setup(e,{slots:t}){return()=>Fm(t)}};var OT=we({name:"QStep",props:{...rd,icon:String,color:String,title:{type:String,required:!0},caption:String,prefix:[String,Number],doneIcon:String,doneColor:String,activeIcon:String,activeColor:String,errorIcon:String,errorColor:String,headerNav:{type:Boolean,default:!0},done:Boolean,error:Boolean,onScroll:[Function,Array]},setup(e,{slots:t,emit:n}){const{proxy:{$q:r}}=Ve(),l=Fn(Qp,Nt);if(l===Nt)return console.error("QStep needs to be a child of QStepper"),Nt;const{getCacheWithFn:i}=Ol(),c=X(null),u=f(()=>l.value.modelValue===e.name),v=f(()=>r.platform.is.ios!==!0&&r.platform.is.chrome===!0||u.value!==!0||l.value.vertical!==!0?{}:{onScroll(y){const{target:b}=y;b.scrollTop>0&&(b.scrollTop=0),e.onScroll!==void 0&&n("scroll",y)}}),m=f(()=>typeof e.name=="string"||typeof e.name=="number"?e.name:String(e.name));function p(){const y=l.value.vertical;return y===!0&&l.value.keepAlive===!0?d(kp,l.value.keepAliveProps.value,u.value===!0?[d(l.value.needsUniqueKeepAliveWrapper.value===!0?i(m.value,()=>({...Gf,name:m.value})):Gf,{key:m.value},t.default)]:void 0):y!==!0||u.value===!0?Fm(t):void 0}return()=>d("div",{ref:c,class:"q-stepper__step",role:"tabpanel",...v.value},l.value.vertical===!0?[d(Em,{stepper:l.value,step:e,goToPanel:l.value.goToPanel}),l.value.animated===!0?d(As,p):p()]:[p()])}});const RT=/(-\w)/g;function zT(e){const t={};for(const n in e){const r=n.replace(RT,l=>l[1].toUpperCase());t[r]=e[n]}return t}var NT=we({name:"QStepper",props:{...Ft,...ld,flat:Boolean,bordered:Boolean,alternativeLabels:Boolean,headerNav:Boolean,contracted:Boolean,headerClass:String,inactiveColor:String,inactiveIcon:String,doneIcon:String,doneColor:String,activeIcon:String,activeColor:String,errorIcon:String,errorColor:String},emits:id,setup(e,{slots:t}){const n=Ve(),r=Vt(e,n.proxy.$q),{updatePanelsList:l,isValidPanelName:i,updatePanelIndex:c,getPanelContent:u,getPanels:v,panelDirectives:m,goToPanel:p,keepAliveProps:y,needsUniqueKeepAliveWrapper:b}=sd();Do(Qp,f(()=>({goToPanel:p,keepAliveProps:y,needsUniqueKeepAliveWrapper:b,...e})));const g=f(()=>`q-stepper q-stepper--${e.vertical===!0?"vertical":"horizontal"}`+(e.flat===!0?" q-stepper--flat":"")+(e.bordered===!0?" q-stepper--bordered":"")+(r.value===!0?" q-stepper--dark q-dark":"")),w=f(()=>`q-stepper__header row items-stretch justify-between q-stepper__header--${e.alternativeLabels===!0?"alternative":"standard"}-labels`+(e.flat===!1||e.bordered===!0?" q-stepper__header--border":"")+(e.contracted===!0?" q-stepper__header--contracted":"")+(e.headerClass!==void 0?` ${e.headerClass}`:""));function L(){const $=Ge(t.message,[]);if(e.vertical===!0){i(e.modelValue)&&c();const F=d("div",{class:"q-stepper__content"},Ge(t.default));return $===void 0?[F]:$.concat(F)}return[d("div",{class:w.value},v().map(F=>{const A=zT(F.props);return d(Em,{key:A.name,stepper:e,step:A,goToPanel:p})})),$,xo("div",{class:"q-stepper__content q-panel-parent"},u(),"cont",e.swipeable,()=>m.value)]}return()=>(l(t),d("div",{class:g.value},hn(t.navigation,L())))}}),HT=we({name:"QStepperNavigation",setup(e,{slots:t}){return()=>d("div",{class:"q-stepper__nav"},Ge(t.default))}}),Vm=we({name:"QTh",props:{props:Object,autoWidth:Boolean},emits:["click"],setup(e,{slots:t,emit:n}){const r=Ve(),{proxy:{$q:l}}=r,i=c=>{n("click",c)};return()=>{if(e.props===void 0)return d("th",{class:e.autoWidth===!0?"q-table--col-auto-width":"",onClick:i},Ge(t.default));let c,u;const v=r.vnode.key;if(v){if(c=e.props.colsMap[v],c===void 0)return}else c=e.props.col;if(c.sortable===!0){const p=c.align==="right"?"unshift":"push";u=Pl(t.default,[]),u[p](d(Et,{class:c.__iconClass,name:l.iconSet.table.arrowUp}))}else u=Ge(t.default);const m={class:c.__thClass+(e.autoWidth===!0?" q-table--col-auto-width":""),style:c.headerStyle,onClick:p=>{c.sortable===!0&&e.props.sort(c),i(p)}};return d("th",m,u)}}});function Im(e,t){return d("div",e,[d("table",{class:"q-table"},t)])}const DT={list:ym,table:_m},QT=["list","table","__qtable"];var Om=we({name:"QVirtualScroll",props:{...Am,type:{type:String,default:"list",validator:e=>QT.includes(e)},items:{type:Array,default:()=>[]},itemsFn:Function,itemsSize:Number,scrollTarget:{default:void 0}},setup(e,{slots:t,attrs:n}){let r;const l=X(null),i=f(()=>e.itemsSize>=0&&e.itemsFn!==void 0?parseInt(e.itemsSize,10):Array.isArray(e.items)?e.items.length:0),{virtualScrollSliceRange:c,localResetVirtualScroll:u,padVirtualScroll:v,onVirtualScrollEvt:m}=Pm({virtualScrollLength:i,getVirtualScrollTarget:w,getVirtualScrollEl:g}),p=f(()=>{if(i.value===0)return[];const A=(S,x)=>({index:c.value.from+x,item:S});return e.itemsFn===void 0?e.items.slice(c.value.from,c.value.to).map(A):e.itemsFn(c.value.from,c.value.to-c.value.from).map(A)}),y=f(()=>"q-virtual-scroll q-virtual-scroll"+(e.virtualScrollHorizontal===!0?"--horizontal":"--vertical")+(e.scrollTarget!==void 0?"":" scroll")),b=f(()=>e.scrollTarget!==void 0?{}:{tabindex:0});function g(){return l.value.$el||l.value}function w(){return r}function L(){r=Qo(g(),e.scrollTarget),r.addEventListener("scroll",m,Zt.passive)}function $(){r!==void 0&&(r.removeEventListener("scroll",m,Zt.passive),r=void 0)}function F(){let A=v(e.type==="list"?"div":"tbody",p.value.map(t.default));return t.before!==void 0&&(A=t.before().concat(A)),hn(t.after,A)}return _e(i,()=>{u()}),_e(()=>e.scrollTarget,()=>{$(),L()}),Ec(()=>{u()}),jt(()=>{L()}),nr(()=>{L()}),ia(()=>{$()}),qt(()=>{$()}),()=>{if(t.default!==void 0)return e.type==="__qtable"?Im({ref:l,class:"q-table__middle "+y.value},F()):d(DT[e.type],{...n,ref:l,class:[n.class,y.value],...b.value},F);console.error("QVirtualScroll: default scoped slot is required for rendering")}}});function UT(e,t){return new Date(e)-new Date(t)}const jT={sortMethod:Function,binaryStateSort:Boolean,columnSortOrder:{type:String,validator:e=>e==="ad"||e==="da",default:"ad"}};function WT(e,t,n,r){const l=f(()=>{const{sortBy:u}=t.value;return u&&n.value.find(v=>v.name===u)||null}),i=f(()=>e.sortMethod!==void 0?e.sortMethod:(u,v,m)=>{const p=n.value.find(g=>g.name===v);if(p===void 0||p.field===void 0)return u;const y=m===!0?-1:1,b=typeof p.field=="function"?g=>p.field(g):g=>g[p.field];return u.sort((g,w)=>{let L=b(g),$=b(w);return p.rawSort!==void 0?p.rawSort(L,$,g,w)*y:L==null?-1*y:$==null?1*y:p.sort!==void 0?p.sort(L,$,g,w)*y:Cl(L)===!0&&Cl($)===!0?(L-$)*y:wc(L)===!0&&wc($)===!0?UT(L,$)*y:typeof L=="boolean"&&typeof $=="boolean"?(L-$)*y:([L,$]=[L,$].map(F=>(F+"").toLocaleString().toLowerCase()),L<$?-1*y:L===$?0:y)})});function c(u){let v=e.columnSortOrder;if(En(u)===!0)u.sortOrder&&(v=u.sortOrder),u=u.name;else{const y=n.value.find(b=>b.name===u);y!==void 0&&y.sortOrder&&(v=y.sortOrder)}let{sortBy:m,descending:p}=t.value;m!==u?(m=u,p=v==="da"):e.binaryStateSort===!0?p=!p:p===!0?v==="ad"?m=null:p=!1:v==="ad"?p=!0:m=null,r({sortBy:m,descending:p,page:1})}return{columnToSort:l,computedSortMethod:i,sort:c}}const KT={filter:[String,Object],filterMethod:Function};function YT(e,t){const n=f(()=>e.filterMethod!==void 0?e.filterMethod:(r,l,i,c)=>{const u=l?l.toLowerCase():"";return r.filter(v=>i.some(m=>{const p=c(m,v)+"";return(p==="undefined"||p==="null"?"":p.toLowerCase()).indexOf(u)!==-1}))});return _e(()=>e.filter,()=>{Tt(()=>{t({page:1},!0)})},{deep:!0}),{computedFilterMethod:n}}function GT(e,t){for(const n in t)if(t[n]!==e[n])return!1;return!0}function Xf(e){return e.page<1&&(e.page=1),e.rowsPerPage!==void 0&&e.rowsPerPage<1&&(e.rowsPerPage=0),e}const XT={pagination:Object,rowsPerPageOptions:{type:Array,default:()=>[5,7,10,15,20,25,50,0]},"onUpdate:pagination":[Function,Array]};function ZT(e,t){const{props:n,emit:r}=e,l=X(Object.assign({sortBy:null,descending:!1,page:1,rowsPerPage:n.rowsPerPageOptions.length!==0?n.rowsPerPageOptions[0]:5},n.pagination)),i=f(()=>{const p=n["onUpdate:pagination"]!==void 0?{...l.value,...n.pagination}:l.value;return Xf(p)}),c=f(()=>i.value.rowsNumber!==void 0);function u(p){v({pagination:p,filter:n.filter})}function v(p={}){Tt(()=>{r("request",{pagination:p.pagination||i.value,filter:p.filter||n.filter,getCellValue:t})})}function m(p,y){const b=Xf({...i.value,...p});GT(i.value,b)!==!0?c.value!==!0?n.pagination!==void 0&&n["onUpdate:pagination"]!==void 0?r("update:pagination",b):l.value=b:u(b):c.value===!0&&y===!0&&u(b)}return{innerPagination:l,computedPagination:i,isServerSide:c,requestServerInteraction:v,setPagination:m}}function JT(e,t,n,r,l,i){const{props:c,emit:u,proxy:{$q:v}}=e,m=f(()=>r.value===!0?n.value.rowsNumber||0:i.value),p=f(()=>{const{page:x,rowsPerPage:P}=n.value;return(x-1)*P}),y=f(()=>{const{page:x,rowsPerPage:P}=n.value;return x*P}),b=f(()=>n.value.page===1),g=f(()=>n.value.rowsPerPage===0?1:Math.max(1,Math.ceil(m.value/n.value.rowsPerPage))),w=f(()=>y.value===0||n.value.page>=g.value),L=f(()=>(c.rowsPerPageOptions.includes(t.value.rowsPerPage)?c.rowsPerPageOptions:[t.value.rowsPerPage].concat(c.rowsPerPageOptions)).map(P=>({label:P===0?v.lang.table.allRows:""+P,value:P})));function $(){l({page:1})}function F(){const{page:x}=n.value;x>1&&l({page:x-1})}function A(){const{page:x,rowsPerPage:P}=n.value;y.value>0&&x*P{if(x===P)return;const M=n.value.page;x&&!M?l({page:1}):x["single","multiple","none"].includes(e)},selected:{type:Array,default:()=>[]}},tM=["update:selected","selection"];function nM(e,t,n,r){const l=f(()=>{const w={};return e.selected.map(r.value).forEach(L=>{w[L]=!0}),w}),i=f(()=>e.selection!=="none"),c=f(()=>e.selection==="single"),u=f(()=>e.selection==="multiple"),v=f(()=>n.value.length!==0&&n.value.every(w=>l.value[r.value(w)]===!0)),m=f(()=>v.value!==!0&&n.value.some(w=>l.value[r.value(w)]===!0)),p=f(()=>e.selected.length);function y(w){return l.value[w]===!0}function b(){t("update:selected",[])}function g(w,L,$,F){t("selection",{rows:L,added:$,keys:w,evt:F});const A=c.value===!0?$===!0?L:[]:$===!0?e.selected.concat(L):e.selected.filter(S=>w.includes(r.value(S))===!1);t("update:selected",A)}return{hasSelectionMode:i,singleSelection:c,multipleSelection:u,allRowsSelected:v,someRowsSelected:m,rowsSelectedNumber:p,isRowSelected:y,clearSelection:b,updateSelection:g}}function Zf(e){return Array.isArray(e)?e.slice():[]}const oM={expanded:Array},aM=["update:expanded"];function rM(e,t){const n=X(Zf(e.expanded));function r(c){return n.value.includes(c)}function l(c){e.expanded!==void 0?t("update:expanded",c):n.value=c}function i(c,u){const v=n.value.slice(),m=v.indexOf(c);u===!0?m===-1&&(v.push(c),l(v)):m!==-1&&(v.splice(m,1),l(v))}return _e(()=>e.expanded,c=>{n.value=Zf(c)}),{isRowExpanded:r,setExpanded:l,updateExpanded:i}}const lM={visibleColumns:Array};function iM(e,t,n){const r=f(()=>{if(e.columns!==void 0)return e.columns;const u=e.rows[0];return u!==void 0?Object.keys(u).map(v=>({name:v,label:v.toUpperCase(),field:v,align:Cl(u[v])?"right":"left",sortable:!0})):[]}),l=f(()=>{const{sortBy:u,descending:v}=t.value;return(e.visibleColumns!==void 0?r.value.filter(p=>p.required===!0||e.visibleColumns.includes(p.name)===!0):r.value).map(p=>{const y=p.align||"right",b=`text-${y}`;return{...p,align:y,__iconClass:`q-table__sort-icon q-table__sort-icon--${y}`,__thClass:b+(p.headerClasses!==void 0?" "+p.headerClasses:"")+(p.sortable===!0?" sortable":"")+(p.name===u?` sorted ${v===!0?"sort-desc":""}`:""),__tdStyle:p.style!==void 0?typeof p.style!="function"?()=>p.style:p.style:()=>null,__tdClass:p.classes!==void 0?typeof p.classes!="function"?()=>b+" "+p.classes:g=>b+" "+p.classes(g):()=>b}})}),i=f(()=>{const u={};return l.value.forEach(v=>{u[v.name]=v}),u}),c=f(()=>e.tableColspan!==void 0?e.tableColspan:l.value.length+(n.value===!0?1:0));return{colList:r,computedCols:l,computedColsMap:i,computedColspan:c}}const Di="q-table__bottom row items-center",Rm={};Lm.forEach(e=>{Rm[e]={}});var sM=we({name:"QTable",props:{rows:{type:Array,default:()=>[]},rowKey:{type:[String,Function],default:"id"},columns:Array,loading:Boolean,iconFirstPage:String,iconPrevPage:String,iconNextPage:String,iconLastPage:String,title:String,hideHeader:Boolean,grid:Boolean,gridHeader:Boolean,dense:Boolean,flat:Boolean,bordered:Boolean,square:Boolean,separator:{type:String,default:"horizontal",validator:e=>["horizontal","vertical","cell","none"].includes(e)},wrapCells:Boolean,virtualScroll:Boolean,virtualScrollTarget:{default:void 0},...Rm,noDataLabel:String,noResultsLabel:String,loadingLabel:String,selectedRowsLabel:Function,rowsPerPageLabel:String,paginationLabel:Function,color:{type:String,default:"grey-8"},titleClass:[String,Array,Object],tableStyle:[String,Array,Object],tableClass:[String,Array,Object],tableHeaderStyle:[String,Array,Object],tableHeaderClass:[String,Array,Object],cardContainerClass:[String,Array,Object],cardContainerStyle:[String,Array,Object],cardStyle:[String,Array,Object],cardClass:[String,Array,Object],hideBottom:Boolean,hideSelectedBanner:Boolean,hideNoData:Boolean,hidePagination:Boolean,onRowClick:Function,onRowDblclick:Function,onRowContextmenu:Function,...Ft,...ud,...lM,...KT,...XT,...oM,...eM,...jT},emits:["request","virtualScroll",...cd,...aM,...tM],setup(e,{slots:t,emit:n}){const r=Ve(),{proxy:{$q:l}}=r,i=Vt(e,l),{inFullscreen:c,toggleFullscreen:u}=dd(),v=f(()=>typeof e.rowKey=="function"?e.rowKey:be=>be[e.rowKey]),m=X(null),p=X(null),y=f(()=>e.grid!==!0&&e.virtualScroll===!0),b=f(()=>" q-table__card"+(i.value===!0?" q-table__card--dark q-dark":"")+(e.square===!0?" q-table--square":"")+(e.flat===!0?" q-table--flat":"")+(e.bordered===!0?" q-table--bordered":"")),g=f(()=>`q-table__container q-table--${e.separator}-separator column no-wrap`+(e.grid===!0?" q-table--grid":b.value)+(i.value===!0?" q-table--dark":"")+(e.dense===!0?" q-table--dense":"")+(e.wrapCells===!1?" q-table--no-wrap":"")+(c.value===!0?" fullscreen scroll":"")),w=f(()=>g.value+(e.loading===!0?" q-table--loading":""));_e(()=>e.tableStyle+e.tableClass+e.tableHeaderStyle+e.tableHeaderClass+g.value,()=>{y.value===!0&&p.value!==null&&p.value.reset()});const{innerPagination:L,computedPagination:$,isServerSide:F,requestServerInteraction:A,setPagination:S}=ZT(r,me),{computedFilterMethod:x}=YT(e,S),{isRowExpanded:P,setExpanded:M,updateExpanded:E}=rM(e,n),D=f(()=>{let be=e.rows;if(F.value===!0||be.length===0)return be;const{sortBy:Ne,descending:Ze}=$.value;return e.filter&&(be=x.value(be,e.filter,k.value,me)),U.value!==null&&(be=K.value(e.rows===be?be.slice():be,Ne,Ze)),be}),z=f(()=>D.value.length),I=f(()=>{let be=D.value;if(F.value===!0)return be;const{rowsPerPage:Ne}=$.value;return Ne!==0&&(ne.value===0&&e.rows!==be?be.length>W.value&&(be=be.slice(0,W.value)):be=be.slice(ne.value,W.value)),be}),{hasSelectionMode:N,singleSelection:H,multipleSelection:T,allRowsSelected:O,someRowsSelected:J,rowsSelectedNumber:se,isRowSelected:R,clearSelection:oe,updateSelection:le}=nM(e,n,I,v),{colList:Se,computedCols:k,computedColsMap:_,computedColspan:j}=iM(e,$,N),{columnToSort:U,computedSortMethod:K,sort:G}=WT(e,$,Se,S),{firstRowIndex:ne,lastRowIndex:W,isFirstPage:C,isLastPage:Z,pagesNumber:ce,computedRowsPerPageOptions:ge,computedRowsNumber:Ee,firstPage:Me,prevPage:je,nextPage:Ke,lastPage:Oe}=JT(r,L,$,F,S,z),ct=f(()=>I.value.length===0),Pt=f(()=>{const be={};return Lm.forEach(Ne=>{be[Ne]=e[Ne]}),be.virtualScrollItemSize===void 0&&(be.virtualScrollItemSize=e.dense===!0?28:48),be});function pt(){y.value===!0&&p.value.reset()}function ke(){if(e.grid===!0)return uo();const be=e.hideHeader!==!0?Xe:null;if(y.value===!0){const Ze=t["top-row"],it=t["bottom-row"],mt={default:nn=>tt(nn.item,t.body,nn.index)};if(Ze!==void 0){const nn=d("tbody",Ze({cols:k.value}));mt.before=be===null?()=>nn:()=>[be()].concat(nn)}else be!==null&&(mt.before=be);return it!==void 0&&(mt.after=()=>d("tbody",it({cols:k.value}))),d(Om,{ref:p,class:e.tableClass,style:e.tableStyle,...Pt.value,scrollTarget:e.virtualScrollTarget,items:I.value,type:"__qtable",tableColspan:j.value,onVirtualScroll:ve},mt)}const Ne=[lt()];return be!==null&&Ne.unshift(be()),Im({class:["q-table__middle scroll",e.tableClass],style:e.tableStyle},Ne)}function Be(be,Ne){if(p.value!==null)return void p.value.scrollTo(be,Ne);be=parseInt(be,10);const Ze=m.value.querySelector(`tbody tr:nth-of-type(${be+1})`);if(Ze!==null){const it=m.value.querySelector(".q-table__middle.scroll"),mt=Ze.offsetTop-e.virtualScrollStickySizeStart,nn=mt{const Ie=t[`body-cell-${fe.name}`],Re=Ie!==void 0?Ie:nn;return Re!==void 0?Re(kt({key:it,row:be,pageIndex:Ze,col:fe})):d("td",{class:fe.__tdClass(be),style:fe.__tdStyle(be)},me(fe,be))});if(N.value===!0){const fe=t["body-selection"],Ie=fe!==void 0?fe(Ht({key:it,row:be,pageIndex:Ze})):[d(Or,{modelValue:mt,color:e.color,dark:i.value,dense:e.dense,"onUpdate:modelValue":(Re,Mt)=>{le([it],[be],Re,Mt)}})];Q.unshift(d("td",{class:"q-table--col-auto-width"},Ie))}const ae={key:it,class:{selected:mt}};return e.onRowClick!==void 0&&(ae.class["cursor-pointer"]=!0,ae.onClick=fe=>{n("RowClick",fe,be,Ze)}),e.onRowDblclick!==void 0&&(ae.class["cursor-pointer"]=!0,ae.onDblclick=fe=>{n("RowDblclick",fe,be,Ze)}),e.onRowContextmenu!==void 0&&(ae.class["cursor-pointer"]=!0,ae.onContextmenu=fe=>{n("RowContextmenu",fe,be,Ze)}),d("tr",ae,Q)}function lt(){const be=t.body,Ne=t["top-row"],Ze=t["bottom-row"];let it=I.value.map((mt,nn)=>tt(mt,be,nn));return Ne!==void 0&&(it=Ne({cols:k.value}).concat(it)),Ze!==void 0&&(it=it.concat(Ze({cols:k.value}))),d("tbody",it)}function nt(be){return Dt(be),be.cols=be.cols.map(Ne=>qn({...Ne},"value",()=>me(Ne,be.row))),be}function kt(be){return Dt(be),qn(be,"value",()=>me(be.col,be.row)),be}function Ht(be){return Dt(be),be}function Dt(be){Object.assign(be,{cols:k.value,colsMap:_.value,sort:G,rowIndex:ne.value+be.pageIndex,color:e.color,dark:i.value,dense:e.dense}),N.value===!0&&qn(be,"selected",()=>R(be.key),(Ne,Ze)=>{le([be.key],[be.row],Ne,Ze)}),qn(be,"expand",()=>P(be.key),Ne=>{E(be.key,Ne)})}function me(be,Ne){const Ze=typeof be.field=="function"?be.field(Ne):Ne[be.field];return be.format!==void 0?be.format(Ze,Ne):Ze}const Le=f(()=>({pagination:$.value,pagesNumber:ce.value,isFirstPage:C.value,isLastPage:Z.value,firstPage:Me,prevPage:je,nextPage:Ke,lastPage:Oe,inFullscreen:c.value,toggleFullscreen:u}));function de(){const be=t.top,Ne=t["top-left"],Ze=t["top-right"],it=t["top-selection"],mt=N.value===!0&&it!==void 0&&se.value>0,nn="q-table__top relative-position row items-center";if(be!==void 0)return d("div",{class:nn},[be(Le.value)]);let Q;return mt===!0?Q=it(Le.value).slice():(Q=[],Ne!==void 0?Q.push(d("div",{class:"q-table__control"},[Ne(Le.value)])):e.title&&Q.push(d("div",{class:"q-table__control"},[d("div",{class:["q-table__title",e.titleClass]},e.title)]))),Ze!==void 0&&(Q.push(d("div",{class:"q-table__separator col"})),Q.push(d("div",{class:"q-table__control"},[Ze(Le.value)]))),Q.length!==0?d("div",{class:nn},Q):void 0}const $e=f(()=>J.value===!0?null:O.value);function Xe(){const be=dt();return e.loading===!0&&t.loading===void 0&&be.push(d("tr",{class:"q-table__progress"},[d("th",{class:"relative-position",colspan:j.value},ze())])),d("thead",be)}function dt(){const be=t.header,Ne=t["header-cell"];if(be!==void 0)return be(Qe({header:!0})).slice();const Ze=k.value.map(it=>{const mt=t[`header-cell-${it.name}`],nn=mt!==void 0?mt:Ne,Q=Qe({col:it});return nn!==void 0?nn(Q):d(Vm,{key:it.name,props:Q},()=>it.label)});if(H.value===!0&&e.grid!==!0)Ze.unshift(d("th",{class:"q-table--col-auto-width"}," "));else if(T.value===!0){const it=t["header-selection"],mt=it!==void 0?it(Qe({})):[d(Or,{color:e.color,modelValue:$e.value,dark:i.value,dense:e.dense,"onUpdate:modelValue":xt})];Ze.unshift(d("th",{class:"q-table--col-auto-width"},mt))}return[d("tr",{class:e.tableHeaderClass,style:e.tableHeaderStyle},Ze)]}function Qe(be){return Object.assign(be,{cols:k.value,sort:G,colsMap:_.value,color:e.color,dark:i.value,dense:e.dense}),T.value===!0&&qn(be,"selected",()=>$e.value,xt),be}function xt(be){J.value===!0&&(be=!1),le(I.value.map(v.value),I.value,be)}const Gt=f(()=>{const be=[e.iconFirstPage||l.iconSet.table.firstPage,e.iconPrevPage||l.iconSet.table.prevPage,e.iconNextPage||l.iconSet.table.nextPage,e.iconLastPage||l.iconSet.table.lastPage];return l.lang.rtl===!0?be.reverse():be});function tn(){if(e.hideBottom===!0)return;if(ct.value===!0){if(e.hideNoData===!0)return;const Ze=e.loading===!0?e.loadingLabel||l.lang.table.loading:e.filter?e.noResultsLabel||l.lang.table.noResults:e.noDataLabel||l.lang.table.noData,it=t["no-data"],mt=it!==void 0?[it({message:Ze,icon:l.iconSet.table.warning,filter:e.filter})]:[d(Et,{class:"q-table__bottom-nodata-icon",name:l.iconSet.table.warning}),Ze];return d("div",{class:Di+" q-table__bottom--nodata"},mt)}const be=t.bottom;if(be!==void 0)return d("div",{class:Di},[be(Le.value)]);const Ne=e.hideSelectedBanner!==!0&&N.value===!0&&se.value>0?[d("div",{class:"q-table__control"},[d("div",[(e.selectedRowsLabel||l.lang.table.selectedRecords)(se.value)])])]:[];return e.hidePagination!==!0?d("div",{class:Di+" justify-end"},Hn(Ne)):Ne.length!==0?d("div",{class:Di},Ne):void 0}function Tn(be){S({page:1,rowsPerPage:be.value})}function Hn(be){let Ne;const{rowsPerPage:Ze}=$.value,it=e.paginationLabel||l.lang.table.pagination,mt=t.pagination,nn=e.rowsPerPageOptions.length>1;if(be.push(d("div",{class:"q-table__separator col"})),nn===!0&&be.push(d("div",{class:"q-table__control"},[d("span",{class:"q-table__bottom-item"},[e.rowsPerPageLabel||l.lang.table.recordsPerPage]),d(Bm,{class:"q-table__select inline q-table__bottom-item",color:e.color,modelValue:Ze,options:ge.value,displayValue:Ze===0?l.lang.table.allRows:Ze,dark:i.value,borderless:!0,dense:!0,optionsDense:!0,optionsCover:!0,"onUpdate:modelValue":Tn})])),mt!==void 0)Ne=mt(Le.value);else if(Ne=[d("span",Ze!==0?{class:"q-table__bottom-item"}:{},[Ze?it(ne.value+1,Math.min(W.value,Ee.value),Ee.value):it(1,z.value,Ee.value)])],Ze!==0&&ce.value>1){const Q={color:e.color,round:!0,dense:!0,flat:!0};e.dense===!0&&(Q.size="sm"),ce.value>2&&Ne.push(d(Rt,{key:"pgFirst",...Q,icon:Gt.value[0],disable:C.value,onClick:Me})),Ne.push(d(Rt,{key:"pgPrev",...Q,icon:Gt.value[1],disable:C.value,onClick:je}),d(Rt,{key:"pgNext",...Q,icon:Gt.value[2],disable:Z.value,onClick:Ke})),ce.value>2&&Ne.push(d(Rt,{key:"pgLast",...Q,icon:Gt.value[3],disable:Z.value,onClick:Oe}))}return be.push(d("div",{class:"q-table__control"},Ne)),be}function Co(){const be=e.gridHeader===!0?[d("table",{class:"q-table"},[Xe()])]:e.loading===!0&&t.loading===void 0?ze():void 0;return d("div",{class:"q-table__middle"},be)}function uo(){const be=t.item!==void 0?t.item:Ne=>{const Ze=Ne.cols.map(mt=>d("div",{class:"q-table__grid-item-row"},[d("div",{class:"q-table__grid-item-title"},[mt.label]),d("div",{class:"q-table__grid-item-value"},[mt.value])]));if(N.value===!0){const mt=t["body-selection"],nn=mt!==void 0?mt(Ne):[d(Or,{modelValue:Ne.selected,color:e.color,dark:i.value,dense:e.dense,"onUpdate:modelValue":(Q,ae)=>{le([Ne.key],[Ne.row],Q,ae)}})];Ze.unshift(d("div",{class:"q-table__grid-item-row"},nn),d($a,{dark:i.value}))}const it={class:["q-table__grid-item-card"+b.value,e.cardClass],style:e.cardStyle};return e.onRowClick===void 0&&e.onRowDblclick===void 0||(it.class[0]+=" cursor-pointer",e.onRowClick!==void 0&&(it.onClick=mt=>{n("RowClick",mt,Ne.row,Ne.pageIndex)}),e.onRowDblclick!==void 0&&(it.onDblclick=mt=>{n("RowDblclick",mt,Ne.row,Ne.pageIndex)})),d("div",{class:"q-table__grid-item col-xs-12 col-sm-6 col-md-4 col-lg-3"+(Ne.selected===!0?" q-table__grid-item--selected":"")},[d("div",it,Ze)])};return d("div",{class:["q-table__grid-content row",e.cardContainerClass],style:e.cardContainerStyle},I.value.map((Ne,Ze)=>be(nt({key:v.value(Ne),row:Ne,pageIndex:Ze}))))}return Object.assign(r.proxy,{requestServerInteraction:A,setPagination:S,firstPage:Me,prevPage:je,nextPage:Ke,lastPage:Oe,isRowSelected:R,clearSelection:oe,isRowExpanded:P,setExpanded:M,sort:G,resetVirtualScroll:pt,scrollTo:Be,getCellValue:me}),Op(r.proxy,{filteredSortedRows:()=>D.value,computedRows:()=>I.value,computedRowsNumber:()=>Ee.value}),()=>{const be=[de()],Ne={ref:m,class:w.value};return e.grid===!0?be.push(Co()):Object.assign(Ne,{class:[Ne.class,e.cardClass],style:e.cardStyle}),be.push(ke(),tn()),e.loading===!0&&t.loading!==void 0&&be.push(t.loading()),d("div",Ne,be)}}}),uM=we({name:"QTr",props:{props:Object,noHover:Boolean},setup(e,{slots:t}){const n=f(()=>"q-tr"+(e.props===void 0||e.props.header===!0?"":" "+e.props.__trClass)+(e.noHover===!0?" q-tr--no-hover":""));return()=>d("tr",{class:n.value},Ge(t.default))}}),cM=we({name:"QTd",props:{props:Object,autoWidth:Boolean,noHover:Boolean},setup(e,{slots:t}){const n=Ve(),r=f(()=>"q-td"+(e.autoWidth===!0?" q-table--col-auto-width":"")+(e.noHover===!0?" q-td--no-hover":"")+" ");return()=>{if(e.props===void 0)return d("td",{class:r.value},Ge(t.default));const l=n.vnode.key,i=(e.props.colsMap!==void 0?e.props.colsMap[l]:null)||e.props.col;if(i===void 0)return;const{row:c}=e.props;return d("td",{class:r.value+i.__tdClass(c),style:i.__tdStyle(c)},Ge(t.default))}}}),dM=we({name:"QRouteTab",props:{...Ur,...Vh},emits:Fh,setup(e,{slots:t,emit:n}){const r=Ts({useDisableForRouterLinkProps:!1}),{renderTab:l,$tabs:i}=Ih(e,t,n,{exact:f(()=>e.exact),...r});return _e(()=>`${e.name} | ${e.exact} | ${(r.resolvedLink.value||{}).href}`,()=>{i.verifyRouteModel()}),()=>l(r.linkTag.value,r.linkAttrs.value)}});function vM(e,t){if(e.hour!==null){if(e.minute===null)return"minute";if(t===!0&&e.second===null)return"second"}return"hour"}function fM(){const e=new Date;return{hour:e.getHours(),minute:e.getMinutes(),second:e.getSeconds(),millisecond:e.getMilliseconds()}}var pM=we({name:"QTime",props:{...Ft,...ko,...Dh,mask:{default:null},format24h:{type:Boolean,default:null},defaultDate:{type:String,validator:e=>/^-?[\d]+\/[0-1]\d\/[0-3]\d$/.test(e)},options:Function,hourOptions:Array,minuteOptions:Array,secondOptions:Array,withSeconds:Boolean,nowBtn:Boolean},emits:Qh,setup(e,{slots:t,emit:n}){const r=Ve(),{$q:l}=r.proxy,i=Vt(e,l),{tabindex:c,headerClass:u,getLocale:v,getCurrentDate:m}=Uh(e,l),p=Il(e),y=La(p);let b,g;const w=X(null),L=f(()=>K()),$=f(()=>v()),F=f(()=>G()),A=bl(e.modelValue,L.value,$.value,e.calendar,F.value),S=X(vM(A)),x=X(A),P=X(A.hour===null||A.hour<12),M=f(()=>`q-time q-time--${e.landscape===!0?"landscape":"portrait"}`+(i.value===!0?" q-time--dark q-dark":"")+(e.disable===!0?" disabled":e.readonly===!0?" q-time--readonly":"")+(e.bordered===!0?" q-time--bordered":"")+(e.square===!0?" q-time--square no-border-radius":"")+(e.flat===!0?" q-time--flat no-shadow":"")),E=f(()=>{const me=x.value;return{hour:me.hour===null?"--":D.value===!0?zt(me.hour):String(P.value===!0?me.hour===0?12:me.hour:me.hour>12?me.hour-12:me.hour),minute:me.minute===null?"--":zt(me.minute),second:me.second===null?"--":zt(me.second)}}),D=f(()=>e.format24h!==null?e.format24h:l.lang.date.format24h),z=f(()=>{const me=S.value==="hour",Le=me===!0?12:60,de=x.value[S.value];let Xe=`rotate(${Math.round(de*(360/Le))-180}deg) translateX(-50%)`;return me===!0&&D.value===!0&&x.value.hour>=12&&(Xe+=" scale(.7)"),{transform:Xe}}),I=f(()=>x.value.hour!==null),N=f(()=>I.value===!0&&x.value.minute!==null),H=f(()=>e.hourOptions!==void 0?me=>e.hourOptions.includes(me):e.options!==void 0?me=>e.options(me,null,null):null),T=f(()=>e.minuteOptions!==void 0?me=>e.minuteOptions.includes(me):e.options!==void 0?me=>e.options(x.value.hour,me,null):null),O=f(()=>e.secondOptions!==void 0?me=>e.secondOptions.includes(me):e.options!==void 0?me=>e.options(x.value.hour,x.value.minute,me):null),J=f(()=>{if(H.value===null)return null;const me=_(0,11,H.value),Le=_(12,11,H.value);return{am:me,pm:Le,values:me.values.concat(Le.values)}}),se=f(()=>T.value!==null?_(0,59,T.value):null),R=f(()=>O.value!==null?_(0,59,O.value):null),oe=f(()=>{switch(S.value){case"hour":return J.value;case"minute":return se.value;case"second":return R.value}}),le=f(()=>{let me,Le,de=0,$e=1;const Xe=oe.value!==null?oe.value.values:void 0;S.value==="hour"?D.value===!0?(me=0,Le=23):(me=0,Le=11,P.value===!1&&(de=12)):(me=0,Le=55,$e=5);const dt=[];for(let Qe=me,xt=me;Qe<=Le;Qe+=$e,xt++){const Gt=Qe+de,tn=Xe!==void 0&&Xe.includes(Gt)===!1,Tn=S.value==="hour"&&Qe===0?D.value===!0?"00":"12":Qe;dt.push({val:Gt,index:xt,disable:tn,label:Tn})}return dt}),Se=f(()=>[[io,C,void 0,{stop:!0,prevent:!0,mouse:!0}]]);function k(){const me={...m(),...fM()};kt(me),Object.assign(x.value,me),S.value="hour"}function _(me,Le,de){const $e=Array.apply(null,{length:Le+1}).map((Xe,dt)=>{const Qe=dt+me;return{index:Qe,val:de(Qe)===!0}}).filter(Xe=>Xe.val===!0).map(Xe=>Xe.index);return{min:$e[0],max:$e[$e.length-1],values:$e,threshold:Le+1}}function j(me,Le,de){const $e=Math.abs(me-Le);return Math.min($e,de-$e)}function U(me,{min:Le,max:de,values:$e,threshold:Xe}){if(me===Le)return Le;if(mede)return j(me,Le,Xe)<=j(me,de,Xe)?Le:de;const dt=$e.findIndex(Gt=>me<=Gt),Qe=$e[dt-1],xt=$e[dt];return me-Qe<=xt-me?Qe:xt}function K(){return e.calendar!=="persian"&&e.mask!==null?e.mask:`HH:mm${e.withSeconds===!0?":ss":""}`}function G(){if(typeof e.defaultDate!="string"){const me=m(!0);return me.dateHash=oa(me),me}return bl(e.defaultDate,"YYYY/MM/DD",void 0,e.calendar)}function ne(){return Bl(r)===!0||oe.value!==null&&(oe.value.values.length===0||S.value==="hour"&&D.value!==!0&&J.value[P.value===!0?"am":"pm"].values.length===0)}function W(){const me=w.value,{top:Le,left:de,width:$e}=me.getBoundingClientRect(),Xe=$e/2;return{top:Le+Xe,left:de+Xe,dist:.7*Xe}}function C(me){if(ne()!==!0){if(me.isFirst===!0)return b=W(),void(g=ce(me.evt,b));g=ce(me.evt,b,g),me.isFinal===!0&&(b=!1,g=null,Z())}}function Z(){S.value==="hour"?S.value="minute":e.withSeconds&&S.value==="minute"&&(S.value="second")}function ce(me,Le,de){const $e=jn(me),Xe=Math.abs($e.top-Le.top),dt=Math.sqrt(Math.pow(Math.abs($e.top-Le.top),2)+Math.pow(Math.abs($e.left-Le.left),2));let Qe,xt=Math.asin(Xe/dt)*(180/Math.PI);if(xt=$e.top=Le.dist:J.value.am.values.length!==0;Qe=U(Qe+(Gt===!0?0:12),J.value[Gt===!0?"am":"pm"])}else Qe=Math.round(Qe),D.value===!0?dte.modelValue,me=>{const Le=bl(me,L.value,$.value,e.calendar,F.value);Le.dateHash===x.value.dateHash&&Le.timeHash===x.value.timeHash||(x.value=Le,Le.hour===null?S.value="hour":P.value=Le.hour<12)}),_e([L,$],()=>{Tt(()=>{kt()})});const ge={hour(){S.value="hour"},minute(){S.value="minute"},second(){S.value="second"}};function Ee(me){me.keyCode===13&&ze()}function Me(me){me.keyCode===13&&tt()}function je(me){ne()!==!0&&(l.platform.is.desktop!==!0&&ce(me,W()),Z())}function Ke(me){ne()!==!0&&ce(me,W())}function Oe(me){if(me.keyCode===13)S.value="hour";else if([37,39].includes(me.keyCode)){const Le=me.keyCode===37?-1:1;if(J.value!==null){const de=D.value===!0?J.value.values:J.value[P.value===!0?"am":"pm"].values;if(de.length===0)return;if(x.value.hour===null)pt(de[0]);else{const $e=(de.length+de.indexOf(x.value.hour)+Le)%de.length;pt(de[$e])}}else{const de=D.value===!0?24:12,$e=D.value!==!0&&P.value===!1?12:0,Xe=x.value.hour===null?-Le:x.value.hour;pt($e+(24+Xe+Le)%de)}}}function ct(me){if(me.keyCode===13)S.value="minute";else if([37,39].includes(me.keyCode)){const Le=me.keyCode===37?-1:1;if(se.value!==null){const de=se.value.values;if(de.length===0)return;if(x.value.minute===null)ke(de[0]);else{const $e=(de.length+de.indexOf(x.value.minute)+Le)%de.length;ke(de[$e])}}else{const de=x.value.minute===null?-Le:x.value.minute;ke((60+de+Le)%60)}}}function Pt(me){if(me.keyCode===13)S.value="second";else if([37,39].includes(me.keyCode)){const Le=me.keyCode===37?-1:1;if(R.value!==null){const de=R.value.values;if(de.length===0)return;if(x.value.seconds===null)Be(de[0]);else{const $e=(de.length+de.indexOf(x.value.second)+Le)%de.length;Be(de[$e])}}else{const de=x.value.second===null?-Le:x.value.second;Be((60+de+Le)%60)}}}function pt(me){x.value.hour!==me&&(x.value.hour=me,nt())}function ke(me){x.value.minute!==me&&(x.value.minute=me,nt())}function Be(me){x.value.second!==me&&(x.value.second=me,nt())}const ve={hour:pt,minute:ke,second:Be};function ze(){P.value===!1&&(P.value=!0,x.value.hour!==null&&(x.value.hour-=12,nt()))}function tt(){P.value===!0&&(P.value=!1,x.value.hour!==null&&(x.value.hour+=12,nt()))}function lt(me){const Le=e.modelValue;S.value!==me&&Le!==void 0&&Le!==null&&Le!==""&&typeof Le!="string"&&(S.value=me)}function nt(){return H.value!==null&&H.value(x.value.hour)!==!0?(x.value=bl(),void lt("hour")):T.value!==null&&T.value(x.value.minute)!==!0?(x.value.minute=null,x.value.second=null,void lt("minute")):e.withSeconds===!0&&O.value!==null&&O.value(x.value.second)!==!0?(x.value.second=null,void lt("second")):void(x.value.hour===null||x.value.minute===null||e.withSeconds===!0&&x.value.second===null||kt())}function kt(me){const Le=Object.assign({...x.value},me),de=e.calendar==="persian"?zt(Le.hour)+":"+zt(Le.minute)+(e.withSeconds===!0?":"+zt(Le.second):""):Gh(new Date(Le.year,Le.month===null?null:Le.month-1,Le.day,Le.hour,Le.minute,Le.second,Le.millisecond),L.value,$.value,Le.year,Le.timezoneOffset);Le.changed=de!==e.modelValue,n("update:modelValue",de,Le)}function Ht(){const me=[d("div",{class:"q-time__link "+(S.value==="hour"?"q-time__link--active":"cursor-pointer"),tabindex:c.value,onClick:ge.hour,onKeyup:Oe},E.value.hour),d("div",":"),d("div",I.value===!0?{class:"q-time__link "+(S.value==="minute"?"q-time__link--active":"cursor-pointer"),tabindex:c.value,onKeyup:ct,onClick:ge.minute}:{class:"q-time__link"},E.value.minute)];e.withSeconds===!0&&me.push(d("div",":"),d("div",N.value===!0?{class:"q-time__link "+(S.value==="second"?"q-time__link--active":"cursor-pointer"),tabindex:c.value,onKeyup:Pt,onClick:ge.second}:{class:"q-time__link"},E.value.second));const Le=[d("div",{class:"q-time__header-label row items-center no-wrap",dir:"ltr"},me)];return D.value===!1&&Le.push(d("div",{class:"q-time__header-ampm column items-between no-wrap"},[d("div",{class:"q-time__link "+(P.value===!0?"q-time__link--active":"cursor-pointer"),tabindex:c.value,onClick:ze,onKeyup:Ee},"AM"),d("div",{class:"q-time__link "+(P.value!==!0?"q-time__link--active":"cursor-pointer"),tabindex:c.value,onClick:tt,onKeyup:Me},"PM")])),d("div",{class:"q-time__header flex flex-center no-wrap "+u.value},Le)}function Dt(){const me=x.value[S.value];return d("div",{class:"q-time__content col relative-position"},[d(yn,{name:"q-transition--scale"},()=>d("div",{key:"clock"+S.value,class:"q-time__container-parent absolute-full"},[d("div",{ref:w,class:"q-time__container-child fit overflow-hidden"},[Bo(d("div",{class:"q-time__clock cursor-pointer non-selectable",onClick:je,onMousedown:Ke},[d("div",{class:"q-time__clock-circle fit"},[d("div",{class:"q-time__clock-pointer"+(x.value[S.value]===null?" hidden":e.color!==void 0?` text-${e.color}`:""),style:z.value}),le.value.map(Le=>d("div",{class:`q-time__clock-position row flex-center q-time__clock-pos-${Le.index}`+(Le.val===me?" q-time__clock-position--active "+u.value:Le.disable===!0?" q-time__clock-position--disable":"")},[d("span",Le.label)]))])]),Se.value)])])),e.nowBtn===!0?d(Rt,{class:"q-time__now-button absolute",icon:l.iconSet.datetime.now,unelevated:!0,size:"sm",round:!0,color:e.color,textColor:e.textColor,tabindex:c.value,onClick:k}):null])}return r.proxy.setNow=k,()=>{const me=[Dt()],Le=Ge(t.default);return Le!==void 0&&me.push(d("div",{class:"q-time__actions"},Le)),e.name!==void 0&&e.disable!==!0&&y(me,"push"),d("div",{class:M.value,tabindex:-1},[Ht(),d("div",{class:"q-time__main col overflow-auto"},me)])}}}),hM=we({name:"QTimeline",props:{...Ft,color:{type:String,default:"primary"},side:{type:String,default:"right",validator:e=>["left","right"].includes(e)},layout:{type:String,default:"dense",validator:e=>["dense","comfortable","loose"].includes(e)}},setup(e,{slots:t}){const n=Ve(),r=Vt(e,n.proxy.$q);Do(Dp,e);const l=f(()=>`q-timeline q-timeline--${e.layout} q-timeline--${e.layout}--${e.side}`+(r.value===!0?" q-timeline--dark":""));return()=>d("ul",{class:l.value},Ge(t.default))}}),mM=we({name:"QTimelineEntry",props:{heading:Boolean,tag:{type:String,default:"h3"},side:{type:String,default:"right",validator:e=>["left","right"].includes(e)},icon:String,avatar:String,color:String,title:String,subtitle:String,body:String},setup(e,{slots:t}){const n=Fn(Dp,Nt);if(n===Nt)return console.error("QTimelineEntry needs to be child of QTimeline"),Nt;const r=f(()=>`q-timeline__entry q-timeline__entry--${e.side}`+(e.icon!==void 0||e.avatar!==void 0?" q-timeline__entry--icon":"")),l=f(()=>`q-timeline__dot text-${e.color||n.color}`),i=f(()=>n.layout==="comfortable"&&n.side==="left");return()=>{const c=Pl(t.default,[]);if(e.body!==void 0&&c.unshift(e.body),e.heading===!0){const m=[d("div"),d("div"),d(e.tag,{class:"q-timeline__heading-title"},c)];return d("div",{class:"q-timeline__heading"},i.value===!0?m.reverse():m)}let u;e.icon!==void 0?u=[d(Et,{class:"row items-center justify-center",name:e.icon})]:e.avatar!==void 0&&(u=[d("img",{class:"q-timeline__dot-img",src:e.avatar})]);const v=[d("div",{class:"q-timeline__subtitle"},[d("span",{},Ge(t.subtitle,[e.subtitle]))]),d("div",{class:l.value},u),d("div",{class:"q-timeline__content"},[d("h6",{class:"q-timeline__title"},Ge(t.title,[e.title]))].concat(c))];return d("li",{class:r.value},i.value===!0?v.reverse():v)}}}),gM=we({name:"QToolbar",props:{inset:Boolean},setup(e,{slots:t}){const n=f(()=>"q-toolbar row no-wrap items-center"+(e.inset===!0?" q-toolbar--inset":""));return()=>d("div",{class:n.value,role:"toolbar"},Ge(t.default))}}),bM=we({name:"QToolbarTitle",props:{shrink:Boolean},setup(e,{slots:t}){const n=f(()=>"q-toolbar__title ellipsis"+(e.shrink===!0?" col-shrink":""));return()=>d("div",{class:n.value},Ge(t.default))}});const yM=["none","strict","leaf","leaf-filtered"];var _M=we({name:"QTree",props:{...Ft,nodes:{type:Array,required:!0},nodeKey:{type:String,required:!0},labelKey:{type:String,default:"label"},childrenKey:{type:String,default:"children"},dense:Boolean,color:String,controlColor:String,textColor:String,selectedColor:String,icon:String,tickStrategy:{type:String,default:"none",validator:e=>yM.includes(e)},ticked:Array,expanded:Array,selected:{},noSelectionUnset:Boolean,defaultExpandAll:Boolean,accordion:Boolean,filter:String,filterMethod:Function,duration:Number,noConnectors:Boolean,noTransition:Boolean,noNodesLabel:String,noResultsLabel:String},emits:["update:expanded","update:ticked","update:selected","lazyLoad","afterShow","afterHide"],setup(e,{slots:t,emit:n}){const{proxy:r}=Ve(),{$q:l}=r,i=Vt(e,l),c=X({}),u=X(e.ticked||[]),v=X(e.expanded||[]);let m={};Ll(()=>{m={}});const p=f(()=>`q-tree q-tree--${e.dense===!0?"dense":"standard"}`+(e.noConnectors===!0?" q-tree--no-connectors":"")+(i.value===!0?" q-tree--dark":"")+(e.color!==void 0?` text-${e.color}`:"")),y=f(()=>e.selected!==void 0),b=f(()=>e.icon||l.iconSet.tree.icon),g=f(()=>e.controlColor||e.color),w=f(()=>e.textColor!==void 0?` text-${e.textColor}`:""),L=f(()=>{const _=e.selectedColor||e.color;return _?` text-${_}`:""}),$=f(()=>e.filterMethod!==void 0?e.filterMethod:(_,j)=>{const U=j.toLowerCase();return _[e.labelKey]&&_[e.labelKey].toLowerCase().indexOf(U)>-1}),F=f(()=>{const _={},j=(U,K)=>{const G=U.tickStrategy||(K?K.tickStrategy:e.tickStrategy),ne=U[e.nodeKey],W=U[e.childrenKey]&&Array.isArray(U[e.childrenKey])&&U[e.childrenKey].length!==0,C=U.disabled!==!0&&y.value===!0&&U.selectable!==!1,Z=U.disabled!==!0&&U.expandable!==!1,ce=G!=="none",ge=G==="strict",Ee=G==="leaf-filtered",Me=G==="leaf"||G==="leaf-filtered";let je=U.disabled!==!0&&U.tickable!==!1;Me===!0&&je===!0&&K&&K.tickable!==!0&&(je=!1);let Ke=U.lazy;Ke===!0&&c.value[ne]!==void 0&&Array.isArray(U[e.childrenKey])===!0&&(Ke=c.value[ne]);const Oe={key:ne,parent:K,isParent:W,lazy:Ke,disabled:U.disabled,link:U.disabled!==!0&&(C===!0||Z===!0&&(W===!0||Ke===!0)),children:[],matchesFilter:!e.filter||$.value(U,e.filter),selected:ne===e.selected&&C===!0,selectable:C,expanded:W===!0&&v.value.includes(ne),expandable:Z,noTick:U.noTick===!0||ge!==!0&&Ke&&Ke!=="loaded",tickable:je,tickStrategy:G,hasTicking:ce,strictTicking:ge,leafFilteredTicking:Ee,leafTicking:Me,ticked:(ge===!0||W!==!0)&&u.value.includes(ne)};if(_[ne]=Oe,W===!0&&(Oe.children=U[e.childrenKey].map(ct=>j(ct,Oe)),e.filter&&(Oe.matchesFilter!==!0?Oe.matchesFilter=Oe.children.some(ct=>ct.matchesFilter):Oe.noTick!==!0&&Oe.disabled!==!0&&Oe.tickable===!0&&Ee===!0&&Oe.children.every(ct=>ct.matchesFilter!==!0||ct.noTick===!0||ct.tickable!==!0)===!0&&(Oe.tickable=!1)),Oe.matchesFilter===!0&&(Oe.noTick!==!0&&ge!==!0&&Oe.children.every(ct=>ct.noTick)===!0&&(Oe.noTick=!0),Me))){if(Oe.ticked=!1,Oe.indeterminate=Oe.children.some(ct=>ct.indeterminate===!0),Oe.tickable=Oe.tickable===!0&&Oe.children.some(ct=>ct.tickable),Oe.indeterminate!==!0){const ct=Oe.children.reduce((Pt,pt)=>pt.ticked===!0?Pt+1:Pt,0);ct===Oe.children.length?Oe.ticked=!0:ct>0&&(Oe.indeterminate=!0)}Oe.indeterminate===!0&&(Oe.indeterminateNextState=Oe.children.every(ct=>ct.tickable!==!0||ct.ticked!==!0))}return Oe};return e.nodes.forEach(U=>j(U,null)),_});function A(_){const j=[].reduce,U=(K,G)=>K||!G?K:Array.isArray(G)===!0?j.call(Object(G),U,K):G[e.nodeKey]===_?G:G[e.childrenKey]?U(null,G[e.childrenKey]):void 0;return U(null,e.nodes)}function S(){return u.value.map(_=>A(_))}function x(){return v.value.map(_=>A(_))}function P(_){return!(!_||!F.value[_])&&F.value[_].expanded}function M(){e.expanded!==void 0?n("update:expanded",[]):v.value=[]}function E(){const _=[],j=U=>{U[e.childrenKey]&&U[e.childrenKey].length!==0&&U.expandable!==!1&&U.disabled!==!0&&(_.push(U[e.nodeKey]),U[e.childrenKey].forEach(j))};e.nodes.forEach(j),e.expanded!==void 0?n("update:expanded",_):v.value=_}function D(_,j,U=A(_),K=F.value[_]){if(K.lazy&&K.lazy!=="loaded"){if(K.lazy==="loading")return;c.value[_]="loading",Array.isArray(U[e.childrenKey])!==!0&&(U[e.childrenKey]=[]),n("lazyLoad",{node:U,key:_,done:G=>{c.value[_]="loaded",U[e.childrenKey]=Array.isArray(G)===!0?G:[],Tt(()=>{const ne=F.value[_];ne&&ne.isParent===!0&&z(_,!0)})},fail:()=>{delete c.value[_],U[e.childrenKey].length===0&&delete U[e.childrenKey]}})}else K.isParent===!0&&K.expandable===!0&&z(_,j)}function z(_,j){let U=v.value;const K=e.expanded!==void 0;if(K===!0&&(U=U.slice()),j){if(e.accordion&&F.value[_]){const G=[];F.value[_].parent?F.value[_].parent.children.forEach(ne=>{ne.key!==_&&ne.expandable===!0&&G.push(ne.key)}):e.nodes.forEach(ne=>{const W=ne[e.nodeKey];W!==_&&G.push(W)}),G.length!==0&&(U=U.filter(ne=>G.includes(ne)===!1))}U=U.concat([_]).filter((G,ne,W)=>W.indexOf(G)===ne)}else U=U.filter(G=>G!==_);K===!0?n("update:expanded",U):v.value=U}function I(_){return!(!_||!F.value[_])&&F.value[_].ticked}function N(_,j){let U=u.value;const K=e.ticked!==void 0;K===!0&&(U=U.slice()),U=j?U.concat(_).filter((G,ne,W)=>W.indexOf(G)===ne):U.filter(G=>_.includes(G)===!1),K===!0&&n("update:ticked",U)}function H(_,j,U){const K={tree:r,node:_,key:U,color:e.color,dark:i.value};return qn(K,"expanded",()=>j.expanded,G=>{G!==j.expanded&&D(U,G)}),qn(K,"ticked",()=>j.ticked,G=>{G!==j.ticked&&N([U],G)}),K}function T(_){return(e.filter?_.filter(j=>F.value[j[e.nodeKey]].matchesFilter):_).map(j=>R(j))}function O(_){if(_.icon!==void 0)return d(Et,{class:"q-tree__icon q-mr-sm",name:_.icon,color:_.iconColor});const j=_.img||_.avatar;return j?d("img",{class:`q-tree__${_.img?"img":"avatar"} q-mr-sm`,src:j}):void 0}function J(){n("afterShow")}function se(){n("afterHide")}function R(_){const j=_[e.nodeKey],U=F.value[j],K=_.header&&t[`header-${_.header}`]||t["default-header"],G=U.isParent===!0?T(_[e.childrenKey]):[],ne=G.length!==0||U.lazy&&U.lazy!=="loaded";let W=_.body&&t[`body-${_.body}`]||t["default-body"];const C=K!==void 0||W!==void 0?H(_,U,j):null;return W!==void 0&&(W=d("div",{class:"q-tree__node-body relative-position"},[d("div",{class:w.value},[W(C)])])),d("div",{key:j,class:`q-tree__node relative-position q-tree__node--${ne===!0?"parent":"child"}`},[d("div",{class:"q-tree__node-header relative-position row no-wrap items-center"+(U.link===!0?" q-tree__node--link q-hoverable q-focusable":"")+(U.selected===!0?" q-tree__node--selected":"")+(U.disabled===!0?" q-tree__node--disabled":""),tabindex:U.link===!0?0:-1,ariaExpanded:G.length>0?U.expanded:null,role:"treeitem",onClick:Z=>{le(_,U,Z)},onKeypress(Z){or(Z)!==!0&&(Z.keyCode===13?le(_,U,Z,!0):Z.keyCode===32&&Se(_,U,Z,!0))}},[d("div",{class:"q-focus-helper",tabindex:-1,ref:Z=>{m[U.key]=Z}}),U.lazy==="loading"?d(So,{class:"q-tree__spinner",color:g.value}):ne===!0?d(Et,{class:"q-tree__arrow"+(U.expanded===!0?" q-tree__arrow--rotate":""),name:b.value,onClick(Z){Se(_,U,Z)}}):null,U.hasTicking===!0&&U.noTick!==!0?d(Or,{class:"q-tree__tickbox",modelValue:U.indeterminate===!0?null:U.ticked,color:g.value,dark:i.value,dense:!0,keepColor:!0,disable:U.tickable!==!0,onKeydown:bt,"onUpdate:modelValue":Z=>{k(U,Z)}}):null,d("div",{class:"q-tree__node-header-content col row no-wrap items-center"+(U.selected===!0?L.value:w.value)},[K?K(C):[O(_),d("div",_[e.labelKey])]])]),ne===!0?e.noTransition===!0?U.expanded===!0?d("div",{class:"q-tree__node-collapsible"+w.value,key:`${j}__q`},[W,d("div",{class:"q-tree__children"+(U.disabled===!0?" q-tree__node--disabled":""),role:"group"},G)]):null:d(As,{duration:e.duration,onShow:J,onHide:se},()=>Bo(d("div",{class:"q-tree__node-collapsible"+w.value,key:`${j}__q`},[W,d("div",{class:"q-tree__children"+(U.disabled===!0?" q-tree__node--disabled":""),role:"group"},G)]),[[Cp,U.expanded]])):W])}function oe(_){const j=m[_];j&&j.focus()}function le(_,j,U,K){K!==!0&&j.selectable!==!1&&oe(j.key),y.value&&j.selectable?e.noSelectionUnset===!1?n("update:selected",j.key!==e.selected?j.key:null):j.key!==e.selected&&n("update:selected",j.key===void 0?null:j.key):Se(_,j,U,K),typeof _.handler=="function"&&_.handler(_)}function Se(_,j,U,K){U!==void 0&&bt(U),K!==!0&&j.selectable!==!1&&oe(j.key),D(j.key,!j.expanded,_,j)}function k(_,j){if(_.indeterminate===!0&&(j=_.indeterminateNextState),_.strictTicking)N([_.key],j);else if(_.leafTicking){const U=[],K=G=>{G.isParent?(j!==!0&&G.noTick!==!0&&G.tickable===!0&&U.push(G.key),G.leafTicking===!0&&G.children.forEach(K)):G.noTick===!0||G.tickable!==!0||G.leafFilteredTicking===!0&&G.matchesFilter!==!0||U.push(G.key)};K(_),N(U,j)}}return _e(()=>e.ticked,_=>{u.value=_}),_e(()=>e.expanded,_=>{v.value=_}),e.defaultExpandAll===!0&&E(),Object.assign(r,{getNodeByKey:A,getTickedNodes:S,getExpandedNodes:x,isExpanded:P,collapseAll:M,expandAll:E,setExpanded:D,isTicked:I,setTicked:N}),()=>{const _=T(e.nodes);return d("div",{class:p.value,role:"tree"},_.length===0?e.filter?e.noResultsLabel||l.lang.tree.noResults:e.noNodesLabel||l.lang.tree.noNodes:_)}}});function Jf(e){return(100*e).toFixed(2)+"%"}const wM={...Ft,...dm,label:String,color:String,textColor:String,square:Boolean,flat:Boolean,bordered:Boolean,noThumbnails:Boolean,autoUpload:Boolean,hideUploadBtn:Boolean,disable:Boolean,readonly:Boolean},zm=[...vm,"start","finish","added","removed"];function xM(e,t){const n=Ve(),{props:r,slots:l,emit:i,proxy:c}=n,{$q:u}=c,v=Vt(r,u);function m(C,Z,ce){if(C.__status=Z,Z==="idle")return C.__uploaded=0,C.__progress=0,C.__sizeLabel=xc(C.size),void(C.__progressLabel="0.00%");Z!=="failed"&&(C.__uploaded=Z==="uploaded"?C.size:ce,C.__progress=Z==="uploaded"?1:Math.min(.9999,C.__uploaded/C.size),C.__progressLabel=Jf(C.__progress)),c.$forceUpdate()}const p=f(()=>r.disable!==!0&&r.readonly!==!0),y=X(!1),b=X(null),g=X(null),w={files:X([]),queuedFiles:X([]),uploadedFiles:X([]),uploadedSize:X(0),updateFileStatus:m,isAlive:()=>Bl(n)===!1},{pickFiles:L,addFiles:$,onDragover:F,onDragleave:A,processFiles:S,getDndNode:x,maxFilesNumber:P,maxTotalSizeNumber:M}=fm({editable:p,dnd:y,getFileInput:k,addFilesToQueue:_});Object.assign(w,e({props:r,slots:l,emit:i,helpers:w,exposeApi:C=>{Object.assign(w,C)}})),w.isBusy===void 0&&(w.isBusy=X(!1));const E=X(0),D=f(()=>E.value===0?0:w.uploadedSize.value/E.value),z=f(()=>Jf(D.value)),I=f(()=>xc(E.value)),N=f(()=>p.value===!0&&w.isUploading.value!==!0&&(r.multiple===!0||w.queuedFiles.value.length===0)&&(r.maxFiles===void 0||w.files.value.lengthp.value===!0&&w.isBusy.value!==!0&&w.isUploading.value!==!0&&w.queuedFiles.value.length!==0);Do(Kp,K);const T=f(()=>"q-uploader column no-wrap"+(v.value===!0?" q-uploader--dark q-dark":"")+(r.bordered===!0?" q-uploader--bordered":"")+(r.square===!0?" q-uploader--square no-border-radius":"")+(r.flat===!0?" q-uploader--flat no-shadow":"")+(r.disable===!0?" disabled q-uploader--disable":"")+(y.value===!0?" q-uploader--dnd":"")),O=f(()=>"q-uploader__header"+(r.color!==void 0?` bg-${r.color}`:"")+(r.textColor!==void 0?` text-${r.textColor}`:""));function J(){r.disable===!1&&(w.abort(),w.uploadedSize.value=0,E.value=0,Se(),w.files.value=[],w.queuedFiles.value=[],w.uploadedFiles.value=[])}function se(){r.disable===!1&&oe(["uploaded"],()=>{w.uploadedFiles.value=[]})}function R(){oe(["idle","failed"],({size:C})=>{E.value-=C,w.queuedFiles.value=[]})}function oe(C,Z){if(r.disable===!0)return;const ce={files:[],size:0},ge=w.files.value.filter(Ee=>C.indexOf(Ee.__status)===-1||(ce.size+=Ee.size,ce.files.push(Ee),Ee.__img!==void 0&&window.URL.revokeObjectURL(Ee.__img.src),!1));ce.files.length!==0&&(w.files.value=ge,Z(ce),i("removed",ce.files))}function le(C){r.disable||(C.__status==="uploaded"?w.uploadedFiles.value=w.uploadedFiles.value.filter(Z=>Z.__key!==C.__key):C.__status==="uploading"?C.__abort():E.value-=C.size,w.files.value=w.files.value.filter(Z=>Z.__key!==C.__key||(Z.__img!==void 0&&window.URL.revokeObjectURL(Z.__img.src),!1)),w.queuedFiles.value=w.queuedFiles.value.filter(Z=>Z.__key!==C.__key),i("removed",[C]))}function Se(){w.files.value.forEach(C=>{C.__img!==void 0&&window.URL.revokeObjectURL(C.__img.src)})}function k(){return g.value||b.value.getElementsByClassName("q-uploader__input")[0]}function _(C,Z){const ce=S(C,Z,w.files.value,!0),ge=k();ge!=null&&(ge.value=""),ce!==void 0&&(ce.forEach(Ee=>{if(w.updateFileStatus(Ee,"idle"),E.value+=Ee.size,r.noThumbnails!==!0&&Ee.type.toUpperCase().startsWith("IMAGE")){const Me=new Image;Me.src=window.URL.createObjectURL(Ee),Ee.__img=Me}}),w.files.value=w.files.value.concat(ce),w.queuedFiles.value=w.queuedFiles.value.concat(ce),i("added",ce),r.autoUpload===!0&&w.upload())}function j(){H.value===!0&&w.upload()}function U(C,Z,ce){if(C===!0){const ge={type:"a",key:Z,icon:u.iconSet.uploader[Z],flat:!0,dense:!0};let Ee;return Z==="add"?(ge.onClick=L,Ee=K):ge.onClick=ce,d(Rt,ge,Ee)}}function K(){return d("input",{ref:g,class:"q-uploader__input overflow-hidden absolute-full",tabindex:-1,type:"file",title:"",accept:r.accept,multiple:r.multiple===!0?"multiple":void 0,capture:r.capture,onMousedown:dn,onClick:L,onChange:_})}function G(){return l.header!==void 0?l.header(W):[d("div",{class:"q-uploader__header-content column"},[d("div",{class:"flex flex-center no-wrap q-gutter-xs"},[U(w.queuedFiles.value.length!==0,"removeQueue",R),U(w.uploadedFiles.value.length!==0,"removeUploaded",se),w.isUploading.value===!0?d(So,{class:"q-uploader__spinner"}):null,d("div",{class:"col column justify-center"},[r.label!==void 0?d("div",{class:"q-uploader__title"},[r.label]):null,d("div",{class:"q-uploader__subtitle"},[I.value+" / "+z.value])]),U(N.value,"add"),U(r.hideUploadBtn===!1&&H.value===!0,"upload",w.upload),U(w.isUploading.value,"clear",w.abort)])])]}function ne(){return l.list!==void 0?l.list(W):w.files.value.map(C=>d("div",{key:C.__key,class:"q-uploader__file relative-position"+(r.noThumbnails!==!0&&C.__img!==void 0?" q-uploader__file--img":"")+(C.__status==="failed"?" q-uploader__file--failed":C.__status==="uploaded"?" q-uploader__file--uploaded":""),style:r.noThumbnails!==!0&&C.__img!==void 0?{backgroundImage:'url("'+C.__img.src+'")'}:null},[d("div",{class:"q-uploader__file-header row flex-center no-wrap"},[C.__status==="failed"?d(Et,{class:"q-uploader__file-status",name:u.iconSet.type.negative,color:"negative"}):null,d("div",{class:"q-uploader__file-header-content col"},[d("div",{class:"q-uploader__title"},[C.name]),d("div",{class:"q-uploader__subtitle row items-center no-wrap"},[C.__sizeLabel+" / "+C.__progressLabel])]),C.__status==="uploading"?d(pd,{value:C.__progress,min:0,max:1,indeterminate:C.__progress===0}):d(Rt,{round:!0,dense:!0,flat:!0,icon:u.iconSet.uploader[C.__status==="uploaded"?"done":"clear"],onClick:()=>{le(C)}})])]))}_e(w.isUploading,(C,Z)=>{Z===!1&&C===!0?i("start"):Z===!0&&C===!1&&i("finish")}),qt(()=>{w.isUploading.value===!0&&w.abort(),w.files.value.length!==0&&Se()});const W={};for(const C in w)Mx(w[C])===!0?qn(W,C,()=>w[C].value):W[C]=w[C];return Object.assign(W,{upload:j,reset:J,removeUploadedFiles:se,removeQueuedFiles:R,removeFile:le,pickFiles:L,addFiles:$}),Op(W,{canAddFiles:()=>N.value,canUpload:()=>H.value,uploadSizeLabel:()=>I.value,uploadProgressLabel:()=>z.value}),t({...w,upload:j,reset:J,removeUploadedFiles:se,removeQueuedFiles:R,removeFile:le,pickFiles:L,addFiles:$,canAddFiles:N,canUpload:H,uploadSizeLabel:I,uploadProgressLabel:z}),()=>{const C=[d("div",{class:O.value},G()),d("div",{class:"q-uploader__list scroll"},ne()),x("uploader")];w.isBusy.value===!0&&C.push(d("div",{class:"q-uploader__overlay absolute-full flex flex-center"},[d(So)]));const Z={ref:b,class:T.value};return N.value===!0&&Object.assign(Z,{onDragover:F,onDragleave:A}),d("div",Z,C)}}const SM=()=>!0;function Nm(e){const t={};return e.forEach(n=>{t[n]=SM}),t}const kM=Nm(zm);var CM=({name:e,props:t,emits:n,injectPlugin:r})=>we({name:e,props:{...wM,...t},emits:En(n)===!0?{...kM,...n}:[...zm,...n],setup(l,{expose:i}){return xM(r,i)}});function na(e){return typeof e=="function"?e:()=>e}const qM={url:[Function,String],method:{type:[Function,String],default:"POST"},fieldName:{type:[Function,String],default:()=>e=>e.name},headers:[Function,Array],formFields:[Function,Array],withCredentials:[Function,Boolean],sendRaw:[Function,Boolean],batch:[Function,Boolean],factory:Function},$M=["factoryFailed","uploaded","failed","uploading"];function TM({props:e,emit:t,helpers:n}){const r=X([]),l=X([]),i=X(0),c=f(()=>({url:na(e.url),method:na(e.method),headers:na(e.headers),formFields:na(e.formFields),fieldName:na(e.fieldName),withCredentials:na(e.withCredentials),sendRaw:na(e.sendRaw),batch:na(e.batch)})),u=f(()=>i.value>0),v=f(()=>l.value.length!==0);let m;function p(){r.value.forEach(w=>{w.abort()}),l.value.length!==0&&(m=!0)}function y(){const w=n.queuedFiles.value.slice(0);n.queuedFiles.value=[],c.value.batch(w)?b(w):w.forEach(L=>{b([L])})}function b(w){if(i.value++,typeof e.factory!="function")return void g(w,{});const L=e.factory(w);if(L)if(typeof L.catch=="function"&&typeof L.then=="function"){l.value.push(L);const $=F=>{n.isAlive()===!0&&(l.value=l.value.filter(A=>A!==L),l.value.length===0&&(m=!1),n.queuedFiles.value=n.queuedFiles.value.concat(w),w.forEach(A=>{n.updateFileStatus(A,"failed")}),t("factoryFailed",F,w),i.value--)};L.then(F=>{m===!0?$(new Error("Aborted")):n.isAlive()===!0&&(l.value=l.value.filter(A=>A!==L),g(w,F))}).catch($)}else g(w,L||{});else t("factoryFailed",new Error("QUploader: factory() does not return properly"),w),i.value--}function g(w,L){const $=new FormData,F=new XMLHttpRequest,A=(H,T)=>L[H]!==void 0?na(L[H])(T):c.value[H](T),S=A("url",w);if(!S)return console.error("q-uploader: invalid or no URL specified"),void i.value--;const x=A("formFields",w);x!==void 0&&x.forEach(H=>{$.append(H.name,H.value)});let P,M=0,E=0,D=0,z=0;F.upload.addEventListener("progress",H=>{if(P===!0)return;const T=Math.min(z,H.loaded);n.uploadedSize.value+=T-D,D=T;let O=D-E;for(let J=M;O>0&&Jse.size))return void n.updateFileStatus(se,"uploading",O);O-=se.size,M++,E+=se.size,n.updateFileStatus(se,"uploading",se.size)}},!1),F.onreadystatechange=()=>{F.readyState<4||(F.status&&F.status<400?(n.uploadedFiles.value=n.uploadedFiles.value.concat(w),w.forEach(H=>{n.updateFileStatus(H,"uploaded")}),t("uploaded",{files:w,xhr:F})):(P=!0,n.uploadedSize.value-=D,n.queuedFiles.value=n.queuedFiles.value.concat(w),w.forEach(H=>{n.updateFileStatus(H,"failed")}),t("failed",{files:w,xhr:F})),i.value--,r.value=r.value.filter(H=>H!==F))},F.open(A("method",w),S),A("withCredentials",w)===!0&&(F.withCredentials=!0);const I=A("headers",w);I!==void 0&&I.forEach(H=>{F.setRequestHeader(H.name,H.value)});const N=A("sendRaw",w);w.forEach(H=>{n.updateFileStatus(H,"uploading",0),N!==!0&&$.append(A("fieldName",H),H,H.name),H.xhr=F,H.__abort=()=>{F.abort()},z+=H.size}),t("uploading",{files:w,xhr:F}),r.value.push(F),N===!0?F.send(new Blob(w)):F.send($)}return{isUploading:u,isBusy:v,abort:p,upload:y}}var MM={name:"QUploader",props:qM,emits:$M,injectPlugin:TM},LM=CM(MM),AM=we({name:"QUploaderAddTrigger",setup(){const e=Fn(Kp,Nt);return e===Nt&&console.error("QUploaderAddTrigger needs to be child of QUploader"),e}}),PM=we({name:"QVideo",props:{...bd,src:{type:String,required:!0},title:String,fetchpriority:{type:String,default:"auto"},loading:{type:String,default:"eager"},referrerpolicy:{type:String,default:"strict-origin-when-cross-origin"}},setup(e){const t=yd(e),n=f(()=>"q-video"+(e.ratio!==void 0?" q-video--responsive":""));return()=>d("div",{class:n.value,style:t.value},[d("iframe",{src:e.src,title:e.title,fetchpriority:e.fetchpriority,loading:e.loading,referrerpolicy:e.referrerpolicy,frameborder:"0",allowfullscreen:!0})])}}),BM=Object.freeze({__proto__:null,QAjaxBar:Zp,QAvatar:sq,QBadge:cq,QBanner:dq,QBar:vq,QBreadcrumbs:hq,QBreadcrumbsEl:yq,QBtn:Rt,QBtnDropdown:_h,QBtnGroup:Gc,QBtnToggle:Dq,QCard:od,QCardSection:Sa,QCardActions:wh,QCarousel:Yq,QCarouselSlide:Gq,QCarouselControl:Xq,QChatMessage:Zq,QCheckbox:Or,QChip:vd,QCircularProgress:pd,QColor:f$,QDate:C$,QDialog:Rl,QDrawer:M$,QEditor:O$,QExpansionItem:N$,QFab:U$,QFabAction:W$,QField:cm,QFile:Z$,QFooter:J$,QForm:e6,QFormChildMixin:t6,QHeader:n6,QIcon:Et,QImg:a6,QInfiniteScroll:r6,QInnerLoading:l6,QInput:_d,QIntersection:p6,QList:ym,QItem:zl,QItemSection:la,QItemLabel:ms,QKnob:m6,QLayout:b6,QMarkupTable:_m,QMenu:Vl,QNoSsr:_6,QOptionGroup:km,QPage:S6,QPageContainer:k6,QPageScroller:C6,QPageSticky:q6,QPagination:$6,QParallax:T6,QPopupEdit:M6,QPopupProxy:L6,QLinearProgress:$m,QPullToRefresh:P6,QRadio:wm,QRange:B6,QRating:E6,QResizeObserver:qa,QResponsive:F6,QScrollArea:V6,QScrollObserver:wd,QSelect:Bm,QSeparator:$a,QSkeleton:D6,QSlideItem:Q6,QSlideTransition:As,QSlider:Ua,QSpace:j6,QSpinner:So,QSpinnerAudio:K6,QSpinnerBall:G6,QSpinnerBars:Z6,QSpinnerBox:eT,QSpinnerClock:nT,QSpinnerComment:aT,QSpinnerCube:lT,QSpinnerDots:sT,QSpinnerFacebook:cT,QSpinnerGears:vT,QSpinnerGrid:pT,QSpinnerHearts:mT,QSpinnerHourglass:bT,QSpinnerInfinity:_T,QSpinnerIos:xT,QSpinnerOrbit:kT,QSpinnerOval:qT,QSpinnerPie:TT,QSpinnerPuff:LT,QSpinnerRadio:PT,QSpinnerRings:ET,QSpinnerTail:VT,QSplitter:IT,QStep:OT,QStepper:NT,QStepperNavigation:HT,QTabPanels:Oh,QTabPanel:Xi,QTable:sM,QTh:Vm,QTr:uM,QTd:cM,QTabs:Lc,QTab:Tr,QRouteTab:dM,QTime:pM,QTimeline:hM,QTimelineEntry:mM,QToggle:xm,QToolbar:gM,QToolbarTitle:bM,QTooltip:tm,QTree:_M,QUploader:LM,QUploaderAddTrigger:AM,QVideo:PM,QVirtualScroll:Om});function ep(e){if(e===!1)return 0;if(e===!0||e===void 0)return 1;const t=parseInt(e,10);return isNaN(t)?0:t}var EM=Eo({name:"close-popup",beforeMount(e,{value:t}){const n={depth:ep(t),handler(r){n.depth!==0&&setTimeout(()=>{const l=Mq(e);l!==void 0&&Lq(l,r,n.depth)})},handlerKey(r){wo(r,13)===!0&&n.handler(r)}};e.__qclosepopup=n,e.addEventListener("click",n.handler),e.addEventListener("keyup",n.handlerKey)},updated(e,{value:t,oldValue:n}){t!==n&&(e.__qclosepopup.depth=ep(t))},beforeUnmount(e){const t=e.__qclosepopup;e.removeEventListener("click",t.handler),e.removeEventListener("keyup",t.handlerKey),delete e.__qclosepopup}});let FM=0,ml;function tp(e,t){ml===void 0&&(ml=document.createElement("div"),ml.style.cssText="position: absolute; left: 0; top: 0",document.body.appendChild(ml));const n=e.getBoundingClientRect(),r=ml.getBoundingClientRect(),{marginLeft:l,marginRight:i,marginTop:c,marginBottom:u}=window.getComputedStyle(e),v=parseInt(l,10)+parseInt(i,10),m=parseInt(c,10)+parseInt(u,10);return{left:n.left-r.left,top:n.top-r.top,width:n.right-n.left,height:n.bottom-n.top,widthM:n.right-n.left+(t===!0?0:v),heightM:n.bottom-n.top+(t===!0?0:m),marginH:t===!0?v:0,marginV:t===!0?m:0}}function Qi(e){return{width:e.scrollWidth,height:e.scrollHeight}}const np=["Top","Right","Bottom","Left"],op=["borderTopLeftRadius","borderTopRightRadius","borderBottomRightRadius","borderBottomLeftRadius"],VM=/-block|-inline|block-|inline-/,IM=/(-block|-inline|block-|inline-).*:/;function ap(e,t){const n=window.getComputedStyle(e),r={};for(let l=0;l-1){const c=i.replace("border","");let u="";for(let v=0;vIM.test(c)!==!0).join(";"):n[i]}return r}const OM=["absolute","fixed","relative","sticky"];function rp(e){let t=e,n=0;for(;t!==null&&t!==document;){const{position:r,zIndex:l}=window.getComputedStyle(t),i=Number(l);i>n&&(t===e||OM.includes(r)===!0)&&(n=i),t=t.parentNode}return n}function RM(e){return{from:e.from,to:e.to!==void 0?e.to:e.from}}function zM(e){return typeof e=="number"?e={duration:e}:typeof e=="function"&&(e={onEnd:e}),{...e,waitFor:e.waitFor===void 0?0:e.waitFor,duration:isNaN(e.duration)===!0?300:parseInt(e.duration,10),easing:typeof e.easing=="string"&&e.easing.length!==0?e.easing:"ease-in-out",delay:isNaN(e.delay)===!0?0:parseInt(e.delay,10),fill:typeof e.fill=="string"&&e.fill.length!==0?e.fill:"none",resize:e.resize===!0,useCSS:e.useCSS===!0||e.usecss===!0,hideFromClone:e.hideFromClone===!0||e.hidefromclone===!0,keepToClone:e.keepToClone===!0||e.keeptoclone===!0,tween:e.tween===!0,tweenFromOpacity:isNaN(e.tweenFromOpacity)===!0?.6:parseFloat(e.tweenFromOpacity),tweenToOpacity:isNaN(e.tweenToOpacity)===!0?.5:parseFloat(e.tweenToOpacity)}}function lp(e){const t=typeof e;return t==="function"?e():t==="string"?document.querySelector(e):e}function ip(e){return e&&e.ownerDocument===document&&e.parentNode!==null}function NM(e){let t=()=>!1,n=!1,r=!0;const l=RM(e),i=zM(e),c=lp(l.from);if(ip(c)!==!0)return t;typeof c.qMorphCancel=="function"&&c.qMorphCancel();let u,v,m,p;const y=c.parentNode,b=c.nextElementSibling,g=tp(c,i.resize),{width:w,height:L}=Qi(y),{borderWidth:$,borderStyle:F,borderColor:A,borderRadius:S,backgroundColor:x,transform:P,position:M,cssText:E}=ap(c,["borderWidth","borderStyle","borderColor","borderRadius","backgroundColor","transform","position","cssText"]),D=c.classList.toString(),z=c.style.cssText,I=c.cloneNode(!0),N=i.tween===!0?c.cloneNode(!0):void 0;N!==void 0&&(N.className=N.classList.toString().split(" ").filter(T=>/^bg-/.test(T)===!1).join(" ")),i.hideFromClone===!0&&I.classList.add("q-morph--internal"),I.setAttribute("aria-hidden","true"),I.style.transition="none",I.style.animation="none",I.style.pointerEvents="none",y.insertBefore(I,b),c.qMorphCancel=()=>{n=!0,I.remove(),N!==void 0&&N.remove(),i.hideFromClone===!0&&I.classList.remove("q-morph--internal"),c.qMorphCancel=void 0};const H=()=>{const T=lp(l.to);if(n===!0||ip(T)!==!0)return void(typeof c.qMorphCancel=="function"&&c.qMorphCancel());c!==T&&typeof T.qMorphCancel=="function"&&T.qMorphCancel(),i.keepToClone!==!0&&T.classList.add("q-morph--internal"),I.classList.add("q-morph--internal");const{width:O,height:J}=Qi(y),{width:se,height:R}=Qi(T.parentNode);i.hideFromClone!==!0&&I.classList.remove("q-morph--internal"),T.qMorphCancel=()=>{n=!0,I.remove(),N!==void 0&&N.remove(),i.hideFromClone===!0&&I.classList.remove("q-morph--internal"),i.keepToClone!==!0&&T.classList.remove("q-morph--internal"),c.qMorphCancel=void 0,T.qMorphCancel=void 0};const oe=()=>{if(n===!0)return void(typeof T.qMorphCancel=="function"&&T.qMorphCancel());i.hideFromClone!==!0&&(I.classList.add("q-morph--internal"),I.innerHTML="",I.style.left=0,I.style.right="unset",I.style.top=0,I.style.bottom="unset",I.style.transform="none"),i.keepToClone!==!0&&T.classList.remove("q-morph--internal");const le=T.parentNode,{width:Se,height:k}=Qi(le),_=T.cloneNode(i.keepToClone);_.setAttribute("aria-hidden","true"),i.keepToClone!==!0&&(_.style.left=0,_.style.right="unset",_.style.top=0,_.style.bottom="unset",_.style.transform="none",_.style.pointerEvents="none"),_.classList.add("q-morph--internal");const j=T===c&&y===le?I:T.nextElementSibling;le.insertBefore(_,j);const{borderWidth:U,borderStyle:K,borderColor:G,borderRadius:ne,backgroundColor:W,transform:C,position:Z,cssText:ce}=ap(T,["borderWidth","borderStyle","borderColor","borderRadius","backgroundColor","transform","position","cssText"]),ge=T.classList.toString(),Ee=T.style.cssText;T.style.cssText=ce,T.style.transform="none",T.style.animation="none",T.style.transition="none",T.className=ge.split(" ").filter($e=>/^bg-/.test($e)===!1).join(" ");const Me=tp(T,i.resize),je=g.left-Me.left,Ke=g.top-Me.top,Oe=g.width/(Me.width>0?Me.width:10),ct=g.height/(Me.height>0?Me.height:100),Pt=w-O,pt=L-J,ke=Se-se,Be=k-R,ve=Math.max(g.widthM,Pt),ze=Math.max(g.heightM,pt),tt=Math.max(Me.widthM,ke),lt=Math.max(Me.heightM,Be),nt=c===T&&["absolute","fixed"].includes(Z)===!1&&["absolute","fixed"].includes(M)===!1;let kt=Z==="fixed",Ht=le;for(;kt!==!0&&Ht!==document;)kt=window.getComputedStyle(Ht).position==="fixed",Ht=Ht.parentNode;if(i.hideFromClone!==!0&&(I.style.display="block",I.style.flex="0 0 auto",I.style.opacity=0,I.style.minWidth="unset",I.style.maxWidth="unset",I.style.minHeight="unset",I.style.maxHeight="unset",I.classList.remove("q-morph--internal")),i.keepToClone!==!0&&(_.style.display="block",_.style.flex="0 0 auto",_.style.opacity=0,_.style.minWidth="unset",_.style.maxWidth="unset",_.style.minHeight="unset",_.style.maxHeight="unset"),_.classList.remove("q-morph--internal"),typeof i.classes=="string"&&(T.className+=" "+i.classes),typeof i.style=="string")T.style.cssText+=" "+i.style;else if(En(i.style)===!0)for(const $e in i.style)T.style[$e]=i.style[$e];const Dt=rp(I),me=rp(T),Le=kt===!0?document.documentElement:{scrollLeft:0,scrollTop:0};T.style.position=kt===!0?"fixed":"absolute",T.style.left=`${Me.left-Le.scrollLeft}px`,T.style.right="unset",T.style.top=`${Me.top-Le.scrollTop}px`,T.style.margin=0,i.resize===!0&&(T.style.minWidth="unset",T.style.maxWidth="unset",T.style.minHeight="unset",T.style.maxHeight="unset",T.style.overflow="hidden",T.style.overflowX="hidden",T.style.overflowY="hidden"),document.body.appendChild(T),N!==void 0&&(N.style.cssText=E,N.style.transform="none",N.style.animation="none",N.style.transition="none",N.style.position=T.style.position,N.style.left=`${g.left-Le.scrollLeft}px`,N.style.right="unset",N.style.top=`${g.top-Le.scrollTop}px`,N.style.margin=0,N.style.pointerEvents="none",i.resize===!0&&(N.style.minWidth="unset",N.style.maxWidth="unset",N.style.minHeight="unset",N.style.maxHeight="unset",N.style.overflow="hidden",N.style.overflowX="hidden",N.style.overflowY="hidden"),document.body.appendChild(N));const de=$e=>{c===T&&r!==!0?(T.style.cssText=z,T.className=D):(T.style.cssText=Ee,T.className=ge),_.parentNode===le&&le.insertBefore(T,_),I.remove(),_.remove(),N!==void 0&&N.remove(),t=()=>!1,c.qMorphCancel=void 0,T.qMorphCancel=void 0,typeof i.onEnd=="function"&&i.onEnd(r===!0?"to":"from",$e===!0)};if(i.useCSS!==!0&&typeof T.animate=="function"){const $e=i.resize===!0?{transform:`translate(${je}px, ${Ke}px)`,width:`${ve}px`,height:`${ze}px`}:{transform:`translate(${je}px, ${Ke}px) scale(${Oe}, ${ct})`},Xe=i.resize===!0?{width:`${tt}px`,height:`${lt}px`}:{},dt=i.resize===!0?{width:`${ve}px`,height:`${ze}px`}:{},Qe=i.resize===!0?{transform:`translate(${-1*je}px, ${-1*Ke}px)`,width:`${tt}px`,height:`${lt}px`}:{transform:`translate(${-1*je}px, ${-1*Ke}px) scale(${1/Oe}, ${1/ct})`},xt=N!==void 0?{opacity:i.tweenToOpacity}:{backgroundColor:x},Gt=N!==void 0?{opacity:1}:{backgroundColor:W};p=T.animate([{margin:0,borderWidth:$,borderStyle:F,borderColor:A,borderRadius:S,zIndex:Dt,transformOrigin:"0 0",...$e,...xt},{margin:0,borderWidth:U,borderStyle:K,borderColor:G,borderRadius:ne,zIndex:me,transformOrigin:"0 0",transform:C,...Xe,...Gt}],{duration:i.duration,easing:i.easing,fill:i.fill,delay:i.delay}),v=N===void 0?void 0:N.animate([{opacity:i.tweenFromOpacity,margin:0,borderWidth:$,borderStyle:F,borderColor:A,borderRadius:S,zIndex:Dt,transformOrigin:"0 0",transform:P,...dt},{opacity:0,margin:0,borderWidth:U,borderStyle:K,borderColor:G,borderRadius:ne,zIndex:me,transformOrigin:"0 0",...Qe}],{duration:i.duration,easing:i.easing,fill:i.fill,delay:i.delay}),u=i.hideFromClone===!0||nt===!0?void 0:I.animate([{margin:`${pt<0?pt/2:0}px ${Pt<0?Pt/2:0}px`,width:`${ve+g.marginH}px`,height:`${ze+g.marginV}px`},{margin:0,width:0,height:0}],{duration:i.duration,easing:i.easing,fill:i.fill,delay:i.delay}),m=i.keepToClone===!0?void 0:_.animate([nt===!0?{margin:`${pt<0?pt/2:0}px ${Pt<0?Pt/2:0}px`,width:`${ve+g.marginH}px`,height:`${ze+g.marginV}px`}:{margin:0,width:0,height:0},{margin:`${Be<0?Be/2:0}px ${ke<0?ke/2:0}px`,width:`${tt+Me.marginH}px`,height:`${lt+Me.marginV}px`}],{duration:i.duration,easing:i.easing,fill:i.fill,delay:i.delay});const tn=Tn=>{u!==void 0&&u.cancel(),v!==void 0&&v.cancel(),m!==void 0&&m.cancel(),p.cancel(),p.removeEventListener("finish",tn),p.removeEventListener("cancel",tn),de(Tn),u=void 0,v=void 0,m=void 0,p=void 0};c.qMorphCancel=()=>{c.qMorphCancel=void 0,n=!0,tn()},T.qMorphCancel=()=>{T.qMorphCancel=void 0,n=!0,tn()},p.addEventListener("finish",tn),p.addEventListener("cancel",tn),t=Tn=>n!==!0&&p!==void 0&&(Tn===!0?(tn(!0),!0):(r=r!==!0,u!==void 0&&u.reverse(),v!==void 0&&v.reverse(),m!==void 0&&m.reverse(),p.reverse(),!0))}else{const $e=`q-morph-anim-${++FM}`,Xe=document.createElement("style"),dt=i.resize===!0?` + transform: translate(${je}px, ${Ke}px); + width: ${ve}px; + height: ${ze}px; + `:`transform: translate(${je}px, ${Ke}px) scale(${Oe}, ${ct});`,Qe=i.resize===!0?` + width: ${tt}px; + height: ${lt}px; + `:"",xt=i.resize===!0?` + width: ${ve}px; + height: ${ze}px; + `:"",Gt=i.resize===!0?` + transform: translate(${-1*je}px, ${-1*Ke}px); + width: ${tt}px; + height: ${lt}px; + `:`transform: translate(${-1*je}px, ${-1*Ke}px) scale(${1/Oe}, ${1/ct});`,tn=N!==void 0?`opacity: ${i.tweenToOpacity};`:`background-color: ${x};`,Tn=N!==void 0?"opacity: 1;":`background-color: ${W};`,Hn=N===void 0?"":` + @keyframes ${$e}-from-tween { + 0% { + opacity: ${i.tweenFromOpacity}; + margin: 0; + border-width: ${$}; + border-style: ${F}; + border-color: ${A}; + border-radius: ${S}; + z-index: ${Dt}; + transform-origin: 0 0; + transform: ${P}; + ${xt} + } + + 100% { + opacity: 0; + margin: 0; + border-width: ${U}; + border-style: ${K}; + border-color: ${G}; + border-radius: ${ne}; + z-index: ${me}; + transform-origin: 0 0; + ${Gt} + } + } + `,Co=i.hideFromClone===!0||nt===!0?"":` + @keyframes ${$e}-from { + 0% { + margin: ${pt<0?pt/2:0}px ${Pt<0?Pt/2:0}px; + width: ${ve+g.marginH}px; + height: ${ze+g.marginV}px; + } + + 100% { + margin: 0; + width: 0; + height: 0; + } + } + `,uo=nt===!0?` + margin: ${pt<0?pt/2:0}px ${Pt<0?Pt/2:0}px; + width: ${ve+g.marginH}px; + height: ${ze+g.marginV}px; + `:` + margin: 0; + width: 0; + height: 0; + `,be=i.keepToClone===!0?"":` + @keyframes ${$e}-to { + 0% { + ${uo} + } + + 100% { + margin: ${Be<0?Be/2:0}px ${ke<0?ke/2:0}px; + width: ${tt+Me.marginH}px; + height: ${lt+Me.marginV}px; + } + } + `;Xe.innerHTML=` + @keyframes ${$e} { + 0% { + margin: 0; + border-width: ${$}; + border-style: ${F}; + border-color: ${A}; + border-radius: ${S}; + background-color: ${x}; + z-index: ${Dt}; + transform-origin: 0 0; + ${dt} + ${tn} + } + + 100% { + margin: 0; + border-width: ${U}; + border-style: ${K}; + border-color: ${G}; + border-radius: ${ne}; + background-color: ${W}; + z-index: ${me}; + transform-origin: 0 0; + transform: ${C}; + ${Qe} + ${Tn} + } + } + + ${Co} + + ${Hn} + + ${be} + `,document.head.appendChild(Xe);let Ne="normal";I.style.animation=`${i.duration}ms ${i.easing} ${i.delay}ms ${Ne} ${i.fill} ${$e}-from`,N!==void 0&&(N.style.animation=`${i.duration}ms ${i.easing} ${i.delay}ms ${Ne} ${i.fill} ${$e}-from-tween`),_.style.animation=`${i.duration}ms ${i.easing} ${i.delay}ms ${Ne} ${i.fill} ${$e}-to`,T.style.animation=`${i.duration}ms ${i.easing} ${i.delay}ms ${Ne} ${i.fill} ${$e}`;const Ze=it=>{it===Object(it)&&it.animationName!==$e||(T.removeEventListener("animationend",Ze),T.removeEventListener("animationcancel",Ze),de(),Xe.remove())};c.qMorphCancel=()=>{c.qMorphCancel=void 0,n=!0,Ze()},T.qMorphCancel=()=>{T.qMorphCancel=void 0,n=!0,Ze()},T.addEventListener("animationend",Ze),T.addEventListener("animationcancel",Ze),t=it=>!!(n!==!0&&T&&I&&_)&&(it===!0?(Ze(),!0):(r=r!==!0,Ne=Ne==="normal"?"reverse":"normal",I.style.animationDirection=Ne,N.style.animationDirection=Ne,_.style.animationDirection=Ne,T.style.animationDirection=Ne,!0))}};i.waitFor>0||i.waitFor==="transitionend"||i.waitFor===Object(i.waitFor)&&typeof i.waitFor.then=="function"?(i.waitFor>0?new Promise(Se=>setTimeout(Se,i.waitFor)):i.waitFor==="transitionend"?new Promise(Se=>{const k=()=>{_!==null&&(clearTimeout(_),_=null),T&&(T.removeEventListener("transitionend",k),T.removeEventListener("transitioncancel",k)),Se()};let _=setTimeout(k,400);T.addEventListener("transitionend",k),T.addEventListener("transitioncancel",k)}):i.waitFor).then(oe).catch(()=>{typeof T.qMorphCancel=="function"&&T.qMorphCancel()}):oe()};return typeof e.onToggle=="function"&&e.onToggle(),requestAnimationFrame(H),T=>t(T)}const bs={},HM=["duration","delay","easing","fill","classes","style","duration","resize","useCSS","hideFromClone","keepToClone","tween","tweenFromOpacity","tweenToOpacity","waitFor","onEnd"],DM=["resize","useCSS","hideFromClone","keepToClone","tween"];function Pr(e,t){e.clsAction!==t&&(e.clsAction=t,e.el.classList[t]("q-morph--invisible"))}function Hm(e){if(e.animating===!0||e.queue.length<2)return;const[t,n]=e.queue;e.animating=!0,t.animating=!0,n.animating=!0,Pr(t,"remove"),Pr(n,"remove");const r=NM({from:t.el,to:n.el,onToggle(){Pr(t,"add"),Pr(n,"remove")},...n.opts,onEnd(l,i){n.opts.onEnd!==void 0&&n.opts.onEnd(l,i),i!==!0&&(t.animating=!1,n.animating=!1,e.animating=!1,e.cancel=void 0,e.queue.shift(),Hm(e))}});e.cancel=()=>{r(!0),e.cancel=void 0}}function Dm(e,t){const n=t.opts;DM.forEach(r=>{n[r]=e[r]===!0})}function QM(e,t){const n=typeof e=="string"&&e.length!==0?e.split(":"):[];t.name=n[0],t.group=n[1],Object.assign(t.opts,{duration:isNaN(n[2])===!0?300:parseFloat(n[2]),waitFor:n[3]})}function UM(e,t){e.group!==void 0&&(t.group=e.group),e.name!==void 0&&(t.name=e.name);const n=t.opts;HM.forEach(r=>{e[r]!==void 0&&(n[r]=e[r])})}function jM(e,t){if(t.name!==e)t.animating===!1&&Pr(t,"add");else{const n=bs[t.group];n===void 0?(bs[t.group]={name:t.group,model:e,queue:[t],animating:!1},Pr(t,"remove")):n.model!==e&&(n.model=e,n.queue.push(t),n.animating===!1&&n.queue.length===2&&Hm(n))}}function sp(e,t){let n;Object(t)===t?(n=""+t.model,UM(t,e),Dm(t,e)):n=""+t,n!==e.model?(e.model=n,jM(n,e)):e.animating===!1&&e.clsAction!==void 0&&e.el.classList[e.clsAction]("q-morph--invisible")}var WM=Eo({name:"morph",mounted(e,t){const n={el:e,animating:!1,opts:{}};Dm(t.modifiers,n),QM(t.arg,n),sp(n,t.value),e.__qmorph=n},updated(e,t){sp(e.__qmorph,t.value)},beforeUnmount(e){const t=e.__qmorph,n=bs[t.group];n!==void 0&&n.queue.indexOf(t)!==-1&&(n.queue=n.queue.filter(l=>l!==t),n.queue.length===0&&(n.cancel!==void 0&&n.cancel(),delete bs[t.group])),t.clsAction==="add"&&e.classList.remove("q-morph--invisible"),delete e.__qmorph}});const KM={childList:!0,subtree:!0,attributes:!0,characterData:!0,attributeOldValue:!0,characterDataOldValue:!0};function up(e,t,n){t.handler=n,t.observer!==void 0&&t.observer.disconnect(),t.observer=new MutationObserver(r=>{typeof t.handler=="function"&&(t.handler(r)!==!1&&t.once!==!0||Qm(e))}),t.observer.observe(e,t.opts)}function Qm(e){const t=e.__qmutation;t!==void 0&&(t.observer!==void 0&&t.observer.disconnect(),delete e.__qmutation)}var YM=Eo({name:"mutation",mounted(e,{modifiers:{once:t,...n},value:r}){const l={once:t,opts:Object.keys(n).length===0?KM:n};up(e,l,r),e.__qmutation=l},updated(e,{oldValue:t,value:n}){const r=e.__qmutation;r!==void 0&&t!==n&&up(e,r,n)},beforeUnmount:Qm});const{passive:ys}=Zt;function cp(e,{value:t,oldValue:n}){typeof t=="function"?(e.handler=t,typeof n!="function"&&(e.scrollTarget.addEventListener("scroll",e.scroll,ys),e.scroll())):e.scrollTarget.removeEventListener("scroll",e.scroll,ys)}var GM=Eo({name:"scroll-fire",mounted(e,t){const n={scrollTarget:Qo(e),scroll:Qr(()=>{let r,l;n.scrollTarget===window?(l=e.getBoundingClientRect().bottom,r=window.innerHeight):(l=ls(e).top+zr(e),r=ls(n.scrollTarget).top+zr(n.scrollTarget)),l>0&&l{r.styleCleanup=void 0;const m=()=>{document.body.classList.remove("non-selectable")};v===!0?(Po(),setTimeout(m,10)):m()}),r.triggered=!1,r.sensitivity=c===!0?r.mouseSensitivity:r.touchSensitivity,r.timer=setTimeout(()=>{r.timer=void 0,Po(),r.triggered=!0,r.handler({evt:i,touch:c!==!0,mouse:c===!0,position:r.origin,duration:Date.now()-u})},r.duration)},move(i){const{top:c,left:u}=jn(i);r.timer!==void 0&&(Math.abs(u-r.origin.left)>=r.sensitivity||Math.abs(c-r.origin.top)>=r.sensitivity)&&(clearTimeout(r.timer),r.timer=void 0)},end(i){zn(r,"temp"),r.styleCleanup!==void 0&&r.styleCleanup(r.triggered),r.triggered===!0?i!==void 0&&bt(i):r.timer!==void 0&&(clearTimeout(r.timer),r.timer=void 0)}},l=[600,5,7];if(typeof t.arg=="string"&&t.arg.length!==0&&t.arg.split(":").forEach((i,c)=>{const u=parseInt(i,10);u&&(l[c]=u)}),[r.duration,r.touchSensitivity,r.mouseSensitivity]=l,e.__qtouchhold=r,n.mouse===!0){const i=n.mouseCapture===!0||n.mousecapture===!0?"Capture":"";fn(r,"main",[[e,"mousedown","mouseStart",`passive${i}`]])}ut.has.touch===!0&&fn(r,"main",[[e,"touchstart","touchStart",`passive${n.capture===!0?"Capture":""}`],[e,"touchend","noop","notPassiveCapture"]])},updated(e,t){const n=e.__qtouchhold;n!==void 0&&t.oldValue!==t.value&&(typeof t.value!="function"&&n.end(),n.handler=t.value)},beforeUnmount(e){const t=e.__qtouchhold;t!==void 0&&(zn(t,"main"),zn(t,"temp"),t.timer!==void 0&&clearTimeout(t.timer),t.styleCleanup!==void 0&&t.styleCleanup(),delete e.__qtouchhold)}});const Um={esc:27,tab:9,enter:13,space:32,up:38,left:37,right:39,down:40,delete:[8,46]},JM=new RegExp(`^([\\d+]+|${Object.keys(Um).join("|")})$`,"i");function e8(e,t){const{top:n,left:r}=jn(e);return Math.abs(r-t.left)>=7||Math.abs(n-t.top)>=7}var t8=Eo({name:"touch-repeat",beforeMount(e,{modifiers:t,value:n,arg:r}){const l=Object.keys(t).reduce((v,m)=>{if(JM.test(m)===!0){const p=isNaN(parseInt(m,10))?Um[m.toLowerCase()]:parseInt(m,10);p>=0&&v.push(p)}return v},[]);if(t.mouse!==!0&&ut.has.touch!==!0&&l.length===0)return;const i=typeof r=="string"&&r.length!==0?r.split(":").map(v=>parseInt(v,10)):[0,600,300],c=i.length-1,u={keyboard:l,handler:n,noop:pn,mouseStart(v){u.event===void 0&&typeof u.handler=="function"&&$s(v)===!0&&(fn(u,"temp",[[document,"mousemove","move","passiveCapture"],[document,"click","end","notPassiveCapture"]]),u.start(v,!0))},keyboardStart(v){if(typeof u.handler=="function"&&wo(v,l)===!0){if((i[0]===0||u.event!==void 0)&&(bt(v),e.focus(),u.event!==void 0))return;fn(u,"temp",[[document,"keyup","end","notPassiveCapture"],[document,"click","end","notPassiveCapture"]]),u.start(v,!1,!0)}},touchStart(v){if(v.target!==void 0&&typeof u.handler=="function"){const m=v.target;fn(u,"temp",[[m,"touchmove","move","passiveCapture"],[m,"touchcancel","end","notPassiveCapture"],[m,"touchend","end","notPassiveCapture"]]),u.start(v)}},start(v,m,p){function y(g){u.styleCleanup=void 0,document.documentElement.style.cursor="";const w=()=>{document.body.classList.remove("non-selectable")};g===!0?(Po(),setTimeout(w,10)):w()}p!==!0&&(u.origin=jn(v)),ut.is.mobile===!0&&(document.body.classList.add("non-selectable"),Po(),u.styleCleanup=y),u.event={touch:m!==!0&&p!==!0,mouse:m===!0,keyboard:p===!0,startTime:Date.now(),repeatCount:0};const b=()=>{if(u.timer=void 0,u.event===void 0)return;u.event.repeatCount===0&&(u.event.evt=v,p===!0?u.event.keyCode=v.keyCode:u.event.position=jn(v),ut.is.mobile!==!0&&(document.documentElement.style.cursor="pointer",document.body.classList.add("non-selectable"),Po(),u.styleCleanup=y)),u.event.duration=Date.now()-u.event.startTime,u.event.repeatCount+=1,u.handler(u.event);const g=c0&&bt(v),zn(u,"temp"),u.timer!==void 0&&(clearTimeout(u.timer),u.timer=void 0),u.event=void 0)}};if(e.__qtouchrepeat=u,t.mouse===!0){const v=t.mouseCapture===!0||t.mousecapture===!0?"Capture":"";fn(u,"main",[[e,"mousedown","mouseStart",`passive${v}`]])}if(ut.has.touch===!0&&fn(u,"main",[[e,"touchstart","touchStart",`passive${t.capture===!0?"Capture":""}`],[e,"touchend","noop","passiveCapture"]]),l.length!==0){const v=t.keyCapture===!0||t.keycapture===!0?"Capture":"";fn(u,"main",[[e,"keydown","keyboardStart",`notPassive${v}`]])}},updated(e,{oldValue:t,value:n}){const r=e.__qtouchrepeat;r!==void 0&&t!==n&&(typeof n!="function"&&r.end(),r.handler=n)},beforeUnmount(e){const t=e.__qtouchrepeat;t!==void 0&&(t.timer!==void 0&&clearTimeout(t.timer),zn(t,"main"),zn(t,"temp"),t.styleCleanup!==void 0&&t.styleCleanup(),delete e.__qtouchrepeat)}}),n8=Object.freeze({__proto__:null,ClosePopup:EM,Intersection:bm,Morph:WM,Mutation:YM,Ripple:El,ScrollFire:GM,Scroll:XM,TouchHold:ZM,TouchPan:io,TouchRepeat:t8,TouchSwipe:xh});function o8(e,t=document.body){if(typeof e!="string")throw new TypeError("Expected a string as propName");if(!(t instanceof Element))throw new TypeError("Expected a DOM element");return getComputedStyle(t).getPropertyValue(`--q-${e}`).trim()||null}let Ui;function a8(){return ut.is.winphone?"msapplication-navbutton-color":ut.is.safari?"apple-mobile-web-app-status-bar-style":"theme-color"}function r8(e){const t=document.getElementsByTagName("META");for(const n in t)if(t[n].name===e)return t[n]}function l8(e){Ui===void 0&&(Ui=a8());let t=r8(Ui);const n=t===void 0;n&&(t=document.createElement("meta"),t.setAttribute("name",Ui)),t.setAttribute("content",e),n&&document.head.appendChild(t)}ut.is.mobile!==!0||ut.is.nativeMobile!==!0&&ut.is.winphone!==!0&&ut.is.safari!==!0&&ut.is.webkit!==!0&&ut.is.vivaldi;const gl={};function i8(e){Object.assign(Rn,{request:e,exit:e,toggle:e})}function jm(){return document.fullscreenElement||document.mozFullScreenElement||document.webkitFullscreenElement||document.msFullscreenElement||null}function Wm(){const e=Rn.activeEl=Rn.isActive===!1?null:jm();Tq(e===null||e===document.documentElement?document.body:e)}function s8(){Rn.isActive=Rn.isActive===!1,Wm()}function vp(e,t){try{const n=e[t]();return n===void 0?Promise.resolve():n}catch(n){return Promise.reject(n)}}const Rn=Ma({isActive:!1,activeEl:null},{isCapable:!1,install({$q:e}){e.fullscreen=this}});gl.request=["requestFullscreen","msRequestFullscreen","mozRequestFullScreen","webkitRequestFullscreen"].find(e=>document.documentElement[e]!==void 0),Rn.isCapable=gl.request!==void 0,Rn.isCapable===!1?i8(()=>Promise.reject("Not capable")):(Object.assign(Rn,{request(e){const t=e||document.documentElement,{activeEl:n}=Rn;return t===n?Promise.resolve():(n!==null&&t.contains(n)===!0?Rn.exit():Promise.resolve()).finally(()=>vp(t,gl.request))},exit(){return Rn.isActive===!0?vp(document,gl.exit):Promise.resolve()},toggle(e){return Rn.isActive===!0?Rn.exit():Rn.request(e)}}),gl.exit=["exitFullscreen","msExitFullscreen","mozCancelFullScreen","webkitExitFullscreen"].find(e=>document[e]),Rn.isActive=!!jm(),Rn.isActive===!0&&Wm(),["onfullscreenchange","onmsfullscreenchange","onwebkitfullscreenchange"].forEach(e=>{document[e]=s8}));const u8=Ma({appVisible:!0},{install({$q:e}){qn(e,"appVisible",()=>this.appVisible)}});{let e,t;if(typeof document.hidden<"u"?(e="hidden",t="visibilitychange"):typeof document.msHidden<"u"?(e="msHidden",t="msvisibilitychange"):typeof document.webkitHidden<"u"&&(e="webkitHidden",t="webkitvisibilitychange"),t&&typeof document[e]<"u"){const n=()=>{u8.appVisible=!document[e]};document.addEventListener(t,n,!1)}}we({name:"BottomSheetPlugin",props:{...Ft,title:String,message:String,actions:Array,grid:Boolean,cardClass:[String,Array,Object],cardStyle:[String,Array,Object]},emits:["ok","hide"],setup(e,{emit:t}){const{proxy:n}=Ve(),r=Vt(e,n.$q),l=X(null);function i(){l.value.show()}function c(){l.value.hide()}function u(g){t("ok",g),c()}function v(){t("hide")}function m(){return e.actions.map(g=>{const w=g.avatar||g.img;return g.label===void 0?d($a,{class:"col-all",dark:r.value}):d("div",{class:["q-bottom-sheet__item q-hoverable q-focusable cursor-pointer relative-position",g.class],style:g.style,tabindex:0,role:"listitem",onClick(){u(g)},onKeyup(L){L.keyCode===13&&u(g)}},[d("div",{class:"q-focus-helper"}),g.icon?d(Et,{name:g.icon,color:g.color}):w?d("img",{class:g.avatar?"q-bottom-sheet__avatar":"",src:w}):d("div",{class:"q-bottom-sheet__empty-icon"}),d("div",g.label)])})}function p(){return e.actions.map(g=>{const w=g.avatar||g.img;return g.label===void 0?d($a,{spaced:!0,dark:r.value}):d(zl,{class:["q-bottom-sheet__item",g.classes],style:g.style,tabindex:0,clickable:!0,dark:r.value,onClick(){u(g)}},()=>[d(la,{avatar:!0},()=>g.icon?d(Et,{name:g.icon,color:g.color}):w?d("img",{class:g.avatar?"q-bottom-sheet__avatar":"",src:w}):null),d(la,()=>g.label)])})}function y(){const g=[];return e.title&&g.push(d(Sa,{class:"q-dialog__title"},()=>e.title)),e.message&&g.push(d(Sa,{class:"q-dialog__message"},()=>e.message)),g.push(e.grid===!0?d("div",{class:"row items-stretch justify-start",role:"list"},m()):d("div",{role:"list"},p())),g}function b(){return[d(od,{class:[`q-bottom-sheet q-bottom-sheet--${e.grid===!0?"grid":"list"}`+(r.value===!0?" q-bottom-sheet--dark q-dark":""),e.cardClass],style:e.cardStyle},y)]}return Object.assign(n,{show:i,hide:c}),()=>d(Rl,{ref:l,position:"bottom",onHide:v},b)}});function Km(e){return encodeURIComponent(e)}function Ym(e){return decodeURIComponent(e)}function c8(e){return Km(e===Object(e)?JSON.stringify(e):""+e)}function d8(e){if(e==="")return e;e.indexOf('"')===0&&(e=e.slice(1,-1).replace(/\\"/g,'"').replace(/\\\\/g,"\\")),e=Ym(e.replace(/\+/g," "));try{const t=JSON.parse(e);t!==Object(t)&&Array.isArray(t)!==!0||(e=t)}catch{}return e}function Gm(e){const t=new Date;return t.setMilliseconds(t.getMilliseconds()+e),t.toUTCString()}function v8(e){let t=0;const n=e.match(/(\d+)d/),r=e.match(/(\d+)h/),l=e.match(/(\d+)m/),i=e.match(/(\d+)s/);return n&&(t+=864e5*n[1]),r&&(t+=36e5*r[1]),l&&(t+=6e4*l[1]),i&&(t+=1e3*i[1]),t===0?e:Gm(t)}function Xm(e,t,n={},r){let l,i;n.expires!==void 0&&(Object.prototype.toString.call(n.expires)==="[object Date]"?l=n.expires.toUTCString():typeof n.expires=="string"?l=v8(n.expires):(i=parseFloat(n.expires),l=isNaN(i)===!1?Gm(864e5*i):n.expires));const c=`${Km(e)}=${c8(t)}`,u=[c,l!==void 0?"; Expires="+l:"",n.path?"; Path="+n.path:"",n.domain?"; Domain="+n.domain:"",n.sameSite?"; SameSite="+n.sameSite:"",n.httpOnly?"; HttpOnly":"",n.secure?"; Secure":"",n.other?"; "+n.other:""].join("");if(r){r.req.qCookies?r.req.qCookies.push(u):r.req.qCookies=[u],r.res.setHeader("Set-Cookie",r.req.qCookies);let v=r.req.headers.cookie||"";if(l!==void 0&&i<0){const m=_s(e,r);m!==void 0&&(v=v.replace(`${e}=${m}; `,"").replace(`; ${e}=${m}`,"").replace(`${e}=${m}`,""))}else v=v?`${c}; ${v}`:u;r.req.headers.cookie=v}else document.cookie=u}function _s(e,t){const n=t?t.req.headers:document,r=n.cookie?n.cookie.split("; "):[],l=r.length;let i,c,u,v=e?null:{},m=0;for(;m_s(t,e),set:(t,n,r)=>Xm(t,n,r,e),has:t=>p8(t,e),remove:(t,n)=>f8(t,n,e),getAll:()=>_s(null,e)}}const m8={install({$q:e,ssrContext:t}){e.cookies=this}};Object.assign(m8,h8());we({name:"DialogPlugin",props:{...Ft,title:String,message:String,prompt:Object,options:Object,progress:[Boolean,Object],html:Boolean,ok:{type:[String,Object,Boolean],default:!0},cancel:[String,Object,Boolean],focus:{type:String,default:"ok",validator:e=>["ok","cancel","none"].includes(e)},stackButtons:Boolean,color:String,cardClass:[String,Array,Object],cardStyle:[String,Array,Object]},emits:["ok","hide"],setup(e,{emit:t}){const{proxy:n}=Ve(),{$q:r}=n,l=Vt(e,r),i=X(null),c=X(e.prompt!==void 0?e.prompt.model:e.options!==void 0?e.options.model:void 0),u=f(()=>"q-dialog-plugin"+(l.value===!0?" q-dialog-plugin--dark q-dark":"")+(e.progress!==!1?" q-dialog-plugin--progress":"")),v=f(()=>e.color||(l.value===!0?"amber":"primary")),m=f(()=>e.progress===!1?null:En(e.progress)===!0?{component:e.progress.spinner||So,props:{color:e.progress.color||v.value}}:{component:So,props:{color:v.value}}),p=f(()=>e.prompt!==void 0||e.options!==void 0),y=f(()=>{if(p.value!==!0)return{};const{model:O,isValid:J,items:se,...R}=e.prompt!==void 0?e.prompt:e.options;return R}),b=f(()=>En(e.ok)===!0||e.ok===!0?r.lang.label.ok:e.ok),g=f(()=>En(e.cancel)===!0||e.cancel===!0?r.lang.label.cancel:e.cancel),w=f(()=>e.prompt!==void 0?e.prompt.isValid!==void 0&&e.prompt.isValid(c.value)!==!0:e.options!==void 0&&e.options.isValid!==void 0&&e.options.isValid(c.value)!==!0),L=f(()=>({color:v.value,label:b.value,ripple:!1,disable:w.value,...En(e.ok)===!0?e.ok:{flat:!0},"data-autofocus":e.focus==="ok"&&p.value!==!0||void 0,onClick:S})),$=f(()=>({color:v.value,label:g.value,ripple:!1,...En(e.cancel)===!0?e.cancel:{flat:!0},"data-autofocus":e.focus==="cancel"&&p.value!==!0||void 0,onClick:x}));function F(){i.value.show()}function A(){i.value.hide()}function S(){t("ok",ra(c.value)),A()}function x(){A()}function P(){t("hide")}function M(O){c.value=O}function E(O){w.value!==!0&&e.prompt.type!=="textarea"&&wo(O,13)===!0&&S()}function D(O,J){return e.html===!0?d(Sa,{class:O,innerHTML:J}):d(Sa,{class:O},()=>J)}function z(){return[d(_d,{color:v.value,dense:!0,autofocus:!0,dark:l.value,...y.value,modelValue:c.value,"onUpdate:modelValue":M,onKeyup:E})]}function I(){return[d(km,{color:v.value,options:e.options.items,dark:l.value,...y.value,modelValue:c.value,"onUpdate:modelValue":M})]}function N(){const O=[];return e.cancel&&O.push(d(Rt,$.value)),e.ok&&O.push(d(Rt,L.value)),d(wh,{class:e.stackButtons===!0?"items-end":"",vertical:e.stackButtons,align:"right"},()=>O)}function H(){const O=[];return e.title&&O.push(D("q-dialog__title",e.title)),e.progress!==!1&&O.push(d(Sa,{class:"q-dialog__progress"},()=>d(m.value.component,m.value.props))),e.message&&O.push(D("q-dialog__message",e.message)),e.prompt!==void 0?O.push(d(Sa,{class:"scroll q-dialog-plugin__form"},z)):e.options!==void 0&&O.push(d($a,{dark:l.value}),d(Sa,{class:"scroll q-dialog-plugin__form"},I),d($a,{dark:l.value})),(e.ok||e.cancel)&&O.push(N()),O}function T(){return[d(od,{class:[u.value,e.cardClass],style:e.cardStyle,dark:l.value},H)]}return _e(()=>e.prompt&&e.prompt.model,M),_e(()=>e.options&&e.options.model,M),Object.assign(n,{show:F,hide:A}),()=>d(Rl,{ref:i,onHide:P},T)}});const ji=X(null),fp=Ma({isActive:!1},{start:pn,stop:pn,increment:pn,setDefaults:pn,install({$q:e,parentApp:t}){if(e.loadingBar=this,this.__installed===!0)return void(e.config.loadingBar!==void 0&&this.setDefaults(e.config.loadingBar));const n=X(e.config.loadingBar!==void 0?{...e.config.loadingBar}:{});function r(){fp.isActive=!0}function l(){fp.isActive=!1}const i=Jc("q-loading-bar");Gp({name:"LoadingBar",devtools:{hide:!0},setup:()=>()=>d(Zp,{...n.value,onStart:r,onStop:l,ref:ji})},t).mount(i),Object.assign(this,{start(c){ji.value.start(c)},stop(){ji.value.stop()},increment(){ji.value.increment.apply(null,arguments)},setDefaults(c){En(c)===!0&&Object.assign(n.value,c)}})}});let qr,fc,pp=0,Qa=null,Ln={},Ka={};const Zm={group:"__default_quasar_group__",delay:0,message:!1,html:!1,spinnerSize:80,spinnerColor:"",messageColor:"",backgroundColor:"",boxClass:"",spinner:So,customClass:""},Jm={...Zm};function g8(e){if(e&&e.group!==void 0&&Ka[e.group]!==void 0)return Object.assign(Ka[e.group],e);const t=En(e)===!0&&e.ignoreDefaults===!0?{...Zm,...e}:{...Jm,...e};return Ka[t.group]=t,t}const Oo=Ma({isActive:!1},{show(e){Ln=g8(e);const{group:t}=Ln;return Oo.isActive=!0,qr!==void 0?(Ln.uid=pp,fc.$forceUpdate()):(Ln.uid=++pp,Qa!==null&&clearTimeout(Qa),Qa=setTimeout(()=>{Qa=null;const n=Jc("q-loading");qr=Gp({name:"QLoading",setup(){function r(){Oo.isActive!==!0&&qr!==void 0&&(Pc(!1),qr.unmount(n),ch(n),qr=void 0,fc=void 0)}function l(){if(Oo.isActive!==!0)return null;const i=[d(Ln.spinner,{class:"q-loading__spinner",color:Ln.spinnerColor,size:Ln.spinnerSize})];return Ln.message&&i.push(d("div",{class:"q-loading__message"+(Ln.messageColor?` text-${Ln.messageColor}`:""),[Ln.html===!0?"innerHTML":"textContent"]:Ln.message})),d("div",{class:"q-loading fullscreen flex flex-center z-max "+Ln.customClass.trim(),key:Ln.uid},[d("div",{class:"q-loading__backdrop"+(Ln.backgroundColor?` bg-${Ln.backgroundColor}`:"")}),d("div",{class:"q-loading__box column items-center "+Ln.boxClass},i)])}return jt(()=>{Pc(!0)}),()=>d(yn,{name:"q-transition--fade",appear:!0,onAfterLeave:r},l)}},Oo.__parentApp),fc=qr.mount(n)},Ln.delay)),n=>{n!==void 0&&Object(n)===n?Oo.show({...n,group:t}):Oo.hide(t)}},hide(e){if(Oo.isActive===!0){if(e===void 0)Ka={};else{if(Ka[e]===void 0)return;{delete Ka[e];const t=Object.keys(Ka);if(t.length!==0){const n=t[t.length-1];return void Oo.show({group:n})}}}Qa!==null&&(clearTimeout(Qa),Qa=null),Oo.isActive=!1}},setDefaults(e){En(e)===!0&&Object.assign(Jm,e)},install({$q:e,parentApp:t}){e.loading=this,Oo.__parentApp=t,e.config.loading!==void 0&&this.setDefaults(e.config.loading)}});function b8(e){return wc(e)===!0?"__q_date|"+e.toUTCString():W4(e)===!0?"__q_expr|"+e.source:typeof e=="number"?"__q_numb|"+e:typeof e=="boolean"?"__q_bool|"+(e?"1":"0"):typeof e=="string"?"__q_strn|"+e:typeof e=="function"?"__q_strn|"+e.toString():e===Object(e)?"__q_objt|"+JSON.stringify(e):e}function y8(e){if(e.length<9)return e;const n=e.substring(0,8),r=e.substring(9);switch(n){case"__q_date":return new Date(r);case"__q_expr":return new RegExp(r);case"__q_numb":return Number(r);case"__q_bool":return r==="1";case"__q_strn":return""+r;case"__q_objt":return JSON.parse(r);default:return e}}function eg(){const e=()=>null;return{has:()=>!1,getLength:()=>0,getItem:e,getIndex:e,getKey:e,getAll:()=>{},getAllKeys:()=>[],set:pn,remove:pn,clear:pn,isEmpty:()=>!0}}function tg(e){const t=window[e+"Storage"],n=r=>{const l=t.getItem(r);return l?y8(l):null};return{has:r=>t.getItem(r)!==null,getLength:()=>t.length,getItem:n,getIndex:r=>rr{let r;const l={},i=t.length;for(let c=0;c{const r=[],l=t.length;for(let i=0;i{t.setItem(r,b8(l))},remove:r=>{t.removeItem(r)},clear:()=>{t.clear()},isEmpty:()=>t.length===0}}const ng=ut.has.webStorage===!1?eg():tg("local"),_8={install({$q:e}){e.localStorage=ng}};Object.assign(_8,ng);const og=ut.has.webStorage===!1?eg():tg("session"),w8={install({$q:e}){e.sessionStorage=og}};Object.assign(w8,og);const x8=["ok","hide"];Nm(x8);const S8={version:"2.14.2",install(e,t,n){Y4(e,{components:BM,directives:n8,...t})},lang:ro,iconSet:ns};var Mr=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{};function ag(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}function k8(e){if(e.__esModule)return e;var t=e.default;if(typeof t=="function"){var n=function r(){return this instanceof r?Reflect.construct(t,arguments,this.constructor):t.apply(this,arguments)};n.prototype=t.prototype}else n={};return Object.defineProperty(n,"__esModule",{value:!0}),Object.keys(e).forEach(function(r){var l=Object.getOwnPropertyDescriptor(e,r);Object.defineProperty(n,r,l.get?l:{enumerable:!0,get:function(){return e[r]}})}),n}var ws={exports:{}};/** + * @license + * Lodash + * Copyright OpenJS Foundation and other contributors + * Released under MIT license + * Based on Underscore.js 1.8.3 + * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors + */ws.exports;(function(e,t){(function(){var n,r="4.17.21",l=200,i="Unsupported core-js use. Try https://npms.io/search?q=ponyfill.",c="Expected a function",u="Invalid `variable` option passed into `_.template`",v="__lodash_hash_undefined__",m=500,p="__lodash_placeholder__",y=1,b=2,g=4,w=1,L=2,$=1,F=2,A=4,S=8,x=16,P=32,M=64,E=128,D=256,z=512,I=30,N="...",H=800,T=16,O=1,J=2,se=3,R=1/0,oe=9007199254740991,le=17976931348623157e292,Se=NaN,k=4294967295,_=k-1,j=k>>>1,U=[["ary",E],["bind",$],["bindKey",F],["curry",S],["curryRight",x],["flip",z],["partial",P],["partialRight",M],["rearg",D]],K="[object Arguments]",G="[object Array]",ne="[object AsyncFunction]",W="[object Boolean]",C="[object Date]",Z="[object DOMException]",ce="[object Error]",ge="[object Function]",Ee="[object GeneratorFunction]",Me="[object Map]",je="[object Number]",Ke="[object Null]",Oe="[object Object]",ct="[object Promise]",Pt="[object Proxy]",pt="[object RegExp]",ke="[object Set]",Be="[object String]",ve="[object Symbol]",ze="[object Undefined]",tt="[object WeakMap]",lt="[object WeakSet]",nt="[object ArrayBuffer]",kt="[object DataView]",Ht="[object Float32Array]",Dt="[object Float64Array]",me="[object Int8Array]",Le="[object Int16Array]",de="[object Int32Array]",$e="[object Uint8Array]",Xe="[object Uint8ClampedArray]",dt="[object Uint16Array]",Qe="[object Uint32Array]",xt=/\b__p \+= '';/g,Gt=/\b(__p \+=) '' \+/g,tn=/(__e\(.*?\)|\b__t\)) \+\n'';/g,Tn=/&(?:amp|lt|gt|quot|#39);/g,Hn=/[&<>"']/g,Co=RegExp(Tn.source),uo=RegExp(Hn.source),be=/<%-([\s\S]+?)%>/g,Ne=/<%([\s\S]+?)%>/g,Ze=/<%=([\s\S]+?)%>/g,it=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,mt=/^\w*$/,nn=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,Q=/[\\^$.*+?()[\]{}|]/g,ae=RegExp(Q.source),fe=/^\s+/,Ie=/\s/,Re=/\{(?:\n\/\* \[wrapped with .+\] \*\/)?\n?/,Mt=/\{\n\/\* \[wrapped with (.+)\] \*/,et=/,? & /,yt=/[^\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\x7f]+/g,Ot=/[()=,{}\[\]\/\s]/,Wn=/\\(\\)?/g,Uo=/\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g,jo=/\w*$/,Gr=/^[-+]0x[0-9a-f]+$/i,Vs=/^0b[01]+$/i,Hl=/^\[object .+?Constructor\]$/,Dl=/^0o[0-7]+$/i,Ql=/^(?:0|[1-9]\d*)$/,Ul=/[\xc0-\xd6\xd8-\xf6\xf8-\xff\u0100-\u017f]/g,ee=/($^)/,Ue=/['\n\r\u2028\u2029\\]/g,He="\\ud800-\\udfff",gt="\\u0300-\\u036f",Xt="\\ufe20-\\ufe2f",Kt="\\u20d0-\\u20ff",xn=gt+Xt+Kt,un="\\u2700-\\u27bf",rr="a-z\\xdf-\\xf6\\xf8-\\xff",dg="\\xac\\xb1\\xd7\\xf7",vg="\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf",fg="\\u2000-\\u206f",pg=" \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000",xd="A-Z\\xc0-\\xd6\\xd8-\\xde",Sd="\\ufe0e\\ufe0f",kd=dg+vg+fg+pg,Is="['’]",hg="["+He+"]",Cd="["+kd+"]",jl="["+xn+"]",qd="\\d+",mg="["+un+"]",$d="["+rr+"]",Td="[^"+He+kd+qd+un+rr+xd+"]",Os="\\ud83c[\\udffb-\\udfff]",gg="(?:"+jl+"|"+Os+")",Md="[^"+He+"]",Rs="(?:\\ud83c[\\udde6-\\uddff]){2}",zs="[\\ud800-\\udbff][\\udc00-\\udfff]",lr="["+xd+"]",Ld="\\u200d",Ad="(?:"+$d+"|"+Td+")",bg="(?:"+lr+"|"+Td+")",Pd="(?:"+Is+"(?:d|ll|m|re|s|t|ve))?",Bd="(?:"+Is+"(?:D|LL|M|RE|S|T|VE))?",Ed=gg+"?",Fd="["+Sd+"]?",yg="(?:"+Ld+"(?:"+[Md,Rs,zs].join("|")+")"+Fd+Ed+")*",_g="\\d*(?:1st|2nd|3rd|(?![123])\\dth)(?=\\b|[A-Z_])",wg="\\d*(?:1ST|2ND|3RD|(?![123])\\dTH)(?=\\b|[a-z_])",Vd=Fd+Ed+yg,xg="(?:"+[mg,Rs,zs].join("|")+")"+Vd,Sg="(?:"+[Md+jl+"?",jl,Rs,zs,hg].join("|")+")",kg=RegExp(Is,"g"),Cg=RegExp(jl,"g"),Ns=RegExp(Os+"(?="+Os+")|"+Sg+Vd,"g"),qg=RegExp([lr+"?"+$d+"+"+Pd+"(?="+[Cd,lr,"$"].join("|")+")",bg+"+"+Bd+"(?="+[Cd,lr+Ad,"$"].join("|")+")",lr+"?"+Ad+"+"+Pd,lr+"+"+Bd,wg,_g,qd,xg].join("|"),"g"),$g=RegExp("["+Ld+He+xn+Sd+"]"),Tg=/[a-z][A-Z]|[A-Z]{2}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/,Mg=["Array","Buffer","DataView","Date","Error","Float32Array","Float64Array","Function","Int8Array","Int16Array","Int32Array","Map","Math","Object","Promise","RegExp","Set","String","Symbol","TypeError","Uint8Array","Uint8ClampedArray","Uint16Array","Uint32Array","WeakMap","_","clearTimeout","isFinite","parseInt","setTimeout"],Lg=-1,rn={};rn[Ht]=rn[Dt]=rn[me]=rn[Le]=rn[de]=rn[$e]=rn[Xe]=rn[dt]=rn[Qe]=!0,rn[K]=rn[G]=rn[nt]=rn[W]=rn[kt]=rn[C]=rn[ce]=rn[ge]=rn[Me]=rn[je]=rn[Oe]=rn[pt]=rn[ke]=rn[Be]=rn[tt]=!1;var an={};an[K]=an[G]=an[nt]=an[kt]=an[W]=an[C]=an[Ht]=an[Dt]=an[me]=an[Le]=an[de]=an[Me]=an[je]=an[Oe]=an[pt]=an[ke]=an[Be]=an[ve]=an[$e]=an[Xe]=an[dt]=an[Qe]=!0,an[ce]=an[ge]=an[tt]=!1;var Ag={À:"A",Á:"A",Â:"A",Ã:"A",Ä:"A",Å:"A",à:"a",á:"a",â:"a",ã:"a",ä:"a",å:"a",Ç:"C",ç:"c",Ð:"D",ð:"d",È:"E",É:"E",Ê:"E",Ë:"E",è:"e",é:"e",ê:"e",ë:"e",Ì:"I",Í:"I",Î:"I",Ï:"I",ì:"i",í:"i",î:"i",ï:"i",Ñ:"N",ñ:"n",Ò:"O",Ó:"O",Ô:"O",Õ:"O",Ö:"O",Ø:"O",ò:"o",ó:"o",ô:"o",õ:"o",ö:"o",ø:"o",Ù:"U",Ú:"U",Û:"U",Ü:"U",ù:"u",ú:"u",û:"u",ü:"u",Ý:"Y",ý:"y",ÿ:"y",Æ:"Ae",æ:"ae",Þ:"Th",þ:"th",ß:"ss",Ā:"A",Ă:"A",Ą:"A",ā:"a",ă:"a",ą:"a",Ć:"C",Ĉ:"C",Ċ:"C",Č:"C",ć:"c",ĉ:"c",ċ:"c",č:"c",Ď:"D",Đ:"D",ď:"d",đ:"d",Ē:"E",Ĕ:"E",Ė:"E",Ę:"E",Ě:"E",ē:"e",ĕ:"e",ė:"e",ę:"e",ě:"e",Ĝ:"G",Ğ:"G",Ġ:"G",Ģ:"G",ĝ:"g",ğ:"g",ġ:"g",ģ:"g",Ĥ:"H",Ħ:"H",ĥ:"h",ħ:"h",Ĩ:"I",Ī:"I",Ĭ:"I",Į:"I",İ:"I",ĩ:"i",ī:"i",ĭ:"i",į:"i",ı:"i",Ĵ:"J",ĵ:"j",Ķ:"K",ķ:"k",ĸ:"k",Ĺ:"L",Ļ:"L",Ľ:"L",Ŀ:"L",Ł:"L",ĺ:"l",ļ:"l",ľ:"l",ŀ:"l",ł:"l",Ń:"N",Ņ:"N",Ň:"N",Ŋ:"N",ń:"n",ņ:"n",ň:"n",ŋ:"n",Ō:"O",Ŏ:"O",Ő:"O",ō:"o",ŏ:"o",ő:"o",Ŕ:"R",Ŗ:"R",Ř:"R",ŕ:"r",ŗ:"r",ř:"r",Ś:"S",Ŝ:"S",Ş:"S",Š:"S",ś:"s",ŝ:"s",ş:"s",š:"s",Ţ:"T",Ť:"T",Ŧ:"T",ţ:"t",ť:"t",ŧ:"t",Ũ:"U",Ū:"U",Ŭ:"U",Ů:"U",Ű:"U",Ų:"U",ũ:"u",ū:"u",ŭ:"u",ů:"u",ű:"u",ų:"u",Ŵ:"W",ŵ:"w",Ŷ:"Y",ŷ:"y",Ÿ:"Y",Ź:"Z",Ż:"Z",Ž:"Z",ź:"z",ż:"z",ž:"z",IJ:"IJ",ij:"ij",Œ:"Oe",œ:"oe",ʼn:"'n",ſ:"s"},Pg={"&":"&","<":"<",">":">",'"':""","'":"'"},Bg={"&":"&","<":"<",">":">",""":'"',"'":"'"},Eg={"\\":"\\","'":"'","\n":"n","\r":"r","\u2028":"u2028","\u2029":"u2029"},Fg=parseFloat,Vg=parseInt,Id=typeof Mr=="object"&&Mr&&Mr.Object===Object&&Mr,Ig=typeof self=="object"&&self&&self.Object===Object&&self,An=Id||Ig||Function("return this")(),Hs=t&&!t.nodeType&&t,Aa=Hs&&!0&&e&&!e.nodeType&&e,Od=Aa&&Aa.exports===Hs,Ds=Od&&Id.process,co=function(){try{var re=Aa&&Aa.require&&Aa.require("util").types;return re||Ds&&Ds.binding&&Ds.binding("util")}catch{}}(),Rd=co&&co.isArrayBuffer,zd=co&&co.isDate,Nd=co&&co.isMap,Hd=co&&co.isRegExp,Dd=co&&co.isSet,Qd=co&&co.isTypedArray;function Jn(re,xe,pe){switch(pe.length){case 0:return re.call(xe);case 1:return re.call(xe,pe[0]);case 2:return re.call(xe,pe[0],pe[1]);case 3:return re.call(xe,pe[0],pe[1],pe[2])}return re.apply(xe,pe)}function Og(re,xe,pe,Ye){for(var _t=-1,Qt=re==null?0:re.length;++_t-1}function Qs(re,xe,pe){for(var Ye=-1,_t=re==null?0:re.length;++Ye<_t;)if(pe(xe,re[Ye]))return!0;return!1}function cn(re,xe){for(var pe=-1,Ye=re==null?0:re.length,_t=Array(Ye);++pe-1;);return pe}function Zd(re,xe){for(var pe=re.length;pe--&&ir(xe,re[pe],0)>-1;);return pe}function Wg(re,xe){for(var pe=re.length,Ye=0;pe--;)re[pe]===xe&&++Ye;return Ye}var Kg=Ks(Ag),Yg=Ks(Pg);function Gg(re){return"\\"+Eg[re]}function Xg(re,xe){return re==null?n:re[xe]}function sr(re){return $g.test(re)}function Zg(re){return Tg.test(re)}function Jg(re){for(var xe,pe=[];!(xe=re.next()).done;)pe.push(xe.value);return pe}function Zs(re){var xe=-1,pe=Array(re.size);return re.forEach(function(Ye,_t){pe[++xe]=[_t,Ye]}),pe}function Jd(re,xe){return function(pe){return re(xe(pe))}}function fa(re,xe){for(var pe=-1,Ye=re.length,_t=0,Qt=[];++pe-1}function z1(o,a){var s=this.__data__,h=ci(s,o);return h<0?(++this.size,s.push([o,a])):s[h][1]=a,this}Wo.prototype.clear=V1,Wo.prototype.delete=I1,Wo.prototype.get=O1,Wo.prototype.has=R1,Wo.prototype.set=z1;function Ko(o){var a=-1,s=o==null?0:o.length;for(this.clear();++a=a?o:a)),o}function ho(o,a,s,h,q,V){var Y,te=a&y,ue=a&b,qe=a&g;if(s&&(Y=q?s(o,h,q,V):s(o)),Y!==n)return Y;if(!vn(o))return o;var Te=wt(o);if(Te){if(Y=Qb(o),!te)return Kn(o,Y)}else{var Ae=In(o),De=Ae==ge||Ae==Ee;if(ya(o))return F0(o,te);if(Ae==Oe||Ae==K||De&&!q){if(Y=ue||De?{}:ev(o),!te)return ue?Bb(o,nb(Y,o)):Pb(o,d0(Y,o))}else{if(!an[Ae])return q?o:{};Y=Ub(o,Ae,te)}}V||(V=new $o);var ot=V.get(o);if(ot)return ot;V.set(o,Y),Mv(o)?o.forEach(function(ft){Y.add(ho(ft,a,s,ft,o,V))}):$v(o)&&o.forEach(function(ft,Lt){Y.set(Lt,ho(ft,a,s,Lt,o,V))});var vt=qe?ue?ku:Su:ue?Gn:Mn,Ct=Te?n:vt(o);return vo(Ct||o,function(ft,Lt){Ct&&(Lt=ft,ft=o[Lt]),ol(Y,Lt,ho(ft,a,s,Lt,o,V))}),Y}function ob(o){var a=Mn(o);return function(s){return v0(s,o,a)}}function v0(o,a,s){var h=s.length;if(o==null)return!h;for(o=on(o);h--;){var q=s[h],V=a[q],Y=o[q];if(Y===n&&!(q in o)||!V(Y))return!1}return!0}function f0(o,a,s){if(typeof o!="function")throw new fo(c);return cl(function(){o.apply(n,s)},a)}function al(o,a,s,h){var q=-1,V=Wl,Y=!0,te=o.length,ue=[],qe=a.length;if(!te)return ue;s&&(a=cn(a,eo(s))),h?(V=Qs,Y=!1):a.length>=l&&(V=Xr,Y=!1,a=new Ea(a));e:for(;++qq?0:q+s),h=h===n||h>q?q:St(h),h<0&&(h+=q),h=s>h?0:Av(h);s0&&s(te)?a>1?Pn(te,a-1,s,h,q):va(q,te):h||(q[q.length]=te)}return q}var ru=N0(),m0=N0(!0);function Fo(o,a){return o&&ru(o,a,Mn)}function lu(o,a){return o&&m0(o,a,Mn)}function vi(o,a){return da(a,function(s){return Jo(o[s])})}function Va(o,a){a=ga(a,o);for(var s=0,h=a.length;o!=null&&sa}function lb(o,a){return o!=null&&Yt.call(o,a)}function ib(o,a){return o!=null&&a in on(o)}function sb(o,a,s){return o>=Vn(a,s)&&o=120&&Te.length>=120)?new Ea(Y&&Te):n}Te=o[0];var Ae=-1,De=te[0];e:for(;++Ae-1;)te!==o&&oi.call(te,ue,1),oi.call(o,ue,1);return o}function $0(o,a){for(var s=o?a.length:0,h=s-1;s--;){var q=a[s];if(s==h||q!==V){var V=q;Zo(q)?oi.call(o,q,1):mu(o,q)}}return o}function fu(o,a){return o+li(i0()*(a-o+1))}function wb(o,a,s,h){for(var q=-1,V=Cn(ri((a-o)/(s||1)),0),Y=pe(V);V--;)Y[h?V:++q]=o,o+=s;return Y}function pu(o,a){var s="";if(!o||a<1||a>oe)return s;do a%2&&(s+=o),a=li(a/2),a&&(o+=o);while(a);return s}function $t(o,a){return Au(ov(o,a,Xn),o+"")}function xb(o){return c0(yr(o))}function Sb(o,a){var s=yr(o);return Si(s,Fa(a,0,s.length))}function il(o,a,s,h){if(!vn(o))return o;a=ga(a,o);for(var q=-1,V=a.length,Y=V-1,te=o;te!=null&&++qq?0:q+a),s=s>q?q:s,s<0&&(s+=q),q=a>s?0:s-a>>>0,a>>>=0;for(var V=pe(q);++h>>1,Y=o[V];Y!==null&&!no(Y)&&(s?Y<=a:Y=l){var qe=a?null:Ib(o);if(qe)return Yl(qe);Y=!1,q=Xr,ue=new Ea}else ue=a?[]:te;e:for(;++h=h?o:mo(o,a,s)}var E0=p1||function(o){return An.clearTimeout(o)};function F0(o,a){if(a)return o.slice();var s=o.length,h=n0?n0(s):new o.constructor(s);return o.copy(h),h}function _u(o){var a=new o.constructor(o.byteLength);return new ti(a).set(new ti(o)),a}function Tb(o,a){var s=a?_u(o.buffer):o.buffer;return new o.constructor(s,o.byteOffset,o.byteLength)}function Mb(o){var a=new o.constructor(o.source,jo.exec(o));return a.lastIndex=o.lastIndex,a}function Lb(o){return nl?on(nl.call(o)):{}}function V0(o,a){var s=a?_u(o.buffer):o.buffer;return new o.constructor(s,o.byteOffset,o.length)}function I0(o,a){if(o!==a){var s=o!==n,h=o===null,q=o===o,V=no(o),Y=a!==n,te=a===null,ue=a===a,qe=no(a);if(!te&&!qe&&!V&&o>a||V&&Y&&ue&&!te&&!qe||h&&Y&&ue||!s&&ue||!q)return 1;if(!h&&!V&&!qe&&o=te)return ue;var qe=s[h];return ue*(qe=="desc"?-1:1)}}return o.index-a.index}function O0(o,a,s,h){for(var q=-1,V=o.length,Y=s.length,te=-1,ue=a.length,qe=Cn(V-Y,0),Te=pe(ue+qe),Ae=!h;++te1?s[q-1]:n,Y=q>2?s[2]:n;for(V=o.length>3&&typeof V=="function"?(q--,V):n,Y&&Qn(s[0],s[1],Y)&&(V=q<3?n:V,q=1),a=on(a);++h-1?q[V?a[Y]:Y]:n}}function Q0(o){return Xo(function(a){var s=a.length,h=s,q=po.prototype.thru;for(o&&a.reverse();h--;){var V=a[h];if(typeof V!="function")throw new fo(c);if(q&&!Y&&wi(V)=="wrapper")var Y=new po([],!0)}for(h=Y?h:s;++h1&&It.reverse(),Te&&uete))return!1;var qe=V.get(o),Te=V.get(a);if(qe&&Te)return qe==a&&Te==o;var Ae=-1,De=!0,ot=s&L?new Ea:n;for(V.set(o,a),V.set(a,o);++Ae1?"& ":"")+a[h],a=a.join(s>2?", ":" "),o.replace(Re,`{ +/* [wrapped with `+a+`] */ +`)}function Wb(o){return wt(o)||Ra(o)||!!(r0&&o&&o[r0])}function Zo(o,a){var s=typeof o;return a=a??oe,!!a&&(s=="number"||s!="symbol"&&Ql.test(o))&&o>-1&&o%1==0&&o0){if(++a>=H)return arguments[0]}else a=0;return o.apply(n,arguments)}}function Si(o,a){var s=-1,h=o.length,q=h-1;for(a=a===n?h:a;++s1?o[a-1]:n;return s=typeof s=="function"?(o.pop(),s):n,hv(o,s)});function mv(o){var a=B(o);return a.__chain__=!0,a}function a_(o,a){return a(o),o}function ki(o,a){return a(o)}var r_=Xo(function(o){var a=o.length,s=a?o[0]:0,h=this.__wrapped__,q=function(V){return au(V,o)};return a>1||this.__actions__.length||!(h instanceof Bt)||!Zo(s)?this.thru(q):(h=h.slice(s,+s+(a?1:0)),h.__actions__.push({func:ki,args:[q],thisArg:n}),new po(h,this.__chain__).thru(function(V){return a&&!V.length&&V.push(n),V}))});function l_(){return mv(this)}function i_(){return new po(this.value(),this.__chain__)}function s_(){this.__values__===n&&(this.__values__=Lv(this.value()));var o=this.__index__>=this.__values__.length,a=o?n:this.__values__[this.__index__++];return{done:o,value:a}}function u_(){return this}function c_(o){for(var a,s=this;s instanceof ui;){var h=uv(s);h.__index__=0,h.__values__=n,a?q.__wrapped__=h:a=h;var q=h;s=s.__wrapped__}return q.__wrapped__=o,a}function d_(){var o=this.__wrapped__;if(o instanceof Bt){var a=o;return this.__actions__.length&&(a=new Bt(this)),a=a.reverse(),a.__actions__.push({func:ki,args:[Pu],thisArg:n}),new po(a,this.__chain__)}return this.thru(Pu)}function v_(){return P0(this.__wrapped__,this.__actions__)}var f_=mi(function(o,a,s){Yt.call(o,s)?++o[s]:Yo(o,s,1)});function p_(o,a,s){var h=wt(o)?Ud:ab;return s&&Qn(o,a,s)&&(a=n),h(o,st(a,3))}function h_(o,a){var s=wt(o)?da:h0;return s(o,st(a,3))}var m_=D0(cv),g_=D0(dv);function b_(o,a){return Pn(Ci(o,a),1)}function y_(o,a){return Pn(Ci(o,a),R)}function __(o,a,s){return s=s===n?1:St(s),Pn(Ci(o,a),s)}function gv(o,a){var s=wt(o)?vo:ha;return s(o,st(a,3))}function bv(o,a){var s=wt(o)?Rg:p0;return s(o,st(a,3))}var w_=mi(function(o,a,s){Yt.call(o,s)?o[s].push(a):Yo(o,s,[a])});function x_(o,a,s,h){o=Yn(o)?o:yr(o),s=s&&!h?St(s):0;var q=o.length;return s<0&&(s=Cn(q+s,0)),Li(o)?s<=q&&o.indexOf(a,s)>-1:!!q&&ir(o,a,s)>-1}var S_=$t(function(o,a,s){var h=-1,q=typeof a=="function",V=Yn(o)?pe(o.length):[];return ha(o,function(Y){V[++h]=q?Jn(a,Y,s):rl(Y,a,s)}),V}),k_=mi(function(o,a,s){Yo(o,s,a)});function Ci(o,a){var s=wt(o)?cn:w0;return s(o,st(a,3))}function C_(o,a,s,h){return o==null?[]:(wt(a)||(a=a==null?[]:[a]),s=h?n:s,wt(s)||(s=s==null?[]:[s]),C0(o,a,s))}var q_=mi(function(o,a,s){o[s?0:1].push(a)},function(){return[[],[]]});function $_(o,a,s){var h=wt(o)?Us:Yd,q=arguments.length<3;return h(o,st(a,4),s,q,ha)}function T_(o,a,s){var h=wt(o)?zg:Yd,q=arguments.length<3;return h(o,st(a,4),s,q,p0)}function M_(o,a){var s=wt(o)?da:h0;return s(o,Ti(st(a,3)))}function L_(o){var a=wt(o)?c0:xb;return a(o)}function A_(o,a,s){(s?Qn(o,a,s):a===n)?a=1:a=St(a);var h=wt(o)?J1:Sb;return h(o,a)}function P_(o){var a=wt(o)?eb:Cb;return a(o)}function B_(o){if(o==null)return 0;if(Yn(o))return Li(o)?ur(o):o.length;var a=In(o);return a==Me||a==ke?o.size:cu(o).length}function E_(o,a,s){var h=wt(o)?js:qb;return s&&Qn(o,a,s)&&(a=n),h(o,st(a,3))}var F_=$t(function(o,a){if(o==null)return[];var s=a.length;return s>1&&Qn(o,a[0],a[1])?a=[]:s>2&&Qn(a[0],a[1],a[2])&&(a=[a[0]]),C0(o,Pn(a,1),[])}),qi=h1||function(){return An.Date.now()};function V_(o,a){if(typeof a!="function")throw new fo(c);return o=St(o),function(){if(--o<1)return a.apply(this,arguments)}}function yv(o,a,s){return a=s?n:a,a=o&&a==null?o.length:a,Go(o,E,n,n,n,n,a)}function _v(o,a){var s;if(typeof a!="function")throw new fo(c);return o=St(o),function(){return--o>0&&(s=a.apply(this,arguments)),o<=1&&(a=n),s}}var Eu=$t(function(o,a,s){var h=$;if(s.length){var q=fa(s,gr(Eu));h|=P}return Go(o,h,a,s,q)}),wv=$t(function(o,a,s){var h=$|F;if(s.length){var q=fa(s,gr(wv));h|=P}return Go(a,h,o,s,q)});function xv(o,a,s){a=s?n:a;var h=Go(o,S,n,n,n,n,n,a);return h.placeholder=xv.placeholder,h}function Sv(o,a,s){a=s?n:a;var h=Go(o,x,n,n,n,n,n,a);return h.placeholder=Sv.placeholder,h}function kv(o,a,s){var h,q,V,Y,te,ue,qe=0,Te=!1,Ae=!1,De=!0;if(typeof o!="function")throw new fo(c);a=bo(a)||0,vn(s)&&(Te=!!s.leading,Ae="maxWait"in s,V=Ae?Cn(bo(s.maxWait)||0,a):V,De="trailing"in s?!!s.trailing:De);function ot(wn){var Mo=h,ta=q;return h=q=n,qe=wn,Y=o.apply(ta,Mo),Y}function vt(wn){return qe=wn,te=cl(Lt,a),Te?ot(wn):Y}function Ct(wn){var Mo=wn-ue,ta=wn-qe,Dv=a-Mo;return Ae?Vn(Dv,V-ta):Dv}function ft(wn){var Mo=wn-ue,ta=wn-qe;return ue===n||Mo>=a||Mo<0||Ae&&ta>=V}function Lt(){var wn=qi();if(ft(wn))return It(wn);te=cl(Lt,Ct(wn))}function It(wn){return te=n,De&&h?ot(wn):(h=q=n,Y)}function oo(){te!==n&&E0(te),qe=0,h=ue=q=te=n}function Un(){return te===n?Y:It(qi())}function ao(){var wn=qi(),Mo=ft(wn);if(h=arguments,q=this,ue=wn,Mo){if(te===n)return vt(ue);if(Ae)return E0(te),te=cl(Lt,a),ot(ue)}return te===n&&(te=cl(Lt,a)),Y}return ao.cancel=oo,ao.flush=Un,ao}var I_=$t(function(o,a){return f0(o,1,a)}),O_=$t(function(o,a,s){return f0(o,bo(a)||0,s)});function R_(o){return Go(o,z)}function $i(o,a){if(typeof o!="function"||a!=null&&typeof a!="function")throw new fo(c);var s=function(){var h=arguments,q=a?a.apply(this,h):h[0],V=s.cache;if(V.has(q))return V.get(q);var Y=o.apply(this,h);return s.cache=V.set(q,Y)||V,Y};return s.cache=new($i.Cache||Ko),s}$i.Cache=Ko;function Ti(o){if(typeof o!="function")throw new fo(c);return function(){var a=arguments;switch(a.length){case 0:return!o.call(this);case 1:return!o.call(this,a[0]);case 2:return!o.call(this,a[0],a[1]);case 3:return!o.call(this,a[0],a[1],a[2])}return!o.apply(this,a)}}function z_(o){return _v(2,o)}var N_=$b(function(o,a){a=a.length==1&&wt(a[0])?cn(a[0],eo(st())):cn(Pn(a,1),eo(st()));var s=a.length;return $t(function(h){for(var q=-1,V=Vn(h.length,s);++q=a}),Ra=b0(function(){return arguments}())?b0:function(o){return bn(o)&&Yt.call(o,"callee")&&!a0.call(o,"callee")},wt=pe.isArray,n2=Rd?eo(Rd):cb;function Yn(o){return o!=null&&Mi(o.length)&&!Jo(o)}function _n(o){return bn(o)&&Yn(o)}function o2(o){return o===!0||o===!1||bn(o)&&Dn(o)==W}var ya=g1||ju,a2=zd?eo(zd):db;function r2(o){return bn(o)&&o.nodeType===1&&!dl(o)}function l2(o){if(o==null)return!0;if(Yn(o)&&(wt(o)||typeof o=="string"||typeof o.splice=="function"||ya(o)||br(o)||Ra(o)))return!o.length;var a=In(o);if(a==Me||a==ke)return!o.size;if(ul(o))return!cu(o).length;for(var s in o)if(Yt.call(o,s))return!1;return!0}function i2(o,a){return ll(o,a)}function s2(o,a,s){s=typeof s=="function"?s:n;var h=s?s(o,a):n;return h===n?ll(o,a,n,s):!!h}function Vu(o){if(!bn(o))return!1;var a=Dn(o);return a==ce||a==Z||typeof o.message=="string"&&typeof o.name=="string"&&!dl(o)}function u2(o){return typeof o=="number"&&l0(o)}function Jo(o){if(!vn(o))return!1;var a=Dn(o);return a==ge||a==Ee||a==ne||a==Pt}function qv(o){return typeof o=="number"&&o==St(o)}function Mi(o){return typeof o=="number"&&o>-1&&o%1==0&&o<=oe}function vn(o){var a=typeof o;return o!=null&&(a=="object"||a=="function")}function bn(o){return o!=null&&typeof o=="object"}var $v=Nd?eo(Nd):fb;function c2(o,a){return o===a||uu(o,a,qu(a))}function d2(o,a,s){return s=typeof s=="function"?s:n,uu(o,a,qu(a),s)}function v2(o){return Tv(o)&&o!=+o}function f2(o){if(Gb(o))throw new _t(i);return y0(o)}function p2(o){return o===null}function h2(o){return o==null}function Tv(o){return typeof o=="number"||bn(o)&&Dn(o)==je}function dl(o){if(!bn(o)||Dn(o)!=Oe)return!1;var a=ni(o);if(a===null)return!0;var s=Yt.call(a,"constructor")&&a.constructor;return typeof s=="function"&&s instanceof s&&Zl.call(s)==d1}var Iu=Hd?eo(Hd):pb;function m2(o){return qv(o)&&o>=-oe&&o<=oe}var Mv=Dd?eo(Dd):hb;function Li(o){return typeof o=="string"||!wt(o)&&bn(o)&&Dn(o)==Be}function no(o){return typeof o=="symbol"||bn(o)&&Dn(o)==ve}var br=Qd?eo(Qd):mb;function g2(o){return o===n}function b2(o){return bn(o)&&In(o)==tt}function y2(o){return bn(o)&&Dn(o)==lt}var _2=_i(du),w2=_i(function(o,a){return o<=a});function Lv(o){if(!o)return[];if(Yn(o))return Li(o)?qo(o):Kn(o);if(Zr&&o[Zr])return Jg(o[Zr]());var a=In(o),s=a==Me?Zs:a==ke?Yl:yr;return s(o)}function ea(o){if(!o)return o===0?o:0;if(o=bo(o),o===R||o===-R){var a=o<0?-1:1;return a*le}return o===o?o:0}function St(o){var a=ea(o),s=a%1;return a===a?s?a-s:a:0}function Av(o){return o?Fa(St(o),0,k):0}function bo(o){if(typeof o=="number")return o;if(no(o))return Se;if(vn(o)){var a=typeof o.valueOf=="function"?o.valueOf():o;o=vn(a)?a+"":a}if(typeof o!="string")return o===0?o:+o;o=Gd(o);var s=Vs.test(o);return s||Dl.test(o)?Vg(o.slice(2),s?2:8):Gr.test(o)?Se:+o}function Pv(o){return Vo(o,Gn(o))}function x2(o){return o?Fa(St(o),-oe,oe):o===0?o:0}function Wt(o){return o==null?"":to(o)}var S2=hr(function(o,a){if(ul(a)||Yn(a)){Vo(a,Mn(a),o);return}for(var s in a)Yt.call(a,s)&&ol(o,s,a[s])}),Bv=hr(function(o,a){Vo(a,Gn(a),o)}),Ai=hr(function(o,a,s,h){Vo(a,Gn(a),o,h)}),k2=hr(function(o,a,s,h){Vo(a,Mn(a),o,h)}),C2=Xo(au);function q2(o,a){var s=pr(o);return a==null?s:d0(s,a)}var $2=$t(function(o,a){o=on(o);var s=-1,h=a.length,q=h>2?a[2]:n;for(q&&Qn(a[0],a[1],q)&&(h=1);++s1),V}),Vo(o,ku(o),s),h&&(s=ho(s,y|b|g,Ob));for(var q=a.length;q--;)mu(s,a[q]);return s});function U2(o,a){return Fv(o,Ti(st(a)))}var j2=Xo(function(o,a){return o==null?{}:yb(o,a)});function Fv(o,a){if(o==null)return{};var s=cn(ku(o),function(h){return[h]});return a=st(a),q0(o,s,function(h,q){return a(h,q[0])})}function W2(o,a,s){a=ga(a,o);var h=-1,q=a.length;for(q||(q=1,o=n);++ha){var h=o;o=a,a=h}if(s||o%1||a%1){var q=i0();return Vn(o+q*(a-o+Fg("1e-"+((q+"").length-1))),a)}return fu(o,a)}var aw=mr(function(o,a,s){return a=a.toLowerCase(),o+(s?Ov(a):a)});function Ov(o){return zu(Wt(o).toLowerCase())}function Rv(o){return o=Wt(o),o&&o.replace(Ul,Kg).replace(Cg,"")}function rw(o,a,s){o=Wt(o),a=to(a);var h=o.length;s=s===n?h:Fa(St(s),0,h);var q=s;return s-=a.length,s>=0&&o.slice(s,q)==a}function lw(o){return o=Wt(o),o&&uo.test(o)?o.replace(Hn,Yg):o}function iw(o){return o=Wt(o),o&&ae.test(o)?o.replace(Q,"\\$&"):o}var sw=mr(function(o,a,s){return o+(s?"-":"")+a.toLowerCase()}),uw=mr(function(o,a,s){return o+(s?" ":"")+a.toLowerCase()}),cw=H0("toLowerCase");function dw(o,a,s){o=Wt(o),a=St(a);var h=a?ur(o):0;if(!a||h>=a)return o;var q=(a-h)/2;return yi(li(q),s)+o+yi(ri(q),s)}function vw(o,a,s){o=Wt(o),a=St(a);var h=a?ur(o):0;return a&&h>>0,s?(o=Wt(o),o&&(typeof a=="string"||a!=null&&!Iu(a))&&(a=to(a),!a&&sr(o))?ba(qo(o),0,s):o.split(a,s)):[]}var yw=mr(function(o,a,s){return o+(s?" ":"")+zu(a)});function _w(o,a,s){return o=Wt(o),s=s==null?0:Fa(St(s),0,o.length),a=to(a),o.slice(s,s+a.length)==a}function ww(o,a,s){var h=B.templateSettings;s&&Qn(o,a,s)&&(a=n),o=Wt(o),a=Ai({},a,h,Y0);var q=Ai({},a.imports,h.imports,Y0),V=Mn(q),Y=Xs(q,V),te,ue,qe=0,Te=a.interpolate||ee,Ae="__p += '",De=Js((a.escape||ee).source+"|"+Te.source+"|"+(Te===Ze?Uo:ee).source+"|"+(a.evaluate||ee).source+"|$","g"),ot="//# sourceURL="+(Yt.call(a,"sourceURL")?(a.sourceURL+"").replace(/\s/g," "):"lodash.templateSources["+ ++Lg+"]")+` +`;o.replace(De,function(ft,Lt,It,oo,Un,ao){return It||(It=oo),Ae+=o.slice(qe,ao).replace(Ue,Gg),Lt&&(te=!0,Ae+=`' + +__e(`+Lt+`) + +'`),Un&&(ue=!0,Ae+=`'; +`+Un+`; +__p += '`),It&&(Ae+=`' + +((__t = (`+It+`)) == null ? '' : __t) + +'`),qe=ao+ft.length,ft}),Ae+=`'; +`;var vt=Yt.call(a,"variable")&&a.variable;if(!vt)Ae=`with (obj) { +`+Ae+` +} +`;else if(Ot.test(vt))throw new _t(u);Ae=(ue?Ae.replace(xt,""):Ae).replace(Gt,"$1").replace(tn,"$1;"),Ae="function("+(vt||"obj")+`) { +`+(vt?"":`obj || (obj = {}); +`)+"var __t, __p = ''"+(te?", __e = _.escape":"")+(ue?`, __j = Array.prototype.join; +function print() { __p += __j.call(arguments, '') } +`:`; +`)+Ae+`return __p +}`;var Ct=Nv(function(){return Qt(V,ot+"return "+Ae).apply(n,Y)});if(Ct.source=Ae,Vu(Ct))throw Ct;return Ct}function xw(o){return Wt(o).toLowerCase()}function Sw(o){return Wt(o).toUpperCase()}function kw(o,a,s){if(o=Wt(o),o&&(s||a===n))return Gd(o);if(!o||!(a=to(a)))return o;var h=qo(o),q=qo(a),V=Xd(h,q),Y=Zd(h,q)+1;return ba(h,V,Y).join("")}function Cw(o,a,s){if(o=Wt(o),o&&(s||a===n))return o.slice(0,e0(o)+1);if(!o||!(a=to(a)))return o;var h=qo(o),q=Zd(h,qo(a))+1;return ba(h,0,q).join("")}function qw(o,a,s){if(o=Wt(o),o&&(s||a===n))return o.replace(fe,"");if(!o||!(a=to(a)))return o;var h=qo(o),q=Xd(h,qo(a));return ba(h,q).join("")}function $w(o,a){var s=I,h=N;if(vn(a)){var q="separator"in a?a.separator:q;s="length"in a?St(a.length):s,h="omission"in a?to(a.omission):h}o=Wt(o);var V=o.length;if(sr(o)){var Y=qo(o);V=Y.length}if(s>=V)return o;var te=s-ur(h);if(te<1)return h;var ue=Y?ba(Y,0,te).join(""):o.slice(0,te);if(q===n)return ue+h;if(Y&&(te+=ue.length-te),Iu(q)){if(o.slice(te).search(q)){var qe,Te=ue;for(q.global||(q=Js(q.source,Wt(jo.exec(q))+"g")),q.lastIndex=0;qe=q.exec(Te);)var Ae=qe.index;ue=ue.slice(0,Ae===n?te:Ae)}}else if(o.indexOf(to(q),te)!=te){var De=ue.lastIndexOf(q);De>-1&&(ue=ue.slice(0,De))}return ue+h}function Tw(o){return o=Wt(o),o&&Co.test(o)?o.replace(Tn,o1):o}var Mw=mr(function(o,a,s){return o+(s?" ":"")+a.toUpperCase()}),zu=H0("toUpperCase");function zv(o,a,s){return o=Wt(o),a=s?n:a,a===n?Zg(o)?l1(o):Dg(o):o.match(a)||[]}var Nv=$t(function(o,a){try{return Jn(o,n,a)}catch(s){return Vu(s)?s:new _t(s)}}),Lw=Xo(function(o,a){return vo(a,function(s){s=Io(s),Yo(o,s,Eu(o[s],o))}),o});function Aw(o){var a=o==null?0:o.length,s=st();return o=a?cn(o,function(h){if(typeof h[1]!="function")throw new fo(c);return[s(h[0]),h[1]]}):[],$t(function(h){for(var q=-1;++qoe)return[];var s=k,h=Vn(o,k);a=st(a),o-=k;for(var q=Gs(h,a);++s0||a<0)?new Bt(s):(o<0?s=s.takeRight(-o):o&&(s=s.drop(o)),a!==n&&(a=St(a),s=a<0?s.dropRight(-a):s.take(a-o)),s)},Bt.prototype.takeRightWhile=function(o){return this.reverse().takeWhile(o).reverse()},Bt.prototype.toArray=function(){return this.take(k)},Fo(Bt.prototype,function(o,a){var s=/^(?:filter|find|map|reject)|While$/.test(a),h=/^(?:head|last)$/.test(a),q=B[h?"take"+(a=="last"?"Right":""):a],V=h||/^find/.test(a);q&&(B.prototype[a]=function(){var Y=this.__wrapped__,te=h?[1]:arguments,ue=Y instanceof Bt,qe=te[0],Te=ue||wt(Y),Ae=function(Lt){var It=q.apply(B,va([Lt],te));return h&&De?It[0]:It};Te&&s&&typeof qe=="function"&&qe.length!=1&&(ue=Te=!1);var De=this.__chain__,ot=!!this.__actions__.length,vt=V&&!De,Ct=ue&&!ot;if(!V&&Te){Y=Ct?Y:new Bt(this);var ft=o.apply(Y,te);return ft.__actions__.push({func:ki,args:[Ae],thisArg:n}),new po(ft,De)}return vt&&Ct?o.apply(this,te):(ft=this.thru(Ae),vt?h?ft.value()[0]:ft.value():ft)})}),vo(["pop","push","shift","sort","splice","unshift"],function(o){var a=Gl[o],s=/^(?:push|sort|unshift)$/.test(o)?"tap":"thru",h=/^(?:pop|shift)$/.test(o);B.prototype[o]=function(){var q=arguments;if(h&&!this.__chain__){var V=this.value();return a.apply(wt(V)?V:[],q)}return this[s](function(Y){return a.apply(wt(Y)?Y:[],q)})}}),Fo(Bt.prototype,function(o,a){var s=B[a];if(s){var h=s.name+"";Yt.call(fr,h)||(fr[h]=[]),fr[h].push({name:a,func:s})}}),fr[gi(n,F).name]=[{name:"wrapper",func:n}],Bt.prototype.clone=T1,Bt.prototype.reverse=M1,Bt.prototype.value=L1,B.prototype.at=r_,B.prototype.chain=l_,B.prototype.commit=i_,B.prototype.next=s_,B.prototype.plant=c_,B.prototype.reverse=d_,B.prototype.toJSON=B.prototype.valueOf=B.prototype.value=v_,B.prototype.first=B.prototype.head,Zr&&(B.prototype[Zr]=u_),B},cr=i1();Aa?((Aa.exports=cr)._=cr,Hs._=cr):An._=cr}).call(Mr)})(ws,ws.exports);var C8=ws.exports;const ja=ag(C8),q8={style:{"margin-top":"50px"}},$8={key:0},T8=Ce("h4",{class:"title-footer"},"Trusted by",-1),M8={style:{display:"flex","align-items":"center","justify-content":"center"}},L8=["href"],A8=["src"],P8=Ce("br",null,null,-1),B8=Ce("h3",{class:"title-footer"},"Sponsored by",-1),E8={href:"https://kalisio.com"},F8=["src"],rg={__name:"HomeFooter",setup(e){const{theme:t,isDark:n}=Tl(),r=f(()=>n.value?"https://s3.eu-central-1.amazonaws.com/kalisioscope/kalisio/kalisio-logo-white-256x84.png":"https://s3.eu-central-1.amazonaws.com/kalisioscope/kalisio/kalisio-logo-black-256x84.png"),l=f(()=>!!ja.has(t.value,"trustLogos")),i=f(()=>t.value.trustLogos);return(c,u)=>(ie(),ye("div",q8,[l.value?(ie(),ye("div",$8,[T8,Ce("div",M8,[(ie(!0),ye(en,null,Nn(i.value,v=>(ie(),ye("a",{href:v.link},[Ce("img",{src:v.imageLink},null,8,A8)],8,L8))),256))]),P8])):Je("",!0),B8,Ce("a",E8,[Ce("img",{class:"logo-footer",src:r.value},null,8,F8)])]))}},V8=Object.freeze(Object.defineProperty({__proto__:null,default:rg},Symbol.toStringTag,{value:"Module"})),I8=["src"],O8={__name:"Maps",props:{source:{type:String,default:"https://kano.dev.kalisio.xyz"},token:{type:String,default:""},cssStyle:{type:String,default:"width: 100%; height: 50vh"}},setup(e){const t=e;return jt(()=>{const n=document.getElementById("maps").contentWindow;if(typeof postRobot>"u"){let r=document.createElement("script");r.setAttribute("src","https://cdn.jsdelivr.net/npm/post-robot@10.0.42/dist/post-robot.min.js"),r.onload=()=>{postRobot.on("maps-ready",()=>{t.token!==""&&postRobot.send(n,"setLocalStorage",{"maps-jwt":t.token})})},document.head.appendChild(r)}}),(n,r)=>(ie(),ye("div",null,[Ce("iframe",{id:"maps",title:"Maps",allow:"geolocation *",allowfullscreen:"",frameBorder:"0",style:_p(e.cssStyle),src:e.source},null,12,I8)]))}},R8=Object.freeze(Object.defineProperty({__proto__:null,default:O8},Symbol.toStringTag,{value:"Module"})),z8=["href"],N8=Ce("i",{class:"las la-external-link-square-alt"},null,-1),H8={__name:"TourLink",props:{text:{type:String,default:""},path:{type:String,default:""},params:{type:Object,default:function(){return{}}}},setup(e){const t=e,n=f(()=>{let r=Tl().theme.value.appUrl+`#/${t.path}?`;t.params.tour||(r+="tour=true&");for(const[l,i]of Object.entries(t.params))r+=`${l}=${i}&`;return r.slice(0,-1)});return(r,l)=>(ie(),ye("a",{target:"_blank",href:n.value},[Zn(Ut(e.text),1),N8],8,z8))}},D8=Object.freeze(Object.defineProperty({__proto__:null,default:H8},Symbol.toStringTag,{value:"Module"}));var Fs={};Fs.byteLength=j8;Fs.toByteArray=K8;Fs.fromByteArray=X8;var Ro=[],_o=[],Q8=typeof Uint8Array<"u"?Uint8Array:Array,pc="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";for(var $r=0,U8=pc.length;$r0)throw new Error("Invalid string. Length must be a multiple of 4");var n=e.indexOf("=");n===-1&&(n=t);var r=n===t?0:4-n%4;return[n,r]}function j8(e){var t=lg(e),n=t[0],r=t[1];return(n+r)*3/4-r}function W8(e,t,n){return(t+n)*3/4-n}function K8(e){var t,n=lg(e),r=n[0],l=n[1],i=new Q8(W8(e,r,l)),c=0,u=l>0?r-4:r,v;for(v=0;v>16&255,i[c++]=t>>8&255,i[c++]=t&255;return l===2&&(t=_o[e.charCodeAt(v)]<<2|_o[e.charCodeAt(v+1)]>>4,i[c++]=t&255),l===1&&(t=_o[e.charCodeAt(v)]<<10|_o[e.charCodeAt(v+1)]<<4|_o[e.charCodeAt(v+2)]>>2,i[c++]=t>>8&255,i[c++]=t&255),i}function Y8(e){return Ro[e>>18&63]+Ro[e>>12&63]+Ro[e>>6&63]+Ro[e&63]}function G8(e,t,n){for(var r,l=[],i=t;iu?u:c+i));return r===1?(t=e[n-1],l.push(Ro[t>>2]+Ro[t<<4&63]+"==")):r===2&&(t=(e[n-2]<<8)+e[n-1],l.push(Ro[t>>10]+Ro[t>>4&63]+Ro[t<<2&63]+"=")),l.join("")}var ig={exports:{}};const Z8={},J8=Object.freeze(Object.defineProperty({__proto__:null,default:Z8},Symbol.toStringTag,{value:"Module"})),hp=k8(J8);/** + * [js-sha256]{@link https://github.com/emn178/js-sha256} + * + * @version 0.10.1 + * @author Chen, Yi-Cyuan [emn178@gmail.com] + * @copyright Chen, Yi-Cyuan 2014-2023 + * @license MIT + */(function(e){(function(){var t="input is invalid type",n=typeof window=="object",r=n?window:{};r.JS_SHA256_NO_WINDOW&&(n=!1);var l=!n&&typeof self=="object",i=!r.JS_SHA256_NO_NODE_JS&&typeof process=="object"&&process.versions&&process.versions.node;i?r=Mr:l&&(r=self);var c=!r.JS_SHA256_NO_COMMON_JS&&!0&&e.exports,u=!r.JS_SHA256_NO_ARRAY_BUFFER&&typeof ArrayBuffer<"u",v="0123456789abcdef".split(""),m=[-2147483648,8388608,32768,128],p=[24,16,8,0],y=[1116352408,1899447441,3049323471,3921009573,961987163,1508970993,2453635748,2870763221,3624381080,310598401,607225278,1426881987,1925078388,2162078206,2614888103,3248222580,3835390401,4022224774,264347078,604807628,770255983,1249150122,1555081692,1996064986,2554220882,2821834349,2952996808,3210313671,3336571891,3584528711,113926993,338241895,666307205,773529912,1294757372,1396182291,1695183700,1986661051,2177026350,2456956037,2730485921,2820302411,3259730800,3345764771,3516065817,3600352804,4094571909,275423344,430227734,506948616,659060556,883997877,958139571,1322822218,1537002063,1747873779,1955562222,2024104815,2227730452,2361852424,2428436474,2756734187,3204031479,3329325298],b=["hex","array","digest","arrayBuffer"],g=[];(r.JS_SHA256_NO_NODE_JS||!Array.isArray)&&(Array.isArray=function(M){return Object.prototype.toString.call(M)==="[object Array]"}),u&&(r.JS_SHA256_NO_ARRAY_BUFFER_IS_VIEW||!ArrayBuffer.isView)&&(ArrayBuffer.isView=function(M){return typeof M=="object"&&M.buffer&&M.buffer.constructor===ArrayBuffer});var w=function(M,E){return function(D){return new S(E,!0).update(D)[M]()}},L=function(M){var E=w("hex",M);i&&(E=$(E,M)),E.create=function(){return new S(M)},E.update=function(I){return E.create().update(I)};for(var D=0;D>2]|=M[I]<>2]|=z<>2]|=(192|z>>6)<>2]|=(128|z&63)<=57344?(T[N>>2]|=(224|z>>12)<>2]|=(128|z>>6&63)<>2]|=(128|z&63)<>2]|=(240|z>>18)<>2]|=(128|z>>12&63)<>2]|=(128|z>>6&63)<>2]|=(128|z&63)<=64?(this.block=T[16],this.start=N-64,this.hash(),this.hashed=!0):this.start=N}return this.bytes>4294967295&&(this.hBytes+=this.bytes/4294967296<<0,this.bytes=this.bytes%4294967296),this}},S.prototype.finalize=function(){if(!this.finalized){this.finalized=!0;var M=this.blocks,E=this.lastByteIndex;M[16]=this.block,M[E>>2]|=m[E&3],this.block=M[16],E>=56&&(this.hashed||this.hash(),M[0]=this.block,M[16]=M[1]=M[2]=M[3]=M[4]=M[5]=M[6]=M[7]=M[8]=M[9]=M[10]=M[11]=M[12]=M[13]=M[14]=M[15]=0),M[14]=this.hBytes<<3|this.bytes>>>29,M[15]=this.bytes<<3,this.hash()}},S.prototype.hash=function(){var M=this.h0,E=this.h1,D=this.h2,z=this.h3,I=this.h4,N=this.h5,H=this.h6,T=this.h7,O=this.blocks,J,se,R,oe,le,Se,k,_,j,U,K;for(J=16;J<64;++J)le=O[J-15],se=(le>>>7|le<<25)^(le>>>18|le<<14)^le>>>3,le=O[J-2],R=(le>>>17|le<<15)^(le>>>19|le<<13)^le>>>10,O[J]=O[J-16]+se+O[J-7]+R<<0;for(K=E&D,J=0;J<64;J+=4)this.first?(this.is224?(_=300032,le=O[0]-1413257819,T=le-150054599<<0,z=le+24177077<<0):(_=704751109,le=O[0]-210244248,T=le-1521486534<<0,z=le+143694565<<0),this.first=!1):(se=(M>>>2|M<<30)^(M>>>13|M<<19)^(M>>>22|M<<10),R=(I>>>6|I<<26)^(I>>>11|I<<21)^(I>>>25|I<<7),_=M&E,oe=_^M&D^K,k=I&N^~I&H,le=T+R+k+y[J]+O[J],Se=se+oe,T=z+le<<0,z=le+Se<<0),se=(z>>>2|z<<30)^(z>>>13|z<<19)^(z>>>22|z<<10),R=(T>>>6|T<<26)^(T>>>11|T<<21)^(T>>>25|T<<7),j=z&M,oe=j^z&E^_,k=T&I^~T&N,le=H+R+k+y[J+1]+O[J+1],Se=se+oe,H=D+le<<0,D=le+Se<<0,se=(D>>>2|D<<30)^(D>>>13|D<<19)^(D>>>22|D<<10),R=(H>>>6|H<<26)^(H>>>11|H<<21)^(H>>>25|H<<7),U=D&z,oe=U^D&M^j,k=H&T^~H&I,le=N+R+k+y[J+2]+O[J+2],Se=se+oe,N=E+le<<0,E=le+Se<<0,se=(E>>>2|E<<30)^(E>>>13|E<<19)^(E>>>22|E<<10),R=(N>>>6|N<<26)^(N>>>11|N<<21)^(N>>>25|N<<7),K=E&D,oe=K^E&z^U,k=N&H^~N&T,le=I+R+k+y[J+3]+O[J+3],Se=se+oe,I=M+le<<0,M=le+Se<<0,this.chromeBugWorkAround=!0;this.h0=this.h0+M<<0,this.h1=this.h1+E<<0,this.h2=this.h2+D<<0,this.h3=this.h3+z<<0,this.h4=this.h4+I<<0,this.h5=this.h5+N<<0,this.h6=this.h6+H<<0,this.h7=this.h7+T<<0},S.prototype.hex=function(){this.finalize();var M=this.h0,E=this.h1,D=this.h2,z=this.h3,I=this.h4,N=this.h5,H=this.h6,T=this.h7,O=v[M>>28&15]+v[M>>24&15]+v[M>>20&15]+v[M>>16&15]+v[M>>12&15]+v[M>>8&15]+v[M>>4&15]+v[M&15]+v[E>>28&15]+v[E>>24&15]+v[E>>20&15]+v[E>>16&15]+v[E>>12&15]+v[E>>8&15]+v[E>>4&15]+v[E&15]+v[D>>28&15]+v[D>>24&15]+v[D>>20&15]+v[D>>16&15]+v[D>>12&15]+v[D>>8&15]+v[D>>4&15]+v[D&15]+v[z>>28&15]+v[z>>24&15]+v[z>>20&15]+v[z>>16&15]+v[z>>12&15]+v[z>>8&15]+v[z>>4&15]+v[z&15]+v[I>>28&15]+v[I>>24&15]+v[I>>20&15]+v[I>>16&15]+v[I>>12&15]+v[I>>8&15]+v[I>>4&15]+v[I&15]+v[N>>28&15]+v[N>>24&15]+v[N>>20&15]+v[N>>16&15]+v[N>>12&15]+v[N>>8&15]+v[N>>4&15]+v[N&15]+v[H>>28&15]+v[H>>24&15]+v[H>>20&15]+v[H>>16&15]+v[H>>12&15]+v[H>>8&15]+v[H>>4&15]+v[H&15];return this.is224||(O+=v[T>>28&15]+v[T>>24&15]+v[T>>20&15]+v[T>>16&15]+v[T>>12&15]+v[T>>8&15]+v[T>>4&15]+v[T&15]),O},S.prototype.toString=S.prototype.hex,S.prototype.digest=function(){this.finalize();var M=this.h0,E=this.h1,D=this.h2,z=this.h3,I=this.h4,N=this.h5,H=this.h6,T=this.h7,O=[M>>24&255,M>>16&255,M>>8&255,M&255,E>>24&255,E>>16&255,E>>8&255,E&255,D>>24&255,D>>16&255,D>>8&255,D&255,z>>24&255,z>>16&255,z>>8&255,z&255,I>>24&255,I>>16&255,I>>8&255,I&255,N>>24&255,N>>16&255,N>>8&255,N&255,H>>24&255,H>>16&255,H>>8&255,H&255];return this.is224||O.push(T>>24&255,T>>16&255,T>>8&255,T&255),O},S.prototype.array=S.prototype.digest,S.prototype.arrayBuffer=function(){this.finalize();var M=new ArrayBuffer(this.is224?28:32),E=new DataView(M);return E.setUint32(0,this.h0),E.setUint32(4,this.h1),E.setUint32(8,this.h2),E.setUint32(12,this.h3),E.setUint32(16,this.h4),E.setUint32(20,this.h5),E.setUint32(24,this.h6),this.is224||E.setUint32(28,this.h7),M};function x(M,E,D){var z,I=typeof M;if(I==="string"){var N=[],H=M.length,T=0,O;for(z=0;z>6,N[T++]=128|O&63):O<55296||O>=57344?(N[T++]=224|O>>12,N[T++]=128|O>>6&63,N[T++]=128|O&63):(O=65536+((O&1023)<<10|M.charCodeAt(++z)&1023),N[T++]=240|O>>18,N[T++]=128|O>>12&63,N[T++]=128|O>>6&63,N[T++]=128|O&63);M=N}else if(I==="object"){if(M===null)throw new Error(t);if(u&&M.constructor===ArrayBuffer)M=new Uint8Array(M);else if(!Array.isArray(M)&&(!u||!ArrayBuffer.isView(M)))throw new Error(t)}else throw new Error(t);M.length>64&&(M=new S(E,!0).update(M).array());var J=[],se=[];for(z=0;z<64;++z){var R=M[z]||0;J[z]=92^R,se[z]=54^R}S.call(this,E,D),this.update(se),this.oKeyPad=J,this.inner=!0,this.sharedMemory=D}x.prototype=new S,x.prototype.finalize=function(){if(S.prototype.finalize.call(this),this.inner){this.inner=!1;var M=this.array();S.call(this,this.is224,this.sharedMemory),this.update(this.oKeyPad),this.update(M),S.prototype.finalize.call(this)}};var P=L();P.sha256=P,P.sha224=L(!0),P.sha256.hmac=A(),P.sha224.hmac=A(!0),c?e.exports=P:(r.sha256=P.sha256,r.sha224=P.sha224)})()})(ig);var eL=ig.exports;const tL=ag(eL);class _l extends Error{}_l.prototype.name="InvalidTokenError";function nL(e){return decodeURIComponent(atob(e).replace(/(.)/g,(t,n)=>{let r=n.charCodeAt(0).toString(16).toUpperCase();return r.length<2&&(r="0"+r),"%"+r}))}function oL(e){let t=e.replace(/-/g,"+").replace(/_/g,"/");switch(t.length%4){case 0:break;case 2:t+="==";break;case 3:t+="=";break;default:throw new Error("base64 string is not of the correct length")}try{return nL(t)}catch{return atob(t)}}function hc(e,t){if(typeof e!="string")throw new _l("Invalid token specified: must be a string");t||(t={});const n=t.header===!0?0:1,r=e.split(".")[n];if(typeof r!="string")throw new _l(`Invalid token specified: missing part #${n+1}`);let l;try{l=oL(r)}catch(i){throw new _l(`Invalid token specified: invalid base64 for part #${n+1} (${i.message})`)}try{return JSON.parse(l)}catch(i){throw new _l(`Invalid token specified: invalid json for part #${n+1} (${i.message})`)}}if(typeof Promise>"u")throw Error("Keycloak requires an environment that supports Promises. Make sure that you include the appropriate polyfill.");function sg(e){if(!(this instanceof sg))throw new Error("The 'Keycloak' constructor must be invoked with 'new'.");for(var t=this,n,r=[],l,i={enable:!0,callbackList:[],interval:5},c=document.getElementsByTagName("script"),u=0;u-1?n=se(k.adapter):k&&typeof k.adapter=="object"?n=k.adapter:window.Cordova||window.cordova?n=se("cordova"):n=se(),k){if(typeof k.useNonce<"u"&&(v=k.useNonce),typeof k.checkLoginIframe<"u"&&(i.enable=k.checkLoginIframe),k.checkLoginIframeInterval&&(i.interval=k.checkLoginIframeInterval),k.onLoad==="login-required"&&(t.loginRequired=!0),k.responseMode)if(k.responseMode==="query"||k.responseMode==="fragment")t.responseMode=k.responseMode;else throw"Invalid value for responseMode";if(k.flow){switch(k.flow){case"standard":t.responseType="code";break;case"implicit":t.responseType="id_token token";break;case"hybrid":t.responseType="code id_token token";break;default:throw"Invalid value for flow"}t.flow=k.flow}if(k.timeSkew!=null&&(t.timeSkew=k.timeSkew),k.redirectUri&&(t.redirectUri=k.redirectUri),k.silentCheckSsoRedirectUri&&(t.silentCheckSsoRedirectUri=k.silentCheckSsoRedirectUri),typeof k.silentCheckSsoFallback=="boolean"?t.silentCheckSsoFallback=k.silentCheckSsoFallback:t.silentCheckSsoFallback=!0,k.pkceMethod){if(k.pkceMethod!=="S256")throw"Invalid value for pkceMethod";t.pkceMethod=k.pkceMethod}typeof k.enableLogging=="boolean"?t.enableLogging=k.enableLogging:t.enableLogging=!1,typeof k.scope=="string"&&(t.scope=k.scope),typeof k.acrValues=="string"&&(t.acrValues=k.acrValues),typeof k.messageReceiveTimeout=="number"&&k.messageReceiveTimeout>0?t.messageReceiveTimeout=k.messageReceiveTimeout:t.messageReceiveTimeout=1e4}t.responseMode||(t.responseMode="fragment"),t.responseType||(t.responseType="code",t.flow="standard");var j=I(),U=I();U.promise.then(function(){t.onReady&&t.onReady(t.authenticated),j.setSuccess(t.authenticated)}).catch(function(C){j.setError(C)});var K=S();function G(){var C=function(ge){ge||(ce.prompt="none"),k&&k.locale&&(ce.locale=k.locale),t.login(ce).then(function(){U.setSuccess()}).catch(function(Ee){U.setError(Ee)})},Z=function(){var ge=document.createElement("iframe"),Ee=t.createLoginUrl({prompt:"none",redirectUri:t.silentCheckSsoRedirectUri});ge.setAttribute("src",Ee),ge.setAttribute("sandbox","allow-storage-access-by-user-activation allow-scripts allow-same-origin"),ge.setAttribute("title","keycloak-silent-check-sso"),ge.style.display="none",document.body.appendChild(ge);var Me=function(je){if(!(je.origin!==window.location.origin||ge.contentWindow!==je.source)){var Ke=E(je.data);A(Ke,U),document.body.removeChild(ge),window.removeEventListener("message",Me)}};window.addEventListener("message",Me)},ce={};switch(k.onLoad){case"check-sso":i.enable?H().then(function(){O().then(function(ge){ge?U.setSuccess():t.silentCheckSsoRedirectUri?Z():C(!1)}).catch(function(ge){U.setError(ge)})}):t.silentCheckSsoRedirectUri?Z():C(!1);break;case"login-required":C(!0);break;default:throw"Invalid value for onLoad"}}function ne(){var C=E(window.location.href);if(C&&window.history.replaceState(window.history.state,null,C.newUrl),C&&C.valid)return H().then(function(){A(C,U)}).catch(function(Z){U.setError(Z)});k?k.token&&k.refreshToken?(P(k.token,k.refreshToken,k.idToken),i.enable?H().then(function(){O().then(function(Z){Z?(t.onAuthSuccess&&t.onAuthSuccess(),U.setSuccess(),T()):U.setSuccess()}).catch(function(Z){U.setError(Z)})}):t.updateToken(-1).then(function(){t.onAuthSuccess&&t.onAuthSuccess(),U.setSuccess()}).catch(function(Z){t.onAuthError&&t.onAuthError(),k.onLoad?G():U.setError(Z)})):k.onLoad?G():U.setSuccess():U.setSuccess()}function W(){var C=I(),Z=function(){(document.readyState==="interactive"||document.readyState==="complete")&&(document.removeEventListener("readystatechange",Z),C.setSuccess())};return document.addEventListener("readystatechange",Z),Z(),C.promise}return K.then(function(){W().then(J).then(ne).catch(function(C){j.setError(C)})}),K.catch(function(C){j.setError(C)}),j.promise},t.login=function(k){return n.login(k)};function y(k){var _=null,j=window.crypto||window.msCrypto;if(j&&j.getRandomValues&&window.Uint8Array)return _=new Uint8Array(k),j.getRandomValues(_),_;_=new Array(k);for(var U=0;U<_.length;U++)_[U]=Math.floor(256*Math.random());return _}function b(k){return g(k,"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789")}function g(k,_){for(var j=y(k),U=new Array(k),K=0;K=0},t.hasResourceRole=function(k,_){if(!t.resourceAccess)return!1;var j=t.resourceAccess[_||t.clientId];return!!j&&j.roles.indexOf(k)>=0},t.loadUserProfile=function(){var k=$()+"/account",_=new XMLHttpRequest;_.open("GET",k,!0),_.setRequestHeader("Accept","application/json"),_.setRequestHeader("Authorization","bearer "+t.token);var j=I();return _.onreadystatechange=function(){_.readyState==4&&(_.status==200?(t.profile=JSON.parse(_.responseText),j.setSuccess(t.profile)):j.setError())},_.send(),j.promise},t.loadUserInfo=function(){var k=t.endpoints.userinfo(),_=new XMLHttpRequest;_.open("GET",k,!0),_.setRequestHeader("Accept","application/json"),_.setRequestHeader("Authorization","bearer "+t.token);var j=I();return _.onreadystatechange=function(){_.readyState==4&&(_.status==200?(t.userInfo=JSON.parse(_.responseText),j.setSuccess(t.userInfo)):j.setError())},_.send(),j.promise},t.isTokenExpired=function(k){if(!t.tokenParsed||!t.refreshToken&&t.flow!="implicit")throw"Not authenticated";if(t.timeSkew==null)return m("[KEYCLOAK] Unable to determine if token is expired as timeskew is not set"),!0;var _=t.tokenParsed.exp-Math.ceil(new Date().getTime()/1e3)+t.timeSkew;if(k){if(isNaN(k))throw"Invalid minValidity";_-=k}return _<0},t.updateToken=function(k){var _=I();if(!t.refreshToken)return _.setError(),_.promise;k=k||5;var j=function(){var K=!1;if(k==-1?(K=!0,m("[KEYCLOAK] Refreshing token: forced refresh")):(!t.tokenParsed||t.isTokenExpired(k))&&(K=!0,m("[KEYCLOAK] Refreshing token: token expired")),!K)_.setSuccess(!1);else{var G="grant_type=refresh_token&refresh_token="+t.refreshToken,ne=t.endpoints.token();if(r.push(_),r.length==1){var W=new XMLHttpRequest;W.open("POST",ne,!0),W.setRequestHeader("Content-type","application/x-www-form-urlencoded"),W.withCredentials=!0,G+="&client_id="+encodeURIComponent(t.clientId);var C=new Date().getTime();W.onreadystatechange=function(){if(W.readyState==4)if(W.status==200){m("[KEYCLOAK] Token refreshed"),C=(C+new Date().getTime())/2;var Z=JSON.parse(W.responseText);P(Z.access_token,Z.refresh_token,Z.id_token,C),t.onAuthRefreshSuccess&&t.onAuthRefreshSuccess();for(var ce=r.pop();ce!=null;ce=r.pop())ce.setSuccess(!0)}else{p("[KEYCLOAK] Failed to refresh token"),W.status==400&&t.clearToken(),t.onAuthRefreshError&&t.onAuthRefreshError();for(var ce=r.pop();ce!=null;ce=r.pop())ce.setError(!0)}},W.send(G)}}};if(i.enable){var U=O();U.then(function(){j()}).catch(function(K){_.setError(K)})}else j();return _.promise},t.clearToken=function(){t.token&&(P(null,null,null),t.onAuthLogout&&t.onAuthLogout(),t.loginRequired&&t.login())};function $(){if(typeof t.authServerUrl<"u")return t.authServerUrl.charAt(t.authServerUrl.length-1)=="/"?t.authServerUrl+"realms/"+encodeURIComponent(t.realm):t.authServerUrl+"/realms/"+encodeURIComponent(t.realm)}function F(){return window.location.origin?window.location.origin:window.location.protocol+"//"+window.location.hostname+(window.location.port?":"+window.location.port:"")}function A(k,_){var j=k.code,U=k.error,K=k.prompt,G=new Date().getTime();if(k.kc_action_status&&t.onActionUpdate&&t.onActionUpdate(k.kc_action_status),U){if(K!="none"){var ne={error:U,error_description:k.error_description};t.onAuthError&&t.onAuthError(ne),_&&_.setError(ne)}else _&&_.setSuccess();return}else t.flow!="standard"&&(k.access_token||k.id_token)&&ce(k.access_token,null,k.id_token,!0);if(t.flow!="implicit"&&j){var W="code="+j+"&grant_type=authorization_code",C=t.endpoints.token(),Z=new XMLHttpRequest;Z.open("POST",C,!0),Z.setRequestHeader("Content-type","application/x-www-form-urlencoded"),W+="&client_id="+encodeURIComponent(t.clientId),W+="&redirect_uri="+k.redirectUri,k.pkceCodeVerifier&&(W+="&code_verifier="+k.pkceCodeVerifier),Z.withCredentials=!0,Z.onreadystatechange=function(){if(Z.readyState==4)if(Z.status==200){var ge=JSON.parse(Z.responseText);ce(ge.access_token,ge.refresh_token,ge.id_token,t.flow==="standard"),T()}else t.onAuthError&&t.onAuthError(),_&&_.setError()},Z.send(W)}function ce(ge,Ee,Me,je){G=(G+new Date().getTime())/2,P(ge,Ee,Me,G),v&&(t.tokenParsed&&t.tokenParsed.nonce!=k.storedNonce||t.refreshTokenParsed&&t.refreshTokenParsed.nonce!=k.storedNonce||t.idTokenParsed&&t.idTokenParsed.nonce!=k.storedNonce)?(m("[KEYCLOAK] Invalid nonce, clearing token"),t.clearToken(),_&&_.setError()):je&&(t.onAuthSuccess&&t.onAuthSuccess(),_&&_.setSuccess())}}function S(k){var _=I(),j;e?typeof e=="string"&&(j=e):j="keycloak.json";function U(Z){Z?t.endpoints={authorize:function(){return Z.authorization_endpoint},token:function(){return Z.token_endpoint},logout:function(){if(!Z.end_session_endpoint)throw"Not supported by the OIDC server";return Z.end_session_endpoint},checkSessionIframe:function(){if(!Z.check_session_iframe)throw"Not supported by the OIDC server";return Z.check_session_iframe},register:function(){throw'Redirection to "Register user" page not supported in standard OIDC mode'},userinfo:function(){if(!Z.userinfo_endpoint)throw"Not supported by the OIDC server";return Z.userinfo_endpoint}}:t.endpoints={authorize:function(){return $()+"/protocol/openid-connect/auth"},token:function(){return $()+"/protocol/openid-connect/token"},logout:function(){return $()+"/protocol/openid-connect/logout"},checkSessionIframe:function(){var ce=$()+"/protocol/openid-connect/login-status-iframe.html";return t.iframeVersion&&(ce=ce+"?version="+t.iframeVersion),ce},thirdPartyCookiesIframe:function(){var ce=$()+"/protocol/openid-connect/3p-cookies/step1.html";return t.iframeVersion&&(ce=ce+"?version="+t.iframeVersion),ce},register:function(){return $()+"/protocol/openid-connect/registrations"},userinfo:function(){return $()+"/protocol/openid-connect/userinfo"}}}if(j){var K=new XMLHttpRequest;K.open("GET",j,!0),K.setRequestHeader("Accept","application/json"),K.onreadystatechange=function(){if(K.readyState==4)if(K.status==200||x(K)){var Z=JSON.parse(K.responseText);t.authServerUrl=Z["auth-server-url"],t.realm=Z.realm,t.clientId=Z.resource,U(null),_.setSuccess()}else _.setError()},K.send()}else{if(!e.clientId)throw"clientId missing";t.clientId=e.clientId;var G=e.oidcProvider;if(G)if(typeof G=="string"){var C;G.charAt(G.length-1)=="/"?C=G+".well-known/openid-configuration":C=G+"/.well-known/openid-configuration";var K=new XMLHttpRequest;K.open("GET",C,!0),K.setRequestHeader("Accept","application/json"),K.onreadystatechange=function(){if(K.readyState==4)if(K.status==200||x(K)){var ce=JSON.parse(K.responseText);U(ce),_.setSuccess()}else _.setError()},K.send()}else U(G),_.setSuccess();else{if(!e.url){for(var ne=document.getElementsByTagName("script"),W=0;W=0;--ne){var W=G[ne];K.data=="error"?W.setError():W.setSuccess(K.data=="unchanged")}}};return window.addEventListener("message",U,!1),k.promise}function T(){i.enable&&t.token&&setTimeout(function(){O().then(function(k){k&&T()})},i.interval*1e3)}function O(){var k=I();if(i.iframe&&i.iframeOrigin){var _=t.clientId+" "+(t.sessionId?t.sessionId:"");i.callbackList.push(k);var j=i.iframeOrigin;i.callbackList.length==1&&i.iframe.contentWindow.postMessage(_,j)}else k.setSuccess();return k.promise}function J(){var k=I();if(i.enable||t.silentCheckSsoRedirectUri){var _=document.createElement("iframe");_.setAttribute("src",t.endpoints.thirdPartyCookiesIframe()),_.setAttribute("sandbox","allow-storage-access-by-user-activation allow-scripts allow-same-origin"),_.setAttribute("title","keycloak-3p-check-iframe"),_.style.display="none",document.body.appendChild(_);var j=function(U){_.contentWindow===U.source&&(U.data!=="supported"&&U.data!=="unsupported"||(U.data==="unsupported"&&(p(`[KEYCLOAK] Your browser is blocking access to 3rd-party cookies, this means: + + - It is not possible to retrieve tokens without redirecting to the Keycloak server (a.k.a. no support for silent authentication). + - It is not possible to automatically detect changes to the session status (such as the user logging out in another tab). + +For more information see: https://www.keycloak.org/docs/latest/securing_apps/#_modern_browsers`),i.enable=!1,t.silentCheckSsoFallback&&(t.silentCheckSsoRedirectUri=!1)),document.body.removeChild(_),window.removeEventListener("message",j),k.setSuccess()))};window.addEventListener("message",j,!1)}else k.setSuccess();return N(k.promise,t.messageReceiveTimeout,"Timeout when waiting for 3rd party check iframe message.")}function se(k){if(!k||k=="default")return{login:function(ne){return window.location.assign(t.createLoginUrl(ne)),I().promise},logout:function(ne){return window.location.replace(t.createLogoutUrl(ne)),I().promise},register:function(ne){return window.location.assign(t.createRegisterUrl(ne)),I().promise},accountManagement:function(){var ne=t.createAccountUrl();if(typeof ne<"u")window.location.href=ne;else throw"Not supported by the OIDC server";return I().promise},redirectUri:function(ne,W){return ne&&ne.redirectUri?ne.redirectUri:t.redirectUri?t.redirectUri:location.href}};if(k=="cordova"){i.enable=!1;var _=function(ne,W,C){return window.cordova&&window.cordova.InAppBrowser?window.cordova.InAppBrowser.open(ne,W,C):window.open(ne,W,C)},j=function(ne){return ne&&ne.cordovaOptions?Object.keys(ne.cordovaOptions).reduce(function(W,C){return W[C]=ne.cordovaOptions[C],W},{}):{}},U=function(ne){return Object.keys(ne).reduce(function(W,C){return W.push(C+"="+ne[C]),W},[]).join(",")},K=function(ne){var W=j(ne);return W.location="no",ne&&ne.prompt=="none"&&(W.hidden="yes"),U(W)},G=function(){return t.redirectUri||"http://localhost"};return{login:function(ne){var W=I(),C=K(ne),Z=t.createLoginUrl(ne),ce=_(Z,"_blank",C),ge=!1,Ee=!1,Me=function(){Ee=!0,ce.close()};return ce.addEventListener("loadstart",function(je){if(je.url.indexOf(G())==0){var Ke=E(je.url);A(Ke,W),Me(),ge=!0}}),ce.addEventListener("loaderror",function(je){if(!ge)if(je.url.indexOf(G())==0){var Ke=E(je.url);A(Ke,W),Me(),ge=!0}else W.setError(),Me()}),ce.addEventListener("exit",function(je){Ee||W.setError({reason:"closed_by_user"})}),W.promise},logout:function(ne){var W=I(),C=t.createLogoutUrl(ne),Z=_(C,"_blank","location=no,hidden=yes,clearcache=yes"),ce;return Z.addEventListener("loadstart",function(ge){ge.url.indexOf(G())==0&&Z.close()}),Z.addEventListener("loaderror",function(ge){ge.url.indexOf(G())==0||(ce=!0),Z.close()}),Z.addEventListener("exit",function(ge){ce?W.setError():(t.clearToken(),W.setSuccess())}),W.promise},register:function(ne){var W=I(),C=t.createRegisterUrl(),Z=K(ne),ce=_(C,"_blank",Z);return ce.addEventListener("loadstart",function(ge){if(ge.url.indexOf(G())==0){ce.close();var Ee=E(ge.url);A(Ee,W)}}),W.promise},accountManagement:function(){var ne=t.createAccountUrl();if(typeof ne<"u"){var W=_(ne,"_blank","location=no");W.addEventListener("loadstart",function(C){C.url.indexOf(G())==0&&W.close()})}else throw"Not supported by the OIDC server"},redirectUri:function(ne){return G()}}}if(k=="cordova-native")return i.enable=!1,{login:function(ne){var W=I(),C=t.createLoginUrl(ne);return universalLinks.subscribe("keycloak",function(Z){universalLinks.unsubscribe("keycloak"),window.cordova.plugins.browsertab.close();var ce=E(Z.url);A(ce,W)}),window.cordova.plugins.browsertab.openUrl(C),W.promise},logout:function(ne){var W=I(),C=t.createLogoutUrl(ne);return universalLinks.subscribe("keycloak",function(Z){universalLinks.unsubscribe("keycloak"),window.cordova.plugins.browsertab.close(),t.clearToken(),W.setSuccess()}),window.cordova.plugins.browsertab.openUrl(C),W.promise},register:function(ne){var W=I(),C=t.createRegisterUrl(ne);return universalLinks.subscribe("keycloak",function(Z){universalLinks.unsubscribe("keycloak"),window.cordova.plugins.browsertab.close();var ce=E(Z.url);A(ce,W)}),window.cordova.plugins.browsertab.openUrl(C),W.promise},accountManagement:function(){var ne=t.createAccountUrl();if(typeof ne<"u")window.cordova.plugins.browsertab.openUrl(ne);else throw"Not supported by the OIDC server"},redirectUri:function(ne){return ne&&ne.redirectUri?ne.redirectUri:t.redirectUri?t.redirectUri:"http://localhost"}};throw"invalid adapter type: "+k}var R=function(){if(!(this instanceof R))return new R;localStorage.setItem("kc-test","test"),localStorage.removeItem("kc-test");var k=this;function _(){for(var j=new Date().getTime(),U=0;Ut.themeConfig.logo);return(r,l)=>(ie(),ye("div",aL,[Ce("div",rL,[Ce("img",{src:n.value,width:"320px",style:{padding:"20px"}},null,8,lL),iL])]))}},sL=Object.freeze(Object.defineProperty({__proto__:null,default:ug},Symbol.toStringTag,{value:"Module"})),uL={key:0},cL={key:0},dL={key:0},vL={key:1},cg={__name:"KLayout",setup(e){const{theme:t}=Tl(),{Layout:n}=Ip,r=X(!1),l=X(!1),i=X(!1);return jt(()=>{if(!ja.has(t.value,"keycloak"))return;r.value=!0;const c=new sg(t.value.keycloak);c.init({onLoad:"login-required",checkLoginIframe:!1}).then(u=>{if(u){l.value=!0;const v=ja.get(t.value,"keycloak.roles",[]);if(ja.isEmpty(v))i.value=!0;else{const m=ja.get(c,"realmAccess.roles",[]);ja.isEmpty(ja.intersection(m,v))||(i.value=!0)}}else window.location.reload()})}),(c,u)=>{const v=Ta("Content");return r.value?(ie(),ye("div",uL,[l.value?(ie(),ye("div",cL,[i.value?(ie(),ye("div",dL,[We(he(n),null,{default:Fe(()=>[We(v)]),_:1})])):(ie(),ye("div",vL,[We(ug)]))])):Je("",!0)])):(ie(),ht(he(n),{key:1}))}}},fL=Object.freeze(Object.defineProperty({__proto__:null,default:cg},Symbol.toStringTag,{value:"Module"})),hL={extends:Ip,Layout:cg,enhanceApp({app:e}){e.use(S8,{},{req:{headers:{}}}),e.component("HomeFooter",rg);const t=Object.assign({"./components/AccessDenied.vue":()=>vl(()=>Promise.resolve().then(()=>sL),void 0),"./components/HomeFooter.vue":()=>vl(()=>Promise.resolve().then(()=>V8),void 0),"./components/KLayout.vue":()=>vl(()=>Promise.resolve().then(()=>fL),void 0),"./components/Maps.vue":()=>vl(()=>Promise.resolve().then(()=>R8),void 0),"./components/TourLink.vue":()=>vl(()=>Promise.resolve().then(()=>D8),void 0)});for(const n in t)t[n]().then(r=>{r.default.__name!=="HomeFooter"&&e.component(r.default.__name,r.default)})}};export{hL as t}; +function __vite__mapDeps(indexes) { + if (!__vite__mapDeps.viteFileDeps) { + __vite__mapDeps.viteFileDeps = [] + } + return indexes.map((i) => __vite__mapDeps.viteFileDeps[i]) +} diff --git a/assets/chunks/theme.d24cb4fa.js b/assets/chunks/theme.d24cb4fa.js deleted file mode 100644 index 75302b94..00000000 --- a/assets/chunks/theme.d24cb4fa.js +++ /dev/null @@ -1 +0,0 @@ -import{d as g,o as a,c as i,r as u,n as N,a as x,t as V,_ as m,b,w as v,e as f,T as ce,u as He,i as ze,f as ue,g as k,h as S,j as G,k as c,l as r,p as H,m as z,q as O,s as j,v as le,x as U,y as te,z as de,A as Pe,B as De,C as R,F as M,D as A,E as _e,G as W,H as h,I as E,J as Ve,K as se,L as X,M as ne,N as Fe,O as Ee,P as we,Q as Oe,R as Ge,S as Le,U as Se,V as Ue,W as Re,X as je,Y as qe}from"./framework.f7d371db.js";const Ke=g({__name:"VPBadge",props:{text:{},type:{default:"tip"}},setup(s){return(e,t)=>(a(),i("span",{class:N(["VPBadge",e.type])},[u(e.$slots,"default",{},()=>[x(V(e.text),1)],!0)],2))}});const We=m(Ke,[["__scopeId","data-v-ea5b2908"]]),Ye={key:0,class:"VPBackdrop"},Je=g({__name:"VPBackdrop",props:{show:{type:Boolean}},setup(s){return(e,t)=>(a(),b(ce,{name:"fade"},{default:v(()=>[e.show?(a(),i("div",Ye)):f("",!0)]),_:1}))}});const Qe=m(Je,[["__scopeId","data-v-54a304ca"]]),y=He;function Xe(s,e){let t,n=!1;return()=>{t&&clearTimeout(t),n?t=setTimeout(s,e):(s(),(n=!0)&&setTimeout(()=>n=!1,e))}}function re(s){return/^\//.test(s)?s:`/${s}`}function Y(s){if(ze(s))return s;const{site:e}=y(),{pathname:t,search:n,hash:o}=new URL(s,"http://a.com"),l=t.endsWith("/")||t.endsWith(".html")?s:s.replace(/(?:(^\.+)\/)?.*$/,`$1${t.replace(/(\.md)?$/,e.value.cleanUrls?"":".html")}${n}${o}`);return ue(l)}function J({removeCurrent:s=!0,correspondingLink:e=!1}={}){const{site:t,localeIndex:n,page:o,theme:l}=y(),d=k(()=>{var _,$;return{label:(_=t.value.locales[n.value])==null?void 0:_.label,link:(($=t.value.locales[n.value])==null?void 0:$.link)||(n.value==="root"?"/":`/${n.value}/`)}});return{localeLinks:k(()=>Object.entries(t.value.locales).flatMap(([_,$])=>s&&d.value.label===$.label?[]:{text:$.label,link:Ze($.link||(_==="root"?"/":`/${_}/`),l.value.i18nRouting!==!1&&e,o.value.relativePath.slice(d.value.link.length-1),!t.value.cleanUrls)})),currentLang:d}}function Ze(s,e,t,n){return e?s.replace(/\/$/,"")+re(t.replace(/(^|\/)index\.md$/,"$1").replace(/\.md$/,n?".html":"")):s}const et=s=>(H("data-v-b9c0c15a"),s=s(),z(),s),tt={class:"NotFound"},st={class:"code"},nt={class:"title"},ot=et(()=>c("div",{class:"divider"},null,-1)),at={class:"quote"},lt={class:"action"},rt=["href","aria-label"],it=g({__name:"NotFound",setup(s){const{site:e,theme:t}=y(),{localeLinks:n}=J({removeCurrent:!1}),o=S("/");return G(()=>{var d;const l=window.location.pathname.replace(e.value.base,"").replace(/(^.*?\/).*$/,"/$1");n.value.length&&(o.value=((d=n.value.find(({link:p})=>p.startsWith(l)))==null?void 0:d.link)||n.value[0].link)}),(l,d)=>{var p,_,$,L,T;return a(),i("div",tt,[c("p",st,V(((p=r(t).notFound)==null?void 0:p.code)??"404"),1),c("h1",nt,V(((_=r(t).notFound)==null?void 0:_.title)??"PAGE NOT FOUND"),1),ot,c("blockquote",at,V((($=r(t).notFound)==null?void 0:$.quote)??"But if you don't change your direction, and if you keep looking, you may end up where you are heading."),1),c("div",lt,[c("a",{class:"link",href:r(ue)(o.value),"aria-label":((L=r(t).notFound)==null?void 0:L.linkLabel)??"go to home"},V(((T=r(t).notFound)==null?void 0:T.linkText)??"Take me home"),9,rt)])])}}});const ct=m(it,[["__scopeId","data-v-b9c0c15a"]]);function Me(s,e){if(Array.isArray(s))return Z(s);if(s==null)return[];e=re(e);const t=Object.keys(s).sort((o,l)=>l.split("/").length-o.split("/").length).find(o=>e.startsWith(re(o))),n=t?s[t]:[];return Array.isArray(n)?Z(n):Z(n.items,n.base)}function ut(s){const e=[];let t=0;for(const n in s){const o=s[n];if(o.items){t=e.push(o);continue}e[t]||e.push({items:[]}),e[t].items.push(o)}return e}function dt(s){const e=[];function t(n){for(const o of n)o.text&&o.link&&e.push({text:o.text,link:o.link,docFooterText:o.docFooterText}),o.items&&t(o.items)}return t(s),e}function ie(s,e){return Array.isArray(e)?e.some(t=>ie(s,t)):O(s,e.link)?!0:e.items?ie(s,e.items):!1}function Z(s,e){return[...s].map(t=>{const n={...t},o=n.base||e;return o&&n.link&&(n.link=o+n.link),n.items&&(n.items=Z(n.items,o)),n})}function D(){const{frontmatter:s,page:e,theme:t}=y(),n=le("(min-width: 960px)"),o=S(!1),l=k(()=>{const I=t.value.sidebar,P=e.value.relativePath;return I?Me(I,P):[]}),d=S(l.value);U(l,(I,P)=>{JSON.stringify(I)!==JSON.stringify(P)&&(d.value=l.value)});const p=k(()=>s.value.sidebar!==!1&&d.value.length>0&&s.value.layout!=="home"),_=k(()=>$?s.value.aside==null?t.value.aside==="left":s.value.aside==="left":!1),$=k(()=>s.value.layout==="home"?!1:s.value.aside!=null?!!s.value.aside:t.value.aside!==!1),L=k(()=>p.value&&n.value),T=k(()=>p.value?ut(d.value):[]);function C(){o.value=!0}function w(){o.value=!1}function B(){o.value?w():C()}return{isOpen:o,sidebar:d,sidebarGroups:T,hasSidebar:p,hasAside:$,leftAside:_,isSidebarEnabled:L,open:C,close:w,toggle:B}}function _t(s,e){let t;te(()=>{t=s.value?document.activeElement:void 0}),G(()=>{window.addEventListener("keyup",n)}),de(()=>{window.removeEventListener("keyup",n)});function n(o){o.key==="Escape"&&s.value&&(e(),t==null||t.focus())}}const Ne=S(j?location.hash:"");j&&window.addEventListener("hashchange",()=>{Ne.value=location.hash});function vt(s){const{page:e}=y(),t=S(!1),n=k(()=>s.value.collapsed!=null),o=k(()=>!!s.value.link),l=S(!1),d=()=>{l.value=O(e.value.relativePath,s.value.link)};U([e,s,Ne],d),G(d);const p=k(()=>l.value?!0:s.value.items?ie(e.value.relativePath,s.value.items):!1),_=k(()=>!!(s.value.items&&s.value.items.length));te(()=>{t.value=!!(n.value&&s.value.collapsed)}),Pe(()=>{(l.value||p.value)&&(t.value=!1)});function $(){n.value&&(t.value=!t.value)}return{collapsed:t,collapsible:n,isLink:o,isActiveLink:l,hasActiveLink:p,hasChildren:_,toggle:$}}function pt(){const{hasSidebar:s}=D(),e=le("(min-width: 960px)"),t=le("(min-width: 1280px)");return{isAsideEnabled:k(()=>!t.value&&!e.value?!1:s.value?t.value:e.value)}}const ht=71;function ve(s){return typeof s.outline=="object"&&!Array.isArray(s.outline)&&s.outline.label||s.outlineTitle||"On this page"}function pe(s){const e=[...document.querySelectorAll(".VPDoc :where(h1,h2,h3,h4,h5,h6)")].filter(t=>t.id&&t.hasChildNodes()).map(t=>{const n=Number(t.tagName[1]);return{title:ft(t),link:"#"+t.id,level:n}});return mt(e,s)}function ft(s){let e="";for(const t of s.childNodes)if(t.nodeType===1){if(t.classList.contains("VPBadge")||t.classList.contains("header-anchor"))continue;e+=t.textContent}else t.nodeType===3&&(e+=t.textContent);return e.trim()}function mt(s,e){if(e===!1)return[];const t=(typeof e=="object"&&!Array.isArray(e)?e.level:e)||2,[n,o]=typeof t=="number"?[t,t]:t==="deep"?[2,6]:t;s=s.filter(d=>d.level>=n&&d.level<=o);const l=[];e:for(let d=0;d=0;_--){const $=s[_];if($.level{requestAnimationFrame(l),window.addEventListener("scroll",n)}),De(()=>{d(location.hash)}),de(()=>{window.removeEventListener("scroll",n)});function l(){if(!t.value)return;const p=[].slice.call(s.value.querySelectorAll(".outline-link")),_=[].slice.call(document.querySelectorAll(".content .header-anchor")).filter(w=>p.some(B=>B.hash===w.hash&&w.offsetParent!==null)),$=window.scrollY,L=window.innerHeight,T=document.body.offsetHeight,C=Math.abs($+L-T)<1;if(_.length&&C){d(_[_.length-1].hash);return}for(let w=0;w<_.length;w++){const B=_[w],I=_[w+1],[P,q]=bt(w,B,I);if(P){d(q);return}}}function d(p){o&&o.classList.remove("active"),p==null?o=null:o=s.value.querySelector(`a[href="${decodeURIComponent(p)}"]`);const _=o;_?(_.classList.add("active"),e.value.style.top=_.offsetTop+33+"px",e.value.style.opacity="1"):(e.value.style.top="33px",e.value.style.opacity="0")}}function ke(s){return s.parentElement.offsetTop-ht}function bt(s,e,t){const n=window.scrollY;return s===0&&n===0?[!0,null]:n{const o=R("VPDocOutlineItem",!0);return a(),i("ul",{class:N(t.root?"root":"nested")},[(a(!0),i(M,null,A(t.headers,({children:l,link:d,title:p})=>(a(),i("li",null,[c("a",{class:"outline-link",href:d,onClick:e,title:p},V(p),9,$t),l!=null&&l.length?(a(),b(o,{key:0,headers:l},null,8,["headers"])):f("",!0)]))),256))],2)}}});const he=m(kt,[["__scopeId","data-v-463da30f"]]),yt=s=>(H("data-v-3a6c4994"),s=s(),z(),s),Pt={class:"content"},Vt={class:"outline-title",role:"heading","aria-level":"2"},wt={"aria-labelledby":"doc-outline-aria-label"},Lt=yt(()=>c("span",{class:"visually-hidden",id:"doc-outline-aria-label"}," Table of Contents for current page ",-1)),St=g({__name:"VPDocAsideOutline",setup(s){const{frontmatter:e,theme:t}=y(),n=_e([]);W(()=>{n.value=pe(e.value.outline??t.value.outline)});const o=S(),l=S();return gt(o,l),(d,p)=>(a(),i("div",{class:N(["VPDocAsideOutline",{"has-outline":n.value.length>0}]),ref_key:"container",ref:o,role:"navigation"},[c("div",Pt,[c("div",{class:"outline-marker",ref_key:"marker",ref:l},null,512),c("div",Vt,V(r(ve)(r(t))),1),c("nav",wt,[Lt,h(he,{headers:n.value,root:!0},null,8,["headers"])])])],2))}});const Mt=m(St,[["__scopeId","data-v-3a6c4994"]]),Nt={class:"VPDocAsideCarbonAds"},Ct=g({__name:"VPDocAsideCarbonAds",props:{carbonAds:{}},setup(s){const e=()=>null;return(t,n)=>(a(),i("div",Nt,[h(r(e),{"carbon-ads":t.carbonAds},null,8,["carbon-ads"])]))}}),It=s=>(H("data-v-cb998dce"),s=s(),z(),s),Bt={class:"VPDocAside"},Tt=It(()=>c("div",{class:"spacer"},null,-1)),At=g({__name:"VPDocAside",setup(s){const{theme:e}=y();return(t,n)=>(a(),i("div",Bt,[u(t.$slots,"aside-top",{},void 0,!0),u(t.$slots,"aside-outline-before",{},void 0,!0),h(Mt),u(t.$slots,"aside-outline-after",{},void 0,!0),Tt,u(t.$slots,"aside-ads-before",{},void 0,!0),r(e).carbonAds?(a(),b(Ct,{key:0,"carbon-ads":r(e).carbonAds},null,8,["carbon-ads"])):f("",!0),u(t.$slots,"aside-ads-after",{},void 0,!0),u(t.$slots,"aside-bottom",{},void 0,!0)]))}});const xt=m(At,[["__scopeId","data-v-cb998dce"]]);function Ht(){const{theme:s,page:e}=y();return k(()=>{const{text:t="Edit this page",pattern:n=""}=s.value.editLink||{};let o;return typeof n=="function"?o=n(e.value):o=n.replace(/:path/g,e.value.filePath),{url:o,text:t}})}function zt(){const{page:s,theme:e,frontmatter:t}=y();return k(()=>{var _,$,L,T,C,w,B,I;const n=Me(e.value.sidebar,s.value.relativePath),o=dt(n),l=o.findIndex(P=>O(s.value.relativePath,P.link)),d=((_=e.value.docFooter)==null?void 0:_.prev)===!1&&!t.value.prev||t.value.prev===!1,p=(($=e.value.docFooter)==null?void 0:$.next)===!1&&!t.value.next||t.value.next===!1;return{prev:d?void 0:{text:(typeof t.value.prev=="string"?t.value.prev:typeof t.value.prev=="object"?t.value.prev.text:void 0)??((L=o[l-1])==null?void 0:L.docFooterText)??((T=o[l-1])==null?void 0:T.text),link:(typeof t.value.prev=="object"?t.value.prev.link:void 0)??((C=o[l-1])==null?void 0:C.link)},next:p?void 0:{text:(typeof t.value.next=="string"?t.value.next:typeof t.value.next=="object"?t.value.next.text:void 0)??((w=o[l+1])==null?void 0:w.docFooterText)??((B=o[l+1])==null?void 0:B.text),link:(typeof t.value.next=="object"?t.value.next.link:void 0)??((I=o[l+1])==null?void 0:I.link)}}})}const Dt={},Ft={xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24"},Et=c("path",{d:"M18,23H4c-1.7,0-3-1.3-3-3V6c0-1.7,1.3-3,3-3h7c0.6,0,1,0.4,1,1s-0.4,1-1,1H4C3.4,5,3,5.4,3,6v14c0,0.6,0.4,1,1,1h14c0.6,0,1-0.4,1-1v-7c0-0.6,0.4-1,1-1s1,0.4,1,1v7C21,21.7,19.7,23,18,23z"},null,-1),Ot=c("path",{d:"M8,17c-0.3,0-0.5-0.1-0.7-0.3C7,16.5,6.9,16.1,7,15.8l1-4c0-0.2,0.1-0.3,0.3-0.5l9.5-9.5c1.2-1.2,3.2-1.2,4.4,0c1.2,1.2,1.2,3.2,0,4.4l-9.5,9.5c-0.1,0.1-0.3,0.2-0.5,0.3l-4,1C8.2,17,8.1,17,8,17zM9.9,12.5l-0.5,2.1l2.1-0.5l9.3-9.3c0.4-0.4,0.4-1.1,0-1.6c-0.4-0.4-1.2-0.4-1.6,0l0,0L9.9,12.5z M18.5,2.5L18.5,2.5L18.5,2.5z"},null,-1),Gt=[Et,Ot];function Ut(s,e){return a(),i("svg",Ft,Gt)}const Rt=m(Dt,[["render",Ut]]),F=g({__name:"VPLink",props:{tag:{},href:{},noIcon:{type:Boolean},target:{},rel:{}},setup(s){const e=s,t=k(()=>e.tag??(e.href?"a":"span")),n=k(()=>e.href&&Ve.test(e.href));return(o,l)=>(a(),b(E(t.value),{class:N(["VPLink",{link:o.href,"vp-external-link-icon":n.value,"no-icon":o.noIcon}]),href:o.href?r(Y)(o.href):void 0,target:o.target??(n.value?"_blank":void 0),rel:o.rel??(n.value?"noreferrer":void 0)},{default:v(()=>[u(o.$slots,"default")]),_:3},8,["class","href","target","rel"]))}}),jt={class:"VPLastUpdated"},qt=["datetime"],Kt=g({__name:"VPDocFooterLastUpdated",setup(s){const{theme:e,page:t,frontmatter:n,lang:o}=y(),l=k(()=>new Date(n.value.lastUpdated??t.value.lastUpdated)),d=k(()=>l.value.toISOString()),p=S("");return G(()=>{te(()=>{var _,$,L;p.value=new Intl.DateTimeFormat(($=(_=e.value.lastUpdated)==null?void 0:_.formatOptions)!=null&&$.forceLocale?o.value:void 0,((L=e.value.lastUpdated)==null?void 0:L.formatOptions)??{dateStyle:"short",timeStyle:"short"}).format(l.value)})}),(_,$)=>{var L;return a(),i("p",jt,[x(V(((L=r(e).lastUpdated)==null?void 0:L.text)||r(e).lastUpdatedText||"Last updated")+": ",1),c("time",{datetime:d.value},V(p.value),9,qt)])}}});const Wt=m(Kt,[["__scopeId","data-v-19a7ae4e"]]),Yt={key:0,class:"VPDocFooter"},Jt={key:0,class:"edit-info"},Qt={key:0,class:"edit-link"},Xt={key:1,class:"last-updated"},Zt={key:1,class:"prev-next"},es={class:"pager"},ts=["href"],ss=["innerHTML"],ns=["innerHTML"],os={class:"pager"},as=["href"],ls=["innerHTML"],rs=["innerHTML"],is=g({__name:"VPDocFooter",setup(s){const{theme:e,page:t,frontmatter:n}=y(),o=Ht(),l=zt(),d=k(()=>e.value.editLink&&n.value.editLink!==!1),p=k(()=>t.value.lastUpdated&&n.value.lastUpdated!==!1),_=k(()=>d.value||p.value||l.value.prev||l.value.next);return($,L)=>{var T,C,w,B,I,P;return _.value?(a(),i("footer",Yt,[u($.$slots,"doc-footer-before",{},void 0,!0),d.value||p.value?(a(),i("div",Jt,[d.value?(a(),i("div",Qt,[h(F,{class:"edit-link-button",href:r(o).url,"no-icon":!0},{default:v(()=>[h(Rt,{class:"edit-link-icon","aria-label":"edit icon"}),x(" "+V(r(o).text),1)]),_:1},8,["href"])])):f("",!0),p.value?(a(),i("div",Xt,[h(Wt)])):f("",!0)])):f("",!0),(T=r(l).prev)!=null&&T.link||(C=r(l).next)!=null&&C.link?(a(),i("nav",Zt,[c("div",es,[(w=r(l).prev)!=null&&w.link?(a(),i("a",{key:0,class:"pager-link prev",href:r(Y)(r(l).prev.link)},[c("span",{class:"desc",innerHTML:((B=r(e).docFooter)==null?void 0:B.prev)||"Previous page"},null,8,ss),c("span",{class:"title",innerHTML:r(l).prev.text},null,8,ns)],8,ts)):f("",!0)]),c("div",os,[(I=r(l).next)!=null&&I.link?(a(),i("a",{key:0,class:"pager-link next",href:r(Y)(r(l).next.link)},[c("span",{class:"desc",innerHTML:((P=r(e).docFooter)==null?void 0:P.next)||"Next page"},null,8,ls),c("span",{class:"title",innerHTML:r(l).next.text},null,8,rs)],8,as)):f("",!0)])])):f("",!0)])):f("",!0)}}});const cs=m(is,[["__scopeId","data-v-a2d931e4"]]),us={},ds={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},_s=c("path",{d:"M9,19c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l5.3-5.3L8.3,6.7c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l6,6c0.4,0.4,0.4,1,0,1.4l-6,6C9.5,18.9,9.3,19,9,19z"},null,-1),vs=[_s];function ps(s,e){return a(),i("svg",ds,vs)}const fe=m(us,[["render",ps]]),hs={key:0,class:"VPDocOutlineDropdown"},fs={key:0,class:"items"},ms=g({__name:"VPDocOutlineDropdown",setup(s){const{frontmatter:e,theme:t}=y(),n=S(!1);W(()=>{n.value=!1});const o=_e([]);return W(()=>{o.value=pe(e.value.outline??t.value.outline)}),(l,d)=>o.value.length>0?(a(),i("div",hs,[c("button",{onClick:d[0]||(d[0]=p=>n.value=!n.value),class:N({open:n.value})},[x(V(r(ve)(r(t)))+" ",1),h(fe,{class:"icon"})],2),n.value?(a(),i("div",fs,[h(he,{headers:o.value},null,8,["headers"])])):f("",!0)])):f("",!0)}});const gs=m(ms,[["__scopeId","data-v-95bb0785"]]),bs=s=>(H("data-v-a3c25e27"),s=s(),z(),s),$s={class:"container"},ks=bs(()=>c("div",{class:"aside-curtain"},null,-1)),ys={class:"aside-container"},Ps={class:"aside-content"},Vs={class:"content"},ws={class:"content-container"},Ls={class:"main"},Ss=g({__name:"VPDoc",setup(s){const{theme:e}=y(),t=se(),{hasSidebar:n,hasAside:o,leftAside:l}=D(),d=k(()=>t.path.replace(/[./]+/g,"_").replace(/_html$/,""));return(p,_)=>{const $=R("Content");return a(),i("div",{class:N(["VPDoc",{"has-sidebar":r(n),"has-aside":r(o)}])},[u(p.$slots,"doc-top",{},void 0,!0),c("div",$s,[r(o)?(a(),i("div",{key:0,class:N(["aside",{"left-aside":r(l)}])},[ks,c("div",ys,[c("div",Ps,[h(xt,null,{"aside-top":v(()=>[u(p.$slots,"aside-top",{},void 0,!0)]),"aside-bottom":v(()=>[u(p.$slots,"aside-bottom",{},void 0,!0)]),"aside-outline-before":v(()=>[u(p.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":v(()=>[u(p.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":v(()=>[u(p.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":v(()=>[u(p.$slots,"aside-ads-after",{},void 0,!0)]),_:3})])])],2)):f("",!0),c("div",Vs,[c("div",ws,[u(p.$slots,"doc-before",{},void 0,!0),h(gs),c("main",Ls,[h($,{class:N(["vp-doc",[d.value,r(e).externalLinkIcon&&"external-link-icon-enabled"]])},null,8,["class"])]),h(cs,null,{"doc-footer-before":v(()=>[u(p.$slots,"doc-footer-before",{},void 0,!0)]),_:3}),u(p.$slots,"doc-after",{},void 0,!0)])])]),u(p.$slots,"doc-bottom",{},void 0,!0)],2)}}});const Ms=m(Ss,[["__scopeId","data-v-a3c25e27"]]),Ns=g({__name:"VPButton",props:{tag:{},size:{default:"medium"},theme:{default:"brand"},text:{},href:{}},setup(s){const e=s,t=k(()=>e.href&&Ve.test(e.href)),n=k(()=>e.tag||e.href?"a":"button");return(o,l)=>(a(),b(E(n.value),{class:N(["VPButton",[o.size,o.theme]]),href:o.href?r(Y)(o.href):void 0,target:t.value?"_blank":void 0,rel:t.value?"noreferrer":void 0},{default:v(()=>[x(V(o.text),1)]),_:1},8,["class","href","target","rel"]))}});const Cs=m(Ns,[["__scopeId","data-v-1e76fe75"]]),Is=["src","alt"],Bs=g({inheritAttrs:!1,__name:"VPImage",props:{image:{},alt:{}},setup(s){return(e,t)=>{const n=R("VPImage",!0);return e.image?(a(),i(M,{key:0},[typeof e.image=="string"||"src"in e.image?(a(),i("img",X({key:0,class:"VPImage"},typeof e.image=="string"?e.$attrs:{...e.image,...e.$attrs},{src:r(ue)(typeof e.image=="string"?e.image:e.image.src),alt:e.alt??(typeof e.image=="string"?"":e.image.alt||"")}),null,16,Is)):(a(),i(M,{key:1},[h(n,X({class:"dark",image:e.image.dark,alt:e.image.alt},e.$attrs),null,16,["image","alt"]),h(n,X({class:"light",image:e.image.light,alt:e.image.alt},e.$attrs),null,16,["image","alt"])],64))],64)):f("",!0)}}});const ee=m(Bs,[["__scopeId","data-v-ab19afbb"]]),Ts=s=>(H("data-v-5a3e9999"),s=s(),z(),s),As={class:"container"},xs={class:"main"},Hs={key:0,class:"name"},zs=["innerHTML"],Ds=["innerHTML"],Fs=["innerHTML"],Es={key:0,class:"actions"},Os={key:0,class:"image"},Gs={class:"image-container"},Us=Ts(()=>c("div",{class:"image-bg"},null,-1)),Rs=g({__name:"VPHero",props:{name:{},text:{},tagline:{},image:{},actions:{}},setup(s){const e=ne("hero-image-slot-exists");return(t,n)=>(a(),i("div",{class:N(["VPHero",{"has-image":t.image||r(e)}])},[c("div",As,[c("div",xs,[u(t.$slots,"home-hero-info",{},()=>[t.name?(a(),i("h1",Hs,[c("span",{innerHTML:t.name,class:"clip"},null,8,zs)])):f("",!0),t.text?(a(),i("p",{key:1,innerHTML:t.text,class:"text"},null,8,Ds)):f("",!0),t.tagline?(a(),i("p",{key:2,innerHTML:t.tagline,class:"tagline"},null,8,Fs)):f("",!0)],!0),t.actions?(a(),i("div",Es,[(a(!0),i(M,null,A(t.actions,o=>(a(),i("div",{key:o.link,class:"action"},[h(Cs,{tag:"a",size:"medium",theme:o.theme,text:o.text,href:o.link},null,8,["theme","text","href"])]))),128))])):f("",!0)]),t.image||r(e)?(a(),i("div",Os,[c("div",Gs,[Us,u(t.$slots,"home-hero-image",{},()=>[t.image?(a(),b(ee,{key:0,class:"image-src",image:t.image},null,8,["image"])):f("",!0)],!0)])])):f("",!0)])],2))}});const js=m(Rs,[["__scopeId","data-v-5a3e9999"]]),qs=g({__name:"VPHomeHero",setup(s){const{frontmatter:e}=y();return(t,n)=>r(e).hero?(a(),b(js,{key:0,class:"VPHomeHero",name:r(e).hero.name,text:r(e).hero.text,tagline:r(e).hero.tagline,image:r(e).hero.image,actions:r(e).hero.actions},{"home-hero-info":v(()=>[u(t.$slots,"home-hero-info")]),"home-hero-image":v(()=>[u(t.$slots,"home-hero-image")]),_:3},8,["name","text","tagline","image","actions"])):f("",!0)}}),Ks={},Ws={xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24"},Ys=c("path",{d:"M19.9,12.4c0.1-0.2,0.1-0.5,0-0.8c-0.1-0.1-0.1-0.2-0.2-0.3l-7-7c-0.4-0.4-1-0.4-1.4,0s-0.4,1,0,1.4l5.3,5.3H5c-0.6,0-1,0.4-1,1s0.4,1,1,1h11.6l-5.3,5.3c-0.4,0.4-0.4,1,0,1.4c0.2,0.2,0.5,0.3,0.7,0.3s0.5-0.1,0.7-0.3l7-7C19.8,12.6,19.9,12.5,19.9,12.4z"},null,-1),Js=[Ys];function Qs(s,e){return a(),i("svg",Ws,Js)}const Xs=m(Ks,[["render",Qs]]),Zs={class:"box"},en={key:0,class:"icon"},tn=["innerHTML"],sn=["innerHTML"],nn=["innerHTML"],on={key:4,class:"link-text"},an={class:"link-text-value"},ln=g({__name:"VPFeature",props:{icon:{},title:{},details:{},link:{},linkText:{},rel:{},target:{}},setup(s){return(e,t)=>(a(),b(F,{class:"VPFeature",href:e.link,rel:e.rel,target:e.target,"no-icon":!0,tag:e.link?"a":"div"},{default:v(()=>[c("article",Zs,[typeof e.icon=="object"&&e.icon.wrap?(a(),i("div",en,[h(ee,{image:e.icon,alt:e.icon.alt,height:e.icon.height||48,width:e.icon.width||48},null,8,["image","alt","height","width"])])):typeof e.icon=="object"?(a(),b(ee,{key:1,image:e.icon,alt:e.icon.alt,height:e.icon.height||48,width:e.icon.width||48},null,8,["image","alt","height","width"])):e.icon?(a(),i("div",{key:2,class:"icon",innerHTML:e.icon},null,8,tn)):f("",!0),c("h2",{class:"title",innerHTML:e.title},null,8,sn),e.details?(a(),i("p",{key:3,class:"details",innerHTML:e.details},null,8,nn)):f("",!0),e.linkText?(a(),i("div",on,[c("p",an,[x(V(e.linkText)+" ",1),h(Xs,{class:"link-text-icon"})])])):f("",!0)])]),_:1},8,["href","rel","target","tag"]))}});const rn=m(ln,[["__scopeId","data-v-ee984185"]]),cn={key:0,class:"VPFeatures"},un={class:"container"},dn={class:"items"},_n=g({__name:"VPFeatures",props:{features:{}},setup(s){const e=s,t=k(()=>{const n=e.features.length;if(n){if(n===2)return"grid-2";if(n===3)return"grid-3";if(n%3===0)return"grid-6";if(n>3)return"grid-4"}else return});return(n,o)=>n.features?(a(),i("div",cn,[c("div",un,[c("div",dn,[(a(!0),i(M,null,A(n.features,l=>(a(),i("div",{key:l.title,class:N(["item",[t.value]])},[h(rn,{icon:l.icon,title:l.title,details:l.details,link:l.link,"link-text":l.linkText,rel:l.rel,target:l.target},null,8,["icon","title","details","link","link-text","rel","target"])],2))),128))])])])):f("",!0)}});const vn=m(_n,[["__scopeId","data-v-b1eea84a"]]),pn=g({__name:"VPHomeFeatures",setup(s){const{frontmatter:e}=y();return(t,n)=>r(e).features?(a(),b(vn,{key:0,class:"VPHomeFeatures",features:r(e).features},null,8,["features"])):f("",!0)}}),hn={class:"VPHome"},fn=g({__name:"VPHome",setup(s){return(e,t)=>{const n=R("Content");return a(),i("div",hn,[u(e.$slots,"home-hero-before",{},void 0,!0),h(qs,null,{"home-hero-info":v(()=>[u(e.$slots,"home-hero-info",{},void 0,!0)]),"home-hero-image":v(()=>[u(e.$slots,"home-hero-image",{},void 0,!0)]),_:3}),u(e.$slots,"home-hero-after",{},void 0,!0),u(e.$slots,"home-features-before",{},void 0,!0),h(pn),u(e.$slots,"home-features-after",{},void 0,!0),h(n)])}}});const mn=m(fn,[["__scopeId","data-v-20eabd3a"]]),gn={},bn={class:"VPPage"};function $n(s,e){const t=R("Content");return a(),i("div",bn,[u(s.$slots,"page-top"),h(t),u(s.$slots,"page-bottom")])}const kn=m(gn,[["render",$n]]),yn=g({__name:"VPContent",setup(s){const{page:e,frontmatter:t}=y(),{hasSidebar:n}=D();return(o,l)=>(a(),i("div",{class:N(["VPContent",{"has-sidebar":r(n),"is-home":r(t).layout==="home"}]),id:"VPContent"},[r(e).isNotFound?u(o.$slots,"not-found",{key:0},()=>[h(ct)],!0):r(t).layout==="page"?(a(),b(kn,{key:1},{"page-top":v(()=>[u(o.$slots,"page-top",{},void 0,!0)]),"page-bottom":v(()=>[u(o.$slots,"page-bottom",{},void 0,!0)]),_:3})):r(t).layout==="home"?(a(),b(mn,{key:2},{"home-hero-before":v(()=>[u(o.$slots,"home-hero-before",{},void 0,!0)]),"home-hero-info":v(()=>[u(o.$slots,"home-hero-info",{},void 0,!0)]),"home-hero-image":v(()=>[u(o.$slots,"home-hero-image",{},void 0,!0)]),"home-hero-after":v(()=>[u(o.$slots,"home-hero-after",{},void 0,!0)]),"home-features-before":v(()=>[u(o.$slots,"home-features-before",{},void 0,!0)]),"home-features-after":v(()=>[u(o.$slots,"home-features-after",{},void 0,!0)]),_:3})):r(t).layout&&r(t).layout!=="doc"?(a(),b(E(r(t).layout),{key:3})):(a(),b(Ms,{key:4},{"doc-top":v(()=>[u(o.$slots,"doc-top",{},void 0,!0)]),"doc-bottom":v(()=>[u(o.$slots,"doc-bottom",{},void 0,!0)]),"doc-footer-before":v(()=>[u(o.$slots,"doc-footer-before",{},void 0,!0)]),"doc-before":v(()=>[u(o.$slots,"doc-before",{},void 0,!0)]),"doc-after":v(()=>[u(o.$slots,"doc-after",{},void 0,!0)]),"aside-top":v(()=>[u(o.$slots,"aside-top",{},void 0,!0)]),"aside-outline-before":v(()=>[u(o.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":v(()=>[u(o.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":v(()=>[u(o.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":v(()=>[u(o.$slots,"aside-ads-after",{},void 0,!0)]),"aside-bottom":v(()=>[u(o.$slots,"aside-bottom",{},void 0,!0)]),_:3}))],2))}});const Pn=m(yn,[["__scopeId","data-v-3cf691b6"]]),Vn={class:"container"},wn=["innerHTML"],Ln=["innerHTML"],Sn=g({__name:"VPFooter",setup(s){const{theme:e,frontmatter:t}=y(),{hasSidebar:n}=D();return(o,l)=>r(e).footer&&r(t).footer!==!1?(a(),i("footer",{key:0,class:N(["VPFooter",{"has-sidebar":r(n)}])},[c("div",Vn,[r(e).footer.message?(a(),i("p",{key:0,class:"message",innerHTML:r(e).footer.message},null,8,wn)):f("",!0),r(e).footer.copyright?(a(),i("p",{key:1,class:"copyright",innerHTML:r(e).footer.copyright},null,8,Ln)):f("",!0)])],2)):f("",!0)}});const Mn=m(Sn,[["__scopeId","data-v-e4279f1c"]]),Nn={class:"header"},Cn={class:"outline"},In=g({__name:"VPLocalNavOutlineDropdown",props:{headers:{},navHeight:{}},setup(s){const e=s,{theme:t}=y(),n=S(!1),o=S(0),l=S();W(()=>{n.value=!1});function d(){n.value=!n.value,o.value=window.innerHeight+Math.min(window.scrollY-e.navHeight,0)}function p($){$.target.classList.contains("outline-link")&&(l.value&&(l.value.style.transition="none"),Ee(()=>{n.value=!1}))}function _(){n.value=!1,window.scrollTo({top:0,left:0,behavior:"smooth"})}return($,L)=>(a(),i("div",{class:"VPLocalNavOutlineDropdown",style:Fe({"--vp-vh":o.value+"px"})},[$.headers.length>0?(a(),i("button",{key:0,onClick:d,class:N({open:n.value})},[x(V(r(ve)(r(t)))+" ",1),h(fe,{class:"icon"})],2)):(a(),i("button",{key:1,onClick:_},V(r(t).returnToTopLabel||"Return to top"),1)),h(ce,{name:"flyout"},{default:v(()=>[n.value?(a(),i("div",{key:0,ref_key:"items",ref:l,class:"items",onClick:p},[c("div",Nn,[c("a",{class:"top-link",href:"#",onClick:_},V(r(t).returnToTopLabel||"Return to top"),1)]),c("div",Cn,[h(he,{headers:$.headers},null,8,["headers"])])],512)):f("",!0)]),_:1})],4))}});const Bn=m(In,[["__scopeId","data-v-24251f6f"]]),Tn={},An={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},xn=c("path",{d:"M17,11H3c-0.6,0-1-0.4-1-1s0.4-1,1-1h14c0.6,0,1,0.4,1,1S17.6,11,17,11z"},null,-1),Hn=c("path",{d:"M21,7H3C2.4,7,2,6.6,2,6s0.4-1,1-1h18c0.6,0,1,0.4,1,1S21.6,7,21,7z"},null,-1),zn=c("path",{d:"M21,15H3c-0.6,0-1-0.4-1-1s0.4-1,1-1h18c0.6,0,1,0.4,1,1S21.6,15,21,15z"},null,-1),Dn=c("path",{d:"M17,19H3c-0.6,0-1-0.4-1-1s0.4-1,1-1h14c0.6,0,1,0.4,1,1S17.6,19,17,19z"},null,-1),Fn=[xn,Hn,zn,Dn];function En(s,e){return a(),i("svg",An,Fn)}const On=m(Tn,[["render",En]]),Gn=["aria-expanded"],Un={class:"menu-text"},Rn=g({__name:"VPLocalNav",props:{open:{type:Boolean}},emits:["open-menu"],setup(s){const{theme:e,frontmatter:t}=y(),{hasSidebar:n}=D(),{y:o}=we(),l=_e([]),d=S(0);G(()=>{d.value=parseInt(getComputedStyle(document.documentElement).getPropertyValue("--vp-nav-height"))}),W(()=>{l.value=pe(t.value.outline??e.value.outline)});const p=k(()=>l.value.length===0&&!n.value),_=k(()=>({VPLocalNav:!0,fixed:p.value,"reached-top":o.value>=d.value}));return($,L)=>r(t).layout!=="home"&&(!p.value||r(o)>=d.value)?(a(),i("div",{key:0,class:N(_.value)},[r(n)?(a(),i("button",{key:0,class:"menu","aria-expanded":$.open,"aria-controls":"VPSidebarNav",onClick:L[0]||(L[0]=T=>$.$emit("open-menu"))},[h(On,{class:"menu-icon"}),c("span",Un,V(r(e).sidebarMenuLabel||"Menu"),1)],8,Gn)):f("",!0),h(Bn,{headers:l.value,navHeight:d.value},null,8,["headers","navHeight"])],2)):f("",!0)}});const jn=m(Rn,[["__scopeId","data-v-9e669cc1"]]);function qn(){const s=S(!1);function e(){s.value=!0,window.addEventListener("resize",o)}function t(){s.value=!1,window.removeEventListener("resize",o)}function n(){s.value?t():e()}function o(){window.outerWidth>=768&&t()}const l=se();return U(()=>l.path,t),{isScreenOpen:s,openScreen:e,closeScreen:t,toggleScreen:n}}const Kn={},Wn={class:"VPSwitch",type:"button",role:"switch"},Yn={class:"check"},Jn={key:0,class:"icon"};function Qn(s,e){return a(),i("button",Wn,[c("span",Yn,[s.$slots.default?(a(),i("span",Jn,[u(s.$slots,"default",{},void 0,!0)])):f("",!0)])])}const Xn=m(Kn,[["render",Qn],["__scopeId","data-v-1c29e291"]]),Zn={},eo={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},to=c("path",{d:"M12.1,22c-0.3,0-0.6,0-0.9,0c-5.5-0.5-9.5-5.4-9-10.9c0.4-4.8,4.2-8.6,9-9c0.4,0,0.8,0.2,1,0.5c0.2,0.3,0.2,0.8-0.1,1.1c-2,2.7-1.4,6.4,1.3,8.4c2.1,1.6,5,1.6,7.1,0c0.3-0.2,0.7-0.3,1.1-0.1c0.3,0.2,0.5,0.6,0.5,1c-0.2,2.7-1.5,5.1-3.6,6.8C16.6,21.2,14.4,22,12.1,22zM9.3,4.4c-2.9,1-5,3.6-5.2,6.8c-0.4,4.4,2.8,8.3,7.2,8.7c2.1,0.2,4.2-0.4,5.8-1.8c1.1-0.9,1.9-2.1,2.4-3.4c-2.5,0.9-5.3,0.5-7.5-1.1C9.2,11.4,8.1,7.7,9.3,4.4z"},null,-1),so=[to];function no(s,e){return a(),i("svg",eo,so)}const oo=m(Zn,[["render",no]]),ao={},lo={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},ro=Oe('',9),io=[ro];function co(s,e){return a(),i("svg",lo,io)}const uo=m(ao,[["render",co]]),_o=g({__name:"VPSwitchAppearance",setup(s){const{isDark:e}=y(),t=ne("toggle-appearance",()=>{e.value=!e.value});return(n,o)=>(a(),b(Xn,{title:"toggle dark mode",class:"VPSwitchAppearance","aria-checked":r(e),onClick:r(t)},{default:v(()=>[h(uo,{class:"sun"}),h(oo,{class:"moon"})]),_:1},8,["aria-checked","onClick"]))}});const me=m(_o,[["__scopeId","data-v-3329432d"]]),vo={key:0,class:"VPNavBarAppearance"},po=g({__name:"VPNavBarAppearance",setup(s){const{site:e}=y();return(t,n)=>r(e).appearance&&r(e).appearance!=="force-dark"?(a(),i("div",vo,[h(me)])):f("",!0)}});const ho=m(po,[["__scopeId","data-v-283b26e9"]]),ge=S();let Ce=!1,ae=0;function fo(s){const e=S(!1);if(j){!Ce&&mo(),ae++;const t=U(ge,n=>{var o,l,d;n===s.el.value||(o=s.el.value)!=null&&o.contains(n)?(e.value=!0,(l=s.onFocus)==null||l.call(s)):(e.value=!1,(d=s.onBlur)==null||d.call(s))});de(()=>{t(),ae--,ae||go()})}return Ge(e)}function mo(){document.addEventListener("focusin",Ie),Ce=!0,ge.value=document.activeElement}function go(){document.removeEventListener("focusin",Ie)}function Ie(){ge.value=document.activeElement}const bo={},$o={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},ko=c("path",{d:"M12,16c-0.3,0-0.5-0.1-0.7-0.3l-6-6c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l5.3,5.3l5.3-5.3c0.4-0.4,1-0.4,1.4,0s0.4,1,0,1.4l-6,6C12.5,15.9,12.3,16,12,16z"},null,-1),yo=[ko];function Po(s,e){return a(),i("svg",$o,yo)}const Be=m(bo,[["render",Po]]),Vo={},wo={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},Lo=c("circle",{cx:"12",cy:"12",r:"2"},null,-1),So=c("circle",{cx:"19",cy:"12",r:"2"},null,-1),Mo=c("circle",{cx:"5",cy:"12",r:"2"},null,-1),No=[Lo,So,Mo];function Co(s,e){return a(),i("svg",wo,No)}const Io=m(Vo,[["render",Co]]),Bo={class:"VPMenuLink"},To=g({__name:"VPMenuLink",props:{item:{}},setup(s){const{page:e}=y();return(t,n)=>(a(),i("div",Bo,[h(F,{class:N({active:r(O)(r(e).relativePath,t.item.activeMatch||t.item.link,!!t.item.activeMatch)}),href:t.item.link,target:t.item.target,rel:t.item.rel},{default:v(()=>[x(V(t.item.text),1)]),_:1},8,["class","href","target","rel"])]))}});const oe=m(To,[["__scopeId","data-v-f51f088d"]]),Ao={class:"VPMenuGroup"},xo={key:0,class:"title"},Ho=g({__name:"VPMenuGroup",props:{text:{},items:{}},setup(s){return(e,t)=>(a(),i("div",Ao,[e.text?(a(),i("p",xo,V(e.text),1)):f("",!0),(a(!0),i(M,null,A(e.items,n=>(a(),i(M,null,["link"in n?(a(),b(oe,{key:0,item:n},null,8,["item"])):f("",!0)],64))),256))]))}});const zo=m(Ho,[["__scopeId","data-v-a6b0397c"]]),Do={class:"VPMenu"},Fo={key:0,class:"items"},Eo=g({__name:"VPMenu",props:{items:{}},setup(s){return(e,t)=>(a(),i("div",Do,[e.items?(a(),i("div",Fo,[(a(!0),i(M,null,A(e.items,n=>(a(),i(M,{key:n.text},["link"in n?(a(),b(oe,{key:0,item:n},null,8,["item"])):(a(),b(zo,{key:1,text:n.text,items:n.items},null,8,["text","items"]))],64))),128))])):f("",!0),u(e.$slots,"default",{},void 0,!0)]))}});const Oo=m(Eo,[["__scopeId","data-v-e42ed9b3"]]),Go=["aria-expanded","aria-label"],Uo={key:0,class:"text"},Ro=["innerHTML"],jo={class:"menu"},qo=g({__name:"VPFlyout",props:{icon:{},button:{},label:{},items:{}},setup(s){const e=S(!1),t=S();fo({el:t,onBlur:n});function n(){e.value=!1}return(o,l)=>(a(),i("div",{class:"VPFlyout",ref_key:"el",ref:t,onMouseenter:l[1]||(l[1]=d=>e.value=!0),onMouseleave:l[2]||(l[2]=d=>e.value=!1)},[c("button",{type:"button",class:"button","aria-haspopup":"true","aria-expanded":e.value,"aria-label":o.label,onClick:l[0]||(l[0]=d=>e.value=!e.value)},[o.button||o.icon?(a(),i("span",Uo,[o.icon?(a(),b(E(o.icon),{key:0,class:"option-icon"})):f("",!0),o.button?(a(),i("span",{key:1,innerHTML:o.button},null,8,Ro)):f("",!0),h(Be,{class:"text-icon"})])):(a(),b(Io,{key:1,class:"icon"}))],8,Go),c("div",jo,[h(Oo,{items:o.items},{default:v(()=>[u(o.$slots,"default",{},void 0,!0)]),_:3},8,["items"])])],544))}});const be=m(qo,[["__scopeId","data-v-aa8de344"]]),Ko={discord:'Discord',facebook:'Facebook',github:'GitHub',instagram:'Instagram',linkedin:'LinkedIn',mastodon:'Mastodon',slack:'Slack',twitter:'Twitter',x:'X',youtube:'YouTube'},Wo=["href","aria-label","innerHTML"],Yo=g({__name:"VPSocialLink",props:{icon:{},link:{},ariaLabel:{}},setup(s){const e=s,t=k(()=>typeof e.icon=="object"?e.icon.svg:Ko[e.icon]);return(n,o)=>(a(),i("a",{class:"VPSocialLink no-icon",href:n.link,"aria-label":n.ariaLabel??(typeof n.icon=="string"?n.icon:""),target:"_blank",rel:"noopener",innerHTML:t.value},null,8,Wo))}});const Jo=m(Yo,[["__scopeId","data-v-16cf740a"]]),Qo={class:"VPSocialLinks"},Xo=g({__name:"VPSocialLinks",props:{links:{}},setup(s){return(e,t)=>(a(),i("div",Qo,[(a(!0),i(M,null,A(e.links,({link:n,icon:o,ariaLabel:l})=>(a(),b(Jo,{key:n,icon:o,link:n,ariaLabel:l},null,8,["icon","link","ariaLabel"]))),128))]))}});const $e=m(Xo,[["__scopeId","data-v-e71e869c"]]),Zo={key:0,class:"group translations"},ea={class:"trans-title"},ta={key:1,class:"group"},sa={class:"item appearance"},na={class:"label"},oa={class:"appearance-action"},aa={key:2,class:"group"},la={class:"item social-links"},ra=g({__name:"VPNavBarExtra",setup(s){const{site:e,theme:t}=y(),{localeLinks:n,currentLang:o}=J({correspondingLink:!0}),l=k(()=>n.value.length&&o.value.label||e.value.appearance||t.value.socialLinks);return(d,p)=>l.value?(a(),b(be,{key:0,class:"VPNavBarExtra",label:"extra navigation"},{default:v(()=>[r(n).length&&r(o).label?(a(),i("div",Zo,[c("p",ea,V(r(o).label),1),(a(!0),i(M,null,A(r(n),_=>(a(),b(oe,{key:_.link,item:_},null,8,["item"]))),128))])):f("",!0),r(e).appearance?(a(),i("div",ta,[c("div",sa,[c("p",na,V(r(t).darkModeSwitchLabel||"Appearance"),1),c("div",oa,[h(me)])])])):f("",!0),r(t).socialLinks?(a(),i("div",aa,[c("div",la,[h($e,{class:"social-links-list",links:r(t).socialLinks},null,8,["links"])])])):f("",!0)]),_:1})):f("",!0)}});const ia=m(ra,[["__scopeId","data-v-c8c2ae4b"]]),ca=s=>(H("data-v-6bee1efd"),s=s(),z(),s),ua=["aria-expanded"],da=ca(()=>c("span",{class:"container"},[c("span",{class:"top"}),c("span",{class:"middle"}),c("span",{class:"bottom"})],-1)),_a=[da],va=g({__name:"VPNavBarHamburger",props:{active:{type:Boolean}},emits:["click"],setup(s){return(e,t)=>(a(),i("button",{type:"button",class:N(["VPNavBarHamburger",{active:e.active}]),"aria-label":"mobile navigation","aria-expanded":e.active,"aria-controls":"VPNavScreen",onClick:t[0]||(t[0]=n=>e.$emit("click"))},_a,10,ua))}});const pa=m(va,[["__scopeId","data-v-6bee1efd"]]),ha=["innerHTML"],fa=g({__name:"VPNavBarMenuLink",props:{item:{}},setup(s){const{page:e}=y();return(t,n)=>(a(),b(F,{class:N({VPNavBarMenuLink:!0,active:r(O)(r(e).relativePath,t.item.activeMatch||t.item.link,!!t.item.activeMatch)}),href:t.item.link,target:t.item.target,rel:t.item.rel,tabindex:"0"},{default:v(()=>[c("span",{innerHTML:t.item.text},null,8,ha)]),_:1},8,["class","href","target","rel"]))}});const ma=m(fa,[["__scopeId","data-v-cb318fec"]]),ga=g({__name:"VPNavBarMenuGroup",props:{item:{}},setup(s){const e=s,{page:t}=y(),n=l=>"link"in l?O(t.value.relativePath,l.link,!!e.item.activeMatch):l.items.some(n),o=k(()=>n(e.item));return(l,d)=>(a(),b(be,{class:N({VPNavBarMenuGroup:!0,active:r(O)(r(t).relativePath,l.item.activeMatch,!!l.item.activeMatch)||o.value}),button:l.item.text,items:l.item.items},null,8,["class","button","items"]))}}),ba=s=>(H("data-v-f732b5d0"),s=s(),z(),s),$a={key:0,"aria-labelledby":"main-nav-aria-label",class:"VPNavBarMenu"},ka=ba(()=>c("span",{id:"main-nav-aria-label",class:"visually-hidden"},"Main Navigation",-1)),ya=g({__name:"VPNavBarMenu",setup(s){const{theme:e}=y();return(t,n)=>r(e).nav?(a(),i("nav",$a,[ka,(a(!0),i(M,null,A(r(e).nav,o=>(a(),i(M,{key:o.text},["link"in o?(a(),b(ma,{key:0,item:o},null,8,["item"])):(a(),b(ga,{key:1,item:o},null,8,["item"]))],64))),128))])):f("",!0)}});const Pa=m(ya,[["__scopeId","data-v-f732b5d0"]]);const Va={type:"button",class:"DocSearch DocSearch-Button","aria-label":"Search"},wa={class:"DocSearch-Button-Container"},La=c("svg",{class:"DocSearch-Search-Icon",width:"20",height:"20",viewBox:"0 0 20 20","aria-label":"search icon"},[c("path",{d:"M14.386 14.386l4.0877 4.0877-4.0877-4.0877c-2.9418 2.9419-7.7115 2.9419-10.6533 0-2.9419-2.9418-2.9419-7.7115 0-10.6533 2.9418-2.9419 7.7115-2.9419 10.6533 0 2.9419 2.9418 2.9419 7.7115 0 10.6533z",stroke:"currentColor",fill:"none","fill-rule":"evenodd","stroke-linecap":"round","stroke-linejoin":"round"})],-1),Sa={class:"DocSearch-Button-Placeholder"},Ma=c("span",{class:"DocSearch-Button-Keys"},[c("kbd",{class:"DocSearch-Button-Key"}),c("kbd",{class:"DocSearch-Button-Key"},"K")],-1),ye=g({__name:"VPNavBarSearchButton",props:{placeholder:{}},setup(s){return(e,t)=>(a(),i("button",Va,[c("span",wa,[La,c("span",Sa,V(e.placeholder),1)]),Ma]))}});const Na={class:"VPNavBarSearch"},Ca={id:"local-search"},Ia={key:1,id:"docsearch"},Ba=g({__name:"VPNavBarSearch",setup(s){const e=()=>null,t=()=>null,{theme:n,localeIndex:o}=y(),l=S(!1),d=S(!1),p=k(()=>{var w,B,I,P,q,Q,K;const C=((w=n.value.search)==null?void 0:w.options)??n.value.algolia;return((q=(P=(I=(B=C==null?void 0:C.locales)==null?void 0:B[o.value])==null?void 0:I.translations)==null?void 0:P.button)==null?void 0:q.buttonText)||((K=(Q=C==null?void 0:C.translations)==null?void 0:Q.button)==null?void 0:K.buttonText)||"Search"});G(()=>{});function _(){l.value||(l.value=!0,setTimeout($,16))}function $(){const C=new Event("keydown");C.key="k",C.metaKey=!0,window.dispatchEvent(C),setTimeout(()=>{document.querySelector(".DocSearch-Modal")||$()},16)}const L=S(!1),T="";return(C,w)=>{var B;return a(),i("div",Na,[r(T)==="local"?(a(),i(M,{key:0},[L.value?(a(),b(r(e),{key:0,placeholder:p.value,onClose:w[0]||(w[0]=I=>L.value=!1)},null,8,["placeholder"])):f("",!0),c("div",Ca,[h(ye,{placeholder:p.value,onClick:w[1]||(w[1]=I=>L.value=!0)},null,8,["placeholder"])])],64)):r(T)==="algolia"?(a(),i(M,{key:1},[l.value?(a(),b(r(t),{key:0,algolia:((B=r(n).search)==null?void 0:B.options)??r(n).algolia,onVnodeBeforeMount:w[2]||(w[2]=I=>d.value=!0)},null,8,["algolia"])):f("",!0),d.value?f("",!0):(a(),i("div",Ia,[h(ye,{placeholder:p.value,onClick:_},null,8,["placeholder"])]))],64)):f("",!0)])}}});const Ta=g({__name:"VPNavBarSocialLinks",setup(s){const{theme:e}=y();return(t,n)=>r(e).socialLinks?(a(),b($e,{key:0,class:"VPNavBarSocialLinks",links:r(e).socialLinks},null,8,["links"])):f("",!0)}});const Aa=m(Ta,[["__scopeId","data-v-ef6192dc"]]),xa=["href"],Ha=g({__name:"VPNavBarTitle",setup(s){const{site:e,theme:t}=y(),{hasSidebar:n}=D(),{currentLang:o}=J();return(l,d)=>(a(),i("div",{class:N(["VPNavBarTitle",{"has-sidebar":r(n)}])},[c("a",{class:"title",href:r(t).logoLink??r(Y)(r(o).link)},[u(l.$slots,"nav-bar-title-before",{},void 0,!0),r(t).logo?(a(),b(ee,{key:0,class:"logo",image:r(t).logo},null,8,["image"])):f("",!0),r(t).siteTitle?(a(),i(M,{key:1},[x(V(r(t).siteTitle),1)],64)):r(t).siteTitle===void 0?(a(),i(M,{key:2},[x(V(r(e).title),1)],64)):f("",!0),u(l.$slots,"nav-bar-title-after",{},void 0,!0)],8,xa)],2))}});const za=m(Ha,[["__scopeId","data-v-2973dbb4"]]),Da={},Fa={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},Ea=c("path",{d:"M0 0h24v24H0z",fill:"none"},null,-1),Oa=c("path",{d:" M12.87 15.07l-2.54-2.51.03-.03c1.74-1.94 2.98-4.17 3.71-6.53H17V4h-7V2H8v2H1v1.99h11.17C11.5 7.92 10.44 9.75 9 11.35 8.07 10.32 7.3 9.19 6.69 8h-2c.73 1.63 1.73 3.17 2.98 4.56l-5.09 5.02L4 19l5-5 3.11 3.11.76-2.04zM18.5 10h-2L12 22h2l1.12-3h4.75L21 22h2l-4.5-12zm-2.62 7l1.62-4.33L19.12 17h-3.24z ",class:"css-c4d79v"},null,-1),Ga=[Ea,Oa];function Ua(s,e){return a(),i("svg",Fa,Ga)}const Te=m(Da,[["render",Ua]]),Ra={class:"items"},ja={class:"title"},qa=g({__name:"VPNavBarTranslations",setup(s){const{theme:e}=y(),{localeLinks:t,currentLang:n}=J({correspondingLink:!0});return(o,l)=>r(t).length&&r(n).label?(a(),b(be,{key:0,class:"VPNavBarTranslations",icon:Te,label:r(e).langMenuLabel||"Change language"},{default:v(()=>[c("div",Ra,[c("p",ja,V(r(n).label),1),(a(!0),i(M,null,A(r(t),d=>(a(),b(oe,{key:d.link,item:d},null,8,["item"]))),128))])]),_:1},8,["label"])):f("",!0)}});const Ka=m(qa,[["__scopeId","data-v-ff4524ae"]]),Wa=s=>(H("data-v-f1abbc6e"),s=s(),z(),s),Ya={class:"container"},Ja={class:"title"},Qa={class:"content"},Xa=Wa(()=>c("div",{class:"curtain"},null,-1)),Za={class:"content-body"},el=g({__name:"VPNavBar",props:{isScreenOpen:{type:Boolean}},emits:["toggle-screen"],setup(s){const{y:e}=we(),{hasSidebar:t}=D(),{frontmatter:n}=y(),o=S({});return Pe(()=>{o.value={"has-sidebar":t.value,top:n.value.layout==="home"&&e.value===0}}),(l,d)=>(a(),i("div",{class:N(["VPNavBar",o.value])},[c("div",Ya,[c("div",Ja,[h(za,null,{"nav-bar-title-before":v(()=>[u(l.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":v(()=>[u(l.$slots,"nav-bar-title-after",{},void 0,!0)]),_:3})]),c("div",Qa,[Xa,c("div",Za,[u(l.$slots,"nav-bar-content-before",{},void 0,!0),h(Ba,{class:"search"}),h(Pa,{class:"menu"}),h(Ka,{class:"translations"}),h(ho,{class:"appearance"}),h(Aa,{class:"social-links"}),h(ia,{class:"extra"}),u(l.$slots,"nav-bar-content-after",{},void 0,!0),h(pa,{class:"hamburger",active:l.isScreenOpen,onClick:d[0]||(d[0]=p=>l.$emit("toggle-screen"))},null,8,["active"])])])])],2))}});const tl=m(el,[["__scopeId","data-v-f1abbc6e"]]),sl={key:0,class:"VPNavScreenAppearance"},nl={class:"text"},ol=g({__name:"VPNavScreenAppearance",setup(s){const{site:e,theme:t}=y();return(n,o)=>r(e).appearance?(a(),i("div",sl,[c("p",nl,V(r(t).darkModeSwitchLabel||"Appearance"),1),h(me)])):f("",!0)}});const al=m(ol,[["__scopeId","data-v-0dc5cf49"]]),ll=g({__name:"VPNavScreenMenuLink",props:{item:{}},setup(s){const e=ne("close-screen");return(t,n)=>(a(),b(F,{class:"VPNavScreenMenuLink",href:t.item.link,target:t.item.target,rel:t.item.rel,onClick:r(e)},{default:v(()=>[x(V(t.item.text),1)]),_:1},8,["href","target","rel","onClick"]))}});const rl=m(ll,[["__scopeId","data-v-fe523e3d"]]),il={},cl={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},ul=c("path",{d:"M18.9,10.9h-6v-6c0-0.6-0.4-1-1-1s-1,0.4-1,1v6h-6c-0.6,0-1,0.4-1,1s0.4,1,1,1h6v6c0,0.6,0.4,1,1,1s1-0.4,1-1v-6h6c0.6,0,1-0.4,1-1S19.5,10.9,18.9,10.9z"},null,-1),dl=[ul];function _l(s,e){return a(),i("svg",cl,dl)}const vl=m(il,[["render",_l]]),pl=g({__name:"VPNavScreenMenuGroupLink",props:{item:{}},setup(s){const e=ne("close-screen");return(t,n)=>(a(),b(F,{class:"VPNavScreenMenuGroupLink",href:t.item.link,target:t.item.target,rel:t.item.rel,onClick:r(e)},{default:v(()=>[x(V(t.item.text),1)]),_:1},8,["href","target","rel","onClick"]))}});const Ae=m(pl,[["__scopeId","data-v-aea78dd1"]]),hl={class:"VPNavScreenMenuGroupSection"},fl={key:0,class:"title"},ml=g({__name:"VPNavScreenMenuGroupSection",props:{text:{},items:{}},setup(s){return(e,t)=>(a(),i("div",hl,[e.text?(a(),i("p",fl,V(e.text),1)):f("",!0),(a(!0),i(M,null,A(e.items,n=>(a(),b(Ae,{key:n.text,item:n},null,8,["item"]))),128))]))}});const gl=m(ml,[["__scopeId","data-v-f60dbfa7"]]),bl=["aria-controls","aria-expanded"],$l={class:"button-text"},kl=["id"],yl={key:1,class:"group"},Pl=g({__name:"VPNavScreenMenuGroup",props:{text:{},items:{}},setup(s){const e=s,t=S(!1),n=k(()=>`NavScreenGroup-${e.text.replace(" ","-").toLowerCase()}`);function o(){t.value=!t.value}return(l,d)=>(a(),i("div",{class:N(["VPNavScreenMenuGroup",{open:t.value}])},[c("button",{class:"button","aria-controls":n.value,"aria-expanded":t.value,onClick:o},[c("span",$l,V(l.text),1),h(vl,{class:"button-icon"})],8,bl),c("div",{id:n.value,class:"items"},[(a(!0),i(M,null,A(l.items,p=>(a(),i(M,{key:p.text},["link"in p?(a(),i("div",{key:p.text,class:"item"},[h(Ae,{item:p},null,8,["item"])])):(a(),i("div",yl,[h(gl,{text:p.text,items:p.items},null,8,["text","items"])]))],64))),128))],8,kl)],2))}});const Vl=m(Pl,[["__scopeId","data-v-c2c554ed"]]),wl={key:0,class:"VPNavScreenMenu"},Ll=g({__name:"VPNavScreenMenu",setup(s){const{theme:e}=y();return(t,n)=>r(e).nav?(a(),i("nav",wl,[(a(!0),i(M,null,A(r(e).nav,o=>(a(),i(M,{key:o.text},["link"in o?(a(),b(rl,{key:0,item:o},null,8,["item"])):(a(),b(Vl,{key:1,text:o.text||"",items:o.items},null,8,["text","items"]))],64))),128))])):f("",!0)}}),Sl=g({__name:"VPNavScreenSocialLinks",setup(s){const{theme:e}=y();return(t,n)=>r(e).socialLinks?(a(),b($e,{key:0,class:"VPNavScreenSocialLinks",links:r(e).socialLinks},null,8,["links"])):f("",!0)}}),Ml={class:"list"},Nl=g({__name:"VPNavScreenTranslations",setup(s){const{localeLinks:e,currentLang:t}=J({correspondingLink:!0}),n=S(!1);function o(){n.value=!n.value}return(l,d)=>r(e).length&&r(t).label?(a(),i("div",{key:0,class:N(["VPNavScreenTranslations",{open:n.value}])},[c("button",{class:"title",onClick:o},[h(Te,{class:"icon lang"}),x(" "+V(r(t).label)+" ",1),h(Be,{class:"icon chevron"})]),c("ul",Ml,[(a(!0),i(M,null,A(r(e),p=>(a(),i("li",{key:p.link,class:"item"},[h(F,{class:"link",href:p.link},{default:v(()=>[x(V(p.text),1)]),_:2},1032,["href"])]))),128))])],2)):f("",!0)}});const Cl=m(Nl,[["__scopeId","data-v-41505286"]]),Il={class:"container"},Bl=g({__name:"VPNavScreen",props:{open:{type:Boolean}},setup(s){const e=S(null),t=Le(j?document.body:null);return(n,o)=>(a(),b(ce,{name:"fade",onEnter:o[0]||(o[0]=l=>t.value=!0),onAfterLeave:o[1]||(o[1]=l=>t.value=!1)},{default:v(()=>[n.open?(a(),i("div",{key:0,class:"VPNavScreen",ref_key:"screen",ref:e,id:"VPNavScreen"},[c("div",Il,[u(n.$slots,"nav-screen-content-before",{},void 0,!0),h(Ll,{class:"menu"}),h(Cl,{class:"translations"}),h(al,{class:"appearance"}),h(Sl,{class:"social-links"}),u(n.$slots,"nav-screen-content-after",{},void 0,!0)])],512)):f("",!0)]),_:3}))}});const Tl=m(Bl,[["__scopeId","data-v-57cce842"]]),Al={key:0,class:"VPNav"},xl=g({__name:"VPNav",setup(s){const{isScreenOpen:e,closeScreen:t,toggleScreen:n}=qn(),{frontmatter:o}=y(),l=k(()=>o.value.navbar!==!1);return Se("close-screen",t),te(()=>{j&&document.documentElement.classList.toggle("hide-nav",!l.value)}),(d,p)=>l.value?(a(),i("header",Al,[h(tl,{"is-screen-open":r(e),onToggleScreen:r(n)},{"nav-bar-title-before":v(()=>[u(d.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":v(()=>[u(d.$slots,"nav-bar-title-after",{},void 0,!0)]),"nav-bar-content-before":v(()=>[u(d.$slots,"nav-bar-content-before",{},void 0,!0)]),"nav-bar-content-after":v(()=>[u(d.$slots,"nav-bar-content-after",{},void 0,!0)]),_:3},8,["is-screen-open","onToggleScreen"]),h(Tl,{open:r(e)},{"nav-screen-content-before":v(()=>[u(d.$slots,"nav-screen-content-before",{},void 0,!0)]),"nav-screen-content-after":v(()=>[u(d.$slots,"nav-screen-content-after",{},void 0,!0)]),_:3},8,["open"])])):f("",!0)}});const Hl=m(xl,[["__scopeId","data-v-7ad780c2"]]),zl=s=>(H("data-v-bd01e0d5"),s=s(),z(),s),Dl=["role","tabindex"],Fl=zl(()=>c("div",{class:"indicator"},null,-1)),El=["onKeydown"],Ol={key:1,class:"items"},Gl=g({__name:"VPSidebarItem",props:{item:{},depth:{}},setup(s){const e=s,{collapsed:t,collapsible:n,isLink:o,isActiveLink:l,hasActiveLink:d,hasChildren:p,toggle:_}=vt(k(()=>e.item)),$=k(()=>p.value?"section":"div"),L=k(()=>o.value?"a":"div"),T=k(()=>p.value?e.depth+2===7?"p":`h${e.depth+2}`:"p"),C=k(()=>o.value?void 0:"button"),w=k(()=>[[`level-${e.depth}`],{collapsible:n.value},{collapsed:t.value},{"is-link":o.value},{"is-active":l.value},{"has-active":d.value}]);function B(P){"key"in P&&P.key!=="Enter"||!e.item.link&&_()}function I(){e.item.link&&_()}return(P,q)=>{const Q=R("VPSidebarItem",!0);return a(),b(E($.value),{class:N(["VPSidebarItem",w.value])},{default:v(()=>[P.item.text?(a(),i("div",X({key:0,class:"item",role:C.value},Ue(P.item.items?{click:B,keydown:B}:{},!0),{tabindex:P.item.items&&0}),[Fl,P.item.link?(a(),b(F,{key:0,tag:L.value,class:"link",href:P.item.link,rel:P.item.rel,target:P.item.target},{default:v(()=>[(a(),b(E(T.value),{class:"text",innerHTML:P.item.text},null,8,["innerHTML"]))]),_:1},8,["tag","href","rel","target"])):(a(),b(E(T.value),{key:1,class:"text",innerHTML:P.item.text},null,8,["innerHTML"])),P.item.collapsed!=null?(a(),i("div",{key:2,class:"caret",role:"button","aria-label":"toggle section",onClick:I,onKeydown:Re(I,["enter"]),tabindex:"0"},[h(fe,{class:"caret-icon"})],40,El)):f("",!0)],16,Dl)):f("",!0),P.item.items&&P.item.items.length?(a(),i("div",Ol,[P.depth<5?(a(!0),i(M,{key:0},A(P.item.items,K=>(a(),b(Q,{key:K.text,item:K,depth:P.depth+1},null,8,["item","depth"]))),128)):f("",!0)])):f("",!0)]),_:1},8,["class"])}}});const Ul=m(Gl,[["__scopeId","data-v-bd01e0d5"]]),xe=s=>(H("data-v-ee2efba5"),s=s(),z(),s),Rl=xe(()=>c("div",{class:"curtain"},null,-1)),jl={class:"nav",id:"VPSidebarNav","aria-labelledby":"sidebar-aria-label",tabindex:"-1"},ql=xe(()=>c("span",{class:"visually-hidden",id:"sidebar-aria-label"}," Sidebar Navigation ",-1)),Kl=g({__name:"VPSidebar",props:{open:{type:Boolean}},setup(s){const e=s,{sidebarGroups:t,hasSidebar:n}=D(),o=S(null),l=Le(j?document.body:null);return U([e,o],()=>{var d;e.open?(l.value=!0,(d=o.value)==null||d.focus()):l.value=!1},{immediate:!0,flush:"post"}),(d,p)=>r(n)?(a(),i("aside",{key:0,class:N(["VPSidebar",{open:d.open}]),ref_key:"navEl",ref:o,onClick:p[0]||(p[0]=je(()=>{},["stop"]))},[Rl,c("nav",jl,[ql,u(d.$slots,"sidebar-nav-before",{},void 0,!0),(a(!0),i(M,null,A(r(t),_=>(a(),i("div",{key:_.text,class:"group"},[h(Ul,{item:_,depth:0},null,8,["item"])]))),128)),u(d.$slots,"sidebar-nav-after",{},void 0,!0)])],2)):f("",!0)}});const Wl=m(Kl,[["__scopeId","data-v-ee2efba5"]]),Yl=g({__name:"VPSkipLink",setup(s){const e=se(),t=S();U(()=>e.path,()=>t.value.focus());function n({target:o}){const l=document.getElementById(decodeURIComponent(o.hash).slice(1));if(l){const d=()=>{l.removeAttribute("tabindex"),l.removeEventListener("blur",d)};l.setAttribute("tabindex","-1"),l.addEventListener("blur",d),l.focus(),window.scrollTo(0,0)}}return(o,l)=>(a(),i(M,null,[c("span",{ref_key:"backToTop",ref:t,tabindex:"-1"},null,512),c("a",{href:"#VPContent",class:"VPSkipLink visually-hidden",onClick:n}," Skip to content ")],64))}});const Jl=m(Yl,[["__scopeId","data-v-c8291ffa"]]),Ql=g({__name:"Layout",setup(s){const{isOpen:e,open:t,close:n}=D(),o=se();U(()=>o.path,n),_t(e,n);const{frontmatter:l}=y(),d=qe(),p=k(()=>!!d["home-hero-image"]);return Se("hero-image-slot-exists",p),(_,$)=>{const L=R("Content");return r(l).layout!==!1?(a(),i("div",{key:0,class:N(["Layout",r(l).pageClass])},[u(_.$slots,"layout-top",{},void 0,!0),h(Jl),h(Qe,{class:"backdrop",show:r(e),onClick:r(n)},null,8,["show","onClick"]),h(Hl,null,{"nav-bar-title-before":v(()=>[u(_.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":v(()=>[u(_.$slots,"nav-bar-title-after",{},void 0,!0)]),"nav-bar-content-before":v(()=>[u(_.$slots,"nav-bar-content-before",{},void 0,!0)]),"nav-bar-content-after":v(()=>[u(_.$slots,"nav-bar-content-after",{},void 0,!0)]),"nav-screen-content-before":v(()=>[u(_.$slots,"nav-screen-content-before",{},void 0,!0)]),"nav-screen-content-after":v(()=>[u(_.$slots,"nav-screen-content-after",{},void 0,!0)]),_:3}),h(jn,{open:r(e),onOpenMenu:r(t)},null,8,["open","onOpenMenu"]),h(Wl,{open:r(e)},{"sidebar-nav-before":v(()=>[u(_.$slots,"sidebar-nav-before",{},void 0,!0)]),"sidebar-nav-after":v(()=>[u(_.$slots,"sidebar-nav-after",{},void 0,!0)]),_:3},8,["open"]),h(Pn,null,{"page-top":v(()=>[u(_.$slots,"page-top",{},void 0,!0)]),"page-bottom":v(()=>[u(_.$slots,"page-bottom",{},void 0,!0)]),"not-found":v(()=>[u(_.$slots,"not-found",{},void 0,!0)]),"home-hero-before":v(()=>[u(_.$slots,"home-hero-before",{},void 0,!0)]),"home-hero-info":v(()=>[u(_.$slots,"home-hero-info",{},void 0,!0)]),"home-hero-image":v(()=>[u(_.$slots,"home-hero-image",{},void 0,!0)]),"home-hero-after":v(()=>[u(_.$slots,"home-hero-after",{},void 0,!0)]),"home-features-before":v(()=>[u(_.$slots,"home-features-before",{},void 0,!0)]),"home-features-after":v(()=>[u(_.$slots,"home-features-after",{},void 0,!0)]),"doc-footer-before":v(()=>[u(_.$slots,"doc-footer-before",{},void 0,!0)]),"doc-before":v(()=>[u(_.$slots,"doc-before",{},void 0,!0)]),"doc-after":v(()=>[u(_.$slots,"doc-after",{},void 0,!0)]),"doc-top":v(()=>[u(_.$slots,"doc-top",{},void 0,!0)]),"doc-bottom":v(()=>[u(_.$slots,"doc-bottom",{},void 0,!0)]),"aside-top":v(()=>[u(_.$slots,"aside-top",{},void 0,!0)]),"aside-bottom":v(()=>[u(_.$slots,"aside-bottom",{},void 0,!0)]),"aside-outline-before":v(()=>[u(_.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":v(()=>[u(_.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":v(()=>[u(_.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":v(()=>[u(_.$slots,"aside-ads-after",{},void 0,!0)]),_:3}),h(Mn),u(_.$slots,"layout-bottom",{},void 0,!0)],2)):(a(),b(L,{key:1}))}}});const Xl=m(Ql,[["__scopeId","data-v-9d8abc1e"]]);const er={Layout:Xl,enhanceApp:({app:s})=>{s.component("Badge",We)}};export{er as t}; diff --git a/assets/grafana-rte-architecture.d828668a.png b/assets/grafana-rte-architecture.paPX6MO5.png similarity index 100% rename from assets/grafana-rte-architecture.d828668a.png rename to assets/grafana-rte-architecture.paPX6MO5.png diff --git a/assets/grafana-rte-details.5a9be0f0.png b/assets/grafana-rte-details.OOc5BCVu.png similarity index 100% rename from assets/grafana-rte-details.5a9be0f0.png rename to assets/grafana-rte-details.OOc5BCVu.png diff --git a/assets/grafana-rte-overview.069b8c99.png b/assets/grafana-rte-overview.UOC7RY4V.png similarity index 100% rename from assets/grafana-rte-overview.069b8c99.png rename to assets/grafana-rte-overview.UOC7RY4V.png diff --git a/assets/guides_advanced-usage.md.817c3eb2.js b/assets/guides_advanced-usage.md.817c3eb2.js deleted file mode 100644 index 95a064f7..00000000 --- a/assets/guides_advanced-usage.md.817c3eb2.js +++ /dev/null @@ -1,207 +0,0 @@ -import{_ as a,C as o,o as l,c as p,H as e,Q as s}from"./chunks/framework.f7d371db.js";const F=JSON.parse('{"title":"Advanced usage","description":"","frontmatter":{"sidebarDepth":3},"headers":[],"relativePath":"guides/advanced-usage.md","filePath":"guides/advanced-usage.md"}'),t={name:"guides/advanced-usage.md"},c=s('

Advanced usage

Integrating Kano

To avoid the burden of developing a completely new application for every mapping needs you might have, Kano provides you with the capabilities to be integrated in your web application as an <iframe/> like this:

',3),r=s(`

This iframe offers an API so that you can dynamically control the behaviour and the content of Kano, as well as how the embedding application reacts in real-time to changes in Kano, a.k.a micro frontend. You can read more about the underlying concepts in this article.

The API is a subset of the internal Kano components and uses post-robot to

  1. select which is the target component
    • event name = map for 2D map and globe for 3D globe
  2. transform external method calls to internal calls using the following event payload
    • the command property is the mixin method name (e.g. isLayerVisible)
    • the args property is the expected method arguments (e.g. a string, an object or an array when multiple arguments are required)
  3. retrieve internal method call result externally
    • event response data is the method result object
  4. retrieve internal property externally
    • event response data is the returned property value

TIP

Event messaging using post-robot is always async because it relies on the postMessage API under-the-hood.

WARNING

In-memory data exchange is Json and more specifically GeoJson for map features. Do not try to inject functions or "complex" objects (e.g. class instances) in event payloads.

WARNING

You must use the same version of the post-robot library as the one used by Kano. For now, Kano relies on the 10.0.42 version of post-robot.

In addition to the events used to access mixin methods there are a couple of dedicated events:

  • kano-ready: to be listened by integrating application to know when the Kano application has been initialized in the iframe so that you can safely use the iframe API
  • api-ready: to be listened by integrating application to know when the Kano backend connection has been initialized in the iframe so that you can safely call the backend API
  • setLocalStorage: listened by Kano to set key/value pairs (provided as event data payload) in its local storage, typically useful to inject access tokens
  • setConfiguration: listened by Kano to set key/value pairs to override its configuration, typically useful to configure available components or actions
  • kano-login: to be listened by integrating application to know when the user has been authenticated in the Kano application
  • kano-logout: to be listened by integrating application to know when the user has been unauthenticated in the Kano application
  • map-ready: to be listened by integrating application to know when the 2D map component has been initialized in the Kano application so that you can safely use the underlying API
  • map-destroyed: to be listened by integrating application to know when the 2D map component has been destroyed in the Kano application before switching to another route
  • globe-ready: to be listened by integrating application to know when the 3D globe component has been initialized in the Kano application so that you can safely use the underlying API
  • globe-destroyed: to be listened by integrating application to know when the 3D globe component has been destroyed in the Kano application before switching to another route
  • layer-added: to be listened by integrating application to know whenever a new layer has been added to the 2D/3D map (from the internal catalog or externally)
  • layer-removed: to be listened by integrating application to know whenever a layer has been removed from the 2D/3D map
  • layer-shown: to be listened by integrating application to know whenever a layer has been shown in the 2D/3D map
  • layer-hidden: to be listened by integrating application to know whenever a new layer has been hidden in the 2D/3D map
  • click: to be listened by integrating application to know whenever a feature has been clicked on a layer in the 2D/3D map, will provide the feature and layer (descriptor) as data payload properties

WARNING

You should add a listener for each of the above events in your application, even if you don't need to do any processing, otherwise the post-robot library will raise a warning.

Here is a simple code sample:

html
  <script src="https://cdn.jsdelivr.net/npm/post-robot@10.0.10/dist/post-robot.min.js"></script>
-  <iframe id="kano" title="Kano" allow="geolocation *" style="width: 1024px; height: 768px;" src="kano.kalisio.com">
-	<script>
-	  var kano = document.getElementById('kano').contentWindow
-	  // Wait for Kano to be initialized
-	  postRobot.on('kano-ready', function() {
-	  	// Optionnaly overrides default setup of Kano
-	  	postRobot.send(kano, 'setConfiguration', { 'appName': 'xxx' })
-	  	.then(function() {
-		  // Optionnaly set a valid token to avoid authentication
-		  return postRobot.send(kano, 'setLocalStorage', { 'kano-jwt': 'xxx' })
-		})
-	  	.then(function() {
-		  // Show and zoom to a layer
-		  return postRobot.send(kano, 'map', { command: 'showLayer', args: 'Layer name' })
-		})
-		.then(function() {
-	      return postRobot.send(kano, 'map', { command: 'zoomToLayer', args: 'Layer name' })
-	    })
-		.then(function() {
-	      return postRobot.send(kano, 'map', { property: 'layers' })
-	    })
-		.then(function(result) {
-	      console.log('Layer list', result.data)
-	    })
-	  })
-	</script>
  <script src="https://cdn.jsdelivr.net/npm/post-robot@10.0.10/dist/post-robot.min.js"></script>
-  <iframe id="kano" title="Kano" allow="geolocation *" style="width: 1024px; height: 768px;" src="kano.kalisio.com">
-	<script>
-	  var kano = document.getElementById('kano').contentWindow
-	  // Wait for Kano to be initialized
-	  postRobot.on('kano-ready', function() {
-	  	// Optionnaly overrides default setup of Kano
-	  	postRobot.send(kano, 'setConfiguration', { 'appName': 'xxx' })
-	  	.then(function() {
-		  // Optionnaly set a valid token to avoid authentication
-		  return postRobot.send(kano, 'setLocalStorage', { 'kano-jwt': 'xxx' })
-		})
-	  	.then(function() {
-		  // Show and zoom to a layer
-		  return postRobot.send(kano, 'map', { command: 'showLayer', args: 'Layer name' })
-		})
-		.then(function() {
-	      return postRobot.send(kano, 'map', { command: 'zoomToLayer', args: 'Layer name' })
-	    })
-		.then(function() {
-	      return postRobot.send(kano, 'map', { property: 'layers' })
-	    })
-		.then(function(result) {
-	      console.log('Layer list', result.data)
-	    })
-	  })
-	</script>

A full sample exploring the different ways to interact with the API is provided here. When running the demo you can dynamically call API methods when toggling the different buttons on the left.

WARNING

Depending on the configuration of your Kano instance some features might not work as expected in the sample as it relies on some specific layers to exist.

Accessing the underlying API

You can access the backend API using either the Feathers client or raw HTTP REST requests. However, in order to ease integration you can also access the backend API through the iframe API. For this simply target the api component using post-robot, which transform external method calls to internal calls using the following event payload:

  • the service property is the target service name (e.g. catalog)
  • the operation property is the target service operation name (among get, find, update, patch, remove)
  • the args property is the expected service operation arguments

Event response data is the method result object. In addition to the event used to access service operations the api-ready event is to be listened by integrating application to know when the Kano backend API has been initialized in the iframe so that you can safely use it.

Here is a simple code sample:

html
  <script src="https://cdn.jsdelivr.net/npm/post-robot@10.0.10/dist/post-robot.min.js"></script>
-  <iframe id="kano" title="Kano" allow="geolocation *" style="width: 1024px; height: 768px;" src="kano.kalisio.com">
-  <script>
-    var kano = document.getElementById('kano').contentWindow
-    // Wait for map to be initialized
-    postRobot.on('map-ready', () => {
-      // Request saved user contexts and activate the first one if any
-      postRobot.send(kano, 'api', { service: 'catalog', operation: 'find', args: [{ query: { type: 'Context' } }] })
-      .then((result) => {
-        const response = result.data
-        if (response.total > 0) postRobot.send(kano, 'map', { command: 'loadContext', args: response.data[0] })
-      })
-    })
-  </script>
  <script src="https://cdn.jsdelivr.net/npm/post-robot@10.0.10/dist/post-robot.min.js"></script>
-  <iframe id="kano" title="Kano" allow="geolocation *" style="width: 1024px; height: 768px;" src="kano.kalisio.com">
-  <script>
-    var kano = document.getElementById('kano').contentWindow
-    // Wait for map to be initialized
-    postRobot.on('map-ready', () => {
-      // Request saved user contexts and activate the first one if any
-      postRobot.send(kano, 'api', { service: 'catalog', operation: 'find', args: [{ query: { type: 'Context' } }] })
-      .then((result) => {
-        const response = result.data
-        if (response.total > 0) postRobot.send(kano, 'map', { command: 'loadContext', args: response.data[0] })
-      })
-    })
-  </script>

Developing in Kano

Kano is powered by the KDK and rely on its main abstractions. If you'd like to develop an application based on Kano or extend Kano we assume you are familiar with this technology. Indeed, Kano is based on the KDK and makes the best use of all the features offered by the provided cartographic components and services.

Add components

The most simple way to develop in Kano is to design and integrate your own components in the 2D or 3D activity. For this you simply have to

  1. Put you single-file component(s) in the src/components folder (e.g. MyComponent.vue)
  2. Update the configuration to declare your component(s) in the 2D/3D activity by adding a local.js in the config folder like this:
js
module.exports = {
-  mapActivity: { // Can also be globeActivity
-    page: {
-      content: [{
-        id: 'my-component',
-        component: 'layout/KPageSticky', position: 'left', offset: [18, 0], content: [{ component: 'MyComponent' }]
-      }]
-    }
-  }
-}
module.exports = {
-  mapActivity: { // Can also be globeActivity
-    page: {
-      content: [{
-        id: 'my-component',
-        component: 'layout/KPageSticky', position: 'left', offset: [18, 0], content: [{ component: 'MyComponent' }]
-      }]
-    }
-  }
-}

Then build/run the application as usual.

The component file should look e.g. like this:

html
<template>
-  <div>
-    <q-dialog ref="myDialog">
-    </q-dialog>
-    <q-btn round color="primary" icon="edit_location" @click="showDialog">
-    </q-btn>
-  </div>
-</template>
-
-<script>
-export default {
-  name: 'my-component',
-  inject: ['kMap'],
-  data () {
-    return {
-      ...
-  },
-  methods: {
-    async showDialog () {
-      this.$refs.myDialog.show()
-    },
-    onTimeChanged () {
-      ...
-    }
-  },
-  async mounted () {
-    // To be aware of time change
-    this.kMap.$on('current-time-changed', this.onTimeChanged)
-    ...
-  },
-  beforeUnmount () {
-    this.kMap.$off('current-time-changed', this.onTimeChanged)
-  }
-}
-</script>
-// Required translations in JSON format
-<i18n>
-{ 
-  "fr": {
-      ...
-    }
-  },
-  "en": {
-      ...
-    }
-  }
-}
-</i18n>
<template>
-  <div>
-    <q-dialog ref="myDialog">
-    </q-dialog>
-    <q-btn round color="primary" icon="edit_location" @click="showDialog">
-    </q-btn>
-  </div>
-</template>
-
-<script>
-export default {
-  name: 'my-component',
-  inject: ['kMap'],
-  data () {
-    return {
-      ...
-  },
-  methods: {
-    async showDialog () {
-      this.$refs.myDialog.show()
-    },
-    onTimeChanged () {
-      ...
-    }
-  },
-  async mounted () {
-    // To be aware of time change
-    this.kMap.$on('current-time-changed', this.onTimeChanged)
-    ...
-  },
-  beforeUnmount () {
-    this.kMap.$off('current-time-changed', this.onTimeChanged)
-  }
-}
-</script>
-// Required translations in JSON format
-<i18n>
-{ 
-  "fr": {
-      ...
-    }
-  },
-  "en": {
-      ...
-    }
-  }
-}
-</i18n>

It's also possible to create separated i18n files if you'd like, simply put your plugin_en.json, plugin_fr.json, etc. files in the src/i18n folder before building the app.

Add custom code

You can update the plugin.js entry point in the boot folder in order to insert your own features (functions, mixins, etc.). If you'd like to enhance the default activities provided by kano you can register your own mixins in this file by using the mixin store:

import { MixinStore } from '../mixin-store'
-import myMixin from '../my-mixin.js'
-
-MixinStore.set('my-mixin', myMixin)
import { MixinStore } from '../mixin-store'
-import myMixin from '../my-mixin.js'
-
-MixinStore.set('my-mixin', myMixin)

Then add it to the configuration of the target activity in order to make Kano apply it automatically:

js
module.exports = {
-  mapActivity: { // Can also be globeActivity
-    additionalMixins: [ 'my-mixin' ],
-    ...
-  }
-}
module.exports = {
-  mapActivity: { // Can also be globeActivity
-    additionalMixins: [ 'my-mixin' ],
-    ...
-  }
-}
`,34);function i(E,y,d,h,u,g){const n=o("maps");return l(),p("div",null,[c,e(n,{token:"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJkZXYua2FsaXNpby54eXoiLCJpc3MiOiJrYWxpc2lvIn0.CGvJwPPkuiFvNzo3zUBb-_vwD0CKbUfm7w7TkCY-Ts4"}),r])}const b=a(t,[["render",i]]);export{F as __pageData,b as default}; diff --git a/assets/guides_advanced-usage.md.817c3eb2.lean.js b/assets/guides_advanced-usage.md.817c3eb2.lean.js deleted file mode 100644 index e6aecc98..00000000 --- a/assets/guides_advanced-usage.md.817c3eb2.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as a,C as o,o as l,c as p,H as e,Q as s}from"./chunks/framework.f7d371db.js";const F=JSON.parse('{"title":"Advanced usage","description":"","frontmatter":{"sidebarDepth":3},"headers":[],"relativePath":"guides/advanced-usage.md","filePath":"guides/advanced-usage.md"}'),t={name:"guides/advanced-usage.md"},c=s("",3),r=s("",34);function i(E,y,d,h,u,g){const n=o("maps");return l(),p("div",null,[c,e(n,{token:"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJkZXYua2FsaXNpby54eXoiLCJpc3MiOiJrYWxpc2lvIn0.CGvJwPPkuiFvNzo3zUBb-_vwD0CKbUfm7w7TkCY-Ts4"}),r])}const b=a(t,[["render",i]]);export{F as __pageData,b as default}; diff --git a/assets/guides_advanced-usage.md.cY9DewtT.js b/assets/guides_advanced-usage.md.cY9DewtT.js new file mode 100644 index 00000000..4a3877c3 --- /dev/null +++ b/assets/guides_advanced-usage.md.cY9DewtT.js @@ -0,0 +1,104 @@ +import{_ as a,c as n,J as t,V as s,E as e,o as l}from"./chunks/framework.J61Sinzt.js";const u=JSON.parse('{"title":"Advanced usage","description":"","frontmatter":{"sidebarDepth":3},"headers":[],"relativePath":"guides/advanced-usage.md","filePath":"guides/advanced-usage.md"}'),h={name:"guides/advanced-usage.md"},p=s('

Advanced usage

Integrating Kano

To avoid the burden of developing a completely new application for every mapping needs you might have, Kano provides you with the capabilities to be integrated in your web application as an <iframe/> like this:

',3),k=s(`

This iframe offers an API so that you can dynamically control the behaviour and the content of Kano, as well as how the embedding application reacts in real-time to changes in Kano, a.k.a micro frontend. You can read more about the underlying concepts in this article.

The API is a subset of the internal Kano components and uses post-robot to

  1. select which is the target component
    • event name = map for 2D map and globe for 3D globe
  2. transform external method calls to internal calls using the following event payload
    • the command property is the mixin method name (e.g. isLayerVisible)
    • the args property is the expected method arguments (e.g. a string, an object or an array when multiple arguments are required)
  3. retrieve internal method call result externally
    • event response data is the method result object
  4. retrieve internal property externally
    • event response data is the returned property value

TIP

Event messaging using post-robot is always async because it relies on the postMessage API under-the-hood.

WARNING

In-memory data exchange is Json and more specifically GeoJson for map features. Do not try to inject functions or "complex" objects (e.g. class instances) in event payloads.

WARNING

You must use the same version of the post-robot library as the one used by Kano. For now, Kano relies on the 10.0.42 version of post-robot.

In addition to the events used to access mixin methods there are a couple of dedicated events:

  • kano-ready: to be listened by integrating application to know when the Kano application has been initialized in the iframe so that you can safely use the iframe API
  • api-ready: to be listened by integrating application to know when the Kano backend connection has been initialized in the iframe so that you can safely call the backend API
  • setLocalStorage: listened by Kano to set key/value pairs (provided as event data payload) in its local storage, typically useful to inject access tokens
  • setConfiguration: listened by Kano to set key/value pairs to override its configuration, typically useful to configure available components or actions
  • kano-login: to be listened by integrating application to know when the user has been authenticated in the Kano application
  • kano-logout: to be listened by integrating application to know when the user has been unauthenticated in the Kano application
  • map-ready: to be listened by integrating application to know when the 2D map component has been initialized in the Kano application so that you can safely use the underlying API
  • map-destroyed: to be listened by integrating application to know when the 2D map component has been destroyed in the Kano application before switching to another route
  • globe-ready: to be listened by integrating application to know when the 3D globe component has been initialized in the Kano application so that you can safely use the underlying API
  • globe-destroyed: to be listened by integrating application to know when the 3D globe component has been destroyed in the Kano application before switching to another route
  • layer-added: to be listened by integrating application to know whenever a new layer has been added to the 2D/3D map (from the internal catalog or externally)
  • layer-removed: to be listened by integrating application to know whenever a layer has been removed from the 2D/3D map
  • layer-shown: to be listened by integrating application to know whenever a layer has been shown in the 2D/3D map
  • layer-hidden: to be listened by integrating application to know whenever a new layer has been hidden in the 2D/3D map
  • click: to be listened by integrating application to know whenever a feature has been clicked on a layer in the 2D/3D map, will provide the feature and layer (descriptor) as data payload properties

WARNING

You should add a listener for each of the above events in your application, even if you don't need to do any processing, otherwise the post-robot library will raise a warning.

Here is a simple code sample:

html
  <script src="https://cdn.jsdelivr.net/npm/post-robot@10.0.10/dist/post-robot.min.js"></script>
+  <iframe id="kano" title="Kano" allow="geolocation *" style="width: 1024px; height: 768px;" src="kano.kalisio.com">
+	<script>
+	  var kano = document.getElementById('kano').contentWindow
+	  // Wait for Kano to be initialized
+	  postRobot.on('kano-ready', function() {
+	  	// Optionnaly overrides default setup of Kano
+	  	postRobot.send(kano, 'setConfiguration', { 'appName': 'xxx' })
+	  	.then(function() {
+		  // Optionnaly set a valid token to avoid authentication
+		  return postRobot.send(kano, 'setLocalStorage', { 'kano-jwt': 'xxx' })
+		})
+	  	.then(function() {
+		  // Show and zoom to a layer
+		  return postRobot.send(kano, 'map', { command: 'showLayer', args: 'Layer name' })
+		})
+		.then(function() {
+	      return postRobot.send(kano, 'map', { command: 'zoomToLayer', args: 'Layer name' })
+	    })
+		.then(function() {
+	      return postRobot.send(kano, 'map', { property: 'layers' })
+	    })
+		.then(function(result) {
+	      console.log('Layer list', result.data)
+	    })
+	  })
+	</script>

A full sample exploring the different ways to interact with the API is provided here. When running the demo you can dynamically call API methods when toggling the different buttons on the left.

WARNING

Depending on the configuration of your Kano instance some features might not work as expected in the sample as it relies on some specific layers to exist.

Accessing the underlying API

You can access the backend API using either the Feathers client or raw HTTP REST requests. However, in order to ease integration you can also access the backend API through the iframe API. For this simply target the api component using post-robot, which transform external method calls to internal calls using the following event payload:

  • the service property is the target service name (e.g. catalog)
  • the operation property is the target service operation name (among get, find, update, patch, remove)
  • the args property is the expected service operation arguments

Event response data is the method result object. In addition to the event used to access service operations the api-ready event is to be listened by integrating application to know when the Kano backend API has been initialized in the iframe so that you can safely use it.

Here is a simple code sample:

html
  <script src="https://cdn.jsdelivr.net/npm/post-robot@10.0.10/dist/post-robot.min.js"></script>
+  <iframe id="kano" title="Kano" allow="geolocation *" style="width: 1024px; height: 768px;" src="kano.kalisio.com">
+  <script>
+    var kano = document.getElementById('kano').contentWindow
+    // Wait for map to be initialized
+    postRobot.on('map-ready', () => {
+      // Request saved user contexts and activate the first one if any
+      postRobot.send(kano, 'api', { service: 'catalog', operation: 'find', args: [{ query: { type: 'Context' } }] })
+      .then((result) => {
+        const response = result.data
+        if (response.total > 0) postRobot.send(kano, 'map', { command: 'loadContext', args: response.data[0] })
+      })
+    })
+  </script>

Developing in Kano

Kano is powered by the KDK and rely on its main abstractions. If you'd like to develop an application based on Kano or extend Kano we assume you are familiar with this technology. Indeed, Kano is based on the KDK and makes the best use of all the features offered by the provided cartographic components and services.

Add components

The most simple way to develop in Kano is to design and integrate your own components in the 2D or 3D activity. For this you simply have to

  1. Put you single-file component(s) in the src/components folder (e.g. MyComponent.vue)
  2. Update the configuration to declare your component(s) in the 2D/3D activity by adding a local.js in the config folder like this:
js
module.exports = {
+  mapActivity: { // Can also be globeActivity
+    page: {
+      content: [{
+        id: 'my-component',
+        component: 'layout/KPageSticky', position: 'left', offset: [18, 0], content: [{ component: 'MyComponent' }]
+      }]
+    }
+  }
+}

Then build/run the application as usual.

The component file should look e.g. like this:

html
<template>
+  <div>
+    <q-dialog ref="myDialog">
+    </q-dialog>
+    <q-btn round color="primary" icon="edit_location" @click="showDialog">
+    </q-btn>
+  </div>
+</template>
+
+<script>
+export default {
+  name: 'my-component',
+  inject: ['kMap'],
+  data () {
+    return {
+      ...
+  },
+  methods: {
+    async showDialog () {
+      this.$refs.myDialog.show()
+    },
+    onTimeChanged () {
+      ...
+    }
+  },
+  async mounted () {
+    // To be aware of time change
+    this.kMap.$on('current-time-changed', this.onTimeChanged)
+    ...
+  },
+  beforeUnmount () {
+    this.kMap.$off('current-time-changed', this.onTimeChanged)
+  }
+}
+</script>
+// Required translations in JSON format
+<i18n>
+{ 
+  "fr": {
+      ...
+    }
+  },
+  "en": {
+      ...
+    }
+  }
+}
+</i18n>

It's also possible to create separated i18n files if you'd like, simply put your plugin_en.json, plugin_fr.json, etc. files in the src/i18n folder before building the app.

Add custom code

You can update the plugin.js entry point in the boot folder in order to insert your own features (functions, mixins, etc.). If you'd like to enhance the default activities provided by kano you can register your own mixins in this file by using the mixin store:

import { MixinStore } from '../mixin-store'
+import myMixin from '../my-mixin.js'
+
+MixinStore.set('my-mixin', myMixin)

Then add it to the configuration of the target activity in order to make Kano apply it automatically:

js
module.exports = {
+  mapActivity: { // Can also be globeActivity
+    additionalMixins: [ 'my-mixin' ],
+    ...
+  }
+}
`,34);function o(r,E,d,g,c,y){const i=e("Maps");return l(),n("div",null,[p,t(i,{token:"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJkZXYua2FsaXNpby54eXoiLCJpc3MiOiJrYWxpc2lvIn0.CGvJwPPkuiFvNzo3zUBb-_vwD0CKbUfm7w7TkCY-Ts4"}),k])}const m=a(h,[["render",o]]);export{u as __pageData,m as default}; diff --git a/assets/guides_advanced-usage.md.cY9DewtT.lean.js b/assets/guides_advanced-usage.md.cY9DewtT.lean.js new file mode 100644 index 00000000..c9087ecc --- /dev/null +++ b/assets/guides_advanced-usage.md.cY9DewtT.lean.js @@ -0,0 +1 @@ +import{_ as a,c as n,J as t,V as s,E as e,o as l}from"./chunks/framework.J61Sinzt.js";const u=JSON.parse('{"title":"Advanced usage","description":"","frontmatter":{"sidebarDepth":3},"headers":[],"relativePath":"guides/advanced-usage.md","filePath":"guides/advanced-usage.md"}'),h={name:"guides/advanced-usage.md"},p=s("",3),k=s("",34);function o(r,E,d,g,c,y){const i=e("Maps");return l(),n("div",null,[p,t(i,{token:"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJkZXYua2FsaXNpby54eXoiLCJpc3MiOiJrYWxpc2lvIn0.CGvJwPPkuiFvNzo3zUBb-_vwD0CKbUfm7w7TkCY-Ts4"}),k])}const m=a(h,[["render",o]]);export{u as __pageData,m as default}; diff --git a/assets/guides_customizing-kano.md.8bb2652f.js b/assets/guides_customizing-kano.md.8bb2652f.js deleted file mode 100644 index 54cfb08a..00000000 --- a/assets/guides_customizing-kano.md.8bb2652f.js +++ /dev/null @@ -1,991 +0,0 @@ -import{_ as s,o as n,c as a,Q as e}from"./chunks/framework.f7d371db.js";const l="/kano/assets/kano-ogc-layers.1f5edae4.png",p="/kano/assets/kano-file-layers.0888f7b0.png",o="/kano/assets/kano-covid-19-layers.42f5160d.png",t="/kano/assets/kano-covid-19-layers-3D.99d091d6.png",c="/kano/assets/kano-sensors-layers.6878ff2a.png",O=JSON.parse('{"title":"Customizing Kano","description":"","frontmatter":{"sidebarDepth":3},"headers":[],"relativePath":"guides/customizing-kano.md","filePath":"guides/customizing-kano.md"}'),r={name:"guides/customizing-kano.md"},i=e(`

Customizing Kano

This section details different approaches to integrate your own data to your Kano instance. Although you can directly use the Kano UI to add your own data layers this section provide details to do this by configuration or programmatically. When added through the UI, the different layers will be visible in the My data tab of the catalog panel, while the default built-in layers will appear in the Catalog tab of the catalog panel. You can also manage the categories (i.e. catalog sections) hosting the layers from the UI or the configuration.

Although names and descriptions can be hard-coded in the target user language, Kano supports internationalization through a nested structure organized by locale like this:

js
{
-	name: 'Categories.POPULATION_LAYERS',
-  i18n: {
-    fr: { Categories: { POPULATION_LAYERS: 'Population' } },
-    en: { Categories: { POPULATION_LAYERS: 'Population' } },
-    ...
-  }
-}
{
-	name: 'Categories.POPULATION_LAYERS',
-  i18n: {
-    fr: { Categories: { POPULATION_LAYERS: 'Population' } },
-    en: { Categories: { POPULATION_LAYERS: 'Population' } },
-    ...
-  }
-}

Note that the name property is used a unique identifier for categories and layers

Customizing the catalog

You can add your own categories in the catalog by defining it in additional files to be put in the kano/api/config/categories directory. Kano will glob all files within this directory and add categories accordingly, only matching by name those in the CATEGORIES_FILTER (comma-separated list of category names) environment variable, if any. Categories are simple objects with a name, a description and an icon from a standard icon set among Material Icons, Font Awesome, or Line Awesome.

my-categories.cjs - Used to define additional categories.
cjs
module.exports = [{
-  name: 'Categories.OSM_LAYERS',
-  i18n: {
-    fr: {
-      Categories: {
-        OSM_LAYERS: 'OpenStreetMap'
-      }
-    },
-    en: {
-      Categories: {
-        OSM_LAYERS: 'OpenStreetMap'
-      }
-    }
-  },
-  icon: 'las la-map',
-  options: { exclusive: true, filter: { type: 'BaseLayer', tags: { $in: ['osm'] } } }
-}, {
-  name: 'Categories.POPULATION_LAYERS',
-  i18n: {
-    fr: {
-      Categories: {
-        POPULATION_LAYERS: 'Population'
-      }
-    },
-    en: {
-      Categories: {
-        POPULATION_LAYERS: 'Population'
-      }
-    }
-  },
-  icon: 'las la-users',
-  options: { exclusive: false, filter: { type: 'OverlayLayer', tags: { $in: ['population'] } } }
-}]
module.exports = [{
-  name: 'Categories.OSM_LAYERS',
-  i18n: {
-    fr: {
-      Categories: {
-        OSM_LAYERS: 'OpenStreetMap'
-      }
-    },
-    en: {
-      Categories: {
-        OSM_LAYERS: 'OpenStreetMap'
-      }
-    }
-  },
-  icon: 'las la-map',
-  options: { exclusive: true, filter: { type: 'BaseLayer', tags: { $in: ['osm'] } } }
-}, {
-  name: 'Categories.POPULATION_LAYERS',
-  i18n: {
-    fr: {
-      Categories: {
-        POPULATION_LAYERS: 'Population'
-      }
-    },
-    en: {
-      Categories: {
-        POPULATION_LAYERS: 'Population'
-      }
-    }
-  },
-  icon: 'las la-users',
-  options: { exclusive: false, filter: { type: 'OverlayLayer', tags: { $in: ['population'] } } }
-}]

Layers that will be added in a given category depends on the filter property content, which defines a sift filter applied to the layers list. Although any filter can be used, a tags property containing an array of relevent tags is often used by convention.

Customizing the catalog data

You can add your own layers in the catalog by defining it in additional files to be put in the kano/api/config/layers directory. Kano will glob all files within this directory and add layers accordingly, only matching by name those in the LAYERS_FILTER (comma-separated list of layer names) environment variable by default (set it to * to remove filtering). Layers are simple objects with a name, a description, a type, an attribution, and additional configuration options related to the underlying mapping engine: Leaflet for 2D rendering and Cesium for 3D rendering. More details about these options can be found in the documentation of the KDK powering Kano.

Please refer to the built-in kano/api/config/layers directory for various examples of what is possible to do with Kano.

We will start with a really simple example by adding two different map backgrounds based on OpenStreetMap data to your Kano instance. First ensure you copied the categories and layers files in their respective directories in kano/api/config. Then, set CATEGORIES_FILTER="OSM_LAYERS POPULATION_LAYERS" and LAYERS_FILTER="OSM OSM_CYCLE" in your environment. Last, launch Kano to make the layers appear in your custom catalog.

osm-layers.cjs - Used to define base layers with OpenStreetMap data.
cjs
module.exports = [{
-  name: 'Layers.OSM',
-  description: 'Layers.OSM_DESCRIPTION',
-  i18n: {
-    fr: {
-      Layers: {
-        OSM: 'OpenStreeMap',
-        OSM_DESCRIPTION: 'Données OpenStreetMap'
-      }
-    },
-    en: {
-      Layers: {
-        OSM: 'OpenStreeMap',
-        OSM_DESCRIPTION: 'OpenStreeMap data'
-      }
-    }
-  },
-  tags: ['osm'],
-  attribution: 'OpenStreetMap © <a href="http://openstreetmap.org">OpenStreetMap</a> contributors',
-  type: 'BaseLayer',
-  leaflet: {
-    type: 'tileLayer',
-    isVisible: true,
-    source: 'http://{s}.tile.osm.org/{z}/{x}/{y}.png',
-    maxZoom: 21,
-    maxNativeZoom: 18
-  },
-  cesium: {
-    type: 'OpenStreetMap',
-    isVisible: true,
-    url: \`http://a.tile.osm.org\`
-  }
-}, {
-  name: 'Layers.OSM_CYCLE',
-  description: 'Layers.OSM_CYCLE_DESCRIPTION',
-  i18n: {
-    fr: {
-      Layers: {
-        OSM_CYCLE: 'OpenCycleMap',
-        OSM_CYCLE_DESCRIPTION: 'Données OpenCycleMap'
-      }
-    },
-    en: {
-      Layers: {
-        OSM_CYCLE: 'OpenCycleMap',
-        OSM_CYCLE_DESCRIPTION: 'OpenCycleMap data'
-      }
-    }
-  },
-  attribution: 'OpenStreetMap © <a href="https://www.opencyclemap.org/">OpenCycleMap</a> contributors',
-  type: 'BaseLayer',
-  tags: ['osm'],
-  leaflet: {
-    type: 'tileLayer',
-    isVisible: false,
-    source: 'http://{s}.tile.thunderforest.com/cycle/{z}/{x}/{y}.png',
-    maxZoom: 21,
-    maxNativeZoom: 18
-  },
-  cesium: {
-    type: 'OpenStreetMap',
-    url: \`http://a.tile.thunderforest.com/cycle\`,
-    isVisible: false
-  }
-}]
module.exports = [{
-  name: 'Layers.OSM',
-  description: 'Layers.OSM_DESCRIPTION',
-  i18n: {
-    fr: {
-      Layers: {
-        OSM: 'OpenStreeMap',
-        OSM_DESCRIPTION: 'Données OpenStreetMap'
-      }
-    },
-    en: {
-      Layers: {
-        OSM: 'OpenStreeMap',
-        OSM_DESCRIPTION: 'OpenStreeMap data'
-      }
-    }
-  },
-  tags: ['osm'],
-  attribution: 'OpenStreetMap © <a href="http://openstreetmap.org">OpenStreetMap</a> contributors',
-  type: 'BaseLayer',
-  leaflet: {
-    type: 'tileLayer',
-    isVisible: true,
-    source: 'http://{s}.tile.osm.org/{z}/{x}/{y}.png',
-    maxZoom: 21,
-    maxNativeZoom: 18
-  },
-  cesium: {
-    type: 'OpenStreetMap',
-    isVisible: true,
-    url: \`http://a.tile.osm.org\`
-  }
-}, {
-  name: 'Layers.OSM_CYCLE',
-  description: 'Layers.OSM_CYCLE_DESCRIPTION',
-  i18n: {
-    fr: {
-      Layers: {
-        OSM_CYCLE: 'OpenCycleMap',
-        OSM_CYCLE_DESCRIPTION: 'Données OpenCycleMap'
-      }
-    },
-    en: {
-      Layers: {
-        OSM_CYCLE: 'OpenCycleMap',
-        OSM_CYCLE_DESCRIPTION: 'OpenCycleMap data'
-      }
-    }
-  },
-  attribution: 'OpenStreetMap © <a href="https://www.opencyclemap.org/">OpenCycleMap</a> contributors',
-  type: 'BaseLayer',
-  tags: ['osm'],
-  leaflet: {
-    type: 'tileLayer',
-    isVisible: false,
-    source: 'http://{s}.tile.thunderforest.com/cycle/{z}/{x}/{y}.png',
-    maxZoom: 21,
-    maxNativeZoom: 18
-  },
-  cesium: {
-    type: 'OpenStreetMap',
-    url: \`http://a.tile.thunderforest.com/cycle\`,
-    isVisible: false
-  }
-}]

Except for raster data, vector data are always converted to GeoJson upfront or as a rendering preprocessing phase in Kano.

Using OGC standards

OGC Web Services (OWS) are the OGC standards that use the internet to view, edit, manage and share geospatial data. You can notably use the following standards in Kano:

  • Web Map Services (WMS)
  • Web Map Tile Service (WMTS)
  • Tile Map Service (TMS)
  • Web Feature Service (WFS)
  • Web Coverage Service (WCS)

In this section we will use OGC web services of the French geographical institute (IGN). First copy the new layers file in the kano/api/config/layers directory. Then, add "POPULATION_DENSITY_WMTS POPULATION_DENSITY_WMS AIRPORTS_WFS" to your LAYERS_FILTER environment variable and launch Kano again to make the new layers appear in your custom catalog.

ogc-layers.cjs - Used to define additional layers using different protocols like WMTS, WMS and WFS.
cjs
module.exports = [{
-  name: 'Layers.POPULATION_DENSITY_WMTS',
-  description: 'Layers.POPULATION_DENSITY_WMTS_DESCRIPTION',
-  i18n: {
-    fr: {
-      Layers: {
-        POPULATION_DENSITY_WMTS: 'Densité (WMTS)',
-        POPULATION_DENSITY_WMTS_DESCRIPTION: 'Densité de population (IGN)'
-      }
-    },
-    en: {
-      Layers: {
-        POPULATION_DENSITY_WMTS: 'Density (WMTS)',
-        POPULATION_DENSITY_WMTS_DESCRIPTION: 'Population density (IGN)'
-      }
-    }
-  },
-  type: 'OverlayLayer',
-  attribution: '© <a href="https://ign.fr">IGN</a>',
-  tags: ['population'],
-  cesium: {
-    type: 'WebMapTileService',
-    url: 'https://wxs.ign.fr/economie/geoportail/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=INSEE.FILOSOFI.POPULATION&STYLE=INSEE&FORMAT=image/png&TILEMATRIXSET=PM&TILEMATRIX={TileMatrix}&TILEROW={TileRow}&TILECOL={TileCol}',
-    format: 'image/png',
-    layer: 'INSEE.FILOSOFI.POPULATION',
-    style: 'INSEE',
-    tileMatrixSetID: 'PM',
-    isVisible: false
-  },
-  leaflet: {
-    type: 'tileLayer',
-    source: 'https://wxs.ign.fr/economie/geoportail/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=INSEE.FILOSOFI.POPULATION&STYLE=INSEE&FORMAT=image/png&TILEMATRIXSET=PM&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}',
-    bounds: [ [40, -5], [50, 10] ],
-    opacity: 0.5,
-    isVisible: false
-  },
-  legendUrl: 'https://wxs.ign.fr/static/legends/INSEE.FILOSOFI.POPULATION-tot-legend-2017.png'
-}, {
-  name: 'Layers.POPULATION_DENSITY_WMS',
-  description: 'Layers.POPULATION_DENSITY_WMS_DESCRIPTION',
-  i18n: {
-    fr: {
-      Layers: {
-        POPULATION_DENSITY_WMS: 'Densité (WMS)',
-        POPULATION_DENSITY_WMS_DESCRIPTION: 'Densité de population (IGN)'
-      }
-    },
-    en: {
-      Layers: {
-        POPULATION_DENSITY_WMS: 'Density (WMS)',
-        POPULATION_DENSITY_WMS_DESCRIPTION: 'Population density (IGN)'
-      }
-    }
-  },
-  type: 'OverlayLayer',
-  attribution: '© <a href="https://ign.fr">IGN</a>',
-  tags: ['population'],
-  cesium: {
-    type: 'WebMapService',
-    url: 'https://wxs.ign.fr/economie/geoportail/r/wms',
-    layers: 'INSEE.FILOSOFI.POPULATION',
-    parameters: {
-      version: '1.3.0',
-      format: 'image/png',
-      transparent: true,
-      styles: 'INSEE'
-    },
-    isVisible: false
-  },
-  leaflet: {
-    type: 'tileLayer.wms',
-    source: 'https://wxs.ign.fr/economie/geoportail/r/wms',
-    layers: 'INSEE.FILOSOFI.POPULATION',
-    version: '1.3.0',
-    format: 'image/png',
-    transparent: true,
-    bgcolor: 'FFFFFFFF',
-    styles: 'INSEE',
-    opacity: 0.5,
-    isVisible: false
-  },
-  legendUrl: 'https://wxs.ign.fr/static/legends/INSEE.FILOSOFI.POPULATION-tot-legend-2017.png'
-}, {
-  name: 'Layers.AIRPORTS_WFS',
-  description: 'Layers.AIRPORTS_WFS_DESCRIPTION',
-  i18n: {
-    fr: {
-      Layers: {
-        AIRPORTS_WFS: 'Aérodromes (WFS)',
-        AIRPORTS_WFS_DESCRIPTION: 'Aérodromes (IGN)'
-      }
-    },
-    en: {
-      Layers: {
-        AIRPORTS_WFS: 'Airports (WFS)',
-        AIRPORTS_WFS_DESCRIPTION: 'Airports (IGN)'
-      }
-    }
-  },
-  type: 'OverlayLayer',
-  icon: 'las la-plane',
-  tags: ['administrative'],
-  bbox: [
-    -63.1537116941531,
-    -21.3898266619462,
-    55.8367758165235,
-    51.3150480097903
-  ],
-  featureId: 'toponyme',
-  wfs: {
-    url: 'https://wxs.ign.fr/cartovecto/geoportail/wfs',
-    version: '2.0.0',
-    searchParams: {},
-    outputFormat: 'json',
-    layer: 'BDCARTO_V5:aerodrome'
-  },
-  leaflet: {
-    type: 'geoJson',
-    realtime: true,
-    tiled: true,
-    minZoom: 10
-  },
-  cesium: {
-    type: 'geoJson',
-    realtime: true
-  }
-}]
module.exports = [{
-  name: 'Layers.POPULATION_DENSITY_WMTS',
-  description: 'Layers.POPULATION_DENSITY_WMTS_DESCRIPTION',
-  i18n: {
-    fr: {
-      Layers: {
-        POPULATION_DENSITY_WMTS: 'Densité (WMTS)',
-        POPULATION_DENSITY_WMTS_DESCRIPTION: 'Densité de population (IGN)'
-      }
-    },
-    en: {
-      Layers: {
-        POPULATION_DENSITY_WMTS: 'Density (WMTS)',
-        POPULATION_DENSITY_WMTS_DESCRIPTION: 'Population density (IGN)'
-      }
-    }
-  },
-  type: 'OverlayLayer',
-  attribution: '© <a href="https://ign.fr">IGN</a>',
-  tags: ['population'],
-  cesium: {
-    type: 'WebMapTileService',
-    url: 'https://wxs.ign.fr/economie/geoportail/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=INSEE.FILOSOFI.POPULATION&STYLE=INSEE&FORMAT=image/png&TILEMATRIXSET=PM&TILEMATRIX={TileMatrix}&TILEROW={TileRow}&TILECOL={TileCol}',
-    format: 'image/png',
-    layer: 'INSEE.FILOSOFI.POPULATION',
-    style: 'INSEE',
-    tileMatrixSetID: 'PM',
-    isVisible: false
-  },
-  leaflet: {
-    type: 'tileLayer',
-    source: 'https://wxs.ign.fr/economie/geoportail/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=INSEE.FILOSOFI.POPULATION&STYLE=INSEE&FORMAT=image/png&TILEMATRIXSET=PM&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}',
-    bounds: [ [40, -5], [50, 10] ],
-    opacity: 0.5,
-    isVisible: false
-  },
-  legendUrl: 'https://wxs.ign.fr/static/legends/INSEE.FILOSOFI.POPULATION-tot-legend-2017.png'
-}, {
-  name: 'Layers.POPULATION_DENSITY_WMS',
-  description: 'Layers.POPULATION_DENSITY_WMS_DESCRIPTION',
-  i18n: {
-    fr: {
-      Layers: {
-        POPULATION_DENSITY_WMS: 'Densité (WMS)',
-        POPULATION_DENSITY_WMS_DESCRIPTION: 'Densité de population (IGN)'
-      }
-    },
-    en: {
-      Layers: {
-        POPULATION_DENSITY_WMS: 'Density (WMS)',
-        POPULATION_DENSITY_WMS_DESCRIPTION: 'Population density (IGN)'
-      }
-    }
-  },
-  type: 'OverlayLayer',
-  attribution: '© <a href="https://ign.fr">IGN</a>',
-  tags: ['population'],
-  cesium: {
-    type: 'WebMapService',
-    url: 'https://wxs.ign.fr/economie/geoportail/r/wms',
-    layers: 'INSEE.FILOSOFI.POPULATION',
-    parameters: {
-      version: '1.3.0',
-      format: 'image/png',
-      transparent: true,
-      styles: 'INSEE'
-    },
-    isVisible: false
-  },
-  leaflet: {
-    type: 'tileLayer.wms',
-    source: 'https://wxs.ign.fr/economie/geoportail/r/wms',
-    layers: 'INSEE.FILOSOFI.POPULATION',
-    version: '1.3.0',
-    format: 'image/png',
-    transparent: true,
-    bgcolor: 'FFFFFFFF',
-    styles: 'INSEE',
-    opacity: 0.5,
-    isVisible: false
-  },
-  legendUrl: 'https://wxs.ign.fr/static/legends/INSEE.FILOSOFI.POPULATION-tot-legend-2017.png'
-}, {
-  name: 'Layers.AIRPORTS_WFS',
-  description: 'Layers.AIRPORTS_WFS_DESCRIPTION',
-  i18n: {
-    fr: {
-      Layers: {
-        AIRPORTS_WFS: 'Aérodromes (WFS)',
-        AIRPORTS_WFS_DESCRIPTION: 'Aérodromes (IGN)'
-      }
-    },
-    en: {
-      Layers: {
-        AIRPORTS_WFS: 'Airports (WFS)',
-        AIRPORTS_WFS_DESCRIPTION: 'Airports (IGN)'
-      }
-    }
-  },
-  type: 'OverlayLayer',
-  icon: 'las la-plane',
-  tags: ['administrative'],
-  bbox: [
-    -63.1537116941531,
-    -21.3898266619462,
-    55.8367758165235,
-    51.3150480097903
-  ],
-  featureId: 'toponyme',
-  wfs: {
-    url: 'https://wxs.ign.fr/cartovecto/geoportail/wfs',
-    version: '2.0.0',
-    searchParams: {},
-    outputFormat: 'json',
-    layer: 'BDCARTO_V5:aerodrome'
-  },
-  leaflet: {
-    type: 'geoJson',
-    realtime: true,
-    tiled: true,
-    minZoom: 10
-  },
-  cesium: {
-    type: 'geoJson',
-    realtime: true
-  }
-}]

You now should be able to see this after making some of the layers active:

ogc layers

Due to the possible large amount of vector data coming from the WFS the layer is configured with minZoom and tiled property so that data is only retrieved when zoom level exceed 10 for visible tiles only.

Using data files

Except by using the UI, there are two ways of adding data coming from a file based on configuration:

  1. serve and directly access the file over HTTP,
  2. ingest the file data into the database and access it using a built-in web service.

The second option is mandatory for large datasets or if you'd like to perform some filtering based on data feature properties. Accessing data stored in the database rely on the concept of FeathersJS service. As a consequence, the layer is usually associated with one (or more) source service where the data come from. Moreover, you should define a unique featureId on your features so that Kano can correctly separate and update data.

The data can be retrieved from a raw file with the fileName layer property or a remote file with the url layer property.

You should have a look to our detailed documentation for all possible styling options in 2D or 3D.

First copy the new layers file in the kano/api/config/layers directory. Then, add "REGIONS DEPARTMENTS" to your LAYERS_FILTER environment variable and launch Kano again to make some new layers appear in your custom catalog.

file-layers.cjs - Used to define additional layers using file data.
cjs
// Base URL to public files hosted in the docs
-const baseUrl = (process.env.NODE_ENV === 'development' ? 'http://localhost:8082' : 'https://kalisio.github.io/kano')
-
-module.exports = [{
-  name: 'Layers.REGIONS',
-  description: 'Layers.REGIONS_DESCRIPTION',
-  i18n: {
-    fr: {
-      Layers: {
-        REGIONS: 'Régions',
-        REGIONS_DESCRIPTION: 'Régions Françaises'
-      }
-    },
-    en: {
-      Layers: {
-        REGIONS: 'Regions',
-        REGIONS_DESCRIPTION: 'French regions'
-      }
-    }
-  },
-  tags: ['administrative'],
-  type: 'OverlayLayer',
-  featureId: 'code',
-  leaflet: {
-    type: 'geoJson',
-    source: \`\${baseUrl}/regions.geojson\`,
-    'stroke-color': 'blue',
-    'fill-opacity': 0,
-    popup: { pick: [] },
-    tooltip: {
-      template: '<b><%= properties.nom %></b>'
-    }
-  },
-  cesium: {
-    type: 'geoJson',
-    source: \`\${baseUrl}/regions.geojson\`,
-    'stroke-color': 'blue',
-    'fill-opacity': 0,
-    popup: { pick: [] },
-    tooltip: {
-      template: '<%= properties.nom %>'
-    }
-  }
-}, {
-  name: 'Layers.DEPARTMENTS',
-  description: 'Layers.DEPARTMENTS_DESCRIPTION',
-  i18n: {
-    fr: {
-      Layers: {
-        DEPARTMENTS: 'Départements',
-        DEPARTMENTS_DESCRIPTION: 'Départements Français'
-      }
-    },
-    en: {
-      Layers: {
-        DEPARTMENTS: 'Departments',
-        DEPARTMENTS_DESCRIPTION: 'French departments'
-      }
-    }
-  },
-  tags: ['administrative'],
-  type: 'OverlayLayer',
-  featureId: 'code',
-  service: 'airports',
-  probe: 'Airports',
-  url: \`\${baseUrl}/departments.geojson\`,
-  // Could also be a file path to a GeoJson or a gzipped GeoJson
-  //fileName: path.join(__dirname, '../../../docs/.vitepress/public/departements.geojson'),
-  leaflet: {
-    type: 'geoJson',
-    source: '/api/departments',
-    'stroke-color': 'red',
-    'fill-opacity': 0,
-    popup: { pick: [] },
-    tooltip: {
-      template: '<b><%= properties.nom %></b>'
-    }
-  },
-  cesium: {
-    type: 'geoJson',
-    source: '/api/departments',
-    'stroke-color': 'red',
-    'fill-opacity': 0,
-    popup: { pick: [] },
-    tooltip: {
-      template: '<%= properties.nom %>'
-    }
-  }
-}]
// Base URL to public files hosted in the docs
-const baseUrl = (process.env.NODE_ENV === 'development' ? 'http://localhost:8082' : 'https://kalisio.github.io/kano')
-
-module.exports = [{
-  name: 'Layers.REGIONS',
-  description: 'Layers.REGIONS_DESCRIPTION',
-  i18n: {
-    fr: {
-      Layers: {
-        REGIONS: 'Régions',
-        REGIONS_DESCRIPTION: 'Régions Françaises'
-      }
-    },
-    en: {
-      Layers: {
-        REGIONS: 'Regions',
-        REGIONS_DESCRIPTION: 'French regions'
-      }
-    }
-  },
-  tags: ['administrative'],
-  type: 'OverlayLayer',
-  featureId: 'code',
-  leaflet: {
-    type: 'geoJson',
-    source: \`\${baseUrl}/regions.geojson\`,
-    'stroke-color': 'blue',
-    'fill-opacity': 0,
-    popup: { pick: [] },
-    tooltip: {
-      template: '<b><%= properties.nom %></b>'
-    }
-  },
-  cesium: {
-    type: 'geoJson',
-    source: \`\${baseUrl}/regions.geojson\`,
-    'stroke-color': 'blue',
-    'fill-opacity': 0,
-    popup: { pick: [] },
-    tooltip: {
-      template: '<%= properties.nom %>'
-    }
-  }
-}, {
-  name: 'Layers.DEPARTMENTS',
-  description: 'Layers.DEPARTMENTS_DESCRIPTION',
-  i18n: {
-    fr: {
-      Layers: {
-        DEPARTMENTS: 'Départements',
-        DEPARTMENTS_DESCRIPTION: 'Départements Français'
-      }
-    },
-    en: {
-      Layers: {
-        DEPARTMENTS: 'Departments',
-        DEPARTMENTS_DESCRIPTION: 'French departments'
-      }
-    }
-  },
-  tags: ['administrative'],
-  type: 'OverlayLayer',
-  featureId: 'code',
-  service: 'airports',
-  probe: 'Airports',
-  url: \`\${baseUrl}/departments.geojson\`,
-  // Could also be a file path to a GeoJson or a gzipped GeoJson
-  //fileName: path.join(__dirname, '../../../docs/.vitepress/public/departements.geojson'),
-  leaflet: {
-    type: 'geoJson',
-    source: '/api/departments',
-    'stroke-color': 'red',
-    'fill-opacity': 0,
-    popup: { pick: [] },
-    tooltip: {
-      template: '<b><%= properties.nom %></b>'
-    }
-  },
-  cesium: {
-    type: 'geoJson',
-    source: '/api/departments',
-    'stroke-color': 'red',
-    'fill-opacity': 0,
-    popup: { pick: [] },
-    tooltip: {
-      template: '<%= properties.nom %>'
-    }
-  }
-}]

You now should be able to see a map highlighting some administrative boundaries in France:

file layers

If you have to ingest large datasets you should consider processing data using our ETL Krawler or ad-hoc processors. For instance, k-population ingest population data from a big GeoPackage into our database. You will find the associated layer definition in the built-in layers.

Time-varying data

One of the best feature of Kano is interactive visualisation, meaning that data can be updated in real-time according to user actions or data updates. A typical use case is the visualisation of time-varying spatial datasets. In this section we will use some data providing the number of hospitalizations by department in France during the COVID-19 (from 20-03-2020 to 20-04-2020) to perform such a visualisation.

In this example there is one GeoJson file per day. First extract the data files to the public folder exposed by Kano. Then copy the new layers file in the kano/api/config/layers directory. Last, add "COVID_19" to your LAYERS_FILTER environment variable and launch Kano again to make the new layers appear in your custom catalog.

covid-19-layers.cjs - Used to define additional time-varying layers based on file data.
cjs
// Base URL to public files hosted in the docs
-const baseUrl = (process.env.NODE_ENV === 'development' ? 'http://localhost:8082' : 'https://kalisio.github.io/kano')
-
-module.exports = [{
-  name: 'Layers.COVID_19',
-  description: 'Layers.COVID_19_DESCRIPTION',
-  i18n: {
-    fr: {
-      Layers: {
-        COVID_19: 'COVID-19',
-        COVID_19_DESCRIPTION: 'Hospitalisations par département'
-      }
-    },
-    en: {
-      Layers: {
-        COVID_19: 'COVID-19',
-        COVID_19_DESCRIPTION: 'Hospitalizations by department'
-      }
-    }
-  },
-  tags: ['health'],
-  icon: 'fas fa-atlas',
-  attribution: 'Santé Publique Fance / IGN / INSEE',
-  type: 'OverlayLayer',
-  featureId: 'code',
-  every: 'P1D',
-  leaflet: {
-    type: 'geoJson',
-    realtime: true,
-    sourceTemplate: \`\${baseUrl}/covid-19/hospitalisations-departements-<%= time.format('YYYY-MM-DD') %>.json\`,
-    stroke: '#fee8c8',
-    'stroke-width': 2,
-    'stroke-opacity': 0.5,
-    'fill-opacity': 0.5,
-    'fill-color': '<%= chroma.scale(\\'OrRd\\').domain([0,50])(properties.taux).hex() %>',
-    template: ['fill-color'],
-    tooltip: {
-      template: '<b><%= properties.nom %>: <%= properties.hospitalisations %> hospitalisations</b>',
-      options: {
-        opacity: 0.8,
-        direction: 'top'
-      }
-    }
-  },
-  cesium: {
-    type: 'geoJson',
-    realtime: true,
-    sourceTemplate: \`\${baseUrl}/covid-19/hospitalisations-departements-<%= time.format('YYYY-MM-DD') %>.json\`,
-    entityStyle: {
-      polygon: {
-        outline: false,
-        extrudedHeight: '<%= 1000 * properties.taux %>',
-        material: {
-          type: 'Cesium.ColorMaterialProperty',
-          options: {
-            type: 'Cesium.Color.fromCssColorString',
-            options: '<%= chroma.scale(\\'OrRd\\').domain([0,50])(properties.taux).css() %>'
-          }
-        }
-      },
-      template: ['polygon.extrudedHeight', 'polygon.material.options.options']
-    },
-    tooltip: {
-      template: '<%= properties.nom %>: <%= properties.hospitalisations %> hospitalisations'
-    }
-  }
-}]
// Base URL to public files hosted in the docs
-const baseUrl = (process.env.NODE_ENV === 'development' ? 'http://localhost:8082' : 'https://kalisio.github.io/kano')
-
-module.exports = [{
-  name: 'Layers.COVID_19',
-  description: 'Layers.COVID_19_DESCRIPTION',
-  i18n: {
-    fr: {
-      Layers: {
-        COVID_19: 'COVID-19',
-        COVID_19_DESCRIPTION: 'Hospitalisations par département'
-      }
-    },
-    en: {
-      Layers: {
-        COVID_19: 'COVID-19',
-        COVID_19_DESCRIPTION: 'Hospitalizations by department'
-      }
-    }
-  },
-  tags: ['health'],
-  icon: 'fas fa-atlas',
-  attribution: 'Santé Publique Fance / IGN / INSEE',
-  type: 'OverlayLayer',
-  featureId: 'code',
-  every: 'P1D',
-  leaflet: {
-    type: 'geoJson',
-    realtime: true,
-    sourceTemplate: \`\${baseUrl}/covid-19/hospitalisations-departements-<%= time.format('YYYY-MM-DD') %>.json\`,
-    stroke: '#fee8c8',
-    'stroke-width': 2,
-    'stroke-opacity': 0.5,
-    'fill-opacity': 0.5,
-    'fill-color': '<%= chroma.scale(\\'OrRd\\').domain([0,50])(properties.taux).hex() %>',
-    template: ['fill-color'],
-    tooltip: {
-      template: '<b><%= properties.nom %>: <%= properties.hospitalisations %> hospitalisations</b>',
-      options: {
-        opacity: 0.8,
-        direction: 'top'
-      }
-    }
-  },
-  cesium: {
-    type: 'geoJson',
-    realtime: true,
-    sourceTemplate: \`\${baseUrl}/covid-19/hospitalisations-departements-<%= time.format('YYYY-MM-DD') %>.json\`,
-    entityStyle: {
-      polygon: {
-        outline: false,
-        extrudedHeight: '<%= 1000 * properties.taux %>',
-        material: {
-          type: 'Cesium.ColorMaterialProperty',
-          options: {
-            type: 'Cesium.Color.fromCssColorString',
-            options: '<%= chroma.scale(\\'OrRd\\').domain([0,50])(properties.taux).css() %>'
-          }
-        }
-      },
-      template: ['polygon.extrudedHeight', 'polygon.material.options.options']
-    },
-    tooltip: {
-      template: '<%= properties.nom %>: <%= properties.hospitalisations %> hospitalisations'
-    }
-  }
-}]

Using the bottom timeline, navigate to some dates within the data time range, you now should be able to see a choropleth map highlighting the number of hospitalizations for each date:

covid-19 layers

You can even do the same using the 3D activity:

covid-19 layers in 3D

Using the API

The Kano API is particularly useful to update data continuously, a typical use case is data coming from network sensors performing measurements on the ground.

WARNING

You should use the local.cjs configuration file as stated in the installation section to setup a user account with appropriate rights (i.e. write acces to the API).

The different service endpoints of Kano can be accessed using REST as the most universal interface or using WebSockets if required (typically for complex queries or performance issue). The access to the endpoints are protected using a JWT (i.e. token), it must be defined using the Authorization header (Bearer token) in the request header for REST.

For instance using CURL you will send a request to the API like this (the body of the request being in the data.json file):

bash
SET TOKEN="xxx"
-
-curl -X POST -H "Authorization: Bearer %TOKEN%" ^
-     -H "Content-Type: application/json" ^
-     -d @data.json ^
-     https://kano.dev.kalisio.xyz/api/service
SET TOKEN="xxx"
-
-curl -X POST -H "Authorization: Bearer %TOKEN%" ^
-     -H "Content-Type: application/json" ^
-     -d @data.json ^
-     https://kano.dev.kalisio.xyz/api/service

Detailed information about the concepts and the data model behind our feature services can be found in the KDK documentation, although focused on how to retrieve the data.

To push a new station the body of the request will be a GeoJson feature like this:

js
{
-  "properties": {
-    "id": "174412d9e-f230-4127-af36-75654e265f56",
-    "name": "Station 1"
-  },
-  "geometry": {
-    "type": "Point",
-    "coordinates": [
-      1.5059948323127268
-      43.547168883180966,
-      0
-    ]
-  },
-  "type": "Feature"
-}
{
-  "properties": {
-    "id": "174412d9e-f230-4127-af36-75654e265f56",
-    "name": "Station 1"
-  },
-  "geometry": {
-    "type": "Point",
-    "coordinates": [
-      1.5059948323127268
-      43.547168883180966,
-      0
-    ]
-  },
-  "type": "Feature"
-}

To push a new measure of the station the body of the request will be (a) GeoJson feature(s) like this:

js
// Single or multiple measures can be sent at once
-[{
-  "time": "2023-04-28T16:00:00",
-  "properties": {
-    "id": "174412d9e-f230-4127-af36-75654e265f56",
-    "value": 24,
-    "status": "OK"
-  },
-  "geometry": {
-    "type": "Point",
-    "coordinates": [
-      1.5059948323127268
-      43.547168883180966,
-      0
-    ]
-  },
-  "type": "Feature"
-}, ...]
// Single or multiple measures can be sent at once
-[{
-  "time": "2023-04-28T16:00:00",
-  "properties": {
-    "id": "174412d9e-f230-4127-af36-75654e265f56",
-    "value": 24,
-    "status": "OK"
-  },
-  "geometry": {
-    "type": "Point",
-    "coordinates": [
-      1.5059948323127268
-      43.547168883180966,
-      0
-    ]
-  },
-  "type": "Feature"
-}, ...]

First copy the new layers file in the kano/api/config/layers directory. Then, add "SENSORS" to your LAYERS_FILTER environment variable and launch Kano again to make the new layers appear in your custom catalog.

sensors-layers.cjs - Used to define additional sensors layers based on API data feeding.
cjs
module.exports = [{
-  name: 'Layers.SENSORS',
-  description: 'Layers.SENSORS_DESCRIPTION',
-  i18n: {
-    fr: {
-      Layers: {
-        SENSORS: 'Capteurs',
-        SENSORS_DESCRIPTION: 'Réseau de capteurs'
-      },
-      Variables: {
-        TEMPERATURE: 'Température'
-      }
-    },
-    en: {
-      Layers: {
-        SENSORS: 'Sensors',
-        SENSORS_DESCRIPTION: 'Sensors network'
-      },
-      Variables: {
-        TEMPERATURE: 'Temperature'
-      }
-    }
-  },
-  tags: ['sensors'],
-  type: 'OverlayLayer',
-  service: 'sensors-observations',
-  probeService: 'sensors-stations',
-  ttl: 7 * 24 * 60 * 60,
-  featureId: 'id',
-  featureLabel: 'name',
-  from: 'P-7D',
-  to: 'PT-1M',
-  every: 'PT10M',
-  queryFrom: 'PT-1H',
-  variables: [
-    {
-      name: 'temperature',
-      label: 'Variables.TEMPERATURE',
-      units: ['degC'],
-      range: [-50, 127],
-      step: 5,
-      chartjs: {
-        backgroundColor: 'rgba(255, 99, 132, 128)',
-        borderColor: 'rgb(255, 99, 132)',
-        fill: false
-      }
-    }
-  ],
-  leaflet: {
-    type: 'geoJson',
-    realtime: true,
-    tiled: true,
-    cluster: { disableClusteringAtZoom: 18 },
-    'marker-color': \`<% if (properties.status === 'OK') { %>green<% }
-                        else { %>red<% } %>\`,
-    'icon-classes': 'fa fa-wifi',
-    'icon-x-offset': -2,
-    'icon-color': '#FFF',
-    template: ['marker-color'],
-    tooltip: {
-      template: '<%= properties.name %>: <%= properties.temperature %>°C'
-    }
-  },
-  cesium: {
-    type: 'geoJson',
-    realtime: true,
-    cluster: { pixelRange: 50 },
-    'marker-symbol': 'lighthouse',
-    'marker-color': '#180EF1',
-    tooltip: {
-      template: '<%= properties.name %>: <%= properties.temperature %>°C'
-    }
-  }
-}]
module.exports = [{
-  name: 'Layers.SENSORS',
-  description: 'Layers.SENSORS_DESCRIPTION',
-  i18n: {
-    fr: {
-      Layers: {
-        SENSORS: 'Capteurs',
-        SENSORS_DESCRIPTION: 'Réseau de capteurs'
-      },
-      Variables: {
-        TEMPERATURE: 'Température'
-      }
-    },
-    en: {
-      Layers: {
-        SENSORS: 'Sensors',
-        SENSORS_DESCRIPTION: 'Sensors network'
-      },
-      Variables: {
-        TEMPERATURE: 'Temperature'
-      }
-    }
-  },
-  tags: ['sensors'],
-  type: 'OverlayLayer',
-  service: 'sensors-observations',
-  probeService: 'sensors-stations',
-  ttl: 7 * 24 * 60 * 60,
-  featureId: 'id',
-  featureLabel: 'name',
-  from: 'P-7D',
-  to: 'PT-1M',
-  every: 'PT10M',
-  queryFrom: 'PT-1H',
-  variables: [
-    {
-      name: 'temperature',
-      label: 'Variables.TEMPERATURE',
-      units: ['degC'],
-      range: [-50, 127],
-      step: 5,
-      chartjs: {
-        backgroundColor: 'rgba(255, 99, 132, 128)',
-        borderColor: 'rgb(255, 99, 132)',
-        fill: false
-      }
-    }
-  ],
-  leaflet: {
-    type: 'geoJson',
-    realtime: true,
-    tiled: true,
-    cluster: { disableClusteringAtZoom: 18 },
-    'marker-color': \`<% if (properties.status === 'OK') { %>green<% }
-                        else { %>red<% } %>\`,
-    'icon-classes': 'fa fa-wifi',
-    'icon-x-offset': -2,
-    'icon-color': '#FFF',
-    template: ['marker-color'],
-    tooltip: {
-      template: '<%= properties.name %>: <%= properties.temperature %>°C'
-    }
-  },
-  cesium: {
-    type: 'geoJson',
-    realtime: true,
-    cluster: { pixelRange: 50 },
-    'marker-symbol': 'lighthouse',
-    'marker-color': '#180EF1',
-    tooltip: {
-      template: '<%= properties.name %>: <%= properties.temperature %>°C'
-    }
-  }
-}]

Now, feed the API using the provided data in the public folder of the documentation:

curl -X POST -H "Authorization: Bearer %TOKEN%" -H "Content-Type: application/json" ^
-     -d @stations-data.json https://your.kano.domain/api/sensors-stations
-curl -X POST -H "Authorization: Bearer %TOKEN%" -H "Content-Type: application/json" ^
-     -d @observations-data.json https://your.kano.domain/api/sensors-observations
curl -X POST -H "Authorization: Bearer %TOKEN%" -H "Content-Type: application/json" ^
-     -d @stations-data.json https://your.kano.domain/api/sensors-stations
-curl -X POST -H "Authorization: Bearer %TOKEN%" -H "Content-Type: application/json" ^
-     -d @observations-data.json https://your.kano.domain/api/sensors-observations

TIP

For testing purpose you can get a valid token from the local storage in the developer tool after logged into Kano.

Using the bottom timeline, navigate to a date/time with existing sensor data, you now should be able to see your sensor on the map, selecting it should open the value timeseries:

sensors layers

A data layer can contain multiple time-varying elements called variables. The features may contain additional properties, e.g. a status (OK/NOK), a name, etc. that can be used to customize the rendering, e.g. icon, color, tooltip, etc.

The main configuration options are the following:

  • the property that will be use to uniquely identify a station (i.e. ID)
  • the refresh rate of the data in the layer (used to automatically update the view every N seconds in Kano)
  • the life time of a measure, i.e. if no measure found within the range current time - life time the station is not considered to have performed any measure for current time
  • the list of the variables contained in the data with associated properties to ease timeseries display (unit, range, color, ...)

TIP

A layer can have no fixed stations but only measurements from sensors in order to display moving data

Customizing the catalog legend

To be completed

',66),y=[i];function d(u,E,g,m,h,S){return n(),a("div",null,y)}const I=s(r,[["render",d]]);export{O as __pageData,I as default}; diff --git a/assets/guides_customizing-kano.md.8bb2652f.lean.js b/assets/guides_customizing-kano.md.8bb2652f.lean.js deleted file mode 100644 index 053af113..00000000 --- a/assets/guides_customizing-kano.md.8bb2652f.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as s,o as n,c as a,Q as e}from"./chunks/framework.f7d371db.js";const l="/kano/assets/kano-ogc-layers.1f5edae4.png",p="/kano/assets/kano-file-layers.0888f7b0.png",o="/kano/assets/kano-covid-19-layers.42f5160d.png",t="/kano/assets/kano-covid-19-layers-3D.99d091d6.png",c="/kano/assets/kano-sensors-layers.6878ff2a.png",O=JSON.parse('{"title":"Customizing Kano","description":"","frontmatter":{"sidebarDepth":3},"headers":[],"relativePath":"guides/customizing-kano.md","filePath":"guides/customizing-kano.md"}'),r={name:"guides/customizing-kano.md"},i=e("",66),y=[i];function d(u,E,g,m,h,S){return n(),a("div",null,y)}const I=s(r,[["render",d]]);export{O as __pageData,I as default}; diff --git a/assets/guides_customizing-kano.md.8nbTGQ9l.js b/assets/guides_customizing-kano.md.8nbTGQ9l.js new file mode 100644 index 00000000..f2507b0a --- /dev/null +++ b/assets/guides_customizing-kano.md.8nbTGQ9l.js @@ -0,0 +1,496 @@ +import{_ as s,c as a,o as n,V as p}from"./chunks/framework.J61Sinzt.js";const e="/kano/assets/kano-ogc-layers.mPkXU--y.png",i="/kano/assets/kano-file-layers.VfIDpJM5.png",l="/kano/assets/kano-covid-19-layers.4K62qXY-.png",t="/kano/assets/kano-covid-19-layers-3D.AY8QJGYX.png",o="/kano/assets/kano-sensors-layers.1fWLR23M.png",b=JSON.parse('{"title":"Customizing Kano","description":"","frontmatter":{"sidebarDepth":3},"headers":[],"relativePath":"guides/customizing-kano.md","filePath":"guides/customizing-kano.md"}'),r={name:"guides/customizing-kano.md"},c=p(`

Customizing Kano

This section details different approaches to integrate your own data to your Kano instance. Although you can directly use the Kano UI to add your own data layers this section provide details to do this by configuration or programmatically. When added through the UI, the different layers will be visible in the My data tab of the catalog panel, while the default built-in layers will appear in the Catalog tab of the catalog panel. You can also manage the categories (i.e. catalog sections) hosting the layers from the UI or the configuration.

Although names and descriptions can be hard-coded in the target user language, Kano supports internationalization through a nested structure organized by locale like this:

js
{
+	name: 'Categories.POPULATION_LAYERS',
+  i18n: {
+    fr: { Categories: { POPULATION_LAYERS: 'Population' } },
+    en: { Categories: { POPULATION_LAYERS: 'Population' } },
+    ...
+  }
+}

Note that the name property is used a unique identifier for categories and layers

Customizing the catalog

You can add your own categories in the catalog by defining it in additional files to be put in the kano/api/config/categories directory. Kano will glob all files within this directory and add categories accordingly, only matching by name those in the CATEGORIES_FILTER (comma-separated list of category names) environment variable, if any. Categories are simple objects with a name, a description and an icon from a standard icon set among Material Icons, Font Awesome, or Line Awesome.

my-categories.cjs - Used to define additional categories.
cjs
module.exports = [{
+  name: 'Categories.OSM_LAYERS',
+  i18n: {
+    fr: {
+      Categories: {
+        OSM_LAYERS: 'OpenStreetMap'
+      }
+    },
+    en: {
+      Categories: {
+        OSM_LAYERS: 'OpenStreetMap'
+      }
+    }
+  },
+  icon: 'las la-map',
+  options: { exclusive: true, filter: { type: 'BaseLayer', tags: { $in: ['osm'] } } }
+}, {
+  name: 'Categories.POPULATION_LAYERS',
+  i18n: {
+    fr: {
+      Categories: {
+        POPULATION_LAYERS: 'Population'
+      }
+    },
+    en: {
+      Categories: {
+        POPULATION_LAYERS: 'Population'
+      }
+    }
+  },
+  icon: 'las la-users',
+  options: { exclusive: false, filter: { type: 'OverlayLayer', tags: { $in: ['population'] } } }
+}]

Layers that will be added in a given category depends on the filter property content, which defines a sift filter applied to the layers list. Although any filter can be used, a tags property containing an array of relevent tags is often used by convention.

Customizing the catalog data

You can add your own layers in the catalog by defining it in additional files to be put in the kano/api/config/layers directory. Kano will glob all files within this directory and add layers accordingly, only matching by name those in the LAYERS_FILTER (comma-separated list of layer names) environment variable by default (set it to * to remove filtering). Layers are simple objects with a name, a description, a type, an attribution, and additional configuration options related to the underlying mapping engine: Leaflet for 2D rendering and Cesium for 3D rendering. More details about these options can be found in the documentation of the KDK powering Kano.

Please refer to the built-in kano/api/config/layers directory for various examples of what is possible to do with Kano.

We will start with a really simple example by adding two different map backgrounds based on OpenStreetMap data to your Kano instance. First ensure you copied the categories and layers files in their respective directories in kano/api/config. Then, set CATEGORIES_FILTER="OSM_LAYERS POPULATION_LAYERS" and LAYERS_FILTER="OSM OSM_CYCLE" in your environment. Last, launch Kano to make the layers appear in your custom catalog.

osm-layers.cjs - Used to define base layers with OpenStreetMap data.
cjs
module.exports = [{
+  name: 'Layers.OSM',
+  description: 'Layers.OSM_DESCRIPTION',
+  i18n: {
+    fr: {
+      Layers: {
+        OSM: 'OpenStreeMap',
+        OSM_DESCRIPTION: 'Données OpenStreetMap'
+      }
+    },
+    en: {
+      Layers: {
+        OSM: 'OpenStreeMap',
+        OSM_DESCRIPTION: 'OpenStreeMap data'
+      }
+    }
+  },
+  tags: ['osm'],
+  attribution: 'OpenStreetMap © <a href="http://openstreetmap.org">OpenStreetMap</a> contributors',
+  type: 'BaseLayer',
+  leaflet: {
+    type: 'tileLayer',
+    isVisible: true,
+    source: 'http://{s}.tile.osm.org/{z}/{x}/{y}.png',
+    maxZoom: 21,
+    maxNativeZoom: 18
+  },
+  cesium: {
+    type: 'OpenStreetMap',
+    isVisible: true,
+    url: \`http://a.tile.osm.org\`
+  }
+}, {
+  name: 'Layers.OSM_CYCLE',
+  description: 'Layers.OSM_CYCLE_DESCRIPTION',
+  i18n: {
+    fr: {
+      Layers: {
+        OSM_CYCLE: 'OpenCycleMap',
+        OSM_CYCLE_DESCRIPTION: 'Données OpenCycleMap'
+      }
+    },
+    en: {
+      Layers: {
+        OSM_CYCLE: 'OpenCycleMap',
+        OSM_CYCLE_DESCRIPTION: 'OpenCycleMap data'
+      }
+    }
+  },
+  attribution: 'OpenStreetMap © <a href="https://www.opencyclemap.org/">OpenCycleMap</a> contributors',
+  type: 'BaseLayer',
+  tags: ['osm'],
+  leaflet: {
+    type: 'tileLayer',
+    isVisible: false,
+    source: 'http://{s}.tile.thunderforest.com/cycle/{z}/{x}/{y}.png',
+    maxZoom: 21,
+    maxNativeZoom: 18
+  },
+  cesium: {
+    type: 'OpenStreetMap',
+    url: \`http://a.tile.thunderforest.com/cycle\`,
+    isVisible: false
+  }
+}]

Except for raster data, vector data are always converted to GeoJson upfront or as a rendering preprocessing phase in Kano.

Using OGC standards

OGC Web Services (OWS) are the OGC standards that use the internet to view, edit, manage and share geospatial data. You can notably use the following standards in Kano:

  • Web Map Services (WMS)
  • Web Map Tile Service (WMTS)
  • Tile Map Service (TMS)
  • Web Feature Service (WFS)
  • Web Coverage Service (WCS)

In this section we will use OGC web services of the French geographical institute (IGN). First copy the new layers file in the kano/api/config/layers directory. Then, add "POPULATION_DENSITY_WMTS POPULATION_DENSITY_WMS AIRPORTS_WFS" to your LAYERS_FILTER environment variable and launch Kano again to make the new layers appear in your custom catalog.

ogc-layers.cjs - Used to define additional layers using different protocols like WMTS, WMS and WFS.
cjs
module.exports = [{
+  name: 'Layers.POPULATION_DENSITY_WMTS',
+  description: 'Layers.POPULATION_DENSITY_WMTS_DESCRIPTION',
+  i18n: {
+    fr: {
+      Layers: {
+        POPULATION_DENSITY_WMTS: 'Densité (WMTS)',
+        POPULATION_DENSITY_WMTS_DESCRIPTION: 'Densité de population (IGN)'
+      }
+    },
+    en: {
+      Layers: {
+        POPULATION_DENSITY_WMTS: 'Density (WMTS)',
+        POPULATION_DENSITY_WMTS_DESCRIPTION: 'Population density (IGN)'
+      }
+    }
+  },
+  type: 'OverlayLayer',
+  attribution: '© <a href="https://ign.fr">IGN</a>',
+  tags: ['population'],
+  cesium: {
+    type: 'WebMapTileService',
+    url: 'https://wxs.ign.fr/economie/geoportail/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=INSEE.FILOSOFI.POPULATION&STYLE=INSEE&FORMAT=image/png&TILEMATRIXSET=PM&TILEMATRIX={TileMatrix}&TILEROW={TileRow}&TILECOL={TileCol}',
+    format: 'image/png',
+    layer: 'INSEE.FILOSOFI.POPULATION',
+    style: 'INSEE',
+    tileMatrixSetID: 'PM',
+    isVisible: false
+  },
+  leaflet: {
+    type: 'tileLayer',
+    source: 'https://wxs.ign.fr/economie/geoportail/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=INSEE.FILOSOFI.POPULATION&STYLE=INSEE&FORMAT=image/png&TILEMATRIXSET=PM&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}',
+    bounds: [ [40, -5], [50, 10] ],
+    opacity: 0.5,
+    isVisible: false
+  },
+  legendUrl: 'https://wxs.ign.fr/static/legends/INSEE.FILOSOFI.POPULATION-tot-legend-2017.png'
+}, {
+  name: 'Layers.POPULATION_DENSITY_WMS',
+  description: 'Layers.POPULATION_DENSITY_WMS_DESCRIPTION',
+  i18n: {
+    fr: {
+      Layers: {
+        POPULATION_DENSITY_WMS: 'Densité (WMS)',
+        POPULATION_DENSITY_WMS_DESCRIPTION: 'Densité de population (IGN)'
+      }
+    },
+    en: {
+      Layers: {
+        POPULATION_DENSITY_WMS: 'Density (WMS)',
+        POPULATION_DENSITY_WMS_DESCRIPTION: 'Population density (IGN)'
+      }
+    }
+  },
+  type: 'OverlayLayer',
+  attribution: '© <a href="https://ign.fr">IGN</a>',
+  tags: ['population'],
+  cesium: {
+    type: 'WebMapService',
+    url: 'https://wxs.ign.fr/economie/geoportail/r/wms',
+    layers: 'INSEE.FILOSOFI.POPULATION',
+    parameters: {
+      version: '1.3.0',
+      format: 'image/png',
+      transparent: true,
+      styles: 'INSEE'
+    },
+    isVisible: false
+  },
+  leaflet: {
+    type: 'tileLayer.wms',
+    source: 'https://wxs.ign.fr/economie/geoportail/r/wms',
+    layers: 'INSEE.FILOSOFI.POPULATION',
+    version: '1.3.0',
+    format: 'image/png',
+    transparent: true,
+    bgcolor: 'FFFFFFFF',
+    styles: 'INSEE',
+    opacity: 0.5,
+    isVisible: false
+  },
+  legendUrl: 'https://wxs.ign.fr/static/legends/INSEE.FILOSOFI.POPULATION-tot-legend-2017.png'
+}, {
+  name: 'Layers.AIRPORTS_WFS',
+  description: 'Layers.AIRPORTS_WFS_DESCRIPTION',
+  i18n: {
+    fr: {
+      Layers: {
+        AIRPORTS_WFS: 'Aérodromes (WFS)',
+        AIRPORTS_WFS_DESCRIPTION: 'Aérodromes (IGN)'
+      }
+    },
+    en: {
+      Layers: {
+        AIRPORTS_WFS: 'Airports (WFS)',
+        AIRPORTS_WFS_DESCRIPTION: 'Airports (IGN)'
+      }
+    }
+  },
+  type: 'OverlayLayer',
+  icon: 'las la-plane',
+  tags: ['administrative'],
+  bbox: [
+    -63.1537116941531,
+    -21.3898266619462,
+    55.8367758165235,
+    51.3150480097903
+  ],
+  featureId: 'toponyme',
+  wfs: {
+    url: 'https://wxs.ign.fr/cartovecto/geoportail/wfs',
+    version: '2.0.0',
+    searchParams: {},
+    outputFormat: 'json',
+    layer: 'BDCARTO_V5:aerodrome'
+  },
+  leaflet: {
+    type: 'geoJson',
+    realtime: true,
+    tiled: true,
+    minZoom: 10
+  },
+  cesium: {
+    type: 'geoJson',
+    realtime: true
+  }
+}]

You now should be able to see this after making some of the layers active:

ogc layers

Due to the possible large amount of vector data coming from the WFS the layer is configured with minZoom and tiled property so that data is only retrieved when zoom level exceed 10 for visible tiles only.

Using data files

Except by using the UI, there are two ways of adding data coming from a file based on configuration:

  1. serve and directly access the file over HTTP,
  2. ingest the file data into the database and access it using a built-in web service.

The second option is mandatory for large datasets or if you'd like to perform some filtering based on data feature properties. Accessing data stored in the database rely on the concept of FeathersJS service. As a consequence, the layer is usually associated with one (or more) source service where the data come from. Moreover, you should define a unique featureId on your features so that Kano can correctly separate and update data.

The data can be retrieved from a raw file with the fileName layer property or a remote file with the url layer property.

You should have a look to our detailed documentation for all possible styling options in 2D or 3D.

First copy the new layers file in the kano/api/config/layers directory. Then, add "REGIONS DEPARTMENTS" to your LAYERS_FILTER environment variable and launch Kano again to make some new layers appear in your custom catalog.

file-layers.cjs - Used to define additional layers using file data.
cjs
// Base URL to public files hosted in the docs
+const baseUrl = (process.env.NODE_ENV === 'development' ? 'http://localhost:8082' : 'https://kalisio.github.io/kano')
+
+module.exports = [{
+  name: 'Layers.REGIONS',
+  description: 'Layers.REGIONS_DESCRIPTION',
+  i18n: {
+    fr: {
+      Layers: {
+        REGIONS: 'Régions',
+        REGIONS_DESCRIPTION: 'Régions Françaises'
+      }
+    },
+    en: {
+      Layers: {
+        REGIONS: 'Regions',
+        REGIONS_DESCRIPTION: 'French regions'
+      }
+    }
+  },
+  tags: ['administrative'],
+  type: 'OverlayLayer',
+  featureId: 'code',
+  leaflet: {
+    type: 'geoJson',
+    source: \`\${baseUrl}/regions.geojson\`,
+    'stroke-color': 'blue',
+    'fill-opacity': 0,
+    popup: { pick: [] },
+    tooltip: {
+      template: '<b><%= properties.nom %></b>'
+    }
+  },
+  cesium: {
+    type: 'geoJson',
+    source: \`\${baseUrl}/regions.geojson\`,
+    'stroke-color': 'blue',
+    'fill-opacity': 0,
+    popup: { pick: [] },
+    tooltip: {
+      template: '<%= properties.nom %>'
+    }
+  }
+}, {
+  name: 'Layers.DEPARTMENTS',
+  description: 'Layers.DEPARTMENTS_DESCRIPTION',
+  i18n: {
+    fr: {
+      Layers: {
+        DEPARTMENTS: 'Départements',
+        DEPARTMENTS_DESCRIPTION: 'Départements Français'
+      }
+    },
+    en: {
+      Layers: {
+        DEPARTMENTS: 'Departments',
+        DEPARTMENTS_DESCRIPTION: 'French departments'
+      }
+    }
+  },
+  tags: ['administrative'],
+  type: 'OverlayLayer',
+  featureId: 'code',
+  service: 'airports',
+  probe: 'Airports',
+  url: \`\${baseUrl}/departments.geojson\`,
+  // Could also be a file path to a GeoJson or a gzipped GeoJson
+  //fileName: path.join(__dirname, '../../../docs/.vitepress/public/departements.geojson'),
+  leaflet: {
+    type: 'geoJson',
+    source: '/api/departments',
+    'stroke-color': 'red',
+    'fill-opacity': 0,
+    popup: { pick: [] },
+    tooltip: {
+      template: '<b><%= properties.nom %></b>'
+    }
+  },
+  cesium: {
+    type: 'geoJson',
+    source: '/api/departments',
+    'stroke-color': 'red',
+    'fill-opacity': 0,
+    popup: { pick: [] },
+    tooltip: {
+      template: '<%= properties.nom %>'
+    }
+  }
+}]

You now should be able to see a map highlighting some administrative boundaries in France:

file layers

If you have to ingest large datasets you should consider processing data using our ETL Krawler or ad-hoc processors. For instance, k-population ingest population data from a big GeoPackage into our database. You will find the associated layer definition in the built-in layers.

Time-varying data

One of the best feature of Kano is interactive visualisation, meaning that data can be updated in real-time according to user actions or data updates. A typical use case is the visualisation of time-varying spatial datasets. In this section we will use some data providing the number of hospitalizations by department in France during the COVID-19 (from 20-03-2020 to 20-04-2020) to perform such a visualisation.

In this example there is one GeoJson file per day. First extract the data files to the public folder exposed by Kano. Then copy the new layers file in the kano/api/config/layers directory. Last, add "COVID_19" to your LAYERS_FILTER environment variable and launch Kano again to make the new layers appear in your custom catalog.

covid-19-layers.cjs - Used to define additional time-varying layers based on file data.
cjs
// Base URL to public files hosted in the docs
+const baseUrl = (process.env.NODE_ENV === 'development' ? 'http://localhost:8082' : 'https://kalisio.github.io/kano')
+
+module.exports = [{
+  name: 'Layers.COVID_19',
+  description: 'Layers.COVID_19_DESCRIPTION',
+  i18n: {
+    fr: {
+      Layers: {
+        COVID_19: 'COVID-19',
+        COVID_19_DESCRIPTION: 'Hospitalisations par département'
+      }
+    },
+    en: {
+      Layers: {
+        COVID_19: 'COVID-19',
+        COVID_19_DESCRIPTION: 'Hospitalizations by department'
+      }
+    }
+  },
+  tags: ['health'],
+  icon: 'fas fa-atlas',
+  attribution: 'Santé Publique Fance / IGN / INSEE',
+  type: 'OverlayLayer',
+  featureId: 'code',
+  every: 'P1D',
+  leaflet: {
+    type: 'geoJson',
+    realtime: true,
+    sourceTemplate: \`\${baseUrl}/covid-19/hospitalisations-departements-<%= time.format('YYYY-MM-DD') %>.json\`,
+    stroke: '#fee8c8',
+    'stroke-width': 2,
+    'stroke-opacity': 0.5,
+    'fill-opacity': 0.5,
+    'fill-color': '<%= chroma.scale(\\'OrRd\\').domain([0,50])(properties.taux).hex() %>',
+    template: ['fill-color'],
+    tooltip: {
+      template: '<b><%= properties.nom %>: <%= properties.hospitalisations %> hospitalisations</b>',
+      options: {
+        opacity: 0.8,
+        direction: 'top'
+      }
+    }
+  },
+  cesium: {
+    type: 'geoJson',
+    realtime: true,
+    sourceTemplate: \`\${baseUrl}/covid-19/hospitalisations-departements-<%= time.format('YYYY-MM-DD') %>.json\`,
+    entityStyle: {
+      polygon: {
+        outline: false,
+        extrudedHeight: '<%= 1000 * properties.taux %>',
+        material: {
+          type: 'Cesium.ColorMaterialProperty',
+          options: {
+            type: 'Cesium.Color.fromCssColorString',
+            options: '<%= chroma.scale(\\'OrRd\\').domain([0,50])(properties.taux).css() %>'
+          }
+        }
+      },
+      template: ['polygon.extrudedHeight', 'polygon.material.options.options']
+    },
+    tooltip: {
+      template: '<%= properties.nom %>: <%= properties.hospitalisations %> hospitalisations'
+    }
+  }
+}]

Using the bottom timeline, navigate to some dates within the data time range, you now should be able to see a choropleth map highlighting the number of hospitalizations for each date:

covid-19 layers

You can even do the same using the 3D activity:

covid-19 layers in 3D

Using the API

The Kano API is particularly useful to update data continuously, a typical use case is data coming from network sensors performing measurements on the ground.

WARNING

You should use the local.cjs configuration file as stated in the installation section to setup a user account with appropriate rights (i.e. write acces to the API).

The different service endpoints of Kano can be accessed using REST as the most universal interface or using WebSockets if required (typically for complex queries or performance issue). The access to the endpoints are protected using a JWT (i.e. token), it must be defined using the Authorization header (Bearer token) in the request header for REST.

For instance using CURL you will send a request to the API like this (the body of the request being in the data.json file):

bash
SET TOKEN="xxx"
+
+curl -X POST -H "Authorization: Bearer %TOKEN%" ^
+     -H "Content-Type: application/json" ^
+     -d @data.json ^
+     https://kano.dev.kalisio.xyz/api/service

Detailed information about the concepts and the data model behind our feature services can be found in the KDK documentation, although focused on how to retrieve the data.

To push a new station the body of the request will be a GeoJson feature like this:

js
{
+  "properties": {
+    "id": "174412d9e-f230-4127-af36-75654e265f56",
+    "name": "Station 1"
+  },
+  "geometry": {
+    "type": "Point",
+    "coordinates": [
+      1.5059948323127268
+      43.547168883180966,
+      0
+    ]
+  },
+  "type": "Feature"
+}

To push a new measure of the station the body of the request will be (a) GeoJson feature(s) like this:

js
// Single or multiple measures can be sent at once
+[{
+  "time": "2023-04-28T16:00:00",
+  "properties": {
+    "id": "174412d9e-f230-4127-af36-75654e265f56",
+    "value": 24,
+    "status": "OK"
+  },
+  "geometry": {
+    "type": "Point",
+    "coordinates": [
+      1.5059948323127268
+      43.547168883180966,
+      0
+    ]
+  },
+  "type": "Feature"
+}, ...]

First copy the new layers file in the kano/api/config/layers directory. Then, add "SENSORS" to your LAYERS_FILTER environment variable and launch Kano again to make the new layers appear in your custom catalog.

sensors-layers.cjs - Used to define additional sensors layers based on API data feeding.
cjs
module.exports = [{
+  name: 'Layers.SENSORS',
+  description: 'Layers.SENSORS_DESCRIPTION',
+  i18n: {
+    fr: {
+      Layers: {
+        SENSORS: 'Capteurs',
+        SENSORS_DESCRIPTION: 'Réseau de capteurs'
+      },
+      Variables: {
+        TEMPERATURE: 'Température'
+      }
+    },
+    en: {
+      Layers: {
+        SENSORS: 'Sensors',
+        SENSORS_DESCRIPTION: 'Sensors network'
+      },
+      Variables: {
+        TEMPERATURE: 'Temperature'
+      }
+    }
+  },
+  tags: ['sensors'],
+  type: 'OverlayLayer',
+  service: 'sensors-observations',
+  probeService: 'sensors-stations',
+  ttl: 7 * 24 * 60 * 60,
+  featureId: 'id',
+  featureLabel: 'name',
+  from: 'P-7D',
+  to: 'PT-1M',
+  every: 'PT10M',
+  queryFrom: 'PT-1H',
+  variables: [
+    {
+      name: 'temperature',
+      label: 'Variables.TEMPERATURE',
+      units: ['degC'],
+      range: [-50, 127],
+      step: 5,
+      chartjs: {
+        backgroundColor: 'rgba(255, 99, 132, 128)',
+        borderColor: 'rgb(255, 99, 132)',
+        fill: false
+      }
+    }
+  ],
+  leaflet: {
+    type: 'geoJson',
+    realtime: true,
+    tiled: true,
+    cluster: { disableClusteringAtZoom: 18 },
+    'marker-color': \`<% if (properties.status === 'OK') { %>green<% }
+                        else { %>red<% } %>\`,
+    'icon-classes': 'fa fa-wifi',
+    'icon-x-offset': -2,
+    'icon-color': '#FFF',
+    template: ['marker-color'],
+    tooltip: {
+      template: '<%= properties.name %>: <%= properties.temperature %>°C'
+    }
+  },
+  cesium: {
+    type: 'geoJson',
+    realtime: true,
+    cluster: { pixelRange: 50 },
+    'marker-symbol': 'lighthouse',
+    'marker-color': '#180EF1',
+    tooltip: {
+      template: '<%= properties.name %>: <%= properties.temperature %>°C'
+    }
+  }
+}]

Now, feed the API using the provided data in the public folder of the documentation:

curl -X POST -H "Authorization: Bearer %TOKEN%" -H "Content-Type: application/json" ^
+     -d @stations-data.json https://your.kano.domain/api/sensors-stations
+curl -X POST -H "Authorization: Bearer %TOKEN%" -H "Content-Type: application/json" ^
+     -d @observations-data.json https://your.kano.domain/api/sensors-observations

TIP

For testing purpose you can get a valid token from the local storage in the developer tool after logged into Kano.

Using the bottom timeline, navigate to a date/time with existing sensor data, you now should be able to see your sensor on the map, selecting it should open the value timeseries:

sensors layers

A data layer can contain multiple time-varying elements called variables. The features may contain additional properties, e.g. a status (OK/NOK), a name, etc. that can be used to customize the rendering, e.g. icon, color, tooltip, etc.

The main configuration options are the following:

  • the property that will be use to uniquely identify a station (i.e. ID)
  • the refresh rate of the data in the layer (used to automatically update the view every N seconds in Kano)
  • the life time of a measure, i.e. if no measure found within the range current time - life time the station is not considered to have performed any measure for current time
  • the list of the variables contained in the data with associated properties to ease timeseries display (unit, range, color, ...)

TIP

A layer can have no fixed stations but only measurements from sensors in order to display moving data

Customizing the catalog legend

To be completed

',66),h=[c];function d(g,u,k,y,m,E){return n(),a("div",null,h)}const S=s(r,[["render",d]]);export{b as __pageData,S as default}; diff --git a/assets/guides_customizing-kano.md.8nbTGQ9l.lean.js b/assets/guides_customizing-kano.md.8nbTGQ9l.lean.js new file mode 100644 index 00000000..f2507b0a --- /dev/null +++ b/assets/guides_customizing-kano.md.8nbTGQ9l.lean.js @@ -0,0 +1,496 @@ +import{_ as s,c as a,o as n,V as p}from"./chunks/framework.J61Sinzt.js";const e="/kano/assets/kano-ogc-layers.mPkXU--y.png",i="/kano/assets/kano-file-layers.VfIDpJM5.png",l="/kano/assets/kano-covid-19-layers.4K62qXY-.png",t="/kano/assets/kano-covid-19-layers-3D.AY8QJGYX.png",o="/kano/assets/kano-sensors-layers.1fWLR23M.png",b=JSON.parse('{"title":"Customizing Kano","description":"","frontmatter":{"sidebarDepth":3},"headers":[],"relativePath":"guides/customizing-kano.md","filePath":"guides/customizing-kano.md"}'),r={name:"guides/customizing-kano.md"},c=p(`

Customizing Kano

This section details different approaches to integrate your own data to your Kano instance. Although you can directly use the Kano UI to add your own data layers this section provide details to do this by configuration or programmatically. When added through the UI, the different layers will be visible in the My data tab of the catalog panel, while the default built-in layers will appear in the Catalog tab of the catalog panel. You can also manage the categories (i.e. catalog sections) hosting the layers from the UI or the configuration.

Although names and descriptions can be hard-coded in the target user language, Kano supports internationalization through a nested structure organized by locale like this:

js
{
+	name: 'Categories.POPULATION_LAYERS',
+  i18n: {
+    fr: { Categories: { POPULATION_LAYERS: 'Population' } },
+    en: { Categories: { POPULATION_LAYERS: 'Population' } },
+    ...
+  }
+}

Note that the name property is used a unique identifier for categories and layers

Customizing the catalog

You can add your own categories in the catalog by defining it in additional files to be put in the kano/api/config/categories directory. Kano will glob all files within this directory and add categories accordingly, only matching by name those in the CATEGORIES_FILTER (comma-separated list of category names) environment variable, if any. Categories are simple objects with a name, a description and an icon from a standard icon set among Material Icons, Font Awesome, or Line Awesome.

my-categories.cjs - Used to define additional categories.
cjs
module.exports = [{
+  name: 'Categories.OSM_LAYERS',
+  i18n: {
+    fr: {
+      Categories: {
+        OSM_LAYERS: 'OpenStreetMap'
+      }
+    },
+    en: {
+      Categories: {
+        OSM_LAYERS: 'OpenStreetMap'
+      }
+    }
+  },
+  icon: 'las la-map',
+  options: { exclusive: true, filter: { type: 'BaseLayer', tags: { $in: ['osm'] } } }
+}, {
+  name: 'Categories.POPULATION_LAYERS',
+  i18n: {
+    fr: {
+      Categories: {
+        POPULATION_LAYERS: 'Population'
+      }
+    },
+    en: {
+      Categories: {
+        POPULATION_LAYERS: 'Population'
+      }
+    }
+  },
+  icon: 'las la-users',
+  options: { exclusive: false, filter: { type: 'OverlayLayer', tags: { $in: ['population'] } } }
+}]

Layers that will be added in a given category depends on the filter property content, which defines a sift filter applied to the layers list. Although any filter can be used, a tags property containing an array of relevent tags is often used by convention.

Customizing the catalog data

You can add your own layers in the catalog by defining it in additional files to be put in the kano/api/config/layers directory. Kano will glob all files within this directory and add layers accordingly, only matching by name those in the LAYERS_FILTER (comma-separated list of layer names) environment variable by default (set it to * to remove filtering). Layers are simple objects with a name, a description, a type, an attribution, and additional configuration options related to the underlying mapping engine: Leaflet for 2D rendering and Cesium for 3D rendering. More details about these options can be found in the documentation of the KDK powering Kano.

Please refer to the built-in kano/api/config/layers directory for various examples of what is possible to do with Kano.

We will start with a really simple example by adding two different map backgrounds based on OpenStreetMap data to your Kano instance. First ensure you copied the categories and layers files in their respective directories in kano/api/config. Then, set CATEGORIES_FILTER="OSM_LAYERS POPULATION_LAYERS" and LAYERS_FILTER="OSM OSM_CYCLE" in your environment. Last, launch Kano to make the layers appear in your custom catalog.

osm-layers.cjs - Used to define base layers with OpenStreetMap data.
cjs
module.exports = [{
+  name: 'Layers.OSM',
+  description: 'Layers.OSM_DESCRIPTION',
+  i18n: {
+    fr: {
+      Layers: {
+        OSM: 'OpenStreeMap',
+        OSM_DESCRIPTION: 'Données OpenStreetMap'
+      }
+    },
+    en: {
+      Layers: {
+        OSM: 'OpenStreeMap',
+        OSM_DESCRIPTION: 'OpenStreeMap data'
+      }
+    }
+  },
+  tags: ['osm'],
+  attribution: 'OpenStreetMap © <a href="http://openstreetmap.org">OpenStreetMap</a> contributors',
+  type: 'BaseLayer',
+  leaflet: {
+    type: 'tileLayer',
+    isVisible: true,
+    source: 'http://{s}.tile.osm.org/{z}/{x}/{y}.png',
+    maxZoom: 21,
+    maxNativeZoom: 18
+  },
+  cesium: {
+    type: 'OpenStreetMap',
+    isVisible: true,
+    url: \`http://a.tile.osm.org\`
+  }
+}, {
+  name: 'Layers.OSM_CYCLE',
+  description: 'Layers.OSM_CYCLE_DESCRIPTION',
+  i18n: {
+    fr: {
+      Layers: {
+        OSM_CYCLE: 'OpenCycleMap',
+        OSM_CYCLE_DESCRIPTION: 'Données OpenCycleMap'
+      }
+    },
+    en: {
+      Layers: {
+        OSM_CYCLE: 'OpenCycleMap',
+        OSM_CYCLE_DESCRIPTION: 'OpenCycleMap data'
+      }
+    }
+  },
+  attribution: 'OpenStreetMap © <a href="https://www.opencyclemap.org/">OpenCycleMap</a> contributors',
+  type: 'BaseLayer',
+  tags: ['osm'],
+  leaflet: {
+    type: 'tileLayer',
+    isVisible: false,
+    source: 'http://{s}.tile.thunderforest.com/cycle/{z}/{x}/{y}.png',
+    maxZoom: 21,
+    maxNativeZoom: 18
+  },
+  cesium: {
+    type: 'OpenStreetMap',
+    url: \`http://a.tile.thunderforest.com/cycle\`,
+    isVisible: false
+  }
+}]

Except for raster data, vector data are always converted to GeoJson upfront or as a rendering preprocessing phase in Kano.

Using OGC standards

OGC Web Services (OWS) are the OGC standards that use the internet to view, edit, manage and share geospatial data. You can notably use the following standards in Kano:

  • Web Map Services (WMS)
  • Web Map Tile Service (WMTS)
  • Tile Map Service (TMS)
  • Web Feature Service (WFS)
  • Web Coverage Service (WCS)

In this section we will use OGC web services of the French geographical institute (IGN). First copy the new layers file in the kano/api/config/layers directory. Then, add "POPULATION_DENSITY_WMTS POPULATION_DENSITY_WMS AIRPORTS_WFS" to your LAYERS_FILTER environment variable and launch Kano again to make the new layers appear in your custom catalog.

ogc-layers.cjs - Used to define additional layers using different protocols like WMTS, WMS and WFS.
cjs
module.exports = [{
+  name: 'Layers.POPULATION_DENSITY_WMTS',
+  description: 'Layers.POPULATION_DENSITY_WMTS_DESCRIPTION',
+  i18n: {
+    fr: {
+      Layers: {
+        POPULATION_DENSITY_WMTS: 'Densité (WMTS)',
+        POPULATION_DENSITY_WMTS_DESCRIPTION: 'Densité de population (IGN)'
+      }
+    },
+    en: {
+      Layers: {
+        POPULATION_DENSITY_WMTS: 'Density (WMTS)',
+        POPULATION_DENSITY_WMTS_DESCRIPTION: 'Population density (IGN)'
+      }
+    }
+  },
+  type: 'OverlayLayer',
+  attribution: '© <a href="https://ign.fr">IGN</a>',
+  tags: ['population'],
+  cesium: {
+    type: 'WebMapTileService',
+    url: 'https://wxs.ign.fr/economie/geoportail/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=INSEE.FILOSOFI.POPULATION&STYLE=INSEE&FORMAT=image/png&TILEMATRIXSET=PM&TILEMATRIX={TileMatrix}&TILEROW={TileRow}&TILECOL={TileCol}',
+    format: 'image/png',
+    layer: 'INSEE.FILOSOFI.POPULATION',
+    style: 'INSEE',
+    tileMatrixSetID: 'PM',
+    isVisible: false
+  },
+  leaflet: {
+    type: 'tileLayer',
+    source: 'https://wxs.ign.fr/economie/geoportail/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=INSEE.FILOSOFI.POPULATION&STYLE=INSEE&FORMAT=image/png&TILEMATRIXSET=PM&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}',
+    bounds: [ [40, -5], [50, 10] ],
+    opacity: 0.5,
+    isVisible: false
+  },
+  legendUrl: 'https://wxs.ign.fr/static/legends/INSEE.FILOSOFI.POPULATION-tot-legend-2017.png'
+}, {
+  name: 'Layers.POPULATION_DENSITY_WMS',
+  description: 'Layers.POPULATION_DENSITY_WMS_DESCRIPTION',
+  i18n: {
+    fr: {
+      Layers: {
+        POPULATION_DENSITY_WMS: 'Densité (WMS)',
+        POPULATION_DENSITY_WMS_DESCRIPTION: 'Densité de population (IGN)'
+      }
+    },
+    en: {
+      Layers: {
+        POPULATION_DENSITY_WMS: 'Density (WMS)',
+        POPULATION_DENSITY_WMS_DESCRIPTION: 'Population density (IGN)'
+      }
+    }
+  },
+  type: 'OverlayLayer',
+  attribution: '© <a href="https://ign.fr">IGN</a>',
+  tags: ['population'],
+  cesium: {
+    type: 'WebMapService',
+    url: 'https://wxs.ign.fr/economie/geoportail/r/wms',
+    layers: 'INSEE.FILOSOFI.POPULATION',
+    parameters: {
+      version: '1.3.0',
+      format: 'image/png',
+      transparent: true,
+      styles: 'INSEE'
+    },
+    isVisible: false
+  },
+  leaflet: {
+    type: 'tileLayer.wms',
+    source: 'https://wxs.ign.fr/economie/geoportail/r/wms',
+    layers: 'INSEE.FILOSOFI.POPULATION',
+    version: '1.3.0',
+    format: 'image/png',
+    transparent: true,
+    bgcolor: 'FFFFFFFF',
+    styles: 'INSEE',
+    opacity: 0.5,
+    isVisible: false
+  },
+  legendUrl: 'https://wxs.ign.fr/static/legends/INSEE.FILOSOFI.POPULATION-tot-legend-2017.png'
+}, {
+  name: 'Layers.AIRPORTS_WFS',
+  description: 'Layers.AIRPORTS_WFS_DESCRIPTION',
+  i18n: {
+    fr: {
+      Layers: {
+        AIRPORTS_WFS: 'Aérodromes (WFS)',
+        AIRPORTS_WFS_DESCRIPTION: 'Aérodromes (IGN)'
+      }
+    },
+    en: {
+      Layers: {
+        AIRPORTS_WFS: 'Airports (WFS)',
+        AIRPORTS_WFS_DESCRIPTION: 'Airports (IGN)'
+      }
+    }
+  },
+  type: 'OverlayLayer',
+  icon: 'las la-plane',
+  tags: ['administrative'],
+  bbox: [
+    -63.1537116941531,
+    -21.3898266619462,
+    55.8367758165235,
+    51.3150480097903
+  ],
+  featureId: 'toponyme',
+  wfs: {
+    url: 'https://wxs.ign.fr/cartovecto/geoportail/wfs',
+    version: '2.0.0',
+    searchParams: {},
+    outputFormat: 'json',
+    layer: 'BDCARTO_V5:aerodrome'
+  },
+  leaflet: {
+    type: 'geoJson',
+    realtime: true,
+    tiled: true,
+    minZoom: 10
+  },
+  cesium: {
+    type: 'geoJson',
+    realtime: true
+  }
+}]

You now should be able to see this after making some of the layers active:

ogc layers

Due to the possible large amount of vector data coming from the WFS the layer is configured with minZoom and tiled property so that data is only retrieved when zoom level exceed 10 for visible tiles only.

Using data files

Except by using the UI, there are two ways of adding data coming from a file based on configuration:

  1. serve and directly access the file over HTTP,
  2. ingest the file data into the database and access it using a built-in web service.

The second option is mandatory for large datasets or if you'd like to perform some filtering based on data feature properties. Accessing data stored in the database rely on the concept of FeathersJS service. As a consequence, the layer is usually associated with one (or more) source service where the data come from. Moreover, you should define a unique featureId on your features so that Kano can correctly separate and update data.

The data can be retrieved from a raw file with the fileName layer property or a remote file with the url layer property.

You should have a look to our detailed documentation for all possible styling options in 2D or 3D.

First copy the new layers file in the kano/api/config/layers directory. Then, add "REGIONS DEPARTMENTS" to your LAYERS_FILTER environment variable and launch Kano again to make some new layers appear in your custom catalog.

file-layers.cjs - Used to define additional layers using file data.
cjs
// Base URL to public files hosted in the docs
+const baseUrl = (process.env.NODE_ENV === 'development' ? 'http://localhost:8082' : 'https://kalisio.github.io/kano')
+
+module.exports = [{
+  name: 'Layers.REGIONS',
+  description: 'Layers.REGIONS_DESCRIPTION',
+  i18n: {
+    fr: {
+      Layers: {
+        REGIONS: 'Régions',
+        REGIONS_DESCRIPTION: 'Régions Françaises'
+      }
+    },
+    en: {
+      Layers: {
+        REGIONS: 'Regions',
+        REGIONS_DESCRIPTION: 'French regions'
+      }
+    }
+  },
+  tags: ['administrative'],
+  type: 'OverlayLayer',
+  featureId: 'code',
+  leaflet: {
+    type: 'geoJson',
+    source: \`\${baseUrl}/regions.geojson\`,
+    'stroke-color': 'blue',
+    'fill-opacity': 0,
+    popup: { pick: [] },
+    tooltip: {
+      template: '<b><%= properties.nom %></b>'
+    }
+  },
+  cesium: {
+    type: 'geoJson',
+    source: \`\${baseUrl}/regions.geojson\`,
+    'stroke-color': 'blue',
+    'fill-opacity': 0,
+    popup: { pick: [] },
+    tooltip: {
+      template: '<%= properties.nom %>'
+    }
+  }
+}, {
+  name: 'Layers.DEPARTMENTS',
+  description: 'Layers.DEPARTMENTS_DESCRIPTION',
+  i18n: {
+    fr: {
+      Layers: {
+        DEPARTMENTS: 'Départements',
+        DEPARTMENTS_DESCRIPTION: 'Départements Français'
+      }
+    },
+    en: {
+      Layers: {
+        DEPARTMENTS: 'Departments',
+        DEPARTMENTS_DESCRIPTION: 'French departments'
+      }
+    }
+  },
+  tags: ['administrative'],
+  type: 'OverlayLayer',
+  featureId: 'code',
+  service: 'airports',
+  probe: 'Airports',
+  url: \`\${baseUrl}/departments.geojson\`,
+  // Could also be a file path to a GeoJson or a gzipped GeoJson
+  //fileName: path.join(__dirname, '../../../docs/.vitepress/public/departements.geojson'),
+  leaflet: {
+    type: 'geoJson',
+    source: '/api/departments',
+    'stroke-color': 'red',
+    'fill-opacity': 0,
+    popup: { pick: [] },
+    tooltip: {
+      template: '<b><%= properties.nom %></b>'
+    }
+  },
+  cesium: {
+    type: 'geoJson',
+    source: '/api/departments',
+    'stroke-color': 'red',
+    'fill-opacity': 0,
+    popup: { pick: [] },
+    tooltip: {
+      template: '<%= properties.nom %>'
+    }
+  }
+}]

You now should be able to see a map highlighting some administrative boundaries in France:

file layers

If you have to ingest large datasets you should consider processing data using our ETL Krawler or ad-hoc processors. For instance, k-population ingest population data from a big GeoPackage into our database. You will find the associated layer definition in the built-in layers.

Time-varying data

One of the best feature of Kano is interactive visualisation, meaning that data can be updated in real-time according to user actions or data updates. A typical use case is the visualisation of time-varying spatial datasets. In this section we will use some data providing the number of hospitalizations by department in France during the COVID-19 (from 20-03-2020 to 20-04-2020) to perform such a visualisation.

In this example there is one GeoJson file per day. First extract the data files to the public folder exposed by Kano. Then copy the new layers file in the kano/api/config/layers directory. Last, add "COVID_19" to your LAYERS_FILTER environment variable and launch Kano again to make the new layers appear in your custom catalog.

covid-19-layers.cjs - Used to define additional time-varying layers based on file data.
cjs
// Base URL to public files hosted in the docs
+const baseUrl = (process.env.NODE_ENV === 'development' ? 'http://localhost:8082' : 'https://kalisio.github.io/kano')
+
+module.exports = [{
+  name: 'Layers.COVID_19',
+  description: 'Layers.COVID_19_DESCRIPTION',
+  i18n: {
+    fr: {
+      Layers: {
+        COVID_19: 'COVID-19',
+        COVID_19_DESCRIPTION: 'Hospitalisations par département'
+      }
+    },
+    en: {
+      Layers: {
+        COVID_19: 'COVID-19',
+        COVID_19_DESCRIPTION: 'Hospitalizations by department'
+      }
+    }
+  },
+  tags: ['health'],
+  icon: 'fas fa-atlas',
+  attribution: 'Santé Publique Fance / IGN / INSEE',
+  type: 'OverlayLayer',
+  featureId: 'code',
+  every: 'P1D',
+  leaflet: {
+    type: 'geoJson',
+    realtime: true,
+    sourceTemplate: \`\${baseUrl}/covid-19/hospitalisations-departements-<%= time.format('YYYY-MM-DD') %>.json\`,
+    stroke: '#fee8c8',
+    'stroke-width': 2,
+    'stroke-opacity': 0.5,
+    'fill-opacity': 0.5,
+    'fill-color': '<%= chroma.scale(\\'OrRd\\').domain([0,50])(properties.taux).hex() %>',
+    template: ['fill-color'],
+    tooltip: {
+      template: '<b><%= properties.nom %>: <%= properties.hospitalisations %> hospitalisations</b>',
+      options: {
+        opacity: 0.8,
+        direction: 'top'
+      }
+    }
+  },
+  cesium: {
+    type: 'geoJson',
+    realtime: true,
+    sourceTemplate: \`\${baseUrl}/covid-19/hospitalisations-departements-<%= time.format('YYYY-MM-DD') %>.json\`,
+    entityStyle: {
+      polygon: {
+        outline: false,
+        extrudedHeight: '<%= 1000 * properties.taux %>',
+        material: {
+          type: 'Cesium.ColorMaterialProperty',
+          options: {
+            type: 'Cesium.Color.fromCssColorString',
+            options: '<%= chroma.scale(\\'OrRd\\').domain([0,50])(properties.taux).css() %>'
+          }
+        }
+      },
+      template: ['polygon.extrudedHeight', 'polygon.material.options.options']
+    },
+    tooltip: {
+      template: '<%= properties.nom %>: <%= properties.hospitalisations %> hospitalisations'
+    }
+  }
+}]

Using the bottom timeline, navigate to some dates within the data time range, you now should be able to see a choropleth map highlighting the number of hospitalizations for each date:

covid-19 layers

You can even do the same using the 3D activity:

covid-19 layers in 3D

Using the API

The Kano API is particularly useful to update data continuously, a typical use case is data coming from network sensors performing measurements on the ground.

WARNING

You should use the local.cjs configuration file as stated in the installation section to setup a user account with appropriate rights (i.e. write acces to the API).

The different service endpoints of Kano can be accessed using REST as the most universal interface or using WebSockets if required (typically for complex queries or performance issue). The access to the endpoints are protected using a JWT (i.e. token), it must be defined using the Authorization header (Bearer token) in the request header for REST.

For instance using CURL you will send a request to the API like this (the body of the request being in the data.json file):

bash
SET TOKEN="xxx"
+
+curl -X POST -H "Authorization: Bearer %TOKEN%" ^
+     -H "Content-Type: application/json" ^
+     -d @data.json ^
+     https://kano.dev.kalisio.xyz/api/service

Detailed information about the concepts and the data model behind our feature services can be found in the KDK documentation, although focused on how to retrieve the data.

To push a new station the body of the request will be a GeoJson feature like this:

js
{
+  "properties": {
+    "id": "174412d9e-f230-4127-af36-75654e265f56",
+    "name": "Station 1"
+  },
+  "geometry": {
+    "type": "Point",
+    "coordinates": [
+      1.5059948323127268
+      43.547168883180966,
+      0
+    ]
+  },
+  "type": "Feature"
+}

To push a new measure of the station the body of the request will be (a) GeoJson feature(s) like this:

js
// Single or multiple measures can be sent at once
+[{
+  "time": "2023-04-28T16:00:00",
+  "properties": {
+    "id": "174412d9e-f230-4127-af36-75654e265f56",
+    "value": 24,
+    "status": "OK"
+  },
+  "geometry": {
+    "type": "Point",
+    "coordinates": [
+      1.5059948323127268
+      43.547168883180966,
+      0
+    ]
+  },
+  "type": "Feature"
+}, ...]

First copy the new layers file in the kano/api/config/layers directory. Then, add "SENSORS" to your LAYERS_FILTER environment variable and launch Kano again to make the new layers appear in your custom catalog.

sensors-layers.cjs - Used to define additional sensors layers based on API data feeding.
cjs
module.exports = [{
+  name: 'Layers.SENSORS',
+  description: 'Layers.SENSORS_DESCRIPTION',
+  i18n: {
+    fr: {
+      Layers: {
+        SENSORS: 'Capteurs',
+        SENSORS_DESCRIPTION: 'Réseau de capteurs'
+      },
+      Variables: {
+        TEMPERATURE: 'Température'
+      }
+    },
+    en: {
+      Layers: {
+        SENSORS: 'Sensors',
+        SENSORS_DESCRIPTION: 'Sensors network'
+      },
+      Variables: {
+        TEMPERATURE: 'Temperature'
+      }
+    }
+  },
+  tags: ['sensors'],
+  type: 'OverlayLayer',
+  service: 'sensors-observations',
+  probeService: 'sensors-stations',
+  ttl: 7 * 24 * 60 * 60,
+  featureId: 'id',
+  featureLabel: 'name',
+  from: 'P-7D',
+  to: 'PT-1M',
+  every: 'PT10M',
+  queryFrom: 'PT-1H',
+  variables: [
+    {
+      name: 'temperature',
+      label: 'Variables.TEMPERATURE',
+      units: ['degC'],
+      range: [-50, 127],
+      step: 5,
+      chartjs: {
+        backgroundColor: 'rgba(255, 99, 132, 128)',
+        borderColor: 'rgb(255, 99, 132)',
+        fill: false
+      }
+    }
+  ],
+  leaflet: {
+    type: 'geoJson',
+    realtime: true,
+    tiled: true,
+    cluster: { disableClusteringAtZoom: 18 },
+    'marker-color': \`<% if (properties.status === 'OK') { %>green<% }
+                        else { %>red<% } %>\`,
+    'icon-classes': 'fa fa-wifi',
+    'icon-x-offset': -2,
+    'icon-color': '#FFF',
+    template: ['marker-color'],
+    tooltip: {
+      template: '<%= properties.name %>: <%= properties.temperature %>°C'
+    }
+  },
+  cesium: {
+    type: 'geoJson',
+    realtime: true,
+    cluster: { pixelRange: 50 },
+    'marker-symbol': 'lighthouse',
+    'marker-color': '#180EF1',
+    tooltip: {
+      template: '<%= properties.name %>: <%= properties.temperature %>°C'
+    }
+  }
+}]

Now, feed the API using the provided data in the public folder of the documentation:

curl -X POST -H "Authorization: Bearer %TOKEN%" -H "Content-Type: application/json" ^
+     -d @stations-data.json https://your.kano.domain/api/sensors-stations
+curl -X POST -H "Authorization: Bearer %TOKEN%" -H "Content-Type: application/json" ^
+     -d @observations-data.json https://your.kano.domain/api/sensors-observations

TIP

For testing purpose you can get a valid token from the local storage in the developer tool after logged into Kano.

Using the bottom timeline, navigate to a date/time with existing sensor data, you now should be able to see your sensor on the map, selecting it should open the value timeseries:

sensors layers

A data layer can contain multiple time-varying elements called variables. The features may contain additional properties, e.g. a status (OK/NOK), a name, etc. that can be used to customize the rendering, e.g. icon, color, tooltip, etc.

The main configuration options are the following:

  • the property that will be use to uniquely identify a station (i.e. ID)
  • the refresh rate of the data in the layer (used to automatically update the view every N seconds in Kano)
  • the life time of a measure, i.e. if no measure found within the range current time - life time the station is not considered to have performed any measure for current time
  • the list of the variables contained in the data with associated properties to ease timeseries display (unit, range, color, ...)

TIP

A layer can have no fixed stations but only measurements from sensors in order to display moving data

Customizing the catalog legend

To be completed

',66),h=[c];function d(g,u,k,y,m,E){return n(),a("div",null,h)}const S=s(r,[["render",d]]);export{b as __pageData,S as default}; diff --git a/assets/guides_getting-started.md.61515a0f.js b/assets/guides_getting-started.md.2GOoH2nF.js similarity index 97% rename from assets/guides_getting-started.md.61515a0f.js rename to assets/guides_getting-started.md.2GOoH2nF.js index c1029f55..73e40acc 100644 --- a/assets/guides_getting-started.md.61515a0f.js +++ b/assets/guides_getting-started.md.2GOoH2nF.js @@ -1 +1 @@ -import{_ as a,o as e,c as t,Q as i}from"./chunks/framework.f7d371db.js";const l="/kano/assets/kano-tour.5df9bce8.png",f=JSON.parse('{"title":"Getting Started","description":"","frontmatter":{"sidebarDepth":3},"headers":[],"relativePath":"guides/getting-started.md","filePath":"guides/getting-started.md"}'),o={name:"guides/getting-started.md"},s=i('

Getting Started

Kano comes with small tutorials (a.k.a. tours) that can be directly run on the application in order to understand how its internal components can be used. You will first have to connect to make everything works as expected.

Then, you can launch the main tutorial directly from the main menu through the following icon . Follow the step by step guide , go back if required and stop anytime as illustrated by the following figure:

tour

From the main tutorial you can open others tutorials dedicated to specific components (like e.g. the navigation bar) whenever you see the icon.

WARNING

Kano look and features are ever-evolving, moreover it can be configured according to your specific use case. As a consequence, your screen probably looks a little different than what you can read and see in this documentation but the key concepts remain the same.

The main menu allows to open the documentation, manage your settings and logout from Kano.

👉 Launch the main tutorial from the main menu then open the link to the main menu tutorial to get more details

Application bar

The application bar allows to quickly execute recurring actions:

  • switch from 2D (respectively 3D) activity to 3D (respectively 2D) activity,
  • center the view on your current location and display it,
  • seek for an address,
  • manage your favorite views,
  • tools to e.g. display the coordinates of a location,
  • switch to fullscreen mode.

👉 Launch the main tutorial from the main menu then open the link to the navigation bar tutorial to get more details

Catalog

The catalog allows to manage the layers displayed on your view. You can show/hide a layer by selecting it in the relevant category.

WARNING

The data of some layers are only visible starting from a given scale if there is too much data to ensure a readable and smvisualisation.

In this case the layer will be disable until you reach the required scale on the map (zoom in or zoom to the layer to do so).

Using the menu on a layer you can access available actions for this layer.

👉 Launch the main tutorial from the main menu then open the link to the catalog tutorial to get more details

Timeline

The timeline allows to quickly execute actions related to the time of the displayed data. Stick to real-time or go forward/backward in time as you wish.

👉 Launch the main tutorial from the main menu then open the link to the timeline tutorial to get more details

Floating action button

Using the FAB at the bottom right corner you can:

  • Create a new blank data layer:
    • By connecting to web mapping services using OGC standards (WMS, WFS, TMS, WMTS).
    • By locating and drawing the underlying entities. You can add the data schema from a JSON schema file in order to edit the meatadata (i.e. properties) of your entities.
    • By import existing data from a GeoJSON file.
  • Probe weather forecast data from active prediction models by selecting a specific location on the map.

👉 Launch the main tutorial from the main menu then open the link to the FAB tutorial to get more details

Contextual menu

A right-click on a feature of the map will display a contextual menu if some actions are available for the target element like editing the properties of a user-defined feature or remove it.

Layer actions

Depending on the layer different actions are available. The most common action is to zoom to the layer in order to fit the view on the available data. If the layer is disabled at high scales this action will set the current scale of the map so that data will start be visible if the layer is shown.

More actions are available on user-defined feature layers:

  • save the layer (i.e. make it persistent),
  • edit layer properties like its name or description,
  • edit layer features (metadata and geometry),
  • edit display style,
  • filter data according to metadata,
  • display raw data,
  • create charts,
  • delete the layer.
',31),n=[s];function r(c,h,d,u,m,p){return e(),t("div",null,n)}const y=a(o,[["render",r]]);export{f as __pageData,y as default}; +import{_ as a,c as e,o as t,V as i}from"./chunks/framework.J61Sinzt.js";const l="/kano/assets/kano-tour.7bUQfDzL.png",f=JSON.parse('{"title":"Getting Started","description":"","frontmatter":{"sidebarDepth":3},"headers":[],"relativePath":"guides/getting-started.md","filePath":"guides/getting-started.md"}'),o={name:"guides/getting-started.md"},s=i('

Getting Started

Kano comes with small tutorials (a.k.a. tours) that can be directly run on the application in order to understand how its internal components can be used. You will first have to connect to make everything works as expected.

Then, you can launch the main tutorial directly from the main menu through the following icon . Follow the step by step guide , go back if required and stop anytime as illustrated by the following figure:

tour

From the main tutorial you can open others tutorials dedicated to specific components (like e.g. the navigation bar) whenever you see the icon.

WARNING

Kano look and features are ever-evolving, moreover it can be configured according to your specific use case. As a consequence, your screen probably looks a little different than what you can read and see in this documentation but the key concepts remain the same.

The main menu allows to open the documentation, manage your settings and logout from Kano.

👉 Launch the main tutorial from the main menu then open the link to the main menu tutorial to get more details

Application bar

The application bar allows to quickly execute recurring actions:

  • switch from 2D (respectively 3D) activity to 3D (respectively 2D) activity,
  • center the view on your current location and display it,
  • seek for an address,
  • manage your favorite views,
  • tools to e.g. display the coordinates of a location,
  • switch to fullscreen mode.

👉 Launch the main tutorial from the main menu then open the link to the navigation bar tutorial to get more details

Catalog

The catalog allows to manage the layers displayed on your view. You can show/hide a layer by selecting it in the relevant category.

WARNING

The data of some layers are only visible starting from a given scale if there is too much data to ensure a readable and smvisualisation.

In this case the layer will be disable until you reach the required scale on the map (zoom in or zoom to the layer to do so).

Using the menu on a layer you can access available actions for this layer.

👉 Launch the main tutorial from the main menu then open the link to the catalog tutorial to get more details

Timeline

The timeline allows to quickly execute actions related to the time of the displayed data. Stick to real-time or go forward/backward in time as you wish.

👉 Launch the main tutorial from the main menu then open the link to the timeline tutorial to get more details

Floating action button

Using the FAB at the bottom right corner you can:

  • Create a new blank data layer:
    • By connecting to web mapping services using OGC standards (WMS, WFS, TMS, WMTS).
    • By locating and drawing the underlying entities. You can add the data schema from a JSON schema file in order to edit the meatadata (i.e. properties) of your entities.
    • By import existing data from a GeoJSON file.
  • Probe weather forecast data from active prediction models by selecting a specific location on the map.

👉 Launch the main tutorial from the main menu then open the link to the FAB tutorial to get more details

Contextual menu

A right-click on a feature of the map will display a contextual menu if some actions are available for the target element like editing the properties of a user-defined feature or remove it.

Layer actions

Depending on the layer different actions are available. The most common action is to zoom to the layer in order to fit the view on the available data. If the layer is disabled at high scales this action will set the current scale of the map so that data will start be visible if the layer is shown.

More actions are available on user-defined feature layers:

  • save the layer (i.e. make it persistent),
  • edit layer properties like its name or description,
  • edit layer features (metadata and geometry),
  • edit display style,
  • filter data according to metadata,
  • display raw data,
  • create charts,
  • delete the layer.
',31),n=[s];function r(c,h,d,u,m,p){return t(),e("div",null,n)}const y=a(o,[["render",r]]);export{f as __pageData,y as default}; diff --git a/assets/guides_getting-started.md.61515a0f.lean.js b/assets/guides_getting-started.md.2GOoH2nF.lean.js similarity index 59% rename from assets/guides_getting-started.md.61515a0f.lean.js rename to assets/guides_getting-started.md.2GOoH2nF.lean.js index 159f5dd8..eeb536d4 100644 --- a/assets/guides_getting-started.md.61515a0f.lean.js +++ b/assets/guides_getting-started.md.2GOoH2nF.lean.js @@ -1 +1 @@ -import{_ as a,o as e,c as t,Q as i}from"./chunks/framework.f7d371db.js";const l="/kano/assets/kano-tour.5df9bce8.png",f=JSON.parse('{"title":"Getting Started","description":"","frontmatter":{"sidebarDepth":3},"headers":[],"relativePath":"guides/getting-started.md","filePath":"guides/getting-started.md"}'),o={name:"guides/getting-started.md"},s=i("",31),n=[s];function r(c,h,d,u,m,p){return e(),t("div",null,n)}const y=a(o,[["render",r]]);export{f as __pageData,y as default}; +import{_ as a,c as e,o as t,V as i}from"./chunks/framework.J61Sinzt.js";const l="/kano/assets/kano-tour.7bUQfDzL.png",f=JSON.parse('{"title":"Getting Started","description":"","frontmatter":{"sidebarDepth":3},"headers":[],"relativePath":"guides/getting-started.md","filePath":"guides/getting-started.md"}'),o={name:"guides/getting-started.md"},s=i("",31),n=[s];function r(c,h,d,u,m,p){return t(),e("div",null,n)}const y=a(o,[["render",r]]);export{f as __pageData,y as default}; diff --git a/assets/guides_installing-kano.md.a41b1f68.js b/assets/guides_installing-kano.md.a41b1f68.js deleted file mode 100644 index a5f47fc6..00000000 --- a/assets/guides_installing-kano.md.a41b1f68.js +++ /dev/null @@ -1,471 +0,0 @@ -import{_ as s,o as n,c as a,Q as l}from"./chunks/framework.f7d371db.js";const p="/kano/assets/kano-installation.0671227c.png",o="/kano/assets/weacast-installation.3782c318.png",e="/kano/assets/hubeau-installation.52eb472d.png",C=JSON.parse('{"title":"Installing Kano","description":"","frontmatter":{"sidebarDepth":3},"headers":[],"relativePath":"guides/installing-kano.md","filePath":"guides/installing-kano.md"}'),t={name:"guides/installing-kano.md"},c=l(`

Installing Kano

Using Docker

WARNING

This requires you to install Docker, the world’s leading software container platform.

We provide Docker images on the Docker Hub to ease deploying your own instance. To run correctly it has to be linked with a standard MongoDB container for the database. Although it's possible to directly run Docker commands we provide you with docker-compose files to ease deployment, in addition to minimalist configuration files. These files will be detailed in the following sections and are available in the public folder of the documentation.

Jump into the folder with the docker-compose and configuration files, the following commands should do the job:

bash
// Run the MongoDB and Kano containers
-docker-compose up -d
-
-// Stop the MongoDB and Kano containers
-docker-compose down
-// Stop the MongoDB and Kano containers erasing DB data
-docker-compose down -v
// Run the MongoDB and Kano containers
-docker-compose up -d
-
-// Stop the MongoDB and Kano containers
-docker-compose down
-// Stop the MongoDB and Kano containers erasing DB data
-docker-compose down -v

Then point your browser to localhost:8080. You should see something like this once connected:

installation

TIP

Check the local.cjs configuration file below to find the required login information

WARNING

If running Docker under Windows in a virtual machine first redirect the port 8080 of your virtual machine to your host

docker-compose.yml - Used to deploy MongoDB and Kano containers.
yml
version: '3.3'
-
-services:
-  kano:
-    image: kalisio/kano:dev
-    environment:
-      - APP_SECRET=xxx
-      - LAYERS_FILTER=OSM PLAN_IGN CESIUM_ELLIPSOID
-      - BUILD_NUMBER
-      - NODE_APP_INSTANCE
-      - DB_URL=mongodb://mongodb:27017/kano
-      - DATA_DB_URL
-      - CESIUM_TOKEN=xxx
-      - MAPILLARY_TOKEN=xxx
-    volumes:
-      - type: bind
-        source: ./my-layers.cjs
-        target: /opt/kalisio/kano/api/config/layers/my-layers.cjs
-      - type: bind
-        source: ./local-kano.cjs
-        target: /opt/kalisio/kano/api/config/local.cjs
-    ports:
-      - "8080:8081"
-    networks:
-      - kano
-  mongodb:
-    image: mongo:4.2
-    volumes:
-      - mongodb:/data/db
-    ports:
-      - "27017:27017"
-    networks:
-      - kano
-
-volumes:
-  mongodb:
-
-networks:
-  kano:
version: '3.3'
-
-services:
-  kano:
-    image: kalisio/kano:dev
-    environment:
-      - APP_SECRET=xxx
-      - LAYERS_FILTER=OSM PLAN_IGN CESIUM_ELLIPSOID
-      - BUILD_NUMBER
-      - NODE_APP_INSTANCE
-      - DB_URL=mongodb://mongodb:27017/kano
-      - DATA_DB_URL
-      - CESIUM_TOKEN=xxx
-      - MAPILLARY_TOKEN=xxx
-    volumes:
-      - type: bind
-        source: ./my-layers.cjs
-        target: /opt/kalisio/kano/api/config/layers/my-layers.cjs
-      - type: bind
-        source: ./local-kano.cjs
-        target: /opt/kalisio/kano/api/config/local.cjs
-    ports:
-      - "8080:8081"
-    networks:
-      - kano
-  mongodb:
-    image: mongo:4.2
-    volumes:
-      - mongodb:/data/db
-    ports:
-      - "27017:27017"
-    networks:
-      - kano
-
-volumes:
-  mongodb:
-
-networks:
-  kano:

Kano comes with a default set of users but you should change this default configuration for a public deployment and avoid leaking login/passwords. Similarly, Kano comes with a default set of layers targeting geospatial services deployed by Kargo and you should add your own data layers instead. This is done by configuration using the following files:

local.cjs - Used to override the default backend configuration and setup a default user.

To be put in the kano/api/config directory.

cjs
module.exports = {
-  authentication: {
-    defaultUsers: [
-      {
-        email: process.env.DEFAULT_USER_EMAIL || 'john.doe@gmail.com',
-        password: process.env.DEFAULT_USER_PASSWORD || 'John;Doe1',
-        name: 'John Doe',
-        catalog: { permissions: 'owner' }, // Grant admin rights to update catalog
-        layers: [{ // Grant admin rights to update layer data
-          name: 'Layers.SENSORS',
-          permissions: 'manager',
-          probeService: 'sensors-stations',
-          service: 'sensors-observations'
-        }]
-      }
-    ]
-  }
-}
module.exports = {
-  authentication: {
-    defaultUsers: [
-      {
-        email: process.env.DEFAULT_USER_EMAIL || 'john.doe@gmail.com',
-        password: process.env.DEFAULT_USER_PASSWORD || 'John;Doe1',
-        name: 'John Doe',
-        catalog: { permissions: 'owner' }, // Grant admin rights to update catalog
-        layers: [{ // Grant admin rights to update layer data
-          name: 'Layers.SENSORS',
-          permissions: 'manager',
-          probeService: 'sensors-stations',
-          service: 'sensors-observations'
-        }]
-      }
-    ]
-  }
-}
my-layers.cjs - Used to define the available default layers.

To be put in the kano/api/config/layers directory. Example based on OpenStreeetMap tile servers and IGN web services.

cjs
module.exports = [{
-    name: 'Layers.OSM',
-    description: 'Layers.OSM_DESCRIPTION',
-    i18n: {
-      fr: {
-        Layers: {
-          OSM: 'OSM',
-          OSM_DESCRIPTION: 'Données OpenStreetMap'
-        }
-      },
-      en: {
-        Layers: {
-          OSM: 'OSM',
-          OSM_DESCRIPTION: 'OpenStreeMap data'
-        }
-      }
-    },
-    tags: [
-      'street'
-    ],
-    iconUrl: \`http://a.tile.osm.org/0/0/0.png\`,
-    icon: 'streetview',
-    attribution: 'OpenStreetMap © <a href="http://openstreetmap.org">OpenStreetMap</a> contributors',
-    type: 'BaseLayer',
-    leaflet: {
-      type: 'tileLayer',
-      isVisible: true,
-      source: 'http://{s}.tile.osm.org/{z}/{x}/{y}.png',
-      maxZoom: 21,
-      maxNativeZoom: 18
-    },
-    cesium: {
-      type: 'OpenStreetMap',
-      url: \`http://a.tile.osm.org\`
-    }
-  },
-  {
-    name: 'Layers.PLAN_IGN',
-    description: 'Layers.PLAN_IGN_DESCRIPTION',
-    i18n: {
-      fr: {
-        Layers: {
-          PLAN_IGN: 'Plan IGN',
-          PLAN_IGN_DESCRIPTION: 'Plan IGN v2'
-        }
-      },
-      en: {
-        Layers: {
-          PLAN_IGN: 'Plan IGN',
-          PLAN_IGN_DESCRIPTION: 'Plan IGN v2'
-        }
-      }
-    },
-    tags: [
-      'street'
-    ],
-    type: 'BaseLayer',
-    iconUrl: 'https://wxs.ign.fr/cartes/geoportail/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=GEOGRAPHICALGRIDSYSTEMS.PLANIGNV2&STYLE=normal&FORMAT=image/png&TILEMATRIXSET=PM&TILEMATRIX=8&TILEROW=92&TILECOL=132',
-    icon: 'las la-plug',
-    attribution: '<a href="https://www.ign.fr/">IGN</a>',
-    cesium: {
-      type: 'WebMapTileService',
-      url: 'https://wxs.ign.fr/cartes/geoportail/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=GEOGRAPHICALGRIDSYSTEMS.PLANIGNV2&STYLE=normal&FORMAT=image/png&TILEMATRIXSET=PM&TILEMATRIX={TileMatrix}&TILEROW={TileRow}&TILECOL={TileCol}',
-      format: 'image/png',
-      layer: 'GEOGRAPHICALGRIDSYSTEMS.PLANIGNV2',
-      style: 'normal',
-      tileMatrixSetID: 'PM'
-    },
-    leaflet: {
-      type: 'tileLayer',
-      source: 'https://wxs.ign.fr/cartes/geoportail/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=GEOGRAPHICALGRIDSYSTEMS.PLANIGNV2&STYLE=normal&FORMAT=image/png&TILEMATRIXSET=PM&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}',
-    }
-  }
-]
module.exports = [{
-    name: 'Layers.OSM',
-    description: 'Layers.OSM_DESCRIPTION',
-    i18n: {
-      fr: {
-        Layers: {
-          OSM: 'OSM',
-          OSM_DESCRIPTION: 'Données OpenStreetMap'
-        }
-      },
-      en: {
-        Layers: {
-          OSM: 'OSM',
-          OSM_DESCRIPTION: 'OpenStreeMap data'
-        }
-      }
-    },
-    tags: [
-      'street'
-    ],
-    iconUrl: \`http://a.tile.osm.org/0/0/0.png\`,
-    icon: 'streetview',
-    attribution: 'OpenStreetMap © <a href="http://openstreetmap.org">OpenStreetMap</a> contributors',
-    type: 'BaseLayer',
-    leaflet: {
-      type: 'tileLayer',
-      isVisible: true,
-      source: 'http://{s}.tile.osm.org/{z}/{x}/{y}.png',
-      maxZoom: 21,
-      maxNativeZoom: 18
-    },
-    cesium: {
-      type: 'OpenStreetMap',
-      url: \`http://a.tile.osm.org\`
-    }
-  },
-  {
-    name: 'Layers.PLAN_IGN',
-    description: 'Layers.PLAN_IGN_DESCRIPTION',
-    i18n: {
-      fr: {
-        Layers: {
-          PLAN_IGN: 'Plan IGN',
-          PLAN_IGN_DESCRIPTION: 'Plan IGN v2'
-        }
-      },
-      en: {
-        Layers: {
-          PLAN_IGN: 'Plan IGN',
-          PLAN_IGN_DESCRIPTION: 'Plan IGN v2'
-        }
-      }
-    },
-    tags: [
-      'street'
-    ],
-    type: 'BaseLayer',
-    iconUrl: 'https://wxs.ign.fr/cartes/geoportail/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=GEOGRAPHICALGRIDSYSTEMS.PLANIGNV2&STYLE=normal&FORMAT=image/png&TILEMATRIXSET=PM&TILEMATRIX=8&TILEROW=92&TILECOL=132',
-    icon: 'las la-plug',
-    attribution: '<a href="https://www.ign.fr/">IGN</a>',
-    cesium: {
-      type: 'WebMapTileService',
-      url: 'https://wxs.ign.fr/cartes/geoportail/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=GEOGRAPHICALGRIDSYSTEMS.PLANIGNV2&STYLE=normal&FORMAT=image/png&TILEMATRIXSET=PM&TILEMATRIX={TileMatrix}&TILEROW={TileRow}&TILECOL={TileCol}',
-      format: 'image/png',
-      layer: 'GEOGRAPHICALGRIDSYSTEMS.PLANIGNV2',
-      style: 'normal',
-      tileMatrixSetID: 'PM'
-    },
-    leaflet: {
-      type: 'tileLayer',
-      source: 'https://wxs.ign.fr/cartes/geoportail/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=GEOGRAPHICALGRIDSYSTEMS.PLANIGNV2&STYLE=normal&FORMAT=image/png&TILEMATRIXSET=PM&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}',
-    }
-  }
-]

As detailed in the KDK documentation Kano comes into three different flavors. By default the docker-compose file targets the latest development version (dev tag) but you can change it to target either a beta (test tag) or a production (prod tag) release.

WARNING

By default no built-in layers are available in Kano unless you specify their names using the LAYERS_FILTER environment variable. By defining LAYERS_FILTER=* you will get all built-in layers but take care that a lot of them requires additional services to work correctly (read following sections below). You can however directly add new layers using the Kano GUI (through the add layer button or by drag'n'drop on the map).

TIP

If you'd like to use the 3D mode or the Mapillary layer you should provide the required tokens to access their respective APIs on the backend side by setting the following environment variables: CESIUM_TOKEN, MAPILLARY_TOKEN.

Add weather forecasts

Kano integrates smoothly with Weacast in order to display weather forecast data. You can also use Docker containers to run Weacast by following this guide and taking care of port conflicts as they use the same by default.

The following commands and additional docker-compose file should do the job:

bash
// Run the MongoDB, Weacast and Kano containers
-docker-compose -f docker-compose.yml -f docker-compose-weacast.yml up -d
-
-// Stop the MongoDB, Weacast and Kano containers
-docker-compose -f docker-compose.yml -f docker-compose-weacast.yml down 
-// Stop the MongoDB, Weacast and Kano containers erasing DB data
-docker-compose -f docker-compose.yml -f docker-compose-weacast.yml down -v
// Run the MongoDB, Weacast and Kano containers
-docker-compose -f docker-compose.yml -f docker-compose-weacast.yml up -d
-
-// Stop the MongoDB, Weacast and Kano containers
-docker-compose -f docker-compose.yml -f docker-compose-weacast.yml down 
-// Stop the MongoDB, Weacast and Kano containers erasing DB data
-docker-compose -f docker-compose.yml -f docker-compose-weacast.yml down -v

Wait a couple of minutes so that Weacast feeds the database with the latest forecast then point your browser to localhost:8080. You should see something like this once connected if you display some meteorological layers and probe a location:

installation

docker-compose-weacast.yml - Used to deploy Weacast container.
yml
version: '3.3'
-
-services:
-  kano:
-    environment:
-      - LAYERS_FILTER=OSM PLAN_IGN WIND_TILED GUST_TILED PRECIPITATIONS_TILED TEMPERATURE_TILED CESIUM_ELLIPSOID
-  weacast:
-    image: weacast/weacast-api:dev
-    environment:
-      - APP_SECRET=yyy
-      - DB_URL=mongodb://mongodb:27017/weacast
-      - LOADERS=gfs
-      - LOG_LEVEL
-      - DEBUG
-    ports:
-      - "8081:8081"
-    networks:
-      - kano
version: '3.3'
-
-services:
-  kano:
-    environment:
-      - LAYERS_FILTER=OSM PLAN_IGN WIND_TILED GUST_TILED PRECIPITATIONS_TILED TEMPERATURE_TILED CESIUM_ELLIPSOID
-  weacast:
-    image: weacast/weacast-api:dev
-    environment:
-      - APP_SECRET=yyy
-      - DB_URL=mongodb://mongodb:27017/weacast
-      - LOADERS=gfs
-      - LOG_LEVEL
-      - DEBUG
-    ports:
-      - "8081:8081"
-    networks:
-      - kano

TIP

You should activate the built-in Weacast layers like WIND_TILED in Kano using the LAYERS_FILTER environment variable.

Add krawler jobs

Kano integrates smoothly with Krawler jobs in order to feed data for near real-time measurements/observations layers. A lot of built-in layers requires the associated job(s) to be deployed beside Kano. You can search for available jobs in our GitHub organisation and find more information about available layers in the Kalisio Crisis catalog.

For the purpose of this documentation we will focus on the k-hubeau hydro jobs but others jobs work similarly. The following commands and additional docker-compose file should do the job:

bash
// Run the MongoDB, Hubeau jobs and Kano containers
-docker-compose -f docker-compose.yml -f docker-compose-hubeau.yml up -d
-
-// Stop the MongoDB, Hubeau jobs and Kano containers
-docker-compose -f docker-compose.yml -f docker-compose-hubeau.yml down 
-// Stop the MongoDB, Hubeau jobs and Kano containers erasing DB data
-docker-compose -f docker-compose.yml -f docker-compose-hubeau.yml down -v
// Run the MongoDB, Hubeau jobs and Kano containers
-docker-compose -f docker-compose.yml -f docker-compose-hubeau.yml up -d
-
-// Stop the MongoDB, Hubeau jobs and Kano containers
-docker-compose -f docker-compose.yml -f docker-compose-hubeau.yml down 
-// Stop the MongoDB, Hubeau jobs and Kano containers erasing DB data
-docker-compose -f docker-compose.yml -f docker-compose-hubeau.yml down -v

Wait a couple of minutes so that the jobs feeds the database with the latest observations then point your browser to localhost:8080. You should see something like this once connected if you display the observations layer, zoom in and pick a station:

installation

docker-compose-hubeau.yml - Used to deploy Hubeau jobs containers.
yml
version: '3.3'
-
-services:
-  kano:
-    environment:
-      - LAYERS_FILTER=OSM PLAN_IGN HUBEAU_HYDRO
-  hubeau-stations:
-    image: kalisio/k-hubeau:hydro-stations-latest
-    environment:
-      - DB_URL=mongodb://mongodb:27017/kano
-      - DEBUG
-    networks:
-      - kano
-  hubeau-observations:
-    image: kalisio/k-hubeau:hydro-observations-latest
-    environment:
-      - DB_URL=mongodb://mongodb:27017/kano
-      - DEBUG
-    depends_on:
-      hubeau-stations:
-        condition: service_healthy
-    networks:
-      - kano
version: '3.3'
-
-services:
-  kano:
-    environment:
-      - LAYERS_FILTER=OSM PLAN_IGN HUBEAU_HYDRO
-  hubeau-stations:
-    image: kalisio/k-hubeau:hydro-stations-latest
-    environment:
-      - DB_URL=mongodb://mongodb:27017/kano
-      - DEBUG
-    networks:
-      - kano
-  hubeau-observations:
-    image: kalisio/k-hubeau:hydro-observations-latest
-    environment:
-      - DB_URL=mongodb://mongodb:27017/kano
-      - DEBUG
-    depends_on:
-      hubeau-stations:
-        condition: service_healthy
-    networks:
-      - kano

TIP

You should activate the built-in Hub'Eau layers like HUBEAU_HYDRO in Kano using the LAYERS_FILTER environment variable.

From source code

First you have to ensure the KDK prerequisites to run Kano from source code.

WARNING

At the time of writing Kano v2.x (master branch) is expected to work with KDK modules v2.x (master branch and Node.js 16.x) and Kano v1.x (test branches) is expected to work with KDK modules v1.x (Node.js 12.x)

Then the following commands, assuming you have a MongoDB instance running on local host and default port (27017), should launch your local instance of Kano:

bash
// Clone KDK
-git clone https://github.com/kalisio/kdk.git
-cd kdk
-yarn install
-yarn link
-
-// In another terminal clone Kano
-git clone https://github.com/kalisio/kano.git
-
-// Set the most minimalist environment to run server
-export APP_SECRET="xxx"
-export LAYERS_FILTER="OSM PLAN_IGN CESIUM_ELLIPSOID"
-
-// Run the server/API
-cd kano/api
-// Copy custom configuration files
-cp local.js config
-cp my-layers.js config/layers
-yarn install
-yarn link @kalisio/kdk
-yarn dev
-
-// In another terminal run the client app
-cd kano
-yarn install
-yarn link @kalisio/kdk
-yarn dev
// Clone KDK
-git clone https://github.com/kalisio/kdk.git
-cd kdk
-yarn install
-yarn link
-
-// In another terminal clone Kano
-git clone https://github.com/kalisio/kano.git
-
-// Set the most minimalist environment to run server
-export APP_SECRET="xxx"
-export LAYERS_FILTER="OSM PLAN_IGN CESIUM_ELLIPSOID"
-
-// Run the server/API
-cd kano/api
-// Copy custom configuration files
-cp local.js config
-cp my-layers.js config/layers
-yarn install
-yarn link @kalisio/kdk
-yarn dev
-
-// In another terminal run the client app
-cd kano
-yarn install
-yarn link @kalisio/kdk
-yarn dev

Point your browser to localhost:8080.

Add weather forecasts

Instead of using Docker containers you can directly install Weacast from the source code as well by following this guide. You should however take care of port conflicts as it uses the same than Kano by default (API and NodeJS debugger), the following commands should do the job:

bash
// Clone Weacast
-git clone https://github.com/weacast/weacast.git
-cd weacast
-yarn install
-
-// Set the most minimalist environment to run server
-export PORT="8082"
-export NODE_OPTIONS="--inspect-port=9230"
-export LOADERS="gfs"
-
-// Run the server/API
-cd packages/api
-yarn dev
// Clone Weacast
-git clone https://github.com/weacast/weacast.git
-cd weacast
-yarn install
-
-// Set the most minimalist environment to run server
-export PORT="8082"
-export NODE_OPTIONS="--inspect-port=9230"
-export LOADERS="gfs"
-
-// Run the server/API
-cd packages/api
-yarn dev

TIP

You should activate the built-in Weacast layers like WIND_TILED in Kano using the LAYERS_FILTER environment variable.

Add krawler jobs

Instead of using Docker containers you can directly install Krawler from the source code as well by following this guide and retrieve/run required jobs manually, it's notably useful when developing new jobs:

bash
git clone https://github.com/kalisio/krawler
-cd krawler
-yarn install
-yarn link
-// Now you can proceed with your jobs
-git clone https://github.com/kalisio/k-hubeau
-yarn install
-yarn link @kalisio/krawler
-// Set the most minimalist environment to run the jobs
-export DB_URL=mongodb://mongodb:27017/kano
-// Now you can launch the jobs manually using the krawler CLI
-krawler ./jobfile-hydro-stations.js
-krawler ./jobfile-hydro-observations.js
git clone https://github.com/kalisio/krawler
-cd krawler
-yarn install
-yarn link
-// Now you can proceed with your jobs
-git clone https://github.com/kalisio/k-hubeau
-yarn install
-yarn link @kalisio/krawler
-// Set the most minimalist environment to run the jobs
-export DB_URL=mongodb://mongodb:27017/kano
-// Now you can launch the jobs manually using the krawler CLI
-krawler ./jobfile-hydro-stations.js
-krawler ./jobfile-hydro-observations.js
`,46),r=[c];function y(E,i,F,d,m,h){return n(),a("div",null,r)}const g=s(t,[["render",y]]);export{C as __pageData,g as default}; diff --git a/assets/guides_installing-kano.md.a41b1f68.lean.js b/assets/guides_installing-kano.md.a41b1f68.lean.js deleted file mode 100644 index d55d68c3..00000000 --- a/assets/guides_installing-kano.md.a41b1f68.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as s,o as n,c as a,Q as l}from"./chunks/framework.f7d371db.js";const p="/kano/assets/kano-installation.0671227c.png",o="/kano/assets/weacast-installation.3782c318.png",e="/kano/assets/hubeau-installation.52eb472d.png",C=JSON.parse('{"title":"Installing Kano","description":"","frontmatter":{"sidebarDepth":3},"headers":[],"relativePath":"guides/installing-kano.md","filePath":"guides/installing-kano.md"}'),t={name:"guides/installing-kano.md"},c=l("",46),r=[c];function y(E,i,F,d,m,h){return n(),a("div",null,r)}const g=s(t,[["render",y]]);export{C as __pageData,g as default}; diff --git a/assets/guides_installing-kano.md.hypdee-x.js b/assets/guides_installing-kano.md.hypdee-x.js new file mode 100644 index 00000000..60301ea4 --- /dev/null +++ b/assets/guides_installing-kano.md.hypdee-x.js @@ -0,0 +1,236 @@ +import{_ as s,c as a,o as i,V as n}from"./chunks/framework.J61Sinzt.js";const e="/kano/assets/kano-installation.opRySSk9.png",l="/kano/assets/weacast-installation.eFFnGIQX.png",p="/kano/assets/hubeau-installation.AH39zNjO.png",u=JSON.parse('{"title":"Installing Kano","description":"","frontmatter":{"sidebarDepth":3},"headers":[],"relativePath":"guides/installing-kano.md","filePath":"guides/installing-kano.md"}'),t={name:"guides/installing-kano.md"},h=n(`

Installing Kano

Using Docker

WARNING

This requires you to install Docker, the world’s leading software container platform.

We provide Docker images on the Docker Hub to ease deploying your own instance. To run correctly it has to be linked with a standard MongoDB container for the database. Although it's possible to directly run Docker commands we provide you with docker-compose files to ease deployment, in addition to minimalist configuration files. These files will be detailed in the following sections and are available in the public folder of the documentation.

Jump into the folder with the docker-compose and configuration files, the following commands should do the job:

bash
// Run the MongoDB and Kano containers
+docker-compose up -d
+
+// Stop the MongoDB and Kano containers
+docker-compose down
+// Stop the MongoDB and Kano containers erasing DB data
+docker-compose down -v

Then point your browser to localhost:8080. You should see something like this once connected:

installation

TIP

Check the local.cjs configuration file below to find the required login information

WARNING

If running Docker under Windows in a virtual machine first redirect the port 8080 of your virtual machine to your host

docker-compose.yml - Used to deploy MongoDB and Kano containers.
yml
version: '3.3'
+
+services:
+  kano:
+    image: kalisio/kano:dev
+    environment:
+      - APP_SECRET=xxx
+      - LAYERS_FILTER=OSM PLAN_IGN CESIUM_ELLIPSOID
+      - BUILD_NUMBER
+      - NODE_APP_INSTANCE
+      - DB_URL=mongodb://mongodb:27017/kano
+      - DATA_DB_URL
+      - CESIUM_TOKEN=xxx
+      - MAPILLARY_TOKEN=xxx
+    volumes:
+      - type: bind
+        source: ./my-layers.cjs
+        target: /opt/kalisio/kano/api/config/layers/my-layers.cjs
+      - type: bind
+        source: ./local-kano.cjs
+        target: /opt/kalisio/kano/api/config/local.cjs
+    ports:
+      - "8080:8081"
+    networks:
+      - kano
+  mongodb:
+    image: mongo:4.2
+    volumes:
+      - mongodb:/data/db
+    ports:
+      - "27017:27017"
+    networks:
+      - kano
+
+volumes:
+  mongodb:
+
+networks:
+  kano:

Kano comes with a default set of users but you should change this default configuration for a public deployment and avoid leaking login/passwords. Similarly, Kano comes with a default set of layers targeting geospatial services deployed by Kargo and you should add your own data layers instead. This is done by configuration using the following files:

local.cjs - Used to override the default backend configuration and setup a default user.

To be put in the kano/api/config directory.

cjs
module.exports = {
+  authentication: {
+    defaultUsers: [
+      {
+        email: process.env.DEFAULT_USER_EMAIL || 'john.doe@gmail.com',
+        password: process.env.DEFAULT_USER_PASSWORD || 'John;Doe1',
+        name: 'John Doe',
+        catalog: { permissions: 'owner' }, // Grant admin rights to update catalog
+        layers: [{ // Grant admin rights to update layer data
+          name: 'Layers.SENSORS',
+          permissions: 'manager',
+          probeService: 'sensors-stations',
+          service: 'sensors-observations'
+        }]
+      }
+    ]
+  }
+}
my-layers.cjs - Used to define the available default layers.

To be put in the kano/api/config/layers directory. Example based on OpenStreeetMap tile servers and IGN web services.

cjs
module.exports = [{
+    name: 'Layers.OSM',
+    description: 'Layers.OSM_DESCRIPTION',
+    i18n: {
+      fr: {
+        Layers: {
+          OSM: 'OSM',
+          OSM_DESCRIPTION: 'Données OpenStreetMap'
+        }
+      },
+      en: {
+        Layers: {
+          OSM: 'OSM',
+          OSM_DESCRIPTION: 'OpenStreeMap data'
+        }
+      }
+    },
+    tags: [
+      'street'
+    ],
+    iconUrl: \`http://a.tile.osm.org/0/0/0.png\`,
+    icon: 'streetview',
+    attribution: 'OpenStreetMap © <a href="http://openstreetmap.org">OpenStreetMap</a> contributors',
+    type: 'BaseLayer',
+    leaflet: {
+      type: 'tileLayer',
+      isVisible: true,
+      source: 'http://{s}.tile.osm.org/{z}/{x}/{y}.png',
+      maxZoom: 21,
+      maxNativeZoom: 18
+    },
+    cesium: {
+      type: 'OpenStreetMap',
+      url: \`http://a.tile.osm.org\`
+    }
+  },
+  {
+    name: 'Layers.PLAN_IGN',
+    description: 'Layers.PLAN_IGN_DESCRIPTION',
+    i18n: {
+      fr: {
+        Layers: {
+          PLAN_IGN: 'Plan IGN',
+          PLAN_IGN_DESCRIPTION: 'Plan IGN v2'
+        }
+      },
+      en: {
+        Layers: {
+          PLAN_IGN: 'Plan IGN',
+          PLAN_IGN_DESCRIPTION: 'Plan IGN v2'
+        }
+      }
+    },
+    tags: [
+      'street'
+    ],
+    type: 'BaseLayer',
+    iconUrl: 'https://wxs.ign.fr/cartes/geoportail/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=GEOGRAPHICALGRIDSYSTEMS.PLANIGNV2&STYLE=normal&FORMAT=image/png&TILEMATRIXSET=PM&TILEMATRIX=8&TILEROW=92&TILECOL=132',
+    icon: 'las la-plug',
+    attribution: '<a href="https://www.ign.fr/">IGN</a>',
+    cesium: {
+      type: 'WebMapTileService',
+      url: 'https://wxs.ign.fr/cartes/geoportail/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=GEOGRAPHICALGRIDSYSTEMS.PLANIGNV2&STYLE=normal&FORMAT=image/png&TILEMATRIXSET=PM&TILEMATRIX={TileMatrix}&TILEROW={TileRow}&TILECOL={TileCol}',
+      format: 'image/png',
+      layer: 'GEOGRAPHICALGRIDSYSTEMS.PLANIGNV2',
+      style: 'normal',
+      tileMatrixSetID: 'PM'
+    },
+    leaflet: {
+      type: 'tileLayer',
+      source: 'https://wxs.ign.fr/cartes/geoportail/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=GEOGRAPHICALGRIDSYSTEMS.PLANIGNV2&STYLE=normal&FORMAT=image/png&TILEMATRIXSET=PM&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}',
+    }
+  }
+]

As detailed in the KDK documentation Kano comes into three different flavors. By default the docker-compose file targets the latest development version (dev tag) but you can change it to target either a beta (test tag) or a production (prod tag) release.

WARNING

By default no built-in layers are available in Kano unless you specify their names using the LAYERS_FILTER environment variable. By defining LAYERS_FILTER=* you will get all built-in layers but take care that a lot of them requires additional services to work correctly (read following sections below). You can however directly add new layers using the Kano GUI (through the add layer button or by drag'n'drop on the map).

TIP

If you'd like to use the 3D mode or the Mapillary layer you should provide the required tokens to access their respective APIs on the backend side by setting the following environment variables: CESIUM_TOKEN, MAPILLARY_TOKEN.

Add weather forecasts

Kano integrates smoothly with Weacast in order to display weather forecast data. You can also use Docker containers to run Weacast by following this guide and taking care of port conflicts as they use the same by default.

The following commands and additional docker-compose file should do the job:

bash
// Run the MongoDB, Weacast and Kano containers
+docker-compose -f docker-compose.yml -f docker-compose-weacast.yml up -d
+
+// Stop the MongoDB, Weacast and Kano containers
+docker-compose -f docker-compose.yml -f docker-compose-weacast.yml down 
+// Stop the MongoDB, Weacast and Kano containers erasing DB data
+docker-compose -f docker-compose.yml -f docker-compose-weacast.yml down -v

Wait a couple of minutes so that Weacast feeds the database with the latest forecast then point your browser to localhost:8080. You should see something like this once connected if you display some meteorological layers and probe a location:

installation

docker-compose-weacast.yml - Used to deploy Weacast container.
yml
version: '3.3'
+
+services:
+  kano:
+    environment:
+      - LAYERS_FILTER=OSM PLAN_IGN WIND_TILED GUST_TILED PRECIPITATIONS_TILED TEMPERATURE_TILED CESIUM_ELLIPSOID
+  weacast:
+    image: weacast/weacast-api:dev
+    environment:
+      - APP_SECRET=yyy
+      - DB_URL=mongodb://mongodb:27017/weacast
+      - LOADERS=gfs
+      - LOG_LEVEL
+      - DEBUG
+    ports:
+      - "8081:8081"
+    networks:
+      - kano

TIP

You should activate the built-in Weacast layers like WIND_TILED in Kano using the LAYERS_FILTER environment variable.

Add krawler jobs

Kano integrates smoothly with Krawler jobs in order to feed data for near real-time measurements/observations layers. A lot of built-in layers requires the associated job(s) to be deployed beside Kano. You can search for available jobs in our GitHub organisation and find more information about available layers in the Kalisio Crisis catalog.

For the purpose of this documentation we will focus on the k-hubeau hydro jobs but others jobs work similarly. The following commands and additional docker-compose file should do the job:

bash
// Run the MongoDB, Hubeau jobs and Kano containers
+docker-compose -f docker-compose.yml -f docker-compose-hubeau.yml up -d
+
+// Stop the MongoDB, Hubeau jobs and Kano containers
+docker-compose -f docker-compose.yml -f docker-compose-hubeau.yml down 
+// Stop the MongoDB, Hubeau jobs and Kano containers erasing DB data
+docker-compose -f docker-compose.yml -f docker-compose-hubeau.yml down -v

Wait a couple of minutes so that the jobs feeds the database with the latest observations then point your browser to localhost:8080. You should see something like this once connected if you display the observations layer, zoom in and pick a station:

installation

docker-compose-hubeau.yml - Used to deploy Hubeau jobs containers.
yml
version: '3.3'
+
+services:
+  kano:
+    environment:
+      - LAYERS_FILTER=OSM PLAN_IGN HUBEAU_HYDRO
+  hubeau-stations:
+    image: kalisio/k-hubeau:hydro-stations-latest
+    environment:
+      - DB_URL=mongodb://mongodb:27017/kano
+      - DEBUG
+    networks:
+      - kano
+  hubeau-observations:
+    image: kalisio/k-hubeau:hydro-observations-latest
+    environment:
+      - DB_URL=mongodb://mongodb:27017/kano
+      - DEBUG
+    depends_on:
+      hubeau-stations:
+        condition: service_healthy
+    networks:
+      - kano

TIP

You should activate the built-in Hub'Eau layers like HUBEAU_HYDRO in Kano using the LAYERS_FILTER environment variable.

From source code

First you have to ensure the KDK prerequisites to run Kano from source code.

WARNING

At the time of writing Kano v2.x (master branch) is expected to work with KDK modules v2.x (master branch and Node.js 16.x) and Kano v1.x (test branches) is expected to work with KDK modules v1.x (Node.js 12.x)

Then the following commands, assuming you have a MongoDB instance running on local host and default port (27017), should launch your local instance of Kano:

bash
// Clone KDK
+git clone https://github.com/kalisio/kdk.git
+cd kdk
+yarn install
+yarn link
+
+// In another terminal clone Kano
+git clone https://github.com/kalisio/kano.git
+
+// Set the most minimalist environment to run server
+export APP_SECRET="xxx"
+export LAYERS_FILTER="OSM PLAN_IGN CESIUM_ELLIPSOID"
+
+// Run the server/API
+cd kano/api
+// Copy custom configuration files
+cp local.js config
+cp my-layers.js config/layers
+yarn install
+yarn link @kalisio/kdk
+yarn dev
+
+// In another terminal run the client app
+cd kano
+yarn install
+yarn link @kalisio/kdk
+yarn dev

Point your browser to localhost:8080.

Add weather forecasts

Instead of using Docker containers you can directly install Weacast from the source code as well by following this guide. You should however take care of port conflicts as it uses the same than Kano by default (API and NodeJS debugger), the following commands should do the job:

bash
// Clone Weacast
+git clone https://github.com/weacast/weacast.git
+cd weacast
+yarn install
+
+// Set the most minimalist environment to run server
+export PORT="8082"
+export NODE_OPTIONS="--inspect-port=9230"
+export LOADERS="gfs"
+
+// Run the server/API
+cd packages/api
+yarn dev

TIP

You should activate the built-in Weacast layers like WIND_TILED in Kano using the LAYERS_FILTER environment variable.

Add krawler jobs

Instead of using Docker containers you can directly install Krawler from the source code as well by following this guide and retrieve/run required jobs manually, it's notably useful when developing new jobs:

bash
git clone https://github.com/kalisio/krawler
+cd krawler
+yarn install
+yarn link
+// Now you can proceed with your jobs
+git clone https://github.com/kalisio/k-hubeau
+yarn install
+yarn link @kalisio/krawler
+// Set the most minimalist environment to run the jobs
+export DB_URL=mongodb://mongodb:27017/kano
+// Now you can launch the jobs manually using the krawler CLI
+krawler ./jobfile-hydro-stations.js
+krawler ./jobfile-hydro-observations.js
`,46),k=[h];function o(r,d,c,g,E,y){return i(),a("div",null,k)}const m=s(t,[["render",o]]);export{u as __pageData,m as default}; diff --git a/assets/guides_installing-kano.md.hypdee-x.lean.js b/assets/guides_installing-kano.md.hypdee-x.lean.js new file mode 100644 index 00000000..60301ea4 --- /dev/null +++ b/assets/guides_installing-kano.md.hypdee-x.lean.js @@ -0,0 +1,236 @@ +import{_ as s,c as a,o as i,V as n}from"./chunks/framework.J61Sinzt.js";const e="/kano/assets/kano-installation.opRySSk9.png",l="/kano/assets/weacast-installation.eFFnGIQX.png",p="/kano/assets/hubeau-installation.AH39zNjO.png",u=JSON.parse('{"title":"Installing Kano","description":"","frontmatter":{"sidebarDepth":3},"headers":[],"relativePath":"guides/installing-kano.md","filePath":"guides/installing-kano.md"}'),t={name:"guides/installing-kano.md"},h=n(`

Installing Kano

Using Docker

WARNING

This requires you to install Docker, the world’s leading software container platform.

We provide Docker images on the Docker Hub to ease deploying your own instance. To run correctly it has to be linked with a standard MongoDB container for the database. Although it's possible to directly run Docker commands we provide you with docker-compose files to ease deployment, in addition to minimalist configuration files. These files will be detailed in the following sections and are available in the public folder of the documentation.

Jump into the folder with the docker-compose and configuration files, the following commands should do the job:

bash
// Run the MongoDB and Kano containers
+docker-compose up -d
+
+// Stop the MongoDB and Kano containers
+docker-compose down
+// Stop the MongoDB and Kano containers erasing DB data
+docker-compose down -v

Then point your browser to localhost:8080. You should see something like this once connected:

installation

TIP

Check the local.cjs configuration file below to find the required login information

WARNING

If running Docker under Windows in a virtual machine first redirect the port 8080 of your virtual machine to your host

docker-compose.yml - Used to deploy MongoDB and Kano containers.
yml
version: '3.3'
+
+services:
+  kano:
+    image: kalisio/kano:dev
+    environment:
+      - APP_SECRET=xxx
+      - LAYERS_FILTER=OSM PLAN_IGN CESIUM_ELLIPSOID
+      - BUILD_NUMBER
+      - NODE_APP_INSTANCE
+      - DB_URL=mongodb://mongodb:27017/kano
+      - DATA_DB_URL
+      - CESIUM_TOKEN=xxx
+      - MAPILLARY_TOKEN=xxx
+    volumes:
+      - type: bind
+        source: ./my-layers.cjs
+        target: /opt/kalisio/kano/api/config/layers/my-layers.cjs
+      - type: bind
+        source: ./local-kano.cjs
+        target: /opt/kalisio/kano/api/config/local.cjs
+    ports:
+      - "8080:8081"
+    networks:
+      - kano
+  mongodb:
+    image: mongo:4.2
+    volumes:
+      - mongodb:/data/db
+    ports:
+      - "27017:27017"
+    networks:
+      - kano
+
+volumes:
+  mongodb:
+
+networks:
+  kano:

Kano comes with a default set of users but you should change this default configuration for a public deployment and avoid leaking login/passwords. Similarly, Kano comes with a default set of layers targeting geospatial services deployed by Kargo and you should add your own data layers instead. This is done by configuration using the following files:

local.cjs - Used to override the default backend configuration and setup a default user.

To be put in the kano/api/config directory.

cjs
module.exports = {
+  authentication: {
+    defaultUsers: [
+      {
+        email: process.env.DEFAULT_USER_EMAIL || 'john.doe@gmail.com',
+        password: process.env.DEFAULT_USER_PASSWORD || 'John;Doe1',
+        name: 'John Doe',
+        catalog: { permissions: 'owner' }, // Grant admin rights to update catalog
+        layers: [{ // Grant admin rights to update layer data
+          name: 'Layers.SENSORS',
+          permissions: 'manager',
+          probeService: 'sensors-stations',
+          service: 'sensors-observations'
+        }]
+      }
+    ]
+  }
+}
my-layers.cjs - Used to define the available default layers.

To be put in the kano/api/config/layers directory. Example based on OpenStreeetMap tile servers and IGN web services.

cjs
module.exports = [{
+    name: 'Layers.OSM',
+    description: 'Layers.OSM_DESCRIPTION',
+    i18n: {
+      fr: {
+        Layers: {
+          OSM: 'OSM',
+          OSM_DESCRIPTION: 'Données OpenStreetMap'
+        }
+      },
+      en: {
+        Layers: {
+          OSM: 'OSM',
+          OSM_DESCRIPTION: 'OpenStreeMap data'
+        }
+      }
+    },
+    tags: [
+      'street'
+    ],
+    iconUrl: \`http://a.tile.osm.org/0/0/0.png\`,
+    icon: 'streetview',
+    attribution: 'OpenStreetMap © <a href="http://openstreetmap.org">OpenStreetMap</a> contributors',
+    type: 'BaseLayer',
+    leaflet: {
+      type: 'tileLayer',
+      isVisible: true,
+      source: 'http://{s}.tile.osm.org/{z}/{x}/{y}.png',
+      maxZoom: 21,
+      maxNativeZoom: 18
+    },
+    cesium: {
+      type: 'OpenStreetMap',
+      url: \`http://a.tile.osm.org\`
+    }
+  },
+  {
+    name: 'Layers.PLAN_IGN',
+    description: 'Layers.PLAN_IGN_DESCRIPTION',
+    i18n: {
+      fr: {
+        Layers: {
+          PLAN_IGN: 'Plan IGN',
+          PLAN_IGN_DESCRIPTION: 'Plan IGN v2'
+        }
+      },
+      en: {
+        Layers: {
+          PLAN_IGN: 'Plan IGN',
+          PLAN_IGN_DESCRIPTION: 'Plan IGN v2'
+        }
+      }
+    },
+    tags: [
+      'street'
+    ],
+    type: 'BaseLayer',
+    iconUrl: 'https://wxs.ign.fr/cartes/geoportail/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=GEOGRAPHICALGRIDSYSTEMS.PLANIGNV2&STYLE=normal&FORMAT=image/png&TILEMATRIXSET=PM&TILEMATRIX=8&TILEROW=92&TILECOL=132',
+    icon: 'las la-plug',
+    attribution: '<a href="https://www.ign.fr/">IGN</a>',
+    cesium: {
+      type: 'WebMapTileService',
+      url: 'https://wxs.ign.fr/cartes/geoportail/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=GEOGRAPHICALGRIDSYSTEMS.PLANIGNV2&STYLE=normal&FORMAT=image/png&TILEMATRIXSET=PM&TILEMATRIX={TileMatrix}&TILEROW={TileRow}&TILECOL={TileCol}',
+      format: 'image/png',
+      layer: 'GEOGRAPHICALGRIDSYSTEMS.PLANIGNV2',
+      style: 'normal',
+      tileMatrixSetID: 'PM'
+    },
+    leaflet: {
+      type: 'tileLayer',
+      source: 'https://wxs.ign.fr/cartes/geoportail/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=GEOGRAPHICALGRIDSYSTEMS.PLANIGNV2&STYLE=normal&FORMAT=image/png&TILEMATRIXSET=PM&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}',
+    }
+  }
+]

As detailed in the KDK documentation Kano comes into three different flavors. By default the docker-compose file targets the latest development version (dev tag) but you can change it to target either a beta (test tag) or a production (prod tag) release.

WARNING

By default no built-in layers are available in Kano unless you specify their names using the LAYERS_FILTER environment variable. By defining LAYERS_FILTER=* you will get all built-in layers but take care that a lot of them requires additional services to work correctly (read following sections below). You can however directly add new layers using the Kano GUI (through the add layer button or by drag'n'drop on the map).

TIP

If you'd like to use the 3D mode or the Mapillary layer you should provide the required tokens to access their respective APIs on the backend side by setting the following environment variables: CESIUM_TOKEN, MAPILLARY_TOKEN.

Add weather forecasts

Kano integrates smoothly with Weacast in order to display weather forecast data. You can also use Docker containers to run Weacast by following this guide and taking care of port conflicts as they use the same by default.

The following commands and additional docker-compose file should do the job:

bash
// Run the MongoDB, Weacast and Kano containers
+docker-compose -f docker-compose.yml -f docker-compose-weacast.yml up -d
+
+// Stop the MongoDB, Weacast and Kano containers
+docker-compose -f docker-compose.yml -f docker-compose-weacast.yml down 
+// Stop the MongoDB, Weacast and Kano containers erasing DB data
+docker-compose -f docker-compose.yml -f docker-compose-weacast.yml down -v

Wait a couple of minutes so that Weacast feeds the database with the latest forecast then point your browser to localhost:8080. You should see something like this once connected if you display some meteorological layers and probe a location:

installation

docker-compose-weacast.yml - Used to deploy Weacast container.
yml
version: '3.3'
+
+services:
+  kano:
+    environment:
+      - LAYERS_FILTER=OSM PLAN_IGN WIND_TILED GUST_TILED PRECIPITATIONS_TILED TEMPERATURE_TILED CESIUM_ELLIPSOID
+  weacast:
+    image: weacast/weacast-api:dev
+    environment:
+      - APP_SECRET=yyy
+      - DB_URL=mongodb://mongodb:27017/weacast
+      - LOADERS=gfs
+      - LOG_LEVEL
+      - DEBUG
+    ports:
+      - "8081:8081"
+    networks:
+      - kano

TIP

You should activate the built-in Weacast layers like WIND_TILED in Kano using the LAYERS_FILTER environment variable.

Add krawler jobs

Kano integrates smoothly with Krawler jobs in order to feed data for near real-time measurements/observations layers. A lot of built-in layers requires the associated job(s) to be deployed beside Kano. You can search for available jobs in our GitHub organisation and find more information about available layers in the Kalisio Crisis catalog.

For the purpose of this documentation we will focus on the k-hubeau hydro jobs but others jobs work similarly. The following commands and additional docker-compose file should do the job:

bash
// Run the MongoDB, Hubeau jobs and Kano containers
+docker-compose -f docker-compose.yml -f docker-compose-hubeau.yml up -d
+
+// Stop the MongoDB, Hubeau jobs and Kano containers
+docker-compose -f docker-compose.yml -f docker-compose-hubeau.yml down 
+// Stop the MongoDB, Hubeau jobs and Kano containers erasing DB data
+docker-compose -f docker-compose.yml -f docker-compose-hubeau.yml down -v

Wait a couple of minutes so that the jobs feeds the database with the latest observations then point your browser to localhost:8080. You should see something like this once connected if you display the observations layer, zoom in and pick a station:

installation

docker-compose-hubeau.yml - Used to deploy Hubeau jobs containers.
yml
version: '3.3'
+
+services:
+  kano:
+    environment:
+      - LAYERS_FILTER=OSM PLAN_IGN HUBEAU_HYDRO
+  hubeau-stations:
+    image: kalisio/k-hubeau:hydro-stations-latest
+    environment:
+      - DB_URL=mongodb://mongodb:27017/kano
+      - DEBUG
+    networks:
+      - kano
+  hubeau-observations:
+    image: kalisio/k-hubeau:hydro-observations-latest
+    environment:
+      - DB_URL=mongodb://mongodb:27017/kano
+      - DEBUG
+    depends_on:
+      hubeau-stations:
+        condition: service_healthy
+    networks:
+      - kano

TIP

You should activate the built-in Hub'Eau layers like HUBEAU_HYDRO in Kano using the LAYERS_FILTER environment variable.

From source code

First you have to ensure the KDK prerequisites to run Kano from source code.

WARNING

At the time of writing Kano v2.x (master branch) is expected to work with KDK modules v2.x (master branch and Node.js 16.x) and Kano v1.x (test branches) is expected to work with KDK modules v1.x (Node.js 12.x)

Then the following commands, assuming you have a MongoDB instance running on local host and default port (27017), should launch your local instance of Kano:

bash
// Clone KDK
+git clone https://github.com/kalisio/kdk.git
+cd kdk
+yarn install
+yarn link
+
+// In another terminal clone Kano
+git clone https://github.com/kalisio/kano.git
+
+// Set the most minimalist environment to run server
+export APP_SECRET="xxx"
+export LAYERS_FILTER="OSM PLAN_IGN CESIUM_ELLIPSOID"
+
+// Run the server/API
+cd kano/api
+// Copy custom configuration files
+cp local.js config
+cp my-layers.js config/layers
+yarn install
+yarn link @kalisio/kdk
+yarn dev
+
+// In another terminal run the client app
+cd kano
+yarn install
+yarn link @kalisio/kdk
+yarn dev

Point your browser to localhost:8080.

Add weather forecasts

Instead of using Docker containers you can directly install Weacast from the source code as well by following this guide. You should however take care of port conflicts as it uses the same than Kano by default (API and NodeJS debugger), the following commands should do the job:

bash
// Clone Weacast
+git clone https://github.com/weacast/weacast.git
+cd weacast
+yarn install
+
+// Set the most minimalist environment to run server
+export PORT="8082"
+export NODE_OPTIONS="--inspect-port=9230"
+export LOADERS="gfs"
+
+// Run the server/API
+cd packages/api
+yarn dev

TIP

You should activate the built-in Weacast layers like WIND_TILED in Kano using the LAYERS_FILTER environment variable.

Add krawler jobs

Instead of using Docker containers you can directly install Krawler from the source code as well by following this guide and retrieve/run required jobs manually, it's notably useful when developing new jobs:

bash
git clone https://github.com/kalisio/krawler
+cd krawler
+yarn install
+yarn link
+// Now you can proceed with your jobs
+git clone https://github.com/kalisio/k-hubeau
+yarn install
+yarn link @kalisio/krawler
+// Set the most minimalist environment to run the jobs
+export DB_URL=mongodb://mongodb:27017/kano
+// Now you can launch the jobs manually using the krawler CLI
+krawler ./jobfile-hydro-stations.js
+krawler ./jobfile-hydro-observations.js
`,46),k=[h];function o(r,d,c,g,E,y){return i(),a("div",null,k)}const m=s(t,[["render",o]]);export{u as __pageData,m as default}; diff --git a/assets/guides_installing-services.md.7c3d9c58.js b/assets/guides_installing-services.md.7c3d9c58.js deleted file mode 100644 index 82990c3a..00000000 --- a/assets/guides_installing-services.md.7c3d9c58.js +++ /dev/null @@ -1,187 +0,0 @@ -import{_ as s,o as a,c as n,Q as o}from"./chunks/framework.f7d371db.js";const C=JSON.parse('{"title":"Installing services","description":"","frontmatter":{"sidebarDepth":3},"headers":[],"relativePath":"guides/installing-services.md","filePath":"guides/installing-services.md"}'),l={name:"guides/installing-services.md"},p=o(`

Installing services

Using Kargo

You can easily connect Kano with geospatial services deployed by Kargo through its API gateway. First add the Kano application/consumer in the gateway configuration by generating a UUID:

users: {
-  my_user: {
-    'kano': {
-      scopes: ['wms', 'wmts', 'tms', 'wfs', 'wcs', 'k2'],
-      credential: {
-        type: 'jwt',
-        keyId: '9ba09ead-23e1-4020-9994-aa9130782b09',
-        keySecret: '\${APP_SECRET}'
-      }
-    }
-  }
-}
users: {
-  my_user: {
-    'kano': {
-      scopes: ['wms', 'wmts', 'tms', 'wfs', 'wcs', 'k2'],
-      credential: {
-        type: 'jwt',
-        keyId: '9ba09ead-23e1-4020-9994-aa9130782b09',
-        keySecret: '\${APP_SECRET}'
-      }
-    }
-  }
-}

Then add the following environment variables before launching the Kano backend:

bash
// Setup the target gateway
-export API_GATEWAY_URL="https://api.your.kargo.domain"
-export APP_ID="9ba09ead-23e1-4020-9994-aa9130782b09"
-yarn dev
// Setup the target gateway
-export API_GATEWAY_URL="https://api.your.kargo.domain"
-export APP_ID="9ba09ead-23e1-4020-9994-aa9130782b09"
-yarn dev

This will automatically generate a valid token for the gateway once you log in and add it to any request targeting a service behind the gateway.

Kargo can also automatically deploy for you krawler jobs, Kapture, Geokoder, K2, etc. as services.

Using Docker

As for Kano we provide Docker images on the Docker Hub to ease deploying your own service instances. Although it's possible to directly run Docker commands we provide you with docker-compose files to ease deployment, in addition to minimalist configuration files. These files will be detailed in the following sections and are available in the public folder of the documentation.

Add gateway

The following commands and additional docker-compose file should do the job:

bash
// Run the Gateway and Kano containers
-docker-compose -f docker-compose.yml -f docker-compose-gateway.yml up -d
-// Stop the Gateway and Kano containers
-docker-compose -f docker-compose.yml -f docker-compose-gateway.yml down
-// Stop the Gateway and Kano containers erasing DB data
-docker-compose -f docker-compose.yml -f docker-compose-gateway.yml down -v
// Run the Gateway and Kano containers
-docker-compose -f docker-compose.yml -f docker-compose-gateway.yml up -d
-// Stop the Gateway and Kano containers
-docker-compose -f docker-compose.yml -f docker-compose-gateway.yml down
-// Stop the Gateway and Kano containers erasing DB data
-docker-compose -f docker-compose.yml -f docker-compose-gateway.yml down -v
docker-compose-gateway.yml - Used to deploy gateway container.
yml
version: '3.3'
-
-services:
-  kano:
-    environment:
-      - API_GATEWAY_URL=http://localhost:8082
-  gateway:
-    image: kalisio/express-gateway:1.16.9
-    environment:
-      - KAPTURE_URL=http://kapture:3000
-      - GEOKODER_URL=http://geokoder:8080
-    volumes:
-      - type: bind
-        source: ./gateway.config.yml
-        target: /var/lib/eg/gateway.config.yml
-    ports:
-      - "8082:8080"
-    networks:
-      - kano
version: '3.3'
-
-services:
-  kano:
-    environment:
-      - API_GATEWAY_URL=http://localhost:8082
-  gateway:
-    image: kalisio/express-gateway:1.16.9
-    environment:
-      - KAPTURE_URL=http://kapture:3000
-      - GEOKODER_URL=http://geokoder:8080
-    volumes:
-      - type: bind
-        source: ./gateway.config.yml
-        target: /var/lib/eg/gateway.config.yml
-    ports:
-      - "8082:8080"
-    networks:
-      - kano

Add kapture

Kano integrates smoothly with Kapture in order to perform customizable screenshots, i.e. map prints.

The following commands and additional docker-compose file should do the job:

bash
// Run the Gateway, Kapture and Kano containers
-docker-compose -f docker-compose.yml -f docker-compose-gateway.yml -f docker-compose-kapture.yml up -d
-// Stop the Gateway, Kapture and Kano containers
-docker-compose -f docker-compose.yml -f docker-compose-gateway.yml -f docker-compose-kapture.yml down
-// Stop the Gateway, Kapture and Kano containers erasing DB data
-docker-compose -f docker-compose.yml -f docker-compose-gateway.yml -f docker-compose-kapture.yml down -v
// Run the Gateway, Kapture and Kano containers
-docker-compose -f docker-compose.yml -f docker-compose-gateway.yml -f docker-compose-kapture.yml up -d
-// Stop the Gateway, Kapture and Kano containers
-docker-compose -f docker-compose.yml -f docker-compose-gateway.yml -f docker-compose-kapture.yml down
-// Stop the Gateway, Kapture and Kano containers erasing DB data
-docker-compose -f docker-compose.yml -f docker-compose-gateway.yml -f docker-compose-kapture.yml down -v
docker-compose-kapture.yml - Used to deploy kapture container.
yml
version: '3.3'
-
-services:
-  kapture:
-    image: kalisio/kapture:latest
-    environment:
-      - KANO_URL=http://kano:8081
-      - KANO_JWT=eyJhbGciOiJIUzI1NiIsInR5cCI6ImFjY2VzcyJ9.eyJhdWQiOiJrYWxpc2lvIiwiaXNzIjoia2FsaXNpbyJ9._HslaK0hTlISw_wGkUJYmpZdcNuWWGB1iHJDApeJxWk
-      - DEBUG=kapture*
-    ports:
-      - "8083:3000"
-    networks:
-      - kano
version: '3.3'
-
-services:
-  kapture:
-    image: kalisio/kapture:latest
-    environment:
-      - KANO_URL=http://kano:8081
-      - KANO_JWT=eyJhbGciOiJIUzI1NiIsInR5cCI6ImFjY2VzcyJ9.eyJhdWQiOiJrYWxpc2lvIiwiaXNzIjoia2FsaXNpbyJ9._HslaK0hTlISw_wGkUJYmpZdcNuWWGB1iHJDApeJxWk
-      - DEBUG=kapture*
-    ports:
-      - "8083:3000"
-    networks:
-      - kano

Add geokoder

Kano integrates smoothly with Geokoder in order to perform geocoding.

The following commands and additional docker-compose file should do the job:

bash
// Run the Gateway, Geokoder and Kano containers
-docker-compose -f docker-compose.yml -f docker-compose-gateway.yml -f docker-compose-geokoder.yml up -d
-// Stop the Gateway, Geokoder and Kano containers
-docker-compose -f docker-compose.yml -f docker-compose-gateway.yml -f docker-compose-geokoder.yml down
-// Stop the Gateway, Geokoder and Kano containers erasing DB data
-docker-compose -f docker-compose.yml -f docker-compose-gateway.yml -f docker-compose-geokoder.yml down -v
// Run the Gateway, Geokoder and Kano containers
-docker-compose -f docker-compose.yml -f docker-compose-gateway.yml -f docker-compose-geokoder.yml up -d
-// Stop the Gateway, Geokoder and Kano containers
-docker-compose -f docker-compose.yml -f docker-compose-gateway.yml -f docker-compose-geokoder.yml down
-// Stop the Gateway, Geokoder and Kano containers erasing DB data
-docker-compose -f docker-compose.yml -f docker-compose-gateway.yml -f docker-compose-geokoder.yml down -v
docker-compose-geokoder.yml - Used to deploy geokoder container.
yml
version: '3.3'
-
-services:
-  geokoder:
-    image: kalisio/geokoder:latest
-    environment:
-      - DEBUG=geokoder*
-    volumes:
-      - type: bind
-        source: ./local-geokoder.cjs
-        target: /geokoder/config/local.cjs
-    ports:
-      - "8084:8080"
-    networks:
-      - kano
version: '3.3'
-
-services:
-  geokoder:
-    image: kalisio/geokoder:latest
-    environment:
-      - DEBUG=geokoder*
-    volumes:
-      - type: bind
-        source: ./local-geokoder.cjs
-        target: /geokoder/config/local.cjs
-    ports:
-      - "8084:8080"
-    networks:
-      - kano

Add k2

Coming soon

From source code

First you have to ensure the KDK prerequisites to run services from source code.

Add gateway

As the goal here is not to test, inspect or develop the gateway itself, but rather the underlying services, we will run the gateway using a Docker container in host network mode to ensure it can access services deployed on your localhost:

bash
docker run --name="gateway" --network="host" --rm --init -it -e "PORT=8082" -e "KAPTURE_URL=http://localhost:8083" -e "GEOKODER_URL=http://localhost:8084" --mount type=bind,source=./gateway.config.yml,target=/var/lib/eg/gateway.config.yml,readonly kalisio/express-gateway:1.16.9
docker run --name="gateway" --network="host" --rm --init -it -e "PORT=8082" -e "KAPTURE_URL=http://localhost:8083" -e "GEOKODER_URL=http://localhost:8084" --mount type=bind,source=./gateway.config.yml,target=/var/lib/eg/gateway.config.yml,readonly kalisio/express-gateway:1.16.9

TIP

To get details about the gateway.config.yml file used to deploy gateway container please refer to the previous Docker-based section.

After launching the gateway change the following environment variables before launching the Kano backend:

bash
// Setup the target gateway
-export API_GATEWAY_URL="http://localhost:8082"
-yarn dev
// Setup the target gateway
-export API_GATEWAY_URL="http://localhost:8082"
-yarn dev

Add kapture

Once Kano and the gateway are running, the following commands should launch your local instance of Kapture:

bash
// Clone Kapture
-git clone https://github.com/kalisio/geokoder.git
-cd geokoder
-yarn install
-// Set the most minimalist environment to run server
-export PORT="8083"
-export NODE_OPTIONS="--inspect-port=9233"
-export KANO_URL="http://localhost:8080"
-export KANO_JWT="eyJhbGciOiJIUzI1NiIsInR5cCI6ImFjY2VzcyJ9.eyJhdWQiOiJrYWxpc2lvIiwiaXNzIjoia2FsaXNpbyJ9._HslaK0hTlISw_wGkUJYmpZdcNuWWGB1iHJDApeJxWk"
-yarn dev
// Clone Kapture
-git clone https://github.com/kalisio/geokoder.git
-cd geokoder
-yarn install
-// Set the most minimalist environment to run server
-export PORT="8083"
-export NODE_OPTIONS="--inspect-port=9233"
-export KANO_URL="http://localhost:8080"
-export KANO_JWT="eyJhbGciOiJIUzI1NiIsInR5cCI6ImFjY2VzcyJ9.eyJhdWQiOiJrYWxpc2lvIiwiaXNzIjoia2FsaXNpbyJ9._HslaK0hTlISw_wGkUJYmpZdcNuWWGB1iHJDApeJxWk"
-yarn dev

Add geokoder

Once Kano and the gateway is running, the following commands should launch your local instance of Geokoder:

bash
// Clone Geokoder
-git clone https://github.com/kalisio/geokoder.git
-cd geokoder
-yarn install
-// Copy local configuration (see previous Docker-based deployment section)
-cp local-geokoder.cjs ./config/local.cjs
-// Set the most minimalist environment to run server
-export PORT="8084"
-export NODE_OPTIONS="--inspect-port=9234"
-yarn dev
// Clone Geokoder
-git clone https://github.com/kalisio/geokoder.git
-cd geokoder
-yarn install
-// Copy local configuration (see previous Docker-based deployment section)
-cp local-geokoder.cjs ./config/local.cjs
-// Set the most minimalist environment to run server
-export PORT="8084"
-export NODE_OPTIONS="--inspect-port=9234"
-yarn dev

Add k2

Coming soon

`,42),e=[p];function t(c,r,y,E,i,F){return a(),n("div",null,e)}const h=s(l,[["render",t]]);export{C as __pageData,h as default}; diff --git a/assets/guides_installing-services.md.7c3d9c58.lean.js b/assets/guides_installing-services.md.7c3d9c58.lean.js deleted file mode 100644 index 4b1f2eba..00000000 --- a/assets/guides_installing-services.md.7c3d9c58.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as s,o as a,c as n,Q as o}from"./chunks/framework.f7d371db.js";const C=JSON.parse('{"title":"Installing services","description":"","frontmatter":{"sidebarDepth":3},"headers":[],"relativePath":"guides/installing-services.md","filePath":"guides/installing-services.md"}'),l={name:"guides/installing-services.md"},p=o("",42),e=[p];function t(c,r,y,E,i,F){return a(),n("div",null,e)}const h=s(l,[["render",t]]);export{C as __pageData,h as default}; diff --git a/assets/guides_installing-services.md.dsJfA9g8.js b/assets/guides_installing-services.md.dsJfA9g8.js new file mode 100644 index 00000000..db49e062 --- /dev/null +++ b/assets/guides_installing-services.md.dsJfA9g8.js @@ -0,0 +1,94 @@ +import{_ as s,c as a,o as i,V as n}from"./chunks/framework.J61Sinzt.js";const y=JSON.parse('{"title":"Installing services","description":"","frontmatter":{"sidebarDepth":3},"headers":[],"relativePath":"guides/installing-services.md","filePath":"guides/installing-services.md"}'),e={name:"guides/installing-services.md"},t=n(`

Installing services

Using Kargo

You can easily connect Kano with geospatial services deployed by Kargo through its API gateway. First add the Kano application/consumer in the gateway configuration by generating a UUID:

users: {
+  my_user: {
+    'kano': {
+      scopes: ['wms', 'wmts', 'tms', 'wfs', 'wcs', 'k2'],
+      credential: {
+        type: 'jwt',
+        keyId: '9ba09ead-23e1-4020-9994-aa9130782b09',
+        keySecret: '\${APP_SECRET}'
+      }
+    }
+  }
+}

Then add the following environment variables before launching the Kano backend:

bash
// Setup the target gateway
+export API_GATEWAY_URL="https://api.your.kargo.domain"
+export APP_ID="9ba09ead-23e1-4020-9994-aa9130782b09"
+yarn dev

This will automatically generate a valid token for the gateway once you log in and add it to any request targeting a service behind the gateway.

Kargo can also automatically deploy for you krawler jobs, Kapture, Geokoder, K2, etc. as services.

Using Docker

As for Kano we provide Docker images on the Docker Hub to ease deploying your own service instances. Although it's possible to directly run Docker commands we provide you with docker-compose files to ease deployment, in addition to minimalist configuration files. These files will be detailed in the following sections and are available in the public folder of the documentation.

Add gateway

The following commands and additional docker-compose file should do the job:

bash
// Run the Gateway and Kano containers
+docker-compose -f docker-compose.yml -f docker-compose-gateway.yml up -d
+// Stop the Gateway and Kano containers
+docker-compose -f docker-compose.yml -f docker-compose-gateway.yml down
+// Stop the Gateway and Kano containers erasing DB data
+docker-compose -f docker-compose.yml -f docker-compose-gateway.yml down -v
docker-compose-gateway.yml - Used to deploy gateway container.
yml
version: '3.3'
+
+services:
+  kano:
+    environment:
+      - API_GATEWAY_URL=http://localhost:8082
+  gateway:
+    image: kalisio/express-gateway:1.16.9
+    environment:
+      - KAPTURE_URL=http://kapture:3000
+      - GEOKODER_URL=http://geokoder:8080
+    volumes:
+      - type: bind
+        source: ./gateway.config.yml
+        target: /var/lib/eg/gateway.config.yml
+    ports:
+      - "8082:8080"
+    networks:
+      - kano

Add kapture

Kano integrates smoothly with Kapture in order to perform customizable screenshots, i.e. map prints.

The following commands and additional docker-compose file should do the job:

bash
// Run the Gateway, Kapture and Kano containers
+docker-compose -f docker-compose.yml -f docker-compose-gateway.yml -f docker-compose-kapture.yml up -d
+// Stop the Gateway, Kapture and Kano containers
+docker-compose -f docker-compose.yml -f docker-compose-gateway.yml -f docker-compose-kapture.yml down
+// Stop the Gateway, Kapture and Kano containers erasing DB data
+docker-compose -f docker-compose.yml -f docker-compose-gateway.yml -f docker-compose-kapture.yml down -v
docker-compose-kapture.yml - Used to deploy kapture container.
yml
version: '3.3'
+
+services:
+  kapture:
+    image: kalisio/kapture:latest
+    environment:
+      - KANO_URL=http://kano:8081
+      - KANO_JWT=eyJhbGciOiJIUzI1NiIsInR5cCI6ImFjY2VzcyJ9.eyJhdWQiOiJrYWxpc2lvIiwiaXNzIjoia2FsaXNpbyJ9._HslaK0hTlISw_wGkUJYmpZdcNuWWGB1iHJDApeJxWk
+      - DEBUG=kapture*
+    ports:
+      - "8083:3000"
+    networks:
+      - kano

Add geokoder

Kano integrates smoothly with Geokoder in order to perform geocoding.

The following commands and additional docker-compose file should do the job:

bash
// Run the Gateway, Geokoder and Kano containers
+docker-compose -f docker-compose.yml -f docker-compose-gateway.yml -f docker-compose-geokoder.yml up -d
+// Stop the Gateway, Geokoder and Kano containers
+docker-compose -f docker-compose.yml -f docker-compose-gateway.yml -f docker-compose-geokoder.yml down
+// Stop the Gateway, Geokoder and Kano containers erasing DB data
+docker-compose -f docker-compose.yml -f docker-compose-gateway.yml -f docker-compose-geokoder.yml down -v
docker-compose-geokoder.yml - Used to deploy geokoder container.
yml
version: '3.3'
+
+services:
+  geokoder:
+    image: kalisio/geokoder:latest
+    environment:
+      - DEBUG=geokoder*
+    volumes:
+      - type: bind
+        source: ./local-geokoder.cjs
+        target: /geokoder/config/local.cjs
+    ports:
+      - "8084:8080"
+    networks:
+      - kano

Add k2

Coming soon

From source code

First you have to ensure the KDK prerequisites to run services from source code.

Add gateway

As the goal here is not to test, inspect or develop the gateway itself, but rather the underlying services, we will run the gateway using a Docker container in host network mode to ensure it can access services deployed on your localhost:

bash
docker run --name="gateway" --network="host" --rm --init -it -e "PORT=8082" -e "KAPTURE_URL=http://localhost:8083" -e "GEOKODER_URL=http://localhost:8084" --mount type=bind,source=./gateway.config.yml,target=/var/lib/eg/gateway.config.yml,readonly kalisio/express-gateway:1.16.9

TIP

To get details about the gateway.config.yml file used to deploy gateway container please refer to the previous Docker-based section.

After launching the gateway change the following environment variables before launching the Kano backend:

bash
// Setup the target gateway
+export API_GATEWAY_URL="http://localhost:8082"
+yarn dev

Add kapture

Once Kano and the gateway are running, the following commands should launch your local instance of Kapture:

bash
// Clone Kapture
+git clone https://github.com/kalisio/geokoder.git
+cd geokoder
+yarn install
+// Set the most minimalist environment to run server
+export PORT="8083"
+export NODE_OPTIONS="--inspect-port=9233"
+export KANO_URL="http://localhost:8080"
+export KANO_JWT="eyJhbGciOiJIUzI1NiIsInR5cCI6ImFjY2VzcyJ9.eyJhdWQiOiJrYWxpc2lvIiwiaXNzIjoia2FsaXNpbyJ9._HslaK0hTlISw_wGkUJYmpZdcNuWWGB1iHJDApeJxWk"
+yarn dev

Add geokoder

Once Kano and the gateway is running, the following commands should launch your local instance of Geokoder:

bash
// Clone Geokoder
+git clone https://github.com/kalisio/geokoder.git
+cd geokoder
+yarn install
+// Copy local configuration (see previous Docker-based deployment section)
+cp local-geokoder.cjs ./config/local.cjs
+// Set the most minimalist environment to run server
+export PORT="8084"
+export NODE_OPTIONS="--inspect-port=9234"
+yarn dev

Add k2

Coming soon

`,42),l=[t];function p(h,k,o,r,d,c){return i(),a("div",null,l)}const F=s(e,[["render",p]]);export{y as __pageData,F as default}; diff --git a/assets/guides_installing-services.md.dsJfA9g8.lean.js b/assets/guides_installing-services.md.dsJfA9g8.lean.js new file mode 100644 index 00000000..635d3ceb --- /dev/null +++ b/assets/guides_installing-services.md.dsJfA9g8.lean.js @@ -0,0 +1 @@ +import{_ as s,c as a,o as i,V as n}from"./chunks/framework.J61Sinzt.js";const y=JSON.parse('{"title":"Installing services","description":"","frontmatter":{"sidebarDepth":3},"headers":[],"relativePath":"guides/installing-services.md","filePath":"guides/installing-services.md"}'),e={name:"guides/installing-services.md"},t=n("",42),l=[t];function p(h,k,o,r,d,c){return i(),a("div",null,l)}const F=s(e,[["render",p]]);export{y as __pageData,F as default}; diff --git a/assets/guides_kano-api.md.09576fcd.js b/assets/guides_kano-api.md.09576fcd.js deleted file mode 100644 index 894e451c..00000000 --- a/assets/guides_kano-api.md.09576fcd.js +++ /dev/null @@ -1,237 +0,0 @@ -import{_ as e,C as p,o as t,c,H as s,Q as o,k as l,a as r}from"./chunks/framework.f7d371db.js";const E="/kano/assets/kano-rte.c057494f.jpg",i="/kano/assets/grafana-rte-overview.069b8c99.png",y="/kano/assets/grafana-rte-details.5a9be0f0.png",u="/kano/assets/grafana-rte-architecture.d828668a.png",P=JSON.parse('{"title":"Using the Kano API","description":"","frontmatter":{"sidebarDepth":3},"headers":[],"relativePath":"guides/kano-api.md","filePath":"guides/kano-api.md"}'),q={name:"guides/kano-api.md"},d=o(`

Using the Kano API

Description

Kano exposes an API endpoint that can be used to query data stored in it's underlying MongoDB database. The API will return JSON documents when queried. The endpoint is located on $KANO_ROOT_URL/api/

What's available

This depends on which layers are declared in your Kano configuration. For each layer declaring a set of features services, the api will expose the service's data through an URL formed by the API endpoint slash the service name.

Example

If your Kano instance is exposed through https://kano.foo.xyz then the api is available on https://kano.foo.xyz/api. If for example you have the hubeau hydro layer enabled (which instanciate both a hubeau-hydro-stations and a hubeau-hydro-observations features services), then the api will expose it's data on https://kano.foo.xyz/api/hubeau-hydro-stations and https://kano.foo.xyz/api/hubeau-hydro-observations

Authentication

In order to access the API, clients must authenticate themselves. We use JWT tokens to authenticate access to Kano. Those can be added as an HTTP query parameter, using jwt=$your_token or can be passed through the Authorization HTTP header, using the Bearer scheme.

Generate a JWT token

Kano supports stateless tokens, i.e. tokens not associated to a user, either to access the backend API or to automatically login when using it through an iframe. To generate a token you can use https://jwt.io with your app secret and the default header:

json
{
-  "alg": "HS256",
-  "typ": "JWT"
-}
{
-  "alg": "HS256",
-  "typ": "JWT"
-}

Your payload should at least look like this:

json
{
-  "name": "your token id",
-  "iss": "kalisio",
-  "aud": "your app domain"
-}
{
-  "name": "your token id",
-  "iss": "kalisio",
-  "aud": "your app domain"
-}

You can also add others token properties like an expiration date (exp).

TIP

In development mode aud=kalisio by default, all token options can be configured at authentication.jwtOptions in the API configuration.

Queries

Queries to the Kano API are made to specific features services data which in turn query their specific underlying MongoDB collection. The way to query those collections is to use Feathers queries through REST URLs. In addition to those, we added in the KDK a few handy shortcuts to express commonly used queries. Here are some of the most useful query examples.

Request available stations

Typical use case is to display the stations on a map.

`,19),h=l("h3",{id:"request-available-observations",tabindex:"-1"},[r("Request available observations "),l("a",{class:"header-anchor",href:"#request-available-observations","aria-label":'Permalink to "Request available observations"'},"​")],-1),F=l("p",null,"Typical use case is to retrieve the raw observations. You can filter spatially (i.e. bounding box) and temporally (i.e. time range) with most recent first.",-1),C=o(`
Result sample
json
{
-  "type": "FeatureCollection",
-  "features": [
-    {
-      "_id": "5f23ce6071b0b00008dff53f",
-      "type": "Feature",
-      "time": "2020-07-31T07:30:00.000Z",
-      "geometry": {
-          "type": "Point",
-          "coordinates": [
-              -0.12606156299146137,
-              45.02191991211479
-          ]
-      },
-      "properties": {
-          "name": "L'Isle à Abzac",
-          "code_station": "#P726151001",
-          "H": 0.397
-      }
-    },
-    {
-      "_id": "5f23caea71b0b00008dfe457",
-      "type": "Feature",
-      "time": "2020-07-31T07:25:00.000Z",
-      "geometry": {
-          "type": "Point",
-          "coordinates": [
-              -0.12606156299146137,
-              45.02191991211479
-          ]
-      },
-      "properties": {
-          "name": "L'Isle à Abzac",
-          "code_station": "#P726151001",
-          "H": 0.398
-      }
-    },
-    ...
-  ]
-}
{
-  "type": "FeatureCollection",
-  "features": [
-    {
-      "_id": "5f23ce6071b0b00008dff53f",
-      "type": "Feature",
-      "time": "2020-07-31T07:30:00.000Z",
-      "geometry": {
-          "type": "Point",
-          "coordinates": [
-              -0.12606156299146137,
-              45.02191991211479
-          ]
-      },
-      "properties": {
-          "name": "L'Isle à Abzac",
-          "code_station": "#P726151001",
-          "H": 0.397
-      }
-    },
-    {
-      "_id": "5f23caea71b0b00008dfe457",
-      "type": "Feature",
-      "time": "2020-07-31T07:25:00.000Z",
-      "geometry": {
-          "type": "Point",
-          "coordinates": [
-              -0.12606156299146137,
-              45.02191991211479
-          ]
-      },
-      "properties": {
-          "name": "L'Isle à Abzac",
-          "code_station": "#P726151001",
-          "H": 0.398
-      }
-    },
-    ...
-  ]
-}

Request observations at a station

Typical use case is to display a timeserie for the station.

`,3),m=o(`
Result sample
json
{
-  "type": "FeatureCollection",
-  "features": [
-    {
-      "_id": {
-        "code_station": "#X331001001"
-      },
-      "time": {
-        "H": [
-          "2020-07-29T13:40:00.000Z",
-          "2020-07-29T13:45:00.000Z",
-          "2020-07-29T13:50:00.000Z",
-          ...
-        ],
-        "Q": [
-          "2020-07-29T13:40:00.000Z",
-          "2020-07-29T13:45:00.000Z",
-          "2020-07-29T13:50:00.000Z",
-          ...
-        ]
-      },
-      "type": "Feature",
-      "properties": {
-        "name": "La Durance à Cavaillon",
-        "code_station": "#X331001001",
-        "H": [
-          0.815,
-          0.815,
-          0.821,
-          ...
-        ],
-        "Q": [
-          36.87,
-          36.87,
-          37.458,
-          ...
-        ]
-      },
-      "geometry": {
-        "type": "Point",
-        "coordinates": [
-          5.032432216493836,
-          43.82748690979179
-        ]
-      }
-    }
-  ]
-}
{
-  "type": "FeatureCollection",
-  "features": [
-    {
-      "_id": {
-        "code_station": "#X331001001"
-      },
-      "time": {
-        "H": [
-          "2020-07-29T13:40:00.000Z",
-          "2020-07-29T13:45:00.000Z",
-          "2020-07-29T13:50:00.000Z",
-          ...
-        ],
-        "Q": [
-          "2020-07-29T13:40:00.000Z",
-          "2020-07-29T13:45:00.000Z",
-          "2020-07-29T13:50:00.000Z",
-          ...
-        ]
-      },
-      "type": "Feature",
-      "properties": {
-        "name": "La Durance à Cavaillon",
-        "code_station": "#X331001001",
-        "H": [
-          0.815,
-          0.815,
-          0.821,
-          ...
-        ],
-        "Q": [
-          36.87,
-          36.87,
-          37.458,
-          ...
-        ]
-      },
-      "geometry": {
-        "type": "Point",
-        "coordinates": [
-          5.032432216493836,
-          43.82748690979179
-        ]
-      }
-    }
-  ]
-}

Request latest observations at (a) station(s)

Typical use case is to retrieve most recent observations for the station, or display the observations on a map if not filtering by a station ID.

`,3),b=o(`
Result sample
json
{
-  "type": "FeatureCollection",
-  "features": [
-    {
-      "_id": "64917e8ec06fb0000887fd3a",
-      "geometry": {
-        "coordinates": [
-          1.3351479476905552,
-          47.584957074484784
-        ],
-        "type": "Point"
-      },
-      "properties": {
-        "H": -0.84,
-        "Q": 127,
-        "code_station": "#K447001001",
-        "name": "La Loire à Blois"
-      },
-      "time": {
-        "H": "2023-06-20T09:20:00.000Z",
-        "Q": "2023-06-20T09:20:00.000Z"
-      },
-      "type": "Feature"
-    }
-  ]
-}
{
-  "type": "FeatureCollection",
-  "features": [
-    {
-      "_id": "64917e8ec06fb0000887fd3a",
-      "geometry": {
-        "coordinates": [
-          1.3351479476905552,
-          47.584957074484784
-        ],
-        "type": "Point"
-      },
-      "properties": {
-        "H": -0.84,
-        "Q": 127,
-        "code_station": "#K447001001",
-        "name": "La Loire à Blois"
-      },
-      "time": {
-        "H": "2023-06-20T09:20:00.000Z",
-        "Q": "2023-06-20T09:20:00.000Z"
-      },
-      "type": "Feature"
-    }
-  ]
-}

Use case example

We used the Kano API to expose French nuclear power production data to a set of Grafana dashboards.

We first developed a Krawler job whose task is to scrap power production data and to push it into Kano's backing MongoDB database. On Kano's side, we added a layer declaring a feature service pointing on the database collections the Krawler job was populating. From that time, nuclear power production data was available for display in Kano. Here's what it looks like :

Nucler power production data in Kano

Once the collections started being populated, we looked for ways to connect Grafana to Kano's API endpoint. For this we used the Infinity Grafana datasource plugin allowing us to use it's JSON scrapping capabilities to feed Grafana. We created a JWT token for the datasource to be able to reach Kano's API. After creating dashboards and looking up some docs, we ended up with a set of synthetic dashboards:

Nuclear power production overview in GrafanaNuclear power production detail in Grafana

Overall, here's the architecture of the whole solution :

Whole use case architecture

',9);function g(f,B,_,k,v,T){const a=p("Badge"),n=p("template-url");return t(),c("div",null,[d,s(a,{text:"HTTP - GET",vertical:"middle"}),s(n,{text:"https://your.kano.domain/api/hubeau-hydro-stations?south=44.96479793033104&north=45.02695045318546&west=-0.17578125&east=-0.087890625&jwt=your_token","url-template":"https://kano.<%= domain %>/api/hubeau-hydro-stations?south=44.96479793033104&north=45.02695045318546&west=-0.17578125&east=-0.087890625&jwt=<%= jwt %>"}),h,F,s(a,{text:"HTTP - GET",vertical:"middle"}),s(n,{text:"https://your.kano.domain/api/hubeau-hydro-observations?south=44&north=45&west=-0.5&east=0.5&time[$gte]=start_time&time[$lte]=end_time&$sort[time]=-1&jwt=your_token","url-template":"https://kano.<%= domain %>/api/hubeau-hydro-observations?south=44&north=45&west=-0.5&east=0.5&time[$gte]=<%= moment.utc().subtract(1, 'hours').format() %>&time[$lte]=<%= moment.utc().format() %>&$sort[time]=-1&jwt=<%= jwt %>"}),C,s(a,{text:"HTTP - GET",vertical:"middle"}),s(n,{text:"https://your.kano.domain/api/hubeau-hydro-observations?$groupBy=code_station&$aggregate[0]=H&$aggregate[1]=Q&properties.code_station=#X331001001&time[$gte]=start_time&time[$lte]=end_time&jwt=your_token","url-template":"https://kano.<%= domain %>/api/hubeau-hydro-observations?$groupBy=code_station&$aggregate[0]=H&$aggregate[1]=Q&properties.code_station=%23X331001001&time[$gte]=<%= moment.utc().subtract(1, 'days').format() %>&time[$lte]=<%= moment.utc().format() %>&jwt=<%= jwt %>"}),m,s(a,{text:"HTTP - GET",vertical:"middle"}),s(n,{text:"https://your.kano.domain/api/hubeau-hydro-observations?$groupBy=code_station&$aggregate[0]=H&$aggregate[1]=Q&properties.code_station=%23K447001001&time[$lte]=end_time&$limit=1&$sort[time]=-1&jwt=your_token","url-template":"https://kano.<%= domain %>/api/hubeau-hydro-observations?$groupBy=code_station&$aggregate[0]=H&$aggregate[1]=Q&properties.code_station=%23K447001001&time[$lte]=<%= moment.utc().format() %>&$limit=1&$sort[time]=-1&jwt=<%= jwt %>"}),b])}const x=e(q,[["render",g]]);export{P as __pageData,x as default}; diff --git a/assets/guides_kano-api.md.09576fcd.lean.js b/assets/guides_kano-api.md.09576fcd.lean.js deleted file mode 100644 index b5be1f96..00000000 --- a/assets/guides_kano-api.md.09576fcd.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as e,C as p,o as t,c,H as s,Q as o,k as l,a as r}from"./chunks/framework.f7d371db.js";const E="/kano/assets/kano-rte.c057494f.jpg",i="/kano/assets/grafana-rte-overview.069b8c99.png",y="/kano/assets/grafana-rte-details.5a9be0f0.png",u="/kano/assets/grafana-rte-architecture.d828668a.png",P=JSON.parse('{"title":"Using the Kano API","description":"","frontmatter":{"sidebarDepth":3},"headers":[],"relativePath":"guides/kano-api.md","filePath":"guides/kano-api.md"}'),q={name:"guides/kano-api.md"},d=o("",19),h=l("h3",{id:"request-available-observations",tabindex:"-1"},[r("Request available observations "),l("a",{class:"header-anchor",href:"#request-available-observations","aria-label":'Permalink to "Request available observations"'},"​")],-1),F=l("p",null,"Typical use case is to retrieve the raw observations. You can filter spatially (i.e. bounding box) and temporally (i.e. time range) with most recent first.",-1),C=o("",3),m=o("",3),b=o("",9);function g(f,B,_,k,v,T){const a=p("Badge"),n=p("template-url");return t(),c("div",null,[d,s(a,{text:"HTTP - GET",vertical:"middle"}),s(n,{text:"https://your.kano.domain/api/hubeau-hydro-stations?south=44.96479793033104&north=45.02695045318546&west=-0.17578125&east=-0.087890625&jwt=your_token","url-template":"https://kano.<%= domain %>/api/hubeau-hydro-stations?south=44.96479793033104&north=45.02695045318546&west=-0.17578125&east=-0.087890625&jwt=<%= jwt %>"}),h,F,s(a,{text:"HTTP - GET",vertical:"middle"}),s(n,{text:"https://your.kano.domain/api/hubeau-hydro-observations?south=44&north=45&west=-0.5&east=0.5&time[$gte]=start_time&time[$lte]=end_time&$sort[time]=-1&jwt=your_token","url-template":"https://kano.<%= domain %>/api/hubeau-hydro-observations?south=44&north=45&west=-0.5&east=0.5&time[$gte]=<%= moment.utc().subtract(1, 'hours').format() %>&time[$lte]=<%= moment.utc().format() %>&$sort[time]=-1&jwt=<%= jwt %>"}),C,s(a,{text:"HTTP - GET",vertical:"middle"}),s(n,{text:"https://your.kano.domain/api/hubeau-hydro-observations?$groupBy=code_station&$aggregate[0]=H&$aggregate[1]=Q&properties.code_station=#X331001001&time[$gte]=start_time&time[$lte]=end_time&jwt=your_token","url-template":"https://kano.<%= domain %>/api/hubeau-hydro-observations?$groupBy=code_station&$aggregate[0]=H&$aggregate[1]=Q&properties.code_station=%23X331001001&time[$gte]=<%= moment.utc().subtract(1, 'days').format() %>&time[$lte]=<%= moment.utc().format() %>&jwt=<%= jwt %>"}),m,s(a,{text:"HTTP - GET",vertical:"middle"}),s(n,{text:"https://your.kano.domain/api/hubeau-hydro-observations?$groupBy=code_station&$aggregate[0]=H&$aggregate[1]=Q&properties.code_station=%23K447001001&time[$lte]=end_time&$limit=1&$sort[time]=-1&jwt=your_token","url-template":"https://kano.<%= domain %>/api/hubeau-hydro-observations?$groupBy=code_station&$aggregate[0]=H&$aggregate[1]=Q&properties.code_station=%23K447001001&time[$lte]=<%= moment.utc().format() %>&$limit=1&$sort[time]=-1&jwt=<%= jwt %>"}),b])}const x=e(q,[["render",g]]);export{P as __pageData,x as default}; diff --git a/assets/guides_kano-api.md.C-5U0JYH.js b/assets/guides_kano-api.md.C-5U0JYH.js new file mode 100644 index 00000000..ff1821be --- /dev/null +++ b/assets/guides_kano-api.md.C-5U0JYH.js @@ -0,0 +1,119 @@ +import{_ as l,c as h,J as s,V as t,m as n,a as p,E as e,o as k}from"./chunks/framework.J61Sinzt.js";const o="/kano/assets/kano-rte.2x4yX1Rm.jpg",r="/kano/assets/grafana-rte-overview.UOC7RY4V.png",E="/kano/assets/grafana-rte-details.OOc5BCVu.png",d="/kano/assets/grafana-rte-architecture.paPX6MO5.png",P=JSON.parse('{"title":"Using the Kano API","description":"","frontmatter":{"sidebarDepth":3},"headers":[],"relativePath":"guides/kano-api.md","filePath":"guides/kano-api.md"}'),u={name:"guides/kano-api.md"},c=t(`

Using the Kano API

Description

Kano exposes an API endpoint that can be used to query data stored in it's underlying MongoDB database. The API will return JSON documents when queried. The endpoint is located on $KANO_ROOT_URL/api/

What's available

This depends on which layers are declared in your Kano configuration. For each layer declaring a set of features services, the api will expose the service's data through an URL formed by the API endpoint slash the service name.

Example

If your Kano instance is exposed through https://kano.foo.xyz then the api is available on https://kano.foo.xyz/api. If for example you have the hubeau hydro layer enabled (which instanciate both a hubeau-hydro-stations and a hubeau-hydro-observations features services), then the api will expose it's data on https://kano.foo.xyz/api/hubeau-hydro-stations and https://kano.foo.xyz/api/hubeau-hydro-observations

Authentication

In order to access the API, clients must authenticate themselves. We use JWT tokens to authenticate access to Kano. Those can be added as an HTTP query parameter, using jwt=$your_token or can be passed through the Authorization HTTP header, using the Bearer scheme.

Generate a JWT token

Kano supports stateless tokens, i.e. tokens not associated to a user, either to access the backend API or to automatically login when using it through an iframe. To generate a token you can use https://jwt.io with your app secret and the default header:

json
{
+  "alg": "HS256",
+  "typ": "JWT"
+}

Your payload should at least look like this:

json
{
+  "name": "your token id",
+  "iss": "kalisio",
+  "aud": "your app domain"
+}

You can also add others token properties like an expiration date (exp).

TIP

In development mode aud=kalisio by default, all token options can be configured at authentication.jwtOptions in the API configuration.

Queries

Queries to the Kano API are made to specific features services data which in turn query their specific underlying MongoDB collection. The way to query those collections is to use Feathers queries through REST URLs. In addition to those, we added in the KDK a few handy shortcuts to express commonly used queries. Here are some of the most useful query examples.

Request available stations

Typical use case is to display the stations on a map.

`,19),g=n("h3",{id:"request-available-observations",tabindex:"-1"},[p("Request available observations "),n("a",{class:"header-anchor",href:"#request-available-observations","aria-label":'Permalink to "Request available observations"'},"​")],-1),y=n("p",null,"Typical use case is to retrieve the raw observations. You can filter spatially (i.e. bounding box) and temporally (i.e. time range) with most recent first.",-1),F=t(`
Result sample
json
{
+  "type": "FeatureCollection",
+  "features": [
+    {
+      "_id": "5f23ce6071b0b00008dff53f",
+      "type": "Feature",
+      "time": "2020-07-31T07:30:00.000Z",
+      "geometry": {
+          "type": "Point",
+          "coordinates": [
+              -0.12606156299146137,
+              45.02191991211479
+          ]
+      },
+      "properties": {
+          "name": "L'Isle à Abzac",
+          "code_station": "#P726151001",
+          "H": 0.397
+      }
+    },
+    {
+      "_id": "5f23caea71b0b00008dfe457",
+      "type": "Feature",
+      "time": "2020-07-31T07:25:00.000Z",
+      "geometry": {
+          "type": "Point",
+          "coordinates": [
+              -0.12606156299146137,
+              45.02191991211479
+          ]
+      },
+      "properties": {
+          "name": "L'Isle à Abzac",
+          "code_station": "#P726151001",
+          "H": 0.398
+      }
+    },
+    ...
+  ]
+}

Request observations at a station

Typical use case is to display a timeserie for the station.

`,3),q=t(`
Result sample
json
{
+  "type": "FeatureCollection",
+  "features": [
+    {
+      "_id": {
+        "code_station": "#X331001001"
+      },
+      "time": {
+        "H": [
+          "2020-07-29T13:40:00.000Z",
+          "2020-07-29T13:45:00.000Z",
+          "2020-07-29T13:50:00.000Z",
+          ...
+        ],
+        "Q": [
+          "2020-07-29T13:40:00.000Z",
+          "2020-07-29T13:45:00.000Z",
+          "2020-07-29T13:50:00.000Z",
+          ...
+        ]
+      },
+      "type": "Feature",
+      "properties": {
+        "name": "La Durance à Cavaillon",
+        "code_station": "#X331001001",
+        "H": [
+          0.815,
+          0.815,
+          0.821,
+          ...
+        ],
+        "Q": [
+          36.87,
+          36.87,
+          37.458,
+          ...
+        ]
+      },
+      "geometry": {
+        "type": "Point",
+        "coordinates": [
+          5.032432216493836,
+          43.82748690979179
+        ]
+      }
+    }
+  ]
+}

Request latest observations at (a) station(s)

Typical use case is to retrieve most recent observations for the station, or display the observations on a map if not filtering by a station ID.

`,3),C=t(`
Result sample
json
{
+  "type": "FeatureCollection",
+  "features": [
+    {
+      "_id": "64917e8ec06fb0000887fd3a",
+      "geometry": {
+        "coordinates": [
+          1.3351479476905552,
+          47.584957074484784
+        ],
+        "type": "Point"
+      },
+      "properties": {
+        "H": -0.84,
+        "Q": 127,
+        "code_station": "#K447001001",
+        "name": "La Loire à Blois"
+      },
+      "time": {
+        "H": "2023-06-20T09:20:00.000Z",
+        "Q": "2023-06-20T09:20:00.000Z"
+      },
+      "type": "Feature"
+    }
+  ]
+}

Use case example

We used the Kano API to expose French nuclear power production data to a set of Grafana dashboards.

We first developed a Krawler job whose task is to scrap power production data and to push it into Kano's backing MongoDB database. On Kano's side, we added a layer declaring a feature service pointing on the database collections the Krawler job was populating. From that time, nuclear power production data was available for display in Kano. Here's what it looks like :

Nucler power production data in Kano

Once the collections started being populated, we looked for ways to connect Grafana to Kano's API endpoint. For this we used the Infinity Grafana datasource plugin allowing us to use it's JSON scrapping capabilities to feed Grafana. We created a JWT token for the datasource to be able to reach Kano's API. After creating dashboards and looking up some docs, we ended up with a set of synthetic dashboards:

Nuclear power production overview in GrafanaNuclear power production detail in Grafana

Overall, here's the architecture of the whole solution :

Whole use case architecture

',9);function m(b,B,f,_,v,T){const a=e("Badge"),i=e("template-url");return k(),h("div",null,[c,s(a,{text:"HTTP - GET",vertical:"middle"}),s(i,{text:"https://your.kano.domain/api/hubeau-hydro-stations?south=44.96479793033104&north=45.02695045318546&west=-0.17578125&east=-0.087890625&jwt=your_token","url-template":"https://kano.<%= domain %>/api/hubeau-hydro-stations?south=44.96479793033104&north=45.02695045318546&west=-0.17578125&east=-0.087890625&jwt=<%= jwt %>"}),g,y,s(a,{text:"HTTP - GET",vertical:"middle"}),s(i,{text:"https://your.kano.domain/api/hubeau-hydro-observations?south=44&north=45&west=-0.5&east=0.5&time[$gte]=start_time&time[$lte]=end_time&$sort[time]=-1&jwt=your_token","url-template":"https://kano.<%= domain %>/api/hubeau-hydro-observations?south=44&north=45&west=-0.5&east=0.5&time[$gte]=<%= moment.utc().subtract(1, 'hours').format() %>&time[$lte]=<%= moment.utc().format() %>&$sort[time]=-1&jwt=<%= jwt %>"}),F,s(a,{text:"HTTP - GET",vertical:"middle"}),s(i,{text:"https://your.kano.domain/api/hubeau-hydro-observations?$groupBy=code_station&$aggregate[0]=H&$aggregate[1]=Q&properties.code_station=#X331001001&time[$gte]=start_time&time[$lte]=end_time&jwt=your_token","url-template":"https://kano.<%= domain %>/api/hubeau-hydro-observations?$groupBy=code_station&$aggregate[0]=H&$aggregate[1]=Q&properties.code_station=%23X331001001&time[$gte]=<%= moment.utc().subtract(1, 'days').format() %>&time[$lte]=<%= moment.utc().format() %>&jwt=<%= jwt %>"}),q,s(a,{text:"HTTP - GET",vertical:"middle"}),s(i,{text:"https://your.kano.domain/api/hubeau-hydro-observations?$groupBy=code_station&$aggregate[0]=H&$aggregate[1]=Q&properties.code_station=%23K447001001&time[$lte]=end_time&$limit=1&$sort[time]=-1&jwt=your_token","url-template":"https://kano.<%= domain %>/api/hubeau-hydro-observations?$groupBy=code_station&$aggregate[0]=H&$aggregate[1]=Q&properties.code_station=%23K447001001&time[$lte]=<%= moment.utc().format() %>&$limit=1&$sort[time]=-1&jwt=<%= jwt %>"}),C])}const x=l(u,[["render",m]]);export{P as __pageData,x as default}; diff --git a/assets/guides_kano-api.md.C-5U0JYH.lean.js b/assets/guides_kano-api.md.C-5U0JYH.lean.js new file mode 100644 index 00000000..04e846db --- /dev/null +++ b/assets/guides_kano-api.md.C-5U0JYH.lean.js @@ -0,0 +1 @@ +import{_ as l,c as h,J as s,V as t,m as n,a as p,E as e,o as k}from"./chunks/framework.J61Sinzt.js";const o="/kano/assets/kano-rte.2x4yX1Rm.jpg",r="/kano/assets/grafana-rte-overview.UOC7RY4V.png",E="/kano/assets/grafana-rte-details.OOc5BCVu.png",d="/kano/assets/grafana-rte-architecture.paPX6MO5.png",P=JSON.parse('{"title":"Using the Kano API","description":"","frontmatter":{"sidebarDepth":3},"headers":[],"relativePath":"guides/kano-api.md","filePath":"guides/kano-api.md"}'),u={name:"guides/kano-api.md"},c=t("",19),g=n("h3",{id:"request-available-observations",tabindex:"-1"},[p("Request available observations "),n("a",{class:"header-anchor",href:"#request-available-observations","aria-label":'Permalink to "Request available observations"'},"​")],-1),y=n("p",null,"Typical use case is to retrieve the raw observations. You can filter spatially (i.e. bounding box) and temporally (i.e. time range) with most recent first.",-1),F=t("",3),q=t("",3),C=t("",9);function m(b,B,f,_,v,T){const a=e("Badge"),i=e("template-url");return k(),h("div",null,[c,s(a,{text:"HTTP - GET",vertical:"middle"}),s(i,{text:"https://your.kano.domain/api/hubeau-hydro-stations?south=44.96479793033104&north=45.02695045318546&west=-0.17578125&east=-0.087890625&jwt=your_token","url-template":"https://kano.<%= domain %>/api/hubeau-hydro-stations?south=44.96479793033104&north=45.02695045318546&west=-0.17578125&east=-0.087890625&jwt=<%= jwt %>"}),g,y,s(a,{text:"HTTP - GET",vertical:"middle"}),s(i,{text:"https://your.kano.domain/api/hubeau-hydro-observations?south=44&north=45&west=-0.5&east=0.5&time[$gte]=start_time&time[$lte]=end_time&$sort[time]=-1&jwt=your_token","url-template":"https://kano.<%= domain %>/api/hubeau-hydro-observations?south=44&north=45&west=-0.5&east=0.5&time[$gte]=<%= moment.utc().subtract(1, 'hours').format() %>&time[$lte]=<%= moment.utc().format() %>&$sort[time]=-1&jwt=<%= jwt %>"}),F,s(a,{text:"HTTP - GET",vertical:"middle"}),s(i,{text:"https://your.kano.domain/api/hubeau-hydro-observations?$groupBy=code_station&$aggregate[0]=H&$aggregate[1]=Q&properties.code_station=#X331001001&time[$gte]=start_time&time[$lte]=end_time&jwt=your_token","url-template":"https://kano.<%= domain %>/api/hubeau-hydro-observations?$groupBy=code_station&$aggregate[0]=H&$aggregate[1]=Q&properties.code_station=%23X331001001&time[$gte]=<%= moment.utc().subtract(1, 'days').format() %>&time[$lte]=<%= moment.utc().format() %>&jwt=<%= jwt %>"}),q,s(a,{text:"HTTP - GET",vertical:"middle"}),s(i,{text:"https://your.kano.domain/api/hubeau-hydro-observations?$groupBy=code_station&$aggregate[0]=H&$aggregate[1]=Q&properties.code_station=%23K447001001&time[$lte]=end_time&$limit=1&$sort[time]=-1&jwt=your_token","url-template":"https://kano.<%= domain %>/api/hubeau-hydro-observations?$groupBy=code_station&$aggregate[0]=H&$aggregate[1]=Q&properties.code_station=%23K447001001&time[$lte]=<%= moment.utc().format() %>&$limit=1&$sort[time]=-1&jwt=<%= jwt %>"}),C])}const x=l(u,[["render",m]]);export{P as __pageData,x as default}; diff --git a/assets/guides_understanding-kano.md.cd408bac.js b/assets/guides_understanding-kano.md.IWOf-sHQ.js similarity index 96% rename from assets/guides_understanding-kano.md.cd408bac.js rename to assets/guides_understanding-kano.md.IWOf-sHQ.js index a4f2b285..4e3f4fcb 100644 --- a/assets/guides_understanding-kano.md.cd408bac.js +++ b/assets/guides_understanding-kano.md.IWOf-sHQ.js @@ -1 +1 @@ -import{_ as e,o as a,c as t,Q as o}from"./chunks/framework.f7d371db.js";const n="/kano/assets/kano-components.226482af.png",f=JSON.parse('{"title":"Understanding Kano","description":"","frontmatter":{"sidebarDepth":3},"headers":[],"relativePath":"guides/understanding-kano.md","filePath":"guides/understanding-kano.md"}'),i={name:"guides/understanding-kano.md"},s=o('

Understanding Kano

Kano is a powerful geospatial visualizer supporting advanced visualization capabilities in 2D and 3D thanks to hardware acceleration with WebGL technology. Driven by today's most advanced web technologies, it also enables tracking your geospatial assets in real-time.

Although Kano is a web application for end-users, it has also been designed to be integrated in third-party business applications and customized by developers (check out advanced usage). Using a single and simple API, Kano provides developers with the capability to easily develop 2D and 3D geospatial applications (check out the API reference). Last but not least, Kano comes with a built-in configuration for a set of geospatial data (check out installation guide). However, you can complete it with your own spatial data.

Key concepts

Here is a quick rundown of the key concepts to handle when you're just getting started with Kano or geographic information system (GIS). In a nutshell, like any other GIS tool, Kano can be used to map, analyze, and assess real-world problems based on data, which is spatial or geographical in nature.

To achieve this, Kano is composed of two main activities (i.e. entry point for interacting with the user on a given type of objects):

  • a 2D activity to visualise and interact with data on a standard paperless map in 2D,
  • a 3D activity to visualise data and interact with on a virtual globe in 3D.

The view of each activity can contain a basemap (i.e. a background context), a set of data layers (i.e. business specific data), an extent (i.e. the part of the Earth currently on the screen), and navigation tools to pan and zoom. A layer specifies how a geographic dataset is portrayed on the map or the globe. The final rendering supporting your use case can usually be assembled by adding a serie of layers.

A feature layer is a grouping of similar geographic elements, for example, buildings, cities, roads, earthquake epicenters, etc. Features can be points, lines, or polygons (i.e. vector data). Feature layers are most appropriate for visualizing your own data on top of your basemaps. Using Kano, you can view, save, edit and analyze your own features and their attributes. Moreover, you can include interactive pop-up windows with information about the features. Raster data, most commonly found in remotely sensed data, topographic data, satellite imagery, and aerial imagery, can also be visualized. For this, Kano can leverage OGC standards that use the internet to view, edit, manage and share geospatial data.

Kano manages both space and time information in order to visualize time-varying geospatial phenomena: tracking of moving objects, history of measures taken by a sensor, weather prediction over time, etc. When a layer displays a time-varying dataset you are able to navigate back and forward in time using a timeline to see the data at your requested date/time.

Global overview

The following figure depicts the default 2D activity and the main application components:

Components

TIP

The 3D view is pretty similar to the 2D activity except that some feature might not be yet available.

Each component can be shown/hidden through a handle on the different side of the view:

  • at the top to open the application bar,
  • at the bottom to open the timeline,
  • on the left to open the side/main menu,
  • on the right to open the catalog.

In addition, a floating action button is available in the bottom-right corner to perform some actions.

Check out now our quickstart guide for more details.

',18),r=[s];function l(d,c,p,h,g,u){return a(),t("div",null,r)}const b=e(i,[["render",l]]);export{f as __pageData,b as default}; +import{_ as e,c as a,o as t,V as o}from"./chunks/framework.J61Sinzt.js";const n="/kano/assets/kano-components.PJmlZmLa.png",f=JSON.parse('{"title":"Understanding Kano","description":"","frontmatter":{"sidebarDepth":3},"headers":[],"relativePath":"guides/understanding-kano.md","filePath":"guides/understanding-kano.md"}'),i={name:"guides/understanding-kano.md"},s=o('

Understanding Kano

Kano is a powerful geospatial visualizer supporting advanced visualization capabilities in 2D and 3D thanks to hardware acceleration with WebGL technology. Driven by today's most advanced web technologies, it also enables tracking your geospatial assets in real-time.

Although Kano is a web application for end-users, it has also been designed to be integrated in third-party business applications and customized by developers (check out advanced usage). Using a single and simple API, Kano provides developers with the capability to easily develop 2D and 3D geospatial applications (check out the API reference). Last but not least, Kano comes with a built-in configuration for a set of geospatial data (check out installation guide). However, you can complete it with your own spatial data.

Key concepts

Here is a quick rundown of the key concepts to handle when you're just getting started with Kano or geographic information system (GIS). In a nutshell, like any other GIS tool, Kano can be used to map, analyze, and assess real-world problems based on data, which is spatial or geographical in nature.

To achieve this, Kano is composed of two main activities (i.e. entry point for interacting with the user on a given type of objects):

  • a 2D activity to visualise and interact with data on a standard paperless map in 2D,
  • a 3D activity to visualise data and interact with on a virtual globe in 3D.

The view of each activity can contain a basemap (i.e. a background context), a set of data layers (i.e. business specific data), an extent (i.e. the part of the Earth currently on the screen), and navigation tools to pan and zoom. A layer specifies how a geographic dataset is portrayed on the map or the globe. The final rendering supporting your use case can usually be assembled by adding a serie of layers.

A feature layer is a grouping of similar geographic elements, for example, buildings, cities, roads, earthquake epicenters, etc. Features can be points, lines, or polygons (i.e. vector data). Feature layers are most appropriate for visualizing your own data on top of your basemaps. Using Kano, you can view, save, edit and analyze your own features and their attributes. Moreover, you can include interactive pop-up windows with information about the features. Raster data, most commonly found in remotely sensed data, topographic data, satellite imagery, and aerial imagery, can also be visualized. For this, Kano can leverage OGC standards that use the internet to view, edit, manage and share geospatial data.

Kano manages both space and time information in order to visualize time-varying geospatial phenomena: tracking of moving objects, history of measures taken by a sensor, weather prediction over time, etc. When a layer displays a time-varying dataset you are able to navigate back and forward in time using a timeline to see the data at your requested date/time.

Global overview

The following figure depicts the default 2D activity and the main application components:

Components

TIP

The 3D view is pretty similar to the 2D activity except that some feature might not be yet available.

Each component can be shown/hidden through a handle on the different side of the view:

  • at the top to open the application bar,
  • at the bottom to open the timeline,
  • on the left to open the side/main menu,
  • on the right to open the catalog.

In addition, a floating action button is available in the bottom-right corner to perform some actions.

Check out now our quickstart guide for more details.

',18),r=[s];function l(d,c,p,h,g,u){return t(),a("div",null,r)}const b=e(i,[["render",l]]);export{f as __pageData,b as default}; diff --git a/assets/guides_understanding-kano.md.cd408bac.lean.js b/assets/guides_understanding-kano.md.IWOf-sHQ.lean.js similarity index 61% rename from assets/guides_understanding-kano.md.cd408bac.lean.js rename to assets/guides_understanding-kano.md.IWOf-sHQ.lean.js index 04824d64..81dff1c8 100644 --- a/assets/guides_understanding-kano.md.cd408bac.lean.js +++ b/assets/guides_understanding-kano.md.IWOf-sHQ.lean.js @@ -1 +1 @@ -import{_ as e,o as a,c as t,Q as o}from"./chunks/framework.f7d371db.js";const n="/kano/assets/kano-components.226482af.png",f=JSON.parse('{"title":"Understanding Kano","description":"","frontmatter":{"sidebarDepth":3},"headers":[],"relativePath":"guides/understanding-kano.md","filePath":"guides/understanding-kano.md"}'),i={name:"guides/understanding-kano.md"},s=o("",18),r=[s];function l(d,c,p,h,g,u){return a(),t("div",null,r)}const b=e(i,[["render",l]]);export{f as __pageData,b as default}; +import{_ as e,c as a,o as t,V as o}from"./chunks/framework.J61Sinzt.js";const n="/kano/assets/kano-components.PJmlZmLa.png",f=JSON.parse('{"title":"Understanding Kano","description":"","frontmatter":{"sidebarDepth":3},"headers":[],"relativePath":"guides/understanding-kano.md","filePath":"guides/understanding-kano.md"}'),i={name:"guides/understanding-kano.md"},s=o("",18),r=[s];function l(d,c,p,h,g,u){return t(),a("div",null,r)}const b=e(i,[["render",l]]);export{f as __pageData,b as default}; diff --git a/assets/hubeau-installation.52eb472d.png b/assets/hubeau-installation.AH39zNjO.png similarity index 100% rename from assets/hubeau-installation.52eb472d.png rename to assets/hubeau-installation.AH39zNjO.png diff --git a/assets/index.md.7b179fb5.js b/assets/index.md.Xmx78NTg.js similarity index 73% rename from assets/index.md.7b179fb5.js rename to assets/index.md.Xmx78NTg.js index 5c5c0a00..d54a1718 100644 --- a/assets/index.md.7b179fb5.js +++ b/assets/index.md.Xmx78NTg.js @@ -1 +1 @@ -import{_ as n,C as e,o as i,c as s,H as t,w as l}from"./chunks/framework.f7d371db.js";const g=JSON.parse('{"title":"","description":"","frontmatter":{"layout":"home","hero":{"name":"Kano","tagline":"A powerful real-time Geovisualizer","image":{"src":"https://s3.eu-central-1.amazonaws.com/kalisioscope/kano/kano-icon-256x256.png","alt":"kalisio-kano"},"actions":[{"theme":"brand","text":"Show me more →","link":"/about/introduction"}]},"features":[{"title":"Powerful Geovisualizer","details":"Kano supports advanced visualization capabilities in 2D and 3D thanks to hardware acceleration with WebGL technology"},{"title":"Real-time oriented","details":"Driven by today’s most advanced web technologies, Kano enables real-time tracking of your geospatial assets"},{"title":"Designed to be integrated and customized","details":"Through a single API, Kano provides users with the capability to develop geospatial applications"}]},"headers":[],"relativePath":"index.md","filePath":"index.md"}'),r={name:"index.md"};function c(d,p,m,u,h,_){const a=e("home-footer"),o=e("ClientOnly");return i(),s("div",null,[t(o,null,{default:l(()=>[t(a)]),_:1})])}const v=n(r,[["render",c]]);export{g as __pageData,v as default}; +import{_ as n,c as i,J as e,w as s,E as t,o as l}from"./chunks/framework.J61Sinzt.js";const g=JSON.parse('{"title":"","description":"","frontmatter":{"layout":"home","hero":{"name":"Kano","tagline":"A powerful real-time Geovisualizer","image":{"src":"https://s3.eu-central-1.amazonaws.com/kalisioscope/kano/kano-icon-256x256.png","alt":"kalisio-kano"},"actions":[{"theme":"brand","text":"Show me more →","link":"/about/introduction"}]},"features":[{"title":"Powerful Geovisualizer","details":"Kano supports advanced visualization capabilities in 2D and 3D thanks to hardware acceleration with WebGL technology"},{"title":"Real-time oriented","details":"Driven by today’s most advanced web technologies, Kano enables real-time tracking of your geospatial assets"},{"title":"Designed to be integrated and customized","details":"Through a single API, Kano provides users with the capability to develop geospatial applications"}]},"headers":[],"relativePath":"index.md","filePath":"index.md"}'),r={name:"index.md"};function c(d,p,m,u,h,_){const a=t("HomeFooter"),o=t("ClientOnly");return l(),i("div",null,[e(o,null,{default:s(()=>[e(a)]),_:1})])}const v=n(r,[["render",c]]);export{g as __pageData,v as default}; diff --git a/assets/index.md.7b179fb5.lean.js b/assets/index.md.Xmx78NTg.lean.js similarity index 73% rename from assets/index.md.7b179fb5.lean.js rename to assets/index.md.Xmx78NTg.lean.js index 5c5c0a00..d54a1718 100644 --- a/assets/index.md.7b179fb5.lean.js +++ b/assets/index.md.Xmx78NTg.lean.js @@ -1 +1 @@ -import{_ as n,C as e,o as i,c as s,H as t,w as l}from"./chunks/framework.f7d371db.js";const g=JSON.parse('{"title":"","description":"","frontmatter":{"layout":"home","hero":{"name":"Kano","tagline":"A powerful real-time Geovisualizer","image":{"src":"https://s3.eu-central-1.amazonaws.com/kalisioscope/kano/kano-icon-256x256.png","alt":"kalisio-kano"},"actions":[{"theme":"brand","text":"Show me more →","link":"/about/introduction"}]},"features":[{"title":"Powerful Geovisualizer","details":"Kano supports advanced visualization capabilities in 2D and 3D thanks to hardware acceleration with WebGL technology"},{"title":"Real-time oriented","details":"Driven by today’s most advanced web technologies, Kano enables real-time tracking of your geospatial assets"},{"title":"Designed to be integrated and customized","details":"Through a single API, Kano provides users with the capability to develop geospatial applications"}]},"headers":[],"relativePath":"index.md","filePath":"index.md"}'),r={name:"index.md"};function c(d,p,m,u,h,_){const a=e("home-footer"),o=e("ClientOnly");return i(),s("div",null,[t(o,null,{default:l(()=>[t(a)]),_:1})])}const v=n(r,[["render",c]]);export{g as __pageData,v as default}; +import{_ as n,c as i,J as e,w as s,E as t,o as l}from"./chunks/framework.J61Sinzt.js";const g=JSON.parse('{"title":"","description":"","frontmatter":{"layout":"home","hero":{"name":"Kano","tagline":"A powerful real-time Geovisualizer","image":{"src":"https://s3.eu-central-1.amazonaws.com/kalisioscope/kano/kano-icon-256x256.png","alt":"kalisio-kano"},"actions":[{"theme":"brand","text":"Show me more →","link":"/about/introduction"}]},"features":[{"title":"Powerful Geovisualizer","details":"Kano supports advanced visualization capabilities in 2D and 3D thanks to hardware acceleration with WebGL technology"},{"title":"Real-time oriented","details":"Driven by today’s most advanced web technologies, Kano enables real-time tracking of your geospatial assets"},{"title":"Designed to be integrated and customized","details":"Through a single API, Kano provides users with the capability to develop geospatial applications"}]},"headers":[],"relativePath":"index.md","filePath":"index.md"}'),r={name:"index.md"};function c(d,p,m,u,h,_){const a=t("HomeFooter"),o=t("ClientOnly");return l(),i("div",null,[e(o,null,{default:s(()=>[e(a)]),_:1})])}const v=n(r,[["render",c]]);export{g as __pageData,v as default}; diff --git a/assets/inter-italic-cyrillic-ext.33bd5a8e.woff2 b/assets/inter-italic-cyrillic-ext.OVycGSDq.woff2 similarity index 100% rename from assets/inter-italic-cyrillic-ext.33bd5a8e.woff2 rename to assets/inter-italic-cyrillic-ext.OVycGSDq.woff2 diff --git a/assets/inter-italic-cyrillic.ea42a392.woff2 b/assets/inter-italic-cyrillic.-nLMcIwj.woff2 similarity index 100% rename from assets/inter-italic-cyrillic.ea42a392.woff2 rename to assets/inter-italic-cyrillic.-nLMcIwj.woff2 diff --git a/assets/inter-italic-greek-ext.4fbe9427.woff2 b/assets/inter-italic-greek-ext.hznxWNZO.woff2 similarity index 100% rename from assets/inter-italic-greek-ext.4fbe9427.woff2 rename to assets/inter-italic-greek-ext.hznxWNZO.woff2 diff --git a/assets/inter-italic-greek.8f4463c4.woff2 b/assets/inter-italic-greek.PSfer2Kc.woff2 similarity index 100% rename from assets/inter-italic-greek.8f4463c4.woff2 rename to assets/inter-italic-greek.PSfer2Kc.woff2 diff --git a/assets/inter-italic-latin-ext.bd8920cc.woff2 b/assets/inter-italic-latin-ext.RnFly65-.woff2 similarity index 100% rename from assets/inter-italic-latin-ext.bd8920cc.woff2 rename to assets/inter-italic-latin-ext.RnFly65-.woff2 diff --git a/assets/inter-italic-latin.bd3b6f56.woff2 b/assets/inter-italic-latin.27E69YJn.woff2 similarity index 100% rename from assets/inter-italic-latin.bd3b6f56.woff2 rename to assets/inter-italic-latin.27E69YJn.woff2 diff --git a/assets/inter-italic-vietnamese.6ce511fb.woff2 b/assets/inter-italic-vietnamese.xzQHe1q1.woff2 similarity index 100% rename from assets/inter-italic-vietnamese.6ce511fb.woff2 rename to assets/inter-italic-vietnamese.xzQHe1q1.woff2 diff --git a/assets/inter-roman-cyrillic-ext.e75737ce.woff2 b/assets/inter-roman-cyrillic-ext.8T9wMG5w.woff2 similarity index 100% rename from assets/inter-roman-cyrillic-ext.e75737ce.woff2 rename to assets/inter-roman-cyrillic-ext.8T9wMG5w.woff2 diff --git a/assets/inter-roman-cyrillic.5f2c6c8c.woff2 b/assets/inter-roman-cyrillic.jIZ9REo5.woff2 similarity index 100% rename from assets/inter-roman-cyrillic.5f2c6c8c.woff2 rename to assets/inter-roman-cyrillic.jIZ9REo5.woff2 diff --git a/assets/inter-roman-greek-ext.ab0619bc.woff2 b/assets/inter-roman-greek-ext.9JiNzaSO.woff2 similarity index 100% rename from assets/inter-roman-greek-ext.ab0619bc.woff2 rename to assets/inter-roman-greek-ext.9JiNzaSO.woff2 diff --git a/assets/inter-roman-greek.d5a6d92a.woff2 b/assets/inter-roman-greek.Cb5wWeGA.woff2 similarity index 100% rename from assets/inter-roman-greek.d5a6d92a.woff2 rename to assets/inter-roman-greek.Cb5wWeGA.woff2 diff --git a/assets/inter-roman-latin-ext.0030eebd.woff2 b/assets/inter-roman-latin-ext.GZWE-KO4.woff2 similarity index 100% rename from assets/inter-roman-latin-ext.0030eebd.woff2 rename to assets/inter-roman-latin-ext.GZWE-KO4.woff2 diff --git a/assets/inter-roman-latin.2ed14f66.woff2 b/assets/inter-roman-latin.bvIUbFQP.woff2 similarity index 100% rename from assets/inter-roman-latin.2ed14f66.woff2 rename to assets/inter-roman-latin.bvIUbFQP.woff2 diff --git a/assets/inter-roman-vietnamese.14ce25a6.woff2 b/assets/inter-roman-vietnamese.paY3CzEB.woff2 similarity index 100% rename from assets/inter-roman-vietnamese.14ce25a6.woff2 rename to assets/inter-roman-vietnamese.paY3CzEB.woff2 diff --git a/assets/kano-components.226482af.png b/assets/kano-components.PJmlZmLa.png similarity index 100% rename from assets/kano-components.226482af.png rename to assets/kano-components.PJmlZmLa.png diff --git a/assets/kano-covid-19-layers-3D.99d091d6.png b/assets/kano-covid-19-layers-3D.AY8QJGYX.png similarity index 100% rename from assets/kano-covid-19-layers-3D.99d091d6.png rename to assets/kano-covid-19-layers-3D.AY8QJGYX.png diff --git a/assets/kano-covid-19-layers.42f5160d.png b/assets/kano-covid-19-layers.4K62qXY-.png similarity index 100% rename from assets/kano-covid-19-layers.42f5160d.png rename to assets/kano-covid-19-layers.4K62qXY-.png diff --git a/assets/kano-file-layers.0888f7b0.png b/assets/kano-file-layers.VfIDpJM5.png similarity index 100% rename from assets/kano-file-layers.0888f7b0.png rename to assets/kano-file-layers.VfIDpJM5.png diff --git a/assets/kano-installation.0671227c.png b/assets/kano-installation.opRySSk9.png similarity index 100% rename from assets/kano-installation.0671227c.png rename to assets/kano-installation.opRySSk9.png diff --git a/assets/kano-ogc-layers.1f5edae4.png b/assets/kano-ogc-layers.mPkXU--y.png similarity index 100% rename from assets/kano-ogc-layers.1f5edae4.png rename to assets/kano-ogc-layers.mPkXU--y.png diff --git a/assets/kano-rte.c057494f.jpg b/assets/kano-rte.2x4yX1Rm.jpg similarity index 100% rename from assets/kano-rte.c057494f.jpg rename to assets/kano-rte.2x4yX1Rm.jpg diff --git a/assets/kano-screenshot.8676a0d8.png b/assets/kano-screenshot.JiubhQ4J.png similarity index 100% rename from assets/kano-screenshot.8676a0d8.png rename to assets/kano-screenshot.JiubhQ4J.png diff --git a/assets/kano-sensors-layers.6878ff2a.png b/assets/kano-sensors-layers.1fWLR23M.png similarity index 100% rename from assets/kano-sensors-layers.6878ff2a.png rename to assets/kano-sensors-layers.1fWLR23M.png diff --git a/assets/kano-tour.5df9bce8.png b/assets/kano-tour.7bUQfDzL.png similarity index 100% rename from assets/kano-tour.5df9bce8.png rename to assets/kano-tour.7bUQfDzL.png diff --git a/assets/reference_api.md.97a0b4a2.js b/assets/reference_api.md.wWmT5Fzy.js similarity index 89% rename from assets/reference_api.md.97a0b4a2.js rename to assets/reference_api.md.wWmT5Fzy.js index 6fb01ac4..9224c0da 100644 --- a/assets/reference_api.md.97a0b4a2.js +++ b/assets/reference_api.md.wWmT5Fzy.js @@ -1 +1 @@ -import{_ as e,o as a,c as r,Q as i}from"./chunks/framework.f7d371db.js";const k=JSON.parse('{"title":"Backend API","description":"","frontmatter":{"sidebarDepth":3},"headers":[],"relativePath":"reference/api.md","filePath":"reference/api.md"}'),t={name:"reference/api.md"},o=i('

Backend API

The externally exposed API of the internal Kano services comes from the one provided by the KDK:

Frontend API

The externally exposed API of the internal Kano components (2D map and 3D globe) comes from the one provided by the KDK:

Similarly, most of the internal mapping components come from the KDK.

',7),n=[o];function s(l,p,h,c,m,d){return a(),r("div",null,n)}const _=e(t,[["render",s]]);export{k as __pageData,_ as default}; +import{_ as e,c as a,o as r,V as i}from"./chunks/framework.J61Sinzt.js";const k=JSON.parse('{"title":"Backend API","description":"","frontmatter":{"sidebarDepth":3},"headers":[],"relativePath":"reference/api.md","filePath":"reference/api.md"}'),t={name:"reference/api.md"},o=i('

Backend API

The externally exposed API of the internal Kano services comes from the one provided by the KDK:

Frontend API

The externally exposed API of the internal Kano components (2D map and 3D globe) comes from the one provided by the KDK:

Similarly, most of the internal mapping components come from the KDK.

',7),n=[o];function s(l,p,h,c,m,d){return r(),a("div",null,n)}const _=e(t,[["render",s]]);export{k as __pageData,_ as default}; diff --git a/assets/reference_api.md.97a0b4a2.lean.js b/assets/reference_api.md.wWmT5Fzy.lean.js similarity index 52% rename from assets/reference_api.md.97a0b4a2.lean.js rename to assets/reference_api.md.wWmT5Fzy.lean.js index 7086adac..fce1a828 100644 --- a/assets/reference_api.md.97a0b4a2.lean.js +++ b/assets/reference_api.md.wWmT5Fzy.lean.js @@ -1 +1 @@ -import{_ as e,o as a,c as r,Q as i}from"./chunks/framework.f7d371db.js";const k=JSON.parse('{"title":"Backend API","description":"","frontmatter":{"sidebarDepth":3},"headers":[],"relativePath":"reference/api.md","filePath":"reference/api.md"}'),t={name:"reference/api.md"},o=i("",7),n=[o];function s(l,p,h,c,m,d){return a(),r("div",null,n)}const _=e(t,[["render",s]]);export{k as __pageData,_ as default}; +import{_ as e,c as a,o as r,V as i}from"./chunks/framework.J61Sinzt.js";const k=JSON.parse('{"title":"Backend API","description":"","frontmatter":{"sidebarDepth":3},"headers":[],"relativePath":"reference/api.md","filePath":"reference/api.md"}'),t={name:"reference/api.md"},o=i("",7),n=[o];function s(l,p,h,c,m,d){return r(),a("div",null,n)}const _=e(t,[["render",s]]);export{k as __pageData,_ as default}; diff --git a/assets/reference_configuration.md.1lzXteaM.js b/assets/reference_configuration.md.1lzXteaM.js new file mode 100644 index 00000000..86426dd9 --- /dev/null +++ b/assets/reference_configuration.md.1lzXteaM.js @@ -0,0 +1 @@ +import{_ as t,c as e,o,V as r}from"./chunks/framework.J61Sinzt.js";const h=JSON.parse('{"title":"Configuration","description":"","frontmatter":{"sidebarDepth":3},"headers":[],"relativePath":"reference/configuration.md","filePath":"reference/configuration.md"}'),i={name:"reference/configuration.md"},n=r('

Configuration

The default backend configuration file can be found here.

Most options come from the "standard" backend configuration of KDK based app.

The default frontend configuration file can be found here.

Most options come from the "standard" frontend configuration of KDK based app, here are the main ones:

  • appName: displayed application name,
  • appLogo: displayed application logo,
  • theme: the theme to be used,
  • screens: connection screens configuration
    • banner: displayed application banner,
    • login: login screen configuration
      • providers: array of OAuth2 providers to be used (like ['google', 'github']),
      • links: links displayed at the bottom of the screen,
    • logout: logout screen configuration
      • links: links displayed at the bottom of the screen,
    • changeEndpoint: change endpoint screen configuration (only useful for mobile apps)
      • links: links displayed at the bottom of the screen,
  • layout: layout configuration (see Quasar docs for details)
    • topPane: application bar setup,
      • opener: true to add a handler to open/close the pane,
      • visible: true to show this pane,
    • leftPane: left pane (i.e. main menu) setup (as above),
    • bottomPane: bottom pane setup (as above),
    • rightPane: right pane setup (as above),
    • welcome: true to display the welcome screen by default,
  • mapActivity: 2D map activity configuration
    • topPane: application bar components configuration
      • content: list of components to be displayed according to current mode,
      • filter: component filter using any expression supported by sift,
    • leftPane: left pane (i.e. main menu) components configuration
      • content: list of components to be displayed,
      • filter: component filter using any expression supported by sift,
    • bottomPane: bottom pane components configuration
      • content: list of components to be displayed,
      • filter: component filter using any expression supported by sift,
    • rightPane: right pane components configuration
      • content: list of components to be displayed,
      • filter: component filter using any expression supported by sift,
    • page: page components configuration (can be used to add your own components)
      • content: list of components to be displayed,
      • filter: component filter using any expression supported by sift,
    • window: window (i.e. widgets) configuration
      • widgets: list of widgets to be displayed,
      • filter: component filter using any expression supported by sift,
    • fab: floating action button (FAB) configuration
      • actions: list of actions to be displayed,
      • filter: action filter using any expression supported by sift,
    • catalog: 2D map layers panel configuration
      • filter: layer filter using any expression supported by sift,
      • categories: list of categories to be displayed in 2D map layers panel,
    • layers: 2D map layers configuration
      • actions: list of actions to be displayed,
      • filter: action filter using any expression supported by sift,
    • restore: user context restoration configuration
      • view: set it to true (default) in order to restore the current extent on page refresh
      • layers: set it to true (false by default) in order to restore the current visible layers on page refresh
    • engine: 2D map view configuration
  • globeActivity: 3D globe activity configuration
    • topPane: application bar components configuration
      • content: list of components to be displayed according to current mode,
      • filter: component filter using any expression supported by sift,
    • leftPane: left pane (i.e. main menu) components configuration
      • content: list of components to be displayed,
      • filter: component filter using any expression supported by sift,
    • bottomPane: bottom pane components configuration
      • content: list of components to be displayed,
      • filter: component filter using any expression supported by sift,
    • rightPane: right pane components configuration
      • content: list of components to be displayed,
      • filter: component filter using any expression supported by sift,
    • page: page components configuration (can be used to add your own components)
      • content: list of components to be displayed,
      • filter: component filter using any expression supported by sift,
    • window: window (i.e. widgets) configuration
      • widgets: list of widgets to be displayed,
      • filter: component filter using any expression supported by sift,
    • fab: floating action button (FAB) configuration
      • actions: list of actions to be displayed,
      • filter: action filter using any expression supported by sift,
    • catalog: 3D map layers panel configuration
      • filter: layer filter using any expression supported by sift,
      • categories: list of categories to be displayed in 3D map layers panel,
    • layers: 3D map layers configuration
      • actions: list of actions to be displayed,
      • filter: action filter using any expression supported by sift,
    • catalog: 3D globe layers panel configuration
      • filter: layer filter using any expression supported by sift,
      • categories: list of categories to be displayed in 3D globe layers panel,
    • restore: user context restoration configuration
      • view: set it to true (default) in order to restore the current extent on page refresh
      • layers: set it to true (false by default) in order to restore the current visible layers on page refresh
    • engine: 3D globe view configuration
',6),s=[n];function l(a,g,p,f,u,c){return o(),e("div",null,s)}const b=t(i,[["render",l]]);export{h as __pageData,b as default}; diff --git a/assets/reference_configuration.md.1lzXteaM.lean.js b/assets/reference_configuration.md.1lzXteaM.lean.js new file mode 100644 index 00000000..26d51992 --- /dev/null +++ b/assets/reference_configuration.md.1lzXteaM.lean.js @@ -0,0 +1 @@ +import{_ as t,c as e,o,V as r}from"./chunks/framework.J61Sinzt.js";const h=JSON.parse('{"title":"Configuration","description":"","frontmatter":{"sidebarDepth":3},"headers":[],"relativePath":"reference/configuration.md","filePath":"reference/configuration.md"}'),i={name:"reference/configuration.md"},n=r("",6),s=[n];function l(a,g,p,f,u,c){return o(),e("div",null,s)}const b=t(i,[["render",l]]);export{h as __pageData,b as default}; diff --git a/assets/reference_configuration.md.b1f9295e.js b/assets/reference_configuration.md.b1f9295e.js deleted file mode 100644 index 879bfd7f..00000000 --- a/assets/reference_configuration.md.b1f9295e.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as t,o as e,c as o,Q as r}from"./chunks/framework.f7d371db.js";const h=JSON.parse('{"title":"Configuration","description":"","frontmatter":{"sidebarDepth":3},"headers":[],"relativePath":"reference/configuration.md","filePath":"reference/configuration.md"}'),i={name:"reference/configuration.md"},n=r('

Configuration

The default backend configuration file can be found here.

Most options come from the "standard" backend configuration of KDK based app.

The default frontend configuration file can be found here.

Most options come from the "standard" frontend configuration of KDK based app, here are the main ones:

  • appName: displayed application name,
  • appLogo: displayed application logo,
  • theme: the theme to be used,
  • screens: connection screens configuration
    • banner: displayed application banner,
    • login: login screen configuration
      • providers: array of OAuth2 providers to be used (like ['google', 'github']),
      • links: links displayed at the bottom of the screen,
    • logout: logout screen configuration
      • links: links displayed at the bottom of the screen,
    • changeEndpoint: change endpoint screen configuration (only useful for mobile apps)
      • links: links displayed at the bottom of the screen,
  • layout: layout configuration (see Quasar docs for details)
    • topPane: application bar setup,
      • opener: true to add a handler to open/close the pane,
      • visible: true to show this pane,
    • leftPane: left pane (i.e. main menu) setup (as above),
    • bottomPane: bottom pane setup (as above),
    • rightPane: right pane setup (as above),
    • welcome: true to display the welcome screen by default,
  • mapActivity: 2D map activity configuration
    • topPane: application bar components configuration
      • content: list of components to be displayed according to current mode,
      • filter: component filter using any expression supported by sift,
    • leftPane: left pane (i.e. main menu) components configuration
      • content: list of components to be displayed,
      • filter: component filter using any expression supported by sift,
    • bottomPane: bottom pane components configuration
      • content: list of components to be displayed,
      • filter: component filter using any expression supported by sift,
    • rightPane: right pane components configuration
      • content: list of components to be displayed,
      • filter: component filter using any expression supported by sift,
    • page: page components configuration (can be used to add your own components)
      • content: list of components to be displayed,
      • filter: component filter using any expression supported by sift,
    • window: window (i.e. widgets) configuration
      • widgets: list of widgets to be displayed,
      • filter: component filter using any expression supported by sift,
    • fab: floating action button (FAB) configuration
      • actions: list of actions to be displayed,
      • filter: action filter using any expression supported by sift,
    • catalog: 2D map layers panel configuration
      • filter: layer filter using any expression supported by sift,
      • categories: list of categories to be displayed in 2D map layers panel,
    • layers: 2D map layers configuration
      • actions: list of actions to be displayed,
      • filter: action filter using any expression supported by sift,
    • restore: user context restoration configuration
      • view: set it to true (default) in order to restore the current extent on page refresh
      • layers: set it to true (false by default) in order to restore the current visible layers on page refresh
    • engine: 2D map view configuration
  • globeActivity: 3D globe activity configuration
    • topPane: application bar components configuration
      • content: list of components to be displayed according to current mode,
      • filter: component filter using any expression supported by sift,
    • leftPane: left pane (i.e. main menu) components configuration
      • content: list of components to be displayed,
      • filter: component filter using any expression supported by sift,
    • bottomPane: bottom pane components configuration
      • content: list of components to be displayed,
      • filter: component filter using any expression supported by sift,
    • rightPane: right pane components configuration
      • content: list of components to be displayed,
      • filter: component filter using any expression supported by sift,
    • page: page components configuration (can be used to add your own components)
      • content: list of components to be displayed,
      • filter: component filter using any expression supported by sift,
    • window: window (i.e. widgets) configuration
      • widgets: list of widgets to be displayed,
      • filter: component filter using any expression supported by sift,
    • fab: floating action button (FAB) configuration
      • actions: list of actions to be displayed,
      • filter: action filter using any expression supported by sift,
    • catalog: 3D map layers panel configuration
      • filter: layer filter using any expression supported by sift,
      • categories: list of categories to be displayed in 3D map layers panel,
    • layers: 3D map layers configuration
      • actions: list of actions to be displayed,
      • filter: action filter using any expression supported by sift,
    • catalog: 3D globe layers panel configuration
      • filter: layer filter using any expression supported by sift,
      • categories: list of categories to be displayed in 3D globe layers panel,
    • restore: user context restoration configuration
      • view: set it to true (default) in order to restore the current extent on page refresh
      • layers: set it to true (false by default) in order to restore the current visible layers on page refresh
    • engine: 3D globe view configuration
',6),s=[n];function l(a,g,p,f,u,c){return e(),o("div",null,s)}const b=t(i,[["render",l]]);export{h as __pageData,b as default}; diff --git a/assets/reference_configuration.md.b1f9295e.lean.js b/assets/reference_configuration.md.b1f9295e.lean.js deleted file mode 100644 index 135c344c..00000000 --- a/assets/reference_configuration.md.b1f9295e.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as t,o as e,c as o,Q as r}from"./chunks/framework.f7d371db.js";const h=JSON.parse('{"title":"Configuration","description":"","frontmatter":{"sidebarDepth":3},"headers":[],"relativePath":"reference/configuration.md","filePath":"reference/configuration.md"}'),i={name:"reference/configuration.md"},n=r("",6),s=[n];function l(a,g,p,f,u,c){return e(),o("div",null,s)}const b=t(i,[["render",l]]);export{h as __pageData,b as default}; diff --git a/assets/style.MBIzM7uY.css b/assets/style.MBIzM7uY.css new file mode 100644 index 00000000..8d94593f --- /dev/null +++ b/assets/style.MBIzM7uY.css @@ -0,0 +1 @@ +@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:normal;font-named-instance:"Regular";src:url(/kano/assets/inter-roman-cyrillic.jIZ9REo5.woff2) format("woff2");unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:normal;font-named-instance:"Regular";src:url(/kano/assets/inter-roman-cyrillic-ext.8T9wMG5w.woff2) format("woff2");unicode-range:U+0460-052F,U+1C80-1C88,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:normal;font-named-instance:"Regular";src:url(/kano/assets/inter-roman-greek.Cb5wWeGA.woff2) format("woff2");unicode-range:U+0370-03FF}@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:normal;font-named-instance:"Regular";src:url(/kano/assets/inter-roman-greek-ext.9JiNzaSO.woff2) format("woff2");unicode-range:U+1F00-1FFF}@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:normal;font-named-instance:"Regular";src:url(/kano/assets/inter-roman-latin.bvIUbFQP.woff2) format("woff2");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:normal;font-named-instance:"Regular";src:url(/kano/assets/inter-roman-latin-ext.GZWE-KO4.woff2) format("woff2");unicode-range:U+0100-024F,U+0259,U+1E00-1EFF,U+2020,U+20A0-20AB,U+20AD-20CF,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:normal;font-named-instance:"Regular";src:url(/kano/assets/inter-roman-vietnamese.paY3CzEB.woff2) format("woff2");unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+1EA0-1EF9,U+20AB}@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:italic;font-named-instance:"Italic";src:url(/kano/assets/inter-italic-cyrillic.-nLMcIwj.woff2) format("woff2");unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:italic;font-named-instance:"Italic";src:url(/kano/assets/inter-italic-cyrillic-ext.OVycGSDq.woff2) format("woff2");unicode-range:U+0460-052F,U+1C80-1C88,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:italic;font-named-instance:"Italic";src:url(/kano/assets/inter-italic-greek.PSfer2Kc.woff2) format("woff2");unicode-range:U+0370-03FF}@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:italic;font-named-instance:"Italic";src:url(/kano/assets/inter-italic-greek-ext.hznxWNZO.woff2) format("woff2");unicode-range:U+1F00-1FFF}@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:italic;font-named-instance:"Italic";src:url(/kano/assets/inter-italic-latin.27E69YJn.woff2) format("woff2");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:italic;font-named-instance:"Italic";src:url(/kano/assets/inter-italic-latin-ext.RnFly65-.woff2) format("woff2");unicode-range:U+0100-024F,U+0259,U+1E00-1EFF,U+2020,U+20A0-20AB,U+20AD-20CF,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:italic;font-named-instance:"Italic";src:url(/kano/assets/inter-italic-vietnamese.xzQHe1q1.woff2) format("woff2");unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+1EA0-1EF9,U+20AB}@font-face{font-family:Chinese Quotes;src:local("PingFang SC Regular"),local("PingFang SC"),local("SimHei"),local("Source Han Sans SC");unicode-range:U+2018,U+2019,U+201C,U+201D}:root{--vp-c-white: #ffffff;--vp-c-black: #000000;--vp-c-neutral: var(--vp-c-black);--vp-c-neutral-inverse: var(--vp-c-white)}.dark{--vp-c-neutral: var(--vp-c-white);--vp-c-neutral-inverse: var(--vp-c-black)}:root{--vp-c-gray-1: #dddde3;--vp-c-gray-2: #e4e4e9;--vp-c-gray-3: #ebebef;--vp-c-gray-soft: rgba(142, 150, 170, .14);--vp-c-indigo-1: #3451b2;--vp-c-indigo-2: #3a5ccc;--vp-c-indigo-3: #5672cd;--vp-c-indigo-soft: rgba(100, 108, 255, .14);--vp-c-purple-1: #6f42c1;--vp-c-purple-2: #7e4cc9;--vp-c-purple-3: #8e5cd9;--vp-c-purple-soft: rgba(159, 122, 234, .14);--vp-c-green-1: #18794e;--vp-c-green-2: #299764;--vp-c-green-3: #30a46c;--vp-c-green-soft: rgba(16, 185, 129, .14);--vp-c-yellow-1: #915930;--vp-c-yellow-2: #946300;--vp-c-yellow-3: #9f6a00;--vp-c-yellow-soft: rgba(234, 179, 8, .14);--vp-c-red-1: #b8272c;--vp-c-red-2: #d5393e;--vp-c-red-3: #e0575b;--vp-c-red-soft: rgba(244, 63, 94, .14);--vp-c-sponsor: #db2777}.dark{--vp-c-gray-1: #515c67;--vp-c-gray-2: #414853;--vp-c-gray-3: #32363f;--vp-c-gray-soft: rgba(101, 117, 133, .16);--vp-c-indigo-1: #a8b1ff;--vp-c-indigo-2: #5c73e7;--vp-c-indigo-3: #3e63dd;--vp-c-indigo-soft: rgba(100, 108, 255, .16);--vp-c-purple-1: #c8abfa;--vp-c-purple-2: #a879e6;--vp-c-purple-3: #8e5cd9;--vp-c-purple-soft: rgba(159, 122, 234, .16);--vp-c-green-1: #3dd68c;--vp-c-green-2: #30a46c;--vp-c-green-3: #298459;--vp-c-green-soft: rgba(16, 185, 129, .16);--vp-c-yellow-1: #f9b44e;--vp-c-yellow-2: #da8b17;--vp-c-yellow-3: #a46a0a;--vp-c-yellow-soft: rgba(234, 179, 8, .16);--vp-c-red-1: #f66f81;--vp-c-red-2: #f14158;--vp-c-red-3: #b62a3c;--vp-c-red-soft: rgba(244, 63, 94, .16)}:root{--vp-c-bg: #ffffff;--vp-c-bg-alt: #f6f6f7;--vp-c-bg-elv: #ffffff;--vp-c-bg-soft: #f6f6f7}.dark{--vp-c-bg: #1b1b1f;--vp-c-bg-alt: #161618;--vp-c-bg-elv: #202127;--vp-c-bg-soft: #202127}:root{--vp-c-border: #c2c2c4;--vp-c-divider: #e2e2e3;--vp-c-gutter: #e2e2e3}.dark{--vp-c-border: #3c3f44;--vp-c-divider: #2e2e32;--vp-c-gutter: #000000}:root{--vp-c-text-1: rgba(60, 60, 67);--vp-c-text-2: rgba(60, 60, 67, .78);--vp-c-text-3: rgba(60, 60, 67, .56)}.dark{--vp-c-text-1: rgba(255, 255, 245, .86);--vp-c-text-2: rgba(235, 235, 245, .6);--vp-c-text-3: rgba(235, 235, 245, .38)}:root{--vp-c-default-1: var(--vp-c-gray-1);--vp-c-default-2: var(--vp-c-gray-2);--vp-c-default-3: var(--vp-c-gray-3);--vp-c-default-soft: var(--vp-c-gray-soft);--vp-c-brand-1: var(--vp-c-indigo-1);--vp-c-brand-2: var(--vp-c-indigo-2);--vp-c-brand-3: var(--vp-c-indigo-3);--vp-c-brand-soft: var(--vp-c-indigo-soft);--vp-c-brand: var(--vp-c-brand-1);--vp-c-tip-1: var(--vp-c-brand-1);--vp-c-tip-2: var(--vp-c-brand-2);--vp-c-tip-3: var(--vp-c-brand-3);--vp-c-tip-soft: var(--vp-c-brand-soft);--vp-c-note-1: var(--vp-c-brand-1);--vp-c-note-2: var(--vp-c-brand-2);--vp-c-note-3: var(--vp-c-brand-3);--vp-c-note-soft: var(--vp-c-brand-soft);--vp-c-success-1: var(--vp-c-green-1);--vp-c-success-2: var(--vp-c-green-2);--vp-c-success-3: var(--vp-c-green-3);--vp-c-success-soft: var(--vp-c-green-soft);--vp-c-important-1: var(--vp-c-purple-1);--vp-c-important-2: var(--vp-c-purple-2);--vp-c-important-3: var(--vp-c-purple-3);--vp-c-important-soft: var(--vp-c-purple-soft);--vp-c-warning-1: var(--vp-c-yellow-1);--vp-c-warning-2: var(--vp-c-yellow-2);--vp-c-warning-3: var(--vp-c-yellow-3);--vp-c-warning-soft: var(--vp-c-yellow-soft);--vp-c-danger-1: var(--vp-c-red-1);--vp-c-danger-2: var(--vp-c-red-2);--vp-c-danger-3: var(--vp-c-red-3);--vp-c-danger-soft: var(--vp-c-red-soft);--vp-c-caution-1: var(--vp-c-red-1);--vp-c-caution-2: var(--vp-c-red-2);--vp-c-caution-3: var(--vp-c-red-3);--vp-c-caution-soft: var(--vp-c-red-soft)}:root{--vp-font-family-base: "Chinese Quotes", "Inter var", "Inter", ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Helvetica, Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--vp-font-family-mono: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace}:root{--vp-shadow-1: 0 1px 2px rgba(0, 0, 0, .04), 0 1px 2px rgba(0, 0, 0, .06);--vp-shadow-2: 0 3px 12px rgba(0, 0, 0, .07), 0 1px 4px rgba(0, 0, 0, .07);--vp-shadow-3: 0 12px 32px rgba(0, 0, 0, .1), 0 2px 6px rgba(0, 0, 0, .08);--vp-shadow-4: 0 14px 44px rgba(0, 0, 0, .12), 0 3px 9px rgba(0, 0, 0, .12);--vp-shadow-5: 0 18px 56px rgba(0, 0, 0, .16), 0 4px 12px rgba(0, 0, 0, .16)}:root{--vp-z-index-footer: 10;--vp-z-index-local-nav: 20;--vp-z-index-nav: 30;--vp-z-index-layout-top: 40;--vp-z-index-backdrop: 50;--vp-z-index-sidebar: 60}@media (min-width: 960px){:root{--vp-z-index-sidebar: 25}}:root{--vp-icon-copy: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' height='20' width='20' stroke='rgba(128,128,128,1)' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath stroke-linecap='round' stroke-linejoin='round' d='M9 5H7a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2V7a2 2 0 0 0-2-2h-2M9 5a2 2 0 0 0 2 2h2a2 2 0 0 0 2-2M9 5a2 2 0 0 1 2-2h2a2 2 0 0 1 2 2'/%3E%3C/svg%3E");--vp-icon-copied: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' height='20' width='20' stroke='rgba(128,128,128,1)' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath stroke-linecap='round' stroke-linejoin='round' d='M9 5H7a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2V7a2 2 0 0 0-2-2h-2M9 5a2 2 0 0 0 2 2h2a2 2 0 0 0 2-2M9 5a2 2 0 0 1 2-2h2a2 2 0 0 1 2 2m-6 9 2 2 4-4'/%3E%3C/svg%3E")}:root{--vp-layout-max-width: 1440px}:root{--vp-header-anchor-symbol: "#"}:root{--vp-code-line-height: 1.7;--vp-code-font-size: .875em;--vp-code-color: var(--vp-c-brand-1);--vp-code-link-color: var(--vp-c-brand-1);--vp-code-link-hover-color: var(--vp-c-brand-2);--vp-code-bg: var(--vp-c-default-soft);--vp-code-block-color: var(--vp-c-text-2);--vp-code-block-bg: var(--vp-c-bg-alt);--vp-code-block-divider-color: var(--vp-c-gutter);--vp-code-lang-color: var(--vp-c-text-3);--vp-code-line-highlight-color: var(--vp-c-default-soft);--vp-code-line-number-color: var(--vp-c-text-3);--vp-code-line-diff-add-color: var(--vp-c-success-soft);--vp-code-line-diff-add-symbol-color: var(--vp-c-success-1);--vp-code-line-diff-remove-color: var(--vp-c-danger-soft);--vp-code-line-diff-remove-symbol-color: var(--vp-c-danger-1);--vp-code-line-warning-color: var(--vp-c-warning-soft);--vp-code-line-error-color: var(--vp-c-danger-soft);--vp-code-copy-code-border-color: var(--vp-c-divider);--vp-code-copy-code-bg: var(--vp-c-bg-soft);--vp-code-copy-code-hover-border-color: var(--vp-c-divider);--vp-code-copy-code-hover-bg: var(--vp-c-bg);--vp-code-copy-code-active-text: var(--vp-c-text-2);--vp-code-copy-copied-text-content: "Copied";--vp-code-tab-divider: var(--vp-code-block-divider-color);--vp-code-tab-text-color: var(--vp-c-text-2);--vp-code-tab-bg: var(--vp-code-block-bg);--vp-code-tab-hover-text-color: var(--vp-c-text-1);--vp-code-tab-active-text-color: var(--vp-c-text-1);--vp-code-tab-active-bar-color: var(--vp-c-brand-1)}:root{--vp-button-brand-border: transparent;--vp-button-brand-text: var(--vp-c-white);--vp-button-brand-bg: var(--vp-c-brand-3);--vp-button-brand-hover-border: transparent;--vp-button-brand-hover-text: var(--vp-c-white);--vp-button-brand-hover-bg: var(--vp-c-brand-2);--vp-button-brand-active-border: transparent;--vp-button-brand-active-text: var(--vp-c-white);--vp-button-brand-active-bg: var(--vp-c-brand-1);--vp-button-alt-border: transparent;--vp-button-alt-text: var(--vp-c-text-1);--vp-button-alt-bg: var(--vp-c-default-3);--vp-button-alt-hover-border: transparent;--vp-button-alt-hover-text: var(--vp-c-text-1);--vp-button-alt-hover-bg: var(--vp-c-default-2);--vp-button-alt-active-border: transparent;--vp-button-alt-active-text: var(--vp-c-text-1);--vp-button-alt-active-bg: var(--vp-c-default-1);--vp-button-sponsor-border: var(--vp-c-text-2);--vp-button-sponsor-text: var(--vp-c-text-2);--vp-button-sponsor-bg: transparent;--vp-button-sponsor-hover-border: var(--vp-c-sponsor);--vp-button-sponsor-hover-text: var(--vp-c-sponsor);--vp-button-sponsor-hover-bg: transparent;--vp-button-sponsor-active-border: var(--vp-c-sponsor);--vp-button-sponsor-active-text: var(--vp-c-sponsor);--vp-button-sponsor-active-bg: transparent}:root{--vp-custom-block-font-size: 14px;--vp-custom-block-code-font-size: 13px;--vp-custom-block-info-border: transparent;--vp-custom-block-info-text: var(--vp-c-text-1);--vp-custom-block-info-bg: var(--vp-c-default-soft);--vp-custom-block-info-code-bg: var(--vp-c-default-soft);--vp-custom-block-note-border: transparent;--vp-custom-block-note-text: var(--vp-c-text-1);--vp-custom-block-note-bg: var(--vp-c-default-soft);--vp-custom-block-note-code-bg: var(--vp-c-default-soft);--vp-custom-block-tip-border: transparent;--vp-custom-block-tip-text: var(--vp-c-text-1);--vp-custom-block-tip-bg: var(--vp-c-tip-soft);--vp-custom-block-tip-code-bg: var(--vp-c-tip-soft);--vp-custom-block-important-border: transparent;--vp-custom-block-important-text: var(--vp-c-text-1);--vp-custom-block-important-bg: var(--vp-c-important-soft);--vp-custom-block-important-code-bg: var(--vp-c-important-soft);--vp-custom-block-warning-border: transparent;--vp-custom-block-warning-text: var(--vp-c-text-1);--vp-custom-block-warning-bg: var(--vp-c-warning-soft);--vp-custom-block-warning-code-bg: var(--vp-c-warning-soft);--vp-custom-block-danger-border: transparent;--vp-custom-block-danger-text: var(--vp-c-text-1);--vp-custom-block-danger-bg: var(--vp-c-danger-soft);--vp-custom-block-danger-code-bg: var(--vp-c-danger-soft);--vp-custom-block-caution-border: transparent;--vp-custom-block-caution-text: var(--vp-c-text-1);--vp-custom-block-caution-bg: var(--vp-c-caution-soft);--vp-custom-block-caution-code-bg: var(--vp-c-caution-soft);--vp-custom-block-details-border: var(--vp-custom-block-info-border);--vp-custom-block-details-text: var(--vp-custom-block-info-text);--vp-custom-block-details-bg: var(--vp-custom-block-info-bg);--vp-custom-block-details-code-bg: var(--vp-custom-block-info-code-bg)}:root{--vp-input-border-color: var(--vp-c-border);--vp-input-bg-color: var(--vp-c-bg-alt);--vp-input-switch-bg-color: var(--vp-c-default-soft)}:root{--vp-nav-height: 64px;--vp-nav-bg-color: var(--vp-c-bg);--vp-nav-screen-bg-color: var(--vp-c-bg);--vp-nav-logo-height: 24px}.hide-nav{--vp-nav-height: 0px}.hide-nav .VPSidebar{--vp-nav-height: 22px}:root{--vp-local-nav-bg-color: var(--vp-c-bg)}:root{--vp-sidebar-width: 272px;--vp-sidebar-bg-color: var(--vp-c-bg-alt)}:root{--vp-backdrop-bg-color: rgba(0, 0, 0, .6)}:root{--vp-home-hero-name-color: var(--vp-c-brand-1);--vp-home-hero-name-background: transparent;--vp-home-hero-image-background-image: none;--vp-home-hero-image-filter: none}:root{--vp-badge-info-border: transparent;--vp-badge-info-text: var(--vp-c-text-2);--vp-badge-info-bg: var(--vp-c-default-soft);--vp-badge-tip-border: transparent;--vp-badge-tip-text: var(--vp-c-tip-1);--vp-badge-tip-bg: var(--vp-c-tip-soft);--vp-badge-warning-border: transparent;--vp-badge-warning-text: var(--vp-c-warning-1);--vp-badge-warning-bg: var(--vp-c-warning-soft);--vp-badge-danger-border: transparent;--vp-badge-danger-text: var(--vp-c-danger-1);--vp-badge-danger-bg: var(--vp-c-danger-soft)}:root{--vp-carbon-ads-text-color: var(--vp-c-text-1);--vp-carbon-ads-poweredby-color: var(--vp-c-text-2);--vp-carbon-ads-bg-color: var(--vp-c-bg-soft);--vp-carbon-ads-hover-text-color: var(--vp-c-brand-1);--vp-carbon-ads-hover-poweredby-color: var(--vp-c-text-1)}:root{--vp-local-search-bg: var(--vp-c-bg);--vp-local-search-result-bg: var(--vp-c-bg);--vp-local-search-result-border: var(--vp-c-divider);--vp-local-search-result-selected-bg: var(--vp-c-bg);--vp-local-search-result-selected-border: var(--vp-c-brand-1);--vp-local-search-highlight-bg: var(--vp-c-brand-1);--vp-local-search-highlight-text: var(--vp-c-neutral-inverse)}@media (prefers-reduced-motion: reduce){*,:before,:after{animation-delay:-1ms!important;animation-duration:1ms!important;animation-iteration-count:1!important;background-attachment:initial!important;scroll-behavior:auto!important;transition-duration:0s!important;transition-delay:0s!important}}*,:before,:after{box-sizing:border-box}html{line-height:1.4;font-size:16px;-webkit-text-size-adjust:100%}html.dark{color-scheme:dark}body{margin:0;width:100%;min-width:320px;min-height:100vh;line-height:24px;font-family:var(--vp-font-family-base);font-size:16px;font-weight:400;color:var(--vp-c-text-1);background-color:var(--vp-c-bg);font-synthesis:style;text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}main{display:block}h1,h2,h3,h4,h5,h6{margin:0;line-height:24px;font-size:16px;font-weight:400}p{margin:0}strong,b{font-weight:600}a,area,button,[role=button],input,label,select,summary,textarea{touch-action:manipulation}a{color:inherit;text-decoration:inherit}ol,ul{list-style:none;margin:0;padding:0}blockquote{margin:0}pre,code,kbd,samp{font-family:var(--vp-font-family-mono)}img,svg,video,canvas,audio,iframe,embed,object{display:block}figure{margin:0}img,video{max-width:100%;height:auto}button,input,optgroup,select,textarea{border:0;padding:0;line-height:inherit;color:inherit}button{padding:0;font-family:inherit;background-color:transparent;background-image:none}button:enabled,[role=button]:enabled{cursor:pointer}button:focus,button:focus-visible{outline:1px dotted;outline:4px auto -webkit-focus-ring-color}button:focus:not(:focus-visible){outline:none!important}input:focus,textarea:focus,select:focus{outline:none}table{border-collapse:collapse}input{background-color:transparent}input:-ms-input-placeholder,textarea:-ms-input-placeholder{color:var(--vp-c-text-3)}input::-ms-input-placeholder,textarea::-ms-input-placeholder{color:var(--vp-c-text-3)}input::placeholder,textarea::placeholder{color:var(--vp-c-text-3)}input::-webkit-outer-spin-button,input::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}input[type=number]{-moz-appearance:textfield}textarea{resize:vertical}select{-webkit-appearance:none}fieldset{margin:0;padding:0}h1,h2,h3,h4,h5,h6,li,p{overflow-wrap:break-word}vite-error-overlay{z-index:9999}mjx-container{display:inline-block;margin:auto 2px -2px}mjx-container>svg{margin:auto}.visually-hidden{position:absolute;width:1px;height:1px;white-space:nowrap;clip:rect(0 0 0 0);clip-path:inset(50%);overflow:hidden}.custom-block{border:1px solid transparent;border-radius:8px;padding:16px 16px 8px;line-height:24px;font-size:var(--vp-custom-block-font-size);color:var(--vp-c-text-2)}.custom-block.info{border-color:var(--vp-custom-block-info-border);color:var(--vp-custom-block-info-text);background-color:var(--vp-custom-block-info-bg)}.custom-block.info a,.custom-block.info code{color:var(--vp-c-brand-1)}.custom-block.info a:hover,.custom-block.info a:hover>code{color:var(--vp-c-brand-2)}.custom-block.info code{background-color:var(--vp-custom-block-info-code-bg)}.custom-block.note{border-color:var(--vp-custom-block-note-border);color:var(--vp-custom-block-note-text);background-color:var(--vp-custom-block-note-bg)}.custom-block.note a,.custom-block.note code{color:var(--vp-c-brand-1)}.custom-block.note a:hover,.custom-block.note a:hover>code{color:var(--vp-c-brand-2)}.custom-block.note code{background-color:var(--vp-custom-block-note-code-bg)}.custom-block.tip{border-color:var(--vp-custom-block-tip-border);color:var(--vp-custom-block-tip-text);background-color:var(--vp-custom-block-tip-bg)}.custom-block.tip a,.custom-block.tip code{color:var(--vp-c-tip-1)}.custom-block.tip a:hover,.custom-block.tip a:hover>code{color:var(--vp-c-tip-2)}.custom-block.tip code{background-color:var(--vp-custom-block-tip-code-bg)}.custom-block.important{border-color:var(--vp-custom-block-important-border);color:var(--vp-custom-block-important-text);background-color:var(--vp-custom-block-important-bg)}.custom-block.important a,.custom-block.important code{color:var(--vp-c-important-1)}.custom-block.important a:hover,.custom-block.important a:hover>code{color:var(--vp-c-important-2)}.custom-block.important code{background-color:var(--vp-custom-block-important-code-bg)}.custom-block.warning{border-color:var(--vp-custom-block-warning-border);color:var(--vp-custom-block-warning-text);background-color:var(--vp-custom-block-warning-bg)}.custom-block.warning a,.custom-block.warning code{color:var(--vp-c-warning-1)}.custom-block.warning a:hover,.custom-block.warning a:hover>code{color:var(--vp-c-warning-2)}.custom-block.warning code{background-color:var(--vp-custom-block-warning-code-bg)}.custom-block.danger{border-color:var(--vp-custom-block-danger-border);color:var(--vp-custom-block-danger-text);background-color:var(--vp-custom-block-danger-bg)}.custom-block.danger a,.custom-block.danger code{color:var(--vp-c-danger-1)}.custom-block.danger a:hover,.custom-block.danger a:hover>code{color:var(--vp-c-danger-2)}.custom-block.danger code{background-color:var(--vp-custom-block-danger-code-bg)}.custom-block.caution{border-color:var(--vp-custom-block-caution-border);color:var(--vp-custom-block-caution-text);background-color:var(--vp-custom-block-caution-bg)}.custom-block.caution a,.custom-block.caution code{color:var(--vp-c-caution-1)}.custom-block.caution a:hover,.custom-block.caution a:hover>code{color:var(--vp-c-caution-2)}.custom-block.caution code{background-color:var(--vp-custom-block-caution-code-bg)}.custom-block.details{border-color:var(--vp-custom-block-details-border);color:var(--vp-custom-block-details-text);background-color:var(--vp-custom-block-details-bg)}.custom-block.details a{color:var(--vp-c-brand-1)}.custom-block.details a:hover,.custom-block.details a:hover>code{color:var(--vp-c-brand-2)}.custom-block.details code{background-color:var(--vp-custom-block-details-code-bg)}.custom-block-title{font-weight:600}.custom-block p+p{margin:8px 0}.custom-block.details summary{margin:0 0 8px;font-weight:700;cursor:pointer;-webkit-user-select:none;user-select:none}.custom-block.details summary+p{margin:8px 0}.custom-block a{color:inherit;font-weight:600;text-decoration:underline;text-underline-offset:2px;transition:opacity .25s}.custom-block a:hover{opacity:.75}.custom-block code{font-size:var(--vp-custom-block-code-font-size)}.custom-block.custom-block th,.custom-block.custom-block blockquote>p{font-size:var(--vp-custom-block-font-size);color:inherit}.dark .vp-code span{color:var(--shiki-dark, inherit)}html:not(.dark) .vp-code span{color:var(--shiki-light, inherit)}.vp-code-group{margin-top:16px}.vp-code-group .tabs{position:relative;display:flex;margin-right:-24px;margin-left:-24px;padding:0 12px;background-color:var(--vp-code-tab-bg);overflow-x:auto;overflow-y:hidden;box-shadow:inset 0 -1px var(--vp-code-tab-divider)}@media (min-width: 640px){.vp-code-group .tabs{margin-right:0;margin-left:0;border-radius:8px 8px 0 0}}.vp-code-group .tabs input{position:fixed;opacity:0;pointer-events:none}.vp-code-group .tabs label{position:relative;display:inline-block;border-bottom:1px solid transparent;padding:0 12px;line-height:48px;font-size:14px;font-weight:500;color:var(--vp-code-tab-text-color);white-space:nowrap;cursor:pointer;transition:color .25s}.vp-code-group .tabs label:after{position:absolute;right:8px;bottom:-1px;left:8px;z-index:1;height:2px;border-radius:2px;content:"";background-color:transparent;transition:background-color .25s}.vp-code-group label:hover{color:var(--vp-code-tab-hover-text-color)}.vp-code-group input:checked+label{color:var(--vp-code-tab-active-text-color)}.vp-code-group input:checked+label:after{background-color:var(--vp-code-tab-active-bar-color)}.vp-code-group div[class*=language-],.vp-block{display:none;margin-top:0!important;border-top-left-radius:0!important;border-top-right-radius:0!important}.vp-code-group div[class*=language-].active,.vp-block.active{display:block}.vp-block{padding:20px 24px}.vp-doc h1,.vp-doc h2,.vp-doc h3,.vp-doc h4,.vp-doc h5,.vp-doc h6{position:relative;font-weight:600;outline:none}.vp-doc h1{letter-spacing:-.02em;line-height:40px;font-size:28px}.vp-doc h2{margin:48px 0 16px;border-top:1px solid var(--vp-c-divider);padding-top:24px;letter-spacing:-.02em;line-height:32px;font-size:24px}.vp-doc h3{margin:32px 0 0;letter-spacing:-.01em;line-height:28px;font-size:20px}.vp-doc .header-anchor{position:absolute;top:0;left:0;margin-left:-.87em;font-weight:500;-webkit-user-select:none;user-select:none;opacity:0;text-decoration:none;transition:color .25s,opacity .25s}.vp-doc .header-anchor:before{content:var(--vp-header-anchor-symbol)}.vp-doc h1:hover .header-anchor,.vp-doc h1 .header-anchor:focus,.vp-doc h2:hover .header-anchor,.vp-doc h2 .header-anchor:focus,.vp-doc h3:hover .header-anchor,.vp-doc h3 .header-anchor:focus,.vp-doc h4:hover .header-anchor,.vp-doc h4 .header-anchor:focus,.vp-doc h5:hover .header-anchor,.vp-doc h5 .header-anchor:focus,.vp-doc h6:hover .header-anchor,.vp-doc h6 .header-anchor:focus{opacity:1}@media (min-width: 768px){.vp-doc h1{letter-spacing:-.02em;line-height:40px;font-size:32px}}.vp-doc h2 .header-anchor{top:24px}.vp-doc p,.vp-doc summary{margin:16px 0}.vp-doc p{line-height:28px}.vp-doc blockquote{margin:16px 0;border-left:2px solid var(--vp-c-divider);padding-left:16px;transition:border-color .5s}.vp-doc blockquote>p{margin:0;font-size:16px;color:var(--vp-c-text-2);transition:color .5s}.vp-doc a{font-weight:500;color:var(--vp-c-brand-1);text-decoration:underline;text-underline-offset:2px;transition:color .25s,opacity .25s}.vp-doc a:hover{color:var(--vp-c-brand-2)}.vp-doc strong{font-weight:600}.vp-doc ul,.vp-doc ol{padding-left:1.25rem;margin:16px 0}.vp-doc ul{list-style:disc}.vp-doc ol{list-style:decimal}.vp-doc li+li{margin-top:8px}.vp-doc li>ol,.vp-doc li>ul{margin:8px 0 0}.vp-doc table{display:block;border-collapse:collapse;margin:20px 0;overflow-x:auto}.vp-doc tr{background-color:var(--vp-c-bg);border-top:1px solid var(--vp-c-divider);transition:background-color .5s}.vp-doc tr:nth-child(2n){background-color:var(--vp-c-bg-soft)}.vp-doc th,.vp-doc td{border:1px solid var(--vp-c-divider);padding:8px 16px}.vp-doc th{text-align:left;font-size:14px;font-weight:600;color:var(--vp-c-text-2);background-color:var(--vp-c-bg-soft)}.vp-doc td{font-size:14px}.vp-doc hr{margin:16px 0;border:none;border-top:1px solid var(--vp-c-divider)}.vp-doc .custom-block{margin:16px 0}.vp-doc .custom-block p{margin:8px 0;line-height:24px}.vp-doc .custom-block p:first-child{margin:0}.vp-doc .custom-block div[class*=language-]{margin:8px 0;border-radius:8px}.vp-doc .custom-block div[class*=language-] code{font-weight:400;background-color:transparent}.vp-doc .custom-block .vp-code-group .tabs{margin:0;border-radius:8px 8px 0 0}.vp-doc :not(pre,h1,h2,h3,h4,h5,h6)>code{font-size:var(--vp-code-font-size);color:var(--vp-code-color)}.vp-doc :not(pre)>code{border-radius:4px;padding:3px 6px;background-color:var(--vp-code-bg);transition:color .25s,background-color .5s}.vp-doc a>code{color:var(--vp-code-link-color)}.vp-doc a:hover>code{color:var(--vp-code-link-hover-color)}.vp-doc h1>code,.vp-doc h2>code,.vp-doc h3>code{font-size:.9em}.vp-doc div[class*=language-],.vp-block{position:relative;margin:16px -24px;background-color:var(--vp-code-block-bg);overflow-x:auto;transition:background-color .5s}@media (min-width: 640px){.vp-doc div[class*=language-],.vp-block{border-radius:8px;margin:16px 0}}@media (max-width: 639px){.vp-doc li div[class*=language-]{border-radius:8px 0 0 8px}}.vp-doc div[class*=language-]+div[class*=language-],.vp-doc div[class$=-api]+div[class*=language-],.vp-doc div[class*=language-]+div[class$=-api]>div[class*=language-]{margin-top:-8px}.vp-doc [class*=language-] pre,.vp-doc [class*=language-] code{direction:ltr;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none}.vp-doc [class*=language-] pre{position:relative;z-index:1;margin:0;padding:20px 0;background:transparent;overflow-x:auto}.vp-doc [class*=language-] code{display:block;padding:0 24px;width:fit-content;min-width:100%;line-height:var(--vp-code-line-height);font-size:var(--vp-code-font-size);color:var(--vp-code-block-color);transition:color .5s}.vp-doc [class*=language-] code .highlighted{background-color:var(--vp-code-line-highlight-color);transition:background-color .5s;margin:0 -24px;padding:0 24px;width:calc(100% + 48px);display:inline-block}.vp-doc [class*=language-] code .highlighted.error{background-color:var(--vp-code-line-error-color)}.vp-doc [class*=language-] code .highlighted.warning{background-color:var(--vp-code-line-warning-color)}.vp-doc [class*=language-] code .diff{transition:background-color .5s;margin:0 -24px;padding:0 24px;width:calc(100% + 48px);display:inline-block}.vp-doc [class*=language-] code .diff:before{position:absolute;left:10px}.vp-doc [class*=language-] .has-focused-lines .line:not(.has-focus){filter:blur(.095rem);opacity:.4;transition:filter .35s,opacity .35s}.vp-doc [class*=language-] .has-focused-lines .line:not(.has-focus){opacity:.7;transition:filter .35s,opacity .35s}.vp-doc [class*=language-]:hover .has-focused-lines .line:not(.has-focus){filter:blur(0);opacity:1}.vp-doc [class*=language-] code .diff.remove{background-color:var(--vp-code-line-diff-remove-color);opacity:.7}.vp-doc [class*=language-] code .diff.remove:before{content:"-";color:var(--vp-code-line-diff-remove-symbol-color)}.vp-doc [class*=language-] code .diff.add{background-color:var(--vp-code-line-diff-add-color)}.vp-doc [class*=language-] code .diff.add:before{content:"+";color:var(--vp-code-line-diff-add-symbol-color)}.vp-doc div[class*=language-].line-numbers-mode{padding-left:32px}.vp-doc .line-numbers-wrapper{position:absolute;top:0;bottom:0;left:0;z-index:3;border-right:1px solid var(--vp-code-block-divider-color);padding-top:20px;width:32px;text-align:center;font-family:var(--vp-font-family-mono);line-height:var(--vp-code-line-height);font-size:var(--vp-code-font-size);color:var(--vp-code-line-number-color);transition:border-color .5s,color .5s}.vp-doc [class*=language-]>button.copy{direction:ltr;position:absolute;top:12px;right:12px;z-index:3;border:1px solid var(--vp-code-copy-code-border-color);border-radius:4px;width:40px;height:40px;background-color:var(--vp-code-copy-code-bg);opacity:0;cursor:pointer;background-image:var(--vp-icon-copy);background-position:50%;background-size:20px;background-repeat:no-repeat;transition:border-color .25s,background-color .25s,opacity .25s}.vp-doc [class*=language-]:hover>button.copy,.vp-doc [class*=language-]>button.copy:focus{opacity:1}.vp-doc [class*=language-]>button.copy:hover,.vp-doc [class*=language-]>button.copy.copied{border-color:var(--vp-code-copy-code-hover-border-color);background-color:var(--vp-code-copy-code-hover-bg)}.vp-doc [class*=language-]>button.copy.copied,.vp-doc [class*=language-]>button.copy:hover.copied{border-radius:0 4px 4px 0;background-color:var(--vp-code-copy-code-hover-bg);background-image:var(--vp-icon-copied)}.vp-doc [class*=language-]>button.copy.copied:before,.vp-doc [class*=language-]>button.copy:hover.copied:before{position:relative;top:-1px;transform:translate(calc(-100% - 1px));display:flex;justify-content:center;align-items:center;border:1px solid var(--vp-code-copy-code-hover-border-color);border-right:0;border-radius:4px 0 0 4px;padding:0 10px;width:fit-content;height:40px;text-align:center;font-size:12px;font-weight:500;color:var(--vp-code-copy-code-active-text);background-color:var(--vp-code-copy-code-hover-bg);white-space:nowrap;content:var(--vp-code-copy-copied-text-content)}.vp-doc [class*=language-]>span.lang{position:absolute;top:2px;right:8px;z-index:2;font-size:12px;font-weight:500;color:var(--vp-code-lang-color);transition:color .4s,opacity .4s}.vp-doc [class*=language-]:hover>button.copy+span.lang,.vp-doc [class*=language-]>button.copy:focus+span.lang{opacity:0}.vp-doc .VPTeamMembers{margin-top:24px}.vp-doc .VPTeamMembers.small.count-1 .container{margin:0!important;max-width:calc((100% - 24px)/2)!important}.vp-doc .VPTeamMembers.small.count-2 .container,.vp-doc .VPTeamMembers.small.count-3 .container{max-width:100%!important}.vp-doc .VPTeamMembers.medium.count-1 .container{margin:0!important;max-width:calc((100% - 24px)/2)!important}:is(.vp-external-link-icon,.vp-doc a[href*="://"],.vp-doc a[target=_blank]):not(.no-icon):after{display:inline-block;margin-top:-1px;margin-left:4px;width:11px;height:11px;background:currentColor;color:var(--vp-c-text-3);flex-shrink:0;--icon: url("data:image/svg+xml, %3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' %3E%3Cpath d='M0 0h24v24H0V0z' fill='none' /%3E%3Cpath d='M9 5v2h6.59L4 18.59 5.41 20 17 8.41V15h2V5H9z' /%3E%3C/svg%3E");-webkit-mask-image:var(--icon);mask-image:var(--icon)}.vp-external-link-icon:after{content:""}.external-link-icon-enabled :is(.vp-doc a[href*="://"],.vp-doc a[target=_blank]):after{content:"";color:currentColor}.vp-sponsor{border-radius:16px;overflow:hidden}.vp-sponsor.aside{border-radius:12px}.vp-sponsor-section+.vp-sponsor-section{margin-top:4px}.vp-sponsor-tier{margin-bottom:4px;text-align:center;letter-spacing:1px;line-height:24px;width:100%;font-weight:600;color:var(--vp-c-text-2);background-color:var(--vp-c-bg-soft)}.vp-sponsor.normal .vp-sponsor-tier{padding:13px 0 11px;font-size:14px}.vp-sponsor.aside .vp-sponsor-tier{padding:9px 0 7px;font-size:12px}.vp-sponsor-grid+.vp-sponsor-tier{margin-top:4px}.vp-sponsor-grid{display:flex;flex-wrap:wrap;gap:4px}.vp-sponsor-grid.xmini .vp-sponsor-grid-link{height:64px}.vp-sponsor-grid.xmini .vp-sponsor-grid-image{max-width:64px;max-height:22px}.vp-sponsor-grid.mini .vp-sponsor-grid-link{height:72px}.vp-sponsor-grid.mini .vp-sponsor-grid-image{max-width:96px;max-height:24px}.vp-sponsor-grid.small .vp-sponsor-grid-link{height:96px}.vp-sponsor-grid.small .vp-sponsor-grid-image{max-width:96px;max-height:24px}.vp-sponsor-grid.medium .vp-sponsor-grid-link{height:112px}.vp-sponsor-grid.medium .vp-sponsor-grid-image{max-width:120px;max-height:36px}.vp-sponsor-grid.big .vp-sponsor-grid-link{height:184px}.vp-sponsor-grid.big .vp-sponsor-grid-image{max-width:192px;max-height:56px}.vp-sponsor-grid[data-vp-grid="2"] .vp-sponsor-grid-item{width:calc((100% - 4px)/2)}.vp-sponsor-grid[data-vp-grid="3"] .vp-sponsor-grid-item{width:calc((100% - 4px * 2) / 3)}.vp-sponsor-grid[data-vp-grid="4"] .vp-sponsor-grid-item{width:calc((100% - 12px)/4)}.vp-sponsor-grid[data-vp-grid="5"] .vp-sponsor-grid-item{width:calc((100% - 16px)/5)}.vp-sponsor-grid[data-vp-grid="6"] .vp-sponsor-grid-item{width:calc((100% - 4px * 5) / 6)}.vp-sponsor-grid-item{flex-shrink:0;width:100%;background-color:var(--vp-c-bg-soft);transition:background-color .25s}.vp-sponsor-grid-item:hover{background-color:var(--vp-c-default-soft)}.vp-sponsor-grid-item:hover .vp-sponsor-grid-image{filter:grayscale(0) invert(0)}.vp-sponsor-grid-item.empty:hover{background-color:var(--vp-c-bg-soft)}.dark .vp-sponsor-grid-item:hover{background-color:var(--vp-c-white)}.dark .vp-sponsor-grid-item.empty:hover{background-color:var(--vp-c-bg-soft)}.vp-sponsor-grid-link{display:flex}.vp-sponsor-grid-box{display:flex;justify-content:center;align-items:center;width:100%}.vp-sponsor-grid-image{max-width:100%;filter:grayscale(1);transition:filter .25s}.dark .vp-sponsor-grid-image{filter:grayscale(1) invert(1)}.VPBadge{display:inline-block;margin-left:2px;border:1px solid transparent;border-radius:12px;padding:0 10px;line-height:22px;font-size:12px;font-weight:500;transform:translateY(-2px)}.VPBadge.small{padding:0 6px;line-height:18px;font-size:10px;transform:translateY(-8px)}.VPDocFooter .VPBadge{display:none}.vp-doc h1>.VPBadge{margin-top:4px;vertical-align:top}.vp-doc h2>.VPBadge{margin-top:3px;padding:0 8px;vertical-align:top}.vp-doc h3>.VPBadge{vertical-align:middle}.vp-doc h4>.VPBadge,.vp-doc h5>.VPBadge,.vp-doc h6>.VPBadge{vertical-align:middle;line-height:18px}.VPBadge.info{border-color:var(--vp-badge-info-border);color:var(--vp-badge-info-text);background-color:var(--vp-badge-info-bg)}.VPBadge.tip{border-color:var(--vp-badge-tip-border);color:var(--vp-badge-tip-text);background-color:var(--vp-badge-tip-bg)}.VPBadge.warning{border-color:var(--vp-badge-warning-border);color:var(--vp-badge-warning-text);background-color:var(--vp-badge-warning-bg)}.VPBadge.danger{border-color:var(--vp-badge-danger-border);color:var(--vp-badge-danger-text);background-color:var(--vp-badge-danger-bg)}.VPBackdrop[data-v-54a304ca]{position:fixed;top:0;right:0;bottom:0;left:0;z-index:var(--vp-z-index-backdrop);background:var(--vp-backdrop-bg-color);transition:opacity .5s}.VPBackdrop.fade-enter-from[data-v-54a304ca],.VPBackdrop.fade-leave-to[data-v-54a304ca]{opacity:0}.VPBackdrop.fade-leave-active[data-v-54a304ca]{transition-duration:.25s}@media (min-width: 1280px){.VPBackdrop[data-v-54a304ca]{display:none}}.NotFound[data-v-b9c0c15a]{padding:64px 24px 96px;text-align:center}@media (min-width: 768px){.NotFound[data-v-b9c0c15a]{padding:96px 32px 168px}}.code[data-v-b9c0c15a]{line-height:64px;font-size:64px;font-weight:600}.title[data-v-b9c0c15a]{padding-top:12px;letter-spacing:2px;line-height:20px;font-size:20px;font-weight:700}.divider[data-v-b9c0c15a]{margin:24px auto 18px;width:64px;height:1px;background-color:var(--vp-c-divider)}.quote[data-v-b9c0c15a]{margin:0 auto;max-width:256px;font-size:14px;font-weight:500;color:var(--vp-c-text-2)}.action[data-v-b9c0c15a]{padding-top:20px}.link[data-v-b9c0c15a]{display:inline-block;border:1px solid var(--vp-c-brand-1);border-radius:16px;padding:3px 16px;font-size:14px;font-weight:500;color:var(--vp-c-brand-1);transition:border-color .25s,color .25s}.link[data-v-b9c0c15a]:hover{border-color:var(--vp-c-brand-2);color:var(--vp-c-brand-2)}.root[data-v-53c99d69]{position:relative;z-index:1}.nested[data-v-53c99d69]{padding-right:16px;padding-left:16px}.outline-link[data-v-53c99d69]{display:block;line-height:32px;font-size:14px;font-weight:400;color:var(--vp-c-text-2);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;transition:color .5s}.outline-link[data-v-53c99d69]:hover,.outline-link.active[data-v-53c99d69]{color:var(--vp-c-text-1);transition:color .25s}.outline-link.nested[data-v-53c99d69]{padding-left:13px}.VPDocAsideOutline[data-v-6b52fe58]{display:none}.VPDocAsideOutline.has-outline[data-v-6b52fe58]{display:block}.content[data-v-6b52fe58]{position:relative;border-left:1px solid var(--vp-c-divider);padding-left:16px;font-size:13px;font-weight:500}.outline-marker[data-v-6b52fe58]{position:absolute;top:32px;left:-1px;z-index:0;opacity:0;width:2px;border-radius:2px;height:18px;background-color:var(--vp-c-brand-1);transition:top .25s cubic-bezier(0,1,.5,1),background-color .5s,opacity .25s}.outline-title[data-v-6b52fe58]{line-height:32px;font-size:14px;font-weight:600}.VPDocAside[data-v-cb998dce]{display:flex;flex-direction:column;flex-grow:1}.spacer[data-v-cb998dce]{flex-grow:1}.VPDocAside[data-v-cb998dce] .spacer+.VPDocAsideSponsors,.VPDocAside[data-v-cb998dce] .spacer+.VPDocAsideCarbonAds{margin-top:24px}.VPDocAside[data-v-cb998dce] .VPDocAsideSponsors+.VPDocAsideCarbonAds{margin-top:16px}.VPLastUpdated[data-v-19a7ae4e]{line-height:24px;font-size:14px;font-weight:500;color:var(--vp-c-text-2)}@media (min-width: 640px){.VPLastUpdated[data-v-19a7ae4e]{line-height:32px;font-size:14px;font-weight:500}}.VPDocFooter[data-v-b4b63abf]{margin-top:64px}.edit-info[data-v-b4b63abf]{padding-bottom:18px}@media (min-width: 640px){.edit-info[data-v-b4b63abf]{display:flex;justify-content:space-between;align-items:center;padding-bottom:14px}}.edit-link-button[data-v-b4b63abf]{display:flex;align-items:center;border:0;line-height:32px;font-size:14px;font-weight:500;color:var(--vp-c-brand-1);transition:color .25s}.edit-link-button[data-v-b4b63abf]:hover{color:var(--vp-c-brand-2)}.edit-link-icon[data-v-b4b63abf]{margin-right:8px;width:14px;height:14px;fill:currentColor}.prev-next[data-v-b4b63abf]{border-top:1px solid var(--vp-c-divider);padding-top:24px;display:grid;grid-row-gap:8px}@media (min-width: 640px){.prev-next[data-v-b4b63abf]{grid-template-columns:repeat(2,1fr);grid-column-gap:16px}}.pager-link[data-v-b4b63abf]{display:block;border:1px solid var(--vp-c-divider);border-radius:8px;padding:11px 16px 13px;width:100%;height:100%;transition:border-color .25s}.pager-link[data-v-b4b63abf]:hover{border-color:var(--vp-c-brand-1)}.pager-link.next[data-v-b4b63abf]{margin-left:auto;text-align:right}.desc[data-v-b4b63abf]{display:block;line-height:20px;font-size:12px;font-weight:500;color:var(--vp-c-text-2)}.title[data-v-b4b63abf]{display:block;line-height:20px;font-size:14px;font-weight:500;color:var(--vp-c-brand-1);transition:color .25s}.VPDoc[data-v-e6f2a212]{padding:32px 24px 96px;width:100%}@media (min-width: 768px){.VPDoc[data-v-e6f2a212]{padding:48px 32px 128px}}@media (min-width: 960px){.VPDoc[data-v-e6f2a212]{padding:48px 32px 0}.VPDoc:not(.has-sidebar) .container[data-v-e6f2a212]{display:flex;justify-content:center;max-width:992px}.VPDoc:not(.has-sidebar) .content[data-v-e6f2a212]{max-width:752px}}@media (min-width: 1280px){.VPDoc .container[data-v-e6f2a212]{display:flex;justify-content:center}.VPDoc .aside[data-v-e6f2a212]{display:block}}@media (min-width: 1440px){.VPDoc:not(.has-sidebar) .content[data-v-e6f2a212]{max-width:784px}.VPDoc:not(.has-sidebar) .container[data-v-e6f2a212]{max-width:1104px}}.container[data-v-e6f2a212]{margin:0 auto;width:100%}.aside[data-v-e6f2a212]{position:relative;display:none;order:2;flex-grow:1;padding-left:32px;width:100%;max-width:256px}.left-aside[data-v-e6f2a212]{order:1;padding-left:unset;padding-right:32px}.aside-container[data-v-e6f2a212]{position:fixed;top:0;padding-top:calc(var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + var(--vp-doc-top-height, 0px) + 48px);width:224px;height:100vh;overflow-x:hidden;overflow-y:auto;scrollbar-width:none}.aside-container[data-v-e6f2a212]::-webkit-scrollbar{display:none}.aside-curtain[data-v-e6f2a212]{position:fixed;bottom:0;z-index:10;width:224px;height:32px;background:linear-gradient(transparent,var(--vp-c-bg) 70%)}.aside-content[data-v-e6f2a212]{display:flex;flex-direction:column;min-height:calc(100vh - (var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + 48px));padding-bottom:32px}.content[data-v-e6f2a212]{position:relative;margin:0 auto;width:100%}@media (min-width: 960px){.content[data-v-e6f2a212]{padding:0 32px 128px}}@media (min-width: 1280px){.content[data-v-e6f2a212]{order:1;margin:0;min-width:640px}}.content-container[data-v-e6f2a212]{margin:0 auto}.VPDoc.has-aside .content-container[data-v-e6f2a212]{max-width:688px}.VPButton[data-v-1e76fe75]{display:inline-block;border:1px solid transparent;text-align:center;font-weight:600;white-space:nowrap;transition:color .25s,border-color .25s,background-color .25s}.VPButton[data-v-1e76fe75]:active{transition:color .1s,border-color .1s,background-color .1s}.VPButton.medium[data-v-1e76fe75]{border-radius:20px;padding:0 20px;line-height:38px;font-size:14px}.VPButton.big[data-v-1e76fe75]{border-radius:24px;padding:0 24px;line-height:46px;font-size:16px}.VPButton.brand[data-v-1e76fe75]{border-color:var(--vp-button-brand-border);color:var(--vp-button-brand-text);background-color:var(--vp-button-brand-bg)}.VPButton.brand[data-v-1e76fe75]:hover{border-color:var(--vp-button-brand-hover-border);color:var(--vp-button-brand-hover-text);background-color:var(--vp-button-brand-hover-bg)}.VPButton.brand[data-v-1e76fe75]:active{border-color:var(--vp-button-brand-active-border);color:var(--vp-button-brand-active-text);background-color:var(--vp-button-brand-active-bg)}.VPButton.alt[data-v-1e76fe75]{border-color:var(--vp-button-alt-border);color:var(--vp-button-alt-text);background-color:var(--vp-button-alt-bg)}.VPButton.alt[data-v-1e76fe75]:hover{border-color:var(--vp-button-alt-hover-border);color:var(--vp-button-alt-hover-text);background-color:var(--vp-button-alt-hover-bg)}.VPButton.alt[data-v-1e76fe75]:active{border-color:var(--vp-button-alt-active-border);color:var(--vp-button-alt-active-text);background-color:var(--vp-button-alt-active-bg)}.VPButton.sponsor[data-v-1e76fe75]{border-color:var(--vp-button-sponsor-border);color:var(--vp-button-sponsor-text);background-color:var(--vp-button-sponsor-bg)}.VPButton.sponsor[data-v-1e76fe75]:hover{border-color:var(--vp-button-sponsor-hover-border);color:var(--vp-button-sponsor-hover-text);background-color:var(--vp-button-sponsor-hover-bg)}.VPButton.sponsor[data-v-1e76fe75]:active{border-color:var(--vp-button-sponsor-active-border);color:var(--vp-button-sponsor-active-text);background-color:var(--vp-button-sponsor-active-bg)}html:not(.dark) .VPImage.dark[data-v-ab19afbb]{display:none}.dark .VPImage.light[data-v-ab19afbb]{display:none}.VPHero[data-v-5a3e9999]{margin-top:calc((var(--vp-nav-height) + var(--vp-layout-top-height, 0px)) * -1);padding:calc(var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + 48px) 24px 48px}@media (min-width: 640px){.VPHero[data-v-5a3e9999]{padding:calc(var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + 80px) 48px 64px}}@media (min-width: 960px){.VPHero[data-v-5a3e9999]{padding:calc(var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + 80px) 64px 64px}}.container[data-v-5a3e9999]{display:flex;flex-direction:column;margin:0 auto;max-width:1152px}@media (min-width: 960px){.container[data-v-5a3e9999]{flex-direction:row}}.main[data-v-5a3e9999]{position:relative;z-index:10;order:2;flex-grow:1;flex-shrink:0}.VPHero.has-image .container[data-v-5a3e9999]{text-align:center}@media (min-width: 960px){.VPHero.has-image .container[data-v-5a3e9999]{text-align:left}}@media (min-width: 960px){.main[data-v-5a3e9999]{order:1;width:calc((100% / 3) * 2)}.VPHero.has-image .main[data-v-5a3e9999]{max-width:592px}}.name[data-v-5a3e9999],.text[data-v-5a3e9999]{max-width:392px;letter-spacing:-.4px;line-height:40px;font-size:32px;font-weight:700;white-space:pre-wrap}.VPHero.has-image .name[data-v-5a3e9999],.VPHero.has-image .text[data-v-5a3e9999]{margin:0 auto}.name[data-v-5a3e9999]{color:var(--vp-home-hero-name-color)}.clip[data-v-5a3e9999]{background:var(--vp-home-hero-name-background);-webkit-background-clip:text;background-clip:text;-webkit-text-fill-color:var(--vp-home-hero-name-color)}@media (min-width: 640px){.name[data-v-5a3e9999],.text[data-v-5a3e9999]{max-width:576px;line-height:56px;font-size:48px}}@media (min-width: 960px){.name[data-v-5a3e9999],.text[data-v-5a3e9999]{line-height:64px;font-size:56px}.VPHero.has-image .name[data-v-5a3e9999],.VPHero.has-image .text[data-v-5a3e9999]{margin:0}}.tagline[data-v-5a3e9999]{padding-top:8px;max-width:392px;line-height:28px;font-size:18px;font-weight:500;white-space:pre-wrap;color:var(--vp-c-text-2)}.VPHero.has-image .tagline[data-v-5a3e9999]{margin:0 auto}@media (min-width: 640px){.tagline[data-v-5a3e9999]{padding-top:12px;max-width:576px;line-height:32px;font-size:20px}}@media (min-width: 960px){.tagline[data-v-5a3e9999]{line-height:36px;font-size:24px}.VPHero.has-image .tagline[data-v-5a3e9999]{margin:0}}.actions[data-v-5a3e9999]{display:flex;flex-wrap:wrap;margin:-6px;padding-top:24px}.VPHero.has-image .actions[data-v-5a3e9999]{justify-content:center}@media (min-width: 640px){.actions[data-v-5a3e9999]{padding-top:32px}}@media (min-width: 960px){.VPHero.has-image .actions[data-v-5a3e9999]{justify-content:flex-start}}.action[data-v-5a3e9999]{flex-shrink:0;padding:6px}.image[data-v-5a3e9999]{order:1;margin:-76px -24px -48px}@media (min-width: 640px){.image[data-v-5a3e9999]{margin:-108px -24px -48px}}@media (min-width: 960px){.image[data-v-5a3e9999]{flex-grow:1;order:2;margin:0;min-height:100%}}.image-container[data-v-5a3e9999]{position:relative;margin:0 auto;width:320px;height:320px}@media (min-width: 640px){.image-container[data-v-5a3e9999]{width:392px;height:392px}}@media (min-width: 960px){.image-container[data-v-5a3e9999]{display:flex;justify-content:center;align-items:center;width:100%;height:100%;transform:translate(-32px,-32px)}}.image-bg[data-v-5a3e9999]{position:absolute;top:50%;left:50%;border-radius:50%;width:192px;height:192px;background-image:var(--vp-home-hero-image-background-image);filter:var(--vp-home-hero-image-filter);transform:translate(-50%,-50%)}@media (min-width: 640px){.image-bg[data-v-5a3e9999]{width:256px;height:256px}}@media (min-width: 960px){.image-bg[data-v-5a3e9999]{width:320px;height:320px}}[data-v-5a3e9999] .image-src{position:absolute;top:50%;left:50%;max-width:192px;max-height:192px;transform:translate(-50%,-50%)}@media (min-width: 640px){[data-v-5a3e9999] .image-src{max-width:256px;max-height:256px}}@media (min-width: 960px){[data-v-5a3e9999] .image-src{max-width:320px;max-height:320px}}.VPFeature[data-v-ee984185]{display:block;border:1px solid var(--vp-c-bg-soft);border-radius:12px;height:100%;background-color:var(--vp-c-bg-soft);transition:border-color .25s,background-color .25s}.VPFeature.link[data-v-ee984185]:hover{border-color:var(--vp-c-brand-1)}.box[data-v-ee984185]{display:flex;flex-direction:column;padding:24px;height:100%}.box[data-v-ee984185]>.VPImage{margin-bottom:20px}.icon[data-v-ee984185]{display:flex;justify-content:center;align-items:center;margin-bottom:20px;border-radius:6px;background-color:var(--vp-c-default-soft);width:48px;height:48px;font-size:24px;transition:background-color .25s}.title[data-v-ee984185]{line-height:24px;font-size:16px;font-weight:600}.details[data-v-ee984185]{flex-grow:1;padding-top:8px;line-height:24px;font-size:14px;font-weight:500;color:var(--vp-c-text-2)}.link-text[data-v-ee984185]{padding-top:8px}.link-text-value[data-v-ee984185]{display:flex;align-items:center;font-size:14px;font-weight:500;color:var(--vp-c-brand-1)}.link-text-icon[data-v-ee984185]{display:inline-block;margin-left:6px;width:14px;height:14px;fill:currentColor}.VPFeatures[data-v-b1eea84a]{position:relative;padding:0 24px}@media (min-width: 640px){.VPFeatures[data-v-b1eea84a]{padding:0 48px}}@media (min-width: 960px){.VPFeatures[data-v-b1eea84a]{padding:0 64px}}.container[data-v-b1eea84a]{margin:0 auto;max-width:1152px}.items[data-v-b1eea84a]{display:flex;flex-wrap:wrap;margin:-8px}.item[data-v-b1eea84a]{padding:8px;width:100%}@media (min-width: 640px){.item.grid-2[data-v-b1eea84a],.item.grid-4[data-v-b1eea84a],.item.grid-6[data-v-b1eea84a]{width:50%}}@media (min-width: 768px){.item.grid-2[data-v-b1eea84a],.item.grid-4[data-v-b1eea84a]{width:50%}.item.grid-3[data-v-b1eea84a],.item.grid-6[data-v-b1eea84a]{width:calc(100% / 3)}}@media (min-width: 960px){.item.grid-4[data-v-b1eea84a]{width:25%}}.VPHome[data-v-20eabd3a]{padding-bottom:96px}.VPHome[data-v-20eabd3a] .VPHomeSponsors{margin-top:112px;margin-bottom:-128px}@media (min-width: 768px){.VPHome[data-v-20eabd3a]{padding-bottom:128px}}.VPContent[data-v-3cf691b6]{flex-grow:1;flex-shrink:0;margin:var(--vp-layout-top-height, 0px) auto 0;width:100%}.VPContent.is-home[data-v-3cf691b6]{width:100%;max-width:100%}.VPContent.has-sidebar[data-v-3cf691b6]{margin:0}@media (min-width: 960px){.VPContent[data-v-3cf691b6]{padding-top:var(--vp-nav-height)}.VPContent.has-sidebar[data-v-3cf691b6]{margin:var(--vp-layout-top-height, 0px) 0 0;padding-left:var(--vp-sidebar-width)}}@media (min-width: 1440px){.VPContent.has-sidebar[data-v-3cf691b6]{padding-right:calc((100vw - var(--vp-layout-max-width)) / 2);padding-left:calc((100vw - var(--vp-layout-max-width)) / 2 + var(--vp-sidebar-width))}}.VPFooter[data-v-566314d4]{position:relative;z-index:var(--vp-z-index-footer);border-top:1px solid var(--vp-c-gutter);padding:32px 24px;background-color:var(--vp-c-bg)}.VPFooter.has-sidebar[data-v-566314d4]{display:none}.VPFooter[data-v-566314d4] a{text-decoration-line:underline;text-underline-offset:2px;transition:color .25s}.VPFooter[data-v-566314d4] a:hover{color:var(--vp-c-text-1)}@media (min-width: 768px){.VPFooter[data-v-566314d4]{padding:32px}}.container[data-v-566314d4]{margin:0 auto;max-width:var(--vp-layout-max-width);text-align:center}.message[data-v-566314d4],.copyright[data-v-566314d4]{line-height:24px;font-size:14px;font-weight:500;color:var(--vp-c-text-2)}.VPLocalNavOutlineDropdown[data-v-2744f6e0]{padding:12px 20px 11px}@media (min-width: 960px){.VPLocalNavOutlineDropdown[data-v-2744f6e0]{padding:12px 36px 11px}}.VPLocalNavOutlineDropdown button[data-v-2744f6e0]{display:block;font-size:12px;font-weight:500;line-height:24px;color:var(--vp-c-text-2);transition:color .5s;position:relative}.VPLocalNavOutlineDropdown button[data-v-2744f6e0]:hover{color:var(--vp-c-text-1);transition:color .25s}.VPLocalNavOutlineDropdown button.open[data-v-2744f6e0]{color:var(--vp-c-text-1)}@media (min-width: 960px){.VPLocalNavOutlineDropdown button[data-v-2744f6e0]{font-size:14px}}.icon[data-v-2744f6e0]{display:inline-block;vertical-align:middle;margin-left:2px;width:14px;height:14px;fill:currentColor}.open>.icon[data-v-2744f6e0]{transform:rotate(90deg)}.items[data-v-2744f6e0]{position:absolute;top:40px;right:16px;left:16px;display:grid;gap:1px;border:1px solid var(--vp-c-border);border-radius:8px;background-color:var(--vp-c-gutter);max-height:calc(var(--vp-vh, 100vh) - 86px);overflow:hidden auto;box-shadow:var(--vp-shadow-3)}@media (min-width: 960px){.items[data-v-2744f6e0]{right:auto;left:calc(var(--vp-sidebar-width) + 32px);width:320px}}.header[data-v-2744f6e0]{background-color:var(--vp-c-bg-soft)}.top-link[data-v-2744f6e0]{display:block;padding:0 16px;line-height:48px;font-size:14px;font-weight:500;color:var(--vp-c-brand-1)}.outline[data-v-2744f6e0]{padding:8px 0;background-color:var(--vp-c-bg-soft)}.flyout-enter-active[data-v-2744f6e0]{transition:all .2s ease-out}.flyout-leave-active[data-v-2744f6e0]{transition:all .15s ease-in}.flyout-enter-from[data-v-2744f6e0],.flyout-leave-to[data-v-2744f6e0]{opacity:0;transform:translateY(-16px)}.VPLocalNav[data-v-b979e4d9]{position:sticky;top:0;left:0;z-index:var(--vp-z-index-local-nav);border-bottom:1px solid var(--vp-c-gutter);padding-top:var(--vp-layout-top-height, 0px);width:100%;background-color:var(--vp-local-nav-bg-color)}.VPLocalNav.fixed[data-v-b979e4d9]{position:fixed}@media (min-width: 960px){.VPLocalNav[data-v-b979e4d9]{top:var(--vp-nav-height)}.VPLocalNav.has-sidebar[data-v-b979e4d9]{padding-left:var(--vp-sidebar-width)}.VPLocalNav.empty[data-v-b979e4d9]{display:none}}@media (min-width: 1280px){.VPLocalNav[data-v-b979e4d9]{display:none}}@media (min-width: 1440px){.VPLocalNav.has-sidebar[data-v-b979e4d9]{padding-left:calc((100vw - var(--vp-layout-max-width)) / 2 + var(--vp-sidebar-width))}}.container[data-v-b979e4d9]{display:flex;justify-content:space-between;align-items:center}.menu[data-v-b979e4d9]{display:flex;align-items:center;padding:12px 24px 11px;line-height:24px;font-size:12px;font-weight:500;color:var(--vp-c-text-2);transition:color .5s}.menu[data-v-b979e4d9]:hover{color:var(--vp-c-text-1);transition:color .25s}@media (min-width: 768px){.menu[data-v-b979e4d9]{padding:0 32px}}@media (min-width: 960px){.menu[data-v-b979e4d9]{display:none}}.menu-icon[data-v-b979e4d9]{margin-right:8px;width:16px;height:16px;fill:currentColor}.VPOutlineDropdown[data-v-b979e4d9]{padding:12px 24px 11px}@media (min-width: 768px){.VPOutlineDropdown[data-v-b979e4d9]{padding:12px 32px 11px}}.VPSwitch[data-v-1c29e291]{position:relative;border-radius:11px;display:block;width:40px;height:22px;flex-shrink:0;border:1px solid var(--vp-input-border-color);background-color:var(--vp-input-switch-bg-color);transition:border-color .25s!important}.VPSwitch[data-v-1c29e291]:hover{border-color:var(--vp-c-brand-1)}.check[data-v-1c29e291]{position:absolute;top:1px;left:1px;width:18px;height:18px;border-radius:50%;background-color:var(--vp-c-neutral-inverse);box-shadow:var(--vp-shadow-1);transition:transform .25s!important}.icon[data-v-1c29e291]{position:relative;display:block;width:18px;height:18px;border-radius:50%;overflow:hidden}.icon[data-v-1c29e291] svg{position:absolute;top:3px;left:3px;width:12px;height:12px;fill:var(--vp-c-text-2)}.dark .icon[data-v-1c29e291] svg{fill:var(--vp-c-text-1);transition:opacity .25s!important}.sun[data-v-d80abb8e]{opacity:1}.moon[data-v-d80abb8e],.dark .sun[data-v-d80abb8e]{opacity:0}.dark .moon[data-v-d80abb8e]{opacity:1}.dark .VPSwitchAppearance[data-v-d80abb8e] .check{transform:translate(18px)}.VPNavBarAppearance[data-v-283b26e9]{display:none}@media (min-width: 1280px){.VPNavBarAppearance[data-v-283b26e9]{display:flex;align-items:center}}.VPMenuGroup+.VPMenuLink[data-v-f51f088d]{margin:12px -12px 0;border-top:1px solid var(--vp-c-divider);padding:12px 12px 0}.link[data-v-f51f088d]{display:block;border-radius:6px;padding:0 12px;line-height:32px;font-size:14px;font-weight:500;color:var(--vp-c-text-1);white-space:nowrap;transition:background-color .25s,color .25s}.link[data-v-f51f088d]:hover{color:var(--vp-c-brand-1);background-color:var(--vp-c-default-soft)}.link.active[data-v-f51f088d]{color:var(--vp-c-brand-1)}.VPMenuGroup[data-v-a6b0397c]{margin:12px -12px 0;border-top:1px solid var(--vp-c-divider);padding:12px 12px 0}.VPMenuGroup[data-v-a6b0397c]:first-child{margin-top:0;border-top:0;padding-top:0}.VPMenuGroup+.VPMenuGroup[data-v-a6b0397c]{margin-top:12px;border-top:1px solid var(--vp-c-divider)}.title[data-v-a6b0397c]{padding:0 12px;line-height:32px;font-size:14px;font-weight:600;color:var(--vp-c-text-2);white-space:nowrap;transition:color .25s}.VPMenu[data-v-e42ed9b3]{border-radius:12px;padding:12px;min-width:128px;border:1px solid var(--vp-c-divider);background-color:var(--vp-c-bg-elv);box-shadow:var(--vp-shadow-3);transition:background-color .5s;max-height:calc(100vh - var(--vp-nav-height));overflow-y:auto}.VPMenu[data-v-e42ed9b3] .group{margin:0 -12px;padding:0 12px 12px}.VPMenu[data-v-e42ed9b3] .group+.group{border-top:1px solid var(--vp-c-divider);padding:11px 12px 12px}.VPMenu[data-v-e42ed9b3] .group:last-child{padding-bottom:0}.VPMenu[data-v-e42ed9b3] .group+.item{border-top:1px solid var(--vp-c-divider);padding:11px 16px 0}.VPMenu[data-v-e42ed9b3] .item{padding:0 16px;white-space:nowrap}.VPMenu[data-v-e42ed9b3] .label{flex-grow:1;line-height:28px;font-size:12px;font-weight:500;color:var(--vp-c-text-2);transition:color .5s}.VPMenu[data-v-e42ed9b3] .action{padding-left:24px}.VPFlyout[data-v-aa8de344]{position:relative}.VPFlyout[data-v-aa8de344]:hover{color:var(--vp-c-brand-1);transition:color .25s}.VPFlyout:hover .text[data-v-aa8de344]{color:var(--vp-c-text-2)}.VPFlyout:hover .icon[data-v-aa8de344]{fill:var(--vp-c-text-2)}.VPFlyout.active .text[data-v-aa8de344]{color:var(--vp-c-brand-1)}.VPFlyout.active:hover .text[data-v-aa8de344]{color:var(--vp-c-brand-2)}.VPFlyout:hover .menu[data-v-aa8de344],.button[aria-expanded=true]+.menu[data-v-aa8de344]{opacity:1;visibility:visible;transform:translateY(0)}.button[aria-expanded=false]+.menu[data-v-aa8de344]{opacity:0;visibility:hidden;transform:translateY(0)}.button[data-v-aa8de344]{display:flex;align-items:center;padding:0 12px;height:var(--vp-nav-height);color:var(--vp-c-text-1);transition:color .5s}.text[data-v-aa8de344]{display:flex;align-items:center;line-height:var(--vp-nav-height);font-size:14px;font-weight:500;color:var(--vp-c-text-1);transition:color .25s}.option-icon[data-v-aa8de344]{margin-right:0;width:16px;height:16px;fill:currentColor}.text-icon[data-v-aa8de344]{margin-left:4px;width:14px;height:14px;fill:currentColor}.icon[data-v-aa8de344]{width:20px;height:20px;fill:currentColor;transition:fill .25s}.menu[data-v-aa8de344]{position:absolute;top:calc(var(--vp-nav-height) / 2 + 20px);right:0;opacity:0;visibility:hidden;transition:opacity .25s,visibility .25s,transform .25s}.VPSocialLink[data-v-16cf740a]{display:flex;justify-content:center;align-items:center;width:36px;height:36px;color:var(--vp-c-text-2);transition:color .5s}.VPSocialLink[data-v-16cf740a]:hover{color:var(--vp-c-text-1);transition:color .25s}.VPSocialLink[data-v-16cf740a]>svg{width:20px;height:20px;fill:currentColor}.VPSocialLinks[data-v-e71e869c]{display:flex;justify-content:center}.VPNavBarExtra[data-v-8e87c032]{display:none;margin-right:-12px}@media (min-width: 768px){.VPNavBarExtra[data-v-8e87c032]{display:block}}@media (min-width: 1280px){.VPNavBarExtra[data-v-8e87c032]{display:none}}.trans-title[data-v-8e87c032]{padding:0 24px 0 12px;line-height:32px;font-size:14px;font-weight:700;color:var(--vp-c-text-1)}.item.appearance[data-v-8e87c032],.item.social-links[data-v-8e87c032]{display:flex;align-items:center;padding:0 12px}.item.appearance[data-v-8e87c032]{min-width:176px}.appearance-action[data-v-8e87c032]{margin-right:-2px}.social-links-list[data-v-8e87c032]{margin:-4px -8px}.VPNavBarHamburger[data-v-6bee1efd]{display:flex;justify-content:center;align-items:center;width:48px;height:var(--vp-nav-height)}@media (min-width: 768px){.VPNavBarHamburger[data-v-6bee1efd]{display:none}}.container[data-v-6bee1efd]{position:relative;width:16px;height:14px;overflow:hidden}.VPNavBarHamburger:hover .top[data-v-6bee1efd]{top:0;left:0;transform:translate(4px)}.VPNavBarHamburger:hover .middle[data-v-6bee1efd]{top:6px;left:0;transform:translate(0)}.VPNavBarHamburger:hover .bottom[data-v-6bee1efd]{top:12px;left:0;transform:translate(8px)}.VPNavBarHamburger.active .top[data-v-6bee1efd]{top:6px;transform:translate(0) rotate(225deg)}.VPNavBarHamburger.active .middle[data-v-6bee1efd]{top:6px;transform:translate(16px)}.VPNavBarHamburger.active .bottom[data-v-6bee1efd]{top:6px;transform:translate(0) rotate(135deg)}.VPNavBarHamburger.active:hover .top[data-v-6bee1efd],.VPNavBarHamburger.active:hover .middle[data-v-6bee1efd],.VPNavBarHamburger.active:hover .bottom[data-v-6bee1efd]{background-color:var(--vp-c-text-2);transition:top .25s,background-color .25s,transform .25s}.top[data-v-6bee1efd],.middle[data-v-6bee1efd],.bottom[data-v-6bee1efd]{position:absolute;width:16px;height:2px;background-color:var(--vp-c-text-1);transition:top .25s,background-color .5s,transform .25s}.top[data-v-6bee1efd]{top:0;left:0;transform:translate(0)}.middle[data-v-6bee1efd]{top:6px;left:0;transform:translate(8px)}.bottom[data-v-6bee1efd]{top:12px;left:0;transform:translate(4px)}.VPNavBarMenuLink[data-v-cb318fec]{display:flex;align-items:center;padding:0 12px;line-height:var(--vp-nav-height);font-size:14px;font-weight:500;color:var(--vp-c-text-1);transition:color .25s}.VPNavBarMenuLink.active[data-v-cb318fec],.VPNavBarMenuLink[data-v-cb318fec]:hover{color:var(--vp-c-brand-1)}.VPNavBarMenu[data-v-f732b5d0]{display:none}@media (min-width: 768px){.VPNavBarMenu[data-v-f732b5d0]{display:flex}}/*! @docsearch/css 3.5.2 | MIT License | © Algolia, Inc. and contributors | https://docsearch.algolia.com */:root{--docsearch-primary-color:#5468ff;--docsearch-text-color:#1c1e21;--docsearch-spacing:12px;--docsearch-icon-stroke-width:1.4;--docsearch-highlight-color:var(--docsearch-primary-color);--docsearch-muted-color:#969faf;--docsearch-container-background:rgba(101,108,133,.8);--docsearch-logo-color:#5468ff;--docsearch-modal-width:560px;--docsearch-modal-height:600px;--docsearch-modal-background:#f5f6f7;--docsearch-modal-shadow:inset 1px 1px 0 0 hsla(0,0%,100%,.5),0 3px 8px 0 #555a64;--docsearch-searchbox-height:56px;--docsearch-searchbox-background:#ebedf0;--docsearch-searchbox-focus-background:#fff;--docsearch-searchbox-shadow:inset 0 0 0 2px var(--docsearch-primary-color);--docsearch-hit-height:56px;--docsearch-hit-color:#444950;--docsearch-hit-active-color:#fff;--docsearch-hit-background:#fff;--docsearch-hit-shadow:0 1px 3px 0 #d4d9e1;--docsearch-key-gradient:linear-gradient(-225deg,#d5dbe4,#f8f8f8);--docsearch-key-shadow:inset 0 -2px 0 0 #cdcde6,inset 0 0 1px 1px #fff,0 1px 2px 1px rgba(30,35,90,.4);--docsearch-footer-height:44px;--docsearch-footer-background:#fff;--docsearch-footer-shadow:0 -1px 0 0 #e0e3e8,0 -3px 6px 0 rgba(69,98,155,.12)}html[data-theme=dark]{--docsearch-text-color:#f5f6f7;--docsearch-container-background:rgba(9,10,17,.8);--docsearch-modal-background:#15172a;--docsearch-modal-shadow:inset 1px 1px 0 0 #2c2e40,0 3px 8px 0 #000309;--docsearch-searchbox-background:#090a11;--docsearch-searchbox-focus-background:#000;--docsearch-hit-color:#bec3c9;--docsearch-hit-shadow:none;--docsearch-hit-background:#090a11;--docsearch-key-gradient:linear-gradient(-26.5deg,#565872,#31355b);--docsearch-key-shadow:inset 0 -2px 0 0 #282d55,inset 0 0 1px 1px #51577d,0 2px 2px 0 rgba(3,4,9,.3);--docsearch-footer-background:#1e2136;--docsearch-footer-shadow:inset 0 1px 0 0 rgba(73,76,106,.5),0 -4px 8px 0 rgba(0,0,0,.2);--docsearch-logo-color:#fff;--docsearch-muted-color:#7f8497}.DocSearch-Button{align-items:center;background:var(--docsearch-searchbox-background);border:0;border-radius:40px;color:var(--docsearch-muted-color);cursor:pointer;display:flex;font-weight:500;height:36px;justify-content:space-between;margin:0 0 0 16px;padding:0 8px;-webkit-user-select:none;user-select:none}.DocSearch-Button:active,.DocSearch-Button:focus,.DocSearch-Button:hover{background:var(--docsearch-searchbox-focus-background);box-shadow:var(--docsearch-searchbox-shadow);color:var(--docsearch-text-color);outline:none}.DocSearch-Button-Container{align-items:center;display:flex}.DocSearch-Search-Icon{stroke-width:1.6}.DocSearch-Button .DocSearch-Search-Icon{color:var(--docsearch-text-color)}.DocSearch-Button-Placeholder{font-size:1rem;padding:0 12px 0 6px}.DocSearch-Button-Keys{display:flex;min-width:calc(40px + .8em)}.DocSearch-Button-Key{align-items:center;background:var(--docsearch-key-gradient);border-radius:3px;box-shadow:var(--docsearch-key-shadow);color:var(--docsearch-muted-color);display:flex;height:18px;justify-content:center;margin-right:.4em;position:relative;padding:0 0 2px;border:0;top:-1px;width:20px}@media (max-width:768px){.DocSearch-Button-Keys,.DocSearch-Button-Placeholder{display:none}}.DocSearch--active{overflow:hidden!important}.DocSearch-Container,.DocSearch-Container *{box-sizing:border-box}.DocSearch-Container{background-color:var(--docsearch-container-background);height:100vh;left:0;position:fixed;top:0;width:100vw;z-index:200}.DocSearch-Container a{text-decoration:none}.DocSearch-Link{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;color:var(--docsearch-highlight-color);cursor:pointer;font:inherit;margin:0;padding:0}.DocSearch-Modal{background:var(--docsearch-modal-background);border-radius:6px;box-shadow:var(--docsearch-modal-shadow);flex-direction:column;margin:60px auto auto;max-width:var(--docsearch-modal-width);position:relative}.DocSearch-SearchBar{display:flex;padding:var(--docsearch-spacing) var(--docsearch-spacing) 0}.DocSearch-Form{align-items:center;background:var(--docsearch-searchbox-focus-background);border-radius:4px;box-shadow:var(--docsearch-searchbox-shadow);display:flex;height:var(--docsearch-searchbox-height);margin:0;padding:0 var(--docsearch-spacing);position:relative;width:100%}.DocSearch-Input{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:transparent;border:0;color:var(--docsearch-text-color);flex:1;font:inherit;font-size:1.2em;height:100%;outline:none;padding:0 0 0 8px;width:80%}.DocSearch-Input::placeholder{color:var(--docsearch-muted-color);opacity:1}.DocSearch-Input::-webkit-search-cancel-button,.DocSearch-Input::-webkit-search-decoration,.DocSearch-Input::-webkit-search-results-button,.DocSearch-Input::-webkit-search-results-decoration{display:none}.DocSearch-LoadingIndicator,.DocSearch-MagnifierLabel,.DocSearch-Reset{margin:0;padding:0}.DocSearch-MagnifierLabel,.DocSearch-Reset{align-items:center;color:var(--docsearch-highlight-color);display:flex;justify-content:center}.DocSearch-Container--Stalled .DocSearch-MagnifierLabel,.DocSearch-LoadingIndicator{display:none}.DocSearch-Container--Stalled .DocSearch-LoadingIndicator{align-items:center;color:var(--docsearch-highlight-color);display:flex;justify-content:center}@media screen and (prefers-reduced-motion:reduce){.DocSearch-Reset{animation:none;-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;border-radius:50%;color:var(--docsearch-icon-color);cursor:pointer;right:0;stroke-width:var(--docsearch-icon-stroke-width)}}.DocSearch-Reset{animation:fade-in .1s ease-in forwards;-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;border-radius:50%;color:var(--docsearch-icon-color);cursor:pointer;padding:2px;right:0;stroke-width:var(--docsearch-icon-stroke-width)}.DocSearch-Reset[hidden]{display:none}.DocSearch-Reset:hover{color:var(--docsearch-highlight-color)}.DocSearch-LoadingIndicator svg,.DocSearch-MagnifierLabel svg{height:24px;width:24px}.DocSearch-Cancel{display:none}.DocSearch-Dropdown{max-height:calc(var(--docsearch-modal-height) - var(--docsearch-searchbox-height) - var(--docsearch-spacing) - var(--docsearch-footer-height));min-height:var(--docsearch-spacing);overflow-y:auto;overflow-y:overlay;padding:0 var(--docsearch-spacing);scrollbar-color:var(--docsearch-muted-color) var(--docsearch-modal-background);scrollbar-width:thin}.DocSearch-Dropdown::-webkit-scrollbar{width:12px}.DocSearch-Dropdown::-webkit-scrollbar-track{background:transparent}.DocSearch-Dropdown::-webkit-scrollbar-thumb{background-color:var(--docsearch-muted-color);border:3px solid var(--docsearch-modal-background);border-radius:20px}.DocSearch-Dropdown ul{list-style:none;margin:0;padding:0}.DocSearch-Label{font-size:.75em;line-height:1.6em}.DocSearch-Help,.DocSearch-Label{color:var(--docsearch-muted-color)}.DocSearch-Help{font-size:.9em;margin:0;-webkit-user-select:none;user-select:none}.DocSearch-Title{font-size:1.2em}.DocSearch-Logo a{display:flex}.DocSearch-Logo svg{color:var(--docsearch-logo-color);margin-left:8px}.DocSearch-Hits:last-of-type{margin-bottom:24px}.DocSearch-Hits mark{background:none;color:var(--docsearch-highlight-color)}.DocSearch-HitsFooter{color:var(--docsearch-muted-color);display:flex;font-size:.85em;justify-content:center;margin-bottom:var(--docsearch-spacing);padding:var(--docsearch-spacing)}.DocSearch-HitsFooter a{border-bottom:1px solid;color:inherit}.DocSearch-Hit{border-radius:4px;display:flex;padding-bottom:4px;position:relative}@media screen and (prefers-reduced-motion:reduce){.DocSearch-Hit--deleting{transition:none}}.DocSearch-Hit--deleting{opacity:0;transition:all .25s linear}@media screen and (prefers-reduced-motion:reduce){.DocSearch-Hit--favoriting{transition:none}}.DocSearch-Hit--favoriting{transform:scale(0);transform-origin:top center;transition:all .25s linear;transition-delay:.25s}.DocSearch-Hit a{background:var(--docsearch-hit-background);border-radius:4px;box-shadow:var(--docsearch-hit-shadow);display:block;padding-left:var(--docsearch-spacing);width:100%}.DocSearch-Hit-source{background:var(--docsearch-modal-background);color:var(--docsearch-highlight-color);font-size:.85em;font-weight:600;line-height:32px;margin:0 -4px;padding:8px 4px 0;position:sticky;top:0;z-index:10}.DocSearch-Hit-Tree{color:var(--docsearch-muted-color);height:var(--docsearch-hit-height);opacity:.5;stroke-width:var(--docsearch-icon-stroke-width);width:24px}.DocSearch-Hit[aria-selected=true] a{background-color:var(--docsearch-highlight-color)}.DocSearch-Hit[aria-selected=true] mark{text-decoration:underline}.DocSearch-Hit-Container{align-items:center;color:var(--docsearch-hit-color);display:flex;flex-direction:row;height:var(--docsearch-hit-height);padding:0 var(--docsearch-spacing) 0 0}.DocSearch-Hit-icon{height:20px;width:20px}.DocSearch-Hit-action,.DocSearch-Hit-icon{color:var(--docsearch-muted-color);stroke-width:var(--docsearch-icon-stroke-width)}.DocSearch-Hit-action{align-items:center;display:flex;height:22px;width:22px}.DocSearch-Hit-action svg{display:block;height:18px;width:18px}.DocSearch-Hit-action+.DocSearch-Hit-action{margin-left:6px}.DocSearch-Hit-action-button{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;border-radius:50%;color:inherit;cursor:pointer;padding:2px}svg.DocSearch-Hit-Select-Icon{display:none}.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-Select-Icon{display:block}.DocSearch-Hit-action-button:focus,.DocSearch-Hit-action-button:hover{background:#0003;transition:background-color .1s ease-in}@media screen and (prefers-reduced-motion:reduce){.DocSearch-Hit-action-button:focus,.DocSearch-Hit-action-button:hover{transition:none}}.DocSearch-Hit-action-button:focus path,.DocSearch-Hit-action-button:hover path{fill:#fff}.DocSearch-Hit-content-wrapper{display:flex;flex:1 1 auto;flex-direction:column;font-weight:500;justify-content:center;line-height:1.2em;margin:0 8px;overflow-x:hidden;position:relative;text-overflow:ellipsis;white-space:nowrap;width:80%}.DocSearch-Hit-title{font-size:.9em}.DocSearch-Hit-path{color:var(--docsearch-muted-color);font-size:.75em}.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-action,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-icon,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-path,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-text,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-title,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-Tree,.DocSearch-Hit[aria-selected=true] mark{color:var(--docsearch-hit-active-color)!important}@media screen and (prefers-reduced-motion:reduce){.DocSearch-Hit-action-button:focus,.DocSearch-Hit-action-button:hover{background:#0003;transition:none}}.DocSearch-ErrorScreen,.DocSearch-NoResults,.DocSearch-StartScreen{font-size:.9em;margin:0 auto;padding:36px 0;text-align:center;width:80%}.DocSearch-Screen-Icon{color:var(--docsearch-muted-color);padding-bottom:12px}.DocSearch-NoResults-Prefill-List{display:inline-block;padding-bottom:24px;text-align:left}.DocSearch-NoResults-Prefill-List ul{display:inline-block;padding:8px 0 0}.DocSearch-NoResults-Prefill-List li{list-style-position:inside;list-style-type:"» "}.DocSearch-Prefill{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;border-radius:1em;color:var(--docsearch-highlight-color);cursor:pointer;display:inline-block;font-size:1em;font-weight:700;padding:0}.DocSearch-Prefill:focus,.DocSearch-Prefill:hover{outline:none;text-decoration:underline}.DocSearch-Footer{align-items:center;background:var(--docsearch-footer-background);border-radius:0 0 8px 8px;box-shadow:var(--docsearch-footer-shadow);display:flex;flex-direction:row-reverse;flex-shrink:0;height:var(--docsearch-footer-height);justify-content:space-between;padding:0 var(--docsearch-spacing);position:relative;-webkit-user-select:none;user-select:none;width:100%;z-index:300}.DocSearch-Commands{color:var(--docsearch-muted-color);display:flex;list-style:none;margin:0;padding:0}.DocSearch-Commands li{align-items:center;display:flex}.DocSearch-Commands li:not(:last-of-type){margin-right:.8em}.DocSearch-Commands-Key{align-items:center;background:var(--docsearch-key-gradient);border-radius:2px;box-shadow:var(--docsearch-key-shadow);display:flex;height:18px;justify-content:center;margin-right:.4em;padding:0 0 1px;color:var(--docsearch-muted-color);border:0;width:20px}@media (max-width:768px){:root{--docsearch-spacing:10px;--docsearch-footer-height:40px}.DocSearch-Dropdown{height:100%}.DocSearch-Container{height:100vh;height:-webkit-fill-available;height:calc(var(--docsearch-vh, 1vh)*100);position:absolute}.DocSearch-Footer{border-radius:0;bottom:0;position:absolute}.DocSearch-Hit-content-wrapper{display:flex;position:relative;width:80%}.DocSearch-Modal{border-radius:0;box-shadow:none;height:100vh;height:-webkit-fill-available;height:calc(var(--docsearch-vh, 1vh)*100);margin:0;max-width:100%;width:100%}.DocSearch-Dropdown{max-height:calc(var(--docsearch-vh, 1vh)*100 - var(--docsearch-searchbox-height) - var(--docsearch-spacing) - var(--docsearch-footer-height))}.DocSearch-Cancel{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;color:var(--docsearch-highlight-color);cursor:pointer;display:inline-block;flex:none;font:inherit;font-size:1em;font-weight:500;margin-left:var(--docsearch-spacing);outline:none;overflow:hidden;padding:0;-webkit-user-select:none;user-select:none;white-space:nowrap}.DocSearch-Commands,.DocSearch-Hit-Tree{display:none}}@keyframes fade-in{0%{opacity:0}to{opacity:1}}[class*=DocSearch]{--docsearch-primary-color: var(--vp-c-brand-1);--docsearch-highlight-color: var(--docsearch-primary-color);--docsearch-text-color: var(--vp-c-text-1);--docsearch-muted-color: var(--vp-c-text-2);--docsearch-searchbox-shadow: none;--docsearch-searchbox-background: transparent;--docsearch-searchbox-focus-background: transparent;--docsearch-key-gradient: transparent;--docsearch-key-shadow: none;--docsearch-modal-background: var(--vp-c-bg-soft);--docsearch-footer-background: var(--vp-c-bg)}.dark [class*=DocSearch]{--docsearch-modal-shadow: none;--docsearch-footer-shadow: none;--docsearch-logo-color: var(--vp-c-text-2);--docsearch-hit-background: var(--vp-c-default-soft);--docsearch-hit-color: var(--vp-c-text-2);--docsearch-hit-shadow: none}.DocSearch-Button{display:flex;justify-content:center;align-items:center;margin:0;padding:0;width:48px;height:55px;background:transparent;transition:border-color .25s}.DocSearch-Button:hover{background:transparent}.DocSearch-Button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}.DocSearch-Button:focus:not(:focus-visible){outline:none!important}@media (min-width: 768px){.DocSearch-Button{justify-content:flex-start;border:1px solid transparent;border-radius:8px;padding:0 10px 0 12px;width:100%;height:40px;background-color:var(--vp-c-bg-alt)}.DocSearch-Button:hover{border-color:var(--vp-c-brand-1);background:var(--vp-c-bg-alt)}}.DocSearch-Button .DocSearch-Button-Container{display:flex;align-items:center}.DocSearch-Button .DocSearch-Search-Icon{position:relative;width:16px;height:16px;color:var(--vp-c-text-1);fill:currentColor;transition:color .5s}.DocSearch-Button:hover .DocSearch-Search-Icon{color:var(--vp-c-text-1)}@media (min-width: 768px){.DocSearch-Button .DocSearch-Search-Icon{top:1px;margin-right:8px;width:14px;height:14px;color:var(--vp-c-text-2)}}.DocSearch-Button .DocSearch-Button-Placeholder{display:none;margin-top:2px;padding:0 16px 0 0;font-size:13px;font-weight:500;color:var(--vp-c-text-2);transition:color .5s}.DocSearch-Button:hover .DocSearch-Button-Placeholder{color:var(--vp-c-text-1)}@media (min-width: 768px){.DocSearch-Button .DocSearch-Button-Placeholder{display:inline-block}}.DocSearch-Button .DocSearch-Button-Keys{direction:ltr;display:none;min-width:auto}@media (min-width: 768px){.DocSearch-Button .DocSearch-Button-Keys{display:flex;align-items:center}}.DocSearch-Button .DocSearch-Button-Key{display:block;margin:2px 0 0;border:1px solid var(--vp-c-divider);border-right:none;border-radius:4px 0 0 4px;padding-left:6px;min-width:0;width:auto;height:22px;line-height:22px;font-family:var(--vp-font-family-base);font-size:12px;font-weight:500;transition:color .5s,border-color .5s}.DocSearch-Button .DocSearch-Button-Key+.DocSearch-Button-Key{border-right:1px solid var(--vp-c-divider);border-left:none;border-radius:0 4px 4px 0;padding-left:2px;padding-right:6px}.DocSearch-Button .DocSearch-Button-Key:first-child{font-size:0!important}.DocSearch-Button .DocSearch-Button-Key:first-child:after{content:"Ctrl";font-size:12px;letter-spacing:normal;color:var(--docsearch-muted-color)}.mac .DocSearch-Button .DocSearch-Button-Key:first-child:after{content:"⌘"}.DocSearch-Button .DocSearch-Button-Key:first-child>*{display:none}.VPNavBarSearch{display:flex;align-items:center}@media (min-width: 768px){.VPNavBarSearch{flex-grow:1;padding-left:24px}}@media (min-width: 960px){.VPNavBarSearch{padding-left:32px}}.dark .DocSearch-Footer{border-top:1px solid var(--vp-c-divider)}.DocSearch-Form{border:1px solid var(--vp-c-brand-1);background-color:var(--vp-c-white)}.dark .DocSearch-Form{background-color:var(--vp-c-default-soft)}.DocSearch-Screen-Icon>svg{margin:auto}.VPNavBarSocialLinks[data-v-ef6192dc]{display:none}@media (min-width: 1280px){.VPNavBarSocialLinks[data-v-ef6192dc]{display:flex;align-items:center}}.title[data-v-e4cade88]{display:flex;align-items:center;border-bottom:1px solid transparent;width:100%;height:var(--vp-nav-height);font-size:16px;font-weight:600;color:var(--vp-c-text-1);transition:opacity .25s}@media (min-width: 960px){.title[data-v-e4cade88]{flex-shrink:0}.VPNavBarTitle.has-sidebar .title[data-v-e4cade88]{border-bottom-color:var(--vp-c-divider)}}[data-v-e4cade88] .logo{margin-right:8px;height:var(--vp-nav-logo-height)}.VPNavBarTranslations[data-v-ff4524ae]{display:none}@media (min-width: 1280px){.VPNavBarTranslations[data-v-ff4524ae]{display:flex;align-items:center}}.title[data-v-ff4524ae]{padding:0 24px 0 12px;line-height:32px;font-size:14px;font-weight:700;color:var(--vp-c-text-1)}.VPNavBar[data-v-3efcd581]{position:relative;height:var(--vp-nav-height);pointer-events:none;white-space:nowrap;transition:background-color .5s}.VPNavBar.has-local-nav[data-v-3efcd581]{background-color:var(--vp-nav-bg-color)}@media (min-width: 960px){.VPNavBar.has-local-nav[data-v-3efcd581]{background-color:transparent}.VPNavBar[data-v-3efcd581]:not(.has-sidebar):not(.top){background-color:var(--vp-nav-bg-color)}}.wrapper[data-v-3efcd581]{padding:0 8px 0 24px}@media (min-width: 768px){.wrapper[data-v-3efcd581]{padding:0 32px}}@media (min-width: 960px){.VPNavBar.has-sidebar .wrapper[data-v-3efcd581]{padding:0}}.container[data-v-3efcd581]{display:flex;justify-content:space-between;margin:0 auto;max-width:calc(var(--vp-layout-max-width) - 64px);height:var(--vp-nav-height);pointer-events:none}.container>.title[data-v-3efcd581],.container>.content[data-v-3efcd581]{pointer-events:none}.container[data-v-3efcd581] *{pointer-events:auto}@media (min-width: 960px){.VPNavBar.has-sidebar .container[data-v-3efcd581]{max-width:100%}}.title[data-v-3efcd581]{flex-shrink:0;height:calc(var(--vp-nav-height) - 1px);transition:background-color .5s}@media (min-width: 960px){.VPNavBar.has-sidebar .title[data-v-3efcd581]{position:absolute;top:0;left:0;z-index:2;padding:0 32px;width:var(--vp-sidebar-width);height:var(--vp-nav-height);background-color:transparent}}@media (min-width: 1440px){.VPNavBar.has-sidebar .title[data-v-3efcd581]{padding-left:max(32px,calc((100% - (var(--vp-layout-max-width) - 64px)) / 2));width:calc((100% - (var(--vp-layout-max-width) - 64px)) / 2 + var(--vp-sidebar-width) - 32px)}}.content[data-v-3efcd581]{flex-grow:1}@media (min-width: 960px){.VPNavBar.has-sidebar .content[data-v-3efcd581]{position:relative;z-index:1;padding-right:32px;padding-left:var(--vp-sidebar-width)}}@media (min-width: 1440px){.VPNavBar.has-sidebar .content[data-v-3efcd581]{padding-right:calc((100vw - var(--vp-layout-max-width)) / 2 + 32px);padding-left:calc((100vw - var(--vp-layout-max-width)) / 2 + var(--vp-sidebar-width))}}.content-body[data-v-3efcd581]{display:flex;justify-content:flex-end;align-items:center;height:var(--vp-nav-height);transition:background-color .5s}@media (min-width: 960px){.VPNavBar:not(.top) .content-body[data-v-3efcd581]{position:relative;background-color:var(--vp-nav-bg-color)}.VPNavBar:not(.has-sidebar):not(.top) .content-body[data-v-3efcd581]{background-color:transparent}}@media (max-width: 767px){.content-body[data-v-3efcd581]{column-gap:.5rem}}.menu+.translations[data-v-3efcd581]:before,.menu+.appearance[data-v-3efcd581]:before,.menu+.social-links[data-v-3efcd581]:before,.translations+.appearance[data-v-3efcd581]:before,.appearance+.social-links[data-v-3efcd581]:before{margin-right:8px;margin-left:8px;width:1px;height:24px;background-color:var(--vp-c-divider);content:""}.menu+.appearance[data-v-3efcd581]:before,.translations+.appearance[data-v-3efcd581]:before{margin-right:16px}.appearance+.social-links[data-v-3efcd581]:before{margin-left:16px}.social-links[data-v-3efcd581]{margin-right:-8px}.divider[data-v-3efcd581]{width:100%;height:1px}@media (min-width: 960px){.VPNavBar.has-sidebar .divider[data-v-3efcd581]{padding-left:var(--vp-sidebar-width)}}@media (min-width: 1440px){.VPNavBar.has-sidebar .divider[data-v-3efcd581]{padding-left:calc((100vw - var(--vp-layout-max-width)) / 2 + var(--vp-sidebar-width))}}.divider-line[data-v-3efcd581]{width:100%;height:1px;transition:background-color .5s}.VPNavBar.has-local-nav .divider-line[data-v-3efcd581]{background-color:var(--vp-c-gutter)}@media (min-width: 960px){.VPNavBar:not(.top) .divider-line[data-v-3efcd581]{background-color:var(--vp-c-gutter)}.VPNavBar:not(.has-sidebar):not(.top) .divider[data-v-3efcd581]{background-color:var(--vp-c-gutter)}}.VPNavScreenAppearance[data-v-338d9b48]{display:flex;justify-content:space-between;align-items:center;border-radius:8px;padding:12px 14px 12px 16px;background-color:var(--vp-c-bg-soft)}.text[data-v-338d9b48]{line-height:24px;font-size:12px;font-weight:500;color:var(--vp-c-text-2)}.VPNavScreenMenuLink[data-v-fe523e3d]{display:block;border-bottom:1px solid var(--vp-c-divider);padding:12px 0 11px;line-height:24px;font-size:14px;font-weight:500;color:var(--vp-c-text-1);transition:border-color .25s,color .25s}.VPNavScreenMenuLink[data-v-fe523e3d]:hover{color:var(--vp-c-brand-1)}.VPNavScreenMenuGroupLink[data-v-aea78dd1]{display:block;margin-left:12px;line-height:32px;font-size:14px;font-weight:400;color:var(--vp-c-text-1);transition:color .25s}.VPNavScreenMenuGroupLink[data-v-aea78dd1]:hover{color:var(--vp-c-brand-1)}.VPNavScreenMenuGroupSection[data-v-f60dbfa7]{display:block}.title[data-v-f60dbfa7]{line-height:32px;font-size:13px;font-weight:700;color:var(--vp-c-text-2);transition:color .25s}.VPNavScreenMenuGroup[data-v-32e4a89c]{border-bottom:1px solid var(--vp-c-divider);height:48px;overflow:hidden;transition:border-color .5s}.VPNavScreenMenuGroup .items[data-v-32e4a89c]{visibility:hidden}.VPNavScreenMenuGroup.open .items[data-v-32e4a89c]{visibility:visible}.VPNavScreenMenuGroup.open[data-v-32e4a89c]{padding-bottom:10px;height:auto}.VPNavScreenMenuGroup.open .button[data-v-32e4a89c]{padding-bottom:6px;color:var(--vp-c-brand-1)}.VPNavScreenMenuGroup.open .button-icon[data-v-32e4a89c]{transform:rotate(45deg)}.button[data-v-32e4a89c]{display:flex;justify-content:space-between;align-items:center;padding:12px 4px 11px 0;width:100%;line-height:24px;font-size:14px;font-weight:500;color:var(--vp-c-text-1);transition:color .25s}.button[data-v-32e4a89c]:hover{color:var(--vp-c-brand-1)}.button-icon[data-v-32e4a89c]{width:14px;height:14px;fill:var(--vp-c-text-2);transition:fill .5s,transform .25s}.group[data-v-32e4a89c]:first-child{padding-top:0}.group+.group[data-v-32e4a89c],.group+.item[data-v-32e4a89c]{padding-top:4px}.VPNavScreenTranslations[data-v-41505286]{height:24px;overflow:hidden}.VPNavScreenTranslations.open[data-v-41505286]{height:auto}.title[data-v-41505286]{display:flex;align-items:center;font-size:14px;font-weight:500;color:var(--vp-c-text-1)}.icon[data-v-41505286]{width:16px;height:16px;fill:currentColor}.icon.lang[data-v-41505286]{margin-right:8px}.icon.chevron[data-v-41505286]{margin-left:4px}.list[data-v-41505286]{padding:4px 0 0 24px}.link[data-v-41505286]{line-height:32px;font-size:13px;color:var(--vp-c-text-1)}.VPNavScreen[data-v-57cce842]{position:fixed;top:calc(var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + 1px);right:0;bottom:0;left:0;padding:0 32px;width:100%;background-color:var(--vp-nav-screen-bg-color);overflow-y:auto;transition:background-color .5s;pointer-events:auto}.VPNavScreen.fade-enter-active[data-v-57cce842],.VPNavScreen.fade-leave-active[data-v-57cce842]{transition:opacity .25s}.VPNavScreen.fade-enter-active .container[data-v-57cce842],.VPNavScreen.fade-leave-active .container[data-v-57cce842]{transition:transform .25s ease}.VPNavScreen.fade-enter-from[data-v-57cce842],.VPNavScreen.fade-leave-to[data-v-57cce842]{opacity:0}.VPNavScreen.fade-enter-from .container[data-v-57cce842],.VPNavScreen.fade-leave-to .container[data-v-57cce842]{transform:translateY(-8px)}@media (min-width: 768px){.VPNavScreen[data-v-57cce842]{display:none}}.container[data-v-57cce842]{margin:0 auto;padding:24px 0 96px;max-width:288px}.menu+.translations[data-v-57cce842],.menu+.appearance[data-v-57cce842],.translations+.appearance[data-v-57cce842]{margin-top:24px}.menu+.social-links[data-v-57cce842]{margin-top:16px}.appearance+.social-links[data-v-57cce842]{margin-top:16px}.VPNav[data-v-7ad780c2]{position:relative;top:var(--vp-layout-top-height, 0px);left:0;z-index:var(--vp-z-index-nav);width:100%;pointer-events:none;transition:background-color .5s}@media (min-width: 960px){.VPNav[data-v-7ad780c2]{position:fixed}}.VPSidebarItem.level-0[data-v-bd01e0d5]{padding-bottom:24px}.VPSidebarItem.collapsed.level-0[data-v-bd01e0d5]{padding-bottom:10px}.item[data-v-bd01e0d5]{position:relative;display:flex;width:100%}.VPSidebarItem.collapsible>.item[data-v-bd01e0d5]{cursor:pointer}.indicator[data-v-bd01e0d5]{position:absolute;top:6px;bottom:6px;left:-17px;width:2px;border-radius:2px;transition:background-color .25s}.VPSidebarItem.level-2.is-active>.item>.indicator[data-v-bd01e0d5],.VPSidebarItem.level-3.is-active>.item>.indicator[data-v-bd01e0d5],.VPSidebarItem.level-4.is-active>.item>.indicator[data-v-bd01e0d5],.VPSidebarItem.level-5.is-active>.item>.indicator[data-v-bd01e0d5]{background-color:var(--vp-c-brand-1)}.link[data-v-bd01e0d5]{display:flex;align-items:center;flex-grow:1}.text[data-v-bd01e0d5]{flex-grow:1;padding:4px 0;line-height:24px;font-size:14px;transition:color .25s}.VPSidebarItem.level-0 .text[data-v-bd01e0d5]{font-weight:700;color:var(--vp-c-text-1)}.VPSidebarItem.level-1 .text[data-v-bd01e0d5],.VPSidebarItem.level-2 .text[data-v-bd01e0d5],.VPSidebarItem.level-3 .text[data-v-bd01e0d5],.VPSidebarItem.level-4 .text[data-v-bd01e0d5],.VPSidebarItem.level-5 .text[data-v-bd01e0d5]{font-weight:500;color:var(--vp-c-text-2)}.VPSidebarItem.level-0.is-link>.item>.link:hover .text[data-v-bd01e0d5],.VPSidebarItem.level-1.is-link>.item>.link:hover .text[data-v-bd01e0d5],.VPSidebarItem.level-2.is-link>.item>.link:hover .text[data-v-bd01e0d5],.VPSidebarItem.level-3.is-link>.item>.link:hover .text[data-v-bd01e0d5],.VPSidebarItem.level-4.is-link>.item>.link:hover .text[data-v-bd01e0d5],.VPSidebarItem.level-5.is-link>.item>.link:hover .text[data-v-bd01e0d5]{color:var(--vp-c-brand-1)}.VPSidebarItem.level-0.has-active>.item>.text[data-v-bd01e0d5],.VPSidebarItem.level-1.has-active>.item>.text[data-v-bd01e0d5],.VPSidebarItem.level-2.has-active>.item>.text[data-v-bd01e0d5],.VPSidebarItem.level-3.has-active>.item>.text[data-v-bd01e0d5],.VPSidebarItem.level-4.has-active>.item>.text[data-v-bd01e0d5],.VPSidebarItem.level-5.has-active>.item>.text[data-v-bd01e0d5],.VPSidebarItem.level-0.has-active>.item>.link>.text[data-v-bd01e0d5],.VPSidebarItem.level-1.has-active>.item>.link>.text[data-v-bd01e0d5],.VPSidebarItem.level-2.has-active>.item>.link>.text[data-v-bd01e0d5],.VPSidebarItem.level-3.has-active>.item>.link>.text[data-v-bd01e0d5],.VPSidebarItem.level-4.has-active>.item>.link>.text[data-v-bd01e0d5],.VPSidebarItem.level-5.has-active>.item>.link>.text[data-v-bd01e0d5]{color:var(--vp-c-text-1)}.VPSidebarItem.level-0.is-active>.item .link>.text[data-v-bd01e0d5],.VPSidebarItem.level-1.is-active>.item .link>.text[data-v-bd01e0d5],.VPSidebarItem.level-2.is-active>.item .link>.text[data-v-bd01e0d5],.VPSidebarItem.level-3.is-active>.item .link>.text[data-v-bd01e0d5],.VPSidebarItem.level-4.is-active>.item .link>.text[data-v-bd01e0d5],.VPSidebarItem.level-5.is-active>.item .link>.text[data-v-bd01e0d5]{color:var(--vp-c-brand-1)}.caret[data-v-bd01e0d5]{display:flex;justify-content:center;align-items:center;margin-right:-7px;width:32px;height:32px;color:var(--vp-c-text-3);cursor:pointer;transition:color .25s;flex-shrink:0}.item:hover .caret[data-v-bd01e0d5]{color:var(--vp-c-text-2)}.item:hover .caret[data-v-bd01e0d5]:hover{color:var(--vp-c-text-1)}.caret-icon[data-v-bd01e0d5]{width:18px;height:18px;fill:currentColor;transform:rotate(90deg);transition:transform .25s}.VPSidebarItem.collapsed .caret-icon[data-v-bd01e0d5]{transform:rotate(0)}.VPSidebarItem.level-1 .items[data-v-bd01e0d5],.VPSidebarItem.level-2 .items[data-v-bd01e0d5],.VPSidebarItem.level-3 .items[data-v-bd01e0d5],.VPSidebarItem.level-4 .items[data-v-bd01e0d5],.VPSidebarItem.level-5 .items[data-v-bd01e0d5]{border-left:1px solid var(--vp-c-divider);padding-left:16px}.VPSidebarItem.collapsed .items[data-v-bd01e0d5]{display:none}.VPSidebar[data-v-4871f9f5]{position:fixed;top:var(--vp-layout-top-height, 0px);bottom:0;left:0;z-index:var(--vp-z-index-sidebar);padding:32px 32px 96px;width:calc(100vw - 64px);max-width:320px;background-color:var(--vp-sidebar-bg-color);opacity:0;box-shadow:var(--vp-c-shadow-3);overflow-x:hidden;overflow-y:auto;transform:translate(-100%);transition:opacity .5s,transform .25s ease;overscroll-behavior:contain}.VPSidebar.open[data-v-4871f9f5]{opacity:1;visibility:visible;transform:translate(0);transition:opacity .25s,transform .5s cubic-bezier(.19,1,.22,1)}.dark .VPSidebar[data-v-4871f9f5]{box-shadow:var(--vp-shadow-1)}@media (min-width: 960px){.VPSidebar[data-v-4871f9f5]{padding-top:var(--vp-nav-height);width:var(--vp-sidebar-width);max-width:100%;background-color:var(--vp-sidebar-bg-color);opacity:1;visibility:visible;box-shadow:none;transform:translate(0)}}@media (min-width: 1440px){.VPSidebar[data-v-4871f9f5]{padding-left:max(32px,calc((100% - (var(--vp-layout-max-width) - 64px)) / 2));width:calc((100% - (var(--vp-layout-max-width) - 64px)) / 2 + var(--vp-sidebar-width) - 32px)}}@media (min-width: 960px){.curtain[data-v-4871f9f5]{position:sticky;top:-64px;left:0;z-index:1;margin-top:calc(var(--vp-nav-height) * -1);margin-right:-32px;margin-left:-32px;height:var(--vp-nav-height);background-color:var(--vp-sidebar-bg-color)}}.nav[data-v-4871f9f5]{outline:0}.group+.group[data-v-4871f9f5]{border-top:1px solid var(--vp-c-divider);padding-top:10px}@media (min-width: 960px){.group[data-v-4871f9f5]{padding-top:10px;width:calc(var(--vp-sidebar-width) - 64px)}}.VPSkipLink[data-v-c8291ffa]{top:8px;left:8px;padding:8px 16px;z-index:999;border-radius:8px;font-size:12px;font-weight:700;text-decoration:none;color:var(--vp-c-brand-1);box-shadow:var(--vp-shadow-3);background-color:var(--vp-c-bg)}.VPSkipLink[data-v-c8291ffa]:focus{height:auto;width:auto;clip:auto;clip-path:none}@media (min-width: 1280px){.VPSkipLink[data-v-c8291ffa]{top:14px;left:16px}}.Layout[data-v-9d8abc1e]{display:flex;flex-direction:column;min-height:100vh}.VPHomeSponsors[data-v-843cc1b2]{border-top:1px solid var(--vp-c-gutter);padding:88px 24px 96px;background-color:var(--vp-c-bg)}.container[data-v-843cc1b2]{margin:0 auto;max-width:1152px}.love[data-v-843cc1b2]{margin:0 auto;width:28px;height:28px;color:var(--vp-c-text-3)}.icon[data-v-843cc1b2]{width:28px;height:28px;fill:currentColor}.message[data-v-843cc1b2]{margin:0 auto;padding-top:10px;max-width:320px;text-align:center;line-height:24px;font-size:16px;font-weight:500;color:var(--vp-c-text-2)}.sponsors[data-v-843cc1b2]{padding-top:32px}.action[data-v-843cc1b2]{padding-top:40px;text-align:center}.VPTeamPage[data-v-b1cfd8dc]{padding-bottom:96px}@media (min-width: 768px){.VPTeamPage[data-v-b1cfd8dc]{padding-bottom:128px}}.VPTeamPageSection+.VPTeamPageSection[data-v-b1cfd8dc-s],.VPTeamMembers+.VPTeamPageSection[data-v-b1cfd8dc-s]{margin-top:64px}.VPTeamMembers+.VPTeamMembers[data-v-b1cfd8dc-s]{margin-top:24px}@media (min-width: 768px){.VPTeamPageTitle+.VPTeamPageSection[data-v-b1cfd8dc-s]{margin-top:16px}.VPTeamPageSection+.VPTeamPageSection[data-v-b1cfd8dc-s],.VPTeamMembers+.VPTeamPageSection[data-v-b1cfd8dc-s]{margin-top:96px}}.VPTeamMembers[data-v-b1cfd8dc-s]{padding:0 24px}@media (min-width: 768px){.VPTeamMembers[data-v-b1cfd8dc-s]{padding:0 48px}}@media (min-width: 960px){.VPTeamMembers[data-v-b1cfd8dc-s]{padding:0 64px}}.VPTeamPageTitle[data-v-46c5e327]{padding:48px 32px;text-align:center}@media (min-width: 768px){.VPTeamPageTitle[data-v-46c5e327]{padding:64px 48px 48px}}@media (min-width: 960px){.VPTeamPageTitle[data-v-46c5e327]{padding:80px 64px 48px}}.title[data-v-46c5e327]{letter-spacing:0;line-height:44px;font-size:36px;font-weight:500}@media (min-width: 768px){.title[data-v-46c5e327]{letter-spacing:-.5px;line-height:56px;font-size:48px}}.lead[data-v-46c5e327]{margin:0 auto;max-width:512px;padding-top:12px;line-height:24px;font-size:16px;font-weight:500;color:var(--vp-c-text-2)}@media (min-width: 768px){.lead[data-v-46c5e327]{max-width:592px;letter-spacing:.15px;line-height:28px;font-size:20px}}.VPTeamPageSection[data-v-3bf2e850]{padding:0 32px}@media (min-width: 768px){.VPTeamPageSection[data-v-3bf2e850]{padding:0 48px}}@media (min-width: 960px){.VPTeamPageSection[data-v-3bf2e850]{padding:0 64px}}.title[data-v-3bf2e850]{position:relative;margin:0 auto;max-width:1152px;text-align:center;color:var(--vp-c-text-2)}.title-line[data-v-3bf2e850]{position:absolute;top:16px;left:0;width:100%;height:1px;background-color:var(--vp-c-divider)}.title-text[data-v-3bf2e850]{position:relative;display:inline-block;padding:0 24px;letter-spacing:0;line-height:32px;font-size:20px;font-weight:500;background-color:var(--vp-c-bg)}.lead[data-v-3bf2e850]{margin:0 auto;max-width:480px;padding-top:12px;text-align:center;line-height:24px;font-size:16px;font-weight:500;color:var(--vp-c-text-2)}.members[data-v-3bf2e850]{padding-top:40px}.VPTeamMembersItem[data-v-9d746f28]{display:flex;flex-direction:column;gap:2px;border-radius:12px;width:100%;height:100%;overflow:hidden}.VPTeamMembersItem.small .profile[data-v-9d746f28]{padding:32px}.VPTeamMembersItem.small .data[data-v-9d746f28]{padding-top:20px}.VPTeamMembersItem.small .avatar[data-v-9d746f28]{width:64px;height:64px}.VPTeamMembersItem.small .name[data-v-9d746f28]{line-height:24px;font-size:16px}.VPTeamMembersItem.small .affiliation[data-v-9d746f28]{padding-top:4px;line-height:20px;font-size:14px}.VPTeamMembersItem.small .desc[data-v-9d746f28]{padding-top:12px;line-height:20px;font-size:14px}.VPTeamMembersItem.small .links[data-v-9d746f28]{margin:0 -16px -20px;padding:10px 0 0}.VPTeamMembersItem.medium .profile[data-v-9d746f28]{padding:48px 32px}.VPTeamMembersItem.medium .data[data-v-9d746f28]{padding-top:24px;text-align:center}.VPTeamMembersItem.medium .avatar[data-v-9d746f28]{width:96px;height:96px}.VPTeamMembersItem.medium .name[data-v-9d746f28]{letter-spacing:.15px;line-height:28px;font-size:20px}.VPTeamMembersItem.medium .affiliation[data-v-9d746f28]{padding-top:4px;font-size:16px}.VPTeamMembersItem.medium .desc[data-v-9d746f28]{padding-top:16px;max-width:288px;font-size:16px}.VPTeamMembersItem.medium .links[data-v-9d746f28]{margin:0 -16px -12px;padding:16px 12px 0}.profile[data-v-9d746f28]{flex-grow:1;background-color:var(--vp-c-bg-soft)}.data[data-v-9d746f28]{text-align:center}.avatar[data-v-9d746f28]{position:relative;flex-shrink:0;margin:0 auto;border-radius:50%;box-shadow:var(--vp-shadow-3)}.avatar-img[data-v-9d746f28]{position:absolute;top:0;right:0;bottom:0;left:0;border-radius:50%;object-fit:cover}.name[data-v-9d746f28]{margin:0;font-weight:600}.affiliation[data-v-9d746f28]{margin:0;font-weight:500;color:var(--vp-c-text-2)}.org.link[data-v-9d746f28]{color:var(--vp-c-text-2);transition:color .25s}.org.link[data-v-9d746f28]:hover{color:var(--vp-c-brand-1)}.desc[data-v-9d746f28]{margin:0 auto}.desc[data-v-9d746f28] a{font-weight:500;color:var(--vp-c-brand-1);text-decoration-style:dotted;transition:color .25s}.links[data-v-9d746f28]{display:flex;justify-content:center;height:56px}.sp-link[data-v-9d746f28]{display:flex;justify-content:center;align-items:center;text-align:center;padding:16px;font-size:14px;font-weight:500;color:var(--vp-c-sponsor);background-color:var(--vp-c-bg-soft);transition:color .25s,background-color .25s}.sp .sp-link.link[data-v-9d746f28]:hover,.sp .sp-link.link[data-v-9d746f28]:focus{outline:none;color:var(--vp-c-white);background-color:var(--vp-c-sponsor)}.sp-icon[data-v-9d746f28]{margin-right:8px;width:16px;height:16px;fill:currentColor}.VPTeamMembers.small .container[data-v-bf782009]{grid-template-columns:repeat(auto-fit,minmax(224px,1fr))}.VPTeamMembers.small.count-1 .container[data-v-bf782009]{max-width:276px}.VPTeamMembers.small.count-2 .container[data-v-bf782009]{max-width:576px}.VPTeamMembers.small.count-3 .container[data-v-bf782009]{max-width:876px}.VPTeamMembers.medium .container[data-v-bf782009]{grid-template-columns:repeat(auto-fit,minmax(256px,1fr))}@media (min-width: 375px){.VPTeamMembers.medium .container[data-v-bf782009]{grid-template-columns:repeat(auto-fit,minmax(288px,1fr))}}.VPTeamMembers.medium.count-1 .container[data-v-bf782009]{max-width:368px}.VPTeamMembers.medium.count-2 .container[data-v-bf782009]{max-width:760px}.container[data-v-bf782009]{display:grid;gap:24px;margin:0 auto;max-width:1152px}.title-footer{text-align:center;font-size:20px;font-weight:700}.logo-footer{margin-left:auto;margin-right:auto}.frame{position:fixed;top:50%;left:50%;transform:translate(-50%,-50%)}.content{display:flex;flex-flow:column}:root{--vp-c-brand-1: #bb2158;--vp-c-brand-2: rgb(187, 33, 88, .75);--vp-c-brand-3: #bb2158} diff --git a/assets/style.fe5e6adf.css b/assets/style.fe5e6adf.css deleted file mode 100644 index d63ed5e5..00000000 --- a/assets/style.fe5e6adf.css +++ /dev/null @@ -1 +0,0 @@ -@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:normal;font-named-instance:"Regular";src:url(/kano/assets/inter-roman-cyrillic.5f2c6c8c.woff2) format("woff2");unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:normal;font-named-instance:"Regular";src:url(/kano/assets/inter-roman-cyrillic-ext.e75737ce.woff2) format("woff2");unicode-range:U+0460-052F,U+1C80-1C88,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:normal;font-named-instance:"Regular";src:url(/kano/assets/inter-roman-greek.d5a6d92a.woff2) format("woff2");unicode-range:U+0370-03FF}@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:normal;font-named-instance:"Regular";src:url(/kano/assets/inter-roman-greek-ext.ab0619bc.woff2) format("woff2");unicode-range:U+1F00-1FFF}@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:normal;font-named-instance:"Regular";src:url(/kano/assets/inter-roman-latin.2ed14f66.woff2) format("woff2");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:normal;font-named-instance:"Regular";src:url(/kano/assets/inter-roman-latin-ext.0030eebd.woff2) format("woff2");unicode-range:U+0100-024F,U+0259,U+1E00-1EFF,U+2020,U+20A0-20AB,U+20AD-20CF,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:normal;font-named-instance:"Regular";src:url(/kano/assets/inter-roman-vietnamese.14ce25a6.woff2) format("woff2");unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+1EA0-1EF9,U+20AB}@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:italic;font-named-instance:"Italic";src:url(/kano/assets/inter-italic-cyrillic.ea42a392.woff2) format("woff2");unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:italic;font-named-instance:"Italic";src:url(/kano/assets/inter-italic-cyrillic-ext.33bd5a8e.woff2) format("woff2");unicode-range:U+0460-052F,U+1C80-1C88,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:italic;font-named-instance:"Italic";src:url(/kano/assets/inter-italic-greek.8f4463c4.woff2) format("woff2");unicode-range:U+0370-03FF}@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:italic;font-named-instance:"Italic";src:url(/kano/assets/inter-italic-greek-ext.4fbe9427.woff2) format("woff2");unicode-range:U+1F00-1FFF}@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:italic;font-named-instance:"Italic";src:url(/kano/assets/inter-italic-latin.bd3b6f56.woff2) format("woff2");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:italic;font-named-instance:"Italic";src:url(/kano/assets/inter-italic-latin-ext.bd8920cc.woff2) format("woff2");unicode-range:U+0100-024F,U+0259,U+1E00-1EFF,U+2020,U+20A0-20AB,U+20AD-20CF,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:italic;font-named-instance:"Italic";src:url(/kano/assets/inter-italic-vietnamese.6ce511fb.woff2) format("woff2");unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+1EA0-1EF9,U+20AB}@font-face{font-family:Chinese Quotes;src:local("PingFang SC Regular"),local("PingFang SC"),local("SimHei"),local("Source Han Sans SC");unicode-range:U+2018,U+2019,U+201C,U+201D}:root{--vp-c-white: #ffffff;--vp-c-black: #000000;--vp-c-neutral: var(--vp-c-black);--vp-c-neutral-inverse: var(--vp-c-white)}.dark{--vp-c-neutral: var(--vp-c-white);--vp-c-neutral-inverse: var(--vp-c-black)}:root{--vp-c-gray-1: #dddde3;--vp-c-gray-2: #e4e4e9;--vp-c-gray-3: #ebebef;--vp-c-gray-soft: rgba(142, 150, 170, .14);--vp-c-indigo-1: #3451b2;--vp-c-indigo-2: #3a5ccc;--vp-c-indigo-3: #5672cd;--vp-c-indigo-soft: rgba(100, 108, 255, .14);--vp-c-green-1: #18794e;--vp-c-green-2: #299764;--vp-c-green-3: #30a46c;--vp-c-green-soft: rgba(16, 185, 129, .14);--vp-c-yellow-1: #915930;--vp-c-yellow-2: #946300;--vp-c-yellow-3: #9f6a00;--vp-c-yellow-soft: rgba(234, 179, 8, .14);--vp-c-red-1: #b8272c;--vp-c-red-2: #d5393e;--vp-c-red-3: #e0575b;--vp-c-red-soft: rgba(244, 63, 94, .14);--vp-c-sponsor: #db2777}.dark{--vp-c-gray-1: #515c67;--vp-c-gray-2: #414853;--vp-c-gray-3: #32363f;--vp-c-gray-soft: rgba(101, 117, 133, .16);--vp-c-indigo-1: #a8b1ff;--vp-c-indigo-2: #5c73e7;--vp-c-indigo-3: #3e63dd;--vp-c-indigo-soft: rgba(100, 108, 255, .16);--vp-c-green-1: #3dd68c;--vp-c-green-2: #30a46c;--vp-c-green-3: #298459;--vp-c-green-soft: rgba(16, 185, 129, .16);--vp-c-yellow-1: #f9b44e;--vp-c-yellow-2: #da8b17;--vp-c-yellow-3: #a46a0a;--vp-c-yellow-soft: rgba(234, 179, 8, .16);--vp-c-red-1: #f66f81;--vp-c-red-2: #f14158;--vp-c-red-3: #b62a3c;--vp-c-red-soft: rgba(244, 63, 94, .16)}:root{--vp-c-bg: #ffffff;--vp-c-bg-alt: #f6f6f7;--vp-c-bg-elv: #ffffff;--vp-c-bg-soft: #f6f6f7}.dark{--vp-c-bg: #1b1b1f;--vp-c-bg-alt: #161618;--vp-c-bg-elv: #202127;--vp-c-bg-soft: #202127}:root{--vp-c-border: #c2c2c4;--vp-c-divider: #e2e2e3;--vp-c-gutter: #e2e2e3}.dark{--vp-c-border: #3c3f44;--vp-c-divider: #2e2e32;--vp-c-gutter: #000000}:root{--vp-c-text-1: rgba(60, 60, 67);--vp-c-text-2: rgba(60, 60, 67, .78);--vp-c-text-3: rgba(60, 60, 67, .56)}.dark{--vp-c-text-1: rgba(255, 255, 245, .86);--vp-c-text-2: rgba(235, 235, 245, .6);--vp-c-text-3: rgba(235, 235, 245, .38)}:root{--vp-c-default-1: var(--vp-c-gray-1);--vp-c-default-2: var(--vp-c-gray-2);--vp-c-default-3: var(--vp-c-gray-3);--vp-c-default-soft: var(--vp-c-gray-soft);--vp-c-brand-1: var(--vp-c-indigo-1);--vp-c-brand-2: var(--vp-c-indigo-2);--vp-c-brand-3: var(--vp-c-indigo-3);--vp-c-brand-soft: var(--vp-c-indigo-soft);--vp-c-brand: var(--vp-c-brand-1);--vp-c-tip-1: var(--vp-c-brand-1);--vp-c-tip-2: var(--vp-c-brand-2);--vp-c-tip-3: var(--vp-c-brand-3);--vp-c-tip-soft: var(--vp-c-brand-soft);--vp-c-warning-1: var(--vp-c-yellow-1);--vp-c-warning-2: var(--vp-c-yellow-2);--vp-c-warning-3: var(--vp-c-yellow-3);--vp-c-warning-soft: var(--vp-c-yellow-soft);--vp-c-danger-1: var(--vp-c-red-1);--vp-c-danger-2: var(--vp-c-red-2);--vp-c-danger-3: var(--vp-c-red-3);--vp-c-danger-soft: var(--vp-c-red-soft)}:root{--vp-font-family-base: "Chinese Quotes", "Inter var", "Inter", ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Helvetica, Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--vp-font-family-mono: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace}:root{--vp-shadow-1: 0 1px 2px rgba(0, 0, 0, .04), 0 1px 2px rgba(0, 0, 0, .06);--vp-shadow-2: 0 3px 12px rgba(0, 0, 0, .07), 0 1px 4px rgba(0, 0, 0, .07);--vp-shadow-3: 0 12px 32px rgba(0, 0, 0, .1), 0 2px 6px rgba(0, 0, 0, .08);--vp-shadow-4: 0 14px 44px rgba(0, 0, 0, .12), 0 3px 9px rgba(0, 0, 0, .12);--vp-shadow-5: 0 18px 56px rgba(0, 0, 0, .16), 0 4px 12px rgba(0, 0, 0, .16)}:root{--vp-z-index-footer: 10;--vp-z-index-local-nav: 20;--vp-z-index-nav: 30;--vp-z-index-layout-top: 40;--vp-z-index-backdrop: 50;--vp-z-index-sidebar: 60}:root{--vp-icon-copy: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' height='20' width='20' stroke='rgba(128,128,128,1)' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath stroke-linecap='round' stroke-linejoin='round' d='M9 5H7a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2V7a2 2 0 0 0-2-2h-2M9 5a2 2 0 0 0 2 2h2a2 2 0 0 0 2-2M9 5a2 2 0 0 1 2-2h2a2 2 0 0 1 2 2'/%3E%3C/svg%3E");--vp-icon-copied: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' height='20' width='20' stroke='rgba(128,128,128,1)' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath stroke-linecap='round' stroke-linejoin='round' d='M9 5H7a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2V7a2 2 0 0 0-2-2h-2M9 5a2 2 0 0 0 2 2h2a2 2 0 0 0 2-2M9 5a2 2 0 0 1 2-2h2a2 2 0 0 1 2 2m-6 9 2 2 4-4'/%3E%3C/svg%3E")}:root{--vp-layout-max-width: 1440px}:root{--vp-header-anchor-symbol: "#"}:root{--vp-code-line-height: 1.7;--vp-code-font-size: .875em;--vp-code-color: var(--vp-c-brand-1);--vp-code-link-color: var(--vp-c-brand-1);--vp-code-link-hover-color: var(--vp-c-brand-2);--vp-code-bg: var(--vp-c-default-soft);--vp-code-block-color: var(--vp-c-text-2);--vp-code-block-bg: var(--vp-c-bg-alt);--vp-code-block-divider-color: var(--vp-c-gutter);--vp-code-lang-color: var(--vp-c-text-3);--vp-code-line-highlight-color: var(--vp-c-default-soft);--vp-code-line-number-color: var(--vp-c-text-3);--vp-code-line-diff-add-color: var(--vp-c-green-soft);--vp-code-line-diff-add-symbol-color: var(--vp-c-green-1);--vp-code-line-diff-remove-color: var(--vp-c-red-soft);--vp-code-line-diff-remove-symbol-color: var(--vp-c-red-1);--vp-code-line-warning-color: var(--vp-c-yellow-soft);--vp-code-line-error-color: var(--vp-c-red-soft);--vp-code-copy-code-border-color: var(--vp-c-divider);--vp-code-copy-code-bg: var(--vp-c-bg-soft);--vp-code-copy-code-hover-border-color: var(--vp-c-divider);--vp-code-copy-code-hover-bg: var(--vp-c-bg);--vp-code-copy-code-active-text: var(--vp-c-text-2);--vp-code-copy-copied-text-content: "Copied";--vp-code-tab-divider: var(--vp-code-block-divider-color);--vp-code-tab-text-color: var(--vp-c-text-2);--vp-code-tab-bg: var(--vp-code-block-bg);--vp-code-tab-hover-text-color: var(--vp-c-text-1);--vp-code-tab-active-text-color: var(--vp-c-text-1);--vp-code-tab-active-bar-color: var(--vp-c-brand-1)}:root{--vp-button-brand-border: transparent;--vp-button-brand-text: var(--vp-c-white);--vp-button-brand-bg: var(--vp-c-brand-3);--vp-button-brand-hover-border: transparent;--vp-button-brand-hover-text: var(--vp-c-white);--vp-button-brand-hover-bg: var(--vp-c-brand-2);--vp-button-brand-active-border: transparent;--vp-button-brand-active-text: var(--vp-c-white);--vp-button-brand-active-bg: var(--vp-c-brand-1);--vp-button-alt-border: transparent;--vp-button-alt-text: var(--vp-c-text-1);--vp-button-alt-bg: var(--vp-c-default-3);--vp-button-alt-hover-border: transparent;--vp-button-alt-hover-text: var(--vp-c-text-1);--vp-button-alt-hover-bg: var(--vp-c-default-2);--vp-button-alt-active-border: transparent;--vp-button-alt-active-text: var(--vp-c-text-1);--vp-button-alt-active-bg: var(--vp-c-default-1);--vp-button-sponsor-border: var(--vp-c-text-2);--vp-button-sponsor-text: var(--vp-c-text-2);--vp-button-sponsor-bg: transparent;--vp-button-sponsor-hover-border: var(--vp-c-sponsor);--vp-button-sponsor-hover-text: var(--vp-c-sponsor);--vp-button-sponsor-hover-bg: transparent;--vp-button-sponsor-active-border: var(--vp-c-sponsor);--vp-button-sponsor-active-text: var(--vp-c-sponsor);--vp-button-sponsor-active-bg: transparent}:root{--vp-custom-block-font-size: 14px;--vp-custom-block-code-font-size: 13px;--vp-custom-block-info-border: transparent;--vp-custom-block-info-text: var(--vp-c-text-1);--vp-custom-block-info-bg: var(--vp-c-default-soft);--vp-custom-block-info-code-bg: var(--vp-c-default-soft);--vp-custom-block-tip-border: transparent;--vp-custom-block-tip-text: var(--vp-c-text-1);--vp-custom-block-tip-bg: var(--vp-c-brand-soft);--vp-custom-block-tip-code-bg: var(--vp-c-brand-soft);--vp-custom-block-warning-border: transparent;--vp-custom-block-warning-text: var(--vp-c-text-1);--vp-custom-block-warning-bg: var(--vp-c-warning-soft);--vp-custom-block-warning-code-bg: var(--vp-c-warning-soft);--vp-custom-block-danger-border: transparent;--vp-custom-block-danger-text: var(--vp-c-text-1);--vp-custom-block-danger-bg: var(--vp-c-danger-soft);--vp-custom-block-danger-code-bg: var(--vp-c-danger-soft);--vp-custom-block-details-border: var(--vp-custom-block-info-border);--vp-custom-block-details-text: var(--vp-custom-block-info-text);--vp-custom-block-details-bg: var(--vp-custom-block-info-bg);--vp-custom-block-details-code-bg: var(--vp-custom-block-info-code-bg)}:root{--vp-input-border-color: var(--vp-c-border);--vp-input-bg-color: var(--vp-c-bg-alt);--vp-input-switch-bg-color: var(--vp-c-gray-soft)}:root{--vp-nav-height: 64px;--vp-nav-bg-color: var(--vp-c-bg);--vp-nav-screen-bg-color: var(--vp-c-bg);--vp-nav-logo-height: 24px}.hide-nav{--vp-nav-height: 0px}.hide-nav .VPSidebar{--vp-nav-height: 22px}:root{--vp-local-nav-bg-color: var(--vp-c-bg)}:root{--vp-sidebar-width: 272px;--vp-sidebar-bg-color: var(--vp-c-bg-alt)}:root{--vp-backdrop-bg-color: rgba(0, 0, 0, .6)}:root{--vp-home-hero-name-color: var(--vp-c-brand-1);--vp-home-hero-name-background: transparent;--vp-home-hero-image-background-image: none;--vp-home-hero-image-filter: none}:root{--vp-badge-info-border: transparent;--vp-badge-info-text: var(--vp-c-text-2);--vp-badge-info-bg: var(--vp-c-default-soft);--vp-badge-tip-border: transparent;--vp-badge-tip-text: var(--vp-c-brand-1);--vp-badge-tip-bg: var(--vp-c-brand-soft);--vp-badge-warning-border: transparent;--vp-badge-warning-text: var(--vp-c-warning-1);--vp-badge-warning-bg: var(--vp-c-warning-soft);--vp-badge-danger-border: transparent;--vp-badge-danger-text: var(--vp-c-danger-1);--vp-badge-danger-bg: var(--vp-c-danger-soft)}:root{--vp-carbon-ads-text-color: var(--vp-c-text-1);--vp-carbon-ads-poweredby-color: var(--vp-c-text-2);--vp-carbon-ads-bg-color: var(--vp-c-bg-soft);--vp-carbon-ads-hover-text-color: var(--vp-c-brand-1);--vp-carbon-ads-hover-poweredby-color: var(--vp-c-text-1)}:root{--vp-local-search-bg: var(--vp-c-bg);--vp-local-search-result-bg: var(--vp-c-bg);--vp-local-search-result-border: var(--vp-c-divider);--vp-local-search-result-selected-bg: var(--vp-c-bg);--vp-local-search-result-selected-border: var(--vp-c-brand-1);--vp-local-search-highlight-bg: var(--vp-c-brand-1);--vp-local-search-highlight-text: var(--vp-c-neutral-inverse)}@media (prefers-reduced-motion: reduce){*,:before,:after{animation-delay:-1ms!important;animation-duration:1ms!important;animation-iteration-count:1!important;background-attachment:initial!important;scroll-behavior:auto!important;transition-duration:0s!important;transition-delay:0s!important}}*,:before,:after{box-sizing:border-box}html{line-height:1.4;font-size:16px;-webkit-text-size-adjust:100%}html.dark{color-scheme:dark}body{margin:0;width:100%;min-width:320px;min-height:100vh;line-height:24px;font-family:var(--vp-font-family-base);font-size:16px;font-weight:400;color:var(--vp-c-text-1);background-color:var(--vp-c-bg);direction:ltr;font-synthesis:style;text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}main{display:block}h1,h2,h3,h4,h5,h6{margin:0;line-height:24px;font-size:16px;font-weight:400}p{margin:0}strong,b{font-weight:600}a,area,button,[role=button],input,label,select,summary,textarea{touch-action:manipulation}a{color:inherit;text-decoration:inherit}ol,ul{list-style:none;margin:0;padding:0}blockquote{margin:0}pre,code,kbd,samp{font-family:var(--vp-font-family-mono)}img,svg,video,canvas,audio,iframe,embed,object{display:block}figure{margin:0}img,video{max-width:100%;height:auto}button,input,optgroup,select,textarea{border:0;padding:0;line-height:inherit;color:inherit}button{padding:0;font-family:inherit;background-color:transparent;background-image:none}button:enabled,[role=button]:enabled{cursor:pointer}button:focus,button:focus-visible{outline:1px dotted;outline:4px auto -webkit-focus-ring-color}button:focus:not(:focus-visible){outline:none!important}input:focus,textarea:focus,select:focus{outline:none}table{border-collapse:collapse}input{background-color:transparent}input:-ms-input-placeholder,textarea:-ms-input-placeholder{color:var(--vp-c-text-3)}input::-ms-input-placeholder,textarea::-ms-input-placeholder{color:var(--vp-c-text-3)}input::placeholder,textarea::placeholder{color:var(--vp-c-text-3)}input::-webkit-outer-spin-button,input::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}input[type=number]{-moz-appearance:textfield}textarea{resize:vertical}select{-webkit-appearance:none}fieldset{margin:0;padding:0}h1,h2,h3,h4,h5,h6,li,p{overflow-wrap:break-word}vite-error-overlay{z-index:9999}mjx-container{display:inline-block;margin:auto 2px -2px}mjx-container>svg{margin:auto}.visually-hidden{position:absolute;width:1px;height:1px;white-space:nowrap;clip:rect(0 0 0 0);clip-path:inset(50%);overflow:hidden}.custom-block{border:1px solid transparent;border-radius:8px;padding:16px 16px 8px;line-height:24px;font-size:var(--vp-custom-block-font-size);color:var(--vp-c-text-2)}.custom-block.info{border-color:var(--vp-custom-block-info-border);color:var(--vp-custom-block-info-text);background-color:var(--vp-custom-block-info-bg)}.custom-block.info a,.custom-block.info code{color:var(--vp-c-brand-1)}.custom-block.info a:hover{color:var(--vp-c-brand-2)}.custom-block.info code{background-color:var(--vp-custom-block-info-code-bg)}.custom-block.tip{border-color:var(--vp-custom-block-tip-border);color:var(--vp-custom-block-tip-text);background-color:var(--vp-custom-block-tip-bg)}.custom-block.tip a,.custom-block.tip code{color:var(--vp-c-brand-1)}.custom-block.tip a:hover{color:var(--vp-c-brand-2)}.custom-block.tip code{background-color:var(--vp-custom-block-tip-code-bg)}.custom-block.warning{border-color:var(--vp-custom-block-warning-border);color:var(--vp-custom-block-warning-text);background-color:var(--vp-custom-block-warning-bg)}.custom-block.warning a,.custom-block.warning code{color:var(--vp-c-warning-1)}.custom-block.warning a:hover{color:var(--vp-c-warning-2)}.custom-block.warning code{background-color:var(--vp-custom-block-warning-code-bg)}.custom-block.danger{border-color:var(--vp-custom-block-danger-border);color:var(--vp-custom-block-danger-text);background-color:var(--vp-custom-block-danger-bg)}.custom-block.danger a,.custom-block.danger code{color:var(--vp-c-danger-1)}.custom-block.danger a:hover{color:var(--vp-c-danger-2)}.custom-block.danger code{background-color:var(--vp-custom-block-danger-code-bg)}.custom-block.details{border-color:var(--vp-custom-block-details-border);color:var(--vp-custom-block-details-text);background-color:var(--vp-custom-block-details-bg)}.custom-block.details a{color:var(--vp-c-brand-1)}.custom-block.details a:hover{color:var(--vp-c-brand-2)}.custom-block.details code{background-color:var(--vp-custom-block-details-code-bg)}.custom-block-title{font-weight:600}.custom-block p+p{margin:8px 0}.custom-block.details summary{margin:0 0 8px;font-weight:700;cursor:pointer}.custom-block.details summary+p{margin:8px 0}.custom-block a{color:inherit;font-weight:600;text-decoration:underline;text-underline-offset:2px;transition:opacity .25s}.custom-block a:hover{opacity:.75}.custom-block code{font-size:var(--vp-custom-block-code-font-size)}.custom-block.custom-block th,.custom-block.custom-block blockquote>p{font-size:var(--vp-custom-block-font-size);color:inherit}.dark .vp-code-light{display:none}html:not(.dark) .vp-code-dark{display:none}.vp-code-group{margin-top:16px}.vp-code-group .tabs{position:relative;display:flex;margin-right:-24px;margin-left:-24px;padding:0 12px;background-color:var(--vp-code-tab-bg);overflow-x:auto;overflow-y:hidden;box-shadow:inset 0 -1px var(--vp-code-tab-divider)}@media (min-width: 640px){.vp-code-group .tabs{margin-right:0;margin-left:0;border-radius:8px 8px 0 0}}.vp-code-group .tabs input{position:fixed;opacity:0;pointer-events:none}.vp-code-group .tabs label{position:relative;display:inline-block;border-bottom:1px solid transparent;padding:0 12px;line-height:48px;font-size:14px;font-weight:500;color:var(--vp-code-tab-text-color);white-space:nowrap;cursor:pointer;transition:color .25s}.vp-code-group .tabs label:after{position:absolute;right:8px;bottom:-1px;left:8px;z-index:1;height:2px;border-radius:2px;content:"";background-color:transparent;transition:background-color .25s}.vp-code-group label:hover{color:var(--vp-code-tab-hover-text-color)}.vp-code-group input:checked+label{color:var(--vp-code-tab-active-text-color)}.vp-code-group input:checked+label:after{background-color:var(--vp-code-tab-active-bar-color)}.vp-code-group div[class*=language-],.vp-block{display:none;margin-top:0!important;border-top-left-radius:0!important;border-top-right-radius:0!important}.vp-code-group div[class*=language-].active,.vp-block.active{display:block}.vp-block{padding:20px 24px}.vp-doc h1,.vp-doc h2,.vp-doc h3,.vp-doc h4,.vp-doc h5,.vp-doc h6{position:relative;font-weight:600;outline:none}.vp-doc h1{letter-spacing:-.02em;line-height:40px;font-size:28px}.vp-doc h2{margin:48px 0 16px;border-top:1px solid var(--vp-c-divider);padding-top:24px;letter-spacing:-.02em;line-height:32px;font-size:24px}.vp-doc h3{margin:32px 0 0;letter-spacing:-.01em;line-height:28px;font-size:20px}.vp-doc .header-anchor{position:absolute;top:0;left:0;margin-left:-.87em;font-weight:500;-webkit-user-select:none;user-select:none;opacity:0;text-decoration:none;transition:color .25s,opacity .25s}.vp-doc .header-anchor:before{content:var(--vp-header-anchor-symbol)}.vp-doc h1:hover .header-anchor,.vp-doc h1 .header-anchor:focus,.vp-doc h2:hover .header-anchor,.vp-doc h2 .header-anchor:focus,.vp-doc h3:hover .header-anchor,.vp-doc h3 .header-anchor:focus,.vp-doc h4:hover .header-anchor,.vp-doc h4 .header-anchor:focus,.vp-doc h5:hover .header-anchor,.vp-doc h5 .header-anchor:focus,.vp-doc h6:hover .header-anchor,.vp-doc h6 .header-anchor:focus{opacity:1}@media (min-width: 768px){.vp-doc h1{letter-spacing:-.02em;line-height:40px;font-size:32px}}.vp-doc h2 .header-anchor{top:24px}.vp-doc p,.vp-doc summary{margin:16px 0}.vp-doc p{line-height:28px}.vp-doc blockquote{margin:16px 0;border-left:2px solid var(--vp-c-divider);padding-left:16px;transition:border-color .5s}.vp-doc blockquote>p{margin:0;font-size:16px;color:var(--vp-c-text-2);transition:color .5s}.vp-doc a{font-weight:500;color:var(--vp-c-brand-1);text-decoration:underline;text-underline-offset:2px;transition:color .25s,opacity .25s}.vp-doc a:hover{color:var(--vp-c-brand-2)}.vp-doc strong{font-weight:600}.vp-doc ul,.vp-doc ol{padding-left:1.25rem;margin:16px 0}.vp-doc ul{list-style:disc}.vp-doc ol{list-style:decimal}.vp-doc li+li{margin-top:8px}.vp-doc li>ol,.vp-doc li>ul{margin:8px 0 0}.vp-doc table{display:block;border-collapse:collapse;margin:20px 0;overflow-x:auto}.vp-doc tr{border-top:1px solid var(--vp-c-divider);transition:background-color .5s}.vp-doc tr:nth-child(2n){background-color:var(--vp-c-bg-soft)}.vp-doc th,.vp-doc td{border:1px solid var(--vp-c-divider);padding:8px 16px}.vp-doc th{text-align:left;font-size:14px;font-weight:600;color:var(--vp-c-text-2);background-color:var(--vp-c-bg-soft)}.vp-doc td{font-size:14px}.vp-doc hr{margin:16px 0;border:none;border-top:1px solid var(--vp-c-divider)}.vp-doc .custom-block{margin:16px 0}.vp-doc .custom-block p{margin:8px 0;line-height:24px}.vp-doc .custom-block p:first-child{margin:0}.vp-doc .custom-block div[class*=language-]{margin:8px 0;border-radius:8px}.vp-doc .custom-block div[class*=language-] code{font-weight:400;background-color:transparent}.vp-doc .custom-block .vp-code-group .tabs{margin:0;border-radius:8px 8px 0 0}.vp-doc :not(pre,h1,h2,h3,h4,h5,h6)>code{font-size:var(--vp-code-font-size);color:var(--vp-code-color)}.vp-doc :not(pre)>code{border-radius:4px;padding:3px 6px;background-color:var(--vp-code-bg);transition:color .25s,background-color .5s}.vp-doc a>code{color:var(--vp-code-link-color)}.vp-doc a:hover>code{color:var(--vp-code-link-hover-color)}.vp-doc h1>code,.vp-doc h2>code,.vp-doc h3>code{font-size:.9em}.vp-doc div[class*=language-],.vp-block{position:relative;margin:16px -24px;background-color:var(--vp-code-block-bg);overflow-x:auto;transition:background-color .5s}@media (min-width: 640px){.vp-doc div[class*=language-],.vp-block{border-radius:8px;margin:16px 0}}@media (max-width: 639px){.vp-doc li div[class*=language-]{border-radius:8px 0 0 8px}}.vp-doc div[class*=language-]+div[class*=language-],.vp-doc div[class$=-api]+div[class*=language-],.vp-doc div[class*=language-]+div[class$=-api]>div[class*=language-]{margin-top:-8px}.vp-doc [class*=language-] pre,.vp-doc [class*=language-] code{direction:ltr;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none}.vp-doc [class*=language-] pre{position:relative;z-index:1;margin:0;padding:20px 0;background:transparent;overflow-x:auto}.vp-doc [class*=language-] code{display:block;padding:0 24px;width:fit-content;min-width:100%;line-height:var(--vp-code-line-height);font-size:var(--vp-code-font-size);color:var(--vp-code-block-color);transition:color .5s}.vp-doc [class*=language-] code .highlighted{background-color:var(--vp-code-line-highlight-color);transition:background-color .5s;margin:0 -24px;padding:0 24px;width:calc(100% + 48px);display:inline-block}.vp-doc [class*=language-] code .highlighted.error{background-color:var(--vp-code-line-error-color)}.vp-doc [class*=language-] code .highlighted.warning{background-color:var(--vp-code-line-warning-color)}.vp-doc [class*=language-] code .diff{transition:background-color .5s;margin:0 -24px;padding:0 24px;width:calc(100% + 48px);display:inline-block}.vp-doc [class*=language-] code .diff:before{position:absolute;left:10px}.vp-doc [class*=language-] .has-focused-lines .line:not(.has-focus){filter:blur(.095rem);opacity:.4;transition:filter .35s,opacity .35s}.vp-doc [class*=language-] .has-focused-lines .line:not(.has-focus){opacity:.7;transition:filter .35s,opacity .35s}.vp-doc [class*=language-]:hover .has-focused-lines .line:not(.has-focus){filter:blur(0);opacity:1}.vp-doc [class*=language-] code .diff.remove{background-color:var(--vp-code-line-diff-remove-color);opacity:.7}.vp-doc [class*=language-] code .diff.remove:before{content:"-";color:var(--vp-code-line-diff-remove-symbol-color)}.vp-doc [class*=language-] code .diff.add{background-color:var(--vp-code-line-diff-add-color)}.vp-doc [class*=language-] code .diff.add:before{content:"+";color:var(--vp-code-line-diff-add-symbol-color)}.vp-doc div[class*=language-].line-numbers-mode{padding-left:32px}.vp-doc .line-numbers-wrapper{position:absolute;top:0;bottom:0;left:0;z-index:3;border-right:1px solid var(--vp-code-block-divider-color);padding-top:20px;width:32px;text-align:center;font-family:var(--vp-font-family-mono);line-height:var(--vp-code-line-height);font-size:var(--vp-code-font-size);color:var(--vp-code-line-number-color);transition:border-color .5s,color .5s}.vp-doc [class*=language-]>button.copy{direction:ltr;position:absolute;top:12px;right:12px;z-index:3;border:1px solid var(--vp-code-copy-code-border-color);border-radius:4px;width:40px;height:40px;background-color:var(--vp-code-copy-code-bg);opacity:0;cursor:pointer;background-image:var(--vp-icon-copy);background-position:50%;background-size:20px;background-repeat:no-repeat;transition:border-color .25s,background-color .25s,opacity .25s}.vp-doc [class*=language-]:hover>button.copy,.vp-doc [class*=language-]>button.copy:focus{opacity:1}.vp-doc [class*=language-]>button.copy:hover,.vp-doc [class*=language-]>button.copy.copied{border-color:var(--vp-code-copy-code-hover-border-color);background-color:var(--vp-code-copy-code-hover-bg)}.vp-doc [class*=language-]>button.copy.copied,.vp-doc [class*=language-]>button.copy:hover.copied{border-radius:0 4px 4px 0;background-color:var(--vp-code-copy-code-hover-bg);background-image:var(--vp-icon-copied)}.vp-doc [class*=language-]>button.copy.copied:before,.vp-doc [class*=language-]>button.copy:hover.copied:before{position:relative;top:-1px;transform:translate(calc(-100% - 1px));display:flex;justify-content:center;align-items:center;border:1px solid var(--vp-code-copy-code-hover-border-color);border-right:0;border-radius:4px 0 0 4px;padding:0 10px;width:fit-content;height:40px;text-align:center;font-size:12px;font-weight:500;color:var(--vp-code-copy-code-active-text);background-color:var(--vp-code-copy-code-hover-bg);white-space:nowrap;content:var(--vp-code-copy-copied-text-content)}.vp-doc [class*=language-]>span.lang{position:absolute;top:2px;right:8px;z-index:2;font-size:12px;font-weight:500;color:var(--vp-code-lang-color);transition:color .4s,opacity .4s}.vp-doc [class*=language-]:hover>button.copy+span.lang,.vp-doc [class*=language-]>button.copy:focus+span.lang{opacity:0}.vp-doc .VPTeamMembers{margin-top:24px}.vp-doc .VPTeamMembers.small.count-1 .container{margin:0!important;max-width:calc((100% - 24px)/2)!important}.vp-doc .VPTeamMembers.small.count-2 .container,.vp-doc .VPTeamMembers.small.count-3 .container{max-width:100%!important}.vp-doc .VPTeamMembers.medium.count-1 .container{margin:0!important;max-width:calc((100% - 24px)/2)!important}:is(.vp-external-link-icon,.vp-doc a[href*="://"],.vp-doc a[target=_blank]):not(.no-icon):after{display:inline-block;margin-top:-1px;margin-left:4px;width:11px;height:11px;background:currentColor;color:var(--vp-c-text-3);flex-shrink:0;--icon: url("data:image/svg+xml, %3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' %3E%3Cpath d='M0 0h24v24H0V0z' fill='none' /%3E%3Cpath d='M9 5v2h6.59L4 18.59 5.41 20 17 8.41V15h2V5H9z' /%3E%3C/svg%3E");-webkit-mask-image:var(--icon);mask-image:var(--icon)}.vp-external-link-icon:after{content:""}.vp-sponsor{border-radius:16px;overflow:hidden}.vp-sponsor.aside{border-radius:12px}.vp-sponsor-section+.vp-sponsor-section{margin-top:4px}.vp-sponsor-tier{margin-bottom:4px;text-align:center;letter-spacing:1px;line-height:24px;width:100%;font-weight:600;color:var(--vp-c-text-2);background-color:var(--vp-c-bg-soft)}.vp-sponsor.normal .vp-sponsor-tier{padding:13px 0 11px;font-size:14px}.vp-sponsor.aside .vp-sponsor-tier{padding:9px 0 7px;font-size:12px}.vp-sponsor-grid+.vp-sponsor-tier{margin-top:4px}.vp-sponsor-grid{display:flex;flex-wrap:wrap;gap:4px}.vp-sponsor-grid.xmini .vp-sponsor-grid-link{height:64px}.vp-sponsor-grid.xmini .vp-sponsor-grid-image{max-width:64px;max-height:22px}.vp-sponsor-grid.mini .vp-sponsor-grid-link{height:72px}.vp-sponsor-grid.mini .vp-sponsor-grid-image{max-width:96px;max-height:24px}.vp-sponsor-grid.small .vp-sponsor-grid-link{height:96px}.vp-sponsor-grid.small .vp-sponsor-grid-image{max-width:96px;max-height:24px}.vp-sponsor-grid.medium .vp-sponsor-grid-link{height:112px}.vp-sponsor-grid.medium .vp-sponsor-grid-image{max-width:120px;max-height:36px}.vp-sponsor-grid.big .vp-sponsor-grid-link{height:184px}.vp-sponsor-grid.big .vp-sponsor-grid-image{max-width:192px;max-height:56px}.vp-sponsor-grid[data-vp-grid="2"] .vp-sponsor-grid-item{width:calc((100% - 4px)/2)}.vp-sponsor-grid[data-vp-grid="3"] .vp-sponsor-grid-item{width:calc((100% - 4px * 2) / 3)}.vp-sponsor-grid[data-vp-grid="4"] .vp-sponsor-grid-item{width:calc((100% - 12px)/4)}.vp-sponsor-grid[data-vp-grid="5"] .vp-sponsor-grid-item{width:calc((100% - 16px)/5)}.vp-sponsor-grid[data-vp-grid="6"] .vp-sponsor-grid-item{width:calc((100% - 4px * 5) / 6)}.vp-sponsor-grid-item{flex-shrink:0;width:100%;background-color:var(--vp-c-bg-soft);transition:background-color .25s}.vp-sponsor-grid-item:hover{background-color:var(--vp-c-default-soft)}.vp-sponsor-grid-item:hover .vp-sponsor-grid-image{filter:grayscale(0) invert(0)}.vp-sponsor-grid-item.empty:hover{background-color:var(--vp-c-bg-soft)}.dark .vp-sponsor-grid-item:hover{background-color:var(--vp-c-white)}.dark .vp-sponsor-grid-item.empty:hover{background-color:var(--vp-c-bg-soft)}.vp-sponsor-grid-link{display:flex}.vp-sponsor-grid-box{display:flex;justify-content:center;align-items:center;width:100%}.vp-sponsor-grid-image{max-width:100%;filter:grayscale(1);transition:filter .25s}.dark .vp-sponsor-grid-image{filter:grayscale(1) invert(1)}.VPBadge[data-v-ea5b2908]{display:inline-block;margin-left:2px;border:1px solid transparent;border-radius:12px;padding:0 10px;line-height:22px;font-size:12px;font-weight:500;transform:translateY(-2px)}.vp-doc h1>.VPBadge[data-v-ea5b2908]{margin-top:4px;vertical-align:top}.vp-doc h2>.VPBadge[data-v-ea5b2908]{margin-top:3px;padding:0 8px;vertical-align:top}.vp-doc h3>.VPBadge[data-v-ea5b2908]{vertical-align:middle}.vp-doc h4>.VPBadge[data-v-ea5b2908],.vp-doc h5>.VPBadge[data-v-ea5b2908],.vp-doc h6>.VPBadge[data-v-ea5b2908]{vertical-align:middle;line-height:18px}.VPBadge.info[data-v-ea5b2908]{border-color:var(--vp-badge-info-border);color:var(--vp-badge-info-text);background-color:var(--vp-badge-info-bg)}.VPBadge.tip[data-v-ea5b2908]{border-color:var(--vp-badge-tip-border);color:var(--vp-badge-tip-text);background-color:var(--vp-badge-tip-bg)}.VPBadge.warning[data-v-ea5b2908]{border-color:var(--vp-badge-warning-border);color:var(--vp-badge-warning-text);background-color:var(--vp-badge-warning-bg)}.VPBadge.danger[data-v-ea5b2908]{border-color:var(--vp-badge-danger-border);color:var(--vp-badge-danger-text);background-color:var(--vp-badge-danger-bg)}.VPBackdrop[data-v-54a304ca]{position:fixed;top:0;right:0;bottom:0;left:0;z-index:var(--vp-z-index-backdrop);background:var(--vp-backdrop-bg-color);transition:opacity .5s}.VPBackdrop.fade-enter-from[data-v-54a304ca],.VPBackdrop.fade-leave-to[data-v-54a304ca]{opacity:0}.VPBackdrop.fade-leave-active[data-v-54a304ca]{transition-duration:.25s}@media (min-width: 1280px){.VPBackdrop[data-v-54a304ca]{display:none}}.NotFound[data-v-b9c0c15a]{padding:64px 24px 96px;text-align:center}@media (min-width: 768px){.NotFound[data-v-b9c0c15a]{padding:96px 32px 168px}}.code[data-v-b9c0c15a]{line-height:64px;font-size:64px;font-weight:600}.title[data-v-b9c0c15a]{padding-top:12px;letter-spacing:2px;line-height:20px;font-size:20px;font-weight:700}.divider[data-v-b9c0c15a]{margin:24px auto 18px;width:64px;height:1px;background-color:var(--vp-c-divider)}.quote[data-v-b9c0c15a]{margin:0 auto;max-width:256px;font-size:14px;font-weight:500;color:var(--vp-c-text-2)}.action[data-v-b9c0c15a]{padding-top:20px}.link[data-v-b9c0c15a]{display:inline-block;border:1px solid var(--vp-c-brand-1);border-radius:16px;padding:3px 16px;font-size:14px;font-weight:500;color:var(--vp-c-brand-1);transition:border-color .25s,color .25s}.link[data-v-b9c0c15a]:hover{border-color:var(--vp-c-brand-2);color:var(--vp-c-brand-2)}.root[data-v-463da30f]{position:relative;z-index:1}.nested[data-v-463da30f]{padding-left:16px}.outline-link[data-v-463da30f]{display:block;line-height:28px;color:var(--vp-c-text-2);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;transition:color .5s;font-weight:400}.outline-link[data-v-463da30f]:hover,.outline-link.active[data-v-463da30f]{color:var(--vp-c-text-1);transition:color .25s}.outline-link.nested[data-v-463da30f]{padding-left:13px}.VPDocAsideOutline[data-v-3a6c4994]{display:none}.VPDocAsideOutline.has-outline[data-v-3a6c4994]{display:block}.content[data-v-3a6c4994]{position:relative;border-left:1px solid var(--vp-c-divider);padding-left:16px;font-size:13px;font-weight:500}.outline-marker[data-v-3a6c4994]{position:absolute;top:32px;left:-1px;z-index:0;opacity:0;width:2px;border-radius:2px;height:18px;background-color:var(--vp-c-brand-1);transition:top .25s cubic-bezier(0,1,.5,1),background-color .5s,opacity .25s}.outline-title[data-v-3a6c4994]{letter-spacing:.4px;line-height:28px;font-size:13px;font-weight:600}.VPDocAside[data-v-cb998dce]{display:flex;flex-direction:column;flex-grow:1}.spacer[data-v-cb998dce]{flex-grow:1}.VPDocAside[data-v-cb998dce] .spacer+.VPDocAsideSponsors,.VPDocAside[data-v-cb998dce] .spacer+.VPDocAsideCarbonAds{margin-top:24px}.VPDocAside[data-v-cb998dce] .VPDocAsideSponsors+.VPDocAsideCarbonAds{margin-top:16px}.VPLastUpdated[data-v-19a7ae4e]{line-height:24px;font-size:14px;font-weight:500;color:var(--vp-c-text-2)}@media (min-width: 640px){.VPLastUpdated[data-v-19a7ae4e]{line-height:32px;font-size:14px;font-weight:500}}.VPDocFooter[data-v-a2d931e4]{margin-top:64px}.edit-info[data-v-a2d931e4]{padding-bottom:18px}@media (min-width: 640px){.edit-info[data-v-a2d931e4]{display:flex;justify-content:space-between;align-items:center;padding-bottom:14px}}.edit-link-button[data-v-a2d931e4]{display:flex;align-items:center;border:0;line-height:32px;font-size:14px;font-weight:500;color:var(--vp-c-brand-1);transition:color .25s}.edit-link-button[data-v-a2d931e4]:hover{color:var(--vp-c-brand-2)}.edit-link-icon[data-v-a2d931e4]{margin-right:8px;width:14px;height:14px;fill:currentColor}.prev-next[data-v-a2d931e4]{border-top:1px solid var(--vp-c-divider);padding-top:24px;display:grid;grid-row-gap:8px}@media (min-width: 640px){.prev-next[data-v-a2d931e4]{grid-template-columns:repeat(2,1fr);grid-column-gap:16px}}.pager-link[data-v-a2d931e4]{display:block;border:1px solid var(--vp-c-divider);border-radius:8px;padding:11px 16px 13px;width:100%;height:100%;transition:border-color .25s}.pager-link[data-v-a2d931e4]:hover{border-color:var(--vp-c-brand-1)}.pager-link.next[data-v-a2d931e4]{margin-left:auto;text-align:right}.desc[data-v-a2d931e4]{display:block;line-height:20px;font-size:12px;font-weight:500;color:var(--vp-c-text-2)}.title[data-v-a2d931e4]{display:block;line-height:20px;font-size:14px;font-weight:500;color:var(--vp-c-brand-1);transition:color .25s}.VPDocOutlineDropdown[data-v-95bb0785]{margin-bottom:48px}.VPDocOutlineDropdown button[data-v-95bb0785]{display:block;font-size:14px;font-weight:500;line-height:24px;border:1px solid var(--vp-c-border);padding:4px 12px;color:var(--vp-c-text-2);background-color:var(--vp-c-default-soft);border-radius:8px;transition:color .5s}.VPDocOutlineDropdown button[data-v-95bb0785]:hover{color:var(--vp-c-text-1);transition:color .25s}.VPDocOutlineDropdown button.open[data-v-95bb0785]{color:var(--vp-c-text-1)}.icon[data-v-95bb0785]{display:inline-block;vertical-align:middle;width:16px;height:16px;fill:currentColor}[data-v-95bb0785] .outline-link{font-size:14px;font-weight:400}.open>.icon[data-v-95bb0785]{transform:rotate(90deg)}.items[data-v-95bb0785]{margin-top:12px;border-left:1px solid var(--vp-c-divider)}.VPDoc[data-v-a3c25e27]{padding:32px 24px 96px;width:100%}.VPDoc .VPDocOutlineDropdown[data-v-a3c25e27]{display:none}@media (min-width: 960px) and (max-width: 1279px){.VPDoc .VPDocOutlineDropdown[data-v-a3c25e27]{display:block}}@media (min-width: 768px){.VPDoc[data-v-a3c25e27]{padding:48px 32px 128px}}@media (min-width: 960px){.VPDoc[data-v-a3c25e27]{padding:32px 32px 0}.VPDoc:not(.has-sidebar) .container[data-v-a3c25e27]{display:flex;justify-content:center;max-width:992px}.VPDoc:not(.has-sidebar) .content[data-v-a3c25e27]{max-width:752px}}@media (min-width: 1280px){.VPDoc .container[data-v-a3c25e27]{display:flex;justify-content:center}.VPDoc .aside[data-v-a3c25e27]{display:block}}@media (min-width: 1440px){.VPDoc:not(.has-sidebar) .content[data-v-a3c25e27]{max-width:784px}.VPDoc:not(.has-sidebar) .container[data-v-a3c25e27]{max-width:1104px}}.container[data-v-a3c25e27]{margin:0 auto;width:100%}.aside[data-v-a3c25e27]{position:relative;display:none;order:2;flex-grow:1;padding-left:32px;width:100%;max-width:256px}.left-aside[data-v-a3c25e27]{order:1;padding-left:unset;padding-right:32px}.aside-container[data-v-a3c25e27]{position:fixed;top:0;padding-top:calc(var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + var(--vp-doc-top-height, 0px) + 32px);width:224px;height:100vh;overflow-x:hidden;overflow-y:auto;scrollbar-width:none}.aside-container[data-v-a3c25e27]::-webkit-scrollbar{display:none}.aside-curtain[data-v-a3c25e27]{position:fixed;bottom:0;z-index:10;width:224px;height:32px;background:linear-gradient(transparent,var(--vp-c-bg) 70%)}.aside-content[data-v-a3c25e27]{display:flex;flex-direction:column;min-height:calc(100vh - (var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + 32px));padding-bottom:32px}.content[data-v-a3c25e27]{position:relative;margin:0 auto;width:100%}@media (min-width: 960px){.content[data-v-a3c25e27]{padding:0 32px 128px}}@media (min-width: 1280px){.content[data-v-a3c25e27]{order:1;margin:0;min-width:640px}}.content-container[data-v-a3c25e27]{margin:0 auto}.VPDoc.has-aside .content-container[data-v-a3c25e27]{max-width:688px}.external-link-icon-enabled[data-v-a3c25e27] :is(.vp-doc a[href*="://"],.vp-doc a[target=_blank]):after{content:"";color:currentColor}.VPButton[data-v-1e76fe75]{display:inline-block;border:1px solid transparent;text-align:center;font-weight:600;white-space:nowrap;transition:color .25s,border-color .25s,background-color .25s}.VPButton[data-v-1e76fe75]:active{transition:color .1s,border-color .1s,background-color .1s}.VPButton.medium[data-v-1e76fe75]{border-radius:20px;padding:0 20px;line-height:38px;font-size:14px}.VPButton.big[data-v-1e76fe75]{border-radius:24px;padding:0 24px;line-height:46px;font-size:16px}.VPButton.brand[data-v-1e76fe75]{border-color:var(--vp-button-brand-border);color:var(--vp-button-brand-text);background-color:var(--vp-button-brand-bg)}.VPButton.brand[data-v-1e76fe75]:hover{border-color:var(--vp-button-brand-hover-border);color:var(--vp-button-brand-hover-text);background-color:var(--vp-button-brand-hover-bg)}.VPButton.brand[data-v-1e76fe75]:active{border-color:var(--vp-button-brand-active-border);color:var(--vp-button-brand-active-text);background-color:var(--vp-button-brand-active-bg)}.VPButton.alt[data-v-1e76fe75]{border-color:var(--vp-button-alt-border);color:var(--vp-button-alt-text);background-color:var(--vp-button-alt-bg)}.VPButton.alt[data-v-1e76fe75]:hover{border-color:var(--vp-button-alt-hover-border);color:var(--vp-button-alt-hover-text);background-color:var(--vp-button-alt-hover-bg)}.VPButton.alt[data-v-1e76fe75]:active{border-color:var(--vp-button-alt-active-border);color:var(--vp-button-alt-active-text);background-color:var(--vp-button-alt-active-bg)}.VPButton.sponsor[data-v-1e76fe75]{border-color:var(--vp-button-sponsor-border);color:var(--vp-button-sponsor-text);background-color:var(--vp-button-sponsor-bg)}.VPButton.sponsor[data-v-1e76fe75]:hover{border-color:var(--vp-button-sponsor-hover-border);color:var(--vp-button-sponsor-hover-text);background-color:var(--vp-button-sponsor-hover-bg)}.VPButton.sponsor[data-v-1e76fe75]:active{border-color:var(--vp-button-sponsor-active-border);color:var(--vp-button-sponsor-active-text);background-color:var(--vp-button-sponsor-active-bg)}html:not(.dark) .VPImage.dark[data-v-ab19afbb]{display:none}.dark .VPImage.light[data-v-ab19afbb]{display:none}.VPHero[data-v-5a3e9999]{margin-top:calc((var(--vp-nav-height) + var(--vp-layout-top-height, 0px)) * -1);padding:calc(var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + 48px) 24px 48px}@media (min-width: 640px){.VPHero[data-v-5a3e9999]{padding:calc(var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + 80px) 48px 64px}}@media (min-width: 960px){.VPHero[data-v-5a3e9999]{padding:calc(var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + 80px) 64px 64px}}.container[data-v-5a3e9999]{display:flex;flex-direction:column;margin:0 auto;max-width:1152px}@media (min-width: 960px){.container[data-v-5a3e9999]{flex-direction:row}}.main[data-v-5a3e9999]{position:relative;z-index:10;order:2;flex-grow:1;flex-shrink:0}.VPHero.has-image .container[data-v-5a3e9999]{text-align:center}@media (min-width: 960px){.VPHero.has-image .container[data-v-5a3e9999]{text-align:left}}@media (min-width: 960px){.main[data-v-5a3e9999]{order:1;width:calc((100% / 3) * 2)}.VPHero.has-image .main[data-v-5a3e9999]{max-width:592px}}.name[data-v-5a3e9999],.text[data-v-5a3e9999]{max-width:392px;letter-spacing:-.4px;line-height:40px;font-size:32px;font-weight:700;white-space:pre-wrap}.VPHero.has-image .name[data-v-5a3e9999],.VPHero.has-image .text[data-v-5a3e9999]{margin:0 auto}.name[data-v-5a3e9999]{color:var(--vp-home-hero-name-color)}.clip[data-v-5a3e9999]{background:var(--vp-home-hero-name-background);-webkit-background-clip:text;background-clip:text;-webkit-text-fill-color:var(--vp-home-hero-name-color)}@media (min-width: 640px){.name[data-v-5a3e9999],.text[data-v-5a3e9999]{max-width:576px;line-height:56px;font-size:48px}}@media (min-width: 960px){.name[data-v-5a3e9999],.text[data-v-5a3e9999]{line-height:64px;font-size:56px}.VPHero.has-image .name[data-v-5a3e9999],.VPHero.has-image .text[data-v-5a3e9999]{margin:0}}.tagline[data-v-5a3e9999]{padding-top:8px;max-width:392px;line-height:28px;font-size:18px;font-weight:500;white-space:pre-wrap;color:var(--vp-c-text-2)}.VPHero.has-image .tagline[data-v-5a3e9999]{margin:0 auto}@media (min-width: 640px){.tagline[data-v-5a3e9999]{padding-top:12px;max-width:576px;line-height:32px;font-size:20px}}@media (min-width: 960px){.tagline[data-v-5a3e9999]{line-height:36px;font-size:24px}.VPHero.has-image .tagline[data-v-5a3e9999]{margin:0}}.actions[data-v-5a3e9999]{display:flex;flex-wrap:wrap;margin:-6px;padding-top:24px}.VPHero.has-image .actions[data-v-5a3e9999]{justify-content:center}@media (min-width: 640px){.actions[data-v-5a3e9999]{padding-top:32px}}@media (min-width: 960px){.VPHero.has-image .actions[data-v-5a3e9999]{justify-content:flex-start}}.action[data-v-5a3e9999]{flex-shrink:0;padding:6px}.image[data-v-5a3e9999]{order:1;margin:-76px -24px -48px}@media (min-width: 640px){.image[data-v-5a3e9999]{margin:-108px -24px -48px}}@media (min-width: 960px){.image[data-v-5a3e9999]{flex-grow:1;order:2;margin:0;min-height:100%}}.image-container[data-v-5a3e9999]{position:relative;margin:0 auto;width:320px;height:320px}@media (min-width: 640px){.image-container[data-v-5a3e9999]{width:392px;height:392px}}@media (min-width: 960px){.image-container[data-v-5a3e9999]{display:flex;justify-content:center;align-items:center;width:100%;height:100%;transform:translate(-32px,-32px)}}.image-bg[data-v-5a3e9999]{position:absolute;top:50%;left:50%;border-radius:50%;width:192px;height:192px;background-image:var(--vp-home-hero-image-background-image);filter:var(--vp-home-hero-image-filter);transform:translate(-50%,-50%)}@media (min-width: 640px){.image-bg[data-v-5a3e9999]{width:256px;height:256px}}@media (min-width: 960px){.image-bg[data-v-5a3e9999]{width:320px;height:320px}}[data-v-5a3e9999] .image-src{position:absolute;top:50%;left:50%;max-width:192px;max-height:192px;transform:translate(-50%,-50%)}@media (min-width: 640px){[data-v-5a3e9999] .image-src{max-width:256px;max-height:256px}}@media (min-width: 960px){[data-v-5a3e9999] .image-src{max-width:320px;max-height:320px}}.VPFeature[data-v-ee984185]{display:block;border:1px solid var(--vp-c-bg-soft);border-radius:12px;height:100%;background-color:var(--vp-c-bg-soft);transition:border-color .25s,background-color .25s}.VPFeature.link[data-v-ee984185]:hover{border-color:var(--vp-c-brand-1)}.box[data-v-ee984185]{display:flex;flex-direction:column;padding:24px;height:100%}.box[data-v-ee984185]>.VPImage{margin-bottom:20px}.icon[data-v-ee984185]{display:flex;justify-content:center;align-items:center;margin-bottom:20px;border-radius:6px;background-color:var(--vp-c-default-soft);width:48px;height:48px;font-size:24px;transition:background-color .25s}.title[data-v-ee984185]{line-height:24px;font-size:16px;font-weight:600}.details[data-v-ee984185]{flex-grow:1;padding-top:8px;line-height:24px;font-size:14px;font-weight:500;color:var(--vp-c-text-2)}.link-text[data-v-ee984185]{padding-top:8px}.link-text-value[data-v-ee984185]{display:flex;align-items:center;font-size:14px;font-weight:500;color:var(--vp-c-brand-1)}.link-text-icon[data-v-ee984185]{display:inline-block;margin-left:6px;width:14px;height:14px;fill:currentColor}.VPFeatures[data-v-b1eea84a]{position:relative;padding:0 24px}@media (min-width: 640px){.VPFeatures[data-v-b1eea84a]{padding:0 48px}}@media (min-width: 960px){.VPFeatures[data-v-b1eea84a]{padding:0 64px}}.container[data-v-b1eea84a]{margin:0 auto;max-width:1152px}.items[data-v-b1eea84a]{display:flex;flex-wrap:wrap;margin:-8px}.item[data-v-b1eea84a]{padding:8px;width:100%}@media (min-width: 640px){.item.grid-2[data-v-b1eea84a],.item.grid-4[data-v-b1eea84a],.item.grid-6[data-v-b1eea84a]{width:50%}}@media (min-width: 768px){.item.grid-2[data-v-b1eea84a],.item.grid-4[data-v-b1eea84a]{width:50%}.item.grid-3[data-v-b1eea84a],.item.grid-6[data-v-b1eea84a]{width:calc(100% / 3)}}@media (min-width: 960px){.item.grid-4[data-v-b1eea84a]{width:25%}}.VPHome[data-v-20eabd3a]{padding-bottom:96px}.VPHome[data-v-20eabd3a] .VPHomeSponsors{margin-top:112px;margin-bottom:-128px}@media (min-width: 768px){.VPHome[data-v-20eabd3a]{padding-bottom:128px}}.VPContent[data-v-3cf691b6]{flex-grow:1;flex-shrink:0;margin:var(--vp-layout-top-height, 0px) auto 0;width:100%}.VPContent.is-home[data-v-3cf691b6]{width:100%;max-width:100%}.VPContent.has-sidebar[data-v-3cf691b6]{margin:0}@media (min-width: 960px){.VPContent[data-v-3cf691b6]{padding-top:var(--vp-nav-height)}.VPContent.has-sidebar[data-v-3cf691b6]{margin:var(--vp-layout-top-height, 0px) 0 0;padding-left:var(--vp-sidebar-width)}}@media (min-width: 1440px){.VPContent.has-sidebar[data-v-3cf691b6]{padding-right:calc((100vw - var(--vp-layout-max-width)) / 2);padding-left:calc((100vw - var(--vp-layout-max-width)) / 2 + var(--vp-sidebar-width))}}.VPFooter[data-v-e4279f1c]{position:relative;z-index:var(--vp-z-index-footer);border-top:1px solid var(--vp-c-gutter);padding:32px 24px;background-color:var(--vp-c-bg)}.VPFooter.has-sidebar[data-v-e4279f1c]{display:none}@media (min-width: 768px){.VPFooter[data-v-e4279f1c]{padding:32px}}.container[data-v-e4279f1c]{margin:0 auto;max-width:var(--vp-layout-max-width);text-align:center}.message[data-v-e4279f1c],.copyright[data-v-e4279f1c]{line-height:24px;font-size:14px;font-weight:500;color:var(--vp-c-text-2)}.VPLocalNavOutlineDropdown[data-v-24251f6f]{padding:12px 20px 11px}.VPLocalNavOutlineDropdown button[data-v-24251f6f]{display:block;font-size:12px;font-weight:500;line-height:24px;color:var(--vp-c-text-2);transition:color .5s;position:relative}.VPLocalNavOutlineDropdown button[data-v-24251f6f]:hover{color:var(--vp-c-text-1);transition:color .25s}.VPLocalNavOutlineDropdown button.open[data-v-24251f6f]{color:var(--vp-c-text-1)}.icon[data-v-24251f6f]{display:inline-block;vertical-align:middle;margin-left:2px;width:14px;height:14px;fill:currentColor}[data-v-24251f6f] .outline-link{font-size:14px;padding:2px 0}.open>.icon[data-v-24251f6f]{transform:rotate(90deg)}.items[data-v-24251f6f]{position:absolute;top:64px;right:16px;left:16px;display:grid;gap:1px;border:1px solid var(--vp-c-border);border-radius:8px;background-color:var(--vp-c-gutter);max-height:calc(var(--vp-vh, 100vh) - 86px);overflow:hidden auto;box-shadow:var(--vp-shadow-3)}.header[data-v-24251f6f]{background-color:var(--vp-c-bg-soft)}.top-link[data-v-24251f6f]{display:block;padding:0 16px;line-height:48px;font-size:14px;font-weight:500;color:var(--vp-c-brand-1)}.outline[data-v-24251f6f]{padding:8px 0;background-color:var(--vp-c-bg-soft)}.flyout-enter-active[data-v-24251f6f]{transition:all .2s ease-out}.flyout-leave-active[data-v-24251f6f]{transition:all .15s ease-in}.flyout-enter-from[data-v-24251f6f],.flyout-leave-to[data-v-24251f6f]{opacity:0;transform:translateY(-16px)}.VPLocalNav[data-v-9e669cc1]{position:sticky;top:0;left:0;z-index:var(--vp-z-index-local-nav);display:flex;justify-content:space-between;align-items:center;border-top:1px solid var(--vp-c-gutter);border-bottom:1px solid var(--vp-c-gutter);padding-top:var(--vp-layout-top-height, 0px);width:100%;background-color:var(--vp-local-nav-bg-color)}.VPLocalNav.fixed[data-v-9e669cc1]{position:fixed}.VPLocalNav.reached-top[data-v-9e669cc1]{border-top-color:transparent}@media (min-width: 960px){.VPLocalNav[data-v-9e669cc1]{display:none}}.menu[data-v-9e669cc1]{display:flex;align-items:center;padding:12px 24px 11px;line-height:24px;font-size:12px;font-weight:500;color:var(--vp-c-text-2);transition:color .5s}.menu[data-v-9e669cc1]:hover{color:var(--vp-c-text-1);transition:color .25s}@media (min-width: 768px){.menu[data-v-9e669cc1]{padding:0 32px}}.menu-icon[data-v-9e669cc1]{margin-right:8px;width:16px;height:16px;fill:currentColor}.VPOutlineDropdown[data-v-9e669cc1]{padding:12px 24px 11px}@media (min-width: 768px){.VPOutlineDropdown[data-v-9e669cc1]{padding:12px 32px 11px}}.VPSwitch[data-v-1c29e291]{position:relative;border-radius:11px;display:block;width:40px;height:22px;flex-shrink:0;border:1px solid var(--vp-input-border-color);background-color:var(--vp-input-switch-bg-color);transition:border-color .25s!important}.VPSwitch[data-v-1c29e291]:hover{border-color:var(--vp-c-brand-1)}.check[data-v-1c29e291]{position:absolute;top:1px;left:1px;width:18px;height:18px;border-radius:50%;background-color:var(--vp-c-neutral-inverse);box-shadow:var(--vp-shadow-1);transition:transform .25s!important}.icon[data-v-1c29e291]{position:relative;display:block;width:18px;height:18px;border-radius:50%;overflow:hidden}.icon[data-v-1c29e291] svg{position:absolute;top:3px;left:3px;width:12px;height:12px;fill:var(--vp-c-text-2)}.dark .icon[data-v-1c29e291] svg{fill:var(--vp-c-text-1);transition:opacity .25s!important}.sun[data-v-3329432d]{opacity:1}.moon[data-v-3329432d],.dark .sun[data-v-3329432d]{opacity:0}.dark .moon[data-v-3329432d]{opacity:1}.dark .VPSwitchAppearance[data-v-3329432d] .check{transform:translate(18px)}.VPNavBarAppearance[data-v-283b26e9]{display:none}@media (min-width: 1280px){.VPNavBarAppearance[data-v-283b26e9]{display:flex;align-items:center}}.VPMenuGroup+.VPMenuLink[data-v-f51f088d]{margin:12px -12px 0;border-top:1px solid var(--vp-c-divider);padding:12px 12px 0}.link[data-v-f51f088d]{display:block;border-radius:6px;padding:0 12px;line-height:32px;font-size:14px;font-weight:500;color:var(--vp-c-text-1);white-space:nowrap;transition:background-color .25s,color .25s}.link[data-v-f51f088d]:hover{color:var(--vp-c-brand-1);background-color:var(--vp-c-default-soft)}.link.active[data-v-f51f088d]{color:var(--vp-c-brand-1)}.VPMenuGroup[data-v-a6b0397c]{margin:12px -12px 0;border-top:1px solid var(--vp-c-divider);padding:12px 12px 0}.VPMenuGroup[data-v-a6b0397c]:first-child{margin-top:0;border-top:0;padding-top:0}.VPMenuGroup+.VPMenuGroup[data-v-a6b0397c]{margin-top:12px;border-top:1px solid var(--vp-c-divider)}.title[data-v-a6b0397c]{padding:0 12px;line-height:32px;font-size:14px;font-weight:600;color:var(--vp-c-text-2);white-space:nowrap;transition:color .25s}.VPMenu[data-v-e42ed9b3]{border-radius:12px;padding:12px;min-width:128px;border:1px solid var(--vp-c-divider);background-color:var(--vp-c-bg-elv);box-shadow:var(--vp-shadow-3);transition:background-color .5s;max-height:calc(100vh - var(--vp-nav-height));overflow-y:auto}.VPMenu[data-v-e42ed9b3] .group{margin:0 -12px;padding:0 12px 12px}.VPMenu[data-v-e42ed9b3] .group+.group{border-top:1px solid var(--vp-c-divider);padding:11px 12px 12px}.VPMenu[data-v-e42ed9b3] .group:last-child{padding-bottom:0}.VPMenu[data-v-e42ed9b3] .group+.item{border-top:1px solid var(--vp-c-divider);padding:11px 16px 0}.VPMenu[data-v-e42ed9b3] .item{padding:0 16px;white-space:nowrap}.VPMenu[data-v-e42ed9b3] .label{flex-grow:1;line-height:28px;font-size:12px;font-weight:500;color:var(--vp-c-text-2);transition:color .5s}.VPMenu[data-v-e42ed9b3] .action{padding-left:24px}.VPFlyout[data-v-aa8de344]{position:relative}.VPFlyout[data-v-aa8de344]:hover{color:var(--vp-c-brand-1);transition:color .25s}.VPFlyout:hover .text[data-v-aa8de344]{color:var(--vp-c-text-2)}.VPFlyout:hover .icon[data-v-aa8de344]{fill:var(--vp-c-text-2)}.VPFlyout.active .text[data-v-aa8de344]{color:var(--vp-c-brand-1)}.VPFlyout.active:hover .text[data-v-aa8de344]{color:var(--vp-c-brand-2)}.VPFlyout:hover .menu[data-v-aa8de344],.button[aria-expanded=true]+.menu[data-v-aa8de344]{opacity:1;visibility:visible;transform:translateY(0)}.button[aria-expanded=false]+.menu[data-v-aa8de344]{opacity:0;visibility:hidden;transform:translateY(0)}.button[data-v-aa8de344]{display:flex;align-items:center;padding:0 12px;height:var(--vp-nav-height);color:var(--vp-c-text-1);transition:color .5s}.text[data-v-aa8de344]{display:flex;align-items:center;line-height:var(--vp-nav-height);font-size:14px;font-weight:500;color:var(--vp-c-text-1);transition:color .25s}.option-icon[data-v-aa8de344]{margin-right:0;width:16px;height:16px;fill:currentColor}.text-icon[data-v-aa8de344]{margin-left:4px;width:14px;height:14px;fill:currentColor}.icon[data-v-aa8de344]{width:20px;height:20px;fill:currentColor;transition:fill .25s}.menu[data-v-aa8de344]{position:absolute;top:calc(var(--vp-nav-height) / 2 + 20px);right:0;opacity:0;visibility:hidden;transition:opacity .25s,visibility .25s,transform .25s}.VPSocialLink[data-v-16cf740a]{display:flex;justify-content:center;align-items:center;width:36px;height:36px;color:var(--vp-c-text-2);transition:color .5s}.VPSocialLink[data-v-16cf740a]:hover{color:var(--vp-c-text-1);transition:color .25s}.VPSocialLink[data-v-16cf740a]>svg{width:20px;height:20px;fill:currentColor}.VPSocialLinks[data-v-e71e869c]{display:flex;justify-content:center}.VPNavBarExtra[data-v-c8c2ae4b]{display:none;margin-right:-12px}@media (min-width: 768px){.VPNavBarExtra[data-v-c8c2ae4b]{display:block}}@media (min-width: 1280px){.VPNavBarExtra[data-v-c8c2ae4b]{display:none}}.trans-title[data-v-c8c2ae4b]{padding:0 24px 0 12px;line-height:32px;font-size:14px;font-weight:700;color:var(--vp-c-text-1)}.item.appearance[data-v-c8c2ae4b],.item.social-links[data-v-c8c2ae4b]{display:flex;align-items:center;padding:0 12px}.item.appearance[data-v-c8c2ae4b]{min-width:176px}.appearance-action[data-v-c8c2ae4b]{margin-right:-2px}.social-links-list[data-v-c8c2ae4b]{margin:-4px -8px}.VPNavBarHamburger[data-v-6bee1efd]{display:flex;justify-content:center;align-items:center;width:48px;height:var(--vp-nav-height)}@media (min-width: 768px){.VPNavBarHamburger[data-v-6bee1efd]{display:none}}.container[data-v-6bee1efd]{position:relative;width:16px;height:14px;overflow:hidden}.VPNavBarHamburger:hover .top[data-v-6bee1efd]{top:0;left:0;transform:translate(4px)}.VPNavBarHamburger:hover .middle[data-v-6bee1efd]{top:6px;left:0;transform:translate(0)}.VPNavBarHamburger:hover .bottom[data-v-6bee1efd]{top:12px;left:0;transform:translate(8px)}.VPNavBarHamburger.active .top[data-v-6bee1efd]{top:6px;transform:translate(0) rotate(225deg)}.VPNavBarHamburger.active .middle[data-v-6bee1efd]{top:6px;transform:translate(16px)}.VPNavBarHamburger.active .bottom[data-v-6bee1efd]{top:6px;transform:translate(0) rotate(135deg)}.VPNavBarHamburger.active:hover .top[data-v-6bee1efd],.VPNavBarHamburger.active:hover .middle[data-v-6bee1efd],.VPNavBarHamburger.active:hover .bottom[data-v-6bee1efd]{background-color:var(--vp-c-text-2);transition:top .25s,background-color .25s,transform .25s}.top[data-v-6bee1efd],.middle[data-v-6bee1efd],.bottom[data-v-6bee1efd]{position:absolute;width:16px;height:2px;background-color:var(--vp-c-text-1);transition:top .25s,background-color .5s,transform .25s}.top[data-v-6bee1efd]{top:0;left:0;transform:translate(0)}.middle[data-v-6bee1efd]{top:6px;left:0;transform:translate(8px)}.bottom[data-v-6bee1efd]{top:12px;left:0;transform:translate(4px)}.VPNavBarMenuLink[data-v-cb318fec]{display:flex;align-items:center;padding:0 12px;line-height:var(--vp-nav-height);font-size:14px;font-weight:500;color:var(--vp-c-text-1);transition:color .25s}.VPNavBarMenuLink.active[data-v-cb318fec],.VPNavBarMenuLink[data-v-cb318fec]:hover{color:var(--vp-c-brand-1)}.VPNavBarMenu[data-v-f732b5d0]{display:none}@media (min-width: 768px){.VPNavBarMenu[data-v-f732b5d0]{display:flex}}/*! @docsearch/css 3.5.2 | MIT License | © Algolia, Inc. and contributors | https://docsearch.algolia.com */:root{--docsearch-primary-color:#5468ff;--docsearch-text-color:#1c1e21;--docsearch-spacing:12px;--docsearch-icon-stroke-width:1.4;--docsearch-highlight-color:var(--docsearch-primary-color);--docsearch-muted-color:#969faf;--docsearch-container-background:rgba(101,108,133,.8);--docsearch-logo-color:#5468ff;--docsearch-modal-width:560px;--docsearch-modal-height:600px;--docsearch-modal-background:#f5f6f7;--docsearch-modal-shadow:inset 1px 1px 0 0 hsla(0,0%,100%,.5),0 3px 8px 0 #555a64;--docsearch-searchbox-height:56px;--docsearch-searchbox-background:#ebedf0;--docsearch-searchbox-focus-background:#fff;--docsearch-searchbox-shadow:inset 0 0 0 2px var(--docsearch-primary-color);--docsearch-hit-height:56px;--docsearch-hit-color:#444950;--docsearch-hit-active-color:#fff;--docsearch-hit-background:#fff;--docsearch-hit-shadow:0 1px 3px 0 #d4d9e1;--docsearch-key-gradient:linear-gradient(-225deg,#d5dbe4,#f8f8f8);--docsearch-key-shadow:inset 0 -2px 0 0 #cdcde6,inset 0 0 1px 1px #fff,0 1px 2px 1px rgba(30,35,90,.4);--docsearch-footer-height:44px;--docsearch-footer-background:#fff;--docsearch-footer-shadow:0 -1px 0 0 #e0e3e8,0 -3px 6px 0 rgba(69,98,155,.12)}html[data-theme=dark]{--docsearch-text-color:#f5f6f7;--docsearch-container-background:rgba(9,10,17,.8);--docsearch-modal-background:#15172a;--docsearch-modal-shadow:inset 1px 1px 0 0 #2c2e40,0 3px 8px 0 #000309;--docsearch-searchbox-background:#090a11;--docsearch-searchbox-focus-background:#000;--docsearch-hit-color:#bec3c9;--docsearch-hit-shadow:none;--docsearch-hit-background:#090a11;--docsearch-key-gradient:linear-gradient(-26.5deg,#565872,#31355b);--docsearch-key-shadow:inset 0 -2px 0 0 #282d55,inset 0 0 1px 1px #51577d,0 2px 2px 0 rgba(3,4,9,.3);--docsearch-footer-background:#1e2136;--docsearch-footer-shadow:inset 0 1px 0 0 rgba(73,76,106,.5),0 -4px 8px 0 rgba(0,0,0,.2);--docsearch-logo-color:#fff;--docsearch-muted-color:#7f8497}.DocSearch-Button{align-items:center;background:var(--docsearch-searchbox-background);border:0;border-radius:40px;color:var(--docsearch-muted-color);cursor:pointer;display:flex;font-weight:500;height:36px;justify-content:space-between;margin:0 0 0 16px;padding:0 8px;-webkit-user-select:none;user-select:none}.DocSearch-Button:active,.DocSearch-Button:focus,.DocSearch-Button:hover{background:var(--docsearch-searchbox-focus-background);box-shadow:var(--docsearch-searchbox-shadow);color:var(--docsearch-text-color);outline:none}.DocSearch-Button-Container{align-items:center;display:flex}.DocSearch-Search-Icon{stroke-width:1.6}.DocSearch-Button .DocSearch-Search-Icon{color:var(--docsearch-text-color)}.DocSearch-Button-Placeholder{font-size:1rem;padding:0 12px 0 6px}.DocSearch-Button-Keys{display:flex;min-width:calc(40px + .8em)}.DocSearch-Button-Key{align-items:center;background:var(--docsearch-key-gradient);border-radius:3px;box-shadow:var(--docsearch-key-shadow);color:var(--docsearch-muted-color);display:flex;height:18px;justify-content:center;margin-right:.4em;position:relative;padding:0 0 2px;border:0;top:-1px;width:20px}@media (max-width:768px){.DocSearch-Button-Keys,.DocSearch-Button-Placeholder{display:none}}.DocSearch--active{overflow:hidden!important}.DocSearch-Container,.DocSearch-Container *{box-sizing:border-box}.DocSearch-Container{background-color:var(--docsearch-container-background);height:100vh;left:0;position:fixed;top:0;width:100vw;z-index:200}.DocSearch-Container a{text-decoration:none}.DocSearch-Link{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;color:var(--docsearch-highlight-color);cursor:pointer;font:inherit;margin:0;padding:0}.DocSearch-Modal{background:var(--docsearch-modal-background);border-radius:6px;box-shadow:var(--docsearch-modal-shadow);flex-direction:column;margin:60px auto auto;max-width:var(--docsearch-modal-width);position:relative}.DocSearch-SearchBar{display:flex;padding:var(--docsearch-spacing) var(--docsearch-spacing) 0}.DocSearch-Form{align-items:center;background:var(--docsearch-searchbox-focus-background);border-radius:4px;box-shadow:var(--docsearch-searchbox-shadow);display:flex;height:var(--docsearch-searchbox-height);margin:0;padding:0 var(--docsearch-spacing);position:relative;width:100%}.DocSearch-Input{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:transparent;border:0;color:var(--docsearch-text-color);flex:1;font:inherit;font-size:1.2em;height:100%;outline:none;padding:0 0 0 8px;width:80%}.DocSearch-Input::placeholder{color:var(--docsearch-muted-color);opacity:1}.DocSearch-Input::-webkit-search-cancel-button,.DocSearch-Input::-webkit-search-decoration,.DocSearch-Input::-webkit-search-results-button,.DocSearch-Input::-webkit-search-results-decoration{display:none}.DocSearch-LoadingIndicator,.DocSearch-MagnifierLabel,.DocSearch-Reset{margin:0;padding:0}.DocSearch-MagnifierLabel,.DocSearch-Reset{align-items:center;color:var(--docsearch-highlight-color);display:flex;justify-content:center}.DocSearch-Container--Stalled .DocSearch-MagnifierLabel,.DocSearch-LoadingIndicator{display:none}.DocSearch-Container--Stalled .DocSearch-LoadingIndicator{align-items:center;color:var(--docsearch-highlight-color);display:flex;justify-content:center}@media screen and (prefers-reduced-motion:reduce){.DocSearch-Reset{animation:none;-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;border-radius:50%;color:var(--docsearch-icon-color);cursor:pointer;right:0;stroke-width:var(--docsearch-icon-stroke-width)}}.DocSearch-Reset{animation:fade-in .1s ease-in forwards;-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;border-radius:50%;color:var(--docsearch-icon-color);cursor:pointer;padding:2px;right:0;stroke-width:var(--docsearch-icon-stroke-width)}.DocSearch-Reset[hidden]{display:none}.DocSearch-Reset:hover{color:var(--docsearch-highlight-color)}.DocSearch-LoadingIndicator svg,.DocSearch-MagnifierLabel svg{height:24px;width:24px}.DocSearch-Cancel{display:none}.DocSearch-Dropdown{max-height:calc(var(--docsearch-modal-height) - var(--docsearch-searchbox-height) - var(--docsearch-spacing) - var(--docsearch-footer-height));min-height:var(--docsearch-spacing);overflow-y:auto;overflow-y:overlay;padding:0 var(--docsearch-spacing);scrollbar-color:var(--docsearch-muted-color) var(--docsearch-modal-background);scrollbar-width:thin}.DocSearch-Dropdown::-webkit-scrollbar{width:12px}.DocSearch-Dropdown::-webkit-scrollbar-track{background:transparent}.DocSearch-Dropdown::-webkit-scrollbar-thumb{background-color:var(--docsearch-muted-color);border:3px solid var(--docsearch-modal-background);border-radius:20px}.DocSearch-Dropdown ul{list-style:none;margin:0;padding:0}.DocSearch-Label{font-size:.75em;line-height:1.6em}.DocSearch-Help,.DocSearch-Label{color:var(--docsearch-muted-color)}.DocSearch-Help{font-size:.9em;margin:0;-webkit-user-select:none;user-select:none}.DocSearch-Title{font-size:1.2em}.DocSearch-Logo a{display:flex}.DocSearch-Logo svg{color:var(--docsearch-logo-color);margin-left:8px}.DocSearch-Hits:last-of-type{margin-bottom:24px}.DocSearch-Hits mark{background:none;color:var(--docsearch-highlight-color)}.DocSearch-HitsFooter{color:var(--docsearch-muted-color);display:flex;font-size:.85em;justify-content:center;margin-bottom:var(--docsearch-spacing);padding:var(--docsearch-spacing)}.DocSearch-HitsFooter a{border-bottom:1px solid;color:inherit}.DocSearch-Hit{border-radius:4px;display:flex;padding-bottom:4px;position:relative}@media screen and (prefers-reduced-motion:reduce){.DocSearch-Hit--deleting{transition:none}}.DocSearch-Hit--deleting{opacity:0;transition:all .25s linear}@media screen and (prefers-reduced-motion:reduce){.DocSearch-Hit--favoriting{transition:none}}.DocSearch-Hit--favoriting{transform:scale(0);transform-origin:top center;transition:all .25s linear;transition-delay:.25s}.DocSearch-Hit a{background:var(--docsearch-hit-background);border-radius:4px;box-shadow:var(--docsearch-hit-shadow);display:block;padding-left:var(--docsearch-spacing);width:100%}.DocSearch-Hit-source{background:var(--docsearch-modal-background);color:var(--docsearch-highlight-color);font-size:.85em;font-weight:600;line-height:32px;margin:0 -4px;padding:8px 4px 0;position:sticky;top:0;z-index:10}.DocSearch-Hit-Tree{color:var(--docsearch-muted-color);height:var(--docsearch-hit-height);opacity:.5;stroke-width:var(--docsearch-icon-stroke-width);width:24px}.DocSearch-Hit[aria-selected=true] a{background-color:var(--docsearch-highlight-color)}.DocSearch-Hit[aria-selected=true] mark{text-decoration:underline}.DocSearch-Hit-Container{align-items:center;color:var(--docsearch-hit-color);display:flex;flex-direction:row;height:var(--docsearch-hit-height);padding:0 var(--docsearch-spacing) 0 0}.DocSearch-Hit-icon{height:20px;width:20px}.DocSearch-Hit-action,.DocSearch-Hit-icon{color:var(--docsearch-muted-color);stroke-width:var(--docsearch-icon-stroke-width)}.DocSearch-Hit-action{align-items:center;display:flex;height:22px;width:22px}.DocSearch-Hit-action svg{display:block;height:18px;width:18px}.DocSearch-Hit-action+.DocSearch-Hit-action{margin-left:6px}.DocSearch-Hit-action-button{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;border-radius:50%;color:inherit;cursor:pointer;padding:2px}svg.DocSearch-Hit-Select-Icon{display:none}.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-Select-Icon{display:block}.DocSearch-Hit-action-button:focus,.DocSearch-Hit-action-button:hover{background:rgba(0,0,0,.2);transition:background-color .1s ease-in}@media screen and (prefers-reduced-motion:reduce){.DocSearch-Hit-action-button:focus,.DocSearch-Hit-action-button:hover{transition:none}}.DocSearch-Hit-action-button:focus path,.DocSearch-Hit-action-button:hover path{fill:#fff}.DocSearch-Hit-content-wrapper{display:flex;flex:1 1 auto;flex-direction:column;font-weight:500;justify-content:center;line-height:1.2em;margin:0 8px;overflow-x:hidden;position:relative;text-overflow:ellipsis;white-space:nowrap;width:80%}.DocSearch-Hit-title{font-size:.9em}.DocSearch-Hit-path{color:var(--docsearch-muted-color);font-size:.75em}.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-action,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-icon,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-path,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-text,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-title,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-Tree,.DocSearch-Hit[aria-selected=true] mark{color:var(--docsearch-hit-active-color)!important}@media screen and (prefers-reduced-motion:reduce){.DocSearch-Hit-action-button:focus,.DocSearch-Hit-action-button:hover{background:rgba(0,0,0,.2);transition:none}}.DocSearch-ErrorScreen,.DocSearch-NoResults,.DocSearch-StartScreen{font-size:.9em;margin:0 auto;padding:36px 0;text-align:center;width:80%}.DocSearch-Screen-Icon{color:var(--docsearch-muted-color);padding-bottom:12px}.DocSearch-NoResults-Prefill-List{display:inline-block;padding-bottom:24px;text-align:left}.DocSearch-NoResults-Prefill-List ul{display:inline-block;padding:8px 0 0}.DocSearch-NoResults-Prefill-List li{list-style-position:inside;list-style-type:"» "}.DocSearch-Prefill{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;border-radius:1em;color:var(--docsearch-highlight-color);cursor:pointer;display:inline-block;font-size:1em;font-weight:700;padding:0}.DocSearch-Prefill:focus,.DocSearch-Prefill:hover{outline:none;text-decoration:underline}.DocSearch-Footer{align-items:center;background:var(--docsearch-footer-background);border-radius:0 0 8px 8px;box-shadow:var(--docsearch-footer-shadow);display:flex;flex-direction:row-reverse;flex-shrink:0;height:var(--docsearch-footer-height);justify-content:space-between;padding:0 var(--docsearch-spacing);position:relative;-webkit-user-select:none;user-select:none;width:100%;z-index:300}.DocSearch-Commands{color:var(--docsearch-muted-color);display:flex;list-style:none;margin:0;padding:0}.DocSearch-Commands li{align-items:center;display:flex}.DocSearch-Commands li:not(:last-of-type){margin-right:.8em}.DocSearch-Commands-Key{align-items:center;background:var(--docsearch-key-gradient);border-radius:2px;box-shadow:var(--docsearch-key-shadow);display:flex;height:18px;justify-content:center;margin-right:.4em;padding:0 0 1px;color:var(--docsearch-muted-color);border:0;width:20px}@media (max-width:768px){:root{--docsearch-spacing:10px;--docsearch-footer-height:40px}.DocSearch-Dropdown{height:100%}.DocSearch-Container{height:100vh;height:-webkit-fill-available;height:calc(var(--docsearch-vh, 1vh)*100);position:absolute}.DocSearch-Footer{border-radius:0;bottom:0;position:absolute}.DocSearch-Hit-content-wrapper{display:flex;position:relative;width:80%}.DocSearch-Modal{border-radius:0;box-shadow:none;height:100vh;height:-webkit-fill-available;height:calc(var(--docsearch-vh, 1vh)*100);margin:0;max-width:100%;width:100%}.DocSearch-Dropdown{max-height:calc(var(--docsearch-vh, 1vh)*100 - var(--docsearch-searchbox-height) - var(--docsearch-spacing) - var(--docsearch-footer-height))}.DocSearch-Cancel{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;color:var(--docsearch-highlight-color);cursor:pointer;display:inline-block;flex:none;font:inherit;font-size:1em;font-weight:500;margin-left:var(--docsearch-spacing);outline:none;overflow:hidden;padding:0;-webkit-user-select:none;user-select:none;white-space:nowrap}.DocSearch-Commands,.DocSearch-Hit-Tree{display:none}}@keyframes fade-in{0%{opacity:0}to{opacity:1}}[class*=DocSearch]{--docsearch-primary-color: var(--vp-c-brand-1);--docsearch-highlight-color: var(--docsearch-primary-color);--docsearch-text-color: var(--vp-c-text-1);--docsearch-muted-color: var(--vp-c-text-2);--docsearch-searchbox-shadow: none;--docsearch-searchbox-background: transparent;--docsearch-searchbox-focus-background: transparent;--docsearch-key-gradient: transparent;--docsearch-key-shadow: none;--docsearch-modal-background: var(--vp-c-bg-soft);--docsearch-footer-background: var(--vp-c-bg)}.dark [class*=DocSearch]{--docsearch-modal-shadow: none;--docsearch-footer-shadow: none;--docsearch-logo-color: var(--vp-c-text-2);--docsearch-hit-background: var(--vp-c-default-soft);--docsearch-hit-color: var(--vp-c-text-2);--docsearch-hit-shadow: none}.DocSearch-Button{display:flex;justify-content:center;align-items:center;margin:0;padding:0;width:48px;height:55px;background:transparent;transition:border-color .25s}.DocSearch-Button:hover{background:transparent}.DocSearch-Button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}.DocSearch-Button:focus:not(:focus-visible){outline:none!important}@media (min-width: 768px){.DocSearch-Button{justify-content:flex-start;border:1px solid transparent;border-radius:8px;padding:0 10px 0 12px;width:100%;height:40px;background-color:var(--vp-c-bg-alt)}.DocSearch-Button:hover{border-color:var(--vp-c-brand-1);background:var(--vp-c-bg-alt)}}.DocSearch-Button .DocSearch-Button-Container{display:flex;align-items:center}.DocSearch-Button .DocSearch-Search-Icon{position:relative;width:16px;height:16px;color:var(--vp-c-text-1);fill:currentColor;transition:color .5s}.DocSearch-Button:hover .DocSearch-Search-Icon{color:var(--vp-c-text-1)}@media (min-width: 768px){.DocSearch-Button .DocSearch-Search-Icon{top:1px;margin-right:8px;width:14px;height:14px;color:var(--vp-c-text-2)}}.DocSearch-Button .DocSearch-Button-Placeholder{display:none;margin-top:2px;padding:0 16px 0 0;font-size:13px;font-weight:500;color:var(--vp-c-text-2);transition:color .5s}.DocSearch-Button:hover .DocSearch-Button-Placeholder{color:var(--vp-c-text-1)}@media (min-width: 768px){.DocSearch-Button .DocSearch-Button-Placeholder{display:inline-block}}.DocSearch-Button .DocSearch-Button-Keys{direction:ltr;display:none;min-width:auto}@media (min-width: 768px){.DocSearch-Button .DocSearch-Button-Keys{display:flex;align-items:center}}.DocSearch-Button .DocSearch-Button-Key{display:block;margin:2px 0 0;border:1px solid var(--vp-c-divider);border-right:none;border-radius:4px 0 0 4px;padding-left:6px;min-width:0;width:auto;height:22px;line-height:22px;font-family:var(--vp-font-family-base);font-size:12px;font-weight:500;transition:color .5s,border-color .5s}.DocSearch-Button .DocSearch-Button-Key+.DocSearch-Button-Key{border-right:1px solid var(--vp-c-divider);border-left:none;border-radius:0 4px 4px 0;padding-left:2px;padding-right:6px}.DocSearch-Button .DocSearch-Button-Key:first-child{font-size:0!important}.DocSearch-Button .DocSearch-Button-Key:first-child:after{content:"Ctrl";font-size:12px;letter-spacing:normal;color:var(--docsearch-muted-color)}.mac .DocSearch-Button .DocSearch-Button-Key:first-child:after{content:"⌘"}.DocSearch-Button .DocSearch-Button-Key:first-child>*{display:none}.VPNavBarSearch{display:flex;align-items:center}@media (min-width: 768px){.VPNavBarSearch{flex-grow:1;padding-left:24px}}@media (min-width: 960px){.VPNavBarSearch{padding-left:32px}}.dark .DocSearch-Footer{border-top:1px solid var(--vp-c-divider)}.DocSearch-Form{border:1px solid var(--vp-c-brand-1);background-color:var(--vp-c-white)}.dark .DocSearch-Form{background-color:var(--vp-c-default-soft)}.DocSearch-Screen-Icon>svg{margin:auto}.VPNavBarSocialLinks[data-v-ef6192dc]{display:none}@media (min-width: 1280px){.VPNavBarSocialLinks[data-v-ef6192dc]{display:flex;align-items:center}}.title[data-v-2973dbb4]{display:flex;align-items:center;border-bottom:1px solid transparent;width:100%;height:var(--vp-nav-height);font-size:16px;font-weight:600;color:var(--vp-c-text-1);transition:opacity .25s}@media (min-width: 960px){.title[data-v-2973dbb4]{flex-shrink:0}.VPNavBarTitle.has-sidebar .title[data-v-2973dbb4]{border-bottom-color:var(--vp-c-divider)}}[data-v-2973dbb4] .logo{margin-right:8px;height:var(--vp-nav-logo-height)}.VPNavBarTranslations[data-v-ff4524ae]{display:none}@media (min-width: 1280px){.VPNavBarTranslations[data-v-ff4524ae]{display:flex;align-items:center}}.title[data-v-ff4524ae]{padding:0 24px 0 12px;line-height:32px;font-size:14px;font-weight:700;color:var(--vp-c-text-1)}.VPNavBar[data-v-f1abbc6e]{position:relative;border-bottom:1px solid transparent;padding:0 8px 0 24px;height:var(--vp-nav-height);pointer-events:none;white-space:nowrap}@media (min-width: 768px){.VPNavBar[data-v-f1abbc6e]{padding:0 32px}}@media (min-width: 960px){.VPNavBar.has-sidebar[data-v-f1abbc6e]{padding:0}.VPNavBar[data-v-f1abbc6e]:not(.has-sidebar):not(.top){border-bottom-color:var(--vp-c-gutter);background-color:var(--vp-nav-bg-color)}}.container[data-v-f1abbc6e]{display:flex;justify-content:space-between;margin:0 auto;max-width:calc(var(--vp-layout-max-width) - 64px);height:var(--vp-nav-height);pointer-events:none}.container>.title[data-v-f1abbc6e],.container>.content[data-v-f1abbc6e]{pointer-events:none}.container[data-v-f1abbc6e] *{pointer-events:auto}@media (min-width: 960px){.VPNavBar.has-sidebar .container[data-v-f1abbc6e]{max-width:100%}}.title[data-v-f1abbc6e]{flex-shrink:0;height:calc(var(--vp-nav-height) - 1px);transition:background-color .5s}@media (min-width: 960px){.VPNavBar.has-sidebar .title[data-v-f1abbc6e]{position:absolute;top:0;left:0;z-index:2;padding:0 32px;width:var(--vp-sidebar-width);height:var(--vp-nav-height);background-color:transparent}}@media (min-width: 1440px){.VPNavBar.has-sidebar .title[data-v-f1abbc6e]{padding-left:max(32px,calc((100% - (var(--vp-layout-max-width) - 64px)) / 2));width:calc((100% - (var(--vp-layout-max-width) - 64px)) / 2 + var(--vp-sidebar-width) - 32px)}}.content[data-v-f1abbc6e]{flex-grow:1}@media (min-width: 960px){.VPNavBar.has-sidebar .content[data-v-f1abbc6e]{position:relative;z-index:1;padding-right:32px;padding-left:var(--vp-sidebar-width)}}@media (min-width: 1440px){.VPNavBar.has-sidebar .content[data-v-f1abbc6e]{padding-right:calc((100vw - var(--vp-layout-max-width)) / 2 + 32px);padding-left:calc((100vw - var(--vp-layout-max-width)) / 2 + var(--vp-sidebar-width))}}.content-body[data-v-f1abbc6e]{display:flex;justify-content:flex-end;align-items:center;height:calc(var(--vp-nav-height) - 1px);transition:background-color .5s}@media (min-width: 960px){.VPNavBar:not(.top) .content-body[data-v-f1abbc6e]{position:relative;background-color:var(--vp-nav-bg-color)}}@media (max-width: 767px){.content-body[data-v-f1abbc6e]{column-gap:.5rem}}.menu+.translations[data-v-f1abbc6e]:before,.menu+.appearance[data-v-f1abbc6e]:before,.menu+.social-links[data-v-f1abbc6e]:before,.translations+.appearance[data-v-f1abbc6e]:before,.appearance+.social-links[data-v-f1abbc6e]:before{margin-right:8px;margin-left:8px;width:1px;height:24px;background-color:var(--vp-c-divider);content:""}.menu+.appearance[data-v-f1abbc6e]:before,.translations+.appearance[data-v-f1abbc6e]:before{margin-right:16px}.appearance+.social-links[data-v-f1abbc6e]:before{margin-left:16px}.social-links[data-v-f1abbc6e]{margin-right:-8px}@media (min-width: 960px){.VPNavBar.has-sidebar .curtain[data-v-f1abbc6e]{position:absolute;right:0;bottom:-31px;width:calc(100% - var(--vp-sidebar-width));height:32px}.VPNavBar.has-sidebar .curtain[data-v-f1abbc6e]:before{display:block;width:100%;height:32px;background:linear-gradient(var(--vp-c-bg),transparent 70%);content:""}}@media (min-width: 1440px){.VPNavBar.has-sidebar .curtain[data-v-f1abbc6e]{width:calc(100% - ((100vw - var(--vp-layout-max-width)) / 2 + var(--vp-sidebar-width)))}}.VPNavScreenAppearance[data-v-0dc5cf49]{display:flex;justify-content:space-between;align-items:center;border-radius:8px;padding:12px 14px 12px 16px;background-color:var(--vp-c-bg-soft)}.text[data-v-0dc5cf49]{line-height:24px;font-size:12px;font-weight:500;color:var(--vp-c-text-2)}.VPNavScreenMenuLink[data-v-fe523e3d]{display:block;border-bottom:1px solid var(--vp-c-divider);padding:12px 0 11px;line-height:24px;font-size:14px;font-weight:500;color:var(--vp-c-text-1);transition:border-color .25s,color .25s}.VPNavScreenMenuLink[data-v-fe523e3d]:hover{color:var(--vp-c-brand-1)}.VPNavScreenMenuGroupLink[data-v-aea78dd1]{display:block;margin-left:12px;line-height:32px;font-size:14px;font-weight:400;color:var(--vp-c-text-1);transition:color .25s}.VPNavScreenMenuGroupLink[data-v-aea78dd1]:hover{color:var(--vp-c-brand-1)}.VPNavScreenMenuGroupSection[data-v-f60dbfa7]{display:block}.title[data-v-f60dbfa7]{line-height:32px;font-size:13px;font-weight:700;color:var(--vp-c-text-2);transition:color .25s}.VPNavScreenMenuGroup[data-v-c2c554ed]{border-bottom:1px solid var(--vp-c-divider);height:48px;overflow:hidden;transition:border-color .5s}.VPNavScreenMenuGroup .items[data-v-c2c554ed]{visibility:hidden}.VPNavScreenMenuGroup.open .items[data-v-c2c554ed]{visibility:visible}.VPNavScreenMenuGroup.open[data-v-c2c554ed]{padding-bottom:10px;height:auto}.VPNavScreenMenuGroup.open .button[data-v-c2c554ed]{padding-bottom:6px;color:var(--vp-c-brand-1)}.VPNavScreenMenuGroup.open .button-icon[data-v-c2c554ed]{transform:rotate(45deg)}.button[data-v-c2c554ed]{display:flex;justify-content:space-between;align-items:center;padding:12px 4px 11px 0;width:100%;line-height:24px;font-size:14px;font-weight:500;color:var(--vp-c-text-1);transition:color .25s}.button[data-v-c2c554ed]:hover{color:var(--vp-c-brand-1)}.button-icon[data-v-c2c554ed]{width:14px;height:14px;fill:var(--vp-c-text-2);transition:fill .5s,transform .25s}.group[data-v-c2c554ed]:first-child{padding-top:0}.group+.group[data-v-c2c554ed],.group+.item[data-v-c2c554ed]{padding-top:4px}.VPNavScreenTranslations[data-v-41505286]{height:24px;overflow:hidden}.VPNavScreenTranslations.open[data-v-41505286]{height:auto}.title[data-v-41505286]{display:flex;align-items:center;font-size:14px;font-weight:500;color:var(--vp-c-text-1)}.icon[data-v-41505286]{width:16px;height:16px;fill:currentColor}.icon.lang[data-v-41505286]{margin-right:8px}.icon.chevron[data-v-41505286]{margin-left:4px}.list[data-v-41505286]{padding:4px 0 0 24px}.link[data-v-41505286]{line-height:32px;font-size:13px;color:var(--vp-c-text-1)}.VPNavScreen[data-v-57cce842]{position:fixed;top:calc(var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + 1px);right:0;bottom:0;left:0;padding:0 32px;width:100%;background-color:var(--vp-nav-screen-bg-color);overflow-y:auto;transition:background-color .5s;pointer-events:auto}.VPNavScreen.fade-enter-active[data-v-57cce842],.VPNavScreen.fade-leave-active[data-v-57cce842]{transition:opacity .25s}.VPNavScreen.fade-enter-active .container[data-v-57cce842],.VPNavScreen.fade-leave-active .container[data-v-57cce842]{transition:transform .25s ease}.VPNavScreen.fade-enter-from[data-v-57cce842],.VPNavScreen.fade-leave-to[data-v-57cce842]{opacity:0}.VPNavScreen.fade-enter-from .container[data-v-57cce842],.VPNavScreen.fade-leave-to .container[data-v-57cce842]{transform:translateY(-8px)}@media (min-width: 768px){.VPNavScreen[data-v-57cce842]{display:none}}.container[data-v-57cce842]{margin:0 auto;padding:24px 0 96px;max-width:288px}.menu+.translations[data-v-57cce842],.menu+.appearance[data-v-57cce842],.translations+.appearance[data-v-57cce842]{margin-top:24px}.menu+.social-links[data-v-57cce842]{margin-top:16px}.appearance+.social-links[data-v-57cce842]{margin-top:16px}.VPNav[data-v-7ad780c2]{position:relative;top:var(--vp-layout-top-height, 0px);left:0;z-index:var(--vp-z-index-nav);width:100%;pointer-events:none;transition:background-color .5s}@media (min-width: 960px){.VPNav[data-v-7ad780c2]{position:fixed}}.VPSidebarItem.level-0[data-v-bd01e0d5]{padding-bottom:24px}.VPSidebarItem.collapsed.level-0[data-v-bd01e0d5]{padding-bottom:10px}.item[data-v-bd01e0d5]{position:relative;display:flex;width:100%}.VPSidebarItem.collapsible>.item[data-v-bd01e0d5]{cursor:pointer}.indicator[data-v-bd01e0d5]{position:absolute;top:6px;bottom:6px;left:-17px;width:2px;border-radius:2px;transition:background-color .25s}.VPSidebarItem.level-2.is-active>.item>.indicator[data-v-bd01e0d5],.VPSidebarItem.level-3.is-active>.item>.indicator[data-v-bd01e0d5],.VPSidebarItem.level-4.is-active>.item>.indicator[data-v-bd01e0d5],.VPSidebarItem.level-5.is-active>.item>.indicator[data-v-bd01e0d5]{background-color:var(--vp-c-brand-1)}.link[data-v-bd01e0d5]{display:flex;align-items:center;flex-grow:1}.text[data-v-bd01e0d5]{flex-grow:1;padding:4px 0;line-height:24px;font-size:14px;transition:color .25s}.VPSidebarItem.level-0 .text[data-v-bd01e0d5]{font-weight:700;color:var(--vp-c-text-1)}.VPSidebarItem.level-1 .text[data-v-bd01e0d5],.VPSidebarItem.level-2 .text[data-v-bd01e0d5],.VPSidebarItem.level-3 .text[data-v-bd01e0d5],.VPSidebarItem.level-4 .text[data-v-bd01e0d5],.VPSidebarItem.level-5 .text[data-v-bd01e0d5]{font-weight:500;color:var(--vp-c-text-2)}.VPSidebarItem.level-0.is-link>.item>.link:hover .text[data-v-bd01e0d5],.VPSidebarItem.level-1.is-link>.item>.link:hover .text[data-v-bd01e0d5],.VPSidebarItem.level-2.is-link>.item>.link:hover .text[data-v-bd01e0d5],.VPSidebarItem.level-3.is-link>.item>.link:hover .text[data-v-bd01e0d5],.VPSidebarItem.level-4.is-link>.item>.link:hover .text[data-v-bd01e0d5],.VPSidebarItem.level-5.is-link>.item>.link:hover .text[data-v-bd01e0d5]{color:var(--vp-c-brand-1)}.VPSidebarItem.level-0.has-active>.item>.text[data-v-bd01e0d5],.VPSidebarItem.level-1.has-active>.item>.text[data-v-bd01e0d5],.VPSidebarItem.level-2.has-active>.item>.text[data-v-bd01e0d5],.VPSidebarItem.level-3.has-active>.item>.text[data-v-bd01e0d5],.VPSidebarItem.level-4.has-active>.item>.text[data-v-bd01e0d5],.VPSidebarItem.level-5.has-active>.item>.text[data-v-bd01e0d5],.VPSidebarItem.level-0.has-active>.item>.link>.text[data-v-bd01e0d5],.VPSidebarItem.level-1.has-active>.item>.link>.text[data-v-bd01e0d5],.VPSidebarItem.level-2.has-active>.item>.link>.text[data-v-bd01e0d5],.VPSidebarItem.level-3.has-active>.item>.link>.text[data-v-bd01e0d5],.VPSidebarItem.level-4.has-active>.item>.link>.text[data-v-bd01e0d5],.VPSidebarItem.level-5.has-active>.item>.link>.text[data-v-bd01e0d5]{color:var(--vp-c-text-1)}.VPSidebarItem.level-0.is-active>.item .link>.text[data-v-bd01e0d5],.VPSidebarItem.level-1.is-active>.item .link>.text[data-v-bd01e0d5],.VPSidebarItem.level-2.is-active>.item .link>.text[data-v-bd01e0d5],.VPSidebarItem.level-3.is-active>.item .link>.text[data-v-bd01e0d5],.VPSidebarItem.level-4.is-active>.item .link>.text[data-v-bd01e0d5],.VPSidebarItem.level-5.is-active>.item .link>.text[data-v-bd01e0d5]{color:var(--vp-c-brand-1)}.caret[data-v-bd01e0d5]{display:flex;justify-content:center;align-items:center;margin-right:-7px;width:32px;height:32px;color:var(--vp-c-text-3);cursor:pointer;transition:color .25s;flex-shrink:0}.item:hover .caret[data-v-bd01e0d5]{color:var(--vp-c-text-2)}.item:hover .caret[data-v-bd01e0d5]:hover{color:var(--vp-c-text-1)}.caret-icon[data-v-bd01e0d5]{width:18px;height:18px;fill:currentColor;transform:rotate(90deg);transition:transform .25s}.VPSidebarItem.collapsed .caret-icon[data-v-bd01e0d5]{transform:rotate(0)}.VPSidebarItem.level-1 .items[data-v-bd01e0d5],.VPSidebarItem.level-2 .items[data-v-bd01e0d5],.VPSidebarItem.level-3 .items[data-v-bd01e0d5],.VPSidebarItem.level-4 .items[data-v-bd01e0d5],.VPSidebarItem.level-5 .items[data-v-bd01e0d5]{border-left:1px solid var(--vp-c-divider);padding-left:16px}.VPSidebarItem.collapsed .items[data-v-bd01e0d5]{display:none}.VPSidebar[data-v-ee2efba5]{position:fixed;top:var(--vp-layout-top-height, 0px);bottom:0;left:0;z-index:var(--vp-z-index-sidebar);padding:32px 32px 96px;width:calc(100vw - 64px);max-width:320px;background-color:var(--vp-sidebar-bg-color);opacity:0;box-shadow:var(--vp-c-shadow-3);overflow-x:hidden;overflow-y:auto;transform:translate(-100%);transition:opacity .5s,transform .25s ease;overscroll-behavior:contain}.VPSidebar.open[data-v-ee2efba5]{opacity:1;visibility:visible;transform:translate(0);transition:opacity .25s,transform .5s cubic-bezier(.19,1,.22,1)}.dark .VPSidebar[data-v-ee2efba5]{box-shadow:var(--vp-shadow-1)}@media (min-width: 960px){.VPSidebar[data-v-ee2efba5]{z-index:1;padding-top:var(--vp-nav-height);padding-bottom:128px;width:var(--vp-sidebar-width);max-width:100%;background-color:var(--vp-sidebar-bg-color);opacity:1;visibility:visible;box-shadow:none;transform:translate(0)}}@media (min-width: 1440px){.VPSidebar[data-v-ee2efba5]{padding-left:max(32px,calc((100% - (var(--vp-layout-max-width) - 64px)) / 2));width:calc((100% - (var(--vp-layout-max-width) - 64px)) / 2 + var(--vp-sidebar-width) - 32px)}}@media (min-width: 960px){.curtain[data-v-ee2efba5]{position:sticky;top:-64px;left:0;z-index:1;margin-top:calc(var(--vp-nav-height) * -1);margin-right:-32px;margin-left:-32px;height:var(--vp-nav-height);background-color:var(--vp-sidebar-bg-color)}}.nav[data-v-ee2efba5]{outline:0}.group+.group[data-v-ee2efba5]{border-top:1px solid var(--vp-c-divider);padding-top:10px}@media (min-width: 960px){.group[data-v-ee2efba5]{padding-top:10px;width:calc(var(--vp-sidebar-width) - 64px)}}.VPSkipLink[data-v-c8291ffa]{top:8px;left:8px;padding:8px 16px;z-index:999;border-radius:8px;font-size:12px;font-weight:700;text-decoration:none;color:var(--vp-c-brand-1);box-shadow:var(--vp-shadow-3);background-color:var(--vp-c-bg)}.VPSkipLink[data-v-c8291ffa]:focus{height:auto;width:auto;clip:auto;clip-path:none}@media (min-width: 1280px){.VPSkipLink[data-v-c8291ffa]{top:14px;left:16px}}.Layout[data-v-9d8abc1e]{display:flex;flex-direction:column;min-height:100vh}.VPHomeSponsors[data-v-843cc1b2]{border-top:1px solid var(--vp-c-gutter);padding:88px 24px 96px;background-color:var(--vp-c-bg)}.container[data-v-843cc1b2]{margin:0 auto;max-width:1152px}.love[data-v-843cc1b2]{margin:0 auto;width:28px;height:28px;color:var(--vp-c-text-3)}.icon[data-v-843cc1b2]{width:28px;height:28px;fill:currentColor}.message[data-v-843cc1b2]{margin:0 auto;padding-top:10px;max-width:320px;text-align:center;line-height:24px;font-size:16px;font-weight:500;color:var(--vp-c-text-2)}.sponsors[data-v-843cc1b2]{padding-top:32px}.action[data-v-843cc1b2]{padding-top:40px;text-align:center}.VPTeamPage[data-v-b1cfd8dc]{padding-bottom:96px}@media (min-width: 768px){.VPTeamPage[data-v-b1cfd8dc]{padding-bottom:128px}}.VPTeamPageSection+.VPTeamPageSection[data-v-b1cfd8dc-s],.VPTeamMembers+.VPTeamPageSection[data-v-b1cfd8dc-s]{margin-top:64px}.VPTeamMembers+.VPTeamMembers[data-v-b1cfd8dc-s]{margin-top:24px}@media (min-width: 768px){.VPTeamPageTitle+.VPTeamPageSection[data-v-b1cfd8dc-s]{margin-top:16px}.VPTeamPageSection+.VPTeamPageSection[data-v-b1cfd8dc-s],.VPTeamMembers+.VPTeamPageSection[data-v-b1cfd8dc-s]{margin-top:96px}}.VPTeamMembers[data-v-b1cfd8dc-s]{padding:0 24px}@media (min-width: 768px){.VPTeamMembers[data-v-b1cfd8dc-s]{padding:0 48px}}@media (min-width: 960px){.VPTeamMembers[data-v-b1cfd8dc-s]{padding:0 64px}}.VPTeamPageTitle[data-v-46c5e327]{padding:48px 32px;text-align:center}@media (min-width: 768px){.VPTeamPageTitle[data-v-46c5e327]{padding:64px 48px 48px}}@media (min-width: 960px){.VPTeamPageTitle[data-v-46c5e327]{padding:80px 64px 48px}}.title[data-v-46c5e327]{letter-spacing:0;line-height:44px;font-size:36px;font-weight:500}@media (min-width: 768px){.title[data-v-46c5e327]{letter-spacing:-.5px;line-height:56px;font-size:48px}}.lead[data-v-46c5e327]{margin:0 auto;max-width:512px;padding-top:12px;line-height:24px;font-size:16px;font-weight:500;color:var(--vp-c-text-2)}@media (min-width: 768px){.lead[data-v-46c5e327]{max-width:592px;letter-spacing:.15px;line-height:28px;font-size:20px}}.VPTeamPageSection[data-v-3bf2e850]{padding:0 32px}@media (min-width: 768px){.VPTeamPageSection[data-v-3bf2e850]{padding:0 48px}}@media (min-width: 960px){.VPTeamPageSection[data-v-3bf2e850]{padding:0 64px}}.title[data-v-3bf2e850]{position:relative;margin:0 auto;max-width:1152px;text-align:center;color:var(--vp-c-text-2)}.title-line[data-v-3bf2e850]{position:absolute;top:16px;left:0;width:100%;height:1px;background-color:var(--vp-c-divider)}.title-text[data-v-3bf2e850]{position:relative;display:inline-block;padding:0 24px;letter-spacing:0;line-height:32px;font-size:20px;font-weight:500;background-color:var(--vp-c-bg)}.lead[data-v-3bf2e850]{margin:0 auto;max-width:480px;padding-top:12px;text-align:center;line-height:24px;font-size:16px;font-weight:500;color:var(--vp-c-text-2)}.members[data-v-3bf2e850]{padding-top:40px}.VPTeamMembersItem[data-v-3a0078bd]{display:flex;flex-direction:column;gap:2px;border-radius:12px;width:100%;height:100%;overflow:hidden}.VPTeamMembersItem.small .profile[data-v-3a0078bd]{padding:32px}.VPTeamMembersItem.small .data[data-v-3a0078bd]{padding-top:20px}.VPTeamMembersItem.small .avatar[data-v-3a0078bd]{width:64px;height:64px}.VPTeamMembersItem.small .name[data-v-3a0078bd]{line-height:24px;font-size:16px}.VPTeamMembersItem.small .affiliation[data-v-3a0078bd]{padding-top:4px;line-height:20px;font-size:14px}.VPTeamMembersItem.small .desc[data-v-3a0078bd]{padding-top:12px;line-height:20px;font-size:14px}.VPTeamMembersItem.small .links[data-v-3a0078bd]{margin:0 -16px -20px;padding:10px 0 0}.VPTeamMembersItem.medium .profile[data-v-3a0078bd]{padding:48px 32px}.VPTeamMembersItem.medium .data[data-v-3a0078bd]{padding-top:24px;text-align:center}.VPTeamMembersItem.medium .avatar[data-v-3a0078bd]{width:96px;height:96px}.VPTeamMembersItem.medium .name[data-v-3a0078bd]{letter-spacing:.15px;line-height:28px;font-size:20px}.VPTeamMembersItem.medium .affiliation[data-v-3a0078bd]{padding-top:4px;font-size:16px}.VPTeamMembersItem.medium .desc[data-v-3a0078bd]{padding-top:16px;max-width:288px;font-size:16px}.VPTeamMembersItem.medium .links[data-v-3a0078bd]{margin:0 -16px -12px;padding:16px 12px 0}.profile[data-v-3a0078bd]{flex-grow:1;background-color:var(--vp-c-bg-soft)}.data[data-v-3a0078bd]{text-align:center}.avatar[data-v-3a0078bd]{position:relative;flex-shrink:0;margin:0 auto;border-radius:50%;box-shadow:var(--vp-shadow-3)}.avatar-img[data-v-3a0078bd]{position:absolute;top:0;right:0;bottom:0;left:0;border-radius:50%;object-fit:cover}.name[data-v-3a0078bd]{margin:0;font-weight:600}.affiliation[data-v-3a0078bd]{margin:0;font-weight:500;color:var(--vp-c-text-2)}.org.link[data-v-3a0078bd]{color:var(--vp-c-text-2);transition:color .25s}.org.link[data-v-3a0078bd]:hover{color:var(--vp-c-brand-1)}.desc[data-v-3a0078bd]{margin:0 auto}.desc[data-v-3a0078bd] a{font-weight:500;color:var(--vp-c-brand-1);text-decoration-style:dotted;transition:color .25s}.links[data-v-3a0078bd]{display:flex;justify-content:center;height:56px}.sp-link[data-v-3a0078bd]{display:flex;justify-content:center;align-items:center;text-align:center;padding:16px;font-size:14px;font-weight:500;color:var(--vp-c-sponsor);background-color:var(--vp-c-bg-soft);transition:color .25s,background-color .25s}.sp .sp-link.link[data-v-3a0078bd]:hover,.sp .sp-link.link[data-v-3a0078bd]:focus{outline:none;color:var(--vp-c-white);background-color:var(--vp-c-sponsor)}.sp-icon[data-v-3a0078bd]{margin-right:8px;width:16px;height:16px;fill:currentColor}.VPTeamMembers.small .container[data-v-bf782009]{grid-template-columns:repeat(auto-fit,minmax(224px,1fr))}.VPTeamMembers.small.count-1 .container[data-v-bf782009]{max-width:276px}.VPTeamMembers.small.count-2 .container[data-v-bf782009]{max-width:576px}.VPTeamMembers.small.count-3 .container[data-v-bf782009]{max-width:876px}.VPTeamMembers.medium .container[data-v-bf782009]{grid-template-columns:repeat(auto-fit,minmax(256px,1fr))}@media (min-width: 375px){.VPTeamMembers.medium .container[data-v-bf782009]{grid-template-columns:repeat(auto-fit,minmax(288px,1fr))}}.VPTeamMembers.medium.count-1 .container[data-v-bf782009]{max-width:368px}.VPTeamMembers.medium.count-2 .container[data-v-bf782009]{max-width:760px}.container[data-v-bf782009]{display:grid;gap:24px;margin:0 auto;max-width:1152px}.title-footer{text-align:center;font-size:20px;font-weight:700}.logo-footer{margin-left:auto;margin-right:auto}:root{--vp-c-brand-1: #bb2158;--vp-c-brand-2: rgb(187, 33, 88, .75);--vp-c-brand-3: #bb2158} diff --git a/assets/weacast-installation.3782c318.png b/assets/weacast-installation.eFFnGIQX.png similarity index 100% rename from assets/weacast-installation.3782c318.png rename to assets/weacast-installation.eFFnGIQX.png diff --git a/guides/advanced-usage.html b/guides/advanced-usage.html index 946a7e3a..1986c123 100644 --- a/guides/advanced-usage.html +++ b/guides/advanced-usage.html @@ -5,227 +5,125 @@ Advanced usage | Kano - + + - - - - - + + + + + -
Skip to content

Advanced usage

Integrating Kano

To avoid the burden of developing a completely new application for every mapping needs you might have, Kano provides you with the capabilities to be integrated in your web application as an <iframe/> like this:

This iframe offers an API so that you can dynamically control the behaviour and the content of Kano, as well as how the embedding application reacts in real-time to changes in Kano, a.k.a micro frontend. You can read more about the underlying concepts in this article.

The API is a subset of the internal Kano components and uses post-robot to

  1. select which is the target component
    • event name = map for 2D map and globe for 3D globe
  2. transform external method calls to internal calls using the following event payload
    • the command property is the mixin method name (e.g. isLayerVisible)
    • the args property is the expected method arguments (e.g. a string, an object or an array when multiple arguments are required)
  3. retrieve internal method call result externally
    • event response data is the method result object
  4. retrieve internal property externally
    • event response data is the returned property value

TIP

Event messaging using post-robot is always async because it relies on the postMessage API under-the-hood.

WARNING

In-memory data exchange is Json and more specifically GeoJson for map features. Do not try to inject functions or "complex" objects (e.g. class instances) in event payloads.

WARNING

You must use the same version of the post-robot library as the one used by Kano. For now, Kano relies on the 10.0.42 version of post-robot.

In addition to the events used to access mixin methods there are a couple of dedicated events:

  • kano-ready: to be listened by integrating application to know when the Kano application has been initialized in the iframe so that you can safely use the iframe API
  • api-ready: to be listened by integrating application to know when the Kano backend connection has been initialized in the iframe so that you can safely call the backend API
  • setLocalStorage: listened by Kano to set key/value pairs (provided as event data payload) in its local storage, typically useful to inject access tokens
  • setConfiguration: listened by Kano to set key/value pairs to override its configuration, typically useful to configure available components or actions
  • kano-login: to be listened by integrating application to know when the user has been authenticated in the Kano application
  • kano-logout: to be listened by integrating application to know when the user has been unauthenticated in the Kano application
  • map-ready: to be listened by integrating application to know when the 2D map component has been initialized in the Kano application so that you can safely use the underlying API
  • map-destroyed: to be listened by integrating application to know when the 2D map component has been destroyed in the Kano application before switching to another route
  • globe-ready: to be listened by integrating application to know when the 3D globe component has been initialized in the Kano application so that you can safely use the underlying API
  • globe-destroyed: to be listened by integrating application to know when the 3D globe component has been destroyed in the Kano application before switching to another route
  • layer-added: to be listened by integrating application to know whenever a new layer has been added to the 2D/3D map (from the internal catalog or externally)
  • layer-removed: to be listened by integrating application to know whenever a layer has been removed from the 2D/3D map
  • layer-shown: to be listened by integrating application to know whenever a layer has been shown in the 2D/3D map
  • layer-hidden: to be listened by integrating application to know whenever a new layer has been hidden in the 2D/3D map
  • click: to be listened by integrating application to know whenever a feature has been clicked on a layer in the 2D/3D map, will provide the feature and layer (descriptor) as data payload properties

WARNING

You should add a listener for each of the above events in your application, even if you don't need to do any processing, otherwise the post-robot library will raise a warning.

Here is a simple code sample:

html
  <script src="https://cdn.jsdelivr.net/npm/post-robot@10.0.10/dist/post-robot.min.js"></script>
-  <iframe id="kano" title="Kano" allow="geolocation *" style="width: 1024px; height: 768px;" src="kano.kalisio.com">
-	<script>
-	  var kano = document.getElementById('kano').contentWindow
-	  // Wait for Kano to be initialized
-	  postRobot.on('kano-ready', function() {
-	  	// Optionnaly overrides default setup of Kano
-	  	postRobot.send(kano, 'setConfiguration', { 'appName': 'xxx' })
-	  	.then(function() {
-		  // Optionnaly set a valid token to avoid authentication
-		  return postRobot.send(kano, 'setLocalStorage', { 'kano-jwt': 'xxx' })
-		})
-	  	.then(function() {
-		  // Show and zoom to a layer
-		  return postRobot.send(kano, 'map', { command: 'showLayer', args: 'Layer name' })
-		})
-		.then(function() {
-	      return postRobot.send(kano, 'map', { command: 'zoomToLayer', args: 'Layer name' })
-	    })
-		.then(function() {
-	      return postRobot.send(kano, 'map', { property: 'layers' })
-	    })
-		.then(function(result) {
-	      console.log('Layer list', result.data)
-	    })
-	  })
-	</script>
  <script src="https://cdn.jsdelivr.net/npm/post-robot@10.0.10/dist/post-robot.min.js"></script>
-  <iframe id="kano" title="Kano" allow="geolocation *" style="width: 1024px; height: 768px;" src="kano.kalisio.com">
-	<script>
-	  var kano = document.getElementById('kano').contentWindow
-	  // Wait for Kano to be initialized
-	  postRobot.on('kano-ready', function() {
-	  	// Optionnaly overrides default setup of Kano
-	  	postRobot.send(kano, 'setConfiguration', { 'appName': 'xxx' })
-	  	.then(function() {
-		  // Optionnaly set a valid token to avoid authentication
-		  return postRobot.send(kano, 'setLocalStorage', { 'kano-jwt': 'xxx' })
-		})
-	  	.then(function() {
-		  // Show and zoom to a layer
-		  return postRobot.send(kano, 'map', { command: 'showLayer', args: 'Layer name' })
-		})
-		.then(function() {
-	      return postRobot.send(kano, 'map', { command: 'zoomToLayer', args: 'Layer name' })
-	    })
-		.then(function() {
-	      return postRobot.send(kano, 'map', { property: 'layers' })
-	    })
-		.then(function(result) {
-	      console.log('Layer list', result.data)
-	    })
-	  })
-	</script>

A full sample exploring the different ways to interact with the API is provided here. When running the demo you can dynamically call API methods when toggling the different buttons on the left.

WARNING

Depending on the configuration of your Kano instance some features might not work as expected in the sample as it relies on some specific layers to exist.

Accessing the underlying API

You can access the backend API using either the Feathers client or raw HTTP REST requests. However, in order to ease integration you can also access the backend API through the iframe API. For this simply target the api component using post-robot, which transform external method calls to internal calls using the following event payload:

  • the service property is the target service name (e.g. catalog)
  • the operation property is the target service operation name (among get, find, update, patch, remove)
  • the args property is the expected service operation arguments

Event response data is the method result object. In addition to the event used to access service operations the api-ready event is to be listened by integrating application to know when the Kano backend API has been initialized in the iframe so that you can safely use it.

Here is a simple code sample:

html
  <script src="https://cdn.jsdelivr.net/npm/post-robot@10.0.10/dist/post-robot.min.js"></script>
-  <iframe id="kano" title="Kano" allow="geolocation *" style="width: 1024px; height: 768px;" src="kano.kalisio.com">
-  <script>
-    var kano = document.getElementById('kano').contentWindow
-    // Wait for map to be initialized
-    postRobot.on('map-ready', () => {
-      // Request saved user contexts and activate the first one if any
-      postRobot.send(kano, 'api', { service: 'catalog', operation: 'find', args: [{ query: { type: 'Context' } }] })
-      .then((result) => {
-        const response = result.data
-        if (response.total > 0) postRobot.send(kano, 'map', { command: 'loadContext', args: response.data[0] })
-      })
-    })
-  </script>
  <script src="https://cdn.jsdelivr.net/npm/post-robot@10.0.10/dist/post-robot.min.js"></script>
-  <iframe id="kano" title="Kano" allow="geolocation *" style="width: 1024px; height: 768px;" src="kano.kalisio.com">
-  <script>
-    var kano = document.getElementById('kano').contentWindow
-    // Wait for map to be initialized
-    postRobot.on('map-ready', () => {
-      // Request saved user contexts and activate the first one if any
-      postRobot.send(kano, 'api', { service: 'catalog', operation: 'find', args: [{ query: { type: 'Context' } }] })
-      .then((result) => {
-        const response = result.data
-        if (response.total > 0) postRobot.send(kano, 'map', { command: 'loadContext', args: response.data[0] })
-      })
-    })
-  </script>

Developing in Kano

Kano is powered by the KDK and rely on its main abstractions. If you'd like to develop an application based on Kano or extend Kano we assume you are familiar with this technology. Indeed, Kano is based on the KDK and makes the best use of all the features offered by the provided cartographic components and services.

Add components

The most simple way to develop in Kano is to design and integrate your own components in the 2D or 3D activity. For this you simply have to

  1. Put you single-file component(s) in the src/components folder (e.g. MyComponent.vue)
  2. Update the configuration to declare your component(s) in the 2D/3D activity by adding a local.js in the config folder like this:
js
module.exports = {
-  mapActivity: { // Can also be globeActivity
-    page: {
-      content: [{
-        id: 'my-component',
-        component: 'layout/KPageSticky', position: 'left', offset: [18, 0], content: [{ component: 'MyComponent' }]
-      }]
-    }
-  }
-}
module.exports = {
-  mapActivity: { // Can also be globeActivity
-    page: {
-      content: [{
-        id: 'my-component',
-        component: 'layout/KPageSticky', position: 'left', offset: [18, 0], content: [{ component: 'MyComponent' }]
-      }]
-    }
-  }
-}

Then build/run the application as usual.

The component file should look e.g. like this:

html
<template>
-  <div>
-    <q-dialog ref="myDialog">
-    </q-dialog>
-    <q-btn round color="primary" icon="edit_location" @click="showDialog">
-    </q-btn>
-  </div>
-</template>
+    
Skip to content

Advanced usage

Integrating Kano

To avoid the burden of developing a completely new application for every mapping needs you might have, Kano provides you with the capabilities to be integrated in your web application as an <iframe/> like this:

This iframe offers an API so that you can dynamically control the behaviour and the content of Kano, as well as how the embedding application reacts in real-time to changes in Kano, a.k.a micro frontend. You can read more about the underlying concepts in this article.

The API is a subset of the internal Kano components and uses post-robot to

  1. select which is the target component
    • event name = map for 2D map and globe for 3D globe
  2. transform external method calls to internal calls using the following event payload
    • the command property is the mixin method name (e.g. isLayerVisible)
    • the args property is the expected method arguments (e.g. a string, an object or an array when multiple arguments are required)
  3. retrieve internal method call result externally
    • event response data is the method result object
  4. retrieve internal property externally
    • event response data is the returned property value

TIP

Event messaging using post-robot is always async because it relies on the postMessage API under-the-hood.

WARNING

In-memory data exchange is Json and more specifically GeoJson for map features. Do not try to inject functions or "complex" objects (e.g. class instances) in event payloads.

WARNING

You must use the same version of the post-robot library as the one used by Kano. For now, Kano relies on the 10.0.42 version of post-robot.

In addition to the events used to access mixin methods there are a couple of dedicated events:

  • kano-ready: to be listened by integrating application to know when the Kano application has been initialized in the iframe so that you can safely use the iframe API
  • api-ready: to be listened by integrating application to know when the Kano backend connection has been initialized in the iframe so that you can safely call the backend API
  • setLocalStorage: listened by Kano to set key/value pairs (provided as event data payload) in its local storage, typically useful to inject access tokens
  • setConfiguration: listened by Kano to set key/value pairs to override its configuration, typically useful to configure available components or actions
  • kano-login: to be listened by integrating application to know when the user has been authenticated in the Kano application
  • kano-logout: to be listened by integrating application to know when the user has been unauthenticated in the Kano application
  • map-ready: to be listened by integrating application to know when the 2D map component has been initialized in the Kano application so that you can safely use the underlying API
  • map-destroyed: to be listened by integrating application to know when the 2D map component has been destroyed in the Kano application before switching to another route
  • globe-ready: to be listened by integrating application to know when the 3D globe component has been initialized in the Kano application so that you can safely use the underlying API
  • globe-destroyed: to be listened by integrating application to know when the 3D globe component has been destroyed in the Kano application before switching to another route
  • layer-added: to be listened by integrating application to know whenever a new layer has been added to the 2D/3D map (from the internal catalog or externally)
  • layer-removed: to be listened by integrating application to know whenever a layer has been removed from the 2D/3D map
  • layer-shown: to be listened by integrating application to know whenever a layer has been shown in the 2D/3D map
  • layer-hidden: to be listened by integrating application to know whenever a new layer has been hidden in the 2D/3D map
  • click: to be listened by integrating application to know whenever a feature has been clicked on a layer in the 2D/3D map, will provide the feature and layer (descriptor) as data payload properties

WARNING

You should add a listener for each of the above events in your application, even if you don't need to do any processing, otherwise the post-robot library will raise a warning.

Here is a simple code sample:

html
  <script src="https://cdn.jsdelivr.net/npm/post-robot@10.0.10/dist/post-robot.min.js"></script>
+  <iframe id="kano" title="Kano" allow="geolocation *" style="width: 1024px; height: 768px;" src="kano.kalisio.com">
+	<script>
+	  var kano = document.getElementById('kano').contentWindow
+	  // Wait for Kano to be initialized
+	  postRobot.on('kano-ready', function() {
+	  	// Optionnaly overrides default setup of Kano
+	  	postRobot.send(kano, 'setConfiguration', { 'appName': 'xxx' })
+	  	.then(function() {
+		  // Optionnaly set a valid token to avoid authentication
+		  return postRobot.send(kano, 'setLocalStorage', { 'kano-jwt': 'xxx' })
+		})
+	  	.then(function() {
+		  // Show and zoom to a layer
+		  return postRobot.send(kano, 'map', { command: 'showLayer', args: 'Layer name' })
+		})
+		.then(function() {
+	      return postRobot.send(kano, 'map', { command: 'zoomToLayer', args: 'Layer name' })
+	    })
+		.then(function() {
+	      return postRobot.send(kano, 'map', { property: 'layers' })
+	    })
+		.then(function(result) {
+	      console.log('Layer list', result.data)
+	    })
+	  })
+	</script>

A full sample exploring the different ways to interact with the API is provided here. When running the demo you can dynamically call API methods when toggling the different buttons on the left.

WARNING

Depending on the configuration of your Kano instance some features might not work as expected in the sample as it relies on some specific layers to exist.

Accessing the underlying API

You can access the backend API using either the Feathers client or raw HTTP REST requests. However, in order to ease integration you can also access the backend API through the iframe API. For this simply target the api component using post-robot, which transform external method calls to internal calls using the following event payload:

  • the service property is the target service name (e.g. catalog)
  • the operation property is the target service operation name (among get, find, update, patch, remove)
  • the args property is the expected service operation arguments

Event response data is the method result object. In addition to the event used to access service operations the api-ready event is to be listened by integrating application to know when the Kano backend API has been initialized in the iframe so that you can safely use it.

Here is a simple code sample:

html
  <script src="https://cdn.jsdelivr.net/npm/post-robot@10.0.10/dist/post-robot.min.js"></script>
+  <iframe id="kano" title="Kano" allow="geolocation *" style="width: 1024px; height: 768px;" src="kano.kalisio.com">
+  <script>
+    var kano = document.getElementById('kano').contentWindow
+    // Wait for map to be initialized
+    postRobot.on('map-ready', () => {
+      // Request saved user contexts and activate the first one if any
+      postRobot.send(kano, 'api', { service: 'catalog', operation: 'find', args: [{ query: { type: 'Context' } }] })
+      .then((result) => {
+        const response = result.data
+        if (response.total > 0) postRobot.send(kano, 'map', { command: 'loadContext', args: response.data[0] })
+      })
+    })
+  </script>

Developing in Kano

Kano is powered by the KDK and rely on its main abstractions. If you'd like to develop an application based on Kano or extend Kano we assume you are familiar with this technology. Indeed, Kano is based on the KDK and makes the best use of all the features offered by the provided cartographic components and services.

Add components

The most simple way to develop in Kano is to design and integrate your own components in the 2D or 3D activity. For this you simply have to

  1. Put you single-file component(s) in the src/components folder (e.g. MyComponent.vue)
  2. Update the configuration to declare your component(s) in the 2D/3D activity by adding a local.js in the config folder like this:
js
module.exports = {
+  mapActivity: { // Can also be globeActivity
+    page: {
+      content: [{
+        id: 'my-component',
+        component: 'layout/KPageSticky', position: 'left', offset: [18, 0], content: [{ component: 'MyComponent' }]
+      }]
+    }
+  }
+}

Then build/run the application as usual.

The component file should look e.g. like this:

html
<template>
+  <div>
+    <q-dialog ref="myDialog">
+    </q-dialog>
+    <q-btn round color="primary" icon="edit_location" @click="showDialog">
+    </q-btn>
+  </div>
+</template>
 
-<script>
-export default {
-  name: 'my-component',
-  inject: ['kMap'],
-  data () {
-    return {
-      ...
-  },
-  methods: {
-    async showDialog () {
-      this.$refs.myDialog.show()
-    },
-    onTimeChanged () {
-      ...
-    }
-  },
-  async mounted () {
-    // To be aware of time change
-    this.kMap.$on('current-time-changed', this.onTimeChanged)
-    ...
-  },
-  beforeUnmount () {
-    this.kMap.$off('current-time-changed', this.onTimeChanged)
-  }
-}
-</script>
-// Required translations in JSON format
-<i18n>
-{ 
-  "fr": {
-      ...
-    }
-  },
-  "en": {
-      ...
-    }
-  }
-}
-</i18n>
<template>
-  <div>
-    <q-dialog ref="myDialog">
-    </q-dialog>
-    <q-btn round color="primary" icon="edit_location" @click="showDialog">
-    </q-btn>
-  </div>
-</template>
-
-<script>
-export default {
-  name: 'my-component',
-  inject: ['kMap'],
-  data () {
-    return {
-      ...
-  },
-  methods: {
-    async showDialog () {
-      this.$refs.myDialog.show()
-    },
-    onTimeChanged () {
-      ...
-    }
-  },
-  async mounted () {
-    // To be aware of time change
-    this.kMap.$on('current-time-changed', this.onTimeChanged)
-    ...
-  },
-  beforeUnmount () {
-    this.kMap.$off('current-time-changed', this.onTimeChanged)
-  }
-}
-</script>
-// Required translations in JSON format
-<i18n>
-{ 
-  "fr": {
-      ...
-    }
-  },
-  "en": {
-      ...
-    }
-  }
-}
-</i18n>

It's also possible to create separated i18n files if you'd like, simply put your plugin_en.json, plugin_fr.json, etc. files in the src/i18n folder before building the app.

Add custom code

You can update the plugin.js entry point in the boot folder in order to insert your own features (functions, mixins, etc.). If you'd like to enhance the default activities provided by kano you can register your own mixins in this file by using the mixin store:

import { MixinStore } from '../mixin-store'
-import myMixin from '../my-mixin.js'
-
-MixinStore.set('my-mixin', myMixin)
import { MixinStore } from '../mixin-store'
-import myMixin from '../my-mixin.js'
-
-MixinStore.set('my-mixin', myMixin)

Then add it to the configuration of the target activity in order to make Kano apply it automatically:

js
module.exports = {
-  mapActivity: { // Can also be globeActivity
-    additionalMixins: [ 'my-mixin' ],
-    ...
-  }
-}
module.exports = {
-  mapActivity: { // Can also be globeActivity
-    additionalMixins: [ 'my-mixin' ],
-    ...
-  }
-}
- +<script> +export default { + name: 'my-component', + inject: ['kMap'], + data () { + return { + ... + }, + methods: { + async showDialog () { + this.$refs.myDialog.show() + }, + onTimeChanged () { + ... + } + }, + async mounted () { + // To be aware of time change + this.kMap.$on('current-time-changed', this.onTimeChanged) + ... + }, + beforeUnmount () { + this.kMap.$off('current-time-changed', this.onTimeChanged) + } +} +</script> +// Required translations in JSON format +<i18n> +{ + "fr": { + ... + } + }, + "en": { + ... + } + } +} +</i18n>

It's also possible to create separated i18n files if you'd like, simply put your plugin_en.json, plugin_fr.json, etc. files in the src/i18n folder before building the app.

Add custom code

You can update the plugin.js entry point in the boot folder in order to insert your own features (functions, mixins, etc.). If you'd like to enhance the default activities provided by kano you can register your own mixins in this file by using the mixin store:

import { MixinStore } from '../mixin-store'
+import myMixin from '../my-mixin.js'
+
+MixinStore.set('my-mixin', myMixin)

Then add it to the configuration of the target activity in order to make Kano apply it automatically:

js
module.exports = {
+  mapActivity: { // Can also be globeActivity
+    additionalMixins: [ 'my-mixin' ],
+    ...
+  }
+}
+ \ No newline at end of file diff --git a/guides/customizing-kano.html b/guides/customizing-kano.html index 06f1aadf..289bb5b4 100644 --- a/guides/customizing-kano.html +++ b/guides/customizing-kano.html @@ -5,1011 +5,517 @@ Customizing Kano | Kano - + + - - - - - + + + + + -
Skip to content

Customizing Kano

This section details different approaches to integrate your own data to your Kano instance. Although you can directly use the Kano UI to add your own data layers this section provide details to do this by configuration or programmatically. When added through the UI, the different layers will be visible in the My data tab of the catalog panel, while the default built-in layers will appear in the Catalog tab of the catalog panel. You can also manage the categories (i.e. catalog sections) hosting the layers from the UI or the configuration.

Although names and descriptions can be hard-coded in the target user language, Kano supports internationalization through a nested structure organized by locale like this:

js
{
-	name: 'Categories.POPULATION_LAYERS',
-  i18n: {
-    fr: { Categories: { POPULATION_LAYERS: 'Population' } },
-    en: { Categories: { POPULATION_LAYERS: 'Population' } },
-    ...
-  }
-}
{
-	name: 'Categories.POPULATION_LAYERS',
-  i18n: {
-    fr: { Categories: { POPULATION_LAYERS: 'Population' } },
-    en: { Categories: { POPULATION_LAYERS: 'Population' } },
-    ...
-  }
-}

Note that the name property is used a unique identifier for categories and layers

Customizing the catalog

You can add your own categories in the catalog by defining it in additional files to be put in the kano/api/config/categories directory. Kano will glob all files within this directory and add categories accordingly, only matching by name those in the CATEGORIES_FILTER (comma-separated list of category names) environment variable, if any. Categories are simple objects with a name, a description and an icon from a standard icon set among Material Icons, Font Awesome, or Line Awesome.

my-categories.cjs - Used to define additional categories.
cjs
module.exports = [{
-  name: 'Categories.OSM_LAYERS',
-  i18n: {
-    fr: {
-      Categories: {
-        OSM_LAYERS: 'OpenStreetMap'
-      }
-    },
-    en: {
-      Categories: {
-        OSM_LAYERS: 'OpenStreetMap'
-      }
-    }
-  },
-  icon: 'las la-map',
-  options: { exclusive: true, filter: { type: 'BaseLayer', tags: { $in: ['osm'] } } }
-}, {
-  name: 'Categories.POPULATION_LAYERS',
-  i18n: {
-    fr: {
-      Categories: {
-        POPULATION_LAYERS: 'Population'
-      }
-    },
-    en: {
-      Categories: {
-        POPULATION_LAYERS: 'Population'
-      }
-    }
-  },
-  icon: 'las la-users',
-  options: { exclusive: false, filter: { type: 'OverlayLayer', tags: { $in: ['population'] } } }
-}]
module.exports = [{
-  name: 'Categories.OSM_LAYERS',
-  i18n: {
-    fr: {
-      Categories: {
-        OSM_LAYERS: 'OpenStreetMap'
-      }
-    },
-    en: {
-      Categories: {
-        OSM_LAYERS: 'OpenStreetMap'
-      }
-    }
-  },
-  icon: 'las la-map',
-  options: { exclusive: true, filter: { type: 'BaseLayer', tags: { $in: ['osm'] } } }
-}, {
-  name: 'Categories.POPULATION_LAYERS',
-  i18n: {
-    fr: {
-      Categories: {
-        POPULATION_LAYERS: 'Population'
-      }
-    },
-    en: {
-      Categories: {
-        POPULATION_LAYERS: 'Population'
-      }
-    }
-  },
-  icon: 'las la-users',
-  options: { exclusive: false, filter: { type: 'OverlayLayer', tags: { $in: ['population'] } } }
-}]

Layers that will be added in a given category depends on the filter property content, which defines a sift filter applied to the layers list. Although any filter can be used, a tags property containing an array of relevent tags is often used by convention.

Customizing the catalog data

You can add your own layers in the catalog by defining it in additional files to be put in the kano/api/config/layers directory. Kano will glob all files within this directory and add layers accordingly, only matching by name those in the LAYERS_FILTER (comma-separated list of layer names) environment variable by default (set it to * to remove filtering). Layers are simple objects with a name, a description, a type, an attribution, and additional configuration options related to the underlying mapping engine: Leaflet for 2D rendering and Cesium for 3D rendering. More details about these options can be found in the documentation of the KDK powering Kano.

Please refer to the built-in kano/api/config/layers directory for various examples of what is possible to do with Kano.

We will start with a really simple example by adding two different map backgrounds based on OpenStreetMap data to your Kano instance. First ensure you copied the categories and layers files in their respective directories in kano/api/config. Then, set CATEGORIES_FILTER="OSM_LAYERS POPULATION_LAYERS" and LAYERS_FILTER="OSM OSM_CYCLE" in your environment. Last, launch Kano to make the layers appear in your custom catalog.

osm-layers.cjs - Used to define base layers with OpenStreetMap data.
cjs
module.exports = [{
-  name: 'Layers.OSM',
-  description: 'Layers.OSM_DESCRIPTION',
-  i18n: {
-    fr: {
-      Layers: {
-        OSM: 'OpenStreeMap',
-        OSM_DESCRIPTION: 'Données OpenStreetMap'
-      }
-    },
-    en: {
-      Layers: {
-        OSM: 'OpenStreeMap',
-        OSM_DESCRIPTION: 'OpenStreeMap data'
-      }
-    }
-  },
-  tags: ['osm'],
-  attribution: 'OpenStreetMap © <a href="http://openstreetmap.org">OpenStreetMap</a> contributors',
-  type: 'BaseLayer',
-  leaflet: {
-    type: 'tileLayer',
-    isVisible: true,
-    source: 'http://{s}.tile.osm.org/{z}/{x}/{y}.png',
-    maxZoom: 21,
-    maxNativeZoom: 18
-  },
-  cesium: {
-    type: 'OpenStreetMap',
-    isVisible: true,
-    url: `http://a.tile.osm.org`
-  }
-}, {
-  name: 'Layers.OSM_CYCLE',
-  description: 'Layers.OSM_CYCLE_DESCRIPTION',
-  i18n: {
-    fr: {
-      Layers: {
-        OSM_CYCLE: 'OpenCycleMap',
-        OSM_CYCLE_DESCRIPTION: 'Données OpenCycleMap'
-      }
-    },
-    en: {
-      Layers: {
-        OSM_CYCLE: 'OpenCycleMap',
-        OSM_CYCLE_DESCRIPTION: 'OpenCycleMap data'
-      }
-    }
-  },
-  attribution: 'OpenStreetMap © <a href="https://www.opencyclemap.org/">OpenCycleMap</a> contributors',
-  type: 'BaseLayer',
-  tags: ['osm'],
-  leaflet: {
-    type: 'tileLayer',
-    isVisible: false,
-    source: 'http://{s}.tile.thunderforest.com/cycle/{z}/{x}/{y}.png',
-    maxZoom: 21,
-    maxNativeZoom: 18
-  },
-  cesium: {
-    type: 'OpenStreetMap',
-    url: `http://a.tile.thunderforest.com/cycle`,
-    isVisible: false
-  }
-}]
module.exports = [{
-  name: 'Layers.OSM',
-  description: 'Layers.OSM_DESCRIPTION',
-  i18n: {
-    fr: {
-      Layers: {
-        OSM: 'OpenStreeMap',
-        OSM_DESCRIPTION: 'Données OpenStreetMap'
-      }
-    },
-    en: {
-      Layers: {
-        OSM: 'OpenStreeMap',
-        OSM_DESCRIPTION: 'OpenStreeMap data'
-      }
-    }
-  },
-  tags: ['osm'],
-  attribution: 'OpenStreetMap © <a href="http://openstreetmap.org">OpenStreetMap</a> contributors',
-  type: 'BaseLayer',
-  leaflet: {
-    type: 'tileLayer',
-    isVisible: true,
-    source: 'http://{s}.tile.osm.org/{z}/{x}/{y}.png',
-    maxZoom: 21,
-    maxNativeZoom: 18
-  },
-  cesium: {
-    type: 'OpenStreetMap',
-    isVisible: true,
-    url: `http://a.tile.osm.org`
-  }
-}, {
-  name: 'Layers.OSM_CYCLE',
-  description: 'Layers.OSM_CYCLE_DESCRIPTION',
-  i18n: {
-    fr: {
-      Layers: {
-        OSM_CYCLE: 'OpenCycleMap',
-        OSM_CYCLE_DESCRIPTION: 'Données OpenCycleMap'
-      }
-    },
-    en: {
-      Layers: {
-        OSM_CYCLE: 'OpenCycleMap',
-        OSM_CYCLE_DESCRIPTION: 'OpenCycleMap data'
-      }
-    }
-  },
-  attribution: 'OpenStreetMap © <a href="https://www.opencyclemap.org/">OpenCycleMap</a> contributors',
-  type: 'BaseLayer',
-  tags: ['osm'],
-  leaflet: {
-    type: 'tileLayer',
-    isVisible: false,
-    source: 'http://{s}.tile.thunderforest.com/cycle/{z}/{x}/{y}.png',
-    maxZoom: 21,
-    maxNativeZoom: 18
-  },
-  cesium: {
-    type: 'OpenStreetMap',
-    url: `http://a.tile.thunderforest.com/cycle`,
-    isVisible: false
-  }
-}]

Except for raster data, vector data are always converted to GeoJson upfront or as a rendering preprocessing phase in Kano.

Using OGC standards

OGC Web Services (OWS) are the OGC standards that use the internet to view, edit, manage and share geospatial data. You can notably use the following standards in Kano:

  • Web Map Services (WMS)
  • Web Map Tile Service (WMTS)
  • Tile Map Service (TMS)
  • Web Feature Service (WFS)
  • Web Coverage Service (WCS)

In this section we will use OGC web services of the French geographical institute (IGN). First copy the new layers file in the kano/api/config/layers directory. Then, add "POPULATION_DENSITY_WMTS POPULATION_DENSITY_WMS AIRPORTS_WFS" to your LAYERS_FILTER environment variable and launch Kano again to make the new layers appear in your custom catalog.

ogc-layers.cjs - Used to define additional layers using different protocols like WMTS, WMS and WFS.
cjs
module.exports = [{
-  name: 'Layers.POPULATION_DENSITY_WMTS',
-  description: 'Layers.POPULATION_DENSITY_WMTS_DESCRIPTION',
-  i18n: {
-    fr: {
-      Layers: {
-        POPULATION_DENSITY_WMTS: 'Densité (WMTS)',
-        POPULATION_DENSITY_WMTS_DESCRIPTION: 'Densité de population (IGN)'
-      }
-    },
-    en: {
-      Layers: {
-        POPULATION_DENSITY_WMTS: 'Density (WMTS)',
-        POPULATION_DENSITY_WMTS_DESCRIPTION: 'Population density (IGN)'
-      }
-    }
-  },
-  type: 'OverlayLayer',
-  attribution: '© <a href="https://ign.fr">IGN</a>',
-  tags: ['population'],
-  cesium: {
-    type: 'WebMapTileService',
-    url: 'https://wxs.ign.fr/economie/geoportail/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=INSEE.FILOSOFI.POPULATION&STYLE=INSEE&FORMAT=image/png&TILEMATRIXSET=PM&TILEMATRIX={TileMatrix}&TILEROW={TileRow}&TILECOL={TileCol}',
-    format: 'image/png',
-    layer: 'INSEE.FILOSOFI.POPULATION',
-    style: 'INSEE',
-    tileMatrixSetID: 'PM',
-    isVisible: false
-  },
-  leaflet: {
-    type: 'tileLayer',
-    source: 'https://wxs.ign.fr/economie/geoportail/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=INSEE.FILOSOFI.POPULATION&STYLE=INSEE&FORMAT=image/png&TILEMATRIXSET=PM&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}',
-    bounds: [ [40, -5], [50, 10] ],
-    opacity: 0.5,
-    isVisible: false
-  },
-  legendUrl: 'https://wxs.ign.fr/static/legends/INSEE.FILOSOFI.POPULATION-tot-legend-2017.png'
-}, {
-  name: 'Layers.POPULATION_DENSITY_WMS',
-  description: 'Layers.POPULATION_DENSITY_WMS_DESCRIPTION',
-  i18n: {
-    fr: {
-      Layers: {
-        POPULATION_DENSITY_WMS: 'Densité (WMS)',
-        POPULATION_DENSITY_WMS_DESCRIPTION: 'Densité de population (IGN)'
-      }
-    },
-    en: {
-      Layers: {
-        POPULATION_DENSITY_WMS: 'Density (WMS)',
-        POPULATION_DENSITY_WMS_DESCRIPTION: 'Population density (IGN)'
-      }
-    }
-  },
-  type: 'OverlayLayer',
-  attribution: '© <a href="https://ign.fr">IGN</a>',
-  tags: ['population'],
-  cesium: {
-    type: 'WebMapService',
-    url: 'https://wxs.ign.fr/economie/geoportail/r/wms',
-    layers: 'INSEE.FILOSOFI.POPULATION',
-    parameters: {
-      version: '1.3.0',
-      format: 'image/png',
-      transparent: true,
-      styles: 'INSEE'
-    },
-    isVisible: false
-  },
-  leaflet: {
-    type: 'tileLayer.wms',
-    source: 'https://wxs.ign.fr/economie/geoportail/r/wms',
-    layers: 'INSEE.FILOSOFI.POPULATION',
-    version: '1.3.0',
-    format: 'image/png',
-    transparent: true,
-    bgcolor: 'FFFFFFFF',
-    styles: 'INSEE',
-    opacity: 0.5,
-    isVisible: false
-  },
-  legendUrl: 'https://wxs.ign.fr/static/legends/INSEE.FILOSOFI.POPULATION-tot-legend-2017.png'
-}, {
-  name: 'Layers.AIRPORTS_WFS',
-  description: 'Layers.AIRPORTS_WFS_DESCRIPTION',
-  i18n: {
-    fr: {
-      Layers: {
-        AIRPORTS_WFS: 'Aérodromes (WFS)',
-        AIRPORTS_WFS_DESCRIPTION: 'Aérodromes (IGN)'
-      }
-    },
-    en: {
-      Layers: {
-        AIRPORTS_WFS: 'Airports (WFS)',
-        AIRPORTS_WFS_DESCRIPTION: 'Airports (IGN)'
-      }
-    }
-  },
-  type: 'OverlayLayer',
-  icon: 'las la-plane',
-  tags: ['administrative'],
-  bbox: [
-    -63.1537116941531,
-    -21.3898266619462,
-    55.8367758165235,
-    51.3150480097903
-  ],
-  featureId: 'toponyme',
-  wfs: {
-    url: 'https://wxs.ign.fr/cartovecto/geoportail/wfs',
-    version: '2.0.0',
-    searchParams: {},
-    outputFormat: 'json',
-    layer: 'BDCARTO_V5:aerodrome'
-  },
-  leaflet: {
-    type: 'geoJson',
-    realtime: true,
-    tiled: true,
-    minZoom: 10
-  },
-  cesium: {
-    type: 'geoJson',
-    realtime: true
-  }
-}]
module.exports = [{
-  name: 'Layers.POPULATION_DENSITY_WMTS',
-  description: 'Layers.POPULATION_DENSITY_WMTS_DESCRIPTION',
-  i18n: {
-    fr: {
-      Layers: {
-        POPULATION_DENSITY_WMTS: 'Densité (WMTS)',
-        POPULATION_DENSITY_WMTS_DESCRIPTION: 'Densité de population (IGN)'
-      }
-    },
-    en: {
-      Layers: {
-        POPULATION_DENSITY_WMTS: 'Density (WMTS)',
-        POPULATION_DENSITY_WMTS_DESCRIPTION: 'Population density (IGN)'
-      }
-    }
-  },
-  type: 'OverlayLayer',
-  attribution: '© <a href="https://ign.fr">IGN</a>',
-  tags: ['population'],
-  cesium: {
-    type: 'WebMapTileService',
-    url: 'https://wxs.ign.fr/economie/geoportail/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=INSEE.FILOSOFI.POPULATION&STYLE=INSEE&FORMAT=image/png&TILEMATRIXSET=PM&TILEMATRIX={TileMatrix}&TILEROW={TileRow}&TILECOL={TileCol}',
-    format: 'image/png',
-    layer: 'INSEE.FILOSOFI.POPULATION',
-    style: 'INSEE',
-    tileMatrixSetID: 'PM',
-    isVisible: false
-  },
-  leaflet: {
-    type: 'tileLayer',
-    source: 'https://wxs.ign.fr/economie/geoportail/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=INSEE.FILOSOFI.POPULATION&STYLE=INSEE&FORMAT=image/png&TILEMATRIXSET=PM&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}',
-    bounds: [ [40, -5], [50, 10] ],
-    opacity: 0.5,
-    isVisible: false
-  },
-  legendUrl: 'https://wxs.ign.fr/static/legends/INSEE.FILOSOFI.POPULATION-tot-legend-2017.png'
-}, {
-  name: 'Layers.POPULATION_DENSITY_WMS',
-  description: 'Layers.POPULATION_DENSITY_WMS_DESCRIPTION',
-  i18n: {
-    fr: {
-      Layers: {
-        POPULATION_DENSITY_WMS: 'Densité (WMS)',
-        POPULATION_DENSITY_WMS_DESCRIPTION: 'Densité de population (IGN)'
-      }
-    },
-    en: {
-      Layers: {
-        POPULATION_DENSITY_WMS: 'Density (WMS)',
-        POPULATION_DENSITY_WMS_DESCRIPTION: 'Population density (IGN)'
-      }
-    }
-  },
-  type: 'OverlayLayer',
-  attribution: '© <a href="https://ign.fr">IGN</a>',
-  tags: ['population'],
-  cesium: {
-    type: 'WebMapService',
-    url: 'https://wxs.ign.fr/economie/geoportail/r/wms',
-    layers: 'INSEE.FILOSOFI.POPULATION',
-    parameters: {
-      version: '1.3.0',
-      format: 'image/png',
-      transparent: true,
-      styles: 'INSEE'
-    },
-    isVisible: false
-  },
-  leaflet: {
-    type: 'tileLayer.wms',
-    source: 'https://wxs.ign.fr/economie/geoportail/r/wms',
-    layers: 'INSEE.FILOSOFI.POPULATION',
-    version: '1.3.0',
-    format: 'image/png',
-    transparent: true,
-    bgcolor: 'FFFFFFFF',
-    styles: 'INSEE',
-    opacity: 0.5,
-    isVisible: false
-  },
-  legendUrl: 'https://wxs.ign.fr/static/legends/INSEE.FILOSOFI.POPULATION-tot-legend-2017.png'
-}, {
-  name: 'Layers.AIRPORTS_WFS',
-  description: 'Layers.AIRPORTS_WFS_DESCRIPTION',
-  i18n: {
-    fr: {
-      Layers: {
-        AIRPORTS_WFS: 'Aérodromes (WFS)',
-        AIRPORTS_WFS_DESCRIPTION: 'Aérodromes (IGN)'
-      }
-    },
-    en: {
-      Layers: {
-        AIRPORTS_WFS: 'Airports (WFS)',
-        AIRPORTS_WFS_DESCRIPTION: 'Airports (IGN)'
-      }
-    }
-  },
-  type: 'OverlayLayer',
-  icon: 'las la-plane',
-  tags: ['administrative'],
-  bbox: [
-    -63.1537116941531,
-    -21.3898266619462,
-    55.8367758165235,
-    51.3150480097903
-  ],
-  featureId: 'toponyme',
-  wfs: {
-    url: 'https://wxs.ign.fr/cartovecto/geoportail/wfs',
-    version: '2.0.0',
-    searchParams: {},
-    outputFormat: 'json',
-    layer: 'BDCARTO_V5:aerodrome'
-  },
-  leaflet: {
-    type: 'geoJson',
-    realtime: true,
-    tiled: true,
-    minZoom: 10
-  },
-  cesium: {
-    type: 'geoJson',
-    realtime: true
-  }
-}]

You now should be able to see this after making some of the layers active:

ogc layers

Due to the possible large amount of vector data coming from the WFS the layer is configured with minZoom and tiled property so that data is only retrieved when zoom level exceed 10 for visible tiles only.

Using data files

Except by using the UI, there are two ways of adding data coming from a file based on configuration:

  1. serve and directly access the file over HTTP,
  2. ingest the file data into the database and access it using a built-in web service.

The second option is mandatory for large datasets or if you'd like to perform some filtering based on data feature properties. Accessing data stored in the database rely on the concept of FeathersJS service. As a consequence, the layer is usually associated with one (or more) source service where the data come from. Moreover, you should define a unique featureId on your features so that Kano can correctly separate and update data.

The data can be retrieved from a raw file with the fileName layer property or a remote file with the url layer property.

You should have a look to our detailed documentation for all possible styling options in 2D or 3D.

First copy the new layers file in the kano/api/config/layers directory. Then, add "REGIONS DEPARTMENTS" to your LAYERS_FILTER environment variable and launch Kano again to make some new layers appear in your custom catalog.

file-layers.cjs - Used to define additional layers using file data.
cjs
// Base URL to public files hosted in the docs
-const baseUrl = (process.env.NODE_ENV === 'development' ? 'http://localhost:8082' : 'https://kalisio.github.io/kano')
-
-module.exports = [{
-  name: 'Layers.REGIONS',
-  description: 'Layers.REGIONS_DESCRIPTION',
-  i18n: {
-    fr: {
-      Layers: {
-        REGIONS: 'Régions',
-        REGIONS_DESCRIPTION: 'Régions Françaises'
-      }
-    },
-    en: {
-      Layers: {
-        REGIONS: 'Regions',
-        REGIONS_DESCRIPTION: 'French regions'
-      }
-    }
-  },
-  tags: ['administrative'],
-  type: 'OverlayLayer',
-  featureId: 'code',
-  leaflet: {
-    type: 'geoJson',
-    source: `${baseUrl}/regions.geojson`,
-    'stroke-color': 'blue',
-    'fill-opacity': 0,
-    popup: { pick: [] },
-    tooltip: {
-      template: '<b><%= properties.nom %></b>'
-    }
-  },
-  cesium: {
-    type: 'geoJson',
-    source: `${baseUrl}/regions.geojson`,
-    'stroke-color': 'blue',
-    'fill-opacity': 0,
-    popup: { pick: [] },
-    tooltip: {
-      template: '<%= properties.nom %>'
-    }
-  }
-}, {
-  name: 'Layers.DEPARTMENTS',
-  description: 'Layers.DEPARTMENTS_DESCRIPTION',
-  i18n: {
-    fr: {
-      Layers: {
-        DEPARTMENTS: 'Départements',
-        DEPARTMENTS_DESCRIPTION: 'Départements Français'
-      }
-    },
-    en: {
-      Layers: {
-        DEPARTMENTS: 'Departments',
-        DEPARTMENTS_DESCRIPTION: 'French departments'
-      }
-    }
-  },
-  tags: ['administrative'],
-  type: 'OverlayLayer',
-  featureId: 'code',
-  service: 'airports',
-  probe: 'Airports',
-  url: `${baseUrl}/departments.geojson`,
-  // Could also be a file path to a GeoJson or a gzipped GeoJson
-  //fileName: path.join(__dirname, '../../../docs/.vitepress/public/departements.geojson'),
-  leaflet: {
-    type: 'geoJson',
-    source: '/api/departments',
-    'stroke-color': 'red',
-    'fill-opacity': 0,
-    popup: { pick: [] },
-    tooltip: {
-      template: '<b><%= properties.nom %></b>'
-    }
-  },
-  cesium: {
-    type: 'geoJson',
-    source: '/api/departments',
-    'stroke-color': 'red',
-    'fill-opacity': 0,
-    popup: { pick: [] },
-    tooltip: {
-      template: '<%= properties.nom %>'
-    }
-  }
-}]
// Base URL to public files hosted in the docs
-const baseUrl = (process.env.NODE_ENV === 'development' ? 'http://localhost:8082' : 'https://kalisio.github.io/kano')
-
-module.exports = [{
-  name: 'Layers.REGIONS',
-  description: 'Layers.REGIONS_DESCRIPTION',
-  i18n: {
-    fr: {
-      Layers: {
-        REGIONS: 'Régions',
-        REGIONS_DESCRIPTION: 'Régions Françaises'
-      }
-    },
-    en: {
-      Layers: {
-        REGIONS: 'Regions',
-        REGIONS_DESCRIPTION: 'French regions'
-      }
-    }
-  },
-  tags: ['administrative'],
-  type: 'OverlayLayer',
-  featureId: 'code',
-  leaflet: {
-    type: 'geoJson',
-    source: `${baseUrl}/regions.geojson`,
-    'stroke-color': 'blue',
-    'fill-opacity': 0,
-    popup: { pick: [] },
-    tooltip: {
-      template: '<b><%= properties.nom %></b>'
-    }
-  },
-  cesium: {
-    type: 'geoJson',
-    source: `${baseUrl}/regions.geojson`,
-    'stroke-color': 'blue',
-    'fill-opacity': 0,
-    popup: { pick: [] },
-    tooltip: {
-      template: '<%= properties.nom %>'
-    }
-  }
-}, {
-  name: 'Layers.DEPARTMENTS',
-  description: 'Layers.DEPARTMENTS_DESCRIPTION',
-  i18n: {
-    fr: {
-      Layers: {
-        DEPARTMENTS: 'Départements',
-        DEPARTMENTS_DESCRIPTION: 'Départements Français'
-      }
-    },
-    en: {
-      Layers: {
-        DEPARTMENTS: 'Departments',
-        DEPARTMENTS_DESCRIPTION: 'French departments'
-      }
-    }
-  },
-  tags: ['administrative'],
-  type: 'OverlayLayer',
-  featureId: 'code',
-  service: 'airports',
-  probe: 'Airports',
-  url: `${baseUrl}/departments.geojson`,
-  // Could also be a file path to a GeoJson or a gzipped GeoJson
-  //fileName: path.join(__dirname, '../../../docs/.vitepress/public/departements.geojson'),
-  leaflet: {
-    type: 'geoJson',
-    source: '/api/departments',
-    'stroke-color': 'red',
-    'fill-opacity': 0,
-    popup: { pick: [] },
-    tooltip: {
-      template: '<b><%= properties.nom %></b>'
-    }
-  },
-  cesium: {
-    type: 'geoJson',
-    source: '/api/departments',
-    'stroke-color': 'red',
-    'fill-opacity': 0,
-    popup: { pick: [] },
-    tooltip: {
-      template: '<%= properties.nom %>'
-    }
-  }
-}]

You now should be able to see a map highlighting some administrative boundaries in France:

file layers

If you have to ingest large datasets you should consider processing data using our ETL Krawler or ad-hoc processors. For instance, k-population ingest population data from a big GeoPackage into our database. You will find the associated layer definition in the built-in layers.

Time-varying data

One of the best feature of Kano is interactive visualisation, meaning that data can be updated in real-time according to user actions or data updates. A typical use case is the visualisation of time-varying spatial datasets. In this section we will use some data providing the number of hospitalizations by department in France during the COVID-19 (from 20-03-2020 to 20-04-2020) to perform such a visualisation.

In this example there is one GeoJson file per day. First extract the data files to the public folder exposed by Kano. Then copy the new layers file in the kano/api/config/layers directory. Last, add "COVID_19" to your LAYERS_FILTER environment variable and launch Kano again to make the new layers appear in your custom catalog.

covid-19-layers.cjs - Used to define additional time-varying layers based on file data.
cjs
// Base URL to public files hosted in the docs
-const baseUrl = (process.env.NODE_ENV === 'development' ? 'http://localhost:8082' : 'https://kalisio.github.io/kano')
-
-module.exports = [{
-  name: 'Layers.COVID_19',
-  description: 'Layers.COVID_19_DESCRIPTION',
-  i18n: {
-    fr: {
-      Layers: {
-        COVID_19: 'COVID-19',
-        COVID_19_DESCRIPTION: 'Hospitalisations par département'
-      }
-    },
-    en: {
-      Layers: {
-        COVID_19: 'COVID-19',
-        COVID_19_DESCRIPTION: 'Hospitalizations by department'
-      }
-    }
-  },
-  tags: ['health'],
-  icon: 'fas fa-atlas',
-  attribution: 'Santé Publique Fance / IGN / INSEE',
-  type: 'OverlayLayer',
-  featureId: 'code',
-  every: 'P1D',
-  leaflet: {
-    type: 'geoJson',
-    realtime: true,
-    sourceTemplate: `${baseUrl}/covid-19/hospitalisations-departements-<%= time.format('YYYY-MM-DD') %>.json`,
-    stroke: '#fee8c8',
-    'stroke-width': 2,
-    'stroke-opacity': 0.5,
-    'fill-opacity': 0.5,
-    'fill-color': '<%= chroma.scale(\'OrRd\').domain([0,50])(properties.taux).hex() %>',
-    template: ['fill-color'],
-    tooltip: {
-      template: '<b><%= properties.nom %>: <%= properties.hospitalisations %> hospitalisations</b>',
-      options: {
-        opacity: 0.8,
-        direction: 'top'
-      }
-    }
-  },
-  cesium: {
-    type: 'geoJson',
-    realtime: true,
-    sourceTemplate: `${baseUrl}/covid-19/hospitalisations-departements-<%= time.format('YYYY-MM-DD') %>.json`,
-    entityStyle: {
-      polygon: {
-        outline: false,
-        extrudedHeight: '<%= 1000 * properties.taux %>',
-        material: {
-          type: 'Cesium.ColorMaterialProperty',
-          options: {
-            type: 'Cesium.Color.fromCssColorString',
-            options: '<%= chroma.scale(\'OrRd\').domain([0,50])(properties.taux).css() %>'
-          }
-        }
-      },
-      template: ['polygon.extrudedHeight', 'polygon.material.options.options']
-    },
-    tooltip: {
-      template: '<%= properties.nom %>: <%= properties.hospitalisations %> hospitalisations'
-    }
-  }
-}]
// Base URL to public files hosted in the docs
-const baseUrl = (process.env.NODE_ENV === 'development' ? 'http://localhost:8082' : 'https://kalisio.github.io/kano')
-
-module.exports = [{
-  name: 'Layers.COVID_19',
-  description: 'Layers.COVID_19_DESCRIPTION',
-  i18n: {
-    fr: {
-      Layers: {
-        COVID_19: 'COVID-19',
-        COVID_19_DESCRIPTION: 'Hospitalisations par département'
-      }
-    },
-    en: {
-      Layers: {
-        COVID_19: 'COVID-19',
-        COVID_19_DESCRIPTION: 'Hospitalizations by department'
-      }
-    }
-  },
-  tags: ['health'],
-  icon: 'fas fa-atlas',
-  attribution: 'Santé Publique Fance / IGN / INSEE',
-  type: 'OverlayLayer',
-  featureId: 'code',
-  every: 'P1D',
-  leaflet: {
-    type: 'geoJson',
-    realtime: true,
-    sourceTemplate: `${baseUrl}/covid-19/hospitalisations-departements-<%= time.format('YYYY-MM-DD') %>.json`,
-    stroke: '#fee8c8',
-    'stroke-width': 2,
-    'stroke-opacity': 0.5,
-    'fill-opacity': 0.5,
-    'fill-color': '<%= chroma.scale(\'OrRd\').domain([0,50])(properties.taux).hex() %>',
-    template: ['fill-color'],
-    tooltip: {
-      template: '<b><%= properties.nom %>: <%= properties.hospitalisations %> hospitalisations</b>',
-      options: {
-        opacity: 0.8,
-        direction: 'top'
-      }
-    }
-  },
-  cesium: {
-    type: 'geoJson',
-    realtime: true,
-    sourceTemplate: `${baseUrl}/covid-19/hospitalisations-departements-<%= time.format('YYYY-MM-DD') %>.json`,
-    entityStyle: {
-      polygon: {
-        outline: false,
-        extrudedHeight: '<%= 1000 * properties.taux %>',
-        material: {
-          type: 'Cesium.ColorMaterialProperty',
-          options: {
-            type: 'Cesium.Color.fromCssColorString',
-            options: '<%= chroma.scale(\'OrRd\').domain([0,50])(properties.taux).css() %>'
-          }
-        }
-      },
-      template: ['polygon.extrudedHeight', 'polygon.material.options.options']
-    },
-    tooltip: {
-      template: '<%= properties.nom %>: <%= properties.hospitalisations %> hospitalisations'
-    }
-  }
-}]

Using the bottom timeline, navigate to some dates within the data time range, you now should be able to see a choropleth map highlighting the number of hospitalizations for each date:

covid-19 layers

You can even do the same using the 3D activity:

covid-19 layers in 3D

Using the API

The Kano API is particularly useful to update data continuously, a typical use case is data coming from network sensors performing measurements on the ground.

WARNING

You should use the local.cjs configuration file as stated in the installation section to setup a user account with appropriate rights (i.e. write acces to the API).

The different service endpoints of Kano can be accessed using REST as the most universal interface or using WebSockets if required (typically for complex queries or performance issue). The access to the endpoints are protected using a JWT (i.e. token), it must be defined using the Authorization header (Bearer token) in the request header for REST.

For instance using CURL you will send a request to the API like this (the body of the request being in the data.json file):

bash
SET TOKEN="xxx"
+    
Skip to content

Customizing Kano

This section details different approaches to integrate your own data to your Kano instance. Although you can directly use the Kano UI to add your own data layers this section provide details to do this by configuration or programmatically. When added through the UI, the different layers will be visible in the My data tab of the catalog panel, while the default built-in layers will appear in the Catalog tab of the catalog panel. You can also manage the categories (i.e. catalog sections) hosting the layers from the UI or the configuration.

Although names and descriptions can be hard-coded in the target user language, Kano supports internationalization through a nested structure organized by locale like this:

js
{
+	name: 'Categories.POPULATION_LAYERS',
+  i18n: {
+    fr: { Categories: { POPULATION_LAYERS: 'Population' } },
+    en: { Categories: { POPULATION_LAYERS: 'Population' } },
+    ...
+  }
+}

Note that the name property is used a unique identifier for categories and layers

Customizing the catalog

You can add your own categories in the catalog by defining it in additional files to be put in the kano/api/config/categories directory. Kano will glob all files within this directory and add categories accordingly, only matching by name those in the CATEGORIES_FILTER (comma-separated list of category names) environment variable, if any. Categories are simple objects with a name, a description and an icon from a standard icon set among Material Icons, Font Awesome, or Line Awesome.

my-categories.cjs - Used to define additional categories.
cjs
module.exports = [{
+  name: 'Categories.OSM_LAYERS',
+  i18n: {
+    fr: {
+      Categories: {
+        OSM_LAYERS: 'OpenStreetMap'
+      }
+    },
+    en: {
+      Categories: {
+        OSM_LAYERS: 'OpenStreetMap'
+      }
+    }
+  },
+  icon: 'las la-map',
+  options: { exclusive: true, filter: { type: 'BaseLayer', tags: { $in: ['osm'] } } }
+}, {
+  name: 'Categories.POPULATION_LAYERS',
+  i18n: {
+    fr: {
+      Categories: {
+        POPULATION_LAYERS: 'Population'
+      }
+    },
+    en: {
+      Categories: {
+        POPULATION_LAYERS: 'Population'
+      }
+    }
+  },
+  icon: 'las la-users',
+  options: { exclusive: false, filter: { type: 'OverlayLayer', tags: { $in: ['population'] } } }
+}]

Layers that will be added in a given category depends on the filter property content, which defines a sift filter applied to the layers list. Although any filter can be used, a tags property containing an array of relevent tags is often used by convention.

Customizing the catalog data

You can add your own layers in the catalog by defining it in additional files to be put in the kano/api/config/layers directory. Kano will glob all files within this directory and add layers accordingly, only matching by name those in the LAYERS_FILTER (comma-separated list of layer names) environment variable by default (set it to * to remove filtering). Layers are simple objects with a name, a description, a type, an attribution, and additional configuration options related to the underlying mapping engine: Leaflet for 2D rendering and Cesium for 3D rendering. More details about these options can be found in the documentation of the KDK powering Kano.

Please refer to the built-in kano/api/config/layers directory for various examples of what is possible to do with Kano.

We will start with a really simple example by adding two different map backgrounds based on OpenStreetMap data to your Kano instance. First ensure you copied the categories and layers files in their respective directories in kano/api/config. Then, set CATEGORIES_FILTER="OSM_LAYERS POPULATION_LAYERS" and LAYERS_FILTER="OSM OSM_CYCLE" in your environment. Last, launch Kano to make the layers appear in your custom catalog.

osm-layers.cjs - Used to define base layers with OpenStreetMap data.
cjs
module.exports = [{
+  name: 'Layers.OSM',
+  description: 'Layers.OSM_DESCRIPTION',
+  i18n: {
+    fr: {
+      Layers: {
+        OSM: 'OpenStreeMap',
+        OSM_DESCRIPTION: 'Données OpenStreetMap'
+      }
+    },
+    en: {
+      Layers: {
+        OSM: 'OpenStreeMap',
+        OSM_DESCRIPTION: 'OpenStreeMap data'
+      }
+    }
+  },
+  tags: ['osm'],
+  attribution: 'OpenStreetMap © <a href="http://openstreetmap.org">OpenStreetMap</a> contributors',
+  type: 'BaseLayer',
+  leaflet: {
+    type: 'tileLayer',
+    isVisible: true,
+    source: 'http://{s}.tile.osm.org/{z}/{x}/{y}.png',
+    maxZoom: 21,
+    maxNativeZoom: 18
+  },
+  cesium: {
+    type: 'OpenStreetMap',
+    isVisible: true,
+    url: `http://a.tile.osm.org`
+  }
+}, {
+  name: 'Layers.OSM_CYCLE',
+  description: 'Layers.OSM_CYCLE_DESCRIPTION',
+  i18n: {
+    fr: {
+      Layers: {
+        OSM_CYCLE: 'OpenCycleMap',
+        OSM_CYCLE_DESCRIPTION: 'Données OpenCycleMap'
+      }
+    },
+    en: {
+      Layers: {
+        OSM_CYCLE: 'OpenCycleMap',
+        OSM_CYCLE_DESCRIPTION: 'OpenCycleMap data'
+      }
+    }
+  },
+  attribution: 'OpenStreetMap © <a href="https://www.opencyclemap.org/">OpenCycleMap</a> contributors',
+  type: 'BaseLayer',
+  tags: ['osm'],
+  leaflet: {
+    type: 'tileLayer',
+    isVisible: false,
+    source: 'http://{s}.tile.thunderforest.com/cycle/{z}/{x}/{y}.png',
+    maxZoom: 21,
+    maxNativeZoom: 18
+  },
+  cesium: {
+    type: 'OpenStreetMap',
+    url: `http://a.tile.thunderforest.com/cycle`,
+    isVisible: false
+  }
+}]

Except for raster data, vector data are always converted to GeoJson upfront or as a rendering preprocessing phase in Kano.

Using OGC standards

OGC Web Services (OWS) are the OGC standards that use the internet to view, edit, manage and share geospatial data. You can notably use the following standards in Kano:

  • Web Map Services (WMS)
  • Web Map Tile Service (WMTS)
  • Tile Map Service (TMS)
  • Web Feature Service (WFS)
  • Web Coverage Service (WCS)

In this section we will use OGC web services of the French geographical institute (IGN). First copy the new layers file in the kano/api/config/layers directory. Then, add "POPULATION_DENSITY_WMTS POPULATION_DENSITY_WMS AIRPORTS_WFS" to your LAYERS_FILTER environment variable and launch Kano again to make the new layers appear in your custom catalog.

ogc-layers.cjs - Used to define additional layers using different protocols like WMTS, WMS and WFS.
cjs
module.exports = [{
+  name: 'Layers.POPULATION_DENSITY_WMTS',
+  description: 'Layers.POPULATION_DENSITY_WMTS_DESCRIPTION',
+  i18n: {
+    fr: {
+      Layers: {
+        POPULATION_DENSITY_WMTS: 'Densité (WMTS)',
+        POPULATION_DENSITY_WMTS_DESCRIPTION: 'Densité de population (IGN)'
+      }
+    },
+    en: {
+      Layers: {
+        POPULATION_DENSITY_WMTS: 'Density (WMTS)',
+        POPULATION_DENSITY_WMTS_DESCRIPTION: 'Population density (IGN)'
+      }
+    }
+  },
+  type: 'OverlayLayer',
+  attribution: '© <a href="https://ign.fr">IGN</a>',
+  tags: ['population'],
+  cesium: {
+    type: 'WebMapTileService',
+    url: 'https://wxs.ign.fr/economie/geoportail/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=INSEE.FILOSOFI.POPULATION&STYLE=INSEE&FORMAT=image/png&TILEMATRIXSET=PM&TILEMATRIX={TileMatrix}&TILEROW={TileRow}&TILECOL={TileCol}',
+    format: 'image/png',
+    layer: 'INSEE.FILOSOFI.POPULATION',
+    style: 'INSEE',
+    tileMatrixSetID: 'PM',
+    isVisible: false
+  },
+  leaflet: {
+    type: 'tileLayer',
+    source: 'https://wxs.ign.fr/economie/geoportail/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=INSEE.FILOSOFI.POPULATION&STYLE=INSEE&FORMAT=image/png&TILEMATRIXSET=PM&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}',
+    bounds: [ [40, -5], [50, 10] ],
+    opacity: 0.5,
+    isVisible: false
+  },
+  legendUrl: 'https://wxs.ign.fr/static/legends/INSEE.FILOSOFI.POPULATION-tot-legend-2017.png'
+}, {
+  name: 'Layers.POPULATION_DENSITY_WMS',
+  description: 'Layers.POPULATION_DENSITY_WMS_DESCRIPTION',
+  i18n: {
+    fr: {
+      Layers: {
+        POPULATION_DENSITY_WMS: 'Densité (WMS)',
+        POPULATION_DENSITY_WMS_DESCRIPTION: 'Densité de population (IGN)'
+      }
+    },
+    en: {
+      Layers: {
+        POPULATION_DENSITY_WMS: 'Density (WMS)',
+        POPULATION_DENSITY_WMS_DESCRIPTION: 'Population density (IGN)'
+      }
+    }
+  },
+  type: 'OverlayLayer',
+  attribution: '© <a href="https://ign.fr">IGN</a>',
+  tags: ['population'],
+  cesium: {
+    type: 'WebMapService',
+    url: 'https://wxs.ign.fr/economie/geoportail/r/wms',
+    layers: 'INSEE.FILOSOFI.POPULATION',
+    parameters: {
+      version: '1.3.0',
+      format: 'image/png',
+      transparent: true,
+      styles: 'INSEE'
+    },
+    isVisible: false
+  },
+  leaflet: {
+    type: 'tileLayer.wms',
+    source: 'https://wxs.ign.fr/economie/geoportail/r/wms',
+    layers: 'INSEE.FILOSOFI.POPULATION',
+    version: '1.3.0',
+    format: 'image/png',
+    transparent: true,
+    bgcolor: 'FFFFFFFF',
+    styles: 'INSEE',
+    opacity: 0.5,
+    isVisible: false
+  },
+  legendUrl: 'https://wxs.ign.fr/static/legends/INSEE.FILOSOFI.POPULATION-tot-legend-2017.png'
+}, {
+  name: 'Layers.AIRPORTS_WFS',
+  description: 'Layers.AIRPORTS_WFS_DESCRIPTION',
+  i18n: {
+    fr: {
+      Layers: {
+        AIRPORTS_WFS: 'Aérodromes (WFS)',
+        AIRPORTS_WFS_DESCRIPTION: 'Aérodromes (IGN)'
+      }
+    },
+    en: {
+      Layers: {
+        AIRPORTS_WFS: 'Airports (WFS)',
+        AIRPORTS_WFS_DESCRIPTION: 'Airports (IGN)'
+      }
+    }
+  },
+  type: 'OverlayLayer',
+  icon: 'las la-plane',
+  tags: ['administrative'],
+  bbox: [
+    -63.1537116941531,
+    -21.3898266619462,
+    55.8367758165235,
+    51.3150480097903
+  ],
+  featureId: 'toponyme',
+  wfs: {
+    url: 'https://wxs.ign.fr/cartovecto/geoportail/wfs',
+    version: '2.0.0',
+    searchParams: {},
+    outputFormat: 'json',
+    layer: 'BDCARTO_V5:aerodrome'
+  },
+  leaflet: {
+    type: 'geoJson',
+    realtime: true,
+    tiled: true,
+    minZoom: 10
+  },
+  cesium: {
+    type: 'geoJson',
+    realtime: true
+  }
+}]

You now should be able to see this after making some of the layers active:

ogc layers

Due to the possible large amount of vector data coming from the WFS the layer is configured with minZoom and tiled property so that data is only retrieved when zoom level exceed 10 for visible tiles only.

Using data files

Except by using the UI, there are two ways of adding data coming from a file based on configuration:

  1. serve and directly access the file over HTTP,
  2. ingest the file data into the database and access it using a built-in web service.

The second option is mandatory for large datasets or if you'd like to perform some filtering based on data feature properties. Accessing data stored in the database rely on the concept of FeathersJS service. As a consequence, the layer is usually associated with one (or more) source service where the data come from. Moreover, you should define a unique featureId on your features so that Kano can correctly separate and update data.

The data can be retrieved from a raw file with the fileName layer property or a remote file with the url layer property.

You should have a look to our detailed documentation for all possible styling options in 2D or 3D.

First copy the new layers file in the kano/api/config/layers directory. Then, add "REGIONS DEPARTMENTS" to your LAYERS_FILTER environment variable and launch Kano again to make some new layers appear in your custom catalog.

file-layers.cjs - Used to define additional layers using file data.
cjs
// Base URL to public files hosted in the docs
+const baseUrl = (process.env.NODE_ENV === 'development' ? 'http://localhost:8082' : 'https://kalisio.github.io/kano')
+
+module.exports = [{
+  name: 'Layers.REGIONS',
+  description: 'Layers.REGIONS_DESCRIPTION',
+  i18n: {
+    fr: {
+      Layers: {
+        REGIONS: 'Régions',
+        REGIONS_DESCRIPTION: 'Régions Françaises'
+      }
+    },
+    en: {
+      Layers: {
+        REGIONS: 'Regions',
+        REGIONS_DESCRIPTION: 'French regions'
+      }
+    }
+  },
+  tags: ['administrative'],
+  type: 'OverlayLayer',
+  featureId: 'code',
+  leaflet: {
+    type: 'geoJson',
+    source: `${baseUrl}/regions.geojson`,
+    'stroke-color': 'blue',
+    'fill-opacity': 0,
+    popup: { pick: [] },
+    tooltip: {
+      template: '<b><%= properties.nom %></b>'
+    }
+  },
+  cesium: {
+    type: 'geoJson',
+    source: `${baseUrl}/regions.geojson`,
+    'stroke-color': 'blue',
+    'fill-opacity': 0,
+    popup: { pick: [] },
+    tooltip: {
+      template: '<%= properties.nom %>'
+    }
+  }
+}, {
+  name: 'Layers.DEPARTMENTS',
+  description: 'Layers.DEPARTMENTS_DESCRIPTION',
+  i18n: {
+    fr: {
+      Layers: {
+        DEPARTMENTS: 'Départements',
+        DEPARTMENTS_DESCRIPTION: 'Départements Français'
+      }
+    },
+    en: {
+      Layers: {
+        DEPARTMENTS: 'Departments',
+        DEPARTMENTS_DESCRIPTION: 'French departments'
+      }
+    }
+  },
+  tags: ['administrative'],
+  type: 'OverlayLayer',
+  featureId: 'code',
+  service: 'airports',
+  probe: 'Airports',
+  url: `${baseUrl}/departments.geojson`,
+  // Could also be a file path to a GeoJson or a gzipped GeoJson
+  //fileName: path.join(__dirname, '../../../docs/.vitepress/public/departements.geojson'),
+  leaflet: {
+    type: 'geoJson',
+    source: '/api/departments',
+    'stroke-color': 'red',
+    'fill-opacity': 0,
+    popup: { pick: [] },
+    tooltip: {
+      template: '<b><%= properties.nom %></b>'
+    }
+  },
+  cesium: {
+    type: 'geoJson',
+    source: '/api/departments',
+    'stroke-color': 'red',
+    'fill-opacity': 0,
+    popup: { pick: [] },
+    tooltip: {
+      template: '<%= properties.nom %>'
+    }
+  }
+}]

You now should be able to see a map highlighting some administrative boundaries in France:

file layers

If you have to ingest large datasets you should consider processing data using our ETL Krawler or ad-hoc processors. For instance, k-population ingest population data from a big GeoPackage into our database. You will find the associated layer definition in the built-in layers.

Time-varying data

One of the best feature of Kano is interactive visualisation, meaning that data can be updated in real-time according to user actions or data updates. A typical use case is the visualisation of time-varying spatial datasets. In this section we will use some data providing the number of hospitalizations by department in France during the COVID-19 (from 20-03-2020 to 20-04-2020) to perform such a visualisation.

In this example there is one GeoJson file per day. First extract the data files to the public folder exposed by Kano. Then copy the new layers file in the kano/api/config/layers directory. Last, add "COVID_19" to your LAYERS_FILTER environment variable and launch Kano again to make the new layers appear in your custom catalog.

covid-19-layers.cjs - Used to define additional time-varying layers based on file data.
cjs
// Base URL to public files hosted in the docs
+const baseUrl = (process.env.NODE_ENV === 'development' ? 'http://localhost:8082' : 'https://kalisio.github.io/kano')
+
+module.exports = [{
+  name: 'Layers.COVID_19',
+  description: 'Layers.COVID_19_DESCRIPTION',
+  i18n: {
+    fr: {
+      Layers: {
+        COVID_19: 'COVID-19',
+        COVID_19_DESCRIPTION: 'Hospitalisations par département'
+      }
+    },
+    en: {
+      Layers: {
+        COVID_19: 'COVID-19',
+        COVID_19_DESCRIPTION: 'Hospitalizations by department'
+      }
+    }
+  },
+  tags: ['health'],
+  icon: 'fas fa-atlas',
+  attribution: 'Santé Publique Fance / IGN / INSEE',
+  type: 'OverlayLayer',
+  featureId: 'code',
+  every: 'P1D',
+  leaflet: {
+    type: 'geoJson',
+    realtime: true,
+    sourceTemplate: `${baseUrl}/covid-19/hospitalisations-departements-<%= time.format('YYYY-MM-DD') %>.json`,
+    stroke: '#fee8c8',
+    'stroke-width': 2,
+    'stroke-opacity': 0.5,
+    'fill-opacity': 0.5,
+    'fill-color': '<%= chroma.scale(\'OrRd\').domain([0,50])(properties.taux).hex() %>',
+    template: ['fill-color'],
+    tooltip: {
+      template: '<b><%= properties.nom %>: <%= properties.hospitalisations %> hospitalisations</b>',
+      options: {
+        opacity: 0.8,
+        direction: 'top'
+      }
+    }
+  },
+  cesium: {
+    type: 'geoJson',
+    realtime: true,
+    sourceTemplate: `${baseUrl}/covid-19/hospitalisations-departements-<%= time.format('YYYY-MM-DD') %>.json`,
+    entityStyle: {
+      polygon: {
+        outline: false,
+        extrudedHeight: '<%= 1000 * properties.taux %>',
+        material: {
+          type: 'Cesium.ColorMaterialProperty',
+          options: {
+            type: 'Cesium.Color.fromCssColorString',
+            options: '<%= chroma.scale(\'OrRd\').domain([0,50])(properties.taux).css() %>'
+          }
+        }
+      },
+      template: ['polygon.extrudedHeight', 'polygon.material.options.options']
+    },
+    tooltip: {
+      template: '<%= properties.nom %>: <%= properties.hospitalisations %> hospitalisations'
+    }
+  }
+}]

Using the bottom timeline, navigate to some dates within the data time range, you now should be able to see a choropleth map highlighting the number of hospitalizations for each date:

covid-19 layers

You can even do the same using the 3D activity:

covid-19 layers in 3D

Using the API

The Kano API is particularly useful to update data continuously, a typical use case is data coming from network sensors performing measurements on the ground.

WARNING

You should use the local.cjs configuration file as stated in the installation section to setup a user account with appropriate rights (i.e. write acces to the API).

The different service endpoints of Kano can be accessed using REST as the most universal interface or using WebSockets if required (typically for complex queries or performance issue). The access to the endpoints are protected using a JWT (i.e. token), it must be defined using the Authorization header (Bearer token) in the request header for REST.

For instance using CURL you will send a request to the API like this (the body of the request being in the data.json file):

bash
SET TOKEN="xxx"
 
-curl -X POST -H "Authorization: Bearer %TOKEN%" ^
-     -H "Content-Type: application/json" ^
-     -d @data.json ^
-     https://kano.dev.kalisio.xyz/api/service
SET TOKEN="xxx"
-
-curl -X POST -H "Authorization: Bearer %TOKEN%" ^
-     -H "Content-Type: application/json" ^
-     -d @data.json ^
-     https://kano.dev.kalisio.xyz/api/service

Detailed information about the concepts and the data model behind our feature services can be found in the KDK documentation, although focused on how to retrieve the data.

To push a new station the body of the request will be a GeoJson feature like this:

js
{
-  "properties": {
-    "id": "174412d9e-f230-4127-af36-75654e265f56",
-    "name": "Station 1"
-  },
-  "geometry": {
-    "type": "Point",
-    "coordinates": [
-      1.5059948323127268
-      43.547168883180966,
-      0
-    ]
-  },
-  "type": "Feature"
-}
{
-  "properties": {
-    "id": "174412d9e-f230-4127-af36-75654e265f56",
-    "name": "Station 1"
-  },
-  "geometry": {
-    "type": "Point",
-    "coordinates": [
-      1.5059948323127268
-      43.547168883180966,
-      0
-    ]
-  },
-  "type": "Feature"
-}

To push a new measure of the station the body of the request will be (a) GeoJson feature(s) like this:

js
// Single or multiple measures can be sent at once
-[{
-  "time": "2023-04-28T16:00:00",
-  "properties": {
-    "id": "174412d9e-f230-4127-af36-75654e265f56",
-    "value": 24,
-    "status": "OK"
-  },
-  "geometry": {
-    "type": "Point",
-    "coordinates": [
-      1.5059948323127268
-      43.547168883180966,
-      0
-    ]
-  },
-  "type": "Feature"
-}, ...]
// Single or multiple measures can be sent at once
-[{
-  "time": "2023-04-28T16:00:00",
-  "properties": {
-    "id": "174412d9e-f230-4127-af36-75654e265f56",
-    "value": 24,
-    "status": "OK"
-  },
-  "geometry": {
-    "type": "Point",
-    "coordinates": [
-      1.5059948323127268
-      43.547168883180966,
-      0
-    ]
-  },
-  "type": "Feature"
-}, ...]

First copy the new layers file in the kano/api/config/layers directory. Then, add "SENSORS" to your LAYERS_FILTER environment variable and launch Kano again to make the new layers appear in your custom catalog.

sensors-layers.cjs - Used to define additional sensors layers based on API data feeding.
cjs
module.exports = [{
-  name: 'Layers.SENSORS',
-  description: 'Layers.SENSORS_DESCRIPTION',
-  i18n: {
-    fr: {
-      Layers: {
-        SENSORS: 'Capteurs',
-        SENSORS_DESCRIPTION: 'Réseau de capteurs'
-      },
-      Variables: {
-        TEMPERATURE: 'Température'
-      }
-    },
-    en: {
-      Layers: {
-        SENSORS: 'Sensors',
-        SENSORS_DESCRIPTION: 'Sensors network'
-      },
-      Variables: {
-        TEMPERATURE: 'Temperature'
-      }
-    }
-  },
-  tags: ['sensors'],
-  type: 'OverlayLayer',
-  service: 'sensors-observations',
-  probeService: 'sensors-stations',
-  ttl: 7 * 24 * 60 * 60,
-  featureId: 'id',
-  featureLabel: 'name',
-  from: 'P-7D',
-  to: 'PT-1M',
-  every: 'PT10M',
-  queryFrom: 'PT-1H',
-  variables: [
-    {
-      name: 'temperature',
-      label: 'Variables.TEMPERATURE',
-      units: ['degC'],
-      range: [-50, 127],
-      step: 5,
-      chartjs: {
-        backgroundColor: 'rgba(255, 99, 132, 128)',
-        borderColor: 'rgb(255, 99, 132)',
-        fill: false
-      }
-    }
-  ],
-  leaflet: {
-    type: 'geoJson',
-    realtime: true,
-    tiled: true,
-    cluster: { disableClusteringAtZoom: 18 },
-    'marker-color': `<% if (properties.status === 'OK') { %>green<% }
-                        else { %>red<% } %>`,
-    'icon-classes': 'fa fa-wifi',
-    'icon-x-offset': -2,
-    'icon-color': '#FFF',
-    template: ['marker-color'],
-    tooltip: {
-      template: '<%= properties.name %>: <%= properties.temperature %>°C'
-    }
-  },
-  cesium: {
-    type: 'geoJson',
-    realtime: true,
-    cluster: { pixelRange: 50 },
-    'marker-symbol': 'lighthouse',
-    'marker-color': '#180EF1',
-    tooltip: {
-      template: '<%= properties.name %>: <%= properties.temperature %>°C'
-    }
-  }
-}]
module.exports = [{
-  name: 'Layers.SENSORS',
-  description: 'Layers.SENSORS_DESCRIPTION',
-  i18n: {
-    fr: {
-      Layers: {
-        SENSORS: 'Capteurs',
-        SENSORS_DESCRIPTION: 'Réseau de capteurs'
-      },
-      Variables: {
-        TEMPERATURE: 'Température'
-      }
-    },
-    en: {
-      Layers: {
-        SENSORS: 'Sensors',
-        SENSORS_DESCRIPTION: 'Sensors network'
-      },
-      Variables: {
-        TEMPERATURE: 'Temperature'
-      }
-    }
-  },
-  tags: ['sensors'],
-  type: 'OverlayLayer',
-  service: 'sensors-observations',
-  probeService: 'sensors-stations',
-  ttl: 7 * 24 * 60 * 60,
-  featureId: 'id',
-  featureLabel: 'name',
-  from: 'P-7D',
-  to: 'PT-1M',
-  every: 'PT10M',
-  queryFrom: 'PT-1H',
-  variables: [
-    {
-      name: 'temperature',
-      label: 'Variables.TEMPERATURE',
-      units: ['degC'],
-      range: [-50, 127],
-      step: 5,
-      chartjs: {
-        backgroundColor: 'rgba(255, 99, 132, 128)',
-        borderColor: 'rgb(255, 99, 132)',
-        fill: false
-      }
-    }
-  ],
-  leaflet: {
-    type: 'geoJson',
-    realtime: true,
-    tiled: true,
-    cluster: { disableClusteringAtZoom: 18 },
-    'marker-color': `<% if (properties.status === 'OK') { %>green<% }
-                        else { %>red<% } %>`,
-    'icon-classes': 'fa fa-wifi',
-    'icon-x-offset': -2,
-    'icon-color': '#FFF',
-    template: ['marker-color'],
-    tooltip: {
-      template: '<%= properties.name %>: <%= properties.temperature %>°C'
-    }
-  },
-  cesium: {
-    type: 'geoJson',
-    realtime: true,
-    cluster: { pixelRange: 50 },
-    'marker-symbol': 'lighthouse',
-    'marker-color': '#180EF1',
-    tooltip: {
-      template: '<%= properties.name %>: <%= properties.temperature %>°C'
-    }
-  }
-}]

Now, feed the API using the provided data in the public folder of the documentation:

curl -X POST -H "Authorization: Bearer %TOKEN%" -H "Content-Type: application/json" ^
-     -d @stations-data.json https://your.kano.domain/api/sensors-stations
-curl -X POST -H "Authorization: Bearer %TOKEN%" -H "Content-Type: application/json" ^
-     -d @observations-data.json https://your.kano.domain/api/sensors-observations
curl -X POST -H "Authorization: Bearer %TOKEN%" -H "Content-Type: application/json" ^
-     -d @stations-data.json https://your.kano.domain/api/sensors-stations
-curl -X POST -H "Authorization: Bearer %TOKEN%" -H "Content-Type: application/json" ^
-     -d @observations-data.json https://your.kano.domain/api/sensors-observations

TIP

For testing purpose you can get a valid token from the local storage in the developer tool after logged into Kano.

Using the bottom timeline, navigate to a date/time with existing sensor data, you now should be able to see your sensor on the map, selecting it should open the value timeseries:

sensors layers

A data layer can contain multiple time-varying elements called variables. The features may contain additional properties, e.g. a status (OK/NOK), a name, etc. that can be used to customize the rendering, e.g. icon, color, tooltip, etc.

The main configuration options are the following:

  • the property that will be use to uniquely identify a station (i.e. ID)
  • the refresh rate of the data in the layer (used to automatically update the view every N seconds in Kano)
  • the life time of a measure, i.e. if no measure found within the range current time - life time the station is not considered to have performed any measure for current time
  • the list of the variables contained in the data with associated properties to ease timeseries display (unit, range, color, ...)

TIP

A layer can have no fixed stations but only measurements from sensors in order to display moving data

Customizing the catalog legend

To be completed

- +curl -X POST -H "Authorization: Bearer %TOKEN%" ^ + -H "Content-Type: application/json" ^ + -d @data.json ^ + https://kano.dev.kalisio.xyz/api/service

Detailed information about the concepts and the data model behind our feature services can be found in the KDK documentation, although focused on how to retrieve the data.

To push a new station the body of the request will be a GeoJson feature like this:

js
{
+  "properties": {
+    "id": "174412d9e-f230-4127-af36-75654e265f56",
+    "name": "Station 1"
+  },
+  "geometry": {
+    "type": "Point",
+    "coordinates": [
+      1.5059948323127268
+      43.547168883180966,
+      0
+    ]
+  },
+  "type": "Feature"
+}

To push a new measure of the station the body of the request will be (a) GeoJson feature(s) like this:

js
// Single or multiple measures can be sent at once
+[{
+  "time": "2023-04-28T16:00:00",
+  "properties": {
+    "id": "174412d9e-f230-4127-af36-75654e265f56",
+    "value": 24,
+    "status": "OK"
+  },
+  "geometry": {
+    "type": "Point",
+    "coordinates": [
+      1.5059948323127268
+      43.547168883180966,
+      0
+    ]
+  },
+  "type": "Feature"
+}, ...]

First copy the new layers file in the kano/api/config/layers directory. Then, add "SENSORS" to your LAYERS_FILTER environment variable and launch Kano again to make the new layers appear in your custom catalog.

sensors-layers.cjs - Used to define additional sensors layers based on API data feeding.
cjs
module.exports = [{
+  name: 'Layers.SENSORS',
+  description: 'Layers.SENSORS_DESCRIPTION',
+  i18n: {
+    fr: {
+      Layers: {
+        SENSORS: 'Capteurs',
+        SENSORS_DESCRIPTION: 'Réseau de capteurs'
+      },
+      Variables: {
+        TEMPERATURE: 'Température'
+      }
+    },
+    en: {
+      Layers: {
+        SENSORS: 'Sensors',
+        SENSORS_DESCRIPTION: 'Sensors network'
+      },
+      Variables: {
+        TEMPERATURE: 'Temperature'
+      }
+    }
+  },
+  tags: ['sensors'],
+  type: 'OverlayLayer',
+  service: 'sensors-observations',
+  probeService: 'sensors-stations',
+  ttl: 7 * 24 * 60 * 60,
+  featureId: 'id',
+  featureLabel: 'name',
+  from: 'P-7D',
+  to: 'PT-1M',
+  every: 'PT10M',
+  queryFrom: 'PT-1H',
+  variables: [
+    {
+      name: 'temperature',
+      label: 'Variables.TEMPERATURE',
+      units: ['degC'],
+      range: [-50, 127],
+      step: 5,
+      chartjs: {
+        backgroundColor: 'rgba(255, 99, 132, 128)',
+        borderColor: 'rgb(255, 99, 132)',
+        fill: false
+      }
+    }
+  ],
+  leaflet: {
+    type: 'geoJson',
+    realtime: true,
+    tiled: true,
+    cluster: { disableClusteringAtZoom: 18 },
+    'marker-color': `<% if (properties.status === 'OK') { %>green<% }
+                        else { %>red<% } %>`,
+    'icon-classes': 'fa fa-wifi',
+    'icon-x-offset': -2,
+    'icon-color': '#FFF',
+    template: ['marker-color'],
+    tooltip: {
+      template: '<%= properties.name %>: <%= properties.temperature %>°C'
+    }
+  },
+  cesium: {
+    type: 'geoJson',
+    realtime: true,
+    cluster: { pixelRange: 50 },
+    'marker-symbol': 'lighthouse',
+    'marker-color': '#180EF1',
+    tooltip: {
+      template: '<%= properties.name %>: <%= properties.temperature %>°C'
+    }
+  }
+}]

Now, feed the API using the provided data in the public folder of the documentation:

curl -X POST -H "Authorization: Bearer %TOKEN%" -H "Content-Type: application/json" ^
+     -d @stations-data.json https://your.kano.domain/api/sensors-stations
+curl -X POST -H "Authorization: Bearer %TOKEN%" -H "Content-Type: application/json" ^
+     -d @observations-data.json https://your.kano.domain/api/sensors-observations

TIP

For testing purpose you can get a valid token from the local storage in the developer tool after logged into Kano.

Using the bottom timeline, navigate to a date/time with existing sensor data, you now should be able to see your sensor on the map, selecting it should open the value timeseries:

sensors layers

A data layer can contain multiple time-varying elements called variables. The features may contain additional properties, e.g. a status (OK/NOK), a name, etc. that can be used to customize the rendering, e.g. icon, color, tooltip, etc.

The main configuration options are the following:

  • the property that will be use to uniquely identify a station (i.e. ID)
  • the refresh rate of the data in the layer (used to automatically update the view every N seconds in Kano)
  • the life time of a measure, i.e. if no measure found within the range current time - life time the station is not considered to have performed any measure for current time
  • the list of the variables contained in the data with associated properties to ease timeseries display (unit, range, color, ...)

TIP

A layer can have no fixed stations but only measurements from sensors in order to display moving data

Customizing the catalog legend

To be completed

+ \ No newline at end of file diff --git a/guides/getting-started.html b/guides/getting-started.html index e3a671bc..d4a00b8e 100644 --- a/guides/getting-started.html +++ b/guides/getting-started.html @@ -5,21 +5,22 @@ Getting Started | Kano - + + - - - - - + + + + + -
Skip to content

Getting Started

Kano comes with small tutorials (a.k.a. tours) that can be directly run on the application in order to understand how its internal components can be used. You will first have to connect to make everything works as expected.

Then, you can launch the main tutorial directly from the main menu through the following icon . Follow the step by step guide , go back if required and stop anytime as illustrated by the following figure:

tour

From the main tutorial you can open others tutorials dedicated to specific components (like e.g. the navigation bar) whenever you see the icon.

WARNING

Kano look and features are ever-evolving, moreover it can be configured according to your specific use case. As a consequence, your screen probably looks a little different than what you can read and see in this documentation but the key concepts remain the same.

The main menu allows to open the documentation, manage your settings and logout from Kano.

👉 Launch the main tutorial from the main menu then open the link to the main menu tutorial to get more details

Application bar

The application bar allows to quickly execute recurring actions:

  • switch from 2D (respectively 3D) activity to 3D (respectively 2D) activity,
  • center the view on your current location and display it,
  • seek for an address,
  • manage your favorite views,
  • tools to e.g. display the coordinates of a location,
  • switch to fullscreen mode.

👉 Launch the main tutorial from the main menu then open the link to the navigation bar tutorial to get more details

Catalog

The catalog allows to manage the layers displayed on your view. You can show/hide a layer by selecting it in the relevant category.

WARNING

The data of some layers are only visible starting from a given scale if there is too much data to ensure a readable and smvisualisation.

In this case the layer will be disable until you reach the required scale on the map (zoom in or zoom to the layer to do so).

Using the menu on a layer you can access available actions for this layer.

👉 Launch the main tutorial from the main menu then open the link to the catalog tutorial to get more details

Timeline

The timeline allows to quickly execute actions related to the time of the displayed data. Stick to real-time or go forward/backward in time as you wish.

👉 Launch the main tutorial from the main menu then open the link to the timeline tutorial to get more details

Floating action button

Using the FAB at the bottom right corner you can:

  • Create a new blank data layer:
    • By connecting to web mapping services using OGC standards (WMS, WFS, TMS, WMTS).
    • By locating and drawing the underlying entities. You can add the data schema from a JSON schema file in order to edit the meatadata (i.e. properties) of your entities.
    • By import existing data from a GeoJSON file.
  • Probe weather forecast data from active prediction models by selecting a specific location on the map.

👉 Launch the main tutorial from the main menu then open the link to the FAB tutorial to get more details

Contextual menu

A right-click on a feature of the map will display a contextual menu if some actions are available for the target element like editing the properties of a user-defined feature or remove it.

Layer actions

Depending on the layer different actions are available. The most common action is to zoom to the layer in order to fit the view on the available data. If the layer is disabled at high scales this action will set the current scale of the map so that data will start be visible if the layer is shown.

More actions are available on user-defined feature layers:

  • save the layer (i.e. make it persistent),
  • edit layer properties like its name or description,
  • edit layer features (metadata and geometry),
  • edit display style,
  • filter data according to metadata,
  • display raw data,
  • create charts,
  • delete the layer.
- +
Skip to content

Getting Started

Kano comes with small tutorials (a.k.a. tours) that can be directly run on the application in order to understand how its internal components can be used. You will first have to connect to make everything works as expected.

Then, you can launch the main tutorial directly from the main menu through the following icon . Follow the step by step guide , go back if required and stop anytime as illustrated by the following figure:

tour

From the main tutorial you can open others tutorials dedicated to specific components (like e.g. the navigation bar) whenever you see the icon.

WARNING

Kano look and features are ever-evolving, moreover it can be configured according to your specific use case. As a consequence, your screen probably looks a little different than what you can read and see in this documentation but the key concepts remain the same.

The main menu allows to open the documentation, manage your settings and logout from Kano.

👉 Launch the main tutorial from the main menu then open the link to the main menu tutorial to get more details

Application bar

The application bar allows to quickly execute recurring actions:

  • switch from 2D (respectively 3D) activity to 3D (respectively 2D) activity,
  • center the view on your current location and display it,
  • seek for an address,
  • manage your favorite views,
  • tools to e.g. display the coordinates of a location,
  • switch to fullscreen mode.

👉 Launch the main tutorial from the main menu then open the link to the navigation bar tutorial to get more details

Catalog

The catalog allows to manage the layers displayed on your view. You can show/hide a layer by selecting it in the relevant category.

WARNING

The data of some layers are only visible starting from a given scale if there is too much data to ensure a readable and smvisualisation.

In this case the layer will be disable until you reach the required scale on the map (zoom in or zoom to the layer to do so).

Using the menu on a layer you can access available actions for this layer.

👉 Launch the main tutorial from the main menu then open the link to the catalog tutorial to get more details

Timeline

The timeline allows to quickly execute actions related to the time of the displayed data. Stick to real-time or go forward/backward in time as you wish.

👉 Launch the main tutorial from the main menu then open the link to the timeline tutorial to get more details

Floating action button

Using the FAB at the bottom right corner you can:

  • Create a new blank data layer:
    • By connecting to web mapping services using OGC standards (WMS, WFS, TMS, WMTS).
    • By locating and drawing the underlying entities. You can add the data schema from a JSON schema file in order to edit the meatadata (i.e. properties) of your entities.
    • By import existing data from a GeoJSON file.
  • Probe weather forecast data from active prediction models by selecting a specific location on the map.

👉 Launch the main tutorial from the main menu then open the link to the FAB tutorial to get more details

Contextual menu

A right-click on a feature of the map will display a contextual menu if some actions are available for the target element like editing the properties of a user-defined feature or remove it.

Layer actions

Depending on the layer different actions are available. The most common action is to zoom to the layer in order to fit the view on the available data. If the layer is disabled at high scales this action will set the current scale of the map so that data will start be visible if the layer is shown.

More actions are available on user-defined feature layers:

  • save the layer (i.e. make it persistent),
  • edit layer properties like its name or description,
  • edit layer features (metadata and geometry),
  • edit display style,
  • filter data according to metadata,
  • display raw data,
  • create charts,
  • delete the layer.
+ \ No newline at end of file diff --git a/guides/installing-kano.html b/guides/installing-kano.html index e4ce3879..a7db8b41 100644 --- a/guides/installing-kano.html +++ b/guides/installing-kano.html @@ -5,491 +5,257 @@ Installing Kano | Kano - + + - - - - - + + + + + -
Skip to content

Installing Kano

Using Docker

WARNING

This requires you to install Docker, the world’s leading software container platform.

We provide Docker images on the Docker Hub to ease deploying your own instance. To run correctly it has to be linked with a standard MongoDB container for the database. Although it's possible to directly run Docker commands we provide you with docker-compose files to ease deployment, in addition to minimalist configuration files. These files will be detailed in the following sections and are available in the public folder of the documentation.

Jump into the folder with the docker-compose and configuration files, the following commands should do the job:

bash
// Run the MongoDB and Kano containers
-docker-compose up -d
+    
Skip to content

Installing Kano

Using Docker

WARNING

This requires you to install Docker, the world’s leading software container platform.

We provide Docker images on the Docker Hub to ease deploying your own instance. To run correctly it has to be linked with a standard MongoDB container for the database. Although it's possible to directly run Docker commands we provide you with docker-compose files to ease deployment, in addition to minimalist configuration files. These files will be detailed in the following sections and are available in the public folder of the documentation.

Jump into the folder with the docker-compose and configuration files, the following commands should do the job:

bash
// Run the MongoDB and Kano containers
+docker-compose up -d
 
-// Stop the MongoDB and Kano containers
-docker-compose down
-// Stop the MongoDB and Kano containers erasing DB data
-docker-compose down -v
// Run the MongoDB and Kano containers
-docker-compose up -d
+// Stop the MongoDB and Kano containers
+docker-compose down
+// Stop the MongoDB and Kano containers erasing DB data
+docker-compose down -v

Then point your browser to localhost:8080. You should see something like this once connected:

installation

TIP

Check the local.cjs configuration file below to find the required login information

WARNING

If running Docker under Windows in a virtual machine first redirect the port 8080 of your virtual machine to your host

docker-compose.yml - Used to deploy MongoDB and Kano containers.
yml
version: '3.3'
 
-// Stop the MongoDB and Kano containers
-docker-compose down
-// Stop the MongoDB and Kano containers erasing DB data
-docker-compose down -v

Then point your browser to localhost:8080. You should see something like this once connected:

installation

TIP

Check the local.cjs configuration file below to find the required login information

WARNING

If running Docker under Windows in a virtual machine first redirect the port 8080 of your virtual machine to your host

docker-compose.yml - Used to deploy MongoDB and Kano containers.
yml
version: '3.3'
+services:
+  kano:
+    image: kalisio/kano:dev
+    environment:
+      - APP_SECRET=xxx
+      - LAYERS_FILTER=OSM PLAN_IGN CESIUM_ELLIPSOID
+      - BUILD_NUMBER
+      - NODE_APP_INSTANCE
+      - DB_URL=mongodb://mongodb:27017/kano
+      - DATA_DB_URL
+      - CESIUM_TOKEN=xxx
+      - MAPILLARY_TOKEN=xxx
+    volumes:
+      - type: bind
+        source: ./my-layers.cjs
+        target: /opt/kalisio/kano/api/config/layers/my-layers.cjs
+      - type: bind
+        source: ./local-kano.cjs
+        target: /opt/kalisio/kano/api/config/local.cjs
+    ports:
+      - "8080:8081"
+    networks:
+      - kano
+  mongodb:
+    image: mongo:4.2
+    volumes:
+      - mongodb:/data/db
+    ports:
+      - "27017:27017"
+    networks:
+      - kano
 
-services:
-  kano:
-    image: kalisio/kano:dev
-    environment:
-      - APP_SECRET=xxx
-      - LAYERS_FILTER=OSM PLAN_IGN CESIUM_ELLIPSOID
-      - BUILD_NUMBER
-      - NODE_APP_INSTANCE
-      - DB_URL=mongodb://mongodb:27017/kano
-      - DATA_DB_URL
-      - CESIUM_TOKEN=xxx
-      - MAPILLARY_TOKEN=xxx
-    volumes:
-      - type: bind
-        source: ./my-layers.cjs
-        target: /opt/kalisio/kano/api/config/layers/my-layers.cjs
-      - type: bind
-        source: ./local-kano.cjs
-        target: /opt/kalisio/kano/api/config/local.cjs
-    ports:
-      - "8080:8081"
-    networks:
-      - kano
-  mongodb:
-    image: mongo:4.2
-    volumes:
-      - mongodb:/data/db
-    ports:
-      - "27017:27017"
-    networks:
-      - kano
+volumes:
+  mongodb:
 
-volumes:
-  mongodb:
+networks:
+  kano:

Kano comes with a default set of users but you should change this default configuration for a public deployment and avoid leaking login/passwords. Similarly, Kano comes with a default set of layers targeting geospatial services deployed by Kargo and you should add your own data layers instead. This is done by configuration using the following files:

local.cjs - Used to override the default backend configuration and setup a default user.

To be put in the kano/api/config directory.

cjs
module.exports = {
+  authentication: {
+    defaultUsers: [
+      {
+        email: process.env.DEFAULT_USER_EMAIL || 'john.doe@gmail.com',
+        password: process.env.DEFAULT_USER_PASSWORD || 'John;Doe1',
+        name: 'John Doe',
+        catalog: { permissions: 'owner' }, // Grant admin rights to update catalog
+        layers: [{ // Grant admin rights to update layer data
+          name: 'Layers.SENSORS',
+          permissions: 'manager',
+          probeService: 'sensors-stations',
+          service: 'sensors-observations'
+        }]
+      }
+    ]
+  }
+}
my-layers.cjs - Used to define the available default layers.

To be put in the kano/api/config/layers directory. Example based on OpenStreeetMap tile servers and IGN web services.

cjs
module.exports = [{
+    name: 'Layers.OSM',
+    description: 'Layers.OSM_DESCRIPTION',
+    i18n: {
+      fr: {
+        Layers: {
+          OSM: 'OSM',
+          OSM_DESCRIPTION: 'Données OpenStreetMap'
+        }
+      },
+      en: {
+        Layers: {
+          OSM: 'OSM',
+          OSM_DESCRIPTION: 'OpenStreeMap data'
+        }
+      }
+    },
+    tags: [
+      'street'
+    ],
+    iconUrl: `http://a.tile.osm.org/0/0/0.png`,
+    icon: 'streetview',
+    attribution: 'OpenStreetMap © <a href="http://openstreetmap.org">OpenStreetMap</a> contributors',
+    type: 'BaseLayer',
+    leaflet: {
+      type: 'tileLayer',
+      isVisible: true,
+      source: 'http://{s}.tile.osm.org/{z}/{x}/{y}.png',
+      maxZoom: 21,
+      maxNativeZoom: 18
+    },
+    cesium: {
+      type: 'OpenStreetMap',
+      url: `http://a.tile.osm.org`
+    }
+  },
+  {
+    name: 'Layers.PLAN_IGN',
+    description: 'Layers.PLAN_IGN_DESCRIPTION',
+    i18n: {
+      fr: {
+        Layers: {
+          PLAN_IGN: 'Plan IGN',
+          PLAN_IGN_DESCRIPTION: 'Plan IGN v2'
+        }
+      },
+      en: {
+        Layers: {
+          PLAN_IGN: 'Plan IGN',
+          PLAN_IGN_DESCRIPTION: 'Plan IGN v2'
+        }
+      }
+    },
+    tags: [
+      'street'
+    ],
+    type: 'BaseLayer',
+    iconUrl: 'https://wxs.ign.fr/cartes/geoportail/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=GEOGRAPHICALGRIDSYSTEMS.PLANIGNV2&STYLE=normal&FORMAT=image/png&TILEMATRIXSET=PM&TILEMATRIX=8&TILEROW=92&TILECOL=132',
+    icon: 'las la-plug',
+    attribution: '<a href="https://www.ign.fr/">IGN</a>',
+    cesium: {
+      type: 'WebMapTileService',
+      url: 'https://wxs.ign.fr/cartes/geoportail/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=GEOGRAPHICALGRIDSYSTEMS.PLANIGNV2&STYLE=normal&FORMAT=image/png&TILEMATRIXSET=PM&TILEMATRIX={TileMatrix}&TILEROW={TileRow}&TILECOL={TileCol}',
+      format: 'image/png',
+      layer: 'GEOGRAPHICALGRIDSYSTEMS.PLANIGNV2',
+      style: 'normal',
+      tileMatrixSetID: 'PM'
+    },
+    leaflet: {
+      type: 'tileLayer',
+      source: 'https://wxs.ign.fr/cartes/geoportail/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=GEOGRAPHICALGRIDSYSTEMS.PLANIGNV2&STYLE=normal&FORMAT=image/png&TILEMATRIXSET=PM&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}',
+    }
+  }
+]

As detailed in the KDK documentation Kano comes into three different flavors. By default the docker-compose file targets the latest development version (dev tag) but you can change it to target either a beta (test tag) or a production (prod tag) release.

WARNING

By default no built-in layers are available in Kano unless you specify their names using the LAYERS_FILTER environment variable. By defining LAYERS_FILTER=* you will get all built-in layers but take care that a lot of them requires additional services to work correctly (read following sections below). You can however directly add new layers using the Kano GUI (through the add layer button or by drag'n'drop on the map).

TIP

If you'd like to use the 3D mode or the Mapillary layer you should provide the required tokens to access their respective APIs on the backend side by setting the following environment variables: CESIUM_TOKEN, MAPILLARY_TOKEN.

Add weather forecasts

Kano integrates smoothly with Weacast in order to display weather forecast data. You can also use Docker containers to run Weacast by following this guide and taking care of port conflicts as they use the same by default.

The following commands and additional docker-compose file should do the job:

bash
// Run the MongoDB, Weacast and Kano containers
+docker-compose -f docker-compose.yml -f docker-compose-weacast.yml up -d
 
-networks:
-  kano:
version: '3.3'
+// Stop the MongoDB, Weacast and Kano containers
+docker-compose -f docker-compose.yml -f docker-compose-weacast.yml down 
+// Stop the MongoDB, Weacast and Kano containers erasing DB data
+docker-compose -f docker-compose.yml -f docker-compose-weacast.yml down -v

Wait a couple of minutes so that Weacast feeds the database with the latest forecast then point your browser to localhost:8080. You should see something like this once connected if you display some meteorological layers and probe a location:

installation

docker-compose-weacast.yml - Used to deploy Weacast container.
yml
version: '3.3'
 
-services:
-  kano:
-    image: kalisio/kano:dev
-    environment:
-      - APP_SECRET=xxx
-      - LAYERS_FILTER=OSM PLAN_IGN CESIUM_ELLIPSOID
-      - BUILD_NUMBER
-      - NODE_APP_INSTANCE
-      - DB_URL=mongodb://mongodb:27017/kano
-      - DATA_DB_URL
-      - CESIUM_TOKEN=xxx
-      - MAPILLARY_TOKEN=xxx
-    volumes:
-      - type: bind
-        source: ./my-layers.cjs
-        target: /opt/kalisio/kano/api/config/layers/my-layers.cjs
-      - type: bind
-        source: ./local-kano.cjs
-        target: /opt/kalisio/kano/api/config/local.cjs
-    ports:
-      - "8080:8081"
-    networks:
-      - kano
-  mongodb:
-    image: mongo:4.2
-    volumes:
-      - mongodb:/data/db
-    ports:
-      - "27017:27017"
-    networks:
-      - kano
+services:
+  kano:
+    environment:
+      - LAYERS_FILTER=OSM PLAN_IGN WIND_TILED GUST_TILED PRECIPITATIONS_TILED TEMPERATURE_TILED CESIUM_ELLIPSOID
+  weacast:
+    image: weacast/weacast-api:dev
+    environment:
+      - APP_SECRET=yyy
+      - DB_URL=mongodb://mongodb:27017/weacast
+      - LOADERS=gfs
+      - LOG_LEVEL
+      - DEBUG
+    ports:
+      - "8081:8081"
+    networks:
+      - kano

TIP

You should activate the built-in Weacast layers like WIND_TILED in Kano using the LAYERS_FILTER environment variable.

Add krawler jobs

Kano integrates smoothly with Krawler jobs in order to feed data for near real-time measurements/observations layers. A lot of built-in layers requires the associated job(s) to be deployed beside Kano. You can search for available jobs in our GitHub organisation and find more information about available layers in the Kalisio Crisis catalog.

For the purpose of this documentation we will focus on the k-hubeau hydro jobs but others jobs work similarly. The following commands and additional docker-compose file should do the job:

bash
// Run the MongoDB, Hubeau jobs and Kano containers
+docker-compose -f docker-compose.yml -f docker-compose-hubeau.yml up -d
 
-volumes:
-  mongodb:
+// Stop the MongoDB, Hubeau jobs and Kano containers
+docker-compose -f docker-compose.yml -f docker-compose-hubeau.yml down 
+// Stop the MongoDB, Hubeau jobs and Kano containers erasing DB data
+docker-compose -f docker-compose.yml -f docker-compose-hubeau.yml down -v

Wait a couple of minutes so that the jobs feeds the database with the latest observations then point your browser to localhost:8080. You should see something like this once connected if you display the observations layer, zoom in and pick a station:

installation

docker-compose-hubeau.yml - Used to deploy Hubeau jobs containers.
yml
version: '3.3'
 
-networks:
-  kano:

Kano comes with a default set of users but you should change this default configuration for a public deployment and avoid leaking login/passwords. Similarly, Kano comes with a default set of layers targeting geospatial services deployed by Kargo and you should add your own data layers instead. This is done by configuration using the following files:

local.cjs - Used to override the default backend configuration and setup a default user.

To be put in the kano/api/config directory.

cjs
module.exports = {
-  authentication: {
-    defaultUsers: [
-      {
-        email: process.env.DEFAULT_USER_EMAIL || 'john.doe@gmail.com',
-        password: process.env.DEFAULT_USER_PASSWORD || 'John;Doe1',
-        name: 'John Doe',
-        catalog: { permissions: 'owner' }, // Grant admin rights to update catalog
-        layers: [{ // Grant admin rights to update layer data
-          name: 'Layers.SENSORS',
-          permissions: 'manager',
-          probeService: 'sensors-stations',
-          service: 'sensors-observations'
-        }]
-      }
-    ]
-  }
-}
module.exports = {
-  authentication: {
-    defaultUsers: [
-      {
-        email: process.env.DEFAULT_USER_EMAIL || 'john.doe@gmail.com',
-        password: process.env.DEFAULT_USER_PASSWORD || 'John;Doe1',
-        name: 'John Doe',
-        catalog: { permissions: 'owner' }, // Grant admin rights to update catalog
-        layers: [{ // Grant admin rights to update layer data
-          name: 'Layers.SENSORS',
-          permissions: 'manager',
-          probeService: 'sensors-stations',
-          service: 'sensors-observations'
-        }]
-      }
-    ]
-  }
-}
my-layers.cjs - Used to define the available default layers.

To be put in the kano/api/config/layers directory. Example based on OpenStreeetMap tile servers and IGN web services.

cjs
module.exports = [{
-    name: 'Layers.OSM',
-    description: 'Layers.OSM_DESCRIPTION',
-    i18n: {
-      fr: {
-        Layers: {
-          OSM: 'OSM',
-          OSM_DESCRIPTION: 'Données OpenStreetMap'
-        }
-      },
-      en: {
-        Layers: {
-          OSM: 'OSM',
-          OSM_DESCRIPTION: 'OpenStreeMap data'
-        }
-      }
-    },
-    tags: [
-      'street'
-    ],
-    iconUrl: `http://a.tile.osm.org/0/0/0.png`,
-    icon: 'streetview',
-    attribution: 'OpenStreetMap © <a href="http://openstreetmap.org">OpenStreetMap</a> contributors',
-    type: 'BaseLayer',
-    leaflet: {
-      type: 'tileLayer',
-      isVisible: true,
-      source: 'http://{s}.tile.osm.org/{z}/{x}/{y}.png',
-      maxZoom: 21,
-      maxNativeZoom: 18
-    },
-    cesium: {
-      type: 'OpenStreetMap',
-      url: `http://a.tile.osm.org`
-    }
-  },
-  {
-    name: 'Layers.PLAN_IGN',
-    description: 'Layers.PLAN_IGN_DESCRIPTION',
-    i18n: {
-      fr: {
-        Layers: {
-          PLAN_IGN: 'Plan IGN',
-          PLAN_IGN_DESCRIPTION: 'Plan IGN v2'
-        }
-      },
-      en: {
-        Layers: {
-          PLAN_IGN: 'Plan IGN',
-          PLAN_IGN_DESCRIPTION: 'Plan IGN v2'
-        }
-      }
-    },
-    tags: [
-      'street'
-    ],
-    type: 'BaseLayer',
-    iconUrl: 'https://wxs.ign.fr/cartes/geoportail/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=GEOGRAPHICALGRIDSYSTEMS.PLANIGNV2&STYLE=normal&FORMAT=image/png&TILEMATRIXSET=PM&TILEMATRIX=8&TILEROW=92&TILECOL=132',
-    icon: 'las la-plug',
-    attribution: '<a href="https://www.ign.fr/">IGN</a>',
-    cesium: {
-      type: 'WebMapTileService',
-      url: 'https://wxs.ign.fr/cartes/geoportail/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=GEOGRAPHICALGRIDSYSTEMS.PLANIGNV2&STYLE=normal&FORMAT=image/png&TILEMATRIXSET=PM&TILEMATRIX={TileMatrix}&TILEROW={TileRow}&TILECOL={TileCol}',
-      format: 'image/png',
-      layer: 'GEOGRAPHICALGRIDSYSTEMS.PLANIGNV2',
-      style: 'normal',
-      tileMatrixSetID: 'PM'
-    },
-    leaflet: {
-      type: 'tileLayer',
-      source: 'https://wxs.ign.fr/cartes/geoportail/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=GEOGRAPHICALGRIDSYSTEMS.PLANIGNV2&STYLE=normal&FORMAT=image/png&TILEMATRIXSET=PM&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}',
-    }
-  }
-]
module.exports = [{
-    name: 'Layers.OSM',
-    description: 'Layers.OSM_DESCRIPTION',
-    i18n: {
-      fr: {
-        Layers: {
-          OSM: 'OSM',
-          OSM_DESCRIPTION: 'Données OpenStreetMap'
-        }
-      },
-      en: {
-        Layers: {
-          OSM: 'OSM',
-          OSM_DESCRIPTION: 'OpenStreeMap data'
-        }
-      }
-    },
-    tags: [
-      'street'
-    ],
-    iconUrl: `http://a.tile.osm.org/0/0/0.png`,
-    icon: 'streetview',
-    attribution: 'OpenStreetMap © <a href="http://openstreetmap.org">OpenStreetMap</a> contributors',
-    type: 'BaseLayer',
-    leaflet: {
-      type: 'tileLayer',
-      isVisible: true,
-      source: 'http://{s}.tile.osm.org/{z}/{x}/{y}.png',
-      maxZoom: 21,
-      maxNativeZoom: 18
-    },
-    cesium: {
-      type: 'OpenStreetMap',
-      url: `http://a.tile.osm.org`
-    }
-  },
-  {
-    name: 'Layers.PLAN_IGN',
-    description: 'Layers.PLAN_IGN_DESCRIPTION',
-    i18n: {
-      fr: {
-        Layers: {
-          PLAN_IGN: 'Plan IGN',
-          PLAN_IGN_DESCRIPTION: 'Plan IGN v2'
-        }
-      },
-      en: {
-        Layers: {
-          PLAN_IGN: 'Plan IGN',
-          PLAN_IGN_DESCRIPTION: 'Plan IGN v2'
-        }
-      }
-    },
-    tags: [
-      'street'
-    ],
-    type: 'BaseLayer',
-    iconUrl: 'https://wxs.ign.fr/cartes/geoportail/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=GEOGRAPHICALGRIDSYSTEMS.PLANIGNV2&STYLE=normal&FORMAT=image/png&TILEMATRIXSET=PM&TILEMATRIX=8&TILEROW=92&TILECOL=132',
-    icon: 'las la-plug',
-    attribution: '<a href="https://www.ign.fr/">IGN</a>',
-    cesium: {
-      type: 'WebMapTileService',
-      url: 'https://wxs.ign.fr/cartes/geoportail/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=GEOGRAPHICALGRIDSYSTEMS.PLANIGNV2&STYLE=normal&FORMAT=image/png&TILEMATRIXSET=PM&TILEMATRIX={TileMatrix}&TILEROW={TileRow}&TILECOL={TileCol}',
-      format: 'image/png',
-      layer: 'GEOGRAPHICALGRIDSYSTEMS.PLANIGNV2',
-      style: 'normal',
-      tileMatrixSetID: 'PM'
-    },
-    leaflet: {
-      type: 'tileLayer',
-      source: 'https://wxs.ign.fr/cartes/geoportail/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=GEOGRAPHICALGRIDSYSTEMS.PLANIGNV2&STYLE=normal&FORMAT=image/png&TILEMATRIXSET=PM&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}',
-    }
-  }
-]

As detailed in the KDK documentation Kano comes into three different flavors. By default the docker-compose file targets the latest development version (dev tag) but you can change it to target either a beta (test tag) or a production (prod tag) release.

WARNING

By default no built-in layers are available in Kano unless you specify their names using the LAYERS_FILTER environment variable. By defining LAYERS_FILTER=* you will get all built-in layers but take care that a lot of them requires additional services to work correctly (read following sections below). You can however directly add new layers using the Kano GUI (through the add layer button or by drag'n'drop on the map).

TIP

If you'd like to use the 3D mode or the Mapillary layer you should provide the required tokens to access their respective APIs on the backend side by setting the following environment variables: CESIUM_TOKEN, MAPILLARY_TOKEN.

Add weather forecasts

Kano integrates smoothly with Weacast in order to display weather forecast data. You can also use Docker containers to run Weacast by following this guide and taking care of port conflicts as they use the same by default.

The following commands and additional docker-compose file should do the job:

bash
// Run the MongoDB, Weacast and Kano containers
-docker-compose -f docker-compose.yml -f docker-compose-weacast.yml up -d
+services:
+  kano:
+    environment:
+      - LAYERS_FILTER=OSM PLAN_IGN HUBEAU_HYDRO
+  hubeau-stations:
+    image: kalisio/k-hubeau:hydro-stations-latest
+    environment:
+      - DB_URL=mongodb://mongodb:27017/kano
+      - DEBUG
+    networks:
+      - kano
+  hubeau-observations:
+    image: kalisio/k-hubeau:hydro-observations-latest
+    environment:
+      - DB_URL=mongodb://mongodb:27017/kano
+      - DEBUG
+    depends_on:
+      hubeau-stations:
+        condition: service_healthy
+    networks:
+      - kano

TIP

You should activate the built-in Hub'Eau layers like HUBEAU_HYDRO in Kano using the LAYERS_FILTER environment variable.

From source code

First you have to ensure the KDK prerequisites to run Kano from source code.

WARNING

At the time of writing Kano v2.x (master branch) is expected to work with KDK modules v2.x (master branch and Node.js 16.x) and Kano v1.x (test branches) is expected to work with KDK modules v1.x (Node.js 12.x)

Then the following commands, assuming you have a MongoDB instance running on local host and default port (27017), should launch your local instance of Kano:

bash
// Clone KDK
+git clone https://github.com/kalisio/kdk.git
+cd kdk
+yarn install
+yarn link
 
-// Stop the MongoDB, Weacast and Kano containers
-docker-compose -f docker-compose.yml -f docker-compose-weacast.yml down 
-// Stop the MongoDB, Weacast and Kano containers erasing DB data
-docker-compose -f docker-compose.yml -f docker-compose-weacast.yml down -v
// Run the MongoDB, Weacast and Kano containers
-docker-compose -f docker-compose.yml -f docker-compose-weacast.yml up -d
+// In another terminal clone Kano
+git clone https://github.com/kalisio/kano.git
 
-// Stop the MongoDB, Weacast and Kano containers
-docker-compose -f docker-compose.yml -f docker-compose-weacast.yml down 
-// Stop the MongoDB, Weacast and Kano containers erasing DB data
-docker-compose -f docker-compose.yml -f docker-compose-weacast.yml down -v

Wait a couple of minutes so that Weacast feeds the database with the latest forecast then point your browser to localhost:8080. You should see something like this once connected if you display some meteorological layers and probe a location:

installation

docker-compose-weacast.yml - Used to deploy Weacast container.
yml
version: '3.3'
+// Set the most minimalist environment to run server
+export APP_SECRET="xxx"
+export LAYERS_FILTER="OSM PLAN_IGN CESIUM_ELLIPSOID"
 
-services:
-  kano:
-    environment:
-      - LAYERS_FILTER=OSM PLAN_IGN WIND_TILED GUST_TILED PRECIPITATIONS_TILED TEMPERATURE_TILED CESIUM_ELLIPSOID
-  weacast:
-    image: weacast/weacast-api:dev
-    environment:
-      - APP_SECRET=yyy
-      - DB_URL=mongodb://mongodb:27017/weacast
-      - LOADERS=gfs
-      - LOG_LEVEL
-      - DEBUG
-    ports:
-      - "8081:8081"
-    networks:
-      - kano
version: '3.3'
+// Run the server/API
+cd kano/api
+// Copy custom configuration files
+cp local.js config
+cp my-layers.js config/layers
+yarn install
+yarn link @kalisio/kdk
+yarn dev
 
-services:
-  kano:
-    environment:
-      - LAYERS_FILTER=OSM PLAN_IGN WIND_TILED GUST_TILED PRECIPITATIONS_TILED TEMPERATURE_TILED CESIUM_ELLIPSOID
-  weacast:
-    image: weacast/weacast-api:dev
-    environment:
-      - APP_SECRET=yyy
-      - DB_URL=mongodb://mongodb:27017/weacast
-      - LOADERS=gfs
-      - LOG_LEVEL
-      - DEBUG
-    ports:
-      - "8081:8081"
-    networks:
-      - kano

TIP

You should activate the built-in Weacast layers like WIND_TILED in Kano using the LAYERS_FILTER environment variable.

Add krawler jobs

Kano integrates smoothly with Krawler jobs in order to feed data for near real-time measurements/observations layers. A lot of built-in layers requires the associated job(s) to be deployed beside Kano. You can search for available jobs in our GitHub organisation and find more information about available layers in the Kalisio Crisis catalog.

For the purpose of this documentation we will focus on the k-hubeau hydro jobs but others jobs work similarly. The following commands and additional docker-compose file should do the job:

bash
// Run the MongoDB, Hubeau jobs and Kano containers
-docker-compose -f docker-compose.yml -f docker-compose-hubeau.yml up -d
+// In another terminal run the client app
+cd kano
+yarn install
+yarn link @kalisio/kdk
+yarn dev

Point your browser to localhost:8080.

Add weather forecasts

Instead of using Docker containers you can directly install Weacast from the source code as well by following this guide. You should however take care of port conflicts as it uses the same than Kano by default (API and NodeJS debugger), the following commands should do the job:

bash
// Clone Weacast
+git clone https://github.com/weacast/weacast.git
+cd weacast
+yarn install
 
-// Stop the MongoDB, Hubeau jobs and Kano containers
-docker-compose -f docker-compose.yml -f docker-compose-hubeau.yml down 
-// Stop the MongoDB, Hubeau jobs and Kano containers erasing DB data
-docker-compose -f docker-compose.yml -f docker-compose-hubeau.yml down -v
// Run the MongoDB, Hubeau jobs and Kano containers
-docker-compose -f docker-compose.yml -f docker-compose-hubeau.yml up -d
+// Set the most minimalist environment to run server
+export PORT="8082"
+export NODE_OPTIONS="--inspect-port=9230"
+export LOADERS="gfs"
 
-// Stop the MongoDB, Hubeau jobs and Kano containers
-docker-compose -f docker-compose.yml -f docker-compose-hubeau.yml down 
-// Stop the MongoDB, Hubeau jobs and Kano containers erasing DB data
-docker-compose -f docker-compose.yml -f docker-compose-hubeau.yml down -v

Wait a couple of minutes so that the jobs feeds the database with the latest observations then point your browser to localhost:8080. You should see something like this once connected if you display the observations layer, zoom in and pick a station:

installation

docker-compose-hubeau.yml - Used to deploy Hubeau jobs containers.
yml
version: '3.3'
-
-services:
-  kano:
-    environment:
-      - LAYERS_FILTER=OSM PLAN_IGN HUBEAU_HYDRO
-  hubeau-stations:
-    image: kalisio/k-hubeau:hydro-stations-latest
-    environment:
-      - DB_URL=mongodb://mongodb:27017/kano
-      - DEBUG
-    networks:
-      - kano
-  hubeau-observations:
-    image: kalisio/k-hubeau:hydro-observations-latest
-    environment:
-      - DB_URL=mongodb://mongodb:27017/kano
-      - DEBUG
-    depends_on:
-      hubeau-stations:
-        condition: service_healthy
-    networks:
-      - kano
version: '3.3'
-
-services:
-  kano:
-    environment:
-      - LAYERS_FILTER=OSM PLAN_IGN HUBEAU_HYDRO
-  hubeau-stations:
-    image: kalisio/k-hubeau:hydro-stations-latest
-    environment:
-      - DB_URL=mongodb://mongodb:27017/kano
-      - DEBUG
-    networks:
-      - kano
-  hubeau-observations:
-    image: kalisio/k-hubeau:hydro-observations-latest
-    environment:
-      - DB_URL=mongodb://mongodb:27017/kano
-      - DEBUG
-    depends_on:
-      hubeau-stations:
-        condition: service_healthy
-    networks:
-      - kano

TIP

You should activate the built-in Hub'Eau layers like HUBEAU_HYDRO in Kano using the LAYERS_FILTER environment variable.

From source code

First you have to ensure the KDK prerequisites to run Kano from source code.

WARNING

At the time of writing Kano v2.x (master branch) is expected to work with KDK modules v2.x (master branch and Node.js 16.x) and Kano v1.x (test branches) is expected to work with KDK modules v1.x (Node.js 12.x)

Then the following commands, assuming you have a MongoDB instance running on local host and default port (27017), should launch your local instance of Kano:

bash
// Clone KDK
-git clone https://github.com/kalisio/kdk.git
-cd kdk
-yarn install
-yarn link
-
-// In another terminal clone Kano
-git clone https://github.com/kalisio/kano.git
-
-// Set the most minimalist environment to run server
-export APP_SECRET="xxx"
-export LAYERS_FILTER="OSM PLAN_IGN CESIUM_ELLIPSOID"
-
-// Run the server/API
-cd kano/api
-// Copy custom configuration files
-cp local.js config
-cp my-layers.js config/layers
-yarn install
-yarn link @kalisio/kdk
-yarn dev
-
-// In another terminal run the client app
-cd kano
-yarn install
-yarn link @kalisio/kdk
-yarn dev
// Clone KDK
-git clone https://github.com/kalisio/kdk.git
-cd kdk
-yarn install
-yarn link
-
-// In another terminal clone Kano
-git clone https://github.com/kalisio/kano.git
-
-// Set the most minimalist environment to run server
-export APP_SECRET="xxx"
-export LAYERS_FILTER="OSM PLAN_IGN CESIUM_ELLIPSOID"
-
-// Run the server/API
-cd kano/api
-// Copy custom configuration files
-cp local.js config
-cp my-layers.js config/layers
-yarn install
-yarn link @kalisio/kdk
-yarn dev
-
-// In another terminal run the client app
-cd kano
-yarn install
-yarn link @kalisio/kdk
-yarn dev

Point your browser to localhost:8080.

Add weather forecasts

Instead of using Docker containers you can directly install Weacast from the source code as well by following this guide. You should however take care of port conflicts as it uses the same than Kano by default (API and NodeJS debugger), the following commands should do the job:

bash
// Clone Weacast
-git clone https://github.com/weacast/weacast.git
-cd weacast
-yarn install
-
-// Set the most minimalist environment to run server
-export PORT="8082"
-export NODE_OPTIONS="--inspect-port=9230"
-export LOADERS="gfs"
-
-// Run the server/API
-cd packages/api
-yarn dev
// Clone Weacast
-git clone https://github.com/weacast/weacast.git
-cd weacast
-yarn install
-
-// Set the most minimalist environment to run server
-export PORT="8082"
-export NODE_OPTIONS="--inspect-port=9230"
-export LOADERS="gfs"
-
-// Run the server/API
-cd packages/api
-yarn dev

TIP

You should activate the built-in Weacast layers like WIND_TILED in Kano using the LAYERS_FILTER environment variable.

Add krawler jobs

Instead of using Docker containers you can directly install Krawler from the source code as well by following this guide and retrieve/run required jobs manually, it's notably useful when developing new jobs:

bash
git clone https://github.com/kalisio/krawler
-cd krawler
-yarn install
-yarn link
-// Now you can proceed with your jobs
-git clone https://github.com/kalisio/k-hubeau
-yarn install
-yarn link @kalisio/krawler
-// Set the most minimalist environment to run the jobs
-export DB_URL=mongodb://mongodb:27017/kano
-// Now you can launch the jobs manually using the krawler CLI
-krawler ./jobfile-hydro-stations.js
-krawler ./jobfile-hydro-observations.js
git clone https://github.com/kalisio/krawler
-cd krawler
-yarn install
-yarn link
-// Now you can proceed with your jobs
-git clone https://github.com/kalisio/k-hubeau
-yarn install
-yarn link @kalisio/krawler
-// Set the most minimalist environment to run the jobs
-export DB_URL=mongodb://mongodb:27017/kano
-// Now you can launch the jobs manually using the krawler CLI
-krawler ./jobfile-hydro-stations.js
-krawler ./jobfile-hydro-observations.js
- +// Run the server/API +cd packages/api +yarn dev

TIP

You should activate the built-in Weacast layers like WIND_TILED in Kano using the LAYERS_FILTER environment variable.

Add krawler jobs

Instead of using Docker containers you can directly install Krawler from the source code as well by following this guide and retrieve/run required jobs manually, it's notably useful when developing new jobs:

bash
git clone https://github.com/kalisio/krawler
+cd krawler
+yarn install
+yarn link
+// Now you can proceed with your jobs
+git clone https://github.com/kalisio/k-hubeau
+yarn install
+yarn link @kalisio/krawler
+// Set the most minimalist environment to run the jobs
+export DB_URL=mongodb://mongodb:27017/kano
+// Now you can launch the jobs manually using the krawler CLI
+krawler ./jobfile-hydro-stations.js
+krawler ./jobfile-hydro-observations.js
+ \ No newline at end of file diff --git a/guides/installing-services.html b/guides/installing-services.html index c96ca463..e65bc8dd 100644 --- a/guides/installing-services.html +++ b/guides/installing-services.html @@ -5,207 +5,115 @@ Installing services | Kano - + + - - - - - + + + + + -
Skip to content

Installing services

Using Kargo

You can easily connect Kano with geospatial services deployed by Kargo through its API gateway. First add the Kano application/consumer in the gateway configuration by generating a UUID:

users: {
-  my_user: {
-    'kano': {
-      scopes: ['wms', 'wmts', 'tms', 'wfs', 'wcs', 'k2'],
-      credential: {
-        type: 'jwt',
-        keyId: '9ba09ead-23e1-4020-9994-aa9130782b09',
-        keySecret: '${APP_SECRET}'
-      }
-    }
-  }
-}
users: {
-  my_user: {
-    'kano': {
-      scopes: ['wms', 'wmts', 'tms', 'wfs', 'wcs', 'k2'],
-      credential: {
-        type: 'jwt',
-        keyId: '9ba09ead-23e1-4020-9994-aa9130782b09',
-        keySecret: '${APP_SECRET}'
-      }
-    }
-  }
-}

Then add the following environment variables before launching the Kano backend:

bash
// Setup the target gateway
-export API_GATEWAY_URL="https://api.your.kargo.domain"
-export APP_ID="9ba09ead-23e1-4020-9994-aa9130782b09"
-yarn dev
// Setup the target gateway
-export API_GATEWAY_URL="https://api.your.kargo.domain"
-export APP_ID="9ba09ead-23e1-4020-9994-aa9130782b09"
-yarn dev

This will automatically generate a valid token for the gateway once you log in and add it to any request targeting a service behind the gateway.

Kargo can also automatically deploy for you krawler jobs, Kapture, Geokoder, K2, etc. as services.

Using Docker

As for Kano we provide Docker images on the Docker Hub to ease deploying your own service instances. Although it's possible to directly run Docker commands we provide you with docker-compose files to ease deployment, in addition to minimalist configuration files. These files will be detailed in the following sections and are available in the public folder of the documentation.

Add gateway

The following commands and additional docker-compose file should do the job:

bash
// Run the Gateway and Kano containers
-docker-compose -f docker-compose.yml -f docker-compose-gateway.yml up -d
-// Stop the Gateway and Kano containers
-docker-compose -f docker-compose.yml -f docker-compose-gateway.yml down
-// Stop the Gateway and Kano containers erasing DB data
-docker-compose -f docker-compose.yml -f docker-compose-gateway.yml down -v
// Run the Gateway and Kano containers
-docker-compose -f docker-compose.yml -f docker-compose-gateway.yml up -d
-// Stop the Gateway and Kano containers
-docker-compose -f docker-compose.yml -f docker-compose-gateway.yml down
-// Stop the Gateway and Kano containers erasing DB data
-docker-compose -f docker-compose.yml -f docker-compose-gateway.yml down -v
docker-compose-gateway.yml - Used to deploy gateway container.
yml
version: '3.3'
+    
Skip to content

Installing services

Using Kargo

You can easily connect Kano with geospatial services deployed by Kargo through its API gateway. First add the Kano application/consumer in the gateway configuration by generating a UUID:

users: {
+  my_user: {
+    'kano': {
+      scopes: ['wms', 'wmts', 'tms', 'wfs', 'wcs', 'k2'],
+      credential: {
+        type: 'jwt',
+        keyId: '9ba09ead-23e1-4020-9994-aa9130782b09',
+        keySecret: '${APP_SECRET}'
+      }
+    }
+  }
+}

Then add the following environment variables before launching the Kano backend:

bash
// Setup the target gateway
+export API_GATEWAY_URL="https://api.your.kargo.domain"
+export APP_ID="9ba09ead-23e1-4020-9994-aa9130782b09"
+yarn dev

This will automatically generate a valid token for the gateway once you log in and add it to any request targeting a service behind the gateway.

Kargo can also automatically deploy for you krawler jobs, Kapture, Geokoder, K2, etc. as services.

Using Docker

As for Kano we provide Docker images on the Docker Hub to ease deploying your own service instances. Although it's possible to directly run Docker commands we provide you with docker-compose files to ease deployment, in addition to minimalist configuration files. These files will be detailed in the following sections and are available in the public folder of the documentation.

Add gateway

The following commands and additional docker-compose file should do the job:

bash
// Run the Gateway and Kano containers
+docker-compose -f docker-compose.yml -f docker-compose-gateway.yml up -d
+// Stop the Gateway and Kano containers
+docker-compose -f docker-compose.yml -f docker-compose-gateway.yml down
+// Stop the Gateway and Kano containers erasing DB data
+docker-compose -f docker-compose.yml -f docker-compose-gateway.yml down -v
docker-compose-gateway.yml - Used to deploy gateway container.
yml
version: '3.3'
 
-services:
-  kano:
-    environment:
-      - API_GATEWAY_URL=http://localhost:8082
-  gateway:
-    image: kalisio/express-gateway:1.16.9
-    environment:
-      - KAPTURE_URL=http://kapture:3000
-      - GEOKODER_URL=http://geokoder:8080
-    volumes:
-      - type: bind
-        source: ./gateway.config.yml
-        target: /var/lib/eg/gateway.config.yml
-    ports:
-      - "8082:8080"
-    networks:
-      - kano
version: '3.3'
+services:
+  kano:
+    environment:
+      - API_GATEWAY_URL=http://localhost:8082
+  gateway:
+    image: kalisio/express-gateway:1.16.9
+    environment:
+      - KAPTURE_URL=http://kapture:3000
+      - GEOKODER_URL=http://geokoder:8080
+    volumes:
+      - type: bind
+        source: ./gateway.config.yml
+        target: /var/lib/eg/gateway.config.yml
+    ports:
+      - "8082:8080"
+    networks:
+      - kano

Add kapture

Kano integrates smoothly with Kapture in order to perform customizable screenshots, i.e. map prints.

The following commands and additional docker-compose file should do the job:

bash
// Run the Gateway, Kapture and Kano containers
+docker-compose -f docker-compose.yml -f docker-compose-gateway.yml -f docker-compose-kapture.yml up -d
+// Stop the Gateway, Kapture and Kano containers
+docker-compose -f docker-compose.yml -f docker-compose-gateway.yml -f docker-compose-kapture.yml down
+// Stop the Gateway, Kapture and Kano containers erasing DB data
+docker-compose -f docker-compose.yml -f docker-compose-gateway.yml -f docker-compose-kapture.yml down -v
docker-compose-kapture.yml - Used to deploy kapture container.
yml
version: '3.3'
 
-services:
-  kano:
-    environment:
-      - API_GATEWAY_URL=http://localhost:8082
-  gateway:
-    image: kalisio/express-gateway:1.16.9
-    environment:
-      - KAPTURE_URL=http://kapture:3000
-      - GEOKODER_URL=http://geokoder:8080
-    volumes:
-      - type: bind
-        source: ./gateway.config.yml
-        target: /var/lib/eg/gateway.config.yml
-    ports:
-      - "8082:8080"
-    networks:
-      - kano

Add kapture

Kano integrates smoothly with Kapture in order to perform customizable screenshots, i.e. map prints.

The following commands and additional docker-compose file should do the job:

bash
// Run the Gateway, Kapture and Kano containers
-docker-compose -f docker-compose.yml -f docker-compose-gateway.yml -f docker-compose-kapture.yml up -d
-// Stop the Gateway, Kapture and Kano containers
-docker-compose -f docker-compose.yml -f docker-compose-gateway.yml -f docker-compose-kapture.yml down
-// Stop the Gateway, Kapture and Kano containers erasing DB data
-docker-compose -f docker-compose.yml -f docker-compose-gateway.yml -f docker-compose-kapture.yml down -v
// Run the Gateway, Kapture and Kano containers
-docker-compose -f docker-compose.yml -f docker-compose-gateway.yml -f docker-compose-kapture.yml up -d
-// Stop the Gateway, Kapture and Kano containers
-docker-compose -f docker-compose.yml -f docker-compose-gateway.yml -f docker-compose-kapture.yml down
-// Stop the Gateway, Kapture and Kano containers erasing DB data
-docker-compose -f docker-compose.yml -f docker-compose-gateway.yml -f docker-compose-kapture.yml down -v
docker-compose-kapture.yml - Used to deploy kapture container.
yml
version: '3.3'
+services:
+  kapture:
+    image: kalisio/kapture:latest
+    environment:
+      - KANO_URL=http://kano:8081
+      - KANO_JWT=eyJhbGciOiJIUzI1NiIsInR5cCI6ImFjY2VzcyJ9.eyJhdWQiOiJrYWxpc2lvIiwiaXNzIjoia2FsaXNpbyJ9._HslaK0hTlISw_wGkUJYmpZdcNuWWGB1iHJDApeJxWk
+      - DEBUG=kapture*
+    ports:
+      - "8083:3000"
+    networks:
+      - kano

Add geokoder

Kano integrates smoothly with Geokoder in order to perform geocoding.

The following commands and additional docker-compose file should do the job:

bash
// Run the Gateway, Geokoder and Kano containers
+docker-compose -f docker-compose.yml -f docker-compose-gateway.yml -f docker-compose-geokoder.yml up -d
+// Stop the Gateway, Geokoder and Kano containers
+docker-compose -f docker-compose.yml -f docker-compose-gateway.yml -f docker-compose-geokoder.yml down
+// Stop the Gateway, Geokoder and Kano containers erasing DB data
+docker-compose -f docker-compose.yml -f docker-compose-gateway.yml -f docker-compose-geokoder.yml down -v
docker-compose-geokoder.yml - Used to deploy geokoder container.
yml
version: '3.3'
 
-services:
-  kapture:
-    image: kalisio/kapture:latest
-    environment:
-      - KANO_URL=http://kano:8081
-      - KANO_JWT=eyJhbGciOiJIUzI1NiIsInR5cCI6ImFjY2VzcyJ9.eyJhdWQiOiJrYWxpc2lvIiwiaXNzIjoia2FsaXNpbyJ9._HslaK0hTlISw_wGkUJYmpZdcNuWWGB1iHJDApeJxWk
-      - DEBUG=kapture*
-    ports:
-      - "8083:3000"
-    networks:
-      - kano
version: '3.3'
-
-services:
-  kapture:
-    image: kalisio/kapture:latest
-    environment:
-      - KANO_URL=http://kano:8081
-      - KANO_JWT=eyJhbGciOiJIUzI1NiIsInR5cCI6ImFjY2VzcyJ9.eyJhdWQiOiJrYWxpc2lvIiwiaXNzIjoia2FsaXNpbyJ9._HslaK0hTlISw_wGkUJYmpZdcNuWWGB1iHJDApeJxWk
-      - DEBUG=kapture*
-    ports:
-      - "8083:3000"
-    networks:
-      - kano

Add geokoder

Kano integrates smoothly with Geokoder in order to perform geocoding.

The following commands and additional docker-compose file should do the job:

bash
// Run the Gateway, Geokoder and Kano containers
-docker-compose -f docker-compose.yml -f docker-compose-gateway.yml -f docker-compose-geokoder.yml up -d
-// Stop the Gateway, Geokoder and Kano containers
-docker-compose -f docker-compose.yml -f docker-compose-gateway.yml -f docker-compose-geokoder.yml down
-// Stop the Gateway, Geokoder and Kano containers erasing DB data
-docker-compose -f docker-compose.yml -f docker-compose-gateway.yml -f docker-compose-geokoder.yml down -v
// Run the Gateway, Geokoder and Kano containers
-docker-compose -f docker-compose.yml -f docker-compose-gateway.yml -f docker-compose-geokoder.yml up -d
-// Stop the Gateway, Geokoder and Kano containers
-docker-compose -f docker-compose.yml -f docker-compose-gateway.yml -f docker-compose-geokoder.yml down
-// Stop the Gateway, Geokoder and Kano containers erasing DB data
-docker-compose -f docker-compose.yml -f docker-compose-gateway.yml -f docker-compose-geokoder.yml down -v
docker-compose-geokoder.yml - Used to deploy geokoder container.
yml
version: '3.3'
-
-services:
-  geokoder:
-    image: kalisio/geokoder:latest
-    environment:
-      - DEBUG=geokoder*
-    volumes:
-      - type: bind
-        source: ./local-geokoder.cjs
-        target: /geokoder/config/local.cjs
-    ports:
-      - "8084:8080"
-    networks:
-      - kano
version: '3.3'
-
-services:
-  geokoder:
-    image: kalisio/geokoder:latest
-    environment:
-      - DEBUG=geokoder*
-    volumes:
-      - type: bind
-        source: ./local-geokoder.cjs
-        target: /geokoder/config/local.cjs
-    ports:
-      - "8084:8080"
-    networks:
-      - kano

Add k2

Coming soon

From source code

First you have to ensure the KDK prerequisites to run services from source code.

Add gateway

As the goal here is not to test, inspect or develop the gateway itself, but rather the underlying services, we will run the gateway using a Docker container in host network mode to ensure it can access services deployed on your localhost:

bash
docker run --name="gateway" --network="host" --rm --init -it -e "PORT=8082" -e "KAPTURE_URL=http://localhost:8083" -e "GEOKODER_URL=http://localhost:8084" --mount type=bind,source=./gateway.config.yml,target=/var/lib/eg/gateway.config.yml,readonly kalisio/express-gateway:1.16.9
docker run --name="gateway" --network="host" --rm --init -it -e "PORT=8082" -e "KAPTURE_URL=http://localhost:8083" -e "GEOKODER_URL=http://localhost:8084" --mount type=bind,source=./gateway.config.yml,target=/var/lib/eg/gateway.config.yml,readonly kalisio/express-gateway:1.16.9

TIP

To get details about the gateway.config.yml file used to deploy gateway container please refer to the previous Docker-based section.

After launching the gateway change the following environment variables before launching the Kano backend:

bash
// Setup the target gateway
-export API_GATEWAY_URL="http://localhost:8082"
-yarn dev
// Setup the target gateway
-export API_GATEWAY_URL="http://localhost:8082"
-yarn dev

Add kapture

Once Kano and the gateway are running, the following commands should launch your local instance of Kapture:

bash
// Clone Kapture
-git clone https://github.com/kalisio/geokoder.git
-cd geokoder
-yarn install
-// Set the most minimalist environment to run server
-export PORT="8083"
-export NODE_OPTIONS="--inspect-port=9233"
-export KANO_URL="http://localhost:8080"
-export KANO_JWT="eyJhbGciOiJIUzI1NiIsInR5cCI6ImFjY2VzcyJ9.eyJhdWQiOiJrYWxpc2lvIiwiaXNzIjoia2FsaXNpbyJ9._HslaK0hTlISw_wGkUJYmpZdcNuWWGB1iHJDApeJxWk"
-yarn dev
// Clone Kapture
-git clone https://github.com/kalisio/geokoder.git
-cd geokoder
-yarn install
-// Set the most minimalist environment to run server
-export PORT="8083"
-export NODE_OPTIONS="--inspect-port=9233"
-export KANO_URL="http://localhost:8080"
-export KANO_JWT="eyJhbGciOiJIUzI1NiIsInR5cCI6ImFjY2VzcyJ9.eyJhdWQiOiJrYWxpc2lvIiwiaXNzIjoia2FsaXNpbyJ9._HslaK0hTlISw_wGkUJYmpZdcNuWWGB1iHJDApeJxWk"
-yarn dev

Add geokoder

Once Kano and the gateway is running, the following commands should launch your local instance of Geokoder:

bash
// Clone Geokoder
-git clone https://github.com/kalisio/geokoder.git
-cd geokoder
-yarn install
-// Copy local configuration (see previous Docker-based deployment section)
-cp local-geokoder.cjs ./config/local.cjs
-// Set the most minimalist environment to run server
-export PORT="8084"
-export NODE_OPTIONS="--inspect-port=9234"
-yarn dev
// Clone Geokoder
-git clone https://github.com/kalisio/geokoder.git
-cd geokoder
-yarn install
-// Copy local configuration (see previous Docker-based deployment section)
-cp local-geokoder.cjs ./config/local.cjs
-// Set the most minimalist environment to run server
-export PORT="8084"
-export NODE_OPTIONS="--inspect-port=9234"
-yarn dev

Add k2

Coming soon

- +services: + geokoder: + image: kalisio/geokoder:latest + environment: + - DEBUG=geokoder* + volumes: + - type: bind + source: ./local-geokoder.cjs + target: /geokoder/config/local.cjs + ports: + - "8084:8080" + networks: + - kano

Add k2

Coming soon

From source code

First you have to ensure the KDK prerequisites to run services from source code.

Add gateway

As the goal here is not to test, inspect or develop the gateway itself, but rather the underlying services, we will run the gateway using a Docker container in host network mode to ensure it can access services deployed on your localhost:

bash
docker run --name="gateway" --network="host" --rm --init -it -e "PORT=8082" -e "KAPTURE_URL=http://localhost:8083" -e "GEOKODER_URL=http://localhost:8084" --mount type=bind,source=./gateway.config.yml,target=/var/lib/eg/gateway.config.yml,readonly kalisio/express-gateway:1.16.9

TIP

To get details about the gateway.config.yml file used to deploy gateway container please refer to the previous Docker-based section.

After launching the gateway change the following environment variables before launching the Kano backend:

bash
// Setup the target gateway
+export API_GATEWAY_URL="http://localhost:8082"
+yarn dev

Add kapture

Once Kano and the gateway are running, the following commands should launch your local instance of Kapture:

bash
// Clone Kapture
+git clone https://github.com/kalisio/geokoder.git
+cd geokoder
+yarn install
+// Set the most minimalist environment to run server
+export PORT="8083"
+export NODE_OPTIONS="--inspect-port=9233"
+export KANO_URL="http://localhost:8080"
+export KANO_JWT="eyJhbGciOiJIUzI1NiIsInR5cCI6ImFjY2VzcyJ9.eyJhdWQiOiJrYWxpc2lvIiwiaXNzIjoia2FsaXNpbyJ9._HslaK0hTlISw_wGkUJYmpZdcNuWWGB1iHJDApeJxWk"
+yarn dev

Add geokoder

Once Kano and the gateway is running, the following commands should launch your local instance of Geokoder:

bash
// Clone Geokoder
+git clone https://github.com/kalisio/geokoder.git
+cd geokoder
+yarn install
+// Copy local configuration (see previous Docker-based deployment section)
+cp local-geokoder.cjs ./config/local.cjs
+// Set the most minimalist environment to run server
+export PORT="8084"
+export NODE_OPTIONS="--inspect-port=9234"
+yarn dev

Add k2

Coming soon

+ \ No newline at end of file diff --git a/guides/kano-api.html b/guides/kano-api.html index 3fe2cea8..fefc380f 100644 --- a/guides/kano-api.html +++ b/guides/kano-api.html @@ -5,257 +5,140 @@ Using the Kano API | Kano - + + - - - - - + + + + + -
Skip to content

Using the Kano API

Description

Kano exposes an API endpoint that can be used to query data stored in it's underlying MongoDB database. The API will return JSON documents when queried. The endpoint is located on $KANO_ROOT_URL/api/

What's available

This depends on which layers are declared in your Kano configuration. For each layer declaring a set of features services, the api will expose the service's data through an URL formed by the API endpoint slash the service name.

Example

If your Kano instance is exposed through https://kano.foo.xyz then the api is available on https://kano.foo.xyz/api. If for example you have the hubeau hydro layer enabled (which instanciate both a hubeau-hydro-stations and a hubeau-hydro-observations features services), then the api will expose it's data on https://kano.foo.xyz/api/hubeau-hydro-stations and https://kano.foo.xyz/api/hubeau-hydro-observations

Authentication

In order to access the API, clients must authenticate themselves. We use JWT tokens to authenticate access to Kano. Those can be added as an HTTP query parameter, using jwt=$your_token or can be passed through the Authorization HTTP header, using the Bearer scheme.

Generate a JWT token

Kano supports stateless tokens, i.e. tokens not associated to a user, either to access the backend API or to automatically login when using it through an iframe. To generate a token you can use https://jwt.io with your app secret and the default header:

json
{
-  "alg": "HS256",
-  "typ": "JWT"
-}
{
-  "alg": "HS256",
-  "typ": "JWT"
-}

Your payload should at least look like this:

json
{
-  "name": "your token id",
-  "iss": "kalisio",
-  "aud": "your app domain"
-}
{
-  "name": "your token id",
-  "iss": "kalisio",
-  "aud": "your app domain"
-}

You can also add others token properties like an expiration date (exp).

TIP

In development mode aud=kalisio by default, all token options can be configured at authentication.jwtOptions in the API configuration.

Queries

Queries to the Kano API are made to specific features services data which in turn query their specific underlying MongoDB collection. The way to query those collections is to use Feathers queries through REST URLs. In addition to those, we added in the KDK a few handy shortcuts to express commonly used queries. Here are some of the most useful query examples.

Request available stations

Typical use case is to display the stations on a map.

HTTP - GET

Request available observations

Typical use case is to retrieve the raw observations. You can filter spatially (i.e. bounding box) and temporally (i.e. time range) with most recent first.

HTTP - GET
Result sample
json
{
-  "type": "FeatureCollection",
-  "features": [
-    {
-      "_id": "5f23ce6071b0b00008dff53f",
-      "type": "Feature",
-      "time": "2020-07-31T07:30:00.000Z",
-      "geometry": {
-          "type": "Point",
-          "coordinates": [
-              -0.12606156299146137,
-              45.02191991211479
-          ]
-      },
-      "properties": {
-          "name": "L'Isle à Abzac",
-          "code_station": "#P726151001",
-          "H": 0.397
-      }
-    },
-    {
-      "_id": "5f23caea71b0b00008dfe457",
-      "type": "Feature",
-      "time": "2020-07-31T07:25:00.000Z",
-      "geometry": {
-          "type": "Point",
-          "coordinates": [
-              -0.12606156299146137,
-              45.02191991211479
-          ]
-      },
-      "properties": {
-          "name": "L'Isle à Abzac",
-          "code_station": "#P726151001",
-          "H": 0.398
-      }
-    },
-    ...
-  ]
-}
{
-  "type": "FeatureCollection",
-  "features": [
-    {
-      "_id": "5f23ce6071b0b00008dff53f",
-      "type": "Feature",
-      "time": "2020-07-31T07:30:00.000Z",
-      "geometry": {
-          "type": "Point",
-          "coordinates": [
-              -0.12606156299146137,
-              45.02191991211479
-          ]
-      },
-      "properties": {
-          "name": "L'Isle à Abzac",
-          "code_station": "#P726151001",
-          "H": 0.397
-      }
-    },
-    {
-      "_id": "5f23caea71b0b00008dfe457",
-      "type": "Feature",
-      "time": "2020-07-31T07:25:00.000Z",
-      "geometry": {
-          "type": "Point",
-          "coordinates": [
-              -0.12606156299146137,
-              45.02191991211479
-          ]
-      },
-      "properties": {
-          "name": "L'Isle à Abzac",
-          "code_station": "#P726151001",
-          "H": 0.398
-      }
-    },
-    ...
-  ]
-}

Request observations at a station

Typical use case is to display a timeserie for the station.

HTTP - GET
Result sample
json
{
-  "type": "FeatureCollection",
-  "features": [
-    {
-      "_id": {
-        "code_station": "#X331001001"
-      },
-      "time": {
-        "H": [
-          "2020-07-29T13:40:00.000Z",
-          "2020-07-29T13:45:00.000Z",
-          "2020-07-29T13:50:00.000Z",
-          ...
-        ],
-        "Q": [
-          "2020-07-29T13:40:00.000Z",
-          "2020-07-29T13:45:00.000Z",
-          "2020-07-29T13:50:00.000Z",
-          ...
-        ]
-      },
-      "type": "Feature",
-      "properties": {
-        "name": "La Durance à Cavaillon",
-        "code_station": "#X331001001",
-        "H": [
-          0.815,
-          0.815,
-          0.821,
-          ...
-        ],
-        "Q": [
-          36.87,
-          36.87,
-          37.458,
-          ...
-        ]
-      },
-      "geometry": {
-        "type": "Point",
-        "coordinates": [
-          5.032432216493836,
-          43.82748690979179
-        ]
-      }
-    }
-  ]
-}
{
-  "type": "FeatureCollection",
-  "features": [
-    {
-      "_id": {
-        "code_station": "#X331001001"
-      },
-      "time": {
-        "H": [
-          "2020-07-29T13:40:00.000Z",
-          "2020-07-29T13:45:00.000Z",
-          "2020-07-29T13:50:00.000Z",
-          ...
-        ],
-        "Q": [
-          "2020-07-29T13:40:00.000Z",
-          "2020-07-29T13:45:00.000Z",
-          "2020-07-29T13:50:00.000Z",
-          ...
-        ]
-      },
-      "type": "Feature",
-      "properties": {
-        "name": "La Durance à Cavaillon",
-        "code_station": "#X331001001",
-        "H": [
-          0.815,
-          0.815,
-          0.821,
-          ...
-        ],
-        "Q": [
-          36.87,
-          36.87,
-          37.458,
-          ...
-        ]
-      },
-      "geometry": {
-        "type": "Point",
-        "coordinates": [
-          5.032432216493836,
-          43.82748690979179
-        ]
-      }
-    }
-  ]
-}

Request latest observations at (a) station(s)

Typical use case is to retrieve most recent observations for the station, or display the observations on a map if not filtering by a station ID.

HTTP - GET
Result sample
json
{
-  "type": "FeatureCollection",
-  "features": [
-    {
-      "_id": "64917e8ec06fb0000887fd3a",
-      "geometry": {
-        "coordinates": [
-          1.3351479476905552,
-          47.584957074484784
-        ],
-        "type": "Point"
-      },
-      "properties": {
-        "H": -0.84,
-        "Q": 127,
-        "code_station": "#K447001001",
-        "name": "La Loire à Blois"
-      },
-      "time": {
-        "H": "2023-06-20T09:20:00.000Z",
-        "Q": "2023-06-20T09:20:00.000Z"
-      },
-      "type": "Feature"
-    }
-  ]
-}
{
-  "type": "FeatureCollection",
-  "features": [
-    {
-      "_id": "64917e8ec06fb0000887fd3a",
-      "geometry": {
-        "coordinates": [
-          1.3351479476905552,
-          47.584957074484784
-        ],
-        "type": "Point"
-      },
-      "properties": {
-        "H": -0.84,
-        "Q": 127,
-        "code_station": "#K447001001",
-        "name": "La Loire à Blois"
-      },
-      "time": {
-        "H": "2023-06-20T09:20:00.000Z",
-        "Q": "2023-06-20T09:20:00.000Z"
-      },
-      "type": "Feature"
-    }
-  ]
-}

Use case example

We used the Kano API to expose French nuclear power production data to a set of Grafana dashboards.

We first developed a Krawler job whose task is to scrap power production data and to push it into Kano's backing MongoDB database. On Kano's side, we added a layer declaring a feature service pointing on the database collections the Krawler job was populating. From that time, nuclear power production data was available for display in Kano. Here's what it looks like :

Nucler power production data in Kano

Once the collections started being populated, we looked for ways to connect Grafana to Kano's API endpoint. For this we used the Infinity Grafana datasource plugin allowing us to use it's JSON scrapping capabilities to feed Grafana. We created a JWT token for the datasource to be able to reach Kano's API. After creating dashboards and looking up some docs, we ended up with a set of synthetic dashboards:

Nuclear power production overview in GrafanaNuclear power production detail in Grafana

Overall, here's the architecture of the whole solution :

Whole use case architecture

- +
Skip to content

Using the Kano API

Description

Kano exposes an API endpoint that can be used to query data stored in it's underlying MongoDB database. The API will return JSON documents when queried. The endpoint is located on $KANO_ROOT_URL/api/

What's available

This depends on which layers are declared in your Kano configuration. For each layer declaring a set of features services, the api will expose the service's data through an URL formed by the API endpoint slash the service name.

Example

If your Kano instance is exposed through https://kano.foo.xyz then the api is available on https://kano.foo.xyz/api. If for example you have the hubeau hydro layer enabled (which instanciate both a hubeau-hydro-stations and a hubeau-hydro-observations features services), then the api will expose it's data on https://kano.foo.xyz/api/hubeau-hydro-stations and https://kano.foo.xyz/api/hubeau-hydro-observations

Authentication

In order to access the API, clients must authenticate themselves. We use JWT tokens to authenticate access to Kano. Those can be added as an HTTP query parameter, using jwt=$your_token or can be passed through the Authorization HTTP header, using the Bearer scheme.

Generate a JWT token

Kano supports stateless tokens, i.e. tokens not associated to a user, either to access the backend API or to automatically login when using it through an iframe. To generate a token you can use https://jwt.io with your app secret and the default header:

json
{
+  "alg": "HS256",
+  "typ": "JWT"
+}

Your payload should at least look like this:

json
{
+  "name": "your token id",
+  "iss": "kalisio",
+  "aud": "your app domain"
+}

You can also add others token properties like an expiration date (exp).

TIP

In development mode aud=kalisio by default, all token options can be configured at authentication.jwtOptions in the API configuration.

Queries

Queries to the Kano API are made to specific features services data which in turn query their specific underlying MongoDB collection. The way to query those collections is to use Feathers queries through REST URLs. In addition to those, we added in the KDK a few handy shortcuts to express commonly used queries. Here are some of the most useful query examples.

Request available stations

Typical use case is to display the stations on a map.

HTTP - GET

Request available observations

Typical use case is to retrieve the raw observations. You can filter spatially (i.e. bounding box) and temporally (i.e. time range) with most recent first.

HTTP - GET
Result sample
json
{
+  "type": "FeatureCollection",
+  "features": [
+    {
+      "_id": "5f23ce6071b0b00008dff53f",
+      "type": "Feature",
+      "time": "2020-07-31T07:30:00.000Z",
+      "geometry": {
+          "type": "Point",
+          "coordinates": [
+              -0.12606156299146137,
+              45.02191991211479
+          ]
+      },
+      "properties": {
+          "name": "L'Isle à Abzac",
+          "code_station": "#P726151001",
+          "H": 0.397
+      }
+    },
+    {
+      "_id": "5f23caea71b0b00008dfe457",
+      "type": "Feature",
+      "time": "2020-07-31T07:25:00.000Z",
+      "geometry": {
+          "type": "Point",
+          "coordinates": [
+              -0.12606156299146137,
+              45.02191991211479
+          ]
+      },
+      "properties": {
+          "name": "L'Isle à Abzac",
+          "code_station": "#P726151001",
+          "H": 0.398
+      }
+    },
+    ...
+  ]
+}

Request observations at a station

Typical use case is to display a timeserie for the station.

HTTP - GET
Result sample
json
{
+  "type": "FeatureCollection",
+  "features": [
+    {
+      "_id": {
+        "code_station": "#X331001001"
+      },
+      "time": {
+        "H": [
+          "2020-07-29T13:40:00.000Z",
+          "2020-07-29T13:45:00.000Z",
+          "2020-07-29T13:50:00.000Z",
+          ...
+        ],
+        "Q": [
+          "2020-07-29T13:40:00.000Z",
+          "2020-07-29T13:45:00.000Z",
+          "2020-07-29T13:50:00.000Z",
+          ...
+        ]
+      },
+      "type": "Feature",
+      "properties": {
+        "name": "La Durance à Cavaillon",
+        "code_station": "#X331001001",
+        "H": [
+          0.815,
+          0.815,
+          0.821,
+          ...
+        ],
+        "Q": [
+          36.87,
+          36.87,
+          37.458,
+          ...
+        ]
+      },
+      "geometry": {
+        "type": "Point",
+        "coordinates": [
+          5.032432216493836,
+          43.82748690979179
+        ]
+      }
+    }
+  ]
+}

Request latest observations at (a) station(s)

Typical use case is to retrieve most recent observations for the station, or display the observations on a map if not filtering by a station ID.

HTTP - GET
Result sample
json
{
+  "type": "FeatureCollection",
+  "features": [
+    {
+      "_id": "64917e8ec06fb0000887fd3a",
+      "geometry": {
+        "coordinates": [
+          1.3351479476905552,
+          47.584957074484784
+        ],
+        "type": "Point"
+      },
+      "properties": {
+        "H": -0.84,
+        "Q": 127,
+        "code_station": "#K447001001",
+        "name": "La Loire à Blois"
+      },
+      "time": {
+        "H": "2023-06-20T09:20:00.000Z",
+        "Q": "2023-06-20T09:20:00.000Z"
+      },
+      "type": "Feature"
+    }
+  ]
+}

Use case example

We used the Kano API to expose French nuclear power production data to a set of Grafana dashboards.

We first developed a Krawler job whose task is to scrap power production data and to push it into Kano's backing MongoDB database. On Kano's side, we added a layer declaring a feature service pointing on the database collections the Krawler job was populating. From that time, nuclear power production data was available for display in Kano. Here's what it looks like :

Nucler power production data in Kano

Once the collections started being populated, we looked for ways to connect Grafana to Kano's API endpoint. For this we used the Infinity Grafana datasource plugin allowing us to use it's JSON scrapping capabilities to feed Grafana. We created a JWT token for the datasource to be able to reach Kano's API. After creating dashboards and looking up some docs, we ended up with a set of synthetic dashboards:

Nuclear power production overview in GrafanaNuclear power production detail in Grafana

Overall, here's the architecture of the whole solution :

Whole use case architecture

+ \ No newline at end of file diff --git a/guides/understanding-kano.html b/guides/understanding-kano.html index b61cc07c..13ca97cc 100644 --- a/guides/understanding-kano.html +++ b/guides/understanding-kano.html @@ -5,21 +5,22 @@ Understanding Kano | Kano - + + - - - - - + + + + + -
Skip to content

Understanding Kano

Kano is a powerful geospatial visualizer supporting advanced visualization capabilities in 2D and 3D thanks to hardware acceleration with WebGL technology. Driven by today's most advanced web technologies, it also enables tracking your geospatial assets in real-time.

Although Kano is a web application for end-users, it has also been designed to be integrated in third-party business applications and customized by developers (check out advanced usage). Using a single and simple API, Kano provides developers with the capability to easily develop 2D and 3D geospatial applications (check out the API reference). Last but not least, Kano comes with a built-in configuration for a set of geospatial data (check out installation guide). However, you can complete it with your own spatial data.

Key concepts

Here is a quick rundown of the key concepts to handle when you're just getting started with Kano or geographic information system (GIS). In a nutshell, like any other GIS tool, Kano can be used to map, analyze, and assess real-world problems based on data, which is spatial or geographical in nature.

To achieve this, Kano is composed of two main activities (i.e. entry point for interacting with the user on a given type of objects):

  • a 2D activity to visualise and interact with data on a standard paperless map in 2D,
  • a 3D activity to visualise data and interact with on a virtual globe in 3D.

The view of each activity can contain a basemap (i.e. a background context), a set of data layers (i.e. business specific data), an extent (i.e. the part of the Earth currently on the screen), and navigation tools to pan and zoom. A layer specifies how a geographic dataset is portrayed on the map or the globe. The final rendering supporting your use case can usually be assembled by adding a serie of layers.

A feature layer is a grouping of similar geographic elements, for example, buildings, cities, roads, earthquake epicenters, etc. Features can be points, lines, or polygons (i.e. vector data). Feature layers are most appropriate for visualizing your own data on top of your basemaps. Using Kano, you can view, save, edit and analyze your own features and their attributes. Moreover, you can include interactive pop-up windows with information about the features. Raster data, most commonly found in remotely sensed data, topographic data, satellite imagery, and aerial imagery, can also be visualized. For this, Kano can leverage OGC standards that use the internet to view, edit, manage and share geospatial data.

Kano manages both space and time information in order to visualize time-varying geospatial phenomena: tracking of moving objects, history of measures taken by a sensor, weather prediction over time, etc. When a layer displays a time-varying dataset you are able to navigate back and forward in time using a timeline to see the data at your requested date/time.

Global overview

The following figure depicts the default 2D activity and the main application components:

Components

TIP

The 3D view is pretty similar to the 2D activity except that some feature might not be yet available.

Each component can be shown/hidden through a handle on the different side of the view:

  • at the top to open the application bar,
  • at the bottom to open the timeline,
  • on the left to open the side/main menu,
  • on the right to open the catalog.

In addition, a floating action button is available in the bottom-right corner to perform some actions.

Check out now our quickstart guide for more details.

- +
Skip to content

Understanding Kano

Kano is a powerful geospatial visualizer supporting advanced visualization capabilities in 2D and 3D thanks to hardware acceleration with WebGL technology. Driven by today's most advanced web technologies, it also enables tracking your geospatial assets in real-time.

Although Kano is a web application for end-users, it has also been designed to be integrated in third-party business applications and customized by developers (check out advanced usage). Using a single and simple API, Kano provides developers with the capability to easily develop 2D and 3D geospatial applications (check out the API reference). Last but not least, Kano comes with a built-in configuration for a set of geospatial data (check out installation guide). However, you can complete it with your own spatial data.

Key concepts

Here is a quick rundown of the key concepts to handle when you're just getting started with Kano or geographic information system (GIS). In a nutshell, like any other GIS tool, Kano can be used to map, analyze, and assess real-world problems based on data, which is spatial or geographical in nature.

To achieve this, Kano is composed of two main activities (i.e. entry point for interacting with the user on a given type of objects):

  • a 2D activity to visualise and interact with data on a standard paperless map in 2D,
  • a 3D activity to visualise data and interact with on a virtual globe in 3D.

The view of each activity can contain a basemap (i.e. a background context), a set of data layers (i.e. business specific data), an extent (i.e. the part of the Earth currently on the screen), and navigation tools to pan and zoom. A layer specifies how a geographic dataset is portrayed on the map or the globe. The final rendering supporting your use case can usually be assembled by adding a serie of layers.

A feature layer is a grouping of similar geographic elements, for example, buildings, cities, roads, earthquake epicenters, etc. Features can be points, lines, or polygons (i.e. vector data). Feature layers are most appropriate for visualizing your own data on top of your basemaps. Using Kano, you can view, save, edit and analyze your own features and their attributes. Moreover, you can include interactive pop-up windows with information about the features. Raster data, most commonly found in remotely sensed data, topographic data, satellite imagery, and aerial imagery, can also be visualized. For this, Kano can leverage OGC standards that use the internet to view, edit, manage and share geospatial data.

Kano manages both space and time information in order to visualize time-varying geospatial phenomena: tracking of moving objects, history of measures taken by a sensor, weather prediction over time, etc. When a layer displays a time-varying dataset you are able to navigate back and forward in time using a timeline to see the data at your requested date/time.

Global overview

The following figure depicts the default 2D activity and the main application components:

Components

TIP

The 3D view is pretty similar to the 2D activity except that some feature might not be yet available.

Each component can be shown/hidden through a handle on the different side of the view:

  • at the top to open the application bar,
  • at the bottom to open the timeline,
  • on the left to open the side/main menu,
  • on the right to open the catalog.

In addition, a floating action button is available in the bottom-right corner to perform some actions.

Check out now our quickstart guide for more details.

+ \ No newline at end of file diff --git a/hashmap.json b/hashmap.json index 014f9494..ad632193 100644 --- a/hashmap.json +++ b/hashmap.json @@ -1 +1 @@ -{"guides_installing-services.md":"7c3d9c58","reference_configuration.md":"b1f9295e","about_license.md":"6b7312ac","about_roadmap.md":"b9242f49","guides_advanced-usage.md":"817c3eb2","guides_customizing-kano.md":"8bb2652f","about_contributing.md":"a0ea6fa4","about_contact.md":"0cffa98c","index.md":"7b179fb5","guides_getting-started.md":"61515a0f","guides_understanding-kano.md":"cd408bac","reference_api.md":"97a0b4a2","guides_installing-kano.md":"a41b1f68","about_introduction.md":"18715ba7","guides_kano-api.md":"09576fcd"} +{"about_introduction.md":"ZchEHfVq","about_license.md":"U9MC9N0n","about_roadmap.md":"Tsa-l91W","guides_advanced-usage.md":"cY9DewtT","guides_customizing-kano.md":"8nbTGQ9l","guides_getting-started.md":"2GOoH2nF","guides_installing-kano.md":"hypdee-x","guides_installing-services.md":"dsJfA9g8","guides_understanding-kano.md":"IWOf-sHQ","index.md":"Xmx78NTg","reference_configuration.md":"1lzXteaM","reference_api.md":"wWmT5Fzy","about_contact.md":"MLWlmPcp","guides_kano-api.md":"C-5U0JYH","about_contributing.md":"Q-A41HE2"} diff --git a/index.html b/index.html index 5efdf097..b077e57c 100644 --- a/index.html +++ b/index.html @@ -3,23 +3,24 @@ - Kano | Kano + Kano - + + - - - - - + + + + + -
Skip to content

Kano

A powerful real-time Geovisualizer

kalisio-kano
- +
Skip to content

Kano

A powerful real-time Geovisualizer

kalisio-kano
+ \ No newline at end of file diff --git a/reference/api.html b/reference/api.html index 7d7a0b5b..1541fcd2 100644 --- a/reference/api.html +++ b/reference/api.html @@ -5,21 +5,22 @@ Backend API | Kano - + + - - - - - + + + + + -
Skip to content

Backend API

The externally exposed API of the internal Kano services comes from the one provided by the KDK:

Frontend API

The externally exposed API of the internal Kano components (2D map and 3D globe) comes from the one provided by the KDK:

Similarly, most of the internal mapping components come from the KDK.

- +
Skip to content

Backend API

The externally exposed API of the internal Kano services comes from the one provided by the KDK:

Frontend API

The externally exposed API of the internal Kano components (2D map and 3D globe) comes from the one provided by the KDK:

Similarly, most of the internal mapping components come from the KDK.

+ \ No newline at end of file diff --git a/reference/configuration.html b/reference/configuration.html index 540ca7e3..91fa0249 100644 --- a/reference/configuration.html +++ b/reference/configuration.html @@ -5,21 +5,22 @@ Configuration | Kano - + + - - - - - + + + + + -
Skip to content

Configuration

The default backend configuration file can be found here.

Most options come from the "standard" backend configuration of KDK based app.

The default frontend configuration file can be found here.

Most options come from the "standard" frontend configuration of KDK based app, here are the main ones:

  • appName: displayed application name,
  • appLogo: displayed application logo,
  • theme: the theme to be used,
  • screens: connection screens configuration
    • banner: displayed application banner,
    • login: login screen configuration
      • providers: array of OAuth2 providers to be used (like ['google', 'github']),
      • links: links displayed at the bottom of the screen,
    • logout: logout screen configuration
      • links: links displayed at the bottom of the screen,
    • changeEndpoint: change endpoint screen configuration (only useful for mobile apps)
      • links: links displayed at the bottom of the screen,
  • layout: layout configuration (see Quasar docs for details)
    • topPane: application bar setup,
      • opener: true to add a handler to open/close the pane,
      • visible: true to show this pane,
    • leftPane: left pane (i.e. main menu) setup (as above),
    • bottomPane: bottom pane setup (as above),
    • rightPane: right pane setup (as above),
    • welcome: true to display the welcome screen by default,
  • mapActivity: 2D map activity configuration
    • topPane: application bar components configuration
      • content: list of components to be displayed according to current mode,
      • filter: component filter using any expression supported by sift,
    • leftPane: left pane (i.e. main menu) components configuration
      • content: list of components to be displayed,
      • filter: component filter using any expression supported by sift,
    • bottomPane: bottom pane components configuration
      • content: list of components to be displayed,
      • filter: component filter using any expression supported by sift,
    • rightPane: right pane components configuration
      • content: list of components to be displayed,
      • filter: component filter using any expression supported by sift,
    • page: page components configuration (can be used to add your own components)
      • content: list of components to be displayed,
      • filter: component filter using any expression supported by sift,
    • window: window (i.e. widgets) configuration
      • widgets: list of widgets to be displayed,
      • filter: component filter using any expression supported by sift,
    • fab: floating action button (FAB) configuration
      • actions: list of actions to be displayed,
      • filter: action filter using any expression supported by sift,
    • catalog: 2D map layers panel configuration
      • filter: layer filter using any expression supported by sift,
      • categories: list of categories to be displayed in 2D map layers panel,
    • layers: 2D map layers configuration
      • actions: list of actions to be displayed,
      • filter: action filter using any expression supported by sift,
    • restore: user context restoration configuration
      • view: set it to true (default) in order to restore the current extent on page refresh
      • layers: set it to true (false by default) in order to restore the current visible layers on page refresh
    • engine: 2D map view configuration
  • globeActivity: 3D globe activity configuration
    • topPane: application bar components configuration
      • content: list of components to be displayed according to current mode,
      • filter: component filter using any expression supported by sift,
    • leftPane: left pane (i.e. main menu) components configuration
      • content: list of components to be displayed,
      • filter: component filter using any expression supported by sift,
    • bottomPane: bottom pane components configuration
      • content: list of components to be displayed,
      • filter: component filter using any expression supported by sift,
    • rightPane: right pane components configuration
      • content: list of components to be displayed,
      • filter: component filter using any expression supported by sift,
    • page: page components configuration (can be used to add your own components)
      • content: list of components to be displayed,
      • filter: component filter using any expression supported by sift,
    • window: window (i.e. widgets) configuration
      • widgets: list of widgets to be displayed,
      • filter: component filter using any expression supported by sift,
    • fab: floating action button (FAB) configuration
      • actions: list of actions to be displayed,
      • filter: action filter using any expression supported by sift,
    • catalog: 3D map layers panel configuration
      • filter: layer filter using any expression supported by sift,
      • categories: list of categories to be displayed in 3D map layers panel,
    • layers: 3D map layers configuration
      • actions: list of actions to be displayed,
      • filter: action filter using any expression supported by sift,
    • catalog: 3D globe layers panel configuration
      • filter: layer filter using any expression supported by sift,
      • categories: list of categories to be displayed in 3D globe layers panel,
    • restore: user context restoration configuration
      • view: set it to true (default) in order to restore the current extent on page refresh
      • layers: set it to true (false by default) in order to restore the current visible layers on page refresh
    • engine: 3D globe view configuration
- +
Skip to content

Configuration

The default backend configuration file can be found here.

Most options come from the "standard" backend configuration of KDK based app.

The default frontend configuration file can be found here.

Most options come from the "standard" frontend configuration of KDK based app, here are the main ones:

  • appName: displayed application name,
  • appLogo: displayed application logo,
  • theme: the theme to be used,
  • screens: connection screens configuration
    • banner: displayed application banner,
    • login: login screen configuration
      • providers: array of OAuth2 providers to be used (like ['google', 'github']),
      • links: links displayed at the bottom of the screen,
    • logout: logout screen configuration
      • links: links displayed at the bottom of the screen,
    • changeEndpoint: change endpoint screen configuration (only useful for mobile apps)
      • links: links displayed at the bottom of the screen,
  • layout: layout configuration (see Quasar docs for details)
    • topPane: application bar setup,
      • opener: true to add a handler to open/close the pane,
      • visible: true to show this pane,
    • leftPane: left pane (i.e. main menu) setup (as above),
    • bottomPane: bottom pane setup (as above),
    • rightPane: right pane setup (as above),
    • welcome: true to display the welcome screen by default,
  • mapActivity: 2D map activity configuration
    • topPane: application bar components configuration
      • content: list of components to be displayed according to current mode,
      • filter: component filter using any expression supported by sift,
    • leftPane: left pane (i.e. main menu) components configuration
      • content: list of components to be displayed,
      • filter: component filter using any expression supported by sift,
    • bottomPane: bottom pane components configuration
      • content: list of components to be displayed,
      • filter: component filter using any expression supported by sift,
    • rightPane: right pane components configuration
      • content: list of components to be displayed,
      • filter: component filter using any expression supported by sift,
    • page: page components configuration (can be used to add your own components)
      • content: list of components to be displayed,
      • filter: component filter using any expression supported by sift,
    • window: window (i.e. widgets) configuration
      • widgets: list of widgets to be displayed,
      • filter: component filter using any expression supported by sift,
    • fab: floating action button (FAB) configuration
      • actions: list of actions to be displayed,
      • filter: action filter using any expression supported by sift,
    • catalog: 2D map layers panel configuration
      • filter: layer filter using any expression supported by sift,
      • categories: list of categories to be displayed in 2D map layers panel,
    • layers: 2D map layers configuration
      • actions: list of actions to be displayed,
      • filter: action filter using any expression supported by sift,
    • restore: user context restoration configuration
      • view: set it to true (default) in order to restore the current extent on page refresh
      • layers: set it to true (false by default) in order to restore the current visible layers on page refresh
    • engine: 2D map view configuration
  • globeActivity: 3D globe activity configuration
    • topPane: application bar components configuration
      • content: list of components to be displayed according to current mode,
      • filter: component filter using any expression supported by sift,
    • leftPane: left pane (i.e. main menu) components configuration
      • content: list of components to be displayed,
      • filter: component filter using any expression supported by sift,
    • bottomPane: bottom pane components configuration
      • content: list of components to be displayed,
      • filter: component filter using any expression supported by sift,
    • rightPane: right pane components configuration
      • content: list of components to be displayed,
      • filter: component filter using any expression supported by sift,
    • page: page components configuration (can be used to add your own components)
      • content: list of components to be displayed,
      • filter: component filter using any expression supported by sift,
    • window: window (i.e. widgets) configuration
      • widgets: list of widgets to be displayed,
      • filter: component filter using any expression supported by sift,
    • fab: floating action button (FAB) configuration
      • actions: list of actions to be displayed,
      • filter: action filter using any expression supported by sift,
    • catalog: 3D map layers panel configuration
      • filter: layer filter using any expression supported by sift,
      • categories: list of categories to be displayed in 3D map layers panel,
    • layers: 3D map layers configuration
      • actions: list of actions to be displayed,
      • filter: action filter using any expression supported by sift,
    • catalog: 3D globe layers panel configuration
      • filter: layer filter using any expression supported by sift,
      • categories: list of categories to be displayed in 3D globe layers panel,
    • restore: user context restoration configuration
      • view: set it to true (default) in order to restore the current extent on page refresh
      • layers: set it to true (false by default) in order to restore the current visible layers on page refresh
    • engine: 3D globe view configuration
+ \ No newline at end of file