diff --git a/.gitignore b/.gitignore old mode 100644 new mode 100755 index 5101aeaf..b4839ace --- a/.gitignore +++ b/.gitignore @@ -2,4 +2,6 @@ !/pages !/images !/themes -/themes/learn4 +!/Dockerfile +!/docker-compose.yml +!/dev/plugins diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 00000000..7f2f3d7d --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "themes/learn4"] + path = themes/learn4 + url = https://github.com/getgrav/grav-theme-learn4.git diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 00000000..7320578f --- /dev/null +++ b/Dockerfile @@ -0,0 +1,89 @@ +FROM php:7.4-apache +LABEL maintainer="Andy Miller (@rhukster)" + +RUN usermod --uid 1000 www-data +RUN groupmod --gid 1000 www-data +# Enable Apache Rewrite + Expires Module +RUN a2enmod rewrite expires && \ + sed -i 's/ServerTokens OS/ServerTokens ProductOnly/g' \ + /etc/apache2/conf-available/security.conf + +# Install dependencies +RUN apt-get update && apt-get install -y --no-install-recommends \ + unzip \ + libfreetype6-dev \ + libjpeg62-turbo-dev \ + libpng-dev \ + libyaml-dev \ + libzip4 \ + libzip-dev \ + zlib1g-dev \ + libicu-dev \ + g++ \ + git \ + cron \ + vim \ + && docker-php-ext-install opcache \ + && docker-php-ext-configure intl \ + && docker-php-ext-install intl \ + && docker-php-ext-configure gd --with-freetype --with-jpeg \ + && docker-php-ext-install -j$(nproc) gd \ + && docker-php-ext-install zip \ + && rm -rf /var/lib/apt/lists/* + +# set recommended PHP.ini settings +# see https://secure.php.net/manual/en/opcache.installation.php +RUN { \ + echo 'opcache.memory_consumption=128'; \ + echo 'opcache.interned_strings_buffer=8'; \ + echo 'opcache.max_accelerated_files=4000'; \ + echo 'opcache.revalidate_freq=2'; \ + echo 'opcache.fast_shutdown=1'; \ + echo 'opcache.enable_cli=1'; \ + echo 'upload_max_filesize=128M'; \ + echo 'post_max_size=128M'; \ + echo 'expose_php=off'; \ + } > /usr/local/etc/php/conf.d/php-recommended.ini + +RUN pecl install apcu \ + && pecl install yaml-2.0.4 \ + && docker-php-ext-enable apcu yaml + +CMD ["sh", "-c", "usermod --uid 1000 www-data"] +CMD ["sh", "-c", "groupmod --gid 1000 www-data"] +# Set user to www-data +RUN chown www-data:www-data /var/www +USER www-data + +# Define Grav specific version of Grav or use latest stable +ARG GRAV_VERSION=latest + +# Install grav +WORKDIR /var/www +RUN curl -o grav-admin.zip -SL https://getgrav.org/download/core/grav-admin/${GRAV_VERSION} && \ + unzip grav-admin.zip && \ + mv -T /var/www/grav-admin /var/www/html && \ + rm grav-admin.zip + +# Install plugins +WORKDIR /var/www/html + +RUN bin/gpm install admin email feed git-sync langswitcher presentation shortcode-core anchors error flex-objects highlight login presentation-deckset tntsearch breadcrumbs external_links form image-captions markdown-notices problems + +# Create cron job for Grav maintenance scripts +RUN (crontab -l; echo "* * * * * cd /var/www/html;/usr/local/bin/php bin/grav scheduler 1>> /dev/null 2>&1") | crontab - + +# Return to root user +USER root + +# Copy init scripts +# COPY docker-entrypoint.sh /entrypoint.sh + +COPY --chown=1000:1000 themes/learn4 /var/www/html/user/themes/learn4 + +# provide container inside image for data persistence +VOLUME ["/var/www/html/backup", "/var/www/html/user/themes/yunohost-docs", "/var/www/html/logs", "/var/www/html/user/pages", "/var/www/html/user/config", "/var/www/html/user/images"] + +# ENTRYPOINT ["/entrypoint.sh"] +# CMD ["apache2-foreground"] +CMD ["sh", "-c", "cron && apache2-foreground"] diff --git a/README.md b/README.md index 31d94298..d6a6731f 100644 --- a/README.md +++ b/README.md @@ -7,8 +7,20 @@ Please report [issues on YunoHost bugtracker](https://github.com/YunoHost/issues # Contributing +This repo use a **submodule** to provide the theme. So when you clone use: + +```shell +git clone --recursive https://github.com/YunoHost/doc.git +``` + + You can refer to the page on [writing documentation](https://yunohost.org/write_documentation). +If you know docker, you can run: +``` +docker-compose up +``` + ## Regenerate the css We use scss to manage the css. If you want to change it, you must rebuild it. diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 00000000..31a9c4d7 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,18 @@ +version: "3" +services: + grav: + build: ./ + ports: + - 8000:80 + volumes: + - ./themes/yunohost-docs:/var/www/html/user/themes/yunohost-docs + - ./config:/var/www/html/user/config + - ./pages:/var/www/html/user/pages + - ./images:/var/www/html/user/images +# tntsearch: +# restart: "no" +# build: ./ +# volumes: +# - ./config:/var/www/html/user/config +# - ./pages:/var/www/html/user/pages +# command: bin/plugin tntsearch index diff --git a/images/PluXml_logo.png b/images/PluXml_logo.png index ccb4d96a..b5ce5498 100644 Binary files a/images/PluXml_logo.png and b/images/PluXml_logo.png differ diff --git a/images/adguardhome-logo.png b/images/adguardhome-logo.png new file mode 100644 index 00000000..ea1dae9b Binary files /dev/null and b/images/adguardhome-logo.png differ diff --git a/images/app_config_operations.png b/images/app_config_operations.png new file mode 100644 index 00000000..6e2ae10a Binary files /dev/null and b/images/app_config_operations.png differ diff --git a/images/app_config_panel.png b/images/app_config_panel.png new file mode 100644 index 00000000..ac395513 Binary files /dev/null and b/images/app_config_panel.png differ diff --git a/images/app_install_form.png b/images/app_install_form.png new file mode 100644 index 00000000..8e0705cd Binary files /dev/null and b/images/app_install_form.png differ diff --git a/images/app_install_form_cli.png b/images/app_install_form_cli.png new file mode 100644 index 00000000..820076da Binary files /dev/null and b/images/app_install_form_cli.png differ diff --git a/images/apps_catalog.png b/images/apps_catalog.png new file mode 100644 index 00000000..04ba85fe Binary files /dev/null and b/images/apps_catalog.png differ diff --git a/images/apps_custom_url.png b/images/apps_custom_url.png new file mode 100644 index 00000000..cf0816fe Binary files /dev/null and b/images/apps_custom_url.png differ diff --git a/images/apps_list.png b/images/apps_list.png new file mode 100644 index 00000000..ff296dd2 Binary files /dev/null and b/images/apps_list.png differ diff --git a/images/create_user_1.png b/images/create_user_1.png new file mode 100644 index 00000000..f613acec Binary files /dev/null and b/images/create_user_1.png differ diff --git a/images/create_user_2.png b/images/create_user_2.png new file mode 100644 index 00000000..b77a4833 Binary files /dev/null and b/images/create_user_2.png differ diff --git a/images/create_user_3.png b/images/create_user_3.png new file mode 100644 index 00000000..6fd28129 Binary files /dev/null and b/images/create_user_3.png differ diff --git a/images/firefly-logo.png b/images/firefly-logo.png new file mode 100644 index 00000000..c9ea5706 Binary files /dev/null and b/images/firefly-logo.png differ diff --git a/images/grocy-logo.png b/images/grocy-logo.png new file mode 100644 index 00000000..dd4f08a2 Binary files /dev/null and b/images/grocy-logo.png differ diff --git a/images/invidious-logo.png b/images/invidious-logo.png new file mode 100644 index 00000000..55b696e8 Binary files /dev/null and b/images/invidious-logo.png differ diff --git a/images/misskey_logo.png b/images/misskey_logo.png new file mode 100644 index 00000000..3347810a Binary files /dev/null and b/images/misskey_logo.png differ diff --git a/images/rainloop-logo.png b/images/rainloop-logo.png new file mode 100644 index 00000000..1cb320c2 Binary files /dev/null and b/images/rainloop-logo.png differ diff --git a/images/ulogger-logo.png b/images/ulogger-logo.png new file mode 100644 index 00000000..7aac5abe Binary files /dev/null and b/images/ulogger-logo.png differ diff --git a/images/vps_ynh_ecowan.png b/images/vps_ynh_ecowan.png new file mode 100644 index 00000000..84b3ba5b Binary files /dev/null and b/images/vps_ynh_ecowan.png differ diff --git a/images/webadmin_domain.png b/images/webadmin_domain.png new file mode 100644 index 00000000..0bb59620 Binary files /dev/null and b/images/webadmin_domain.png differ diff --git a/images/webadmin_domain_local.png b/images/webadmin_domain_local.png new file mode 100644 index 00000000..4af8a73f Binary files /dev/null and b/images/webadmin_domain_local.png differ diff --git a/images/webadmin_domain_owndomain.png b/images/webadmin_domain_owndomain.png new file mode 100644 index 00000000..e3c4fe58 Binary files /dev/null and b/images/webadmin_domain_owndomain.png differ diff --git a/images/webadmin_dyndns.png b/images/webadmin_dyndns.png new file mode 100644 index 00000000..059ae24c Binary files /dev/null and b/images/webadmin_dyndns.png differ diff --git a/images/webmin_logo.png b/images/webmin_logo.png new file mode 100644 index 00000000..df1bbe78 Binary files /dev/null and b/images/webmin_logo.png differ diff --git a/images/writefreely-logo.png b/images/writefreely-logo.png new file mode 100644 index 00000000..ff0e1448 Binary files /dev/null and b/images/writefreely-logo.png differ diff --git a/images/yourls-logo.png b/images/yourls-logo.png new file mode 100644 index 00000000..77bc95d4 Binary files /dev/null and b/images/yourls-logo.png differ diff --git a/pages/01.administrate/06.overview/06.apps/apps_overview.md b/pages/01.administrate/06.overview/06.apps/apps_overview.md deleted file mode 100644 index 2b6cfea1..00000000 --- a/pages/01.administrate/06.overview/06.apps/apps_overview.md +++ /dev/null @@ -1,48 +0,0 @@ ---- -title: Applications -template: docs -taxonomy: - category: docs -routes: - default: '/apps_overview' ---- - -One of the key feature of YunoHost is the ability to easily install applications which are then immediately usable. Example of applications include a blog system, a "cloud" (to host and sync files), a website, an RSS reader... - -Applications can be installed and managed through the webadmin interface in 'Applications' or through commands of the `yunohost app` category. - -The application catalog can be browsed in the webadmin (in Applications > Install) or [here](/apps). - -! Be careful to stay reasonable on the number of installed applications. Each additional installation increases the attack surface and the risk of failure. Ideally, if you want to test, do it with another instance for example in [a virtual machine](/install/hardware:virtualbox). - -Applications must be packaged manually by application packagers/maintainers. Apps can be integrated with YunoHost to support upgrades, backup/restore and LDAP/SSO integration among other things. - -## Instructions after installation - -Some applications need to give you instructions, URLs or credentials once they are installed. So remember to check the email of the first user account. - -## Integration and quality levels - -Automated tests are being run regularly to test the integration and quality of all apps who were declared to be 'working' by packagers. The result is a level between 0 and 8, whose meaning is detailed on [this page](/packaging_apps_levels). Some tests results may also be available [on this dashboard](https://dash.yunohost.org/appci/branch/stable). - -By default, only applications of sufficient quality are offered. When the quality of an application drops, updates are put on hold and installation is no longer possible, until the problem is resolved. - -## LDAP / SSO integration - -Applications may support integration with the LDAP / Single Sign On system, such that users who connects to the user portal can be automatically logged in all those apps. Some applications however do not support this as it can be either not implemented in the upstream, or the package didn't work on this part yet. This information is usually available on the README of the application package. - -## Multi-instance applications - -Some applications support the ability to be installed several times (at different locations) ! To do so, just go another time in Applications > Install, and select again the application to install. - -## Tile management - -Web applications can provide tiles available from the user portal, it is possible to choose whether or not to display them and redefine the text via the web administration interface `Applications > APP name > Operations > Manage labels and tiles` or via the command line: `yunohost app change-label "New text"`. - -## User access management - -Access to apps can be restricted to some users only. This can be configured via the webadmin in the [Groups and permissions panel](/groups_and_permissions), or similarly via the command-line subcategory `yunohost user permission`. - -## Applications packaging - -If you want to learn or contribute to app packaging, please check the [contributor documentation](/contributordoc). diff --git a/pages/01.administrate/06.overview/07.domains/domains.md b/pages/01.administrate/06.overview/07.domains/domains.md deleted file mode 100644 index 797d2549..00000000 --- a/pages/01.administrate/06.overview/07.domains/domains.md +++ /dev/null @@ -1,77 +0,0 @@ ---- -title: Domains, DNS conf, and certificate -template: docs -taxonomy: - category: docs -routes: - default: '/domains' ---- - -YunoHost allows you to manage and serve several domains on the same server. For instance, you can host a blog and Nextcloud on a first domain `yolo.com`, and a web mail client on a second domain `swag.nohost.me`. Each domain is automatically configured to handle web services, mail services and XMPP services. - -Domains can be managed in the 'Domain' section of the webadmin, or through the `yunohost domain` category of the command line. - -Each time you add a domain, it is expected that you bought it (or own it) on a domain registrar, so you can manage the [DNS configuration](/dns_config). The exception is the [`.nohost.me`, `.noho.st` and `ynh.fr` domains](/dns_nohost_me) which are paid for by the YunoHost Project, and can be directly integrated with YunoHost thanks to an automated dynDNS setup. To limit costs and abuses, each instance may only have one of these domains setup at any given time, however you can add as many sub-domains of it as you wish. For example, if you choose `example.noho.st` you can later add the domains `video.example.noho.st` or `www.example.ynh.noho.st` or any other sub-domain you may need. - -The domain chosen during the initial configuration (post-install) is defined as the main domain of the server : this is where the SSO and the web admin interface will be available. The main domain can later be changed through the web admin in Domains > (the domain) > Set default, or with the command line `yunohost tools maindomain`. - -Finally, take note that, in the context of YunoHost, there is no hierarchy between the domains it knows. In the previous example, you may add a third domain `foo.yolo.com` - but it would be considered as a domain independent of `yolo.com`. - -## Non-latin characters - -If your domain has special, non-latin characters, you need to use its [internationalized version](https://en.wikipedia.org/wiki/Internationalized_domain_name) through [Punycode](https://en.wikipedia.org/wiki/Punycode). You can use [this converter](https://www.charset.org/punycode), and use the converted domain name in your YunoHost configuration. - -## Local domains - -Starting from YunoHost v4.3, domains ending by `.local` are fully supported, in addition to the default `yunohost.local`. -They do not use the DNS protocol, but the mDNS one (also known as Zeroconf, Bonjour), which allows them to be published with no specific configuration but exclusively on your local network or VPN. -Their use is this especially suitable when you do not want one of your apps to be available on the Internet. - -!!!! mDNS protocol does not allow for subdomains to be created. So `domain.local` will work, while `sub.domain.local` is not possible. - -`Yunomdns` service takes care of publishing your `.local` domains on your network. -It has a configuration file, `/etc/yunohost/mdns.yml`, which allows you to choose which domains are published, and on which network interfaces. -This file is automatically regenerated whenever you add or delete a `.local` domain. - -The service will always try to publish `yunohost.local`. If you have multiple YunoHost servers on your network, try `yunohost-2.local`, and so on. -The number may change depending on which server starts first, so do not rely on it to use actual apps and create your own domains. - -! Unfortunately, Android devices before version 12 (released in 2021) do not seem to be listening to mDNS protocol. -! To be able to reach `.local` domains on your Android devices, you will have to add in their DNS settings your YunoHost server's local IP address. - -## DNS configuration - -DNS (Domain Name System) is a system that allows computers from around the world to translate human-readable domain names (such as `yolo.com`) to machine-understandable adresses called IP addresses (such as `11.22.33.44`). For this translation (and other features) to work, you must carefully configure DNS records. - -YunoHost can generate a recommended DNS configuration for each domain, including elements needed for mail and XMPP. The recommended DNS configuration is available in the webadmin via Domain > (the domain) > DNS configuration, or with the command `yunohost domain dns-conf the.domain.tld`. - -## SSL/HTTPS certificates - -Another important aspect of domain configuration is the SSL/HTTPS certificate. YunoHost is integrated with Let's Encrypt, so once your server is correctly reachable from anybody on the internet through the domain name, the administrator can request a Let's Encrypt certificate. See the documentation about [certificates](/certificate) for more information. - -## Subpaths vs. individual domains per apps - -In the context of YunoHost, it is quite common to have a single (or a few) domains on which several apps are installed in "subpaths", so that you end up with something like this: - -```bash -yolo.com - ├── /blog : Wordpress (a blog) - ├── /cloud : Nextcloud (a cloud service) - ├── /rss : TinyTiny RSS (a RSS reader) - ├── /wiki : DokuWiki (a wiki) -``` - -Alternatively, you may choose to install each (or some) apps on a dedicated domain. Beyond the aesthetic, using sub-domains instead of sub-paths allows the possibility to move a service to another server more easily. Also, some applications may need an entire domain dedicated to them, for technical reasons. The disadvantage is that you have to add a new domain each time, and therefore potentially configure additional DNS records, restart the diagnostics and install a new Let's Encrypt certificate. - -This might look prettier for end users, but is generally considered more complicated and less efficient in the context of YunoHost, since you need to add a new domain each time. Nevertheless, some apps might need an entire domain dedicated to them, for technical reasons. - -If all apps from the previous example were installed on a separate domain, this would give something like this: - -```bash -blog.yolo.com : Wordpress (a blog) -cloud.yolo.com : Nextcloud (a cloud service) -rss.yolo.com : TinyTiny RSS (a RSS reader) -wiki.yolo.com : DokuWiki (a wiki) -``` - -!!! Many applications integrate a functionality that allows you to change the URL of your application. This choice between subpath and subdomain can be reversed in some cases via a simple manipulation in the administration interface. diff --git a/pages/01.administrate/07.specific_use_cases/12.api/admin_api.md b/pages/01.administrate/07.specific_use_cases/12.api/admin_api.md deleted file mode 100644 index ae402051..00000000 --- a/pages/01.administrate/07.specific_use_cases/12.api/admin_api.md +++ /dev/null @@ -1,62 +0,0 @@ ---- -title: Administration from the API or an external application -template: docs -taxonomy: - category: docs -routes: - default: '/admin_api' ---- - -All command line actions can also be ran from the web API. The API is available at https://your.server/yunohost/api. For now there's no documentation on the various routes... but you can get an idea by looking at the actionmap [here](https://github.com/YunoHost/yunohost/blob/dev/data/actionsmap/yunohost.yml) (in particular the `api` stuff). - -## Using cURL - -You must first retrieve a login cookie to perform the actions. Here is an example with cURL: - -```bash -# Login (with admin password) -curl -k -H "X-Requested-With: customscript" \ - -d "password=supersecretpassword" \ - -dump-header headers \ - https://your.server/yunohost/api/login - -# GET example -curl -k -i -H "Accept: application/json" \ - -H "Content-Type: application/json" \ - -L -b headers -X GET https://your.server/yunohost/api/ROUTE \ - | grep } | python -mjson.tool -``` - -## Using a PHP class - -To simplify the remote administration of a YunoHost instance in CHATONS/Librehosters projects, API classes have been developed by users. - -For example, this [PHP class](https://github.com/scith/yunohost-api-php) will allow you to administer your YunoHost instance from a PHP application (website, capacity management tool...). - -Here is an example of PHP code to add a user to your YunoHost instance: - -```php -require("ynh_api.class.php"); -$ynh = new YNH_API("adresse IP du serveur YunoHost ou nom d’hôte", "mot de passe administrateur"); - -if ($ynh->login()) { - $domains = $ynh->get("/domains"); - $first_domain = $domains['domains'][0]; - - $arguments = array( - 'username' => 'test', - 'password' => 'yunohost', - 'firstname' => 'Prénom', - 'lastname' => 'Nom', - 'mail' => 'test@'.$first_domain, - 'mailbox_quota' => '500M' - ); - - $user_add = $ynh->post("/users", $arguments); - print_r($user_add); - -} else { - print("Login to YunoHost failed.\n"); - exit; -} -``` diff --git a/pages/01.administrate/07.specific_use_cases/specific_use_cases.fr.md b/pages/01.administrate/07.specific_use_cases/specific_use_cases.fr.md deleted file mode 100644 index e4b84c34..00000000 --- a/pages/01.administrate/07.specific_use_cases/specific_use_cases.fr.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -title: Cas d'usage spécifiques -template: docs -taxonomy: - category: docs -routes: - default: '/specific_use_cases' ---- - -Dans les pages suivantes, vous trouverez des explications spécifiques à certains cas d'utilisation diff --git a/pages/01.administrate/07.specific_use_cases/specific_use_cases.md b/pages/01.administrate/07.specific_use_cases/specific_use_cases.md deleted file mode 100644 index d610070d..00000000 --- a/pages/01.administrate/07.specific_use_cases/specific_use_cases.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -title: Specific use cases -template: docs -taxonomy: - category: docs -routes: - default: '/specific_use_cases' ---- - -In the following pages you will find tutorials for specific use cases. diff --git a/pages/01.administrate/08.troubleshooting/05.unblacklisting/blacklist_forms.md b/pages/01.administrate/08.troubleshooting/05.unblacklisting/blacklist_forms.md deleted file mode 100644 index 168ec91e..00000000 --- a/pages/01.administrate/08.troubleshooting/05.unblacklisting/blacklist_forms.md +++ /dev/null @@ -1,27 +0,0 @@ ---- -title: Unblacklisting forms -template: docs -taxonomy: - category: docs -routes: - default: '/blacklist_forms' ---- - -It could happen sometimes that your IP is blacklisted by some email provider, or anti-spam services. - -## Test your server - -* [Test sending an email](https://www.mail-tester.com) -- [Test from an IP address](http://whatismyipaddress.com/blacklist-check) - -Here is some forms that could help you remove your IP address from these lists - -## Email providers - -* [Microsoft](https://support.microsoft.com/en-us/getsupport?oaspworkflow=start_1.0.0.0&wfname=capsub&productkey=edfsmsbl3&locale=en-us) -* [GMail](https://support.google.com/mail/contact/msgdelivery) - -## Anti-spam services - -* [SpamHaus](http://www.spamhaus.org/lookup) -* http://whatismyipaddress.com/blacklist-check diff --git a/pages/01.administrate/admindoc.es.md b/pages/01.administrate/admindoc.es.md deleted file mode 100644 index 227b2b6d..00000000 --- a/pages/01.administrate/admindoc.es.md +++ /dev/null @@ -1,16 +0,0 @@ ---- -title: Admin guide -template: chapter -taxonomy: - category: docs -routes: - default: /admindoc ---- - -### Administrar - -# Descubre el auto-hospedaje, cómo instalar y usar tu YunoHost \ No newline at end of file diff --git a/pages/01.administrate/01.selfhosting/selfhosting.de.md b/pages/01.overview/05.self_hosting/self_hosting.de.md similarity index 100% rename from pages/01.administrate/01.selfhosting/selfhosting.de.md rename to pages/01.overview/05.self_hosting/self_hosting.de.md diff --git a/pages/01.administrate/01.selfhosting/selfhosting.es.md b/pages/01.overview/05.self_hosting/self_hosting.es.md similarity index 100% rename from pages/01.administrate/01.selfhosting/selfhosting.es.md rename to pages/01.overview/05.self_hosting/self_hosting.es.md diff --git a/pages/01.administrate/01.selfhosting/selfhosting.fr.md b/pages/01.overview/05.self_hosting/self_hosting.fr.md similarity index 100% rename from pages/01.administrate/01.selfhosting/selfhosting.fr.md rename to pages/01.overview/05.self_hosting/self_hosting.fr.md diff --git a/pages/01.administrate/01.selfhosting/selfhosting.it.md b/pages/01.overview/05.self_hosting/self_hosting.it.md similarity index 98% rename from pages/01.administrate/01.selfhosting/selfhosting.it.md rename to pages/01.overview/05.self_hosting/self_hosting.it.md index 6e0b9db0..45c2b595 100644 --- a/pages/01.administrate/01.selfhosting/selfhosting.it.md +++ b/pages/01.overview/05.self_hosting/self_hosting.it.md @@ -17,7 +17,7 @@ Praticare il self-hosting non rende il "tuo internet" più sicuro e non fornisce - **Credi in un internet libero, aperto e decentralizzato.** In un internet centralizzato, le aziende private e i governi possono controllare, analizzare e influenzare le persone partendo da come possono interagire gli uni con gli altri, fino ad arrivare a filtrare i contenuti. YunoHost è sviluppato da una comunità che crede in un internet aperto e decentralizzato. Speriamo che anche tu la pensi allo stesso modo! -- **Vuoi avere il controllo dei tuoi dati e dei servizi.** Le tue immagini, i tuoi messaggi di chat, la tua cronologia di navigazione, e le tue discussione per la scuola non hanno niente che fare con il computer di qualcun altro (a.k.a. il Cloud). Questi dati fanno parte della tua vita privata, ma anche quella della tua famiglia, dei tuoi amici, ecc. Questi dati dovrebbero essere gestiti da *te*, e non per da una qualunque azienda americana che cerca di analizzare i tuoi dati per rivendere i risultati. +- **Vuoi avere il controllo dei tuoi dati e dei servizi.** Le tue immagini, i tuoi messaggi di chat, la tua cronologia di navigazione, e i testi che scrivi per la scuola non hanno niente che fare con il computer di qualcun altro (a.k.a. il Cloud). Questi dati fanno parte della tua vita privata, ma anche quella della tua famiglia, dei tuoi amici, ecc. Questi dati dovrebbero essere gestiti da *te*, e non per da una qualunque azienda americana che cerca di analizzare i tuoi dati per rivendere i risultati. - **Vuoi capire come funzionano i computer e Internet.** Operare sul proprio server è un buon modo per imparare i meccanismi alla base del cuore di un sistema operativo (OS) e di Internet. Dovrai probabilmente far ricorso alla linea di comando e ai meccanismi di configurazione delle risorse e i DNS. diff --git a/pages/01.administrate/01.selfhosting/selfhosting.md b/pages/01.overview/05.self_hosting/self_hosting.md similarity index 100% rename from pages/01.administrate/01.selfhosting/selfhosting.md rename to pages/01.overview/05.self_hosting/self_hosting.md diff --git a/pages/01.administrate/01.selfhosting/selfhosting.ru.md b/pages/01.overview/05.self_hosting/self_hosting.ru.md similarity index 100% rename from pages/01.administrate/01.selfhosting/selfhosting.ru.md rename to pages/01.overview/05.self_hosting/self_hosting.ru.md diff --git a/pages/01.administrate/02.whatisyunohost/whatsyunohost.ar.md b/pages/01.overview/10.what_is_yunohost/what_is_yunohost.ar.md similarity index 100% rename from pages/01.administrate/02.whatisyunohost/whatsyunohost.ar.md rename to pages/01.overview/10.what_is_yunohost/what_is_yunohost.ar.md diff --git a/pages/01.administrate/02.whatisyunohost/whatsyunohost.de.md b/pages/01.overview/10.what_is_yunohost/what_is_yunohost.de.md similarity index 100% rename from pages/01.administrate/02.whatisyunohost/whatsyunohost.de.md rename to pages/01.overview/10.what_is_yunohost/what_is_yunohost.de.md diff --git a/pages/01.administrate/02.whatisyunohost/whatsyunohost.es.md b/pages/01.overview/10.what_is_yunohost/what_is_yunohost.es.md similarity index 100% rename from pages/01.administrate/02.whatisyunohost/whatsyunohost.es.md rename to pages/01.overview/10.what_is_yunohost/what_is_yunohost.es.md diff --git a/pages/01.administrate/02.whatisyunohost/whatsyunohost.fr.md b/pages/01.overview/10.what_is_yunohost/what_is_yunohost.fr.md similarity index 100% rename from pages/01.administrate/02.whatisyunohost/whatsyunohost.fr.md rename to pages/01.overview/10.what_is_yunohost/what_is_yunohost.fr.md diff --git a/pages/01.administrate/02.whatisyunohost/whatsyunohost.it.md b/pages/01.overview/10.what_is_yunohost/what_is_yunohost.it.md similarity index 100% rename from pages/01.administrate/02.whatisyunohost/whatsyunohost.it.md rename to pages/01.overview/10.what_is_yunohost/what_is_yunohost.it.md diff --git a/pages/01.administrate/02.whatisyunohost/whatsyunohost.md b/pages/01.overview/10.what_is_yunohost/what_is_yunohost.md similarity index 100% rename from pages/01.administrate/02.whatisyunohost/whatsyunohost.md rename to pages/01.overview/10.what_is_yunohost/what_is_yunohost.md diff --git a/pages/01.administrate/02.whatisyunohost/whatsyunohost.ru.md b/pages/01.overview/10.what_is_yunohost/what_is_yunohost.ru.md similarity index 100% rename from pages/01.administrate/02.whatisyunohost/whatsyunohost.ru.md rename to pages/01.overview/10.what_is_yunohost/what_is_yunohost.ru.md diff --git a/pages/01.administrate/03.tryyunohost/try.ar.md b/pages/01.overview/15.try_yunohost/try_yunohost.ar.md similarity index 100% rename from pages/01.administrate/03.tryyunohost/try.ar.md rename to pages/01.overview/15.try_yunohost/try_yunohost.ar.md diff --git a/pages/01.administrate/03.tryyunohost/try.ca.md b/pages/01.overview/15.try_yunohost/try_yunohost.ca.md similarity index 100% rename from pages/01.administrate/03.tryyunohost/try.ca.md rename to pages/01.overview/15.try_yunohost/try_yunohost.ca.md diff --git a/pages/01.administrate/03.tryyunohost/try.de.md b/pages/01.overview/15.try_yunohost/try_yunohost.de.md similarity index 100% rename from pages/01.administrate/03.tryyunohost/try.de.md rename to pages/01.overview/15.try_yunohost/try_yunohost.de.md diff --git a/pages/01.administrate/03.tryyunohost/try.es.md b/pages/01.overview/15.try_yunohost/try_yunohost.es.md similarity index 100% rename from pages/01.administrate/03.tryyunohost/try.es.md rename to pages/01.overview/15.try_yunohost/try_yunohost.es.md diff --git a/pages/01.administrate/03.tryyunohost/try.fr.md b/pages/01.overview/15.try_yunohost/try_yunohost.fr.md similarity index 100% rename from pages/01.administrate/03.tryyunohost/try.fr.md rename to pages/01.overview/15.try_yunohost/try_yunohost.fr.md diff --git a/pages/01.administrate/03.tryyunohost/try.it.md b/pages/01.overview/15.try_yunohost/try_yunohost.it.md similarity index 100% rename from pages/01.administrate/03.tryyunohost/try.it.md rename to pages/01.overview/15.try_yunohost/try_yunohost.it.md diff --git a/pages/01.administrate/03.tryyunohost/try.md b/pages/01.overview/15.try_yunohost/try_yunohost.md similarity index 100% rename from pages/01.administrate/03.tryyunohost/try.md rename to pages/01.overview/15.try_yunohost/try_yunohost.md diff --git a/pages/01.overview/overview.fr.md b/pages/01.overview/overview.fr.md new file mode 100644 index 00000000..865b60bd --- /dev/null +++ b/pages/01.overview/overview.fr.md @@ -0,0 +1,10 @@ +--- +title: Vue d'ensemble +template: chapter +taxonomy: + category: docs +routes: + default: /overview +--- + +# Vue d'ensemble diff --git a/pages/01.overview/overview.md b/pages/01.overview/overview.md new file mode 100644 index 00000000..8219022b --- /dev/null +++ b/pages/01.overview/overview.md @@ -0,0 +1,10 @@ +--- +title: Overview +template: chapter +taxonomy: + category: docs +routes: + default: /overview +--- + +# Overview diff --git a/pages/01.administrate/04.howtohostyourself/howtohostyourself.de.md b/pages/02.administer/05.how_to_host_yourself/how_to_host_yourself.de.md similarity index 98% rename from pages/01.administrate/04.howtohostyourself/howtohostyourself.de.md rename to pages/02.administer/05.how_to_host_yourself/how_to_host_yourself.de.md index edc71de3..e1016ed9 100644 --- a/pages/01.administrate/04.howtohostyourself/howtohostyourself.de.md +++ b/pages/02.administer/05.how_to_host_yourself/how_to_host_yourself.de.md @@ -25,7 +25,7 @@ Ein VPN ist ein verschlüsselter Tunnel zwischen zwei Computern. In der Praxis s ### Auf einem Remote-Server (VPS oder dedizierter Server) -Sie können einen virtuellen privaten Server oder eine dedizierte Maschine von [associative](https://db.ffdn.org/) oder von anderen kommerziellen "Cloud"-Anbietern mieten. +Sie können einen virtuellen privaten Server oder eine dedizierte Maschine von [associative](https://db.ffdn.org/) oder von anderen [kommerziellen](/providers/server) "Cloud"-Anbietern mieten. - **Pros** : Ihr Server und seine Internetverbindung sind schnell; - **Cons** : Sie müssen ein monatliches Abonnement bezahlen und haben keine physische Kontrolle über Ihren Server. diff --git a/pages/01.administrate/04.howtohostyourself/howtohostyourself.es.md b/pages/02.administer/05.how_to_host_yourself/how_to_host_yourself.es.md similarity index 96% rename from pages/01.administrate/04.howtohostyourself/howtohostyourself.es.md rename to pages/02.administer/05.how_to_host_yourself/how_to_host_yourself.es.md index 36a08ffb..6d28bf35 100644 --- a/pages/01.administrate/04.howtohostyourself/howtohostyourself.es.md +++ b/pages/02.administer/05.how_to_host_yourself/how_to_host_yourself.es.md @@ -1,5 +1,5 @@ --- -title: Elegir manera de autohospedaje +title: Elegir manera y proveedores de autohospedaje template: docs taxonomy: category: docs @@ -25,7 +25,7 @@ Una VPN es un tunel encriptado entre dos máquinas. En la práctica, permite hac ### En un servidor remoto (VPS o servidor dedicado) -Puedes alquilar un servidor privado virtual (VPS) o una máquina dedicada a alojamientos [asociativos](https://db.ffdn.org/) o comerciales. +Puedes alquilar un servidor privado virtual (VPS) o una máquina dedicada a alojamientos [asociativos](https://db.ffdn.org/) o [comerciales](/providers/server). - **Ventajas**: Tu servidor será rápido y su conexión veloz. - **Desventajas**: Ocasiona un gasto mensual por la máquina, y no tienes control físico. diff --git a/pages/01.administrate/04.howtohostyourself/howtohostyourself.fr.md b/pages/02.administer/05.how_to_host_yourself/how_to_host_yourself.fr.md similarity index 96% rename from pages/01.administrate/04.howtohostyourself/howtohostyourself.fr.md rename to pages/02.administer/05.how_to_host_yourself/how_to_host_yourself.fr.md index ccebf174..1547a296 100644 --- a/pages/01.administrate/04.howtohostyourself/howtohostyourself.fr.md +++ b/pages/02.administer/05.how_to_host_yourself/how_to_host_yourself.fr.md @@ -1,5 +1,5 @@ --- -title: Choisir son mode d'autohébergement +title: Choisir son mode et fournisseurs d'autohébergement template: docs taxonomy: category: docs @@ -25,7 +25,7 @@ Un VPN est un tunnel chiffré entre deux machines. En pratique, cela permet de f ### Sur un serveur distant (VPS ou serveur dédié) -Vous pouvez louer un serveur privé virtuel ou une machine dédiée à des hébergeurs [associatifs](https://db.ffdn.org/) ou commerciaux. +Vous pouvez louer un serveur privé virtuel ou une machine dédiée à des hébergeurs [associatifs](https://db.ffdn.org/) ou [commerciaux](/providers/server). - **Avantages** : votre serveur sera rapide et la connectivité internet sera bonne ; - **Inconvénients** : il vous faudra payer des frais mensuels pour la machine, et vous n'aurez pas de contrôle physique dessus. diff --git a/pages/01.administrate/04.howtohostyourself/howtohostyourself.it.md b/pages/02.administer/05.how_to_host_yourself/how_to_host_yourself.it.md similarity index 97% rename from pages/01.administrate/04.howtohostyourself/howtohostyourself.it.md rename to pages/02.administer/05.how_to_host_yourself/how_to_host_yourself.it.md index 559a06b9..6fed1792 100644 --- a/pages/01.administrate/04.howtohostyourself/howtohostyourself.it.md +++ b/pages/02.administer/05.how_to_host_yourself/how_to_host_yourself.it.md @@ -1,5 +1,5 @@ --- -title: Scegliere il proprio self-hosting +title: Scegliere il tuo metodo e provider de self-hosting template: docs taxonomy: category: docs @@ -25,7 +25,7 @@ Una VPN è un tunnel criptato tra due macchine. In pratica permette di avere una ### Su un server distante (VPS o server dedicato) -Puoi affittare un server virtuale privato o un macchina dedicata da fornitori "Cloud" come [associazioni](https://db.ffdn.org) o commerciali +Puoi affittare un server virtuale privato o un macchina dedicata da fornitori "Cloud" come [associazioni](https://db.ffdn.org) o [commerciali](/providers/server) - **Pro**: il tuo server e la connessione saranno veloci; - **Contro**: dovrai pagare un canone mensile per la macchina e non avrai il controllo fisico del tuo server. diff --git a/pages/01.administrate/04.howtohostyourself/howtohostyourself.md b/pages/02.administer/05.how_to_host_yourself/how_to_host_yourself.md similarity index 96% rename from pages/01.administrate/04.howtohostyourself/howtohostyourself.md rename to pages/02.administer/05.how_to_host_yourself/how_to_host_yourself.md index 1be0dd10..7f4e8af1 100644 --- a/pages/01.administrate/04.howtohostyourself/howtohostyourself.md +++ b/pages/02.administer/05.how_to_host_yourself/how_to_host_yourself.md @@ -1,5 +1,5 @@ --- -title: How to host yourself? +title: Choose your selfhosting method and providers template: docs taxonomy: category: docs @@ -25,7 +25,7 @@ A VPN is an encrypted tunnel between two machines. In practice, it makes it "as ### On a remote server (VPS or dedicated server) -You can rent a virtual private server or a dedicated machine from [associative](https://db.ffdn.org/) or commercial "Cloud" providers. +You can rent a virtual private server or a dedicated machine from [associative](https://db.ffdn.org/) or [commercial](/providers/server) "Cloud" providers. - **Pros** : your server and its internet connectivity will be fast; - **Cons** : you will have to pay a monthly subscription and won't have physical control of your server. diff --git a/pages/01.administrate/05.install/10.images/images.ar.md b/pages/02.administer/10.install/05.images/images.ar.md similarity index 100% rename from pages/01.administrate/05.install/10.images/images.ar.md rename to pages/02.administer/10.install/05.images/images.ar.md diff --git a/pages/01.administrate/05.install/10.images/images.de.md b/pages/02.administer/10.install/05.images/images.de.md similarity index 100% rename from pages/01.administrate/05.install/10.images/images.de.md rename to pages/02.administer/10.install/05.images/images.de.md diff --git a/pages/01.administrate/05.install/10.images/images.es.md b/pages/02.administer/10.install/05.images/images.es.md similarity index 100% rename from pages/01.administrate/05.install/10.images/images.es.md rename to pages/02.administer/10.install/05.images/images.es.md diff --git a/pages/01.administrate/05.install/10.images/images.fr.md b/pages/02.administer/10.install/05.images/images.fr.md similarity index 91% rename from pages/01.administrate/05.install/10.images/images.fr.md rename to pages/02.administer/10.install/05.images/images.fr.md index e8dd13ac..c43ca95a 100644 --- a/pages/01.administrate/05.install/10.images/images.fr.md +++ b/pages/02.administer/10.install/05.images/images.fr.md @@ -17,8 +17,9 @@ Cette page requiert que Javascript soit activé pour s'afficher correctement :s. !!! Si vous souhaitez vérifier la validité de nos images signées, vous pouvez [télécharger notre clé publique](https://forge.yunohost.org/yunohost.asc). -! Les images actuelles sont basées sur Debian Buster (YunoHost v4.x) et nécessitent que vous fassiez la commande `apt update` en SSH ou ligne de commande pour continuer les mises à jour. +! Certaines images sont encore basées sur Debian Buster (YunoHost v4.x) et nécessitent que vous fassiez la commande `apt update` en SSH ou ligne de commande pour continuer les mises à jour. ! Répondez Oui à l'avertissement à propos du changement de `stable` vers `oldstable`. +! Cette opération n'est pas nécessaire pour YunoHost 11.x (images Bullseye)
diff --git a/pages/01.administrate/05.install/10.images/images.md b/pages/02.administer/10.install/05.images/images.md similarity index 92% rename from pages/01.administrate/05.install/10.images/images.md rename to pages/02.administer/10.install/05.images/images.md index 77bb4b1b..8568bd51 100644 --- a/pages/01.administrate/05.install/10.images/images.md +++ b/pages/02.administer/10.install/05.images/images.md @@ -17,8 +17,9 @@ This page requires Javascript enabled to display properly :s. !!! If you wish to check the validity of our signed images, you can [download our public key](https://forge.yunohost.org/yunohost.asc). -! Current images are from Debian Buster (YunoHost v4.x) and will require that you perform a manual `apt update` command in SSH or CLI to continue updating. +! Some images are still in Debian Buster (YunoHost v4.x) and will require that you perform a manual `apt update` command in SSH or CLI to continue updating. ! Answer Yes to the warning about switching from `stable` to `oldstable`. +! You don't need to do that for YunoHost 11.x (Bullseye images)
diff --git a/pages/01.administrate/05.install/02.findinglocalip/finding_the_local_ip.de.md b/pages/02.administer/10.install/10.finding_the_local_ip/finding_the_local_ip.de.md similarity index 100% rename from pages/01.administrate/05.install/02.findinglocalip/finding_the_local_ip.de.md rename to pages/02.administer/10.install/10.finding_the_local_ip/finding_the_local_ip.de.md diff --git a/pages/01.administrate/05.install/02.findinglocalip/finding_the_local_ip.fr.md b/pages/02.administer/10.install/10.finding_the_local_ip/finding_the_local_ip.fr.md similarity index 100% rename from pages/01.administrate/05.install/02.findinglocalip/finding_the_local_ip.fr.md rename to pages/02.administer/10.install/10.finding_the_local_ip/finding_the_local_ip.fr.md diff --git a/pages/01.administrate/05.install/02.findinglocalip/finding_the_local_ip.md b/pages/02.administer/10.install/10.finding_the_local_ip/finding_the_local_ip.md similarity index 100% rename from pages/01.administrate/05.install/02.findinglocalip/finding_the_local_ip.md rename to pages/02.administer/10.install/10.finding_the_local_ip/finding_the_local_ip.md diff --git a/pages/01.administrate/05.install/03.isp_box_config/isp_box_config.de.md b/pages/02.administer/10.install/15.isp_box_config/isp_box_config.de.md similarity index 100% rename from pages/01.administrate/05.install/03.isp_box_config/isp_box_config.de.md rename to pages/02.administer/10.install/15.isp_box_config/isp_box_config.de.md diff --git a/pages/01.administrate/05.install/03.isp_box_config/isp_box_config.es.md b/pages/02.administer/10.install/15.isp_box_config/isp_box_config.es.md similarity index 100% rename from pages/01.administrate/05.install/03.isp_box_config/isp_box_config.es.md rename to pages/02.administer/10.install/15.isp_box_config/isp_box_config.es.md diff --git a/pages/01.administrate/05.install/03.isp_box_config/isp_box_config.fr.md b/pages/02.administer/10.install/15.isp_box_config/isp_box_config.fr.md similarity index 100% rename from pages/01.administrate/05.install/03.isp_box_config/isp_box_config.fr.md rename to pages/02.administer/10.install/15.isp_box_config/isp_box_config.fr.md diff --git a/pages/01.administrate/05.install/03.isp_box_config/isp_box_config.md b/pages/02.administer/10.install/15.isp_box_config/isp_box_config.md similarity index 100% rename from pages/01.administrate/05.install/03.isp_box_config/isp_box_config.md rename to pages/02.administer/10.install/15.isp_box_config/isp_box_config.md diff --git a/pages/01.administrate/05.install/04.dns/dns_config.de.md b/pages/02.administer/10.install/20.dns_config/dns_config.de.md similarity index 100% rename from pages/01.administrate/05.install/04.dns/dns_config.de.md rename to pages/02.administer/10.install/20.dns_config/dns_config.de.md diff --git a/pages/01.administrate/05.install/04.dns/dns_config.es.md b/pages/02.administer/10.install/20.dns_config/dns_config.es.md similarity index 100% rename from pages/01.administrate/05.install/04.dns/dns_config.es.md rename to pages/02.administer/10.install/20.dns_config/dns_config.es.md diff --git a/pages/01.administrate/05.install/04.dns/dns_config.fr.md b/pages/02.administer/10.install/20.dns_config/dns_config.fr.md similarity index 100% rename from pages/01.administrate/05.install/04.dns/dns_config.fr.md rename to pages/02.administer/10.install/20.dns_config/dns_config.fr.md diff --git a/pages/01.administrate/05.install/04.dns/dns_config.md b/pages/02.administer/10.install/20.dns_config/dns_config.md similarity index 100% rename from pages/01.administrate/05.install/04.dns/dns_config.md rename to pages/02.administer/10.install/20.dns_config/dns_config.md diff --git a/pages/01.administrate/05.install/install.fr.md b/pages/02.administer/10.install/install.fr.md similarity index 97% rename from pages/01.administrate/05.install/install.fr.md rename to pages/02.administer/10.install/install.fr.md index f18d7cf5..8e3b3364 100644 --- a/pages/01.administrate/05.install/install.fr.md +++ b/pages/02.administer/10.install/install.fr.md @@ -116,7 +116,7 @@ Sélectionnez le matériel sur lequel vous souhaitez installer YunoHost : {% elseif vps_debian or vps_ynh %} [div class="flex-child hardware{%if vps_debian %} active{% endif %}"] -[[figure caption="VPS ou serveur dédié avec Debian 10"]![](image://debian-logo.png?height=50)[/figure]](/install/hardware:vps_debian) +[[figure caption="VPS ou serveur dédié avec Debian 11"]![](image://debian-logo.png?height=50)[/figure]](/install/hardware:vps_debian) [/div] [div class="flex-child hardware{%if vps_ynh %} active{% endif %}"] @@ -165,7 +165,7 @@ Cependant, ces images communautaires existent et sont disponibles sur Docker Hub {% elseif arm_unsup %} * Une carte ARM avec au moins 512Mo de RAM ; {% elseif vps_debian %} -* Un serveur dédié ou virtuel avec Debian 10 (Buster) pré-installé (avec un **kernel >= 3.12**), avec au moins 512Mo de RAM et 16Go de capacité de stockage ; +* Un serveur dédié ou virtuel avec Debian 11 (Bullseye) pré-installé (avec un **kernel >= 3.12**), avec au moins 512Mo de RAM et 16Go de capacité de stockage ; {% elseif vps_ynh %} * Un serveur dédié ou virtuel avec YunoHost pré-installé, avec au moins 512Mo de RAM et 16Go de capacité de stockage ; {% elseif virtualbox %} @@ -208,7 +208,7 @@ Ci-dessous une liste de fournisseurs de VPS supportant nativement YunoHost : [[figure caption="Alsace Réseau Neutre - FR"]![](image://vps_ynh_arn.png?height=50)[/figure]](https://vps.arn-fai.net) [/div] [div class="flex-child"] -[[figure caption="Association ECOWAN - FR"]![](https://cdn.ecowan.fr/charte-graphique/ecowan/logo/bleu-blanc/logo-bleu-clair.svg?height=50)[/figure]](https://www.ecowan.fr/vps-linux) +[[figure caption="Association ECOWAN - FR"]![](image://vps_ynh_ecowan.png?height=50)[/figure]](https://www.ecowan.fr/vps-linux) [/div] [/div] {% endif %} @@ -222,13 +222,15 @@ Ci-dessous une liste de fournisseurs de VPS supportant nativement YunoHost : {% elseif arm_unsup %} [fa=external-link] Télécharger l'image pour votre carte sur le site d'Armbian -!!! N.B.: il vous faut télécharger l'image Armbian Buster. +!!! N.B.: il vous faut télécharger l'image Armbian Bullseye. {% endif %} !!! Si vous souhaitez vérifier la validité de nos images signées, vous pouvez [télécharger notre clé publique](https://forge.yunohost.org/yunohost.asc). -! Les images actuelles sont basées sur Debian Buster (YunoHost v4.x) et nécessitent que vous fassiez la commande `apt update` en SSH ou ligne de commande pour continuer les mises à jour. +{% if internetcube or arm_sup %} +! Les images sont basées sur Debian Buster (YunoHost v4.x) et nécessitent que vous fassiez la commande `apt update` en SSH ou ligne de commande pour continuer les mises à jour. ! Répondez Oui à l'avertissement à propos du changement de `stable` vers `oldstable`. +{% endif %}
diff --git a/pages/01.administrate/05.install/install.it.md b/pages/02.administer/10.install/install.it.md similarity index 98% rename from pages/01.administrate/05.install/install.it.md rename to pages/02.administer/10.install/install.it.md index 52552a45..b53b5c2b 100644 --- a/pages/01.administrate/05.install/install.it.md +++ b/pages/02.administer/10.install/install.it.md @@ -116,7 +116,7 @@ Seleziona l'hardware sul quale desideri installare YunoHost : {% elseif vps_debian or vps_ynh %} [div class="flex-child hardware{%if vps_debian %} active{% endif %}"] -[[figure caption="VPS o server dedicato con Debian 10"]![](image://debian-logo.png?height=50)[/figure]](/install/hardware:vps_debian) +[[figure caption="VPS o server dedicato con Debian 11"]![](image://debian-logo.png?height=50)[/figure]](/install/hardware:vps_debian) [/div] [div class="flex-child hardware{%if vps_ynh %} active{% endif %}"] @@ -165,7 +165,7 @@ However, community images exist and are available on Docker Hub: {% elseif arm_unsup %} * An ARM board with at least 512MB RAM {% elseif vps_debian %} -* A dedicated or virtual private server with Debian 10 (Buster) (with **kernel >= 3.12**) preinstalled, 512MB RAM and 16GB capacity (at least) +* A dedicated or virtual private server with Debian 11 (Bullseye) (with **kernel >= 3.12**) preinstalled, 512MB RAM and 16GB capacity (at least) {% elseif vps_ynh %} * A dedicated or virtual private server with yunohost preinstalled, 512MB RAM and 16GB capacity (at least) {% elseif virtualbox %} @@ -220,7 +220,7 @@ Here are some VPS providers supporting YunoHost natively : {% elseif arm_unsup %} [fa=external-link] Download the image for your board on Armbian's website -!!! N.B.: you should download the image Armbian Buster. +!!! N.B.: you should download the image Armbian Bullseye. {% endif %} diff --git a/pages/01.administrate/05.install/install.md b/pages/02.administer/10.install/install.md similarity index 98% rename from pages/01.administrate/05.install/install.md rename to pages/02.administer/10.install/install.md index e41111d2..0c8632ba 100644 --- a/pages/01.administrate/05.install/install.md +++ b/pages/02.administer/10.install/install.md @@ -116,7 +116,7 @@ Select the hardware on which you want install YunoHost : {% elseif vps_debian or vps_ynh %} [div class="flex-child hardware{%if vps_debian %} active{% endif %}"] -[[figure caption="VPS or dedicated server with Debian 10"]![](image://debian-logo.png?height=50)[/figure]](/install/hardware:vps_debian) +[[figure caption="VPS or dedicated server with Debian 11"]![](image://debian-logo.png?height=50)[/figure]](/install/hardware:vps_debian) [/div] [div class="flex-child hardware{%if vps_ynh %} active{% endif %}"] @@ -165,7 +165,7 @@ However, community images exist and are available on Docker Hub: {% elseif arm_unsup %} * An ARM board with at least 512MB RAM {% elseif vps_debian %} -* A dedicated or virtual private server with Debian 10 (Buster) (with **kernel >= 3.12**) preinstalled, 512MB RAM and 16GB capacity (at least) +* A dedicated or virtual private server with Debian 11 (Bullseye) (with **kernel >= 3.12**) preinstalled, 512MB RAM and 16GB capacity (at least) {% elseif vps_ynh %} * A dedicated or virtual private server with yunohost preinstalled, 512MB RAM and 16GB capacity (at least) {% elseif virtualbox %} @@ -220,13 +220,15 @@ Here are some VPS providers supporting YunoHost natively : {% elseif arm_unsup %} [fa=external-link] Download the image for your board on Armbian's website -!!! N.B.: you should download the image Armbian Buster. +!!! N.B.: you should download the image Armbian Bullseye. {% endif %} !!! If you wish to check the validity of our signed images, you can [download our public key](https://forge.yunohost.org/yunohost.asc). +{% if internetcube or arm_sup %} ! Current images are from Debian Buster (YunoHost v4.x) and will require that you perform a manual apt update command in SSH or CLI to continue updating. ! Answer Yes to the warning about switching from stable to oldstable. +{% endif %}
diff --git a/pages/01.administrate/06.overview/02.guidelines/guidelines.de.md b/pages/02.administer/15.admin_guide/05.guidelines/guidelines.de.md similarity index 100% rename from pages/01.administrate/06.overview/02.guidelines/guidelines.de.md rename to pages/02.administer/15.admin_guide/05.guidelines/guidelines.de.md diff --git a/pages/01.administrate/06.overview/02.guidelines/guidelines.fr.md b/pages/02.administer/15.admin_guide/05.guidelines/guidelines.fr.md similarity index 100% rename from pages/01.administrate/06.overview/02.guidelines/guidelines.fr.md rename to pages/02.administer/15.admin_guide/05.guidelines/guidelines.fr.md diff --git a/pages/01.administrate/06.overview/02.guidelines/guidelines.it.md b/pages/02.administer/15.admin_guide/05.guidelines/guidelines.it.md similarity index 100% rename from pages/01.administrate/06.overview/02.guidelines/guidelines.it.md rename to pages/02.administer/15.admin_guide/05.guidelines/guidelines.it.md diff --git a/pages/01.administrate/06.overview/02.guidelines/guidelines.md b/pages/02.administer/15.admin_guide/05.guidelines/guidelines.md similarity index 100% rename from pages/01.administrate/06.overview/02.guidelines/guidelines.md rename to pages/02.administer/15.admin_guide/05.guidelines/guidelines.md diff --git a/pages/01.administrate/06.overview/03.admin/admin.de.md b/pages/02.administer/15.admin_guide/10.admin/admin.de.md similarity index 100% rename from pages/01.administrate/06.overview/03.admin/admin.de.md rename to pages/02.administer/15.admin_guide/10.admin/admin.de.md diff --git a/pages/01.administrate/06.overview/03.admin/admin.es.md b/pages/02.administer/15.admin_guide/10.admin/admin.es.md similarity index 100% rename from pages/01.administrate/06.overview/03.admin/admin.es.md rename to pages/02.administer/15.admin_guide/10.admin/admin.es.md diff --git a/pages/01.administrate/06.overview/03.admin/admin.fr.md b/pages/02.administer/15.admin_guide/10.admin/admin.fr.md similarity index 100% rename from pages/01.administrate/06.overview/03.admin/admin.fr.md rename to pages/02.administer/15.admin_guide/10.admin/admin.fr.md diff --git a/pages/01.administrate/06.overview/03.admin/admin.it.md b/pages/02.administer/15.admin_guide/10.admin/admin.it.md similarity index 100% rename from pages/01.administrate/06.overview/03.admin/admin.it.md rename to pages/02.administer/15.admin_guide/10.admin/admin.it.md diff --git a/pages/01.administrate/06.overview/03.admin/admin.md b/pages/02.administer/15.admin_guide/10.admin/admin.md similarity index 100% rename from pages/01.administrate/06.overview/03.admin/admin.md rename to pages/02.administer/15.admin_guide/10.admin/admin.md diff --git a/pages/01.administrate/06.overview/04.commandline/ssh.de.md b/pages/02.administer/15.admin_guide/15.command_line/command_line.de.md similarity index 100% rename from pages/01.administrate/06.overview/04.commandline/ssh.de.md rename to pages/02.administer/15.admin_guide/15.command_line/command_line.de.md diff --git a/pages/01.administrate/06.overview/04.commandline/ssh.es.md b/pages/02.administer/15.admin_guide/15.command_line/command_line.es.md similarity index 100% rename from pages/01.administrate/06.overview/04.commandline/ssh.es.md rename to pages/02.administer/15.admin_guide/15.command_line/command_line.es.md diff --git a/pages/01.administrate/06.overview/04.commandline/ssh.fr.md b/pages/02.administer/15.admin_guide/15.command_line/command_line.fr.md similarity index 95% rename from pages/01.administrate/06.overview/04.commandline/ssh.fr.md rename to pages/02.administer/15.admin_guide/15.command_line/command_line.fr.md index 6243f433..19632c76 100644 --- a/pages/01.administrate/06.overview/04.commandline/ssh.fr.md +++ b/pages/02.administer/15.admin_guide/15.command_line/command_line.fr.md @@ -149,14 +149,6 @@ Exemple : ```bash yunohost tools diagnosis | yunopaste ``` - -### La commande `ynh-vpnclient-loadcubefile.sh` -Cette commande n'est disponible que si vous avez l'application `VPN Client` installée. Vous pouvez vous en servir pour charger un nouveau .cube dans le cas où vous ne parvenez pas à aller sur l'interface de `VPN Client` pour le faire. - -```bash -ynh-vpnclient-loadcubefile.sh -u -p -c .cube -``` - ### Quelques commandes utiles Si votre interface web d'administration indique que l'API est injoignable, essayez de démarrer `yunohost-api` : diff --git a/pages/01.administrate/06.overview/04.commandline/ssh.it.md b/pages/02.administer/15.admin_guide/15.command_line/command_line.it.md similarity index 100% rename from pages/01.administrate/06.overview/04.commandline/ssh.it.md rename to pages/02.administer/15.admin_guide/15.command_line/command_line.it.md diff --git a/pages/01.administrate/06.overview/04.commandline/ssh.md b/pages/02.administer/15.admin_guide/15.command_line/command_line.md similarity index 99% rename from pages/01.administrate/06.overview/04.commandline/ssh.md rename to pages/02.administer/15.admin_guide/15.command_line/command_line.md index 86828944..99f6de1b 100644 --- a/pages/01.administrate/06.overview/04.commandline/ssh.md +++ b/pages/02.administer/15.admin_guide/15.command_line/command_line.md @@ -155,6 +155,7 @@ yunohost tools diagnosis | yunopaste ``` ### The `ynh-vpnclient-loadcubefile.sh` command + This command is only available if you have the `VPN Client` application installed. You can use it to load a new .cube in case you can't get to the VPN Client interface to do so. ```bash diff --git a/pages/01.administrate/06.overview/13.permissions/groups_and_permissions.fr.md b/pages/02.administer/15.admin_guide/20.users/05.groups_and_permissions/groups_and_permissions.fr.md similarity index 100% rename from pages/01.administrate/06.overview/13.permissions/groups_and_permissions.fr.md rename to pages/02.administer/15.admin_guide/20.users/05.groups_and_permissions/groups_and_permissions.fr.md diff --git a/pages/01.administrate/06.overview/13.permissions/groups_and_permissions.md b/pages/02.administer/15.admin_guide/20.users/05.groups_and_permissions/groups_and_permissions.md similarity index 100% rename from pages/01.administrate/06.overview/13.permissions/groups_and_permissions.md rename to pages/02.administer/15.admin_guide/20.users/05.groups_and_permissions/groups_and_permissions.md diff --git a/pages/01.administrate/06.overview/05.users/users.de.md b/pages/02.administer/15.admin_guide/20.users/users.de.md similarity index 100% rename from pages/01.administrate/06.overview/05.users/users.de.md rename to pages/02.administer/15.admin_guide/20.users/users.de.md diff --git a/pages/01.administrate/06.overview/05.users/users.fr.md b/pages/02.administer/15.admin_guide/20.users/users.fr.md similarity index 100% rename from pages/01.administrate/06.overview/05.users/users.fr.md rename to pages/02.administer/15.admin_guide/20.users/users.fr.md diff --git a/pages/01.administrate/06.overview/05.users/users.it.md b/pages/02.administer/15.admin_guide/20.users/users.it.md similarity index 100% rename from pages/01.administrate/06.overview/05.users/users.it.md rename to pages/02.administer/15.admin_guide/20.users/users.it.md diff --git a/pages/01.administrate/06.overview/05.users/users.md b/pages/02.administer/15.admin_guide/20.users/users.md similarity index 68% rename from pages/01.administrate/06.overview/05.users/users.md rename to pages/02.administer/15.admin_guide/20.users/users.md index 32f5d94e..8499b90c 100644 --- a/pages/01.administrate/06.overview/05.users/users.md +++ b/pages/02.administer/15.admin_guide/20.users/users.md @@ -3,6 +3,8 @@ title: Users and the SSO template: docs taxonomy: category: docs +page-toc: + active: true routes: default: '/users' --- @@ -27,6 +29,29 @@ In the portal, users can also click on the avatar in the top-left to configure s !!! You should be aware that the SSO can only be reached through the actual domain name (i.e. `https://the.domain.tld/yunohost/sso`), and NOT by just using the IP of the server (i.e. `https://11.22.33.44/yunohost/sso`), contrarily to the webadmin ! This is a bit confusing but is necessary for technical reason. If you are in a situation where you need to access the SSO without having your DNS properly configured for some reason, you might consider tweaking your `/etc/hosts` as described in [this page](/dns_local_network). +## Creating new users + +Only the administrator can create new users. From the webadmin, open the `Users` menu and click on the `+ New user` main button. Fill in all the whole form. + +Users are created with an associated email address (and XMPP account) with the format `username@domain.tld`. Additional email aliases and email forwards can later be added by the admin and the user. + +The password should be at least 8 characters - though it is good practice to use longer password (i.e. a passphrase) and/or to use various kind of characters (uppercase, lowercase, digits and special characters). + +Finalize the user creation by clicking on the `Save` button. + +[center] +![Main menu](image://create_user_1.png?classes=caption "From the main menu of the webadmin, open `Users`.") + +[/center] + +[center] +![Users list](image://create_user_2.png?classes=caption "From the top of the users list, click on `+ New user`.") +[/center] + +[center] +![User creation form](image://create_user_3.png?classes=caption "Fill in the form.") +[/center] + ## User groups and permissions See [this dedicated page](/groups_and_permissions). diff --git a/pages/01.administrate/05.install/06.certificate/certificate.de.md b/pages/02.administer/15.admin_guide/25.domains/01.certificate/certificate.de.md similarity index 100% rename from pages/01.administrate/05.install/06.certificate/certificate.de.md rename to pages/02.administer/15.admin_guide/25.domains/01.certificate/certificate.de.md diff --git a/pages/01.administrate/05.install/06.certificate/certificate.es.md b/pages/02.administer/15.admin_guide/25.domains/01.certificate/certificate.es.md similarity index 100% rename from pages/01.administrate/05.install/06.certificate/certificate.es.md rename to pages/02.administer/15.admin_guide/25.domains/01.certificate/certificate.es.md diff --git a/pages/01.administrate/05.install/06.certificate/certificate.fr.md b/pages/02.administer/15.admin_guide/25.domains/01.certificate/certificate.fr.md similarity index 100% rename from pages/01.administrate/05.install/06.certificate/certificate.fr.md rename to pages/02.administer/15.admin_guide/25.domains/01.certificate/certificate.fr.md diff --git a/pages/01.administrate/05.install/06.certificate/certificate.md b/pages/02.administer/15.admin_guide/25.domains/01.certificate/certificate.md similarity index 100% rename from pages/01.administrate/05.install/06.certificate/certificate.md rename to pages/02.administer/15.admin_guide/25.domains/01.certificate/certificate.md diff --git a/pages/01.administrate/06.overview/07.domains/domains.de.md b/pages/02.administer/15.admin_guide/25.domains/domains.de.md similarity index 95% rename from pages/01.administrate/06.overview/07.domains/domains.de.md rename to pages/02.administer/15.admin_guide/25.domains/domains.de.md index b5c5be6e..905fc39a 100644 --- a/pages/01.administrate/06.overview/07.domains/domains.de.md +++ b/pages/02.administer/15.admin_guide/25.domains/domains.de.md @@ -21,6 +21,11 @@ Beachten Sie abschließend, dass es im Kontext von YunoHost keine Hierarchie zwi Wenn Ihre Domain spezielle, nicht-lateinische Zeichen enthält, müssen Sie ihre [internationalisierte Version](https://de.wikipedia.org/wiki/Internationalisierter_Domainname) über [Punycode](https://de.wikipedia.org/wiki/Punycode) verwenden. Sie können [diesen Konverter](https://www.charset.org/punycode) verwenden und den konvertierten Domainnamen in Ihrer YunoHost-Konfiguration verwenden. +## Subdomains + +! Bitte beachten Sie, dass YunoHost Domains und deren Subdomains unabhängig voneinander betrachtet. +! Sie **müssen** alle Domains und Subdomains, die Sie nutzen möchten, registrieren. + ## DNS-Konfiguration DNS (Domain Name System) ist ein System, das es Computern auf der ganzen Welt ermöglicht, von Menschen lesbare Domain-Namen (wie z.B. `yolo.com`) in maschinenverständliche Adressen, sogenannte IP-Adressen (wie z.B. `11.22.33.44`), zu übersetzen. Damit diese Übersetzung (und andere Funktionen) funktioniert, müssen Sie DNS-Einträge sorgfältig konfigurieren. @@ -33,6 +38,8 @@ Ein weiterer wichtiger Aspekt der Domain-Konfiguration ist das SSL/HTTPS-Zertifi ## Unterpfade vs. einzelne Domains pro Anwendungen +!!!! Section to be moved to a translated /apps_overview page + Im Zusammenhang mit YunoHost ist es durchaus üblich, eine einzige (oder einige wenige) Domains zu haben, auf denen mehrere Anwendungen in "Unterpfaden" installiert sind, so dass man am Ende etwas wie dieses erhält: ```bash diff --git a/pages/01.administrate/06.overview/07.domains/domains.fr.md b/pages/02.administer/15.admin_guide/25.domains/domains.fr.md similarity index 73% rename from pages/01.administrate/06.overview/07.domains/domains.fr.md rename to pages/02.administer/15.admin_guide/25.domains/domains.fr.md index f31752da..3706d12e 100644 --- a/pages/01.administrate/06.overview/07.domains/domains.fr.md +++ b/pages/02.administer/15.admin_guide/25.domains/domains.fr.md @@ -35,6 +35,11 @@ Le chiffre risque de changer selon quel serveur démarre en premier, donc ne com ! Malheureusement, les appareils Android avant la version 12 (sortie en 2021) ne semblent pas écouter le protocole mDNS. ! Pour profiter des domaines `.local` sur vos appareils Android, vous devez entrer l'adresse IP locale de votre serveur YunoHost dans leur paramètre DNS. +## Sous-domaines + +! Gardez bien en tête que YunoHost considère les domaines et leur sous-domaines indépendamment. +! **Il vous faut** enregistrer chacun des domaines et sous-domaines que vous voulez utiliser. + ## Configuration DNS DNS (Domain Name System) est un système qui permet aux ordinateurs du monde entier de traduire les noms de domaine lisibles par l'homme (comme `yolo.com`) en adresses IP compréhensibles par les machines (comme `11.22.33.44`). Pour que cette traduction (et d'autres fonctionnalités) fonctionne, il faut configurer soigneusement les enregistrements DNS. @@ -44,28 +49,3 @@ YunoHost peut générer une configuration DNS recommandée pour chaque domaine, ## Certificats SSL/HTTPS Un autre aspect important de la configuration des domaines est le certificat SSL/HTTPS. YunoHost est intégré avec Let's Encrypt, de sorte qu'une fois que votre serveur est correctement accessible depuis n'importe qui sur Internet via le nom de domaine, l'administrateur peut demander l'installation d'un certificat Let's Encrypt. Voir la documentation sur les [certificats](/certificate) pour plus d'informations. - -## Sous-chemins vs. domaines individuels par application - -Dans le contexte de YunoHost, il est assez courant d'avoir un seul (ou quelques) domaines sur lesquels plusieurs applications sont installées dans des "sous-chemins", de sorte que l'on se retrouve avec quelque chose comme ceci : - -```bash -yolo.com - ├─── /blog : Wordpress (un blog) - ├─── /cloud : Nextcloud (un service de cloud) - ├─── /rss : TinyTiny RSS (un lecteur RSS) - ├─── /wiki : DokuWiki (un wiki) -``` - -Alternativement, on peut choisir d'installer chaque application (ou certaines) sur un domaine dédié. Au delà de la question esthétique, utiliser des sous-domaines au lieu de sous-chemins permet de laisser la possibilité de déplacer un service sur un autre serveur plus facilement. Par ailleurs, certaines applications peuvent avoir besoin d'un domaine entier qui leur est dédié, pour des raisons techniques. L'inconvénient est que vous devez ajouter un nouveau domaine à chaque fois, et donc potentiellement configurer des enregistrements DNS supplémentaire, relancer le diagnostique et l'installation d'un nouveau certificat Let's Encrypt. - -Si toutes les applications de l'exemple précédent étaient installées sur un domaine séparé, cela donnerait quelque chose comme ceci : - -```bash -blog.yolo.com : Wordpress (un blog) -cloud.yolo.com : Nextcloud (un service de cloud) -rss.yolo.com : TinyTiny RSS (un lecteur RSS) -wiki.yolo.com : DokuWiki (un wiki) -``` - -!!! De nombreuses applications intègrent une fonctionnalité qui vous permet de changer l'URL de votre application. Ce choix entre sous-chemin et sous-domaine peut donc dans certains cas être réversible via une simple manipulation dans l'interface d'administration. diff --git a/pages/02.administer/15.admin_guide/25.domains/domains.md b/pages/02.administer/15.admin_guide/25.domains/domains.md new file mode 100644 index 00000000..d1914026 --- /dev/null +++ b/pages/02.administer/15.admin_guide/25.domains/domains.md @@ -0,0 +1,104 @@ +--- +title: Domains +template: docs +taxonomy: + category: docs +routes: + default: '/domains' +shortcode-ui: + theme: + tabs: lite +--- + +DNS (Domain Name System) is a system that allows computers from around the world to translate human-readable domain names (such as `yolo.com`) to machine-understandable adresses called IP addresses (such as `11.22.33.44`). For this translation (and other features) to work, you must carefully configure DNS records. + +YunoHost allows you to manage and serve several domains on the same server with the same public ip. For instance, you can host a blog and Nextcloud on a first domain `yolo.com`, and a web mail client on a second domain `swag.nohost.me`. Each domain is automatically configured to handle web services, mail services and XMPP services. + +Domains can be managed in the 'Domain' section of the webadmin, or through the `yunohost domain` category of the command line. + +![A screenshot of the webadmin domain interface with an "Add domain" button and a list of domains](image://webadmin_domain.png) + +## 3 types of domains + +[ui-tabs position="top-left" active="0" theme="lite"] +[ui-tab title="Yunohost's domains (the free and easy way)"] + +In order to make self-hosting as accessible as possible, the YunoHost Project provides a *free* and *automatically configured* domain name service. By using this service, you won't have to [configure DNS records](/dns_config) yourself, which can be tedious and technical. + +The following (sub)domains are offered: +- `whateveryouwant.nohost.me`; +- `whateveryouwant.noho.st`; +- `whateveryouwant.ynh.fr`. + +In more, YunoHost uses an integrated dynamic DNS mechanism, so your server can stay reachable even if your public IP change. + +To get one of this domain you simply need to choose `I don't have a domaine name…` during the initial configuration (postinstall) or on the `Add domain` page. + +![Here a screenshot of the "Add domain" page where you can choose "I don't have a domain name"](image://webadmin_dyndns.png) + +! To limit resources costs and abuses, each instance may only have one of these domains setup at any given time, however you can add as many sub-domains of it as you wish. For example, if you choose `example.noho.st` you can later add the domains `video.example.noho.st` or `www.example.ynh.noho.st` or any other sub-domain you may need. In this case you need to select `I already have a domain name`. + +!! You have to keep a backup archive of the config file of your server if you want to be able to restore your server with this domain name without [asking help of YunoHost team to recover access on it](https://forum.yunohost.org/t/nohost-domain-recovery-suppression-de-domaine-en-nohost-me-noho-st-et-ynh-fr/442). + +[More information on this domains](/dns_nohost_me) + +[/ui-tab] +[ui-tab title="Your own domains"] +Having your own domain brings several advantages: + + * more control and autonomy + * simpler domain name (for example directly in .net or .org) + +However, you have to pay for it each year (about 15€/year) and you have to do some extra configuration to [setup a correct DNS zone](/dns_config). Our diagnosis tool can trigger alert to help you to do this configuration. + +If you already have your own domain, you can simply click "I already have a domain name…". If you don't, in order to simplify and automate the DNS configuration, we suggest you to buy it from a [registrar whose API is supported by YunoHost](/providers/registrar). + +![Here a screenshot of the "Add domain" page where you can choose "I already have a domain name"](image://webadmin_domain_owndomain.png) + + +[Know more on DNS zone configuration](/dns_config) + + +[/ui-tab] +[ui-tab title="Local domains (only reachable in your local network)"] + +Starting from YunoHost v4.3, domains ending by `.local` are fully supported, in addition to the default `yunohost.local`. +They do not use the DNS protocol, but the mDNS one (also known as Zeroconf, Bonjour), which allows them to be published with no specific configuration but exclusively on your local network or VPN. +Their use is this especially suitable when you do not need your apps to be available on the Internet. + +![Here a screenshot of the "Add domain" page where you can choose "I already have a domain name" and setup your domain ending by .local](image://webadmin_domain_local.png) + +!!!! mDNS protocol does not allow for subdomains to be created. So `domain.local` will work, while `sub.domain.local` is not possible. + +`Yunomdns` service takes care of publishing your `.local` domains on your network. +It has a configuration file, `/etc/yunohost/mdns.yml`, which allows you to choose which domains are published, and on which network interfaces. +This file is automatically regenerated whenever you add or delete a `.local` domain. + +The service will always try to publish `yunohost.local`. If you have multiple YunoHost servers on your network, try `yunohost-2.local`, and so on. +The number may change depending on which server starts first, so do not rely on it to use actual apps and create your own domains. + +! Unfortunately, Android devices before version 12 (released in 2021) do not seem to be listening to mDNS protocol. +! To be able to reach `.local` domains on your Android devices, you will have to add in their DNS settings your YunoHost server's local IP address. + + +[/ui-tab] +[/ui-tabs] + +## The main domain +The domain chosen during the initial configuration (post-install) is defined as the main (or default) domain of the server : this is where [the user portal (SSO)](/users) will be available. The main domain can later be changed through the web admin in Domains > (the domain) > Set default, or with the command line `yunohost tools maindomain`. + +More technically, the main domain is also used as hostname by SMTP protocol to send email (EHLO) and determine which value should be configured in the reverse DNS bind to your public IP. If this 2 values are mis-configured, the diagnosis tool will trigger you an alert. + +## Subdomains + +! Bear in mind, YunoHost considers domains and their subdomains independently. +! You **need** to register all the domains and subdomains you want to use. + +## About Non-latin characters + +If your domain has special, non-latin characters, it will be transformed by YunoHost into its [internationalized version](https://en.wikipedia.org/wiki/Internationalized_domain_name) through [Punycode](https://en.wikipedia.org/wiki/Punycode). So when you use the command line, you have to use the punycode format return for example by `yunohost domain list`. + + +## SSL/HTTPS certificates + +Another important aspect of domain configuration is the SSL/HTTPS certificate. YunoHost is integrated with Let's Encrypt, so once your server is correctly reachable from anybody on the internet through the domain name, the administrator can request a Let's Encrypt certificate. See the documentation about [certificates](/certificate) for more information. diff --git a/pages/01.administrate/06.overview/06.apps/apps_overview.fr.md b/pages/02.administer/15.admin_guide/30.apps/apps.fr.md similarity index 62% rename from pages/01.administrate/06.overview/06.apps/apps_overview.fr.md rename to pages/02.administer/15.admin_guide/30.apps/apps.fr.md index f4f90b9f..9d63a3ba 100644 --- a/pages/01.administrate/06.overview/06.apps/apps_overview.fr.md +++ b/pages/02.administer/15.admin_guide/30.apps/apps.fr.md @@ -29,7 +29,7 @@ Par défaut, seules les applications d'une qualité suffisante vous sont propos ## Intégration LDAP / SSO -Les applications peuvent prendre en charge l'intégration avec le système LDAP / Single Sign On, de sorte que les utilisateurs qui se connectent au portail utilisateur peuvent être automatiquement authentifiés sur toutes ces applications. Certaines applications ne le supportent pas car cette fonctionnalité n'est, soit pas implémentée en amont du logiciel de l'application, soit le mainteneur n'a pas encore travaillé sur cette partie. Cette information est en général disponible sur le README du paquet d'application. +Les applications peuvent prendre en charge l'intégration avec le système LDAP / Single Sign On, de sorte que les utilisateurs qui se connectent au portail utilisateur puissent être automatiquement authentifiés sur toutes ces applications. Certaines applications ne le supportent pas, soit parce que cette fonctionnalité n'est pas implémentée en amont du logiciel de l'application, soit parce que le mainteneur n'a pas encore travaillé sur cette partie. Cette information est en général disponible sur le README du paquet d'application. ## Applications multi-instances @@ -46,3 +46,28 @@ L'accès aux applications peut être limité à certains utilisateurs seulement. ## Packaging d'applications Si vous voulez apprendre ou contribuer à l'empaquetage des applications, veuillez consulter la [documentation des contributeurs](/contributordoc). + +## Sous-chemins vs. domaines individuels par application + +Dans le contexte de YunoHost, il est assez courant d'avoir un seul (ou quelques) domaines sur lesquels plusieurs applications sont installées dans des "sous-chemins", de sorte que l'on se retrouve avec quelque chose comme ceci : + +```bash +yolo.com + ├─── /blog : Wordpress (un blog) + ├─── /cloud : Nextcloud (un service de cloud) + ├─── /rss : TinyTiny RSS (un lecteur RSS) + ├─── /wiki : DokuWiki (un wiki) +``` + +Alternativement, on peut choisir d'installer chaque application (ou certaines) sur un domaine dédié. Au delà de la question esthétique, utiliser des sous-domaines au lieu de sous-chemins permet de laisser la possibilité de déplacer un service sur un autre serveur plus facilement. Par ailleurs, certaines applications peuvent avoir besoin d'un domaine entier qui leur est dédié, pour des raisons techniques. L'inconvénient est que vous devez ajouter un nouveau domaine à chaque fois, et donc potentiellement configurer des enregistrements DNS supplémentaire, relancer le diagnostique et l'installation d'un nouveau certificat Let's Encrypt. + +Si toutes les applications de l'exemple précédent étaient installées sur un domaine séparé, cela donnerait quelque chose comme ceci : + +```bash +blog.yolo.com : Wordpress (un blog) +cloud.yolo.com : Nextcloud (un service de cloud) +rss.yolo.com : TinyTiny RSS (un lecteur RSS) +wiki.yolo.com : DokuWiki (un wiki) +``` + +!!! De nombreuses applications intègrent une fonctionnalité qui vous permet de changer l'URL de votre application. Ce choix entre sous-chemin et sous-domaine peut donc dans certains cas être réversible via une simple manipulation dans l'interface d'administration. diff --git a/pages/02.administer/15.admin_guide/30.apps/apps.md b/pages/02.administer/15.admin_guide/30.apps/apps.md new file mode 100644 index 00000000..5871ea6c --- /dev/null +++ b/pages/02.administer/15.admin_guide/30.apps/apps.md @@ -0,0 +1,172 @@ +--- +title: Applications +template: docs +taxonomy: + category: docs +page-toc: + active: true +routes: + default: '/apps_overview' +--- + +One of the key feature of YunoHost is the ability to easily install applications which are then immediately usable. Example of applications include a blog system, a "cloud" (to host and sync files), a website, an RSS reader... + +Applications can be installed and managed through the webadmin interface in `[fa=cubes /] Applications` or through commands of the `yunohost app` category. + +[center] +![Apps list](image://apps_list.png?resize=512&classes=caption "Apps list in the webadmin, with its Install button.") +[/center] + +The application catalog and its categories can be browsed directly from the webadmin by clicking on the `[fa=plus /] Install` button in the apps list, or from this documentation. + +
Applications catalog
+ + +! Be careful and stay reasonable on the number of installed applications. Each additional installation increases the attack surface and the risk of failure. Ideally, if you want to test, do it with another instance for example in [a virtual machine](/install/hardware:virtualbox). + + +## Installing an app + +Let's say you want to install a *Custom Webapp*. Before actually running the installation steps, YunoHost will usually have you fill in a form to properly set it up for you. + +[ui-tabs position="top-left" active="0" theme="lite"] +[ui-tab title="From the webadmin"] + +![Custom Webapp install form](image://app_install_form.png?resize=512&classes=caption "Pre-installation form of the Custom Webapp") + +[/ui-tab] +[ui-tab title="From the command line"] + +![Custom Webapp install form in CLI](image://app_install_form_cli.png?resize=512&classes=caption "Pre-installation form of the Custom Webapp in CLI") + +[/ui-tab] +[/ui-tabs] + +### Subpaths vs. individual domains per apps + +Among specific questions, forms usually ask you to choose a domain and a path onto which the app will be accessible. + +In the context of YunoHost, it is quite common to have a single (or a few) domains on which several apps are installed in "subpaths", so that you end up with something like this: + +```bash +yolo.com + ├── /blog : Wordpress (a blog) + ├── /cloud : Nextcloud (a cloud service) + ├── /rss : TinyTiny RSS (a RSS reader) + ├── /wiki : DokuWiki (a wiki) +``` + +Alternatively, you may choose to install each (or some) apps on a dedicated domain. Beyond the aesthetic, using sub-domains instead of sub-paths allows the possibility to move a service to another server more easily. Also, some applications may need an entire domain dedicated to them, for technical reasons. The disadvantage is that you have to add a new domain each time, and therefore potentially configure additional DNS records, restart the diagnostics and install a new Let's Encrypt certificate. + +This might look prettier for end users, but is generally considered more complicated and less efficient in the context of YunoHost, since you need to add a new domain each time. Nevertheless, some apps might need an entire domain dedicated to them, for technical reasons. + +If all apps from the previous example were installed on a separate domain, this would give something like this: + +```bash +blog.yolo.com : Wordpress (a blog) +cloud.yolo.com : Nextcloud (a cloud service) +rss.yolo.com : TinyTiny RSS (a RSS reader) +wiki.yolo.com : DokuWiki (a wiki) +``` + +!!! Many applications integrate a feature that allows you to change the URL of your application. This choice between subpath and subdomain can be reversed in some cases via a simple manipulation in the administration interface. + +### User access management and public apps + +The installation form usually asks whether or not the app should be publically accessible. If you choose to not make it public, only users logged in YunoHost will be able to reach it. + +!!!! After installation, this can be configured via the webadmin in the [Groups and permissions panel](/groups_and_permissions), or similarly via the command-line subcategory `yunohost user permission`. + +### Instructions after installation + +Some applications need to give you instructions, URLs or credentials once they are installed. So remember to check the email of the first user account or the admin user selected before installation, if it was prompted. + +### Multi-instance applications + +Some applications support the ability to be installed several times (at different locations) ! To do so, just go another time in `Applications > [fa=plus /] Install`, and select again the application to install. + +## LDAP / SSO integration + +Applications that allow users to register may support integration with the LDAP / Single Sign On of YunoHost, so that users who connect to the user portal can be automatically logged in all these apps. + +However, some applications do not support this as it can be either not implemented in the upstream, or the package does not work on this part yet. This information is usually available on the README of the application package. + +## Application configuration + +After installation, some settings handled by YunoHost can be tweaked, such as user and group permissions, application's tile and label in the SSO page, or its access URL. + +[ui-tabs position="top-left" active="0" theme="lite"] +[ui-tab title="From the webadmin"] + +You can access the app's operations page by clicking its name in the applications list. + +![Application operations page](image://app_config_operations.png?resize=768&classes=caption "Application operations page in the webadmin") + +You can also delete the application from this page. + +[/ui-tab] +[ui-tab title="From the command line"] + +From the command line, you can change: + +* the app's label in the SSO: `yunohost app change-label ` +* the app's url: `yunohost app change-url app [-d ] [-p ]` + +You can also delete the app: `yunohost app remove ` + +`` is to be replaced with the app's ID. If this is the first instance of the app, like Nextcloud, the ID is `nextcloud`. If this is the second, then it's `nextcloud__2` and so on. To list all your apps and check their ID, you can run `yunohost app info`. + +[/ui-tab] +[/ui-tabs] + +### Configuration panels + +Some apps include a *configuration panel*, which features actions and settings specific for each app that they usually do not handle themselves. They can also spare you the need for altering configuration files by hand. + +!!!! Configuration panels are *not* meant to tweak every aspects of the apps. You will surely use their own administration panels more often than YunoHost's configuration panels. + +[ui-tabs position="top-left" active="0" theme="lite"] +[ui-tab title="From the webadmin"] + +The configuration panels are accessible in the webadmin in their operations page, trough the `[fa=cogs /] Config panel` button. + +![My Webapp configuration panel](image://app_config_panel.png?resize=768&classes=caption "Configuration panel for My Webapp") + +[/ui-tab] +[ui-tab title="From the command line"] + +From the command line, you can list the configuration panel settings with the following command: `yunohost app config get ` + +``` +$ yunohost app config get my_webapp +main.php_fpm_config.phpversion: + ask: PHP version + value: none +main.sftp.password: + ask: Set a password for the SFTP access + value: ************** +main.sftp.with_sftp: + ask: Do you need a SFTP access? + value: yes +``` + +To change a setting, either use `yunohost app config set ` to get prompted about all the settings, or use `yunohost app config set -v ` to alter a specific one. + +The `` is the setting name, for example `main.sftp.with_sftp` from above. + +[/ui-tab] +[/ui-tabs] + + +## Applications packaging + +Applications must be packaged manually by application packagers/maintainers. Apps can be integrated with YunoHost to support upgrades, backup/restore and LDAP/SSO integration among other things. + +If you want to learn or contribute to app packaging, please check the [contributor documentation](/contributordoc). + +### Integration and quality levels + +Automated tests are being run regularly to test the integration and quality of all apps who were declared to be `working` by packagers. The result is a level between 0 and 8, whose meaning is detailed on [this page](/packaging_apps_levels). Some tests results may also be available [on this dashboard](https://dash.yunohost.org/appci/branch/stable). + +By default, only applications of sufficient quality are offered. When the quality of an application drops and until the problem is reolved, the app is hidden from the catalog to prevent its installation and its upgrades are put on hold. + diff --git a/pages/02.administer/15.admin_guide/35.nginx/nginx.md b/pages/02.administer/15.admin_guide/35.nginx/nginx.md new file mode 100644 index 00000000..256591bc --- /dev/null +++ b/pages/02.administer/15.admin_guide/35.nginx/nginx.md @@ -0,0 +1,26 @@ +--- +title: Web server with NGINX +template: docs +taxonomy: + category: docs +routes: + default: '/web_server' +--- + +YunoHost ships [NGINX](https://www.nginx.com/), a web server and reverse proxy software. That's the keystone that enables your apps and YunoHost services to be accessible online. + +Most of the web applications installed with YunoHost will automatically have their own configuration file created for NGINX. + +## Manually installing apps, or exposing existing apps + +Generally, you should refrain from manually tinkering and installing apps, except if you are sure they will not interfere with your server. YunoHost proposes two generic apps to help you out: + +- If you already have a website ready to be deployed, consider using a **Custom Webapp**. It allows you to easily setup a directory into which you can upload your HTML, PHP, CSS, JS files with SFTP, and a database if needed. + +- If you want to use YunoHost as a reverse proxy, i.e. serve an app from another server or an internal web server (think NodeJS, Ruby, Python, ...), you can use the **Redirect app** in proxy mode. + +- The **Redirect app** can also simply run in redirect mode, for example to create shortcuts for your users in their SSO page, or redirect `www.yourdomain.tld` to `yourdomain.tld`. + +For more information on these apps, and for more application use cases, have a look to the [Tutorials](/tutorials) section. + +!! Do not try to install Apache or other public web servers. This will break your system. \ No newline at end of file diff --git a/pages/02.administer/15.admin_guide/40.xmpp/xmpp.es.md b/pages/02.administer/15.admin_guide/40.xmpp/xmpp.es.md new file mode 100644 index 00000000..2cfd454e --- /dev/null +++ b/pages/02.administer/15.admin_guide/40.xmpp/xmpp.es.md @@ -0,0 +1,30 @@ +--- +title: Chatcon XMPP +template: docs +taxonomy: + category: docs +routes: + default: '/XMPP_server' +--- + +![](image://XMPP_logo.png?resize=100) + +YunoHost está instalado con un servidor de mensajería instantánea Metronome que implementa el [protocolo XMPP](https://es.wikipedia.org/wiki/Extensible_Messaging_and_Presence_Protocol). + +XMPP es un protocolo abierto y extensible que también permite crear salones de discusión, compartir status y datos, echar llamadas en VoIP y hacer videoconferencias. + +Todas las aplicaciones basadas en XMPP son compatibles entre ellas : cuando utilizas un cliente XMPP puedes discutir con cualquier persona que tenga una cuenta XMPP/Jabber. Este protocolo ya es utilizado por millones de personas en el mundo. + +## Cuenta XMPP/Jabber + +Una cuenta XMPP/Jabber está basada en un ID bajo la forma `usuario@dominio.tld`, así como una contraseña. La contraseña es la de la cuenta del usuario de YunoHost. + +Si desea saber más sobre el uso de XMPP, consulte el [Manual del usuario](/XMPP). + +## Incompatibilidad con Prosody + +Prosody, un servidor XMPP alternativo, está empaquetado para YunoHost. + +En particular, lo utilizan el plugin de chat Peertube y Jitsi para las videoconferencias. Estas aplicaciones instalará Prosody, que requiere que Metronome esté desactivado para funcionar. + +! En pocas palabras, la instalación de Prosody o de una aplicación que dependa de ella desactivará el servidor XMPP. \ No newline at end of file diff --git a/pages/02.administer/15.admin_guide/40.xmpp/xmpp.fr.md b/pages/02.administer/15.admin_guide/40.xmpp/xmpp.fr.md new file mode 100644 index 00000000..c5ca9de5 --- /dev/null +++ b/pages/02.administer/15.admin_guide/40.xmpp/xmpp.fr.md @@ -0,0 +1,32 @@ +--- +title: Chat avec XMPP +template: docs +taxonomy: + category: docs +routes: + default: '/XMPP_server' +--- + +![](image://XMPP_logo.png?resize=100) + +YunoHost est installé par défaut avec un serveur de messagerie instantanée Metronome qui implémente le [protocole XMPP](https://fr.wikipedia.org/wiki/Extensible_Messaging_and_Presence_Protocol) (anciennement connu sous le nom de Jabber). + +Ce protocole est déjà utilisé par des millions de personnes dans le monde - c'est un protocole ouvert. Toutes les applications basées sur XMPP sont compatibles entre elles : lorsque vous utilisez un client XMPP, vous pouvez interagir avec quiconque possède un compte XMPP. + +XMPP est un protocole extensible - cela signifie que les utilisateurs peuvent configurer des « extensions » pour les salons de discussions, partager des messages et des fichiers, et passer des appels voix et vidéo en utilisant XMPP. + +## Compte XMPP + +Pour utiliser XMPP, il est nécessaire de disposer d'un compte dont l'identifiant prend la forme `utilisateur@votre.domaine.tld`, ainsi qu’un mot de passe. + +Sous YunoHost, un compte XMPP est créé automatiquement pour chaque utilisateur. Les identifiants XMPP sont simplement l’adresse email principale de l'utilisateur ainsi que son mot de passe. + +Si vous souhaitez en savoir plus sur l'utilisation de XMPP, référez-vous au [Guide de l'utilisateur](/XMPP). + +## Incompatibilité avec Prosody + +Prosody, un serveur XMPP alternatif, est packagé pour YunoHost. + +Il est notamment utilisé par le plugin de chat de Peertube, et Jitsi pour des vidéoconférences. Installer ces apps installera Prosody, qui nécessite de désactiver Metronome pour fonctionner. + +! En résumé, installer Prosody ou une app en dépendant désactivera le serveur XMPP. \ No newline at end of file diff --git a/pages/02.administer/15.admin_guide/40.xmpp/xmpp.md b/pages/02.administer/15.admin_guide/40.xmpp/xmpp.md new file mode 100644 index 00000000..9256b279 --- /dev/null +++ b/pages/02.administer/15.admin_guide/40.xmpp/xmpp.md @@ -0,0 +1,34 @@ +--- +title: Chat with XMPP +template: docs +taxonomy: + category: docs +routes: + default: '/XMPP_server' +--- + +![](image://XMPP_logo.png?resize=100) + +By default, YunoHost comes installed with an instant messaging server called Metronome which implements the [XMPP protocol](https://en.wikipedia.org/wiki/Extensible_Messaging_and_Presence_Protocol) (previously known as Jabber). + +This protocol is already used by millions of people around the world—it is an open protocol. +All applications based on XMPP are compatible with each other: When using an XMPP client, you can interact with anybody who has an XMPP account. + +XMPP is an extensible protocol—this means users can configure "extensions" to chatrooms, share messages and files, and make voice and video calls using XMPP. + +## XMPP account + +To use an XMPP account you need a username, in the format: `user@domain.tld`, and a password. + +With YunoHost, an XMPP account is created for all YunoHost users automatically. +The XMPP account credentials corresponds to the user's main e-mail address and password. + +If you wish to know more about using XMPP, refer to the [User guide](/XMPP). + +## Incompatibility with Prosody + +Prosody, an alternative XMPP server, is packaged for YunoHost. + +It is notably used by Peertube's chat feature, and Jitsi for video conferences. Installing these apps will install Prosody, which needs to disable Metronome to work properly. + +! In summary, installing Prosody or an app relying on it will disable the XMPP server. \ No newline at end of file diff --git a/pages/01.administrate/06.overview/08.emails/email.de.md b/pages/02.administer/15.admin_guide/45.emails/email.de.md similarity index 100% rename from pages/01.administrate/06.overview/08.emails/email.de.md rename to pages/02.administer/15.admin_guide/45.emails/email.de.md diff --git a/pages/01.administrate/06.overview/08.emails/email.es.md b/pages/02.administer/15.admin_guide/45.emails/email.es.md similarity index 100% rename from pages/01.administrate/06.overview/08.emails/email.es.md rename to pages/02.administer/15.admin_guide/45.emails/email.es.md diff --git a/pages/01.administrate/06.overview/08.emails/email.fr.md b/pages/02.administer/15.admin_guide/45.emails/email.fr.md similarity index 100% rename from pages/01.administrate/06.overview/08.emails/email.fr.md rename to pages/02.administer/15.admin_guide/45.emails/email.fr.md diff --git a/pages/01.administrate/06.overview/08.emails/email.md b/pages/02.administer/15.admin_guide/45.emails/email.md similarity index 100% rename from pages/01.administrate/06.overview/08.emails/email.md rename to pages/02.administer/15.admin_guide/45.emails/email.md diff --git a/pages/01.administrate/06.overview/10.backups/backup.fr.md b/pages/02.administer/15.admin_guide/50.backups/backup.fr.md similarity index 100% rename from pages/01.administrate/06.overview/10.backups/backup.fr.md rename to pages/02.administer/15.admin_guide/50.backups/backup.fr.md diff --git a/pages/01.administrate/06.overview/10.backups/backup.it.md b/pages/02.administer/15.admin_guide/50.backups/backup.it.md similarity index 100% rename from pages/01.administrate/06.overview/10.backups/backup.it.md rename to pages/02.administer/15.admin_guide/50.backups/backup.it.md diff --git a/pages/01.administrate/06.overview/10.backups/backup.md b/pages/02.administer/15.admin_guide/50.backups/backup.md similarity index 100% rename from pages/01.administrate/06.overview/10.backups/backup.md rename to pages/02.administer/15.admin_guide/50.backups/backup.md diff --git a/pages/01.administrate/08.troubleshooting/07.stretch_buster/stretch_buster_migration.fr.md b/pages/02.administer/15.admin_guide/55.upgrade/10.stretch_buster_migration/stretch_buster_migration.fr.md similarity index 99% rename from pages/01.administrate/08.troubleshooting/07.stretch_buster/stretch_buster_migration.fr.md rename to pages/02.administer/15.admin_guide/55.upgrade/10.stretch_buster_migration/stretch_buster_migration.fr.md index 02ec15b9..317d3746 100644 --- a/pages/01.administrate/08.troubleshooting/07.stretch_buster/stretch_buster_migration.fr.md +++ b/pages/02.administer/15.admin_guide/55.upgrade/10.stretch_buster_migration/stretch_buster_migration.fr.md @@ -1,5 +1,5 @@ --- -title: Migrer vers Buster +title: Migrer de 3.x vers 4.x template: docs taxonomy: category: docs diff --git a/pages/01.administrate/08.troubleshooting/07.stretch_buster/stretch_buster_migration.md b/pages/02.administer/15.admin_guide/55.upgrade/10.stretch_buster_migration/stretch_buster_migration.md similarity index 98% rename from pages/01.administrate/08.troubleshooting/07.stretch_buster/stretch_buster_migration.md rename to pages/02.administer/15.admin_guide/55.upgrade/10.stretch_buster_migration/stretch_buster_migration.md index b4a28ea3..138bbdc0 100644 --- a/pages/01.administrate/08.troubleshooting/07.stretch_buster/stretch_buster_migration.md +++ b/pages/02.administer/15.admin_guide/55.upgrade/10.stretch_buster_migration/stretch_buster_migration.md @@ -1,5 +1,5 @@ --- -title: Migrating an existing instance to Buster +title: Migrating from 3.x to 4.x template: docs taxonomy: category: docs diff --git a/pages/02.administer/15.admin_guide/55.upgrade/15.buster_bullseye/buster_bullseye_migration.fr.md b/pages/02.administer/15.admin_guide/55.upgrade/15.buster_bullseye/buster_bullseye_migration.fr.md new file mode 100644 index 00000000..941cb839 --- /dev/null +++ b/pages/02.administer/15.admin_guide/55.upgrade/15.buster_bullseye/buster_bullseye_migration.fr.md @@ -0,0 +1,91 @@ +--- +title: Migrer de 4.x vers 11.x +template: docs +taxonomy: + category: docs +routes: + default: '/buster_bullseye_migration' +--- + +L'objectif cette page est de décrire le processus de migration d'une instance en YunoHost 4.4.x (tournant sous Debian Buster/10.x) vers YunoHost 11.x (tournant sous Debian Bullseye/11.x). Notez que nous avons décidé de sauter les numéros de versions de 5 à 10 pour suivre les numéros de versions de Debian. + +## Notes importantes + +- L'équipe de YunoHost a fait de son mieux pour que cette migration se passe autant en douceur que possible. Elle a été testée durant plusieurs mois et sur plusieurs types d'installations. + +- Néanmoins, vous devez être conscient qu'il s'agit d'une opération délicate. L'administration système est un sujet compliqué et couvrir tous les cas particuliers n'est pas chose aisée. En conséquence, si vous hébergez des données et des systèmes critiques, [faites des sauvegardes](/backup). Et dans tous les cas, soyez patients et attentifs durant la migration. + +- Ne vous précipitez pas à vouloir faire une réinstallation de votre système en pensant que cela serait "plus simple" (sigh). (Une attitude qui revient régulièrement est de vouloir réinstaller son système à la moindre complication...). À la place, si vous rencontrez des problèmes, nous vous encourageons à investiguer, chercher à comprendre et [trouver de l'aide sur le chat ou le forum](/help). + +## Procédure de migration + +#### Depuis la webadmin + +Après avoir mis à jour vers la version en 4.4.x, allez dans Outils > Migrations pour accéder à l'interface de migration. Il vous faudra ensuite lire l'avertissement attentivement et l'accepter pour lancer la migration. + +#### Depuis la ligne de commande + +Après avoir mis à jour vers la version 4.4.x, lancez : + +```bash +sudo yunohost tools migrations migrate +``` + +puis lisez attentivement l'avertissement et les instructions. + +## Pendant la migration + +En fonction de votre matériel et des paquets installés, la migration peut prendre jusqu'à une ou deux heures. + +Les logs seront affichés dans la barre de message au centre de la page (vous pouvez approcher la souris dessus pour voir l'historique en entier). Ils seront également consultable après coup (comme les autres opérations) dans Outils > Journaux. + +Notez que même si vous fermez la page d'admin, la migration continuera (par contre l'interface d'admin sera partiellement indisponible). + +#### Si la migration a crashé / échoué à un moment. + +Si la migration a échoué a un moment donné, la première chose à faire est de tenter de la relancer. Si cela ne fonctionne toujours pas, il vous faut [trouver de l'aide](/help) (prière de fournir le/les messages correspondants ou tout élément qui vous fait penser que ça n'a pas marché). + +## Choses à vérifier après la migration + +#### Exécuter la migration pour réparer votre application python +Après la mise à jour, vos applications python devraient être indisponibles car leur environnement virtuel doit être reconstruit. + +Pour ce faire, vous pouvez exécuter les migrations en cours dans `Webadmin > Mises à jour`. Les applications ci-dessous ne seront pas réparées automatiquement, vous devez les mettre à jour manuellement avec `yunohost app upgrade -f APP`. + +Les applications qui ne seront pas réparées automatiquement et nécessitent une mise à jour forcée : + * calibreweb + * django-for-runners + * ffsync (cette application est en python2 et n'est plus maintenue, aucune garantie) + * jupiterlab + * librephotos + * mautrix + * mediadrop + * mopidy + * pgadmin + * tracim + * synapse + * weblate + + +! !! Si nécessaire, vous pouvez désactiver la reconstruction automatique pour une application python spécifique, en supprimant le fichier dédié terminé par `.requirements_backup_for_bullseye_upgrade.txt` avant d'appliquer la migration. Vous pouvez trouver ce fichier près du venv de votre application dans `/opt` ou `/var/www`. + +#### Vérifiez que vous êtes véritablement sous Debian Bullseye et YunoHost 11.x + +Pour cela, vous pouvez aller dans la partie Diagnostic (section Système de base). (Vous pouvez aussi regarder ce qui est affiché à droite dans le pied de page de la webadmin). En ligne de commande, vous pouvez aussi utiliser `lsb_release -a` et `yunohost --version`. + +#### Vérifiez que le diagnostic ne rapporte pas de problème particulier + +Également dans la section Diagnostic de la webadmin, vérifiez qu'il n'y a pas de problème apparu suite à la migration (par exemple un service qui ne tournerais plus...) + +#### Vérifiez que les applications fonctionnent + +Vérifiez que vos applications installées fonctionnent... Si elles ne fonctionnent pas, il est recommandé de tenter de les mettre à jour. (ou bien de manière générale, il est recommandé de les mettre à jour même si elles fonctionnent !). + + +Si votre app est cassée et que vous étiez déjà sur la dernière version d'une application, vous pouvez relancer la mise à jour grâce à l'option `-f`: +``` +yunohost app upgrade --force NOM_APP +``` + +## Soucis (mineurs) connus après la migration + diff --git a/pages/02.administer/15.admin_guide/55.upgrade/15.buster_bullseye/buster_bullseye_migration.md b/pages/02.administer/15.admin_guide/55.upgrade/15.buster_bullseye/buster_bullseye_migration.md new file mode 100644 index 00000000..a37df5f6 --- /dev/null +++ b/pages/02.administer/15.admin_guide/55.upgrade/15.buster_bullseye/buster_bullseye_migration.md @@ -0,0 +1,92 @@ +--- +title: Migrating from 4.x to 11.x +template: docs +taxonomy: + category: docs +routes: + default: '/buster_bullseye_migration' +--- + +This page is dedicated to help you migrating an instance from YunoHost 4.4.x (running on Debian Buster/10.x) to YunoHost 11.x (running on Debian Bullseye/11.x). Note: we decided to skip the version numbers from 5 to 10 to follow the Debian version numbers. + +## Important notes + +- The YunoHost team did its best to make sure that the migration is as smooth as possible and was tested over the course of several months in several cases. + +- With that said, please be aware that this is a delicate operation. System administration is a complicated topic and covering every particular cases is quite hard. Therefore, if you host critical data and services, please [make backups](/backup). And in any case, be patient and attentive during the migration. + +- Please don't rush into thinking that you should need to reinstall your system from scratch thinking it would be "simpler" (sigh). (A common attitude is to be willing to reinstall a server at the slightest complication...) Instead, if you happen to run into issues, we encourage you to try to investigate and understand what's going on and [reach for help on the chat and the forum](/help). + +## Migration procedure + +#### From the webadmin + +After upgrading to 4.4.x, go to Tools > Migrations to access the migrations interface. You will have to read carefully and accept the disclaimer then launch the migration. + +#### From the command line + +After upgrading to 4.4.x, run : + +```bash +sudo yunohost tools migrations migrate +``` + +then read carefully and accept the disclaimer. + +## During the migration + +Depending on your hardware and packages installed, the migration might take up to a few hours. + +The logs will be shown in the message bar (you can hover it to see the whole history). They will also be available after the migration (like any other operations) in Tools > Logs. + +Note that even if you close the webadmin page for some reason, the migration will continue in the background (but the webadmin will be partially unavailable). + +#### If the migration crashed / failed at some point. + +If the migration failed at some point, it should be possible to relaunch it. If it still doesn't work, you can try to [get help](/help) (please provide the corresponding messages or whatever makes you tell that it's not working). + +## What to do after the upgrade + +#### Check that you actually are on Debian Bullseye and YunoHost 11.x + +For this, go in Diagnosis (category Base system) or look at the footer of the webadmin. In the command line, you can use `lsb_release -a` and `yunohost --version`. + +#### Run the migration to repair your python app +After upgrading, your python apps should be unavailable cause their virtual env need to be rebuild. + +To do that you can run the pending migrations in `Webadmin > Update`. The apps below won't be automatically repaired, you need to force upgrade them manually instead with `yunohost app upgrade -f APP`. + +Apps which won't be automatically repaired and need a force upgrade: + * calibreweb + * django-for-runners + * ffsync (this app is in python2 and no longer maintained, no guarantee) + * jupiterlab + * librephotos + * mautrix + * mediadrop + * mopidy + * pgadmin + * tracim + * synapse + * weblate + + +!!! If needed, you can disable the automatic rebuild for a specific python app, by removing the dedicated file ended by `.requirements_backup_for_bullseye_upgrade.txt` before to apply the migration. You can find this file near the venv of your app inside `/opt` or `/var/www`. + +#### Check that no issue appeared in the diagnosis + +Also in the Diagnosis in the webadmin, make sure that no specific issue appeared after running the migration (for example a service that crashed for some reason). + +If the service php7.3-fpm appears to be dead, you should upgrade your PHP apps like the custom web app. Next, you can run `apt autoremove`. + +#### Check that your applications are working + +Test that your applications are working. If they aren't, you should try to upgrade them (it is also a good idea to upgrade them even if they are working anyway). + +If your app is broken and you were already with the last version, you can rerun the upgrade thanks to the `-f` option: +``` +yunohost app upgrade --force APP_NAME +``` + +## Current known (minor) issues after the migration + diff --git a/pages/01.administrate/08.troubleshooting/06.jessie_stretch/jessie_stretch_migration.fr.md b/pages/02.administer/15.admin_guide/55.upgrade/5.jessie_stretch_migration/jessie_stretch_migration.fr.md similarity index 99% rename from pages/01.administrate/08.troubleshooting/06.jessie_stretch/jessie_stretch_migration.fr.md rename to pages/02.administer/15.admin_guide/55.upgrade/5.jessie_stretch_migration/jessie_stretch_migration.fr.md index 9b77a26d..537e0c92 100644 --- a/pages/01.administrate/08.troubleshooting/06.jessie_stretch/jessie_stretch_migration.fr.md +++ b/pages/02.administer/15.admin_guide/55.upgrade/5.jessie_stretch_migration/jessie_stretch_migration.fr.md @@ -1,5 +1,5 @@ --- -title: Migrer vers Stretch +title: Migrer de 2.4+ vers 3.x template: docs taxonomy: category: docs diff --git a/pages/01.administrate/08.troubleshooting/06.jessie_stretch/jessie_stretch_migration.md b/pages/02.administer/15.admin_guide/55.upgrade/5.jessie_stretch_migration/jessie_stretch_migration.md similarity index 98% rename from pages/01.administrate/08.troubleshooting/06.jessie_stretch/jessie_stretch_migration.md rename to pages/02.administer/15.admin_guide/55.upgrade/5.jessie_stretch_migration/jessie_stretch_migration.md index 17ff656b..8896e845 100644 --- a/pages/01.administrate/08.troubleshooting/06.jessie_stretch/jessie_stretch_migration.md +++ b/pages/02.administer/15.admin_guide/55.upgrade/5.jessie_stretch_migration/jessie_stretch_migration.md @@ -1,5 +1,5 @@ --- -title: Migrating an existing instance to Stretch +title: Migrating from 2.4+ to 3.x template: docs taxonomy: category: docs diff --git a/pages/01.administrate/06.overview/11.update/upgrade.fr.md b/pages/02.administer/15.admin_guide/55.upgrade/upgrade.fr.md similarity index 100% rename from pages/01.administrate/06.overview/11.update/upgrade.fr.md rename to pages/02.administer/15.admin_guide/55.upgrade/upgrade.fr.md diff --git a/pages/01.administrate/06.overview/11.update/upgrade.md b/pages/02.administer/15.admin_guide/55.upgrade/upgrade.md similarity index 100% rename from pages/01.administrate/06.overview/11.update/upgrade.md rename to pages/02.administer/15.admin_guide/55.upgrade/upgrade.md diff --git a/pages/01.administrate/06.overview/overview.de.md b/pages/02.administer/15.admin_guide/admin_guide.de.md similarity index 96% rename from pages/01.administrate/06.overview/overview.de.md rename to pages/02.administer/15.admin_guide/admin_guide.de.md index 06e7ab16..a62af6f6 100644 --- a/pages/01.administrate/06.overview/overview.de.md +++ b/pages/02.administer/15.admin_guide/admin_guide.de.md @@ -1,11 +1,11 @@ --- title: Übersicht des YunoHost Ökosystems -menu: Geführte Tour +menu: Geführte Tour für den Admin template: docs taxonomy: category: docs routes: - default: '/overview' + default: '/admin_guide' --- Diese Seite bietet eine Übersicht über das Ökosystem eines YunoHost-Servers. Diese Übersicht macht mehrere Vereinfachungen und zielt wesentlich darauf ab, ein globales Bild zu vermitteln, bevor tiefer auf die verschiedenen Aspekte eingegangen wird. diff --git a/pages/01.administrate/06.overview/overview.fr.md b/pages/02.administer/15.admin_guide/admin_guide.fr.md similarity index 95% rename from pages/01.administrate/06.overview/overview.fr.md rename to pages/02.administer/15.admin_guide/admin_guide.fr.md index 7d31b91a..2a1937e6 100644 --- a/pages/01.administrate/06.overview/overview.fr.md +++ b/pages/02.administer/15.admin_guide/admin_guide.fr.md @@ -1,11 +1,11 @@ --- title: Vue d'ensemble de l'écosystème YunoHost -menu: Visite guidée +menu: Visite guidée pour l'administrateur template: docs taxonomy: category: docs routes: - default: '/overview' + default: '/admin_guide' --- Cette page pose une vue d'ensemble de l'écosystème d'un serveur sous YunoHost. Bien que celle-ci contienne des approximations et des raccourcis, elle permet de poser une première représentation générale avant de rentrer plus dans le détail des différents aspects. diff --git a/pages/01.administrate/06.overview/overview.it.md b/pages/02.administer/15.admin_guide/admin_guide.it.md similarity index 95% rename from pages/01.administrate/06.overview/overview.it.md rename to pages/02.administer/15.admin_guide/admin_guide.it.md index c6baa083..b8c47cb1 100644 --- a/pages/01.administrate/06.overview/overview.it.md +++ b/pages/02.administer/15.admin_guide/admin_guide.it.md @@ -1,11 +1,11 @@ --- title: Vista d'insieme dell'ecosistema YunoHost -menu: Tour guidato +menu: Tour guidato per l'amministratore template: docs taxonomy: category: docs routes: - default: '/overview' + default: '/admin_guide' --- Questa pagina provvede a fornire una vista d'insieme dell'ecosistema di un server YunoHost. Pur contenendo delle approssimazioni e delle scorciatoie, permette di avere una prima vista globale prima di entrare più nel dettaglio dei differenti aspetti. diff --git a/pages/01.administrate/06.overview/overview.md b/pages/02.administer/15.admin_guide/admin_guide.md similarity index 96% rename from pages/01.administrate/06.overview/overview.md rename to pages/02.administer/15.admin_guide/admin_guide.md index 517f0306..f8a86ba5 100644 --- a/pages/01.administrate/06.overview/overview.md +++ b/pages/02.administer/15.admin_guide/admin_guide.md @@ -1,11 +1,11 @@ --- title: Overview of the YunoHost ecosystem -menu: Guided tour +menu: Guided tour for the admin template: docs taxonomy: category: docs routes: - default: '/overview' + default: '/admin_guide' --- This page provide an overview of the ecosystem of a YunoHost server. While this overview contains several approximations, the purpose here is to introduce the global picture before digging into the different aspects. diff --git a/pages/01.administrate/07.specific_use_cases/05.backups/01.evaluate/evaluate.fr.md b/pages/02.administer/20.backups/05.evaluate/evaluate.fr.md similarity index 100% rename from pages/01.administrate/07.specific_use_cases/05.backups/01.evaluate/evaluate.fr.md rename to pages/02.administer/20.backups/05.evaluate/evaluate.fr.md diff --git a/pages/01.administrate/07.specific_use_cases/05.backups/01.evaluate/evaluate.md b/pages/02.administer/20.backups/05.evaluate/evaluate.md similarity index 100% rename from pages/01.administrate/07.specific_use_cases/05.backups/01.evaluate/evaluate.md rename to pages/02.administer/20.backups/05.evaluate/evaluate.md diff --git a/pages/01.administrate/07.specific_use_cases/05.backups/02.backup_methods/01.borgbackup/borgbackup.fr.md b/pages/02.administer/20.backups/10.backup_methods/01.borgbackup/borgbackup.fr.md similarity index 100% rename from pages/01.administrate/07.specific_use_cases/05.backups/02.backup_methods/01.borgbackup/borgbackup.fr.md rename to pages/02.administer/20.backups/10.backup_methods/01.borgbackup/borgbackup.fr.md diff --git a/pages/01.administrate/07.specific_use_cases/05.backups/02.backup_methods/01.borgbackup/borgbackup.md b/pages/02.administer/20.backups/10.backup_methods/01.borgbackup/borgbackup.md similarity index 100% rename from pages/01.administrate/07.specific_use_cases/05.backups/02.backup_methods/01.borgbackup/borgbackup.md rename to pages/02.administer/20.backups/10.backup_methods/01.borgbackup/borgbackup.md diff --git a/pages/01.administrate/07.specific_use_cases/05.backups/02.backup_methods/02.restic/restic.fr.md b/pages/02.administer/20.backups/10.backup_methods/02.restic/restic.fr.md similarity index 100% rename from pages/01.administrate/07.specific_use_cases/05.backups/02.backup_methods/02.restic/restic.fr.md rename to pages/02.administer/20.backups/10.backup_methods/02.restic/restic.fr.md diff --git a/pages/01.administrate/07.specific_use_cases/05.backups/02.backup_methods/02.restic/restic.md b/pages/02.administer/20.backups/10.backup_methods/02.restic/restic.md similarity index 100% rename from pages/01.administrate/07.specific_use_cases/05.backups/02.backup_methods/02.restic/restic.md rename to pages/02.administer/20.backups/10.backup_methods/02.restic/restic.md diff --git a/pages/01.administrate/07.specific_use_cases/05.backups/02.backup_methods/03.archivist/archivist.fr.md b/pages/02.administer/20.backups/10.backup_methods/03.archivist/archivist.fr.md similarity index 100% rename from pages/01.administrate/07.specific_use_cases/05.backups/02.backup_methods/03.archivist/archivist.fr.md rename to pages/02.administer/20.backups/10.backup_methods/03.archivist/archivist.fr.md diff --git a/pages/01.administrate/07.specific_use_cases/05.backups/02.backup_methods/03.archivist/archivist.md b/pages/02.administer/20.backups/10.backup_methods/03.archivist/archivist.md similarity index 100% rename from pages/01.administrate/07.specific_use_cases/05.backups/02.backup_methods/03.archivist/archivist.md rename to pages/02.administer/20.backups/10.backup_methods/03.archivist/archivist.md diff --git a/pages/01.administrate/07.specific_use_cases/05.backups/03.clone_filesystem/clone_filesystem.fr.md b/pages/02.administer/20.backups/15.clone_filesystem/clone_filesystem.fr.md similarity index 95% rename from pages/01.administrate/07.specific_use_cases/05.backups/03.clone_filesystem/clone_filesystem.fr.md rename to pages/02.administer/20.backups/15.clone_filesystem/clone_filesystem.fr.md index 60cd1a31..0f17dd91 100644 --- a/pages/01.administrate/07.specific_use_cases/05.backups/03.clone_filesystem/clone_filesystem.fr.md +++ b/pages/02.administer/20.backups/15.clone_filesystem/clone_filesystem.fr.md @@ -9,6 +9,9 @@ page-toc: active: true depth: 3 --- + +!! Les images de cette page sont manquantes + L'outil de sauvegarde de YunoHost ne sauvegarde que les fichiers utiles et se base sur des scripts de restauration pour réinstaller les dépendances de vos applications. Autrement dit, le mécanisme de YunoHost revient à réinstaller, puis réincorporer les données. Réaliser des images complètes du système peut être un moyen complémentaire ou alternatif de sauvegarder votre machine. L'intérêt est que votre système pourra être restauré dans l'état exact du moment de la sauvegarde. @@ -34,13 +37,13 @@ Ci-dessous, quelques documentations pour les fournisseurs les plus connus: [/ui-tab] [ui-tab title="VirtualBox"] Sélectionner la machine virtuelle et cliquer sur `Snapshots`, puis spécifier le nom du snapshot et cliquer sur `OK`. -![Le bouton snapshot se trouve en haut à droite](image://administrate/specific_use_cases/virtualbox-snapshot2.webp) +![Le bouton snapshot se trouve en haut à droite](image://virtualbox-snapshot2.webp) Pour restaurer, sélectionner la machine virtuelle, cliquer sur `Snapshots` puis `Restore Snapshot option`. -![](image://administrate/specific_use_cases/virtualbox-snapshot3.webp) +![](image://virtualbox-snapshot3.webp) Ensuite cliquer sur `Restore Snapshot`. -![](image://administrate/specific_use_cases/virtualbox-snapshot4.webp) +![](image://virtualbox-snapshot4.webp) [/ui-tab] [ui-tab title="Proxmox"] diff --git a/pages/01.administrate/07.specific_use_cases/05.backups/03.clone_filesystem/clone_filesystem.md b/pages/02.administer/20.backups/15.clone_filesystem/clone_filesystem.md similarity index 95% rename from pages/01.administrate/07.specific_use_cases/05.backups/03.clone_filesystem/clone_filesystem.md rename to pages/02.administer/20.backups/15.clone_filesystem/clone_filesystem.md index 5e41cdff..f58727ab 100644 --- a/pages/01.administrate/07.specific_use_cases/05.backups/03.clone_filesystem/clone_filesystem.md +++ b/pages/02.administer/20.backups/15.clone_filesystem/clone_filesystem.md @@ -10,6 +10,7 @@ page-toc: depth: 3 --- +!! Images are missing on this page YunoHost's backup tool only backs up useful files and relies on restore scripts to reinstall the dependencies of your applications. In other words, YunoHost's mechanism amounts to reinstalling and then reincorporating the data. @@ -36,13 +37,13 @@ Below, some documentation for the most known suppliers: [/ui-tab] [ui-tab title="VirtualBox"] Select the virtual machine and click `Snapshots`, then specify the snapshot name and click `OK`. -![The snapshot button is located at the top right](image://administrate/specific_use_cases/virtualbox-snapshot2.webp) +![The snapshot button is located at the top right](image://virtualbox-snapshot2.webp) To restore, select the virtual machine, click on `Snapshots` then `Restore Snapshot option`. -![](image://administrate/specific_use_cases/virtualbox-snapshot3.webp) +![](image://virtualbox-snapshot3.webp) Then click on `Restore Snapshot`. -![](image://administrate/specific_use_cases/virtualbox-snapshot4.webp) +![](image://virtualbox-snapshot4.webp) [/ui-tab] [ui-tab title="Proxmox"] diff --git a/pages/01.administrate/07.specific_use_cases/05.backups/04.avoid_hardware_failure/avoid_hardware_failure.fr.md b/pages/02.administer/20.backups/20.avoid_hardware_failure/avoid_hardware_failure.fr.md similarity index 100% rename from pages/01.administrate/07.specific_use_cases/05.backups/04.avoid_hardware_failure/avoid_hardware_failure.fr.md rename to pages/02.administer/20.backups/20.avoid_hardware_failure/avoid_hardware_failure.fr.md diff --git a/pages/01.administrate/07.specific_use_cases/05.backups/04.avoid_hardware_failure/avoid_hardware_failure.md b/pages/02.administer/20.backups/20.avoid_hardware_failure/avoid_hardware_failure.md similarity index 100% rename from pages/01.administrate/07.specific_use_cases/05.backups/04.avoid_hardware_failure/avoid_hardware_failure.md rename to pages/02.administer/20.backups/20.avoid_hardware_failure/avoid_hardware_failure.md diff --git a/pages/01.administrate/07.specific_use_cases/05.backups/05.include_exclude_files/include_exclude_files.fr.md b/pages/02.administer/20.backups/25.include_exclude_files/include_exclude_files.fr.md similarity index 100% rename from pages/01.administrate/07.specific_use_cases/05.backups/05.include_exclude_files/include_exclude_files.fr.md rename to pages/02.administer/20.backups/25.include_exclude_files/include_exclude_files.fr.md diff --git a/pages/01.administrate/07.specific_use_cases/05.backups/05.include_exclude_files/include_exclude_files.md b/pages/02.administer/20.backups/25.include_exclude_files/include_exclude_files.md similarity index 100% rename from pages/01.administrate/07.specific_use_cases/05.backups/05.include_exclude_files/include_exclude_files.md rename to pages/02.administer/20.backups/25.include_exclude_files/include_exclude_files.md diff --git a/pages/01.administrate/07.specific_use_cases/05.backups/06.custom_backup_methods/custom_backup_methods.fr.md b/pages/02.administer/20.backups/30.custom_backup_methods/custom_backup_methods.fr.md similarity index 100% rename from pages/01.administrate/07.specific_use_cases/05.backups/06.custom_backup_methods/custom_backup_methods.fr.md rename to pages/02.administer/20.backups/30.custom_backup_methods/custom_backup_methods.fr.md diff --git a/pages/01.administrate/07.specific_use_cases/05.backups/06.custom_backup_methods/custom_backup_methods.md b/pages/02.administer/20.backups/30.custom_backup_methods/custom_backup_methods.md similarity index 100% rename from pages/01.administrate/07.specific_use_cases/05.backups/06.custom_backup_methods/custom_backup_methods.md rename to pages/02.administer/20.backups/30.custom_backup_methods/custom_backup_methods.md diff --git a/pages/01.administrate/07.specific_use_cases/05.backups/07.migrate_or_merge_servers/migrate_or_merge_servers.fr.md b/pages/02.administer/20.backups/35.migrate_or_merge_servers/migrate_or_merge_servers.fr.md similarity index 100% rename from pages/01.administrate/07.specific_use_cases/05.backups/07.migrate_or_merge_servers/migrate_or_merge_servers.fr.md rename to pages/02.administer/20.backups/35.migrate_or_merge_servers/migrate_or_merge_servers.fr.md diff --git a/pages/01.administrate/07.specific_use_cases/05.backups/07.migrate_or_merge_servers/migrate_or_merge_servers.md b/pages/02.administer/20.backups/35.migrate_or_merge_servers/migrate_or_merge_servers.md similarity index 100% rename from pages/01.administrate/07.specific_use_cases/05.backups/07.migrate_or_merge_servers/migrate_or_merge_servers.md rename to pages/02.administer/20.backups/35.migrate_or_merge_servers/migrate_or_merge_servers.md diff --git a/pages/01.administrate/07.specific_use_cases/01.domains/01.dns_nohost_me/dns_nohost_me.es.md b/pages/02.administer/45.tutorials/05.domains/01.dns_nohost_me/dns_nohost_me.es.md similarity index 100% rename from pages/01.administrate/07.specific_use_cases/01.domains/01.dns_nohost_me/dns_nohost_me.es.md rename to pages/02.administer/45.tutorials/05.domains/01.dns_nohost_me/dns_nohost_me.es.md diff --git a/pages/01.administrate/07.specific_use_cases/01.domains/01.dns_nohost_me/dns_nohost_me.fr.md b/pages/02.administer/45.tutorials/05.domains/01.dns_nohost_me/dns_nohost_me.fr.md similarity index 100% rename from pages/01.administrate/07.specific_use_cases/01.domains/01.dns_nohost_me/dns_nohost_me.fr.md rename to pages/02.administer/45.tutorials/05.domains/01.dns_nohost_me/dns_nohost_me.fr.md diff --git a/pages/01.administrate/07.specific_use_cases/01.domains/01.dns_nohost_me/dns_nohost_me.md b/pages/02.administer/45.tutorials/05.domains/01.dns_nohost_me/dns_nohost_me.md similarity index 100% rename from pages/01.administrate/07.specific_use_cases/01.domains/01.dns_nohost_me/dns_nohost_me.md rename to pages/02.administer/45.tutorials/05.domains/01.dns_nohost_me/dns_nohost_me.md diff --git a/pages/01.administrate/07.specific_use_cases/01.domains/02.dns_dynamic_ip/dns_dynamicip.fr.md b/pages/02.administer/45.tutorials/05.domains/02.dns_dynamic_ip/dns_dynamicip.fr.md similarity index 100% rename from pages/01.administrate/07.specific_use_cases/01.domains/02.dns_dynamic_ip/dns_dynamicip.fr.md rename to pages/02.administer/45.tutorials/05.domains/02.dns_dynamic_ip/dns_dynamicip.fr.md diff --git a/pages/01.administrate/07.specific_use_cases/01.domains/02.dns_dynamic_ip/dns_dynamicip.md b/pages/02.administer/45.tutorials/05.domains/02.dns_dynamic_ip/dns_dynamicip.md similarity index 100% rename from pages/01.administrate/07.specific_use_cases/01.domains/02.dns_dynamic_ip/dns_dynamicip.md rename to pages/02.administer/45.tutorials/05.domains/02.dns_dynamic_ip/dns_dynamicip.md diff --git a/pages/01.administrate/07.specific_use_cases/01.domains/03.dns_subdomains/dns_subdomains.fr.md b/pages/02.administer/45.tutorials/05.domains/03.dns_subdomains/dns_subdomains.fr.md similarity index 100% rename from pages/01.administrate/07.specific_use_cases/01.domains/03.dns_subdomains/dns_subdomains.fr.md rename to pages/02.administer/45.tutorials/05.domains/03.dns_subdomains/dns_subdomains.fr.md diff --git a/pages/01.administrate/07.specific_use_cases/01.domains/03.dns_subdomains/dns_subdomains.md b/pages/02.administer/45.tutorials/05.domains/03.dns_subdomains/dns_subdomains.md similarity index 100% rename from pages/01.administrate/07.specific_use_cases/01.domains/03.dns_subdomains/dns_subdomains.md rename to pages/02.administer/45.tutorials/05.domains/03.dns_subdomains/dns_subdomains.md diff --git a/pages/01.administrate/07.specific_use_cases/01.domains/04.dns_local_network/dns_local_network.es.md b/pages/02.administer/45.tutorials/05.domains/04.dns_local_network/dns_local_network.es.md similarity index 100% rename from pages/01.administrate/07.specific_use_cases/01.domains/04.dns_local_network/dns_local_network.es.md rename to pages/02.administer/45.tutorials/05.domains/04.dns_local_network/dns_local_network.es.md diff --git a/pages/01.administrate/07.specific_use_cases/01.domains/04.dns_local_network/dns_local_network.fr.md b/pages/02.administer/45.tutorials/05.domains/04.dns_local_network/dns_local_network.fr.md similarity index 100% rename from pages/01.administrate/07.specific_use_cases/01.domains/04.dns_local_network/dns_local_network.fr.md rename to pages/02.administer/45.tutorials/05.domains/04.dns_local_network/dns_local_network.fr.md diff --git a/pages/01.administrate/07.specific_use_cases/01.domains/04.dns_local_network/dns_local_network.md b/pages/02.administer/45.tutorials/05.domains/04.dns_local_network/dns_local_network.md similarity index 95% rename from pages/01.administrate/07.specific_use_cases/01.domains/04.dns_local_network/dns_local_network.md rename to pages/02.administer/45.tutorials/05.domains/04.dns_local_network/dns_local_network.md index 54385178..10b777ca 100644 --- a/pages/01.administrate/07.specific_use_cases/01.domains/04.dns_local_network/dns_local_network.md +++ b/pages/02.administer/45.tutorials/05.domains/04.dns_local_network/dns_local_network.md @@ -27,12 +27,12 @@ The goal here is to create a network wide redirection handled by your router. Th ### SFR Box If you haven't found your server private IP, you may find it using the SFR box admin panel: Go to Network tab > General - + #### Configure SFR box's DNS Go to Network tab > DNS and add your domain name to the box's DNS. - + ## Configure [hosts](https://en.wikipedia.org/wiki/Host_%28Unix%29) file on client workstation diff --git a/pages/01.administrate/07.specific_use_cases/03.filezilla/filezilla.fr.md b/pages/02.administer/45.tutorials/15.filezilla/filezilla.fr.md similarity index 100% rename from pages/01.administrate/07.specific_use_cases/03.filezilla/filezilla.fr.md rename to pages/02.administer/45.tutorials/15.filezilla/filezilla.fr.md diff --git a/pages/01.administrate/07.specific_use_cases/03.filezilla/filezilla.md b/pages/02.administer/45.tutorials/15.filezilla/filezilla.md similarity index 100% rename from pages/01.administrate/07.specific_use_cases/03.filezilla/filezilla.md rename to pages/02.administer/45.tutorials/15.filezilla/filezilla.md diff --git a/pages/01.administrate/07.specific_use_cases/05.external_storage/external_storage.fr.md b/pages/02.administer/45.tutorials/25.external_storage/external_storage.fr.md similarity index 100% rename from pages/01.administrate/07.specific_use_cases/05.external_storage/external_storage.fr.md rename to pages/02.administer/45.tutorials/25.external_storage/external_storage.fr.md diff --git a/pages/01.administrate/07.specific_use_cases/05.external_storage/external_storage.md b/pages/02.administer/45.tutorials/25.external_storage/external_storage.md similarity index 100% rename from pages/01.administrate/07.specific_use_cases/05.external_storage/external_storage.md rename to pages/02.administer/45.tutorials/25.external_storage/external_storage.md diff --git a/pages/01.administrate/07.specific_use_cases/07.email_relay/email_configure_relay.fr.md b/pages/02.administer/45.tutorials/35.email_relay/email_configure_relay.fr.md similarity index 100% rename from pages/01.administrate/07.specific_use_cases/07.email_relay/email_configure_relay.fr.md rename to pages/02.administer/45.tutorials/35.email_relay/email_configure_relay.fr.md diff --git a/pages/01.administrate/07.specific_use_cases/07.email_relay/email_configure_relay.md b/pages/02.administer/45.tutorials/35.email_relay/email_configure_relay.md similarity index 100% rename from pages/01.administrate/07.specific_use_cases/07.email_relay/email_configure_relay.md rename to pages/02.administer/45.tutorials/35.email_relay/email_configure_relay.md diff --git a/pages/01.administrate/07.specific_use_cases/08.tor/torhiddenservice.fr.md b/pages/02.administer/45.tutorials/40.tor/torhiddenservice.fr.md similarity index 100% rename from pages/01.administrate/07.specific_use_cases/08.tor/torhiddenservice.fr.md rename to pages/02.administer/45.tutorials/40.tor/torhiddenservice.fr.md diff --git a/pages/01.administrate/07.specific_use_cases/08.tor/torhiddenservice.it.md b/pages/02.administer/45.tutorials/40.tor/torhiddenservice.it.md similarity index 100% rename from pages/01.administrate/07.specific_use_cases/08.tor/torhiddenservice.it.md rename to pages/02.administer/45.tutorials/40.tor/torhiddenservice.it.md diff --git a/pages/01.administrate/07.specific_use_cases/08.tor/torhiddenservice.md b/pages/02.administer/45.tutorials/40.tor/torhiddenservice.md similarity index 100% rename from pages/01.administrate/07.specific_use_cases/08.tor/torhiddenservice.md rename to pages/02.administer/45.tutorials/40.tor/torhiddenservice.md diff --git a/pages/01.administrate/07.specific_use_cases/09.certificate_custom/certificate_custom.fr.md b/pages/02.administer/45.tutorials/45.certificate_custom/certificate_custom.fr.md similarity index 100% rename from pages/01.administrate/07.specific_use_cases/09.certificate_custom/certificate_custom.fr.md rename to pages/02.administer/45.tutorials/45.certificate_custom/certificate_custom.fr.md diff --git a/pages/01.administrate/07.specific_use_cases/09.certificate_custom/certificate_custom.md b/pages/02.administer/45.tutorials/45.certificate_custom/certificate_custom.md similarity index 100% rename from pages/01.administrate/07.specific_use_cases/09.certificate_custom/certificate_custom.md rename to pages/02.administer/45.tutorials/45.certificate_custom/certificate_custom.md diff --git a/pages/01.administrate/07.specific_use_cases/11.moving_app_folder/moving_app_folder.fr.md b/pages/02.administer/45.tutorials/55.moving_app_folder/moving_app_folder.fr.md similarity index 100% rename from pages/01.administrate/07.specific_use_cases/11.moving_app_folder/moving_app_folder.fr.md rename to pages/02.administer/45.tutorials/55.moving_app_folder/moving_app_folder.fr.md diff --git a/pages/01.administrate/07.specific_use_cases/11.moving_app_folder/moving_app_folder.md b/pages/02.administer/45.tutorials/55.moving_app_folder/moving_app_folder.md similarity index 100% rename from pages/01.administrate/07.specific_use_cases/11.moving_app_folder/moving_app_folder.md rename to pages/02.administer/45.tutorials/55.moving_app_folder/moving_app_folder.md diff --git a/pages/01.administrate/06.overview/12.security/security.fr.md b/pages/02.administer/45.tutorials/60.security/security.fr.md similarity index 100% rename from pages/01.administrate/06.overview/12.security/security.fr.md rename to pages/02.administer/45.tutorials/60.security/security.fr.md diff --git a/pages/01.administrate/06.overview/12.security/security.md b/pages/02.administer/45.tutorials/60.security/security.md similarity index 100% rename from pages/01.administrate/06.overview/12.security/security.md rename to pages/02.administer/45.tutorials/60.security/security.md diff --git a/pages/02.administer/45.tutorials/65.sftp_on_apps/sftp_on_apps.fr.md b/pages/02.administer/45.tutorials/65.sftp_on_apps/sftp_on_apps.fr.md new file mode 100644 index 00000000..1509db27 --- /dev/null +++ b/pages/02.administer/45.tutorials/65.sftp_on_apps/sftp_on_apps.fr.md @@ -0,0 +1,31 @@ +--- +title: Donner la permission SFTP d'éditer une application +template: docs +taxonomy: + category: docs +routes: + default: '/sftp_on_apps' +--- + +Dans YunoHost, depuis la gestion des permissions par l'interface d'administration web, vous pouvez spécifier quel utilisateur peut accéder à votre système à travers SFTP. + +Cependant ces utilisateurs sont chrootés dans leur répertoire home pour des raisons de sécurité. + +Si vous désirez donner accès à une application spécifique à travers SFTP, voici les actions à faire après avoir donné les droits à l'utilisateur dans l'interface d'adminstration web. + +Dans les instructions suivantes USER est l'utilisateur à qui sont données les permissions d'éditer des fichiers wordpress. + +```bash +mkdir -p /home/USER/apps/wordpress +touch /home/USER/.nobackup +mount --bind /var/www/wordpress /home/USER/apps/wordpress +echo "/var/www/wordpress /home/USER/apps/wordpress none defaults,bind 0 0" >> /etc/fstab +find /var/www/wordpress -type d -exec chmod g+s {} \; + +setfacl -R -m u:wordpress:rwX /var/www/wordpress +setfacl -R -d -m u:wordpress:rwX /var/www/wordpress +setfacl -m u:wordpress:r-- /var/www/wordpress/wp-config.php + +setfacl -R -m u:USER:rwX /var/www/wordpress +setfacl -R -d -m u:USER:rwX /var/www/wordpress +``` diff --git a/pages/01.administrate/07.specific_use_cases/13.sftp_on_apps/sftp_on_apps.md b/pages/02.administer/45.tutorials/65.sftp_on_apps/sftp_on_apps.md similarity index 100% rename from pages/01.administrate/07.specific_use_cases/13.sftp_on_apps/sftp_on_apps.md rename to pages/02.administer/45.tutorials/65.sftp_on_apps/sftp_on_apps.md diff --git a/pages/02.administer/45.tutorials/tutorials.fr.md b/pages/02.administer/45.tutorials/tutorials.fr.md new file mode 100644 index 00000000..6114ccf7 --- /dev/null +++ b/pages/02.administer/45.tutorials/tutorials.fr.md @@ -0,0 +1,12 @@ +--- +title: Cas d'usage spécifiques +template: docs +taxonomy: + category: docs +routes: + default: '/tutorials' + aliases: + - '/specific_use_cases' +--- + +!! Cette section est en cours de réorganisation. diff --git a/pages/02.administer/45.tutorials/tutorials.md b/pages/02.administer/45.tutorials/tutorials.md new file mode 100644 index 00000000..13554b84 --- /dev/null +++ b/pages/02.administer/45.tutorials/tutorials.md @@ -0,0 +1,12 @@ +--- +title: Tutorials +template: docs +taxonomy: + category: docs +routes: + default: '/tutorials' + aliases: + - '/specific_use_cases' +--- + +!! This section is being reworked. diff --git a/pages/01.administrate/08.troubleshooting/01.fail2ban/fail2ban.fr.md b/pages/02.administer/50.troubleshooting/05.fail2ban/fail2ban.fr.md similarity index 98% rename from pages/01.administrate/08.troubleshooting/01.fail2ban/fail2ban.fr.md rename to pages/02.administer/50.troubleshooting/05.fail2ban/fail2ban.fr.md index 959d48c7..e0af1d18 100644 --- a/pages/01.administrate/08.troubleshooting/01.fail2ban/fail2ban.fr.md +++ b/pages/02.administer/50.troubleshooting/05.fail2ban/fail2ban.fr.md @@ -1,5 +1,5 @@ --- -title: Fail2Ban +title: Débannir une adresse IP template: docs taxonomy: category: docs diff --git a/pages/01.administrate/08.troubleshooting/01.fail2ban/fail2ban.it.md b/pages/02.administer/50.troubleshooting/05.fail2ban/fail2ban.it.md similarity index 98% rename from pages/01.administrate/08.troubleshooting/01.fail2ban/fail2ban.it.md rename to pages/02.administer/50.troubleshooting/05.fail2ban/fail2ban.it.md index fa877fc9..9d56e10e 100644 --- a/pages/01.administrate/08.troubleshooting/01.fail2ban/fail2ban.it.md +++ b/pages/02.administer/50.troubleshooting/05.fail2ban/fail2ban.it.md @@ -1,5 +1,5 @@ --- -title: Fail2Ban +title: Sbannare un indirizzo IP template: docs taxonomy: category: docs diff --git a/pages/01.administrate/08.troubleshooting/01.fail2ban/fail2ban.md b/pages/02.administer/50.troubleshooting/05.fail2ban/fail2ban.md similarity index 99% rename from pages/01.administrate/08.troubleshooting/01.fail2ban/fail2ban.md rename to pages/02.administer/50.troubleshooting/05.fail2ban/fail2ban.md index 74d22c6d..e6f11a58 100644 --- a/pages/01.administrate/08.troubleshooting/01.fail2ban/fail2ban.md +++ b/pages/02.administer/50.troubleshooting/05.fail2ban/fail2ban.md @@ -1,5 +1,5 @@ --- -title: Fail2Ban +title: IP address unban template: docs taxonomy: category: docs diff --git a/pages/01.administrate/08.troubleshooting/02.admin_password/change_admin_password.fr.md b/pages/02.administer/50.troubleshooting/10.admin_password/change_admin_password.fr.md similarity index 100% rename from pages/01.administrate/08.troubleshooting/02.admin_password/change_admin_password.fr.md rename to pages/02.administer/50.troubleshooting/10.admin_password/change_admin_password.fr.md diff --git a/pages/01.administrate/08.troubleshooting/02.admin_password/change_admin_password.it.md b/pages/02.administer/50.troubleshooting/10.admin_password/change_admin_password.it.md similarity index 100% rename from pages/01.administrate/08.troubleshooting/02.admin_password/change_admin_password.it.md rename to pages/02.administer/50.troubleshooting/10.admin_password/change_admin_password.it.md diff --git a/pages/01.administrate/08.troubleshooting/02.admin_password/change_admin_password.md b/pages/02.administer/50.troubleshooting/10.admin_password/change_admin_password.md similarity index 100% rename from pages/01.administrate/08.troubleshooting/02.admin_password/change_admin_password.md rename to pages/02.administer/50.troubleshooting/10.admin_password/change_admin_password.md diff --git a/pages/01.administrate/08.troubleshooting/03.noaccess/noaccess.fr.md b/pages/02.administer/50.troubleshooting/15.noaccess/noaccess.fr.md similarity index 100% rename from pages/01.administrate/08.troubleshooting/03.noaccess/noaccess.fr.md rename to pages/02.administer/50.troubleshooting/15.noaccess/noaccess.fr.md diff --git a/pages/01.administrate/08.troubleshooting/03.noaccess/noaccess.it.md b/pages/02.administer/50.troubleshooting/15.noaccess/noaccess.it.md similarity index 100% rename from pages/01.administrate/08.troubleshooting/03.noaccess/noaccess.it.md rename to pages/02.administer/50.troubleshooting/15.noaccess/noaccess.it.md diff --git a/pages/01.administrate/08.troubleshooting/03.noaccess/noaccess.md b/pages/02.administer/50.troubleshooting/15.noaccess/noaccess.md similarity index 100% rename from pages/01.administrate/08.troubleshooting/03.noaccess/noaccess.md rename to pages/02.administer/50.troubleshooting/15.noaccess/noaccess.md diff --git a/pages/01.administrate/08.troubleshooting/04.ipv6/ipv6.fr.md b/pages/02.administer/50.troubleshooting/20.ipv6/ipv6.fr.md similarity index 80% rename from pages/01.administrate/08.troubleshooting/04.ipv6/ipv6.fr.md rename to pages/02.administer/50.troubleshooting/20.ipv6/ipv6.fr.md index 40d5c39e..eadb2cae 100644 --- a/pages/01.administrate/08.troubleshooting/04.ipv6/ipv6.fr.md +++ b/pages/02.administer/50.troubleshooting/20.ipv6/ipv6.fr.md @@ -27,9 +27,12 @@ Sur le panneau de gestion d'OVH, vous aller récupérer 3 informations : Sur votre VPS, vous aller créer une sauvegarde de votre fichier de configuration des interfaces réseau dans votre répertoire home avec la commande : `cp /etc/network/interfaces ~/interfaces`. -Ensuite, vous pouvez modifier le fichier de configuration `/etc/network/interfaces`. +2 possibilités pour inscrire vos données ipv6 : +1/ vous pouvez modifier le fichier de configuration `/etc/network/interfaces` +2/ vous pouvez créer un autre fichier "à part" par la commande `sudo nano /etc/network/interfaces.d/ovh-ipv6.cfg` (ce dernier fichier est pris en compte car appartenant au dossier) -! Dans cet exemple, nous considérons que votre interface réseau est `eth0`. Si elle est différente (vérifiez avec `ip a`) vous devez adapter l'exemple pour correspondre à votre situation. +! Découvrir et vérifier avec la commande `ip a` l'interface utilisée sur votre VPS ( généralement du type ENS3 chez OVH) +! Dans cet exemple, nous considérons que votre interface réseau est `eth0`. Vous devez adapter l'exemple pour correspondre à votre situation. ```plaintext iface eth0 inet6 static diff --git a/pages/01.administrate/08.troubleshooting/04.ipv6/ipv6.it.md b/pages/02.administer/50.troubleshooting/20.ipv6/ipv6.it.md similarity index 100% rename from pages/01.administrate/08.troubleshooting/04.ipv6/ipv6.it.md rename to pages/02.administer/50.troubleshooting/20.ipv6/ipv6.it.md diff --git a/pages/01.administrate/08.troubleshooting/04.ipv6/ipv6.md b/pages/02.administer/50.troubleshooting/20.ipv6/ipv6.md similarity index 100% rename from pages/01.administrate/08.troubleshooting/04.ipv6/ipv6.md rename to pages/02.administer/50.troubleshooting/20.ipv6/ipv6.md diff --git a/pages/01.administrate/08.troubleshooting/05.unblacklisting/blacklist_forms.fr.md b/pages/02.administer/50.troubleshooting/25.unblacklisting/blacklist_forms.fr.md similarity index 100% rename from pages/01.administrate/08.troubleshooting/05.unblacklisting/blacklist_forms.fr.md rename to pages/02.administer/50.troubleshooting/25.unblacklisting/blacklist_forms.fr.md diff --git a/pages/01.administrate/08.troubleshooting/05.unblacklisting/blacklist_forms.it.md b/pages/02.administer/50.troubleshooting/25.unblacklisting/blacklist_forms.it.md similarity index 100% rename from pages/01.administrate/08.troubleshooting/05.unblacklisting/blacklist_forms.it.md rename to pages/02.administer/50.troubleshooting/25.unblacklisting/blacklist_forms.it.md diff --git a/pages/02.administer/50.troubleshooting/25.unblacklisting/blacklist_forms.md b/pages/02.administer/50.troubleshooting/25.unblacklisting/blacklist_forms.md new file mode 100644 index 00000000..3670bcf6 --- /dev/null +++ b/pages/02.administer/50.troubleshooting/25.unblacklisting/blacklist_forms.md @@ -0,0 +1,66 @@ +--- +title: Unblacklisting forms +template: docs +taxonomy: + category: docs +routes: + default: '/blacklist_forms' +--- + +It could happen sometimes that your IP is blacklisted by some email provider, or anti-spam services. If you receive an alert from the diagnosis tool, click on details to find the unblocking forms. + +## Test your server + +To check your Email deliverability, YunoHost provide some tests avilables in the Diagnosis tool. This tools evalutes a lot of configuration and ip reputation points. It gives you also an indicator if some mails are blocked inside the mail queue (waiting to be sent). +all the points evaluated by [the well known mail-tester.com](https://www.mail-tester.com) except for mail content (usefull if you prepare a newsletter). + +However, if you have a doubt on the internal diagnosis results, you could check on external tools: +- by sending an emails : [Mail tester](https://www.mail-tester.com) +- by providing the public ip : [MultiRBL Valli](https://multirbl.valli.org/) or [Whatismyip](https://whatismyipaddress.com/blacklist-check) + +## Check your mail logs + +This command can help you to summarize which emails has been refused by other SMTP server and why. + +``` +cat /var/log/mail.log | grep "deferred" | sed -E "s/(:[0-9][0-9]).+.+dsn/\terror/g" | sed -E "s/, status=deferred \(/ /g" | sed -E "s/\)$//g" +``` + +See [the list of SMTP return code](https://en.wikipedia.org/wiki/List_of_SMTP_server_return_codes) from wikipedia. + +## Untestable email providers +YunoHost is only able to test generic blacklist using the DNS RBL mechanism. However, Gmail, Microsoft, Yahoo or Free maintains their own blacklisting mechanism, so in some situation you may need to contact their teams through dedicated forms or use dedicated tools. + +### Microsoft + +* No way to test easily IP reputation +* [Microsoft guide for postmaster](https://sendersupport.olc.protection.outlook.com/pm/) +* [Information about SMTP return code from Microsoft](https://sendersupport.olc.protection.outlook.com/pm/troubleshooting.aspx#Codes) +* Reputation Management tools : + * [Junk Email Reporting Program (JMRP)](https://postmaster.live.com/snds/JMRP.aspx) + * [Smart Network Data Services (SNDS)](https://postmaster.live.com/snds/index.aspx) +* [Get support form for deliverability issues](https://support.microsoft.com/supportrequestform/8ad563e3-288e-2a61-8122-3ba03d6b8d75) (Sadly you need a Microsoft account :/ ) + +### Gmail +* No way to test easily IP reputation +* [Google guide for postmaster](https://support.google.com/a/topic/1354753) +* [Information about SMTP return code from Google](https://support.google.com/a/answer/3726730) +* Reputation Management tools : [Google Postmaster Tools](https://postmaster.google.com) +* [Get support form for deliverability issues](https://support.google.com/mail/contact/bulk_send_new) + +### Yahoo +* No way to test easily IP reputation +* [Yahoo guide for postmaster](https://senders.yahooinc.com/best-practices) +* [Information about SMTP return code from Yahoo](https://senders.yahooinc.com/smtp-error-codes) +* Reputation Management tools : [Complaint Feedback Loop](https://io.help.yahoo.com/contact/index?page=contactform&locale=en_US&token=Zh%2FBBVqXzLHlIbokbUqVWTUbuuQeXGkGnZzhKR2JQ4O6mMQdy9JSWdtWFXvjthcYCRj9bUIFfycOfG%2B4GOHPHoOGa8HwDO2%2B0kYRtTcdR8Nja5P9HWkKh3VWfS3pyu4UdjhvwG%2BBCvnYFl5dToDK%2Fw%3D%3D&selectedChannel=email-icon) +* [Get support form for deliverability issues](https://senders.yahooinc.com/contact) + +### Free +You can find a tool to test your IP, advices, explanation of error code and a way to contact Free on [this page](https://postmaster.free.fr/) + +## Get alert about emails sent without SPF or DKIM +If you use your own domains and think that some mails are sent by unauthorized servers (so without SPF/DKIM), you get report about this mail with. +``` +_dmarc.DOMAIN 3600 IN TXT "v=DMARC1; p=none; fo=1; rua=mailto:example@domain.tld!10m" +``` + diff --git a/pages/01.administrate/08.troubleshooting/troubleshooting.fr.md b/pages/02.administer/50.troubleshooting/troubleshooting.fr.md similarity index 100% rename from pages/01.administrate/08.troubleshooting/troubleshooting.fr.md rename to pages/02.administer/50.troubleshooting/troubleshooting.fr.md diff --git a/pages/01.administrate/08.troubleshooting/troubleshooting.it.md b/pages/02.administer/50.troubleshooting/troubleshooting.it.md similarity index 100% rename from pages/01.administrate/08.troubleshooting/troubleshooting.it.md rename to pages/02.administer/50.troubleshooting/troubleshooting.it.md diff --git a/pages/01.administrate/08.troubleshooting/troubleshooting.md b/pages/02.administer/50.troubleshooting/troubleshooting.md similarity index 100% rename from pages/01.administrate/08.troubleshooting/troubleshooting.md rename to pages/02.administer/50.troubleshooting/troubleshooting.md diff --git a/pages/01.administrate/09.providers/01.registrar/gandi/autodns.md b/pages/02.administer/55.providers/05.registrar/gandi/autodns.md similarity index 100% rename from pages/01.administrate/09.providers/01.registrar/gandi/autodns.md rename to pages/02.administer/55.providers/05.registrar/gandi/autodns.md diff --git a/pages/01.administrate/09.providers/01.registrar/ovh/autodns/autodns.fr.md b/pages/02.administer/55.providers/05.registrar/ovh/autodns/autodns.fr.md similarity index 100% rename from pages/01.administrate/09.providers/01.registrar/ovh/autodns/autodns.fr.md rename to pages/02.administer/55.providers/05.registrar/ovh/autodns/autodns.fr.md diff --git a/pages/01.administrate/09.providers/01.registrar/ovh/autodns/autodns.md b/pages/02.administer/55.providers/05.registrar/ovh/autodns/autodns.md similarity index 100% rename from pages/01.administrate/09.providers/01.registrar/ovh/autodns/autodns.md rename to pages/02.administer/55.providers/05.registrar/ovh/autodns/autodns.md diff --git a/pages/01.administrate/09.providers/01.registrar/ovh/manualdns/manualdns.fr.md b/pages/02.administer/55.providers/05.registrar/ovh/manualdns/manualdns.fr.md similarity index 100% rename from pages/01.administrate/09.providers/01.registrar/ovh/manualdns/manualdns.fr.md rename to pages/02.administer/55.providers/05.registrar/ovh/manualdns/manualdns.fr.md diff --git a/pages/01.administrate/09.providers/01.registrar/ovh/manualdns/manualdns.md b/pages/02.administer/55.providers/05.registrar/ovh/manualdns/manualdns.md similarity index 100% rename from pages/01.administrate/09.providers/01.registrar/ovh/manualdns/manualdns.md rename to pages/02.administer/55.providers/05.registrar/ovh/manualdns/manualdns.md diff --git a/pages/01.administrate/09.providers/01.registrar/registrar.md b/pages/02.administer/55.providers/05.registrar/registrar.md similarity index 100% rename from pages/01.administrate/09.providers/01.registrar/registrar.md rename to pages/02.administer/55.providers/05.registrar/registrar.md diff --git a/pages/01.administrate/09.providers/02.isp/free/isp_free.fr.md b/pages/02.administer/55.providers/10.isp/free/isp_free.fr.md similarity index 100% rename from pages/01.administrate/09.providers/02.isp/free/isp_free.fr.md rename to pages/02.administer/55.providers/10.isp/free/isp_free.fr.md diff --git a/pages/01.administrate/09.providers/02.isp/isp.md b/pages/02.administer/55.providers/10.isp/isp.md similarity index 96% rename from pages/01.administrate/09.providers/02.isp/isp.md rename to pages/02.administer/55.providers/10.isp/isp.md index 04707c69..afaf1c4c 100644 --- a/pages/01.administrate/09.providers/02.isp/isp.md +++ b/pages/02.administer/55.providers/10.isp/isp.md @@ -152,9 +152,10 @@ Pour une liste plus complète et précise, référez-vous à la très bonne docu | Service provider | Box (modem/router) | uPnP available | Port 25 openable | [Hairpinning](http://en.wikipedia.org/wiki/Hairpinning) | Customizable reverse DNS | Fix IP | | --- | --- | --- | --- | --- | --- | --- | -| DIGI Távközlési és Szolgáltató Kft. | Yes | No | No. Business only. | No | No | No. Business only | - +| DIGI Távközlési és Szolgáltató Kft. | Yes | Yes | No. Business only. | No | No. Business only | No. Business only | +| Telekom Magyarország | Yes | Yes | No | No | No | No | +**Notice** : DIGI allows non-business users to subscribe to their business plan, for roughly the same price as the regular plan. Fix IP is an additional subscription for business plan users. {% elseif country == 'irl' %} diff --git a/pages/01.administrate/09.providers/02.isp/orange/isp_orange.fr.md b/pages/02.administer/55.providers/10.isp/orange/isp_orange.fr.md similarity index 100% rename from pages/01.administrate/09.providers/02.isp/orange/isp_orange.fr.md rename to pages/02.administer/55.providers/10.isp/orange/isp_orange.fr.md diff --git a/pages/01.administrate/09.providers/02.isp/sfr/isp_sfr.fr.md b/pages/02.administer/55.providers/10.isp/sfr/isp_sfr.fr.md similarity index 100% rename from pages/01.administrate/09.providers/02.isp/sfr/isp_sfr.fr.md rename to pages/02.administer/55.providers/10.isp/sfr/isp_sfr.fr.md diff --git a/pages/01.administrate/07.specific_use_cases/10.vpn/vpn_advantage.de.md b/pages/02.administer/55.providers/15.vpn/01.vpn/vpn_advantage.de.md similarity index 100% rename from pages/01.administrate/07.specific_use_cases/10.vpn/vpn_advantage.de.md rename to pages/02.administer/55.providers/15.vpn/01.vpn/vpn_advantage.de.md diff --git a/pages/01.administrate/07.specific_use_cases/10.vpn/vpn_advantage.es.md b/pages/02.administer/55.providers/15.vpn/01.vpn/vpn_advantage.es.md similarity index 100% rename from pages/01.administrate/07.specific_use_cases/10.vpn/vpn_advantage.es.md rename to pages/02.administer/55.providers/15.vpn/01.vpn/vpn_advantage.es.md diff --git a/pages/01.administrate/07.specific_use_cases/10.vpn/vpn_advantage.fr.md b/pages/02.administer/55.providers/15.vpn/01.vpn/vpn_advantage.fr.md similarity index 100% rename from pages/01.administrate/07.specific_use_cases/10.vpn/vpn_advantage.fr.md rename to pages/02.administer/55.providers/15.vpn/01.vpn/vpn_advantage.fr.md diff --git a/pages/01.administrate/07.specific_use_cases/10.vpn/vpn_advantage.md b/pages/02.administer/55.providers/15.vpn/01.vpn/vpn_advantage.md similarity index 100% rename from pages/01.administrate/07.specific_use_cases/10.vpn/vpn_advantage.md rename to pages/02.administer/55.providers/15.vpn/01.vpn/vpn_advantage.md diff --git a/pages/01.administrate/09.providers/03.vpn/vpn.md b/pages/02.administer/55.providers/15.vpn/vpn.md similarity index 100% rename from pages/01.administrate/09.providers/03.vpn/vpn.md rename to pages/02.administer/55.providers/15.vpn/vpn.md diff --git a/pages/01.administrate/09.providers/04.server/server.md b/pages/02.administer/55.providers/20.server/server.md similarity index 100% rename from pages/01.administrate/09.providers/04.server/server.md rename to pages/02.administer/55.providers/20.server/server.md diff --git a/pages/02.administer/60.extend/05.install_unpackaged_app/install_unpackaged_app.md b/pages/02.administer/60.extend/05.install_unpackaged_app/install_unpackaged_app.md new file mode 100644 index 00000000..314756be --- /dev/null +++ b/pages/02.administer/60.extend/05.install_unpackaged_app/install_unpackaged_app.md @@ -0,0 +1,23 @@ +--- +title: Install unpackaged apps +template: docs +taxonomy: + category: docs +routes: + default: '/install_unpackaged_apps' +--- + + +## PHP or HTML/JS apps +If your app is a PHP or HTML/JS app, you probably should use the `Custom Webapp`, also know as `my_webapp`, in order to configure nginx, php, mysql, yunohost permission and backup for you. + +## Other technologies + +If you use an other techno, you should install it like on a classical debian. + + +To expose the app on the web through nginx and be able to manage access permissions to the webapp, you could use the [`redirect` app](https://github.com/YunoHost-Apps/redirect_ynh/) to create a nginx reverse proxy on your local ip/port running the service. + +!!! You should use the proxy mode of the redirect app and not HTTP redirections mode. + +You probably should create custom backup and restore hooks to integrate your app to your YunoHost backup/restore process. See [Backup and restore hooks]() diff --git a/pages/02.administer/60.extend/10.configuration_management/configuration_management.md b/pages/02.administer/60.extend/10.configuration_management/configuration_management.md new file mode 100644 index 00000000..8578ecb6 --- /dev/null +++ b/pages/02.administer/60.extend/10.configuration_management/configuration_management.md @@ -0,0 +1,10 @@ +--- +title: Configuration management +template: docs +taxonomy: + category: docs +routes: + default: '/configuration_management' +--- + +!! This page is to be written diff --git a/pages/01.administrate/07.specific_use_cases/04.theming/theming.fr.md b/pages/02.administer/60.extend/15.theming/theming.fr.md similarity index 100% rename from pages/01.administrate/07.specific_use_cases/04.theming/theming.fr.md rename to pages/02.administer/60.extend/15.theming/theming.fr.md diff --git a/pages/01.administrate/07.specific_use_cases/04.theming/theming.md b/pages/02.administer/60.extend/15.theming/theming.md similarity index 94% rename from pages/01.administrate/07.specific_use_cases/04.theming/theming.md rename to pages/02.administer/60.extend/15.theming/theming.md index 7968e6ec..f4ae2baf 100644 --- a/pages/01.administrate/07.specific_use_cases/04.theming/theming.md +++ b/pages/02.administer/60.extend/15.theming/theming.md @@ -7,6 +7,14 @@ routes: default: '/theming' --- +## Globally disable the overlay + +You can disable the overlay by changing the dedicated settings: + +``` +yunohost settings set ssowat.panel_overlay.enabled -v 0 +``` + ## Using a theme Since YunoHost 3.5, you can change the theme of the user portal - though for now it requires tweaking via the command line. diff --git a/pages/02.administer/60.extend/20.helpers/helpers.md b/pages/02.administer/60.extend/20.helpers/helpers.md new file mode 100644 index 00000000..a7cb0340 --- /dev/null +++ b/pages/02.administer/60.extend/20.helpers/helpers.md @@ -0,0 +1,5 @@ +--- +title: App helpers +template: docs +redirect: '/packaging_apps_helpers' +--- diff --git a/pages/02.administer/60.extend/25.hooks/hooks.md b/pages/02.administer/60.extend/25.hooks/hooks.md new file mode 100644 index 00000000..5be0ac0f --- /dev/null +++ b/pages/02.administer/60.extend/25.hooks/hooks.md @@ -0,0 +1,5 @@ +--- +title: Hooks +template: docs +redirect: '/packaging_apps_hooks' +--- diff --git a/pages/01.administrate/07.specific_use_cases/12.api/admin_api.fr.md b/pages/02.administer/60.extend/30.api/admin_api.fr.md similarity index 100% rename from pages/01.administrate/07.specific_use_cases/12.api/admin_api.fr.md rename to pages/02.administer/60.extend/30.api/admin_api.fr.md diff --git a/pages/02.administer/60.extend/30.api/admin_api.md b/pages/02.administer/60.extend/30.api/admin_api.md new file mode 100644 index 00000000..7cfddcb6 --- /dev/null +++ b/pages/02.administer/60.extend/30.api/admin_api.md @@ -0,0 +1,67 @@ +--- +title: Administration from the API or an external application +template: docs +taxonomy: + category: docs +routes: + default: '/admin_api' +--- + +All command line actions can also be ran from the web API. The API is available at https://your.server/yunohost/api. + +## Test with curl +You must first retrieve a login cookie thanks to the /login route to perform the other actions. + +```bash +# Login (with admin password) +curl -k -H "X-Requested-With: customscript" \ + -d "credentials=supersecretpassword" \ + -dump-header headers \ + https://your.server/yunohost/api/login + +# GET example +curl -k -i -H "Accept: application/json" \ + -H "Content-Type: application/json" \ + -H 'Cookie: yunohost.admin="XXXXXXXX"' \ + -L -b headers -X GET https://your.server/yunohost/api/ROUTE \ + | grep } | python -mjson.tool +``` + +## Test with our swagger doc + + 1. Login on the [Webadmin of demo.yunohost.org](https://demo.yunohost.org/yunohost/admin/) + 2. Use the `Try it out` button on the API endpoint you want to test + +
+ + + + + + + diff --git a/pages/02.administer/60.extend/extend.md b/pages/02.administer/60.extend/extend.md new file mode 100644 index 00000000..6a7d9ccc --- /dev/null +++ b/pages/02.administer/60.extend/extend.md @@ -0,0 +1,10 @@ +--- +title: Understand and extend YunoHost +template: docs +taxonomy: + category: docs +routes: + default: '/extend' +--- + +!! This section is to be written diff --git a/pages/01.administrate/admindoc.de.md b/pages/02.administer/admindoc.de.md similarity index 100% rename from pages/01.administrate/admindoc.de.md rename to pages/02.administer/admindoc.de.md diff --git a/pages/02.administer/admindoc.es.md b/pages/02.administer/admindoc.es.md new file mode 100644 index 00000000..7a8fd7fd --- /dev/null +++ b/pages/02.administer/admindoc.es.md @@ -0,0 +1,12 @@ +--- +title: Admin guide +template: chapter +taxonomy: + category: docs +routes: + default: /admindoc +--- + +### Administrar + +# Descubre el auto-hospedaje, cómo instalar y usar tu YunoHost \ No newline at end of file diff --git a/pages/01.administrate/admindoc.fr.md b/pages/02.administer/admindoc.fr.md similarity index 100% rename from pages/01.administrate/admindoc.fr.md rename to pages/02.administer/admindoc.fr.md diff --git a/pages/01.administrate/admindoc.it.md b/pages/02.administer/admindoc.it.md similarity index 100% rename from pages/01.administrate/admindoc.it.md rename to pages/02.administer/admindoc.it.md diff --git a/pages/01.administrate/admindoc.md b/pages/02.administer/admindoc.md similarity index 100% rename from pages/01.administrate/admindoc.md rename to pages/02.administer/admindoc.md diff --git a/pages/02.applications/02.docs/appsdoc.md_ b/pages/02.applications/02.docs/appsdoc.md_ deleted file mode 100644 index 32e978bc..00000000 --- a/pages/02.applications/02.docs/appsdoc.md_ +++ /dev/null @@ -1,128 +0,0 @@ ---- -title: Apps list -template: docs -taxonomy: - category: docs -routes: - default: '/appsdoc' ---- - -- [Adminer](app_adminer) -- [Airsonic](app_airsonic) -- [Ampache](app_ampache) -- [Anarchism](app_anarchism) -- [Anfora](app_anfora) -- [Archivist](app_archivist) -- [Baïkal](app_baikal) -- [Bitwarden](app_bitwarden) -- [Bibliogram](app_bibliogram) -- [Bludit](app_bludit) -- [Blogotext](app_blogotext) -- [BookStack](app_bookstack) -- [Borg](app_borg) -- [BoZoN](app_bozon) -- [Calibre-Web](app_calibreweb) -- [Cheky](app_cheky) -- [CiviCRM](app_civicrm_drupal7) -- [CodiMD](app_codimd) -- [Collabora](app_collabora) -- [Collabora (in Docker)](app_collaboradocker) -- [Concret5](app_concrete5) -- [Cowyo](app_cowyo) -- [Custom Webapp](app_my_webapp) -- [Diagrams.net](app_diagramsnet) -- [Discourse](app_discourse) -- [Distbin](app_distbin) -- [Dokuwiki](app_dokuwiki) -- [Dolibarr](app_dolibarr) -- [Dotclear 2](app_dotclear2) -- [Drupal](app_drupal) -- [Drupal 7](app_drupal7) -- [Etherpad (with mypads's plugin)](app_etherpad_mypads) -- [Fallback](app_fallback) -- [FirefoxSync](app_ffsync) -- [Fireflyiii](app_firefly-iii) -- [Flarum](app_flarum) -- [FluxBB](app_fluxbb) -- [Framaforms](app_framaforms) -- [FreshRSS](app_freshrss) -- [Friendica](app_friendica) -- [Funkwhale](app_funkwhale) -- [Galene](app_galene) -- [Garradin](app_garradin) -- [Gitea](app_gitea) -- [GitLab](app_gitlab) -- [GitLab Runner](app_gitlab-runner) -- [Glowing Bear](app_glowing_bear) -- [Gogs](app_gogs) -- [Gotify](app_gotify) -- [Grav](app_grav) -- [Halcyon](app_halcyon) -- [Haste](app_haste) -- [HedgeDoc](app_hedgedoc) -- [Hextris](app_hextris) -- [Horde](app_horde) -- [Hubzilla](app_hubzilla) -- [InvoiceNinja](app_invoiceninja) -- [Jappix](app_jappix) -- [Jirafeau](app_jirafeau) -- [Jitsi](app_jitsi) -- [JupyterLab](app_jupyterlab) -- [Keeweb](app_keeweb) -- [Kresus](app_kresus) -- [Leed](app_leed) -- [Limesurvey](app_limesurvey) -- [Lstu](app_lstu) -- [Lufi](app_lufi) -- [Lutim](app_lutim) -- [Lychee](app_lychee) -- [Mattermost](app_mattermost) -- [Mailman](app_mailman) -- [Mantis](app_mantis) -- [Matomo](app_matomo) -- [Mattermost](app_mattermost) -- [Mediawiki](app_mediawiki) -- [Mindmaps](app_mindmaps) -- [Minetest](app_minetest) -- [Minidlna](app_minidlna) -- [Mobilizon](app_mobilizon) -- [Moodle](app_moodle) -- [Mumble](app_mumbleserver) -- [Navidrome](app_navidrome) -- [Netdata](app_netdata) -- [Nextcloud](app_nextcloud) -- [Noalyss](app_noalyss) -- [OnlyOffice](app_onlyoffice) -- [Opensondage](app_opensondage) -- [OSticket](app_osticket) -- [Peertube](app_peertube) -- [PHPmyadmin](app_phpmyadmin) -- [PHPsysinfo](app_phpsysinfo) -- [Pihole](app_pihole) -- [Piwigo](app_piwigo) -- [Pleroma](app_pleroma) -- [Plume](app_plume) -- [Pluxml](app_pluxml) -- [PrivateBin](app_privatebin) -- [Radicale](app_radicale) -- [Rainloop](app_rainloop) -- [Searx](app_searx) -- [Shaarli](app_shaarli) -- [Shellinabox](app_shellinabox) -- [Simple-torrent](app_simple-torrent) -- [Slingcode](app_slingcode) -- [Sogo](app_sogo) -- [Spip](app_spip) -- [Strut](app_strut) -- [Transmission](app_transmission) -- [TinyTinyRSS](app_ttrss) -- [Unattended upgrades](app_unattended_upgrades) -- [Wallabag2](app_wallabag2) -- [Weblate](app_weblate) -- [Wekan](app_wekan) -- [Wiki.js](app_wikijs) -- [Webtrees](app_webtrees) -- [WordPress](app_wordpress) -- [Yunofav](app_yunofav) -- [Zerobin](app_zerobin) -- (Note that you can add a new page here if you want to start document in another `app`...) diff --git a/pages/02.applications/02.docs/pluxml/app_pluxml.fr.md b/pages/02.applications/02.docs/pluxml/app_pluxml.fr.md deleted file mode 100644 index 569d0e48..00000000 --- a/pages/02.applications/02.docs/pluxml/app_pluxml.fr.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -title: PluXml -template: docs -taxonomy: - category: docs, apps -routes: - default: '/app_pluxml' ---- - -![PluXml_logo](image://PluXml_logo.png) - -PluXml est un moteur de blog/CMS stockant ces données en XML et ne nécessitant pas de base de données SQL. - -## Aperçu - -![PluXml_screenshot](image://PluXml_screenshot.jpg) - -## Plugins et thèmes - -Les plugins et thèmes doivent être installés manuellement respectivement dans les dossiers `/var/www/pluxml/plugins` et `/var/www/pluxml/themes`. - -## Sauvegarde - -Pour sauvegarder votre blog, il est nécessaire de réaliser une copie du dossier `/var/www/pluxml/data`. Cette procédure de sauvegarde est également recommandée avant toute mise à jour de l'application. - -## Liens - -PluXml : https://www.pluxml.org/ -Documentation : https://wiki.pluxml.org/ -Forum : https://forum.pluxml.org/ diff --git a/pages/02.applications/02.docs/pluxml/app_pluxml.md b/pages/02.applications/02.docs/pluxml/app_pluxml.md deleted file mode 100644 index 4fe7d8fb..00000000 --- a/pages/02.applications/02.docs/pluxml/app_pluxml.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -title: PluXml -template: docs -taxonomy: - category: docs, apps -routes: - default: '/app_pluxml' ---- - -![PluXml_logo](image://PluXml_logo.png) - -PluXml is a blog/CMS storing data in XML and not in a SQL database. - -## Overview - -![PluXml_screenshot](image://PluXml_screenshot.jpg) - -## Plugins and themes - -Plugins and themes should respectively be installed in the following folders: `/var/www/pluxml/plugins`, `/var/www/pluxml/themes`. - -## Backup - -To restore your blog, you should keep a copy of the folder `/var/www/pluxml/data`. It is recommended to do this backup before any upgrade. - -## Link - -PluXml : https://www.pluxml.org/ -Documentation : https://wiki.pluxml.org/ -Forum : https://forum.pluxml.org/ diff --git a/pages/03.community/05.project_organization/yunohost_project_organization.fr.md b/pages/03.community/05.project_organization/yunohost_project_organization.fr.md deleted file mode 100644 index c867617c..00000000 --- a/pages/03.community/05.project_organization/yunohost_project_organization.fr.md +++ /dev/null @@ -1,311 +0,0 @@ ---- -title: Organisation du projet -template: docs -taxonomy: - category: docs -routes: - default: '/yunohost_project_organization' - aliases: - - '/project_organization' ---- - -! This page is outdated and should be reworked - -## Objectif du document - -Ce document a pour objectif de permettre aux contributeurs de se sentir légitimes d’effectuer une contribution dans le projet YunoHost avec un avis collectif. Il vise également à renforcer le projet en le structurant autour de groupes de travail autonomes pouvant résister au départ ou à l'absence de certains contributeurs. -Le projet étant communautaire, les décisions prises hâtivement et discrètement par un groupe restreint de contributeurs peuvent entraîner des frustrations postérieures. -Pour pallier ce problème, la solution proposée ici est de faire en sorte que les décisions soient prises collectivement, qu’elles soient suffisamment réfléchies, et qu'elles soient documentées ou rendues publiques. -Un conseil oriente l’évolution du projet YunoHost, et des groupes d’intérêts permettent de contribuer plus efficacement en fonction des domaines de prédilection de chacun. - -## Définition de YunoHost - -### Objectifs -Le but de YunoHost est de rendre accessibles au plus grand nombre l’installation et l’administration d’un serveur, sans délaisser la qualité et la fiabilité du logiciel. - -### Valeurs - -#### Un logiciel libre et communautaire - -YunoHost est un logiciel sous licence libre, entièrement communautaire, et reposant sur des applications elles-mêmes communautaires et souvent libres (Roundcube, Baïkal, etc.). - - -#### Que chacun peut s'approprier - -Historiquement, le projet est très proche des initiatives visant à la création d'un internet neutre et décentralisé. Cette proximité, notamment avec la [FFDN](https://www.ffdn.org/), a amené une partie des contributeurs de YunoHost à créer la Brique Internet dont la mission est de faciliter l'auto-hébergement en fournissant une solution complète incluant service (via un VPN) et matériel. Cet aspect militant n'entrave pas des initiatives commerciales du logiciel pour lequel des entreprises pourraient proposer du support ou de l'hébergement. - - -## Organisation de YunoHost - -### Une structure ouverte, organisée par thèmes -L'objectif de l'organisation de YunoHost est de permettre au plus grand nombre de contribuer à l'amélioration du logiciel, que ce soit d'un point de vue technique (développement, packaging d'application) ou non (communication, assistance aux utilisateurs, documentation, etc.). Inspiré par différents projets passés en revue lors de l'événement (Kodi, Debian, Django, Fedora, Wikipédia, etc.) et des idées de contributeur de YunoHost (Jérôme, Bram, opi, scith, ju), il a été décidé d'une organisation en groupes spécialisés, fédérés par un conseil de contributeurs clés. - -Schéma d’organisation du projet YunoHost : - - - - -#### Définition et constitution des groupes -La constitution de groupes part du constat que YunoHost compte beaucoup de sous-projets (treize au total), mais que l'on ne sait pas toujours qui en est en charge ou qui y est compétent. Il est donc proposé une simplification de l'organisation des sous-projets en groupes thématiques : - -- ##### Groupe Core Dev - - Core YunoHost - - Moulinette - - Admin web - - SSOwat - - Dynette - - YNH-Dev - -- ##### Groupe Distribution - - Création et maintenance des images d'installation sur diverses architectures - - Distribution des images - - Gestion de la distribution des paquets Debian. - -- ##### Groupe Infra/Adminsys - - Infrastructure - - Site web (wiki, forum, salon de discussion, Redmine, Mumble) - - Démo - - Services - - [ip.yunohost.org](https://ip.yunohost.org/) et ip6.yunohost.org - - [yunoports](http://ports.yunohost.org/) - - nohost.me et noho.st - - [yunodash](https://dash.yunohost.org/) - - [yunopaste](http://paste.yunohost.org/) - -- ##### Groupe Apps - - Apps Officielles - - Apps Communautaires - - outils de développements d'app (package_checker, package linter) - -- ##### Groupe Communication - - Documentation - - Communication (annonce évolutions du projet sur le forum, réseaux sociaux) - - Traduction - - Entraide (support) - -Les groupes sont ouverts à tous les contributeurs souhaitant participer au développement de YunoHost. Chacun peut s'inscrire aux canaux de communication associés aux groupes auxquels il souhaite prendre part. Chaque inscrit est libre d'échanger avec le reste du groupe et de proposer une prise de décision à la suite d'une étape d'échange et d'amélioration de la proposition. Il est recommandé aux contributeurs de documenter au maximum leurs décisions et leurs contributions. Ceci permet de renforcer l'autonomie des groupes en cas de départs ou d'absences de certains de leurs membres. -Afin de faciliter sa gestion, chaque groupe nomme donc un coordinateur (et un remplaçant) dont le rôle est : - -- d'accueillir et de fédérer les nouveaux contributeurs réguliers de son groupe -- de tenir informé le Conseil des décisions prises au sein du groupe (cf. point suivant) - -Le choix d'un outil de communication est laissé à chaque groupe en fonction de sa pertinence (forum, chat, ML, etc.). - -#### Définition et constitution du Conseil - -YunoHost grandissant, il est important de maintenir une cohérence entre tous les groupes, néanmoins il est impossible d'imposer à chacun des membres des groupes de s'intéresser ou de s'impliquer sur tous les aspects du projet (pour des raisons de temps et de compétences). Pour pallier à cela, il est proposé de créer un méta-groupe, où chaque groupe sera représenté par au moins un de ses membres : le Conseil. -Le Conseil est indépendant des groupes et réunit les contributeurs souhaitant s'impliquer le plus dans le projet, son rôle est de : - -- prendre les décisions importantes sur YunoHost qui ne dépendent pas d'un seul groupe (par exemple changer le moteur du wiki) -- faire des points réguliers sur l'ensemble du projet pour assurer sa cohésion. (réunion Mumble) -- solliciter l'ensemble de la communauté des contributeurs (ou même des utilisateurs) quand une décision divise les groupes et/ou le Conseil - -Le choix d'un outil de communication est laissé au Conseil, ses décisions doivent néanmoins être consultables par l'ensemble de la communauté de contributeurs. -Pour participer aux votes du Conseil, il faut avoir contribué au projet et avoir obtenu un droit de vote (ou d'entrée) au sein du Conseil. Ce droit est délivré par le Conseil (éventuellement sur demande). Le Conseil est libre à tout moment de modifier le processus de décision. -Être membre du Conseil n'implique pas forcément d'avoir l'ensemble des accès (infrastructure, dépôt etc.). - -### Processus de validation des pull requests - -Cette section détaille le processus de validation des pull requests dans les différents dépôts du projet. L'objectif de ce processus est de dégager un « consensus mou ». Il est important de préciser que ce processus est *recommandé* mais ne représente pas un impératif. En particulier, il ne couvre pas toutes les situations qui peuvent se présenter. Il est donc légitime de l'adapter (avec l'accord du groupe concerné) lorsqu'il n'est pas adapté au contexte. - -Si un consensus ne peut être trouvé au sein d'un groupe en suivant le processus décrit, il est invité à se tourner vers le Conseil pour en débattre. Si aucun consensus n'est trouvé, la proposition sera soumise au vote de tous les contributeurs. - -#### 1. Proposition - -N'importe quel contributeur peut proposer une pull request (abrégée PR dans la suite) dans les divers dépôts liés au projet YunoHost (core, apps, infra...). - -L'auteur est vivement encouragé à décrire sa proposition en donnant le maximum des informations -pertinentes. Le groupe peut, à cette fin, proposer un modèle des informations à -inclure, comme par exemple : -- status actuel de la PR (ex. : non terminé, en attente de revues, choix techniques à faire...) -- problème auquel réponds la PR (et références liées, par ex. : ticket sur le bugtracker, post sur le forum...) -- solution, stratégie, résumé des changements, et/ou choix techniques utilisés dans la PR -- comment tester la PR - -L'auteur est vivement encouragé à respecter les bonnes pratiques suivantes : -- une PR doit concerner exclusivement un sujet précis. Par exemple, elle ne doit pas à la fois résoudre un bug et ajouter une fonctionnalité (à moins que l'un implique l'autre) ; -- avant de débuter l'implémentation d'une fonctionnalité qui fait intervenir des choix de conception (nom et format de commande ou d'option, nouvelle API, interface utilisateur...), discuter en amont de manière informelle avec le groupe pour s'assurer que l'implémentation imaginée convienne au plus grand nombre et reste dans l'esprit du projet ; -- nommer sa PR avec un titre explicite, et la branche associée avec un nom explicite ; -- donner les références vers d'autres éléments liés à la PR (rapport de bug sur le bugtracker, message sur le forum...) - -Une PR peut être créée même si son auteur juge qu'elle n'est pas encore terminée. Dans ce cas, il doit déclarer explicitement dans le fil de discussion de la PR lorsqu'il juge la PR prête. Cela n'empêche pas les autres contributeurs d'émettre des avis sur la PR pendant ce temps. - -Il appartient aussi à l'auteur de la PR de juger de son importance. (Ce jugement pourra cependant être contesté par les autres membres du groupe concerné par la PR.) Les niveaux d'importance utilisés sont les suivants : -- **micro** : concerne uniquement un détail de forme et/ou qui ne nécessite pas d'être débattue et testée. Elle doit être facilement réversible. -- **mineure** : impacte de manière légère le projet (e.g. refactoring d'une petite partie de code, réparation d'un bug...) -- **moyenne** : impacte de manière significative l'architecture d'une partie du code (e.g. refactoring de tout un aspect ou de tout un fichier, ajout d'une fonctionnalité importante, sortie d'une version testing...) -- **majeure** : impacte lourdement l'ensemble du projet (e.g. migration d'une dépendance critique, changement de version de Debian, sortie d'une version stable...) - - -#### 2. Revue et validation collective - -(Cette section ne s'applique pas aux PR "micro" qui peuvent être validées directement par leur auteur.) - -Une fois la PR déclarée comme terminée, les contributeurs sont invités à donner leurs avis, relire et tester les changements proposés pour les valider. Lorsque des bugs ou des implémentations mauvaises ou incomplètes sont trouvées, les relecteurs rapportent cordialement le problème à l'auteur de la PR sur le fil de discussion. Si le problème trouvé est simple à corriger (e.g. typo ou détail de forme), le relecteur est encouragé à amender la PR pour corriger le problème lui-même. Sinon, l'auteur fait de son mieux pour corriger les problèmes soulevés. - -Les relecteurs rapportent également le degré de relecture et de tests effectués (c.f. liste ci-dessous). Selon l'importance de la PR (mineure, moyenne ou majeure), différents quotas de tests et approbations sont à remplir pour que celle-ci soit validée. Les relecteurs peuvent valider une fois chaque type de relecture/test nécessaire (par exemple, un relecteur peut donner un point d'accord sur le principe, un autre point de relecture en diagonale, et un autre point de test dans des cas simples.). L'auteur de la PR ne compte pas dans ces quotas de validation. La proposition doit aussi passer les tests automatiques disponibles dans le groupe (CI, tests unitaires/fonctionnels, linter...). - -| | **Mineure** | **Moyenne** | **Majeure** | -|-----------------------------------|-------------|--------------|-------------| -| **Accord sur le principe** | 2 | 3 | 4 | -| **Relecture en diagonale** | 1 | 2 | 3 | -| **Testé dans les cas simples** | 1 | 2 | 3 | -| **Relecture attentive** | 0 | 1 | 2 | -| **Testé dans des cas compliqués** | 0 | 1 | 2 | - -Si l'auteur ne fait pas parti du groupe concerné par la PR, tous ces quotas sont augmentés de 1. Dans tous les cas, ces quotas doivent être remplis au moins à 50% par des relecteurs membres du groupe concerné par la PR. (Ainsi, par exemple, un non-membre peut donner son accord sur le principe pour une PR mineure. Mais deux avis de non-membres pour une PR moyenne comptent uniquement pour un seul avis). - - -#### 3. Merge d'une pull request - -Une fois les quotas de relecture remplis, et si aucun refus n'a été prononcé et qu'aucune demande de changement n'est en attente, n'importe quel membre du groupe peut alors déclarer et marquer la PR comme "prête à être mergée". - -Pendant une durée de 3 jours suivant cette déclaration, les membres du groupe peuvent encore relire, demander des changements ou émettre un refus vis-à-vis de la PR. Dans ce cas, le merge est interrompu et le processus retourne à la partie 2. Pour les PRs moyennes et majeures, la durée est augmentée jusqu'à ce qu'il se soit écoulé au moins une semaine par rapport au moment où la PR a été déclarée comme prête par son auteur. - -À l'issue de cette durée, n'importe quel membre du groupe peut merger la PR. Lorsque celle-ci comporte plusieurs commits, il est recommandé d'utiliser la fonction "squash and merge" pour garder l'historique de commit propre. - -#### Cas particuliers - -Plusieurs cas particuliers peuvent se présenter et dont la résolution est décrite ci-après. - -##### Refus d'une PR - -Une PR peut être refusée et clôturée par n'importe quel membre du groupe concerné si : -- la PR a été créée au moins depuis deux semaines -- au moins deux membres du groupe ont manifesté un désaccord avec le principe de la PR -- aucun autre membre du groupe n'a manifesté son accord avec le principe de la PR - - -##### Co-création - -Une PR peut être développée par plusieurs personnes. Chacun est invité à y faire des commits en se concertant avec l'auteur initial ou le nouveau gestionnaire de PR si l'auteur est indisponible, manque de temps ou souhaite se consacrer à d'autres travaux. - -Si ces commits sont conséquents, dans ce cas on peut prendre **partiellement** en compte l'avis des auteurs dans les quotas de relectures et de tests. - -Exemple : si une PR est écrite par A et B (50/50), A et B pourront relire le code de l'autre. Dans ce cas, on pourra par exemple compter une relecture pour ces 2 relectures partielles. - - -##### Validation "allégé" en cas de manque de relecteurs - -En cas de manque de relecteurs, l'auteur d'une PR peut déclencher une procédure de validation alternative si : -- l'auteur est membre du groupe concerné par la PR -- il s'agit d'une PR mineure ou moyenne -- la PR a été déclarée comme prête -- il n'y a pas de demande de changement en attente -- les quotas de relecture "standards" n'ont pas été remplis -- une semaine s'est écoulée depuis le dernier commentaire ou commit - -Dans ce cas, l'auteur annonce sur le fil de discussion de la PR qu'il souhaite engager cette prodécure ainsi que sur la liste de diffusion (ou lors d'une réunion du mardi). À partir de ce moment, les quotas d'accord, relecture et tests pour valider cette PR sont diminués de 1. Au minimum une semaine devra s'écouler avant que cette PR ne soit effectivement mergée. Un autre membre du groupe peut à tout moment mettre fin à cette procédure si il juge la PR trop critique pour être mergée de la sorte. - -## Composition des groupes - -- Conseil : Bram, ju, ljf, Maniack, Moul, opi, theodore. -- Core Dev : AlexAubin, Bram, JimboJoe, Ju, ljf, Moul, opi -- Apps : Bram, cyp, frju365, JimboJoe, Josue-T, Ju, ljf, Maniack C, Maxime, Moul, Scith, Tostaki -- Infra : Bram, Ju, Maniack C, Moul, opi -- Communication - - Com : Bram, Moul, korbak, ljf, opi, frju365 - - Doc : Moul, Theodore - - Trad : Jean-Baptiste -- Distribution : Heyyounow - - -## Droits d’administration afférents aux groupes -Cette partie liste les kits de droits d’administration pour les différents groupes du projet YunoHost : - -(Attention, il ne s’agit pas des droits de prises de décisions dans ce cas). - -### Conseil -- Aucun droits d’administration. Les droits sont complétés avec le fait d’être présents dans les autres groupes, -- Forum : membre du [groupe `Conseil`](https://forum.yunohost.org/groups/Conseil). - -### Dev -- GitHub : membre de l’[équipe `Devs` de l’organisation `YunoHost`](https://github.com/orgs/YunoHost/teams/devs), -- Redmine : membre des projets [`YunoHost`](https://dev.yunohost.org/projects/yunohost) et [`Moulinette`](https://dev.yunohost.org/projects/moulinette), -- Intégration continue : droits sur les outils d’intégrations continue CI-core, -- XMPP : modérateur du salon [`dev`](xmpp:dev@conference.yunohost.org?join), -- Forum : membre du [groupe `Dev`](https://forum.yunohost.org/groups/Dev). - -### Infra -- Serveurs : accès SSH par clé sur certains (selon les besoins) ou sur la totalité des serveurs, -- GitHub : membre de l’[équipe `Infra` de l’organisation `YunoHost`](https://github.com/orgs/YunoHost/teams/infra), -- Redmine: membre du [projet `Infra`](https://dev.yunohost.org/projects/y-u-no-infra/), -- Forum, Weblate, Redmine, XMPP, CI: administrateur, -- Forum : membre du [groupe `Infra`](https://forum.yunohost.org/groups/Infra). - -### Apps -- GitHub : propriétaire (Owner) [de l’organisation YunoHost-Apps](https://github.com/orgs/YunoHost-Apps/people?utf8=%E2%9C%93&query=%20role%3Aowner), -- Redmine : membre du [projet `Apps`](https://dev.yunohost.org/projects/apps), -- GitHub : membre de l’[équipe `Apps` de l’organisation `YunoHost`](https://github.com/orgs/YunoHost/teams/apps), -- Intégration continue : accès à [CI-Apps](https://ci-apps.yunohost.org), -- XMPP : modérateur sur le [salon `Apps`](xmpp:apps@conference.yunohost.org?join), -- Forum : membre du [groupe `Apps`](https://forum.yunohost.org/groups/Apps). - -### Communication -- Forum : membre du [groupe `Com`](https://forum.yunohost.org/groups/Communication). - -#### Doc -- GitHub : membre de l’[équipe `Doc` de l’organisation `YunoHost`](https://github.com/orgs/YunoHost/teams/doc). - -#### Communication -- Diaspora* : accès au compte [YunoHost](https://framasphere.org/people/01868d20330c013459cf2a0000053625), -- Twitter : accès au compte [YunoHost](https://twitter.com/yunohost), -- Forum : accès au compte [`YunoHost`](https://forum.yunohost.org/users/yunohost/activity). - -#### Traduction -- Weblate : administrateur sur l’[outil de traduction](https://translate.yunohost.org/projects/yunohost/). - -#### Entraide -- Forum : statut de modérateur, -- XMPP : statut de modérateur sur le salon [`support`](xmpp:support@conference.yunohost.org?join). - -### Distribution -- GitHub : membre de l’[équipe `Distrib` de l’organisation `YunoHost`](https://github.com/orgs/YunoHost/teams/distribution), -- Information : la diffusion des images (ISO…) doit se faire en collaboration avec le groupe `Infra` (et `Doc`), -- Publication : un accès SFTP peut être mis en place, -- Forum : membre du [groupe `Distribution`](https://forum.yunohost.org/groups/Distribution). - -## Décisions à venir pour les groupes -### Conseil -- Faut-il élire les membres du Conseil plutôt que de les coopter ? Risque de se transformer en "campagne politique" ! -- Faut-il limiter l'ouverture des groupes d'intérêts par cooptation comme pour le Conseil ? -- Proposition de changer Conseil en Collégiale -- Migrer le serveur d’infrastructure du projet sous YunoHost. (avec apps déjà packagées pad, Gogs, Mumble?) -- Nouveau système pour la documentation -- Amélioration de la documentation -- Migration du serveur XMPP -- Hébergement de notre forge Git -- Revoir système de build : stable <— testing <— branches -- Gel de nohost.me et question de l'abandon des services - -### Groupe Dev - - Comment gérer les pull request ? - - Chaque ticket fait l'objet d'une branche et d'un ticket, tu fais une pull/merge request, la communauté vérifie que ça fonctionne, une décision est prise d'intégrer. - -### Groupe Apps - - Pour les apps communautaires, les issues sont bien sur GitHub, les discussions sur le forum - -### Groupe Communication -- Rapport de bug à partir du forum -- Faire en sorte de nettoyer le forum pour éviter le bruit -- Proposition de supprimer le salon de support -- Comment rendre le forum plus actif et central -- Comment s'organiser pour les privilèges sur le forum (si les groupes veulent voter sur le forum) - -### Autres -- Demande sur le forum avec notification des membres du Conseil et des représentants des groupes d’intérêts concernés. -- Vote sur deux semaines par un post sur le forum -- Créer quatre canaux pour le Dev, les Apps, la Communication et l'Infrastructure -- La release devrait être validée par l'ensemble des 4 (ou 5) groupes d’intérêts -- Communication en français et en anglais -- Annuaire ou contact des groupes pour les nouveaux arrivants. Voir peut-être annuaire tout court pour savoir qui fait quoi. https://yunohost.org/#/contribs_fr à compléter. Et à mettre en avant. -- Proposition de laisser les membres YunoHost s'auto déterminer -> Comment gérer les accès ? - -## Moyens de communication actuels - -- Rencontres à des évènements. -- Réunions hebdomadaires Mumble. -- [Forum](https://forum.yunohost.org). -- [Bugtracker Redmine](https://dev.yunohost.org). -- Forge Git pour la review de code : [YunoHost](https://github.com/YunoHost) [YunoHost-Apps](https://github.com/YunoHost-Apps). -- [Salons de discussions XMPP](https://yunohost.org/#/chat_rooms_fr) diff --git a/pages/03.community/05.project_organization/yunohost_project_organization.md b/pages/03.community/05.project_organization/yunohost_project_organization.md deleted file mode 100644 index 89b046e7..00000000 --- a/pages/03.community/05.project_organization/yunohost_project_organization.md +++ /dev/null @@ -1,334 +0,0 @@ ---- -title: Project organisation -template: docs -taxonomy: - category: docs -routes: - default: '/yunohost_project_organization' - aliases: - - '/project_organization' ---- - -! This page is outdated and should be reworked - -## Document objective - -This document aims at allowing contributors to feel legitimate in contributing to the YunoHost project together with collective feedback. -The project is community-based and hasty decisions made by a restricted group of contributors can generate frustrations at a later stage. -To address this issue, the proposed solution here is to ensure that decisions are taken collectively and that they are sufficiently thought out. -An advisory council provides orientations for the evolution of the YunoHost project and special interest groups allow more efficient contribution in relation to each specific topic. - -## Definition of YunoHost - -###Objectives - -The goal of YunoHost is to make accessible to the largest number of people, the installation and administration of a server, without prejudice to the quality and reliability of the software. - -### Values - -#### A free and community-based software - -YunoHost is a software under free licence, fully community-based and based on applications which are themselves community-based and often free (Roundcube, baïkal, etc.) - -#### That everyone can appropriate - -Historically, the project has been very close to initiatives which aim at creating a neutral and decentralised Internet. This proximity especially with the [FFDN](https://www.ffdn.org/), has materialised by having some contributors to create the InternetCu.be whose mission is to facilitate self-hosting by providing a complete solution including a service (via a VPN) and a device. This militant aspect does not inhibit commercial software initiatives hereby companies could propose support or hosting. - -## YunoHost organisation - -### A theme-based, open structure - -The objective of the YunoHost organisation is to allow the largest number of people to contribute to software improvement, whether from a technical point of view (development, application packaging) or otherwise (communication, end-user assistance, documentation, etc.). Inspired by the projects which were reviewed at a recent event (Kodi, Debian, Django, Fedora, Wikipedia, etc.) and by ideas stemming from YunoHost contributors (Jérôme, Bram, opi, scith, ju), a decision was made to organise work by special interest groups, federated thanks to a council to key contributors. - -YunoHost project organisation schema - - - -#### Definition and structure of groups - -Groups are structured as a result of the fact that YunoHost counts many sub-projects (a total of 13), but without always knowing who is in charge or who is competent. It has therefore been decided to simplify the organisation into sub-projects according to theme-based groups: - -- ##### Core Dev Group - - YunoHost Core - - Moulinette - - Web admin - - SSOwat - - Dynette - - YNH-Dev - -- ##### Distribution Group - - Creation and maintenance of installation images on various architectures - - Distribution of images - - Management of Debian packages distribution - -- ##### Infra/Sysadmin Group - - Infrastructure - - Website (wiki, forum, chat room, redmine, Mumble) - - Demo - - Services - - [ip.yunohost.org](https://ip.yunohost.org/) and ip6.yunohost.org - - [yunoports](http://ports.yunohost.org/) - - nohost.me and noho.st - - [yunodash](https://dash.yunohost.org/) - - [yunopaste](http://paste.yunohost.org/) - -- ##### Apps Group - - apps.json list - - App development tools (package_checker, package linter) - -- ##### Communication Group - - Documentation - - Communication (announcement of project evolutions on the forum, social networks) - - Translation - - Mutual assistance (support) - -Groups are open to all contributors willing to participate to the development of YunoHost. Everyone can register with the communication channels associated with the group they want to get involved with. Everyone is free to exchange with the rest of the group and to submit a decision point which will follow a prior stage of exchange and improvement of the proposal. -In order to facilitate its management, each group names a coordinator (and a deputy) whose role is: - -- to welcome and to federate new regular contributors to the group -- to keep the Council informed of decisions taken within the group (see next point) - -The choice of a communication tool is left to each group depending on its relevance (forum, chat, email, etc.) - -#### Definition and structure of the Council - -YunoHost is growing and it's important to maintain a coherence among all the groups. However, it is impossible to impose on every member within every group to take interest or to get involved in all aspects of the project (due to time and competency constraints). To address this, it has been suggested that a meta-group be created where every group has at least one representative: hence the Council. -The Council is independent of groups and brings together contributors wishing to get involved in the project to the maximum extent. It's role is to: - -- take important decisions affecting YunoHost which are dependent on one single group (for instance, changing the wiki engine) -- regularly follow up on the overall aspect of the project to ensure its cohesion (Mumble meeting) -- call on the whole community of contributors (or even end-users) when a decision appears divisive between groups or within the Council - -To take part at Council-level votes, you must have contributed to the project and have obtained a right to vote (or right of entry) at the Council. This right is delivered by the Council (and may be upon request). The Council is free at any moment to change its decision process. -To be a member of the Council does not imply that you have access to all resources (infrastructure, repositories, etc.). - -### A decision process based on soft consensus - -Decisions to be taken can be of 2 kinds: - -1. for a group (for example, "to merge a PR" would be assumed by the Dev Group whereas to "post a tweet" would fall under the responsibility of the Communication Group) -2. for the overall project (for instance, to decide on a release with new features) - -If a consensus is not reached over a decision within a particular group, they must refer to the Council for further discussions. If no consensus has been reached, the proposal will be submitted to a vote by all contributors. - -#### The decision process in detail - -##### 1) Initiating a decision -- can be initiated by anyone following predefined media within each group (e.g. to open a PR automatically triggers this process) -- necessarily public with the exception of well-defined situations (bug related to a critical security issue or vote relative to individuals) -- an end-date is automatically set for every type of proposition. This date is used for various reasons: - - to leave enough time for everyone to express themselves and to avoid hasty decisions - - to maintain a certain rhythm otherwise if the quota of responses is reached then there's no need to wait for everyone's views within a group - - the quota is evaluated according to people registered in a group (or the Council, depending on the situation) who have expressed their desire to be considered as a regular voter => for instance kload could wish to give their opinion at a particular occasion, but with no intention of applying as a active voting member at the Council - - so it can be postponed upon simple request by any one member of the group—and only the group, not all contributors. - -##### 2) Opening a discussion with several possible responses: -Anyone can change their position at any moment, but it's expected to let the group react if necessary (e.g. avoid going from positive to negative to reject a proposal altogether after just 3 minutes). - -- "simple" replies - - "I agree" –> counts as a positive view - - "It seems good to me, but I'd rather abide by others' opinion" –> if there are only such views (or like the next one) and at least one positive view and the due date is past, then the proposal is accepted - - "no views" / "I'm not in a position to express a helpful view (e.g. I can't code in X)" - - delayed reponse - - request for clarification, in which case the decision is suspended - - refusal: any refusal should be argued and justified - -##### 3) Suspension/Postponement -- while there is no response, a decision is considered suspended; at the moment of a response, the end date is automatically postponed (if needed) (for a duration to be determined, which is shorter than the initial time) -- in a situation where there are positive and negative views, or where there is a choice between several proposals - -##### 4) Request for modifications -- however, it may happen that discussions take place around these modifications; if such is the case, there is a new decision to be added to the list of existing decisions, and the process applies again (with a postponement of the date) -- if there aren't enough people agreeing, the date is postponed and a recall must be sent -- if the result is very close, the group is invited to rediscuss the matter if it is important, otherwise this could turn into a divisive issue and of tensions in the future - -##### 5) Closure -- if the group is unanimous in its decision - - with agreements only - - with refusals only - - no opinions (relying on others' views) -- For a minor or standard decision, if the quota of responses is reached by the minimal deadline and there's a consensus. -- The quota of responses means necessary views as detailed below according to different types of decisions. The percentage is based on the number of active members in the group. The coordinator and its deputy are in charge of managing active and inactive members in a group, as they maintain an up-to-date list of members at least at every decision point within the group. (An inactive member who shows up for a decision automatically becomes active). -- If it isn't possible to have enough people (vacations, not enough members in a group to provide their views), a group can request closing a vote before the voting quota is reached; there's then a new postponement and if the new postponed date is reached, then the proposal is closed according to recorded views. - -###### Micro-decision: -- A decision taken and immediately applied by a single member. This kind of decision must necessarily be reversible, and can be questioned by anyone from any group. - -###### Minor decision -- Initial duration: 1 week. -- Minimal duration: 3 days. -- Postponement, if necessary: 3 days. -- Necessary views: 2 members of a group (the person who initiated the decision can express their view); in an anticipated format, 3 of which 2 members of the group. - -###### Standard decision: -- Initial duration: 2 weeks. -- Minimal duration: 1 week. -- Postponement, if necessary: 1 week. -- Necessary views: 50% of members of a group (the person who initiated the decision can express their view); in an anticipated format, 66% of members. -- Validation by voting (when applicable): 75% of positive votes. - -###### Major decision: -- Initial duration: 1 month. -- Postponement, if necessary: 2 weeks. -- Necessary views: 75% of members of a group (the person who initiated the decision can express their view). -- Validation by voting (when applicable): 90% of positive votes. - -##### 6) Application -Then a member of a group can announce their decision as effective (and proceed with necessary actions such as releasing, merging, announcing, etc.). If certain actions are required, it's important that people commit themselves to performing them, since a decision without designated people is of little use - -## Composition of groups - -- Council : Bram, ju, ljf, Maniack, Moul, opi, theodore -- Core Dev : AlexAubin, Bram, JimboJoe, Ju, ljf, Moul, opi -- Apps : Bram, cyp, frju365, JimboJoe, Josue-T, Ju, ljf, Maniack C, Maxime, Moul, Scith, Tostaki -- Infra : Bram, Ju, Maniack C, Moul, opi -- Communication - - Com : Bram, Moul, korbak, ljf, opi, frju365 - - Doc : Moul, Theodore - - Trans : Jean-Baptiste -- Distribution : Heyyounow - -## Summary table of the number of views required for a decision - -_Values are rounded (e.g. 5.4 => 5 and 5.5 => 6)._ - - -| | **Minor** | **Standard** | **Major** | -|----------------------|---------|----------|---------| -| **Council** | -| Standard closure | 2 | 4 | 5 | -| Anticipated closure | 3* | 5 | -| Closure by voting | 5 | 5 | 6 | -| **Core Dev** | -| Standard closure | 2 | 3 | 5 | -| Anticipated closure | 3* | 4 | -| Closure by voting | 4 | 5 | 5 | -| **Apps** | -| Standard closure | 2 | 5 | 8 | -| Anticipated closure | 3* | 7 | -| Closure by voting | 7 | 8 | 9 | -| **Infra** | -| Standard closure | 2 | 3 | 4 | -| Anticipated closure | 3* | 3 | -| Closure by voting | 3 | 4 | 5 | -| **Communication -> Com** | -| Standard closure | 2 | 2 | 3 | -| Anticipated closure | 3* | 3 | -| Closure by voting | 3 | 3 | 4 | -| **Communication -> Doc** | -| Standard closure | 1 | 1 | Council | -| Anticipated closure | 2* | 2* | -| Closure by voting | Council | Council | Council | -| **Distribution** | -| Standard closure | 1 | Council | Council | -| Anticipated closure | 1 | Council | -| Closure by voting | 1 | Council | Council | - -\* of which 1 view can be external to the group - -For the translation group, the process needs to be adapted. - -For the documentation group, the number of views for an anticipated closure of a minor decision eat for the moment limited (there are only 2 people in the group). The other types of decision are taken by the Council. - -For the distribution group, since there's only Heyyounow at the moment, the Council will have the task of making Standard and Major decisions. - -## Administration group's rights -This part list administration rights for differents groups of YunoHost project: - -(Warning, this is not decision rights here). - -### Council -- No administration right. Authorizations are completed through the other groups membership, -- Forum: ["Conseil" group member](https://forum.yunohost.org/groups/Conseil). - -### Core Dev -- GitHub: Devs team member inside YunoHost's organization (permission to push, merge…), -- Redmine: project member of [`YunoHost`](https://dev.yunohost.org/projects/yunohost) and [`Moulinette`](https://dev.yunohost.org/projects/moulinette), -- Continous integration: writting access to CI-Core, -- XMPP: ["dev"](xmpp:dev@conference.yunohost.org?join) channel moderator, -- Forum: ["Dev" group member](https://forum.yunohost.org/groups/Dev). - -### Infra -- Servers: SSH access using SSH key on some (as needed) or every servers, -- GitHub: [Infra team member inside YunoHost's organization](https://github.com/orgs/YunoHost/teams/infra) (permission to push, merge…), -- Redmine: [Infra project member](https://dev.yunohost.org/projects/y-u-no-infra/), -- Forum, Weblate, Redmine, XMPP, CI: administrator, -- Forum: [Infra group member](https://forum.yunohost.org/groups/Infra). - -### Apps -- GitHub: YunoHost-Apps [Owner](https://github.com/orgs/YunoHost-Apps/people?utf8=%E2%9C%93&query=%20role%3Aowner) (permission to push and merge on all repositories), -- Redmine: [Apps project member](https://dev.yunohost.org/projects/apps), -- GitHub: [Apps team member inside YunoHost's organization](https://github.com/orgs/YunoHost/teams/apps) (permission to push, merge…), -- Continous integration: access to [CI-Apps](https://ci-apps.yunohost.org), -- XMPP: [Apps channel moderator](https://im.yunohost.org/logs/apps), -- Forum: [Apps group member](https://forum.yunohost.org/groups/Apps). - -### Communication -- Forum: [Com group member](https://forum.yunohost.org/groups/Communication). - -#### Documentation -- GitHub: [Doc team member of YunoHost's organization](https://github.com/orgs/YunoHost/teams/doc). - -#### Communication -- Diaspora*: [account access](https://framasphere.org/people/01868d20330c013459cf2a0000053625), -- Twitter: [account access](https://twitter.com/yunohost), -- Forum: [account access](https://forum.yunohost.org/users/yunohost/activity). - -#### Translation -- Weblate: [translator tool admin](https://translate.yunohost.org/projects/yunohost/). - -#### Mutual assistance (support) -- Forum: moderator status, -- XMPP: [`support` chanel moderator](xmpp:support@conference.yunohost.org?join). - -### Distribution -- GitHub: [YunoHost's organisation `Distrib` team member](https://github.com/orgs/YunoHost/teams/distribution), -- Information: image distribution (ISO…) should be done in collaboration with `Infra` group (and `Doc`), -- Publication: SFTP access can be set up, -- Forum: [`Distribution` group team member](https://forum.yunohost.org/groups/Distribution). - -## Pending decisions for the groups - -### Council -- Should we elect Council members rather than co-opt them? There's a risk of it becoming a "political campaign"! -- Should special interest group membership be restricted to cooptation like for the Council? -- Proposal to change Council to Collegiate -- Migrate the project infrastructure server under YunoHost (with prepackaged apps like pad, dogs and mumble?) -- New system for documentation -- Improvement of documentation -- XMPP server migration -- Hosting of our Git forge -- Review the build system: stable <— testing <— branches -- Freeze nohost.me and abandoning services - -### Core Dev Group -- How to manage pull requests? - - Each ticket gives rise to a branch and a ticket; you make a pull/merge request, the community verifies that it works, a decision is taken to integrate. - -### Apps Group -- For community-based apps, issues are on GitHub as they should be, but discussions are on the forum - -### Communication Group -- Bug report from the forum -- Cleanup of the forum to avoid noise -- Proposal to delete support chat -- How to make the forum a more active and central hub -- How to organise rights on the forum (if groups want to vote on the forum) - -### Miscellaneous -- Request on the forum with notification to the Council members and to representatives of relevant special interest groups -- Vote over 2 weeks with a post on the forum -- Create 4 channels for Core Dev, Apps, Communication and Infrastructure -- A release should be validated by all 4 (or 5) interest groups -- Communication in French and English -- Directory or group contact for new people. Maybe just a directory to know who's who. https://yunohost.org/#/contribs to be completed. And to be highlighted. -- Proposal to leave YunoHost members auto-determine themselves -> How to manage access rights? - -## Current means of communication - -- Get-togethers at events -- Weekly Mumble meetings -- [Forum](https://forum.yunohost.org). -- [Bugtracker Redmine](https://dev.yunohost.org). -- Git Forge for code reviews: [YunoHost](https://github.com/YunoHost) [YunoHost-Apps](https://github.com/YunoHost-Apps). -- [XMPP chat rooms](https://yunohost.org/#/chat_rooms) diff --git a/pages/01.administrate/06.overview/08.emails/02.emailclients/email_configure_client.de.md b/pages/03.user_guide/05.emailclients/email_configure_client.de.md similarity index 100% rename from pages/01.administrate/06.overview/08.emails/02.emailclients/email_configure_client.de.md rename to pages/03.user_guide/05.emailclients/email_configure_client.de.md diff --git a/pages/01.administrate/06.overview/08.emails/02.emailclients/email_configure_client.es.md b/pages/03.user_guide/05.emailclients/email_configure_client.es.md similarity index 100% rename from pages/01.administrate/06.overview/08.emails/02.emailclients/email_configure_client.es.md rename to pages/03.user_guide/05.emailclients/email_configure_client.es.md diff --git a/pages/01.administrate/06.overview/08.emails/02.emailclients/email_configure_client.fr.md b/pages/03.user_guide/05.emailclients/email_configure_client.fr.md similarity index 98% rename from pages/01.administrate/06.overview/08.emails/02.emailclients/email_configure_client.fr.md rename to pages/03.user_guide/05.emailclients/email_configure_client.fr.md index 11782a46..90fffb43 100644 --- a/pages/01.administrate/06.overview/08.emails/02.emailclients/email_configure_client.fr.md +++ b/pages/03.user_guide/05.emailclients/email_configure_client.fr.md @@ -9,7 +9,7 @@ routes: Vous pouvez récupérer et envoyer des emails avec votre instance YunoHost grâce à des logiciels comme Mozilla Thunderbird, ou sur votre smartphone grâce à des applications comme K-9 Mail. -Normalement, votre client email devrait recevoir la configuration automatiquement lorsque vous ajoutez un compte. Si cela ne fonctionne pas, il est possible de le faire manuellement en suivant les quelques étapes suivantes. (Cependant, cela devrait être compris comme étant un bug dans YunoHost, et le cas échéant, c'est cool si vous nous notifiez du problème pour que nous puissions tenter de reproduire et corriger le problème !) +Normalement, votre client email devrait recevoir la configuration automatiquement lorsque vous ajoutez un compte. Si cela ne fonctionne pas, il est possible de le faire manuellement en suivant les quelques étapes suivantes. (Cependant, cela devrait être compris comme étant un bug dans YunoHost, et le cas échéant, c'est cool si vous nous notifiez du problème pour que nous puissions tenter de le reproduire et corriger !) ### Réglages génériques @@ -21,7 +21,7 @@ Voici les éléments que vous devrez entrer pour configurer manuellement votre c | SMTP | 587 | STARTTLS | Mot de passe normal | `nom_utilisateur` (sans `@votre.domaine.tld`) | -### Client by client +### Client par client [ui-tabs position="top-left" active="0" theme="lite"] [ui-tab title="Mozilla Thunderbird"] ##### ![](image://thunderbird.png?resize=50&classes=inline) Configurer Mozilla Thunderbird diff --git a/pages/01.administrate/06.overview/08.emails/02.emailclients/email_configure_client.md b/pages/03.user_guide/05.emailclients/email_configure_client.md similarity index 100% rename from pages/01.administrate/06.overview/08.emails/02.emailclients/email_configure_client.md rename to pages/03.user_guide/05.emailclients/email_configure_client.md diff --git a/pages/01.administrate/07.specific_use_cases/06.email_migration/email_migration.fr.md b/pages/03.user_guide/10.email_migration/email_migration.fr.md similarity index 100% rename from pages/01.administrate/07.specific_use_cases/06.email_migration/email_migration.fr.md rename to pages/03.user_guide/10.email_migration/email_migration.fr.md diff --git a/pages/01.administrate/07.specific_use_cases/06.email_migration/email_migration.md b/pages/03.user_guide/10.email_migration/email_migration.md similarity index 100% rename from pages/01.administrate/07.specific_use_cases/06.email_migration/email_migration.md rename to pages/03.user_guide/10.email_migration/email_migration.md diff --git a/pages/01.administrate/06.overview/09.xmpp/XMPP.es.md b/pages/03.user_guide/15.xmpp/xmpp.es.md similarity index 100% rename from pages/01.administrate/06.overview/09.xmpp/XMPP.es.md rename to pages/03.user_guide/15.xmpp/xmpp.es.md diff --git a/pages/01.administrate/06.overview/09.xmpp/XMPP.fr.md b/pages/03.user_guide/15.xmpp/xmpp.fr.md similarity index 100% rename from pages/01.administrate/06.overview/09.xmpp/XMPP.fr.md rename to pages/03.user_guide/15.xmpp/xmpp.fr.md diff --git a/pages/01.administrate/06.overview/09.xmpp/XMPP.md b/pages/03.user_guide/15.xmpp/xmpp.md similarity index 100% rename from pages/01.administrate/06.overview/09.xmpp/XMPP.md rename to pages/03.user_guide/15.xmpp/xmpp.md diff --git a/pages/03.user_guide/user_overview.fr.md b/pages/03.user_guide/user_overview.fr.md new file mode 100644 index 00000000..3c5f7d4c --- /dev/null +++ b/pages/03.user_guide/user_overview.fr.md @@ -0,0 +1,11 @@ +--- +title: Guide de l'utilisateur +menu: Guide de l'utilisateur +template: docs +taxonomy: + category: docs +routes: + default: '/user_guide' +--- + +!! Cette section est en cours d'élaboration. \ No newline at end of file diff --git a/pages/03.user_guide/user_overview.md b/pages/03.user_guide/user_overview.md new file mode 100644 index 00000000..c7b7616c --- /dev/null +++ b/pages/03.user_guide/user_overview.md @@ -0,0 +1,11 @@ +--- +title: User guide +menu: User guide +template: docs +taxonomy: + category: docs +routes: + default: '/user_guide' +--- + +!! This section is being worked on. \ No newline at end of file diff --git a/pages/02.applications/01.catalog/apps.de.md b/pages/04.applications/05.catalog/apps.de.md similarity index 100% rename from pages/02.applications/01.catalog/apps.de.md rename to pages/04.applications/05.catalog/apps.de.md diff --git a/pages/02.applications/01.catalog/apps.fr.md b/pages/04.applications/05.catalog/apps.fr.md similarity index 100% rename from pages/02.applications/01.catalog/apps.fr.md rename to pages/04.applications/05.catalog/apps.fr.md diff --git a/pages/02.applications/01.catalog/apps.md b/pages/04.applications/05.catalog/apps.md similarity index 100% rename from pages/02.applications/01.catalog/apps.md rename to pages/04.applications/05.catalog/apps.md diff --git a/pages/04.applications/10.docs/adguardhome/app_adguardhome.md b/pages/04.applications/10.docs/adguardhome/app_adguardhome.md new file mode 100644 index 00000000..d75f9fdc --- /dev/null +++ b/pages/04.applications/10.docs/adguardhome/app_adguardhome.md @@ -0,0 +1,31 @@ +--- +title: AdGuard Home +template: docs +taxonomy: + category: docs, apps +routes: + default: '/app_adguardhome' +--- + +![AdGuard Home's logo](image://adguardhome-logo.png?resize=100) + + +[![Install AdGuard Home with YunoHost](https://install-app.yunohost.org/install-with-yunohost.png)](https://install-app.yunohost.org/?app=adguardhome) +[![Integration level](https://dash.yunohost.org/integration/adguardhome.svg)](https://dash.yunohost.org/appci/app/adguardhome) + + +### Index + +- [Useful links](#useful-links) + +**AdGuard Home** is a network-wide software for blocking ads & tracking. After you set it up, it'll cover ALL your home devices, and you don't need any client-side software for that. +It operates as a DNS server that re-routes tracking domains to a "black hole", thus preventing your devices from connecting to those servers. It's based on software we use for our public AdGuard DNS servers -- both share a lot of common code. + +## Useful links + +* Application software repository: [https://github.com/YunoHost-Apps/adguardhome_ynh](https://github.com/YunoHost-Apps/adguardhome_ynh) +* Official app website: [https://adguard.com/adguard-home.html](https://adguard.com/adguard-home.html) +* Official user documentation: [https://kb.adguard.com/en](https://kb.adguard.com/en) +* Official admin documentation: [https://github.com/AdguardTeam/AdGuardHome/wiki](https://github.com/AdguardTeam/AdGuardHome/wiki) +* Upstream app code repository: [https://github.com/AdguardTeam/AdGuardHome](https://github.com/AdguardTeam/AdGuardHome) +* Report a bug: [https://github.com/YunoHost-Apps/adguardhome_ynh/issues](https://github.com/YunoHost-Apps/adguardhome_ynh/issues) diff --git a/pages/02.applications/02.docs/adminer/app_adminer.fr.md b/pages/04.applications/10.docs/adminer/app_adminer.fr.md similarity index 100% rename from pages/02.applications/02.docs/adminer/app_adminer.fr.md rename to pages/04.applications/10.docs/adminer/app_adminer.fr.md diff --git a/pages/02.applications/02.docs/adminer/app_adminer.md b/pages/04.applications/10.docs/adminer/app_adminer.md similarity index 100% rename from pages/02.applications/02.docs/adminer/app_adminer.md rename to pages/04.applications/10.docs/adminer/app_adminer.md diff --git a/pages/02.applications/02.docs/airsonic/app_airsonic.fr.md b/pages/04.applications/10.docs/airsonic/app_airsonic.fr.md similarity index 100% rename from pages/02.applications/02.docs/airsonic/app_airsonic.fr.md rename to pages/04.applications/10.docs/airsonic/app_airsonic.fr.md diff --git a/pages/02.applications/02.docs/airsonic/app_airsonic.md b/pages/04.applications/10.docs/airsonic/app_airsonic.md similarity index 100% rename from pages/02.applications/02.docs/airsonic/app_airsonic.md rename to pages/04.applications/10.docs/airsonic/app_airsonic.md diff --git a/pages/02.applications/02.docs/ampache/app_ampache.fr.md b/pages/04.applications/10.docs/ampache/app_ampache.fr.md similarity index 100% rename from pages/02.applications/02.docs/ampache/app_ampache.fr.md rename to pages/04.applications/10.docs/ampache/app_ampache.fr.md diff --git a/pages/02.applications/02.docs/ampache/app_ampache.md b/pages/04.applications/10.docs/ampache/app_ampache.md similarity index 100% rename from pages/02.applications/02.docs/ampache/app_ampache.md rename to pages/04.applications/10.docs/ampache/app_ampache.md diff --git a/pages/02.applications/02.docs/anarchism/app_anarchism.fr.md b/pages/04.applications/10.docs/anarchism/app_anarchism.fr.md similarity index 100% rename from pages/02.applications/02.docs/anarchism/app_anarchism.fr.md rename to pages/04.applications/10.docs/anarchism/app_anarchism.fr.md diff --git a/pages/02.applications/02.docs/anarchism/app_anarchism.md b/pages/04.applications/10.docs/anarchism/app_anarchism.md similarity index 100% rename from pages/02.applications/02.docs/anarchism/app_anarchism.md rename to pages/04.applications/10.docs/anarchism/app_anarchism.md diff --git a/pages/02.applications/02.docs/anfora/app_anfora.fr.md b/pages/04.applications/10.docs/anfora/app_anfora.fr.md similarity index 100% rename from pages/02.applications/02.docs/anfora/app_anfora.fr.md rename to pages/04.applications/10.docs/anfora/app_anfora.fr.md diff --git a/pages/02.applications/02.docs/anfora/app_anfora.md b/pages/04.applications/10.docs/anfora/app_anfora.md similarity index 100% rename from pages/02.applications/02.docs/anfora/app_anfora.md rename to pages/04.applications/10.docs/anfora/app_anfora.md diff --git a/pages/02.applications/02.docs/archivist/app_archivist.fr.md b/pages/04.applications/10.docs/archivist/app_archivist.fr.md similarity index 100% rename from pages/02.applications/02.docs/archivist/app_archivist.fr.md rename to pages/04.applications/10.docs/archivist/app_archivist.fr.md diff --git a/pages/02.applications/02.docs/archivist/app_archivist.md b/pages/04.applications/10.docs/archivist/app_archivist.md similarity index 100% rename from pages/02.applications/02.docs/archivist/app_archivist.md rename to pages/04.applications/10.docs/archivist/app_archivist.md diff --git a/pages/02.applications/02.docs/baikal/app_baikal.fr.md b/pages/04.applications/10.docs/baikal/app_baikal.fr.md similarity index 84% rename from pages/02.applications/02.docs/baikal/app_baikal.fr.md rename to pages/04.applications/10.docs/baikal/app_baikal.fr.md index ee630f75..440f3137 100644 --- a/pages/02.applications/02.docs/baikal/app_baikal.fr.md +++ b/pages/04.applications/10.docs/baikal/app_baikal.fr.md @@ -13,15 +13,16 @@ routes: ### Index -- [Configuration](#Configuration) - - [Connexion à l'interface d'administration](#Connexion-à-l-interface-d-administration) - - [Création d'un nouvel utilisateur](#Création-d-un-nouvel-utilisateur) -- [Connexion CalDAV](#Connexion-CalDAV) - - [Connexion de Thunderbird avec Lightning](#Connexion-de-Thunderbird-avec-Lightning) - - [Connexion de AgenDAV](#Connexion-de-AgenDAV) -- [Connexion CardDAV](#Connexion-CardDAV) +- [Configuration](#configuration) + - [Connexion à l'interface d'administration](#connexion-à-l’interface-d’administration) + - [Authentification LDAP](#authentification-ldap) +- [Connexion CalDAV](#connexion-caldav) + - [Connexion de Thunderbird avec Lightning](#connexion-de-thunderbird-avec-lightning) + - [Connexion de AgenDAV](#connexion-de-agendav) +- [Connexion CardDAV](#connexion-carddav) - [Liens utiles](#liens-utiles) + Baïkal est un serveur de calendriers et de contacts accessible par les protocoles CalDAV (calendriers) et CardDAV (carnets d’adresses), autorisant ainsi la synchronisation avec de nombreux clients (Thunderbird + Lightning par exemple). **AVERTISSEMENT** : Baïkal ne fonctionnera pas si vous avez installé un **Nextcloud** (leurs fonctions cardav/caldav entrent en conflit). @@ -30,7 +31,7 @@ Baïkal est un serveur de calendriers et de contacts accessible par les protocol ### Connexion à l’interface d’administration -Pour configurer l'appliation il faut se rendre à l'adresse : `sous.domaine.tld/admin` ou `domaine.tld/baikal/admin` +Pour configurer l'application il faut se rendre à l'adresse : `sous.domaine.tld/admin` ou `domaine.tld/baikal/admin` Le nom d’utilisateur à spécifier est `admin` suivi du mot de passe spécifique que vous avez choisi lors de l’installation de Baïkal. Attention, le mot de passe ne doit pas contenir de carractères spéciaux. ### Authentification LDAP @@ -77,5 +78,5 @@ Le carnet d’adresses est maintenant accessible. + Site web : [www.baikal-server.com (en)](http://www.baikal-server.com/) + Documentation officielle : [sabre.io - baikal (en)](https://sabre.io/baikal/) - + Dépôt logiciel de l'application : [github.com - YunoHost-Apps/bikal](https://github.com/YunoHost-apps/baikal_ynh) + + Dépôt logiciel de l'application : [github.com - YunoHost-Apps/baikal](https://github.com/YunoHost-apps/baikal_ynh) + Remonter un bug ou une amélioration en créant un ticket (issue) : [github.com - YunoHost-Apps/baikal/issues](https://github.com/YunoHost-apps/baikal_ynh/issues) diff --git a/pages/02.applications/02.docs/baikal/app_baikal.md b/pages/04.applications/10.docs/baikal/app_baikal.md similarity index 83% rename from pages/02.applications/02.docs/baikal/app_baikal.md rename to pages/04.applications/10.docs/baikal/app_baikal.md index 2efd023a..92bfd9a3 100644 --- a/pages/02.applications/02.docs/baikal/app_baikal.md +++ b/pages/04.applications/10.docs/baikal/app_baikal.md @@ -13,14 +13,15 @@ routes: ### Index -- [Configuration](#Configuration) - - [Login to admin interface](#Login-to-administration-interface) - - [Creating a new user](#Create-a-new-user) -- [CalDAV connection](#CalDAV-connection) - - [Connecting Thunderbird with Lightning](#Connecting-Thunderbird-with-Lightning) - - [Connecting to AgenDAV](#Connecting-to-AgenDAV) -- [CardDAV Connection](#CardDAV-Connection) -- [Useful links](#Useful-links) +- [Configuration](#configuration) + - [Connecting to the administration interface](#connecting-to-the-administration-interface) + - [LDAP authentication](#ldap-authentication) +- [CalDAV connection](#caldav-connection) + - [Connecting Thunderbird with Lightning](#connecting-thunderbird-with-lightning) + - [Connecting to AgenDAV](#connecting-to-agendav) +- [CardDAV Connection](#carddav-connection) +- [Useful links](#useful-links) + Baïkal is a server for calendars and address books, which uses the CalDav and CardDav protocol. Baïkal can be synced with a lot of clients, like Thunderbird + Lightning. @@ -79,5 +80,5 @@ Now, the adressbook is accessible. + Website: [www.baikal-server.com](http://www.baikal-server.com/) + Official documentation: [sabre.io - baikal](https://sabre.io/baikal/) - + Apps software repository: [github.com - YunoHost-Apps/bikal](https://github.com/YunoHost-apps/baikal_ynh) + + Apps software repository: [github.com - YunoHost-Apps/baikal](https://github.com/YunoHost-apps/baikal_ynh) + Fix a bug or suggest an improvement by creating a ticket (issue): [github.com - YunoHost-Apps/baikal/issues](https://github.com/YunoHost-apps/baikal_ynh/issues) diff --git a/pages/02.applications/02.docs/bibliogram/app_bibliogram.fr.md b/pages/04.applications/10.docs/bibliogram/app_bibliogram.fr.md similarity index 100% rename from pages/02.applications/02.docs/bibliogram/app_bibliogram.fr.md rename to pages/04.applications/10.docs/bibliogram/app_bibliogram.fr.md diff --git a/pages/02.applications/02.docs/bibliogram/app_bibliogram.md b/pages/04.applications/10.docs/bibliogram/app_bibliogram.md similarity index 100% rename from pages/02.applications/02.docs/bibliogram/app_bibliogram.md rename to pages/04.applications/10.docs/bibliogram/app_bibliogram.md diff --git a/pages/02.applications/02.docs/blogotext/app_blogotext.fr.md b/pages/04.applications/10.docs/blogotext/app_blogotext.fr.md similarity index 100% rename from pages/02.applications/02.docs/blogotext/app_blogotext.fr.md rename to pages/04.applications/10.docs/blogotext/app_blogotext.fr.md diff --git a/pages/02.applications/02.docs/blogotext/app_blogotext.md b/pages/04.applications/10.docs/blogotext/app_blogotext.md similarity index 100% rename from pages/02.applications/02.docs/blogotext/app_blogotext.md rename to pages/04.applications/10.docs/blogotext/app_blogotext.md diff --git a/pages/02.applications/02.docs/bludit/app_bludit.fr.md b/pages/04.applications/10.docs/bludit/app_bludit.fr.md similarity index 100% rename from pages/02.applications/02.docs/bludit/app_bludit.fr.md rename to pages/04.applications/10.docs/bludit/app_bludit.fr.md diff --git a/pages/02.applications/02.docs/bludit/app_bludit.md b/pages/04.applications/10.docs/bludit/app_bludit.md similarity index 100% rename from pages/02.applications/02.docs/bludit/app_bludit.md rename to pages/04.applications/10.docs/bludit/app_bludit.md diff --git a/pages/02.applications/02.docs/bookstack/app_bookstack.fr.md b/pages/04.applications/10.docs/bookstack/app_bookstack.fr.md similarity index 90% rename from pages/02.applications/02.docs/bookstack/app_bookstack.fr.md rename to pages/04.applications/10.docs/bookstack/app_bookstack.fr.md index 592b8e9e..a9664371 100644 --- a/pages/02.applications/02.docs/bookstack/app_bookstack.fr.md +++ b/pages/04.applications/10.docs/bookstack/app_bookstack.fr.md @@ -22,5 +22,5 @@ BookStack est une plate-forme simple, auto-hébergée et facile à utiliser pour + Site web : [bookstackapp.com](https://www.bookstackapp.com/) + Documentation officielle : [bookstackapp.com/docs](https://www.bookstackapp.com/docs/) -+ Dépôt logiciel de l'application : [github.com - YunoHost-Apps/bookstack](https://github.com/YunoHost-Apps/bibliogram_ynh) -+ Remonter un bug ou une amélioration en créant un ticket (issue) : [github.com - YunoHost-Apps/bookstack/issues](https://github.com/YunoHost-Apps/bookstack_ynh/issues) \ No newline at end of file ++ Dépôt logiciel de l'application : [github.com - YunoHost-Apps/bookstack](https://github.com/YunoHost-Apps/bookstack_ynh) ++ Remonter un bug ou une amélioration en créant un ticket (issue) : [github.com - YunoHost-Apps/bookstack/issues](https://github.com/YunoHost-Apps/bookstack_ynh/issues) diff --git a/pages/02.applications/02.docs/bookstack/app_bookstack.md b/pages/04.applications/10.docs/bookstack/app_bookstack.md similarity index 100% rename from pages/02.applications/02.docs/bookstack/app_bookstack.md rename to pages/04.applications/10.docs/bookstack/app_bookstack.md diff --git a/pages/02.applications/02.docs/borg/app_borg.fr.md b/pages/04.applications/10.docs/borg/app_borg.fr.md similarity index 100% rename from pages/02.applications/02.docs/borg/app_borg.fr.md rename to pages/04.applications/10.docs/borg/app_borg.fr.md diff --git a/pages/02.applications/02.docs/borg/app_borg.md b/pages/04.applications/10.docs/borg/app_borg.md similarity index 100% rename from pages/02.applications/02.docs/borg/app_borg.md rename to pages/04.applications/10.docs/borg/app_borg.md diff --git a/pages/02.applications/02.docs/bozon/app_bozon.fr.md b/pages/04.applications/10.docs/bozon/app_bozon.fr.md similarity index 100% rename from pages/02.applications/02.docs/bozon/app_bozon.fr.md rename to pages/04.applications/10.docs/bozon/app_bozon.fr.md diff --git a/pages/02.applications/02.docs/bozon/app_bozon.md b/pages/04.applications/10.docs/bozon/app_bozon.md similarity index 100% rename from pages/02.applications/02.docs/bozon/app_bozon.md rename to pages/04.applications/10.docs/bozon/app_bozon.md diff --git a/pages/02.applications/02.docs/calibreweb/app_calibreweb.fr.md b/pages/04.applications/10.docs/calibreweb/app_calibreweb.fr.md similarity index 100% rename from pages/02.applications/02.docs/calibreweb/app_calibreweb.fr.md rename to pages/04.applications/10.docs/calibreweb/app_calibreweb.fr.md diff --git a/pages/02.applications/02.docs/calibreweb/app_calibreweb.md b/pages/04.applications/10.docs/calibreweb/app_calibreweb.md similarity index 100% rename from pages/02.applications/02.docs/calibreweb/app_calibreweb.md rename to pages/04.applications/10.docs/calibreweb/app_calibreweb.md diff --git a/pages/02.applications/02.docs/cheky/app_cheky.fr.md b/pages/04.applications/10.docs/cheky/app_cheky.fr.md similarity index 100% rename from pages/02.applications/02.docs/cheky/app_cheky.fr.md rename to pages/04.applications/10.docs/cheky/app_cheky.fr.md diff --git a/pages/02.applications/02.docs/cheky/app_cheky.md b/pages/04.applications/10.docs/cheky/app_cheky.md similarity index 100% rename from pages/02.applications/02.docs/cheky/app_cheky.md rename to pages/04.applications/10.docs/cheky/app_cheky.md diff --git a/pages/02.applications/02.docs/civicrm_drupal7/app_civicrm_drupal7.fr.md b/pages/04.applications/10.docs/civicrm_drupal7/app_civicrm_drupal7.fr.md similarity index 100% rename from pages/02.applications/02.docs/civicrm_drupal7/app_civicrm_drupal7.fr.md rename to pages/04.applications/10.docs/civicrm_drupal7/app_civicrm_drupal7.fr.md diff --git a/pages/02.applications/02.docs/civicrm_drupal7/app_civicrm_drupal7.md b/pages/04.applications/10.docs/civicrm_drupal7/app_civicrm_drupal7.md similarity index 100% rename from pages/02.applications/02.docs/civicrm_drupal7/app_civicrm_drupal7.md rename to pages/04.applications/10.docs/civicrm_drupal7/app_civicrm_drupal7.md diff --git a/pages/02.applications/02.docs/codimd/app_codimd.fr.md b/pages/04.applications/10.docs/codimd/app_codimd.fr.md similarity index 100% rename from pages/02.applications/02.docs/codimd/app_codimd.fr.md rename to pages/04.applications/10.docs/codimd/app_codimd.fr.md diff --git a/pages/02.applications/02.docs/codimd/app_codimd.md b/pages/04.applications/10.docs/codimd/app_codimd.md similarity index 100% rename from pages/02.applications/02.docs/codimd/app_codimd.md rename to pages/04.applications/10.docs/codimd/app_codimd.md diff --git a/pages/02.applications/02.docs/collabora/app_collabora.fr.md b/pages/04.applications/10.docs/collabora/app_collabora.fr.md similarity index 100% rename from pages/02.applications/02.docs/collabora/app_collabora.fr.md rename to pages/04.applications/10.docs/collabora/app_collabora.fr.md diff --git a/pages/02.applications/02.docs/collabora/app_collabora.md b/pages/04.applications/10.docs/collabora/app_collabora.md similarity index 100% rename from pages/02.applications/02.docs/collabora/app_collabora.md rename to pages/04.applications/10.docs/collabora/app_collabora.md diff --git a/pages/02.applications/02.docs/collaboradocker/app_collaboradocker.fr.md b/pages/04.applications/10.docs/collaboradocker/app_collaboradocker.fr.md similarity index 100% rename from pages/02.applications/02.docs/collaboradocker/app_collaboradocker.fr.md rename to pages/04.applications/10.docs/collaboradocker/app_collaboradocker.fr.md diff --git a/pages/02.applications/02.docs/collaboradocker/app_collaboradocker.md b/pages/04.applications/10.docs/collaboradocker/app_collaboradocker.md similarity index 100% rename from pages/02.applications/02.docs/collaboradocker/app_collaboradocker.md rename to pages/04.applications/10.docs/collaboradocker/app_collaboradocker.md diff --git a/pages/02.applications/02.docs/concrete5/app_concrete5.fr.md b/pages/04.applications/10.docs/concrete5/app_concrete5.fr.md similarity index 100% rename from pages/02.applications/02.docs/concrete5/app_concrete5.fr.md rename to pages/04.applications/10.docs/concrete5/app_concrete5.fr.md diff --git a/pages/02.applications/02.docs/concrete5/app_concrete5.md b/pages/04.applications/10.docs/concrete5/app_concrete5.md similarity index 100% rename from pages/02.applications/02.docs/concrete5/app_concrete5.md rename to pages/04.applications/10.docs/concrete5/app_concrete5.md diff --git a/pages/02.applications/02.docs/cowyo/app_cowyo.fr.md b/pages/04.applications/10.docs/cowyo/app_cowyo.fr.md similarity index 100% rename from pages/02.applications/02.docs/cowyo/app_cowyo.fr.md rename to pages/04.applications/10.docs/cowyo/app_cowyo.fr.md diff --git a/pages/02.applications/02.docs/cowyo/app_cowyo.md b/pages/04.applications/10.docs/cowyo/app_cowyo.md similarity index 100% rename from pages/02.applications/02.docs/cowyo/app_cowyo.md rename to pages/04.applications/10.docs/cowyo/app_cowyo.md diff --git a/pages/02.applications/02.docs/diagramsnet/app_diagramsnet.fr.md b/pages/04.applications/10.docs/diagramsnet/app_diagramsnet.fr.md similarity index 100% rename from pages/02.applications/02.docs/diagramsnet/app_diagramsnet.fr.md rename to pages/04.applications/10.docs/diagramsnet/app_diagramsnet.fr.md diff --git a/pages/02.applications/02.docs/diagramsnet/app_diagramsnet.md b/pages/04.applications/10.docs/diagramsnet/app_diagramsnet.md similarity index 100% rename from pages/02.applications/02.docs/diagramsnet/app_diagramsnet.md rename to pages/04.applications/10.docs/diagramsnet/app_diagramsnet.md diff --git a/pages/02.applications/02.docs/discourse/app_discourse.fr.md b/pages/04.applications/10.docs/discourse/app_discourse.fr.md similarity index 100% rename from pages/02.applications/02.docs/discourse/app_discourse.fr.md rename to pages/04.applications/10.docs/discourse/app_discourse.fr.md diff --git a/pages/02.applications/02.docs/discourse/app_discourse.md b/pages/04.applications/10.docs/discourse/app_discourse.md similarity index 100% rename from pages/02.applications/02.docs/discourse/app_discourse.md rename to pages/04.applications/10.docs/discourse/app_discourse.md diff --git a/pages/02.applications/02.docs/distbin/app_distbin.fr.md b/pages/04.applications/10.docs/distbin/app_distbin.fr.md similarity index 100% rename from pages/02.applications/02.docs/distbin/app_distbin.fr.md rename to pages/04.applications/10.docs/distbin/app_distbin.fr.md diff --git a/pages/02.applications/02.docs/distbin/app_distbin.md b/pages/04.applications/10.docs/distbin/app_distbin.md similarity index 100% rename from pages/02.applications/02.docs/distbin/app_distbin.md rename to pages/04.applications/10.docs/distbin/app_distbin.md diff --git a/pages/02.applications/02.docs/docs.md b/pages/04.applications/10.docs/docs.md similarity index 94% rename from pages/02.applications/02.docs/docs.md rename to pages/04.applications/10.docs/docs.md index 86418a54..c329a265 100644 --- a/pages/02.applications/02.docs/docs.md +++ b/pages/04.applications/10.docs/docs.md @@ -1,5 +1,6 @@ --- title: Documentations +visible: false content: order: by: basename @@ -12,6 +13,7 @@ content: twig_first: true process: twig: true + ---
    diff --git a/pages/02.applications/02.docs/dokuwiki/app_dokuwiki.fr.md b/pages/04.applications/10.docs/dokuwiki/app_dokuwiki.fr.md similarity index 100% rename from pages/02.applications/02.docs/dokuwiki/app_dokuwiki.fr.md rename to pages/04.applications/10.docs/dokuwiki/app_dokuwiki.fr.md diff --git a/pages/02.applications/02.docs/dokuwiki/app_dokuwiki.md b/pages/04.applications/10.docs/dokuwiki/app_dokuwiki.md similarity index 100% rename from pages/02.applications/02.docs/dokuwiki/app_dokuwiki.md rename to pages/04.applications/10.docs/dokuwiki/app_dokuwiki.md diff --git a/pages/02.applications/02.docs/dolibarr/app_dolibarr.fr.md b/pages/04.applications/10.docs/dolibarr/app_dolibarr.fr.md similarity index 100% rename from pages/02.applications/02.docs/dolibarr/app_dolibarr.fr.md rename to pages/04.applications/10.docs/dolibarr/app_dolibarr.fr.md diff --git a/pages/02.applications/02.docs/dolibarr/app_dolibarr.md b/pages/04.applications/10.docs/dolibarr/app_dolibarr.md similarity index 100% rename from pages/02.applications/02.docs/dolibarr/app_dolibarr.md rename to pages/04.applications/10.docs/dolibarr/app_dolibarr.md diff --git a/pages/02.applications/02.docs/dotclear2/app_dotclear2.fr.md b/pages/04.applications/10.docs/dotclear2/app_dotclear2.fr.md similarity index 100% rename from pages/02.applications/02.docs/dotclear2/app_dotclear2.fr.md rename to pages/04.applications/10.docs/dotclear2/app_dotclear2.fr.md diff --git a/pages/02.applications/02.docs/dotclear2/app_dotclear2.md b/pages/04.applications/10.docs/dotclear2/app_dotclear2.md similarity index 100% rename from pages/02.applications/02.docs/dotclear2/app_dotclear2.md rename to pages/04.applications/10.docs/dotclear2/app_dotclear2.md diff --git a/pages/02.applications/02.docs/drupal/app_drupal.fr.md b/pages/04.applications/10.docs/drupal/app_drupal.fr.md similarity index 100% rename from pages/02.applications/02.docs/drupal/app_drupal.fr.md rename to pages/04.applications/10.docs/drupal/app_drupal.fr.md diff --git a/pages/02.applications/02.docs/drupal/app_drupal.md b/pages/04.applications/10.docs/drupal/app_drupal.md similarity index 100% rename from pages/02.applications/02.docs/drupal/app_drupal.md rename to pages/04.applications/10.docs/drupal/app_drupal.md diff --git a/pages/02.applications/02.docs/drupal7/app_drupal7.fr.md b/pages/04.applications/10.docs/drupal7/app_drupal7.fr.md similarity index 100% rename from pages/02.applications/02.docs/drupal7/app_drupal7.fr.md rename to pages/04.applications/10.docs/drupal7/app_drupal7.fr.md diff --git a/pages/02.applications/02.docs/drupal7/app_drupal7.md b/pages/04.applications/10.docs/drupal7/app_drupal7.md similarity index 100% rename from pages/02.applications/02.docs/drupal7/app_drupal7.md rename to pages/04.applications/10.docs/drupal7/app_drupal7.md diff --git a/pages/02.applications/02.docs/ecko/app_ecko.md b/pages/04.applications/10.docs/ecko/app_ecko.md similarity index 100% rename from pages/02.applications/02.docs/ecko/app_ecko.md rename to pages/04.applications/10.docs/ecko/app_ecko.md diff --git a/pages/02.applications/02.docs/ethercalc/app_ethercalc.fr.md b/pages/04.applications/10.docs/ethercalc/app_ethercalc.fr.md similarity index 100% rename from pages/02.applications/02.docs/ethercalc/app_ethercalc.fr.md rename to pages/04.applications/10.docs/ethercalc/app_ethercalc.fr.md diff --git a/pages/02.applications/02.docs/ethercalc/app_ethercalc.md b/pages/04.applications/10.docs/ethercalc/app_ethercalc.md similarity index 100% rename from pages/02.applications/02.docs/ethercalc/app_ethercalc.md rename to pages/04.applications/10.docs/ethercalc/app_ethercalc.md diff --git a/pages/02.applications/02.docs/etherpad_mypads/app_etherpad_mypads.fr.md b/pages/04.applications/10.docs/etherpad_mypads/app_etherpad_mypads.fr.md similarity index 100% rename from pages/02.applications/02.docs/etherpad_mypads/app_etherpad_mypads.fr.md rename to pages/04.applications/10.docs/etherpad_mypads/app_etherpad_mypads.fr.md diff --git a/pages/02.applications/02.docs/etherpad_mypads/app_etherpad_mypads.md b/pages/04.applications/10.docs/etherpad_mypads/app_etherpad_mypads.md similarity index 100% rename from pages/02.applications/02.docs/etherpad_mypads/app_etherpad_mypads.md rename to pages/04.applications/10.docs/etherpad_mypads/app_etherpad_mypads.md diff --git a/pages/02.applications/02.docs/fallback/app_fallback.fr.md b/pages/04.applications/10.docs/fallback/app_fallback.fr.md similarity index 100% rename from pages/02.applications/02.docs/fallback/app_fallback.fr.md rename to pages/04.applications/10.docs/fallback/app_fallback.fr.md diff --git a/pages/02.applications/02.docs/fallback/app_fallback.md b/pages/04.applications/10.docs/fallback/app_fallback.md similarity index 100% rename from pages/02.applications/02.docs/fallback/app_fallback.md rename to pages/04.applications/10.docs/fallback/app_fallback.md diff --git a/pages/02.applications/02.docs/ffsync/app_ffsync.fr.md b/pages/04.applications/10.docs/ffsync/app_ffsync.fr.md similarity index 100% rename from pages/02.applications/02.docs/ffsync/app_ffsync.fr.md rename to pages/04.applications/10.docs/ffsync/app_ffsync.fr.md diff --git a/pages/02.applications/02.docs/ffsync/app_ffsync.it.md b/pages/04.applications/10.docs/ffsync/app_ffsync.it.md similarity index 100% rename from pages/02.applications/02.docs/ffsync/app_ffsync.it.md rename to pages/04.applications/10.docs/ffsync/app_ffsync.it.md diff --git a/pages/02.applications/02.docs/ffsync/app_ffsync.md b/pages/04.applications/10.docs/ffsync/app_ffsync.md similarity index 100% rename from pages/02.applications/02.docs/ffsync/app_ffsync.md rename to pages/04.applications/10.docs/ffsync/app_ffsync.md diff --git a/pages/02.applications/02.docs/firefly-iii/app_firefly-iii.fr.md b/pages/04.applications/10.docs/firefly-iii/app_firefly-iii.fr.md similarity index 95% rename from pages/02.applications/02.docs/firefly-iii/app_firefly-iii.fr.md rename to pages/04.applications/10.docs/firefly-iii/app_firefly-iii.fr.md index 8d342327..9315ea3a 100644 --- a/pages/02.applications/02.docs/firefly-iii/app_firefly-iii.fr.md +++ b/pages/04.applications/10.docs/firefly-iii/app_firefly-iii.fr.md @@ -7,7 +7,7 @@ routes: default: '/app_firefly-iii' --- -![logo de Firefly III](image://firefly_iii_logo.png?width=80) +![logo de Firefly III](image://firefly-logo.png?height=100) [![Install Firefly III with YunoHost](https://install-app.yunohost.org/install-with-yunohost.png)](https://install-app.yunohost.org/?app=firefly-iii) [![Integration level](https://dash.yunohost.org/integration/firefly-iii.svg)](https://dash.yunohost.org/appci/app/firefly-iii) diff --git a/pages/02.applications/02.docs/firefly-iii/app_firefly-iii.md b/pages/04.applications/10.docs/firefly-iii/app_firefly-iii.md similarity index 95% rename from pages/02.applications/02.docs/firefly-iii/app_firefly-iii.md rename to pages/04.applications/10.docs/firefly-iii/app_firefly-iii.md index a23d3172..53a18ec1 100644 --- a/pages/02.applications/02.docs/firefly-iii/app_firefly-iii.md +++ b/pages/04.applications/10.docs/firefly-iii/app_firefly-iii.md @@ -7,7 +7,7 @@ routes: default: '/app_firefly-iii' --- -![Firefly III's logo](image://firefly_iii_logo.png?width=80) +![Firefly III's logo](image://firefly-logo.png?height=100) [![Install Firefly III with YunoHost](https://install-app.yunohost.org/install-with-yunohost.png)](https://install-app.yunohost.org/?app=firefly-iii) [![Integration level](https://dash.yunohost.org/integration/firefly-iii.svg)](https://dash.yunohost.org/appci/app/firefly-iii) diff --git a/pages/02.applications/02.docs/flarum/app_flarum.fr.md b/pages/04.applications/10.docs/flarum/app_flarum.fr.md similarity index 100% rename from pages/02.applications/02.docs/flarum/app_flarum.fr.md rename to pages/04.applications/10.docs/flarum/app_flarum.fr.md diff --git a/pages/02.applications/02.docs/flarum/app_flarum.md b/pages/04.applications/10.docs/flarum/app_flarum.md similarity index 100% rename from pages/02.applications/02.docs/flarum/app_flarum.md rename to pages/04.applications/10.docs/flarum/app_flarum.md diff --git a/pages/02.applications/02.docs/fluxbb/app_fluxbb.fr.md b/pages/04.applications/10.docs/fluxbb/app_fluxbb.fr.md similarity index 100% rename from pages/02.applications/02.docs/fluxbb/app_fluxbb.fr.md rename to pages/04.applications/10.docs/fluxbb/app_fluxbb.fr.md diff --git a/pages/02.applications/02.docs/fluxbb/app_fluxbb.md b/pages/04.applications/10.docs/fluxbb/app_fluxbb.md similarity index 100% rename from pages/02.applications/02.docs/fluxbb/app_fluxbb.md rename to pages/04.applications/10.docs/fluxbb/app_fluxbb.md diff --git a/pages/02.applications/02.docs/framaforms/app_framaforms.fr.md b/pages/04.applications/10.docs/framaforms/app_framaforms.fr.md similarity index 100% rename from pages/02.applications/02.docs/framaforms/app_framaforms.fr.md rename to pages/04.applications/10.docs/framaforms/app_framaforms.fr.md diff --git a/pages/02.applications/02.docs/framaforms/app_framaforms.md b/pages/04.applications/10.docs/framaforms/app_framaforms.md similarity index 100% rename from pages/02.applications/02.docs/framaforms/app_framaforms.md rename to pages/04.applications/10.docs/framaforms/app_framaforms.md diff --git a/pages/02.applications/02.docs/freshrss/app_freshrss.fr.md b/pages/04.applications/10.docs/freshrss/app_freshrss.fr.md similarity index 100% rename from pages/02.applications/02.docs/freshrss/app_freshrss.fr.md rename to pages/04.applications/10.docs/freshrss/app_freshrss.fr.md diff --git a/pages/02.applications/02.docs/freshrss/app_freshrss.md b/pages/04.applications/10.docs/freshrss/app_freshrss.md similarity index 96% rename from pages/02.applications/02.docs/freshrss/app_freshrss.md rename to pages/04.applications/10.docs/freshrss/app_freshrss.md index d698fcd9..c530aad8 100644 --- a/pages/02.applications/02.docs/freshrss/app_freshrss.md +++ b/pages/04.applications/10.docs/freshrss/app_freshrss.md @@ -7,7 +7,7 @@ routes: default: '/app_freshrss' --- -![FreshRSS logo's](image://freshrss_logo.svg?resize=,80) +![FreshRSS's logo](image://freshrss_logo.png?height=100) [![Install FreshRSS with YunoHost](https://install-app.yunohost.org/install-with-yunohost.png)](https://install-app.yunohost.org/?app=freshrss) [![Integration level](https://dash.yunohost.org/integration/freshrss.svg)](https://dash.yunohost.org/appci/app/freshrss) diff --git a/pages/02.applications/02.docs/friendica/app_friendica.fr.md b/pages/04.applications/10.docs/friendica/app_friendica.fr.md similarity index 100% rename from pages/02.applications/02.docs/friendica/app_friendica.fr.md rename to pages/04.applications/10.docs/friendica/app_friendica.fr.md diff --git a/pages/02.applications/02.docs/friendica/app_friendica.md b/pages/04.applications/10.docs/friendica/app_friendica.md similarity index 100% rename from pages/02.applications/02.docs/friendica/app_friendica.md rename to pages/04.applications/10.docs/friendica/app_friendica.md diff --git a/pages/02.applications/02.docs/funkwhale/app_funkwhale.fr.md b/pages/04.applications/10.docs/funkwhale/app_funkwhale.fr.md similarity index 100% rename from pages/02.applications/02.docs/funkwhale/app_funkwhale.fr.md rename to pages/04.applications/10.docs/funkwhale/app_funkwhale.fr.md diff --git a/pages/02.applications/02.docs/funkwhale/app_funkwhale.md b/pages/04.applications/10.docs/funkwhale/app_funkwhale.md similarity index 87% rename from pages/02.applications/02.docs/funkwhale/app_funkwhale.md rename to pages/04.applications/10.docs/funkwhale/app_funkwhale.md index c557b1fe..a3f80a26 100644 --- a/pages/02.applications/02.docs/funkwhale/app_funkwhale.md +++ b/pages/04.applications/10.docs/funkwhale/app_funkwhale.md @@ -17,7 +17,7 @@ routes: - [Limitations with YunoHost](#limitations-with-yunohost) - [Useful links](#useful-links) -Funkwhale is a self-hosted, federated free music streaming server. Each utilisateur⋅trice has a library in which he/she can add the titles he/she wants, and which he/she can share with other users, whether they are on the same instance or not. [¹](#sources) +Funkwhale is a self-hosted, federated free music streaming server. Each user has a library in which they can add the titles they want, and which they can share with other users, whether they are on the same instance or not. [¹](#sources) ## Administration diff --git a/pages/02.applications/02.docs/galene/app_galene.fr.md b/pages/04.applications/10.docs/galene/app_galene.fr.md similarity index 100% rename from pages/02.applications/02.docs/galene/app_galene.fr.md rename to pages/04.applications/10.docs/galene/app_galene.fr.md diff --git a/pages/02.applications/02.docs/galene/app_galene.md b/pages/04.applications/10.docs/galene/app_galene.md similarity index 100% rename from pages/02.applications/02.docs/galene/app_galene.md rename to pages/04.applications/10.docs/galene/app_galene.md diff --git a/pages/02.applications/02.docs/garradin/app_garradin.fr.md b/pages/04.applications/10.docs/garradin/app_garradin.fr.md similarity index 100% rename from pages/02.applications/02.docs/garradin/app_garradin.fr.md rename to pages/04.applications/10.docs/garradin/app_garradin.fr.md diff --git a/pages/02.applications/02.docs/garradin/app_garradin.md b/pages/04.applications/10.docs/garradin/app_garradin.md similarity index 100% rename from pages/02.applications/02.docs/garradin/app_garradin.md rename to pages/04.applications/10.docs/garradin/app_garradin.md diff --git a/pages/02.applications/02.docs/gitea/app_gitea.fr.md b/pages/04.applications/10.docs/gitea/app_gitea.fr.md similarity index 100% rename from pages/02.applications/02.docs/gitea/app_gitea.fr.md rename to pages/04.applications/10.docs/gitea/app_gitea.fr.md diff --git a/pages/02.applications/02.docs/gitea/app_gitea.md b/pages/04.applications/10.docs/gitea/app_gitea.md similarity index 100% rename from pages/02.applications/02.docs/gitea/app_gitea.md rename to pages/04.applications/10.docs/gitea/app_gitea.md diff --git a/pages/02.applications/02.docs/gitlab-runner/app_gitlab-runner.fr.md b/pages/04.applications/10.docs/gitlab-runner/app_gitlab-runner.fr.md similarity index 100% rename from pages/02.applications/02.docs/gitlab-runner/app_gitlab-runner.fr.md rename to pages/04.applications/10.docs/gitlab-runner/app_gitlab-runner.fr.md diff --git a/pages/02.applications/02.docs/gitlab-runner/app_gitlab-runner.md b/pages/04.applications/10.docs/gitlab-runner/app_gitlab-runner.md similarity index 100% rename from pages/02.applications/02.docs/gitlab-runner/app_gitlab-runner.md rename to pages/04.applications/10.docs/gitlab-runner/app_gitlab-runner.md diff --git a/pages/02.applications/02.docs/gitlab/app_gitlab.fr.md b/pages/04.applications/10.docs/gitlab/app_gitlab.fr.md similarity index 100% rename from pages/02.applications/02.docs/gitlab/app_gitlab.fr.md rename to pages/04.applications/10.docs/gitlab/app_gitlab.fr.md diff --git a/pages/02.applications/02.docs/gitlab/app_gitlab.md b/pages/04.applications/10.docs/gitlab/app_gitlab.md similarity index 100% rename from pages/02.applications/02.docs/gitlab/app_gitlab.md rename to pages/04.applications/10.docs/gitlab/app_gitlab.md diff --git a/pages/02.applications/02.docs/glowing_bear/app_glowing_bear.fr.md b/pages/04.applications/10.docs/glowing_bear/app_glowing_bear.fr.md similarity index 100% rename from pages/02.applications/02.docs/glowing_bear/app_glowing_bear.fr.md rename to pages/04.applications/10.docs/glowing_bear/app_glowing_bear.fr.md diff --git a/pages/02.applications/02.docs/glowing_bear/app_glowing_bear.md b/pages/04.applications/10.docs/glowing_bear/app_glowing_bear.md similarity index 100% rename from pages/02.applications/02.docs/glowing_bear/app_glowing_bear.md rename to pages/04.applications/10.docs/glowing_bear/app_glowing_bear.md diff --git a/pages/02.applications/02.docs/gogs/app_gogs.fr.md b/pages/04.applications/10.docs/gogs/app_gogs.fr.md similarity index 100% rename from pages/02.applications/02.docs/gogs/app_gogs.fr.md rename to pages/04.applications/10.docs/gogs/app_gogs.fr.md diff --git a/pages/02.applications/02.docs/gogs/app_gogs.md b/pages/04.applications/10.docs/gogs/app_gogs.md similarity index 100% rename from pages/02.applications/02.docs/gogs/app_gogs.md rename to pages/04.applications/10.docs/gogs/app_gogs.md diff --git a/pages/02.applications/02.docs/gotify/app_gotify.fr.md b/pages/04.applications/10.docs/gotify/app_gotify.fr.md similarity index 100% rename from pages/02.applications/02.docs/gotify/app_gotify.fr.md rename to pages/04.applications/10.docs/gotify/app_gotify.fr.md diff --git a/pages/02.applications/02.docs/gotify/app_gotify.md b/pages/04.applications/10.docs/gotify/app_gotify.md similarity index 100% rename from pages/02.applications/02.docs/gotify/app_gotify.md rename to pages/04.applications/10.docs/gotify/app_gotify.md diff --git a/pages/02.applications/02.docs/grav/app_grav.fr.md b/pages/04.applications/10.docs/grav/app_grav.fr.md similarity index 100% rename from pages/02.applications/02.docs/grav/app_grav.fr.md rename to pages/04.applications/10.docs/grav/app_grav.fr.md diff --git a/pages/02.applications/02.docs/grav/app_grav.md b/pages/04.applications/10.docs/grav/app_grav.md similarity index 100% rename from pages/02.applications/02.docs/grav/app_grav.md rename to pages/04.applications/10.docs/grav/app_grav.md diff --git a/pages/04.applications/10.docs/grocy/app_grocy.md b/pages/04.applications/10.docs/grocy/app_grocy.md new file mode 100644 index 00000000..dc35d354 --- /dev/null +++ b/pages/04.applications/10.docs/grocy/app_grocy.md @@ -0,0 +1,37 @@ +--- +title: Grocy +template: docs +taxonomy: + category: docs, apps +routes: + default: '/app_grocy' +--- + +![grocy's logo](image://grocy-logo.png?resize=100) + + +[![Install Grocy with YunoHost](https://install-app.yunohost.org/install-with-yunohost.png)](https://install-app.yunohost.org/?app=grocy) +[![Integration level](https://dash.yunohost.org/integration/grocy.svg)](https://dash.yunohost.org/appci/app/grocy) + + +### Index + +- [Configuration](#configuration) +- [Useful links](#useful-links) + +Grocy is a web-based self-hosted groceries & household management solution for your home. + +## Configuration + + Default login +``` + user: admin + password: admin +``` + +## Useful links + +* Official app website: [https://grocy.info/](https://grocy.info/) +* Upstream app code repository: https://github.com/grocy/grocy +* Demo: [https://en.demo.grocy.info/stockoverview](https://en.demo.grocy.info/stockoverview) +* Report a bug: [https://github.com/YunoHost-Apps/grocy_ynh/issues](https://github.com/YunoHost-Apps/grocy_ynh/issues) diff --git a/pages/02.applications/02.docs/halcyon/app_halcyon.fr.md b/pages/04.applications/10.docs/halcyon/app_halcyon.fr.md similarity index 100% rename from pages/02.applications/02.docs/halcyon/app_halcyon.fr.md rename to pages/04.applications/10.docs/halcyon/app_halcyon.fr.md diff --git a/pages/02.applications/02.docs/halcyon/app_halcyon.md b/pages/04.applications/10.docs/halcyon/app_halcyon.md similarity index 100% rename from pages/02.applications/02.docs/halcyon/app_halcyon.md rename to pages/04.applications/10.docs/halcyon/app_halcyon.md diff --git a/pages/02.applications/02.docs/haste/app_haste.fr.md b/pages/04.applications/10.docs/haste/app_haste.fr.md similarity index 100% rename from pages/02.applications/02.docs/haste/app_haste.fr.md rename to pages/04.applications/10.docs/haste/app_haste.fr.md diff --git a/pages/02.applications/02.docs/haste/app_haste.md b/pages/04.applications/10.docs/haste/app_haste.md similarity index 100% rename from pages/02.applications/02.docs/haste/app_haste.md rename to pages/04.applications/10.docs/haste/app_haste.md diff --git a/pages/02.applications/02.docs/hedgedoc/app_hedgedoc.fr.md b/pages/04.applications/10.docs/hedgedoc/app_hedgedoc.fr.md similarity index 100% rename from pages/02.applications/02.docs/hedgedoc/app_hedgedoc.fr.md rename to pages/04.applications/10.docs/hedgedoc/app_hedgedoc.fr.md diff --git a/pages/02.applications/02.docs/hedgedoc/app_hedgedoc.md b/pages/04.applications/10.docs/hedgedoc/app_hedgedoc.md similarity index 100% rename from pages/02.applications/02.docs/hedgedoc/app_hedgedoc.md rename to pages/04.applications/10.docs/hedgedoc/app_hedgedoc.md diff --git a/pages/02.applications/02.docs/hextris/app_hextris.fr.md b/pages/04.applications/10.docs/hextris/app_hextris.fr.md similarity index 100% rename from pages/02.applications/02.docs/hextris/app_hextris.fr.md rename to pages/04.applications/10.docs/hextris/app_hextris.fr.md diff --git a/pages/02.applications/02.docs/hextris/app_hextris.md b/pages/04.applications/10.docs/hextris/app_hextris.md similarity index 100% rename from pages/02.applications/02.docs/hextris/app_hextris.md rename to pages/04.applications/10.docs/hextris/app_hextris.md diff --git a/pages/02.applications/02.docs/horde/app_horde.fr.md b/pages/04.applications/10.docs/horde/app_horde.fr.md similarity index 100% rename from pages/02.applications/02.docs/horde/app_horde.fr.md rename to pages/04.applications/10.docs/horde/app_horde.fr.md diff --git a/pages/02.applications/02.docs/horde/app_horde.md b/pages/04.applications/10.docs/horde/app_horde.md similarity index 100% rename from pages/02.applications/02.docs/horde/app_horde.md rename to pages/04.applications/10.docs/horde/app_horde.md diff --git a/pages/02.applications/02.docs/hubzilla/app_hubzilla.fr.md b/pages/04.applications/10.docs/hubzilla/app_hubzilla.fr.md similarity index 100% rename from pages/02.applications/02.docs/hubzilla/app_hubzilla.fr.md rename to pages/04.applications/10.docs/hubzilla/app_hubzilla.fr.md diff --git a/pages/02.applications/02.docs/hubzilla/app_hubzilla.md b/pages/04.applications/10.docs/hubzilla/app_hubzilla.md similarity index 100% rename from pages/02.applications/02.docs/hubzilla/app_hubzilla.md rename to pages/04.applications/10.docs/hubzilla/app_hubzilla.md diff --git a/pages/04.applications/10.docs/invidious/app_invidious.md b/pages/04.applications/10.docs/invidious/app_invidious.md new file mode 100644 index 00000000..255a00ba --- /dev/null +++ b/pages/04.applications/10.docs/invidious/app_invidious.md @@ -0,0 +1,41 @@ +--- +title: Invidious +template: docs +taxonomy: + category: docs, apps +routes: + default: '/app_invidious' +--- + +![Invidious's logo](image://invidious-logo.png?height=100) + + +[![Install Invidious with YunoHost](https://install-app.yunohost.org/install-with-yunohost.png)](https://install-app.yunohost.org/?app=invidious) +[![Integration level](https://dash.yunohost.org/integration/invidious.svg)](https://dash.yunohost.org/appci/app/invidious) + + +### Index + +- [Features](#features) +- [Configuration](#configuration) +- [Useful links](#useful-links) + +**Invidious** is an interface allowing access to Youtube videos without going through youtube.com +In addition to constituting an advantage in terms of confidentiality (the data does not pass directly through the services of the giant), this interface offers several features. + +## Features: +- Audio only mode, +- Dark mode, +- Ability to display Reddit comments instead of YouTube comments, +- Ability to subscribe to channels without creating a Google account + +## Configuration +You can configure Invidious by modifying the configuration file `/var/www/invidious/config/config.yml` with the help of this [documentation](https://docs.invidious.io/configuration/). + + +## Useful links + +* Official user documentation: [https://docs.invidious.io/](https://docs.invidious.io/) +* Upstream app code repository: [https://github.com/iv-org/invidious](https://github.com/iv-org/invidious) +* Application software repository: [https://github.com/YunoHost-Apps/invidious_ynh](https://github.com/YunoHost-Apps/invidious_ynh) +* Report a bug: [https://github.com/YunoHost-Apps/invidious_ynh/issues](https://github.com/YunoHost-Apps/invidious_ynh/issues) diff --git a/pages/02.applications/02.docs/invoiceninga/app_invoiceninja.md b/pages/04.applications/10.docs/invoiceninga/app_invoiceninja.md similarity index 100% rename from pages/02.applications/02.docs/invoiceninga/app_invoiceninja.md rename to pages/04.applications/10.docs/invoiceninga/app_invoiceninja.md diff --git a/pages/02.applications/02.docs/jappix/app_jappix.fr.md b/pages/04.applications/10.docs/jappix/app_jappix.fr.md similarity index 100% rename from pages/02.applications/02.docs/jappix/app_jappix.fr.md rename to pages/04.applications/10.docs/jappix/app_jappix.fr.md diff --git a/pages/02.applications/02.docs/jappix/app_jappix.md b/pages/04.applications/10.docs/jappix/app_jappix.md similarity index 100% rename from pages/02.applications/02.docs/jappix/app_jappix.md rename to pages/04.applications/10.docs/jappix/app_jappix.md diff --git a/pages/02.applications/02.docs/jirafeau/app_jirafeau.fr.md b/pages/04.applications/10.docs/jirafeau/app_jirafeau.fr.md similarity index 100% rename from pages/02.applications/02.docs/jirafeau/app_jirafeau.fr.md rename to pages/04.applications/10.docs/jirafeau/app_jirafeau.fr.md diff --git a/pages/02.applications/02.docs/jirafeau/app_jirafeau.md b/pages/04.applications/10.docs/jirafeau/app_jirafeau.md similarity index 100% rename from pages/02.applications/02.docs/jirafeau/app_jirafeau.md rename to pages/04.applications/10.docs/jirafeau/app_jirafeau.md diff --git a/pages/02.applications/02.docs/jitsi/app_jitsi.fr.md b/pages/04.applications/10.docs/jitsi/app_jitsi.fr.md similarity index 94% rename from pages/02.applications/02.docs/jitsi/app_jitsi.fr.md rename to pages/04.applications/10.docs/jitsi/app_jitsi.fr.md index fc54e095..c1afb4f6 100644 --- a/pages/02.applications/02.docs/jitsi/app_jitsi.fr.md +++ b/pages/04.applications/10.docs/jitsi/app_jitsi.fr.md @@ -32,7 +32,7 @@ Jitsi-meet pour YunoHost est limité actuellement : | Nom de l'application | Plateforme | Multi-comptes | Autres réseaux supportés | Play Store | F-Droid | Apple Store | *Autres* | |-----------------------|------------|---------------|-------------------------|------------|---------|-------------|----------| | Jitsi Meet | Android - iOS | | | [Jitsi Meet](https://play.google.com/store/apps/details?id=org.jitsi.meet) | [Jitsi Meet](https://f-droid.org/en/packages/org.jitsi.meet/) | [Jitsi Meet](https://apps.apple.com/us/app/jitsi-meet/id1165103905) | | -| Jitsi Meet Desktop | Windows - macOS - GNU/Linux | | | | | | [Téléchargement](https://desktop.jitsi.org/Main/Download) | +| Jitsi Meet Electron | Windows - macOS - GNU/Linux | | | | | | [Téléchargement](https://github.com/jitsi/jitsi-meet-electron) | ## Liens utiles diff --git a/pages/02.applications/02.docs/jitsi/app_jitsi.md b/pages/04.applications/10.docs/jitsi/app_jitsi.md similarity index 94% rename from pages/02.applications/02.docs/jitsi/app_jitsi.md rename to pages/04.applications/10.docs/jitsi/app_jitsi.md index 7138c908..6221551b 100644 --- a/pages/02.applications/02.docs/jitsi/app_jitsi.md +++ b/pages/04.applications/10.docs/jitsi/app_jitsi.md @@ -32,7 +32,7 @@ Jitsi for YunoHost for now as some limitations: | Application name | Platform | Multi-account | Other supported networks | Play Store | F-Droid | Apple Store | *Other* | |-----------------------|------------|---------------|-------------------------|------------|---------|-------------|----------| | Jitsi Meet | Android - iOS | | | [Jitsi Meet](https://play.google.com/store/apps/details?id=org.jitsi.meet) | [Jitsi Meet](https://f-droid.org/en/packages/org.jitsi.meet/) | [Jitsi Meet](https://apps.apple.com/us/app/jitsi-meet/id1165103905) | | -| Jitsi Meet Desktop | Windows - macOS - GNU/Linux | | | | | | [Download](https://desktop.jitsi.org/Main/Download) | +| Jitsi Meet Electron | Windows - macOS - GNU/Linux | | | | | | [Download](https://github.com/jitsi/jitsi-meet-electron) | ## Useful links diff --git a/pages/02.applications/02.docs/jupyterlab/app_jupyterlab.fr.md b/pages/04.applications/10.docs/jupyterlab/app_jupyterlab.fr.md similarity index 100% rename from pages/02.applications/02.docs/jupyterlab/app_jupyterlab.fr.md rename to pages/04.applications/10.docs/jupyterlab/app_jupyterlab.fr.md diff --git a/pages/02.applications/02.docs/jupyterlab/app_jupyterlab.md b/pages/04.applications/10.docs/jupyterlab/app_jupyterlab.md similarity index 100% rename from pages/02.applications/02.docs/jupyterlab/app_jupyterlab.md rename to pages/04.applications/10.docs/jupyterlab/app_jupyterlab.md diff --git a/pages/02.applications/02.docs/kanboard/app_kanboard.fr.md b/pages/04.applications/10.docs/kanboard/app_kanboard.fr.md similarity index 100% rename from pages/02.applications/02.docs/kanboard/app_kanboard.fr.md rename to pages/04.applications/10.docs/kanboard/app_kanboard.fr.md diff --git a/pages/02.applications/02.docs/kanboard/app_kanboard.md b/pages/04.applications/10.docs/kanboard/app_kanboard.md similarity index 100% rename from pages/02.applications/02.docs/kanboard/app_kanboard.md rename to pages/04.applications/10.docs/kanboard/app_kanboard.md diff --git a/pages/02.applications/02.docs/keeweb/app_keeweb.fr.md b/pages/04.applications/10.docs/keeweb/app_keeweb.fr.md similarity index 100% rename from pages/02.applications/02.docs/keeweb/app_keeweb.fr.md rename to pages/04.applications/10.docs/keeweb/app_keeweb.fr.md diff --git a/pages/02.applications/02.docs/keeweb/app_keeweb.md b/pages/04.applications/10.docs/keeweb/app_keeweb.md similarity index 100% rename from pages/02.applications/02.docs/keeweb/app_keeweb.md rename to pages/04.applications/10.docs/keeweb/app_keeweb.md diff --git a/pages/02.applications/02.docs/kresus/app_kresus.fr.md b/pages/04.applications/10.docs/kresus/app_kresus.fr.md similarity index 100% rename from pages/02.applications/02.docs/kresus/app_kresus.fr.md rename to pages/04.applications/10.docs/kresus/app_kresus.fr.md diff --git a/pages/02.applications/02.docs/kresus/app_kresus.md b/pages/04.applications/10.docs/kresus/app_kresus.md similarity index 100% rename from pages/02.applications/02.docs/kresus/app_kresus.md rename to pages/04.applications/10.docs/kresus/app_kresus.md diff --git a/pages/02.applications/02.docs/leed/app_leed.fr.md b/pages/04.applications/10.docs/leed/app_leed.fr.md similarity index 100% rename from pages/02.applications/02.docs/leed/app_leed.fr.md rename to pages/04.applications/10.docs/leed/app_leed.fr.md diff --git a/pages/02.applications/02.docs/leed/app_leed.md b/pages/04.applications/10.docs/leed/app_leed.md similarity index 100% rename from pages/02.applications/02.docs/leed/app_leed.md rename to pages/04.applications/10.docs/leed/app_leed.md diff --git a/pages/02.applications/02.docs/limesurvey/app_limesurvey.fr.md b/pages/04.applications/10.docs/limesurvey/app_limesurvey.fr.md similarity index 100% rename from pages/02.applications/02.docs/limesurvey/app_limesurvey.fr.md rename to pages/04.applications/10.docs/limesurvey/app_limesurvey.fr.md diff --git a/pages/02.applications/02.docs/limesurvey/app_limesurvey.md b/pages/04.applications/10.docs/limesurvey/app_limesurvey.md similarity index 100% rename from pages/02.applications/02.docs/limesurvey/app_limesurvey.md rename to pages/04.applications/10.docs/limesurvey/app_limesurvey.md diff --git a/pages/02.applications/02.docs/lstu/app_lstu.fr.md b/pages/04.applications/10.docs/lstu/app_lstu.fr.md similarity index 100% rename from pages/02.applications/02.docs/lstu/app_lstu.fr.md rename to pages/04.applications/10.docs/lstu/app_lstu.fr.md diff --git a/pages/02.applications/02.docs/lstu/app_lstu.md b/pages/04.applications/10.docs/lstu/app_lstu.md similarity index 100% rename from pages/02.applications/02.docs/lstu/app_lstu.md rename to pages/04.applications/10.docs/lstu/app_lstu.md diff --git a/pages/02.applications/02.docs/lufi/app_lufi.fr.md b/pages/04.applications/10.docs/lufi/app_lufi.fr.md similarity index 100% rename from pages/02.applications/02.docs/lufi/app_lufi.fr.md rename to pages/04.applications/10.docs/lufi/app_lufi.fr.md diff --git a/pages/02.applications/02.docs/lufi/app_lufi.md b/pages/04.applications/10.docs/lufi/app_lufi.md similarity index 100% rename from pages/02.applications/02.docs/lufi/app_lufi.md rename to pages/04.applications/10.docs/lufi/app_lufi.md diff --git a/pages/02.applications/02.docs/lutim/app_lutim.fr.md b/pages/04.applications/10.docs/lutim/app_lutim.fr.md similarity index 100% rename from pages/02.applications/02.docs/lutim/app_lutim.fr.md rename to pages/04.applications/10.docs/lutim/app_lutim.fr.md diff --git a/pages/02.applications/02.docs/lutim/app_lutim.md b/pages/04.applications/10.docs/lutim/app_lutim.md similarity index 100% rename from pages/02.applications/02.docs/lutim/app_lutim.md rename to pages/04.applications/10.docs/lutim/app_lutim.md diff --git a/pages/02.applications/02.docs/lychee/app_lychee.fr.md b/pages/04.applications/10.docs/lychee/app_lychee.fr.md similarity index 100% rename from pages/02.applications/02.docs/lychee/app_lychee.fr.md rename to pages/04.applications/10.docs/lychee/app_lychee.fr.md diff --git a/pages/02.applications/02.docs/lychee/app_lychee.md b/pages/04.applications/10.docs/lychee/app_lychee.md similarity index 100% rename from pages/02.applications/02.docs/lychee/app_lychee.md rename to pages/04.applications/10.docs/lychee/app_lychee.md diff --git a/pages/02.applications/02.docs/mailman/app_mailman.fr.md b/pages/04.applications/10.docs/mailman/app_mailman.fr.md similarity index 100% rename from pages/02.applications/02.docs/mailman/app_mailman.fr.md rename to pages/04.applications/10.docs/mailman/app_mailman.fr.md diff --git a/pages/02.applications/02.docs/mailman/app_mailman.md b/pages/04.applications/10.docs/mailman/app_mailman.md similarity index 100% rename from pages/02.applications/02.docs/mailman/app_mailman.md rename to pages/04.applications/10.docs/mailman/app_mailman.md diff --git a/pages/02.applications/02.docs/mantis/app_mantis.fr.md b/pages/04.applications/10.docs/mantis/app_mantis.fr.md similarity index 100% rename from pages/02.applications/02.docs/mantis/app_mantis.fr.md rename to pages/04.applications/10.docs/mantis/app_mantis.fr.md diff --git a/pages/02.applications/02.docs/mantis/app_mantis.md b/pages/04.applications/10.docs/mantis/app_mantis.md similarity index 100% rename from pages/02.applications/02.docs/mantis/app_mantis.md rename to pages/04.applications/10.docs/mantis/app_mantis.md diff --git a/pages/02.applications/02.docs/matomo/app_matomo.fr.md b/pages/04.applications/10.docs/matomo/app_matomo.fr.md similarity index 100% rename from pages/02.applications/02.docs/matomo/app_matomo.fr.md rename to pages/04.applications/10.docs/matomo/app_matomo.fr.md diff --git a/pages/02.applications/02.docs/matomo/app_matomo.md b/pages/04.applications/10.docs/matomo/app_matomo.md similarity index 100% rename from pages/02.applications/02.docs/matomo/app_matomo.md rename to pages/04.applications/10.docs/matomo/app_matomo.md diff --git a/pages/02.applications/02.docs/mattermost/app_mattermost.fr.md b/pages/04.applications/10.docs/mattermost/app_mattermost.fr.md similarity index 100% rename from pages/02.applications/02.docs/mattermost/app_mattermost.fr.md rename to pages/04.applications/10.docs/mattermost/app_mattermost.fr.md diff --git a/pages/02.applications/02.docs/mattermost/app_mattermost.md b/pages/04.applications/10.docs/mattermost/app_mattermost.md similarity index 100% rename from pages/02.applications/02.docs/mattermost/app_mattermost.md rename to pages/04.applications/10.docs/mattermost/app_mattermost.md diff --git a/pages/02.applications/02.docs/mediawiki/app_mediawiki.fr.md b/pages/04.applications/10.docs/mediawiki/app_mediawiki.fr.md similarity index 100% rename from pages/02.applications/02.docs/mediawiki/app_mediawiki.fr.md rename to pages/04.applications/10.docs/mediawiki/app_mediawiki.fr.md diff --git a/pages/02.applications/02.docs/mediawiki/app_mediawiki.md b/pages/04.applications/10.docs/mediawiki/app_mediawiki.md similarity index 100% rename from pages/02.applications/02.docs/mediawiki/app_mediawiki.md rename to pages/04.applications/10.docs/mediawiki/app_mediawiki.md diff --git a/pages/02.applications/02.docs/mindmaps/app_mindmaps.fr.md b/pages/04.applications/10.docs/mindmaps/app_mindmaps.fr.md similarity index 100% rename from pages/02.applications/02.docs/mindmaps/app_mindmaps.fr.md rename to pages/04.applications/10.docs/mindmaps/app_mindmaps.fr.md diff --git a/pages/02.applications/02.docs/mindmaps/app_mindmaps.md b/pages/04.applications/10.docs/mindmaps/app_mindmaps.md similarity index 100% rename from pages/02.applications/02.docs/mindmaps/app_mindmaps.md rename to pages/04.applications/10.docs/mindmaps/app_mindmaps.md diff --git a/pages/02.applications/02.docs/minetest/app_minetest.fr.md b/pages/04.applications/10.docs/minetest/app_minetest.fr.md similarity index 100% rename from pages/02.applications/02.docs/minetest/app_minetest.fr.md rename to pages/04.applications/10.docs/minetest/app_minetest.fr.md diff --git a/pages/02.applications/02.docs/minetest/app_minetest.md b/pages/04.applications/10.docs/minetest/app_minetest.md similarity index 100% rename from pages/02.applications/02.docs/minetest/app_minetest.md rename to pages/04.applications/10.docs/minetest/app_minetest.md diff --git a/pages/02.applications/02.docs/minidlna/app_minidlna.fr.md b/pages/04.applications/10.docs/minidlna/app_minidlna.fr.md similarity index 100% rename from pages/02.applications/02.docs/minidlna/app_minidlna.fr.md rename to pages/04.applications/10.docs/minidlna/app_minidlna.fr.md diff --git a/pages/02.applications/02.docs/minidlna/app_minidlna.md b/pages/04.applications/10.docs/minidlna/app_minidlna.md similarity index 100% rename from pages/02.applications/02.docs/minidlna/app_minidlna.md rename to pages/04.applications/10.docs/minidlna/app_minidlna.md diff --git a/pages/04.applications/10.docs/misskey/app_misskey.md b/pages/04.applications/10.docs/misskey/app_misskey.md new file mode 100644 index 00000000..9e822131 --- /dev/null +++ b/pages/04.applications/10.docs/misskey/app_misskey.md @@ -0,0 +1,53 @@ +--- +title: Misskey +template: docs +taxonomy: + category: docs, apps +routes: + default: '/app_misskey' +--- + +![misskey's logo](image://misskey_logo.png?resize=100) + +[![Install Misskey with YunoHost](https://install-app.yunohost.org/install-with-yunohost.png)](https://install-app.yunohost.org/?app=misskey) [![Integration level](https://dash.yunohost.org/integration/misskey.svg)](https://dash.yunohost.org/appci/app/misskey) + +### Index + +- [Configuration](#configuration) +- [Useful links](#useful-links) + + +Misskey is a decentralized and open source microblogging platform. It has "Reactions" that allow you to easily express your feeling, "Drive" that allows you to manage files in one place, and a highly customizable UI that makes it more fun to share something. + +Misskey also implements ActivityPub, so it can communicate with other platforms like Mastodon, Pleroma, Friendica and more interactively. + +## Configuration + +- Beginning with version 12.111.1~ynh1 (*Misskey* 12.111.1) YunoHost >= 11.0.7 is required, as PostgreSQL >= 12.x is mandatory. +- *Misskey* requires a dedicated root domain, e.g. `misskey.domain.tld` +- Due to Cypress dependency, *Misskey* only works on 64-bit CPU machines. +- *Misskey* can take quite some time to install (more then 30 minutes). So take out some time and grab yourself a coffee. +- If installing from command line, using `screen` is recommended to avoid disconnection. See below. +- After installation, first page can take time to load and may show timeout error. Give it time to make itself ready for you. Refresh the page after 2 or 3 minutes. +- The first account created will be an admin user and will have all the admin rights. + + +Using screen in case of disconnects + +``` +sudo apt-get install screen +screen +sudo yunohost app install https://github.com/YunoHost-Apps/misskey_ynh.git +``` +Recover after disconnect: +``` +screen -d +screen -r +``` + +## Useful links + +* Official app website: [https://misskey-hub.net/](https://misskey-hub.net/) +* Upstream app code repository: [https://github.com/misskey-dev/misskey](https://github.com/misskey-dev/misskey) +* Demonstration : [https://demo.misskey.io](https://demo.misskey.io) +* Report a bug: [https://github.com/YunoHost-Apps/misskey_ynh/issues](https://github.com/YunoHost-Apps/misskey_ynh/issues) diff --git a/pages/02.applications/02.docs/mobilizon/app_mobilizon.fr.md b/pages/04.applications/10.docs/mobilizon/app_mobilizon.fr.md similarity index 100% rename from pages/02.applications/02.docs/mobilizon/app_mobilizon.fr.md rename to pages/04.applications/10.docs/mobilizon/app_mobilizon.fr.md diff --git a/pages/02.applications/02.docs/mobilizon/app_mobilizon.md b/pages/04.applications/10.docs/mobilizon/app_mobilizon.md similarity index 100% rename from pages/02.applications/02.docs/mobilizon/app_mobilizon.md rename to pages/04.applications/10.docs/mobilizon/app_mobilizon.md diff --git a/pages/02.applications/02.docs/moodle/app_moodle.fr.md b/pages/04.applications/10.docs/moodle/app_moodle.fr.md similarity index 100% rename from pages/02.applications/02.docs/moodle/app_moodle.fr.md rename to pages/04.applications/10.docs/moodle/app_moodle.fr.md diff --git a/pages/02.applications/02.docs/moodle/app_moodle.md b/pages/04.applications/10.docs/moodle/app_moodle.md similarity index 100% rename from pages/02.applications/02.docs/moodle/app_moodle.md rename to pages/04.applications/10.docs/moodle/app_moodle.md diff --git a/pages/02.applications/02.docs/mumbleserver/app_mumbleserver.fr.md b/pages/04.applications/10.docs/mumbleserver/app_mumbleserver.fr.md similarity index 100% rename from pages/02.applications/02.docs/mumbleserver/app_mumbleserver.fr.md rename to pages/04.applications/10.docs/mumbleserver/app_mumbleserver.fr.md diff --git a/pages/02.applications/02.docs/mumbleserver/app_mumbleserver.md b/pages/04.applications/10.docs/mumbleserver/app_mumbleserver.md similarity index 100% rename from pages/02.applications/02.docs/mumbleserver/app_mumbleserver.md rename to pages/04.applications/10.docs/mumbleserver/app_mumbleserver.md diff --git a/pages/02.applications/02.docs/my_webapp/app_my_webapp.fr.md b/pages/04.applications/10.docs/my_webapp/app_my_webapp.fr.md similarity index 95% rename from pages/02.applications/02.docs/my_webapp/app_my_webapp.fr.md rename to pages/04.applications/10.docs/my_webapp/app_my_webapp.fr.md index 105fc99e..dfd8c59b 100644 --- a/pages/02.applications/02.docs/my_webapp/app_my_webapp.fr.md +++ b/pages/04.applications/10.docs/my_webapp/app_my_webapp.fr.md @@ -19,7 +19,7 @@ Si vous souhaitez automatiser des choses, il vous faut une possibilité de conne - Activer la connexion par clé publique, dans `/etc/ssh/sshd_config`, sur le serveur - Créer une paire clé publique/privée pour votre script, sur l'ordinateur "de rédaction" - sans mettre de phrase de passe de protection. - Copier la clé publique sur le serveur, dans `/var/www/my_webapp(__#)/.ssh/authorized_keys` -- Rentre l'utilisateur `webapp#` propriétaire du fichier et du dossier +- Rentre l'utilisateur `my_webapp(__#)` propriétaire du fichier et du dossier - Vous pouvez maintenant vous connecter sans mot de passe, avec `sftp -b`, `lftp` ou bien d'autres clients SFTP. NB : Le numéro de port à utiliser pour la connection SFTP est celui utilisé pour le SSH, et configuré dans `/etc/ssh/sshd_config`. diff --git a/pages/02.applications/02.docs/my_webapp/app_my_webapp.md b/pages/04.applications/10.docs/my_webapp/app_my_webapp.md similarity index 93% rename from pages/02.applications/02.docs/my_webapp/app_my_webapp.md rename to pages/04.applications/10.docs/my_webapp/app_my_webapp.md index bc875cef..1e55ed54 100644 --- a/pages/02.applications/02.docs/my_webapp/app_my_webapp.md +++ b/pages/04.applications/10.docs/my_webapp/app_my_webapp.md @@ -19,7 +19,7 @@ If you want to automate things, you need to be able to connect without typing a - Enable public key connection, in `/etc/ssh/sshd_config`, on the server - Create a public/private key pair for your script on the "writing" computer - without a protective passphrase. - Copy the public key to the server, in `/var/www/my_webapp(__#)/.ssh/authorized_keys` -- Set the user `webapp#` as owner of the file and directory +- Set the user `my_webapp(__#)` as owner of the `authorized_keys` file and `www/` directory - You can now connect without a password, with `sftp -b`, `lftp` or other SFTP clients. NB: The port number to use for the SFTP connection is the one used for the SSH, and configured in `/etc/ssh/sshd_config`. diff --git a/pages/02.applications/02.docs/navidrome/app_navidrome.fr.md b/pages/04.applications/10.docs/navidrome/app_navidrome.fr.md similarity index 100% rename from pages/02.applications/02.docs/navidrome/app_navidrome.fr.md rename to pages/04.applications/10.docs/navidrome/app_navidrome.fr.md diff --git a/pages/02.applications/02.docs/navidrome/app_navidrome.md b/pages/04.applications/10.docs/navidrome/app_navidrome.md similarity index 100% rename from pages/02.applications/02.docs/navidrome/app_navidrome.md rename to pages/04.applications/10.docs/navidrome/app_navidrome.md diff --git a/pages/02.applications/02.docs/netdata/app_netdata.fr.md b/pages/04.applications/10.docs/netdata/app_netdata.fr.md similarity index 100% rename from pages/02.applications/02.docs/netdata/app_netdata.fr.md rename to pages/04.applications/10.docs/netdata/app_netdata.fr.md diff --git a/pages/02.applications/02.docs/netdata/app_netdata.md b/pages/04.applications/10.docs/netdata/app_netdata.md similarity index 100% rename from pages/02.applications/02.docs/netdata/app_netdata.md rename to pages/04.applications/10.docs/netdata/app_netdata.md diff --git a/pages/02.applications/02.docs/nextcloud/app_nextcloud.fr.md b/pages/04.applications/10.docs/nextcloud/app_nextcloud.fr.md similarity index 100% rename from pages/02.applications/02.docs/nextcloud/app_nextcloud.fr.md rename to pages/04.applications/10.docs/nextcloud/app_nextcloud.fr.md diff --git a/pages/02.applications/02.docs/nextcloud/app_nextcloud.md b/pages/04.applications/10.docs/nextcloud/app_nextcloud.md similarity index 100% rename from pages/02.applications/02.docs/nextcloud/app_nextcloud.md rename to pages/04.applications/10.docs/nextcloud/app_nextcloud.md diff --git a/pages/02.applications/02.docs/nextcloud_keeweb/app_nextcloud_keeweb.fr.md b/pages/04.applications/10.docs/nextcloud_keeweb/app_nextcloud_keeweb.fr.md similarity index 100% rename from pages/02.applications/02.docs/nextcloud_keeweb/app_nextcloud_keeweb.fr.md rename to pages/04.applications/10.docs/nextcloud_keeweb/app_nextcloud_keeweb.fr.md diff --git a/pages/02.applications/02.docs/nextcloud_keeweb/app_nextcloud_keeweb.md b/pages/04.applications/10.docs/nextcloud_keeweb/app_nextcloud_keeweb.md similarity index 100% rename from pages/02.applications/02.docs/nextcloud_keeweb/app_nextcloud_keeweb.md rename to pages/04.applications/10.docs/nextcloud_keeweb/app_nextcloud_keeweb.md diff --git a/pages/02.applications/02.docs/noalyss/app_noalyss.fr.md b/pages/04.applications/10.docs/noalyss/app_noalyss.fr.md similarity index 100% rename from pages/02.applications/02.docs/noalyss/app_noalyss.fr.md rename to pages/04.applications/10.docs/noalyss/app_noalyss.fr.md diff --git a/pages/02.applications/02.docs/noalyss/app_noalyss.md b/pages/04.applications/10.docs/noalyss/app_noalyss.md similarity index 100% rename from pages/02.applications/02.docs/noalyss/app_noalyss.md rename to pages/04.applications/10.docs/noalyss/app_noalyss.md diff --git a/pages/02.applications/02.docs/onlyoffice/app_onlyoffice.fr.md b/pages/04.applications/10.docs/onlyoffice/app_onlyoffice.fr.md similarity index 100% rename from pages/02.applications/02.docs/onlyoffice/app_onlyoffice.fr.md rename to pages/04.applications/10.docs/onlyoffice/app_onlyoffice.fr.md diff --git a/pages/02.applications/02.docs/onlyoffice/app_onlyoffice.md b/pages/04.applications/10.docs/onlyoffice/app_onlyoffice.md similarity index 100% rename from pages/02.applications/02.docs/onlyoffice/app_onlyoffice.md rename to pages/04.applications/10.docs/onlyoffice/app_onlyoffice.md diff --git a/pages/02.applications/02.docs/opensondage/app_opensondage.fr.md b/pages/04.applications/10.docs/opensondage/app_opensondage.fr.md similarity index 100% rename from pages/02.applications/02.docs/opensondage/app_opensondage.fr.md rename to pages/04.applications/10.docs/opensondage/app_opensondage.fr.md diff --git a/pages/02.applications/02.docs/opensondage/app_opensondage.md b/pages/04.applications/10.docs/opensondage/app_opensondage.md similarity index 100% rename from pages/02.applications/02.docs/opensondage/app_opensondage.md rename to pages/04.applications/10.docs/opensondage/app_opensondage.md diff --git a/pages/02.applications/02.docs/osticket/app_osticket.fr.md b/pages/04.applications/10.docs/osticket/app_osticket.fr.md similarity index 100% rename from pages/02.applications/02.docs/osticket/app_osticket.fr.md rename to pages/04.applications/10.docs/osticket/app_osticket.fr.md diff --git a/pages/02.applications/02.docs/osticket/app_osticket.md b/pages/04.applications/10.docs/osticket/app_osticket.md similarity index 100% rename from pages/02.applications/02.docs/osticket/app_osticket.md rename to pages/04.applications/10.docs/osticket/app_osticket.md diff --git a/pages/02.applications/02.docs/peertube/app_peertube.fr.md b/pages/04.applications/10.docs/peertube/app_peertube.fr.md similarity index 100% rename from pages/02.applications/02.docs/peertube/app_peertube.fr.md rename to pages/04.applications/10.docs/peertube/app_peertube.fr.md diff --git a/pages/02.applications/02.docs/peertube/app_peertube.md b/pages/04.applications/10.docs/peertube/app_peertube.md similarity index 100% rename from pages/02.applications/02.docs/peertube/app_peertube.md rename to pages/04.applications/10.docs/peertube/app_peertube.md diff --git a/pages/02.applications/02.docs/phpmyadmin/app_phpmyadmin.fr.md b/pages/04.applications/10.docs/phpmyadmin/app_phpmyadmin.fr.md similarity index 100% rename from pages/02.applications/02.docs/phpmyadmin/app_phpmyadmin.fr.md rename to pages/04.applications/10.docs/phpmyadmin/app_phpmyadmin.fr.md diff --git a/pages/02.applications/02.docs/phpmyadmin/app_phpmyadmin.md b/pages/04.applications/10.docs/phpmyadmin/app_phpmyadmin.md similarity index 100% rename from pages/02.applications/02.docs/phpmyadmin/app_phpmyadmin.md rename to pages/04.applications/10.docs/phpmyadmin/app_phpmyadmin.md diff --git a/pages/02.applications/02.docs/phpsysinfo/app_phpsysinfo.fr.md b/pages/04.applications/10.docs/phpsysinfo/app_phpsysinfo.fr.md similarity index 100% rename from pages/02.applications/02.docs/phpsysinfo/app_phpsysinfo.fr.md rename to pages/04.applications/10.docs/phpsysinfo/app_phpsysinfo.fr.md diff --git a/pages/02.applications/02.docs/phpsysinfo/app_phpsysinfo.md b/pages/04.applications/10.docs/phpsysinfo/app_phpsysinfo.md similarity index 100% rename from pages/02.applications/02.docs/phpsysinfo/app_phpsysinfo.md rename to pages/04.applications/10.docs/phpsysinfo/app_phpsysinfo.md diff --git a/pages/02.applications/02.docs/pihole/app_pihole.fr.md b/pages/04.applications/10.docs/pihole/app_pihole.fr.md similarity index 100% rename from pages/02.applications/02.docs/pihole/app_pihole.fr.md rename to pages/04.applications/10.docs/pihole/app_pihole.fr.md diff --git a/pages/02.applications/02.docs/pihole/app_pihole.md b/pages/04.applications/10.docs/pihole/app_pihole.md similarity index 100% rename from pages/02.applications/02.docs/pihole/app_pihole.md rename to pages/04.applications/10.docs/pihole/app_pihole.md diff --git a/pages/02.applications/02.docs/piwigo/app_piwigo.fr.md b/pages/04.applications/10.docs/piwigo/app_piwigo.fr.md similarity index 100% rename from pages/02.applications/02.docs/piwigo/app_piwigo.fr.md rename to pages/04.applications/10.docs/piwigo/app_piwigo.fr.md diff --git a/pages/02.applications/02.docs/piwigo/app_piwigo.md b/pages/04.applications/10.docs/piwigo/app_piwigo.md similarity index 100% rename from pages/02.applications/02.docs/piwigo/app_piwigo.md rename to pages/04.applications/10.docs/piwigo/app_piwigo.md diff --git a/pages/02.applications/02.docs/pleroma/app_pleroma.fr.md b/pages/04.applications/10.docs/pleroma/app_pleroma.fr.md similarity index 100% rename from pages/02.applications/02.docs/pleroma/app_pleroma.fr.md rename to pages/04.applications/10.docs/pleroma/app_pleroma.fr.md diff --git a/pages/02.applications/02.docs/pleroma/app_pleroma.md b/pages/04.applications/10.docs/pleroma/app_pleroma.md similarity index 100% rename from pages/02.applications/02.docs/pleroma/app_pleroma.md rename to pages/04.applications/10.docs/pleroma/app_pleroma.md diff --git a/pages/02.applications/02.docs/plume/app_plume.fr.md b/pages/04.applications/10.docs/plume/app_plume.fr.md similarity index 100% rename from pages/02.applications/02.docs/plume/app_plume.fr.md rename to pages/04.applications/10.docs/plume/app_plume.fr.md diff --git a/pages/02.applications/02.docs/plume/app_plume.md b/pages/04.applications/10.docs/plume/app_plume.md similarity index 100% rename from pages/02.applications/02.docs/plume/app_plume.md rename to pages/04.applications/10.docs/plume/app_plume.md diff --git a/pages/04.applications/10.docs/pluxml/app_pluxml.fr.md b/pages/04.applications/10.docs/pluxml/app_pluxml.fr.md new file mode 100644 index 00000000..0958f737 --- /dev/null +++ b/pages/04.applications/10.docs/pluxml/app_pluxml.fr.md @@ -0,0 +1,50 @@ +--- +title: PluXml +template: docs +taxonomy: + category: docs, apps +routes: + default: '/app_pluxml' +--- + +![PluXml_logo](image://PluXml_logo.png) + +[![Install PluXml with YunoHost](https://install-app.yunohost.org/install-with-yunohost.png)](https://install-app.yunohost.org/?app=pluxml) [![Integration level](https://dash.yunohost.org/integration/pluxml.svg)](https://dash.yunohost.org/appci/app/pluxml) + +### Index + +- [Configuration](#configuration) + - [Connexion à l'interface d'administration](#connexion-à-l’interface-d’administration) +- [Capture d'écran](#capture-décran) +- [Plugins et thèmes](#plugins-et-thèmes) +- [Sauvegarde](#sauvegarde) +- [Liens utiles](#liens-utiles) + +PluXml est un moteur de blog/CMS stockant ces données en XML et ne nécessitant pas de base de données SQL. + +## Configuration + +### Connexion à l’interface d’administration + +Pour configurer l'application il faut se rendre à l'adresse : `https://domain.tld/path/core/admin` + +## Capture d'écran + +![PluXml_screenshot](image://PluXml_screenshot.jpg) + +## Plugins et thèmes + +Les plugins et thèmes doivent être installés manuellement respectivement dans les dossiers `/var/www/pluxml/plugins` et `/var/www/pluxml/themes`. + +## Sauvegarde + +Pour sauvegarder votre blog, il est nécessaire de réaliser une copie du dossier `/var/www/pluxml/data`. Cette procédure de sauvegarde est également recommandée avant toute mise à jour de l'application. + +## Liens utiles + + + Site web : [www.pluxml.org](https://www.pluxml.org/) + + Documentation officielle : [wiki.pluxml.org Wiki](https://wiki.pluxml.org/) + + Démo officielle : [https://demo.pluxml.org/](https://demo.pluxml.org/) + + Forum : [https://forum.pluxml.org/](https://forum.pluxml.org/) + + Dépôt logiciel de l'application : [github.com - YunoHost-Apps/pluxml](https://github.com/YunoHost-Apps/pluxml_ynh) + + Remonter un bug ou une amélioration en créant un ticket (issue) : [github.com - YunoHost-Apps/pluxml/issues](https://github.com/YunoHost-Apps/pluxml_ynh/issues) diff --git a/pages/04.applications/10.docs/pluxml/app_pluxml.md b/pages/04.applications/10.docs/pluxml/app_pluxml.md new file mode 100644 index 00000000..556c9d0b --- /dev/null +++ b/pages/04.applications/10.docs/pluxml/app_pluxml.md @@ -0,0 +1,49 @@ +--- +title: PluXml +template: docs +taxonomy: + category: docs, apps +routes: + default: '/app_pluxml' +--- + +![PluXml_logo](image://PluXml_logo.png) + +[![Install PluXml with YunoHost](https://install-app.yunohost.org/install-with-yunohost.png)](https://install-app.yunohost.org/?app=pluxml) [![Integration level](https://dash.yunohost.org/integration/pluxml.svg)](https://dash.yunohost.org/appci/app/pluxml) + +### Index + +- [Configuration](#configuration) + - [Login to admin interface](#connecting-to-the-administration-interface) +- [Overview](#overview-1) +- [Plugins and themes](#plugins-and-themes) +- [Backup](#backup) +- [Useful links](#useful-links) + +PluXml is a blog/CMS storing data in XML and not in a SQL database. + +## Configuration + +### Connecting to the administration interface + +To configure the app, go to the address: `https://domain.tld/path/core/admin` + +## Overview + +![PluXml_screenshot](image://PluXml_screenshot.jpg) + +## Plugins and themes + +Plugins and themes should respectively be installed in the following folders: `/var/www/pluxml/plugins`, `/var/www/pluxml/themes`. + +## Backup + +To restore your blog, you should keep a copy of the folder `/var/www/pluxml/data`. It is recommended to do this backup before any upgrade. + +## Useful links + + Website : [www.pluxml.org](https://www.pluxml.org/) + + Official documentation : [wiki.pluxml.org Wiki](https://wiki.pluxml.org/) + + Official demo : [https://demo.pluxml.org/](https://demo.pluxml.org/) + + Forum : [https://forum.pluxml.org/](https://forum.pluxml.org/) + + Apps software repository : [github.com - YunoHost-Apps/pluxml](https://github.com/YunoHost-Apps/pluxml_ynh) + + Fix a bug or suggest an improvement by creating a ticket (issue) : [github.com - YunoHost-Apps/pluxml/issues](https://github.com/YunoHost-Apps/pluxml_ynh/issues) diff --git a/pages/02.applications/02.docs/privatebin/app_privatebin.fr.md b/pages/04.applications/10.docs/privatebin/app_privatebin.fr.md similarity index 100% rename from pages/02.applications/02.docs/privatebin/app_privatebin.fr.md rename to pages/04.applications/10.docs/privatebin/app_privatebin.fr.md diff --git a/pages/02.applications/02.docs/privatebin/app_privatebin.md b/pages/04.applications/10.docs/privatebin/app_privatebin.md similarity index 100% rename from pages/02.applications/02.docs/privatebin/app_privatebin.md rename to pages/04.applications/10.docs/privatebin/app_privatebin.md diff --git a/pages/02.applications/02.docs/radicale/app_radicale.fr.md b/pages/04.applications/10.docs/radicale/app_radicale.fr.md similarity index 100% rename from pages/02.applications/02.docs/radicale/app_radicale.fr.md rename to pages/04.applications/10.docs/radicale/app_radicale.fr.md diff --git a/pages/02.applications/02.docs/radicale/app_radicale.md b/pages/04.applications/10.docs/radicale/app_radicale.md similarity index 100% rename from pages/02.applications/02.docs/radicale/app_radicale.md rename to pages/04.applications/10.docs/radicale/app_radicale.md diff --git a/pages/02.applications/02.docs/rainloop/app_rainloop.fr.md b/pages/04.applications/10.docs/rainloop/app_rainloop.fr.md similarity index 98% rename from pages/02.applications/02.docs/rainloop/app_rainloop.fr.md rename to pages/04.applications/10.docs/rainloop/app_rainloop.fr.md index a722efad..911f2dba 100644 --- a/pages/02.applications/02.docs/rainloop/app_rainloop.fr.md +++ b/pages/04.applications/10.docs/rainloop/app_rainloop.fr.md @@ -7,7 +7,7 @@ routes: default: '/app_rainloop' --- -![logo de Rainloop](image://yunohost_package.png?height=80) +![logo de Rainloop](image://rainloop-logo.png?height=100) [![Install Rainloop with YunoHost](https://install-app.yunohost.org/install-with-yunohost.png)](https://install-app.yunohost.org/?app=rainloop) [![Integration level](https://dash.yunohost.org/integration/rainloop.svg)](https://dash.yunohost.org/appci/app/rainloop) diff --git a/pages/02.applications/02.docs/rainloop/app_rainloop.md b/pages/04.applications/10.docs/rainloop/app_rainloop.md similarity index 96% rename from pages/02.applications/02.docs/rainloop/app_rainloop.md rename to pages/04.applications/10.docs/rainloop/app_rainloop.md index d605bda3..65b002aa 100644 --- a/pages/02.applications/02.docs/rainloop/app_rainloop.md +++ b/pages/04.applications/10.docs/rainloop/app_rainloop.md @@ -7,13 +7,13 @@ routes: default: '/app_rainloop' --- -![Rainloop's logo](image://yunohost_package.png?height=80) +![Rainloop's logo](image://rainloop-logo.png?height=100) [![Install Rainloop with YunoHost](https://install-app.yunohost.org/install-with-yunohost.png)](https://install-app.yunohost.org/?app=rainloop) [![Integration level](https://dash.yunohost.org/integration/rainloop.svg)](https://dash.yunohost.org/appci/app/rainloop) ### Index -- [Configuration](#Configuration) +- [Configuration](#configuration) - [Useful links](#useful-links) Rainloop is a lightweight webmail. diff --git a/pages/02.applications/02.docs/roundcube/app_roundcube.fr.md b/pages/04.applications/10.docs/roundcube/app_roundcube.fr.md similarity index 100% rename from pages/02.applications/02.docs/roundcube/app_roundcube.fr.md rename to pages/04.applications/10.docs/roundcube/app_roundcube.fr.md diff --git a/pages/02.applications/02.docs/roundcube/app_roundcube.md b/pages/04.applications/10.docs/roundcube/app_roundcube.md similarity index 100% rename from pages/02.applications/02.docs/roundcube/app_roundcube.md rename to pages/04.applications/10.docs/roundcube/app_roundcube.md diff --git a/pages/02.applications/02.docs/searx/app_searx.fr.md b/pages/04.applications/10.docs/searx/app_searx.fr.md similarity index 100% rename from pages/02.applications/02.docs/searx/app_searx.fr.md rename to pages/04.applications/10.docs/searx/app_searx.fr.md diff --git a/pages/02.applications/02.docs/searx/app_searx.md b/pages/04.applications/10.docs/searx/app_searx.md similarity index 100% rename from pages/02.applications/02.docs/searx/app_searx.md rename to pages/04.applications/10.docs/searx/app_searx.md diff --git a/pages/02.applications/02.docs/shaarli/app_shaarli.fr.md b/pages/04.applications/10.docs/shaarli/app_shaarli.fr.md similarity index 100% rename from pages/02.applications/02.docs/shaarli/app_shaarli.fr.md rename to pages/04.applications/10.docs/shaarli/app_shaarli.fr.md diff --git a/pages/02.applications/02.docs/shaarli/app_shaarli.md b/pages/04.applications/10.docs/shaarli/app_shaarli.md similarity index 100% rename from pages/02.applications/02.docs/shaarli/app_shaarli.md rename to pages/04.applications/10.docs/shaarli/app_shaarli.md diff --git a/pages/02.applications/02.docs/shellinabox/app_shellinabox.fr.md b/pages/04.applications/10.docs/shellinabox/app_shellinabox.fr.md similarity index 100% rename from pages/02.applications/02.docs/shellinabox/app_shellinabox.fr.md rename to pages/04.applications/10.docs/shellinabox/app_shellinabox.fr.md diff --git a/pages/02.applications/02.docs/shellinabox/app_shellinabox.md b/pages/04.applications/10.docs/shellinabox/app_shellinabox.md similarity index 100% rename from pages/02.applications/02.docs/shellinabox/app_shellinabox.md rename to pages/04.applications/10.docs/shellinabox/app_shellinabox.md diff --git a/pages/02.applications/02.docs/simple-torrent/app_simple-torrent.fr.md b/pages/04.applications/10.docs/simple-torrent/app_simple-torrent.fr.md similarity index 100% rename from pages/02.applications/02.docs/simple-torrent/app_simple-torrent.fr.md rename to pages/04.applications/10.docs/simple-torrent/app_simple-torrent.fr.md diff --git a/pages/02.applications/02.docs/simple-torrent/app_simple-torrent.md b/pages/04.applications/10.docs/simple-torrent/app_simple-torrent.md similarity index 100% rename from pages/02.applications/02.docs/simple-torrent/app_simple-torrent.md rename to pages/04.applications/10.docs/simple-torrent/app_simple-torrent.md diff --git a/pages/02.applications/02.docs/slingcode/app_slingcode.fr.md b/pages/04.applications/10.docs/slingcode/app_slingcode.fr.md similarity index 100% rename from pages/02.applications/02.docs/slingcode/app_slingcode.fr.md rename to pages/04.applications/10.docs/slingcode/app_slingcode.fr.md diff --git a/pages/02.applications/02.docs/slingcode/app_slingcode.md b/pages/04.applications/10.docs/slingcode/app_slingcode.md similarity index 100% rename from pages/02.applications/02.docs/slingcode/app_slingcode.md rename to pages/04.applications/10.docs/slingcode/app_slingcode.md diff --git a/pages/02.applications/02.docs/sogo/app_sogo.fr.md b/pages/04.applications/10.docs/sogo/app_sogo.fr.md similarity index 100% rename from pages/02.applications/02.docs/sogo/app_sogo.fr.md rename to pages/04.applications/10.docs/sogo/app_sogo.fr.md diff --git a/pages/02.applications/02.docs/sogo/app_sogo.md b/pages/04.applications/10.docs/sogo/app_sogo.md similarity index 100% rename from pages/02.applications/02.docs/sogo/app_sogo.md rename to pages/04.applications/10.docs/sogo/app_sogo.md diff --git a/pages/02.applications/02.docs/spip/app_spip.fr.md b/pages/04.applications/10.docs/spip/app_spip.fr.md similarity index 100% rename from pages/02.applications/02.docs/spip/app_spip.fr.md rename to pages/04.applications/10.docs/spip/app_spip.fr.md diff --git a/pages/02.applications/02.docs/spip/app_spip.md b/pages/04.applications/10.docs/spip/app_spip.md similarity index 100% rename from pages/02.applications/02.docs/spip/app_spip.md rename to pages/04.applications/10.docs/spip/app_spip.md diff --git a/pages/02.applications/02.docs/strut/app_strut.fr.md b/pages/04.applications/10.docs/strut/app_strut.fr.md similarity index 100% rename from pages/02.applications/02.docs/strut/app_strut.fr.md rename to pages/04.applications/10.docs/strut/app_strut.fr.md diff --git a/pages/02.applications/02.docs/strut/app_strut.md b/pages/04.applications/10.docs/strut/app_strut.md similarity index 100% rename from pages/02.applications/02.docs/strut/app_strut.md rename to pages/04.applications/10.docs/strut/app_strut.md diff --git a/pages/04.applications/10.docs/timemachine/app_timemachine.md b/pages/04.applications/10.docs/timemachine/app_timemachine.md new file mode 100644 index 00000000..f47d93b5 --- /dev/null +++ b/pages/04.applications/10.docs/timemachine/app_timemachine.md @@ -0,0 +1,27 @@ +--- +title: Time Machine +template: docs +taxonomy: + category: docs, apps +routes: + default: '/app_timemachine' +--- + +[![Install Time Machine with YunoHost](https://install-app.yunohost.org/install-with-yunohost.png)](https://install-app.yunohost.org/?app=timemachine) +[![Integration level](https://dash.yunohost.org/integration/timemachine.svg)](https://dash.yunohost.org/appci/app/timemachine) + + +### Index + +- [Useful links](#useful-links) + +**Time Machine** creates a Samba Network Drive on your server which can be used by your Mac to create Time Machine backups. The local instance is automatically discovered in Time Machine and shows up as `*.local` + + +To setup the drive so that it can be used over the internet, simply use the connection string sent to the admin user's email to connect via Finder (`Command + K` in Finder). Then the drive will show up as your domain/IP in Time Machine's Backup Disk list. + + +## Useful links + +* Application software repository: [https://github.com/YunoHost-Apps/timemachine_ynh](https://github.com/YunoHost-Apps/timemachine_ynh) +* Report a bug: [https://github.com/YunoHost-Apps/timemachine_ynh/issues](https://github.com/YunoHost-Apps/timemachine_ynh/issues) diff --git a/pages/02.applications/02.docs/transmission/app_transmission.fr.md b/pages/04.applications/10.docs/transmission/app_transmission.fr.md similarity index 100% rename from pages/02.applications/02.docs/transmission/app_transmission.fr.md rename to pages/04.applications/10.docs/transmission/app_transmission.fr.md diff --git a/pages/02.applications/02.docs/transmission/app_transmission.md b/pages/04.applications/10.docs/transmission/app_transmission.md similarity index 100% rename from pages/02.applications/02.docs/transmission/app_transmission.md rename to pages/04.applications/10.docs/transmission/app_transmission.md diff --git a/pages/02.applications/02.docs/ttrss/app_ttrss.fr.md b/pages/04.applications/10.docs/ttrss/app_ttrss.fr.md similarity index 100% rename from pages/02.applications/02.docs/ttrss/app_ttrss.fr.md rename to pages/04.applications/10.docs/ttrss/app_ttrss.fr.md diff --git a/pages/02.applications/02.docs/ttrss/app_ttrss.md b/pages/04.applications/10.docs/ttrss/app_ttrss.md similarity index 100% rename from pages/02.applications/02.docs/ttrss/app_ttrss.md rename to pages/04.applications/10.docs/ttrss/app_ttrss.md diff --git a/pages/04.applications/10.docs/ulogger/app_ulogger.md b/pages/04.applications/10.docs/ulogger/app_ulogger.md new file mode 100644 index 00000000..fd8f8b68 --- /dev/null +++ b/pages/04.applications/10.docs/ulogger/app_ulogger.md @@ -0,0 +1,52 @@ +--- +title: μlogger +template: docs +taxonomy: + category: docs, apps +routes: + default: '/app_ulogger' +--- + +![μlogger's logo](image://ulogger-logo.png?resize=100) + + +[![Install μlogger with YunoHost](https://install-app.yunohost.org/install-with-yunohost.png)](https://install-app.yunohost.org/?app=ulogger) +[![Integration level](https://dash.yunohost.org/integration/ulogger.svg)](https://dash.yunohost.org/appci/app/ulogger) + + +### Index + +- [Features](#features) +- [Configuration](#configuration) +- [Useful links](#useful-links) + +**μlogger** is a web application for real-time collection of geolocation data, tracks viewing and management. Together with a dedicated μlogger mobile client (*F-Droid Store*) it may be used as a complete self hosted server–client solution for logging and monitoring users' geolocation. + +## Features: +- simple +- allows live tracking +- track statistics +- altitudes graph +- multiple users +- user authentication +- Google Maps +- OpenLayers (OpenStreet and other layers) +- user preferences stored in cookies +- simple admin menu +- export tracks to gpx and kml +- import tracks from gpx + +## Configuration +- Edit `scripts/setup.php` script, enable it by setting `$enabled` value to `true` +- Open http://YOUR_HOST/scripts/setup.php page in your browser +- Follow instructions in setup script. It will add database tables and set up your μlogger user +- **Remember to remove or disable `scripts/setup.php` script** +- Log in with your new user on your host, +- You may also want to set your new user as an admin in config file `$admin_user = "";` + +## Useful links + +* Upstream app code repository: [https://github.com/bfabiszewski/ulogger-server](https://github.com/bfabiszewski/ulogger-server) +* Demo: [https://ulogger.lima.zone](https://ulogger.lima.zone) +* Application software repository: [https://github.com/YunoHost-Apps/ulogger_ynh](https://github.com/YunoHost-Apps/ulogger_ynh) +* Report a bug: [https://github.com/YunoHost-Apps/ulogger_ynh/issues](https://github.com/YunoHost-Apps/ulogger_ynh/issues) diff --git a/pages/02.applications/02.docs/unattended_upgrades/app_unattended_upgrades.fr.md b/pages/04.applications/10.docs/unattended_upgrades/app_unattended_upgrades.fr.md similarity index 100% rename from pages/02.applications/02.docs/unattended_upgrades/app_unattended_upgrades.fr.md rename to pages/04.applications/10.docs/unattended_upgrades/app_unattended_upgrades.fr.md diff --git a/pages/02.applications/02.docs/unattended_upgrades/app_unattended_upgrades.md b/pages/04.applications/10.docs/unattended_upgrades/app_unattended_upgrades.md similarity index 100% rename from pages/02.applications/02.docs/unattended_upgrades/app_unattended_upgrades.md rename to pages/04.applications/10.docs/unattended_upgrades/app_unattended_upgrades.md diff --git a/pages/02.applications/02.docs/vaultwarden/app_vaultwarden.fr.md b/pages/04.applications/10.docs/vaultwarden/app_vaultwarden.fr.md similarity index 100% rename from pages/02.applications/02.docs/vaultwarden/app_vaultwarden.fr.md rename to pages/04.applications/10.docs/vaultwarden/app_vaultwarden.fr.md diff --git a/pages/02.applications/02.docs/vaultwarden/app_vaultwarden.md b/pages/04.applications/10.docs/vaultwarden/app_vaultwarden.md similarity index 100% rename from pages/02.applications/02.docs/vaultwarden/app_vaultwarden.md rename to pages/04.applications/10.docs/vaultwarden/app_vaultwarden.md diff --git a/pages/02.applications/02.docs/wallabag2/app_wallabag2.fr.md b/pages/04.applications/10.docs/wallabag2/app_wallabag2.fr.md similarity index 100% rename from pages/02.applications/02.docs/wallabag2/app_wallabag2.fr.md rename to pages/04.applications/10.docs/wallabag2/app_wallabag2.fr.md diff --git a/pages/02.applications/02.docs/wallabag2/app_wallabag2.md b/pages/04.applications/10.docs/wallabag2/app_wallabag2.md similarity index 100% rename from pages/02.applications/02.docs/wallabag2/app_wallabag2.md rename to pages/04.applications/10.docs/wallabag2/app_wallabag2.md diff --git a/pages/02.applications/02.docs/weblate/app_weblate.fr.md b/pages/04.applications/10.docs/weblate/app_weblate.fr.md similarity index 100% rename from pages/02.applications/02.docs/weblate/app_weblate.fr.md rename to pages/04.applications/10.docs/weblate/app_weblate.fr.md diff --git a/pages/02.applications/02.docs/weblate/app_weblate.md b/pages/04.applications/10.docs/weblate/app_weblate.md similarity index 100% rename from pages/02.applications/02.docs/weblate/app_weblate.md rename to pages/04.applications/10.docs/weblate/app_weblate.md diff --git a/pages/04.applications/10.docs/webmin/app_webmin.md b/pages/04.applications/10.docs/webmin/app_webmin.md new file mode 100644 index 00000000..2e9b6257 --- /dev/null +++ b/pages/04.applications/10.docs/webmin/app_webmin.md @@ -0,0 +1,38 @@ +--- +title: Webmin +template: docs +taxonomy: + category: docs, apps +routes: + default: '/app_webmin' +--- + +![webmin's logo](image://webmin_logo.png?resize=100) + +[![Install Webmin with YunoHost](https://install-app.yunohost.org/install-with-yunohost.png)](https://install-app.yunohost.org/?app=webmin) [![Integration level](https://dash.yunohost.org/integration/webmin.svg)](https://dash.yunohost.org/appci/app/webmin) + +### Index + +- [Important information](#Important-Information) +- [Useful links](#useful-links) + + +## Overview + +Webmin is a web-based interface for system administration for Unix. Using any modern web browser, you can setup user accounts, Apache, DNS, file sharing and much more. Webmin removes the need to manually edit Unix configuration files like `/etc/passwd`, and lets you manage a system from the console or remotely. + +## Important information + +* This app has **root** access which can change core things in the system, thus **breaking the YunoHost**. Use it carefully and read the [documents](https://doxfer.webmin.com/Webmin/Main_Page) two times before changing values. +* Only **user** given permission at time of the installation can **access** the Webmin login interface +* To login to webmin, use root and root password +* Webmin will **update itself** when system updates are run. So no need to **run upgrade script** once installed. + + +## Useful links + +* Official app website: [http://www.webmin.com](http://www.webmin.com) +* Upstream app code repository: [https://github.com/webmin/webmin](https://github.com/webmin/webmin) +* YunoHost documentation for this app: [https://yunohost.org/app_webmin](https://yunohost.org/app_webmin) +* Report a bug: [https://github.com/YunoHost-Apps/webmin_ynh/issues](https://github.com/YunoHost-Apps/webmin_ynh/issues) + diff --git a/pages/02.applications/02.docs/webtrees/app_webtrees.fr.md b/pages/04.applications/10.docs/webtrees/app_webtrees.fr.md similarity index 100% rename from pages/02.applications/02.docs/webtrees/app_webtrees.fr.md rename to pages/04.applications/10.docs/webtrees/app_webtrees.fr.md diff --git a/pages/02.applications/02.docs/webtrees/app_webtrees.md b/pages/04.applications/10.docs/webtrees/app_webtrees.md similarity index 100% rename from pages/02.applications/02.docs/webtrees/app_webtrees.md rename to pages/04.applications/10.docs/webtrees/app_webtrees.md diff --git a/pages/02.applications/02.docs/wekan/app_wekan.fr.md b/pages/04.applications/10.docs/wekan/app_wekan.fr.md similarity index 100% rename from pages/02.applications/02.docs/wekan/app_wekan.fr.md rename to pages/04.applications/10.docs/wekan/app_wekan.fr.md diff --git a/pages/02.applications/02.docs/wekan/app_wekan.md b/pages/04.applications/10.docs/wekan/app_wekan.md similarity index 100% rename from pages/02.applications/02.docs/wekan/app_wekan.md rename to pages/04.applications/10.docs/wekan/app_wekan.md diff --git a/pages/02.applications/02.docs/wikijs/app_wikijs.fr.md b/pages/04.applications/10.docs/wikijs/app_wikijs.fr.md similarity index 100% rename from pages/02.applications/02.docs/wikijs/app_wikijs.fr.md rename to pages/04.applications/10.docs/wikijs/app_wikijs.fr.md diff --git a/pages/02.applications/02.docs/wikijs/app_wikijs.md b/pages/04.applications/10.docs/wikijs/app_wikijs.md similarity index 100% rename from pages/02.applications/02.docs/wikijs/app_wikijs.md rename to pages/04.applications/10.docs/wikijs/app_wikijs.md diff --git a/pages/02.applications/02.docs/wordpress/app_wordpress.fr.md b/pages/04.applications/10.docs/wordpress/app_wordpress.fr.md similarity index 100% rename from pages/02.applications/02.docs/wordpress/app_wordpress.fr.md rename to pages/04.applications/10.docs/wordpress/app_wordpress.fr.md diff --git a/pages/02.applications/02.docs/wordpress/app_wordpress.md b/pages/04.applications/10.docs/wordpress/app_wordpress.md similarity index 100% rename from pages/02.applications/02.docs/wordpress/app_wordpress.md rename to pages/04.applications/10.docs/wordpress/app_wordpress.md diff --git a/pages/04.applications/10.docs/writefreely/app_writefreely.md b/pages/04.applications/10.docs/writefreely/app_writefreely.md new file mode 100644 index 00000000..cf5c7086 --- /dev/null +++ b/pages/04.applications/10.docs/writefreely/app_writefreely.md @@ -0,0 +1,63 @@ +--- +title: WriteFreely +template: docs +taxonomy: + category: docs, apps +routes: + default: '/app_writefreely' +--- + +![WriteFreely's logo](image://writefreely-logo.png?height=100) + + +[![Install WriteFreely with YunoHost](https://install-app.yunohost.org/install-with-yunohost.png)](https://install-app.yunohost.org/?app=writefreely) +[![Integration level](https://dash.yunohost.org/integration/writefreely.svg)](https://dash.yunohost.org/appci/app/writefreely) + + +### Index + +- [Features](#features) +- [Important information](#important-information) +- [Useful links](#useful-links) + +**WriteFreely** is a clean, minimalist publishing platform made for writers. Start a blog, share knowledge within your organization, or build a community around the shared act of writing. + +## Features: +### Made for writing + +Built on a plain, auto-saving editor, WriteFreely gives you a distraction-free writing environment. Once published, your words are front and center, and easy to read. + +### A connected community + +Start writing together, publicly or privately. Connect with other communities, whether running WriteFreely, [Plume](https://yunohost.org/en/app_plume), or other ActivityPub-powered software. And bring members on board from your existing platforms, thanks to our OAuth 2.0 support. + +### Intuitive organization + +Categorize articles [with hashtags](https://writefreely.org/docs/latest/writer/hashtags), and create static pages from normal posts by [_pinning_ them](https://writefreely.org/docs/latest/writer/static) to your blog. Create draft posts and publish to multiple blogs from one account. + +### International + +Blog elements are localized in 20+ languages, and WriteFreely includes first-class support for non-Latin and right-to-left (RTL) script languages. + +### Private by default + +WriteFreely collects minimal data, and never publicizes more than a writer consents to. Writers can seamlessly create multiple blogs from a single account for different pen names or purposes without publicly revealing their association. + + + +## Important information: + +* **WriteFreely** require a dedicated **root domain**, eg. writefreely.domain.tld +* i386 architectures not supported +* No LDAP and no HTTP auth supported + +* If User Mode is configured Multiple users, the app be used by multiple users +* Additionals parameters can be configured in Settings / Admin settings. + +## Useful links + +* Official app website: [https://writefreely.org](https://writefreely.org) +* Official user documentation: [https://writefreely.org/start](https://writefreely.org/start) +* Upstream app code repository: [https://github.com/writeas/writefreely](https://github.com/writeas/writefreely) +* Application software repository: [https://github.com/YunoHost-Apps/writefreely_ynh](https://github.com/YunoHost-Apps/writefreely_ynh) +* Report a bug: [https://github.com/YunoHost-Apps/writefreely_ynh/issues](https://github.com/YunoHost-Apps/writefreely_ynh/issues) diff --git a/pages/02.applications/02.docs/writing_guide/app_writing_guide.fr.md b/pages/04.applications/10.docs/writing_guide/app_writing_guide.fr.md similarity index 100% rename from pages/02.applications/02.docs/writing_guide/app_writing_guide.fr.md rename to pages/04.applications/10.docs/writing_guide/app_writing_guide.fr.md diff --git a/pages/02.applications/02.docs/writing_guide/app_writing_guide.md b/pages/04.applications/10.docs/writing_guide/app_writing_guide.md similarity index 100% rename from pages/02.applications/02.docs/writing_guide/app_writing_guide.md rename to pages/04.applications/10.docs/writing_guide/app_writing_guide.md diff --git a/pages/04.applications/10.docs/yourls/app_yourls.md b/pages/04.applications/10.docs/yourls/app_yourls.md new file mode 100644 index 00000000..f5cdadc3 --- /dev/null +++ b/pages/04.applications/10.docs/yourls/app_yourls.md @@ -0,0 +1,40 @@ +--- +title: Yourls +template: docs +taxonomy: + category: docs, apps +routes: + default: '/app_yourls' +--- + +![Yourls's logo](image://yourls-logo.png?height=100) + + +[![Install Yourls with YunoHost](https://install-app.yunohost.org/install-with-yunohost.png)](https://install-app.yunohost.org/?app=yourls) +[![Integration level](https://dash.yunohost.org/integration/yourls.svg)](https://dash.yunohost.org/appci/app/yourls) + + +**YOURLS** stands for Your Own URL Shortener. It is a small set of PHP scripts that will allow you to run your own URL shortening service (a la TinyURL or bitly). + +Running your own URL shortener is fun, geeky and useful: you own your data and don't depend on third-party services. It's also a great way to add branding to your short URLs, instead of using the same public URL shortener everyone uses. + +### Index + +- [Features](#features) +- [Useful links](#useful-links) + +## Features: +- Private (your links only) or Public (everybody can create short links, fine for an intranet) +- Dozens of plugins to easily implement new features +- Handy bookmarklets to easily shorten and share links +- Awesome stats: historical click reports, referrers tracking, visitors geo-location +- Developer API to integrate YOURLS into other applications +- Sample files to create your own public interface + +## Useful links + +* Official app website: [https://yourls.org/](https://yourls.org/) +* Official admin documentation: [https://docs.yourls.org/](https://docs.yourls.org/) +* Upstream app code repository: [https://github.com/YOURLS/YOURLS](https://github.com/YOURLS/YOURLS) +* YunoHost documentation for this app: [https://yunohost.org/app_yourls](https://yunohost.org/app_yourls) +* Report a bug: [https://github.com/YunoHost-Apps/yourls_ynh/issues](https://github.com/YunoHost-Apps/yourls_ynh/issues) diff --git a/pages/02.applications/02.docs/yunofav/app_yunofav.fr.md b/pages/04.applications/10.docs/yunofav/app_yunofav.fr.md similarity index 100% rename from pages/02.applications/02.docs/yunofav/app_yunofav.fr.md rename to pages/04.applications/10.docs/yunofav/app_yunofav.fr.md diff --git a/pages/02.applications/02.docs/yunofav/app_yunofav.md b/pages/04.applications/10.docs/yunofav/app_yunofav.md similarity index 100% rename from pages/02.applications/02.docs/yunofav/app_yunofav.md rename to pages/04.applications/10.docs/yunofav/app_yunofav.md diff --git a/pages/02.applications/02.docs/zerobin/app_zerobin.fr.md b/pages/04.applications/10.docs/zerobin/app_zerobin.fr.md similarity index 100% rename from pages/02.applications/02.docs/zerobin/app_zerobin.fr.md rename to pages/04.applications/10.docs/zerobin/app_zerobin.fr.md diff --git a/pages/02.applications/02.docs/zerobin/app_zerobin.md b/pages/04.applications/10.docs/zerobin/app_zerobin.md similarity index 100% rename from pages/02.applications/02.docs/zerobin/app_zerobin.md rename to pages/04.applications/10.docs/zerobin/app_zerobin.md diff --git a/pages/02.applications/03.framasoft/apps_framasoft.fr.md b/pages/04.applications/15.framasoft/apps_framasoft.fr.md similarity index 100% rename from pages/02.applications/03.framasoft/apps_framasoft.fr.md rename to pages/04.applications/15.framasoft/apps_framasoft.fr.md diff --git a/pages/03.community/10.ngo/use_case_non-profit_organisations.ca.md b/pages/04.applications/20.app_bundle/05.ngo/use_case_non-profit_organisations.ca.md similarity index 99% rename from pages/03.community/10.ngo/use_case_non-profit_organisations.ca.md rename to pages/04.applications/20.app_bundle/05.ngo/use_case_non-profit_organisations.ca.md index 23deee39..8d878678 100644 --- a/pages/03.community/10.ngo/use_case_non-profit_organisations.ca.md +++ b/pages/04.applications/20.app_bundle/05.ngo/use_case_non-profit_organisations.ca.md @@ -9,6 +9,8 @@ page-toc: active: true --- +! TODO: this page should be updated. + L'objectiu d'aquest document és presentar un cas d'ús específic de [YunoHost](https://yunohost.org) per a organitzacions sense ànim de lucre. ## Qui diff --git a/pages/03.community/10.ngo/use_case_non-profit_organisations.fr.md b/pages/04.applications/20.app_bundle/05.ngo/use_case_non-profit_organisations.fr.md similarity index 99% rename from pages/03.community/10.ngo/use_case_non-profit_organisations.fr.md rename to pages/04.applications/20.app_bundle/05.ngo/use_case_non-profit_organisations.fr.md index 7d217971..787d3112 100644 --- a/pages/03.community/10.ngo/use_case_non-profit_organisations.fr.md +++ b/pages/04.applications/20.app_bundle/05.ngo/use_case_non-profit_organisations.fr.md @@ -9,6 +9,8 @@ page-toc: active: true --- +! TODO: cette page devrait être retravaillée. + L'objet de ce document est de présenter une utilisation spécifique de [YunoHost](https://yunohost.org/) pour des organisations à but non lucratif. ## Qui diff --git a/pages/03.community/10.ngo/use_case_non-profit_organisations.md b/pages/04.applications/20.app_bundle/05.ngo/use_case_non-profit_organisations.md similarity index 99% rename from pages/03.community/10.ngo/use_case_non-profit_organisations.md rename to pages/04.applications/20.app_bundle/05.ngo/use_case_non-profit_organisations.md index 0b585731..e477d492 100644 --- a/pages/03.community/10.ngo/use_case_non-profit_organisations.md +++ b/pages/04.applications/20.app_bundle/05.ngo/use_case_non-profit_organisations.md @@ -9,6 +9,8 @@ page-toc: active: true --- +! TODO: this page should be updated. + The purpose of this document is to present a specific use of [YunoHost](https://yunohost.org/) for non-profit organizations. ## Who diff --git a/pages/03.community/10.ngo/use_case_non-profit_organisations.oc.md b/pages/04.applications/20.app_bundle/05.ngo/use_case_non-profit_organisations.oc.md similarity index 99% rename from pages/03.community/10.ngo/use_case_non-profit_organisations.oc.md rename to pages/04.applications/20.app_bundle/05.ngo/use_case_non-profit_organisations.oc.md index 563c0fd7..842133bb 100644 --- a/pages/03.community/10.ngo/use_case_non-profit_organisations.oc.md +++ b/pages/04.applications/20.app_bundle/05.ngo/use_case_non-profit_organisations.oc.md @@ -9,6 +9,8 @@ page-toc: active: true --- +! TODO: this page should be updated. + L'objectiu d’aqueste document es de presentar una utilizacion especifica de [YunoHost](https://yunohost.org/) per d’organizacions sens tòca lucrativa. ## Qual diff --git a/pages/04.applications/20.app_bundle/app_bundle.md b/pages/04.applications/20.app_bundle/app_bundle.md new file mode 100644 index 00000000..52d238b4 --- /dev/null +++ b/pages/04.applications/20.app_bundle/app_bundle.md @@ -0,0 +1,12 @@ +--- +title: Application bundles +template: docs +taxonomy: + category: docs +routes: + default: '/bundles' +--- + +! TODO: this page needs to be written + +This page aims to list app bundles to answer to typical use cases. \ No newline at end of file diff --git a/pages/02.applications/04.wishlist/apps_wishlist.md b/pages/04.applications/99.wishlist/apps_wishlist.md similarity index 86% rename from pages/02.applications/04.wishlist/apps_wishlist.md rename to pages/04.applications/99.wishlist/apps_wishlist.md index d7cb2dbb..f7d30ff2 100644 --- a/pages/02.applications/04.wishlist/apps_wishlist.md +++ b/pages/04.applications/99.wishlist/apps_wishlist.md @@ -18,7 +18,6 @@ You can [contribute to this list by adding something you'd like to be packaged]( | 10er10 | 10er10 is an HTML5 audio jukebox | [Upstream](https://github.com/dready92/10er10) | | | [Access to Memory (AtoM)](https://www.accesstomemory.org/) | Web-based, open source application for standards-based archival description and access in a multilingual, multi-repository environment. | [Upstream](https://github.com/artefactual/atom) | | | adhocserver | An ad hoc server for the Sony PSP | | [Package Draft](https://github.com/matlink/adhocserver_ynh) | -| [agora](https://www.agora-project.net/) | Create collaborative and creative digital space | | [Package Draft](https://github.com/YunoHost-Apps/agora_ynh) | | [Ajenti](https://ajenti.org) | Ajenti is a Linux & BSD modular server admin panel | [Upstream](https://github.com/ajenti/ajenti/) | | | Akaunting | Manage payments/invoices/expenses | [Upstream](https://github.com/akaunting/akaunting) | | | Anki Sync Server | a personal Anki server |[Upstream](https://github.com/ankicommunity/anki-sync-server) | | @@ -28,8 +27,10 @@ You can [contribute to this list by adding something you'd like to be packaged]( | [askbot](https://askbot.com/) | Questions and answers | | [Package Draft](https://github.com/zamentur/askbot_ynh) | | [Archivematica](https://www.archivematica.org/) | Mature digital preservation system designed to maintain standards-based, long-term access to collections of digital objects. | [Upstream](https://github.com/artefactual/archivematica) | | | [ArchivesSpace](https://archivesspace.org/) | Archives information management application for managing and providing Web access to archives, manuscripts and digital objects. | [Upstream](https://github.com/archivesspace/archivesspace) | | +| [ass](https://github.com/tycrek/ass) | ass is a self-hosted ShareX upload server written in Node.js. |[Upstream](https://github.com/tycrek/ass)| | | [Astral](https://astralapp.com/) | Organize Your GitHub Stars With Ease |[Upstream](https://github.com/astralapp/astral)| | -| [Azuracast](https://https://azuracast.com/) | A Simple, Self-Hosted Web Radio Management Suite |[Upstream](https://github.com/AzuraCast/AzuraCast)| | +| [Azuracast](https://azuracast.com/) | A Simple, Self-Hosted Web Radio Management Suite |[Upstream](https://github.com/AzuraCast/AzuraCast)| | +| [Backstage.io](https://backstage.io/) | Open source Enterprise Developer Portal with Eco-System | [Upstream](https://github.com/backstage/backstage) | | | [Baserow](https://baserow.io/) | Open source no-code database tool and Airtable alternative. | [Upstream](https://gitlab.com/bramw/baserow) | | | [Beatbump](https://beatbump.ml/home) | An alternative frontend for YouTube Music | [Upstream](https://github.com/snuffyDev/Beatbump) | | | [Beeper](https://www.beeper.com/) | A unified inbox for 15 chat networks. | [Upstream](https://gitlab.com/beeper) | | @@ -41,22 +42,23 @@ You can [contribute to this list by adding something you'd like to be packaged]( | BTCPay Server | | [Upstream](https://github.com/btcpayserver/btcpayserver) | | | [Cactus Comments](https://cactus.chat/) | Federated comment system, to embed into your webpages, based on the Matrix protocol. | [Upstream](https://gitlab.com/cactus-comments) | [Package Draft](https://github.com/h3ndrik/cactus-comments_ynh) | | [Cagette](https://www.cagette.net/) | A marketplace for local farmers and producers | [Upstream](https://github.com/CagetteNet/cagette) | | -| [Calendso](https://calendso.com/) | Volunteer shift management and meeting scheduling | [Upstream](https://github.com/calendso) | | +| [Cal.com](https://cal.com/) | Formerly Calendso. Volunteer shift management and meeting scheduling. "The open source Calendly alternative." | [Upstream](https://github.com/calcom/cal.com) | | | [Caliopen](https://www.caliopen.org) | A unified inteface for all your private communications | | | | [cgit](https://git.zx2c4.com/cgit/about) | | | | | Chaskiq | A full featured Live Chat, Support & Marketing platform, alternative to Intercom, Drift, Crisp | [Upstream](https://github.com/chaskiq/chaskiq) | | | changedetection.io | Self-hosted open source change monitoring of web pages | [Upstream](https://github.com/dgtlmoon/changedetection.io) | | +| [Chatterbox](https://element.io/solutions/chatterbox-embedded-live-chat-for-customer-service) | Embedded live chat for customer service | [Upstream]([https://github.com/sourcegraph/checkup](https://github.com/vector-im/chatterbox)) | | | [CheckUp](https://sourcegraph.github.io/checkup) | | [Upstream](https://github.com/sourcegraph/checkup) | | | [Citadel-suite](https://www.citadel.org) | Groupware platform | | | | [CKAN](https://ckan.org/) | A tool for making open data websites | [Upstream](https://github.com/ckan/ckan) | | | [CloudTube](https://tube.cadence.moe/) | CloudTube front-end for YouTube | [Upstream](https://git.sr.ht/~cadence/cloudtube) | | -| [Cockpit](https://cockpit-project.org/) | | | [Package Draft](https://github.com/YunoHost-Apps/cockpit_ynh) | | Commafeed | | [Upstream](https://github.com/Athou/commafeed) | | | [Conduit](https://conduit.rs/) | Conduit is a lightweight open-source server implementation of the Matrix Specification with a focus on easy setup and low system requirements. | [Upstream](https://gitlab.com/famedly/conduit) | [Package Draft](https://github.com/YunoHost-Apps/conduit_ynh) | | cops | Calibre OPDS | | [Package Draft](https://github.com/YunoHost-Apps/cops_ynh) | | [Coquelicot](https://coquelicot.potager.org/) | A “one-click” file sharing web application | | [Package Draft](https://github.com/YunoHost-Apps/coquelicot_ynh) | | [Cozy](https://cozy.io/en/) | | | | | Croodle | Vote for a schedule / polling | [Upstream](https://github.com/jelhan/croodle) | | +| [Cusdis](https://cusdis.com/) | A lightweight, privacy-friendly comment system alternative to Disqus. |[Upstream](https://github.com/djyde/cusdis)| | | [CyberChef](https://www.giters.com/gchq/CyberChef) - The Cyber Swiss Army Knife | a web app for encryption, encoding, compression and data analysis | [Upstream](https://github.com/gchq/CyberChef) | | | [Darkwire.io](https://darkwire.io/) | End-to-end encrypted instant web chat | [Upstream](https://github.com/seripap/darkwire.io) | | | [Dataverse](https://dataverse.org) | Open source research data repository software | [Upstream](https://github.com/IQSS/dataverse) | | @@ -73,12 +75,15 @@ You can [contribute to this list by adding something you'd like to be packaged]( | [DomainMOD](https://domainmod.org) | Domain portfolio management application | | | | Dynette | Dynette is a dyndns server | [Upstream](https://github.com/YunoHost/dynette) | [Package Draft](https://github.com/YunoHost-Apps/dynette_ynh) | | DrakonHub | Online editor for Drakon diagrams | [Upstream](https://github.com/stepan-mitkin/drakonhub) | | -| [eLabFTW](https://www.elabftw.net/) | Electronic lab notebook | [Upstream](https://github.com/elabftw/elabftw) | [Package Draft](https://github.com/YunoHost-Apps/eLabFTW_ynh) | +| [Drawpile](https://drawpile.net) | Collaborative drawing program that allows multiple users to sketch on the same canvas simultaneously | [Upstream](https://github.com/drawpile/Drawpile) | | +| [Element Call](https://element.io/blog/element-call-beta-2-encryption-spatial-audio-walkie-talkie-mode-and-more/) | Showcase for full mesh video chat powered by Matrix | [Upstream](https://github.com/vector-im/element-call) | | | Endlessh | SSH Tarpit | [upstream](https://github.com/skeeto/endlessh) | | | [erine.email](https://erine.email/) | | [Upstream](https://gitlab.com/mdavranche/erine.email) | | | [ERPnext](https://erpnext.com/) | | [Upstream](https://github.com/frappe/erpnext) | | | [EteSync](https://www.etesync.com/) | | [Upstream](https://github.com/etesync) | | | [Excalibur](https://excalibur-py.readthedocs.io/en/master/) | A web interface to extract tabular data from PDFs (based on Camelot) | [Upstream](https://github.com/camelot-dev/excalibur) | | +| [Fab Manager](https://www.fab-manager.com/) | Simplify the daily management of your Third place/Fablab and boost your community | [Upstream](https://github.com/sleede/fab-manager) | | +| [Farside](https://farside.link/) | A redirecting service for FOSS alternative frontends | [Updtream](https://github.com/benbusby/farside) | | | [Federated wiki](http://fed.wiki.org/view/welcome-visitors/view/federated-wiki) | Farm for fedwiki sites | [Upstream](https://github.com/fedwiki) | | | [Ferdi server](https://getferdi.com) | Messaging aggregation | [Upstream](https://github.com/getferdi/server) | | | [FEX](https://fex.rus.uni-stuttgart.de/) | | | | @@ -97,16 +102,16 @@ You can [contribute to this list by adding something you'd like to be packaged]( | [Freescout](https://freescout.net/) | Helpdesk & Shared Mailbox | [Upstream](https://github.com/freescout-helpdesk/freescout) | | | [ftssolr](https://wiki.dovecot.org/Plugins/FTS/Solr) | Full-text search via IMAP through a Solr indexing server | | [Package Draft](https://github.com/YunoHost-Apps/ftssolr_ynh) | | [Gancio](https://gancio.org/) | | [Upstream](https://framagit.org/les/gancio) | | +| [Garage](https://garagehq.deuxfleurs.fr) | A self-hostable distributed storage service (S3 compatible) | [Upstream](https://git.deuxfleurs.fr/Deuxfleurs/garage) | | | gateone | HTML5-powered terminal emulator and SSH client | | [Package Draft](https://github.com/Kloadut/gateone_ynh) | | [Gatsby](https://www.gatsbyjs.com/) | Build blazing fast, modern apps and websites with React | [Upstream](https://github.com/gatsbyjs/gatsby) | | | [Geneweb](https://geneweb.tuxfamily.org) | | [Upstream](https://github.com/geneweb/geneweb) | | -| GetSimple CMS | | [Upstream](https://github.com/GetSimpleCMS/GetSimpleCMS) | | | gitolite | Git server | | [Package Draft](https://github.com/matlink/gitolite_ynh) | | gitrepositories | | | [Package Draft](https://github.com/YunoHost-Apps/gitrepositories_ynh) | | gitweb | Git forge (c.f. Gitolite) | | [Package Draft](https://github.com/matlink/gitweb_ynh) | -| glpi | Create a beautiful blog or website easily | | [Package Draft](https://github.com/YunoHost-Apps/glpi_ynh) | | gnusocial | Create a federated comunication node | | [Package Draft](https://github.com/YunoHost-Apps/gnusocial_ynh) | | [Goaccess](https://goaccess.io) | Web log analyzer | [Upstream](https://github.com/allinurl/goaccess) | | +| [GoatCounter](https://www.goatcounter.com/) | privacy-friendly web analytics | [Upstream](https://github.com/arp242/goatcounter) | | | gogs_webhost | Turn a Gogs repository to static web hosting | | [Package Draft](https://github.com/YunoHost-Apps/gogs_webhost_ynh) | | Gollum | A simple Git-powered wiki | [Upstream](https://github.com/gollum/gollum) | [Package Draft](https://github.com/YunoHost-Apps/gollum_ynh) | | Goploader | | [Upstream](https://github.com/Depado/goploader) | | @@ -115,11 +120,11 @@ You can [contribute to this list by adding something you'd like to be packaged]( | [Greenlight](https://blabla.aquilenet.fr/b) | A really simple end-user interface for your BigBlueButton server | [Upstream](https://github.com/bigbluebutton/greenlight) | | | [Grist](https://www.getgrist.com/) | The evolution of spreadsheets | [Upstream](https://github.com/gristlabs/grist-core/) | | | [Habitica](https://habitica.com/) | | [Upstream](https://github.com/HabitRPG/habitica) | | +| [Hashbase](https://github.com/beakerbrowser/hashbase/tree/master/docs) | A public peer service for Dat archives, provides a HTTP-accessible interface for creating an account and uploading Dats. | [Upstream](https://github.com/beakerbrowser/hashbase) | | | Helpy | | [Upstream](https://github.com/helpyio/helpy) | | | [Hexo](https://hexo.io/) | | [Upstream](https://github.com/hexojs/hexo) | | -| Hometown | | [Upstream](https://github.com/hometown-fork/hometown) | | +| Hometown | A Mastodon fork with local-only posting, support for more content types, and other features and tweaks. | [Upstream](https://github.com/hometown-fork/hometown) | | | [htpc-manager](https://htpc.io) | Manage your HTPC from anywhere | | [Package Draft](https://github.com/scith/htpc-manager_ynh) | -| huginn | Build agents that monitor and act on your behalf | | [Package Draft](https://github.com/YunoHost-Apps/huginn_ynh) | | [Icecast 2](https://www.icecast.org) | | [Upstream](https://gitlab.xiph.org/xiph/icecast-server/) | | | [ikiwiki](https://ikiwiki.info) | | | | | [Inventaire](https://inventaire.io) | a libre collaborative resource mapper powered by open-knowledge, starting with books! 📚 | [Upstream](https://github.com/inventaire/inventaire) | | @@ -146,9 +151,7 @@ You can [contribute to this list by adding something you'd like to be packaged]( | [LibreTranslate](https://libretranslate.com/) | Translation API | [Upstream](https://github.com/uav4geo/LibreTranslate) | [Package Draft](https://github.com/YunoHost-Apps/libretranslate_ynh) | | [Lila](https://lichess.org/) | Online chess game server | [Upstream](https://github.com/ornicar/lila) | | | [Lingva Translate](https://lingva.ml/) | Alternative front-end for Google Translate | [Upstream](https://github.com/TheDavidDelta/lingva-translate) | | -| linuxdash | Low-overhead monitoring web dashboard | [Upstream](https://github.com/afaqurk/linux-dash) | [Package Draft](https://github.com/YunoHost-Apps/linuxdash_ynh) | | [LiquidSoap](https://www.liquidsoap.info/) | Audio and video streaming language | [Upstream](https://github.com/savonet/liquidsoap) | | -| [listmonk](https://listmonk.app) | Self-hosted newsletter & mailing list manager | [Upstream](https://github.com/knadh/listmonk) | | | LocomotiveCMS | | [Upstream](https://github.com/locomotivecms/engine) | | | [Logitech Media Server](https://en.wikipedia.org/wiki/Logitech_Media_Server) | (formerly SlimServer, SqueezeCenter and Squeezebox Server) is a streaming audio server | [Debian package](http://mysqueezebox.com/download) [Source](https://github.com/Logitech/slimserver) | [Package Draft](https://github.com/lunarok/squeezebox_ynh) | | [Loki](https://docs.loki.network/ServiceNodes/DebianPackageGuide/)| Service node for the Loki Network | [Upstream](https://github.com/loki-project/) | | @@ -156,12 +159,14 @@ You can [contribute to this list by adding something you'd like to be packaged]( | [MaidSafe](https://maidsafe.net) | | [Upstream](https://github.com/maidsafe) | | | [Mailpile](https://www.mailpile.is) | | [Upstream](https://github.com/mailpile/Mailpile) | | | [Mailtrain](https://mailtrain.org/) | | [Upstream](https://github.com/Mailtrain-org/mailtrain) | | -| mediadrop | Video Platform | | [Package Draft](https://github.com/YunoHost-Apps/mediadrop_ynh) | | [Mealie](https://hay-kot.github.io/mealie/) | Recipe manager and meal planner | [Upstream](https://github.com/hay-kot/mealie/) | | | [Mediagoblin](https://mediagoblin.org/) | Video streaming platform | [Upstream](https://savannah.gnu.org/projects/mediagoblin) | [Package Draft](https://github.com/YunoHost-Apps/mediagoblin_ynh) | | [medusa](https://pymedusa.com/) | Automatic TV shows downloader | | [Package Draft](https://github.com/YunoHost-Apps/medusa_ynh) | | [Megaglest](https://megaglest.org/) | realtime stategy game | [Upstream](https://megaglest.org/linux-packages.html) | | | microblog.pub | | [Upstream](https://github.com/tsileo/microblog.pub) | | +| [Meshery](https://meshery.io/) | Cloudnative solution to bind multiple Service-Meshes together, not only K8s | [Upstream](https://github.com/meshery/meshery) | | +| meteor-movielist | An open source web app for managing movie lists built with self-hosting in mind. Movie information is fetched from TMDb. | [Upstream](https://github.com/nunof07/meteor-movielist) | | +| [Mindustry](https://mindustrygame.github.io/) | A sandbox tower-defense game | [Upstream](https://github.com/Anuken/Mindustry) | | | [Mirakel](https://mirakel.azapps.de/taskwarrior.html) | | [Upstream](https://github.com/GothenburgBitFactory/taskwarrior) | | | modernpaste | A modern, feature-rich Pastebin alternative | [Upstream](https://github.com/LINKIWI/modern-paste) | [Package Draft](https://github.com/YunoHost-Apps/modernpaste_ynh) | | [Modoboa](https://modoboa.org) | | [Upstream](https://github.com/modoboa/) | | @@ -175,28 +180,27 @@ You can [contribute to this list by adding something you'd like to be packaged]( | mx-puppet-discord | A bridge between Matrix and Discord | [Upstream](https://github.com/matrix-discord/mx-puppet-discord) | | | [Nautilus](https://myactivity.stream/) | Turn your website into an ActivityPub profile | [Upstream](https://github.com/aaronpk/Nautilus) | | | Netrunner | | [Upstream](https://github.com/mtgred/netrunner) | | +| [Netbird](https://netbird.io/) | Create an overlay peer-to-peer network connecting machines regardless of their location | [Upstream](https://github.com/netbirdio/netbird) | | +| [NewsBlur](https://www.newsblur.com) | This is the most complete RSS reader that exists to date | [Upstream](https://github.com/samuelclay/NewsBlur) | | | nexusoss | Sonatype Nexus Repository manager OSS | | [Package Draft](https://github.com/YunoHost-Apps/nexusoss_ynh) | | [ntopng](https://www.ntop.org/) | | | [Package Draft](https://github.com/YunoHost-Apps/ntopng_ynh) | | OhMyForm | | [Upstream](https://github.com/ohmyform) | | | Ombi | | [Upstream](https://github.com/tidusjar/Ombi) | | +| [Omnivore](https://omnivore.app) | Omnivore is a complete, open source read-it-later solution for people who like reading. | [Upstream](https://github.com/omnivore-app/omnivore) | | | [OpenBazaar](https://openbazaar.org) | | [Upstream](https://github.com/openbazaar) | | | [OpenCart](https://www.opencart.com) | | [Upstream](https://github.com/opencart/opencart) | | | [OpenEats](https://open-eats.github.io/) | | [Upstream](https://github.com/open-eats/OpenEats) | | | [openHAB](https://www.openhab.org/) | Smart home platform | [Upstream](https://github.com/openhab) | | | openid-simplesamlphp | OpenID provider based on SimpleSAMLphp | | [Package Draft](https://github.com/julienmalik/openid-simplesamlphp_ynh) | -| openproject | | [Upstream](https://github.com/opf/openproject) | [Package Draft](https://github.com/moutonjr/openproject_ynh) | | OpenSourceBilling | | [Upstream](https://github.com/vteams/open-source-billing) | | -| [osjs](https://www.os-js.org/) | Desktop you have access to through your web-browser | | [Package Draft](https://github.com/YunoHost-Apps/osjs_ynh) | | [osmw](https://www.openstreetmap.org/) | Cartography software | | [Package Draft](https://github.com/YunoHost-Apps/osmw_ynh) | | OSRM | | [Upstream](https://github.com/Project-OSRM/osrm-backend) | | | [OX Open-Xchange](https://www.open-xchange.com) | Linux groupware solution | [Upstream](https://github.com/open-xchange/) | | -| [OverLeaf](https://github.com/overleaf/overleaf) | open-source online real-time collaborative LaTeX editor | [Upstream](https://github.com/overleaf/overleaf) | [Package Draft](https://github.com/YunoHost-Apps/overleaf_ynh) | | [Padloc](https://padloc.app/) | Simple, secure password and data management for individuals and teams | [Upstream](https://github.com/padloc/padloc) | | | Paperless-ng | | [Upstream](https://github.com/jonaswinkler/paperless-ng) | | | [Paperwork](https://paperwork.cloud) | | [Upstream](https://github.com/paperwork/paperwork) | | | [Passbolt](https://www.passbolt.com) | Password manager | [Upstream](https://github.com/passbolt) | | | Pelias | | [Upstream](https://github.com/pelias/pelias) | | -| Pelican | Pelican Static Site Generator | | [Package Draft](https://github.com/YunoHost-Apps/pelican_ynh) | | [Penpot](https://penpot.app/) | Design Freedom for Teams | [Upstream](https://github.com/penpot) | | | personal-management-system | Your web application for managing personal data. | [Upstream](https://github.com/Volmarg/personal-management-system) | | | [Photoprism](https://photoprism.org/) | | [Upstream](https://github.com/photoprism/photoprism) | | @@ -204,8 +208,8 @@ You can [contribute to this list by adding something you'd like to be packaged]( | [Phraseanet](https://docs.phraseanet.com/3.8/fr/index.html#) | | [Upstream](https://github.com/alchemy-fr/Phraseanet-Docs) | | | [pia](https://github.com/LINCnil/pia) | A tool to help carrying out Privacy Impact Assessments | | [Package Draft](https://github.com/YunoHost-Apps/pia_ynh) | | [PicApport](https://www.picapport.de/) | Self-hosted private photo server | | | -| Pico | | [Upstream](https://github.com/picocms/Pico) | | | [Pinry](https://docs.getpinry.com/) | Open source tiling image board | [Upstream](https://github.com/pinry/pinry/) | | +| [Piped](https://github.com/TeamPiped/Piped/wiki/Instances) | An open-source alternative frontend for YouTube which is efficient by design. | [Upstream](https://github.com/TeamPiped/Piped) | | | Pol | RSS generator website | [Upstream](https://github.com/taroved/pol) | | | [Planka](https://planka.app/) | Free open source kanban board for workgroups. | [Upstream](https://github.com/plankanban/planka) | | | [Plausible Analytics](https://plausible.io) | Simple, Open Source, and privacy-friendly web analytics alternative to Google Analytics. | [Upstream](https://github.com/plausible/analytics) | | @@ -216,18 +220,17 @@ You can [contribute to this list by adding something you'd like to be packaged]( | [ProcessMaker](https://www.processmaker.com) | | | | | proftpd | | | [Package Draft](https://github.com/abeudin/proftpd_ynh) | | ProtonMail’s WebClient | | [Upstream](https://github.com/ProtonMail/WebClient) | | -| [psitransfer](https://psi.cx/tags/PsiTransfer/) | Transfer files or images without problems | | [Package Draft](https://github.com/YunoHost-Apps/psitransfer_ynh) | | [pterodactyl](https://pterodactyl.io/) | | | [Package Draft](https://github.com/YunoHost-Apps/pterodactyl_ynh) | -| [pufferpanel](https://emby.media/) | | | [Package Draft](https://github.com/YunoHost-Apps/pufferpanel_ynh) | | Pump.io | File sharing and synchronization | [Upstream](https://github.com/pump-io/pump.io) | | -| [pyload](https://pyload.net/) | | [Upstream](https://github.com/pyload/pyload) | [Package Draft](https://github.com/YunoHost-Apps/pyload_ynh) | | [qBit MatUI](https://qbit-material-webui-demo.herokuapp.com/) | A WebUI for qBittorrent | [Upstream](https://github.com/bill-ahmed/qbit-matUI) | | | [qBittorrent](https://www.qbittorrent.org/) | | [Upstream](https://github.com/qbittorrent/qBittorrent) | | +| [QGis server](https://qgis.org/fr/site/) | QGis server allows to publish QGis desktop projets and maps as OGC-compliant services, that can be used in openlayers, leaflet etc. | [Upstream](https://github.com/qgis/QGIS) | | +| [QWC2](https://github.com/qgis/qwc2) | QWC (Qgis Web Client) is a react and openlayers-based web UI to publish and display qgis desktop projects. | [Upstream](https://github.com/qgis/qwc2) | | | [racktables](https://racktables.org) | | [Upstream](https://github.com/RackTables/racktables) | | | Race for the galaxy | | [Upstream](https://github.com/bnordli/rftg) | | +| [Raindrop](https://raindrop.io) | All-in-one bookmark manager | [Upstream](https://github.com/raindropio/app) | | | [Raspap](https://raspap.com/) | | [Upstream](https://github.com/RaspAP/raspap-webgui) | | | Redash | Connect to any data source, easily visualize, dashboard and share your data. | [Upstream](https://github.com/getredash/redash) | | -| [redmine](https://www.redmine.org/) | A flexible project management web application | | [Package Draft](https://github.com/YunoHost-Apps/redmine_ynh) | | remoteStorage | A remoteStorage server implementation written in PHP | [Upstream](https://github.com/fkooman/php-remote-storage) | [Package Draft](https://github.com/YunoHost-Apps/RemoteStorage_ynh) | | [Request Tracker](https://bestpractical.com) | | [Upstream](https://github.com/bestpractical/rt) | | | [Restya](https://restya.com) | | [Upstream](https://github.com/RestyaPlatform/board/) | | @@ -238,25 +241,27 @@ You can [contribute to this list by adding something you'd like to be packaged]( | rs-short | An URL shortener | [Upstream](https://git.42l.fr/42l/rs-short) | | | RSS-proxy | RSS-proxy allows you to do create an RSS or ATOM feed of almost any website, just by analyzing just the static HTML structure. | [Upstream](https://github.com/damoeb/rss-proxy) | | | RSSHub | open source, easy to use, and extensible RSS feed generator. It's capable of generating RSS feeds from pretty much everything | [Upstream](https://github.com/DIYgod/RSSHub) | | -| [RustDesk](https://rustdesk.com/server 'RustDesk Server') | [TeamViewer](https://teamviewer.com) alternative | [Upstream](https://github.com/rustdesk/rustdesk-server 'RustDesk Server on GitHub') | | +| [RustDesk](https://rustdesk.com/server 'RustDesk Server') | [TeamViewer](https://teamviewer.com) alternative | [Upstream](https://github.com/rustdesk/rustdesk-server 'RustDesk Server on GitHub') and [easy install script](https://github.com/dinger1986/rustdeskinstall) | | | rutorrent | Torrent client | | [Package Draft](https://github.com/CotzaDev/rutorrent_ynh) | | rwtxt | Minimalist CMS | [Upstream](https://github.com/schollz/rwtxt) | | | [sat](https://salut-a-toi.org) | An all-in-one tool to manage all your communications | | [Package Draft](https://github.com/YunoHost-Apps/sat_ynh) | | [ScenariChain-server](https://download.scenari.software/SCENARIchain-server/) | | | | | [Schleuder](https://schleuder.org/schleuder/docs/concept.html) | A GPG-enabled mailing list manager | | | | scm-manager | Share and manage Git, Mercurial and Subversion repositories | | [Package Draft](https://github.com/drfred1981/scm-manager_ynh) | +| [Scribe](https://scribe.rip/) | An alternative frontend to Medium | [Upstream](https://git.sr.ht/~edwardloveall/scribe) | | | [Scuttlebutt Pub](https://www.scuttlebutt.nz/contributing) | | | | | [SearXNG](https://searxng.github.io/searxng/) | Fork of SearX, a privacy-respecting metasearch engine | [Upstream](https://github.com/searxng/searxng) | | | [seenthis](https://www.seenthis.net/) | Short-blogging destiné à la veille d’actualité | | [Package Draft](https://github.com/magikcypress/seenthis_ynh) | | [Semantic MediaWiki](https://www.semantic-mediawiki.org/wiki/Semantic_MediaWiki) | lets you store and query data with­in the [MediaWiki](https://en.wikipedia.org/wiki/MediaWiki)'s pages | [Upstream](https://github.com/SemanticMediaWiki/SemanticMediaWiki) | | | [shadowsocks](https://shadowsocks.org) | A SOCKS5 proxy to protect your Internet traffic | | [Package Draft](https://github.com/YunoHost-Apps/shadowsocks_ynh) | | shinken | A flexible and scalable monitoring framework | [Upstream](https://github.com/naparuba/shinken) | [Package Draft](https://github.com/YunoHost-apps/shinken_ynh) | -| shuri | URL Shortener | [Upstream](https://github.com/pips-/shuri) | [Package Draft](https://github.com/YunoHost-Apps/shuri_ynh) | | sickbeard | Automatic TV show downloader | | [Package Draft](https://github.com/YunoHost-Apps/sickbeard_ynh) | | [sickrage](https://sickchill.github.io/) | Automatic TV shows downloader | | [Package Draft](https://github.com/YunoHost-Apps/sickrage_ynh) | | [Signal Proxy](https://signal.org/blog/help-iran-reconnect/) | Fight censorship and bypass traffic securely to the Signal service | [Upstream](https://github.com/signalapp/Signal-TLS-Proxy) | | +| [Signature PDF](https://pdf.24eme.fr) | A free open source online PDF signing software | [Upstream](https://github.com/24eme/signaturepdf) | [Package Draft](https://github.com/YunoHost-Apps/signaturepdf_ynh) | | simpad | Simple markdown editor | [Upstream](https://github.com/beli3ver/SiMPad) | [Package Draft](https://github.com/YunoHost-Apps/simpad_ynh) | | [SimpleLogin](https://simplelogin.io) | Privacy-first e-mail forwarding and identity provider service | [Upstream](https://github.com/simple-login/app) | | +| [SimplyTranslate-Web](https://simplytranslate.org/) | This is a simple web interface for SimplyTranslate | [Upstream](https://codeberg.org/SimpleWeb/SimplyTranslate-Web) | | | [smokeping](https://oss.oetiker.ch/smokeping/) | | [Upstream](https://github.com/oetiker/SmokePing) | | | [SocialHome](https://socialhome.network) | A federated personal profile | [Upstream](https://github.com/jaywink/socialhome) | | | [sonerezh](https://www.sonerezh.bzh) | Stream music from everywhere | | [Package Draft](https://github.com/YunoHost-Apps/sonerezh_ynh) | @@ -264,7 +269,9 @@ You can [contribute to this list by adding something you'd like to be packaged]( | sphinx | | [Upstream](https://github.com/sphinx-doc/sphinx) | [Package Draft](https://github.com/YunoHost-Apps/sphinx_ynh) | | [Stackedit](https://stackedit.io) | | [Upstream](https://github.com/benweet/stackedit) | | | [Storj](https://www.storj.io/node) | | [Upstream](https://github.com/storj/storj) | | +| [Strapi](https://strapi.io) | Open source Node.js Headless CMS to easily build customisable APIs | [Upstream](https://github.com/strapi/strapi) | | | Streisand | | [Upstream](https://github.com/jlund/streisand) | | +| [Stremio](https://strem.io) Web | a modern media center. | [Upstream frontend](https://github.com/Stremio/stremio-web) [Upstream backend](https://github.com/Stremio/stremio-core-web) | | | studs | A survey tool, the ancestor of OpenSondage | | [Package Draft](https://github.com/YunoHost-Apps/studs_ynh) | | subsonic | Subsonic is an open source, web-based media server | | [Package Draft](https://github.com/drfred1981/subsonic_ynh) | | Subspace | A simple WireGuard VPN server GUI | [Upstream](https://github.com/subspacecloud/subspace) | | @@ -308,6 +315,8 @@ You can [contribute to this list by adding something you'd like to be packaged]( | [WebThings Gateway](https://iot.mozilla.org/gateway/) | | [Upstream](https://github.com/mozilla-iot/) | | | Whoogle | A metasearch engine | [Upstream](https://github.com/benbusby/whoogle-search) | | | [Wikiless](https://wikiless.org/) | A free open source alternative Wikipedia front-end focused on privacy. | [Upstream](https://codeberg.org/orenom/wikiless) | | +| [WikiSuite](https://wikisuite.org/Software) | The most comprehensive and integrated Open Source enterprise solution. | [Upstream](https://gitlab.com/wikisuite) | | +| [Winter CMS](https://wintercms.com/) | Powerful Laravel based CMS | | | | [wildfly](https://wildfly.org) | | | [Package Draft](https://github.com/YunoHost-Apps/wildfly_ynh) | | Wisemapping | An online mind mapping editor | [Upstream](https://bitbucket.org/wisemapping/wisemapping-open-source) | [Package Draft](https://github.com/YunoHost-Apps/wisemapping_ynh) | | WildDuck | Opinionated email server | [Upstream](https://github.com/nodemailer/wildduck) | | diff --git a/pages/04.contribute/04.packaging_apps/12.hooks/packaging_apps_hooks.fr.md b/pages/04.contribute/04.packaging_apps/12.hooks/packaging_apps_hooks.fr.md deleted file mode 100644 index 892091b6..00000000 --- a/pages/04.contribute/04.packaging_apps/12.hooks/packaging_apps_hooks.fr.md +++ /dev/null @@ -1,199 +0,0 @@ ---- -title: Hooks -template: docs -taxonomy: - category: docs -routes: - default: '/packaging_apps_hooks' ---- - -Les hooks permettent de déclencher un script lorsqu'une action est effectuée par le système. -Le cas le plus évident, est l'ajout d'un utilisateur. Si l'app dispose d'un hook `post_user_create`, ce hook sera déclenché dés qu'un utilisateur sera ajouté. -Cela permet donc à une application d'exécuter des actions en fonction des évènements intervenant sur le système. - -### Liste des hooks disponibles - -- `post_domain_add` -Après l'ajout d'un domaine. -- `post_domain_remove` -Après la suppression d'un domaine. -- `post_user_create` -Après l'ajout d'un utilisateur. -- `post_user_delete` -Après la suppression d'un utilisateur. -- `post_iptable_rules` -Après le rechargement du parefeu. -- `pre_backup_delete` -Avant la suppression d'un backup. -- `post_backup_delete` -Après la suppression d'un backup. -- `post_app_addaccess` -Après l'ajout d'un utilisateur autorisé sur une application. -- `post_app_removeaccess` -Après la suppression de l'autorisation d'un utilisateur sur une application. -- `post_app_clearaccess` -Après l'effacement de toute les règles d'accès sur une application. -- `post_app_install` -Après l'installation d'une application. -- `post_app_upgrade` -Après l'upgrade d'une application. -- `post_app_remove` -Après la supression d'une application. -- `post_app_change_url` -Après avoir modifié le chemin et/ou le nom de domaine d'une application. -- `post_cert_update` -Après la mise à jour d'un certificat. -- `conf_regen` -Avant et après la régénération de la configuration d'un service. -Services pris en charge par `regen-conf` : - - avahi-daemon - - dnsmasq - - dovecot - - fail2ban - - glances - - metronome - - mysql - - nginx - - nslcd - - nsswitch - - postfix - - rspamd - - slapd - - ssh - - ssl - -### Mise en place des hooks - -À l'exception du hook `conf_regen`, tout les hooks s'utilisent de la même manière. -Tout d'abord, il faut comprendre qu'un hook est un simple script bash qui sera exécuté par YunoHost lorsque l'évènement indiqué se présentera. -Pour ajouter un hook à YunoHost, il faut utiliser un dossier "hooks" à la racine du package de l'application. Puis dans celui-ci mettre votre script sous le nom du hook correspondant. - -> Par exemple : -Pour un hook `post_user_create`, le script qui devra être exécuté pour ce hook doit simplement être placé dans `hooks/post_user_create` dans le package. - -Lors de l'installation et de l'upgrade, les scripts dans le dossier hooks seront dupliqués dans le dossier `/etc/yunohost/hooks.d/` dans le dossier correspondant au hook, puis sous le nom `50-$app`. -Lors de la suppression de l'application, tous les hooks lui appartenant seront supprimés. - -### Construire un script de hook - -En tant que script bash, un script de hook doit commencer par le shebang bash - -```bash -#!/bin/bash -``` - -Ensuite il convient de prendre les arguments donnés par YunoHost lors de l'appel du script. -Chaque hook propose des arguments différents. - -##### `post_domain_add` et `post_domain_remove` - -```bash -domain=$1 -``` - -##### `post_user_create` - -```bash -username=$1 -mail=$2 -password=$3 # Clear password -firstname=$4 -lastname=$5 -``` -##### `post_user_delete` - -```bash -username=$1 -purge=$2 # True/False Indique si le dossier utilisateur a été supprimé ou pas. -``` - -##### `post_iptable_rules` - -```bash -upnp=$1 # True/False Indique si l'UPnP est activé ou non. -ipv6=$2 # True/False Indique si l'IPV6 est activé ou non. -``` - -##### `pre_backup_delete` et `post_backup_delete` - -```bash -backup_name=$1 -``` - -##### `post_app_install`, `post_app_upgrade`, `post_app_remove` et `post_app_change_url` - -Les variables utilisables dans ces scripts sont les mêmes que celles disponibles dans [les scripts d'actions associés](/packaging_apps_scripts). - - -Exemple : pour `post_app_install` les variables sont les mêmes que pour le script `install` - -##### `post_app_addaccess` et `post_app_removeaccess` - -```bash -app_id=$1 -users=$2 # Tous les utilisateurs autorisés sur l'app. Séparés par des virgules. -``` - -##### `post_app_clearaccess` - -```bash -app_id=$1 -``` - -##### `post_cert_update` -```bash -domain=$1 -``` - -La suite du script dépend de ce que vous voulez effectuer dans celui-ci. - -### Cas particulier de `conf_regen` -Le hook `conf_regen` est un hook plus délicat, que ce soit pour sa mise en place ou pour son contenu. - -##### Mise en place d'un hook `conf_regen` - -Un hook `conf_regen` ne doit pas être placé dans le dossier hooks de l'application. Il doit être mis en place manuellement. -Le hook doit être copié en indiquant à quel service il est lié. -```bash -cp hook_regen_conf /usr/share/yunohost/hooks/conf_regen/50-SERVICE_$app -``` - -> Lors de la suppression de l'application, ce hook devra être supprimé manuellement. - -##### Construire un script de hook conf_regen - -Un hook `conf_regen` est appelé 2 fois, une première fois après analyse de la configuration et avant une éventuelle modification des fichiers, puis une seconde fois après application des modifications, s' il y a eu des modifications. - -Un script de hook `conf_regen` devrait donc ressembler à ça : - -```bash -#!/bin/bash - -force=${2:-0} # 0/1 --force argument -dryrun=${3:-0} # 0/1 --dry-run argument -pending_conf=$4 # Path of the pending conf file - -do_pre_regen() { - # Put your code here for pre regen conf. -} - -do_post_regen() { - # Put your code here for post regen conf. - # Be careful, this part will be executed only if the configuration has been modified. -} - -case "$1" in - pre) - do_pre_regen - ;; - post) - do_post_regen - ;; - *) - echo "Hook called with unknown argument \`$1'" >&2 - exit 1 - ;; -esac - -exit 0 -``` diff --git a/pages/04.contribute/04.packaging_apps/12.hooks/packaging_apps_hooks.md b/pages/04.contribute/04.packaging_apps/12.hooks/packaging_apps_hooks.md deleted file mode 100644 index 16056b85..00000000 --- a/pages/04.contribute/04.packaging_apps/12.hooks/packaging_apps_hooks.md +++ /dev/null @@ -1,198 +0,0 @@ ---- -title: Hooks -template: docs -taxonomy: - category: docs -routes: - default: '/packaging_apps_hooks' ---- - -Hooks allow you to trigger a script when an action is performed by the system. -The most obvious case is adding a user. If the app has a `post_user_create` hook, this hook will be triggered as soon as a user is added. -Therefore, this allows an application to execute actions based on events occurring on the system. - -### List of available hooks - -- `post_domain_add` -After adding a domain. -- `post_domain_remove` -After deleting a domain. -- `post_user_create` -After adding a user. -- `post_user_delete` -After deleting a user. -- `post_iptable_rules` -After reloading the firewall. -- `pre_backup_delete` -Before deleting a backup. -- `post_backup_delete` -After deleting a backup. -- `post_app_addaccess` -After adding an authorized user to an application. -- `post_app_removeaccess` -After the removal of a user's authorization on an application. -- `post_app_clearaccess` -After erasing all the access rules on an application. -- `post_app_install` -After installing an application. -- `post_app_upgrade` -After upgrading an application. -- `post_app_remove` -After removing an application. -- `post_app_change_url` -After modifying the path and/or the domain name of an application. -- `post_cert_update` -After updating a certificate -- `conf_regen` -Before and after the regeneration of a service configuration. -Services supported by `regen-conf`: - - avahi-daemon - - dnsmasq - - dovecot - - fail2ban - - glances - - metronome - - mysql - - nginx - - nslcd - - nsswitch - - postfix - - rspamd - - slapd - - ssh - - ssl - -### Hooks setup - -With the exception of the `conf_regen` hook, all hooks are used in the same way. -First of all, you have to understand that a hook is a simple bash script that will be executed by YunoHost when the indicated event occurs. -To add a hook to YunoHost, you must use a "hooks" folder at the root of the application package. Then, put your script in this folder under the name of the corresponding hook. - -> For example: -For the hook `post_user_create`, the script which will have to be executed for this hook should be placed in `hooks/post_user_create` in the app package. - -During the installation and the upgrade of the application, the scripts in the hooks folder will be duplicated in the folder `/etc/yunohost/hooks.d/` in the folder corresponding to the hook, then under the name `50-$app`. -All hooks belonging to an application will be removed when the apllication is deleted. - -### Building a hook script - -As a bash script, a hook script must start with the bash shebang. - -```bash -#!/bin/bash -``` - -Then you have to take the arguments given by YunoHost when calling the script. -Each hook offers different arguments. - -##### `post_domain_add` and `post_domain_remove` - -```bash -domain=$1 -``` - -##### `post_user_create` - -```bash -username=$1 -mail=$2 -password=$3 # Clear password -firstname=$4 -lastname=$5 -``` -##### `post_user_delete` - -```bash -username=$1 -purge=$2 # True/False Indicates whether the user folder has been deleted or not. -``` - -##### `post_iptable_rules` - -```bash -upnp=$1 # True/False Indicates if UPnP is activated or not. -ipv6=$2 # True/False Indicates whether IPV6 is enabled or not. -``` - -##### `pre_backup_delete` and `post_backup_delete` - -```bash -backup_name=$1 -``` - -##### `post_app_install`, `post_app_upgrade`, `post_app_remove` and `post_app_change_url` - -Usable variables in these scripts are the same as those available in [associated actions scripts](/packaging_apps_scripts). - -Example: for `post_app_install` the variables are the same as for the script `install` - -##### `post_app_addaccess` and `post_app_removeaccess` - -```bash -app_id=$1 -users=$2 # All authorized users on the app. Separated by commas. -``` - -##### `post_app_clearaccess` - -```bash -app_id=$1 -``` - -##### `post_cert_update` -```bash -domain=$1 -``` - -The rest of the script depends on what you want to do in it. - -### `conf_regen` special case -The `conf_regen` hook is a more delicate hook, either for its implementation or for its content. - -##### `conf_regen` hook setup - -A `conf_regen` hook should not be placed in the application's hooks folder. It must be set up manually. -The hook should be copied, indicating to which service it is linked. -```bash -cp hook_regen_conf /usr/share/yunohost/hooks/conf_regen/50-SERVICE_$app -``` - -> When removing the application, this hook must be removed manually. - -##### Building `conf_regen` hook script - -`conf_regen` hook is called two times, a first time after analysis of the configuration and before any modification of the files, then a second time after applying the modifications, if there has been modifications. - -`conf_regen` hook script should look like this: - -```bash -#!/bin/bash - -force=${2:-0} # 0/1 --force argument -dryrun=${3:-0} # 0/1 --dry-run argument -pending_conf=$4 # Path of the pending conf file - -do_pre_regen() { - # Put your code here for pre regen conf. -} - -do_post_regen() { - # Put your code here for post regen conf. - # Be careful, this part will be executed only if the configuration has been modified. -} - -case "$1" in - pre) - do_pre_regen - ;; - post) - do_post_regen - ;; - *) - echo "Hook called with unknown argument \`$1'" >&2 - exit 1 - ;; -esac - -exit 0 -``` diff --git a/pages/04.contribute/04.packaging_apps/15.quality_tests/01.apps_levels/packaging_apps_levels.fr.md b/pages/04.contribute/04.packaging_apps/15.quality_tests/01.apps_levels/packaging_apps_levels.fr.md deleted file mode 100644 index 8c12625e..00000000 --- a/pages/04.contribute/04.packaging_apps/15.quality_tests/01.apps_levels/packaging_apps_levels.fr.md +++ /dev/null @@ -1,170 +0,0 @@ ---- -title: Niveaux de qualité des packages d'applications YunoHost -template: docs -taxonomy: - category: docs -routes: - default: '/packaging_apps_levels' ---- - -Afin de faciliter le packaging d'applications par des étapes successives à atteindre, chaque package est affublé d'un niveau de qualité, de 0 à 10. -Un package doit satisfaire un certain nombre de critères pour atteindre chaque niveau. De plus pour atteindre un niveau, le package doit avoir préalablement atteint le niveau précédent. - -Ce classement des applications par niveaux présente 3 avantages : -- Le packaging d'application est d'autant plus ludique, avec des objectifs clairs à atteindre et des étapes successives. -- Une application correctement packagée est davantage mise en avant qu'une application ne respectant pas les règles de packaging. -- Les utilisateurs peuvent rapidement voir le niveau d'une application et ainsi savoir si le package est de bonne qualité. - -## Résumé des niveaux - -**Niveau 0** -L'application ne fonctionne pas. - -**Niveau 1** -L'application s'installe et se désinstalle correctement dans certains cas. - -**Niveau 2** -L'application s'installe et se désinstalle correctement dans toutes les configurations communes. - -**Niveau 3** -L'application peut être mise à jour. - -**Niveau 4** -L'application peut-être sauvegardée et restaurée. - -**Niveau 5** -Le code du package d'application respecte certaines règles de syntaxe. - -**Niveau 6** -Le package d'application est dans l'organisation YunoHost-Apps. - -**Niveau 7** -Le package d'application passe avec succès l'ensemble des tests d'intégrité. - -**Niveau 8** -Le package d'application respecte toute les recommendations de packaging d'apps. C'est une app de très bonne qualité. - -**Niveau 9** -Le package d'application respecte des recommandations de packaging supérieures. Non disponible pour le moment. - -**Niveau 10** -Le package d'application est jugé parfait ! - -## Les niveaux de qualité en détails : - -### Niveau 0 -**L'application ne s'installe pas ou ne fonctionne pas après installation.** -C'est le niveau le plus bas, une application de niveau 0 est considérée comme non fonctionnelle. - -YEP à respecter pour atteindre le niveau 0 : -- [YEP 1.1](https://github.com/YunoHost/doc/blob/master/packaging_apps_guidelines_fr.md#yep-11---nommer-son-app-et-son-d%C3%A9pot---valid%C3%A9--manuel--notworking-) : Nommer son app et son dépôt -- [YEP 1.2](https://github.com/YunoHost/doc/blob/master/packaging_apps_guidelines_fr.md#yep-12---inscrire-lapp-sur-un-r%C3%A9pertoire-connu---valid%C3%A9--manuel--notworking-) : Inscrire l'app sur un "répertoire" connu - -### Niveau 1 -**L'application s'installe et se désinstalle correctement.** -Mais des exceptions sont possibles, si au moins une méthode d'installation est fonctionnelle ainsi que sa suppression alors l'application est considérée comme fonctionnelle. - -YEP à respecter pour atteindre le niveau 1 : -- [YEP 2.2](https://github.com/YunoHost/doc/blob/master/packaging_apps_guidelines_fr.md#yep-22---utiliser-bash-pour-les-scripts-principaux---valid%C3%A9--auto--working-) : Utiliser bash pour les scripts principaux -- [YEP 2.5](https://github.com/YunoHost/doc/blob/master/packaging_apps_guidelines_fr.md#yep-25---copier-correctement-des-fichiers----brouillon--manuel--working-) : Copier correctement des fichiers -- [YEP 2.7](https://github.com/YunoHost/doc/blob/master/packaging_apps_guidelines_fr.md#yep-27---donner-des-permissions-suffisantes-aux-instructions-bash----valid%C3%A9--auto--working-) : Donner des permissions suffisantes aux instructions bash -- [YEP 2.15](https://github.com/YunoHost/doc/blob/master/packaging_apps_guidelines_fr.md#yep-215---v%C3%A9rifier-les-param%C3%A8tres-saisies-par-lutilisateur----valid%C3%A9--manuel--official-) : Suivre les instructions d'installation de l'application - -### Niveau 2 -**L'application s'installe et se désinstalle dans toutes les configurations communes.** - -- Installation en sous-dossier. -- Installation à la racine d'un domaine ou d'un sous-domaine. -- Installation privée (sécurisée par le SSO). -- Installation publique. -- Installation multi-instance. -- Désinstallation dans les mêmes circonstances. - -*Si une application ne permet pas certaines configurations d'installation, celles-ci doivent être indiquées clairement dans le readme du package. Toutefois, le niveau 2 ne peut pas être atteint si une configuration d'installation est volontairement écartée sans raison valable.* -*Cela n'empêche pas de restreindre volontairement les installations publiques, privées ou multi-instance si l'application le justifie.* - -YEP à respecter pour atteindre le niveau 2 : -- [YEP 1.5](https://github.com/YunoHost/doc/blob/master/packaging_apps_guidelines_fr.md#yep-15---mettre-%C3%A0-jour-r%C3%A9guli%C3%A8rement-le-statut-de-lapp---brouillon--manuel--working-) : Mettre à jour régulièrement le statut de l'app -- *[YEP 2.18.2](https://github.com/YunoHost/doc/blob/master/packaging_apps_guidelines_fr.md#yep-2182---supporter-linstallation-sur-un-domaine----valid%C3%A9--auto--working-) : Supporter l'installation sur un domaine* -- *[YEP 2.18.3](https://github.com/YunoHost/doc/blob/master/packaging_apps_guidelines_fr.md#yep-2183---supporter-linstallation-sur-un-sous-domaine----valid%C3%A9--auto--working-) : Supporter l'installation sur un sous-domaine* -- *[YEP 2.18.4](https://github.com/YunoHost/doc/blob/master/packaging_apps_guidelines_fr.md#yep-2184---supporter-linstallation-sur-un-sous-dossier----valid%C3%A9--auto--official-) : Supporter l'installation sur un sous-dossier* -- *[YEP 4.6](https://github.com/YunoHost/doc/blob/master/packaging_apps_guidelines_fr.md#yep-46---g%C3%A8re-le-multi-instance----valid%C3%A9--manuel--optional-) : Gère le multi-instance* - -### Niveau 3 -**L'application supporte l'upgrade depuis une ancienne version du package.** -L'application doit pouvoir être mise à jour depuis une version précédente du package sans provoquer d'erreur. - -YEP à respecter pour atteindre le niveau 3 : -- [YEP 2.3](https://github.com/YunoHost/doc/blob/master/packaging_apps_guidelines_fr.md#yep-23---sauvegarder-les-r%C3%A9ponses-lors-de-linstallation---valid%C3%A9--manuel--working-) : Sauvegarder les réponses lors de l'installation - -### Niveau 4 -**L'application peut-être sauvegardée et restaurée sans erreur sur la même machine ou une autre.** - -YEP à respecter pour atteindre le niveau 4 : -- *[YEP 4.3](https://github.com/YunoHost/doc/blob/master/packaging_apps_guidelines_fr.md#yep-43---fournir-un-script-de-sauvegarde-yunohost-fonctionnel----valid%C3%A9--auto--official-) : Fournir un script de sauvegarde YunoHost fonctionnel* -- *[YEP 4.4](https://github.com/YunoHost/doc/blob/master/packaging_apps_guidelines_fr.md#yep-44---fournir-un-script-de-restauration-yunohost-fonctionnel----valid%C3%A9--auto--official-) : Fournir un script de restauration YunoHost fonctionnel* - -### Niveau 5 -**L'application ne présente aucune erreur dans [Package linter](https://github.com/YunoHost/package_linter).** -*Il peut y avoir des faux positifs dans Package linter. Ces situations seront gérées au cas par cas.* - -YEP à respecter pour atteindre le niveau 5 : -- *[YEP 1.3](https://github.com/YunoHost/doc/blob/master/packaging_apps_guidelines_fr.md#yep-13---indiquer-la-licence-associ%C3%A9e-au-paquet---valid%C3%A9--auto--working-) : Indiquer la licence associée au paquet* -- *[YEP 2.1](https://github.com/YunoHost/doc/blob/master/packaging_apps_guidelines_fr.md#yep-21---respecter-le-format-du-manifeste---valid%C3%A9--auto--inprogress-) : Respecter le format du manifeste* -- [YEP 2.12](https://github.com/YunoHost/doc/blob/master/packaging_apps_guidelines_fr.md#yep-212---utiliser-les-commandes-pratiques-helpers---valid%C3%A9--auto--official-) : Utiliser les commandes pratiques (helpers) -- [YEP 2.18.1](https://github.com/YunoHost/doc/blob/master/packaging_apps_guidelines_fr.md#yep-2181---lancer-le-script-dinstallation-dune-webapp-correctement----valid%C3%A9--manuel--working-) : Lancer le script d'installation d'une webapp correctement - -### Niveau 6 -**Le package d'application est dans l'organisation YunoHost-Apps.** - -YEP à respecter pour atteindre le niveau 6 : -- [YEP 1.4](https://github.com/YunoHost/doc/blob/master/packaging_apps_guidelines_fr.md#yep-14---informer-sur-lintention-de-maintenir-un-paquet----brouillon--manuel--working-) : Informer sur l'intention de maintenir un paquet -- [YEP 1.6](https://github.com/YunoHost/doc/blob/master/packaging_apps_guidelines_fr.md#yep-16---se-tenir-inform%C3%A9-sur-l%C3%A9volution-du-packaging-dapps---valid%C3%A9--manuel--official-) : Se tenir informé sur l'évolution du packaging d'apps -- *[YEP 1.7](https://github.com/YunoHost/doc/blob/master/packaging_apps_guidelines_fr.md#yep-17---ajouter-lapp-%C3%A0-lorganisation-yunohost-apps---valid%C3%A9--manuel--official-) : Ajouter l'app à l'[organisation YunoHost-Apps](https://github.com/YunoHost-Apps)* -- [YEP 1.8](https://github.com/YunoHost/doc/blob/master/packaging_apps_guidelines_fr.md#yep-18---publier-des-demandes-de-test---valid%C3%A9--manuel--official-) : Publier des demandes de test -- [YEP 1.9](https://github.com/YunoHost/doc/blob/master/packaging_apps_guidelines_fr.md#yep-19---documenter-lapp---valid%C3%A9--auto--official-) : Documenter l'app -- [YEP 1.10](https://github.com/YunoHost/doc/blob/master/packaging_apps_guidelines_fr.md#yep-110---garder-un-historique-de-version-propre----brouillon--manuel--official-) : Garder un historique de version propre -- [YEP 2.9](https://github.com/YunoHost/doc/blob/master/packaging_apps_guidelines_fr.md#yep-29---enlever-toutes-traces-de-lapp-lors-de-la-suppression----brouillon--manuel--working-) : Enlever toutes traces de l'app lors de la suppression -- [YEP 3.3](https://github.com/YunoHost/doc/blob/master/packaging_apps_guidelines_fr.md#yep-33---faciliter-le-contr%C3%B4le-de-lint%C3%A9grit%C3%A9-des-sources----brouillon--manuel--official-) : Faciliter le contrôle de l'intégrité des sources -- [YEP 3.5](https://github.com/YunoHost/doc/blob/master/packaging_apps_guidelines_fr.md#yep-35---suivre-les-recommendations-de-la-documentation-de-lapp----valid%C3%A9--manuel--official-) : Suivre les recommandations de la documentation de l'app -- [YEP 3.6](https://github.com/YunoHost/doc/blob/master/packaging_apps_guidelines_fr.md#yep-36---mettre-%C3%A0-jour-les-versions-contenant-des-cve----draft--manuel--official-) : Mettre à jour les versions contenant des CVE - -### Niveau 7 -**L'application ne présente aucune erreur dans [Package check](https://github.com/YunoHost/package_check).** -En considérant le maximum de tests possibles pour l'application. - -YEP à respecter pour atteindre le niveau 7 : -- [YEP 2.4](https://github.com/YunoHost/doc/blob/master/packaging_apps_guidelines_fr.md#yep-24---d%C3%A9tecter-et-g%C3%A9rer-les-erreurs---brouillon--manuel--working-) : Détecter et gérer les erreurs -- [YEP 2.6](https://github.com/YunoHost/doc/blob/master/packaging_apps_guidelines_fr.md#yep-26---annuler-laction-si-les-valeurs-dentr%C3%A9es-sont-incorrectes----valid%C3%A9--manuel--working-) : Annuler l'action si les valeurs d'entrées sont incorrectes -- [YEP 2.8](https://github.com/YunoHost/doc/blob/master/packaging_apps_guidelines_fr.md#yep-28---modifier-correctement-une-configuration-syst%C3%A8me----brouillon--manuel--working-) : Modifier correctement une configuration système -- [YEP 2.10](https://github.com/YunoHost/doc/blob/master/packaging_apps_guidelines_fr.md#yep-210---configurer-les-logs-de-lapplication----brouillon--manuel--working-) : Configurer les logs de l'application -- [YEP 2.11](https://github.com/YunoHost/doc/blob/master/packaging_apps_guidelines_fr.md#yep-211---utiliser-une-variable-plut%C3%B4t-que-lapp-id-directement---valid%C3%A9--manuel--official-) : Utiliser une variable plutôt que l'app id directement -- [YEP 2.13](https://github.com/YunoHost/doc/blob/master/packaging_apps_guidelines_fr.md#yep-213---traduire-le-package-en-anglais----brouillon--manuel--official-) : Traduire le package en anglais -- [YEP 3.2](https://github.com/YunoHost/doc/blob/master/packaging_apps_guidelines_fr.md#yep-32---ouvrir-un-port-correctement----brouillon--manuel--working-) : Ouvrir un port correctement - -### Niveau 8 -**Le package d'application respecte toute les recommandations de packaging d'apps. C'est une app de très bonne qualité.** - -YEP à respecter pour atteindre le niveau 8 : -- [YEP 1.12](https://github.com/YunoHost/doc/blob/master/packaging_apps_guidelines_fr.md#yep-112) : Respect le modèle de l'application d'exemple -- Prise en charge du changement d'URL -- *[YEP 2.16](https://github.com/YunoHost/doc/blob/master/packaging_apps_guidelines_fr.md#yep-216---v%C3%A9rifier-la-disponibilit%C3%A9-des-d%C3%A9pendances-sur-arm-x86-et-x64----valid%C3%A9--manuel--official-) : Vérifier la disponibilité des dépendances sur ARM, x86 et x64* -- [YEP 2.18.5](https://github.com/YunoHost/doc/blob/master/packaging_apps_guidelines_fr.md#yep-2185---ajouter-la-tuile-yunohost-pour-naviguer-facilement-entre-les-applications----valid%C3%A9--manuel--official-) : Ajouter la tuile YunoHost pour naviguer facilement entre les applications -- [YEP 4.1](https://github.com/YunoHost/doc/blob/master/packaging_apps_guidelines_fr.md#yep-41---lier-au-ldap----valid%C3%A9--manuel--official-) : Lier au LDAP -- [YEP 4.2](https://github.com/YunoHost/doc/blob/master/packaging_apps_guidelines_fr.md#yep-42---lier-lauthentification-au-sso----valid%C3%A9--manuel--official-) : Lier l'authentification au SSO -- [YEP 4.5](https://github.com/YunoHost/doc/blob/master/packaging_apps_guidelines_fr.md#yep-45---utiliser-les-hooks----valid%C3%A9--manuel--optional-) : Utiliser les hooks - -*Si une application n'est pas disponible sur une architecture, et qu'il est impossible de contourner cette limitation raisonnablement, cette limitation doit être indiquée dans le readme et prise en compte dans le script d'installation. L'installation de l'application sur une architecture non supportée doit être stoppée avant de modifier les fichiers.* - -### Niveau 9 -**L'application respecte toutes les YEP optionnelles.** - -YEP à respecter pour atteindre le niveau 9 : -- [YEP 2.14](https://github.com/YunoHost/doc/blob/master/packaging_apps_guidelines_fr.md#yep-214---remplir-correctement-un-fichier-de-conf----brouillon--manuel--official-) : Remplir correctement un fichier de conf -- [YEP 2.17](https://github.com/YunoHost/doc/blob/master/packaging_apps_guidelines_fr.md#yep-217---prendre-en-compte-la-version-dorigine-lors-des-mises-%C3%A0-jour----valid%C3%A9--manuel--official-) : Prendre en compte la version d'origine lors des mises à jour -- [YEP 3.4](https://github.com/YunoHost/doc/blob/master/packaging_apps_guidelines_fr.md#yep-34---isoler-lapp----brouillon--manuel--official-) : Isoler l'app -- [YEP 4.2.1](https://github.com/YunoHost/doc/blob/master/packaging_apps_guidelines_fr.md#yep-421---d%C3%A9connexion----valid%C3%A9--manuel--official-) : Déconnexion - -### Niveau 10 -**L'application est jugée parfaite !** -Ce niveau ultime pour une application ne peux être atteint que suite à étude approfondie du package et par la validation du groupe Apps. diff --git a/pages/03.community/01.forum/forum.fr.md b/pages/05.community/05.forum/forum.fr.md similarity index 100% rename from pages/03.community/01.forum/forum.fr.md rename to pages/05.community/05.forum/forum.fr.md diff --git a/pages/03.community/01.forum/forum.md b/pages/05.community/05.forum/forum.md similarity index 100% rename from pages/03.community/01.forum/forum.md rename to pages/05.community/05.forum/forum.md diff --git a/pages/03.community/02.chat_rooms/chat_rooms.es.md b/pages/05.community/10.chat_rooms/chat_rooms.es.md similarity index 100% rename from pages/03.community/02.chat_rooms/chat_rooms.es.md rename to pages/05.community/10.chat_rooms/chat_rooms.es.md diff --git a/pages/03.community/02.chat_rooms/chat_rooms.fr.md b/pages/05.community/10.chat_rooms/chat_rooms.fr.md similarity index 100% rename from pages/03.community/02.chat_rooms/chat_rooms.fr.md rename to pages/05.community/10.chat_rooms/chat_rooms.fr.md diff --git a/pages/03.community/02.chat_rooms/chat_rooms.md b/pages/05.community/10.chat_rooms/chat_rooms.md similarity index 100% rename from pages/03.community/02.chat_rooms/chat_rooms.md rename to pages/05.community/10.chat_rooms/chat_rooms.md diff --git a/pages/03.community/03.help/help.ar.md b/pages/05.community/15.help/help.ar.md similarity index 100% rename from pages/03.community/03.help/help.ar.md rename to pages/05.community/15.help/help.ar.md diff --git a/pages/03.community/03.help/help.fr.md b/pages/05.community/15.help/help.fr.md similarity index 100% rename from pages/03.community/03.help/help.fr.md rename to pages/05.community/15.help/help.fr.md diff --git a/pages/03.community/03.help/help.it.md b/pages/05.community/15.help/help.it.md similarity index 100% rename from pages/03.community/03.help/help.it.md rename to pages/05.community/15.help/help.it.md diff --git a/pages/03.community/03.help/help.md b/pages/05.community/15.help/help.md similarity index 100% rename from pages/03.community/03.help/help.md rename to pages/05.community/15.help/help.md diff --git a/pages/03.community/04.faq/faq.de.md b/pages/05.community/20.faq/faq.de.md similarity index 100% rename from pages/03.community/04.faq/faq.de.md rename to pages/05.community/20.faq/faq.de.md diff --git a/pages/03.community/04.faq/faq.fr.md b/pages/05.community/20.faq/faq.fr.md similarity index 100% rename from pages/03.community/04.faq/faq.fr.md rename to pages/05.community/20.faq/faq.fr.md diff --git a/pages/03.community/04.faq/faq.md b/pages/05.community/20.faq/faq.md similarity index 100% rename from pages/03.community/04.faq/faq.md rename to pages/05.community/20.faq/faq.md diff --git a/pages/05.community/25.project_organization/yunohost_project_organization.fr.md b/pages/05.community/25.project_organization/yunohost_project_organization.fr.md new file mode 100644 index 00000000..aba0729e --- /dev/null +++ b/pages/05.community/25.project_organization/yunohost_project_organization.fr.md @@ -0,0 +1,9 @@ +--- +title: Organisation du projet +template: docs +redirect: 'https://github.com/YunoHost/project-organization/' +routes: + default: '/yunohost_project_organization' + aliases: + - '/project_organization' +--- diff --git a/pages/05.community/25.project_organization/yunohost_project_organization.md b/pages/05.community/25.project_organization/yunohost_project_organization.md new file mode 100644 index 00000000..e58ed648 --- /dev/null +++ b/pages/05.community/25.project_organization/yunohost_project_organization.md @@ -0,0 +1,9 @@ +--- +title: Project organisation +template: docs +redirect: 'https://github.com/YunoHost/project-organization/' +routes: + default: '/yunohost_project_organization' + aliases: + - '/project_organization' +--- diff --git a/pages/03.community/06.project_sponsors/sponsors_partners.fr.md b/pages/05.community/30.project_sponsors/sponsors_partners.fr.md similarity index 100% rename from pages/03.community/06.project_sponsors/sponsors_partners.fr.md rename to pages/05.community/30.project_sponsors/sponsors_partners.fr.md diff --git a/pages/03.community/06.project_sponsors/sponsors_partners.md b/pages/05.community/30.project_sponsors/sponsors_partners.md similarity index 100% rename from pages/03.community/06.project_sponsors/sponsors_partners.md rename to pages/05.community/30.project_sponsors/sponsors_partners.md diff --git a/pages/03.community/07.project_budget/project_budget.fr.md b/pages/05.community/35.project_budget/project_budget.fr.md similarity index 100% rename from pages/03.community/07.project_budget/project_budget.fr.md rename to pages/05.community/35.project_budget/project_budget.fr.md diff --git a/pages/03.community/07.project_budget/project_budget.md b/pages/05.community/35.project_budget/project_budget.md similarity index 100% rename from pages/03.community/07.project_budget/project_budget.md rename to pages/05.community/35.project_budget/project_budget.md diff --git a/pages/03.community/09.security_team/security_team.fr.md b/pages/05.community/35.security_team/security_team.fr.md similarity index 100% rename from pages/03.community/09.security_team/security_team.fr.md rename to pages/05.community/35.security_team/security_team.fr.md diff --git a/pages/03.community/09.security_team/security_team.md b/pages/05.community/35.security_team/security_team.md similarity index 100% rename from pages/03.community/09.security_team/security_team.md rename to pages/05.community/35.security_team/security_team.md diff --git a/pages/03.community/08.project_press/communication.md b/pages/05.community/40.press_kit/press_kit.md similarity index 95% rename from pages/03.community/08.project_press/communication.md rename to pages/05.community/40.press_kit/press_kit.md index 93e0ce5e..c59c579c 100644 --- a/pages/03.community/08.project_press/communication.md +++ b/pages/05.community/40.press_kit/press_kit.md @@ -2,11 +2,18 @@ title: Communication template: docs taxonomy: - category: docs + category: docs routes: - default: '/communication' + default: '/press_kit' + aliases: + - '/communication' --- +! TODO: Add logo and kakemono file +! TODO: Add kakemono photo https://matrix-client.matrix.org/_matrix/media/r0/download/pijean.ovh/TqtyOjqllOeSXYziawxeGzIP +! TODO: Add "About YunoHost" section +! TODO: Add email contact + ## Talks / conf - (EN) [BattleMeshV12 - YunoHost and the Internet Cube (Brique Internet)](https://www.battlemesh.org/BattleMeshV12/Events#YunoHost_and_the_Internet_Cube_.28Brique_Internet.29) diff --git a/pages/03.community/11.chatons/chatons.fr.md b/pages/05.community/45.chatons/chatons.fr.md similarity index 100% rename from pages/03.community/11.chatons/chatons.fr.md rename to pages/05.community/45.chatons/chatons.fr.md diff --git a/pages/03.community/11.chatons/chatons.md b/pages/05.community/45.chatons/chatons.md similarity index 100% rename from pages/03.community/11.chatons/chatons.md rename to pages/05.community/45.chatons/chatons.md diff --git a/pages/03.community/community.fr.md b/pages/05.community/community.fr.md similarity index 100% rename from pages/03.community/community.fr.md rename to pages/05.community/community.fr.md diff --git a/pages/03.community/chapter.md b/pages/05.community/community.md similarity index 100% rename from pages/03.community/chapter.md rename to pages/05.community/community.md diff --git a/pages/04.contribute/02.write_documentation/01.writing_documentation_guide/doc_writing_guide.fr.md b/pages/06.contribute/05.write_documentation/01.writing_documentation_guide/doc_writing_guide.fr.md similarity index 100% rename from pages/04.contribute/02.write_documentation/01.writing_documentation_guide/doc_writing_guide.fr.md rename to pages/06.contribute/05.write_documentation/01.writing_documentation_guide/doc_writing_guide.fr.md diff --git a/pages/04.contribute/02.write_documentation/01.writing_documentation_guide/doc_writing_guide.md b/pages/06.contribute/05.write_documentation/01.writing_documentation_guide/doc_writing_guide.md similarity index 100% rename from pages/04.contribute/02.write_documentation/01.writing_documentation_guide/doc_writing_guide.md rename to pages/06.contribute/05.write_documentation/01.writing_documentation_guide/doc_writing_guide.md diff --git a/pages/04.contribute/02.write_documentation/02.markdown_guide/doc_markdown_guide.fr.md b/pages/06.contribute/05.write_documentation/02.markdown_guide/doc_markdown_guide.fr.md similarity index 100% rename from pages/04.contribute/02.write_documentation/02.markdown_guide/doc_markdown_guide.fr.md rename to pages/06.contribute/05.write_documentation/02.markdown_guide/doc_markdown_guide.fr.md diff --git a/pages/04.contribute/02.write_documentation/02.markdown_guide/doc_markdown_guide.md b/pages/06.contribute/05.write_documentation/02.markdown_guide/doc_markdown_guide.md similarity index 100% rename from pages/04.contribute/02.write_documentation/02.markdown_guide/doc_markdown_guide.md rename to pages/06.contribute/05.write_documentation/02.markdown_guide/doc_markdown_guide.md diff --git a/pages/04.contribute/02.write_documentation/03.git/doc_use_git.fr.md b/pages/06.contribute/05.write_documentation/03.git/doc_use_git.fr.md similarity index 100% rename from pages/04.contribute/02.write_documentation/03.git/doc_use_git.fr.md rename to pages/06.contribute/05.write_documentation/03.git/doc_use_git.fr.md diff --git a/pages/04.contribute/02.write_documentation/03.git/doc_use_git.md b/pages/06.contribute/05.write_documentation/03.git/doc_use_git.md similarity index 100% rename from pages/04.contribute/02.write_documentation/03.git/doc_use_git.md rename to pages/06.contribute/05.write_documentation/03.git/doc_use_git.md diff --git a/pages/04.contribute/02.write_documentation/write_documentation.de.md b/pages/06.contribute/05.write_documentation/write_documentation.de.md similarity index 99% rename from pages/04.contribute/02.write_documentation/write_documentation.de.md rename to pages/06.contribute/05.write_documentation/write_documentation.de.md index 0777c10c..c3cf71c6 100644 --- a/pages/04.contribute/02.write_documentation/write_documentation.de.md +++ b/pages/06.contribute/05.write_documentation/write_documentation.de.md @@ -36,7 +36,7 @@ Die Struktur des Repositorys wird nachfolgend beschrieben: # Das Verzeichnis mit den Dokumentationsseiten. # Die Seitenhierarchie spiegelt sich in der Verzeichnishierarchie wider. + -- 00.home - + -- 01.administrate + + -- 01.administer + -- 02.applications + -- 03.community + -- 04.contribute diff --git a/pages/04.contribute/02.write_documentation/write_documentation.fr.md b/pages/06.contribute/05.write_documentation/write_documentation.fr.md similarity index 100% rename from pages/04.contribute/02.write_documentation/write_documentation.fr.md rename to pages/06.contribute/05.write_documentation/write_documentation.fr.md diff --git a/pages/04.contribute/02.write_documentation/write_documentation.md b/pages/06.contribute/05.write_documentation/write_documentation.md similarity index 99% rename from pages/04.contribute/02.write_documentation/write_documentation.md rename to pages/06.contribute/05.write_documentation/write_documentation.md index 504dd161..a1fbc4b2 100644 --- a/pages/04.contribute/02.write_documentation/write_documentation.md +++ b/pages/06.contribute/05.write_documentation/write_documentation.md @@ -37,7 +37,7 @@ The structure of the repository is described below: # The directory containing the documentation pages. # The pages hierarchy is reflected by the directory hierarchy. +-- 00.home - +-- 01.administrate + +-- 01.administer +-- 02.applications +-- 03.community +-- 04.contribute diff --git a/pages/04.contribute/04.packaging_apps/02.technical_intro/packaging_apps.fr.md b/pages/06.contribute/10.packaging_apps/02.technical_intro/packaging_apps.fr.md similarity index 100% rename from pages/04.contribute/04.packaging_apps/02.technical_intro/packaging_apps.fr.md rename to pages/06.contribute/10.packaging_apps/02.technical_intro/packaging_apps.fr.md diff --git a/pages/04.contribute/04.packaging_apps/02.technical_intro/packaging_apps.md b/pages/06.contribute/10.packaging_apps/02.technical_intro/packaging_apps.md similarity index 100% rename from pages/04.contribute/04.packaging_apps/02.technical_intro/packaging_apps.md rename to pages/06.contribute/10.packaging_apps/02.technical_intro/packaging_apps.md diff --git a/pages/04.contribute/04.packaging_apps/03.git/packaging_apps_git.fr.md b/pages/06.contribute/10.packaging_apps/03.git/packaging_apps_git.fr.md similarity index 100% rename from pages/04.contribute/04.packaging_apps/03.git/packaging_apps_git.fr.md rename to pages/06.contribute/10.packaging_apps/03.git/packaging_apps_git.fr.md diff --git a/pages/04.contribute/04.packaging_apps/03.git/packaging_apps_git.md b/pages/06.contribute/10.packaging_apps/03.git/packaging_apps_git.md similarity index 100% rename from pages/04.contribute/04.packaging_apps/03.git/packaging_apps_git.md rename to pages/06.contribute/10.packaging_apps/03.git/packaging_apps_git.md diff --git a/pages/04.contribute/04.packaging_apps/04.virtualbox/packaging_apps_virtualbox.fr.md b/pages/06.contribute/10.packaging_apps/04.virtualbox/packaging_apps_virtualbox.fr.md similarity index 100% rename from pages/04.contribute/04.packaging_apps/04.virtualbox/packaging_apps_virtualbox.fr.md rename to pages/06.contribute/10.packaging_apps/04.virtualbox/packaging_apps_virtualbox.fr.md diff --git a/pages/04.contribute/04.packaging_apps/04.virtualbox/packaging_apps_virtualbox.md b/pages/06.contribute/10.packaging_apps/04.virtualbox/packaging_apps_virtualbox.md similarity index 100% rename from pages/04.contribute/04.packaging_apps/04.virtualbox/packaging_apps_virtualbox.md rename to pages/06.contribute/10.packaging_apps/04.virtualbox/packaging_apps_virtualbox.md diff --git a/pages/04.contribute/04.packaging_apps/05.manifest/packaging_apps_manifest.fr.md b/pages/06.contribute/10.packaging_apps/05.manifest/packaging_apps_manifest.fr.md similarity index 100% rename from pages/04.contribute/04.packaging_apps/05.manifest/packaging_apps_manifest.fr.md rename to pages/06.contribute/10.packaging_apps/05.manifest/packaging_apps_manifest.fr.md diff --git a/pages/04.contribute/04.packaging_apps/05.manifest/packaging_apps_manifest.md b/pages/06.contribute/10.packaging_apps/05.manifest/packaging_apps_manifest.md similarity index 100% rename from pages/04.contribute/04.packaging_apps/05.manifest/packaging_apps_manifest.md rename to pages/06.contribute/10.packaging_apps/05.manifest/packaging_apps_manifest.md diff --git a/pages/04.contribute/04.packaging_apps/06.scripts/packaging_apps_scripts.fr.md b/pages/06.contribute/10.packaging_apps/06.scripts/packaging_apps_scripts.fr.md similarity index 100% rename from pages/04.contribute/04.packaging_apps/06.scripts/packaging_apps_scripts.fr.md rename to pages/06.contribute/10.packaging_apps/06.scripts/packaging_apps_scripts.fr.md diff --git a/pages/04.contribute/04.packaging_apps/06.scripts/packaging_apps_scripts.md b/pages/06.contribute/10.packaging_apps/06.scripts/packaging_apps_scripts.md similarity index 100% rename from pages/04.contribute/04.packaging_apps/06.scripts/packaging_apps_scripts.md rename to pages/06.contribute/10.packaging_apps/06.scripts/packaging_apps_scripts.md diff --git a/pages/04.contribute/04.packaging_apps/07.arguments/01.arguments_format/packaging_apps_arguments_format.md b/pages/06.contribute/10.packaging_apps/07.arguments/01.arguments_format/packaging_apps_arguments_format.md similarity index 100% rename from pages/04.contribute/04.packaging_apps/07.arguments/01.arguments_format/packaging_apps_arguments_format.md rename to pages/06.contribute/10.packaging_apps/07.arguments/01.arguments_format/packaging_apps_arguments_format.md diff --git a/pages/04.contribute/04.packaging_apps/07.arguments/packaging_apps_arguments_management.fr.md b/pages/06.contribute/10.packaging_apps/07.arguments/packaging_apps_arguments_management.fr.md similarity index 100% rename from pages/04.contribute/04.packaging_apps/07.arguments/packaging_apps_arguments_management.fr.md rename to pages/06.contribute/10.packaging_apps/07.arguments/packaging_apps_arguments_management.fr.md diff --git a/pages/04.contribute/04.packaging_apps/07.arguments/packaging_apps_arguments_management.md b/pages/06.contribute/10.packaging_apps/07.arguments/packaging_apps_arguments_management.md similarity index 100% rename from pages/04.contribute/04.packaging_apps/07.arguments/packaging_apps_arguments_management.md rename to pages/06.contribute/10.packaging_apps/07.arguments/packaging_apps_arguments_management.md diff --git a/pages/04.contribute/04.packaging_apps/08.groups_permissions/packaging_apps_permissions.md b/pages/06.contribute/10.packaging_apps/08.groups_permissions/packaging_apps_permissions.md similarity index 100% rename from pages/04.contribute/04.packaging_apps/08.groups_permissions/packaging_apps_permissions.md rename to pages/06.contribute/10.packaging_apps/08.groups_permissions/packaging_apps_permissions.md diff --git a/pages/04.contribute/04.packaging_apps/09.nginx/packaging_apps_nginx_conf.fr.md b/pages/06.contribute/10.packaging_apps/09.nginx/packaging_apps_nginx_conf.fr.md similarity index 100% rename from pages/04.contribute/04.packaging_apps/09.nginx/packaging_apps_nginx_conf.fr.md rename to pages/06.contribute/10.packaging_apps/09.nginx/packaging_apps_nginx_conf.fr.md diff --git a/pages/04.contribute/04.packaging_apps/09.nginx/packaging_apps_nginx_conf.md b/pages/06.contribute/10.packaging_apps/09.nginx/packaging_apps_nginx_conf.md similarity index 100% rename from pages/04.contribute/04.packaging_apps/09.nginx/packaging_apps_nginx_conf.md rename to pages/06.contribute/10.packaging_apps/09.nginx/packaging_apps_nginx_conf.md diff --git a/pages/04.contribute/04.packaging_apps/10.multi_instance/packaging_apps_multiinstance.fr.md b/pages/06.contribute/10.packaging_apps/10.multi_instance/packaging_apps_multiinstance.fr.md similarity index 100% rename from pages/04.contribute/04.packaging_apps/10.multi_instance/packaging_apps_multiinstance.fr.md rename to pages/06.contribute/10.packaging_apps/10.multi_instance/packaging_apps_multiinstance.fr.md diff --git a/pages/04.contribute/04.packaging_apps/10.multi_instance/packaging_apps_multiinstance.md b/pages/06.contribute/10.packaging_apps/10.multi_instance/packaging_apps_multiinstance.md similarity index 100% rename from pages/04.contribute/04.packaging_apps/10.multi_instance/packaging_apps_multiinstance.md rename to pages/06.contribute/10.packaging_apps/10.multi_instance/packaging_apps_multiinstance.md diff --git a/pages/04.contribute/04.packaging_apps/11.helpers/packaging_apps_helpers.md b/pages/06.contribute/10.packaging_apps/11.helpers/packaging_apps_helpers.md similarity index 89% rename from pages/04.contribute/04.packaging_apps/11.helpers/packaging_apps_helpers.md rename to pages/06.contribute/10.packaging_apps/11.helpers/packaging_apps_helpers.md index 3ac76d15..f9fb6e0e 100644 --- a/pages/04.contribute/04.packaging_apps/11.helpers/packaging_apps_helpers.md +++ b/pages/06.contribute/10.packaging_apps/11.helpers/packaging_apps_helpers.md @@ -7,7 +7,43 @@ routes: default: '/packaging_apps_helpers' --- -Doc auto-generated by [this script](https://github.com/YunoHost/yunohost/blob/6fc6a2ba4c17434803cea2553a3dc7c51cedd338/doc/generate_helper_doc.py) on 03/29/2022 (YunoHost version 4.3.6.3) +Doc auto-generated by [this script](https://github.com/YunoHost/yunohost/blob/8a9ed1ed7af94b3585ec2f2e43f49c93f2416110/doc/generate_helper_doc.py) on 08/08/2022 (YunoHost version 11.0.9) + + +## APPS + +#### ynh_install_apps +[details summary="Install others YunoHost apps" class="helper-card-subtitle text-muted"] + +**Usage**: `ynh_install_apps --apps="appfoo?domain=domain.foo&path=/foo appbar?domain=domain.bar&path=/bar&admin=USER&language=fr&is_public=1&pass?word=pass&port=666"` + +**Arguments**: +- `-a`, `--apps=`: apps to install + +**Details**:
    +Requires YunoHost version *.*.* or higher. + + + +[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/8a9ed1ed7af94b3585ec2f2e43f49c93f2416110/helpers/apps#L9) +[/details] +---------------- + +#### ynh_remove_apps +[details summary="Remove other YunoHost apps" class="helper-card-subtitle text-muted"] + +**Usage**: `ynh_remove_apps` + +**Details**:
    +Other YunoHost apps will be removed only if no other apps need them. + +Requires YunoHost version *.*.* or higher. + + + +[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/8a9ed1ed7af94b3585ec2f2e43f49c93f2416110/helpers/apps#L65) +[/details] +---------------- ## APT @@ -29,7 +65,7 @@ Requires YunoHost version 2.2.4 or higher. -[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/6fc6a2ba4c17434803cea2553a3dc7c51cedd338/data/helpers.d/apt#L53) +[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/8a9ed1ed7af94b3585ec2f2e43f49c93f2416110/helpers/apt#L53) [/details] ---------------- @@ -50,7 +86,7 @@ Requires YunoHost version 2.2.4 or higher. -[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/6fc6a2ba4c17434803cea2553a3dc7c51cedd338/data/helpers.d/apt#L75) +[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/8a9ed1ed7af94b3585ec2f2e43f49c93f2416110/helpers/apt#L75) [/details] ---------------- @@ -64,7 +100,7 @@ Requires YunoHost version 2.2.4 or higher. -[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/6fc6a2ba4c17434803cea2553a3dc7c51cedd338/data/helpers.d/apt#L107) +[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/8a9ed1ed7af94b3585ec2f2e43f49c93f2416110/helpers/apt#L107) [/details] ---------------- @@ -81,7 +117,7 @@ Requires YunoHost version 2.2.4 or higher. -[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/6fc6a2ba4c17434803cea2553a3dc7c51cedd338/data/helpers.d/apt#L117) +[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/8a9ed1ed7af94b3585ec2f2e43f49c93f2416110/helpers/apt#L117) [/details] ---------------- @@ -98,7 +134,7 @@ Requires YunoHost version 2.2.4 or higher. -[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/6fc6a2ba4c17434803cea2553a3dc7c51cedd338/data/helpers.d/apt#L128) +[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/8a9ed1ed7af94b3585ec2f2e43f49c93f2416110/helpers/apt#L128) [/details] ---------------- @@ -115,7 +151,7 @@ Requires YunoHost version 2.2.4 or higher. -[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/6fc6a2ba4c17434803cea2553a3dc7c51cedd338/data/helpers.d/apt#L138) +[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/8a9ed1ed7af94b3585ec2f2e43f49c93f2416110/helpers/apt#L138) [/details] ---------------- @@ -132,7 +168,7 @@ Requires YunoHost version 2.7.2 or higher. -[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/6fc6a2ba4c17434803cea2553a3dc7c51cedd338/data/helpers.d/apt#L148) +[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/8a9ed1ed7af94b3585ec2f2e43f49c93f2416110/helpers/apt#L148) [/details] ---------------- @@ -154,7 +190,7 @@ Requires YunoHost version 2.6.4 or higher. -[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/6fc6a2ba4c17434803cea2553a3dc7c51cedd338/data/helpers.d/apt#L224) +[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/8a9ed1ed7af94b3585ec2f2e43f49c93f2416110/helpers/apt#L225) [/details] ---------------- @@ -171,7 +207,7 @@ Requires YunoHost version 3.8.1 or higher. -[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/6fc6a2ba4c17434803cea2553a3dc7c51cedd338/data/helpers.d/apt#L369) +[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/8a9ed1ed7af94b3585ec2f2e43f49c93f2416110/helpers/apt#L336) [/details] ---------------- @@ -187,7 +223,7 @@ Requires YunoHost version 2.6.4 or higher. -[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/6fc6a2ba4c17434803cea2553a3dc7c51cedd338/data/helpers.d/apt#L388) +[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/8a9ed1ed7af94b3585ec2f2e43f49c93f2416110/helpers/apt#L355) [/details] ---------------- @@ -207,7 +243,7 @@ Requires YunoHost version 3.8.1 or higher. -[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/6fc6a2ba4c17434803cea2553a3dc7c51cedd338/data/helpers.d/apt#L419) +[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/8a9ed1ed7af94b3585ec2f2e43f49c93f2416110/helpers/apt#L386) [/details] ---------------- @@ -224,7 +260,6 @@ Requires YunoHost version 3.8.1 or higher. - `-d`, `--dest_path=`: destination file or directory inside the backup dir - `-b`, `--is_big`: Indicate data are big (mail, video, image ...) - `-m`, `--not_mandatory`: Indicate that if the file is missing, the backup can ignore it. -- `arg`: Deprecated arg **Details**:
    This helper can be used both in a system backup hook, and in an app backup script @@ -281,7 +316,7 @@ Requires YunoHost version 3.5.0 or higher for the argument `--not_mandatory` -[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/6fc6a2ba4c17434803cea2553a3dc7c51cedd338/data/helpers.d/backup#L65) +[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/8a9ed1ed7af94b3585ec2f2e43f49c93f2416110/helpers/backup#L64) [/details] ---------------- @@ -295,7 +330,7 @@ Requires YunoHost version 2.6.4 or higher. -[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/6fc6a2ba4c17434803cea2553a3dc7c51cedd338/data/helpers.d/backup#L180) +[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/8a9ed1ed7af94b3585ec2f2e43f49c93f2416110/helpers/backup#L179) [/details] ---------------- @@ -328,7 +363,7 @@ Requires YunoHost version 2.6.4 or higher. Use the registered path in backup_list by ynh_backup to restore the file at the right place. If `DEST_PATH` already exists and is lighter than 500 Mo, a backup will be made in -`/home/yunohost.conf/backup/`. Otherwise, the existing file is removed. +`/var/cache/yunohost/appconfbackup/`. Otherwise, the existing file is removed. if `apps/$app/etc/nginx/conf.d/$domain.d/$app.conf` exists, restore it into `/etc/nginx/conf.d/$domain.d/$app.conf` @@ -340,7 +375,7 @@ Requires YunoHost version 3.5.0 or higher for the argument --not_mandatory -[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/6fc6a2ba4c17434803cea2553a3dc7c51cedd338/data/helpers.d/backup#L239) +[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/8a9ed1ed7af94b3585ec2f2e43f49c93f2416110/helpers/backup#L238) [/details] ---------------- @@ -359,7 +394,7 @@ Requires YunoHost version 2.6.4 or higher. -[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/6fc6a2ba4c17434803cea2553a3dc7c51cedd338/data/helpers.d/backup#L311) +[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/8a9ed1ed7af94b3585ec2f2e43f49c93f2416110/helpers/backup#L298) [/details] ---------------- @@ -381,7 +416,7 @@ Requires YunoHost version 2.6.4 or higher. -[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/6fc6a2ba4c17434803cea2553a3dc7c51cedd338/data/helpers.d/backup#L355) +[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/8a9ed1ed7af94b3585ec2f2e43f49c93f2416110/helpers/backup#L342) [/details] ---------------- @@ -400,7 +435,7 @@ Requires YunoHost version 3.3.1 or higher. -[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/6fc6a2ba4c17434803cea2553a3dc7c51cedd338/data/helpers.d/backup#L386) +[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/8a9ed1ed7af94b3585ec2f2e43f49c93f2416110/helpers/backup#L373) [/details] ---------------- @@ -423,7 +458,7 @@ Requires YunoHost version 2.7.2 or higher. -[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/6fc6a2ba4c17434803cea2553a3dc7c51cedd338/data/helpers.d/backup#L421) +[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/8a9ed1ed7af94b3585ec2f2e43f49c93f2416110/helpers/backup#L408) [/details] ---------------- @@ -446,7 +481,7 @@ Requires YunoHost version 2.7.2 or higher. -[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/6fc6a2ba4c17434803cea2553a3dc7c51cedd338/data/helpers.d/backup#L469) +[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/8a9ed1ed7af94b3585ec2f2e43f49c93f2416110/helpers/backup#L456) [/details] ---------------- @@ -460,7 +495,7 @@ Requires YunoHost version 2.7.2 or higher. [details summary="Create a dedicated fail2ban config (jail and filter conf files)" class="helper-card-subtitle text-muted"] **Usage**: `1: ynh_add_fail2ban_config --logpath=log_file --failregex=filter [--max_retry=max_retry] [--ports=ports] -2: ynh_add_fail2ban_config --use_template [--others_var="list of others variables to replace"]` +2: ynh_add_fail2ban_config --use_template` **Arguments**: - `-l`, `--logpath=`: Log file to be checked by fail2ban @@ -468,7 +503,6 @@ Requires YunoHost version 2.7.2 or higher. - `-m`, `--max_retry=`: Maximum number of retries allowed before banning IP address - default: 3 - `-p`, `--ports=`: Ports blocked for a banned IP address - default: http,https - `-t`, `--use_template`: Use this helper in template mode -- `-v`, `--others_var=`: List of others variables to replace separeted by a space for example : 'var_1 var_2 ...' **Details**:
    ----------------------------------------------------------------------------- @@ -524,7 +558,7 @@ Requires YunoHost version 4.1.0 or higher. -[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/6fc6a2ba4c17434803cea2553a3dc7c51cedd338/data/helpers.d/fail2ban#L65) +[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/8a9ed1ed7af94b3585ec2f2e43f49c93f2416110/helpers/fail2ban#L64) [/details] ---------------- @@ -538,7 +572,7 @@ Requires YunoHost version 3.5.0 or higher. -[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/6fc6a2ba4c17434803cea2553a3dc7c51cedd338/data/helpers.d/fail2ban#L124) +[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/8a9ed1ed7af94b3585ec2f2e43f49c93f2416110/helpers/fail2ban#L119) [/details] ---------------- @@ -566,7 +600,7 @@ Requires YunoHost version 3.8.1 or higher. -[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/6fc6a2ba4c17434803cea2553a3dc7c51cedd338/data/helpers.d/hardware#L13) +[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/8a9ed1ed7af94b3585ec2f2e43f49c93f2416110/helpers/hardware#L13) [/details] ---------------- @@ -589,7 +623,7 @@ Requires YunoHost version 3.8.1 or higher. -[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/6fc6a2ba4c17434803cea2553a3dc7c51cedd338/data/helpers.d/hardware#L75) +[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/8a9ed1ed7af94b3585ec2f2e43f49c93f2416110/helpers/hardware#L75) [/details] ---------------- @@ -610,7 +644,7 @@ Requires YunoHost version 2.4.0 or higher. -[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/6fc6a2ba4c17434803cea2553a3dc7c51cedd338/data/helpers.d/logging#L10) +[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/8a9ed1ed7af94b3585ec2f2e43f49c93f2416110/helpers/logging#L10) [/details] ---------------- @@ -627,7 +661,7 @@ Requires YunoHost version 3.2.0 or higher. -[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/6fc6a2ba4c17434803cea2553a3dc7c51cedd338/data/helpers.d/logging#L30) +[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/8a9ed1ed7af94b3585ec2f2e43f49c93f2416110/helpers/logging#L30) [/details] ---------------- @@ -644,7 +678,7 @@ Requires YunoHost version 3.2.0 or higher. -[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/6fc6a2ba4c17434803cea2553a3dc7c51cedd338/data/helpers.d/logging#L56) +[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/8a9ed1ed7af94b3585ec2f2e43f49c93f2416110/helpers/logging#L56) [/details] ---------------- @@ -661,7 +695,7 @@ Requires YunoHost version 3.2.0 or higher. -[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/6fc6a2ba4c17434803cea2553a3dc7c51cedd338/data/helpers.d/logging#L73) +[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/8a9ed1ed7af94b3585ec2f2e43f49c93f2416110/helpers/logging#L73) [/details] ---------------- @@ -680,7 +714,7 @@ Requires YunoHost version 3.2.0 or higher. -[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/6fc6a2ba4c17434803cea2553a3dc7c51cedd338/data/helpers.d/logging#L92) +[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/8a9ed1ed7af94b3585ec2f2e43f49c93f2416110/helpers/logging#L92) [/details] ---------------- @@ -699,7 +733,7 @@ Requires YunoHost version 3.2.0 or higher. -[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/6fc6a2ba4c17434803cea2553a3dc7c51cedd338/data/helpers.d/logging#L113) +[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/8a9ed1ed7af94b3585ec2f2e43f49c93f2416110/helpers/logging#L113) [/details] ---------------- @@ -718,7 +752,7 @@ Requires YunoHost version 3.2.0 or higher. -[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/6fc6a2ba4c17434803cea2553a3dc7c51cedd338/data/helpers.d/logging#L134) +[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/8a9ed1ed7af94b3585ec2f2e43f49c93f2416110/helpers/logging#L134) [/details] ---------------- @@ -737,7 +771,7 @@ Requires YunoHost version 3.2.0 or higher. -[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/6fc6a2ba4c17434803cea2553a3dc7c51cedd338/data/helpers.d/logging#L155) +[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/8a9ed1ed7af94b3585ec2f2e43f49c93f2416110/helpers/logging#L155) [/details] ---------------- @@ -756,7 +790,7 @@ Requires YunoHost version 3.2.0 or higher. -[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/6fc6a2ba4c17434803cea2553a3dc7c51cedd338/data/helpers.d/logging#L176) +[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/8a9ed1ed7af94b3585ec2f2e43f49c93f2416110/helpers/logging#L176) [/details] ---------------- @@ -776,7 +810,7 @@ Requires YunoHost version 3.5.0 or higher. -[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/6fc6a2ba4c17434803cea2553a3dc7c51cedd338/data/helpers.d/logging#L237) +[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/8a9ed1ed7af94b3585ec2f2e43f49c93f2416110/helpers/logging#L237) [/details] ---------------- @@ -791,7 +825,7 @@ Requires YunoHost version 3.6.0 or higher. -[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/6fc6a2ba4c17434803cea2553a3dc7c51cedd338/data/helpers.d/logging#L318) +[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/8a9ed1ed7af94b3585ec2f2e43f49c93f2416110/helpers/logging#L325) [/details] ---------------- @@ -820,7 +854,7 @@ Requires YunoHost version 3.2.0 or higher for the argument `--specific_user` -[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/6fc6a2ba4c17434803cea2553a3dc7c51cedd338/data/helpers.d/logrotate#L18) +[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/8a9ed1ed7af94b3585ec2f2e43f49c93f2416110/helpers/logrotate#L18) [/details] ---------------- @@ -834,7 +868,7 @@ Requires YunoHost version 2.6.4 or higher. -[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/6fc6a2ba4c17434803cea2553a3dc7c51cedd338/data/helpers.d/logrotate#L100) +[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/8a9ed1ed7af94b3585ec2f2e43f49c93f2416110/helpers/logrotate#L100) [/details] ---------------- @@ -851,7 +885,7 @@ Requires YunoHost version 4.2 or higher. -[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/6fc6a2ba4c17434803cea2553a3dc7c51cedd338/data/helpers.d/multimedia#L11) +[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/8a9ed1ed7af94b3585ec2f2e43f49c93f2416110/helpers/multimedia#L11) [/details] ---------------- @@ -871,7 +905,7 @@ Requires YunoHost version 4.2 or higher. -[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/6fc6a2ba4c17434803cea2553a3dc7c51cedd338/data/helpers.d/multimedia#L64) +[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/8a9ed1ed7af94b3585ec2f2e43f49c93f2416110/helpers/multimedia#L64) [/details] ---------------- @@ -888,7 +922,7 @@ Requires YunoHost version 4.2 or higher. -[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/6fc6a2ba4c17434803cea2553a3dc7c51cedd338/data/helpers.d/multimedia#L93) +[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/8a9ed1ed7af94b3585ec2f2e43f49c93f2416110/helpers/multimedia#L93) [/details] ---------------- @@ -921,7 +955,7 @@ Requires YunoHost version 2.2.4 or higher. -[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/6fc6a2ba4c17434803cea2553a3dc7c51cedd338/data/helpers.d/mysql#L15) +[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/8a9ed1ed7af94b3585ec2f2e43f49c93f2416110/helpers/mysql#L15) [/details] ---------------- @@ -939,7 +973,7 @@ Requires YunoHost version 2.2.4 or higher. -[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/6fc6a2ba4c17434803cea2553a3dc7c51cedd338/data/helpers.d/mysql#L36) +[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/8a9ed1ed7af94b3585ec2f2e43f49c93f2416110/helpers/mysql#L36) [/details] ---------------- @@ -957,7 +991,7 @@ Requires YunoHost version 2.2.4 or higher. -[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/6fc6a2ba4c17434803cea2553a3dc7c51cedd338/data/helpers.d/mysql#L60) +[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/8a9ed1ed7af94b3585ec2f2e43f49c93f2416110/helpers/mysql#L60) [/details] ---------------- @@ -978,7 +1012,7 @@ Requires YunoHost version 2.2.4 or higher. -[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/6fc6a2ba4c17434803cea2553a3dc7c51cedd338/data/helpers.d/mysql#L128) +[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/8a9ed1ed7af94b3585ec2f2e43f49c93f2416110/helpers/mysql#L128) [/details] ---------------- @@ -997,7 +1031,7 @@ Requires YunoHost version 2.2.4 or higher. -[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/6fc6a2ba4c17434803cea2553a3dc7c51cedd338/data/helpers.d/mysql#L160) +[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/8a9ed1ed7af94b3585ec2f2e43f49c93f2416110/helpers/mysql#L160) [/details] ---------------- @@ -1019,7 +1053,7 @@ Requires YunoHost version 2.6.4 or higher. -[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/6fc6a2ba4c17434803cea2553a3dc7c51cedd338/data/helpers.d/mysql#L198) +[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/8a9ed1ed7af94b3585ec2f2e43f49c93f2416110/helpers/mysql#L198) [/details] ---------------- @@ -1037,7 +1071,7 @@ Requires YunoHost version 2.6.4 or higher. -[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/6fc6a2ba4c17434803cea2553a3dc7c51cedd338/data/helpers.d/mysql#L224) +[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/8a9ed1ed7af94b3585ec2f2e43f49c93f2416110/helpers/mysql#L224) [/details] ---------------- @@ -1061,7 +1095,7 @@ Requires YunoHost version 2.6.4 or higher. -[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/6fc6a2ba4c17434803cea2553a3dc7c51cedd338/data/helpers.d/network#L12) +[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/8a9ed1ed7af94b3585ec2f2e43f49c93f2416110/helpers/network#L12) [/details] ---------------- @@ -1082,7 +1116,7 @@ Requires YunoHost version 3.8.0 or higher. -[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/6fc6a2ba4c17434803cea2553a3dc7c51cedd338/data/helpers.d/network#L36) +[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/8a9ed1ed7af94b3585ec2f2e43f49c93f2416110/helpers/network#L36) [/details] ---------------- @@ -1103,7 +1137,7 @@ Requires YunoHost version 2.2.4 or higher. -[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/6fc6a2ba4c17434803cea2553a3dc7c51cedd338/data/helpers.d/network#L99) +[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/8a9ed1ed7af94b3585ec2f2e43f49c93f2416110/helpers/network#L99) [/details] ---------------- @@ -1124,7 +1158,7 @@ Requires YunoHost version 2.2.4 or higher. -[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/6fc6a2ba4c17434803cea2553a3dc7c51cedd338/data/helpers.d/network#L119) +[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/8a9ed1ed7af94b3585ec2f2e43f49c93f2416110/helpers/network#L119) [/details] ---------------- @@ -1152,7 +1186,7 @@ Requires YunoHost version 4.1.0 or higher. -[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/6fc6a2ba4c17434803cea2553a3dc7c51cedd338/data/helpers.d/nginx#L19) +[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/8a9ed1ed7af94b3585ec2f2e43f49c93f2416110/helpers/nginx#L19) [/details] ---------------- @@ -1166,7 +1200,7 @@ Requires YunoHost version 2.7.2 or higher. -[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/6fc6a2ba4c17434803cea2553a3dc7c51cedd338/data/helpers.d/nginx#L39) +[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/8a9ed1ed7af94b3585ec2f2e43f49c93f2416110/helpers/nginx#L41) [/details] ---------------- @@ -1220,7 +1254,7 @@ Requires YunoHost version 2.7.12 or higher. -[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/6fc6a2ba4c17434803cea2553a3dc7c51cedd338/data/helpers.d/nodejs#L73) +[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/8a9ed1ed7af94b3585ec2f2e43f49c93f2416110/helpers/nodejs#L74) [/details] ---------------- @@ -1244,7 +1278,7 @@ Requires YunoHost version 2.7.12 or higher. -[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/6fc6a2ba4c17434803cea2553a3dc7c51cedd338/data/helpers.d/nodejs#L113) +[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/8a9ed1ed7af94b3585ec2f2e43f49c93f2416110/helpers/nodejs#L114) [/details] ---------------- @@ -1262,7 +1296,7 @@ Requires YunoHost version 2.7.12 or higher. -[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/6fc6a2ba4c17434803cea2553a3dc7c51cedd338/data/helpers.d/nodejs#L190) +[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/8a9ed1ed7af94b3585ec2f2e43f49c93f2416110/helpers/nodejs#L191) [/details] ---------------- @@ -1335,7 +1369,7 @@ Requires YunoHost version 3.7.0 or higher. -[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/6fc6a2ba4c17434803cea2553a3dc7c51cedd338/data/helpers.d/permission#L66) +[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/8a9ed1ed7af94b3585ec2f2e43f49c93f2416110/helpers/permission#L66) [/details] ---------------- @@ -1354,7 +1388,7 @@ Requires YunoHost version 3.7.0 or higher. -[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/6fc6a2ba4c17434803cea2553a3dc7c51cedd338/data/helpers.d/permission#L152) +[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/8a9ed1ed7af94b3585ec2f2e43f49c93f2416110/helpers/permission#L152) [/details] ---------------- @@ -1372,7 +1406,7 @@ Requires YunoHost version 3.7.0 or higher. -[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/6fc6a2ba4c17434803cea2553a3dc7c51cedd338/data/helpers.d/permission#L169) +[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/8a9ed1ed7af94b3585ec2f2e43f49c93f2416110/helpers/permission#L169) [/details] ---------------- @@ -1395,7 +1429,7 @@ Requires YunoHost version 3.7.0 or higher. -[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/6fc6a2ba4c17434803cea2553a3dc7c51cedd338/data/helpers.d/permission#L192) +[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/8a9ed1ed7af94b3585ec2f2e43f49c93f2416110/helpers/permission#L192) [/details] ---------------- @@ -1418,7 +1452,7 @@ Requires YunoHost version 3.7.0 or higher. -[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/6fc6a2ba4c17434803cea2553a3dc7c51cedd338/data/helpers.d/permission#L260) +[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/8a9ed1ed7af94b3585ec2f2e43f49c93f2416110/helpers/permission#L260) [/details] ---------------- @@ -1439,7 +1473,7 @@ Requires YunoHost version 3.7.1 or higher. -[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/6fc6a2ba4c17434803cea2553a3dc7c51cedd338/data/helpers.d/permission#L329) +[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/8a9ed1ed7af94b3585ec2f2e43f49c93f2416110/helpers/permission#L329) [/details] ---------------- @@ -1454,7 +1488,7 @@ Requires YunoHost version 4.1.2 or higher. -[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/6fc6a2ba4c17434803cea2553a3dc7c51cedd338/data/helpers.d/permission#L359) +[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/8a9ed1ed7af94b3585ec2f2e43f49c93f2416110/helpers/permission#L359) [/details] ---------------- @@ -1465,7 +1499,7 @@ Requires YunoHost version 4.1.2 or higher. **Example**: `if ynh_legacy_permissions_exists then ynh_legacy_permissions_delete_all # You can recreate the required permissions here with ynh_permission_create fi Requires YunoHost version 4.1.2 or higher.` -[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/6fc6a2ba4c17434803cea2553a3dc7c51cedd338/data/helpers.d/permission#L379) +[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/8a9ed1ed7af94b3585ec2f2e43f49c93f2416110/helpers/permission#L379) [/details] ---------------- @@ -1523,7 +1557,7 @@ Requires YunoHost version 4.1.0 or higher. -[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/6fc6a2ba4c17434803cea2553a3dc7c51cedd338/data/helpers.d/php#L59) +[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/8a9ed1ed7af94b3585ec2f2e43f49c93f2416110/helpers/php#L59) [/details] ---------------- @@ -1537,7 +1571,7 @@ Requires YunoHost version 2.7.2 or higher. -[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/6fc6a2ba4c17434803cea2553a3dc7c51cedd338/data/helpers.d/php#L250) +[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/8a9ed1ed7af94b3585ec2f2e43f49c93f2416110/helpers/php#L250) [/details] ---------------- @@ -1556,7 +1590,7 @@ Requires YunoHost version 4.2 or higher. -[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/6fc6a2ba4c17434803cea2553a3dc7c51cedd338/data/helpers.d/php#L481) +[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/8a9ed1ed7af94b3585ec2f2e43f49c93f2416110/helpers/php#L483) [/details] ---------------- @@ -1576,7 +1610,7 @@ Requires YunoHost version 4.2 or higher. -[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/6fc6a2ba4c17434803cea2553a3dc7c51cedd338/data/helpers.d/php#L507) +[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/8a9ed1ed7af94b3585ec2f2e43f49c93f2416110/helpers/php#L509) [/details] ---------------- @@ -1609,7 +1643,7 @@ Requires YunoHost version 3.5.0 or higher. -[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/6fc6a2ba4c17434803cea2553a3dc7c51cedd338/data/helpers.d/postgresql#L18) +[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/8a9ed1ed7af94b3585ec2f2e43f49c93f2416110/helpers/postgresql#L18) [/details] ---------------- @@ -1627,7 +1661,7 @@ Requires YunoHost version 3.5.0 or higher. -[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/6fc6a2ba4c17434803cea2553a3dc7c51cedd338/data/helpers.d/postgresql#L39) +[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/8a9ed1ed7af94b3585ec2f2e43f49c93f2416110/helpers/postgresql#L39) [/details] ---------------- @@ -1645,7 +1679,7 @@ Requires YunoHost version 3.5.0 or higher. -[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/6fc6a2ba4c17434803cea2553a3dc7c51cedd338/data/helpers.d/postgresql#L64) +[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/8a9ed1ed7af94b3585ec2f2e43f49c93f2416110/helpers/postgresql#L64) [/details] ---------------- @@ -1666,7 +1700,7 @@ Requires YunoHost version 3.5.0 or higher. -[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/6fc6a2ba4c17434803cea2553a3dc7c51cedd338/data/helpers.d/postgresql#L135) +[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/8a9ed1ed7af94b3585ec2f2e43f49c93f2416110/helpers/postgresql#L135) [/details] ---------------- @@ -1684,7 +1718,7 @@ Requires YunoHost version 3.5.0 or higher. -[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/6fc6a2ba4c17434803cea2553a3dc7c51cedd338/data/helpers.d/postgresql#L168) +[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/8a9ed1ed7af94b3585ec2f2e43f49c93f2416110/helpers/postgresql#L168) [/details] ---------------- @@ -1702,7 +1736,7 @@ Requires YunoHost version 3.5.0 or higher. -[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/6fc6a2ba4c17434803cea2553a3dc7c51cedd338/data/helpers.d/postgresql#L190) +[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/8a9ed1ed7af94b3585ec2f2e43f49c93f2416110/helpers/postgresql#L190) [/details] ---------------- @@ -1724,7 +1758,7 @@ Requires YunoHost version 2.7.13 or higher. -[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/6fc6a2ba4c17434803cea2553a3dc7c51cedd338/data/helpers.d/postgresql#L228) +[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/8a9ed1ed7af94b3585ec2f2e43f49c93f2416110/helpers/postgresql#L228) [/details] ---------------- @@ -1742,24 +1776,7 @@ Requires YunoHost version 2.7.13 or higher. -[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/6fc6a2ba4c17434803cea2553a3dc7c51cedd338/data/helpers.d/postgresql#L259) -[/details] ----------------- - -#### ynh_psql_test_if_first_run -[details summary="Create a master password and set up global settings" class="helper-card-subtitle text-muted"] - -**Usage**: `ynh_psql_test_if_first_run` - -**Details**:
    -It also make sure that postgresql is installed and running -Please always call this script in install and restore scripts - -Requires YunoHost version 2.7.13 or higher. - - - -[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/6fc6a2ba4c17434803cea2553a3dc7c51cedd338/data/helpers.d/postgresql#L290) +[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/8a9ed1ed7af94b3585ec2f2e43f49c93f2416110/helpers/postgresql#L259) [/details] ---------------- @@ -1780,7 +1797,7 @@ Requires YunoHost version 2.2.4 or higher. -[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/6fc6a2ba4c17434803cea2553a3dc7c51cedd338/data/helpers.d/setting#L10) +[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/8a9ed1ed7af94b3585ec2f2e43f49c93f2416110/helpers/setting#L10) [/details] ---------------- @@ -1799,7 +1816,7 @@ Requires YunoHost version 2.2.4 or higher. -[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/6fc6a2ba4c17434803cea2553a3dc7c51cedd338/data/helpers.d/setting#L36) +[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/8a9ed1ed7af94b3585ec2f2e43f49c93f2416110/helpers/setting#L36) [/details] ---------------- @@ -1817,7 +1834,7 @@ Requires YunoHost version 2.2.4 or higher. -[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/6fc6a2ba4c17434803cea2553a3dc7c51cedd338/data/helpers.d/setting#L62) +[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/8a9ed1ed7af94b3585ec2f2e43f49c93f2416110/helpers/setting#L62) [/details] ---------------- @@ -1837,7 +1854,7 @@ Requires YunoHost version 2.6.4 or higher. -[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/6fc6a2ba4c17434803cea2553a3dc7c51cedd338/data/helpers.d/setting#L123) +[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/8a9ed1ed7af94b3585ec2f2e43f49c93f2416110/helpers/setting#L123) [/details] ---------------- @@ -1858,7 +1875,7 @@ Requires YunoHost version 2.6.4 or higher. -[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/6fc6a2ba4c17434803cea2553a3dc7c51cedd338/data/helpers.d/setting#L145) +[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/8a9ed1ed7af94b3585ec2f2e43f49c93f2416110/helpers/setting#L145) [/details] ---------------- @@ -1872,6 +1889,7 @@ Requires YunoHost version 2.6.4 or higher. **Arguments**: - `-l`, `--length=`: the string length to generate (default: 24) +- `-f`, `--filter=`: the kind of characters accepted in the output (default: 'A-Za-z0-9') **Returns**: the generated string @@ -1882,7 +1900,7 @@ Requires YunoHost version 2.2.4 or higher. -[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/6fc6a2ba4c17434803cea2553a3dc7c51cedd338/data/helpers.d/string#L12) +[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/8a9ed1ed7af94b3585ec2f2e43f49c93f2416110/helpers/string#L13) [/details] ---------------- @@ -1904,7 +1922,7 @@ Requires YunoHost version 2.6.4 or higher. -[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/6fc6a2ba4c17434803cea2553a3dc7c51cedd338/data/helpers.d/string#L37) +[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/8a9ed1ed7af94b3585ec2f2e43f49c93f2416110/helpers/string#L40) [/details] ---------------- @@ -1926,7 +1944,7 @@ Requires YunoHost version 2.7.7 or higher. -[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/6fc6a2ba4c17434803cea2553a3dc7c51cedd338/data/helpers.d/string#L68) +[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/8a9ed1ed7af94b3585ec2f2e43f49c93f2416110/helpers/string#L71) [/details] ---------------- @@ -1949,7 +1967,7 @@ Requires YunoHost version 2.2.4 or higher. -[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/6fc6a2ba4c17434803cea2553a3dc7c51cedd338/data/helpers.d/string#L100) +[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/8a9ed1ed7af94b3585ec2f2e43f49c93f2416110/helpers/string#L103) [/details] ---------------- @@ -1975,7 +1993,7 @@ Requires YunoHost version 4.1.0 or higher. -[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/6fc6a2ba4c17434803cea2553a3dc7c51cedd338/data/helpers.d/systemd#L15) +[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/8a9ed1ed7af94b3585ec2f2e43f49c93f2416110/helpers/systemd#L15) [/details] ---------------- @@ -1992,7 +2010,7 @@ Requires YunoHost version 2.7.2 or higher. -[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/6fc6a2ba4c17434803cea2553a3dc7c51cedd338/data/helpers.d/systemd#L42) +[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/8a9ed1ed7af94b3585ec2f2e43f49c93f2416110/helpers/systemd#L38) [/details] ---------------- @@ -2014,7 +2032,7 @@ Requires YunoHost version 3.5.0 or higher. -[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/6fc6a2ba4c17434803cea2553a3dc7c51cedd338/data/helpers.d/systemd#L71) +[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/8a9ed1ed7af94b3585ec2f2e43f49c93f2416110/helpers/systemd#L67) [/details] ---------------- @@ -2038,7 +2056,7 @@ Requires YunoHost version 2.2.4 or higher. -[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/6fc6a2ba4c17434803cea2553a3dc7c51cedd338/data/helpers.d/user#L12) +[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/8a9ed1ed7af94b3585ec2f2e43f49c93f2416110/helpers/user#L12) [/details] ---------------- @@ -2053,14 +2071,14 @@ Requires YunoHost version 2.2.4 or higher. **Returns**: the value associate to that key -**Example**: `mail=$(ynh_user_get_info 'toto' 'mail')` +**Example**: `mail=$(ynh_user_get_info --username="toto" --key=mail)` **Details**:
    Requires YunoHost version 2.2.4 or higher. -[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/6fc6a2ba4c17434803cea2553a3dc7c51cedd338/data/helpers.d/user#L33) +[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/8a9ed1ed7af94b3585ec2f2e43f49c93f2416110/helpers/user#L33) [/details] ---------------- @@ -2078,7 +2096,7 @@ Requires YunoHost version 2.4.0 or higher. -[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/6fc6a2ba4c17434803cea2553a3dc7c51cedd338/data/helpers.d/user#L53) +[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/8a9ed1ed7af94b3585ec2f2e43f49c93f2416110/helpers/user#L53) [/details] ---------------- @@ -2097,7 +2115,7 @@ Requires YunoHost version 2.2.4 or higher. -[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/6fc6a2ba4c17434803cea2553a3dc7c51cedd338/data/helpers.d/user#L64) +[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/8a9ed1ed7af94b3585ec2f2e43f49c93f2416110/helpers/user#L64) [/details] ---------------- @@ -2116,7 +2134,7 @@ Requires YunoHost version 3.5.0.2 or higher. -[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/6fc6a2ba4c17434803cea2553a3dc7c51cedd338/data/helpers.d/user#L82) +[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/8a9ed1ed7af94b3585ec2f2e43f49c93f2416110/helpers/user#L82) [/details] ---------------- @@ -2145,7 +2163,7 @@ Requires YunoHost version 2.6.4 or higher. -[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/6fc6a2ba4c17434803cea2553a3dc7c51cedd338/data/helpers.d/user#L111) +[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/8a9ed1ed7af94b3585ec2f2e43f49c93f2416110/helpers/user#L111) [/details] ---------------- @@ -2162,7 +2180,7 @@ Requires YunoHost version 2.6.4 or higher. -[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/6fc6a2ba4c17434803cea2553a3dc7c51cedd338/data/helpers.d/user#L153) +[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/8a9ed1ed7af94b3585ec2f2e43f49c93f2416110/helpers/user#L153) [/details] ---------------- @@ -2176,7 +2194,7 @@ Requires YunoHost version 4.1.7 or higher. -[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/6fc6a2ba4c17434803cea2553a3dc7c51cedd338/data/helpers.d/user#L179) +[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/8a9ed1ed7af94b3585ec2f2e43f49c93f2416110/helpers/user#L179) [/details] ---------------- @@ -2197,7 +2215,7 @@ Requires YunoHost version 2.6.4 or higher. -[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/6fc6a2ba4c17434803cea2553a3dc7c51cedd338/data/helpers.d/utils#L58) +[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/8a9ed1ed7af94b3585ec2f2e43f49c93f2416110/helpers/utils#L58) [/details] ---------------- @@ -2246,7 +2264,7 @@ Requires YunoHost version 2.6.4 or higher. -[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/6fc6a2ba4c17434803cea2553a3dc7c51cedd338/data/helpers.d/utils#L102) +[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/8a9ed1ed7af94b3585ec2f2e43f49c93f2416110/helpers/utils#L102) [/details] ---------------- @@ -2272,7 +2290,7 @@ Requires YunoHost version 2.6.4 or higher. -[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/6fc6a2ba4c17434803cea2553a3dc7c51cedd338/data/helpers.d/utils#L263) +[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/8a9ed1ed7af94b3585ec2f2e43f49c93f2416110/helpers/utils#L263) [/details] ---------------- @@ -2288,11 +2306,7 @@ Requires YunoHost version 2.6.4 or higher. **Examples**: -- ` ynh_add_config --template=".env" --destination="$final_path/.env"` - - - -- ` ynh_add_config --template="../conf/.env" --destination="$final_path/.env"` +- ` ynh_add_config --template=".env" --destination="$final_path/.env" use the template file "../conf/.env"` @@ -2334,7 +2348,7 @@ Requires YunoHost version 4.1.0 or higher. -[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/6fc6a2ba4c17434803cea2553a3dc7c51cedd338/data/helpers.d/utils#L348) +[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/8a9ed1ed7af94b3585ec2f2e43f49c93f2416110/helpers/utils#L347) [/details] ---------------- @@ -2378,7 +2392,7 @@ Requires YunoHost version 4.3 or higher. -[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/6fc6a2ba4c17434803cea2553a3dc7c51cedd338/data/helpers.d/utils#L499) +[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/8a9ed1ed7af94b3585ec2f2e43f49c93f2416110/helpers/utils#L498) [/details] ---------------- @@ -2397,7 +2411,7 @@ Requires YunoHost version 4.3 or higher. -[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/6fc6a2ba4c17434803cea2553a3dc7c51cedd338/data/helpers.d/utils#L576) +[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/8a9ed1ed7af94b3585ec2f2e43f49c93f2416110/helpers/utils#L575) [/details] ---------------- @@ -2413,7 +2427,7 @@ Requires YunoHost version 2.7.12 or higher. -[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/6fc6a2ba4c17434803cea2553a3dc7c51cedd338/data/helpers.d/utils#L688) +[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/8a9ed1ed7af94b3585ec2f2e43f49c93f2416110/helpers/utils#L687) [/details] ---------------- @@ -2430,7 +2444,7 @@ Requires YunoHost version 2.6.4 or higher. -[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/6fc6a2ba4c17434803cea2553a3dc7c51cedd338/data/helpers.d/utils#L740) +[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/8a9ed1ed7af94b3585ec2f2e43f49c93f2416110/helpers/utils#L718) [/details] ---------------- @@ -2450,7 +2464,7 @@ Requires YunoHost version 3.5.0 or higher. -[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/6fc6a2ba4c17434803cea2553a3dc7c51cedd338/data/helpers.d/utils#L802) +[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/8a9ed1ed7af94b3585ec2f2e43f49c93f2416110/helpers/utils#L752) [/details] ---------------- @@ -2475,7 +2489,7 @@ Requires YunoHost version 3.5.0 or higher. -[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/6fc6a2ba4c17434803cea2553a3dc7c51cedd338/data/helpers.d/utils#L832) +[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/8a9ed1ed7af94b3585ec2f2e43f49c93f2416110/helpers/utils#L782) [/details] ---------------- @@ -2498,7 +2512,7 @@ Requires YunoHost version 3.5.0 or higher. -[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/6fc6a2ba4c17434803cea2553a3dc7c51cedd338/data/helpers.d/utils#L861) +[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/8a9ed1ed7af94b3585ec2f2e43f49c93f2416110/helpers/utils#L811) [/details] ---------------- @@ -2521,7 +2535,7 @@ Requires YunoHost version 3.5.0 or higher. -[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/6fc6a2ba4c17434803cea2553a3dc7c51cedd338/data/helpers.d/utils#L886) +[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/8a9ed1ed7af94b3585ec2f2e43f49c93f2416110/helpers/utils#L836) [/details] ---------------- @@ -2553,7 +2567,7 @@ Requires YunoHost version 3.8.0 or higher. -[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/6fc6a2ba4c17434803cea2553a3dc7c51cedd338/data/helpers.d/utils#L916) +[Dude, show me the code!](https://github.com/YunoHost/yunohost/blob/8a9ed1ed7af94b3585ec2f2e43f49c93f2416110/helpers/utils#L866) [/details] ---------------- diff --git a/pages/06.contribute/10.packaging_apps/12.hooks/packaging_apps_hooks.fr.md b/pages/06.contribute/10.packaging_apps/12.hooks/packaging_apps_hooks.fr.md new file mode 100644 index 00000000..87028c7f --- /dev/null +++ b/pages/06.contribute/10.packaging_apps/12.hooks/packaging_apps_hooks.fr.md @@ -0,0 +1,36 @@ +--- +title: Hooks +template: docs +taxonomy: + category: docs +routes: + default: '/packaging_apps_hooks' +--- +YunoHost comprend un mécanisme de hooks déclenchés lors de nombreuses opérations modifiant le système. Vous pouvez utiliser ce mécanisme afin d'étendre le comportement d'une commande yunohost. + +Le cas le plus évident est l'ajout d'un utilisateur. Si vous aviez un hook `post_user_create`, ce hook sera déclenché dès qu'un utilisateur sera ajouté. + +## Comment ajouter un hook personnalisé sur une instance spécifique +!!! Nous imaginons ci-dessous que nous voulons lancer une commande après chaque création d'utilisateur pour ajouter l'utilisateur à l'utilisateur samba. + +Vous devez créer un répertoire avec le nom des hooks dans `/etc/yunohost/hooks.d/` : +``` +mkdir -p /etc/yunohost/hooks.d/post_user_create +``` + +Créez ensuite un script bash à l'intérieur de ce répertoire, préfixé par 2 chiffres et un tiret : +```bash +nano /etc/yunohost/hooks.d/post_user_create/05-add-user-to-samba +``` + +## Comment ajouter un hook dans un paquetage d'application +Si vous empaquetez une application, vous ne devez pas mettre vous-même le hook dans `/etc/yunohost/hooks.d mais vous devez créer un répertoire hooks à la racine de votre paquet. +``` +. +├─── conf +├─── hooks +├── scripts +``` +Dans le dossier des hooks, créer un script bash appelé avec le type de hook que vous voulez créer par exemple `post_create_user`. + +## -> [Liste des hooks et leurs variables](https://yunohost.org/en/packaging_apps_hooks) diff --git a/pages/06.contribute/10.packaging_apps/12.hooks/packaging_apps_hooks.md b/pages/06.contribute/10.packaging_apps/12.hooks/packaging_apps_hooks.md new file mode 100644 index 00000000..f8eeb359 --- /dev/null +++ b/pages/06.contribute/10.packaging_apps/12.hooks/packaging_apps_hooks.md @@ -0,0 +1,625 @@ +--- +title: Hooks +template: docs +taxonomy: + category: docs +routes: + default: '/packaging_apps_hooks' +--- + +YunoHost includes a hook mechanism triggered on a lot of operation changing the system. You can use this mechanism in order to extend the behaviour of a yunohost command. + +The most obvious case is adding a user. If you had a `post_user_create` hook, this hook will be triggered as soon as a user is added. + +## How to add a custom hook on a specific instance +!!! Bellow we imagine we want to run a command after each user creation to add the user to samba user. + +You should create a directory with the name of the hooks into `/etc/yunohost/hooks.d/`: +``` +mkdir -p /etc/yunohost/hooks.d/post_user_create +``` + +Next create a bash script inside this directory prefixed by 2 numbers and a dash: +```bash +nano /etc/yunohost/hooks.d/post_user_create/05-add-user-to-samba +``` + +## How to add a hook in an app package +If you are packaging an app, you should not set by yourself the hook into `/etc/yunohost/hooks.d` instead you should create a hooks dir at the root of your package. +``` +. +├── conf +├── hooks +├── scripts +``` + +In the hooks dir, create a bash script called with the type of hook you want to create for example `post_create_user`. + +## Hooks referencies +### User and permissions +#### post_user_create +[details summary="Triggered after user creation" class="helper-card-subtitle text-muted"] + +This hooks is run at the end of the command `yunohost user create` or equivalent action in webadmin. + +##### Environment variables + + - YNH_USER_USERNAME: The username of the created user + - YNH_USER_MAIL: The mail of the created user + - YNH_USER_PASSWORD: The **clear** password of the created user + - YNH_USER_FIRSTNAME: The firstname of the created user ([should be removed in future](https://github.com/YunoHost/issues/issues/296)) + - YNH_USER_LASTNAME: The lastname of the created user ([should be removed in future](https://github.com/YunoHost/issues/issues/296)) + +##### Positionnal arguments (deprecated) + + - $1: The username of the created user + - $2: The mail of the created user + +##### No waited return + +##### Examples + +###### Send automatically a mail to new user +```bash +#!/bin/bash +domain=$(cat /etc/hostname) + +message="Hello $YNH_USER_FIRSTNAME, +Welcome on $domain ! +Feel free to change your password. +Let me know if you have a problem, +The admin of $domain +" + +echo $message | mail -s "Welcome on $domain !" $YNH_USER_MAIL +``` +[/details] + + + +#### post_user_delete +[details summary="Triggered at the end of user deletion" class="helper-card-subtitle text-muted"] + +This hooks is run at the end of the command `yunohost user delete` or equivalent action in webadmin. + +##### No environment variables + +##### Positionnal arguments + + - $1: The username of the user deleted + - $2: True if --purge option is used + +##### No waited return + +##### Examples + +###### +```bash +#!/bin/bash +``` +[/details] + + + +### post_user_update +[details summary="Triggered at the end of the user update" class="helper-card-subtitle text-muted"] + +This hooks is run at the end of the command `yunohost user update` or equivalent action in webadmin. + +##### Environment variables + +! Only arguments given to the cli/api are given as environment variable. + - YNH_USER_USERNAME: The username of the updated user + - YNH_USER_FIRSTNAME: The firstname of the updated user ([should be removed in future](https://github.com/YunoHost/issues/issues/296)) + - YNH_USER_LASTNAME: The lastname of the updated user ([should be removed in future](https://github.com/YunoHost/issues/issues/296)) + - YNH_USER_PASSWORD: The new password of the updated user + - YNH_USER_MAILS: The mail and mail aliases of the updated user seperated by comma + - YNH_USER_MAILFORWARDS: The list of forward mails of the updated user separated by comma + - YNH_USER_MAILQUOTA: The quota of the updated user (could be 0 or a number following by one of this unit: b, k, M, G or T) + +##### No positionnal arguments + +##### No waited return + +##### Examples + +###### Send a mail on password changing +```bash +#!/bin/bash +" +domain=$(cat /etc/hostname) + +message="Hello, +Your password has been successfully changed on $domain. +If you have not asked for changing your password, you probably should contact the admin of $domain. +" + +echo $message | mail -s "Your password has been changed on $domain !" $YNH_USER_USERNAME +``` +[/details] + + + +### post_app_addaccess +[details summary="Triggered after adding a permission to users or groups " class="helper-card-subtitle text-muted"] + +This hooks is run at the end of the command `yunohost user permission add` or equivalent action in webadmin. + +##### No environment variables + +##### Positionnal arguments (deprecated) + + - $1: The app name + - $2: The list of users added separated by comma + - $3: The name of the sub permission (`main`, `admin`, etc.) + - $4: The list of groups added separated by comma + +##### No waited return + +##### Examples +[/details] + + + +### post_app_removeaccess +[details summary="Triggered after removing a pemission to users or groups" class="helper-card-subtitle text-muted"] + +This hooks is run at the end of the command `yunohost user permission remove` or equivalent action in webadmin. + +##### No environment variables + +##### Positionnal arguments (deprecated) + + - $1: The app name + - $2: The list of users removed from the permission separated by comma + - $3: The name of the sub permission (`main`, `admin`, etc.) + - $4: The list of groups removed from the permission separated by comma + +##### No waited return + +##### Examples +[/details] + + + + + + + +## Domain, certificates and DNS +### post_domain_add +[details summary="Triggered at the end of the domain add operation" class="helper-card-subtitle text-muted"] + +This hooks is run at the end of the command `yunohost domain add` or equivalent action in webadmin. + +##### No environment variable + +##### Positionnal arguments (deprecated) + + - $1: The domain added + +##### No waited return + +##### Examples + +###### +```bash + +``` +[/details] + + + + +### post_domain_remove +[details summary="Triggered after removing the domain" class="helper-card-subtitle text-muted"] + +This hooks is run at the end of the command `yunohost domain remove` or equivalent action in webadmin. + +##### No environment variable + +##### Positionnal arguments (deprecated) + + - $1: The domain removed + +##### No waited return + +##### Examples +[/details] + + + + +### post_cert_update +[details summary="Triggered after Let's encrypt certificate update" class="helper-card-subtitle text-muted"] + +This hooks is run at the end of the command `yunohost domain cert update` or equivalent action in webadmin. + +##### No environment variable + +##### Positionnal arguments + + - $1: The domain for which we have updated the certificate + +##### No waited return + +##### Examples + +###### Restart a service after cert renewal +```bash +#!/bin/bash +systemctl restart gemserv +``` +[/details] + + + + +### custom_dns_rules +[details summary="Customized your DNS rules for your domains" class="helper-card-subtitle text-muted"] + +This hooks is run at the end of the command `yunohost domain dns suggest` or equivalent action in webadmin. + +Thanks to this hooks you can customize + +##### No environment variable + +##### Positionnal arguments + + - $1: The base domain for which we want to build a DNS suggestion + +##### Waited return +The script should return a JSON array with dictionnary in this format: +```json +[ + { + 'type': 'SRV', + 'name': 'stuff.foo.bar', + 'value': 'yoloswag', + 'ttl': 3600 + } +] +``` + + +##### Examples + +###### Validate Let's Encrypt DNS challenge with a YunoHost DynDNS domain +```bash +#!/bin/bash +if [[ "$1" == "XXXX.nohost.me" ]] ; then + echo "[ + { + 'type': 'TXT', + 'name': '_acme-challenge', + 'value': 'LETSENCRYPT_VALUE', + 'ttl': 3600 + } + ]" +fi + +``` +[/details] + + + + + +## Apps +### post_app_change_url +[details summary="Triggered after an app has changed of URL" class="helper-card-subtitle text-muted"] + +This hooks is run at the end of the command `yunohost app change-url` or equivalent action in webadmin. + +##### Environment variables + + - YNH_APP_OLD_DOMAIN: The old domain of the app + - YNH_APP_OLD_PATH: The old path of the app + - YNH_APP_NEW_DOMAIN: The new domain of the app + - YNH_APP_NEW_PATH: The new path of the app + +##### No positionnal arguments + +##### No waited return + +##### Examples +[/details] + +### post_app_upgrade +[details summary="Triggered on app upgrade" class="helper-card-subtitle text-muted"] + +This hooks is run at the end of the command `yunohost app upgrade` or equivalent action in webadmin. + +##### Environment variables + + - YNH_APP_ID: The app id (for example nextcloud) + - YNH_APP_INSTANCE_NAME: The app instance name (for example nextcloud__2) + - YNH_APP_INSTANCE_NUMBER: The app instance number (for example 2) + - YNH_APP_MANIFEST_VERSION: The app manifest version (for example 1 or ?) + - YNH_ARCH: The arch as returned by `dpkg --print-architecture` + - YNH_APP_UPGRADE_TYPE: The type of upgrade (UPGRADE_PACKAGE, UPGRADE_APP, UPGRADE_FULL) + - YNH_APP_MANIFEST_VERSION: The version number + - YNH_APP_CURRENT_VERSION: The version number of the app (in the yunohost format) + - NO_BACKUP_UPGRADE: 1 if we don't want to backup else 0 + +##### No positionnal arguments + +##### No waited return + +##### Examples + +###### Change a settings in an app config file (unmanaged by config panel) +```bash +#!/bin/bash + +source /usr/share/yunohost/helpers +app=$YNH_APP_INSTANCE_NAME + +if [[ "$app" == "etherpad_mypads" ]]; then + ynh_write_var_in_file --file=/var/www/etherpad_mypads/settings.json --key=max --value=100 --after=importExportRateLimiting + systemctl restart etherpad_mypads +fi + +``` +[/details] + +### post_app_install +[details summary="Triggered at the end of an app installation" class="helper-card-subtitle text-muted"] + +This hooks is run at the end of the command `yunohost app install` or equivalent action in webadmin. + +##### Environment variables + + - YNH_APP_ID: The app id (for example nextcloud) + - YNH_APP_INSTANCE_NAME: The app instance name (for example nextcloud__2) + - YNH_APP_INSTANCE_NUMBER: The app instance number (for example 2) + - YNH_APP_MANIFEST_VERSION: The app manifest version (for example 1 or ?) + - YNH_ARCH: The arch as returned by `dpkg --print-architecture` + - YNH_APP_ARG_XXXXXXX: The argument of the manifest + +##### No positionnal arguments + +##### No waited return + +##### Examples +[/details] + + +### post_app_remove +[details summary="Triggered after removing an app" class="helper-card-subtitle text-muted"] + +This hooks is run at the end of the command `yunohost app remove` or equivalent action in webadmin. + +##### Environment variables + + - YNH_APP_ID: The app id (for example nextcloud) + - YNH_APP_INSTANCE_NAME: The app instance name (for example nextcloud__2) + - YNH_APP_INSTANCE_NUMBER: The app instance number (for example 2) + - YNH_APP_MANIFEST_VERSION: The app manifest version (for example 1 or ?) + - YNH_ARCH: The arch as returned by `dpkg --print-architecture` + - YNH_APP_PURGE: 1 if the --purge option has been activated + +##### No positionnal arguments + +##### No waited return + +##### Examples +[/details] + +## Backup / Restore +### backup +[details summary="Add some files to backup" class="helper-card-subtitle text-muted"] + +This hooks is run at the end of the command `yunohost backup create` or equivalent action in webadmin. + +##### Environment variables + + - YNH_BACKUP_DIR: The work dir in which we can store temporary data to backup like database dump + - YNH_BACKUP_CSV: The CSV in which we add the things to backup. Don't use this directly and use ynh_backup helper instead. + - YNH_APP_BACKUP_DIR: To document + +##### Positionnal arguments + - $1: The work dir in which we can store temporary data to backup like database dump + +##### No waited return + +##### Examples + +###### Backup some files in more (for example your custom hooks) +```bash +#!/bin/bash + +# Source YNH helpers +source /usr/share/yunohost/helpers + +ynh_backup_dest (){ + YNH_CWD="${YNH_BACKUP_DIR%/}/$1" + mkdir -p $YNH_CWD + cd "$YNH_CWD" +} + +# Exit hook on subcommand error or unset variable +ynh_abort_if_errors + +# MISC +ynh_backup_dest "conf/custom/misc" +ynh_backup "/etc/sysctl.d/noipv6.conf" +ynh_backup "/usr/local/bin/" + +ynh_backup "/etc/yunohost/hooks.d/backup/99-conf_custom" +ynh_backup "/etc/yunohost/hooks.d/restore/99-conf_custom" + +``` +[/details] + +### restore +[details summary="Restore some files" class="helper-card-subtitle text-muted"] + +This hooks is run at the end of the command `yunohost backup restore` or equivalent action in webadmin. + +##### Environment variables + + - YNH_BACKUP_DIR: The work dir in which we can store temporary data to backup like database dump + - YNH_BACKUP_CSV: The CSV in which we add the things to backup. Don't use this directly and use ynh_backup helper instead. + +##### Positionnal arguments + - $1: The work dir in which we can store temporary data to backup like database dump + +##### No waited return + +##### Examples + +###### restore custom files +```bash +#!/bin/bash + +# Source YNH helpers +source /usr/share/yunohost/helpers + +ynh_restore_dest (){ + YNH_CWD="${YNH_BACKUP_DIR%/}/$1" + cd "$YNH_CWD" +} + +# Exit hook on subcommand error or unset variable +ynh_abort_if_errors + +# MISC +ynh_restore_dest "conf/custom/misc" +ynh_restore_file "/etc/sysctl.d/noipv6.conf" +ynh_restore_file "/usr/local/bin/" + +ynh_restore_file "/etc/yunohost/hooks.d/backup/99-conf_custom" +ynh_restore_file "/etc/yunohost/hooks.d/restore/99-conf_custom" + + +``` + +[/details] + +### backup_method +[details summary="Define a new way to backup and restore files" class="helper-card-subtitle text-muted"] + +This hooks is run during the command `yunohost backup create` or equivalent action in webadmin. + +This hook is called several times with different action keywords. + +##### No environment variables + +##### Positionnal arguments + + + - $1: The action ("need_mount", "backup", "mount") + - $2: The work dir + - $3: The name of the backup + - $4: The repository in which the backup should be done + - $5: An estimation size of the files to backup + - $6: A description of the archive + + +##### No waited return + +##### Examples + +###### A very simple backup on rotationnal disks +```bash +#!/bin/bash +set -euo pipefail + +work_dir="$2" +name="$3" +repo="$4" +size="$5" +description="$6" + +case "$1" in + need_mount) + # Set false if your method can itself put files in good place in your archive + true + ;; + backup) + mount /dev/sda1 /mnt/hdd + if [[ "$(df /mnt/hdd | tail -n1 | cut -d" " -f1)" != "/dev/sda1" ]] + then + exit 1 + fi + pushd "$work_dir" + current_date=$(date +"%Y-%m-%d_%H:%M") + cp -a "${work_dir}" "/mnt/hdd/${current_date}_$name" + popd + umount /mnt/hdd + ;; + *) + echo "hook called with unknown argument \`$1'" >&2 + exit 1 + ;; +esac + +exit 0 + +``` +[/details] + +## Configuration and firewall +### post_iptable_rules +[details summary="Triggered after reloaded the firewall rules" class="helper-card-subtitle text-muted"] + +This hooks is run at the end of the command `yunohost firewall reload` or equivalent action in webadmin. + +##### No environment variables + + +##### Positionnal arguments + + - $1: True if upnp has succeeded + - $2: True if ipv6 is available + +##### No waited return + +##### Examples + +###### Forbid completely the outgoing 25 port +```bash +#!/bin/bash +iptables -A OUTPUT -p tcp -m tcp --dport 25 -j ACCEPT +``` +[/details] + +### conf_regen +[details summary="Change configuration suggested as default config in regen-conf mechanism" class="helper-card-subtitle text-muted"] + +This hooks is run during the command `yunohost tools regen-conf` or equivalent action in webadmin. + +This hook is called several times with different actions keywords (pre and post operations). + +##### Environment variables + + - YNH_DOMAINS: The list of domains managed by Yunohost separated by comma + - YNH_MAIN_DOMAINS: The list of main domains separated by comma + +##### Positionnal arguments + + - $1: The pre or post action + - $2: Empty string due to legacy + - $3: Empty string due to legacy + - $4: In post mode the list of file which should be modified. In pre mode the dir in which we store pending configuration + +##### No waited return + +##### Examples + +###### Fix the warning about postfix compatibility mode in postfix logs +```bash +#!/bin/bash + +action=$1 +pending_dir=$4 +postfix_conf=$pending_dir/../postfix/etc/postfix/main.cf + +[[ "$action" == "pre" ]] || exit 0 +[[ -e $postfix_conf ]] || exit 0 +echo ' +compatibility_level = 2' >> $postfix_conf +``` +[/details] + diff --git a/pages/04.contribute/04.packaging_apps/14.advanced/01.actions/packaging_apps_actions.md b/pages/06.contribute/10.packaging_apps/14.advanced/01.actions/packaging_apps_actions.md similarity index 100% rename from pages/04.contribute/04.packaging_apps/14.advanced/01.actions/packaging_apps_actions.md rename to pages/06.contribute/10.packaging_apps/14.advanced/01.actions/packaging_apps_actions.md diff --git a/pages/04.contribute/04.packaging_apps/14.advanced/02.config_panel/packaging_apps_config_panel.md b/pages/06.contribute/10.packaging_apps/14.advanced/02.config_panel/packaging_apps_config_panel.md similarity index 100% rename from pages/04.contribute/04.packaging_apps/14.advanced/02.config_panel/packaging_apps_config_panel.md rename to pages/06.contribute/10.packaging_apps/14.advanced/02.config_panel/packaging_apps_config_panel.md diff --git a/pages/04.contribute/04.packaging_apps/14.advanced/packaging_apps_advanced.md b/pages/06.contribute/10.packaging_apps/14.advanced/packaging_apps_advanced.md similarity index 100% rename from pages/04.contribute/04.packaging_apps/14.advanced/packaging_apps_advanced.md rename to pages/06.contribute/10.packaging_apps/14.advanced/packaging_apps_advanced.md diff --git a/pages/06.contribute/10.packaging_apps/15.quality_tests/01.apps_levels/packaging_apps_levels.fr.md b/pages/06.contribute/10.packaging_apps/15.quality_tests/01.apps_levels/packaging_apps_levels.fr.md new file mode 100644 index 00000000..54cc0938 --- /dev/null +++ b/pages/06.contribute/10.packaging_apps/15.quality_tests/01.apps_levels/packaging_apps_levels.fr.md @@ -0,0 +1,50 @@ +--- +title: Niveaux de qualité des packages d'applications YunoHost +template: docs +taxonomy: + category: docs +routes: + default: '/packaging_apps_levels' +--- + +Afin de faciliter le packaging d'applications par des étapes successives à atteindre, chaque package est affublé d'un niveau de qualité, de 0 à 9. +Un package doit satisfaire un certain nombre de critères pour atteindre chaque niveau. De plus pour atteindre un niveau, le package doit avoir préalablement atteint le niveau précédent. + +Ce classement des applications par niveaux présente 3 avantages : +- Le packaging d'application est d'autant plus ludique, avec des objectifs clairs à atteindre et des étapes successives. +- Une application correctement packagée est davantage mise en avant qu'une application ne respectant pas les règles de packaging. +- Les utilisateurs peuvent rapidement voir le niveau d'une application et ainsi savoir si le package est de bonne qualité. + +## Résumé des niveaux + +**Niveau 0** +L'application ne fonctionne pas. + +**Niveau 1** +L'application s'installe et se désinstalle correctement dans certains cas. + +**Niveau 2** +L'application s'installe et se désinstalle correctement dans toutes les configurations communes. + +**Niveau 3** +L'application peut être mise à jour. + +**Niveau 4** +L'application peut-être sauvegardée et restaurée. + +**Niveau 5** +Le code du package d'application respecte certaines règles de syntaxe. + +**Niveau 6** +Le package d'application est dans l'organisation YunoHost-Apps. + +**Niveau 7** +Le package d'application passe avec succès l'ensemble des tests d'intégrité. + +**Niveau 8** +Le package d'application respecte toute les recommendations de packaging d'apps. C'est une app de très bonne qualité. + +**Niveau 9** +Le package d'application respecte des recommandations de packaging supérieures. Non disponible pour le moment. + +! L'utilisation du niveau 9 est peu à peu arrêtée. \ No newline at end of file diff --git a/pages/04.contribute/04.packaging_apps/15.quality_tests/01.apps_levels/packaging_apps_levels.md b/pages/06.contribute/10.packaging_apps/15.quality_tests/01.apps_levels/packaging_apps_levels.md similarity index 98% rename from pages/04.contribute/04.packaging_apps/15.quality_tests/01.apps_levels/packaging_apps_levels.md rename to pages/06.contribute/10.packaging_apps/15.quality_tests/01.apps_levels/packaging_apps_levels.md index 05a31018..a0181389 100644 --- a/pages/04.contribute/04.packaging_apps/15.quality_tests/01.apps_levels/packaging_apps_levels.md +++ b/pages/06.contribute/10.packaging_apps/15.quality_tests/01.apps_levels/packaging_apps_levels.md @@ -7,7 +7,7 @@ routes: default: '/packaging_apps_levels' --- -In order to facilitate the packaging of applications by providing successive steps to achieve, each package is assigned a quality level, from 0 to 10. +In order to facilitate the packaging of applications by providing successive steps to achieve, each package is assigned a quality level, from 0 to 9. A package must meet a number of criteria to reach each level. In addition, to reach a level, the package must have previously reached the previous level. This classification of applications by levels has 3 advantages: @@ -74,6 +74,4 @@ The application is long-term good quality, meaning it's been at least level 5 in The application is considered ["high-quality"](https://github.com/YunoHost/apps/blob/master/hq_validation_template.md): it is well-integrated with YunoHost (in particular SSO/LDAP) and follows the recommended development workflow. -#### Level 10 - -(No definition yet) +! Using level 9 is being deprecated. \ No newline at end of file diff --git a/pages/04.contribute/04.packaging_apps/15.quality_tests/02.yep/packaging_apps_guidelines.fr.md b/pages/06.contribute/10.packaging_apps/15.quality_tests/02.yep/packaging_apps_guidelines.fr.md similarity index 100% rename from pages/04.contribute/04.packaging_apps/15.quality_tests/02.yep/packaging_apps_guidelines.fr.md rename to pages/06.contribute/10.packaging_apps/15.quality_tests/02.yep/packaging_apps_guidelines.fr.md diff --git a/pages/04.contribute/04.packaging_apps/15.quality_tests/02.yep/packaging_apps_guidelines.md b/pages/06.contribute/10.packaging_apps/15.quality_tests/02.yep/packaging_apps_guidelines.md similarity index 100% rename from pages/04.contribute/04.packaging_apps/15.quality_tests/02.yep/packaging_apps_guidelines.md rename to pages/06.contribute/10.packaging_apps/15.quality_tests/02.yep/packaging_apps_guidelines.md diff --git a/pages/04.contribute/04.packaging_apps/15.quality_tests/03.ci_packagers/packaging_apps_ci.fr.md b/pages/06.contribute/10.packaging_apps/15.quality_tests/03.ci_packagers/packaging_apps_ci.fr.md similarity index 100% rename from pages/04.contribute/04.packaging_apps/15.quality_tests/03.ci_packagers/packaging_apps_ci.fr.md rename to pages/06.contribute/10.packaging_apps/15.quality_tests/03.ci_packagers/packaging_apps_ci.fr.md diff --git a/pages/04.contribute/04.packaging_apps/15.quality_tests/03.ci_packagers/packaging_apps_ci.md b/pages/06.contribute/10.packaging_apps/15.quality_tests/03.ci_packagers/packaging_apps_ci.md similarity index 100% rename from pages/04.contribute/04.packaging_apps/15.quality_tests/03.ci_packagers/packaging_apps_ci.md rename to pages/06.contribute/10.packaging_apps/15.quality_tests/03.ci_packagers/packaging_apps_ci.md diff --git a/pages/04.contribute/04.packaging_apps/16.advanced_packagers/advanced_packagers.md b/pages/06.contribute/10.packaging_apps/16.advanced_packagers/advanced_packagers.md similarity index 100% rename from pages/04.contribute/04.packaging_apps/16.advanced_packagers/advanced_packagers.md rename to pages/06.contribute/10.packaging_apps/16.advanced_packagers/advanced_packagers.md diff --git a/pages/04.contribute/04.packaging_apps/20.bash_tips/07.shell_variables_scope/shell_variables_scope.fr.md b/pages/06.contribute/10.packaging_apps/20.bash_tips/07.shell_variables_scope/shell_variables_scope.fr.md similarity index 100% rename from pages/04.contribute/04.packaging_apps/20.bash_tips/07.shell_variables_scope/shell_variables_scope.fr.md rename to pages/06.contribute/10.packaging_apps/20.bash_tips/07.shell_variables_scope/shell_variables_scope.fr.md diff --git a/pages/04.contribute/04.packaging_apps/20.bash_tips/07.shell_variables_scope/shell_variables_scope.md b/pages/06.contribute/10.packaging_apps/20.bash_tips/07.shell_variables_scope/shell_variables_scope.md similarity index 100% rename from pages/04.contribute/04.packaging_apps/20.bash_tips/07.shell_variables_scope/shell_variables_scope.md rename to pages/06.contribute/10.packaging_apps/20.bash_tips/07.shell_variables_scope/shell_variables_scope.md diff --git a/pages/04.contribute/04.packaging_apps/20.bash_tips/13.trap/packaging_apps_trap.fr.md b/pages/06.contribute/10.packaging_apps/20.bash_tips/13.trap/packaging_apps_trap.fr.md similarity index 100% rename from pages/04.contribute/04.packaging_apps/20.bash_tips/13.trap/packaging_apps_trap.fr.md rename to pages/06.contribute/10.packaging_apps/20.bash_tips/13.trap/packaging_apps_trap.fr.md diff --git a/pages/04.contribute/04.packaging_apps/20.bash_tips/13.trap/packaging_apps_trap.md b/pages/06.contribute/10.packaging_apps/20.bash_tips/13.trap/packaging_apps_trap.md similarity index 100% rename from pages/04.contribute/04.packaging_apps/20.bash_tips/13.trap/packaging_apps_trap.md rename to pages/06.contribute/10.packaging_apps/20.bash_tips/13.trap/packaging_apps_trap.md diff --git a/pages/04.contribute/04.packaging_apps/packaging_apps_start.fr.md b/pages/06.contribute/10.packaging_apps/packaging_apps_start.fr.md similarity index 100% rename from pages/04.contribute/04.packaging_apps/packaging_apps_start.fr.md rename to pages/06.contribute/10.packaging_apps/packaging_apps_start.fr.md diff --git a/pages/04.contribute/04.packaging_apps/packaging_apps_start.md b/pages/06.contribute/10.packaging_apps/packaging_apps_start.md similarity index 100% rename from pages/04.contribute/04.packaging_apps/packaging_apps_start.md rename to pages/06.contribute/10.packaging_apps/packaging_apps_start.md diff --git a/pages/04.contribute/05.dev/02.maindomain/maindomain.md b/pages/06.contribute/15.dev/02.maindomain/maindomain.md similarity index 100% rename from pages/04.contribute/05.dev/02.maindomain/maindomain.md rename to pages/06.contribute/15.dev/02.maindomain/maindomain.md diff --git a/pages/04.contribute/05.dev/dev.fr.md b/pages/06.contribute/15.dev/dev.fr.md similarity index 100% rename from pages/04.contribute/05.dev/dev.fr.md rename to pages/06.contribute/15.dev/dev.fr.md diff --git a/pages/04.contribute/05.dev/dev.md b/pages/06.contribute/15.dev/dev.md similarity index 100% rename from pages/04.contribute/05.dev/dev.md rename to pages/06.contribute/15.dev/dev.md diff --git a/pages/04.contribute/contributordoc.de.md b/pages/06.contribute/contribute.de.md similarity index 100% rename from pages/04.contribute/contributordoc.de.md rename to pages/06.contribute/contribute.de.md diff --git a/pages/04.contribute/contributordoc.fr.md b/pages/06.contribute/contribute.fr.md similarity index 100% rename from pages/04.contribute/contributordoc.fr.md rename to pages/06.contribute/contribute.fr.md diff --git a/pages/04.contribute/contributordoc.md b/pages/06.contribute/contribute.md similarity index 100% rename from pages/04.contribute/contributordoc.md rename to pages/06.contribute/contribute.md diff --git a/themes/learn4 b/themes/learn4 new file mode 160000 index 00000000..704a233b --- /dev/null +++ b/themes/learn4 @@ -0,0 +1 @@ +Subproject commit 704a233bdba73dcfb197f3d3fcdd9e89778445c3 diff --git a/themes/yunohost-docs/css/swagger-ui.css b/themes/yunohost-docs/css/swagger-ui.css new file mode 100644 index 00000000..6530993f --- /dev/null +++ b/themes/yunohost-docs/css/swagger-ui.css @@ -0,0 +1,4 @@ +.swagger-ui{color:#3b4151; + /*! normalize.css v7.0.0 | MIT License | github.com/necolas/normalize.css */font-family:sans-serif}.swagger-ui html{-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%;line-height:1.15}.swagger-ui body{margin:0}.swagger-ui article,.swagger-ui aside,.swagger-ui footer,.swagger-ui header,.swagger-ui nav,.swagger-ui section{display:block}.swagger-ui h1{font-size:2em;margin:.67em 0}.swagger-ui figcaption,.swagger-ui figure,.swagger-ui main{display:block}.swagger-ui figure{margin:1em 40px}.swagger-ui hr{box-sizing:content-box;height:0;overflow:visible}.swagger-ui pre{font-family:monospace,monospace;font-size:1em}.swagger-ui a{-webkit-text-decoration-skip:objects;background-color:transparent}.swagger-ui abbr[title]{border-bottom:none;text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}.swagger-ui b,.swagger-ui strong{font-weight:inherit;font-weight:bolder}.swagger-ui code,.swagger-ui kbd,.swagger-ui samp{font-family:monospace,monospace;font-size:1em}.swagger-ui dfn{font-style:italic}.swagger-ui mark{background-color:#ff0;color:#000}.swagger-ui small{font-size:80%}.swagger-ui sub,.swagger-ui sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}.swagger-ui sub{bottom:-.25em}.swagger-ui sup{top:-.5em}.swagger-ui audio,.swagger-ui video{display:inline-block}.swagger-ui audio:not([controls]){display:none;height:0}.swagger-ui img{border-style:none}.swagger-ui svg:not(:root){overflow:hidden}.swagger-ui button,.swagger-ui input,.swagger-ui optgroup,.swagger-ui select,.swagger-ui textarea{font-family:sans-serif;font-size:100%;line-height:1.15;margin:0}.swagger-ui button,.swagger-ui input{overflow:visible}.swagger-ui button,.swagger-ui select{text-transform:none}.swagger-ui [type=reset],.swagger-ui [type=submit],.swagger-ui button,.swagger-ui html [type=button]{-webkit-appearance:button}.swagger-ui [type=button]::-moz-focus-inner,.swagger-ui [type=reset]::-moz-focus-inner,.swagger-ui [type=submit]::-moz-focus-inner,.swagger-ui button::-moz-focus-inner{border-style:none;padding:0}.swagger-ui [type=button]:-moz-focusring,.swagger-ui [type=reset]:-moz-focusring,.swagger-ui [type=submit]:-moz-focusring,.swagger-ui button:-moz-focusring{outline:1px dotted ButtonText}.swagger-ui fieldset{padding:.35em .75em .625em}.swagger-ui legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}.swagger-ui progress{display:inline-block;vertical-align:baseline}.swagger-ui textarea{overflow:auto}.swagger-ui [type=checkbox],.swagger-ui [type=radio]{box-sizing:border-box;padding:0}.swagger-ui [type=number]::-webkit-inner-spin-button,.swagger-ui [type=number]::-webkit-outer-spin-button{height:auto}.swagger-ui [type=search]{-webkit-appearance:textfield;outline-offset:-2px}.swagger-ui [type=search]::-webkit-search-cancel-button,.swagger-ui [type=search]::-webkit-search-decoration{-webkit-appearance:none}.swagger-ui ::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}.swagger-ui details,.swagger-ui menu{display:block}.swagger-ui summary{display:list-item}.swagger-ui canvas{display:inline-block}.swagger-ui [hidden],.swagger-ui template{display:none}.swagger-ui .debug *{outline:1px solid gold}.swagger-ui .debug-white *{outline:1px solid #fff}.swagger-ui .debug-black *{outline:1px solid #000}.swagger-ui .debug-grid{background:transparent url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAYAAADED76LAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyhpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTExIDc5LjE1ODMyNSwgMjAxNS8wOS8xMC0wMToxMDoyMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MTRDOTY4N0U2N0VFMTFFNjg2MzZDQjkwNkQ4MjgwMEIiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MTRDOTY4N0Q2N0VFMTFFNjg2MzZDQjkwNkQ4MjgwMEIiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTUgKE1hY2ludG9zaCkiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo3NjcyQkQ3NjY3QzUxMUU2QjJCQ0UyNDA4MTAwMjE3MSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo3NjcyQkQ3NzY3QzUxMUU2QjJCQ0UyNDA4MTAwMjE3MSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PsBS+GMAAAAjSURBVHjaYvz//z8DLsD4gcGXiYEAGBIKGBne//fFpwAgwAB98AaF2pjlUQAAAABJRU5ErkJggg==) repeat 0 0}.swagger-ui .debug-grid-16{background:transparent url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyhpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTExIDc5LjE1ODMyNSwgMjAxNS8wOS8xMC0wMToxMDoyMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6ODYyRjhERDU2N0YyMTFFNjg2MzZDQjkwNkQ4MjgwMEIiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6ODYyRjhERDQ2N0YyMTFFNjg2MzZDQjkwNkQ4MjgwMEIiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTUgKE1hY2ludG9zaCkiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo3NjcyQkQ3QTY3QzUxMUU2QjJCQ0UyNDA4MTAwMjE3MSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo3NjcyQkQ3QjY3QzUxMUU2QjJCQ0UyNDA4MTAwMjE3MSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PvCS01IAAABMSURBVHjaYmR4/5+BFPBfAMFm/MBgx8RAGWCn1AAmSg34Q6kBDKMGMDCwICeMIemF/5QawEipAWwUhwEjMDvbAWlWkvVBwu8vQIABAEwBCph8U6c0AAAAAElFTkSuQmCC) repeat 0 0}.swagger-ui .debug-grid-8-solid{background:#fff url(data:image/jpeg;base64,/9j/4QAYRXhpZgAASUkqAAgAAAAAAAAAAAAAAP/sABFEdWNreQABAAQAAAAAAAD/4QMxaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLwA8P3hwYWNrZXQgYmVnaW49Iu+7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI/PiA8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJBZG9iZSBYTVAgQ29yZSA1LjYtYzExMSA3OS4xNTgzMjUsIDIwMTUvMDkvMTAtMDE6MTA6MjAgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCBDQyAyMDE1IChNYWNpbnRvc2gpIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOkIxMjI0OTczNjdCMzExRTZCMkJDRTI0MDgxMDAyMTcxIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOkIxMjI0OTc0NjdCMzExRTZCMkJDRTI0MDgxMDAyMTcxIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6QjEyMjQ5NzE2N0IzMTFFNkIyQkNFMjQwODEwMDIxNzEiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6QjEyMjQ5NzI2N0IzMTFFNkIyQkNFMjQwODEwMDIxNzEiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz7/7gAOQWRvYmUAZMAAAAAB/9sAhAAbGhopHSlBJiZBQi8vL0JHPz4+P0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHAR0pKTQmND8oKD9HPzU/R0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0f/wAARCAAIAAgDASIAAhEBAxEB/8QAWQABAQAAAAAAAAAAAAAAAAAAAAYBAQEAAAAAAAAAAAAAAAAAAAIEEAEBAAMBAAAAAAAAAAAAAAABADECA0ERAAEDBQAAAAAAAAAAAAAAAAARITFBUWESIv/aAAwDAQACEQMRAD8AoOnTV1QTD7JJshP3vSM3P//Z) repeat 0 0}.swagger-ui .debug-grid-16-solid{background:#fff url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyhpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTExIDc5LjE1ODMyNSwgMjAxNS8wOS8xMC0wMToxMDoyMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTUgKE1hY2ludG9zaCkiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6NzY3MkJEN0U2N0M1MTFFNkIyQkNFMjQwODEwMDIxNzEiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6NzY3MkJEN0Y2N0M1MTFFNkIyQkNFMjQwODEwMDIxNzEiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo3NjcyQkQ3QzY3QzUxMUU2QjJCQ0UyNDA4MTAwMjE3MSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo3NjcyQkQ3RDY3QzUxMUU2QjJCQ0UyNDA4MTAwMjE3MSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/Pve6J3kAAAAzSURBVHjaYvz//z8D0UDsMwMjSRoYP5Gq4SPNbRjVMEQ1fCRDg+in/6+J1AJUxsgAEGAA31BAJMS0GYEAAAAASUVORK5CYII=) repeat 0 0}.swagger-ui .border-box,.swagger-ui a,.swagger-ui article,.swagger-ui body,.swagger-ui code,.swagger-ui dd,.swagger-ui div,.swagger-ui dl,.swagger-ui dt,.swagger-ui fieldset,.swagger-ui footer,.swagger-ui form,.swagger-ui h1,.swagger-ui h2,.swagger-ui h3,.swagger-ui h4,.swagger-ui h5,.swagger-ui h6,.swagger-ui header,.swagger-ui html,.swagger-ui input[type=email],.swagger-ui input[type=number],.swagger-ui input[type=password],.swagger-ui input[type=tel],.swagger-ui input[type=text],.swagger-ui input[type=url],.swagger-ui legend,.swagger-ui li,.swagger-ui main,.swagger-ui ol,.swagger-ui p,.swagger-ui pre,.swagger-ui section,.swagger-ui table,.swagger-ui td,.swagger-ui textarea,.swagger-ui th,.swagger-ui tr,.swagger-ui ul{box-sizing:border-box}.swagger-ui .aspect-ratio{height:0;position:relative}.swagger-ui .aspect-ratio--16x9{padding-bottom:56.25%}.swagger-ui .aspect-ratio--9x16{padding-bottom:177.77%}.swagger-ui .aspect-ratio--4x3{padding-bottom:75%}.swagger-ui .aspect-ratio--3x4{padding-bottom:133.33%}.swagger-ui .aspect-ratio--6x4{padding-bottom:66.6%}.swagger-ui .aspect-ratio--4x6{padding-bottom:150%}.swagger-ui .aspect-ratio--8x5{padding-bottom:62.5%}.swagger-ui .aspect-ratio--5x8{padding-bottom:160%}.swagger-ui .aspect-ratio--7x5{padding-bottom:71.42%}.swagger-ui .aspect-ratio--5x7{padding-bottom:140%}.swagger-ui .aspect-ratio--1x1{padding-bottom:100%}.swagger-ui .aspect-ratio--object{bottom:0;height:100%;left:0;position:absolute;right:0;top:0;width:100%;z-index:100}@media screen and (min-width:30em){.swagger-ui .aspect-ratio-ns{height:0;position:relative}.swagger-ui .aspect-ratio--16x9-ns{padding-bottom:56.25%}.swagger-ui .aspect-ratio--9x16-ns{padding-bottom:177.77%}.swagger-ui .aspect-ratio--4x3-ns{padding-bottom:75%}.swagger-ui .aspect-ratio--3x4-ns{padding-bottom:133.33%}.swagger-ui .aspect-ratio--6x4-ns{padding-bottom:66.6%}.swagger-ui .aspect-ratio--4x6-ns{padding-bottom:150%}.swagger-ui .aspect-ratio--8x5-ns{padding-bottom:62.5%}.swagger-ui .aspect-ratio--5x8-ns{padding-bottom:160%}.swagger-ui .aspect-ratio--7x5-ns{padding-bottom:71.42%}.swagger-ui .aspect-ratio--5x7-ns{padding-bottom:140%}.swagger-ui .aspect-ratio--1x1-ns{padding-bottom:100%}.swagger-ui .aspect-ratio--object-ns{bottom:0;height:100%;left:0;position:absolute;right:0;top:0;width:100%;z-index:100}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .aspect-ratio-m{height:0;position:relative}.swagger-ui .aspect-ratio--16x9-m{padding-bottom:56.25%}.swagger-ui .aspect-ratio--9x16-m{padding-bottom:177.77%}.swagger-ui .aspect-ratio--4x3-m{padding-bottom:75%}.swagger-ui .aspect-ratio--3x4-m{padding-bottom:133.33%}.swagger-ui .aspect-ratio--6x4-m{padding-bottom:66.6%}.swagger-ui .aspect-ratio--4x6-m{padding-bottom:150%}.swagger-ui .aspect-ratio--8x5-m{padding-bottom:62.5%}.swagger-ui .aspect-ratio--5x8-m{padding-bottom:160%}.swagger-ui .aspect-ratio--7x5-m{padding-bottom:71.42%}.swagger-ui .aspect-ratio--5x7-m{padding-bottom:140%}.swagger-ui .aspect-ratio--1x1-m{padding-bottom:100%}.swagger-ui .aspect-ratio--object-m{bottom:0;height:100%;left:0;position:absolute;right:0;top:0;width:100%;z-index:100}}@media screen and (min-width:60em){.swagger-ui .aspect-ratio-l{height:0;position:relative}.swagger-ui .aspect-ratio--16x9-l{padding-bottom:56.25%}.swagger-ui .aspect-ratio--9x16-l{padding-bottom:177.77%}.swagger-ui .aspect-ratio--4x3-l{padding-bottom:75%}.swagger-ui .aspect-ratio--3x4-l{padding-bottom:133.33%}.swagger-ui .aspect-ratio--6x4-l{padding-bottom:66.6%}.swagger-ui .aspect-ratio--4x6-l{padding-bottom:150%}.swagger-ui .aspect-ratio--8x5-l{padding-bottom:62.5%}.swagger-ui .aspect-ratio--5x8-l{padding-bottom:160%}.swagger-ui .aspect-ratio--7x5-l{padding-bottom:71.42%}.swagger-ui .aspect-ratio--5x7-l{padding-bottom:140%}.swagger-ui .aspect-ratio--1x1-l{padding-bottom:100%}.swagger-ui .aspect-ratio--object-l{bottom:0;height:100%;left:0;position:absolute;right:0;top:0;width:100%;z-index:100}}.swagger-ui img{max-width:100%}.swagger-ui .cover{background-size:cover!important}.swagger-ui .contain{background-size:contain!important}@media screen and (min-width:30em){.swagger-ui .cover-ns{background-size:cover!important}.swagger-ui .contain-ns{background-size:contain!important}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .cover-m{background-size:cover!important}.swagger-ui .contain-m{background-size:contain!important}}@media screen and (min-width:60em){.swagger-ui .cover-l{background-size:cover!important}.swagger-ui .contain-l{background-size:contain!important}}.swagger-ui .bg-center{background-position:50%;background-repeat:no-repeat}.swagger-ui .bg-top{background-position:top;background-repeat:no-repeat}.swagger-ui .bg-right{background-position:100%;background-repeat:no-repeat}.swagger-ui .bg-bottom{background-position:bottom;background-repeat:no-repeat}.swagger-ui .bg-left{background-position:0;background-repeat:no-repeat}@media screen and (min-width:30em){.swagger-ui .bg-center-ns{background-position:50%;background-repeat:no-repeat}.swagger-ui .bg-top-ns{background-position:top;background-repeat:no-repeat}.swagger-ui .bg-right-ns{background-position:100%;background-repeat:no-repeat}.swagger-ui .bg-bottom-ns{background-position:bottom;background-repeat:no-repeat}.swagger-ui .bg-left-ns{background-position:0;background-repeat:no-repeat}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .bg-center-m{background-position:50%;background-repeat:no-repeat}.swagger-ui .bg-top-m{background-position:top;background-repeat:no-repeat}.swagger-ui .bg-right-m{background-position:100%;background-repeat:no-repeat}.swagger-ui .bg-bottom-m{background-position:bottom;background-repeat:no-repeat}.swagger-ui .bg-left-m{background-position:0;background-repeat:no-repeat}}@media screen and (min-width:60em){.swagger-ui .bg-center-l{background-position:50%;background-repeat:no-repeat}.swagger-ui .bg-top-l{background-position:top;background-repeat:no-repeat}.swagger-ui .bg-right-l{background-position:100%;background-repeat:no-repeat}.swagger-ui .bg-bottom-l{background-position:bottom;background-repeat:no-repeat}.swagger-ui .bg-left-l{background-position:0;background-repeat:no-repeat}}.swagger-ui .outline{outline:1px solid}.swagger-ui .outline-transparent{outline:1px solid transparent}.swagger-ui .outline-0{outline:0}@media screen and (min-width:30em){.swagger-ui .outline-ns{outline:1px solid}.swagger-ui .outline-transparent-ns{outline:1px solid transparent}.swagger-ui .outline-0-ns{outline:0}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .outline-m{outline:1px solid}.swagger-ui .outline-transparent-m{outline:1px solid transparent}.swagger-ui .outline-0-m{outline:0}}@media screen and (min-width:60em){.swagger-ui .outline-l{outline:1px solid}.swagger-ui .outline-transparent-l{outline:1px solid transparent}.swagger-ui .outline-0-l{outline:0}}.swagger-ui .ba{border-style:solid;border-width:1px}.swagger-ui .bt{border-top-style:solid;border-top-width:1px}.swagger-ui .br{border-right-style:solid;border-right-width:1px}.swagger-ui .bb{border-bottom-style:solid;border-bottom-width:1px}.swagger-ui .bl{border-left-style:solid;border-left-width:1px}.swagger-ui .bn{border-style:none;border-width:0}@media screen and (min-width:30em){.swagger-ui .ba-ns{border-style:solid;border-width:1px}.swagger-ui .bt-ns{border-top-style:solid;border-top-width:1px}.swagger-ui .br-ns{border-right-style:solid;border-right-width:1px}.swagger-ui .bb-ns{border-bottom-style:solid;border-bottom-width:1px}.swagger-ui .bl-ns{border-left-style:solid;border-left-width:1px}.swagger-ui .bn-ns{border-style:none;border-width:0}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .ba-m{border-style:solid;border-width:1px}.swagger-ui .bt-m{border-top-style:solid;border-top-width:1px}.swagger-ui .br-m{border-right-style:solid;border-right-width:1px}.swagger-ui .bb-m{border-bottom-style:solid;border-bottom-width:1px}.swagger-ui .bl-m{border-left-style:solid;border-left-width:1px}.swagger-ui .bn-m{border-style:none;border-width:0}}@media screen and (min-width:60em){.swagger-ui .ba-l{border-style:solid;border-width:1px}.swagger-ui .bt-l{border-top-style:solid;border-top-width:1px}.swagger-ui .br-l{border-right-style:solid;border-right-width:1px}.swagger-ui .bb-l{border-bottom-style:solid;border-bottom-width:1px}.swagger-ui .bl-l{border-left-style:solid;border-left-width:1px}.swagger-ui .bn-l{border-style:none;border-width:0}}.swagger-ui .b--black{border-color:#000}.swagger-ui .b--near-black{border-color:#111}.swagger-ui .b--dark-gray{border-color:#333}.swagger-ui .b--mid-gray{border-color:#555}.swagger-ui .b--gray{border-color:#777}.swagger-ui .b--silver{border-color:#999}.swagger-ui .b--light-silver{border-color:#aaa}.swagger-ui .b--moon-gray{border-color:#ccc}.swagger-ui .b--light-gray{border-color:#eee}.swagger-ui .b--near-white{border-color:#f4f4f4}.swagger-ui .b--white{border-color:#fff}.swagger-ui .b--white-90{border-color:hsla(0,0%,100%,.9)}.swagger-ui .b--white-80{border-color:hsla(0,0%,100%,.8)}.swagger-ui .b--white-70{border-color:hsla(0,0%,100%,.7)}.swagger-ui .b--white-60{border-color:hsla(0,0%,100%,.6)}.swagger-ui .b--white-50{border-color:hsla(0,0%,100%,.5)}.swagger-ui .b--white-40{border-color:hsla(0,0%,100%,.4)}.swagger-ui .b--white-30{border-color:hsla(0,0%,100%,.3)}.swagger-ui .b--white-20{border-color:hsla(0,0%,100%,.2)}.swagger-ui .b--white-10{border-color:hsla(0,0%,100%,.1)}.swagger-ui .b--white-05{border-color:hsla(0,0%,100%,.05)}.swagger-ui .b--white-025{border-color:hsla(0,0%,100%,.025)}.swagger-ui .b--white-0125{border-color:hsla(0,0%,100%,.013)}.swagger-ui .b--black-90{border-color:rgba(0,0,0,.9)}.swagger-ui .b--black-80{border-color:rgba(0,0,0,.8)}.swagger-ui .b--black-70{border-color:rgba(0,0,0,.7)}.swagger-ui .b--black-60{border-color:rgba(0,0,0,.6)}.swagger-ui .b--black-50{border-color:rgba(0,0,0,.5)}.swagger-ui .b--black-40{border-color:rgba(0,0,0,.4)}.swagger-ui .b--black-30{border-color:rgba(0,0,0,.3)}.swagger-ui .b--black-20{border-color:rgba(0,0,0,.2)}.swagger-ui .b--black-10{border-color:rgba(0,0,0,.1)}.swagger-ui .b--black-05{border-color:rgba(0,0,0,.05)}.swagger-ui .b--black-025{border-color:rgba(0,0,0,.025)}.swagger-ui .b--black-0125{border-color:rgba(0,0,0,.013)}.swagger-ui .b--dark-red{border-color:#e7040f}.swagger-ui .b--red{border-color:#ff4136}.swagger-ui .b--light-red{border-color:#ff725c}.swagger-ui .b--orange{border-color:#ff6300}.swagger-ui .b--gold{border-color:#ffb700}.swagger-ui .b--yellow{border-color:gold}.swagger-ui .b--light-yellow{border-color:#fbf1a9}.swagger-ui .b--purple{border-color:#5e2ca5}.swagger-ui .b--light-purple{border-color:#a463f2}.swagger-ui .b--dark-pink{border-color:#d5008f}.swagger-ui .b--hot-pink{border-color:#ff41b4}.swagger-ui .b--pink{border-color:#ff80cc}.swagger-ui .b--light-pink{border-color:#ffa3d7}.swagger-ui .b--dark-green{border-color:#137752}.swagger-ui .b--green{border-color:#19a974}.swagger-ui .b--light-green{border-color:#9eebcf}.swagger-ui .b--navy{border-color:#001b44}.swagger-ui .b--dark-blue{border-color:#00449e}.swagger-ui .b--blue{border-color:#357edd}.swagger-ui .b--light-blue{border-color:#96ccff}.swagger-ui .b--lightest-blue{border-color:#cdecff}.swagger-ui .b--washed-blue{border-color:#f6fffe}.swagger-ui .b--washed-green{border-color:#e8fdf5}.swagger-ui .b--washed-yellow{border-color:#fffceb}.swagger-ui .b--washed-red{border-color:#ffdfdf}.swagger-ui .b--transparent{border-color:transparent}.swagger-ui .b--inherit{border-color:inherit}.swagger-ui .br0{border-radius:0}.swagger-ui .br1{border-radius:.125rem}.swagger-ui .br2{border-radius:.25rem}.swagger-ui .br3{border-radius:.5rem}.swagger-ui .br4{border-radius:1rem}.swagger-ui .br-100{border-radius:100%}.swagger-ui .br-pill{border-radius:9999px}.swagger-ui .br--bottom{border-top-left-radius:0;border-top-right-radius:0}.swagger-ui .br--top{border-bottom-left-radius:0;border-bottom-right-radius:0}.swagger-ui .br--right{border-bottom-left-radius:0;border-top-left-radius:0}.swagger-ui .br--left{border-bottom-right-radius:0;border-top-right-radius:0}@media screen and (min-width:30em){.swagger-ui .br0-ns{border-radius:0}.swagger-ui .br1-ns{border-radius:.125rem}.swagger-ui .br2-ns{border-radius:.25rem}.swagger-ui .br3-ns{border-radius:.5rem}.swagger-ui .br4-ns{border-radius:1rem}.swagger-ui .br-100-ns{border-radius:100%}.swagger-ui .br-pill-ns{border-radius:9999px}.swagger-ui .br--bottom-ns{border-top-left-radius:0;border-top-right-radius:0}.swagger-ui .br--top-ns{border-bottom-left-radius:0;border-bottom-right-radius:0}.swagger-ui .br--right-ns{border-bottom-left-radius:0;border-top-left-radius:0}.swagger-ui .br--left-ns{border-bottom-right-radius:0;border-top-right-radius:0}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .br0-m{border-radius:0}.swagger-ui .br1-m{border-radius:.125rem}.swagger-ui .br2-m{border-radius:.25rem}.swagger-ui .br3-m{border-radius:.5rem}.swagger-ui .br4-m{border-radius:1rem}.swagger-ui .br-100-m{border-radius:100%}.swagger-ui .br-pill-m{border-radius:9999px}.swagger-ui .br--bottom-m{border-top-left-radius:0;border-top-right-radius:0}.swagger-ui .br--top-m{border-bottom-left-radius:0;border-bottom-right-radius:0}.swagger-ui .br--right-m{border-bottom-left-radius:0;border-top-left-radius:0}.swagger-ui .br--left-m{border-bottom-right-radius:0;border-top-right-radius:0}}@media screen and (min-width:60em){.swagger-ui .br0-l{border-radius:0}.swagger-ui .br1-l{border-radius:.125rem}.swagger-ui .br2-l{border-radius:.25rem}.swagger-ui .br3-l{border-radius:.5rem}.swagger-ui .br4-l{border-radius:1rem}.swagger-ui .br-100-l{border-radius:100%}.swagger-ui .br-pill-l{border-radius:9999px}.swagger-ui .br--bottom-l{border-top-left-radius:0;border-top-right-radius:0}.swagger-ui .br--top-l{border-bottom-left-radius:0;border-bottom-right-radius:0}.swagger-ui .br--right-l{border-bottom-left-radius:0;border-top-left-radius:0}.swagger-ui .br--left-l{border-bottom-right-radius:0;border-top-right-radius:0}}.swagger-ui .b--dotted{border-style:dotted}.swagger-ui .b--dashed{border-style:dashed}.swagger-ui .b--solid{border-style:solid}.swagger-ui .b--none{border-style:none}@media screen and (min-width:30em){.swagger-ui .b--dotted-ns{border-style:dotted}.swagger-ui .b--dashed-ns{border-style:dashed}.swagger-ui .b--solid-ns{border-style:solid}.swagger-ui .b--none-ns{border-style:none}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .b--dotted-m{border-style:dotted}.swagger-ui .b--dashed-m{border-style:dashed}.swagger-ui .b--solid-m{border-style:solid}.swagger-ui .b--none-m{border-style:none}}@media screen and (min-width:60em){.swagger-ui .b--dotted-l{border-style:dotted}.swagger-ui .b--dashed-l{border-style:dashed}.swagger-ui .b--solid-l{border-style:solid}.swagger-ui .b--none-l{border-style:none}}.swagger-ui .bw0{border-width:0}.swagger-ui .bw1{border-width:.125rem}.swagger-ui .bw2{border-width:.25rem}.swagger-ui .bw3{border-width:.5rem}.swagger-ui .bw4{border-width:1rem}.swagger-ui .bw5{border-width:2rem}.swagger-ui .bt-0{border-top-width:0}.swagger-ui .br-0{border-right-width:0}.swagger-ui .bb-0{border-bottom-width:0}.swagger-ui .bl-0{border-left-width:0}@media screen and (min-width:30em){.swagger-ui .bw0-ns{border-width:0}.swagger-ui .bw1-ns{border-width:.125rem}.swagger-ui .bw2-ns{border-width:.25rem}.swagger-ui .bw3-ns{border-width:.5rem}.swagger-ui .bw4-ns{border-width:1rem}.swagger-ui .bw5-ns{border-width:2rem}.swagger-ui .bt-0-ns{border-top-width:0}.swagger-ui .br-0-ns{border-right-width:0}.swagger-ui .bb-0-ns{border-bottom-width:0}.swagger-ui .bl-0-ns{border-left-width:0}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .bw0-m{border-width:0}.swagger-ui .bw1-m{border-width:.125rem}.swagger-ui .bw2-m{border-width:.25rem}.swagger-ui .bw3-m{border-width:.5rem}.swagger-ui .bw4-m{border-width:1rem}.swagger-ui .bw5-m{border-width:2rem}.swagger-ui .bt-0-m{border-top-width:0}.swagger-ui .br-0-m{border-right-width:0}.swagger-ui .bb-0-m{border-bottom-width:0}.swagger-ui .bl-0-m{border-left-width:0}}@media screen and (min-width:60em){.swagger-ui .bw0-l{border-width:0}.swagger-ui .bw1-l{border-width:.125rem}.swagger-ui .bw2-l{border-width:.25rem}.swagger-ui .bw3-l{border-width:.5rem}.swagger-ui .bw4-l{border-width:1rem}.swagger-ui .bw5-l{border-width:2rem}.swagger-ui .bt-0-l{border-top-width:0}.swagger-ui .br-0-l{border-right-width:0}.swagger-ui .bb-0-l{border-bottom-width:0}.swagger-ui .bl-0-l{border-left-width:0}}.swagger-ui .shadow-1{box-shadow:0 0 4px 2px rgba(0,0,0,.2)}.swagger-ui .shadow-2{box-shadow:0 0 8px 2px rgba(0,0,0,.2)}.swagger-ui .shadow-3{box-shadow:2px 2px 4px 2px rgba(0,0,0,.2)}.swagger-ui .shadow-4{box-shadow:2px 2px 8px 0 rgba(0,0,0,.2)}.swagger-ui .shadow-5{box-shadow:4px 4px 8px 0 rgba(0,0,0,.2)}@media screen and (min-width:30em){.swagger-ui .shadow-1-ns{box-shadow:0 0 4px 2px rgba(0,0,0,.2)}.swagger-ui .shadow-2-ns{box-shadow:0 0 8px 2px rgba(0,0,0,.2)}.swagger-ui .shadow-3-ns{box-shadow:2px 2px 4px 2px rgba(0,0,0,.2)}.swagger-ui .shadow-4-ns{box-shadow:2px 2px 8px 0 rgba(0,0,0,.2)}.swagger-ui .shadow-5-ns{box-shadow:4px 4px 8px 0 rgba(0,0,0,.2)}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .shadow-1-m{box-shadow:0 0 4px 2px rgba(0,0,0,.2)}.swagger-ui .shadow-2-m{box-shadow:0 0 8px 2px rgba(0,0,0,.2)}.swagger-ui .shadow-3-m{box-shadow:2px 2px 4px 2px rgba(0,0,0,.2)}.swagger-ui .shadow-4-m{box-shadow:2px 2px 8px 0 rgba(0,0,0,.2)}.swagger-ui .shadow-5-m{box-shadow:4px 4px 8px 0 rgba(0,0,0,.2)}}@media screen and (min-width:60em){.swagger-ui .shadow-1-l{box-shadow:0 0 4px 2px rgba(0,0,0,.2)}.swagger-ui .shadow-2-l{box-shadow:0 0 8px 2px rgba(0,0,0,.2)}.swagger-ui .shadow-3-l{box-shadow:2px 2px 4px 2px rgba(0,0,0,.2)}.swagger-ui .shadow-4-l{box-shadow:2px 2px 8px 0 rgba(0,0,0,.2)}.swagger-ui .shadow-5-l{box-shadow:4px 4px 8px 0 rgba(0,0,0,.2)}}.swagger-ui .pre{overflow-x:auto;overflow-y:hidden;overflow:scroll}.swagger-ui .top-0{top:0}.swagger-ui .right-0{right:0}.swagger-ui .bottom-0{bottom:0}.swagger-ui .left-0{left:0}.swagger-ui .top-1{top:1rem}.swagger-ui .right-1{right:1rem}.swagger-ui .bottom-1{bottom:1rem}.swagger-ui .left-1{left:1rem}.swagger-ui .top-2{top:2rem}.swagger-ui .right-2{right:2rem}.swagger-ui .bottom-2{bottom:2rem}.swagger-ui .left-2{left:2rem}.swagger-ui .top--1{top:-1rem}.swagger-ui .right--1{right:-1rem}.swagger-ui .bottom--1{bottom:-1rem}.swagger-ui .left--1{left:-1rem}.swagger-ui .top--2{top:-2rem}.swagger-ui .right--2{right:-2rem}.swagger-ui .bottom--2{bottom:-2rem}.swagger-ui .left--2{left:-2rem}.swagger-ui .absolute--fill{bottom:0;left:0;right:0;top:0}@media screen and (min-width:30em){.swagger-ui .top-0-ns{top:0}.swagger-ui .left-0-ns{left:0}.swagger-ui .right-0-ns{right:0}.swagger-ui .bottom-0-ns{bottom:0}.swagger-ui .top-1-ns{top:1rem}.swagger-ui .left-1-ns{left:1rem}.swagger-ui .right-1-ns{right:1rem}.swagger-ui .bottom-1-ns{bottom:1rem}.swagger-ui .top-2-ns{top:2rem}.swagger-ui .left-2-ns{left:2rem}.swagger-ui .right-2-ns{right:2rem}.swagger-ui .bottom-2-ns{bottom:2rem}.swagger-ui .top--1-ns{top:-1rem}.swagger-ui .right--1-ns{right:-1rem}.swagger-ui .bottom--1-ns{bottom:-1rem}.swagger-ui .left--1-ns{left:-1rem}.swagger-ui .top--2-ns{top:-2rem}.swagger-ui .right--2-ns{right:-2rem}.swagger-ui .bottom--2-ns{bottom:-2rem}.swagger-ui .left--2-ns{left:-2rem}.swagger-ui .absolute--fill-ns{bottom:0;left:0;right:0;top:0}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .top-0-m{top:0}.swagger-ui .left-0-m{left:0}.swagger-ui .right-0-m{right:0}.swagger-ui .bottom-0-m{bottom:0}.swagger-ui .top-1-m{top:1rem}.swagger-ui .left-1-m{left:1rem}.swagger-ui .right-1-m{right:1rem}.swagger-ui .bottom-1-m{bottom:1rem}.swagger-ui .top-2-m{top:2rem}.swagger-ui .left-2-m{left:2rem}.swagger-ui .right-2-m{right:2rem}.swagger-ui .bottom-2-m{bottom:2rem}.swagger-ui .top--1-m{top:-1rem}.swagger-ui .right--1-m{right:-1rem}.swagger-ui .bottom--1-m{bottom:-1rem}.swagger-ui .left--1-m{left:-1rem}.swagger-ui .top--2-m{top:-2rem}.swagger-ui .right--2-m{right:-2rem}.swagger-ui .bottom--2-m{bottom:-2rem}.swagger-ui .left--2-m{left:-2rem}.swagger-ui .absolute--fill-m{bottom:0;left:0;right:0;top:0}}@media screen and (min-width:60em){.swagger-ui .top-0-l{top:0}.swagger-ui .left-0-l{left:0}.swagger-ui .right-0-l{right:0}.swagger-ui .bottom-0-l{bottom:0}.swagger-ui .top-1-l{top:1rem}.swagger-ui .left-1-l{left:1rem}.swagger-ui .right-1-l{right:1rem}.swagger-ui .bottom-1-l{bottom:1rem}.swagger-ui .top-2-l{top:2rem}.swagger-ui .left-2-l{left:2rem}.swagger-ui .right-2-l{right:2rem}.swagger-ui .bottom-2-l{bottom:2rem}.swagger-ui .top--1-l{top:-1rem}.swagger-ui .right--1-l{right:-1rem}.swagger-ui .bottom--1-l{bottom:-1rem}.swagger-ui .left--1-l{left:-1rem}.swagger-ui .top--2-l{top:-2rem}.swagger-ui .right--2-l{right:-2rem}.swagger-ui .bottom--2-l{bottom:-2rem}.swagger-ui .left--2-l{left:-2rem}.swagger-ui .absolute--fill-l{bottom:0;left:0;right:0;top:0}}.swagger-ui .cf:after,.swagger-ui .cf:before{content:" ";display:table}.swagger-ui .cf:after{clear:both}.swagger-ui .cf{*zoom:1}.swagger-ui .cl{clear:left}.swagger-ui .cr{clear:right}.swagger-ui .cb{clear:both}.swagger-ui .cn{clear:none}@media screen and (min-width:30em){.swagger-ui .cl-ns{clear:left}.swagger-ui .cr-ns{clear:right}.swagger-ui .cb-ns{clear:both}.swagger-ui .cn-ns{clear:none}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .cl-m{clear:left}.swagger-ui .cr-m{clear:right}.swagger-ui .cb-m{clear:both}.swagger-ui .cn-m{clear:none}}@media screen and (min-width:60em){.swagger-ui .cl-l{clear:left}.swagger-ui .cr-l{clear:right}.swagger-ui .cb-l{clear:both}.swagger-ui .cn-l{clear:none}}.swagger-ui .flex{display:flex}.swagger-ui .inline-flex{display:inline-flex}.swagger-ui .flex-auto{flex:1 1 auto;min-height:0;min-width:0}.swagger-ui .flex-none{flex:none}.swagger-ui .flex-column{flex-direction:column}.swagger-ui .flex-row{flex-direction:row}.swagger-ui .flex-wrap{flex-wrap:wrap}.swagger-ui .flex-nowrap{flex-wrap:nowrap}.swagger-ui .flex-wrap-reverse{flex-wrap:wrap-reverse}.swagger-ui .flex-column-reverse{flex-direction:column-reverse}.swagger-ui .flex-row-reverse{flex-direction:row-reverse}.swagger-ui .items-start{align-items:flex-start}.swagger-ui .items-end{align-items:flex-end}.swagger-ui .items-center{align-items:center}.swagger-ui .items-baseline{align-items:baseline}.swagger-ui .items-stretch{align-items:stretch}.swagger-ui .self-start{align-self:flex-start}.swagger-ui .self-end{align-self:flex-end}.swagger-ui .self-center{align-self:center}.swagger-ui .self-baseline{align-self:baseline}.swagger-ui .self-stretch{align-self:stretch}.swagger-ui .justify-start{justify-content:flex-start}.swagger-ui .justify-end{justify-content:flex-end}.swagger-ui .justify-center{justify-content:center}.swagger-ui .justify-between{justify-content:space-between}.swagger-ui .justify-around{justify-content:space-around}.swagger-ui .content-start{align-content:flex-start}.swagger-ui .content-end{align-content:flex-end}.swagger-ui .content-center{align-content:center}.swagger-ui .content-between{align-content:space-between}.swagger-ui .content-around{align-content:space-around}.swagger-ui .content-stretch{align-content:stretch}.swagger-ui .order-0{order:0}.swagger-ui .order-1{order:1}.swagger-ui .order-2{order:2}.swagger-ui .order-3{order:3}.swagger-ui .order-4{order:4}.swagger-ui .order-5{order:5}.swagger-ui .order-6{order:6}.swagger-ui .order-7{order:7}.swagger-ui .order-8{order:8}.swagger-ui .order-last{order:99999}.swagger-ui .flex-grow-0{flex-grow:0}.swagger-ui .flex-grow-1{flex-grow:1}.swagger-ui .flex-shrink-0{flex-shrink:0}.swagger-ui .flex-shrink-1{flex-shrink:1}@media screen and (min-width:30em){.swagger-ui .flex-ns{display:flex}.swagger-ui .inline-flex-ns{display:inline-flex}.swagger-ui .flex-auto-ns{flex:1 1 auto;min-height:0;min-width:0}.swagger-ui .flex-none-ns{flex:none}.swagger-ui .flex-column-ns{flex-direction:column}.swagger-ui .flex-row-ns{flex-direction:row}.swagger-ui .flex-wrap-ns{flex-wrap:wrap}.swagger-ui .flex-nowrap-ns{flex-wrap:nowrap}.swagger-ui .flex-wrap-reverse-ns{flex-wrap:wrap-reverse}.swagger-ui .flex-column-reverse-ns{flex-direction:column-reverse}.swagger-ui .flex-row-reverse-ns{flex-direction:row-reverse}.swagger-ui .items-start-ns{align-items:flex-start}.swagger-ui .items-end-ns{align-items:flex-end}.swagger-ui .items-center-ns{align-items:center}.swagger-ui .items-baseline-ns{align-items:baseline}.swagger-ui .items-stretch-ns{align-items:stretch}.swagger-ui .self-start-ns{align-self:flex-start}.swagger-ui .self-end-ns{align-self:flex-end}.swagger-ui .self-center-ns{align-self:center}.swagger-ui .self-baseline-ns{align-self:baseline}.swagger-ui .self-stretch-ns{align-self:stretch}.swagger-ui .justify-start-ns{justify-content:flex-start}.swagger-ui .justify-end-ns{justify-content:flex-end}.swagger-ui .justify-center-ns{justify-content:center}.swagger-ui .justify-between-ns{justify-content:space-between}.swagger-ui .justify-around-ns{justify-content:space-around}.swagger-ui .content-start-ns{align-content:flex-start}.swagger-ui .content-end-ns{align-content:flex-end}.swagger-ui .content-center-ns{align-content:center}.swagger-ui .content-between-ns{align-content:space-between}.swagger-ui .content-around-ns{align-content:space-around}.swagger-ui .content-stretch-ns{align-content:stretch}.swagger-ui .order-0-ns{order:0}.swagger-ui .order-1-ns{order:1}.swagger-ui .order-2-ns{order:2}.swagger-ui .order-3-ns{order:3}.swagger-ui .order-4-ns{order:4}.swagger-ui .order-5-ns{order:5}.swagger-ui .order-6-ns{order:6}.swagger-ui .order-7-ns{order:7}.swagger-ui .order-8-ns{order:8}.swagger-ui .order-last-ns{order:99999}.swagger-ui .flex-grow-0-ns{flex-grow:0}.swagger-ui .flex-grow-1-ns{flex-grow:1}.swagger-ui .flex-shrink-0-ns{flex-shrink:0}.swagger-ui .flex-shrink-1-ns{flex-shrink:1}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .flex-m{display:flex}.swagger-ui .inline-flex-m{display:inline-flex}.swagger-ui .flex-auto-m{flex:1 1 auto;min-height:0;min-width:0}.swagger-ui .flex-none-m{flex:none}.swagger-ui .flex-column-m{flex-direction:column}.swagger-ui .flex-row-m{flex-direction:row}.swagger-ui .flex-wrap-m{flex-wrap:wrap}.swagger-ui .flex-nowrap-m{flex-wrap:nowrap}.swagger-ui .flex-wrap-reverse-m{flex-wrap:wrap-reverse}.swagger-ui .flex-column-reverse-m{flex-direction:column-reverse}.swagger-ui .flex-row-reverse-m{flex-direction:row-reverse}.swagger-ui .items-start-m{align-items:flex-start}.swagger-ui .items-end-m{align-items:flex-end}.swagger-ui .items-center-m{align-items:center}.swagger-ui .items-baseline-m{align-items:baseline}.swagger-ui .items-stretch-m{align-items:stretch}.swagger-ui .self-start-m{align-self:flex-start}.swagger-ui .self-end-m{align-self:flex-end}.swagger-ui .self-center-m{align-self:center}.swagger-ui .self-baseline-m{align-self:baseline}.swagger-ui .self-stretch-m{align-self:stretch}.swagger-ui .justify-start-m{justify-content:flex-start}.swagger-ui .justify-end-m{justify-content:flex-end}.swagger-ui .justify-center-m{justify-content:center}.swagger-ui .justify-between-m{justify-content:space-between}.swagger-ui .justify-around-m{justify-content:space-around}.swagger-ui .content-start-m{align-content:flex-start}.swagger-ui .content-end-m{align-content:flex-end}.swagger-ui .content-center-m{align-content:center}.swagger-ui .content-between-m{align-content:space-between}.swagger-ui .content-around-m{align-content:space-around}.swagger-ui .content-stretch-m{align-content:stretch}.swagger-ui .order-0-m{order:0}.swagger-ui .order-1-m{order:1}.swagger-ui .order-2-m{order:2}.swagger-ui .order-3-m{order:3}.swagger-ui .order-4-m{order:4}.swagger-ui .order-5-m{order:5}.swagger-ui .order-6-m{order:6}.swagger-ui .order-7-m{order:7}.swagger-ui .order-8-m{order:8}.swagger-ui .order-last-m{order:99999}.swagger-ui .flex-grow-0-m{flex-grow:0}.swagger-ui .flex-grow-1-m{flex-grow:1}.swagger-ui .flex-shrink-0-m{flex-shrink:0}.swagger-ui .flex-shrink-1-m{flex-shrink:1}}@media screen and (min-width:60em){.swagger-ui .flex-l{display:flex}.swagger-ui .inline-flex-l{display:inline-flex}.swagger-ui .flex-auto-l{flex:1 1 auto;min-height:0;min-width:0}.swagger-ui .flex-none-l{flex:none}.swagger-ui .flex-column-l{flex-direction:column}.swagger-ui .flex-row-l{flex-direction:row}.swagger-ui .flex-wrap-l{flex-wrap:wrap}.swagger-ui .flex-nowrap-l{flex-wrap:nowrap}.swagger-ui .flex-wrap-reverse-l{flex-wrap:wrap-reverse}.swagger-ui .flex-column-reverse-l{flex-direction:column-reverse}.swagger-ui .flex-row-reverse-l{flex-direction:row-reverse}.swagger-ui .items-start-l{align-items:flex-start}.swagger-ui .items-end-l{align-items:flex-end}.swagger-ui .items-center-l{align-items:center}.swagger-ui .items-baseline-l{align-items:baseline}.swagger-ui .items-stretch-l{align-items:stretch}.swagger-ui .self-start-l{align-self:flex-start}.swagger-ui .self-end-l{align-self:flex-end}.swagger-ui .self-center-l{align-self:center}.swagger-ui .self-baseline-l{align-self:baseline}.swagger-ui .self-stretch-l{align-self:stretch}.swagger-ui .justify-start-l{justify-content:flex-start}.swagger-ui .justify-end-l{justify-content:flex-end}.swagger-ui .justify-center-l{justify-content:center}.swagger-ui .justify-between-l{justify-content:space-between}.swagger-ui .justify-around-l{justify-content:space-around}.swagger-ui .content-start-l{align-content:flex-start}.swagger-ui .content-end-l{align-content:flex-end}.swagger-ui .content-center-l{align-content:center}.swagger-ui .content-between-l{align-content:space-between}.swagger-ui .content-around-l{align-content:space-around}.swagger-ui .content-stretch-l{align-content:stretch}.swagger-ui .order-0-l{order:0}.swagger-ui .order-1-l{order:1}.swagger-ui .order-2-l{order:2}.swagger-ui .order-3-l{order:3}.swagger-ui .order-4-l{order:4}.swagger-ui .order-5-l{order:5}.swagger-ui .order-6-l{order:6}.swagger-ui .order-7-l{order:7}.swagger-ui .order-8-l{order:8}.swagger-ui .order-last-l{order:99999}.swagger-ui .flex-grow-0-l{flex-grow:0}.swagger-ui .flex-grow-1-l{flex-grow:1}.swagger-ui .flex-shrink-0-l{flex-shrink:0}.swagger-ui .flex-shrink-1-l{flex-shrink:1}}.swagger-ui .dn{display:none}.swagger-ui .di{display:inline}.swagger-ui .db{display:block}.swagger-ui .dib{display:inline-block}.swagger-ui .dit{display:inline-table}.swagger-ui .dt{display:table}.swagger-ui .dtc{display:table-cell}.swagger-ui .dt-row{display:table-row}.swagger-ui .dt-row-group{display:table-row-group}.swagger-ui .dt-column{display:table-column}.swagger-ui .dt-column-group{display:table-column-group}.swagger-ui .dt--fixed{table-layout:fixed;width:100%}@media screen and (min-width:30em){.swagger-ui .dn-ns{display:none}.swagger-ui .di-ns{display:inline}.swagger-ui .db-ns{display:block}.swagger-ui .dib-ns{display:inline-block}.swagger-ui .dit-ns{display:inline-table}.swagger-ui .dt-ns{display:table}.swagger-ui .dtc-ns{display:table-cell}.swagger-ui .dt-row-ns{display:table-row}.swagger-ui .dt-row-group-ns{display:table-row-group}.swagger-ui .dt-column-ns{display:table-column}.swagger-ui .dt-column-group-ns{display:table-column-group}.swagger-ui .dt--fixed-ns{table-layout:fixed;width:100%}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .dn-m{display:none}.swagger-ui .di-m{display:inline}.swagger-ui .db-m{display:block}.swagger-ui .dib-m{display:inline-block}.swagger-ui .dit-m{display:inline-table}.swagger-ui .dt-m{display:table}.swagger-ui .dtc-m{display:table-cell}.swagger-ui .dt-row-m{display:table-row}.swagger-ui .dt-row-group-m{display:table-row-group}.swagger-ui .dt-column-m{display:table-column}.swagger-ui .dt-column-group-m{display:table-column-group}.swagger-ui .dt--fixed-m{table-layout:fixed;width:100%}}@media screen and (min-width:60em){.swagger-ui .dn-l{display:none}.swagger-ui .di-l{display:inline}.swagger-ui .db-l{display:block}.swagger-ui .dib-l{display:inline-block}.swagger-ui .dit-l{display:inline-table}.swagger-ui .dt-l{display:table}.swagger-ui .dtc-l{display:table-cell}.swagger-ui .dt-row-l{display:table-row}.swagger-ui .dt-row-group-l{display:table-row-group}.swagger-ui .dt-column-l{display:table-column}.swagger-ui .dt-column-group-l{display:table-column-group}.swagger-ui .dt--fixed-l{table-layout:fixed;width:100%}}.swagger-ui .fl{_display:inline;float:left}.swagger-ui .fr{_display:inline;float:right}.swagger-ui .fn{float:none}@media screen and (min-width:30em){.swagger-ui .fl-ns{_display:inline;float:left}.swagger-ui .fr-ns{_display:inline;float:right}.swagger-ui .fn-ns{float:none}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .fl-m{_display:inline;float:left}.swagger-ui .fr-m{_display:inline;float:right}.swagger-ui .fn-m{float:none}}@media screen and (min-width:60em){.swagger-ui .fl-l{_display:inline;float:left}.swagger-ui .fr-l{_display:inline;float:right}.swagger-ui .fn-l{float:none}}.swagger-ui .sans-serif{font-family:-apple-system,BlinkMacSystemFont,avenir next,avenir,helvetica,helvetica neue,ubuntu,roboto,noto,segoe ui,arial,sans-serif}.swagger-ui .serif{font-family:georgia,serif}.swagger-ui .system-sans-serif{font-family:sans-serif}.swagger-ui .system-serif{font-family:serif}.swagger-ui .code,.swagger-ui code{font-family:Consolas,monaco,monospace}.swagger-ui .courier{font-family:Courier Next,courier,monospace}.swagger-ui .helvetica{font-family:helvetica neue,helvetica,sans-serif}.swagger-ui .avenir{font-family:avenir next,avenir,sans-serif}.swagger-ui .athelas{font-family:athelas,georgia,serif}.swagger-ui .georgia{font-family:georgia,serif}.swagger-ui .times{font-family:times,serif}.swagger-ui .bodoni{font-family:Bodoni MT,serif}.swagger-ui .calisto{font-family:Calisto MT,serif}.swagger-ui .garamond{font-family:garamond,serif}.swagger-ui .baskerville{font-family:baskerville,serif}.swagger-ui .i{font-style:italic}.swagger-ui .fs-normal{font-style:normal}@media screen and (min-width:30em){.swagger-ui .i-ns{font-style:italic}.swagger-ui .fs-normal-ns{font-style:normal}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .i-m{font-style:italic}.swagger-ui .fs-normal-m{font-style:normal}}@media screen and (min-width:60em){.swagger-ui .i-l{font-style:italic}.swagger-ui .fs-normal-l{font-style:normal}}.swagger-ui .normal{font-weight:400}.swagger-ui .b{font-weight:700}.swagger-ui .fw1{font-weight:100}.swagger-ui .fw2{font-weight:200}.swagger-ui .fw3{font-weight:300}.swagger-ui .fw4{font-weight:400}.swagger-ui .fw5{font-weight:500}.swagger-ui .fw6{font-weight:600}.swagger-ui .fw7{font-weight:700}.swagger-ui .fw8{font-weight:800}.swagger-ui .fw9{font-weight:900}@media screen and (min-width:30em){.swagger-ui .normal-ns{font-weight:400}.swagger-ui .b-ns{font-weight:700}.swagger-ui .fw1-ns{font-weight:100}.swagger-ui .fw2-ns{font-weight:200}.swagger-ui .fw3-ns{font-weight:300}.swagger-ui .fw4-ns{font-weight:400}.swagger-ui .fw5-ns{font-weight:500}.swagger-ui .fw6-ns{font-weight:600}.swagger-ui .fw7-ns{font-weight:700}.swagger-ui .fw8-ns{font-weight:800}.swagger-ui .fw9-ns{font-weight:900}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .normal-m{font-weight:400}.swagger-ui .b-m{font-weight:700}.swagger-ui .fw1-m{font-weight:100}.swagger-ui .fw2-m{font-weight:200}.swagger-ui .fw3-m{font-weight:300}.swagger-ui .fw4-m{font-weight:400}.swagger-ui .fw5-m{font-weight:500}.swagger-ui .fw6-m{font-weight:600}.swagger-ui .fw7-m{font-weight:700}.swagger-ui .fw8-m{font-weight:800}.swagger-ui .fw9-m{font-weight:900}}@media screen and (min-width:60em){.swagger-ui .normal-l{font-weight:400}.swagger-ui .b-l{font-weight:700}.swagger-ui .fw1-l{font-weight:100}.swagger-ui .fw2-l{font-weight:200}.swagger-ui .fw3-l{font-weight:300}.swagger-ui .fw4-l{font-weight:400}.swagger-ui .fw5-l{font-weight:500}.swagger-ui .fw6-l{font-weight:600}.swagger-ui .fw7-l{font-weight:700}.swagger-ui .fw8-l{font-weight:800}.swagger-ui .fw9-l{font-weight:900}}.swagger-ui .input-reset{-webkit-appearance:none;-moz-appearance:none}.swagger-ui .button-reset::-moz-focus-inner,.swagger-ui .input-reset::-moz-focus-inner{border:0;padding:0}.swagger-ui .h1{height:1rem}.swagger-ui .h2{height:2rem}.swagger-ui .h3{height:4rem}.swagger-ui .h4{height:8rem}.swagger-ui .h5{height:16rem}.swagger-ui .h-25{height:25%}.swagger-ui .h-50{height:50%}.swagger-ui .h-75{height:75%}.swagger-ui .h-100{height:100%}.swagger-ui .min-h-100{min-height:100%}.swagger-ui .vh-25{height:25vh}.swagger-ui .vh-50{height:50vh}.swagger-ui .vh-75{height:75vh}.swagger-ui .vh-100{height:100vh}.swagger-ui .min-vh-100{min-height:100vh}.swagger-ui .h-auto{height:auto}.swagger-ui .h-inherit{height:inherit}@media screen and (min-width:30em){.swagger-ui .h1-ns{height:1rem}.swagger-ui .h2-ns{height:2rem}.swagger-ui .h3-ns{height:4rem}.swagger-ui .h4-ns{height:8rem}.swagger-ui .h5-ns{height:16rem}.swagger-ui .h-25-ns{height:25%}.swagger-ui .h-50-ns{height:50%}.swagger-ui .h-75-ns{height:75%}.swagger-ui .h-100-ns{height:100%}.swagger-ui .min-h-100-ns{min-height:100%}.swagger-ui .vh-25-ns{height:25vh}.swagger-ui .vh-50-ns{height:50vh}.swagger-ui .vh-75-ns{height:75vh}.swagger-ui .vh-100-ns{height:100vh}.swagger-ui .min-vh-100-ns{min-height:100vh}.swagger-ui .h-auto-ns{height:auto}.swagger-ui .h-inherit-ns{height:inherit}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .h1-m{height:1rem}.swagger-ui .h2-m{height:2rem}.swagger-ui .h3-m{height:4rem}.swagger-ui .h4-m{height:8rem}.swagger-ui .h5-m{height:16rem}.swagger-ui .h-25-m{height:25%}.swagger-ui .h-50-m{height:50%}.swagger-ui .h-75-m{height:75%}.swagger-ui .h-100-m{height:100%}.swagger-ui .min-h-100-m{min-height:100%}.swagger-ui .vh-25-m{height:25vh}.swagger-ui .vh-50-m{height:50vh}.swagger-ui .vh-75-m{height:75vh}.swagger-ui .vh-100-m{height:100vh}.swagger-ui .min-vh-100-m{min-height:100vh}.swagger-ui .h-auto-m{height:auto}.swagger-ui .h-inherit-m{height:inherit}}@media screen and (min-width:60em){.swagger-ui .h1-l{height:1rem}.swagger-ui .h2-l{height:2rem}.swagger-ui .h3-l{height:4rem}.swagger-ui .h4-l{height:8rem}.swagger-ui .h5-l{height:16rem}.swagger-ui .h-25-l{height:25%}.swagger-ui .h-50-l{height:50%}.swagger-ui .h-75-l{height:75%}.swagger-ui .h-100-l{height:100%}.swagger-ui .min-h-100-l{min-height:100%}.swagger-ui .vh-25-l{height:25vh}.swagger-ui .vh-50-l{height:50vh}.swagger-ui .vh-75-l{height:75vh}.swagger-ui .vh-100-l{height:100vh}.swagger-ui .min-vh-100-l{min-height:100vh}.swagger-ui .h-auto-l{height:auto}.swagger-ui .h-inherit-l{height:inherit}}.swagger-ui .tracked{letter-spacing:.1em}.swagger-ui .tracked-tight{letter-spacing:-.05em}.swagger-ui .tracked-mega{letter-spacing:.25em}@media screen and (min-width:30em){.swagger-ui .tracked-ns{letter-spacing:.1em}.swagger-ui .tracked-tight-ns{letter-spacing:-.05em}.swagger-ui .tracked-mega-ns{letter-spacing:.25em}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .tracked-m{letter-spacing:.1em}.swagger-ui .tracked-tight-m{letter-spacing:-.05em}.swagger-ui .tracked-mega-m{letter-spacing:.25em}}@media screen and (min-width:60em){.swagger-ui .tracked-l{letter-spacing:.1em}.swagger-ui .tracked-tight-l{letter-spacing:-.05em}.swagger-ui .tracked-mega-l{letter-spacing:.25em}}.swagger-ui .lh-solid{line-height:1}.swagger-ui .lh-title{line-height:1.25}.swagger-ui .lh-copy{line-height:1.5}@media screen and (min-width:30em){.swagger-ui .lh-solid-ns{line-height:1}.swagger-ui .lh-title-ns{line-height:1.25}.swagger-ui .lh-copy-ns{line-height:1.5}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .lh-solid-m{line-height:1}.swagger-ui .lh-title-m{line-height:1.25}.swagger-ui .lh-copy-m{line-height:1.5}}@media screen and (min-width:60em){.swagger-ui .lh-solid-l{line-height:1}.swagger-ui .lh-title-l{line-height:1.25}.swagger-ui .lh-copy-l{line-height:1.5}}.swagger-ui .link{text-decoration:none}.swagger-ui .link,.swagger-ui .link:active,.swagger-ui .link:focus,.swagger-ui .link:hover,.swagger-ui .link:link,.swagger-ui .link:visited{transition:color .15s ease-in}.swagger-ui .link:focus{outline:1px dotted currentColor}.swagger-ui .list{list-style-type:none}.swagger-ui .mw-100{max-width:100%}.swagger-ui .mw1{max-width:1rem}.swagger-ui .mw2{max-width:2rem}.swagger-ui .mw3{max-width:4rem}.swagger-ui .mw4{max-width:8rem}.swagger-ui .mw5{max-width:16rem}.swagger-ui .mw6{max-width:32rem}.swagger-ui .mw7{max-width:48rem}.swagger-ui .mw8{max-width:64rem}.swagger-ui .mw9{max-width:96rem}.swagger-ui .mw-none{max-width:none}@media screen and (min-width:30em){.swagger-ui .mw-100-ns{max-width:100%}.swagger-ui .mw1-ns{max-width:1rem}.swagger-ui .mw2-ns{max-width:2rem}.swagger-ui .mw3-ns{max-width:4rem}.swagger-ui .mw4-ns{max-width:8rem}.swagger-ui .mw5-ns{max-width:16rem}.swagger-ui .mw6-ns{max-width:32rem}.swagger-ui .mw7-ns{max-width:48rem}.swagger-ui .mw8-ns{max-width:64rem}.swagger-ui .mw9-ns{max-width:96rem}.swagger-ui .mw-none-ns{max-width:none}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .mw-100-m{max-width:100%}.swagger-ui .mw1-m{max-width:1rem}.swagger-ui .mw2-m{max-width:2rem}.swagger-ui .mw3-m{max-width:4rem}.swagger-ui .mw4-m{max-width:8rem}.swagger-ui .mw5-m{max-width:16rem}.swagger-ui .mw6-m{max-width:32rem}.swagger-ui .mw7-m{max-width:48rem}.swagger-ui .mw8-m{max-width:64rem}.swagger-ui .mw9-m{max-width:96rem}.swagger-ui .mw-none-m{max-width:none}}@media screen and (min-width:60em){.swagger-ui .mw-100-l{max-width:100%}.swagger-ui .mw1-l{max-width:1rem}.swagger-ui .mw2-l{max-width:2rem}.swagger-ui .mw3-l{max-width:4rem}.swagger-ui .mw4-l{max-width:8rem}.swagger-ui .mw5-l{max-width:16rem}.swagger-ui .mw6-l{max-width:32rem}.swagger-ui .mw7-l{max-width:48rem}.swagger-ui .mw8-l{max-width:64rem}.swagger-ui .mw9-l{max-width:96rem}.swagger-ui .mw-none-l{max-width:none}}.swagger-ui .w1{width:1rem}.swagger-ui .w2{width:2rem}.swagger-ui .w3{width:4rem}.swagger-ui .w4{width:8rem}.swagger-ui .w5{width:16rem}.swagger-ui .w-10{width:10%}.swagger-ui .w-20{width:20%}.swagger-ui .w-25{width:25%}.swagger-ui .w-30{width:30%}.swagger-ui .w-33{width:33%}.swagger-ui .w-34{width:34%}.swagger-ui .w-40{width:40%}.swagger-ui .w-50{width:50%}.swagger-ui .w-60{width:60%}.swagger-ui .w-70{width:70%}.swagger-ui .w-75{width:75%}.swagger-ui .w-80{width:80%}.swagger-ui .w-90{width:90%}.swagger-ui .w-100{width:100%}.swagger-ui .w-third{width:33.3333333333%}.swagger-ui .w-two-thirds{width:66.6666666667%}.swagger-ui .w-auto{width:auto}@media screen and (min-width:30em){.swagger-ui .w1-ns{width:1rem}.swagger-ui .w2-ns{width:2rem}.swagger-ui .w3-ns{width:4rem}.swagger-ui .w4-ns{width:8rem}.swagger-ui .w5-ns{width:16rem}.swagger-ui .w-10-ns{width:10%}.swagger-ui .w-20-ns{width:20%}.swagger-ui .w-25-ns{width:25%}.swagger-ui .w-30-ns{width:30%}.swagger-ui .w-33-ns{width:33%}.swagger-ui .w-34-ns{width:34%}.swagger-ui .w-40-ns{width:40%}.swagger-ui .w-50-ns{width:50%}.swagger-ui .w-60-ns{width:60%}.swagger-ui .w-70-ns{width:70%}.swagger-ui .w-75-ns{width:75%}.swagger-ui .w-80-ns{width:80%}.swagger-ui .w-90-ns{width:90%}.swagger-ui .w-100-ns{width:100%}.swagger-ui .w-third-ns{width:33.3333333333%}.swagger-ui .w-two-thirds-ns{width:66.6666666667%}.swagger-ui .w-auto-ns{width:auto}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .w1-m{width:1rem}.swagger-ui .w2-m{width:2rem}.swagger-ui .w3-m{width:4rem}.swagger-ui .w4-m{width:8rem}.swagger-ui .w5-m{width:16rem}.swagger-ui .w-10-m{width:10%}.swagger-ui .w-20-m{width:20%}.swagger-ui .w-25-m{width:25%}.swagger-ui .w-30-m{width:30%}.swagger-ui .w-33-m{width:33%}.swagger-ui .w-34-m{width:34%}.swagger-ui .w-40-m{width:40%}.swagger-ui .w-50-m{width:50%}.swagger-ui .w-60-m{width:60%}.swagger-ui .w-70-m{width:70%}.swagger-ui .w-75-m{width:75%}.swagger-ui .w-80-m{width:80%}.swagger-ui .w-90-m{width:90%}.swagger-ui .w-100-m{width:100%}.swagger-ui .w-third-m{width:33.3333333333%}.swagger-ui .w-two-thirds-m{width:66.6666666667%}.swagger-ui .w-auto-m{width:auto}}@media screen and (min-width:60em){.swagger-ui .w1-l{width:1rem}.swagger-ui .w2-l{width:2rem}.swagger-ui .w3-l{width:4rem}.swagger-ui .w4-l{width:8rem}.swagger-ui .w5-l{width:16rem}.swagger-ui .w-10-l{width:10%}.swagger-ui .w-20-l{width:20%}.swagger-ui .w-25-l{width:25%}.swagger-ui .w-30-l{width:30%}.swagger-ui .w-33-l{width:33%}.swagger-ui .w-34-l{width:34%}.swagger-ui .w-40-l{width:40%}.swagger-ui .w-50-l{width:50%}.swagger-ui .w-60-l{width:60%}.swagger-ui .w-70-l{width:70%}.swagger-ui .w-75-l{width:75%}.swagger-ui .w-80-l{width:80%}.swagger-ui .w-90-l{width:90%}.swagger-ui .w-100-l{width:100%}.swagger-ui .w-third-l{width:33.3333333333%}.swagger-ui .w-two-thirds-l{width:66.6666666667%}.swagger-ui .w-auto-l{width:auto}}.swagger-ui .overflow-visible{overflow:visible}.swagger-ui .overflow-hidden{overflow:hidden}.swagger-ui .overflow-scroll{overflow:scroll}.swagger-ui .overflow-auto{overflow:auto}.swagger-ui .overflow-x-visible{overflow-x:visible}.swagger-ui .overflow-x-hidden{overflow-x:hidden}.swagger-ui .overflow-x-scroll{overflow-x:scroll}.swagger-ui .overflow-x-auto{overflow-x:auto}.swagger-ui .overflow-y-visible{overflow-y:visible}.swagger-ui .overflow-y-hidden{overflow-y:hidden}.swagger-ui .overflow-y-scroll{overflow-y:scroll}.swagger-ui .overflow-y-auto{overflow-y:auto}@media screen and (min-width:30em){.swagger-ui .overflow-visible-ns{overflow:visible}.swagger-ui .overflow-hidden-ns{overflow:hidden}.swagger-ui .overflow-scroll-ns{overflow:scroll}.swagger-ui .overflow-auto-ns{overflow:auto}.swagger-ui .overflow-x-visible-ns{overflow-x:visible}.swagger-ui .overflow-x-hidden-ns{overflow-x:hidden}.swagger-ui .overflow-x-scroll-ns{overflow-x:scroll}.swagger-ui .overflow-x-auto-ns{overflow-x:auto}.swagger-ui .overflow-y-visible-ns{overflow-y:visible}.swagger-ui .overflow-y-hidden-ns{overflow-y:hidden}.swagger-ui .overflow-y-scroll-ns{overflow-y:scroll}.swagger-ui .overflow-y-auto-ns{overflow-y:auto}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .overflow-visible-m{overflow:visible}.swagger-ui .overflow-hidden-m{overflow:hidden}.swagger-ui .overflow-scroll-m{overflow:scroll}.swagger-ui .overflow-auto-m{overflow:auto}.swagger-ui .overflow-x-visible-m{overflow-x:visible}.swagger-ui .overflow-x-hidden-m{overflow-x:hidden}.swagger-ui .overflow-x-scroll-m{overflow-x:scroll}.swagger-ui .overflow-x-auto-m{overflow-x:auto}.swagger-ui .overflow-y-visible-m{overflow-y:visible}.swagger-ui .overflow-y-hidden-m{overflow-y:hidden}.swagger-ui .overflow-y-scroll-m{overflow-y:scroll}.swagger-ui .overflow-y-auto-m{overflow-y:auto}}@media screen and (min-width:60em){.swagger-ui .overflow-visible-l{overflow:visible}.swagger-ui .overflow-hidden-l{overflow:hidden}.swagger-ui .overflow-scroll-l{overflow:scroll}.swagger-ui .overflow-auto-l{overflow:auto}.swagger-ui .overflow-x-visible-l{overflow-x:visible}.swagger-ui .overflow-x-hidden-l{overflow-x:hidden}.swagger-ui .overflow-x-scroll-l{overflow-x:scroll}.swagger-ui .overflow-x-auto-l{overflow-x:auto}.swagger-ui .overflow-y-visible-l{overflow-y:visible}.swagger-ui .overflow-y-hidden-l{overflow-y:hidden}.swagger-ui .overflow-y-scroll-l{overflow-y:scroll}.swagger-ui .overflow-y-auto-l{overflow-y:auto}}.swagger-ui .static{position:static}.swagger-ui .relative{position:relative}.swagger-ui .absolute{position:absolute}.swagger-ui .fixed{position:fixed}@media screen and (min-width:30em){.swagger-ui .static-ns{position:static}.swagger-ui .relative-ns{position:relative}.swagger-ui .absolute-ns{position:absolute}.swagger-ui .fixed-ns{position:fixed}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .static-m{position:static}.swagger-ui .relative-m{position:relative}.swagger-ui .absolute-m{position:absolute}.swagger-ui .fixed-m{position:fixed}}@media screen and (min-width:60em){.swagger-ui .static-l{position:static}.swagger-ui .relative-l{position:relative}.swagger-ui .absolute-l{position:absolute}.swagger-ui .fixed-l{position:fixed}}.swagger-ui .o-100{opacity:1}.swagger-ui .o-90{opacity:.9}.swagger-ui .o-80{opacity:.8}.swagger-ui .o-70{opacity:.7}.swagger-ui .o-60{opacity:.6}.swagger-ui .o-50{opacity:.5}.swagger-ui .o-40{opacity:.4}.swagger-ui .o-30{opacity:.3}.swagger-ui .o-20{opacity:.2}.swagger-ui .o-10{opacity:.1}.swagger-ui .o-05{opacity:.05}.swagger-ui .o-025{opacity:.025}.swagger-ui .o-0{opacity:0}.swagger-ui .rotate-45{transform:rotate(45deg)}.swagger-ui .rotate-90{transform:rotate(90deg)}.swagger-ui .rotate-135{transform:rotate(135deg)}.swagger-ui .rotate-180{transform:rotate(180deg)}.swagger-ui .rotate-225{transform:rotate(225deg)}.swagger-ui .rotate-270{transform:rotate(270deg)}.swagger-ui .rotate-315{transform:rotate(315deg)}@media screen and (min-width:30em){.swagger-ui .rotate-45-ns{transform:rotate(45deg)}.swagger-ui .rotate-90-ns{transform:rotate(90deg)}.swagger-ui .rotate-135-ns{transform:rotate(135deg)}.swagger-ui .rotate-180-ns{transform:rotate(180deg)}.swagger-ui .rotate-225-ns{transform:rotate(225deg)}.swagger-ui .rotate-270-ns{transform:rotate(270deg)}.swagger-ui .rotate-315-ns{transform:rotate(315deg)}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .rotate-45-m{transform:rotate(45deg)}.swagger-ui .rotate-90-m{transform:rotate(90deg)}.swagger-ui .rotate-135-m{transform:rotate(135deg)}.swagger-ui .rotate-180-m{transform:rotate(180deg)}.swagger-ui .rotate-225-m{transform:rotate(225deg)}.swagger-ui .rotate-270-m{transform:rotate(270deg)}.swagger-ui .rotate-315-m{transform:rotate(315deg)}}@media screen and (min-width:60em){.swagger-ui .rotate-45-l{transform:rotate(45deg)}.swagger-ui .rotate-90-l{transform:rotate(90deg)}.swagger-ui .rotate-135-l{transform:rotate(135deg)}.swagger-ui .rotate-180-l{transform:rotate(180deg)}.swagger-ui .rotate-225-l{transform:rotate(225deg)}.swagger-ui .rotate-270-l{transform:rotate(270deg)}.swagger-ui .rotate-315-l{transform:rotate(315deg)}}.swagger-ui .black-90{color:rgba(0,0,0,.9)}.swagger-ui .black-80{color:rgba(0,0,0,.8)}.swagger-ui .black-70{color:rgba(0,0,0,.7)}.swagger-ui .black-60{color:rgba(0,0,0,.6)}.swagger-ui .black-50{color:rgba(0,0,0,.5)}.swagger-ui .black-40{color:rgba(0,0,0,.4)}.swagger-ui .black-30{color:rgba(0,0,0,.3)}.swagger-ui .black-20{color:rgba(0,0,0,.2)}.swagger-ui .black-10{color:rgba(0,0,0,.1)}.swagger-ui .black-05{color:rgba(0,0,0,.05)}.swagger-ui .white-90{color:hsla(0,0%,100%,.9)}.swagger-ui .white-80{color:hsla(0,0%,100%,.8)}.swagger-ui .white-70{color:hsla(0,0%,100%,.7)}.swagger-ui .white-60{color:hsla(0,0%,100%,.6)}.swagger-ui .white-50{color:hsla(0,0%,100%,.5)}.swagger-ui .white-40{color:hsla(0,0%,100%,.4)}.swagger-ui .white-30{color:hsla(0,0%,100%,.3)}.swagger-ui .white-20{color:hsla(0,0%,100%,.2)}.swagger-ui .white-10{color:hsla(0,0%,100%,.1)}.swagger-ui .black{color:#000}.swagger-ui .near-black{color:#111}.swagger-ui .dark-gray{color:#333}.swagger-ui .mid-gray{color:#555}.swagger-ui .gray{color:#777}.swagger-ui .silver{color:#999}.swagger-ui .light-silver{color:#aaa}.swagger-ui .moon-gray{color:#ccc}.swagger-ui .light-gray{color:#eee}.swagger-ui .near-white{color:#f4f4f4}.swagger-ui .white{color:#fff}.swagger-ui .dark-red{color:#e7040f}.swagger-ui .red{color:#ff4136}.swagger-ui .light-red{color:#ff725c}.swagger-ui .orange{color:#ff6300}.swagger-ui .gold{color:#ffb700}.swagger-ui .yellow{color:gold}.swagger-ui .light-yellow{color:#fbf1a9}.swagger-ui .purple{color:#5e2ca5}.swagger-ui .light-purple{color:#a463f2}.swagger-ui .dark-pink{color:#d5008f}.swagger-ui .hot-pink{color:#ff41b4}.swagger-ui .pink{color:#ff80cc}.swagger-ui .light-pink{color:#ffa3d7}.swagger-ui .dark-green{color:#137752}.swagger-ui .green{color:#19a974}.swagger-ui .light-green{color:#9eebcf}.swagger-ui .navy{color:#001b44}.swagger-ui .dark-blue{color:#00449e}.swagger-ui .blue{color:#357edd}.swagger-ui .light-blue{color:#96ccff}.swagger-ui .lightest-blue{color:#cdecff}.swagger-ui .washed-blue{color:#f6fffe}.swagger-ui .washed-green{color:#e8fdf5}.swagger-ui .washed-yellow{color:#fffceb}.swagger-ui .washed-red{color:#ffdfdf}.swagger-ui .color-inherit{color:inherit}.swagger-ui .bg-black-90{background-color:rgba(0,0,0,.9)}.swagger-ui .bg-black-80{background-color:rgba(0,0,0,.8)}.swagger-ui .bg-black-70{background-color:rgba(0,0,0,.7)}.swagger-ui .bg-black-60{background-color:rgba(0,0,0,.6)}.swagger-ui .bg-black-50{background-color:rgba(0,0,0,.5)}.swagger-ui .bg-black-40{background-color:rgba(0,0,0,.4)}.swagger-ui .bg-black-30{background-color:rgba(0,0,0,.3)}.swagger-ui .bg-black-20{background-color:rgba(0,0,0,.2)}.swagger-ui .bg-black-10{background-color:rgba(0,0,0,.1)}.swagger-ui .bg-black-05{background-color:rgba(0,0,0,.05)}.swagger-ui .bg-white-90{background-color:hsla(0,0%,100%,.9)}.swagger-ui .bg-white-80{background-color:hsla(0,0%,100%,.8)}.swagger-ui .bg-white-70{background-color:hsla(0,0%,100%,.7)}.swagger-ui .bg-white-60{background-color:hsla(0,0%,100%,.6)}.swagger-ui .bg-white-50{background-color:hsla(0,0%,100%,.5)}.swagger-ui .bg-white-40{background-color:hsla(0,0%,100%,.4)}.swagger-ui .bg-white-30{background-color:hsla(0,0%,100%,.3)}.swagger-ui .bg-white-20{background-color:hsla(0,0%,100%,.2)}.swagger-ui .bg-white-10{background-color:hsla(0,0%,100%,.1)}.swagger-ui .bg-black{background-color:#000}.swagger-ui .bg-near-black{background-color:#111}.swagger-ui .bg-dark-gray{background-color:#333}.swagger-ui .bg-mid-gray{background-color:#555}.swagger-ui .bg-gray{background-color:#777}.swagger-ui .bg-silver{background-color:#999}.swagger-ui .bg-light-silver{background-color:#aaa}.swagger-ui .bg-moon-gray{background-color:#ccc}.swagger-ui .bg-light-gray{background-color:#eee}.swagger-ui .bg-near-white{background-color:#f4f4f4}.swagger-ui .bg-white{background-color:#fff}.swagger-ui .bg-transparent{background-color:transparent}.swagger-ui .bg-dark-red{background-color:#e7040f}.swagger-ui .bg-red{background-color:#ff4136}.swagger-ui .bg-light-red{background-color:#ff725c}.swagger-ui .bg-orange{background-color:#ff6300}.swagger-ui .bg-gold{background-color:#ffb700}.swagger-ui .bg-yellow{background-color:gold}.swagger-ui .bg-light-yellow{background-color:#fbf1a9}.swagger-ui .bg-purple{background-color:#5e2ca5}.swagger-ui .bg-light-purple{background-color:#a463f2}.swagger-ui .bg-dark-pink{background-color:#d5008f}.swagger-ui .bg-hot-pink{background-color:#ff41b4}.swagger-ui .bg-pink{background-color:#ff80cc}.swagger-ui .bg-light-pink{background-color:#ffa3d7}.swagger-ui .bg-dark-green{background-color:#137752}.swagger-ui .bg-green{background-color:#19a974}.swagger-ui .bg-light-green{background-color:#9eebcf}.swagger-ui .bg-navy{background-color:#001b44}.swagger-ui .bg-dark-blue{background-color:#00449e}.swagger-ui .bg-blue{background-color:#357edd}.swagger-ui .bg-light-blue{background-color:#96ccff}.swagger-ui .bg-lightest-blue{background-color:#cdecff}.swagger-ui .bg-washed-blue{background-color:#f6fffe}.swagger-ui .bg-washed-green{background-color:#e8fdf5}.swagger-ui .bg-washed-yellow{background-color:#fffceb}.swagger-ui .bg-washed-red{background-color:#ffdfdf}.swagger-ui .bg-inherit{background-color:inherit}.swagger-ui .hover-black:focus,.swagger-ui .hover-black:hover{color:#000}.swagger-ui .hover-near-black:focus,.swagger-ui .hover-near-black:hover{color:#111}.swagger-ui .hover-dark-gray:focus,.swagger-ui .hover-dark-gray:hover{color:#333}.swagger-ui .hover-mid-gray:focus,.swagger-ui .hover-mid-gray:hover{color:#555}.swagger-ui .hover-gray:focus,.swagger-ui .hover-gray:hover{color:#777}.swagger-ui .hover-silver:focus,.swagger-ui .hover-silver:hover{color:#999}.swagger-ui .hover-light-silver:focus,.swagger-ui .hover-light-silver:hover{color:#aaa}.swagger-ui .hover-moon-gray:focus,.swagger-ui .hover-moon-gray:hover{color:#ccc}.swagger-ui .hover-light-gray:focus,.swagger-ui .hover-light-gray:hover{color:#eee}.swagger-ui .hover-near-white:focus,.swagger-ui .hover-near-white:hover{color:#f4f4f4}.swagger-ui .hover-white:focus,.swagger-ui .hover-white:hover{color:#fff}.swagger-ui .hover-black-90:focus,.swagger-ui .hover-black-90:hover{color:rgba(0,0,0,.9)}.swagger-ui .hover-black-80:focus,.swagger-ui .hover-black-80:hover{color:rgba(0,0,0,.8)}.swagger-ui .hover-black-70:focus,.swagger-ui .hover-black-70:hover{color:rgba(0,0,0,.7)}.swagger-ui .hover-black-60:focus,.swagger-ui .hover-black-60:hover{color:rgba(0,0,0,.6)}.swagger-ui .hover-black-50:focus,.swagger-ui .hover-black-50:hover{color:rgba(0,0,0,.5)}.swagger-ui .hover-black-40:focus,.swagger-ui .hover-black-40:hover{color:rgba(0,0,0,.4)}.swagger-ui .hover-black-30:focus,.swagger-ui .hover-black-30:hover{color:rgba(0,0,0,.3)}.swagger-ui .hover-black-20:focus,.swagger-ui .hover-black-20:hover{color:rgba(0,0,0,.2)}.swagger-ui .hover-black-10:focus,.swagger-ui .hover-black-10:hover{color:rgba(0,0,0,.1)}.swagger-ui .hover-white-90:focus,.swagger-ui .hover-white-90:hover{color:hsla(0,0%,100%,.9)}.swagger-ui .hover-white-80:focus,.swagger-ui .hover-white-80:hover{color:hsla(0,0%,100%,.8)}.swagger-ui .hover-white-70:focus,.swagger-ui .hover-white-70:hover{color:hsla(0,0%,100%,.7)}.swagger-ui .hover-white-60:focus,.swagger-ui .hover-white-60:hover{color:hsla(0,0%,100%,.6)}.swagger-ui .hover-white-50:focus,.swagger-ui .hover-white-50:hover{color:hsla(0,0%,100%,.5)}.swagger-ui .hover-white-40:focus,.swagger-ui .hover-white-40:hover{color:hsla(0,0%,100%,.4)}.swagger-ui .hover-white-30:focus,.swagger-ui .hover-white-30:hover{color:hsla(0,0%,100%,.3)}.swagger-ui .hover-white-20:focus,.swagger-ui .hover-white-20:hover{color:hsla(0,0%,100%,.2)}.swagger-ui .hover-white-10:focus,.swagger-ui .hover-white-10:hover{color:hsla(0,0%,100%,.1)}.swagger-ui .hover-inherit:focus,.swagger-ui .hover-inherit:hover{color:inherit}.swagger-ui .hover-bg-black:focus,.swagger-ui .hover-bg-black:hover{background-color:#000}.swagger-ui .hover-bg-near-black:focus,.swagger-ui .hover-bg-near-black:hover{background-color:#111}.swagger-ui .hover-bg-dark-gray:focus,.swagger-ui .hover-bg-dark-gray:hover{background-color:#333}.swagger-ui .hover-bg-mid-gray:focus,.swagger-ui .hover-bg-mid-gray:hover{background-color:#555}.swagger-ui .hover-bg-gray:focus,.swagger-ui .hover-bg-gray:hover{background-color:#777}.swagger-ui .hover-bg-silver:focus,.swagger-ui .hover-bg-silver:hover{background-color:#999}.swagger-ui .hover-bg-light-silver:focus,.swagger-ui .hover-bg-light-silver:hover{background-color:#aaa}.swagger-ui .hover-bg-moon-gray:focus,.swagger-ui .hover-bg-moon-gray:hover{background-color:#ccc}.swagger-ui .hover-bg-light-gray:focus,.swagger-ui .hover-bg-light-gray:hover{background-color:#eee}.swagger-ui .hover-bg-near-white:focus,.swagger-ui .hover-bg-near-white:hover{background-color:#f4f4f4}.swagger-ui .hover-bg-white:focus,.swagger-ui .hover-bg-white:hover{background-color:#fff}.swagger-ui .hover-bg-transparent:focus,.swagger-ui .hover-bg-transparent:hover{background-color:transparent}.swagger-ui .hover-bg-black-90:focus,.swagger-ui .hover-bg-black-90:hover{background-color:rgba(0,0,0,.9)}.swagger-ui .hover-bg-black-80:focus,.swagger-ui .hover-bg-black-80:hover{background-color:rgba(0,0,0,.8)}.swagger-ui .hover-bg-black-70:focus,.swagger-ui .hover-bg-black-70:hover{background-color:rgba(0,0,0,.7)}.swagger-ui .hover-bg-black-60:focus,.swagger-ui .hover-bg-black-60:hover{background-color:rgba(0,0,0,.6)}.swagger-ui .hover-bg-black-50:focus,.swagger-ui .hover-bg-black-50:hover{background-color:rgba(0,0,0,.5)}.swagger-ui .hover-bg-black-40:focus,.swagger-ui .hover-bg-black-40:hover{background-color:rgba(0,0,0,.4)}.swagger-ui .hover-bg-black-30:focus,.swagger-ui .hover-bg-black-30:hover{background-color:rgba(0,0,0,.3)}.swagger-ui .hover-bg-black-20:focus,.swagger-ui .hover-bg-black-20:hover{background-color:rgba(0,0,0,.2)}.swagger-ui .hover-bg-black-10:focus,.swagger-ui .hover-bg-black-10:hover{background-color:rgba(0,0,0,.1)}.swagger-ui .hover-bg-white-90:focus,.swagger-ui .hover-bg-white-90:hover{background-color:hsla(0,0%,100%,.9)}.swagger-ui .hover-bg-white-80:focus,.swagger-ui .hover-bg-white-80:hover{background-color:hsla(0,0%,100%,.8)}.swagger-ui .hover-bg-white-70:focus,.swagger-ui .hover-bg-white-70:hover{background-color:hsla(0,0%,100%,.7)}.swagger-ui .hover-bg-white-60:focus,.swagger-ui .hover-bg-white-60:hover{background-color:hsla(0,0%,100%,.6)}.swagger-ui .hover-bg-white-50:focus,.swagger-ui .hover-bg-white-50:hover{background-color:hsla(0,0%,100%,.5)}.swagger-ui .hover-bg-white-40:focus,.swagger-ui .hover-bg-white-40:hover{background-color:hsla(0,0%,100%,.4)}.swagger-ui .hover-bg-white-30:focus,.swagger-ui .hover-bg-white-30:hover{background-color:hsla(0,0%,100%,.3)}.swagger-ui .hover-bg-white-20:focus,.swagger-ui .hover-bg-white-20:hover{background-color:hsla(0,0%,100%,.2)}.swagger-ui .hover-bg-white-10:focus,.swagger-ui .hover-bg-white-10:hover{background-color:hsla(0,0%,100%,.1)}.swagger-ui .hover-dark-red:focus,.swagger-ui .hover-dark-red:hover{color:#e7040f}.swagger-ui .hover-red:focus,.swagger-ui .hover-red:hover{color:#ff4136}.swagger-ui .hover-light-red:focus,.swagger-ui .hover-light-red:hover{color:#ff725c}.swagger-ui .hover-orange:focus,.swagger-ui .hover-orange:hover{color:#ff6300}.swagger-ui .hover-gold:focus,.swagger-ui .hover-gold:hover{color:#ffb700}.swagger-ui .hover-yellow:focus,.swagger-ui .hover-yellow:hover{color:gold}.swagger-ui .hover-light-yellow:focus,.swagger-ui .hover-light-yellow:hover{color:#fbf1a9}.swagger-ui .hover-purple:focus,.swagger-ui .hover-purple:hover{color:#5e2ca5}.swagger-ui .hover-light-purple:focus,.swagger-ui .hover-light-purple:hover{color:#a463f2}.swagger-ui .hover-dark-pink:focus,.swagger-ui .hover-dark-pink:hover{color:#d5008f}.swagger-ui .hover-hot-pink:focus,.swagger-ui .hover-hot-pink:hover{color:#ff41b4}.swagger-ui .hover-pink:focus,.swagger-ui .hover-pink:hover{color:#ff80cc}.swagger-ui .hover-light-pink:focus,.swagger-ui .hover-light-pink:hover{color:#ffa3d7}.swagger-ui .hover-dark-green:focus,.swagger-ui .hover-dark-green:hover{color:#137752}.swagger-ui .hover-green:focus,.swagger-ui .hover-green:hover{color:#19a974}.swagger-ui .hover-light-green:focus,.swagger-ui .hover-light-green:hover{color:#9eebcf}.swagger-ui .hover-navy:focus,.swagger-ui .hover-navy:hover{color:#001b44}.swagger-ui .hover-dark-blue:focus,.swagger-ui .hover-dark-blue:hover{color:#00449e}.swagger-ui .hover-blue:focus,.swagger-ui .hover-blue:hover{color:#357edd}.swagger-ui .hover-light-blue:focus,.swagger-ui .hover-light-blue:hover{color:#96ccff}.swagger-ui .hover-lightest-blue:focus,.swagger-ui .hover-lightest-blue:hover{color:#cdecff}.swagger-ui .hover-washed-blue:focus,.swagger-ui .hover-washed-blue:hover{color:#f6fffe}.swagger-ui .hover-washed-green:focus,.swagger-ui .hover-washed-green:hover{color:#e8fdf5}.swagger-ui .hover-washed-yellow:focus,.swagger-ui .hover-washed-yellow:hover{color:#fffceb}.swagger-ui .hover-washed-red:focus,.swagger-ui .hover-washed-red:hover{color:#ffdfdf}.swagger-ui .hover-bg-dark-red:focus,.swagger-ui .hover-bg-dark-red:hover{background-color:#e7040f}.swagger-ui .hover-bg-red:focus,.swagger-ui .hover-bg-red:hover{background-color:#ff4136}.swagger-ui .hover-bg-light-red:focus,.swagger-ui .hover-bg-light-red:hover{background-color:#ff725c}.swagger-ui .hover-bg-orange:focus,.swagger-ui .hover-bg-orange:hover{background-color:#ff6300}.swagger-ui .hover-bg-gold:focus,.swagger-ui .hover-bg-gold:hover{background-color:#ffb700}.swagger-ui .hover-bg-yellow:focus,.swagger-ui .hover-bg-yellow:hover{background-color:gold}.swagger-ui .hover-bg-light-yellow:focus,.swagger-ui .hover-bg-light-yellow:hover{background-color:#fbf1a9}.swagger-ui .hover-bg-purple:focus,.swagger-ui .hover-bg-purple:hover{background-color:#5e2ca5}.swagger-ui .hover-bg-light-purple:focus,.swagger-ui .hover-bg-light-purple:hover{background-color:#a463f2}.swagger-ui .hover-bg-dark-pink:focus,.swagger-ui .hover-bg-dark-pink:hover{background-color:#d5008f}.swagger-ui .hover-bg-hot-pink:focus,.swagger-ui .hover-bg-hot-pink:hover{background-color:#ff41b4}.swagger-ui .hover-bg-pink:focus,.swagger-ui .hover-bg-pink:hover{background-color:#ff80cc}.swagger-ui .hover-bg-light-pink:focus,.swagger-ui .hover-bg-light-pink:hover{background-color:#ffa3d7}.swagger-ui .hover-bg-dark-green:focus,.swagger-ui .hover-bg-dark-green:hover{background-color:#137752}.swagger-ui .hover-bg-green:focus,.swagger-ui .hover-bg-green:hover{background-color:#19a974}.swagger-ui .hover-bg-light-green:focus,.swagger-ui .hover-bg-light-green:hover{background-color:#9eebcf}.swagger-ui .hover-bg-navy:focus,.swagger-ui .hover-bg-navy:hover{background-color:#001b44}.swagger-ui .hover-bg-dark-blue:focus,.swagger-ui .hover-bg-dark-blue:hover{background-color:#00449e}.swagger-ui .hover-bg-blue:focus,.swagger-ui .hover-bg-blue:hover{background-color:#357edd}.swagger-ui .hover-bg-light-blue:focus,.swagger-ui .hover-bg-light-blue:hover{background-color:#96ccff}.swagger-ui .hover-bg-lightest-blue:focus,.swagger-ui .hover-bg-lightest-blue:hover{background-color:#cdecff}.swagger-ui .hover-bg-washed-blue:focus,.swagger-ui .hover-bg-washed-blue:hover{background-color:#f6fffe}.swagger-ui .hover-bg-washed-green:focus,.swagger-ui .hover-bg-washed-green:hover{background-color:#e8fdf5}.swagger-ui .hover-bg-washed-yellow:focus,.swagger-ui .hover-bg-washed-yellow:hover{background-color:#fffceb}.swagger-ui .hover-bg-washed-red:focus,.swagger-ui .hover-bg-washed-red:hover{background-color:#ffdfdf}.swagger-ui .hover-bg-inherit:focus,.swagger-ui .hover-bg-inherit:hover{background-color:inherit}.swagger-ui .pa0{padding:0}.swagger-ui .pa1{padding:.25rem}.swagger-ui .pa2{padding:.5rem}.swagger-ui .pa3{padding:1rem}.swagger-ui .pa4{padding:2rem}.swagger-ui .pa5{padding:4rem}.swagger-ui .pa6{padding:8rem}.swagger-ui .pa7{padding:16rem}.swagger-ui .pl0{padding-left:0}.swagger-ui .pl1{padding-left:.25rem}.swagger-ui .pl2{padding-left:.5rem}.swagger-ui .pl3{padding-left:1rem}.swagger-ui .pl4{padding-left:2rem}.swagger-ui .pl5{padding-left:4rem}.swagger-ui .pl6{padding-left:8rem}.swagger-ui .pl7{padding-left:16rem}.swagger-ui .pr0{padding-right:0}.swagger-ui .pr1{padding-right:.25rem}.swagger-ui .pr2{padding-right:.5rem}.swagger-ui .pr3{padding-right:1rem}.swagger-ui .pr4{padding-right:2rem}.swagger-ui .pr5{padding-right:4rem}.swagger-ui .pr6{padding-right:8rem}.swagger-ui .pr7{padding-right:16rem}.swagger-ui .pb0{padding-bottom:0}.swagger-ui .pb1{padding-bottom:.25rem}.swagger-ui .pb2{padding-bottom:.5rem}.swagger-ui .pb3{padding-bottom:1rem}.swagger-ui .pb4{padding-bottom:2rem}.swagger-ui .pb5{padding-bottom:4rem}.swagger-ui .pb6{padding-bottom:8rem}.swagger-ui .pb7{padding-bottom:16rem}.swagger-ui .pt0{padding-top:0}.swagger-ui .pt1{padding-top:.25rem}.swagger-ui .pt2{padding-top:.5rem}.swagger-ui .pt3{padding-top:1rem}.swagger-ui .pt4{padding-top:2rem}.swagger-ui .pt5{padding-top:4rem}.swagger-ui .pt6{padding-top:8rem}.swagger-ui .pt7{padding-top:16rem}.swagger-ui .pv0{padding-bottom:0;padding-top:0}.swagger-ui .pv1{padding-bottom:.25rem;padding-top:.25rem}.swagger-ui .pv2{padding-bottom:.5rem;padding-top:.5rem}.swagger-ui .pv3{padding-bottom:1rem;padding-top:1rem}.swagger-ui .pv4{padding-bottom:2rem;padding-top:2rem}.swagger-ui .pv5{padding-bottom:4rem;padding-top:4rem}.swagger-ui .pv6{padding-bottom:8rem;padding-top:8rem}.swagger-ui .pv7{padding-bottom:16rem;padding-top:16rem}.swagger-ui .ph0{padding-left:0;padding-right:0}.swagger-ui .ph1{padding-left:.25rem;padding-right:.25rem}.swagger-ui .ph2{padding-left:.5rem;padding-right:.5rem}.swagger-ui .ph3{padding-left:1rem;padding-right:1rem}.swagger-ui .ph4{padding-left:2rem;padding-right:2rem}.swagger-ui .ph5{padding-left:4rem;padding-right:4rem}.swagger-ui .ph6{padding-left:8rem;padding-right:8rem}.swagger-ui .ph7{padding-left:16rem;padding-right:16rem}.swagger-ui .ma0{margin:0}.swagger-ui .ma1{margin:.25rem}.swagger-ui .ma2{margin:.5rem}.swagger-ui .ma3{margin:1rem}.swagger-ui .ma4{margin:2rem}.swagger-ui .ma5{margin:4rem}.swagger-ui .ma6{margin:8rem}.swagger-ui .ma7{margin:16rem}.swagger-ui .ml0{margin-left:0}.swagger-ui .ml1{margin-left:.25rem}.swagger-ui .ml2{margin-left:.5rem}.swagger-ui .ml3{margin-left:1rem}.swagger-ui .ml4{margin-left:2rem}.swagger-ui .ml5{margin-left:4rem}.swagger-ui .ml6{margin-left:8rem}.swagger-ui .ml7{margin-left:16rem}.swagger-ui .mr0{margin-right:0}.swagger-ui .mr1{margin-right:.25rem}.swagger-ui .mr2{margin-right:.5rem}.swagger-ui .mr3{margin-right:1rem}.swagger-ui .mr4{margin-right:2rem}.swagger-ui .mr5{margin-right:4rem}.swagger-ui .mr6{margin-right:8rem}.swagger-ui .mr7{margin-right:16rem}.swagger-ui .mb0{margin-bottom:0}.swagger-ui .mb1{margin-bottom:.25rem}.swagger-ui .mb2{margin-bottom:.5rem}.swagger-ui .mb3{margin-bottom:1rem}.swagger-ui .mb4{margin-bottom:2rem}.swagger-ui .mb5{margin-bottom:4rem}.swagger-ui .mb6{margin-bottom:8rem}.swagger-ui .mb7{margin-bottom:16rem}.swagger-ui .mt0{margin-top:0}.swagger-ui .mt1{margin-top:.25rem}.swagger-ui .mt2{margin-top:.5rem}.swagger-ui .mt3{margin-top:1rem}.swagger-ui .mt4{margin-top:2rem}.swagger-ui .mt5{margin-top:4rem}.swagger-ui .mt6{margin-top:8rem}.swagger-ui .mt7{margin-top:16rem}.swagger-ui .mv0{margin-bottom:0;margin-top:0}.swagger-ui .mv1{margin-bottom:.25rem;margin-top:.25rem}.swagger-ui .mv2{margin-bottom:.5rem;margin-top:.5rem}.swagger-ui .mv3{margin-bottom:1rem;margin-top:1rem}.swagger-ui .mv4{margin-bottom:2rem;margin-top:2rem}.swagger-ui .mv5{margin-bottom:4rem;margin-top:4rem}.swagger-ui .mv6{margin-bottom:8rem;margin-top:8rem}.swagger-ui .mv7{margin-bottom:16rem;margin-top:16rem}.swagger-ui .mh0{margin-left:0;margin-right:0}.swagger-ui .mh1{margin-left:.25rem;margin-right:.25rem}.swagger-ui .mh2{margin-left:.5rem;margin-right:.5rem}.swagger-ui .mh3{margin-left:1rem;margin-right:1rem}.swagger-ui .mh4{margin-left:2rem;margin-right:2rem}.swagger-ui .mh5{margin-left:4rem;margin-right:4rem}.swagger-ui .mh6{margin-left:8rem;margin-right:8rem}.swagger-ui .mh7{margin-left:16rem;margin-right:16rem}@media screen and (min-width:30em){.swagger-ui .pa0-ns{padding:0}.swagger-ui .pa1-ns{padding:.25rem}.swagger-ui .pa2-ns{padding:.5rem}.swagger-ui .pa3-ns{padding:1rem}.swagger-ui .pa4-ns{padding:2rem}.swagger-ui .pa5-ns{padding:4rem}.swagger-ui .pa6-ns{padding:8rem}.swagger-ui .pa7-ns{padding:16rem}.swagger-ui .pl0-ns{padding-left:0}.swagger-ui .pl1-ns{padding-left:.25rem}.swagger-ui .pl2-ns{padding-left:.5rem}.swagger-ui .pl3-ns{padding-left:1rem}.swagger-ui .pl4-ns{padding-left:2rem}.swagger-ui .pl5-ns{padding-left:4rem}.swagger-ui .pl6-ns{padding-left:8rem}.swagger-ui .pl7-ns{padding-left:16rem}.swagger-ui .pr0-ns{padding-right:0}.swagger-ui .pr1-ns{padding-right:.25rem}.swagger-ui .pr2-ns{padding-right:.5rem}.swagger-ui .pr3-ns{padding-right:1rem}.swagger-ui .pr4-ns{padding-right:2rem}.swagger-ui .pr5-ns{padding-right:4rem}.swagger-ui .pr6-ns{padding-right:8rem}.swagger-ui .pr7-ns{padding-right:16rem}.swagger-ui .pb0-ns{padding-bottom:0}.swagger-ui .pb1-ns{padding-bottom:.25rem}.swagger-ui .pb2-ns{padding-bottom:.5rem}.swagger-ui .pb3-ns{padding-bottom:1rem}.swagger-ui .pb4-ns{padding-bottom:2rem}.swagger-ui .pb5-ns{padding-bottom:4rem}.swagger-ui .pb6-ns{padding-bottom:8rem}.swagger-ui .pb7-ns{padding-bottom:16rem}.swagger-ui .pt0-ns{padding-top:0}.swagger-ui .pt1-ns{padding-top:.25rem}.swagger-ui .pt2-ns{padding-top:.5rem}.swagger-ui .pt3-ns{padding-top:1rem}.swagger-ui .pt4-ns{padding-top:2rem}.swagger-ui .pt5-ns{padding-top:4rem}.swagger-ui .pt6-ns{padding-top:8rem}.swagger-ui .pt7-ns{padding-top:16rem}.swagger-ui .pv0-ns{padding-bottom:0;padding-top:0}.swagger-ui .pv1-ns{padding-bottom:.25rem;padding-top:.25rem}.swagger-ui .pv2-ns{padding-bottom:.5rem;padding-top:.5rem}.swagger-ui .pv3-ns{padding-bottom:1rem;padding-top:1rem}.swagger-ui .pv4-ns{padding-bottom:2rem;padding-top:2rem}.swagger-ui .pv5-ns{padding-bottom:4rem;padding-top:4rem}.swagger-ui .pv6-ns{padding-bottom:8rem;padding-top:8rem}.swagger-ui .pv7-ns{padding-bottom:16rem;padding-top:16rem}.swagger-ui .ph0-ns{padding-left:0;padding-right:0}.swagger-ui .ph1-ns{padding-left:.25rem;padding-right:.25rem}.swagger-ui .ph2-ns{padding-left:.5rem;padding-right:.5rem}.swagger-ui .ph3-ns{padding-left:1rem;padding-right:1rem}.swagger-ui .ph4-ns{padding-left:2rem;padding-right:2rem}.swagger-ui .ph5-ns{padding-left:4rem;padding-right:4rem}.swagger-ui .ph6-ns{padding-left:8rem;padding-right:8rem}.swagger-ui .ph7-ns{padding-left:16rem;padding-right:16rem}.swagger-ui .ma0-ns{margin:0}.swagger-ui .ma1-ns{margin:.25rem}.swagger-ui .ma2-ns{margin:.5rem}.swagger-ui .ma3-ns{margin:1rem}.swagger-ui .ma4-ns{margin:2rem}.swagger-ui .ma5-ns{margin:4rem}.swagger-ui .ma6-ns{margin:8rem}.swagger-ui .ma7-ns{margin:16rem}.swagger-ui .ml0-ns{margin-left:0}.swagger-ui .ml1-ns{margin-left:.25rem}.swagger-ui .ml2-ns{margin-left:.5rem}.swagger-ui .ml3-ns{margin-left:1rem}.swagger-ui .ml4-ns{margin-left:2rem}.swagger-ui .ml5-ns{margin-left:4rem}.swagger-ui .ml6-ns{margin-left:8rem}.swagger-ui .ml7-ns{margin-left:16rem}.swagger-ui .mr0-ns{margin-right:0}.swagger-ui .mr1-ns{margin-right:.25rem}.swagger-ui .mr2-ns{margin-right:.5rem}.swagger-ui .mr3-ns{margin-right:1rem}.swagger-ui .mr4-ns{margin-right:2rem}.swagger-ui .mr5-ns{margin-right:4rem}.swagger-ui .mr6-ns{margin-right:8rem}.swagger-ui .mr7-ns{margin-right:16rem}.swagger-ui .mb0-ns{margin-bottom:0}.swagger-ui .mb1-ns{margin-bottom:.25rem}.swagger-ui .mb2-ns{margin-bottom:.5rem}.swagger-ui .mb3-ns{margin-bottom:1rem}.swagger-ui .mb4-ns{margin-bottom:2rem}.swagger-ui .mb5-ns{margin-bottom:4rem}.swagger-ui .mb6-ns{margin-bottom:8rem}.swagger-ui .mb7-ns{margin-bottom:16rem}.swagger-ui .mt0-ns{margin-top:0}.swagger-ui .mt1-ns{margin-top:.25rem}.swagger-ui .mt2-ns{margin-top:.5rem}.swagger-ui .mt3-ns{margin-top:1rem}.swagger-ui .mt4-ns{margin-top:2rem}.swagger-ui .mt5-ns{margin-top:4rem}.swagger-ui .mt6-ns{margin-top:8rem}.swagger-ui .mt7-ns{margin-top:16rem}.swagger-ui .mv0-ns{margin-bottom:0;margin-top:0}.swagger-ui .mv1-ns{margin-bottom:.25rem;margin-top:.25rem}.swagger-ui .mv2-ns{margin-bottom:.5rem;margin-top:.5rem}.swagger-ui .mv3-ns{margin-bottom:1rem;margin-top:1rem}.swagger-ui .mv4-ns{margin-bottom:2rem;margin-top:2rem}.swagger-ui .mv5-ns{margin-bottom:4rem;margin-top:4rem}.swagger-ui .mv6-ns{margin-bottom:8rem;margin-top:8rem}.swagger-ui .mv7-ns{margin-bottom:16rem;margin-top:16rem}.swagger-ui .mh0-ns{margin-left:0;margin-right:0}.swagger-ui .mh1-ns{margin-left:.25rem;margin-right:.25rem}.swagger-ui .mh2-ns{margin-left:.5rem;margin-right:.5rem}.swagger-ui .mh3-ns{margin-left:1rem;margin-right:1rem}.swagger-ui .mh4-ns{margin-left:2rem;margin-right:2rem}.swagger-ui .mh5-ns{margin-left:4rem;margin-right:4rem}.swagger-ui .mh6-ns{margin-left:8rem;margin-right:8rem}.swagger-ui .mh7-ns{margin-left:16rem;margin-right:16rem}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .pa0-m{padding:0}.swagger-ui .pa1-m{padding:.25rem}.swagger-ui .pa2-m{padding:.5rem}.swagger-ui .pa3-m{padding:1rem}.swagger-ui .pa4-m{padding:2rem}.swagger-ui .pa5-m{padding:4rem}.swagger-ui .pa6-m{padding:8rem}.swagger-ui .pa7-m{padding:16rem}.swagger-ui .pl0-m{padding-left:0}.swagger-ui .pl1-m{padding-left:.25rem}.swagger-ui .pl2-m{padding-left:.5rem}.swagger-ui .pl3-m{padding-left:1rem}.swagger-ui .pl4-m{padding-left:2rem}.swagger-ui .pl5-m{padding-left:4rem}.swagger-ui .pl6-m{padding-left:8rem}.swagger-ui .pl7-m{padding-left:16rem}.swagger-ui .pr0-m{padding-right:0}.swagger-ui .pr1-m{padding-right:.25rem}.swagger-ui .pr2-m{padding-right:.5rem}.swagger-ui .pr3-m{padding-right:1rem}.swagger-ui .pr4-m{padding-right:2rem}.swagger-ui .pr5-m{padding-right:4rem}.swagger-ui .pr6-m{padding-right:8rem}.swagger-ui .pr7-m{padding-right:16rem}.swagger-ui .pb0-m{padding-bottom:0}.swagger-ui .pb1-m{padding-bottom:.25rem}.swagger-ui .pb2-m{padding-bottom:.5rem}.swagger-ui .pb3-m{padding-bottom:1rem}.swagger-ui .pb4-m{padding-bottom:2rem}.swagger-ui .pb5-m{padding-bottom:4rem}.swagger-ui .pb6-m{padding-bottom:8rem}.swagger-ui .pb7-m{padding-bottom:16rem}.swagger-ui .pt0-m{padding-top:0}.swagger-ui .pt1-m{padding-top:.25rem}.swagger-ui .pt2-m{padding-top:.5rem}.swagger-ui .pt3-m{padding-top:1rem}.swagger-ui .pt4-m{padding-top:2rem}.swagger-ui .pt5-m{padding-top:4rem}.swagger-ui .pt6-m{padding-top:8rem}.swagger-ui .pt7-m{padding-top:16rem}.swagger-ui .pv0-m{padding-bottom:0;padding-top:0}.swagger-ui .pv1-m{padding-bottom:.25rem;padding-top:.25rem}.swagger-ui .pv2-m{padding-bottom:.5rem;padding-top:.5rem}.swagger-ui .pv3-m{padding-bottom:1rem;padding-top:1rem}.swagger-ui .pv4-m{padding-bottom:2rem;padding-top:2rem}.swagger-ui .pv5-m{padding-bottom:4rem;padding-top:4rem}.swagger-ui .pv6-m{padding-bottom:8rem;padding-top:8rem}.swagger-ui .pv7-m{padding-bottom:16rem;padding-top:16rem}.swagger-ui .ph0-m{padding-left:0;padding-right:0}.swagger-ui .ph1-m{padding-left:.25rem;padding-right:.25rem}.swagger-ui .ph2-m{padding-left:.5rem;padding-right:.5rem}.swagger-ui .ph3-m{padding-left:1rem;padding-right:1rem}.swagger-ui .ph4-m{padding-left:2rem;padding-right:2rem}.swagger-ui .ph5-m{padding-left:4rem;padding-right:4rem}.swagger-ui .ph6-m{padding-left:8rem;padding-right:8rem}.swagger-ui .ph7-m{padding-left:16rem;padding-right:16rem}.swagger-ui .ma0-m{margin:0}.swagger-ui .ma1-m{margin:.25rem}.swagger-ui .ma2-m{margin:.5rem}.swagger-ui .ma3-m{margin:1rem}.swagger-ui .ma4-m{margin:2rem}.swagger-ui .ma5-m{margin:4rem}.swagger-ui .ma6-m{margin:8rem}.swagger-ui .ma7-m{margin:16rem}.swagger-ui .ml0-m{margin-left:0}.swagger-ui .ml1-m{margin-left:.25rem}.swagger-ui .ml2-m{margin-left:.5rem}.swagger-ui .ml3-m{margin-left:1rem}.swagger-ui .ml4-m{margin-left:2rem}.swagger-ui .ml5-m{margin-left:4rem}.swagger-ui .ml6-m{margin-left:8rem}.swagger-ui .ml7-m{margin-left:16rem}.swagger-ui .mr0-m{margin-right:0}.swagger-ui .mr1-m{margin-right:.25rem}.swagger-ui .mr2-m{margin-right:.5rem}.swagger-ui .mr3-m{margin-right:1rem}.swagger-ui .mr4-m{margin-right:2rem}.swagger-ui .mr5-m{margin-right:4rem}.swagger-ui .mr6-m{margin-right:8rem}.swagger-ui .mr7-m{margin-right:16rem}.swagger-ui .mb0-m{margin-bottom:0}.swagger-ui .mb1-m{margin-bottom:.25rem}.swagger-ui .mb2-m{margin-bottom:.5rem}.swagger-ui .mb3-m{margin-bottom:1rem}.swagger-ui .mb4-m{margin-bottom:2rem}.swagger-ui .mb5-m{margin-bottom:4rem}.swagger-ui .mb6-m{margin-bottom:8rem}.swagger-ui .mb7-m{margin-bottom:16rem}.swagger-ui .mt0-m{margin-top:0}.swagger-ui .mt1-m{margin-top:.25rem}.swagger-ui .mt2-m{margin-top:.5rem}.swagger-ui .mt3-m{margin-top:1rem}.swagger-ui .mt4-m{margin-top:2rem}.swagger-ui .mt5-m{margin-top:4rem}.swagger-ui .mt6-m{margin-top:8rem}.swagger-ui .mt7-m{margin-top:16rem}.swagger-ui .mv0-m{margin-bottom:0;margin-top:0}.swagger-ui .mv1-m{margin-bottom:.25rem;margin-top:.25rem}.swagger-ui .mv2-m{margin-bottom:.5rem;margin-top:.5rem}.swagger-ui .mv3-m{margin-bottom:1rem;margin-top:1rem}.swagger-ui .mv4-m{margin-bottom:2rem;margin-top:2rem}.swagger-ui .mv5-m{margin-bottom:4rem;margin-top:4rem}.swagger-ui .mv6-m{margin-bottom:8rem;margin-top:8rem}.swagger-ui .mv7-m{margin-bottom:16rem;margin-top:16rem}.swagger-ui .mh0-m{margin-left:0;margin-right:0}.swagger-ui .mh1-m{margin-left:.25rem;margin-right:.25rem}.swagger-ui .mh2-m{margin-left:.5rem;margin-right:.5rem}.swagger-ui .mh3-m{margin-left:1rem;margin-right:1rem}.swagger-ui .mh4-m{margin-left:2rem;margin-right:2rem}.swagger-ui .mh5-m{margin-left:4rem;margin-right:4rem}.swagger-ui .mh6-m{margin-left:8rem;margin-right:8rem}.swagger-ui .mh7-m{margin-left:16rem;margin-right:16rem}}@media screen and (min-width:60em){.swagger-ui .pa0-l{padding:0}.swagger-ui .pa1-l{padding:.25rem}.swagger-ui .pa2-l{padding:.5rem}.swagger-ui .pa3-l{padding:1rem}.swagger-ui .pa4-l{padding:2rem}.swagger-ui .pa5-l{padding:4rem}.swagger-ui .pa6-l{padding:8rem}.swagger-ui .pa7-l{padding:16rem}.swagger-ui .pl0-l{padding-left:0}.swagger-ui .pl1-l{padding-left:.25rem}.swagger-ui .pl2-l{padding-left:.5rem}.swagger-ui .pl3-l{padding-left:1rem}.swagger-ui .pl4-l{padding-left:2rem}.swagger-ui .pl5-l{padding-left:4rem}.swagger-ui .pl6-l{padding-left:8rem}.swagger-ui .pl7-l{padding-left:16rem}.swagger-ui .pr0-l{padding-right:0}.swagger-ui .pr1-l{padding-right:.25rem}.swagger-ui .pr2-l{padding-right:.5rem}.swagger-ui .pr3-l{padding-right:1rem}.swagger-ui .pr4-l{padding-right:2rem}.swagger-ui .pr5-l{padding-right:4rem}.swagger-ui .pr6-l{padding-right:8rem}.swagger-ui .pr7-l{padding-right:16rem}.swagger-ui .pb0-l{padding-bottom:0}.swagger-ui .pb1-l{padding-bottom:.25rem}.swagger-ui .pb2-l{padding-bottom:.5rem}.swagger-ui .pb3-l{padding-bottom:1rem}.swagger-ui .pb4-l{padding-bottom:2rem}.swagger-ui .pb5-l{padding-bottom:4rem}.swagger-ui .pb6-l{padding-bottom:8rem}.swagger-ui .pb7-l{padding-bottom:16rem}.swagger-ui .pt0-l{padding-top:0}.swagger-ui .pt1-l{padding-top:.25rem}.swagger-ui .pt2-l{padding-top:.5rem}.swagger-ui .pt3-l{padding-top:1rem}.swagger-ui .pt4-l{padding-top:2rem}.swagger-ui .pt5-l{padding-top:4rem}.swagger-ui .pt6-l{padding-top:8rem}.swagger-ui .pt7-l{padding-top:16rem}.swagger-ui .pv0-l{padding-bottom:0;padding-top:0}.swagger-ui .pv1-l{padding-bottom:.25rem;padding-top:.25rem}.swagger-ui .pv2-l{padding-bottom:.5rem;padding-top:.5rem}.swagger-ui .pv3-l{padding-bottom:1rem;padding-top:1rem}.swagger-ui .pv4-l{padding-bottom:2rem;padding-top:2rem}.swagger-ui .pv5-l{padding-bottom:4rem;padding-top:4rem}.swagger-ui .pv6-l{padding-bottom:8rem;padding-top:8rem}.swagger-ui .pv7-l{padding-bottom:16rem;padding-top:16rem}.swagger-ui .ph0-l{padding-left:0;padding-right:0}.swagger-ui .ph1-l{padding-left:.25rem;padding-right:.25rem}.swagger-ui .ph2-l{padding-left:.5rem;padding-right:.5rem}.swagger-ui .ph3-l{padding-left:1rem;padding-right:1rem}.swagger-ui .ph4-l{padding-left:2rem;padding-right:2rem}.swagger-ui .ph5-l{padding-left:4rem;padding-right:4rem}.swagger-ui .ph6-l{padding-left:8rem;padding-right:8rem}.swagger-ui .ph7-l{padding-left:16rem;padding-right:16rem}.swagger-ui .ma0-l{margin:0}.swagger-ui .ma1-l{margin:.25rem}.swagger-ui .ma2-l{margin:.5rem}.swagger-ui .ma3-l{margin:1rem}.swagger-ui .ma4-l{margin:2rem}.swagger-ui .ma5-l{margin:4rem}.swagger-ui .ma6-l{margin:8rem}.swagger-ui .ma7-l{margin:16rem}.swagger-ui .ml0-l{margin-left:0}.swagger-ui .ml1-l{margin-left:.25rem}.swagger-ui .ml2-l{margin-left:.5rem}.swagger-ui .ml3-l{margin-left:1rem}.swagger-ui .ml4-l{margin-left:2rem}.swagger-ui .ml5-l{margin-left:4rem}.swagger-ui .ml6-l{margin-left:8rem}.swagger-ui .ml7-l{margin-left:16rem}.swagger-ui .mr0-l{margin-right:0}.swagger-ui .mr1-l{margin-right:.25rem}.swagger-ui .mr2-l{margin-right:.5rem}.swagger-ui .mr3-l{margin-right:1rem}.swagger-ui .mr4-l{margin-right:2rem}.swagger-ui .mr5-l{margin-right:4rem}.swagger-ui .mr6-l{margin-right:8rem}.swagger-ui .mr7-l{margin-right:16rem}.swagger-ui .mb0-l{margin-bottom:0}.swagger-ui .mb1-l{margin-bottom:.25rem}.swagger-ui .mb2-l{margin-bottom:.5rem}.swagger-ui .mb3-l{margin-bottom:1rem}.swagger-ui .mb4-l{margin-bottom:2rem}.swagger-ui .mb5-l{margin-bottom:4rem}.swagger-ui .mb6-l{margin-bottom:8rem}.swagger-ui .mb7-l{margin-bottom:16rem}.swagger-ui .mt0-l{margin-top:0}.swagger-ui .mt1-l{margin-top:.25rem}.swagger-ui .mt2-l{margin-top:.5rem}.swagger-ui .mt3-l{margin-top:1rem}.swagger-ui .mt4-l{margin-top:2rem}.swagger-ui .mt5-l{margin-top:4rem}.swagger-ui .mt6-l{margin-top:8rem}.swagger-ui .mt7-l{margin-top:16rem}.swagger-ui .mv0-l{margin-bottom:0;margin-top:0}.swagger-ui .mv1-l{margin-bottom:.25rem;margin-top:.25rem}.swagger-ui .mv2-l{margin-bottom:.5rem;margin-top:.5rem}.swagger-ui .mv3-l{margin-bottom:1rem;margin-top:1rem}.swagger-ui .mv4-l{margin-bottom:2rem;margin-top:2rem}.swagger-ui .mv5-l{margin-bottom:4rem;margin-top:4rem}.swagger-ui .mv6-l{margin-bottom:8rem;margin-top:8rem}.swagger-ui .mv7-l{margin-bottom:16rem;margin-top:16rem}.swagger-ui .mh0-l{margin-left:0;margin-right:0}.swagger-ui .mh1-l{margin-left:.25rem;margin-right:.25rem}.swagger-ui .mh2-l{margin-left:.5rem;margin-right:.5rem}.swagger-ui .mh3-l{margin-left:1rem;margin-right:1rem}.swagger-ui .mh4-l{margin-left:2rem;margin-right:2rem}.swagger-ui .mh5-l{margin-left:4rem;margin-right:4rem}.swagger-ui .mh6-l{margin-left:8rem;margin-right:8rem}.swagger-ui .mh7-l{margin-left:16rem;margin-right:16rem}}.swagger-ui .na1{margin:-.25rem}.swagger-ui .na2{margin:-.5rem}.swagger-ui .na3{margin:-1rem}.swagger-ui .na4{margin:-2rem}.swagger-ui .na5{margin:-4rem}.swagger-ui .na6{margin:-8rem}.swagger-ui .na7{margin:-16rem}.swagger-ui .nl1{margin-left:-.25rem}.swagger-ui .nl2{margin-left:-.5rem}.swagger-ui .nl3{margin-left:-1rem}.swagger-ui .nl4{margin-left:-2rem}.swagger-ui .nl5{margin-left:-4rem}.swagger-ui .nl6{margin-left:-8rem}.swagger-ui .nl7{margin-left:-16rem}.swagger-ui .nr1{margin-right:-.25rem}.swagger-ui .nr2{margin-right:-.5rem}.swagger-ui .nr3{margin-right:-1rem}.swagger-ui .nr4{margin-right:-2rem}.swagger-ui .nr5{margin-right:-4rem}.swagger-ui .nr6{margin-right:-8rem}.swagger-ui .nr7{margin-right:-16rem}.swagger-ui .nb1{margin-bottom:-.25rem}.swagger-ui .nb2{margin-bottom:-.5rem}.swagger-ui .nb3{margin-bottom:-1rem}.swagger-ui .nb4{margin-bottom:-2rem}.swagger-ui .nb5{margin-bottom:-4rem}.swagger-ui .nb6{margin-bottom:-8rem}.swagger-ui .nb7{margin-bottom:-16rem}.swagger-ui .nt1{margin-top:-.25rem}.swagger-ui .nt2{margin-top:-.5rem}.swagger-ui .nt3{margin-top:-1rem}.swagger-ui .nt4{margin-top:-2rem}.swagger-ui .nt5{margin-top:-4rem}.swagger-ui .nt6{margin-top:-8rem}.swagger-ui .nt7{margin-top:-16rem}@media screen and (min-width:30em){.swagger-ui .na1-ns{margin:-.25rem}.swagger-ui .na2-ns{margin:-.5rem}.swagger-ui .na3-ns{margin:-1rem}.swagger-ui .na4-ns{margin:-2rem}.swagger-ui .na5-ns{margin:-4rem}.swagger-ui .na6-ns{margin:-8rem}.swagger-ui .na7-ns{margin:-16rem}.swagger-ui .nl1-ns{margin-left:-.25rem}.swagger-ui .nl2-ns{margin-left:-.5rem}.swagger-ui .nl3-ns{margin-left:-1rem}.swagger-ui .nl4-ns{margin-left:-2rem}.swagger-ui .nl5-ns{margin-left:-4rem}.swagger-ui .nl6-ns{margin-left:-8rem}.swagger-ui .nl7-ns{margin-left:-16rem}.swagger-ui .nr1-ns{margin-right:-.25rem}.swagger-ui .nr2-ns{margin-right:-.5rem}.swagger-ui .nr3-ns{margin-right:-1rem}.swagger-ui .nr4-ns{margin-right:-2rem}.swagger-ui .nr5-ns{margin-right:-4rem}.swagger-ui .nr6-ns{margin-right:-8rem}.swagger-ui .nr7-ns{margin-right:-16rem}.swagger-ui .nb1-ns{margin-bottom:-.25rem}.swagger-ui .nb2-ns{margin-bottom:-.5rem}.swagger-ui .nb3-ns{margin-bottom:-1rem}.swagger-ui .nb4-ns{margin-bottom:-2rem}.swagger-ui .nb5-ns{margin-bottom:-4rem}.swagger-ui .nb6-ns{margin-bottom:-8rem}.swagger-ui .nb7-ns{margin-bottom:-16rem}.swagger-ui .nt1-ns{margin-top:-.25rem}.swagger-ui .nt2-ns{margin-top:-.5rem}.swagger-ui .nt3-ns{margin-top:-1rem}.swagger-ui .nt4-ns{margin-top:-2rem}.swagger-ui .nt5-ns{margin-top:-4rem}.swagger-ui .nt6-ns{margin-top:-8rem}.swagger-ui .nt7-ns{margin-top:-16rem}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .na1-m{margin:-.25rem}.swagger-ui .na2-m{margin:-.5rem}.swagger-ui .na3-m{margin:-1rem}.swagger-ui .na4-m{margin:-2rem}.swagger-ui .na5-m{margin:-4rem}.swagger-ui .na6-m{margin:-8rem}.swagger-ui .na7-m{margin:-16rem}.swagger-ui .nl1-m{margin-left:-.25rem}.swagger-ui .nl2-m{margin-left:-.5rem}.swagger-ui .nl3-m{margin-left:-1rem}.swagger-ui .nl4-m{margin-left:-2rem}.swagger-ui .nl5-m{margin-left:-4rem}.swagger-ui .nl6-m{margin-left:-8rem}.swagger-ui .nl7-m{margin-left:-16rem}.swagger-ui .nr1-m{margin-right:-.25rem}.swagger-ui .nr2-m{margin-right:-.5rem}.swagger-ui .nr3-m{margin-right:-1rem}.swagger-ui .nr4-m{margin-right:-2rem}.swagger-ui .nr5-m{margin-right:-4rem}.swagger-ui .nr6-m{margin-right:-8rem}.swagger-ui .nr7-m{margin-right:-16rem}.swagger-ui .nb1-m{margin-bottom:-.25rem}.swagger-ui .nb2-m{margin-bottom:-.5rem}.swagger-ui .nb3-m{margin-bottom:-1rem}.swagger-ui .nb4-m{margin-bottom:-2rem}.swagger-ui .nb5-m{margin-bottom:-4rem}.swagger-ui .nb6-m{margin-bottom:-8rem}.swagger-ui .nb7-m{margin-bottom:-16rem}.swagger-ui .nt1-m{margin-top:-.25rem}.swagger-ui .nt2-m{margin-top:-.5rem}.swagger-ui .nt3-m{margin-top:-1rem}.swagger-ui .nt4-m{margin-top:-2rem}.swagger-ui .nt5-m{margin-top:-4rem}.swagger-ui .nt6-m{margin-top:-8rem}.swagger-ui .nt7-m{margin-top:-16rem}}@media screen and (min-width:60em){.swagger-ui .na1-l{margin:-.25rem}.swagger-ui .na2-l{margin:-.5rem}.swagger-ui .na3-l{margin:-1rem}.swagger-ui .na4-l{margin:-2rem}.swagger-ui .na5-l{margin:-4rem}.swagger-ui .na6-l{margin:-8rem}.swagger-ui .na7-l{margin:-16rem}.swagger-ui .nl1-l{margin-left:-.25rem}.swagger-ui .nl2-l{margin-left:-.5rem}.swagger-ui .nl3-l{margin-left:-1rem}.swagger-ui .nl4-l{margin-left:-2rem}.swagger-ui .nl5-l{margin-left:-4rem}.swagger-ui .nl6-l{margin-left:-8rem}.swagger-ui .nl7-l{margin-left:-16rem}.swagger-ui .nr1-l{margin-right:-.25rem}.swagger-ui .nr2-l{margin-right:-.5rem}.swagger-ui .nr3-l{margin-right:-1rem}.swagger-ui .nr4-l{margin-right:-2rem}.swagger-ui .nr5-l{margin-right:-4rem}.swagger-ui .nr6-l{margin-right:-8rem}.swagger-ui .nr7-l{margin-right:-16rem}.swagger-ui .nb1-l{margin-bottom:-.25rem}.swagger-ui .nb2-l{margin-bottom:-.5rem}.swagger-ui .nb3-l{margin-bottom:-1rem}.swagger-ui .nb4-l{margin-bottom:-2rem}.swagger-ui .nb5-l{margin-bottom:-4rem}.swagger-ui .nb6-l{margin-bottom:-8rem}.swagger-ui .nb7-l{margin-bottom:-16rem}.swagger-ui .nt1-l{margin-top:-.25rem}.swagger-ui .nt2-l{margin-top:-.5rem}.swagger-ui .nt3-l{margin-top:-1rem}.swagger-ui .nt4-l{margin-top:-2rem}.swagger-ui .nt5-l{margin-top:-4rem}.swagger-ui .nt6-l{margin-top:-8rem}.swagger-ui .nt7-l{margin-top:-16rem}}.swagger-ui .collapse{border-collapse:collapse;border-spacing:0}.swagger-ui .striped--light-silver:nth-child(odd){background-color:#aaa}.swagger-ui .striped--moon-gray:nth-child(odd){background-color:#ccc}.swagger-ui .striped--light-gray:nth-child(odd){background-color:#eee}.swagger-ui .striped--near-white:nth-child(odd){background-color:#f4f4f4}.swagger-ui .stripe-light:nth-child(odd){background-color:hsla(0,0%,100%,.1)}.swagger-ui .stripe-dark:nth-child(odd){background-color:rgba(0,0,0,.1)}.swagger-ui .strike{text-decoration:line-through}.swagger-ui .underline{text-decoration:underline}.swagger-ui .no-underline{text-decoration:none}@media screen and (min-width:30em){.swagger-ui .strike-ns{text-decoration:line-through}.swagger-ui .underline-ns{text-decoration:underline}.swagger-ui .no-underline-ns{text-decoration:none}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .strike-m{text-decoration:line-through}.swagger-ui .underline-m{text-decoration:underline}.swagger-ui .no-underline-m{text-decoration:none}}@media screen and (min-width:60em){.swagger-ui .strike-l{text-decoration:line-through}.swagger-ui .underline-l{text-decoration:underline}.swagger-ui .no-underline-l{text-decoration:none}}.swagger-ui .tl{text-align:left}.swagger-ui .tr{text-align:right}.swagger-ui .tc{text-align:center}.swagger-ui .tj{text-align:justify}@media screen and (min-width:30em){.swagger-ui .tl-ns{text-align:left}.swagger-ui .tr-ns{text-align:right}.swagger-ui .tc-ns{text-align:center}.swagger-ui .tj-ns{text-align:justify}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .tl-m{text-align:left}.swagger-ui .tr-m{text-align:right}.swagger-ui .tc-m{text-align:center}.swagger-ui .tj-m{text-align:justify}}@media screen and (min-width:60em){.swagger-ui .tl-l{text-align:left}.swagger-ui .tr-l{text-align:right}.swagger-ui .tc-l{text-align:center}.swagger-ui .tj-l{text-align:justify}}.swagger-ui .ttc{text-transform:capitalize}.swagger-ui .ttl{text-transform:lowercase}.swagger-ui .ttu{text-transform:uppercase}.swagger-ui .ttn{text-transform:none}@media screen and (min-width:30em){.swagger-ui .ttc-ns{text-transform:capitalize}.swagger-ui .ttl-ns{text-transform:lowercase}.swagger-ui .ttu-ns{text-transform:uppercase}.swagger-ui .ttn-ns{text-transform:none}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .ttc-m{text-transform:capitalize}.swagger-ui .ttl-m{text-transform:lowercase}.swagger-ui .ttu-m{text-transform:uppercase}.swagger-ui .ttn-m{text-transform:none}}@media screen and (min-width:60em){.swagger-ui .ttc-l{text-transform:capitalize}.swagger-ui .ttl-l{text-transform:lowercase}.swagger-ui .ttu-l{text-transform:uppercase}.swagger-ui .ttn-l{text-transform:none}}.swagger-ui .f-6,.swagger-ui .f-headline{font-size:6rem}.swagger-ui .f-5,.swagger-ui .f-subheadline{font-size:5rem}.swagger-ui .f1{font-size:3rem}.swagger-ui .f2{font-size:2.25rem}.swagger-ui .f3{font-size:1.5rem}.swagger-ui .f4{font-size:1.25rem}.swagger-ui .f5{font-size:1rem}.swagger-ui .f6{font-size:.875rem}.swagger-ui .f7{font-size:.75rem}@media screen and (min-width:30em){.swagger-ui .f-6-ns,.swagger-ui .f-headline-ns{font-size:6rem}.swagger-ui .f-5-ns,.swagger-ui .f-subheadline-ns{font-size:5rem}.swagger-ui .f1-ns{font-size:3rem}.swagger-ui .f2-ns{font-size:2.25rem}.swagger-ui .f3-ns{font-size:1.5rem}.swagger-ui .f4-ns{font-size:1.25rem}.swagger-ui .f5-ns{font-size:1rem}.swagger-ui .f6-ns{font-size:.875rem}.swagger-ui .f7-ns{font-size:.75rem}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .f-6-m,.swagger-ui .f-headline-m{font-size:6rem}.swagger-ui .f-5-m,.swagger-ui .f-subheadline-m{font-size:5rem}.swagger-ui .f1-m{font-size:3rem}.swagger-ui .f2-m{font-size:2.25rem}.swagger-ui .f3-m{font-size:1.5rem}.swagger-ui .f4-m{font-size:1.25rem}.swagger-ui .f5-m{font-size:1rem}.swagger-ui .f6-m{font-size:.875rem}.swagger-ui .f7-m{font-size:.75rem}}@media screen and (min-width:60em){.swagger-ui .f-6-l,.swagger-ui .f-headline-l{font-size:6rem}.swagger-ui .f-5-l,.swagger-ui .f-subheadline-l{font-size:5rem}.swagger-ui .f1-l{font-size:3rem}.swagger-ui .f2-l{font-size:2.25rem}.swagger-ui .f3-l{font-size:1.5rem}.swagger-ui .f4-l{font-size:1.25rem}.swagger-ui .f5-l{font-size:1rem}.swagger-ui .f6-l{font-size:.875rem}.swagger-ui .f7-l{font-size:.75rem}}.swagger-ui .measure{max-width:30em}.swagger-ui .measure-wide{max-width:34em}.swagger-ui .measure-narrow{max-width:20em}.swagger-ui .indent{margin-bottom:0;margin-top:0;text-indent:1em}.swagger-ui .small-caps{font-feature-settings:"smcp";font-variant:small-caps}.swagger-ui .truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}@media screen and (min-width:30em){.swagger-ui .measure-ns{max-width:30em}.swagger-ui .measure-wide-ns{max-width:34em}.swagger-ui .measure-narrow-ns{max-width:20em}.swagger-ui .indent-ns{margin-bottom:0;margin-top:0;text-indent:1em}.swagger-ui .small-caps-ns{font-feature-settings:"smcp";font-variant:small-caps}.swagger-ui .truncate-ns{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .measure-m{max-width:30em}.swagger-ui .measure-wide-m{max-width:34em}.swagger-ui .measure-narrow-m{max-width:20em}.swagger-ui .indent-m{margin-bottom:0;margin-top:0;text-indent:1em}.swagger-ui .small-caps-m{font-feature-settings:"smcp";font-variant:small-caps}.swagger-ui .truncate-m{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}}@media screen and (min-width:60em){.swagger-ui .measure-l{max-width:30em}.swagger-ui .measure-wide-l{max-width:34em}.swagger-ui .measure-narrow-l{max-width:20em}.swagger-ui .indent-l{margin-bottom:0;margin-top:0;text-indent:1em}.swagger-ui .small-caps-l{font-feature-settings:"smcp";font-variant:small-caps}.swagger-ui .truncate-l{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}}.swagger-ui .overflow-container{overflow-y:scroll}.swagger-ui .center{margin-left:auto;margin-right:auto}.swagger-ui .mr-auto{margin-right:auto}.swagger-ui .ml-auto{margin-left:auto}@media screen and (min-width:30em){.swagger-ui .center-ns{margin-left:auto;margin-right:auto}.swagger-ui .mr-auto-ns{margin-right:auto}.swagger-ui .ml-auto-ns{margin-left:auto}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .center-m{margin-left:auto;margin-right:auto}.swagger-ui .mr-auto-m{margin-right:auto}.swagger-ui .ml-auto-m{margin-left:auto}}@media screen and (min-width:60em){.swagger-ui .center-l{margin-left:auto;margin-right:auto}.swagger-ui .mr-auto-l{margin-right:auto}.swagger-ui .ml-auto-l{margin-left:auto}}.swagger-ui .clip{clip:rect(1px 1px 1px 1px);clip:rect(1px,1px,1px,1px);position:fixed!important;_position:absolute!important}@media screen and (min-width:30em){.swagger-ui .clip-ns{clip:rect(1px 1px 1px 1px);clip:rect(1px,1px,1px,1px);position:fixed!important;_position:absolute!important}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .clip-m{clip:rect(1px 1px 1px 1px);clip:rect(1px,1px,1px,1px);position:fixed!important;_position:absolute!important}}@media screen and (min-width:60em){.swagger-ui .clip-l{clip:rect(1px 1px 1px 1px);clip:rect(1px,1px,1px,1px);position:fixed!important;_position:absolute!important}}.swagger-ui .ws-normal{white-space:normal}.swagger-ui .nowrap{white-space:nowrap}.swagger-ui .pre{white-space:pre}@media screen and (min-width:30em){.swagger-ui .ws-normal-ns{white-space:normal}.swagger-ui .nowrap-ns{white-space:nowrap}.swagger-ui .pre-ns{white-space:pre}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .ws-normal-m{white-space:normal}.swagger-ui .nowrap-m{white-space:nowrap}.swagger-ui .pre-m{white-space:pre}}@media screen and (min-width:60em){.swagger-ui .ws-normal-l{white-space:normal}.swagger-ui .nowrap-l{white-space:nowrap}.swagger-ui .pre-l{white-space:pre}}.swagger-ui .v-base{vertical-align:baseline}.swagger-ui .v-mid{vertical-align:middle}.swagger-ui .v-top{vertical-align:top}.swagger-ui .v-btm{vertical-align:bottom}@media screen and (min-width:30em){.swagger-ui .v-base-ns{vertical-align:baseline}.swagger-ui .v-mid-ns{vertical-align:middle}.swagger-ui .v-top-ns{vertical-align:top}.swagger-ui .v-btm-ns{vertical-align:bottom}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .v-base-m{vertical-align:baseline}.swagger-ui .v-mid-m{vertical-align:middle}.swagger-ui .v-top-m{vertical-align:top}.swagger-ui .v-btm-m{vertical-align:bottom}}@media screen and (min-width:60em){.swagger-ui .v-base-l{vertical-align:baseline}.swagger-ui .v-mid-l{vertical-align:middle}.swagger-ui .v-top-l{vertical-align:top}.swagger-ui .v-btm-l{vertical-align:bottom}}.swagger-ui .dim{opacity:1;transition:opacity .15s ease-in}.swagger-ui .dim:focus,.swagger-ui .dim:hover{opacity:.5;transition:opacity .15s ease-in}.swagger-ui .dim:active{opacity:.8;transition:opacity .15s ease-out}.swagger-ui .glow{transition:opacity .15s ease-in}.swagger-ui .glow:focus,.swagger-ui .glow:hover{opacity:1;transition:opacity .15s ease-in}.swagger-ui .hide-child .child{opacity:0;transition:opacity .15s ease-in}.swagger-ui .hide-child:active .child,.swagger-ui .hide-child:focus .child,.swagger-ui .hide-child:hover .child{opacity:1;transition:opacity .15s ease-in}.swagger-ui .underline-hover:focus,.swagger-ui .underline-hover:hover{text-decoration:underline}.swagger-ui .grow{-moz-osx-font-smoothing:grayscale;-webkit-backface-visibility:hidden;backface-visibility:hidden;transform:translateZ(0);transition:transform .25s ease-out}.swagger-ui .grow:focus,.swagger-ui .grow:hover{transform:scale(1.05)}.swagger-ui .grow:active{transform:scale(.9)}.swagger-ui .grow-large{-moz-osx-font-smoothing:grayscale;-webkit-backface-visibility:hidden;backface-visibility:hidden;transform:translateZ(0);transition:transform .25s ease-in-out}.swagger-ui .grow-large:focus,.swagger-ui .grow-large:hover{transform:scale(1.2)}.swagger-ui .grow-large:active{transform:scale(.95)}.swagger-ui .pointer:hover{cursor:pointer}.swagger-ui .shadow-hover{cursor:pointer;position:relative;transition:all .5s cubic-bezier(.165,.84,.44,1)}.swagger-ui .shadow-hover:after{border-radius:inherit;box-shadow:0 0 16px 2px rgba(0,0,0,.2);content:"";height:100%;left:0;opacity:0;position:absolute;top:0;transition:opacity .5s cubic-bezier(.165,.84,.44,1);width:100%;z-index:-1}.swagger-ui .shadow-hover:focus:after,.swagger-ui .shadow-hover:hover:after{opacity:1}.swagger-ui .bg-animate,.swagger-ui .bg-animate:focus,.swagger-ui .bg-animate:hover{transition:background-color .15s ease-in-out}.swagger-ui .z-0{z-index:0}.swagger-ui .z-1{z-index:1}.swagger-ui .z-2{z-index:2}.swagger-ui .z-3{z-index:3}.swagger-ui .z-4{z-index:4}.swagger-ui .z-5{z-index:5}.swagger-ui .z-999{z-index:999}.swagger-ui .z-9999{z-index:9999}.swagger-ui .z-max{z-index:2147483647}.swagger-ui .z-inherit{z-index:inherit}.swagger-ui .z-initial{z-index:auto}.swagger-ui .z-unset{z-index:unset}.swagger-ui .nested-copy-line-height ol,.swagger-ui .nested-copy-line-height p,.swagger-ui .nested-copy-line-height ul{line-height:1.5}.swagger-ui .nested-headline-line-height h1,.swagger-ui .nested-headline-line-height h2,.swagger-ui .nested-headline-line-height h3,.swagger-ui .nested-headline-line-height h4,.swagger-ui .nested-headline-line-height h5,.swagger-ui .nested-headline-line-height h6{line-height:1.25}.swagger-ui .nested-list-reset ol,.swagger-ui .nested-list-reset ul{list-style-type:none;margin-left:0;padding-left:0}.swagger-ui .nested-copy-indent p+p{margin-bottom:0;margin-top:0;text-indent:.1em}.swagger-ui .nested-copy-seperator p+p{margin-top:1.5em}.swagger-ui .nested-img img{display:block;max-width:100%;width:100%}.swagger-ui .nested-links a{color:#357edd;transition:color .15s ease-in}.swagger-ui .nested-links a:focus,.swagger-ui .nested-links a:hover{color:#96ccff;transition:color .15s ease-in}.swagger-ui .wrapper{box-sizing:border-box;margin:0 auto;max-width:1460px;padding:0 20px;width:100%}.swagger-ui .opblock-tag-section{display:flex;flex-direction:column}.swagger-ui .try-out.btn-group{display:flex;flex:0.1 2 auto;padding:0}.swagger-ui .try-out__btn{margin-left:1.25rem}.swagger-ui .opblock-tag{align-items:center;border-bottom:1px solid rgba(59,65,81,.3);cursor:pointer;display:flex;padding:10px 20px 10px 10px;transition:all .2s}.swagger-ui .opblock-tag:hover{background:rgba(0,0,0,.02)}.swagger-ui .opblock-tag{color:#3b4151;font-family:sans-serif;font-size:24px;margin:0 0 5px}.swagger-ui .opblock-tag.no-desc span{flex:1}.swagger-ui .opblock-tag svg{transition:all .4s}.swagger-ui .opblock-tag small{color:#3b4151;flex:2;font-family:sans-serif;font-size:14px;font-weight:400;padding:0 10px}.swagger-ui .opblock-tag>div{flex:1 1 150px;font-weight:400;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}@media (max-width:640px){.swagger-ui .opblock-tag small,.swagger-ui .opblock-tag>div{flex:1}}.swagger-ui .parameter__type{color:#3b4151;font-family:monospace;font-size:12px;font-weight:600;padding:5px 0}.swagger-ui .parameter-controls{margin-top:.75em}.swagger-ui .examples__title{display:block;font-size:1.1em;font-weight:700;margin-bottom:.75em}.swagger-ui .examples__section{margin-top:1.5em}.swagger-ui .examples__section-header{font-size:.9rem;font-weight:700;margin-bottom:.5rem}.swagger-ui .examples-select{display:inline-block;margin-bottom:.75em}.swagger-ui .examples-select .examples-select-element{width:100%}.swagger-ui .examples-select__section-label{font-size:.9rem;font-weight:700;margin-right:.5rem}.swagger-ui .example__section{margin-top:1.5em}.swagger-ui .example__section-header{font-size:.9rem;font-weight:700;margin-bottom:.5rem}.swagger-ui .view-line-link{cursor:pointer;margin:0 5px;position:relative;top:3px;transition:all .5s;width:20px}.swagger-ui .opblock{border:1px solid #000;border-radius:4px;box-shadow:0 0 3px rgba(0,0,0,.19);margin:0 0 15px}.swagger-ui .opblock .tab-header{display:flex;flex:1}.swagger-ui .opblock .tab-header .tab-item{cursor:pointer;padding:0 40px}.swagger-ui .opblock .tab-header .tab-item:first-of-type{padding:0 40px 0 0}.swagger-ui .opblock .tab-header .tab-item.active h4 span{position:relative}.swagger-ui .opblock .tab-header .tab-item.active h4 span:after{background:gray;bottom:-15px;content:"";height:4px;left:50%;position:absolute;transform:translateX(-50%);width:120%}.swagger-ui .opblock.is-open .opblock-summary{border-bottom:1px solid #000}.swagger-ui .opblock .opblock-section-header{align-items:center;background:hsla(0,0%,100%,.8);box-shadow:0 1px 2px rgba(0,0,0,.1);display:flex;min-height:50px;padding:8px 20px}.swagger-ui .opblock .opblock-section-header>label{align-items:center;color:#3b4151;display:flex;font-family:sans-serif;font-size:12px;font-weight:700;margin:0 0 0 auto}.swagger-ui .opblock .opblock-section-header>label>span{padding:0 10px 0 0}.swagger-ui .opblock .opblock-section-header h4{color:#3b4151;flex:1;font-family:sans-serif;font-size:14px;margin:0}.swagger-ui .opblock .opblock-summary-method{background:#000;border-radius:3px;color:#fff;font-family:sans-serif;font-size:14px;font-weight:700;min-width:80px;padding:6px 0;text-align:center;text-shadow:0 1px 0 rgba(0,0,0,.1)}.swagger-ui .opblock .opblock-summary-operation-id,.swagger-ui .opblock .opblock-summary-path,.swagger-ui .opblock .opblock-summary-path__deprecated{align-items:center;color:#3b4151;display:flex;font-family:monospace;font-size:16px;font-weight:600;padding:0 10px;word-break:break-word}@media (max-width:768px){.swagger-ui .opblock .opblock-summary-operation-id,.swagger-ui .opblock .opblock-summary-path,.swagger-ui .opblock .opblock-summary-path__deprecated{font-size:12px}}.swagger-ui .opblock .opblock-summary-path{flex-shrink:0;max-width:calc(100% - 110px - 15rem)}@media (max-width:640px){.swagger-ui .opblock .opblock-summary-path{flex-shrink:1;max-width:100%}}.swagger-ui .opblock .opblock-summary-path__deprecated{text-decoration:line-through}.swagger-ui .opblock .opblock-summary-operation-id{font-size:14px}.swagger-ui .opblock .opblock-summary-description{color:#3b4151;flex:1 1 auto;font-family:sans-serif;font-size:13px;word-break:break-word}.swagger-ui .opblock .opblock-summary{align-items:center;cursor:pointer;display:flex;padding:5px}.swagger-ui .opblock .opblock-summary .view-line-link{cursor:pointer;margin:0;position:relative;top:2px;transition:all .5s;width:0}.swagger-ui .opblock .opblock-summary:hover .view-line-link{margin:0 5px;width:18px}.swagger-ui .opblock .opblock-summary:hover .view-line-link.copy-to-clipboard{width:24px}.swagger-ui .opblock.opblock-post{background:rgba(73,204,144,.1);border-color:#49cc90}.swagger-ui .opblock.opblock-post .opblock-summary-method{background:#49cc90}.swagger-ui .opblock.opblock-post .opblock-summary{border-color:#49cc90}.swagger-ui .opblock.opblock-post .tab-header .tab-item.active h4 span:after{background:#49cc90}.swagger-ui .opblock.opblock-put{background:rgba(252,161,48,.1);border-color:#fca130}.swagger-ui .opblock.opblock-put .opblock-summary-method{background:#fca130}.swagger-ui .opblock.opblock-put .opblock-summary{border-color:#fca130}.swagger-ui .opblock.opblock-put .tab-header .tab-item.active h4 span:after{background:#fca130}.swagger-ui .opblock.opblock-delete{background:rgba(249,62,62,.1);border-color:#f93e3e}.swagger-ui .opblock.opblock-delete .opblock-summary-method{background:#f93e3e}.swagger-ui .opblock.opblock-delete .opblock-summary{border-color:#f93e3e}.swagger-ui .opblock.opblock-delete .tab-header .tab-item.active h4 span:after{background:#f93e3e}.swagger-ui .opblock.opblock-get{background:rgba(97,175,254,.1);border-color:#61affe}.swagger-ui .opblock.opblock-get .opblock-summary-method{background:#61affe}.swagger-ui .opblock.opblock-get .opblock-summary{border-color:#61affe}.swagger-ui .opblock.opblock-get .tab-header .tab-item.active h4 span:after{background:#61affe}.swagger-ui .opblock.opblock-patch{background:rgba(80,227,194,.1);border-color:#50e3c2}.swagger-ui .opblock.opblock-patch .opblock-summary-method{background:#50e3c2}.swagger-ui .opblock.opblock-patch .opblock-summary{border-color:#50e3c2}.swagger-ui .opblock.opblock-patch .tab-header .tab-item.active h4 span:after{background:#50e3c2}.swagger-ui .opblock.opblock-head{background:rgba(144,18,254,.1);border-color:#9012fe}.swagger-ui .opblock.opblock-head .opblock-summary-method{background:#9012fe}.swagger-ui .opblock.opblock-head .opblock-summary{border-color:#9012fe}.swagger-ui .opblock.opblock-head .tab-header .tab-item.active h4 span:after{background:#9012fe}.swagger-ui .opblock.opblock-options{background:rgba(13,90,167,.1);border-color:#0d5aa7}.swagger-ui .opblock.opblock-options .opblock-summary-method{background:#0d5aa7}.swagger-ui .opblock.opblock-options .opblock-summary{border-color:#0d5aa7}.swagger-ui .opblock.opblock-options .tab-header .tab-item.active h4 span:after{background:#0d5aa7}.swagger-ui .opblock.opblock-deprecated{background:hsla(0,0%,92%,.1);border-color:#ebebeb;opacity:.6}.swagger-ui .opblock.opblock-deprecated .opblock-summary-method{background:#ebebeb}.swagger-ui .opblock.opblock-deprecated .opblock-summary{border-color:#ebebeb}.swagger-ui .opblock.opblock-deprecated .tab-header .tab-item.active h4 span:after{background:#ebebeb}.swagger-ui .opblock .opblock-schemes{padding:8px 20px}.swagger-ui .opblock .opblock-schemes .schemes-title{padding:0 10px 0 0}.swagger-ui .filter .operation-filter-input{border:2px solid #d8dde7;margin:20px 0;padding:10px;width:100%}.swagger-ui .download-url-wrapper .failed,.swagger-ui .filter .failed{color:red}.swagger-ui .download-url-wrapper .loading,.swagger-ui .filter .loading{color:#aaa}.swagger-ui .model-example{margin-top:1em}.swagger-ui .tab{display:flex;list-style:none;padding:0}.swagger-ui .tab li{color:#3b4151;cursor:pointer;font-family:sans-serif;font-size:12px;min-width:60px;padding:0}.swagger-ui .tab li:first-of-type{padding-left:0;padding-right:12px;position:relative}.swagger-ui .tab li:first-of-type:after{background:rgba(0,0,0,.2);content:"";height:100%;position:absolute;right:6px;top:0;width:1px}.swagger-ui .tab li.active{font-weight:700}.swagger-ui .tab li button.tablinks{background:none;border:0;color:inherit;font-family:inherit;font-weight:inherit;padding:0}.swagger-ui .opblock-description-wrapper,.swagger-ui .opblock-external-docs-wrapper,.swagger-ui .opblock-title_normal{color:#3b4151;font-family:sans-serif;font-size:12px;margin:0 0 5px;padding:15px 20px}.swagger-ui .opblock-description-wrapper h4,.swagger-ui .opblock-external-docs-wrapper h4,.swagger-ui .opblock-title_normal h4{color:#3b4151;font-family:sans-serif;font-size:12px;margin:0 0 5px}.swagger-ui .opblock-description-wrapper p,.swagger-ui .opblock-external-docs-wrapper p,.swagger-ui .opblock-title_normal p{color:#3b4151;font-family:sans-serif;font-size:14px;margin:0}.swagger-ui .opblock-external-docs-wrapper h4{padding-left:0}.swagger-ui .execute-wrapper{padding:20px;text-align:right}.swagger-ui .execute-wrapper .btn{padding:8px 40px;width:100%}.swagger-ui .body-param-options{display:flex;flex-direction:column}.swagger-ui .body-param-options .body-param-edit{padding:10px 0}.swagger-ui .body-param-options label{padding:8px 0}.swagger-ui .body-param-options label select{margin:3px 0 0}.swagger-ui .responses-inner{padding:20px}.swagger-ui .responses-inner h4,.swagger-ui .responses-inner h5{color:#3b4151;font-family:sans-serif;font-size:12px;margin:10px 0 5px}.swagger-ui .responses-inner .curl{white-space:normal}.swagger-ui .response-col_status{color:#3b4151;font-family:sans-serif;font-size:14px}.swagger-ui .response-col_status .response-undocumented{color:#909090;font-family:monospace;font-size:11px;font-weight:600}.swagger-ui .response-col_links{color:#3b4151;font-family:sans-serif;font-size:14px;max-width:40em;padding-left:2em}.swagger-ui .response-col_links .response-undocumented{color:#909090;font-family:monospace;font-size:11px;font-weight:600}.swagger-ui .response-col_links .operation-link{margin-bottom:1.5em}.swagger-ui .response-col_links .operation-link .description{margin-bottom:.5em}.swagger-ui .opblock-body .opblock-loading-animation{display:block;margin:3em auto}.swagger-ui .opblock-body pre.microlight{word-wrap:break-word;background:#333;border-radius:4px;color:#fff;font-family:monospace;font-size:12px;font-weight:600;-webkit-hyphens:auto;hyphens:auto;margin:0;padding:10px;white-space:pre-wrap;word-break:break-all;word-break:break-word}.swagger-ui .opblock-body pre.microlight .headerline{display:block}.swagger-ui .highlight-code{position:relative}.swagger-ui .highlight-code>.microlight{max-height:400px;min-height:6em;overflow-y:auto}.swagger-ui .highlight-code>.microlight code{white-space:pre-wrap!important;word-break:break-all}.swagger-ui .curl-command{position:relative}.swagger-ui .download-contents{align-items:center;background:#7d8293;border-radius:4px;bottom:10px;color:#fff;cursor:pointer;display:flex;font-family:sans-serif;font-size:14px;font-weight:600;height:30px;justify-content:center;padding:5px;position:absolute;right:10px;text-align:center}.swagger-ui .scheme-container{background:#fff;box-shadow:0 1px 2px 0 rgba(0,0,0,.15);margin:0 0 20px;padding:30px 0}.swagger-ui .scheme-container .schemes{align-items:flex-end;display:flex}.swagger-ui .scheme-container .schemes>label{color:#3b4151;display:flex;flex-direction:column;font-family:sans-serif;font-size:12px;font-weight:700;margin:-20px 15px 0 0}.swagger-ui .scheme-container .schemes>label select{min-width:130px;text-transform:uppercase}.swagger-ui .loading-container{align-items:center;display:flex;flex-direction:column;justify-content:center;margin-top:1em;min-height:1px;padding:40px 0 60px}.swagger-ui .loading-container .loading{position:relative}.swagger-ui .loading-container .loading:after{color:#3b4151;content:"loading";font-family:sans-serif;font-size:10px;font-weight:700;left:50%;position:absolute;text-transform:uppercase;top:50%;transform:translate(-50%,-50%)}.swagger-ui .loading-container .loading:before{-webkit-animation:rotation 1s linear infinite,opacity .5s;animation:rotation 1s linear infinite,opacity .5s;-webkit-backface-visibility:hidden;backface-visibility:hidden;border:2px solid rgba(85,85,85,.1);border-radius:100%;border-top-color:rgba(0,0,0,.6);content:"";display:block;height:60px;left:50%;margin:-30px;opacity:1;position:absolute;top:50%;width:60px}@-webkit-keyframes rotation{to{transform:rotate(1turn)}}@keyframes rotation{to{transform:rotate(1turn)}}.swagger-ui .response-controls{display:flex;padding-top:1em}.swagger-ui .response-control-media-type{margin-right:1em}.swagger-ui .response-control-media-type--accept-controller select{border-color:green}.swagger-ui .response-control-media-type__accept-message{color:green;font-size:.7em}.swagger-ui .response-control-examples__title,.swagger-ui .response-control-media-type__title{display:block;font-size:.7em;margin-bottom:.2em}@-webkit-keyframes blinker{50%{opacity:0}}@keyframes blinker{50%{opacity:0}}.swagger-ui .hidden{display:none}.swagger-ui .no-margin{border:none;height:auto;margin:0;padding:0}.swagger-ui .float-right{float:right}.swagger-ui .svg-assets{height:0;position:absolute;width:0}.swagger-ui section h3{color:#3b4151;font-family:sans-serif}.swagger-ui a.nostyle{display:inline}.swagger-ui a.nostyle,.swagger-ui a.nostyle:visited{color:inherit;cursor:pointer;text-decoration:inherit}.swagger-ui .fallback{color:#aaa;padding:1em}.swagger-ui .version-pragma{height:100%;padding:5em 0}.swagger-ui .version-pragma__message{display:flex;font-size:1.2em;height:100%;justify-content:center;line-height:1.5em;padding:0 .6em;text-align:center}.swagger-ui .version-pragma__message>div{flex:1;max-width:55ch}.swagger-ui .version-pragma__message code{background-color:#dedede;padding:4px 4px 2px;white-space:pre}.swagger-ui .opblock-link{font-weight:400}.swagger-ui .opblock-link.shown{font-weight:700}.swagger-ui span.token-string{color:#555}.swagger-ui span.token-not-formatted{color:#555;font-weight:700}.swagger-ui .btn{background:transparent;border:2px solid gray;border-radius:4px;box-shadow:0 1px 2px rgba(0,0,0,.1);color:#3b4151;font-family:sans-serif;font-size:14px;font-weight:700;padding:5px 23px;transition:all .3s}.swagger-ui .btn.btn-sm{font-size:12px;padding:4px 23px}.swagger-ui .btn[disabled]{cursor:not-allowed;opacity:.3}.swagger-ui .btn:hover{box-shadow:0 0 5px rgba(0,0,0,.3)}.swagger-ui .btn.cancel{background-color:transparent;border-color:#ff6060;color:#ff6060;font-family:sans-serif}.swagger-ui .btn.authorize{background-color:transparent;border-color:#49cc90;color:#49cc90;display:inline;line-height:1}.swagger-ui .btn.authorize span{float:left;padding:4px 20px 0 0}.swagger-ui .btn.authorize svg{fill:#49cc90}.swagger-ui .btn.execute{background-color:#4990e2;border-color:#4990e2;color:#fff}.swagger-ui .btn-group{display:flex;padding:30px}.swagger-ui .btn-group .btn{flex:1}.swagger-ui .btn-group .btn:first-child{border-radius:4px 0 0 4px}.swagger-ui .btn-group .btn:last-child{border-radius:0 4px 4px 0}.swagger-ui .authorization__btn{background:none;border:none;padding:0 0 0 10px}.swagger-ui .authorization__btn.locked{opacity:1}.swagger-ui .authorization__btn.unlocked{opacity:.4}.swagger-ui .model-box-control,.swagger-ui .models-control,.swagger-ui .opblock-summary-control{all:inherit;border-bottom:0;cursor:pointer;flex:1;padding:0}.swagger-ui .model-box-control:focus,.swagger-ui .models-control:focus,.swagger-ui .opblock-summary-control:focus{outline:auto}.swagger-ui .expand-methods,.swagger-ui .expand-operation{background:none;border:none}.swagger-ui .expand-methods svg,.swagger-ui .expand-operation svg{height:20px;width:20px}.swagger-ui .expand-methods{padding:0 10px}.swagger-ui .expand-methods:hover svg{fill:#404040}.swagger-ui .expand-methods svg{fill:#707070;transition:all .3s}.swagger-ui button{cursor:pointer}.swagger-ui button.invalid{-webkit-animation:shake .4s 1;animation:shake .4s 1;background:#feebeb;border-color:#f93e3e}.swagger-ui .copy-to-clipboard{align-items:center;background:#7d8293;border:none;border-radius:4px;bottom:10px;display:flex;height:30px;justify-content:center;position:absolute;right:100px;width:30px}.swagger-ui .copy-to-clipboard button{background:url("data:image/svg+xml;charset=utf-8,") 50% no-repeat;border:none;flex-grow:1;flex-shrink:1;height:25px}.swagger-ui .curl-command .copy-to-clipboard{bottom:5px;height:20px;right:10px;width:20px}.swagger-ui .curl-command .copy-to-clipboard button{height:18px}.swagger-ui .opblock .opblock-summary .view-line-link.copy-to-clipboard{height:26px;position:unset}.swagger-ui select{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:#f7f7f7 url("data:image/svg+xml;charset=utf-8,") right 10px center no-repeat;background-size:20px;border:2px solid #41444e;border-radius:4px;box-shadow:0 1px 2px 0 rgba(0,0,0,.25);color:#3b4151;font-family:sans-serif;font-size:14px;font-weight:700;padding:5px 40px 5px 10px}.swagger-ui select[multiple]{background:#f7f7f7;margin:5px 0;padding:5px}.swagger-ui select.invalid{-webkit-animation:shake .4s 1;animation:shake .4s 1;background:#feebeb;border-color:#f93e3e}.swagger-ui .opblock-body select{min-width:230px}@media (max-width:768px){.swagger-ui .opblock-body select{min-width:180px}}@media (max-width:640px){.swagger-ui .opblock-body select{min-width:100%;width:100%}}.swagger-ui label{color:#3b4151;font-family:sans-serif;font-size:12px;font-weight:700;margin:0 0 5px}@media (max-width:768px){.swagger-ui input[type=email],.swagger-ui input[type=file],.swagger-ui input[type=password],.swagger-ui input[type=search],.swagger-ui input[type=text]{max-width:175px}}.swagger-ui input[type=email],.swagger-ui input[type=file],.swagger-ui input[type=password],.swagger-ui input[type=search],.swagger-ui input[type=text],.swagger-ui textarea{background:#fff;border:1px solid #d9d9d9;border-radius:4px;margin:5px 0;min-width:100px;padding:8px 10px}.swagger-ui input[type=email].invalid,.swagger-ui input[type=file].invalid,.swagger-ui input[type=password].invalid,.swagger-ui input[type=search].invalid,.swagger-ui input[type=text].invalid,.swagger-ui textarea.invalid{-webkit-animation:shake .4s 1;animation:shake .4s 1;background:#feebeb;border-color:#f93e3e}.swagger-ui input[disabled],.swagger-ui select[disabled],.swagger-ui textarea[disabled]{background-color:#fafafa;color:#888;cursor:not-allowed}.swagger-ui select[disabled]{border-color:#888}.swagger-ui textarea[disabled]{background-color:#41444e;color:#fff}@-webkit-keyframes shake{10%,90%{transform:translate3d(-1px,0,0)}20%,80%{transform:translate3d(2px,0,0)}30%,50%,70%{transform:translate3d(-4px,0,0)}40%,60%{transform:translate3d(4px,0,0)}}@keyframes shake{10%,90%{transform:translate3d(-1px,0,0)}20%,80%{transform:translate3d(2px,0,0)}30%,50%,70%{transform:translate3d(-4px,0,0)}40%,60%{transform:translate3d(4px,0,0)}}.swagger-ui textarea{background:hsla(0,0%,100%,.8);border:none;border-radius:4px;color:#3b4151;font-family:monospace;font-size:12px;font-weight:600;min-height:280px;outline:none;padding:10px;width:100%}.swagger-ui textarea:focus{border:2px solid #61affe}.swagger-ui textarea.curl{background:#41444e;border-radius:4px;color:#fff;font-family:monospace;font-size:12px;font-weight:600;margin:0;min-height:100px;padding:10px;resize:none}.swagger-ui .checkbox{color:#303030;padding:5px 0 10px;transition:opacity .5s}.swagger-ui .checkbox label{display:flex}.swagger-ui .checkbox p{color:#3b4151;font-family:monospace;font-style:italic;font-weight:400!important;font-weight:600;margin:0!important}.swagger-ui .checkbox input[type=checkbox]{display:none}.swagger-ui .checkbox input[type=checkbox]+label>.item{background:#e8e8e8;border-radius:1px;box-shadow:0 0 0 2px #e8e8e8;cursor:pointer;display:inline-block;flex:none;height:16px;margin:0 8px 0 0;padding:5px;position:relative;top:3px;width:16px}.swagger-ui .checkbox input[type=checkbox]+label>.item:active{transform:scale(.9)}.swagger-ui .checkbox input[type=checkbox]:checked+label>.item{background:#e8e8e8 url("data:image/svg+xml;charset=utf-8,") 50% no-repeat}.swagger-ui .dialog-ux{bottom:0;left:0;position:fixed;right:0;top:0;z-index:9999}.swagger-ui .dialog-ux .backdrop-ux{background:rgba(0,0,0,.8);bottom:0;left:0;position:fixed;right:0;top:0}.swagger-ui .dialog-ux .modal-ux{background:#fff;border:1px solid #ebebeb;border-radius:4px;box-shadow:0 10px 30px 0 rgba(0,0,0,.2);left:50%;max-width:650px;min-width:300px;position:absolute;top:50%;transform:translate(-50%,-50%);width:100%;z-index:9999}.swagger-ui .dialog-ux .modal-ux-content{max-height:540px;overflow-y:auto;padding:20px}.swagger-ui .dialog-ux .modal-ux-content p{color:#41444e;color:#3b4151;font-family:sans-serif;font-size:12px;margin:0 0 5px}.swagger-ui .dialog-ux .modal-ux-content h4{color:#3b4151;font-family:sans-serif;font-size:18px;font-weight:600;margin:15px 0 0}.swagger-ui .dialog-ux .modal-ux-header{align-items:center;border-bottom:1px solid #ebebeb;display:flex;padding:12px 0}.swagger-ui .dialog-ux .modal-ux-header .close-modal{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:none;padding:0 10px}.swagger-ui .dialog-ux .modal-ux-header h3{color:#3b4151;flex:1;font-family:sans-serif;font-size:20px;font-weight:600;margin:0;padding:0 20px}.swagger-ui .model{color:#3b4151;font-family:monospace;font-size:12px;font-weight:300;font-weight:600}.swagger-ui .model .deprecated span,.swagger-ui .model .deprecated td{color:#a0a0a0!important}.swagger-ui .model .deprecated>td:first-of-type{text-decoration:line-through}.swagger-ui .model-toggle{cursor:pointer;display:inline-block;font-size:10px;margin:auto .3em;position:relative;top:6px;transform:rotate(90deg);transform-origin:50% 50%;transition:transform .15s ease-in}.swagger-ui .model-toggle.collapsed{transform:rotate(0deg)}.swagger-ui .model-toggle:after{background:url("data:image/svg+xml;charset=utf-8,") 50% no-repeat;background-size:100%;content:"";display:block;height:20px;width:20px}.swagger-ui .model-jump-to-path{cursor:pointer;position:relative}.swagger-ui .model-jump-to-path .view-line-link{cursor:pointer;position:absolute;top:-.4em}.swagger-ui .model-title{position:relative}.swagger-ui .model-title:hover .model-hint{visibility:visible}.swagger-ui .model-hint{background:rgba(0,0,0,.7);border-radius:4px;color:#ebebeb;padding:.1em .5em;position:absolute;top:-1.8em;visibility:hidden;white-space:nowrap}.swagger-ui .model p{margin:0 0 1em}.swagger-ui .model .property{color:#999;font-style:italic}.swagger-ui .model .property.primitive{color:#6b6b6b}.swagger-ui table.model tr.description{color:#666;font-weight:400}.swagger-ui table.model tr.description td:first-child,.swagger-ui table.model tr.property-row.required td:first-child{font-weight:700}.swagger-ui table.model tr.property-row td{vertical-align:top}.swagger-ui table.model tr.property-row td:first-child{padding-right:.2em}.swagger-ui table.model tr.property-row .star{color:red}.swagger-ui table.model tr.extension{color:#777}.swagger-ui table.model tr.extension td:last-child{vertical-align:top}.swagger-ui section.models{border:1px solid rgba(59,65,81,.3);border-radius:4px;margin:30px 0}.swagger-ui section.models .pointer{cursor:pointer}.swagger-ui section.models.is-open{padding:0 0 20px}.swagger-ui section.models.is-open h4{border-bottom:1px solid rgba(59,65,81,.3);margin:0 0 5px}.swagger-ui section.models h4{align-items:center;color:#606060;cursor:pointer;display:flex;font-family:sans-serif;font-size:16px;margin:0;padding:10px 20px 10px 10px;transition:all .2s}.swagger-ui section.models h4 svg{transition:all .4s}.swagger-ui section.models h4 span{flex:1}.swagger-ui section.models h4:hover{background:rgba(0,0,0,.02)}.swagger-ui section.models h5{color:#707070;font-family:sans-serif;font-size:16px;margin:0 0 10px}.swagger-ui section.models .model-jump-to-path{position:relative;top:5px}.swagger-ui section.models .model-container{background:rgba(0,0,0,.05);border-radius:4px;margin:0 20px 15px;position:relative;transition:all .5s}.swagger-ui section.models .model-container:hover{background:rgba(0,0,0,.07)}.swagger-ui section.models .model-container:first-of-type{margin:20px}.swagger-ui section.models .model-container:last-of-type{margin:0 20px}.swagger-ui section.models .model-container .models-jump-to-path{opacity:.65;position:absolute;right:5px;top:8px}.swagger-ui section.models .model-box{background:none}.swagger-ui .model-box{background:rgba(0,0,0,.1);border-radius:4px;display:inline-block;padding:10px}.swagger-ui .model-box .model-jump-to-path{position:relative;top:4px}.swagger-ui .model-box.deprecated{opacity:.5}.swagger-ui .model-title{color:#505050;font-family:sans-serif;font-size:16px}.swagger-ui .model-title img{bottom:0;margin-left:1em;position:relative}.swagger-ui .model-deprecated-warning{color:#f93e3e;font-family:sans-serif;font-size:16px;font-weight:600;margin-right:1em}.swagger-ui span>span.model .brace-close{padding:0 0 0 10px}.swagger-ui .prop-name{display:inline-block;margin-right:1em}.swagger-ui .prop-type{color:#55a}.swagger-ui .prop-enum{display:block}.swagger-ui .prop-format{color:#606060}.swagger-ui .servers>label{color:#3b4151;font-family:sans-serif;font-size:12px;margin:-20px 15px 0 0}.swagger-ui .servers>label select{max-width:100%;min-width:130px;width:100%}.swagger-ui .servers h4.message{padding-bottom:2em}.swagger-ui .servers table tr{width:30em}.swagger-ui .servers table td{display:inline-block;max-width:15em;padding-bottom:10px;padding-top:10px;vertical-align:middle}.swagger-ui .servers table td:first-of-type{padding-right:1em}.swagger-ui .servers table td input{height:100%;width:100%}.swagger-ui .servers .computed-url{margin:2em 0}.swagger-ui .servers .computed-url code{display:inline-block;font-size:16px;margin:0 1em;padding:4px}.swagger-ui .servers-title{font-size:12px;font-weight:700}.swagger-ui .operation-servers h4.message{margin-bottom:2em}.swagger-ui table{border-collapse:collapse;padding:0 10px;width:100%}.swagger-ui table.model tbody tr td{padding:0;vertical-align:top}.swagger-ui table.model tbody tr td:first-of-type{padding:0 0 0 2em;width:174px}.swagger-ui table.headers td{color:#3b4151;font-family:monospace;font-size:12px;font-weight:300;font-weight:600;vertical-align:middle}.swagger-ui table.headers .header-example{color:#999;font-style:italic}.swagger-ui table tbody tr td{padding:10px 0 0;vertical-align:top}.swagger-ui table tbody tr td:first-of-type{min-width:6em;padding:10px 0}.swagger-ui table thead tr td,.swagger-ui table thead tr th{border-bottom:1px solid rgba(59,65,81,.2);color:#3b4151;font-family:sans-serif;font-size:12px;font-weight:700;padding:12px 0;text-align:left}.swagger-ui .parameters-col_description{margin-bottom:2em;width:99%}.swagger-ui .parameters-col_description input{max-width:340px;width:100%}.swagger-ui .parameters-col_description select{border-width:1px}.swagger-ui .parameter__name{color:#3b4151;font-family:sans-serif;font-size:16px;font-weight:400;margin-right:.75em}.swagger-ui .parameter__name.required{font-weight:700}.swagger-ui .parameter__name.required span{color:red}.swagger-ui .parameter__name.required:after{color:rgba(255,0,0,.6);content:"required";font-size:10px;padding:5px;position:relative;top:-6px}.swagger-ui .parameter__extension,.swagger-ui .parameter__in{color:gray;font-family:monospace;font-size:12px;font-style:italic;font-weight:600}.swagger-ui .parameter__deprecated{color:red;font-family:monospace;font-size:12px;font-style:italic;font-weight:600}.swagger-ui .parameter__empty_value_toggle{display:block;font-size:13px;padding-bottom:12px;padding-top:5px}.swagger-ui .parameter__empty_value_toggle input{margin-right:7px}.swagger-ui .parameter__empty_value_toggle.disabled{opacity:.7}.swagger-ui .table-container{padding:20px}.swagger-ui .response-col_description{width:99%}.swagger-ui .response-col_links{min-width:6em}.swagger-ui .response__extension{color:gray;font-family:monospace;font-size:12px;font-style:italic;font-weight:600}.swagger-ui .topbar{background-color:#1b1b1b;padding:10px 0}.swagger-ui .topbar .topbar-wrapper,.swagger-ui .topbar a{align-items:center;display:flex}.swagger-ui .topbar a{color:#fff;flex:1;font-family:sans-serif;font-size:1.5em;font-weight:700;max-width:300px;text-decoration:none}.swagger-ui .topbar a span{margin:0;padding:0 10px}.swagger-ui .topbar .download-url-wrapper{display:flex;flex:3;justify-content:flex-end}.swagger-ui .topbar .download-url-wrapper input[type=text]{border:2px solid #62a03f;border-radius:4px 0 0 4px;margin:0;outline:none;width:100%}.swagger-ui .topbar .download-url-wrapper .select-label{align-items:center;color:#f0f0f0;display:flex;margin:0;max-width:600px;width:100%}.swagger-ui .topbar .download-url-wrapper .select-label span{flex:1;font-size:16px;padding:0 10px 0 0;text-align:right}.swagger-ui .topbar .download-url-wrapper .select-label select{border:2px solid #62a03f;box-shadow:none;flex:2;outline:none;width:100%}.swagger-ui .topbar .download-url-wrapper .download-url-button{background:#62a03f;border:none;border-radius:0 4px 4px 0;color:#fff;font-family:sans-serif;font-size:16px;font-weight:700;padding:4px 30px}.swagger-ui .info{margin:50px 0}.swagger-ui .info.failed-config{margin-left:auto;margin-right:auto;max-width:880px;text-align:center}.swagger-ui .info hgroup.main{margin:0 0 20px}.swagger-ui .info hgroup.main a{font-size:12px}.swagger-ui .info pre{font-size:14px}.swagger-ui .info li,.swagger-ui .info p,.swagger-ui .info table{color:#3b4151;font-family:sans-serif;font-size:14px}.swagger-ui .info h1,.swagger-ui .info h2,.swagger-ui .info h3,.swagger-ui .info h4,.swagger-ui .info h5{color:#3b4151;font-family:sans-serif}.swagger-ui .info a{color:#4990e2;font-family:sans-serif;font-size:14px;transition:all .4s}.swagger-ui .info a:hover{color:#1f69c0}.swagger-ui .info>div{margin:0 0 5px}.swagger-ui .info .base-url{color:#3b4151;font-family:monospace;font-size:12px;font-weight:300!important;font-weight:600;margin:0}.swagger-ui .info .title{color:#3b4151;font-family:sans-serif;font-size:36px;margin:0}.swagger-ui .info .title small{background:#7d8492;border-radius:57px;display:inline-block;font-size:10px;margin:0 0 0 5px;padding:2px 4px;position:relative;top:-5px;vertical-align:super}.swagger-ui .info .title small.version-stamp{background-color:#89bf04}.swagger-ui .info .title small pre{color:#fff;font-family:sans-serif;margin:0;padding:0}.swagger-ui .auth-btn-wrapper{display:flex;justify-content:center;padding:10px 0}.swagger-ui .auth-btn-wrapper .btn-done{margin-right:1em}.swagger-ui .auth-wrapper{display:flex;flex:1;justify-content:flex-end}.swagger-ui .auth-wrapper .authorize{margin-left:10px;margin-right:10px;padding-right:20px}.swagger-ui .auth-container{border-bottom:1px solid #ebebeb;margin:0 0 10px;padding:10px 20px}.swagger-ui .auth-container:last-of-type{border:0;margin:0;padding:10px 20px}.swagger-ui .auth-container h4{margin:5px 0 15px!important}.swagger-ui .auth-container .wrapper{margin:0;padding:0}.swagger-ui .auth-container input[type=password],.swagger-ui .auth-container input[type=text]{min-width:230px}.swagger-ui .auth-container .errors{background-color:#fee;border-radius:4px;color:red;color:#3b4151;font-family:monospace;font-size:12px;font-weight:600;margin:1em;padding:10px}.swagger-ui .auth-container .errors b{margin-right:1em;text-transform:capitalize}.swagger-ui .scopes h2{color:#3b4151;font-family:sans-serif;font-size:14px}.swagger-ui .scopes h2 a{color:#4990e2;cursor:pointer;font-size:12px;padding-left:10px;text-decoration:underline}.swagger-ui .scope-def{padding:0 0 20px}.swagger-ui .errors-wrapper{-webkit-animation:scaleUp .5s;animation:scaleUp .5s;background:rgba(249,62,62,.1);border:2px solid #f93e3e;border-radius:4px;margin:20px;padding:10px 20px}.swagger-ui .errors-wrapper .error-wrapper{margin:0 0 10px}.swagger-ui .errors-wrapper .errors h4{color:#3b4151;font-family:monospace;font-size:14px;font-weight:600;margin:0}.swagger-ui .errors-wrapper .errors small{color:#606060}.swagger-ui .errors-wrapper .errors .message{white-space:pre-line}.swagger-ui .errors-wrapper .errors .message.thrown{max-width:100%}.swagger-ui .errors-wrapper .errors .error-line{cursor:pointer;text-decoration:underline}.swagger-ui .errors-wrapper hgroup{align-items:center;display:flex}.swagger-ui .errors-wrapper hgroup h4{color:#3b4151;flex:1;font-family:sans-serif;font-size:20px;margin:0}@-webkit-keyframes scaleUp{0%{opacity:0;transform:scale(.8)}to{opacity:1;transform:scale(1)}}@keyframes scaleUp{0%{opacity:0;transform:scale(.8)}to{opacity:1;transform:scale(1)}}.swagger-ui .Resizer.vertical.disabled{display:none}.swagger-ui .markdown p,.swagger-ui .markdown pre,.swagger-ui .renderedMarkdown p,.swagger-ui .renderedMarkdown pre{margin:1em auto;word-break:break-all;word-break:break-word}.swagger-ui .markdown pre,.swagger-ui .renderedMarkdown pre{background:none;color:#000;font-weight:400;padding:0;white-space:pre-wrap}.swagger-ui .markdown code,.swagger-ui .renderedMarkdown code{background:rgba(0,0,0,.05);border-radius:4px;color:#9012fe;font-family:monospace;font-size:14px;font-weight:600;padding:5px 7px}.swagger-ui .markdown pre>code,.swagger-ui .renderedMarkdown pre>code{display:block} + +/*# sourceMappingURL=swagger-ui.css.map*/ \ No newline at end of file diff --git a/themes/yunohost-docs/js/openapi.js b/themes/yunohost-docs/js/openapi.js new file mode 100644 index 00000000..97daa220 --- /dev/null +++ b/themes/yunohost-docs/js/openapi.js @@ -0,0 +1 @@ +var openapiJSON = {"openapi": "3.0.3", "info": {"title": "YunoHost API", "description": "This is the YunoHost API used on all YunoHost instances. This API is essentially used by YunoHost Webadmin.", "version": "11.0.7"}, "servers": [{"url": "https://{domain}/yunohost/api", "variables": {"domain": {"default": "demo.yunohost.org", "description": "Your yunohost domain"}}}], "tags": [{"name": "public", "description": "Public route"}, {"name": "user", "description": "Manage users and groups"}, {"name": "user group", "description": "Manage user groups"}, {"name": "user permission", "description": "Manage permissions"}, {"name": "user ssh", "description": "Manage ssh access"}, {"name": "domain", "description": "Manage domains"}, {"name": "domain config", "description": "Domain settings"}, {"name": "domain dns", "description": "Manage domains DNS"}, {"name": "domain cert", "description": "Manage domain certificates"}, {"name": "app", "description": "Manage apps"}, {"name": "app action", "description": "Handle apps actions"}, {"name": "app config", "description": "Applications configuration panel"}, {"name": "backup", "description": "Manage backups"}, {"name": "settings", "description": "Manage YunoHost global settings"}, {"name": "service", "description": "Manage services"}, {"name": "firewall", "description": "Manage firewall rules"}, {"name": "dyndns", "description": "Subscribe and Update DynDNS Hosts"}, {"name": "tools", "description": "Specific tools"}, {"name": "tools migrations", "description": "Manage migrations"}, {"name": "hook", "description": "Manage hooks"}, {"name": "log", "description": "Manage debug logs"}, {"name": "diagnosis", "description": "Look for possible issues on the server"}], "paths": {"/login": {"post": {"tags": ["public"], "summary": "Logs in and returns the authentication cookie", "parameters": [{"name": "X-Requested-With", "in": "header", "required": true, "schema": {"type": "string", "default": "Swagger API"}}], "requestBody": {"required": true, "content": {"multipart/form-data": {"schema": {"type": "object", "properties": {"credentials": {"type": "string", "format": "password"}}, "required": ["credentials"]}}}}, "security": [], "responses": {"200": {"description": "Successfully login", "headers": {"Set-Cookie": {"schema": {"type": "string"}}}}}}}, "/installed": {"get": {"tags": ["public"], "summary": "Test if the API is working", "parameters": [], "security": [], "responses": {"200": {"description": "Successfully working"}}}}, "/users": {"get": {"tags": ["user"], "operationId": "user_list", "summary": "List users", "description": "", "responses": {"200": {"description": "successful operation"}}, "parameters": [{"name": "fields", "in": "query", "description": "fields to fetch (username, fullname, mail, mail-alias, mail-forward, mailbox-quota, groups, shell, home-path)", "required": true, "schema": {"type": "array"}, "explode": true}]}, "post": {"tags": ["user"], "operationId": "user_create", "summary": "Create user", "description": "", "responses": {"200": {"description": "successful operation"}}, "parameters": [{"name": "X-Requested-With", "in": "header", "required": true, "schema": {"type": "string", "default": "Swagger API"}}], "requestBody": {"required": true, "content": {"multipart/form-data": {"schema": {"type": "object", "properties": {"username": {"type": "string", "description": "The unique username to create"}, "firstname": {"type": "string", "description": ""}, "lastname": {"type": "string", "description": ""}, "password": {"type": "string", "description": "User password"}, "domain": {"type": "string", "description": "Domain for the email address and xmpp account"}, "mailbox_quota": {"type": "string", "description": "Mailbox size quota", "default": "0"}}, "required": ["username"]}}}}}}, "/users/": {"delete": {"tags": ["user"], "operationId": "user_delete", "summary": "Delete user", "description": "", "responses": {"200": {"description": "successful operation"}}, "parameters": [{"name": "username", "in": "query", "description": "Username to delete", "required": true, "schema": {"type": "string"}, "explode": false}, {"name": "purge", "in": "query", "description": "Purge user's home and mail directories", "required": false, "schema": {"type": "boolean"}, "explode": false}]}, "put": {"tags": ["user"], "operationId": "user_update", "summary": "Update user informations", "description": "", "responses": {"200": {"description": "successful operation"}}, "parameters": [], "requestBody": {"required": true, "content": {"multipart/form-data": {"schema": {"type": "object", "properties": {"username": {"type": "string", "description": "Username to update"}, "firstname": {"type": "string", "description": ""}, "lastname": {"type": "string", "description": ""}, "mail": {"type": "string", "description": ""}, "change_password": {"type": "string", "description": "New password to set", "format": "password"}, "add_mailforward": {"type": "array", "description": "Mailforward addresses to add", "format": "mail"}, "remove_mailforward": {"type": "array", "description": "Mailforward addresses to remove", "format": "mail"}, "add_mailalias": {"type": "array", "description": "Mail aliases to add", "format": "mail"}, "remove_mailalias": {"type": "array", "description": "Mail aliases to remove", "format": "mail"}, "mailbox_quota": {"type": "string", "description": "Mailbox size quota"}}, "required": ["username"]}}}}}, "get": {"tags": ["user"], "operationId": "user_info", "summary": "Get user information", "description": "", "responses": {"200": {"description": "successful operation"}}, "parameters": [{"name": "username", "in": "query", "description": "Username or email to get information", "required": true, "schema": {"type": "string"}, "explode": false}]}}, "/users/export": {"get": {"tags": ["user"], "operationId": "user_export", "summary": "Export users into CSV", "description": "", "responses": {"200": {"description": "successful operation"}}, "parameters": []}}, "/users/import": {"post": {"tags": ["user"], "operationId": "user_import", "summary": "Import several users from CSV", "description": "", "responses": {"200": {"description": "successful operation"}}, "parameters": [{"name": "X-Requested-With", "in": "header", "required": true, "schema": {"type": "string", "default": "Swagger API"}}], "requestBody": {"required": true, "content": {"multipart/form-data": {"schema": {"type": "object", "properties": {"csvfile": {"type": "file", "description": "CSV file with columns username, firstname, lastname, password, mail, mailbox-quota, mail-alias, mail-forward, groups (separated by coma)"}, "update": {"type": "boolean", "description": "Update all existing users contained in the CSV file (by default existing users are ignored)"}, "delete": {"type": "boolean", "description": "Delete all existing users that are not contained in the CSV file (by default existing users are kept)"}}, "required": ["csvfile"]}}}}}}, "/users/groups": {"get": {"tags": ["user group"], "operationId": "user group_list", "summary": "List existing groups", "description": "", "responses": {"200": {"description": "successful operation"}}, "parameters": [{"name": "short", "in": "query", "description": "List only the names of groups", "required": false, "schema": {"type": "boolean"}, "explode": false}, {"name": "full", "in": "query", "description": "Display all informations known about each groups", "required": false, "schema": {"type": "boolean"}, "explode": false}, {"name": "include_primary_groups", "in": "query", "description": "Also display primary groups (each user has an eponym group that only contains itself)", "required": false, "schema": {"type": "boolean", "default": false}, "explode": false}]}, "post": {"tags": ["user group"], "operationId": "user group_create", "summary": "Create group", "description": "", "responses": {"200": {"description": "successful operation"}}, "parameters": [{"name": "X-Requested-With", "in": "header", "required": true, "schema": {"type": "string", "default": "Swagger API"}}], "requestBody": {"required": true, "content": {"multipart/form-data": {"schema": {"type": "object", "properties": {"groupname": {"type": "string", "description": "Name of the group to be created"}}, "required": ["groupname"]}}}}}}, "/users/groups/": {"delete": {"tags": ["user group"], "operationId": "user group_delete", "summary": "Delete group", "description": "", "responses": {"200": {"description": "successful operation"}}, "parameters": [{"name": "groupname", "in": "query", "description": "Name of the group to be deleted", "required": true, "schema": {"type": "string"}, "explode": false}]}, "get": {"tags": ["user group"], "operationId": "user group_info", "summary": "Get information about a specific group", "description": "", "responses": {"200": {"description": "successful operation"}}, "parameters": [{"name": "groupname", "in": "query", "description": "Name of the group to fetch info about", "required": true, "schema": {"type": "string"}, "explode": false}]}}, "/users/groups//add/": {"put": {"tags": ["user group"], "operationId": "user group_add", "summary": "Add users to group", "description": "", "responses": {"200": {"description": "successful operation"}}, "parameters": [], "requestBody": {"required": true, "content": {"multipart/form-data": {"schema": {"type": "object", "properties": {"groupname": {"type": "string", "description": "Name of the group to add user(s) to"}, "usernames": {"type": "array", "description": "User(s) to add in the group"}}, "required": ["groupname"]}}}}}}, "/users/groups//remove/": {"put": {"tags": ["user group"], "operationId": "user group_remove", "summary": "Remove users from group", "description": "", "responses": {"200": {"description": "successful operation"}}, "parameters": [], "requestBody": {"required": true, "content": {"multipart/form-data": {"schema": {"type": "object", "properties": {"groupname": {"type": "string", "description": "Name of the group to remove user(s) from"}, "usernames": {"type": "array", "description": "User(s) to remove from the group"}}, "required": ["groupname"]}}}}}}, "/users/permissions": {"get": {"tags": ["user permission"], "operationId": "user permission_list", "summary": "List permissions and corresponding accesses", "description": "", "responses": {"200": {"description": "successful operation"}}, "parameters": [{"name": "apps", "in": "query", "description": "Apps to list permission for (all by default)", "required": false, "schema": {"type": "array"}, "explode": true}, {"name": "short", "in": "query", "description": "Only list permission names", "required": false, "schema": {"type": "boolean"}, "explode": false}, {"name": "full", "in": "query", "description": "Display all info known about each permission, including the full user list of each group it is granted to.", "required": false, "schema": {"type": "boolean"}, "explode": false}]}}, "/users/permissions/": {"get": {"tags": ["user permission"], "operationId": "user permission_info", "summary": "Get information about a specific permission", "description": "", "responses": {"200": {"description": "successful operation"}}, "parameters": [{"name": "permission", "in": "query", "description": "Name of the permission to fetch info about (use \"yunohost user permission list\" and \"yunohost user permission -f\" to see all the current permissions)", "required": true, "schema": {"type": "string"}, "explode": false}]}, "put": {"tags": ["user permission"], "operationId": "user permission_update", "summary": "Manage group or user permissions", "description": "", "responses": {"200": {"description": "successful operation"}}, "parameters": [], "requestBody": {"required": true, "content": {"multipart/form-data": {"schema": {"type": "object", "properties": {"permission": {"type": "string", "description": "Permission to manage (e.g. mail or nextcloud or wordpress.editors) (use \"yunohost user permission list\" and \"yunohost user permission -f\" to see all the current permissions)"}, "label": {"type": "string", "description": "Label for this permission. This label will be shown on the SSO and in the admin"}, "show_tile": {"type": "string", "description": "Define if a tile will be shown in the SSO", "enum": ["True", "False"]}}, "required": ["permission"]}}}}}, "delete": {"tags": ["user permission"], "operationId": "user permission_reset", "summary": "Reset allowed groups to the default (all_users) for a given permission", "description": "", "responses": {"200": {"description": "successful operation"}}, "parameters": [{"name": "permission", "in": "query", "description": "Permission to manage (e.g. mail or nextcloud or wordpress.editors) (use \"yunohost user permission list\" and \"yunohost user permission -f\" to see all the current permissions)", "required": true, "schema": {"type": "string"}, "explode": false}]}}, "/users/permissions//add/": {"put": {"tags": ["user permission"], "operationId": "user permission_add", "summary": "Grant permission to group or user", "description": "", "responses": {"200": {"description": "successful operation"}}, "parameters": [], "requestBody": {"required": true, "content": {"multipart/form-data": {"schema": {"type": "object", "properties": {"permission": {"type": "string", "description": "Permission to manage (e.g. mail or nextcloud or wordpress.editors) (use \"yunohost user permission list\" and \"yunohost user permission -f\" to see all the current permissions)"}, "names": {"type": "array", "description": "Group or usernames to grant this permission to"}}, "required": ["permission"]}}}}}}, "/users/permissions//remove/": {"put": {"tags": ["user permission"], "operationId": "user permission_remove", "summary": "Revoke permission to group or user", "description": "", "responses": {"200": {"description": "successful operation"}}, "parameters": [], "requestBody": {"required": true, "content": {"multipart/form-data": {"schema": {"type": "object", "properties": {"permission": {"type": "string", "description": "Permission to manage (e.g. mail or nextcloud or wordpress.editors) (use \"yunohost user permission list\" and \"yunohost user permission -f\" to see all the current permissions)"}, "names": {"type": "array", "description": "Group or usernames to revoke this permission to"}}, "required": ["permission"]}}}}}}, "/users/ssh/keys": {"get": {"tags": ["user ssh"], "operationId": "user ssh_list-keys", "summary": "Show user's authorized ssh keys", "description": "", "responses": {"200": {"description": "successful operation"}}, "parameters": [{"name": "username", "in": "query", "description": "Username of the user", "required": true, "schema": {"type": "string"}, "explode": false}]}}, "/users/ssh/key": {"post": {"tags": ["user ssh"], "operationId": "user ssh_add-key", "summary": "Add a new authorized ssh key for this user", "description": "", "responses": {"200": {"description": "successful operation"}}, "parameters": [{"name": "X-Requested-With", "in": "header", "required": true, "schema": {"type": "string", "default": "Swagger API"}}], "requestBody": {"required": true, "content": {"multipart/form-data": {"schema": {"type": "object", "properties": {"username": {"type": "string", "description": "Username of the user"}, "key": {"type": "string", "description": "The key to be added"}, "comment": {"type": "string", "description": "Optional comment about the key"}}, "required": ["username", "key"]}}}}}, "delete": {"tags": ["user ssh"], "operationId": "user ssh_remove-key", "summary": "Remove an authorized ssh key for this user", "description": "", "responses": {"200": {"description": "successful operation"}}, "parameters": [{"name": "username", "in": "query", "description": "Username of the user", "required": true, "schema": {"type": "string"}, "explode": false}, {"name": "key", "in": "query", "description": "The key to be removed", "required": true, "schema": {"type": "string"}, "explode": false}]}}, "/domains": {"get": {"tags": ["domain"], "operationId": "domain_list", "summary": "List domains", "description": "", "responses": {"200": {"description": "successful operation"}}, "parameters": [{"name": "exclude_subdomains", "in": "query", "description": "Filter out domains that are obviously subdomains of other declared domains", "required": false, "schema": {"type": "boolean"}, "explode": false}]}, "post": {"tags": ["domain"], "operationId": "domain_add", "summary": "Create a custom domain", "description": "", "responses": {"200": {"description": "successful operation"}}, "parameters": [{"name": "X-Requested-With", "in": "header", "required": true, "schema": {"type": "string", "default": "Swagger API"}}], "requestBody": {"required": true, "content": {"multipart/form-data": {"schema": {"type": "object", "properties": {"domain": {"type": "string", "description": "Domain name to add"}, "dyndns": {"type": "boolean", "description": "Subscribe to the DynDNS service"}}, "required": ["domain"]}}}}}}, "/domains/": {"delete": {"tags": ["domain"], "operationId": "domain_remove", "summary": "Delete domains", "description": "", "responses": {"200": {"description": "successful operation"}}, "parameters": [{"name": "domain", "in": "query", "description": "Domain to delete", "required": true, "schema": {"type": "string"}, "explode": false}, {"name": "remove_apps", "in": "query", "description": "Remove apps installed on the domain", "required": false, "schema": {"type": "boolean"}, "explode": false}, {"name": "force", "in": "query", "description": "Do not ask confirmation to remove apps", "required": false, "schema": {"type": "boolean"}, "explode": false}]}}, "/domains/main": {"get": {"tags": ["domain"], "operationId": "domain_main-domain", "summary": "Check the current main domain, or change it", "description": "", "responses": {"200": {"description": "successful operation"}}, "parameters": [{"name": "new_main_domain", "in": "query", "description": "Change the current main domain", "required": false, "schema": {"type": "string"}, "explode": false}]}}, "/domains//main": {"put": {"tags": ["domain"], "operationId": "domain_main-domain_1", "summary": "Check the current main domain, or change it", "description": "", "responses": {"200": {"description": "successful operation"}}, "parameters": [], "requestBody": {"required": true, "content": {"multipart/form-data": {"schema": {"type": "object", "properties": {"new_main_domain": {"type": "string", "description": "Change the current main domain"}}, "required": []}}}}}}, "/domain//urlavailable": {"get": {"tags": ["domain"], "operationId": "domain_url-available", "summary": "Check availability of a web path", "description": "", "responses": {"200": {"description": "successful operation"}}, "parameters": [{"name": "domain", "in": "query", "description": "The domain for the web path (e.g. your.domain.tld)", "required": true, "schema": {"type": "string"}, "explode": false}, {"name": "path", "in": "query", "description": "The path to check (e.g. /coffee)", "required": true, "schema": {"type": "string"}, "explode": false}]}}, "/domains//config": {"get": {"tags": ["domain config"], "operationId": "domain config_get", "summary": "Display a domain configuration", "description": "", "responses": {"200": {"description": "successful operation"}}, "parameters": [{"name": "domain", "in": "query", "description": "Domain name", "required": true, "schema": {"type": "string"}, "explode": false}, {"name": "key", "in": "query", "description": "A specific panel, section or a question identifier", "required": false, "schema": {"type": "string"}, "explode": false}, {"name": "full", "in": "query", "description": "Display all details (meant to be used by the API)", "required": false, "schema": {"type": "boolean"}, "explode": false}, {"name": "export", "in": "query", "description": "Only export key/values, meant to be reimported using \"config set --args-file\"", "required": false, "schema": {"type": "boolean"}, "explode": false}]}, "put": {"tags": ["domain config"], "operationId": "domain config_set", "summary": "Apply a new configuration", "description": "", "responses": {"200": {"description": "successful operation"}}, "parameters": [], "requestBody": {"required": true, "content": {"multipart/form-data": {"schema": {"type": "object", "properties": {"domain": {"type": "string", "description": "Domain name"}, "key": {"type": "string", "description": "The question or form key"}, "value": {"type": "string", "description": "new value"}, "args": {"type": "string", "description": "Serialized arguments for new configuration (i.e. \"mail_in=0&mail_out=0\")"}}, "required": ["domain"]}}}}}}, "/domains//dns": {"get": {"tags": ["domain dns"], "operationId": "domain dns_suggest", "summary": "Generate sample DNS configuration for a domain", "description": "", "responses": {"200": {"description": "successful operation"}}, "parameters": [{"name": "domain", "in": "query", "description": "Target domain", "required": true, "schema": {"type": "string"}, "explode": false}]}}, "/domains//dns/suggest": {"get": {"tags": ["domain dns"], "operationId": "domain dns_suggest_1", "summary": "Generate sample DNS configuration for a domain", "description": "", "responses": {"200": {"description": "successful operation"}}, "parameters": [{"name": "domain", "in": "query", "description": "Target domain", "required": true, "schema": {"type": "string"}, "explode": false}]}}, "/domains//dns/push": {"post": {"tags": ["domain dns"], "operationId": "domain dns_push", "summary": "Push DNS records to registrar", "description": "", "responses": {"200": {"description": "successful operation"}}, "parameters": [{"name": "X-Requested-With", "in": "header", "required": true, "schema": {"type": "string", "default": "Swagger API"}}], "requestBody": {"required": true, "content": {"multipart/form-data": {"schema": {"type": "object", "properties": {"domain": {"type": "string", "description": "Domain name to push DNS conf for"}, "dry_run": {"type": "boolean", "description": "Only display what's to be pushed"}, "force": {"type": "boolean", "description": "Also update/remove records which were not originally set by Yunohost, or which have been manually modified"}, "purge": {"type": "boolean", "description": "Delete all records"}}, "required": ["domain"]}}}}}}, "/domains//cert": {"get": {"tags": ["domain cert"], "operationId": "domain cert_status", "summary": "List status of current certificates (all by default).", "description": "", "responses": {"200": {"description": "successful operation"}}, "parameters": [{"name": "domain_list", "in": "query", "description": "Domains to check", "required": false, "schema": {"type": "array"}, "explode": true}, {"name": "full", "in": "query", "description": "Show more details", "required": false, "schema": {"type": "boolean"}, "explode": false}]}, "put": {"tags": ["domain cert"], "operationId": "domain cert_install", "summary": "Install Let's Encrypt certificates for given domains (all by default).", "description": "", "responses": {"200": {"description": "successful operation"}}, "parameters": [], "requestBody": {"required": true, "content": {"multipart/form-data": {"schema": {"type": "object", "properties": {"domain_list": {"type": "array", "description": "Domains for which to install the certificates"}, "force": {"type": "boolean", "description": "Install even if current certificate is not self-signed"}, "no_checks": {"type": "boolean", "description": "Does not perform any check that your domain seems correctly configured (DNS, reachability) before attempting to install. (Not recommended)"}, "self_signed": {"type": "boolean", "description": "Install self-signed certificate instead of Let's Encrypt"}}, "required": []}}}}}}, "/domains//cert/renew": {"put": {"tags": ["domain cert"], "operationId": "domain cert_renew", "summary": "Renew the Let's Encrypt certificates for given domains (all by default).", "description": "", "responses": {"200": {"description": "successful operation"}}, "parameters": [], "requestBody": {"required": true, "content": {"multipart/form-data": {"schema": {"type": "object", "properties": {"domain_list": {"type": "array", "description": "Domains for which to renew the certificates"}, "force": {"type": "boolean", "description": "Ignore the validity threshold (30 days)"}, "email": {"type": "boolean", "description": "Send an email to root with logs if some renewing fails"}, "no_checks": {"type": "boolean", "description": "Does not perform any check that your domain seems correctly configured (DNS, reachability) before attempting to renew. (Not recommended)"}}, "required": []}}}}}}, "/apps/catalog": {"get": {"tags": ["app"], "operationId": "app_catalog", "summary": "Show the catalog of installable application", "description": "", "responses": {"200": {"description": "successful operation"}}, "parameters": [{"name": "full", "in": "query", "description": "Display all details, including the app manifest and various other infos", "required": false, "schema": {"type": "boolean"}, "explode": false}, {"name": "with_categories", "in": "query", "description": "Also return a list of app categories", "required": false, "schema": {"type": "boolean"}, "explode": false}]}}, "/apps/manifest": {"get": {"tags": ["app"], "operationId": "app_manifest", "summary": "Return the manifest of a given app from the catalog, or from a remote git repo", "description": "", "responses": {"200": {"description": "successful operation"}}, "parameters": [{"name": "app", "in": "query", "description": "Name, local path or git URL of the app to fetch the manifest of", "required": true, "schema": {"type": "string"}, "explode": false}]}}, "/apps": {"get": {"tags": ["app"], "operationId": "app_list", "summary": "List installed apps", "description": "", "responses": {"200": {"description": "successful operation"}}, "parameters": [{"name": "full", "in": "query", "description": "Display all details, including the app manifest and various other infos", "required": false, "schema": {"type": "boolean"}, "explode": false}, {"name": "upgradable", "in": "query", "description": "List only apps that can upgrade to a newer version", "required": false, "schema": {"type": "boolean"}, "explode": false}]}, "post": {"tags": ["app"], "operationId": "app_install", "summary": "Install apps", "description": "", "responses": {"200": {"description": "successful operation"}}, "parameters": [{"name": "X-Requested-With", "in": "header", "required": true, "schema": {"type": "string", "default": "Swagger API"}}], "requestBody": {"required": true, "content": {"multipart/form-data": {"schema": {"type": "object", "properties": {"app": {"type": "string", "description": "Name, local path or git URL of the app to install"}, "label": {"type": "string", "description": "Custom name for the app"}, "args": {"type": "string", "description": "Serialized arguments for app script (i.e. \"domain=domain.tld&path=/path\")"}, "no_remove_on_failure": {"type": "boolean", "description": "Debug option to avoid removing the app on a failed installation"}, "force": {"type": "boolean", "description": "Do not ask confirmation if the app is not safe to use (low quality, experimental or 3rd party)"}}, "required": ["app"]}}}}}}, "/apps/": {"get": {"tags": ["app"], "operationId": "app_info", "summary": "Show infos about a specific installed app", "description": "", "responses": {"200": {"description": "successful operation"}}, "parameters": [{"name": "app", "in": "query", "description": "Specific app ID", "required": true, "schema": {"type": "string"}, "explode": false}, {"name": "full", "in": "query", "description": "Display all details, including the app manifest and various other infos", "required": false, "schema": {"type": "boolean"}, "explode": false}]}, "delete": {"tags": ["app"], "operationId": "app_remove", "summary": "Remove app", "description": "", "responses": {"200": {"description": "successful operation"}}, "parameters": [{"name": "app", "in": "query", "description": "App to remove", "required": true, "schema": {"type": "string"}, "explode": false}, {"name": "purge", "in": "query", "description": "Also remove all application data", "required": false, "schema": {"type": "boolean"}, "explode": false}]}}, "/apps/map": {"get": {"tags": ["app"], "operationId": "app_map", "summary": "Show the mapping between urls and apps", "description": "", "responses": {"200": {"description": "successful operation"}}, "parameters": [{"name": "app", "in": "query", "description": "Specific app to map", "required": false, "schema": {"type": "string"}, "explode": false}, {"name": "raw", "in": "query", "description": "Return complete dict", "required": false, "schema": {"type": "boolean"}, "explode": false}, {"name": "user", "in": "query", "description": "Allowed app map for a user", "required": false, "schema": {"type": "string"}, "explode": false}]}}, "/apps//upgrade": {"put": {"tags": ["app"], "operationId": "app_upgrade", "summary": "Upgrade app", "description": "", "responses": {"200": {"description": "successful operation"}}, "parameters": [], "requestBody": {"required": true, "content": {"multipart/form-data": {"schema": {"type": "object", "properties": {"app": {"type": "array", "description": "App(s) to upgrade (default all)"}, "url": {"type": "string", "description": "Git url to fetch for upgrade"}, "file": {"type": "string", "description": "Folder or tarball for upgrade"}, "force": {"type": "boolean", "description": "Force the update, even though the app is up to date"}, "no_safety_backup": {"type": "boolean", "description": "Disable the safety backup during upgrade"}}, "required": []}}}}}}, "/apps//changeurl": {"put": {"tags": ["app"], "operationId": "app_change-url", "summary": "Change app's URL", "description": "", "responses": {"200": {"description": "successful operation"}}, "parameters": [], "requestBody": {"required": true, "content": {"multipart/form-data": {"schema": {"type": "object", "properties": {"app": {"type": "string", "description": "Target app instance name"}, "domain": {"type": "string", "description": "New app domain on which the application will be moved"}, "path": {"type": "string", "description": "New path at which the application will be moved"}}, "required": ["app"]}}}}}}, "/apps//settings": {"get": {"tags": ["app"], "operationId": "app_setting", "summary": "Set or get an app setting value", "description": "", "responses": {"200": {"description": "successful operation"}}, "parameters": [{"name": "app", "in": "query", "description": "App ID", "required": true, "schema": {"type": "string"}, "explode": false}, {"name": "key", "in": "query", "description": "Key to get/set", "required": true, "schema": {"type": "string"}, "explode": false}, {"name": "value", "in": "query", "description": "Value to set", "required": false, "schema": {"type": "string"}, "explode": false}, {"name": "delete", "in": "query", "description": "Delete the key", "required": false, "schema": {"type": "boolean"}, "explode": false}]}}, "/apps//default": {"put": {"tags": ["app"], "operationId": "app_makedefault", "summary": "Redirect domain root to an app", "description": "", "responses": {"200": {"description": "successful operation"}}, "parameters": [], "requestBody": {"required": true, "content": {"multipart/form-data": {"schema": {"type": "object", "properties": {"app": {"type": "string", "description": "App name to put on domain root"}, "domain": {"type": "string", "description": "Specific domain to put app on (the app domain by default)"}, "undo": {"type": "boolean", "description": "Undo redirection"}}, "required": ["app"]}}}}}}, "/apps//label": {"put": {"tags": ["app"], "operationId": "app_change-label", "summary": "Change app label", "description": "", "responses": {"200": {"description": "successful operation"}}, "parameters": [], "requestBody": {"required": true, "content": {"multipart/form-data": {"schema": {"type": "object", "properties": {"app": {"type": "string", "description": "App ID"}, "new_label": {"type": "string", "description": "New app label"}}, "required": ["app", "new_label"]}}}}}}, "/apps//actions": {"get": {"tags": ["app action"], "operationId": "app action_list", "summary": "List app actions", "description": "", "responses": {"200": {"description": "successful operation"}}, "parameters": [{"name": "app", "in": "query", "description": "App name", "required": true, "schema": {"type": "string"}, "explode": false}]}}, "/apps//actions/": {"put": {"tags": ["app action"], "operationId": "app action_run", "summary": "Run app action", "description": "", "responses": {"200": {"description": "successful operation"}}, "parameters": [], "requestBody": {"required": true, "content": {"multipart/form-data": {"schema": {"type": "object", "properties": {"app": {"type": "string", "description": "App name"}, "action": {"type": "string", "description": "action id"}, "args": {"type": "string", "description": "Serialized arguments for app script (i.e. \"domain=domain.tld&path=/path\")"}}, "required": ["app", "action"]}}}}}}, "/apps//config-panel": {"get": {"tags": ["app config"], "operationId": "app config_get", "summary": "Display an app configuration", "description": "", "responses": {"200": {"description": "successful operation"}}, "parameters": [{"name": "app", "in": "query", "description": "App name", "required": true, "schema": {"type": "string"}, "explode": false}, {"name": "key", "in": "query", "description": "A specific panel, section or a question identifier", "required": false, "schema": {"type": "string"}, "explode": false}, {"name": "full", "in": "query", "description": "Display all details (meant to be used by the API)", "required": false, "schema": {"type": "boolean"}, "explode": false}, {"name": "export", "in": "query", "description": "Only export key/values, meant to be reimported using \"config set --args-file\"", "required": false, "schema": {"type": "boolean"}, "explode": false}]}}, "/apps//config": {"put": {"tags": ["app config"], "operationId": "app config_set", "summary": "Apply a new configuration", "description": "", "responses": {"200": {"description": "successful operation"}}, "parameters": [], "requestBody": {"required": true, "content": {"multipart/form-data": {"schema": {"type": "object", "properties": {"app": {"type": "string", "description": "App name"}, "key": {"type": "string", "description": "The question or panel key"}, "value": {"type": "string", "description": "new value"}, "args": {"type": "string", "description": "Serialized arguments for new configuration (i.e. \"domain=domain.tld&path=/path\")"}, "args_file": {"type": "file", "description": "YAML or JSON file with key/value couples"}}, "required": ["app"]}}}}}}, "/backups": {"post": {"tags": ["backup"], "operationId": "backup_create", "summary": "Create a backup local archive. If neither --apps or --system are given, this will backup all apps and all system parts. If only --apps if given, this will only backup apps and no system parts. Similarly, if only --system is given, this will only backup system parts and no apps.", "description": "", "responses": {"200": {"description": "successful operation"}}, "parameters": [{"name": "X-Requested-With", "in": "header", "required": true, "schema": {"type": "string", "default": "Swagger API"}}], "requestBody": {"required": true, "content": {"multipart/form-data": {"schema": {"type": "object", "properties": {"name": {"type": "string", "description": "Name of the backup archive"}, "description": {"type": "string", "description": "Short description of the backup"}, "output_directory": {"type": "string", "description": "Output directory for the backup"}, "methods": {"type": "array", "description": "List of backup methods to apply (copy or tar by default)"}, "system": {"type": "array", "description": "List of system parts to backup (or all if none given)."}, "apps": {"type": "array", "description": "List of application names to backup (or all if none given)"}, "dry_run": {"type": "boolean", "description": "'Simulate' the backup and return the size details per item to backup"}}, "required": []}}}}}, "get": {"tags": ["backup"], "operationId": "backup_list", "summary": "List available local backup archives", "description": "", "responses": {"200": {"description": "successful operation"}}, "parameters": [{"name": "with_info", "in": "query", "description": "Show backup information for each archive", "required": false, "schema": {"type": "boolean"}, "explode": false}, {"name": "human_readable", "in": "query", "description": "Print sizes in human readable format", "required": false, "schema": {"type": "boolean"}, "explode": false}]}}, "/backups//restore": {"put": {"tags": ["backup"], "operationId": "backup_restore", "summary": "Restore from a local backup archive. If neither --apps or --system are given, this will restore all apps and all system parts in the archive. If only --apps if given, this will only restore apps and no system parts. Similarly, if only --system is given, this will only restore system parts and no apps.", "description": "", "responses": {"200": {"description": "successful operation"}}, "parameters": [], "requestBody": {"required": true, "content": {"multipart/form-data": {"schema": {"type": "object", "properties": {"name": {"type": "string", "description": "Name of the local backup archive"}, "system": {"type": "array", "description": "List of system parts to restore (or all if none is given)"}, "apps": {"type": "array", "description": "List of application names to restore (or all if none is given)"}, "force": {"type": "boolean", "description": "Force restauration on an already installed system"}}, "required": ["name"]}}}}}}, "/backups/": {"get": {"tags": ["backup"], "operationId": "backup_info", "summary": "Show info about a local backup archive", "description": "", "responses": {"200": {"description": "successful operation"}}, "parameters": [{"name": "name", "in": "query", "description": "Name of the local backup archive", "required": true, "schema": {"type": "string"}, "explode": false}, {"name": "with_details", "in": "query", "description": "Show additional backup information", "required": false, "schema": {"type": "boolean"}, "explode": false}, {"name": "human_readable", "in": "query", "description": "Print sizes in human readable format", "required": false, "schema": {"type": "boolean"}, "explode": false}]}, "delete": {"tags": ["backup"], "operationId": "backup_delete", "summary": "Delete a backup archive", "description": "", "responses": {"200": {"description": "successful operation"}}, "parameters": [{"name": "name", "in": "query", "description": "Name of the archive to delete", "required": true, "schema": {"type": "string"}, "explode": false}]}}, "/backups//download": {"get": {"tags": ["backup"], "operationId": "backup_download", "summary": "(API only) Request to download the file", "description": "", "responses": {"200": {"description": "successful operation"}}, "parameters": [{"name": "name", "in": "query", "description": "Name of the local backup archive", "required": true, "schema": {"type": "string"}, "explode": false}]}}, "/settings": {"get": {"tags": ["settings"], "operationId": "settings_list", "summary": "list all entries of the settings", "description": "", "responses": {"200": {"description": "successful operation"}}, "parameters": []}, "delete": {"tags": ["settings"], "operationId": "settings_reset-all", "summary": "reset all settings to their default value", "description": "", "responses": {"200": {"description": "successful operation"}}, "parameters": []}}, "/settings/": {"get": {"tags": ["settings"], "operationId": "settings_get", "summary": "get an entry value in the settings", "description": "", "responses": {"200": {"description": "successful operation"}}, "parameters": [{"name": "key", "in": "query", "description": "Settings key", "required": true, "schema": {"type": "string"}, "explode": false}, {"name": "full", "in": "query", "description": "Show more details", "required": false, "schema": {"type": "boolean"}, "explode": false}]}, "post": {"tags": ["settings"], "operationId": "settings_set", "summary": "set an entry value in the settings", "description": "", "responses": {"200": {"description": "successful operation"}}, "parameters": [{"name": "X-Requested-With", "in": "header", "required": true, "schema": {"type": "string", "default": "Swagger API"}}], "requestBody": {"required": true, "content": {"multipart/form-data": {"schema": {"type": "object", "properties": {"key": {"type": "string", "description": "Settings key"}, "value": {"type": "string", "description": "new value"}}, "required": ["key"]}}}}}, "delete": {"tags": ["settings"], "operationId": "settings_reset", "summary": "set an entry value to its default one", "description": "", "responses": {"200": {"description": "successful operation"}}, "parameters": [{"name": "key", "in": "query", "description": "Settings key", "required": true, "schema": {"type": "string"}, "explode": false}]}}, "/services//start": {"put": {"tags": ["service"], "operationId": "service_start", "summary": "Start one or more services", "description": "", "responses": {"200": {"description": "successful operation"}}, "parameters": [], "requestBody": {"required": true, "content": {"multipart/form-data": {"schema": {"type": "object", "properties": {"names": {"type": "array", "description": "Service name to start"}}, "required": ["names"]}}}}}}, "/services//stop": {"put": {"tags": ["service"], "operationId": "service_stop", "summary": "Stop one or more services", "description": "", "responses": {"200": {"description": "successful operation"}}, "parameters": [], "requestBody": {"required": true, "content": {"multipart/form-data": {"schema": {"type": "object", "properties": {"names": {"type": "array", "description": "Service name to stop"}}, "required": ["names"]}}}}}}, "/services//restart": {"put": {"tags": ["service"], "operationId": "service_restart", "summary": "Restart one or more services. If the services are not running yet, they will be started.", "description": "", "responses": {"200": {"description": "successful operation"}}, "parameters": [], "requestBody": {"required": true, "content": {"multipart/form-data": {"schema": {"type": "object", "properties": {"names": {"type": "array", "description": "Service name to restart"}}, "required": ["names"]}}}}}}, "/services//enable": {"put": {"tags": ["service"], "operationId": "service_enable", "summary": "Enable one or more services", "description": "", "responses": {"200": {"description": "successful operation"}}, "parameters": [], "requestBody": {"required": true, "content": {"multipart/form-data": {"schema": {"type": "object", "properties": {"names": {"type": "array", "description": "Service name to enable"}}, "required": ["names"]}}}}}}, "/services//disable": {"put": {"tags": ["service"], "operationId": "service_disable", "summary": "Disable one or more services", "description": "", "responses": {"200": {"description": "successful operation"}}, "parameters": [], "requestBody": {"required": true, "content": {"multipart/form-data": {"schema": {"type": "object", "properties": {"names": {"type": "array", "description": "Service name to disable"}}, "required": ["names"]}}}}}}, "/services": {"get": {"tags": ["service"], "operationId": "service_status", "summary": "Show status information about one or more services (all by default)", "description": "", "responses": {"200": {"description": "successful operation"}}, "parameters": [{"name": "names", "in": "query", "description": "Service name to show", "required": false, "schema": {"type": "array"}, "explode": true}]}}, "/services/": {"get": {"tags": ["service"], "operationId": "service_status_1", "summary": "Show status information about one or more services (all by default)", "description": "", "responses": {"200": {"description": "successful operation"}}, "parameters": [{"name": "names", "in": "query", "description": "Service name to show", "required": false, "schema": {"type": "array"}, "explode": true}]}}, "/services//log": {"get": {"tags": ["service"], "operationId": "service_log", "summary": "Log every log files of a service", "description": "", "responses": {"200": {"description": "successful operation"}}, "parameters": [{"name": "name", "in": "query", "description": "Service name to log", "required": true, "schema": {"type": "string"}, "explode": false}, {"name": "number", "in": "query", "description": "Number of lines to display", "required": false, "schema": {"type": "int", "default": 50}, "explode": false}]}}, "/firewall": {"get": {"tags": ["firewall"], "operationId": "firewall_list", "summary": "List all firewall rules", "description": "", "responses": {"200": {"description": "successful operation"}}, "parameters": [{"name": "raw", "in": "query", "description": "Return the complete YAML dict", "required": false, "schema": {"type": "boolean"}, "explode": false}, {"name": "by_ip_version", "in": "query", "description": "List rules by IP version", "required": false, "schema": {"type": "boolean"}, "explode": false}, {"name": "list_forwarded", "in": "query", "description": "List forwarded ports with UPnP", "required": false, "schema": {"type": "boolean"}, "explode": false}]}}, "/firewall//allow/": {"put": {"tags": ["firewall"], "operationId": "firewall_allow", "summary": "Allow connections on a port", "description": "", "responses": {"200": {"description": "successful operation"}}, "parameters": [], "requestBody": {"required": true, "content": {"multipart/form-data": {"schema": {"type": "object", "properties": {"protocol": {"type": "string", "description": "Protocol type to allow (TCP/UDP/Both)", "enum": ["TCP", "UDP", "Both"], "default": "TCP"}, "port": {"type": "string", "description": "Port or range of ports to open"}, "ipv4_only": {"type": "boolean", "description": "Only add a rule for IPv4 connections"}, "ipv6_only": {"type": "boolean", "description": "Only add a rule for IPv6 connections"}, "no_upnp": {"type": "boolean", "description": "Do not add forwarding of this port with UPnP"}, "no_reload": {"type": "boolean", "description": "Do not reload firewall rules"}}, "required": ["protocol", "port"]}}}}}}, "/firewall//disallow/": {"put": {"tags": ["firewall"], "operationId": "firewall_disallow", "summary": "Disallow connections on a port", "description": "", "responses": {"200": {"description": "successful operation"}}, "parameters": [], "requestBody": {"required": true, "content": {"multipart/form-data": {"schema": {"type": "object", "properties": {"protocol": {"type": "string", "description": "Protocol type to allow (TCP/UDP/Both)", "enum": ["TCP", "UDP", "Both"], "default": "TCP"}, "port": {"type": "string", "description": "Port or range of ports to close"}, "ipv4_only": {"type": "boolean", "description": "Only remove the rule for IPv4 connections"}, "ipv6_only": {"type": "boolean", "description": "Only remove the rule for IPv6 connections"}, "upnp_only": {"type": "boolean", "description": "Only remove forwarding of this port with UPnP"}, "no_reload": {"type": "boolean", "description": "Do not reload firewall rules"}}, "required": ["protocol", "port"]}}}}}}, "/firewall/upnp/": {"put": {"tags": ["firewall"], "operationId": "firewall_upnp", "summary": "Manage port forwarding using UPnP", "description": "", "responses": {"200": {"description": "successful operation"}}, "parameters": [], "requestBody": {"required": true, "content": {"multipart/form-data": {"schema": {"type": "object", "properties": {"action": {"type": "string", "description": "", "enum": ["enable", "disable", "status", "reload"], "default": "status"}, "no_refresh": {"type": "boolean", "description": "Do not refresh port forwarding"}}, "required": []}}}}}}, "/adminpw": {"put": {"tags": ["tools"], "operationId": "tools_adminpw", "summary": "Change password of admin and root users", "description": "", "responses": {"200": {"description": "successful operation"}}, "parameters": [], "requestBody": {"required": true, "content": {"multipart/form-data": {"schema": {"type": "object", "properties": {"new_password": {"type": "string", "description": ""}}, "required": []}}}}}}, "/postinstall": {"post": {"tags": ["tools"], "operationId": "tools_postinstall", "summary": "YunoHost post-install", "description": "", "responses": {"200": {"description": "successful operation"}}, "parameters": [{"name": "X-Requested-With", "in": "header", "required": true, "schema": {"type": "string", "default": "Swagger API"}}], "requestBody": {"required": true, "content": {"multipart/form-data": {"schema": {"type": "object", "properties": {"domain": {"type": "string", "description": "YunoHost main domain"}, "password": {"type": "string", "description": "YunoHost admin password"}, "ignore_dyndns": {"type": "boolean", "description": "Do not subscribe domain to a DynDNS service"}, "force_password": {"type": "boolean", "description": "Use this if you really want to set a weak password"}, "force_diskspace": {"type": "boolean", "description": "Use this if you really want to install YunoHost on a setup with less than 10 GB on the root filesystem"}}, "required": []}}}}}}, "/update/": {"put": {"tags": ["tools"], "operationId": "tools_update", "summary": "YunoHost update", "description": "", "responses": {"200": {"description": "successful operation"}}, "parameters": [], "requestBody": {"required": true, "content": {"multipart/form-data": {"schema": {"type": "object", "properties": {"target": {"type": "string", "description": "What to update, \"apps\" (application catalog) or \"system\" (fetch available package upgrades, equivalent to apt update), \"all\" for both", "enum": ["apps", "system", "all"], "default": "all"}}, "required": []}}}}}}, "/upgrade/": {"put": {"tags": ["tools"], "operationId": "tools_upgrade", "summary": "YunoHost upgrade", "description": "", "responses": {"200": {"description": "successful operation"}}, "parameters": [], "requestBody": {"required": true, "content": {"multipart/form-data": {"schema": {"type": "object", "properties": {"target": {"type": "string", "description": "What to upgrade, either \"apps\" (all apps) or \"system\" (all system packages)", "enum": ["apps", "system"]}}, "required": []}}}}}}, "/shutdown": {"put": {"tags": ["tools"], "operationId": "tools_shutdown", "summary": "Shutdown the server", "description": "", "responses": {"200": {"description": "successful operation"}}, "parameters": [], "requestBody": {"required": true, "content": {"multipart/form-data": {"schema": {"type": "object", "properties": {"force": {"type": "boolean", "description": "skip the shutdown confirmation"}}, "required": []}}}}}}, "/reboot": {"put": {"tags": ["tools"], "operationId": "tools_reboot", "summary": "Reboot the server", "description": "", "responses": {"200": {"description": "successful operation"}}, "parameters": [], "requestBody": {"required": true, "content": {"multipart/form-data": {"schema": {"type": "object", "properties": {"force": {"type": "boolean", "description": "skip the reboot confirmation"}}, "required": []}}}}}}, "/regenconf": {"put": {"tags": ["tools"], "operationId": "tools_regen-conf", "summary": "Regenerate the configuration file(s)", "description": "", "responses": {"200": {"description": "successful operation"}}, "parameters": [], "requestBody": {"required": true, "content": {"multipart/form-data": {"schema": {"type": "object", "properties": {"names": {"type": "array", "description": "Categories to regenerate configuration of (all by default)"}, "with_diff": {"type": "boolean", "description": "Show differences in case of configuration changes"}, "force": {"type": "boolean", "description": "Override all manual modifications in configuration files"}, "dry_run": {"type": "boolean", "description": "Show what would have been regenerated"}, "list_pending": {"type": "boolean", "description": "List pending configuration files and exit"}}, "required": []}}}}}}, "/regenconf/": {"put": {"tags": ["tools"], "operationId": "tools_regen-conf_1", "summary": "Regenerate the configuration file(s)", "description": "", "responses": {"200": {"description": "successful operation"}}, "parameters": [], "requestBody": {"required": true, "content": {"multipart/form-data": {"schema": {"type": "object", "properties": {"names": {"type": "array", "description": "Categories to regenerate configuration of (all by default)"}, "with_diff": {"type": "boolean", "description": "Show differences in case of configuration changes"}, "force": {"type": "boolean", "description": "Override all manual modifications in configuration files"}, "dry_run": {"type": "boolean", "description": "Show what would have been regenerated"}, "list_pending": {"type": "boolean", "description": "List pending configuration files and exit"}}, "required": []}}}}}}, "/versions": {"get": {"tags": ["tools"], "operationId": "tools_versions", "summary": "Display YunoHost's packages versions", "description": "", "responses": {"200": {"description": "successful operation"}}, "parameters": []}}, "/migrations": {"get": {"tags": ["tools migrations"], "operationId": "tools migrations_list", "summary": "List migrations", "description": "", "responses": {"200": {"description": "successful operation"}}, "parameters": [{"name": "pending", "in": "query", "description": "list only pending migrations", "required": false, "schema": {"type": "boolean"}, "explode": false}, {"name": "done", "in": "query", "description": "list only migrations already performed", "required": false, "schema": {"type": "boolean"}, "explode": false}]}, "put": {"tags": ["tools migrations"], "operationId": "tools migrations_run", "summary": "Run migrations", "description": "", "responses": {"200": {"description": "successful operation"}}, "parameters": [], "requestBody": {"required": true, "content": {"multipart/form-data": {"schema": {"type": "object", "properties": {"targets": {"type": "array", "description": "Migrations to run (all pendings by default)"}, "skip": {"type": "boolean", "description": "Skip specified migrations (to be used only if you know what you are doing)"}, "force_rerun": {"type": "boolean", "description": "Re-run already-ran specified migration (to be used only if you know what you are doing)"}, "auto": {"type": "boolean", "description": "Automatic mode, won't run manual migrations (to be used only if you know what you are doing)"}, "accept_disclaimer": {"type": "boolean", "description": "Accept disclaimers of migrations (please read them before using this option)"}}, "required": []}}}}}}, "/migrations/": {"put": {"tags": ["tools migrations"], "operationId": "tools migrations_run_1", "summary": "Run migrations", "description": "", "responses": {"200": {"description": "successful operation"}}, "parameters": [], "requestBody": {"required": true, "content": {"multipart/form-data": {"schema": {"type": "object", "properties": {"targets": {"type": "array", "description": "Migrations to run (all pendings by default)"}, "skip": {"type": "boolean", "description": "Skip specified migrations (to be used only if you know what you are doing)"}, "force_rerun": {"type": "boolean", "description": "Re-run already-ran specified migration (to be used only if you know what you are doing)"}, "auto": {"type": "boolean", "description": "Automatic mode, won't run manual migrations (to be used only if you know what you are doing)"}, "accept_disclaimer": {"type": "boolean", "description": "Accept disclaimers of migrations (please read them before using this option)"}}, "required": []}}}}}}, "/hooks/": {"get": {"tags": ["hook"], "operationId": "hook_list", "summary": "List available hooks for an action", "description": "", "responses": {"200": {"description": "successful operation"}}, "parameters": [{"name": "action", "in": "query", "description": "Action name", "required": true, "schema": {"type": "string"}, "explode": false}, {"name": "list_by", "in": "query", "description": "Property to list hook by", "required": false, "schema": {"type": "string", "enum": ["name", "priority", "folder"], "default": "name"}, "explode": false}, {"name": "show_info", "in": "query", "description": "Show hook information", "required": false, "schema": {"type": "boolean"}, "explode": false}]}}, "/logs": {"get": {"tags": ["log"], "operationId": "log_list", "summary": "List logs", "description": "", "responses": {"200": {"description": "successful operation"}}, "parameters": [{"name": "limit", "in": "query", "description": "Maximum number of operations to list (default to 50)", "required": false, "schema": {"type": "int", "default": 50}, "explode": false}, {"name": "with_details", "in": "query", "description": "Show additional infos (e.g. operation success) but may significantly increase command time. Consider using --limit in combination with this.", "required": false, "schema": {"type": "boolean"}, "explode": false}, {"name": "with_suboperations", "in": "query", "description": "Include metadata about operations that are not the main operation but are sub-operations triggered by another ongoing operation... (e.g. initializing groups/permissions when installing an app)", "required": false, "schema": {"type": "boolean"}, "explode": false}]}}, "/logs/": {"get": {"tags": ["log"], "operationId": "log_show", "summary": "Display a log content", "description": "", "responses": {"200": {"description": "successful operation"}}, "parameters": [{"name": "path", "in": "query", "description": "Log file which to display the content", "required": true, "schema": {"type": "string"}, "explode": false}, {"name": "number", "in": "query", "description": "Number of lines to display", "required": false, "schema": {"type": "int", "default": 50}, "explode": false}, {"name": "share", "in": "query", "description": "(Deprecated, see yunohost log share) Share the full log using yunopaste", "required": false, "schema": {"type": "boolean"}, "explode": false}, {"name": "filter_irrelevant", "in": "query", "description": "Do not show some lines deemed not relevant (like set +x or helper argument parsing)", "required": false, "schema": {"type": "boolean"}, "explode": false}, {"name": "with_suboperations", "in": "query", "description": "Include metadata about sub-operations of this operation... (e.g. initializing groups/permissions when installing an app)", "required": false, "schema": {"type": "boolean"}, "explode": false}]}}, "/logs//share": {"get": {"tags": ["log"], "operationId": "log_share", "summary": "Share the full log on yunopaste (alias to show --share)", "description": "", "responses": {"200": {"description": "successful operation"}}, "parameters": [{"name": "path", "in": "query", "description": "Log file to share", "required": true, "schema": {"type": "string"}, "explode": false}]}}, "/diagnosis/categories": {"get": {"tags": ["diagnosis"], "operationId": "diagnosis_list", "summary": "List diagnosis categories", "description": "", "responses": {"200": {"description": "successful operation"}}, "parameters": []}}, "/diagnosis": {"get": {"tags": ["diagnosis"], "operationId": "diagnosis_show", "summary": "Show most recents diagnosis results", "description": "", "responses": {"200": {"description": "successful operation"}}, "parameters": [{"name": "categories", "in": "query", "description": "Diagnosis categories to display (all by default)", "required": false, "schema": {"type": "array"}, "explode": true}, {"name": "full", "in": "query", "description": "Display additional information", "required": false, "schema": {"type": "boolean"}, "explode": false}, {"name": "issues", "in": "query", "description": "Only display issues", "required": false, "schema": {"type": "boolean"}, "explode": false}, {"name": "share", "in": "query", "description": "Share the logs using yunopaste", "required": false, "schema": {"type": "boolean"}, "explode": false}, {"name": "human_readable", "in": "query", "description": "Show a human-readable output", "required": false, "schema": {"type": "boolean"}, "explode": false}]}}, "/diagnosis/": {"get": {"tags": ["diagnosis"], "operationId": "diagnosis_get", "summary": "Low-level command to fetch raw data and status about a specific diagnosis test", "description": "", "responses": {"200": {"description": "successful operation"}}, "parameters": [{"name": "category", "in": "query", "description": "Diagnosis category to fetch results from", "required": true, "schema": {"type": "string"}, "explode": false}, {"name": "item", "in": "query", "description": "List of criteria describing the test. Must correspond exactly to the 'meta' infos in 'yunohost diagnosis show'", "required": false, "schema": {"type": "array"}, "explode": true}]}}, "/diagnosis/run": {"put": {"tags": ["diagnosis"], "operationId": "diagnosis_run", "summary": "Run diagnosis", "description": "", "responses": {"200": {"description": "successful operation"}}, "parameters": [], "requestBody": {"required": true, "content": {"multipart/form-data": {"schema": {"type": "object", "properties": {"categories": {"type": "array", "description": "Diagnosis categories to run (all by default)"}, "force": {"type": "boolean", "description": "Ignore the cached report even if it is still 'fresh'"}, "except_if_never_ran_yet": {"type": "boolean", "description": "Don't run anything if diagnosis never ran yet ... (this is meant to be used by the webadmin)"}, "email": {"type": "boolean", "description": "Send an email to root with issues found (this is meant to be used by cron job)"}}, "required": []}}}}}}, "/diagnosis/ignore": {"put": {"tags": ["diagnosis"], "operationId": "diagnosis_ignore", "summary": "Configure some diagnosis results to be ignored and therefore not considered as actual issues", "description": "", "responses": {"200": {"description": "successful operation"}}, "parameters": [], "requestBody": {"required": true, "content": {"multipart/form-data": {"schema": {"type": "object", "properties": {"filter": {"type": "array", "description": "Add a filter. The first element should be a diagnosis category, and other criterias can be provided using the infos from the 'meta' sections in 'yunohost diagnosis show'. For example: 'dnsrecords domain=yolo.test category=xmpp'"}, "list": {"type": "boolean", "description": "List active ignore filters"}}, "required": []}}}}}}, "/diagnosis/unignore": {"put": {"tags": ["diagnosis"], "operationId": "diagnosis_unignore", "summary": "Configure some diagnosis results to be unignored and therefore considered as actual issues", "description": "", "responses": {"200": {"description": "successful operation"}}, "parameters": [], "requestBody": {"required": true, "content": {"multipart/form-data": {"schema": {"type": "object", "properties": {"filter": {"type": "array", "description": "Remove a filter (it should be an existing filter as listed with --list)"}}, "required": []}}}}}}}} \ No newline at end of file diff --git a/themes/yunohost-docs/js/swagger-ui-bundle.js b/themes/yunohost-docs/js/swagger-ui-bundle.js new file mode 100644 index 00000000..2e65f47d --- /dev/null +++ b/themes/yunohost-docs/js/swagger-ui-bundle.js @@ -0,0 +1,3 @@ +/*! For license information please see swagger-ui-bundle.js.LICENSE.txt */ +!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.SwaggerUIBundle=t():e.SwaggerUIBundle=t()}(this,(function(){return(()=>{var e={17967:(e,t)=>{"use strict";t.N=void 0;var r=/^([^\w]*)(javascript|data|vbscript)/im,n=/&#(\w+)(^\w|;)?/g,o=/[\u0000-\u001F\u007F-\u009F\u2000-\u200D\uFEFF]/gim,a=/^([^:]+):/gm,i=[".","/"];t.N=function(e){var t,s=(t=e||"",t.replace(n,(function(e,t){return String.fromCharCode(t)}))).replace(o,"").trim();if(!s)return"about:blank";if(function(e){return i.indexOf(e[0])>-1}(s))return s;var l=s.match(a);if(!l)return s;var u=l[0];return r.test(u)?"about:blank":s}},53795:(e,t,r)=>{"use strict";r.d(t,{Z:()=>P});var n=r(23101),o=r.n(n),a=r(61125),i=r.n(a),s=r(11882),l=r.n(s),u=r(97606),c=r.n(u),p=r(67294),f=r(43393);function h(e){return h="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},h(e)}function d(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function m(e,t){for(var r=0;r1&&void 0!==arguments[1]?arguments[1]:{},r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},n=k(t,r),o=e||Object.keys(y({},r,{},t));return o.every(n)}function k(e,t){return function(r){if("string"==typeof r)return(0,f.is)(t[r],e[r]);if(Array.isArray(r))return(0,f.is)(S(t,r),S(e,r));throw new TypeError("Invalid key: expected Array or string: "+r)}}var C=function(e){function t(){return d(this,t),E(this,b(t).apply(this,arguments))}var r,n,o;return function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),t&&w(e,t)}(t,e),r=t,n=[{key:"shouldComponentUpdate",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return!A(this.updateOnProps,this.props,e,"updateOnProps")||!A(this.updateOnStates,this.state,t,"updateOnStates")}}],n&&m(r.prototype,n),o&&m(r,o),t}(p.Component);const O=C;var j=r(23930),I=r.n(j),N=r(45697),T=r.n(N);class P extends O{constructor(){super(...arguments),i()(this,"getModelName",(e=>-1!==l()(e).call(e,"#/definitions/")?e.replace(/^.*#\/definitions\//,""):-1!==l()(e).call(e,"#/components/schemas/")?e.replace(/^.*#\/components\/schemas\//,""):void 0)),i()(this,"getRefSchema",(e=>{let{specSelectors:t}=this.props;return t.findDefinition(e)}))}render(){let{getComponent:e,getConfigs:t,specSelectors:n,schema:a,required:i,name:s,isRef:l,specPath:u,displayName:c,includeReadOnly:f,includeWriteOnly:h}=this.props;const d=e("ObjectModel"),m=e("ArrayModel"),g=e("PrimitiveModel");let v="object",y=a&&a.get("$$ref");if(!s&&y&&(s=this.getModelName(y)),!a&&y&&(a=this.getRefSchema(s)),!a)return p.createElement("span",{className:"model model-title"},p.createElement("span",{className:"model-title__text"},c||s),p.createElement("img",{src:r(2517),height:"20px",width:"20px"}));const b=n.isOAS3()&&a.get("deprecated");switch(l=void 0!==l?l:!!y,v=a&&a.get("type")||v,v){case"object":return p.createElement(d,o()({className:"object"},this.props,{specPath:u,getConfigs:t,schema:a,name:s,deprecated:b,isRef:l,includeReadOnly:f,includeWriteOnly:h}));case"array":return p.createElement(m,o()({className:"array"},this.props,{getConfigs:t,schema:a,name:s,deprecated:b,required:i,includeReadOnly:f,includeWriteOnly:h}));default:return p.createElement(g,o()({},this.props,{getComponent:e,getConfigs:t,schema:a,name:s,deprecated:b,required:i}))}}}i()(P,"propTypes",{schema:c()(I()).isRequired,getComponent:T().func.isRequired,getConfigs:T().func.isRequired,specSelectors:T().object.isRequired,name:T().string,displayName:T().string,isRef:T().bool,required:T().bool,expandDepth:T().number,depth:T().number,specPath:I().list.isRequired,includeReadOnly:T().bool,includeWriteOnly:T().bool})},5623:(e,t,r)=>{"use strict";r.d(t,{Z:()=>f});var n=r(61125),o=r.n(n),a=r(28222),i=r.n(a),s=r(67294),l=r(84564),u=r.n(l),c=r(90242),p=r(27504);class f extends s.Component{constructor(e,t){super(e,t),o()(this,"getDefinitionUrl",(()=>{let{specSelectors:e}=this.props;return new(u())(e.url(),p.Z.location).toString()}));let{getConfigs:r}=e,{validatorUrl:n}=r();this.state={url:this.getDefinitionUrl(),validatorUrl:void 0===n?"https://validator.swagger.io/validator":n}}UNSAFE_componentWillReceiveProps(e){let{getConfigs:t}=e,{validatorUrl:r}=t();this.setState({url:this.getDefinitionUrl(),validatorUrl:void 0===r?"https://validator.swagger.io/validator":r})}render(){let{getConfigs:e}=this.props,{spec:t}=e(),r=(0,c.Nm)(this.state.validatorUrl);return"object"==typeof t&&i()(t).length?null:this.state.url&&(0,c.hW)(this.state.validatorUrl)&&(0,c.hW)(this.state.url)?s.createElement("span",{className:"float-right"},s.createElement("a",{target:"_blank",rel:"noopener noreferrer",href:`${r}/debug?url=${encodeURIComponent(this.state.url)}`},s.createElement(h,{src:`${r}?url=${encodeURIComponent(this.state.url)}`,alt:"Online validator badge"}))):null}}class h extends s.Component{constructor(e){super(e),this.state={loaded:!1,error:!1}}componentDidMount(){const e=new Image;e.onload=()=>{this.setState({loaded:!0})},e.onerror=()=>{this.setState({error:!0})},e.src=this.props.src}UNSAFE_componentWillReceiveProps(e){if(e.src!==this.props.src){const t=new Image;t.onload=()=>{this.setState({loaded:!0})},t.onerror=()=>{this.setState({error:!0})},t.src=e.src}}render(){return this.state.error?s.createElement("img",{alt:"Error"}):this.state.loaded?s.createElement("img",{src:this.props.src,alt:this.props.alt}):null}}},86019:(e,t,r)=>{"use strict";r.d(t,{Z:()=>me,s:()=>ge});var n=r(67294),o=r(89927);function a(e,t){if(Array.prototype.indexOf)return e.indexOf(t);for(var r=0,n=e.length;r=0;r--)!0===t(e[r])&&e.splice(r,1)}function s(e){throw new Error("Unhandled case for value: '"+e+"'")}var l=function(){function e(e){void 0===e&&(e={}),this.tagName="",this.attrs={},this.innerHTML="",this.whitespaceRegex=/\s+/,this.tagName=e.tagName||"",this.attrs=e.attrs||{},this.innerHTML=e.innerHtml||e.innerHTML||""}return e.prototype.setTagName=function(e){return this.tagName=e,this},e.prototype.getTagName=function(){return this.tagName||""},e.prototype.setAttr=function(e,t){return this.getAttrs()[e]=t,this},e.prototype.getAttr=function(e){return this.getAttrs()[e]},e.prototype.setAttrs=function(e){return Object.assign(this.getAttrs(),e),this},e.prototype.getAttrs=function(){return this.attrs||(this.attrs={})},e.prototype.setClass=function(e){return this.setAttr("class",e)},e.prototype.addClass=function(e){for(var t,r=this.getClass(),n=this.whitespaceRegex,o=r?r.split(n):[],i=e.split(n);t=i.shift();)-1===a(o,t)&&o.push(t);return this.getAttrs().class=o.join(" "),this},e.prototype.removeClass=function(e){for(var t,r=this.getClass(),n=this.whitespaceRegex,o=r?r.split(n):[],i=e.split(n);o.length&&(t=i.shift());){var s=a(o,t);-1!==s&&o.splice(s,1)}return this.getAttrs().class=o.join(" "),this},e.prototype.getClass=function(){return this.getAttrs().class||""},e.prototype.hasClass=function(e){return-1!==(" "+this.getClass()+" ").indexOf(" "+e+" ")},e.prototype.setInnerHTML=function(e){return this.innerHTML=e,this},e.prototype.setInnerHtml=function(e){return this.setInnerHTML(e)},e.prototype.getInnerHTML=function(){return this.innerHTML||""},e.prototype.getInnerHtml=function(){return this.getInnerHTML()},e.prototype.toAnchorString=function(){var e=this.getTagName(),t=this.buildAttrsStr();return["<",e,t=t?" "+t:"",">",this.getInnerHtml(),""].join("")},e.prototype.buildAttrsStr=function(){if(!this.attrs)return"";var e=this.getAttrs(),t=[];for(var r in e)e.hasOwnProperty(r)&&t.push(r+'="'+e[r]+'"');return t.join(" ")},e}();var u=function(){function e(e){void 0===e&&(e={}),this.newWindow=!1,this.truncate={},this.className="",this.newWindow=e.newWindow||!1,this.truncate=e.truncate||{},this.className=e.className||""}return e.prototype.build=function(e){return new l({tagName:"a",attrs:this.createAttrs(e),innerHtml:this.processAnchorText(e.getAnchorText())})},e.prototype.createAttrs=function(e){var t={href:e.getAnchorHref()},r=this.createCssClass(e);return r&&(t.class=r),this.newWindow&&(t.target="_blank",t.rel="noopener noreferrer"),this.truncate&&this.truncate.length&&this.truncate.length=s)return l.host.length==t?(l.host.substr(0,t-o)+r).substr(0,s+n):i(c,s).substr(0,s+n);var p="";if(l.path&&(p+="/"+l.path),l.query&&(p+="?"+l.query),p){if((c+p).length>=s)return(c+p).length==t?(c+p).substr(0,t):(c+i(p,s-c.length)).substr(0,s+n);c+=p}if(l.fragment){var f="#"+l.fragment;if((c+f).length>=s)return(c+f).length==t?(c+f).substr(0,t):(c+i(f,s-c.length)).substr(0,s+n);c+=f}if(l.scheme&&l.host){var h=l.scheme+"://";if((c+h).length0&&(d=c.substr(-1*Math.floor(s/2))),(c.substr(0,Math.ceil(s/2))+r+d).substr(0,s+n)}(e,r):"middle"===n?function(e,t,r){if(e.length<=t)return e;var n,o;null==r?(r="…",n=8,o=3):(n=r.length,o=r.length);var a=t-o,i="";return a>0&&(i=e.substr(-1*Math.floor(a/2))),(e.substr(0,Math.ceil(a/2))+r+i).substr(0,a+n)}(e,r):function(e,t,r){return function(e,t,r){var n;return e.length>t&&(null==r?(r="…",n=3):n=r.length,e=e.substring(0,t-n)+r),e}(e,t,r)}(e,r)},e}(),c=function(){function e(e){this.__jsduckDummyDocProp=null,this.matchedText="",this.offset=0,this.tagBuilder=e.tagBuilder,this.matchedText=e.matchedText,this.offset=e.offset}return e.prototype.getMatchedText=function(){return this.matchedText},e.prototype.setOffset=function(e){this.offset=e},e.prototype.getOffset=function(){return this.offset},e.prototype.getCssClassSuffixes=function(){return[this.getType()]},e.prototype.buildTag=function(){return this.tagBuilder.build(this)},e}(),p=function(e,t){return p=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])},p(e,t)};function f(e,t){function r(){this.constructor=e}p(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)}var h=function(){return h=Object.assign||function(e){for(var t,r=1,n=arguments.length;r-1},e.isValidUriScheme=function(e){var t=e.match(this.uriSchemeRegex),r=t&&t[0].toLowerCase();return"javascript:"!==r&&"vbscript:"!==r},e.urlMatchDoesNotHaveProtocolOrDot=function(e,t){return!(!e||t&&this.hasFullProtocolRegex.test(t)||-1!==e.indexOf("."))},e.urlMatchDoesNotHaveAtLeastOneWordChar=function(e,t){return!(!e||!t)&&(!this.hasFullProtocolRegex.test(t)&&!this.hasWordCharAfterProtocolRegex.test(e))},e.hasFullProtocolRegex=/^[A-Za-z][-.+A-Za-z0-9]*:\/\//,e.uriSchemeRegex=/^[A-Za-z][-.+A-Za-z0-9]*:/,e.hasWordCharAfterProtocolRegex=new RegExp(":[^\\s]*?["+C+"]"),e.ipRegex=/[0-9][0-9]?[0-9]?\.[0-9][0-9]?[0-9]?\.[0-9][0-9]?[0-9]?\.[0-9][0-9]?[0-9]?(:[0-9]*)?\/?$/,e}(),V=(d=new RegExp("[/?#](?:["+N+"\\-+&@#/%=~_()|'$*\\[\\]{}?!:,.;^✓]*["+N+"\\-+&@#/%=~_()|'$*\\[\\]{}✓])?"),new RegExp(["(?:","(",/(?:[A-Za-z][-.+A-Za-z0-9]{0,63}:(?![A-Za-z][-.+A-Za-z0-9]{0,63}:\/\/)(?!\d+\/?)(?:\/\/)?)/.source,M(2),")","|","(","(//)?",/(?:www\.)/.source,M(6),")","|","(","(//)?",M(10)+"\\.",L.source,"(?![-"+I+"])",")",")","(?::[0-9]+)?","(?:"+d.source+")?"].join(""),"gi")),$=new RegExp("["+N+"]"),W=function(e){function t(t){var r=e.call(this,t)||this;return r.stripPrefix={scheme:!0,www:!0},r.stripTrailingSlash=!0,r.decodePercentEncoding=!0,r.matcherRegex=V,r.wordCharRegExp=$,r.stripPrefix=t.stripPrefix,r.stripTrailingSlash=t.stripTrailingSlash,r.decodePercentEncoding=t.decodePercentEncoding,r}return f(t,e),t.prototype.parseMatches=function(e){for(var t,r=this.matcherRegex,n=this.stripPrefix,o=this.stripTrailingSlash,a=this.decodePercentEncoding,i=this.tagBuilder,s=[],l=function(){var r=t[0],l=t[1],c=t[4],p=t[5],f=t[9],h=t.index,d=p||f,m=e.charAt(h-1);if(!q.isValid(r,l))return"continue";if(h>0&&"@"===m)return"continue";if(h>0&&d&&u.wordCharRegExp.test(m))return"continue";if(/\?$/.test(r)&&(r=r.substr(0,r.length-1)),u.matchHasUnbalancedClosingParen(r))r=r.substr(0,r.length-1);else{var g=u.matchHasInvalidCharAfterTld(r,l);g>-1&&(r=r.substr(0,g))}var v=["http://","https://"].find((function(e){return!!l&&-1!==l.indexOf(e)}));if(v){var y=r.indexOf(v);r=r.substr(y),l=l.substr(y),h+=y}var w=l?"scheme":c?"www":"tld",E=!!l;s.push(new b({tagBuilder:i,matchedText:r,offset:h,urlMatchType:w,url:r,protocolUrlMatch:E,protocolRelativeMatch:!!d,stripPrefix:n,stripTrailingSlash:o,decodePercentEncoding:a}))},u=this;null!==(t=r.exec(e));)l();return s},t.prototype.matchHasUnbalancedClosingParen=function(e){var t,r=e.charAt(e.length-1);if(")"===r)t="(";else if("]"===r)t="[";else{if("}"!==r)return!1;t="{"}for(var n=0,o=0,a=e.length-1;o"===e?(m=new ne(h(h({},m),{name:H()})),W()):E.test(e)||x.test(e)||":"===e||V()}function w(e){">"===e?V():E.test(e)?f=3:V()}function _(e){S.test(e)||("/"===e?f=12:">"===e?W():"<"===e?$():"="===e||A.test(e)||k.test(e)?V():f=5)}function C(e){S.test(e)?f=6:"/"===e?f=12:"="===e?f=7:">"===e?W():"<"===e?$():A.test(e)&&V()}function O(e){S.test(e)||("/"===e?f=12:"="===e?f=7:">"===e?W():"<"===e?$():A.test(e)?V():f=5)}function j(e){S.test(e)||('"'===e?f=8:"'"===e?f=9:/[>=`]/.test(e)?V():"<"===e?$():f=10)}function I(e){'"'===e&&(f=11)}function N(e){"'"===e&&(f=11)}function T(e){S.test(e)?f=4:">"===e?W():"<"===e&&$()}function P(e){S.test(e)?f=4:"/"===e?f=12:">"===e?W():"<"===e?$():(f=4,c--)}function R(e){">"===e?(m=new ne(h(h({},m),{isClosing:!0})),W()):f=4}function M(t){"--"===e.substr(c,2)?(c+=2,m=new ne(h(h({},m),{type:"comment"})),f=14):"DOCTYPE"===e.substr(c,7).toUpperCase()?(c+=7,m=new ne(h(h({},m),{type:"doctype"})),f=20):V()}function D(e){"-"===e?f=15:">"===e?V():f=16}function L(e){"-"===e?f=18:">"===e?V():f=16}function B(e){"-"===e&&(f=17)}function F(e){f="-"===e?18:16}function z(e){">"===e?W():"!"===e?f=19:"-"===e||(f=16)}function U(e){"-"===e?f=17:">"===e?W():f=16}function q(e){">"===e?W():"<"===e&&$()}function V(){f=0,m=u}function $(){f=1,m=new ne({idx:c})}function W(){var t=e.slice(d,m.idx);t&&a(t,d),"comment"===m.type?i(m.idx):"doctype"===m.type?l(m.idx):(m.isOpening&&n(m.name,m.idx),m.isClosing&&o(m.name,m.idx)),V(),d=c+1}function H(){var t=m.idx+(m.isClosing?2:1);return e.slice(t,c).toLowerCase()}d=0&&n++},onText:function(e,r){if(0===n){var a=function(e,t){if(!t.global)throw new Error("`splitRegex` must have the 'g' flag set");for(var r,n=[],o=0;r=t.exec(e);)n.push(e.substring(o,r.index)),n.push(r[0]),o=r.index+r[0].length;return n.push(e.substring(o)),n}(e,/( | |<|<|>|>|"|"|')/gi),i=r;a.forEach((function(e,r){if(r%2==0){var n=t.parseText(e,i);o.push.apply(o,n)}i+=e.length}))}},onCloseTag:function(e){r.indexOf(e)>=0&&(n=Math.max(n-1,0))},onComment:function(e){},onDoctype:function(e){}}),o=this.compactMatches(o),o=this.removeUnwantedMatches(o)},e.prototype.compactMatches=function(e){e.sort((function(e,t){return e.getOffset()-t.getOffset()}));for(var t=0;to?t:t+1;e.splice(i,1);continue}e[t+1].getOffset()/g,">"));for(var t=this.parse(e),r=[],n=0,o=0,a=t.length;o/i.test(e)}function se(){var e=[],t=new oe({stripPrefix:!1,url:!0,email:!0,replaceFn:function(t){switch(t.getType()){case"url":e.push({text:t.matchedText,url:t.getUrl()});break;case"email":e.push({text:t.matchedText,url:"mailto:"+t.getEmail().replace(/^mailto:/i,"")})}return!1}});return{links:e,autolinker:t}}function le(e){var t,r,n,o,a,i,s,l,u,c,p,f,h,d,m=e.tokens,g=null;for(r=0,n=m.length;r=0;t--)if("link_close"!==(a=o[t]).type){if("htmltag"===a.type&&(d=a.content,/^\s]/i.test(d)&&p>0&&p--,ie(a.content)&&p++),!(p>0)&&"text"===a.type&&ae.test(a.content)){if(g||(f=(g=se()).links,h=g.autolinker),i=a.content,f.length=0,h.link(i),!f.length)continue;for(s=[],c=a.level,l=0;l({useUnsafeMarkdown:!1})};const me=de;function ge(e){let{useUnsafeMarkdown:t=!1}=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};const r=t,n=t?[]:["style","class"];return t&&!ge.hasWarnedAboutDeprecation&&(console.warn("useUnsafeMarkdown display configuration parameter is deprecated since >3.26.0 and will be removed in v4.0.0."),ge.hasWarnedAboutDeprecation=!0),pe().sanitize(e,{ADD_ATTR:["target"],FORBID_TAGS:["style","form"],ALLOW_DATA_ATTR:r,FORBID_ATTR:n})}ge.hasWarnedAboutDeprecation=!1},45308:(e,t,r)=>{"use strict";r.r(t),r.d(t,{default:()=>f});var n,o=r(86),a=r.n(o),i=r(8712),s=r.n(i),l=r(90242),u=r(27621);const c=r(95102),p={},f=p;a()(n=s()(c).call(c)).call(n,(function(e){if("./index.js"===e)return;let t=c(e);p[(0,l.Zl)(e)]=t.default?t.default:t})),p.SafeRender=u.default},55812:(e,t,r)=>{"use strict";r.r(t),r.d(t,{SHOW_AUTH_POPUP:()=>p,AUTHORIZE:()=>f,LOGOUT:()=>h,PRE_AUTHORIZE_OAUTH2:()=>d,AUTHORIZE_OAUTH2:()=>m,VALIDATE:()=>g,CONFIGURE_AUTH:()=>v,RESTORE_AUTHORIZATION:()=>y,showDefinitions:()=>b,authorize:()=>w,authorizeWithPersistOption:()=>E,logout:()=>x,logoutWithPersistOption:()=>_,preAuthorizeImplicit:()=>S,authorizeOauth2:()=>A,authorizeOauth2WithPersistOption:()=>k,authorizePassword:()=>C,authorizeApplication:()=>O,authorizeAccessCodeWithFormParams:()=>j,authorizeAccessCodeWithBasicAuthentication:()=>I,authorizeRequest:()=>N,configureAuth:()=>T,restoreAuthorization:()=>P,persistAuthorizationIfNeeded:()=>R,authPopup:()=>M});var n=r(35627),o=r.n(n),a=r(76986),i=r.n(a),s=r(84564),l=r.n(s),u=r(27504),c=r(90242);const p="show_popup",f="authorize",h="logout",d="pre_authorize_oauth2",m="authorize_oauth2",g="validate",v="configure_auth",y="restore_authorization";function b(e){return{type:p,payload:e}}function w(e){return{type:f,payload:e}}const E=e=>t=>{let{authActions:r}=t;r.authorize(e),r.persistAuthorizationIfNeeded()};function x(e){return{type:h,payload:e}}const _=e=>t=>{let{authActions:r}=t;r.logout(e),r.persistAuthorizationIfNeeded()},S=e=>t=>{let{authActions:r,errActions:n}=t,{auth:a,token:i,isValid:s}=e,{schema:l,name:c}=a,p=l.get("flow");delete u.Z.swaggerUIRedirectOauth2,"accessCode"===p||s||n.newAuthErr({authId:c,source:"auth",level:"warning",message:"Authorization may be unsafe, passed state was changed in server Passed state wasn't returned from auth server"}),i.error?n.newAuthErr({authId:c,source:"auth",level:"error",message:o()(i)}):r.authorizeOauth2WithPersistOption({auth:a,token:i})};function A(e){return{type:m,payload:e}}const k=e=>t=>{let{authActions:r}=t;r.authorizeOauth2(e),r.persistAuthorizationIfNeeded()},C=e=>t=>{let{authActions:r}=t,{schema:n,name:o,username:a,password:s,passwordType:l,clientId:u,clientSecret:p}=e,f={grant_type:"password",scope:e.scopes.join(" "),username:a,password:s},h={};switch(l){case"request-body":!function(e,t,r){t&&i()(e,{client_id:t});r&&i()(e,{client_secret:r})}(f,u,p);break;case"basic":h.Authorization="Basic "+(0,c.r3)(u+":"+p);break;default:console.warn(`Warning: invalid passwordType ${l} was passed, not including client id and secret`)}return r.authorizeRequest({body:(0,c.GZ)(f),url:n.get("tokenUrl"),name:o,headers:h,query:{},auth:e})};const O=e=>t=>{let{authActions:r}=t,{schema:n,scopes:o,name:a,clientId:i,clientSecret:s}=e,l={Authorization:"Basic "+(0,c.r3)(i+":"+s)},u={grant_type:"client_credentials",scope:o.join(" ")};return r.authorizeRequest({body:(0,c.GZ)(u),name:a,url:n.get("tokenUrl"),auth:e,headers:l})},j=e=>{let{auth:t,redirectUrl:r}=e;return e=>{let{authActions:n}=e,{schema:o,name:a,clientId:i,clientSecret:s,codeVerifier:l}=t,u={grant_type:"authorization_code",code:t.code,client_id:i,client_secret:s,redirect_uri:r,code_verifier:l};return n.authorizeRequest({body:(0,c.GZ)(u),name:a,url:o.get("tokenUrl"),auth:t})}},I=e=>{let{auth:t,redirectUrl:r}=e;return e=>{let{authActions:n}=e,{schema:o,name:a,clientId:i,clientSecret:s,codeVerifier:l}=t,u={Authorization:"Basic "+(0,c.r3)(i+":"+s)},p={grant_type:"authorization_code",code:t.code,client_id:i,redirect_uri:r,code_verifier:l};return n.authorizeRequest({body:(0,c.GZ)(p),name:a,url:o.get("tokenUrl"),auth:t,headers:u})}},N=e=>t=>{let r,{fn:n,getConfigs:a,authActions:s,errActions:u,oas3Selectors:c,specSelectors:p,authSelectors:f}=t,{body:h,query:d={},headers:m={},name:g,url:v,auth:y}=e,{additionalQueryStringParams:b}=f.getConfigs()||{};if(p.isOAS3()){let e=c.serverEffectiveValue(c.selectedServer());r=l()(v,e,!0)}else r=l()(v,p.url(),!0);"object"==typeof b&&(r.query=i()({},r.query,b));const w=r.toString();let E=i()({Accept:"application/json, text/plain, */*","Content-Type":"application/x-www-form-urlencoded","X-Requested-With":"XMLHttpRequest"},m);n.fetch({url:w,method:"post",headers:E,query:d,body:h,requestInterceptor:a().requestInterceptor,responseInterceptor:a().responseInterceptor}).then((function(e){let t=JSON.parse(e.data),r=t&&(t.error||""),n=t&&(t.parseError||"");e.ok?r||n?u.newAuthErr({authId:g,level:"error",source:"auth",message:o()(t)}):s.authorizeOauth2WithPersistOption({auth:y,token:t}):u.newAuthErr({authId:g,level:"error",source:"auth",message:e.statusText})})).catch((e=>{let t=new Error(e).message;if(e.response&&e.response.data){const r=e.response.data;try{const e="string"==typeof r?JSON.parse(r):r;e.error&&(t+=`, error: ${e.error}`),e.error_description&&(t+=`, description: ${e.error_description}`)}catch(e){}}u.newAuthErr({authId:g,level:"error",source:"auth",message:t})}))};function T(e){return{type:v,payload:e}}function P(e){return{type:y,payload:e}}const R=()=>e=>{let{authSelectors:t,getConfigs:r}=e;if(r().persistAuthorization){const e=t.authorized();localStorage.setItem("authorized",o()(e.toJS()))}},M=(e,t)=>()=>{u.Z.swaggerUIRedirectOauth2=t,u.Z.open(e)}},93705:(e,t,r)=>{"use strict";r.r(t),r.d(t,{default:()=>u,preauthorizeBasic:()=>c,preauthorizeApiKey:()=>p});var n=r(11189),o=r.n(n),a=r(43962),i=r(55812),s=r(60035),l=r(48302);function u(){return{afterLoad(e){this.rootInjects=this.rootInjects||{},this.rootInjects.initOAuth=e.authActions.configureAuth,this.rootInjects.preauthorizeApiKey=o()(p).call(p,null,e),this.rootInjects.preauthorizeBasic=o()(c).call(c,null,e)},statePlugins:{auth:{reducers:a.default,actions:i,selectors:s},spec:{wrapActions:l}}}}function c(e,t,r,n){const{authActions:{authorize:o},specSelectors:{specJson:a,isOAS3:i}}=e,s=i()?["components","securitySchemes"]:["securityDefinitions"],l=a().getIn([...s,t]);return l?o({[t]:{value:{username:r,password:n},schema:l.toJS()}}):null}function p(e,t,r){const{authActions:{authorize:n},specSelectors:{specJson:o,isOAS3:a}}=e,i=a()?["components","securitySchemes"]:["securityDefinitions"],s=o().getIn([...i,t]);return s?n({[t]:{value:r,schema:s.toJS()}}):null}},43962:(e,t,r)=>{"use strict";r.r(t),r.d(t,{default:()=>c});var n=r(86),o=r.n(n),a=r(76986),i=r.n(a),s=r(43393),l=r(90242),u=r(55812);const c={[u.SHOW_AUTH_POPUP]:(e,t)=>{let{payload:r}=t;return e.set("showDefinitions",r)},[u.AUTHORIZE]:(e,t)=>{var r;let{payload:n}=t,a=(0,s.fromJS)(n),i=e.get("authorized")||(0,s.Map)();return o()(r=a.entrySeq()).call(r,(t=>{let[r,n]=t;if(!(0,l.Wl)(n.getIn))return e.set("authorized",i);let o=n.getIn(["schema","type"]);if("apiKey"===o||"http"===o)i=i.set(r,n);else if("basic"===o){let e=n.getIn(["value","username"]),t=n.getIn(["value","password"]);i=i.setIn([r,"value"],{username:e,header:"Basic "+(0,l.r3)(e+":"+t)}),i=i.setIn([r,"schema"],n.get("schema"))}})),e.set("authorized",i)},[u.AUTHORIZE_OAUTH2]:(e,t)=>{let r,{payload:n}=t,{auth:o,token:a}=n;o.token=i()({},a),r=(0,s.fromJS)(o);let l=e.get("authorized")||(0,s.Map)();return l=l.set(r.get("name"),r),e.set("authorized",l)},[u.LOGOUT]:(e,t)=>{let{payload:r}=t,n=e.get("authorized").withMutations((e=>{o()(r).call(r,(t=>{e.delete(t)}))}));return e.set("authorized",n)},[u.CONFIGURE_AUTH]:(e,t)=>{let{payload:r}=t;return e.set("configs",r)},[u.RESTORE_AUTHORIZATION]:(e,t)=>{let{payload:r}=t;return e.set("authorized",(0,s.fromJS)(r.authorized))}}},60035:(e,t,r)=>{"use strict";r.r(t),r.d(t,{shownDefinitions:()=>y,definitionsToAuthorize:()=>b,getDefinitionsByNames:()=>w,definitionsForRequirements:()=>E,authorized:()=>x,isAuthorized:()=>_,getConfigs:()=>S});var n=r(86),o=r.n(n),a=r(14418),i=r.n(a),s=r(92039),l=r.n(s),u=r(11882),c=r.n(u),p=r(97606),f=r.n(p),h=r(28222),d=r.n(h),m=r(20573),g=r(43393);const v=e=>e,y=(0,m.P1)(v,(e=>e.get("showDefinitions"))),b=(0,m.P1)(v,(()=>e=>{var t;let{specSelectors:r}=e,n=r.securityDefinitions()||(0,g.Map)({}),a=(0,g.List)();return o()(t=n.entrySeq()).call(t,(e=>{let[t,r]=e,n=(0,g.Map)();n=n.set(t,r),a=a.push(n)})),a})),w=(e,t)=>e=>{var r;let{specSelectors:n}=e;console.warn("WARNING: getDefinitionsByNames is deprecated and will be removed in the next major version.");let a=n.securityDefinitions(),i=(0,g.List)();return o()(r=t.valueSeq()).call(r,(e=>{var t;let r=(0,g.Map)();o()(t=e.entrySeq()).call(t,(e=>{let t,[n,i]=e,s=a.get(n);var l;"oauth2"===s.get("type")&&i.size&&(t=s.get("scopes"),o()(l=t.keySeq()).call(l,(e=>{i.contains(e)||(t=t.delete(e))})),s=s.set("allowedScopes",t));r=r.set(n,s)})),i=i.push(r)})),i},E=function(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:(0,g.List)();return e=>{let{authSelectors:r}=e;const n=r.definitionsToAuthorize()||(0,g.List)();return i()(n).call(n,(e=>l()(t).call(t,(t=>t.get(e.keySeq().first())))))}},x=(0,m.P1)(v,(e=>e.get("authorized")||(0,g.Map)())),_=(e,t)=>e=>{var r;let{authSelectors:n}=e,o=n.authorized();return g.List.isList(t)?!!i()(r=t.toJS()).call(r,(e=>{var t,r;return-1===c()(t=f()(r=d()(e)).call(r,(e=>!!o.get(e)))).call(t,!1)})).length:null},S=(0,m.P1)(v,(e=>e.get("configs")))},48302:(e,t,r)=>{"use strict";r.r(t),r.d(t,{execute:()=>n});const n=(e,t)=>{let{authSelectors:r,specSelectors:n}=t;return t=>{let{path:o,method:a,operation:i,extras:s}=t,l={authorized:r.authorized()&&r.authorized().toJS(),definitions:n.securityDefinitions()&&n.securityDefinitions().toJS(),specSecurity:n.security()&&n.security().toJS()};return e({path:o,method:a,operation:i,securities:l,...s})}}},70714:(e,t,r)=>{"use strict";r.r(t),r.d(t,{UPDATE_CONFIGS:()=>n,TOGGLE_CONFIGS:()=>o,update:()=>a,toggle:()=>i,loaded:()=>s});const n="configs_update",o="configs_toggle";function a(e,t){return{type:n,payload:{[e]:t}}}function i(e){return{type:o,payload:e}}const s=()=>e=>{let{getConfigs:t,authActions:r}=e;if(t().persistAuthorization){const e=localStorage.getItem("authorized");e&&r.restoreAuthorization({authorized:JSON.parse(e)})}}},92256:(e,t,r)=>{"use strict";r.r(t),r.d(t,{parseYamlConfig:()=>o});var n=r(1272);const o=(e,t)=>{try{return n.ZP.load(e)}catch(e){return t&&t.errActions.newThrownErr(new Error(e)),{}}}},1661:(e,t,r)=>{"use strict";r.r(t),r.d(t,{default:()=>c});var n=r(15163),o=r(92256),a=r(70714),i=r(22698),s=r(69018),l=r(37743);const u={getLocalConfig:()=>(0,o.parseYamlConfig)(n)};function c(){return{statePlugins:{spec:{actions:i,selectors:u},configs:{reducers:l.default,actions:a,selectors:s}}}}},37743:(e,t,r)=>{"use strict";r.r(t),r.d(t,{default:()=>a});var n=r(43393),o=r(70714);const a={[o.UPDATE_CONFIGS]:(e,t)=>e.merge((0,n.fromJS)(t.payload)),[o.TOGGLE_CONFIGS]:(e,t)=>{const r=t.payload,n=e.get(r);return e.set(r,!n)}}},69018:(e,t,r)=>{"use strict";r.r(t),r.d(t,{get:()=>a});var n=r(58309),o=r.n(n);const a=(e,t)=>e.getIn(o()(t)?t:[t])},22698:(e,t,r)=>{"use strict";r.r(t),r.d(t,{downloadConfig:()=>o,getConfigByUrl:()=>a});var n=r(92256);const o=e=>t=>{const{fn:{fetch:r}}=t;return r(e)},a=(e,t)=>r=>{let{specActions:o}=r;if(e)return o.downloadConfig(e).then(a,a);function a(r){r instanceof Error||r.status>=400?(o.updateLoadingStatus("failedConfig"),o.updateLoadingStatus("failedConfig"),o.updateUrl(""),console.error(r.statusText+" "+e.url),t(null)):t((0,n.parseYamlConfig)(r.text))}}},31970:(e,t,r)=>{"use strict";r.r(t),r.d(t,{setHash:()=>n});const n=e=>e?history.pushState(null,null,`#${e}`):window.location.hash=""},34980:(e,t,r)=>{"use strict";r.r(t),r.d(t,{default:()=>i});var n=r(41599),o=r(60877),a=r(34584);function i(){return[n.default,{statePlugins:{configs:{wrapActions:{loaded:(e,t)=>function(){e(...arguments);const r=decodeURIComponent(window.location.hash);t.layoutActions.parseDeepLinkHash(r)}}}},wrapComponents:{operation:o.default,OperationTag:a.default}}]}},41599:(e,t,r)=>{"use strict";r.r(t),r.d(t,{show:()=>b,scrollTo:()=>w,parseDeepLinkHash:()=>E,readyToScroll:()=>x,scrollToElement:()=>_,clearScrollTo:()=>S,default:()=>A});var n=r(58309),o=r.n(n),a=r(24278),i=r.n(a),s=r(97606),l=r.n(s),u=r(11882),c=r.n(u),p=r(31970),f=r(45172),h=r.n(f),d=r(90242),m=r(43393),g=r.n(m);const v="layout_scroll_to",y="layout_clear_scroll",b=(e,t)=>{let{getConfigs:r,layoutSelectors:n}=t;return function(){for(var t=arguments.length,a=new Array(t),i=0;i({type:v,payload:o()(e)?e:[e]}),E=e=>t=>{let{layoutActions:r,layoutSelectors:n,getConfigs:o}=t;if(o().deepLinking&&e){var a;let t=i()(e).call(e,1);"!"===t[0]&&(t=i()(t).call(t,1)),"/"===t[0]&&(t=i()(t).call(t,1));const o=l()(a=t.split("/")).call(a,(e=>e||"")),s=n.isShownKeyFromUrlHashArray(o),[u,p="",f=""]=s;if("operations"===u){const e=n.isShownKeyFromUrlHashArray([p]);c()(p).call(p,"_")>-1&&(console.warn("Warning: escaping deep link whitespace with `_` will be unsupported in v4.0, use `%20` instead."),r.show(l()(e).call(e,(e=>e.replace(/_/g," "))),!0)),r.show(e,!0)}(c()(p).call(p,"_")>-1||c()(f).call(f,"_")>-1)&&(console.warn("Warning: escaping deep link whitespace with `_` will be unsupported in v4.0, use `%20` instead."),r.show(l()(s).call(s,(e=>e.replace(/_/g," "))),!0)),r.show(s,!0),r.scrollTo(s)}},x=(e,t)=>r=>{const n=r.layoutSelectors.getScrollToKey();g().is(n,(0,m.fromJS)(e))&&(r.layoutActions.scrollToElement(t),r.layoutActions.clearScrollTo())},_=(e,t)=>r=>{try{t=t||r.fn.getScrollParent(e),h().createScroller(t).to(e)}catch(e){console.error(e)}},S=()=>({type:y});const A={fn:{getScrollParent:function(e,t){const r=document.documentElement;let n=getComputedStyle(e);const o="absolute"===n.position,a=t?/(auto|scroll|hidden)/:/(auto|scroll)/;if("fixed"===n.position)return r;for(let t=e;t=t.parentElement;)if(n=getComputedStyle(t),(!o||"static"!==n.position)&&a.test(n.overflow+n.overflowY+n.overflowX))return t;return r}},statePlugins:{layout:{actions:{scrollToElement:_,scrollTo:w,clearScrollTo:S,readyToScroll:x,parseDeepLinkHash:E},selectors:{getScrollToKey:e=>e.get("scrollToKey"),isShownKeyFromUrlHashArray(e,t){const[r,n]=t;return n?["operations",r,n]:r?["operations-tag",r]:[]},urlHashArrayFromIsShownKey(e,t){let[r,n,o]=t;return"operations"==r?[n,o]:"operations-tag"==r?[n]:[]}},reducers:{[v]:(e,t)=>e.set("scrollToKey",g().fromJS(t.payload)),[y]:e=>e.delete("scrollToKey")},wrapActions:{show:b}}}}},34584:(e,t,r)=>{"use strict";r.r(t),r.d(t,{default:()=>i});var n=r(61125),o=r.n(n),a=r(67294);const i=(e,t)=>class extends a.Component{constructor(){super(...arguments),o()(this,"onLoad",(e=>{const{tag:r}=this.props,n=["operations-tag",r];t.layoutActions.readyToScroll(n,e)}))}render(){return a.createElement("span",{ref:this.onLoad},a.createElement(e,this.props))}}},60877:(e,t,r)=>{"use strict";r.r(t),r.d(t,{default:()=>i});var n=r(61125),o=r.n(n),a=r(67294);r(23930);const i=(e,t)=>class extends a.Component{constructor(){super(...arguments),o()(this,"onLoad",(e=>{const{operation:r}=this.props,{tag:n,operationId:o}=r.toObject();let{isShownKey:a}=r.toObject();a=a||["operations",n,o],t.layoutActions.readyToScroll(a,e)}))}render(){return a.createElement("span",{ref:this.onLoad},a.createElement(e,this.props))}}},48011:(e,t,r)=>{"use strict";r.r(t),r.d(t,{default:()=>d});var n=r(76986),o=r.n(n),a=r(63460),i=r.n(a),s=r(11882),l=r.n(s),u=r(35627),c=r.n(u),p=r(20573),f=r(43393),h=r(27504);function d(e){let{fn:t}=e;return{statePlugins:{spec:{actions:{download:e=>r=>{let{errActions:n,specSelectors:a,specActions:s,getConfigs:l}=r,{fetch:u}=t;const c=l();function p(t){if(t instanceof Error||t.status>=400)return s.updateLoadingStatus("failed"),n.newThrownErr(o()(new Error((t.message||t.statusText)+" "+e),{source:"fetch"})),void(!t.status&&t instanceof Error&&function(){try{let t;if("URL"in h.Z?t=new(i())(e):(t=document.createElement("a"),t.href=e),"https:"!==t.protocol&&"https:"===h.Z.location.protocol){const e=o()(new Error(`Possible mixed-content issue? The page was loaded over https:// but a ${t.protocol}// URL was specified. Check that you are not attempting to load mixed content.`),{source:"fetch"});return void n.newThrownErr(e)}if(t.origin!==h.Z.location.origin){const e=o()(new Error(`Possible cross-origin (CORS) issue? The URL origin (${t.origin}) does not match the page (${h.Z.location.origin}). Check the server returns the correct 'Access-Control-Allow-*' headers.`),{source:"fetch"});n.newThrownErr(e)}}catch(e){return}}());s.updateLoadingStatus("success"),s.updateSpec(t.text),a.url()!==e&&s.updateUrl(e)}e=e||a.url(),s.updateLoadingStatus("loading"),n.clear({source:"fetch"}),u({url:e,loadSpec:!0,requestInterceptor:c.requestInterceptor||(e=>e),responseInterceptor:c.responseInterceptor||(e=>e),credentials:"same-origin",headers:{Accept:"application/json,*/*"}}).then(p,p)},updateLoadingStatus:e=>{let t=[null,"loading","failed","success","failedConfig"];return-1===l()(t).call(t,e)&&console.error(`Error: ${e} is not one of ${c()(t)}`),{type:"spec_update_loading_status",payload:e}}},reducers:{spec_update_loading_status:(e,t)=>"string"==typeof t.payload?e.set("loadingStatus",t.payload):e},selectors:{loadingStatus:(0,p.P1)((e=>e||(0,f.Map)()),(e=>e.get("loadingStatus")||null))}}}}}},34966:(e,t,r)=>{"use strict";r.r(t),r.d(t,{NEW_THROWN_ERR:()=>o,NEW_THROWN_ERR_BATCH:()=>a,NEW_SPEC_ERR:()=>i,NEW_SPEC_ERR_BATCH:()=>s,NEW_AUTH_ERR:()=>l,CLEAR:()=>u,CLEAR_BY:()=>c,newThrownErr:()=>p,newThrownErrBatch:()=>f,newSpecErr:()=>h,newSpecErrBatch:()=>d,newAuthErr:()=>m,clear:()=>g,clearBy:()=>v});var n=r(7710);const o="err_new_thrown_err",a="err_new_thrown_err_batch",i="err_new_spec_err",s="err_new_spec_err_batch",l="err_new_auth_err",u="err_clear",c="err_clear_by";function p(e){return{type:o,payload:(0,n.serializeError)(e)}}function f(e){return{type:a,payload:e}}function h(e){return{type:i,payload:e}}function d(e){return{type:s,payload:e}}function m(e){return{type:l,payload:e}}function g(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return{type:u,payload:e}}function v(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:()=>!0;return{type:c,payload:e}}},56982:(e,t,r)=>{"use strict";r.r(t),r.d(t,{default:()=>c});var n=r(14418),o=r.n(n),a=r(97606),i=r.n(a),s=r(54061),l=r.n(s);const u=[r(2392),r(21835)];function c(e){var t;let r={jsSpec:{}},n=l()(u,((e,t)=>{try{let n=t.transform(e,r);return o()(n).call(n,(e=>!!e))}catch(t){return console.error("Transformer error:",t),e}}),e);return i()(t=o()(n).call(n,(e=>!!e))).call(t,(e=>(!e.get("line")&&e.get("path"),e)))}},2392:(e,t,r)=>{"use strict";r.r(t),r.d(t,{transform:()=>p});var n=r(97606),o=r.n(n),a=r(11882),i=r.n(a),s=r(24278),l=r.n(s),u=r(24282),c=r.n(u);function p(e){return o()(e).call(e,(e=>{var t;let r="is not of a type(s)",n=i()(t=e.get("message")).call(t,r);if(n>-1){var o,a;let t=l()(o=e.get("message")).call(o,n+r.length).split(",");return e.set("message",l()(a=e.get("message")).call(a,0,n)+function(e){return c()(e).call(e,((e,t,r,n)=>r===n.length-1&&n.length>1?e+"or "+t:n[r+1]&&n.length>2?e+t+", ":n[r+1]?e+t+" ":e+t),"should be a")}(t))}return e}))}},21835:(e,t,r)=>{"use strict";r.r(t),r.d(t,{transform:()=>n});r(97606),r(11882),r(27361),r(43393);function n(e,t){let{jsSpec:r}=t;return e}},77793:(e,t,r)=>{"use strict";r.r(t),r.d(t,{default:()=>i});var n=r(93527),o=r(34966),a=r(87667);function i(e){return{statePlugins:{err:{reducers:(0,n.default)(e),actions:o,selectors:a}}}}},93527:(e,t,r)=>{"use strict";r.r(t),r.d(t,{default:()=>v});var n=r(76986),o=r.n(n),a=r(97606),i=r.n(a),s=r(39022),l=r.n(s),u=r(14418),c=r.n(u),p=r(2250),f=r.n(p),h=r(34966),d=r(43393),m=r(56982);let g={line:0,level:"error",message:"Unknown error"};function v(){return{[h.NEW_THROWN_ERR]:(e,t)=>{let{payload:r}=t,n=o()(g,r,{type:"thrown"});return e.update("errors",(e=>(e||(0,d.List)()).push((0,d.fromJS)(n)))).update("errors",(e=>(0,m.default)(e)))},[h.NEW_THROWN_ERR_BATCH]:(e,t)=>{let{payload:r}=t;return r=i()(r).call(r,(e=>(0,d.fromJS)(o()(g,e,{type:"thrown"})))),e.update("errors",(e=>{var t;return l()(t=e||(0,d.List)()).call(t,(0,d.fromJS)(r))})).update("errors",(e=>(0,m.default)(e)))},[h.NEW_SPEC_ERR]:(e,t)=>{let{payload:r}=t,n=(0,d.fromJS)(r);return n=n.set("type","spec"),e.update("errors",(e=>(e||(0,d.List)()).push((0,d.fromJS)(n)).sortBy((e=>e.get("line"))))).update("errors",(e=>(0,m.default)(e)))},[h.NEW_SPEC_ERR_BATCH]:(e,t)=>{let{payload:r}=t;return r=i()(r).call(r,(e=>(0,d.fromJS)(o()(g,e,{type:"spec"})))),e.update("errors",(e=>{var t;return l()(t=e||(0,d.List)()).call(t,(0,d.fromJS)(r))})).update("errors",(e=>(0,m.default)(e)))},[h.NEW_AUTH_ERR]:(e,t)=>{let{payload:r}=t,n=(0,d.fromJS)(o()({},r));return n=n.set("type","auth"),e.update("errors",(e=>(e||(0,d.List)()).push((0,d.fromJS)(n)))).update("errors",(e=>(0,m.default)(e)))},[h.CLEAR]:(e,t)=>{var r;let{payload:n}=t;if(!n||!e.get("errors"))return e;let o=c()(r=e.get("errors")).call(r,(e=>{var t;return f()(t=e.keySeq()).call(t,(t=>{const r=e.get(t),o=n[t];return!o||r!==o}))}));return e.merge({errors:o})},[h.CLEAR_BY]:(e,t)=>{var r;let{payload:n}=t;if(!n||"function"!=typeof n)return e;let o=c()(r=e.get("errors")).call(r,(e=>n(e)));return e.merge({errors:o})}}}},87667:(e,t,r)=>{"use strict";r.r(t),r.d(t,{allErrors:()=>a,lastError:()=>i});var n=r(43393),o=r(20573);const a=(0,o.P1)((e=>e),(e=>e.get("errors",(0,n.List)()))),i=(0,o.P1)(a,(e=>e.last()))},49978:(e,t,r)=>{"use strict";r.r(t),r.d(t,{default:()=>o});var n=r(4309);function o(){return{fn:{opsFilter:n.default}}}},4309:(e,t,r)=>{"use strict";r.r(t),r.d(t,{default:()=>s});var n=r(14418),o=r.n(n),a=r(11882),i=r.n(a);function s(e,t){return o()(e).call(e,((e,r)=>-1!==i()(r).call(r,t)))}},25474:(e,t,r)=>{"use strict";r.r(t),r.d(t,{UPDATE_LAYOUT:()=>o,UPDATE_FILTER:()=>a,UPDATE_MODE:()=>i,SHOW:()=>s,updateLayout:()=>l,updateFilter:()=>u,show:()=>c,changeMode:()=>p});var n=r(90242);const o="layout_update_layout",a="layout_update_filter",i="layout_update_mode",s="layout_show";function l(e){return{type:o,payload:e}}function u(e){return{type:a,payload:e}}function c(e){let t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];return e=(0,n.AF)(e),{type:s,payload:{thing:e,shown:t}}}function p(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"";return e=(0,n.AF)(e),{type:i,payload:{thing:e,mode:t}}}},26821:(e,t,r)=>{"use strict";r.r(t),r.d(t,{default:()=>s});var n=r(5672),o=r(25474),a=r(4400),i=r(28989);function s(){return{statePlugins:{layout:{reducers:n.default,actions:o,selectors:a},spec:{wrapSelectors:i}}}}},5672:(e,t,r)=>{"use strict";r.r(t),r.d(t,{default:()=>s});var n=r(39022),o=r.n(n),a=r(43393),i=r(25474);const s={[i.UPDATE_LAYOUT]:(e,t)=>e.set("layout",t.payload),[i.UPDATE_FILTER]:(e,t)=>e.set("filter",t.payload),[i.SHOW]:(e,t)=>{const r=t.payload.shown,n=(0,a.fromJS)(t.payload.thing);return e.update("shown",(0,a.fromJS)({}),(e=>e.set(n,r)))},[i.UPDATE_MODE]:(e,t)=>{var r;let n=t.payload.thing,a=t.payload.mode;return e.setIn(o()(r=["modes"]).call(r,n),(a||"")+"")}}},4400:(e,t,r)=>{"use strict";r.r(t),r.d(t,{current:()=>i,currentFilter:()=>s,isShown:()=>l,whatMode:()=>u,showSummary:()=>c});var n=r(20573),o=r(90242),a=r(43393);const i=e=>e.get("layout"),s=e=>e.get("filter"),l=(e,t,r)=>(t=(0,o.AF)(t),e.get("shown",(0,a.fromJS)({})).get((0,a.fromJS)(t),r)),u=function(e,t){let r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"";return t=(0,o.AF)(t),e.getIn(["modes",...t],r)},c=(0,n.P1)((e=>e),(e=>!l(e,"editor")))},28989:(e,t,r)=>{"use strict";r.r(t),r.d(t,{taggedOperations:()=>a});var n=r(24278),o=r.n(n);const a=(e,t)=>function(r){for(var n=arguments.length,a=new Array(n>1?n-1:0),i=1;i=0&&(s=o()(s).call(s,0,f)),s}},9150:(e,t,r)=>{"use strict";r.r(t),r.d(t,{default:()=>a});var n=r(11189),o=r.n(n);function a(e){let{configs:t}=e;const r={debug:0,info:1,log:2,warn:3,error:4},n=e=>r[e]||-1;let{logLevel:a}=t,i=n(a);function s(e){for(var t=arguments.length,r=new Array(t>1?t-1:0),o=1;o=i&&console[e](...r)}return s.warn=o()(s).call(s,null,"warn"),s.error=o()(s).call(s,null,"error"),s.info=o()(s).call(s,null,"info"),s.debug=o()(s).call(s,null,"debug"),{rootInjects:{log:s}}}},67002:(e,t,r)=>{"use strict";r.r(t),r.d(t,{UPDATE_SELECTED_SERVER:()=>n,UPDATE_REQUEST_BODY_VALUE:()=>o,UPDATE_REQUEST_BODY_VALUE_RETAIN_FLAG:()=>a,UPDATE_REQUEST_BODY_INCLUSION:()=>i,UPDATE_ACTIVE_EXAMPLES_MEMBER:()=>s,UPDATE_REQUEST_CONTENT_TYPE:()=>l,UPDATE_RESPONSE_CONTENT_TYPE:()=>u,UPDATE_SERVER_VARIABLE_VALUE:()=>c,SET_REQUEST_BODY_VALIDATE_ERROR:()=>p,CLEAR_REQUEST_BODY_VALIDATE_ERROR:()=>f,CLEAR_REQUEST_BODY_VALUE:()=>h,setSelectedServer:()=>d,setRequestBodyValue:()=>m,setRetainRequestBodyValueFlag:()=>g,setRequestBodyInclusion:()=>v,setActiveExamplesMember:()=>y,setRequestContentType:()=>b,setResponseContentType:()=>w,setServerVariableValue:()=>E,setRequestBodyValidateError:()=>x,clearRequestBodyValidateError:()=>_,initRequestBodyValidateError:()=>S,clearRequestBodyValue:()=>A});const n="oas3_set_servers",o="oas3_set_request_body_value",a="oas3_set_request_body_retain_flag",i="oas3_set_request_body_inclusion",s="oas3_set_active_examples_member",l="oas3_set_request_content_type",u="oas3_set_response_content_type",c="oas3_set_server_variable_value",p="oas3_set_request_body_validate_error",f="oas3_clear_request_body_validate_error",h="oas3_clear_request_body_value";function d(e,t){return{type:n,payload:{selectedServerUrl:e,namespace:t}}}function m(e){let{value:t,pathMethod:r}=e;return{type:o,payload:{value:t,pathMethod:r}}}const g=e=>{let{value:t,pathMethod:r}=e;return{type:a,payload:{value:t,pathMethod:r}}};function v(e){let{value:t,pathMethod:r,name:n}=e;return{type:i,payload:{value:t,pathMethod:r,name:n}}}function y(e){let{name:t,pathMethod:r,contextType:n,contextName:o}=e;return{type:s,payload:{name:t,pathMethod:r,contextType:n,contextName:o}}}function b(e){let{value:t,pathMethod:r}=e;return{type:l,payload:{value:t,pathMethod:r}}}function w(e){let{value:t,path:r,method:n}=e;return{type:u,payload:{value:t,path:r,method:n}}}function E(e){let{server:t,namespace:r,key:n,val:o}=e;return{type:c,payload:{server:t,namespace:r,key:n,val:o}}}const x=e=>{let{path:t,method:r,validationErrors:n}=e;return{type:p,payload:{path:t,method:r,validationErrors:n}}},_=e=>{let{path:t,method:r}=e;return{type:f,payload:{path:t,method:r}}},S=e=>{let{pathMethod:t}=e;return{type:f,payload:{path:t[0],method:t[1]}}},A=e=>{let{pathMethod:t}=e;return{type:h,payload:{pathMethod:t}}}},73723:(e,t,r)=>{"use strict";r.r(t),r.d(t,{definitionsToAuthorize:()=>f});var n=r(86),o=r.n(n),a=r(14418),i=r.n(a),s=r(24282),l=r.n(s),u=r(20573),c=r(43393),p=r(7779);const f=(h=(0,u.P1)((e=>e),(e=>{let{specSelectors:t}=e;return t.securityDefinitions()}),((e,t)=>{var r;let n=(0,c.List)();return t?(o()(r=t.entrySeq()).call(r,(e=>{let[t,r]=e;const a=r.get("type");var s;if("oauth2"===a&&o()(s=r.get("flows").entrySeq()).call(s,(e=>{let[o,a]=e,s=(0,c.fromJS)({flow:o,authorizationUrl:a.get("authorizationUrl"),tokenUrl:a.get("tokenUrl"),scopes:a.get("scopes"),type:r.get("type"),description:r.get("description")});n=n.push(new c.Map({[t]:i()(s).call(s,(e=>void 0!==e))}))})),"http"!==a&&"apiKey"!==a||(n=n.push(new c.Map({[t]:r}))),"openIdConnect"===a&&r.get("openIdConnectData")){let e=r.get("openIdConnectData"),a=e.get("grant_types_supported")||["authorization_code","implicit"];o()(a).call(a,(o=>{var a;let s=e.get("scopes_supported")&&l()(a=e.get("scopes_supported")).call(a,((e,t)=>e.set(t,"")),new c.Map),u=(0,c.fromJS)({flow:o,authorizationUrl:e.get("authorization_endpoint"),tokenUrl:e.get("token_endpoint"),scopes:s,type:"oauth2",openIdConnectUrl:r.get("openIdConnectUrl")});n=n.push(new c.Map({[t]:i()(u).call(u,(e=>void 0!==e))}))}))}})),n):n})),(e,t)=>function(){const r=t.getSystem().specSelectors.specJson();for(var n=arguments.length,o=new Array(n),a=0;a{"use strict";r.r(t),r.d(t,{default:()=>u});var n=r(23101),o=r.n(n),a=r(97606),i=r.n(a),s=r(67294),l=(r(23930),r(43393));const u=e=>{var t;let{callbacks:r,getComponent:n,specPath:a}=e;const u=n("OperationContainer",!0);if(!r)return s.createElement("span",null,"No callbacks");let c=i()(t=r.entrySeq()).call(t,(t=>{var r;let[n,c]=t;return s.createElement("div",{key:n},s.createElement("h2",null,n),i()(r=c.entrySeq()).call(r,(t=>{var r;let[c,p]=t;return"$$ref"===c?null:s.createElement("div",{key:c},i()(r=p.entrySeq()).call(r,(t=>{let[r,i]=t;if("$$ref"===r)return null;let p=(0,l.fromJS)({operation:i});return s.createElement(u,o()({},e,{op:p,key:r,tag:"",method:r,path:c,specPath:a.push(n,c,r),allowTryItOut:!1}))})))})))}));return s.createElement("div",null,c)}},86775:(e,t,r)=>{"use strict";r.r(t),r.d(t,{default:()=>f});var n=r(61125),o=r.n(n),a=r(76986),i=r.n(a),s=r(14418),l=r.n(s),u=r(97606),c=r.n(u),p=r(67294);class f extends p.Component{constructor(e,t){super(e,t),o()(this,"onChange",(e=>{let{onChange:t}=this.props,{value:r,name:n}=e.target,o=i()({},this.state.value);n?o[n]=r:o=r,this.setState({value:o},(()=>t(this.state)))}));let{name:r,schema:n}=this.props,a=this.getValue();this.state={name:r,schema:n,value:a}}getValue(){let{name:e,authorized:t}=this.props;return t&&t.getIn([e,"value"])}render(){var e;let{schema:t,getComponent:r,errSelectors:n,name:o}=this.props;const a=r("Input"),i=r("Row"),s=r("Col"),u=r("authError"),f=r("Markdown",!0),h=r("JumpToPath",!0),d=(t.get("scheme")||"").toLowerCase();let m=this.getValue(),g=l()(e=n.allErrors()).call(e,(e=>e.get("authId")===o));if("basic"===d){var v;let e=m?m.get("username"):null;return p.createElement("div",null,p.createElement("h4",null,p.createElement("code",null,o||t.get("name")),"  (http, Basic)",p.createElement(h,{path:["securityDefinitions",o]})),e&&p.createElement("h6",null,"Authorized"),p.createElement(i,null,p.createElement(f,{source:t.get("description")})),p.createElement(i,null,p.createElement("label",null,"Username:"),e?p.createElement("code",null," ",e," "):p.createElement(s,null,p.createElement(a,{type:"text",required:"required",name:"username","aria-label":"auth-basic-username",onChange:this.onChange,autoFocus:!0}))),p.createElement(i,null,p.createElement("label",null,"Password:"),e?p.createElement("code",null," ****** "):p.createElement(s,null,p.createElement(a,{autoComplete:"new-password",name:"password",type:"password","aria-label":"auth-basic-password",onChange:this.onChange}))),c()(v=g.valueSeq()).call(v,((e,t)=>p.createElement(u,{error:e,key:t}))))}var y;return"bearer"===d?p.createElement("div",null,p.createElement("h4",null,p.createElement("code",null,o||t.get("name")),"  (http, Bearer)",p.createElement(h,{path:["securityDefinitions",o]})),m&&p.createElement("h6",null,"Authorized"),p.createElement(i,null,p.createElement(f,{source:t.get("description")})),p.createElement(i,null,p.createElement("label",null,"Value:"),m?p.createElement("code",null," ****** "):p.createElement(s,null,p.createElement(a,{type:"text","aria-label":"auth-bearer-value",onChange:this.onChange,autoFocus:!0}))),c()(y=g.valueSeq()).call(y,((e,t)=>p.createElement(u,{error:e,key:t})))):p.createElement("div",null,p.createElement("em",null,p.createElement("b",null,o)," HTTP authentication: unsupported scheme ",`'${d}'`))}}},76467:(e,t,r)=>{"use strict";r.r(t),r.d(t,{default:()=>p});var n=r(33427),o=r(42458),a=r(15757),i=r(56617),s=r(9928),l=r(45327),u=r(86775),c=r(96796);const p={Callbacks:n.default,HttpAuth:u.default,RequestBody:o.default,Servers:i.default,ServersContainer:s.default,RequestBodyEditor:l.default,OperationServers:c.default,operationLink:a.default}},15757:(e,t,r)=>{"use strict";r.r(t),r.d(t,{default:()=>u});var n=r(35627),o=r.n(n),a=r(97606),i=r.n(a),s=r(67294);r(23930);class l extends s.Component{render(){const{link:e,name:t,getComponent:r}=this.props,n=r("Markdown",!0);let a=e.get("operationId")||e.get("operationRef"),l=e.get("parameters")&&e.get("parameters").toJS(),u=e.get("description");return s.createElement("div",{className:"operation-link"},s.createElement("div",{className:"description"},s.createElement("b",null,s.createElement("code",null,t)),u?s.createElement(n,{source:u}):null),s.createElement("pre",null,"Operation `",a,"`",s.createElement("br",null),s.createElement("br",null),"Parameters ",function(e,t){var r;if("string"!=typeof t)return"";return i()(r=t.split("\n")).call(r,((t,r)=>r>0?Array(e+1).join(" ")+t:t)).join("\n")}(0,o()(l,null,2))||"{}",s.createElement("br",null)))}}const u=l},96796:(e,t,r)=>{"use strict";r.r(t),r.d(t,{default:()=>i});var n=r(61125),o=r.n(n),a=r(67294);r(23930);class i extends a.Component{constructor(){super(...arguments),o()(this,"setSelectedServer",(e=>{const{path:t,method:r}=this.props;return this.forceUpdate(),this.props.setSelectedServer(e,`${t}:${r}`)})),o()(this,"setServerVariableValue",(e=>{const{path:t,method:r}=this.props;return this.forceUpdate(),this.props.setServerVariableValue({...e,namespace:`${t}:${r}`})})),o()(this,"getSelectedServer",(()=>{const{path:e,method:t}=this.props;return this.props.getSelectedServer(`${e}:${t}`)})),o()(this,"getServerVariable",((e,t)=>{const{path:r,method:n}=this.props;return this.props.getServerVariable({namespace:`${r}:${n}`,server:e},t)})),o()(this,"getEffectiveServerValue",(e=>{const{path:t,method:r}=this.props;return this.props.getEffectiveServerValue({server:e,namespace:`${t}:${r}`})}))}render(){const{operationServers:e,pathServers:t,getComponent:r}=this.props;if(!e&&!t)return null;const n=r("Servers"),o=e||t,i=e?"operation":"path";return a.createElement("div",{className:"opblock-section operation-servers"},a.createElement("div",{className:"opblock-section-header"},a.createElement("div",{className:"tab-header"},a.createElement("h4",{className:"opblock-title"},"Servers"))),a.createElement("div",{className:"opblock-description-wrapper"},a.createElement("h4",{className:"message"},"These ",i,"-level options override the global server options."),a.createElement(n,{servers:o,currentServer:this.getSelectedServer(),setSelectedServer:this.setSelectedServer,setServerVariableValue:this.setServerVariableValue,getServerVariable:this.getServerVariable,getEffectiveServerValue:this.getEffectiveServerValue})))}}},45327:(e,t,r)=>{"use strict";r.r(t),r.d(t,{default:()=>c});var n=r(61125),o=r.n(n),a=r(67294),i=r(94184),s=r.n(i),l=r(90242);const u=Function.prototype;class c extends a.PureComponent{constructor(e,t){super(e,t),o()(this,"applyDefaultValue",(e=>{const{onChange:t,defaultValue:r}=e||this.props;return this.setState({value:r}),t(r)})),o()(this,"onChange",(e=>{this.props.onChange((0,l.Pz)(e))})),o()(this,"onDomChange",(e=>{const t=e.target.value;this.setState({value:t},(()=>this.onChange(t)))})),this.state={value:(0,l.Pz)(e.value)||e.defaultValue},e.onChange(e.value)}UNSAFE_componentWillReceiveProps(e){this.props.value!==e.value&&e.value!==this.state.value&&this.setState({value:(0,l.Pz)(e.value)}),!e.value&&e.defaultValue&&this.state.value&&this.applyDefaultValue(e)}render(){let{getComponent:e,errors:t}=this.props,{value:r}=this.state,n=t.size>0;const o=e("TextArea");return a.createElement("div",{className:"body-param"},a.createElement(o,{className:s()("body-param__text",{invalid:n}),title:t.size?t.join(", "):"",value:r,onChange:this.onDomChange}))}}o()(c,"defaultProps",{onChange:u,userHasEditedBody:!1})},42458:(e,t,r)=>{"use strict";r.r(t),r.d(t,{getDefaultRequestBodyValue:()=>m,default:()=>g});var n=r(97606),o=r.n(n),a=r(11882),i=r.n(a),s=r(58118),l=r.n(s),u=r(58309),c=r.n(u),p=r(67294),f=(r(23930),r(43393)),h=r(90242),d=r(2518);const m=(e,t,r)=>{const n=e.getIn(["content",t]),o=n.get("schema").toJS(),a=void 0!==n.get("examples"),i=n.get("example"),s=a?n.getIn(["examples",r,"value"]):i,l=(0,h.xi)(o,t,{includeWriteOnly:!0},s);return(0,h.Pz)(l)},g=e=>{let{userHasEditedBody:t,requestBody:r,requestBodyValue:n,requestBodyInclusionSetting:a,requestBodyErrors:s,getComponent:u,getConfigs:g,specSelectors:v,fn:y,contentType:b,isExecute:w,specPath:E,onChange:x,onChangeIncludeEmpty:_,activeExamplesKey:S,updateActiveExamplesKey:A,setRetainRequestBodyValueFlag:k}=e;const C=e=>{x(e.target.files[0])},O=e=>{let t={key:e,shouldDispatchInit:!1,defaultValue:!0};return"no value"===a.get(e,"no value")&&(t.shouldDispatchInit=!0),t},j=u("Markdown",!0),I=u("modelExample"),N=u("RequestBodyEditor"),T=u("highlightCode"),P=u("ExamplesSelectValueRetainer"),R=u("Example"),M=u("ParameterIncludeEmpty"),{showCommonExtensions:D}=g(),L=r&&r.get("description")||null,B=r&&r.get("content")||new f.OrderedMap;b=b||B.keySeq().first()||"";const F=B.get(b,(0,f.OrderedMap)()),z=F.get("schema",(0,f.OrderedMap)()),U=F.get("examples",null),q=null==U?void 0:o()(U).call(U,((e,t)=>{var n;const o=null===(n=e)||void 0===n?void 0:n.get("value",null);return o&&(e=e.set("value",m(r,b,t),o)),e}));if(s=f.List.isList(s)?s:(0,f.List)(),!F.size)return null;const V="object"===F.getIn(["schema","type"]),$="binary"===F.getIn(["schema","format"]),W="base64"===F.getIn(["schema","format"]);if("application/octet-stream"===b||0===i()(b).call(b,"image/")||0===i()(b).call(b,"audio/")||0===i()(b).call(b,"video/")||$||W){const e=u("Input");return w?p.createElement(e,{type:"file",onChange:C}):p.createElement("i",null,"Example values are not available for ",p.createElement("code",null,b)," media types.")}if(V&&("application/x-www-form-urlencoded"===b||0===i()(b).call(b,"multipart/"))&&z.get("properties",(0,f.OrderedMap)()).size>0){var H;const e=u("JsonSchemaForm"),t=u("ParameterExt"),r=z.get("properties",(0,f.OrderedMap)());return n=f.Map.isMap(n)?n:(0,f.OrderedMap)(),p.createElement("div",{className:"table-container"},L&&p.createElement(j,{source:L}),p.createElement("table",null,p.createElement("tbody",null,f.Map.isMap(r)&&o()(H=r.entrySeq()).call(H,(r=>{var i,d;let[m,g]=r;if(g.get("readOnly"))return;let v=D?(0,h.po)(g):null;const b=l()(i=z.get("required",(0,f.List)())).call(i,m),E=g.get("type"),S=g.get("format"),A=g.get("description"),k=n.getIn([m,"value"]),C=n.getIn([m,"errors"])||s,I=a.get(m)||!1,N=g.has("default")||g.has("example")||g.hasIn(["items","example"])||g.hasIn(["items","default"]),T=g.has("enum")&&(1===g.get("enum").size||b),P=N||T;let R="";"array"!==E||P||(R=[]),("object"===E||P)&&(R=(0,h.xi)(g,!1,{includeWriteOnly:!0})),"string"!=typeof R&&"object"===E&&(R=(0,h.Pz)(R)),"string"==typeof R&&"array"===E&&(R=JSON.parse(R));const L="string"===E&&("binary"===S||"base64"===S);return p.createElement("tr",{key:m,className:"parameters","data-property-name":m},p.createElement("td",{className:"parameters-col_name"},p.createElement("div",{className:b?"parameter__name required":"parameter__name"},m,b?p.createElement("span",null," *"):null),p.createElement("div",{className:"parameter__type"},E,S&&p.createElement("span",{className:"prop-format"},"($",S,")"),D&&v.size?o()(d=v.entrySeq()).call(d,(e=>{let[r,n]=e;return p.createElement(t,{key:`${r}-${n}`,xKey:r,xVal:n})})):null),p.createElement("div",{className:"parameter__deprecated"},g.get("deprecated")?"deprecated":null)),p.createElement("td",{className:"parameters-col_description"},p.createElement(j,{source:A}),w?p.createElement("div",null,p.createElement(e,{fn:y,dispatchInitialValue:!L,schema:g,description:m,getComponent:u,value:void 0===k?R:k,required:b,errors:C,onChange:e=>{x(e,[m])}}),b?null:p.createElement(M,{onChange:e=>_(m,e),isIncluded:I,isIncludedOptions:O(m),isDisabled:c()(k)?0!==k.length:!(0,h.O2)(k)})):null))})))))}const J=m(r,b,S);let K=null;return(0,d.O)(J)&&(K="json"),p.createElement("div",null,L&&p.createElement(j,{source:L}),q?p.createElement(P,{userHasEditedBody:t,examples:q,currentKey:S,currentUserInputValue:n,onSelect:e=>{A(e)},updateValue:x,defaultToFirstExample:!0,getComponent:u,setRetainRequestBodyValueFlag:k}):null,w?p.createElement("div",null,p.createElement(N,{value:n,errors:s,defaultValue:J,onChange:x,getComponent:u})):p.createElement(I,{getComponent:u,getConfigs:g,specSelectors:v,expandDepth:1,isExecute:w,schema:F.get("schema"),specPath:E.push("content",b),example:p.createElement(T,{className:"body-param__example",getConfigs:g,language:K,value:(0,h.Pz)(n)||J}),includeWriteOnly:!0}),q?p.createElement(R,{example:q.get(S),getComponent:u,getConfigs:g}):null)}},9928:(e,t,r)=>{"use strict";r.r(t),r.d(t,{default:()=>o});var n=r(67294);class o extends n.Component{render(){const{specSelectors:e,oas3Selectors:t,oas3Actions:r,getComponent:o}=this.props,a=e.servers(),i=o("Servers");return a&&a.size?n.createElement("div",null,n.createElement("span",{className:"servers-title"},"Servers"),n.createElement(i,{servers:a,currentServer:t.selectedServer(),setSelectedServer:r.setSelectedServer,setServerVariableValue:r.setServerVariableValue,getServerVariable:t.serverVariableValue,getEffectiveServerValue:t.serverEffectiveValue})):null}}},56617:(e,t,r)=>{"use strict";r.r(t),r.d(t,{default:()=>p});var n=r(61125),o=r.n(n),a=r(51679),i=r.n(a),s=r(97606),l=r.n(s),u=r(67294),c=r(43393);r(23930);class p extends u.Component{constructor(){super(...arguments),o()(this,"onServerChange",(e=>{this.setServer(e.target.value)})),o()(this,"onServerVariableValueChange",(e=>{let{setServerVariableValue:t,currentServer:r}=this.props,n=e.target.getAttribute("data-variable"),o=e.target.value;"function"==typeof t&&t({server:r,key:n,val:o})})),o()(this,"setServer",(e=>{let{setSelectedServer:t}=this.props;t(e)}))}componentDidMount(){var e;let{servers:t,currentServer:r}=this.props;r||this.setServer(null===(e=t.first())||void 0===e?void 0:e.get("url"))}UNSAFE_componentWillReceiveProps(e){let{servers:t,setServerVariableValue:r,getServerVariable:n}=e;if(this.props.currentServer!==e.currentServer||this.props.servers!==e.servers){var o;let a=i()(t).call(t,(t=>t.get("url")===e.currentServer)),s=i()(o=this.props.servers).call(o,(e=>e.get("url")===this.props.currentServer))||(0,c.OrderedMap)();if(!a)return this.setServer(t.first().get("url"));let u=s.get("variables")||(0,c.OrderedMap)(),p=(i()(u).call(u,(e=>e.get("default")))||(0,c.OrderedMap)()).get("default"),f=a.get("variables")||(0,c.OrderedMap)(),h=(i()(f).call(f,(e=>e.get("default")))||(0,c.OrderedMap)()).get("default");l()(f).call(f,((t,o)=>{n(e.currentServer,o)&&p===h||r({server:e.currentServer,key:o,val:t.get("default")||""})}))}}render(){var e,t;let{servers:r,currentServer:n,getServerVariable:o,getEffectiveServerValue:a}=this.props,s=(i()(r).call(r,(e=>e.get("url")===n))||(0,c.OrderedMap)()).get("variables")||(0,c.OrderedMap)(),p=0!==s.size;return u.createElement("div",{className:"servers"},u.createElement("label",{htmlFor:"servers"},u.createElement("select",{onChange:this.onServerChange,value:n},l()(e=r.valueSeq()).call(e,(e=>u.createElement("option",{value:e.get("url"),key:e.get("url")},e.get("url"),e.get("description")&&` - ${e.get("description")}`))).toArray())),p?u.createElement("div",null,u.createElement("div",{className:"computed-url"},"Computed URL:",u.createElement("code",null,a(n))),u.createElement("h4",null,"Server variables"),u.createElement("table",null,u.createElement("tbody",null,l()(t=s.entrySeq()).call(t,(e=>{var t;let[r,a]=e;return u.createElement("tr",{key:r},u.createElement("td",null,r),u.createElement("td",null,a.get("enum")?u.createElement("select",{"data-variable":r,onChange:this.onServerVariableValueChange},l()(t=a.get("enum")).call(t,(e=>u.createElement("option",{selected:e===o(n,r),key:e,value:e},e)))):u.createElement("input",{type:"text",value:o(n,r)||"",onChange:this.onServerVariableValueChange,"data-variable":r})))}))))):null)}}},7779:(e,t,r)=>{"use strict";r.r(t),r.d(t,{isOAS3:()=>l,isSwagger2:()=>u,OAS3ComponentWrapFactory:()=>c});var n=r(23101),o=r.n(n),a=r(27043),i=r.n(a),s=r(67294);function l(e){const t=e.get("openapi");return"string"==typeof t&&(i()(t).call(t,"3.0.")&&t.length>4)}function u(e){const t=e.get("swagger");return"string"==typeof t&&i()(t).call(t,"2.0")}function c(e){return(t,r)=>n=>{if(r&&r.specSelectors&&r.specSelectors.specJson){return l(r.specSelectors.specJson())?s.createElement(e,o()({},n,r,{Ori:t})):s.createElement(t,n)}return console.warn("OAS3 wrapper: couldn't get spec"),null}}},97451:(e,t,r)=>{"use strict";r.r(t),r.d(t,{default:()=>p});var n=r(92044),o=r(73723),a=r(91741),i=r(76467),s=r(37761),l=r(67002),u=r(5065),c=r(62109);function p(){return{components:i.default,wrapComponents:s.default,statePlugins:{spec:{wrapSelectors:n,selectors:a},auth:{wrapSelectors:o},oas3:{actions:l,reducers:c.default,selectors:u}}}}},62109:(e,t,r)=>{"use strict";r.r(t),r.d(t,{default:()=>p});var n=r(8712),o=r.n(n),a=r(86),i=r.n(a),s=r(24282),l=r.n(s),u=r(43393),c=r(67002);const p={[c.UPDATE_SELECTED_SERVER]:(e,t)=>{let{payload:{selectedServerUrl:r,namespace:n}}=t;const o=n?[n,"selectedServer"]:["selectedServer"];return e.setIn(o,r)},[c.UPDATE_REQUEST_BODY_VALUE]:(e,t)=>{let{payload:{value:r,pathMethod:n}}=t,[a,s]=n;if(!u.Map.isMap(r))return e.setIn(["requestData",a,s,"bodyValue"],r);let l,c=e.getIn(["requestData",a,s,"bodyValue"])||(0,u.Map)();u.Map.isMap(c)||(c=(0,u.Map)());const[...p]=o()(r).call(r);return i()(p).call(p,(e=>{let t=r.getIn([e]);c.has(e)&&u.Map.isMap(t)||(l=c.setIn([e,"value"],t))})),e.setIn(["requestData",a,s,"bodyValue"],l)},[c.UPDATE_REQUEST_BODY_VALUE_RETAIN_FLAG]:(e,t)=>{let{payload:{value:r,pathMethod:n}}=t,[o,a]=n;return e.setIn(["requestData",o,a,"retainBodyValue"],r)},[c.UPDATE_REQUEST_BODY_INCLUSION]:(e,t)=>{let{payload:{value:r,pathMethod:n,name:o}}=t,[a,i]=n;return e.setIn(["requestData",a,i,"bodyInclusion",o],r)},[c.UPDATE_ACTIVE_EXAMPLES_MEMBER]:(e,t)=>{let{payload:{name:r,pathMethod:n,contextType:o,contextName:a}}=t,[i,s]=n;return e.setIn(["examples",i,s,o,a,"activeExample"],r)},[c.UPDATE_REQUEST_CONTENT_TYPE]:(e,t)=>{let{payload:{value:r,pathMethod:n}}=t,[o,a]=n;return e.setIn(["requestData",o,a,"requestContentType"],r)},[c.UPDATE_RESPONSE_CONTENT_TYPE]:(e,t)=>{let{payload:{value:r,path:n,method:o}}=t;return e.setIn(["requestData",n,o,"responseContentType"],r)},[c.UPDATE_SERVER_VARIABLE_VALUE]:(e,t)=>{let{payload:{server:r,namespace:n,key:o,val:a}}=t;const i=n?[n,"serverVariableValues",r,o]:["serverVariableValues",r,o];return e.setIn(i,a)},[c.SET_REQUEST_BODY_VALIDATE_ERROR]:(e,t)=>{let{payload:{path:r,method:n,validationErrors:o}}=t,a=[];if(a.push("Required field is not provided"),o.missingBodyValue)return e.setIn(["requestData",r,n,"errors"],(0,u.fromJS)(a));if(o.missingRequiredKeys&&o.missingRequiredKeys.length>0){const{missingRequiredKeys:t}=o;return e.updateIn(["requestData",r,n,"bodyValue"],(0,u.fromJS)({}),(e=>l()(t).call(t,((e,t)=>e.setIn([t,"errors"],(0,u.fromJS)(a))),e)))}return console.warn("unexpected result: SET_REQUEST_BODY_VALIDATE_ERROR"),e},[c.CLEAR_REQUEST_BODY_VALIDATE_ERROR]:(e,t)=>{let{payload:{path:r,method:n}}=t;const a=e.getIn(["requestData",r,n,"bodyValue"]);if(!u.Map.isMap(a))return e.setIn(["requestData",r,n,"errors"],(0,u.fromJS)([]));const[...i]=o()(a).call(a);return i?e.updateIn(["requestData",r,n,"bodyValue"],(0,u.fromJS)({}),(e=>l()(i).call(i,((e,t)=>e.setIn([t,"errors"],(0,u.fromJS)([]))),e))):e},[c.CLEAR_REQUEST_BODY_VALUE]:(e,t)=>{let{payload:{pathMethod:r}}=t,[n,o]=r;const a=e.getIn(["requestData",n,o,"bodyValue"]);return a?u.Map.isMap(a)?e.setIn(["requestData",n,o,"bodyValue"],(0,u.Map)()):e.setIn(["requestData",n,o,"bodyValue"],""):e}}},5065:(e,t,r)=>{"use strict";r.r(t),r.d(t,{selectedServer:()=>g,requestBodyValue:()=>v,shouldRetainRequestBodyValue:()=>y,hasUserEditedBody:()=>b,requestBodyInclusionSetting:()=>w,requestBodyErrors:()=>E,activeExamplesMember:()=>x,requestContentType:()=>_,responseContentType:()=>S,serverVariableValue:()=>A,serverVariables:()=>k,serverEffectiveValue:()=>C,validateBeforeExecute:()=>O,validateShallowRequired:()=>I});var n=r(97606),o=r.n(n),a=r(86),i=r.n(a),s=r(28222),l=r.n(s),u=r(11882),c=r.n(u),p=r(43393),f=r(7779),h=r(42458),d=r(90242);function m(e){return function(){for(var t=arguments.length,r=new Array(t),n=0;n{const n=t.getSystem().specSelectors.specJson();return(0,f.isOAS3)(n)?e(...r):null}}}const g=m(((e,t)=>{const r=t?[t,"selectedServer"]:["selectedServer"];return e.getIn(r)||""})),v=m(((e,t,r)=>e.getIn(["requestData",t,r,"bodyValue"])||null)),y=m(((e,t,r)=>e.getIn(["requestData",t,r,"retainBodyValue"])||!1)),b=(e,t,r)=>e=>{const{oas3Selectors:n,specSelectors:o}=e.getSystem(),a=o.specJson();if((0,f.isOAS3)(a)){let e=!1;const a=n.requestContentType(t,r);let i=n.requestBodyValue(t,r);if(p.Map.isMap(i)&&(i=(0,d.Pz)(i.mapEntries((e=>p.Map.isMap(e[1])?[e[0],e[1].get("value")]:e)).toJS())),p.List.isList(i)&&(i=(0,d.Pz)(i)),a){const s=(0,h.getDefaultRequestBodyValue)(o.specResolvedSubtree(["paths",t,r,"requestBody"]),a,n.activeExamplesMember(t,r,"requestBody","requestBody"));e=!!i&&i!==s}return e}return null},w=m(((e,t,r)=>e.getIn(["requestData",t,r,"bodyInclusion"])||(0,p.Map)())),E=m(((e,t,r)=>e.getIn(["requestData",t,r,"errors"])||null)),x=m(((e,t,r,n,o)=>e.getIn(["examples",t,r,n,o,"activeExample"])||null)),_=m(((e,t,r)=>e.getIn(["requestData",t,r,"requestContentType"])||null)),S=m(((e,t,r)=>e.getIn(["requestData",t,r,"responseContentType"])||null)),A=m(((e,t,r)=>{let n;if("string"!=typeof t){const{server:e,namespace:o}=t;n=o?[o,"serverVariableValues",e,r]:["serverVariableValues",e,r]}else{n=["serverVariableValues",t,r]}return e.getIn(n)||null})),k=m(((e,t)=>{let r;if("string"!=typeof t){const{server:e,namespace:n}=t;r=n?[n,"serverVariableValues",e]:["serverVariableValues",e]}else{r=["serverVariableValues",t]}return e.getIn(r)||(0,p.OrderedMap)()})),C=m(((e,t)=>{var r,n;if("string"!=typeof t){const{server:o,namespace:a}=t;n=o,r=a?e.getIn([a,"serverVariableValues",n]):e.getIn(["serverVariableValues",n])}else n=t,r=e.getIn(["serverVariableValues",n]);r=r||(0,p.OrderedMap)();let a=n;return o()(r).call(r,((e,t)=>{a=a.replace(new RegExp(`{${t}}`,"g"),e)})),a})),O=(j=(e,t)=>((e,t)=>(t=t||[],!!e.getIn(["requestData",...t,"bodyValue"])))(e,t),function(){for(var e=arguments.length,t=new Array(e),r=0;r{const r=e.getSystem().specSelectors.specJson();let n=[...t][1]||[];return!r.getIn(["paths",...n,"requestBody","required"])||j(...t)}});var j;const I=(e,t)=>{var r;let{oas3RequiredRequestBodyContentType:n,oas3RequestContentType:o,oas3RequestBodyValue:a}=t,s=[];if(!p.Map.isMap(a))return s;let u=[];return i()(r=l()(n.requestContentType)).call(r,(e=>{if(e===o){let t=n.requestContentType[e];i()(t).call(t,(e=>{c()(u).call(u,e)<0&&u.push(e)}))}})),i()(u).call(u,(e=>{a.getIn([e,"value"])||s.push(e)})),s}},91741:(e,t,r)=>{"use strict";r.r(t),r.d(t,{servers:()=>u,isSwagger2:()=>p});var n=r(20573),o=r(43393),a=r(7779);const i=e=>e||(0,o.Map)(),s=(0,n.P1)(i,(e=>e.get("json",(0,o.Map)()))),l=(0,n.P1)(i,(e=>e.get("resolved",(0,o.Map)()))),u=(c=(0,n.P1)((e=>{let t=l(e);return t.count()<1&&(t=s(e)),t}),(e=>e.getIn(["servers"])||(0,o.Map)())),()=>function(e){const t=e.getSystem().specSelectors.specJson();if((0,a.isOAS3)(t)){for(var r=arguments.length,n=new Array(r>1?r-1:0),o=1;o()=>{const e=t.getSystem().specSelectors.specJson();return(0,a.isSwagger2)(e)}},92044:(e,t,r)=>{"use strict";r.r(t),r.d(t,{definitions:()=>h,hasHost:()=>d,securityDefinitions:()=>m,host:()=>g,basePath:()=>v,consumes:()=>y,produces:()=>b,schemes:()=>w,servers:()=>E,isOAS3:()=>x,isSwagger2:()=>_});var n=r(20573),o=r(33881),a=r(43393),i=r(7779);function s(e){return(t,r)=>function(){const n=r.getSystem().specSelectors.specJson();return(0,i.isOAS3)(n)?e(...arguments):t(...arguments)}}const l=e=>e||(0,a.Map)(),u=s((0,n.P1)((()=>null))),c=(0,n.P1)(l,(e=>e.get("json",(0,a.Map)()))),p=(0,n.P1)(l,(e=>e.get("resolved",(0,a.Map)()))),f=e=>{let t=p(e);return t.count()<1&&(t=c(e)),t},h=s((0,n.P1)(f,(e=>{const t=e.getIn(["components","schemas"]);return a.Map.isMap(t)?t:(0,a.Map)()}))),d=s((e=>f(e).hasIn(["servers",0]))),m=s((0,n.P1)(o.specJsonWithResolvedSubtrees,(e=>e.getIn(["components","securitySchemes"])||null))),g=u,v=u,y=u,b=u,w=u,E=s((0,n.P1)(f,(e=>e.getIn(["servers"])||(0,a.Map)()))),x=(e,t)=>()=>{const e=t.getSystem().specSelectors.specJson();return(0,i.isOAS3)(a.Map.isMap(e)?e:(0,a.Map)())},_=(e,t)=>()=>{const e=t.getSystem().specSelectors.specJson();return(0,i.isSwagger2)(a.Map.isMap(e)?e:(0,a.Map)())}},70356:(e,t,r)=>{"use strict";r.r(t),r.d(t,{default:()=>o});var n=r(67294);const o=(0,r(7779).OAS3ComponentWrapFactory)((e=>{let{Ori:t,...r}=e;const{schema:o,getComponent:a,errSelectors:i,authorized:s,onAuthChange:l,name:u}=r,c=a("HttpAuth");return"http"===o.get("type")?n.createElement(c,{key:u,schema:o,name:u,errSelectors:i,authorized:s,getComponent:a,onChange:l}):n.createElement(t,r)}))},37761:(e,t,r)=>{"use strict";r.r(t),r.d(t,{default:()=>u});var n=r(22460),o=r(70356),a=r(69487),i=r(50058),s=r(53499),l=r(90287);const u={Markdown:n.default,AuthItem:o.default,JsonSchema_string:l.default,VersionStamp:a.default,model:s.default,onlineValidatorBadge:i.default}},90287:(e,t,r)=>{"use strict";r.r(t),r.d(t,{default:()=>o});var n=r(67294);const o=(0,r(7779).OAS3ComponentWrapFactory)((e=>{let{Ori:t,...r}=e;const{schema:o,getComponent:a,errors:i,onChange:s}=r,l=o&&o.get?o.get("format"):null,u=o&&o.get?o.get("type"):null,c=a("Input");return u&&"string"===u&&l&&("binary"===l||"base64"===l)?n.createElement(c,{type:"file",className:i.length?"invalid":"",title:i.length?i:"",onChange:e=>{s(e.target.files[0])},disabled:t.isDisabled}):n.createElement(t,r)}))},22460:(e,t,r)=>{"use strict";r.r(t),r.d(t,{Markdown:()=>f,default:()=>h});var n=r(81607),o=r.n(n),a=r(67294),i=r(94184),s=r.n(i),l=r(89927),u=r(7779),c=r(86019);const p=new l._("commonmark");p.block.ruler.enable(["table"]),p.set({linkTarget:"_blank"});const f=e=>{let{source:t,className:r="",getConfigs:n}=e;if("string"!=typeof t)return null;if(t){const{useUnsafeMarkdown:e}=n(),i=p.render(t),l=(0,c.s)(i,{useUnsafeMarkdown:e});let u;return"string"==typeof l&&(u=o()(l).call(l)),a.createElement("div",{dangerouslySetInnerHTML:{__html:u},className:s()(r,"renderedMarkdown")})}return null};f.defaultProps={getConfigs:()=>({useUnsafeMarkdown:!1})};const h=(0,u.OAS3ComponentWrapFactory)(f)},53499:(e,t,r)=>{"use strict";r.r(t),r.d(t,{default:()=>u});var n=r(23101),o=r.n(n),a=r(67294),i=r(7779),s=r(53795);class l extends a.Component{render(){let{getConfigs:e,schema:t}=this.props,r=["model-box"],n=null;return!0===t.get("deprecated")&&(r.push("deprecated"),n=a.createElement("span",{className:"model-deprecated-warning"},"Deprecated:")),a.createElement("div",{className:r.join(" ")},n,a.createElement(s.Z,o()({},this.props,{getConfigs:e,depth:1,expandDepth:this.props.expandDepth||0})))}}const u=(0,i.OAS3ComponentWrapFactory)(l)},50058:(e,t,r)=>{"use strict";r.r(t),r.d(t,{default:()=>a});var n=r(7779),o=r(5623);const a=(0,n.OAS3ComponentWrapFactory)(o.Z)},69487:(e,t,r)=>{"use strict";r.r(t),r.d(t,{default:()=>o});var n=r(67294);const o=(0,r(7779).OAS3ComponentWrapFactory)((e=>{const{Ori:t}=e;return n.createElement("span",null,n.createElement(t,e),n.createElement("small",{className:"version-stamp"},n.createElement("pre",{className:"version"},"OAS3")))}))},28560:(e,t,r)=>{"use strict";r.r(t),r.d(t,{default:()=>i});var n=r(87198),o=r.n(n);let a=!1;function i(){return{statePlugins:{spec:{wrapActions:{updateSpec:e=>function(){return a=!0,e(...arguments)},updateJsonSpec:(e,t)=>function(){const r=t.getConfigs().onComplete;return a&&"function"==typeof r&&(o()(r,0),a=!1),e(...arguments)}}}}}}},92135:(e,t,r)=>{"use strict";r.r(t),r.d(t,{requestSnippetGenerator_curl_powershell:()=>A,requestSnippetGenerator_curl_bash:()=>k,requestSnippetGenerator_curl_cmd:()=>C});var n=r(11882),o=r.n(n),a=r(81607),i=r.n(a),s=r(35627),l=r.n(s),u=r(97606),c=r.n(u),p=r(12196),f=r.n(p),h=r(74386),d=r.n(h),m=r(58118),g=r.n(m),v=r(27504),y=r(43393);const b=e=>{var t;const r="_**[]";return o()(e).call(e,r)<0?e:i()(t=e.split(r)[0]).call(t)},w=e=>"-d "===e||/^[_\/-]/g.test(e)?e:"'"+e.replace(/'/g,"'\\''")+"'",E=e=>"-d "===(e=e.replace(/\^/g,"^^").replace(/\\"/g,'\\\\"').replace(/"/g,'""').replace(/\n/g,"^\n"))?e.replace(/-d /g,"-d ^\n"):/^[_\/-]/g.test(e)?e:'"'+e+'"',x=e=>"-d "===e?e:/\n/.test(e)?'@"\n'+e.replace(/"/g,'\\"').replace(/`/g,"``").replace(/\$/,"`$")+'\n"@':/^[_\/-]/g.test(e)?e:"'"+e.replace(/"/g,'""').replace(/'/g,"''")+"'";function _(e){let t=[];for(let[r,n]of e.get("body").entrySeq()){let e=b(r);n instanceof v.Z.File?t.push(` "${e}": {\n "name": "${n.name}"${n.type?`,\n "type": "${n.type}"`:""}\n }`):t.push(` "${e}": ${l()(n,null,2).replace(/(\r\n|\r|\n)/g,"\n ")}`)}return`{\n${t.join(",\n")}\n}`}const S=function(e,t,r){let n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:"",o=!1,a="";const i=function(){for(var e=arguments.length,r=new Array(e),n=0;na+=` ${r}`,p=function(){var e;let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:1;return a+=f()(e=" ").call(e,t)};let h=e.get("headers");if(a+="curl"+n,e.has("curlOptions")&&i(...e.get("curlOptions")),i("-X",e.get("method")),u(),p(),s(`${e.get("url")}`),h&&h.size)for(let t of d()(m=e.get("headers")).call(m)){var m;u(),p();let[e,r]=t;s("-H",`${e}: ${r}`),o=o||/^content-type$/i.test(e)&&/^multipart\/form-data$/i.test(r)}const w=e.get("body");var E;if(w)if(o&&g()(E=["POST","PUT","PATCH"]).call(E,e.get("method")))for(let[e,t]of w.entrySeq()){let r=b(e);u(),p(),s("-F"),t instanceof v.Z.File?i(`${r}=@${t.name}${t.type?`;type=${t.type}`:""}`):i(`${r}=${t}`)}else if(w instanceof v.Z.File)u(),p(),s(`--data-binary '@${w.name}'`);else{u(),p(),s("-d ");let t=w;y.Map.isMap(t)?s(_(e)):("string"!=typeof t&&(t=l()(t)),s(t))}else w||"POST"!==e.get("method")||(u(),p(),s("-d ''"));return a},A=e=>S(e,x,"`\n",".exe"),k=e=>S(e,w,"\\\n"),C=e=>S(e,E,"^\n")},86575:(e,t,r)=>{"use strict";r.r(t),r.d(t,{default:()=>i});var n=r(92135),o=r(4669),a=r(84206);const i=()=>({components:{RequestSnippets:a.default},fn:n,statePlugins:{requestSnippets:{selectors:o}}})},84206:(e,t,r)=>{"use strict";r.r(t),r.d(t,{default:()=>w});var n=r(14418),o=r.n(n),a=r(25110),i=r.n(a),s=r(86),l=r.n(s),u=r(97606),c=r.n(u),p=r(67294),f=r(27361),h=r.n(f),d=r(23560),m=r.n(d),g=r(74855),v=r(36581);const y={cursor:"pointer",lineHeight:1,display:"inline-flex",backgroundColor:"rgb(250, 250, 250)",paddingBottom:"0",paddingTop:"0",border:"1px solid rgb(51, 51, 51)",borderRadius:"4px 4px 0 0",boxShadow:"none",borderBottom:"none"},b={cursor:"pointer",lineHeight:1,display:"inline-flex",backgroundColor:"rgb(51, 51, 51)",boxShadow:"none",border:"1px solid rgb(51, 51, 51)",paddingBottom:"0",paddingTop:"0",borderRadius:"4px 4px 0 0",marginTop:"-5px",marginRight:"-5px",marginLeft:"-5px",zIndex:"9999",borderBottom:"none"},w=e=>{var t,r;let{request:n,requestSnippetsSelectors:a,getConfigs:s}=e;const u=m()(s)?s():null,f=!1!==h()(u,"syntaxHighlight")&&h()(u,"syntaxHighlight.activated",!0),d=(0,p.useRef)(null),[w,E]=(0,p.useState)(null===(t=a.getSnippetGenerators())||void 0===t?void 0:t.keySeq().first()),[x,_]=(0,p.useState)(null==a?void 0:a.getDefaultExpanded());(0,p.useEffect)((()=>{}),[]),(0,p.useEffect)((()=>{var e;const t=o()(e=i()(d.current.childNodes)).call(e,(e=>{var t;return!!e.nodeType&&(null===(t=e.classList)||void 0===t?void 0:t.contains("curl-command"))}));return l()(t).call(t,(e=>e.addEventListener("mousewheel",j,{passive:!1}))),()=>{l()(t).call(t,(e=>e.removeEventListener("mousewheel",j)))}}),[n]);const S=a.getSnippetGenerators(),A=S.get(w),k=A.get("fn")(n),C=()=>{_(!x)},O=e=>e===w?b:y,j=e=>{const{target:t,deltaY:r}=e,{scrollHeight:n,offsetHeight:o,scrollTop:a}=t;n>o&&(0===a&&r<0||o+a>=n&&r>0)&&e.preventDefault()},I=f?p.createElement(v.d3,{language:A.get("syntax"),className:"curl microlight",style:(0,v.C2)(h()(u,"syntaxHighlight.theme"))},k):p.createElement("textarea",{readOnly:!0,className:"curl",value:k});return p.createElement("div",{className:"request-snippets",ref:d},p.createElement("div",{style:{width:"100%",display:"flex",justifyContent:"flex-start",alignItems:"center",marginBottom:"15px"}},p.createElement("h4",{onClick:()=>C(),style:{cursor:"pointer"}},"Snippets"),p.createElement("button",{onClick:()=>C(),style:{border:"none",background:"none"},title:x?"Collapse operation":"Expand operation"},p.createElement("svg",{className:"arrow",width:"10",height:"10"},p.createElement("use",{href:x?"#large-arrow-down":"#large-arrow",xlinkHref:x?"#large-arrow-down":"#large-arrow"})))),x&&p.createElement("div",{className:"curl-command"},p.createElement("div",{style:{paddingLeft:"15px",paddingRight:"10px",width:"100%",display:"flex"}},c()(r=S.entrySeq()).call(r,(e=>{let[t,r]=e;return p.createElement("div",{style:O(t),className:"btn",key:t,onClick:()=>(e=>{w!==e&&E(e)})(t)},p.createElement("h4",{style:t===w?{color:"white"}:{}},r.get("title")))}))),p.createElement("div",{className:"copy-to-clipboard"},p.createElement(g.CopyToClipboard,{text:k},p.createElement("button",null))),p.createElement("div",null,I)))}},4669:(e,t,r)=>{"use strict";r.r(t),r.d(t,{getGenerators:()=>f,getSnippetGenerators:()=>h,getActiveLanguage:()=>d,getDefaultExpanded:()=>m});var n=r(14418),o=r.n(n),a=r(58118),i=r.n(a),s=r(97606),l=r.n(s),u=r(20573),c=r(43393);const p=e=>e||(0,c.Map)(),f=(0,u.P1)(p,(e=>{const t=e.get("languages"),r=e.get("generators",(0,c.Map)());return!t||t.isEmpty()?r:o()(r).call(r,((e,r)=>i()(t).call(t,r)))})),h=e=>t=>{var r,n;let{fn:a}=t;return o()(r=l()(n=f(e)).call(n,((e,t)=>{const r=(e=>a[`requestSnippetGenerator_${e}`])(t);return"function"!=typeof r?null:e.set("fn",r)}))).call(r,(e=>e))},d=(0,u.P1)(p,(e=>e.get("activeLanguage"))),m=(0,u.P1)(p,(e=>e.get("defaultExpanded")))},36195:(e,t,r)=>{"use strict";r.r(t),r.d(t,{ErrorBoundary:()=>i,default:()=>s});var n=r(67294),o=r(56189),a=r(29403);class i extends n.Component{static getDerivedStateFromError(e){return{hasError:!0,error:e}}constructor(){super(...arguments),this.state={hasError:!1,error:null}}componentDidCatch(e,t){this.props.fn.componentDidCatch(e,t)}render(){const{getComponent:e,targetName:t,children:r}=this.props;if(this.state.hasError){const r=e("Fallback");return n.createElement(r,{name:t})}return r}}i.defaultProps={targetName:"this component",getComponent:()=>a.default,fn:{componentDidCatch:o.componentDidCatch},children:null};const s=i},29403:(e,t,r)=>{"use strict";r.r(t),r.d(t,{default:()=>o});var n=r(67294);const o=e=>{let{name:t}=e;return n.createElement("div",{className:"fallback"},"😱 ",n.createElement("i",null,"Could not render ","t"===t?"this component":t,", see the console."))}},56189:(e,t,r)=>{"use strict";r.r(t),r.d(t,{componentDidCatch:()=>i,withErrorBoundary:()=>s});var n=r(23101),o=r.n(n),a=r(67294);const i=console.error,s=e=>t=>{const{getComponent:r,fn:n}=e(),i=r("ErrorBoundary"),s=n.getDisplayName(t);class l extends a.Component{render(){return a.createElement(i,{targetName:s,getComponent:r,fn:n},a.createElement(t,o()({},this.props,this.context)))}}var u;return l.displayName=`WithErrorBoundary(${s})`,(u=t).prototype&&u.prototype.isReactComponent&&(l.prototype.mapStateToProps=t.prototype.mapStateToProps),l}},27621:(e,t,r)=>{"use strict";r.r(t),r.d(t,{default:()=>c});var n=r(47475),o=r.n(n),a=r(7287),i=r.n(a),s=r(36195),l=r(29403),u=r(56189);const c=function(){let{componentList:e=[],fullOverride:t=!1}=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return r=>{var n;let{getSystem:a}=r;const c=t?e:["App","BaseLayout","VersionPragmaFilter","InfoContainer","ServersContainer","SchemesContainer","AuthorizeBtnContainer","FilterContainer","Operations","OperationContainer","parameters","responses","OperationServers","Models","ModelWrapper",...e],p=i()(c,o()(n=Array(c.length)).call(n,((e,t)=>{let{fn:r}=t;return r.withErrorBoundary(e)})));return{fn:{componentDidCatch:u.componentDidCatch,withErrorBoundary:(0,u.withErrorBoundary)(a)},components:{ErrorBoundary:s.default,Fallback:l.default},wrapComponents:p}}}},57050:(e,t,r)=>{"use strict";r.r(t),r.d(t,{sampleFromSchemaGeneric:()=>F,inferSchema:()=>z,createXMLExample:()=>U,sampleFromSchema:()=>q,memoizedCreateXMLExample:()=>$,memoizedSampleFromSchema:()=>W});var n=r(11882),o=r.n(n),a=r(86),i=r.n(a),s=r(58309),l=r.n(s),u=r(58118),c=r.n(u),p=r(92039),f=r.n(p),h=r(24278),d=r.n(h),m=r(51679),g=r.n(m),v=r(39022),y=r.n(v),b=r(97606),w=r.n(b),E=r(35627),x=r.n(E),_=r(53479),S=r.n(_),A=r(14419),k=r.n(A),C=r(41609),O=r.n(C),j=r(90242),I=r(60314);const N={string:e=>e.pattern?(e=>{try{return new(k())(e).gen()}catch(e){return"string"}})(e.pattern):"string",string_email:()=>"user@example.com","string_date-time":()=>(new Date).toISOString(),string_date:()=>(new Date).toISOString().substring(0,10),string_uuid:()=>"3fa85f64-5717-4562-b3fc-2c963f66afa6",string_hostname:()=>"example.com",string_ipv4:()=>"198.51.100.42",string_ipv6:()=>"2001:0db8:5b96:0000:0000:426f:8e17:642a",number:()=>0,number_float:()=>0,integer:()=>0,boolean:e=>"boolean"!=typeof e.default||e.default},T=e=>{e=(0,j.mz)(e);let{type:t,format:r}=e,n=N[`${t}_${r}`]||N[t];return(0,j.Wl)(n)?n(e):"Unknown Type: "+e.type},P=e=>(0,j.XV)(e,"$$ref",(e=>"string"==typeof e&&o()(e).call(e,"#")>-1)),R=["maxProperties","minProperties"],M=["minItems","maxItems"],D=["minimum","maximum","exclusiveMinimum","exclusiveMaximum"],L=["minLength","maxLength"],B=function(e,t){var r;let n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};const a=r=>{void 0===t[r]&&void 0!==e[r]&&(t[r]=e[r])};var s;(i()(r=["example","default","enum","xml","type",...R,...M,...D,...L]).call(r,(e=>a(e))),void 0!==e.required&&l()(e.required))&&(void 0!==t.required&&t.required.length||(t.required=[]),i()(s=e.required).call(s,(e=>{var r;c()(r=t.required).call(r,e)||t.required.push(e)})));if(e.properties){t.properties||(t.properties={});let r=(0,j.mz)(e.properties);for(let a in r){var u;if(Object.prototype.hasOwnProperty.call(r,a))if(!r[a]||!r[a].deprecated)if(!r[a]||!r[a].readOnly||n.includeReadOnly)if(!r[a]||!r[a].writeOnly||n.includeWriteOnly)if(!t.properties[a])t.properties[a]=r[a],!e.required&&l()(e.required)&&-1!==o()(u=e.required).call(u,a)&&(t.required?t.required.push(a):t.required=[a])}}return e.items&&(t.items||(t.items={}),t.items=B(e.items,t.items,n)),t},F=function(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:void 0,n=arguments.length>3&&void 0!==arguments[3]&&arguments[3];e&&(0,j.Wl)(e.toJS)&&(e=e.toJS());let a=void 0!==r||e&&void 0!==e.example||e&&void 0!==e.default;const s=!a&&e&&e.oneOf&&e.oneOf.length>0,u=!a&&e&&e.anyOf&&e.anyOf.length>0;if(!a&&(s||u)){const r=(0,j.mz)(s?e.oneOf[0]:e.anyOf[0]);if(B(r,e,t),!e.xml&&r.xml&&(e.xml=r.xml),void 0!==e.example&&void 0!==r.example)a=!0;else if(r.properties){e.properties||(e.properties={});let n=(0,j.mz)(r.properties);for(let a in n){var p;if(Object.prototype.hasOwnProperty.call(n,a))if(!n[a]||!n[a].deprecated)if(!n[a]||!n[a].readOnly||t.includeReadOnly)if(!n[a]||!n[a].writeOnly||t.includeWriteOnly)if(!e.properties[a])e.properties[a]=n[a],!r.required&&l()(r.required)&&-1!==o()(p=r.required).call(p,a)&&(e.required?e.required.push(a):e.required=[a])}}}const h={};let{xml:m,type:v,example:b,properties:E,additionalProperties:x,items:_}=e||{},{includeReadOnly:S,includeWriteOnly:A}=t;m=m||{};let k,{name:C,prefix:I,namespace:N}=m,L={};if(n&&(C=C||"notagname",k=(I?I+":":"")+C,N)){h[I?"xmlns:"+I:"xmlns"]=N}n&&(L[k]=[]);const z=t=>f()(t).call(t,(t=>Object.prototype.hasOwnProperty.call(e,t)));e&&!v&&(E||x||z(R)?v="object":_||z(M)?v="array":z(D)?(v="number",e.type="number"):a||e.enum||(v="string",e.type="string"));const U=t=>{var r,n,o,a,i;null!==(null===(r=e)||void 0===r?void 0:r.maxItems)&&void 0!==(null===(n=e)||void 0===n?void 0:n.maxItems)&&(t=d()(t).call(t,0,null===(i=e)||void 0===i?void 0:i.maxItems));if(null!==(null===(o=e)||void 0===o?void 0:o.minItems)&&void 0!==(null===(a=e)||void 0===a?void 0:a.minItems)){let r=0;for(;t.length<(null===(s=e)||void 0===s?void 0:s.minItems);){var s;t.push(t[r++%t.length])}}return t},q=(0,j.mz)(E);let V,$=0;const W=()=>e&&null!==e.maxProperties&&void 0!==e.maxProperties&&$>=e.maxProperties,H=()=>{if(!e||!e.required)return 0;let t=0;var r,o;n?i()(r=e.required).call(r,(e=>t+=void 0===L[e]?0:1)):i()(o=e.required).call(o,(e=>{var r;return t+=void 0===(null===(r=L[k])||void 0===r?void 0:g()(r).call(r,(t=>void 0!==t[e])))?0:1}));return e.required.length-t},J=t=>{var r;return!(e&&e.required&&e.required.length)||!c()(r=e.required).call(r,t)},K=t=>!e||null===e.maxProperties||void 0===e.maxProperties||!W()&&(!J(t)||e.maxProperties-$-H()>0);if(V=n?function(r){let o=arguments.length>1&&void 0!==arguments[1]?arguments[1]:void 0;if(e&&q[r]){if(q[r].xml=q[r].xml||{},q[r].xml.attribute){const e=l()(q[r].enum)?q[r].enum[0]:void 0,t=q[r].example,n=q[r].default;return void(h[q[r].xml.name||r]=void 0!==t?t:void 0!==n?n:void 0!==e?e:T(q[r]))}q[r].xml.name=q[r].xml.name||r}else q[r]||!1===x||(q[r]={xml:{name:r}});let a=F(e&&q[r]||void 0,t,o,n);var i;K(r)&&($++,l()(a)?L[k]=y()(i=L[k]).call(i,a):L[k].push(a))}:(e,r)=>{K(e)&&(L[e]=F(q[e],t,r,n),$++)},a){let o;if(o=P(void 0!==r?r:void 0!==b?b:e.default),!n){if("number"==typeof o&&"string"===v)return`${o}`;if("string"!=typeof o||"string"===v)return o;try{return JSON.parse(o)}catch(e){return o}}if(e||(v=l()(o)?"array":typeof o),"array"===v){if(!l()(o)){if("string"==typeof o)return o;o=[o]}const r=e?e.items:void 0;r&&(r.xml=r.xml||m||{},r.xml.name=r.xml.name||m.name);let a=w()(o).call(o,(e=>F(r,t,e,n)));return a=U(a),m.wrapped?(L[k]=a,O()(h)||L[k].push({_attr:h})):L=a,L}if("object"===v){if("string"==typeof o)return o;for(let t in o)Object.prototype.hasOwnProperty.call(o,t)&&(e&&q[t]&&q[t].readOnly&&!S||e&&q[t]&&q[t].writeOnly&&!A||(e&&q[t]&&q[t].xml&&q[t].xml.attribute?h[q[t].xml.name||t]=o[t]:V(t,o[t])));return O()(h)||L[k].push({_attr:h}),L}return L[k]=O()(h)?o:[{_attr:h},o],L}if("object"===v){for(let e in q)Object.prototype.hasOwnProperty.call(q,e)&&(q[e]&&q[e].deprecated||q[e]&&q[e].readOnly&&!S||q[e]&&q[e].writeOnly&&!A||V(e));if(n&&h&&L[k].push({_attr:h}),W())return L;if(!0===x)n?L[k].push({additionalProp:"Anything can be here"}):L.additionalProp1={},$++;else if(x){const r=(0,j.mz)(x),o=F(r,t,void 0,n);if(n&&r.xml&&r.xml.name&&"notagname"!==r.xml.name)L[k].push(o);else{const t=null!==e.minProperties&&void 0!==e.minProperties&&$F(B(_,e,t),t,void 0,n)));else if(l()(_.oneOf)){var Y;r=w()(Y=_.oneOf).call(Y,(e=>F(B(_,e,t),t,void 0,n)))}else{if(!(!n||n&&m.wrapped))return F(_,t,void 0,n);r=[F(_,t,void 0,n)]}return r=U(r),n&&m.wrapped?(L[k]=r,O()(h)||L[k].push({_attr:h}),L):r}let Q;if(e&&l()(e.enum))Q=(0,j.AF)(e.enum)[0];else{if(!e)return;if(Q=T(e),"number"==typeof Q){let t=e.minimum;null!=t&&(e.exclusiveMinimum&&t++,Q=t);let r=e.maximum;null!=r&&(e.exclusiveMaximum&&r--,Q=r)}if("string"==typeof Q&&(null!==e.maxLength&&void 0!==e.maxLength&&(Q=d()(Q).call(Q,0,e.maxLength)),null!==e.minLength&&void 0!==e.minLength)){let t=0;for(;Q.length(e.schema&&(e=e.schema),e.properties&&(e.type="object"),e),U=(e,t,r)=>{const n=F(e,t,r,!0);if(n)return"string"==typeof n?n:S()(n,{declaration:!0,indent:"\t"})},q=(e,t,r)=>F(e,t,r,!1),V=(e,t,r)=>[e,x()(t),x()(r)],$=(0,I.Z)(U,V),W=(0,I.Z)(q,V)},8883:(e,t,r)=>{"use strict";r.r(t),r.d(t,{default:()=>o});var n=r(57050);function o(){return{fn:n}}},51228:(e,t,r)=>{"use strict";r.r(t),r.d(t,{UPDATE_SPEC:()=>U,UPDATE_URL:()=>q,UPDATE_JSON:()=>V,UPDATE_PARAM:()=>$,UPDATE_EMPTY_PARAM_INCLUSION:()=>W,VALIDATE_PARAMS:()=>H,SET_RESPONSE:()=>J,SET_REQUEST:()=>K,SET_MUTATED_REQUEST:()=>G,LOG_REQUEST:()=>Z,CLEAR_RESPONSE:()=>Y,CLEAR_REQUEST:()=>Q,CLEAR_VALIDATE_PARAMS:()=>X,UPDATE_OPERATION_META_VALUE:()=>ee,UPDATE_RESOLVED:()=>te,UPDATE_RESOLVED_SUBTREE:()=>re,SET_SCHEME:()=>ne,updateSpec:()=>oe,updateResolved:()=>ae,updateUrl:()=>ie,updateJsonSpec:()=>se,parseToJson:()=>le,resolveSpec:()=>ce,requestResolvedSubtree:()=>he,changeParam:()=>de,changeParamByIdentity:()=>me,updateResolvedSubtree:()=>ge,invalidateResolvedSubtreeCache:()=>ve,validateParams:()=>ye,updateEmptyParamInclusion:()=>be,clearValidateParams:()=>we,changeConsumesValue:()=>Ee,changeProducesValue:()=>xe,setResponse:()=>_e,setRequest:()=>Se,setMutatedRequest:()=>Ae,logRequest:()=>ke,executeRequest:()=>Ce,execute:()=>Oe,clearResponse:()=>je,clearRequest:()=>Ie,setScheme:()=>Ne});var n=r(58309),o=r.n(n),a=r(97606),i=r.n(a),s=r(96718),l=r.n(s),u=r(24282),c=r.n(u),p=r(2250),f=r.n(p),h=r(6226),d=r.n(h),m=r(14418),g=r.n(m),v=r(3665),y=r.n(v),b=r(11882),w=r.n(b),E=r(86),x=r.n(E),_=r(28222),S=r.n(_),A=r(76986),k=r.n(A),C=r(70586),O=r.n(C),j=r(1272),I=r(43393),N=r(84564),T=r.n(N),P=r(7710),R=r(47037),M=r.n(R),D=r(23279),L=r.n(D),B=r(36968),F=r.n(B),z=r(90242);const U="spec_update_spec",q="spec_update_url",V="spec_update_json",$="spec_update_param",W="spec_update_empty_param_inclusion",H="spec_validate_param",J="spec_set_response",K="spec_set_request",G="spec_set_mutated_request",Z="spec_log_request",Y="spec_clear_response",Q="spec_clear_request",X="spec_clear_validate_param",ee="spec_update_operation_meta_value",te="spec_update_resolved",re="spec_update_resolved_subtree",ne="set_scheme";function oe(e){const t=(r=e,M()(r)?r:"").replace(/\t/g," ");var r;if("string"==typeof e)return{type:U,payload:t}}function ae(e){return{type:te,payload:e}}function ie(e){return{type:q,payload:e}}function se(e){return{type:V,payload:e}}const le=e=>t=>{let{specActions:r,specSelectors:n,errActions:o}=t,{specStr:a}=n,i=null;try{e=e||a(),o.clear({source:"parser"}),i=j.ZP.load(e,{schema:j.A8})}catch(e){return console.error(e),o.newSpecErr({source:"parser",level:"error",message:e.reason,line:e.mark&&e.mark.line?e.mark.line+1:void 0})}return i&&"object"==typeof i?r.updateJsonSpec(i):{}};let ue=!1;const ce=(e,t)=>r=>{let{specActions:n,specSelectors:a,errActions:s,fn:{fetch:u,resolve:c,AST:p={}},getConfigs:f}=r;ue||(console.warn("specActions.resolveSpec is deprecated since v3.10.0 and will be removed in v4.0.0; use requestResolvedSubtree instead!"),ue=!0);const{modelPropertyMacro:h,parameterMacro:d,requestInterceptor:m,responseInterceptor:g}=f();void 0===e&&(e=a.specJson()),void 0===t&&(t=a.url());let v=p.getLineNumberForPath?p.getLineNumberForPath:()=>{},y=a.specStr();return c({fetch:u,spec:e,baseDoc:t,modelPropertyMacro:h,parameterMacro:d,requestInterceptor:m,responseInterceptor:g}).then((e=>{let{spec:t,errors:r}=e;if(s.clear({type:"thrown"}),o()(r)&&r.length>0){let e=i()(r).call(r,(e=>(console.error(e),e.line=e.fullPath?v(y,e.fullPath):null,e.path=e.fullPath?e.fullPath.join("."):null,e.level="error",e.type="thrown",e.source="resolver",l()(e,"message",{enumerable:!0,value:e.message}),e)));s.newThrownErrBatch(e)}return n.updateResolved(t)}))};let pe=[];const fe=L()((async()=>{const e=pe.system;if(!e)return void console.error("debResolveSubtrees: don't have a system to operate on, aborting.");const{errActions:t,errSelectors:r,fn:{resolveSubtree:n,fetch:a,AST:s={}},specSelectors:u,specActions:p}=e;if(!n)return void console.error("Error: Swagger-Client did not provide a `resolveSubtree` method, doing nothing.");let h=s.getLineNumberForPath?s.getLineNumberForPath:()=>{};const m=u.specStr(),{modelPropertyMacro:v,parameterMacro:b,requestInterceptor:w,responseInterceptor:E}=e.getConfigs();try{var x=await c()(pe).call(pe,(async(e,s)=>{const{resultMap:c,specWithCurrentSubtrees:p}=await e,{errors:x,spec:_}=await n(p,s,{baseDoc:u.url(),modelPropertyMacro:v,parameterMacro:b,requestInterceptor:w,responseInterceptor:E});if(r.allErrors().size&&t.clearBy((e=>{var t;return"thrown"!==e.get("type")||"resolver"!==e.get("source")||!f()(t=e.get("fullPath")).call(t,((e,t)=>e===s[t]||void 0===s[t]))})),o()(x)&&x.length>0){let e=i()(x).call(x,(e=>(e.line=e.fullPath?h(m,e.fullPath):null,e.path=e.fullPath?e.fullPath.join("."):null,e.level="error",e.type="thrown",e.source="resolver",l()(e,"message",{enumerable:!0,value:e.message}),e)));t.newThrownErrBatch(e)}var S,A;_&&u.isOAS3()&&"components"===s[0]&&"securitySchemes"===s[1]&&await d().all(i()(S=g()(A=y()(_)).call(A,(e=>"openIdConnect"===e.type))).call(S,(async e=>{const t={url:e.openIdConnectUrl,requestInterceptor:w,responseInterceptor:E};try{const r=await a(t);r instanceof Error||r.status>=400?console.error(r.statusText+" "+t.url):e.openIdConnectData=JSON.parse(r.text)}catch(e){console.error(e)}})));return F()(c,s,_),F()(p,s,_),{resultMap:c,specWithCurrentSubtrees:p}}),d().resolve({resultMap:(u.specResolvedSubtree([])||(0,I.Map)()).toJS(),specWithCurrentSubtrees:u.specJson().toJS()}));delete pe.system,pe=[]}catch(e){console.error(e)}p.updateResolvedSubtree([],x.resultMap)}),35),he=e=>t=>{var r;w()(r=i()(pe).call(pe,(e=>e.join("@@")))).call(r,e.join("@@"))>-1||(pe.push(e),pe.system=t,fe())};function de(e,t,r,n,o){return{type:$,payload:{path:e,value:n,paramName:t,paramIn:r,isXml:o}}}function me(e,t,r,n){return{type:$,payload:{path:e,param:t,value:r,isXml:n}}}const ge=(e,t)=>({type:re,payload:{path:e,value:t}}),ve=()=>({type:re,payload:{path:[],value:(0,I.Map)()}}),ye=(e,t)=>({type:H,payload:{pathMethod:e,isOAS3:t}}),be=(e,t,r,n)=>({type:W,payload:{pathMethod:e,paramName:t,paramIn:r,includeEmptyValue:n}});function we(e){return{type:X,payload:{pathMethod:e}}}function Ee(e,t){return{type:ee,payload:{path:e,value:t,key:"consumes_value"}}}function xe(e,t){return{type:ee,payload:{path:e,value:t,key:"produces_value"}}}const _e=(e,t,r)=>({payload:{path:e,method:t,res:r},type:J}),Se=(e,t,r)=>({payload:{path:e,method:t,req:r},type:K}),Ae=(e,t,r)=>({payload:{path:e,method:t,req:r},type:G}),ke=e=>({payload:e,type:Z}),Ce=e=>t=>{let{fn:r,specActions:n,specSelectors:a,getConfigs:s,oas3Selectors:l}=t,{pathName:u,method:c,operation:p}=e,{requestInterceptor:f,responseInterceptor:h}=s(),d=p.toJS();var m,v;p&&p.get("parameters")&&x()(m=g()(v=p.get("parameters")).call(v,(e=>e&&!0===e.get("allowEmptyValue")))).call(m,(t=>{if(a.parameterInclusionSettingFor([u,c],t.get("name"),t.get("in"))){e.parameters=e.parameters||{};const r=(0,z.cz)(t,e.parameters);(!r||r&&0===r.size)&&(e.parameters[t.get("name")]="")}}));if(e.contextUrl=T()(a.url()).toString(),d&&d.operationId?e.operationId=d.operationId:d&&u&&c&&(e.operationId=r.opId(d,u,c)),a.isOAS3()){const t=`${u}:${c}`;e.server=l.selectedServer(t)||l.selectedServer();const r=l.serverVariables({server:e.server,namespace:t}).toJS(),n=l.serverVariables({server:e.server}).toJS();e.serverVariables=S()(r).length?r:n,e.requestContentType=l.requestContentType(u,c),e.responseContentType=l.responseContentType(u,c)||"*/*";const a=l.requestBodyValue(u,c),s=l.requestBodyInclusionSetting(u,c);var y;if(a&&a.toJS)e.requestBody=g()(y=i()(a).call(a,(e=>I.Map.isMap(e)?e.get("value"):e))).call(y,((e,t)=>(o()(e)?0!==e.length:!(0,z.O2)(e))||s.get(t))).toJS();else e.requestBody=a}let b=k()({},e);b=r.buildRequest(b),n.setRequest(e.pathName,e.method,b);e.requestInterceptor=async t=>{let r=await f.apply(void 0,[t]),o=k()({},r);return n.setMutatedRequest(e.pathName,e.method,o),r},e.responseInterceptor=h;const w=O()();return r.execute(e).then((t=>{t.duration=O()()-w,n.setResponse(e.pathName,e.method,t)})).catch((t=>{"Failed to fetch"===t.message&&(t.name="",t.message='**Failed to fetch.** \n**Possible Reasons:** \n - CORS \n - Network Failure \n - URL scheme must be "http" or "https" for CORS request.'),n.setResponse(e.pathName,e.method,{error:!0,err:(0,P.serializeError)(t)})}))},Oe=function(){let{path:e,method:t,...r}=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return n=>{let{fn:{fetch:o},specSelectors:a,specActions:i}=n,s=a.specJsonWithResolvedSubtrees().toJS(),l=a.operationScheme(e,t),{requestContentType:u,responseContentType:c}=a.contentTypeValues([e,t]).toJS(),p=/xml/i.test(u),f=a.parameterValues([e,t],p).toJS();return i.executeRequest({...r,fetch:o,spec:s,pathName:e,method:t,parameters:f,requestContentType:u,scheme:l,responseContentType:c})}};function je(e,t){return{type:Y,payload:{path:e,method:t}}}function Ie(e,t){return{type:Q,payload:{path:e,method:t}}}function Ne(e,t,r){return{type:ne,payload:{scheme:e,path:t,method:r}}}},37038:(e,t,r)=>{"use strict";r.r(t),r.d(t,{default:()=>s});var n=r(20032),o=r(51228),a=r(33881),i=r(77508);function s(){return{statePlugins:{spec:{wrapActions:i,reducers:n.default,actions:o,selectors:a}}}}},20032:(e,t,r)=>{"use strict";r.r(t),r.d(t,{default:()=>d});var n=r(24282),o=r.n(n),a=r(97606),i=r.n(a),s=r(76986),l=r.n(s),u=r(43393),c=r(90242),p=r(27504),f=r(33881),h=r(51228);const d={[h.UPDATE_SPEC]:(e,t)=>"string"==typeof t.payload?e.set("spec",t.payload):e,[h.UPDATE_URL]:(e,t)=>e.set("url",t.payload+""),[h.UPDATE_JSON]:(e,t)=>e.set("json",(0,c.oG)(t.payload)),[h.UPDATE_RESOLVED]:(e,t)=>e.setIn(["resolved"],(0,c.oG)(t.payload)),[h.UPDATE_RESOLVED_SUBTREE]:(e,t)=>{const{value:r,path:n}=t.payload;return e.setIn(["resolvedSubtrees",...n],(0,c.oG)(r))},[h.UPDATE_PARAM]:(e,t)=>{let{payload:r}=t,{path:n,paramName:o,paramIn:a,param:i,value:s,isXml:l}=r,u=i?(0,c.V9)(i):`${a}.${o}`;const p=l?"value_xml":"value";return e.setIn(["meta","paths",...n,"parameters",u,p],s)},[h.UPDATE_EMPTY_PARAM_INCLUSION]:(e,t)=>{let{payload:r}=t,{pathMethod:n,paramName:o,paramIn:a,includeEmptyValue:i}=r;if(!o||!a)return console.warn("Warning: UPDATE_EMPTY_PARAM_INCLUSION could not generate a paramKey."),e;const s=`${a}.${o}`;return e.setIn(["meta","paths",...n,"parameter_inclusions",s],i)},[h.VALIDATE_PARAMS]:(e,t)=>{let{payload:{pathMethod:r,isOAS3:n}}=t;const a=(0,f.specJsonWithResolvedSubtrees)(e).getIn(["paths",...r]),i=(0,f.parameterValues)(e,r).toJS();return e.updateIn(["meta","paths",...r,"parameters"],(0,u.fromJS)({}),(t=>{var s;return o()(s=a.get("parameters",(0,u.List)())).call(s,((t,o)=>{const a=(0,c.cz)(o,i),s=(0,f.parameterInclusionSettingFor)(e,r,o.get("name"),o.get("in")),l=(0,c.Ik)(o,a,{bypassRequiredCheck:s,isOAS3:n});return t.setIn([(0,c.V9)(o),"errors"],(0,u.fromJS)(l))}),t)}))},[h.CLEAR_VALIDATE_PARAMS]:(e,t)=>{let{payload:{pathMethod:r}}=t;return e.updateIn(["meta","paths",...r,"parameters"],(0,u.fromJS)([]),(e=>i()(e).call(e,(e=>e.set("errors",(0,u.fromJS)([]))))))},[h.SET_RESPONSE]:(e,t)=>{let r,{payload:{res:n,path:o,method:a}}=t;r=n.error?l()({error:!0,name:n.err.name,message:n.err.message,statusCode:n.err.statusCode},n.err.response):n,r.headers=r.headers||{};let i=e.setIn(["responses",o,a],(0,c.oG)(r));return p.Z.Blob&&n.data instanceof p.Z.Blob&&(i=i.setIn(["responses",o,a,"text"],n.data)),i},[h.SET_REQUEST]:(e,t)=>{let{payload:{req:r,path:n,method:o}}=t;return e.setIn(["requests",n,o],(0,c.oG)(r))},[h.SET_MUTATED_REQUEST]:(e,t)=>{let{payload:{req:r,path:n,method:o}}=t;return e.setIn(["mutatedRequests",n,o],(0,c.oG)(r))},[h.UPDATE_OPERATION_META_VALUE]:(e,t)=>{let{payload:{path:r,value:n,key:o}}=t,a=["paths",...r],i=["meta","paths",...r];return e.getIn(["json",...a])||e.getIn(["resolved",...a])||e.getIn(["resolvedSubtrees",...a])?e.setIn([...i,o],(0,u.fromJS)(n)):e},[h.CLEAR_RESPONSE]:(e,t)=>{let{payload:{path:r,method:n}}=t;return e.deleteIn(["responses",r,n])},[h.CLEAR_REQUEST]:(e,t)=>{let{payload:{path:r,method:n}}=t;return e.deleteIn(["requests",r,n])},[h.SET_SCHEME]:(e,t)=>{let{payload:{scheme:r,path:n,method:o}}=t;return n&&o?e.setIn(["scheme",n,o],r):n||o?void 0:e.setIn(["scheme","_defaultScheme"],r)}}},33881:(e,t,r)=>{"use strict";r.r(t),r.d(t,{lastError:()=>O,url:()=>j,specStr:()=>I,specSource:()=>N,specJson:()=>T,specResolved:()=>P,specResolvedSubtree:()=>R,specJsonWithResolvedSubtrees:()=>D,spec:()=>L,isOAS3:()=>B,info:()=>F,externalDocs:()=>z,version:()=>U,semver:()=>q,paths:()=>V,operations:()=>$,consumes:()=>W,produces:()=>H,security:()=>J,securityDefinitions:()=>K,findDefinition:()=>G,definitions:()=>Z,basePath:()=>Y,host:()=>Q,schemes:()=>X,operationsWithRootInherited:()=>ee,tags:()=>te,tagDetails:()=>re,operationsWithTags:()=>ne,taggedOperations:()=>oe,responses:()=>ae,requests:()=>ie,mutatedRequests:()=>se,responseFor:()=>le,requestFor:()=>ue,mutatedRequestFor:()=>ce,allowTryItOutFor:()=>pe,parameterWithMetaByIdentity:()=>fe,parameterInclusionSettingFor:()=>he,parameterWithMeta:()=>de,operationWithMeta:()=>me,getParameter:()=>ge,hasHost:()=>ve,parameterValues:()=>ye,parametersIncludeIn:()=>be,parametersIncludeType:()=>we,contentTypeValues:()=>Ee,currentProducesFor:()=>xe,producesOptionsFor:()=>_e,consumesOptionsFor:()=>Se,operationScheme:()=>Ae,canExecuteScheme:()=>ke,validateBeforeExecute:()=>Ce,getOAS3RequiredRequestBodyContentType:()=>Oe,isMediaTypeSchemaPropertiesEqual:()=>je});var n=r(24278),o=r.n(n),a=r(86),i=r.n(a),s=r(11882),l=r.n(s),u=r(97606),c=r.n(u),p=r(14418),f=r.n(p),h=r(51679),d=r.n(h),m=r(24282),g=r.n(m),v=r(2578),y=r.n(v),b=r(92039),w=r.n(b),E=r(58309),x=r.n(E),_=r(20573),S=r(90242),A=r(43393);const k=["get","put","post","delete","options","head","patch","trace"],C=e=>e||(0,A.Map)(),O=(0,_.P1)(C,(e=>e.get("lastError"))),j=(0,_.P1)(C,(e=>e.get("url"))),I=(0,_.P1)(C,(e=>e.get("spec")||"")),N=(0,_.P1)(C,(e=>e.get("specSource")||"not-editor")),T=(0,_.P1)(C,(e=>e.get("json",(0,A.Map)()))),P=(0,_.P1)(C,(e=>e.get("resolved",(0,A.Map)()))),R=(e,t)=>e.getIn(["resolvedSubtrees",...t],void 0),M=(e,t)=>A.Map.isMap(e)&&A.Map.isMap(t)?t.get("$$ref")?t:(0,A.OrderedMap)().mergeWith(M,e,t):t,D=(0,_.P1)(C,(e=>(0,A.OrderedMap)().mergeWith(M,e.get("json"),e.get("resolvedSubtrees")))),L=e=>T(e),B=(0,_.P1)(L,(()=>!1)),F=(0,_.P1)(L,(e=>Ie(e&&e.get("info")))),z=(0,_.P1)(L,(e=>Ie(e&&e.get("externalDocs")))),U=(0,_.P1)(F,(e=>e&&e.get("version"))),q=(0,_.P1)(U,(e=>{var t;return o()(t=/v?([0-9]*)\.([0-9]*)\.([0-9]*)/i.exec(e)).call(t,1)})),V=(0,_.P1)(D,(e=>e.get("paths"))),$=(0,_.P1)(V,(e=>{if(!e||e.size<1)return(0,A.List)();let t=(0,A.List)();return e&&i()(e)?(i()(e).call(e,((e,r)=>{if(!e||!i()(e))return{};i()(e).call(e,((e,n)=>{l()(k).call(k,n)<0||(t=t.push((0,A.fromJS)({path:r,method:n,operation:e,id:`${n}-${r}`})))}))})),t):(0,A.List)()})),W=(0,_.P1)(L,(e=>(0,A.Set)(e.get("consumes")))),H=(0,_.P1)(L,(e=>(0,A.Set)(e.get("produces")))),J=(0,_.P1)(L,(e=>e.get("security",(0,A.List)()))),K=(0,_.P1)(L,(e=>e.get("securityDefinitions"))),G=(e,t)=>{const r=e.getIn(["resolvedSubtrees","definitions",t],null),n=e.getIn(["json","definitions",t],null);return r||n||null},Z=(0,_.P1)(L,(e=>{const t=e.get("definitions");return A.Map.isMap(t)?t:(0,A.Map)()})),Y=(0,_.P1)(L,(e=>e.get("basePath"))),Q=(0,_.P1)(L,(e=>e.get("host"))),X=(0,_.P1)(L,(e=>e.get("schemes",(0,A.Map)()))),ee=(0,_.P1)($,W,H,((e,t,r)=>c()(e).call(e,(e=>e.update("operation",(e=>{if(e){if(!A.Map.isMap(e))return;return e.withMutations((e=>(e.get("consumes")||e.update("consumes",(e=>(0,A.Set)(e).merge(t))),e.get("produces")||e.update("produces",(e=>(0,A.Set)(e).merge(r))),e)))}return(0,A.Map)()})))))),te=(0,_.P1)(L,(e=>{const t=e.get("tags",(0,A.List)());return A.List.isList(t)?f()(t).call(t,(e=>A.Map.isMap(e))):(0,A.List)()})),re=(e,t)=>{var r;let n=te(e)||(0,A.List)();return d()(r=f()(n).call(n,A.Map.isMap)).call(r,(e=>e.get("name")===t),(0,A.Map)())},ne=(0,_.P1)(ee,te,((e,t)=>g()(e).call(e,((e,t)=>{let r=(0,A.Set)(t.getIn(["operation","tags"]));return r.count()<1?e.update("default",(0,A.List)(),(e=>e.push(t))):g()(r).call(r,((e,r)=>e.update(r,(0,A.List)(),(e=>e.push(t)))),e)}),g()(t).call(t,((e,t)=>e.set(t.get("name"),(0,A.List)())),(0,A.OrderedMap)())))),oe=e=>t=>{var r;let{getConfigs:n}=t,{tagsSorter:o,operationsSorter:a}=n();return c()(r=ne(e).sortBy(((e,t)=>t),((e,t)=>{let r="function"==typeof o?o:S.wh.tagsSorter[o];return r?r(e,t):null}))).call(r,((t,r)=>{let n="function"==typeof a?a:S.wh.operationsSorter[a],o=n?y()(t).call(t,n):t;return(0,A.Map)({tagDetails:re(e,r),operations:o})}))},ae=(0,_.P1)(C,(e=>e.get("responses",(0,A.Map)()))),ie=(0,_.P1)(C,(e=>e.get("requests",(0,A.Map)()))),se=(0,_.P1)(C,(e=>e.get("mutatedRequests",(0,A.Map)()))),le=(e,t,r)=>ae(e).getIn([t,r],null),ue=(e,t,r)=>ie(e).getIn([t,r],null),ce=(e,t,r)=>se(e).getIn([t,r],null),pe=()=>!0,fe=(e,t,r)=>{const n=D(e).getIn(["paths",...t,"parameters"],(0,A.OrderedMap)()),o=e.getIn(["meta","paths",...t,"parameters"],(0,A.OrderedMap)()),a=c()(n).call(n,(e=>{const t=o.get(`${r.get("in")}.${r.get("name")}`),n=o.get(`${r.get("in")}.${r.get("name")}.hash-${r.hashCode()}`);return(0,A.OrderedMap)().merge(e,t,n)}));return d()(a).call(a,(e=>e.get("in")===r.get("in")&&e.get("name")===r.get("name")),(0,A.OrderedMap)())},he=(e,t,r,n)=>{const o=`${n}.${r}`;return e.getIn(["meta","paths",...t,"parameter_inclusions",o],!1)},de=(e,t,r,n)=>{const o=D(e).getIn(["paths",...t,"parameters"],(0,A.OrderedMap)()),a=d()(o).call(o,(e=>e.get("in")===n&&e.get("name")===r),(0,A.OrderedMap)());return fe(e,t,a)},me=(e,t,r)=>{var n;const o=D(e).getIn(["paths",t,r],(0,A.OrderedMap)()),a=e.getIn(["meta","paths",t,r],(0,A.OrderedMap)()),i=c()(n=o.get("parameters",(0,A.List)())).call(n,(n=>fe(e,[t,r],n)));return(0,A.OrderedMap)().merge(o,a).set("parameters",i)};function ge(e,t,r,n){t=t||[];let o=e.getIn(["meta","paths",...t,"parameters"],(0,A.fromJS)([]));return d()(o).call(o,(e=>A.Map.isMap(e)&&e.get("name")===r&&e.get("in")===n))||(0,A.Map)()}const ve=(0,_.P1)(L,(e=>{const t=e.get("host");return"string"==typeof t&&t.length>0&&"/"!==t[0]}));function ye(e,t,r){t=t||[];let n=me(e,...t).get("parameters",(0,A.List)());return g()(n).call(n,((e,t)=>{let n=r&&"body"===t.get("in")?t.get("value_xml"):t.get("value");return e.set((0,S.V9)(t,{allowHashes:!1}),n)}),(0,A.fromJS)({}))}function be(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"";if(A.List.isList(e))return w()(e).call(e,(e=>A.Map.isMap(e)&&e.get("in")===t))}function we(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"";if(A.List.isList(e))return w()(e).call(e,(e=>A.Map.isMap(e)&&e.get("type")===t))}function Ee(e,t){t=t||[];let r=D(e).getIn(["paths",...t],(0,A.fromJS)({})),n=e.getIn(["meta","paths",...t],(0,A.fromJS)({})),o=xe(e,t);const a=r.get("parameters")||new A.List,i=n.get("consumes_value")?n.get("consumes_value"):we(a,"file")?"multipart/form-data":we(a,"formData")?"application/x-www-form-urlencoded":void 0;return(0,A.fromJS)({requestContentType:i,responseContentType:o})}function xe(e,t){t=t||[];const r=D(e).getIn(["paths",...t],null);if(null===r)return;const n=e.getIn(["meta","paths",...t,"produces_value"],null),o=r.getIn(["produces",0],null);return n||o||"application/json"}function _e(e,t){t=t||[];const r=D(e),n=r.getIn(["paths",...t],null);if(null===n)return;const[o]=t,a=n.get("produces",null),i=r.getIn(["paths",o,"produces"],null),s=r.getIn(["produces"],null);return a||i||s}function Se(e,t){t=t||[];const r=D(e),n=r.getIn(["paths",...t],null);if(null===n)return;const[o]=t,a=n.get("consumes",null),i=r.getIn(["paths",o,"consumes"],null),s=r.getIn(["consumes"],null);return a||i||s}const Ae=(e,t,r)=>{let n=e.get("url").match(/^([a-z][a-z0-9+\-.]*):/),o=x()(n)?n[1]:null;return e.getIn(["scheme",t,r])||e.getIn(["scheme","_defaultScheme"])||o||""},ke=(e,t,r)=>{var n;return l()(n=["http","https"]).call(n,Ae(e,t,r))>-1},Ce=(e,t)=>{t=t||[];let r=e.getIn(["meta","paths",...t,"parameters"],(0,A.fromJS)([])),n=!0;return i()(r).call(r,(e=>{let t=e.get("errors");t&&t.count()&&(n=!1)})),n},Oe=(e,t)=>{var r;let n={requestBody:!1,requestContentType:{}},o=e.getIn(["resolvedSubtrees","paths",...t,"requestBody"],(0,A.fromJS)([]));return o.size<1||(o.getIn(["required"])&&(n.requestBody=o.getIn(["required"])),i()(r=o.getIn(["content"]).entrySeq()).call(r,(e=>{const t=e[0];if(e[1].getIn(["schema","required"])){const r=e[1].getIn(["schema","required"]).toJS();n.requestContentType[t]=r}}))),n},je=(e,t,r,n)=>{if((r||n)&&r===n)return!0;let o=e.getIn(["resolvedSubtrees","paths",...t,"requestBody","content"],(0,A.fromJS)([]));if(o.size<2||!r||!n)return!1;let a=o.getIn([r,"schema","properties"],(0,A.fromJS)([])),i=o.getIn([n,"schema","properties"],(0,A.fromJS)([]));return!!a.equals(i)};function Ie(e){return A.Map.isMap(e)?e:new A.Map}},77508:(e,t,r)=>{"use strict";r.r(t),r.d(t,{updateSpec:()=>u,updateJsonSpec:()=>c,executeRequest:()=>p,validateParams:()=>f});var n=r(28222),o=r.n(n),a=r(86),i=r.n(a),s=r(27361),l=r.n(s);const u=(e,t)=>{let{specActions:r}=t;return function(){e(...arguments),r.parseToJson(...arguments)}},c=(e,t)=>{let{specActions:r}=t;return function(){for(var t=arguments.length,n=new Array(t),a=0;a{l()(u,[e]).$ref&&r.requestResolvedSubtree(["paths",e])})),r.requestResolvedSubtree(["components","securitySchemes"])}},p=(e,t)=>{let{specActions:r}=t;return t=>(r.logRequest(t),e(t))},f=(e,t)=>{let{specSelectors:r}=t;return t=>e(t,r.isOAS3())}},34852:(e,t,r)=>{"use strict";r.r(t),r.d(t,{loaded:()=>n});const n=(e,t)=>function(){e(...arguments);const r=t.getConfigs().withCredentials;void 0!==r&&(t.fn.fetch.withCredentials="string"==typeof r?"true"===r:!!r)}},48792:(e,t,r)=>{"use strict";r.r(t),r.d(t,{default:()=>qr});var n={};r.r(n),r.d(n,{JsonPatchError:()=>Fe,_areEquals:()=>Ge,applyOperation:()=>$e,applyPatch:()=>We,applyReducer:()=>He,deepClone:()=>ze,getValueByPointer:()=>Ve,validate:()=>Ke,validator:()=>Je});var o={};r.r(o),r.d(o,{compare:()=>nt,generate:()=>tt,observe:()=>et,unobserve:()=>Xe});var a={};r.r(a),r.d(a,{cookie:()=>kr,header:()=>Ar,path:()=>xr,query:()=>_r});var i=r(80093),s=r.n(i),l=r(30222),u=r.n(l),c=r(36594),p=r.n(c),f=r(20474),h=r.n(f),d=r(67375),m=r.n(d),g=r(58118),v=r.n(g),y=r(74386),b=r.n(y),w=r(25110),E=r.n(w),x=r(35627),_=r.n(x),S=r(97606),A=r.n(S),k=r(28222),C=r.n(k),O=r(39022),j=r.n(O),I=r(2018),N=r.n(I),T=r(14418),P=r.n(T),R=(r(31905),r(92495)),M=r.n(R),D=r(1272);const L="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:window,{FormData:B,Blob:F,File:z}=L;var U=r(15687),q=r.n(U),V=r(24278),$=r.n(V),W=function(e){return":/?#[]@!$&'()*+,;=".indexOf(e)>-1},H=function(e){return/^[a-z0-9\-._~]+$/i.test(e)};function J(e){var t,r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=r.escape,o=arguments.length>2?arguments[2]:void 0;return"number"==typeof e&&(e=e.toString()),"string"==typeof e&&e.length&&n?o?JSON.parse(e):A()(t=q()(e)).call(t,(function(e){var t,r;if(H(e))return e;if(W(e)&&"unsafe"===n)return e;var o=new TextEncoder;return A()(t=A()(r=E()(o.encode(e))).call(r,(function(e){var t;return $()(t="0".concat(e.toString(16).toUpperCase())).call(t,-2)}))).call(t,(function(e){return"%".concat(e)})).join("")})).join(""):e}function K(e){var t=e.value;return Array.isArray(t)?function(e){var t=e.key,r=e.value,n=e.style,o=e.explode,a=e.escape,i=function(e){return J(e,{escape:a})};if("simple"===n)return A()(r).call(r,(function(e){return i(e)})).join(",");if("label"===n)return".".concat(A()(r).call(r,(function(e){return i(e)})).join("."));if("matrix"===n)return A()(r).call(r,(function(e){return i(e)})).reduce((function(e,r){var n,a,i;return!e||o?j()(a=j()(i="".concat(e||"",";")).call(i,t,"=")).call(a,r):j()(n="".concat(e,",")).call(n,r)}),"");if("form"===n){var s=o?"&".concat(t,"="):",";return A()(r).call(r,(function(e){return i(e)})).join(s)}if("spaceDelimited"===n){var l=o?"".concat(t,"="):"";return A()(r).call(r,(function(e){return i(e)})).join(" ".concat(l))}if("pipeDelimited"===n){var u=o?"".concat(t,"="):"";return A()(r).call(r,(function(e){return i(e)})).join("|".concat(u))}return}(e):"object"===h()(t)?function(e){var t=e.key,r=e.value,n=e.style,o=e.explode,a=e.escape,i=function(e){return J(e,{escape:a})},s=C()(r);if("simple"===n)return s.reduce((function(e,t){var n,a,s,l=i(r[t]),u=o?"=":",",c=e?"".concat(e,","):"";return j()(n=j()(a=j()(s="".concat(c)).call(s,t)).call(a,u)).call(n,l)}),"");if("label"===n)return s.reduce((function(e,t){var n,a,s,l=i(r[t]),u=o?"=":".",c=e?"".concat(e,"."):".";return j()(n=j()(a=j()(s="".concat(c)).call(s,t)).call(a,u)).call(n,l)}),"");if("matrix"===n&&o)return s.reduce((function(e,t){var n,o,a=i(r[t]),s=e?"".concat(e,";"):";";return j()(n=j()(o="".concat(s)).call(o,t,"=")).call(n,a)}),"");if("matrix"===n)return s.reduce((function(e,n){var o,a,s=i(r[n]),l=e?"".concat(e,","):";".concat(t,"=");return j()(o=j()(a="".concat(l)).call(a,n,",")).call(o,s)}),"");if("form"===n)return s.reduce((function(e,t){var n,a,s,l,u=i(r[t]),c=e?j()(n="".concat(e)).call(n,o?"&":","):"",p=o?"=":",";return j()(a=j()(s=j()(l="".concat(c)).call(l,t)).call(s,p)).call(a,u)}),"");return}(e):function(e){var t,r=e.key,n=e.value,o=e.style,a=e.escape,i=function(e){return J(e,{escape:a})};if("simple"===o)return i(n);if("label"===o)return".".concat(i(n));if("matrix"===o)return j()(t=";".concat(r,"=")).call(t,i(n));if("form"===o)return i(n);if("deepObject"===o)return i(n,{},!0);return}(e)}const G=function(e,t){t.body=e};var Z={serializeRes:te,mergeInQueryOrForm:fe};function Y(e){return Q.apply(this,arguments)}function Q(){return Q=s()(u().mark((function e(t){var r,n,o,a,i,s=arguments;return u().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(r=s.length>1&&void 0!==s[1]?s[1]:{},"object"===h()(t)&&(t=(r=t).url),r.headers=r.headers||{},Z.mergeInQueryOrForm(r),r.headers&&C()(r.headers).forEach((function(e){var t=r.headers[e];"string"==typeof t&&(r.headers[e]=t.replace(/\n+/g," "))})),!r.requestInterceptor){e.next=12;break}return e.next=8,r.requestInterceptor(r);case 8:if(e.t0=e.sent,e.t0){e.next=11;break}e.t0=r;case 11:r=e.t0;case 12:return n=r.headers["content-type"]||r.headers["Content-Type"],/multipart\/form-data/i.test(n)&&r.body instanceof B&&(delete r.headers["content-type"],delete r.headers["Content-Type"]),e.prev=14,e.next=17,(r.userFetch||fetch)(r.url,r);case 17:return o=e.sent,e.next=20,Z.serializeRes(o,t,r);case 20:if(o=e.sent,!r.responseInterceptor){e.next=28;break}return e.next=24,r.responseInterceptor(o);case 24:if(e.t1=e.sent,e.t1){e.next=27;break}e.t1=o;case 27:o=e.t1;case 28:e.next=39;break;case 30:if(e.prev=30,e.t2=e.catch(14),o){e.next=34;break}throw e.t2;case 34:throw(a=new Error(o.statusText||"response status is ".concat(o.status))).status=o.status,a.statusCode=o.status,a.responseError=e.t2,a;case 39:if(o.ok){e.next=45;break}throw(i=new Error(o.statusText||"response status is ".concat(o.status))).status=o.status,i.statusCode=o.status,i.response=o,i;case 45:return e.abrupt("return",o);case 46:case"end":return e.stop()}}),e,null,[[14,30]])}))),Q.apply(this,arguments)}var X=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"";return/(json|xml|yaml|text)\b/.test(e)};function ee(e,t){return t&&(0===t.indexOf("application/json")||t.indexOf("+json")>0)?JSON.parse(e):D.ZP.load(e)}function te(e,t){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},n=r.loadSpec,o=void 0!==n&&n,a={ok:e.ok,url:e.url||t,status:e.status,statusText:e.statusText,headers:ne(e.headers)},i=a.headers["content-type"],s=o||X(i),l=s?e.text:e.blob||e.buffer;return l.call(e).then((function(e){if(a.text=e,a.data=e,s)try{var t=ee(e,i);a.body=t,a.obj=t}catch(e){a.parseError=e}return a}))}function re(e){return v()(e).call(e,", ")?e.split(", "):e}function ne(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return"function"!=typeof b()(e)?{}:E()(b()(e).call(e)).reduce((function(e,t){var r=m()(t,2),n=r[0],o=r[1];return e[n]=re(o),e}),{})}function oe(e,t){return t||"undefined"==typeof navigator||(t=navigator),t&&"ReactNative"===t.product?!(!e||"object"!==h()(e)||"string"!=typeof e.uri):void 0!==z&&e instanceof z||(void 0!==F&&e instanceof F||(!!ArrayBuffer.isView(e)||null!==e&&"object"===h()(e)&&"function"==typeof e.pipe))}function ae(e,t){return Array.isArray(e)&&e.some((function(e){return oe(e,t)}))}var ie={form:",",spaceDelimited:"%20",pipeDelimited:"|"},se={csv:",",ssv:"%20",tsv:"%09",pipes:"|"};function le(e,t){var r=arguments.length>2&&void 0!==arguments[2]&&arguments[2],n=t.collectionFormat,o=t.allowEmptyValue,a=t.serializationOption,i=t.encoding,s="object"!==h()(t)||Array.isArray(t)?t:t.value,l=r?function(e){return e.toString()}:function(e){return encodeURIComponent(e)},u=l(e);if(void 0===s&&o)return[[u,""]];if(oe(s)||ae(s))return[[u,s]];if(a)return ue(e,s,r,a);if(i){if([h()(i.style),h()(i.explode),h()(i.allowReserved)].some((function(e){return"undefined"!==e}))){var c=i.style,p=i.explode,f=i.allowReserved;return ue(e,s,r,{style:c,explode:p,allowReserved:f})}if(i.contentType){if("application/json"===i.contentType){var d="string"==typeof s?s:_()(s);return[[u,l(d)]]}return[[u,l(s.toString())]]}return"object"!==h()(s)?[[u,l(s)]]:Array.isArray(s)&&s.every((function(e){return"object"!==h()(e)}))?[[u,A()(s).call(s,l).join(",")]]:[[u,l(_()(s))]]}return"object"!==h()(s)?[[u,l(s)]]:Array.isArray(s)?"multi"===n?[[u,A()(s).call(s,l)]]:[[u,A()(s).call(s,l).join(se[n||"csv"])]]:[[u,""]]}function ue(e,t,r,n){var o,a,i,s=n.style||"form",l=void 0===n.explode?"form"===s:n.explode,u=!r&&(n&&n.allowReserved?"unsafe":"reserved"),c=function(e){return J(e,{escape:u})},p=r?function(e){return e}:function(e){return J(e,{escape:u})};return"object"!==h()(t)?[[p(e),c(t)]]:Array.isArray(t)?l?[[p(e),A()(t).call(t,c)]]:[[p(e),A()(t).call(t,c).join(ie[s])]]:"deepObject"===s?A()(a=C()(t)).call(a,(function(r){var n;return[p(j()(n="".concat(e,"[")).call(n,r,"]")),c(t[r])]})):l?A()(i=C()(t)).call(i,(function(e){return[p(e),c(t[e])]})):[[p(e),A()(o=C()(t)).call(o,(function(e){var r;return[j()(r="".concat(p(e),",")).call(r,c(t[e]))]})).join(",")]]}function ce(e){return N()(e).reduce((function(e,t){var r,n=m()(t,2),o=n[0],a=n[1],i=p()(le(o,a,!0));try{for(i.s();!(r=i.n()).done;){var s=m()(r.value,2),l=s[0],u=s[1];if(Array.isArray(u)){var c,f=p()(u);try{for(f.s();!(c=f.n()).done;){var h=c.value;if(ArrayBuffer.isView(h)){var d=new F([h]);e.append(l,d)}else e.append(l,h)}}catch(e){f.e(e)}finally{f.f()}}else if(ArrayBuffer.isView(u)){var g=new F([u]);e.append(l,g)}else e.append(l,u)}}catch(e){i.e(e)}finally{i.f()}return e}),new B)}function pe(e){var t=C()(e).reduce((function(t,r){var n,o=p()(le(r,e[r]));try{for(o.s();!(n=o.n()).done;){var a=m()(n.value,2),i=a[0],s=a[1];t[i]=s}}catch(e){o.e(e)}finally{o.f()}return t}),{});return M().stringify(t,{encode:!1,indices:!1})||""}function fe(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=e.url,r=void 0===t?"":t,n=e.query,o=e.form,a=function(){for(var e=arguments.length,t=new Array(e),r=0;r=48&&t<=57))return!1;r++}return!0}function Re(e){return-1===e.indexOf("/")&&-1===e.indexOf("~")?e:e.replace(/~/g,"~0").replace(/\//g,"~1")}function Me(e){return e.replace(/~1/g,"/").replace(/~0/g,"~")}function De(e){if(void 0===e)return!0;if(e)if(Array.isArray(e)){for(var t=0,r=e.length;t0&&"constructor"==s[u-1]))throw new TypeError("JSON-Patch: modifying `__proto__` or `constructor/prototype` prop is banned for security reasons, if this was on purpose, please set `banPrototypeModifications` flag false and pass it to this function. More info in fast-json-patch README");if(r&&void 0===p&&(void 0===l[f]?p=s.slice(0,u).join("/"):u==c-1&&(p=t.path),void 0!==p&&h(t,0,e,p)),u++,Array.isArray(l)){if("-"===f)f=l.length;else{if(r&&!Pe(f))throw new Fe("Expected an unsigned base-10 integer value, making the new referenced value the array element with the zero-based index","OPERATION_PATH_ILLEGAL_ARRAY_INDEX",a,t,e);Pe(f)&&(f=~~f)}if(u>=c){if(r&&"add"===t.op&&f>l.length)throw new Fe("The specified index MUST NOT be greater than the number of elements in the array","OPERATION_VALUE_OUT_OF_BOUNDS",a,t,e);if(!1===(i=qe[t.op].call(t,l,f,e)).test)throw new Fe("Test operation failed","TEST_OPERATION_FAILED",a,t,e);return i}}else if(u>=c){if(!1===(i=Ue[t.op].call(t,l,f,e)).test)throw new Fe("Test operation failed","TEST_OPERATION_FAILED",a,t,e);return i}if(l=l[f],r&&u0)throw new Fe('Operation `path` property must start with "/"',"OPERATION_PATH_INVALID",t,e,r);if(("move"===e.op||"copy"===e.op)&&"string"!=typeof e.from)throw new Fe("Operation `from` property is not present (applicable in `move` and `copy` operations)","OPERATION_FROM_REQUIRED",t,e,r);if(("add"===e.op||"replace"===e.op||"test"===e.op)&&void 0===e.value)throw new Fe("Operation `value` property is not present (applicable in `add`, `replace` and `test` operations)","OPERATION_VALUE_REQUIRED",t,e,r);if(("add"===e.op||"replace"===e.op||"test"===e.op)&&De(e.value))throw new Fe("Operation `value` property is not present (applicable in `add`, `replace` and `test` operations)","OPERATION_VALUE_CANNOT_CONTAIN_UNDEFINED",t,e,r);if(r)if("add"==e.op){var o=e.path.split("/").length,a=n.split("/").length;if(o!==a+1&&o!==a)throw new Fe("Cannot perform an `add` operation at the desired path","OPERATION_PATH_CANNOT_ADD",t,e,r)}else if("replace"===e.op||"remove"===e.op||"_get"===e.op){if(e.path!==n)throw new Fe("Cannot perform the operation at a path that does not exist","OPERATION_PATH_UNRESOLVABLE",t,e,r)}else if("move"===e.op||"copy"===e.op){var i=Ke([{op:"_get",path:e.from,value:void 0}],r);if(i&&"OPERATION_PATH_UNRESOLVABLE"===i.name)throw new Fe("Cannot perform the operation from a path that does not exist","OPERATION_FROM_UNRESOLVABLE",t,e,r)}}function Ke(e,t,r){try{if(!Array.isArray(e))throw new Fe("Patch sequence must be an array","SEQUENCE_NOT_AN_ARRAY");if(t)We(Te(t),Te(e),r||!0);else{r=r||Je;for(var n=0;n0&&(e.patches=[],e.callback&&e.callback(n)),n}function rt(e,t,r,n,o){if(t!==e){"function"==typeof t.toJSON&&(t=t.toJSON());for(var a=Ne(t),i=Ne(e),s=!1,l=i.length-1;l>=0;l--){var u=e[p=i[l]];if(!Ie(t,p)||void 0===t[p]&&void 0!==u&&!1===Array.isArray(t))Array.isArray(e)===Array.isArray(t)?(o&&r.push({op:"test",path:n+"/"+Re(p),value:Te(u)}),r.push({op:"remove",path:n+"/"+Re(p)}),s=!0):(o&&r.push({op:"test",path:n,value:e}),r.push({op:"replace",path:n,value:t}),!0);else{var c=t[p];"object"==typeof u&&null!=u&&"object"==typeof c&&null!=c&&Array.isArray(u)===Array.isArray(c)?rt(u,c,r,n+"/"+Re(p),o):u!==c&&(!0,o&&r.push({op:"test",path:n+"/"+Re(p),value:Te(u)}),r.push({op:"replace",path:n+"/"+Re(p),value:Te(c)}))}}if(s||a.length!=i.length)for(l=0;l0){var o=t(e,r[r.length-1],r);o&&(n=j()(n).call(n,o))}if(Array.isArray(e)){var a=A()(e).call(e,(function(e,n){return pt(e,t,j()(r).call(r,n))}));a&&(n=j()(n).call(n,a))}else if(mt(e)){var i,s=A()(i=C()(e)).call(i,(function(n){return pt(e[n],t,j()(r).call(r,n))}));s&&(n=j()(n).call(n,s))}return n=ht(n)}function ft(e){return Array.isArray(e)?e:[e]}function ht(e){var t;return j()(t=[]).apply(t,q()(A()(e).call(e,(function(e){return Array.isArray(e)?ht(e):e}))))}function dt(e){return P()(e).call(e,(function(e){return void 0!==e}))}function mt(e){return e&&"object"===h()(e)}function gt(e){return e&&"function"==typeof e}function vt(e){if(wt(e)){var t=e.op;return"add"===t||"remove"===t||"replace"===t}return!1}function yt(e){return vt(e)||wt(e)&&"mutation"===e.type}function bt(e){return yt(e)&&("add"===e.op||"replace"===e.op||"merge"===e.op||"mergeDeep"===e.op)}function wt(e){return e&&"object"===h()(e)}function Et(e,t){try{return Ve(e,t)}catch(e){return console.error(e),{}}}var xt=r(28886),_t=r.n(xt),St=r(37659),At=r.n(St),kt=r(8575);function Ct(e,t){function r(){Error.captureStackTrace?Error.captureStackTrace(this,this.constructor):this.stack=(new Error).stack;for(var e=arguments.length,r=new Array(e),n=0;n-1&&-1===Nt.indexOf(r)||Tt.indexOf(n)>-1||Pt.some((function(e){return n.indexOf(e)>-1}))}function Mt(e,t){var r,n=e.split("#"),o=m()(n,2),a=o[0],i=o[1],s=kt.resolve(a||"",t||"");return i?j()(r="".concat(s,"#")).call(r,i):s}var Dt="application/json, application/yaml",Lt=/^([a-z]+:\/\/|\/\/)/i,Bt=Ct("JSONRefError",(function(e,t,r){this.originalError=r,Ee()(this,t||{})})),Ft={},zt=new(_t()),Ut=[function(e){return"paths"===e[0]&&"responses"===e[3]&&"examples"===e[5]},function(e){return"paths"===e[0]&&"responses"===e[3]&&"content"===e[5]&&"example"===e[7]},function(e){return"paths"===e[0]&&"responses"===e[3]&&"content"===e[5]&&"examples"===e[7]&&"value"===e[9]},function(e){return"paths"===e[0]&&"requestBody"===e[3]&&"content"===e[4]&&"example"===e[6]},function(e){return"paths"===e[0]&&"requestBody"===e[3]&&"content"===e[4]&&"examples"===e[6]&&"value"===e[8]},function(e){return"paths"===e[0]&&"parameters"===e[2]&&"example"===e[4]},function(e){return"paths"===e[0]&&"parameters"===e[3]&&"example"===e[5]},function(e){return"paths"===e[0]&&"parameters"===e[2]&&"examples"===e[4]&&"value"===e[6]},function(e){return"paths"===e[0]&&"parameters"===e[3]&&"examples"===e[5]&&"value"===e[7]},function(e){return"paths"===e[0]&&"parameters"===e[2]&&"content"===e[4]&&"example"===e[6]},function(e){return"paths"===e[0]&&"parameters"===e[2]&&"content"===e[4]&&"examples"===e[6]&&"value"===e[8]},function(e){return"paths"===e[0]&&"parameters"===e[3]&&"content"===e[4]&&"example"===e[7]},function(e){return"paths"===e[0]&&"parameters"===e[3]&&"content"===e[5]&&"examples"===e[7]&&"value"===e[9]}],qt={key:"$ref",plugin:function(e,t,r,n){var o=n.getInstance(),a=$()(r).call(r,0,-1);if(!Rt(a)&&!function(e){return Ut.some((function(t){return t(e)}))}(a)){var i=n.getContext(r).baseDoc;if("string"!=typeof e)return new Bt("$ref: must be a string (JSON-Ref)",{$ref:e,baseDoc:i,fullPath:r});var s,l,u,c=Jt(e),p=c[0],f=c[1]||"";try{s=i||p?Wt(p,i):null}catch(t){return Ht(t,{pointer:f,$ref:e,basePath:s,fullPath:r})}if(function(e,t,r,n){var o,a,i=zt.get(n);i||(i={},zt.set(n,i));var s=function(e){if(0===e.length)return"";return"/".concat(A()(e).call(e,Xt).join("/"))}(r),l=j()(o="".concat(t||"","#")).call(o,e),u=s.replace(/allOf\/\d+\/?/g,""),c=n.contextTree.get([]).baseDoc;if(t===c&&er(u,e))return!0;var p="",f=r.some((function(e){var t;return p=j()(t="".concat(p,"/")).call(t,Xt(e)),i[p]&&i[p].some((function(e){return er(e,l)||er(l,e)}))}));if(f)return!0;return void(i[u]=j()(a=i[u]||[]).call(a,l))}(f,s,a,n)&&!o.useCircularStructures){var h=Mt(e,s);return e===h?null:it.replace(r,h)}if(null==s?(u=Yt(f),void 0===(l=n.get(u))&&(l=new Bt("Could not resolve reference: ".concat(e),{pointer:f,$ref:e,baseDoc:i,fullPath:r}))):l=null!=(l=Kt(s,f)).__value?l.__value:l.catch((function(t){throw Ht(t,{pointer:f,$ref:e,baseDoc:i,fullPath:r})})),l instanceof Error)return[it.remove(r),l];var d=Mt(e,s),m=it.replace(a,l,{$$ref:d});if(s&&s!==i)return[m,it.context(a,{baseDoc:s})];try{if(!function(e,t){var r=[e];return t.path.reduce((function(e,t){return r.push(e[t]),e[t]}),e),n(t.value);function n(e){return it.isObject(e)&&(r.indexOf(e)>=0||C()(e).some((function(t){return n(e[t])})))}}(n.state,m)||o.useCircularStructures)return m}catch(e){return null}}}},Vt=Ee()(qt,{docCache:Ft,absoluteify:Wt,clearCache:function(e){void 0!==e?delete Ft[e]:C()(Ft).forEach((function(e){delete Ft[e]}))},JSONRefError:Bt,wrapError:Ht,getDoc:Gt,split:Jt,extractFromDoc:Kt,fetchJSON:function(e){return fetch(e,{headers:{Accept:Dt},loadSpec:!0}).then((function(e){return e.text()})).then((function(e){return D.ZP.load(e)}))},extract:Zt,jsonPointerToArray:Yt,unescapeJsonPointerToken:Qt});const $t=Vt;function Wt(e,t){if(!Lt.test(e)){var r;if(!t)throw new Bt(j()(r="Tried to resolve a relative URL, without having a basePath. path: '".concat(e,"' basePath: '")).call(r,t,"'"));return kt.resolve(t,e)}return e}function Ht(e,t){var r,n;e&&e.response&&e.response.body?r=j()(n="".concat(e.response.body.code," ")).call(n,e.response.body.message):r=e.message;return new Bt("Could not resolve reference: ".concat(r),t,e)}function Jt(e){return(e+"").split("#")}function Kt(e,t){var r=Ft[e];if(r&&!it.isPromise(r))try{var n=Zt(t,r);return Ee()(Ae().resolve(n),{__value:n})}catch(e){return Ae().reject(e)}return Gt(e).then((function(e){return Zt(t,e)}))}function Gt(e){var t=Ft[e];return t?it.isPromise(t)?t:Ae().resolve(t):(Ft[e]=Vt.fetchJSON(e).then((function(t){return Ft[e]=t,t})),Ft[e])}function Zt(e,t){var r=Yt(e);if(r.length<1)return t;var n=it.getIn(t,r);if(void 0===n)throw new Bt("Could not resolve pointer: ".concat(e," does not exist in document"),{pointer:e});return n}function Yt(e){var t;if("string"!=typeof e)throw new TypeError("Expected a string, got a ".concat(h()(e)));return"/"===e[0]&&(e=e.substr(1)),""===e?[]:A()(t=e.split("/")).call(t,Qt)}function Qt(e){return"string"!=typeof e?e:new(At())("=".concat(e.replace(/~1/g,"/").replace(/~0/g,"~"))).get("")}function Xt(e){var t,r=new(At())([["",e.replace(/~/g,"~0").replace(/\//g,"~1")]]);return $()(t=r.toString()).call(t,1)}function er(e,t){if(!(r=t)||"/"===r||"#"===r)return!0;var r,n=e.charAt(t.length),o=$()(t).call(t,-1);return 0===e.indexOf(t)&&(!n||"/"===n||"#"===n)&&"#"!==o}const tr={key:"allOf",plugin:function(e,t,r,n,o){if(!o.meta||!o.meta.$$ref){var a=$()(r).call(r,0,-1);if(!Rt(a)){if(!Array.isArray(e)){var i=new TypeError("allOf must be an array");return i.fullPath=r,i}var s=!1,l=o.value;if(a.forEach((function(e){l&&(l=l[e])})),l=me()({},l),0!==C()(l).length){delete l.allOf;var u,c,p=[];if(p.push(n.replace(a,{})),e.forEach((function(e,t){if(!n.isObject(e)){if(s)return null;s=!0;var o=new TypeError("Elements in allOf must be objects");return o.fullPath=r,p.push(o)}p.push(n.mergeDeep(a,e));var i=function(e,t){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},n=r.specmap,o=r.getBaseUrlForNodePath,a=void 0===o?function(e){var r;return n.getContext(j()(r=[]).call(r,q()(t),q()(e))).baseDoc}:o,i=r.targetKeys,s=void 0===i?["$ref","$$ref"]:i,l=[];return jt()(e).forEach((function(){if(v()(s).call(s,this.key)&&"string"==typeof this.node){var e=this.path,r=j()(t).call(t,this.path),o=Mt(this.node,a(e));l.push(n.replace(r,o))}})),l}(e,$()(r).call(r,0,-1),{getBaseUrlForNodePath:function(e){var o;return n.getContext(j()(o=[]).call(o,q()(r),[t],q()(e))).baseDoc},specmap:n});p.push.apply(p,q()(i))})),l.example)p.push(n.remove(j()(u=[]).call(u,a,"example")));if(p.push(n.mergeDeep(a,l)),!l.$$ref)p.push(n.remove(j()(c=[]).call(c,a,"$$ref")));return p}}}}},rr={key:"parameters",plugin:function(e,t,r,n){if(Array.isArray(e)&&e.length){var o=Ee()([],e),a=$()(r).call(r,0,-1),i=me()({},it.getIn(n.spec,a));return e.forEach((function(e,t){try{o[t].default=n.parameterMacro(i,e)}catch(e){var a=new Error(e);return a.fullPath=r,a}})),it.replace(r,o)}return it.replace(r,e)}},nr={key:"properties",plugin:function(e,t,r,n){var o=me()({},e);for(var a in e)try{o[a].default=n.modelPropertyMacro(o[a])}catch(e){var i=new Error(e);return i.fullPath=r,i}return it.replace(r,o)}};var or=function(){function e(t){ve()(this,e),this.root=ar(t||{})}return be()(e,[{key:"set",value:function(e,t){var r=this.getParent(e,!0);if(r){var n=e[e.length-1],o=r.children;o[n]?ir(o[n],t,r):o[n]=ar(t,r)}else ir(this.root,t,null)}},{key:"get",value:function(e){if((e=e||[]).length<1)return this.root.value;for(var t,r,n=this.root,o=0;o1?r-1:0),o=1;o1?n-1:0),a=1;a0}))}},{key:"nextPromisedPatch",value:function(){var e;if(this.promisedPatches.length>0)return Ae().race(A()(e=this.promisedPatches).call(e,(function(e){return e.value})))}},{key:"getPluginHistory",value:function(e){var t=this.constructor.getPluginName(e);return this.pluginHistory[t]||[]}},{key:"getPluginRunCount",value:function(e){return this.getPluginHistory(e).length}},{key:"getPluginHistoryTip",value:function(e){var t=this.getPluginHistory(e);return t&&t[t.length-1]||{}}},{key:"getPluginMutationIndex",value:function(e){var t=this.getPluginHistoryTip(e).mutationIndex;return"number"!=typeof t?-1:t}},{key:"updatePluginHistory",value:function(e,t){var r=this.constructor.getPluginName(e);this.pluginHistory[r]=this.pluginHistory[r]||[],this.pluginHistory[r].push(t)}},{key:"updatePatches",value:function(e){var t=this;it.normalizeArray(e).forEach((function(e){if(e instanceof Error)t.errors.push(e);else try{if(!it.isObject(e))return void t.debug("updatePatches","Got a non-object patch",e);if(t.showDebug&&t.allPatches.push(e),it.isPromise(e.value))return t.promisedPatches.push(e),void t.promisedPatchThen(e);if(it.isContextPatch(e))return void t.setContext(e.path,e.value);if(it.isMutation(e))return void t.updateMutations(e)}catch(e){console.error(e),t.errors.push(e)}}))}},{key:"updateMutations",value:function(e){"object"===h()(e.value)&&!Array.isArray(e.value)&&this.allowMetaPatches&&(e.value=me()({},e.value));var t=it.applyPatch(this.state,e,{allowMetaPatches:this.allowMetaPatches});t&&(this.mutations.push(e),this.state=t)}},{key:"removePromisedPatch",value:function(e){var t,r=this.promisedPatches.indexOf(e);r<0?this.debug("Tried to remove a promisedPatch that isn't there!"):Ce()(t=this.promisedPatches).call(t,r,1)}},{key:"promisedPatchThen",value:function(e){var t=this;return e.value=e.value.then((function(r){var n=me()(me()({},e),{},{value:r});t.removePromisedPatch(e),t.updatePatches(n)})).catch((function(r){t.removePromisedPatch(e),t.updatePatches(r)})),e.value}},{key:"getMutations",value:function(e,t){var r;return e=e||0,"number"!=typeof t&&(t=this.mutations.length),$()(r=this.mutations).call(r,e,t)}},{key:"getCurrentMutations",value:function(){return this.getMutationsForPlugin(this.getCurrentPlugin())}},{key:"getMutationsForPlugin",value:function(e){var t=this.getPluginMutationIndex(e);return this.getMutations(t+1)}},{key:"getCurrentPlugin",value:function(){return this.currentPlugin}},{key:"getLib",value:function(){return this.libMethods}},{key:"_get",value:function(e){return it.getIn(this.state,e)}},{key:"_getContext",value:function(e){return this.contextTree.get(e)}},{key:"setContext",value:function(e,t){return this.contextTree.set(e,t)}},{key:"_hasRun",value:function(e){return this.getPluginRunCount(this.getCurrentPlugin())>(e||0)}},{key:"dispatch",value:function(){var e,t=this,r=this,n=this.nextPlugin();if(!n){var o=this.nextPromisedPatch();if(o)return o.then((function(){return t.dispatch()})).catch((function(){return t.dispatch()}));var a={spec:this.state,errors:this.errors};return this.showDebug&&(a.patches=this.allPatches),Ae().resolve(a)}if(r.pluginCount=r.pluginCount||{},r.pluginCount[n]=(r.pluginCount[n]||0)+1,r.pluginCount[n]>100)return Ae().resolve({spec:r.state,errors:j()(e=r.errors).call(e,new Error("We've reached a hard limit of ".concat(100," plugin runs")))});if(n!==this.currentPlugin&&this.promisedPatches.length){var i,s=A()(i=this.promisedPatches).call(i,(function(e){return e.value}));return Ae().all(A()(s).call(s,(function(e){return e.then(sr,sr)}))).then((function(){return t.dispatch()}))}return function(){r.currentPlugin=n;var e=r.getCurrentMutations(),t=r.mutations.length-1;try{if(n.isGenerator){var o,a=p()(n(e,r.getLib()));try{for(a.s();!(o=a.n()).done;){l(o.value)}}catch(e){a.e(e)}finally{a.f()}}else{l(n(e,r.getLib()))}}catch(e){console.error(e),l([Ee()(Object.create(e),{plugin:n})])}finally{r.updatePluginHistory(n,{mutationIndex:t})}return r.dispatch()}();function l(e){e&&(e=it.fullyNormalizeArray(e),r.updatePatches(e,n))}}}],[{key:"getPluginName",value:function(e){return e.pluginName}},{key:"getPatchesOfType",value:function(e,t){return P()(e).call(e,t)}}]),e}();var ur={refs:$t,allOf:tr,parameters:rr,properties:nr},cr=r(23159);function pr(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},r=t.requestInterceptor,n=t.responseInterceptor,o=e.withCredentials?"include":"same-origin";return function(t){return e({url:t,loadSpec:!0,requestInterceptor:r,responseInterceptor:n,headers:{Accept:Dt},credentials:o}).then((function(e){return e.body}))}}function fr(e){var t=e.fetch,r=e.spec,n=e.url,o=e.mode,a=e.allowMetaPatches,i=void 0===a||a,l=e.pathDiscriminator,c=e.modelPropertyMacro,p=e.parameterMacro,f=e.requestInterceptor,h=e.responseInterceptor,d=e.skipNormalization,m=e.useCircularStructures,g=e.http,v=e.baseDoc;return v=v||n,g=t||g||Y,r?y(r):pr(g,{requestInterceptor:f,responseInterceptor:h})(v).then(y);function y(e){v&&(ur.refs.docCache[v]=e),ur.refs.fetchJSON=pr(g,{requestInterceptor:f,responseInterceptor:h});var t,r=[ur.refs];return"function"==typeof p&&r.push(ur.parameters),"function"==typeof c&&r.push(ur.properties),"strict"!==o&&r.push(ur.allOf),(t={spec:e,context:{baseDoc:v},plugins:r,allowMetaPatches:i,pathDiscriminator:l,parameterMacro:p,modelPropertyMacro:c,useCircularStructures:m},new lr(t).dispatch()).then(d?function(){var e=s()(u().mark((function e(t){return u().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.abrupt("return",t);case 1:case"end":return e.stop()}}),e)})));return function(t){return e.apply(this,arguments)}}():cr.K1)}}var hr=r(88436),dr=r.n(hr),mr=r(27361),gr=r.n(mr),vr=r(30006);function yr(e){return"[object Object]"===Object.prototype.toString.call(e)}function br(e){var t,r;return!1!==yr(e)&&(void 0===(t=e.constructor)||!1!==yr(r=t.prototype)&&!1!==r.hasOwnProperty("isPrototypeOf"))}const wr={body:function(e){var t=e.req,r=e.value;t.body=r},header:function(e){var t=e.req,r=e.parameter,n=e.value;t.headers=t.headers||{},void 0!==n&&(t.headers[r.name]=n)},query:function(e){var t=e.req,r=e.value,n=e.parameter;t.query=t.query||{},!1===r&&"boolean"===n.type&&(r="false");0===r&&["number","integer"].indexOf(n.type)>-1&&(r="0");if(r)t.query[n.name]={collectionFormat:n.collectionFormat,value:r};else if(n.allowEmptyValue&&void 0!==r){var o=n.name;t.query[o]=t.query[o]||{},t.query[o].allowEmptyValue=!0}},path:function(e){var t=e.req,r=e.value,n=e.parameter;t.url=t.url.split("{".concat(n.name,"}")).join(encodeURIComponent(r))},formData:function(e){var t=e.req,r=e.value,n=e.parameter;(r||n.allowEmptyValue)&&(t.form=t.form||{},t.form[n.name]={value:r,allowEmptyValue:n.allowEmptyValue,collectionFormat:n.collectionFormat})}};function Er(e,t){return v()(t).call(t,"application/json")?"string"==typeof e?e:_()(e):e.toString()}function xr(e){var t=e.req,r=e.value,n=e.parameter,o=n.name,a=n.style,i=n.explode,s=n.content;if(s){var l=C()(s)[0];t.url=t.url.split("{".concat(o,"}")).join(J(Er(r,l),{escape:!0}))}else{var u=K({key:n.name,value:r,style:a||"simple",explode:i||!1,escape:!0});t.url=t.url.split("{".concat(o,"}")).join(u)}}function _r(e){var t=e.req,r=e.value,n=e.parameter;if(t.query=t.query||{},n.content){var o=C()(n.content)[0];t.query[n.name]=Er(r,o)}else if(!1===r&&(r="false"),0===r&&(r="0"),r){var a=n.style,i=n.explode,s=n.allowReserved;t.query[n.name]={value:r,serializationOption:{style:a,explode:i,allowReserved:s}}}else if(n.allowEmptyValue&&void 0!==r){var l=n.name;t.query[l]=t.query[l]||{},t.query[l].allowEmptyValue=!0}}var Sr=["accept","authorization","content-type"];function Ar(e){var t=e.req,r=e.parameter,n=e.value;if(t.headers=t.headers||{},!(Sr.indexOf(r.name.toLowerCase())>-1))if(r.content){var o=C()(r.content)[0];t.headers[r.name]=Er(n,o)}else void 0!==n&&(t.headers[r.name]=K({key:r.name,value:n,style:r.style||"simple",explode:void 0!==r.explode&&r.explode,escape:!1}))}function kr(e){var t=e.req,r=e.parameter,n=e.value;t.headers=t.headers||{};var o=h()(n);if(r.content){var a,i=C()(r.content)[0];t.headers.Cookie=j()(a="".concat(r.name,"=")).call(a,Er(n,i))}else if("undefined"!==o){var s="object"===o&&!Array.isArray(n)&&r.explode?"":"".concat(r.name,"=");t.headers.Cookie=s+K({key:r.name,value:n,escape:!1,style:r.style||"form",explode:void 0!==r.explode&&r.explode})}}var Cr=r(92381),Or=r.n(Cr);const jr=(void 0!==Or()?Or():"undefined"!=typeof self?self:window).btoa;function Ir(e,t){var r=e.operation,n=e.requestBody,o=e.securities,a=e.spec,i=e.attachContentTypeForEmptyPayload,s=e.requestContentType;t=function(e){var t=e.request,r=e.securities,n=void 0===r?{}:r,o=e.operation,a=void 0===o?{}:o,i=e.spec,s=me()({},t),l=n.authorized,u=void 0===l?{}:l,c=a.security||i.security||[],p=u&&!!C()(u).length,f=gr()(i,["components","securitySchemes"])||{};if(s.headers=s.headers||{},s.query=s.query||{},!C()(n).length||!p||!c||Array.isArray(a.security)&&!a.security.length)return t;return c.forEach((function(e){C()(e).forEach((function(e){var t=u[e],r=f[e];if(t){var n=t.value||t,o=r.type;if(t)if("apiKey"===o)"query"===r.in&&(s.query[r.name]=n),"header"===r.in&&(s.headers[r.name]=n),"cookie"===r.in&&(s.cookies[r.name]=n);else if("http"===o){if(/^basic$/i.test(r.scheme)){var a,i=n.username||"",l=n.password||"",c=jr(j()(a="".concat(i,":")).call(a,l));s.headers.Authorization="Basic ".concat(c)}/^bearer$/i.test(r.scheme)&&(s.headers.Authorization="Bearer ".concat(n))}else if("oauth2"===o||"openIdConnect"===o){var p,h=t.token||{},d=h[r["x-tokenName"]||"access_token"],m=h.token_type;m&&"bearer"!==m.toLowerCase()||(m="Bearer"),s.headers.Authorization=j()(p="".concat(m," ")).call(p,d)}}}))})),s}({request:t,securities:o,operation:r,spec:a});var l=r.requestBody||{},u=C()(l.content||{}),c=s&&u.indexOf(s)>-1;if(n||i){if(s&&c)t.headers["Content-Type"]=s;else if(!s){var p=u[0];p&&(t.headers["Content-Type"]=p,s=p)}}else s&&c&&(t.headers["Content-Type"]=s);if(!e.responseContentType&&r.responses){var f,d=P()(f=N()(r.responses)).call(f,(function(e){var t=m()(e,2),r=t[0],n=t[1],o=parseInt(r,10);return o>=200&&o<300&&br(n.content)})).reduce((function(e,t){var r=m()(t,2)[1];return j()(e).call(e,C()(r.content))}),[]);d.length>0&&(t.headers.accept=d.join(", "))}if(n)if(s){if(u.indexOf(s)>-1)if("application/x-www-form-urlencoded"===s||"multipart/form-data"===s)if("object"===h()(n)){var g=(l.content[s]||{}).encoding||{};t.form={},C()(n).forEach((function(e){t.form[e]={value:n[e],encoding:g[e]||{}}}))}else t.form=n;else t.body=n}else t.body=n;return t}function Nr(e,t){var r,n,o=e.spec,a=e.operation,i=e.securities,s=e.requestContentType,l=e.responseContentType,u=e.attachContentTypeForEmptyPayload;if(t=function(e){var t=e.request,r=e.securities,n=void 0===r?{}:r,o=e.operation,a=void 0===o?{}:o,i=e.spec,s=me()({},t),l=n.authorized,u=void 0===l?{}:l,c=n.specSecurity,p=void 0===c?[]:c,f=a.security||p,h=u&&!!C()(u).length,d=i.securityDefinitions;if(s.headers=s.headers||{},s.query=s.query||{},!C()(n).length||!h||!f||Array.isArray(a.security)&&!a.security.length)return t;return f.forEach((function(e){C()(e).forEach((function(e){var t=u[e];if(t){var r=t.token,n=t.value||t,o=d[e],a=o.type,i=o["x-tokenName"]||"access_token",l=r&&r[i],c=r&&r.token_type;if(t)if("apiKey"===a){var p="query"===o.in?"query":"headers";s[p]=s[p]||{},s[p][o.name]=n}else if("basic"===a)if(n.header)s.headers.authorization=n.header;else{var f,h=n.username||"",m=n.password||"";n.base64=jr(j()(f="".concat(h,":")).call(f,m)),s.headers.authorization="Basic ".concat(n.base64)}else if("oauth2"===a&&l){var g;c=c&&"bearer"!==c.toLowerCase()?c:"Bearer",s.headers.authorization=j()(g="".concat(c," ")).call(g,l)}}}))})),s}({request:t,securities:i,operation:a,spec:o}),t.body||t.form||u)if(s)t.headers["Content-Type"]=s;else if(Array.isArray(a.consumes)){var c=m()(a.consumes,1);t.headers["Content-Type"]=c[0]}else if(Array.isArray(o.consumes)){var p=m()(o.consumes,1);t.headers["Content-Type"]=p[0]}else a.parameters&&P()(r=a.parameters).call(r,(function(e){return"file"===e.type})).length?t.headers["Content-Type"]="multipart/form-data":a.parameters&&P()(n=a.parameters).call(n,(function(e){return"formData"===e.in})).length&&(t.headers["Content-Type"]="application/x-www-form-urlencoded");else if(s){var f,h,d=a.parameters&&P()(f=a.parameters).call(f,(function(e){return"body"===e.in})).length>0,g=a.parameters&&P()(h=a.parameters).call(h,(function(e){return"formData"===e.in})).length>0;(d||g)&&(t.headers["Content-Type"]=s)}return!l&&Array.isArray(a.produces)&&a.produces.length>0&&(t.headers.accept=a.produces.join(", ")),t}var Tr=["http","fetch","spec","operationId","pathName","method","parameters","securities"],Pr=function(e){return Array.isArray(e)?e:[]},Rr=Ct("OperationNotFoundError",(function(e,t,r){this.originalError=r,Ee()(this,t||{})})),Mr={buildRequest:Lr};function Dr(e){var t=e.http,r=e.fetch,n=e.spec,o=e.operationId,a=e.pathName,i=e.method,s=e.parameters,l=e.securities,u=dr()(e,Tr),c=t||r||Y;a&&i&&!o&&(o=(0,cr.nc)(a,i));var p=Mr.buildRequest(me()({spec:n,operationId:o,parameters:s,securities:l,http:c},u));return p.body&&(br(p.body)||Array.isArray(p.body))&&(p.body=_()(p.body)),c(p)}function Lr(e){var t,r,n=e.spec,o=e.operationId,i=e.responseContentType,s=e.scheme,l=e.requestInterceptor,u=e.responseInterceptor,c=e.contextUrl,p=e.userFetch,f=e.server,h=e.serverVariables,d=e.http,g=e.signal,v=e.parameters,y=e.parameterBuilders,b=(0,cr.z6)(n);y||(y=b?a:wr);var w={url:"",credentials:d&&d.withCredentials?"include":"same-origin",headers:{},cookies:{}};g&&(w.signal=g),l&&(w.requestInterceptor=l),u&&(w.responseInterceptor=u),p&&(w.userFetch=p);var E=(0,cr.$r)(n,o);if(!E)throw new Rr("Operation ".concat(o," not found"));var x,_=E.operation,S=void 0===_?{}:_,k=E.method,O=E.pathName;if(w.url+=(x={spec:n,scheme:s,contextUrl:c,server:f,serverVariables:h,pathName:O,method:k},(0,cr.z6)(x.spec)?function(e){var t=e.spec,r=e.pathName,n=e.method,o=e.server,a=e.contextUrl,i=e.serverVariables,s=void 0===i?{}:i,l=gr()(t,["paths",r,(n||"").toLowerCase(),"servers"])||gr()(t,["paths",r,"servers"])||gr()(t,["servers"]),u="",c=null;if(o&&l&&l.length){var p=A()(l).call(l,(function(e){return e.url}));p.indexOf(o)>-1&&(u=o,c=l[p.indexOf(o)])}if(!u&&l&&l.length){u=l[0].url;var f=m()(l,1);c=f[0]}return u.indexOf("{")>-1&&function(e){for(var t,r=[],n=/{([^}]+)}/g;t=n.exec(e);)r.push(t[1]);return r}(u).forEach((function(e){if(c.variables&&c.variables[e]){var t=c.variables[e],r=s[e]||t.default,n=new RegExp("{".concat(e,"}"),"g");u=u.replace(n,r)}})),function(){var e,t,r=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",o=r&&n?kt.parse(kt.resolve(n,r)):kt.parse(r),a=kt.parse(n),i=Br(o.protocol)||Br(a.protocol)||"",s=o.host||a.host,l=o.pathname||"";return"/"===(e=i&&s?j()(t="".concat(i,"://")).call(t,s+l):l)[e.length-1]?$()(e).call(e,0,-1):e}(u,a)}(x):function(e){var t,r,n=e.spec,o=e.scheme,a=e.contextUrl,i=void 0===a?"":a,s=kt.parse(i),l=Array.isArray(n.schemes)?n.schemes[0]:null,u=o||l||Br(s.protocol)||"http",c=n.host||s.host||"",p=n.basePath||"";return"/"===(t=u&&c?j()(r="".concat(u,"://")).call(r,c+p):p)[t.length-1]?$()(t).call(t,0,-1):t}(x)),!o)return delete w.cookies,w;w.url+=O,w.method="".concat(k).toUpperCase(),v=v||{};var I=n.paths[O]||{};i&&(w.headers.accept=i);var N=function(e){var t={};e.forEach((function(e){t[e.in]||(t[e.in]={}),t[e.in][e.name]=e}));var r=[];return C()(t).forEach((function(e){C()(t[e]).forEach((function(n){r.push(t[e][n])}))})),r}(j()(t=j()(r=[]).call(r,Pr(S.parameters))).call(t,Pr(I.parameters)));N.forEach((function(e){var t,r,o=y[e.in];if("body"===e.in&&e.schema&&e.schema.properties&&(t=v),void 0===(t=e&&e.name&&v[e.name]))t=e&&e.name&&v[j()(r="".concat(e.in,".")).call(r,e.name)];else if(function(e,t){return P()(t).call(t,(function(t){return t.name===e}))}(e.name,N).length>1){var a;console.warn(j()(a="Parameter '".concat(e.name,"' is ambiguous because the defined spec has more than one parameter with the name: '")).call(a,e.name,"' and the passed-in parameter values did not define an 'in' value."))}if(null!==t){if(void 0!==e.default&&void 0===t&&(t=e.default),void 0===t&&e.required&&!e.allowEmptyValue)throw new Error("Required parameter ".concat(e.name," is not provided"));if(b&&e.schema&&"object"===e.schema.type&&"string"==typeof t)try{t=JSON.parse(t)}catch(e){throw new Error("Could not parse object parameter value string as JSON")}o&&o({req:w,parameter:e,value:t,operation:S,spec:n})}}));var T=me()(me()({},e),{},{operation:S});if((w=b?Ir(T,w):Nr(T,w)).cookies&&C()(w.cookies).length){var R=C()(w.cookies).reduce((function(e,t){var r=w.cookies[t];return e+(e?"&":"")+vr.serialize(t,r)}),"");w.headers.Cookie=R}return w.cookies&&delete w.cookies,fe(w),w}var Br=function(e){return e?e.replace(/\W/g,""):null};function Fr(e,t){return zr.apply(this,arguments)}function zr(){return zr=s()(u().mark((function e(t,r){var n,o,a,i,s,l,c,p,f,h,d,m,g=arguments;return u().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return n=g.length>2&&void 0!==g[2]?g[2]:{},o=n.returnEntireTree,a=n.baseDoc,i=n.requestInterceptor,s=n.responseInterceptor,l=n.parameterMacro,c=n.modelPropertyMacro,p=n.useCircularStructures,f={pathDiscriminator:r,baseDoc:a,requestInterceptor:i,responseInterceptor:s,parameterMacro:l,modelPropertyMacro:c,useCircularStructures:p},h=(0,cr.K1)({spec:t}),d=h.spec,e.next=6,fr(me()(me()({},f),{},{spec:d,allowMetaPatches:!0,skipNormalization:!0}));case 6:return m=e.sent,!o&&Array.isArray(r)&&r.length&&(m.spec=gr()(m.spec,r)||null),e.abrupt("return",m);case 9:case"end":return e.stop()}}),e)}))),zr.apply(this,arguments)}var Ur=r(34852);function qr(e){let{configs:t,getConfigs:r}=e;return{fn:{fetch:(n=Y,o=t.preFetch,a=t.postFetch,a=a||function(e){return e},o=o||function(e){return e},function(e){return"string"==typeof e&&(e={url:e}),Z.mergeInQueryOrForm(e),e=o(e),a(n(e))}),buildRequest:Lr,execute:Dr,resolve:fr,resolveSubtree:function(e,t,n){if(void 0===n){const e=r();n={modelPropertyMacro:e.modelPropertyMacro,parameterMacro:e.parameterMacro,requestInterceptor:e.requestInterceptor,responseInterceptor:e.responseInterceptor}}for(var o=arguments.length,a=new Array(o>3?o-3:0),i=3;i{"use strict";r.r(t),r.d(t,{default:()=>o});var n=r(90242);function o(){return{fn:{shallowEqualKeys:n.be}}}},48347:(e,t,r)=>{"use strict";r.r(t),r.d(t,{getDisplayName:()=>n});const n=e=>e.displayName||e.name||"Component"},73420:(e,t,r)=>{"use strict";r.r(t),r.d(t,{default:()=>u});var n=r(35627),o=r.n(n),a=r(90242),i=r(55776),s=r(48347),l=r(60314);const u=e=>{let{getComponents:t,getStore:r,getSystem:n}=e;const u=(c=(0,i.getComponent)(n,r,t),(0,a.HP)(c,(function(){for(var e=arguments.length,t=new Array(e),r=0;r(0,l.Z)(e,(function(){for(var e=arguments.length,t=new Array(e),r=0;r{"use strict";r.r(t),r.d(t,{getComponent:()=>ne,render:()=>re,withMappedContainer:()=>te});var n=r(23101),o=r.n(n),a=r(28222),i=r.n(a),s=r(67294),l=r(73935),u=r(97779),c=s.createContext(null);var p=function(e){e()},f=function(){return p},h={notify:function(){}};var d=function(){function e(e,t){this.store=e,this.parentSub=t,this.unsubscribe=null,this.listeners=h,this.handleChangeWrapper=this.handleChangeWrapper.bind(this)}var t=e.prototype;return t.addNestedSub=function(e){return this.trySubscribe(),this.listeners.subscribe(e)},t.notifyNestedSubs=function(){this.listeners.notify()},t.handleChangeWrapper=function(){this.onStateChange&&this.onStateChange()},t.isSubscribed=function(){return Boolean(this.unsubscribe)},t.trySubscribe=function(){this.unsubscribe||(this.unsubscribe=this.parentSub?this.parentSub.addNestedSub(this.handleChangeWrapper):this.store.subscribe(this.handleChangeWrapper),this.listeners=function(){var e=f(),t=null,r=null;return{clear:function(){t=null,r=null},notify:function(){e((function(){for(var e=t;e;)e.callback(),e=e.next}))},get:function(){for(var e=[],r=t;r;)e.push(r),r=r.next;return e},subscribe:function(e){var n=!0,o=r={callback:e,next:null,prev:r};return o.prev?o.prev.next=o:t=o,function(){n&&null!==t&&(n=!1,o.next?o.next.prev=o.prev:r=o.prev,o.prev?o.prev.next=o.next:t=o.next)}}}}())},t.tryUnsubscribe=function(){this.unsubscribe&&(this.unsubscribe(),this.unsubscribe=null,this.listeners.clear(),this.listeners=h)},e}(),m="undefined"!=typeof window&&void 0!==window.document&&void 0!==window.document.createElement?s.useLayoutEffect:s.useEffect;const g=function(e){var t=e.store,r=e.context,n=e.children,o=(0,s.useMemo)((function(){var e=new d(t);return e.onStateChange=e.notifyNestedSubs,{store:t,subscription:e}}),[t]),a=(0,s.useMemo)((function(){return t.getState()}),[t]);m((function(){var e=o.subscription;return e.trySubscribe(),a!==t.getState()&&e.notifyNestedSubs(),function(){e.tryUnsubscribe(),e.onStateChange=null}}),[o,a]);var i=r||c;return s.createElement(i.Provider,{value:o},n)};var v=r(87462),y=r(63366),b=r(8679),w=r.n(b),E=r(72973),x=[],_=[null,null];function S(e,t){var r=e[1];return[t.payload,r+1]}function A(e,t,r){m((function(){return e.apply(void 0,t)}),r)}function k(e,t,r,n,o,a,i){e.current=n,t.current=o,r.current=!1,a.current&&(a.current=null,i())}function C(e,t,r,n,o,a,i,s,l,u){if(e){var c=!1,p=null,f=function(){if(!c){var e,r,f=t.getState();try{e=n(f,o.current)}catch(e){r=e,p=e}r||(p=null),e===a.current?i.current||l():(a.current=e,s.current=e,i.current=!0,u({type:"STORE_UPDATED",payload:{error:r}}))}};r.onStateChange=f,r.trySubscribe(),f();return function(){if(c=!0,r.tryUnsubscribe(),r.onStateChange=null,p)throw p}}}var O=function(){return[null,0]};function j(e,t){void 0===t&&(t={});var r=t,n=r.getDisplayName,o=void 0===n?function(e){return"ConnectAdvanced("+e+")"}:n,a=r.methodName,i=void 0===a?"connectAdvanced":a,l=r.renderCountProp,u=void 0===l?void 0:l,p=r.shouldHandleStateChanges,f=void 0===p||p,h=r.storeKey,m=void 0===h?"store":h,g=(r.withRef,r.forwardRef),b=void 0!==g&&g,j=r.context,I=void 0===j?c:j,N=(0,y.Z)(r,["getDisplayName","methodName","renderCountProp","shouldHandleStateChanges","storeKey","withRef","forwardRef","context"]),T=I;return function(t){var r=t.displayName||t.name||"Component",n=o(r),a=(0,v.Z)({},N,{getDisplayName:o,methodName:i,renderCountProp:u,shouldHandleStateChanges:f,storeKey:m,displayName:n,wrappedComponentName:r,WrappedComponent:t}),l=N.pure;var c=l?s.useMemo:function(e){return e()};function p(r){var n=(0,s.useMemo)((function(){var e=r.reactReduxForwardedRef,t=(0,y.Z)(r,["reactReduxForwardedRef"]);return[r.context,e,t]}),[r]),o=n[0],i=n[1],l=n[2],u=(0,s.useMemo)((function(){return o&&o.Consumer&&(0,E.isContextConsumer)(s.createElement(o.Consumer,null))?o:T}),[o,T]),p=(0,s.useContext)(u),h=Boolean(r.store)&&Boolean(r.store.getState)&&Boolean(r.store.dispatch);Boolean(p)&&Boolean(p.store);var m=h?r.store:p.store,g=(0,s.useMemo)((function(){return function(t){return e(t.dispatch,a)}(m)}),[m]),b=(0,s.useMemo)((function(){if(!f)return _;var e=new d(m,h?null:p.subscription),t=e.notifyNestedSubs.bind(e);return[e,t]}),[m,h,p]),w=b[0],j=b[1],I=(0,s.useMemo)((function(){return h?p:(0,v.Z)({},p,{subscription:w})}),[h,p,w]),N=(0,s.useReducer)(S,x,O),P=N[0][0],R=N[1];if(P&&P.error)throw P.error;var M=(0,s.useRef)(),D=(0,s.useRef)(l),L=(0,s.useRef)(),B=(0,s.useRef)(!1),F=c((function(){return L.current&&l===D.current?L.current:g(m.getState(),l)}),[m,P,l]);A(k,[D,M,B,l,F,L,j]),A(C,[f,m,w,g,D,M,B,L,j,R],[m,w,g]);var z=(0,s.useMemo)((function(){return s.createElement(t,(0,v.Z)({},F,{ref:i}))}),[i,t,F]);return(0,s.useMemo)((function(){return f?s.createElement(u.Provider,{value:I},z):z}),[u,z,I])}var h=l?s.memo(p):p;if(h.WrappedComponent=t,h.displayName=p.displayName=n,b){var g=s.forwardRef((function(e,t){return s.createElement(h,(0,v.Z)({},e,{reactReduxForwardedRef:t}))}));return g.displayName=n,g.WrappedComponent=t,w()(g,t)}return w()(h,t)}}function I(e,t){return e===t?0!==e||0!==t||1/e==1/t:e!=e&&t!=t}function N(e,t){if(I(e,t))return!0;if("object"!=typeof e||null===e||"object"!=typeof t||null===t)return!1;var r=Object.keys(e),n=Object.keys(t);if(r.length!==n.length)return!1;for(var o=0;o=0;n--){var o=t[n](e);if(o)return o}return function(t,n){throw new Error("Invalid value of type "+typeof e+" for "+r+" argument when connecting component "+n.wrappedComponentName+".")}}function V(e,t){return e===t}function $(e){var t=void 0===e?{}:e,r=t.connectHOC,n=void 0===r?j:r,o=t.mapStateToPropsFactories,a=void 0===o?D:o,i=t.mapDispatchToPropsFactories,s=void 0===i?M:i,l=t.mergePropsFactories,u=void 0===l?B:l,c=t.selectorFactory,p=void 0===c?U:c;return function(e,t,r,o){void 0===o&&(o={});var i=o,l=i.pure,c=void 0===l||l,f=i.areStatesEqual,h=void 0===f?V:f,d=i.areOwnPropsEqual,m=void 0===d?N:d,g=i.areStatePropsEqual,b=void 0===g?N:g,w=i.areMergedPropsEqual,E=void 0===w?N:w,x=(0,y.Z)(i,["pure","areStatesEqual","areOwnPropsEqual","areStatePropsEqual","areMergedPropsEqual"]),_=q(e,a,"mapStateToProps"),S=q(t,s,"mapDispatchToProps"),A=q(r,u,"mergeProps");return n(p,(0,v.Z)({methodName:"connect",getDisplayName:function(e){return"Connect("+e+")"},shouldHandleStateChanges:Boolean(e),initMapStateToProps:_,initMapDispatchToProps:S,initMergeProps:A,pure:c,areStatesEqual:h,areOwnPropsEqual:m,areStatePropsEqual:b,areMergedPropsEqual:E},x))}}const W=$();var H;H=l.unstable_batchedUpdates,p=H;var J=r(57557),K=r.n(J),G=r(6557),Z=r.n(G);const Y=e=>t=>{const{fn:r}=e();class n extends s.Component{render(){return s.createElement(t,o()({},e(),this.props,this.context))}}return n.displayName=`WithSystem(${r.getDisplayName(t)})`,n},Q=(e,t)=>r=>{const{fn:n}=e();class a extends s.Component{render(){return s.createElement(g,{store:t},s.createElement(r,o()({},this.props,this.context)))}}return a.displayName=`WithRoot(${n.getDisplayName(r)})`,a},X=(e,t,r)=>(0,u.qC)(r?Q(e,r):Z(),W(((r,n)=>{var o;const a={...n,...e()},i=(null===(o=t.prototype)||void 0===o?void 0:o.mapStateToProps)||(e=>({state:e}));return i(r,a)})),Y(e))(t),ee=(e,t,r,n)=>{for(const o in t){const a=t[o];"function"==typeof a&&a(r[o],n[o],e())}},te=(e,t,r)=>(t,n)=>{const{fn:o}=e(),a=r(t,"root");class l extends s.Component{constructor(t,r){super(t,r),ee(e,n,t,{})}UNSAFE_componentWillReceiveProps(t){ee(e,n,t,this.props)}render(){const e=K()(this.props,n?i()(n):[]);return s.createElement(a,e)}}return l.displayName=`WithMappedContainer(${o.getDisplayName(a)})`,l},re=(e,t,r,n)=>o=>{const a=r(e,t,n)("App","root");l.render(s.createElement(a,null),o)},ne=(e,t,r)=>function(n,o){let a=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};if("string"!=typeof n)throw new TypeError("Need a string, to fetch a component. Was given a "+typeof n);const i=r(n);return i?o?"root"===o?X(e,i,t()):X(e,i):i:(a.failSilently||e().log.warn("Could not find component:",n),null)}},36581:(e,t,r)=>{"use strict";r.d(t,{d3:()=>T,C2:()=>Z});var n=r(28222),o=r.n(n),a=r(58118),i=r.n(a),s=r(63366);function l(e,t){(null==t||t>e.length)&&(t=e.length);for(var r=0,n=new Array(t);r=4?[t[0],t[1],t[2],t[3],"".concat(t[0],".").concat(t[1]),"".concat(t[0],".").concat(t[2]),"".concat(t[0],".").concat(t[3]),"".concat(t[1],".").concat(t[0]),"".concat(t[1],".").concat(t[2]),"".concat(t[1],".").concat(t[3]),"".concat(t[2],".").concat(t[0]),"".concat(t[2],".").concat(t[1]),"".concat(t[2],".").concat(t[3]),"".concat(t[3],".").concat(t[0]),"".concat(t[3],".").concat(t[1]),"".concat(t[3],".").concat(t[2]),"".concat(t[0],".").concat(t[1],".").concat(t[2]),"".concat(t[0],".").concat(t[1],".").concat(t[3]),"".concat(t[0],".").concat(t[2],".").concat(t[1]),"".concat(t[0],".").concat(t[2],".").concat(t[3]),"".concat(t[0],".").concat(t[3],".").concat(t[1]),"".concat(t[0],".").concat(t[3],".").concat(t[2]),"".concat(t[1],".").concat(t[0],".").concat(t[2]),"".concat(t[1],".").concat(t[0],".").concat(t[3]),"".concat(t[1],".").concat(t[2],".").concat(t[0]),"".concat(t[1],".").concat(t[2],".").concat(t[3]),"".concat(t[1],".").concat(t[3],".").concat(t[0]),"".concat(t[1],".").concat(t[3],".").concat(t[2]),"".concat(t[2],".").concat(t[0],".").concat(t[1]),"".concat(t[2],".").concat(t[0],".").concat(t[3]),"".concat(t[2],".").concat(t[1],".").concat(t[0]),"".concat(t[2],".").concat(t[1],".").concat(t[3]),"".concat(t[2],".").concat(t[3],".").concat(t[0]),"".concat(t[2],".").concat(t[3],".").concat(t[1]),"".concat(t[3],".").concat(t[0],".").concat(t[1]),"".concat(t[3],".").concat(t[0],".").concat(t[2]),"".concat(t[3],".").concat(t[1],".").concat(t[0]),"".concat(t[3],".").concat(t[1],".").concat(t[2]),"".concat(t[3],".").concat(t[2],".").concat(t[0]),"".concat(t[3],".").concat(t[2],".").concat(t[1]),"".concat(t[0],".").concat(t[1],".").concat(t[2],".").concat(t[3]),"".concat(t[0],".").concat(t[1],".").concat(t[3],".").concat(t[2]),"".concat(t[0],".").concat(t[2],".").concat(t[1],".").concat(t[3]),"".concat(t[0],".").concat(t[2],".").concat(t[3],".").concat(t[1]),"".concat(t[0],".").concat(t[3],".").concat(t[1],".").concat(t[2]),"".concat(t[0],".").concat(t[3],".").concat(t[2],".").concat(t[1]),"".concat(t[1],".").concat(t[0],".").concat(t[2],".").concat(t[3]),"".concat(t[1],".").concat(t[0],".").concat(t[3],".").concat(t[2]),"".concat(t[1],".").concat(t[2],".").concat(t[0],".").concat(t[3]),"".concat(t[1],".").concat(t[2],".").concat(t[3],".").concat(t[0]),"".concat(t[1],".").concat(t[3],".").concat(t[0],".").concat(t[2]),"".concat(t[1],".").concat(t[3],".").concat(t[2],".").concat(t[0]),"".concat(t[2],".").concat(t[0],".").concat(t[1],".").concat(t[3]),"".concat(t[2],".").concat(t[0],".").concat(t[3],".").concat(t[1]),"".concat(t[2],".").concat(t[1],".").concat(t[0],".").concat(t[3]),"".concat(t[2],".").concat(t[1],".").concat(t[3],".").concat(t[0]),"".concat(t[2],".").concat(t[3],".").concat(t[0],".").concat(t[1]),"".concat(t[2],".").concat(t[3],".").concat(t[1],".").concat(t[0]),"".concat(t[3],".").concat(t[0],".").concat(t[1],".").concat(t[2]),"".concat(t[3],".").concat(t[0],".").concat(t[2],".").concat(t[1]),"".concat(t[3],".").concat(t[1],".").concat(t[0],".").concat(t[2]),"".concat(t[3],".").concat(t[1],".").concat(t[2],".").concat(t[0]),"".concat(t[3],".").concat(t[2],".").concat(t[0],".").concat(t[1]),"".concat(t[3],".").concat(t[2],".").concat(t[1],".").concat(t[0])]:void 0),d[n]}function g(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},r=arguments.length>2?arguments[2]:void 0,n=e.filter((function(e){return"token"!==e})),o=m(n);return o.reduce((function(e,t){return p({},e,r[t])}),t)}function v(e){return e.join(" ")}function y(e){var t=e.node,r=e.stylesheet,n=e.style,o=void 0===n?{}:n,a=e.useInlineStyles,i=e.key,s=t.properties,l=t.type,u=t.tagName,c=t.value;if("text"===l)return c;if(u){var d,m=function(e,t){var r=0;return function(n){return r+=1,n.map((function(n,o){return y({node:n,stylesheet:e,useInlineStyles:t,key:"code-segment-".concat(r,"-").concat(o)})}))}}(r,a);if(a){var b=Object.keys(r).reduce((function(e,t){return t.split(".").forEach((function(t){e.includes(t)||e.push(t)})),e}),[]),w=s.className&&s.className.includes("token")?["token"]:[],E=s.className&&w.concat(s.className.filter((function(e){return!b.includes(e)})));d=p({},s,{className:v(E)||void 0,style:g(s.className,Object.assign({},s.style,o),r)})}else d=p({},s,{className:v(s.className)});var x=m(t.children);return f.createElement(u,(0,h.Z)({key:i},d),x)}}var b=/\n/g;function w(e){var t=e.codeString,r=e.codeStyle,n=e.containerStyle,o=void 0===n?{float:"left",paddingRight:"10px"}:n,a=e.numberStyle,i=void 0===a?{}:a,s=e.startingLineNumber;return f.createElement("code",{style:Object.assign({},r,o)},function(e){var t=e.lines,r=e.startingLineNumber,n=e.style;return t.map((function(e,t){var o=t+r;return f.createElement("span",{key:"line-".concat(t),className:"react-syntax-highlighter-line-number",style:"function"==typeof n?n(o):n},"".concat(o,"\n"))}))}({lines:t.replace(/\n$/,"").split("\n"),style:i,startingLineNumber:s}))}function E(e,t){return{type:"element",tagName:"span",properties:{key:"line-number--".concat(e),className:["comment","linenumber","react-syntax-highlighter-line-number"],style:t},children:[{type:"text",value:e}]}}function x(e,t,r){var n;return p({},{display:"inline-block",minWidth:(n=r,"".concat(n.toString().length,".25em")),paddingRight:"1em",textAlign:"right",userSelect:"none"},"function"==typeof e?e(t):e)}function _(e){var t=e.children,r=e.lineNumber,n=e.lineNumberStyle,o=e.largestLineNumber,a=e.showInlineLineNumbers,i=e.lineProps,s=void 0===i?{}:i,l=e.className,u=void 0===l?[]:l,c=e.showLineNumbers,f=e.wrapLongLines,h="function"==typeof s?s(r):s;if(h.className=u,r&&a){var d=x(n,r,o);t.unshift(E(r,d))}return f&c&&(h.style=p({},h.style,{display:"flex"})),{type:"element",tagName:"span",properties:h,children:t}}function S(e){for(var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[],r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:[],n=0;n2&&void 0!==arguments[2]?arguments[2]:[];return _({children:e,lineNumber:t,lineNumberStyle:s,largestLineNumber:i,showInlineLineNumbers:o,lineProps:r,className:a,showLineNumbers:n,wrapLongLines:l})}function m(e,t){if(n&&t&&o){var r=x(s,t,i);e.unshift(E(t,r))}return e}function g(e,r){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:[];return t||n.length>0?d(e,r,n):m(e,r)}for(var v=function(){var e=c[h],t=e.children[0].value;if(t.match(b)){var r=t.split("\n");r.forEach((function(t,o){var i=n&&p.length+a,s={type:"text",value:"".concat(t,"\n")};if(0===o){var l=g(c.slice(f+1,h).concat(_({children:[s],className:e.properties.className})),i);p.push(l)}else if(o===r.length-1){if(c[h+1]&&c[h+1].children&&c[h+1].children[0]){var u=_({children:[{type:"text",value:"".concat(t)}],className:e.properties.className});c.splice(h+1,0,u)}else{var d=g([s],i,e.properties.className);p.push(d)}}else{var m=g([s],i,e.properties.className);p.push(m)}})),f=h}h++};h=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}(e,["language","children","style","customStyle","codeTagProps","useInlineStyles","showLineNumbers","showInlineLineNumbers","startingLineNumber","lineNumberContainerStyle","lineNumberStyle","wrapLines","wrapLongLines","lineProps","renderer","PreTag","CodeTag","code","astGenerator"]);U=U||O;var V=m?f.createElement(w,{containerStyle:E,codeStyle:u.style||{},numberStyle:_,startingLineNumber:b,codeString:z}):null,$=o.hljs||o['pre[class*="language-"]']||{backgroundColor:"#fff"},W=C(U)?"hljs":"prismjs",H=h?Object.assign({},q,{style:Object.assign({},$,i)}):Object.assign({},q,{className:q.className?"".concat(W," ").concat(q.className):W,style:Object.assign({},i)});if(!U)return f.createElement(D,H,V,f.createElement(B,u,z));(void 0===S&&R||N)&&(S=!0),R=R||k;var J=[{type:"text",value:z}],K=function(e){var t=e.astGenerator,r=e.language,n=e.code,o=e.defaultCodeValue;if(C(t)){var a=function(e,t){return-1!==e.listLanguages().indexOf(t)}(t,r);return"text"===r?{value:o,language:"text"}:a?t.highlight(r,n):t.highlightAuto(n)}try{return r&&"text"!==r?{value:t.highlight(n,r)}:{value:o}}catch(e){return{value:o}}}({astGenerator:U,language:t,code:z,defaultCodeValue:J});null===K.language&&(K.value=J);var G=A(K,S,P,m,v,b,K.value.length+b,_,N);return u.style=p({},u.style,N?{whiteSpace:"pre-wrap"}:{whiteSpace:"pre"}),f.createElement(D,H,f.createElement(B,u,!v&&V,R({rows:G,stylesheet:o,useInlineStyles:h})))});N.registerLanguage=I.registerLanguage;const T=N;var P=r(96344);const R=r.n(P)();var M=r(82026);const D=r.n(M)();var L=r(42157);const B=r.n(L)();var F=r(61519);const z=r.n(F)();var U=r(54587);const q=r.n(U)();var V=r(30786);const $=r.n(V)();var W=r(66336);const H=r.n(W)(),J={hljs:{display:"block",overflowX:"auto",padding:"0.5em",background:"#333",color:"white"},"hljs-name":{fontWeight:"bold"},"hljs-strong":{fontWeight:"bold"},"hljs-code":{fontStyle:"italic",color:"#888"},"hljs-emphasis":{fontStyle:"italic"},"hljs-tag":{color:"#62c8f3"},"hljs-variable":{color:"#ade5fc"},"hljs-template-variable":{color:"#ade5fc"},"hljs-selector-id":{color:"#ade5fc"},"hljs-selector-class":{color:"#ade5fc"},"hljs-string":{color:"#a2fca2"},"hljs-bullet":{color:"#d36363"},"hljs-type":{color:"#ffa"},"hljs-title":{color:"#ffa"},"hljs-section":{color:"#ffa"},"hljs-attribute":{color:"#ffa"},"hljs-quote":{color:"#ffa"},"hljs-built_in":{color:"#ffa"},"hljs-builtin-name":{color:"#ffa"},"hljs-number":{color:"#d36363"},"hljs-symbol":{color:"#d36363"},"hljs-keyword":{color:"#fcc28c"},"hljs-selector-tag":{color:"#fcc28c"},"hljs-literal":{color:"#fcc28c"},"hljs-comment":{color:"#888"},"hljs-deletion":{color:"#333",backgroundColor:"#fc9b9b"},"hljs-regexp":{color:"#c6b4f0"},"hljs-link":{color:"#c6b4f0"},"hljs-meta":{color:"#fc9b9b"},"hljs-addition":{backgroundColor:"#a2fca2",color:"#333"}};T.registerLanguage("json",D),T.registerLanguage("js",R),T.registerLanguage("xml",B),T.registerLanguage("yaml",q),T.registerLanguage("http",$),T.registerLanguage("bash",z),T.registerLanguage("powershell",H),T.registerLanguage("javascript",R);const K={agate:J,arta:{hljs:{display:"block",overflowX:"auto",padding:"0.5em",background:"#222",color:"#aaa"},"hljs-subst":{color:"#aaa"},"hljs-section":{color:"#fff",fontWeight:"bold"},"hljs-comment":{color:"#444"},"hljs-quote":{color:"#444"},"hljs-meta":{color:"#444"},"hljs-string":{color:"#ffcc33"},"hljs-symbol":{color:"#ffcc33"},"hljs-bullet":{color:"#ffcc33"},"hljs-regexp":{color:"#ffcc33"},"hljs-number":{color:"#00cc66"},"hljs-addition":{color:"#00cc66"},"hljs-built_in":{color:"#32aaee"},"hljs-builtin-name":{color:"#32aaee"},"hljs-literal":{color:"#32aaee"},"hljs-type":{color:"#32aaee"},"hljs-template-variable":{color:"#32aaee"},"hljs-attribute":{color:"#32aaee"},"hljs-link":{color:"#32aaee"},"hljs-keyword":{color:"#6644aa"},"hljs-selector-tag":{color:"#6644aa"},"hljs-name":{color:"#6644aa"},"hljs-selector-id":{color:"#6644aa"},"hljs-selector-class":{color:"#6644aa"},"hljs-title":{color:"#bb1166"},"hljs-variable":{color:"#bb1166"},"hljs-deletion":{color:"#bb1166"},"hljs-template-tag":{color:"#bb1166"},"hljs-doctag":{fontWeight:"bold"},"hljs-strong":{fontWeight:"bold"},"hljs-emphasis":{fontStyle:"italic"}},monokai:{hljs:{display:"block",overflowX:"auto",padding:"0.5em",background:"#272822",color:"#ddd"},"hljs-tag":{color:"#f92672"},"hljs-keyword":{color:"#f92672",fontWeight:"bold"},"hljs-selector-tag":{color:"#f92672",fontWeight:"bold"},"hljs-literal":{color:"#f92672",fontWeight:"bold"},"hljs-strong":{color:"#f92672"},"hljs-name":{color:"#f92672"},"hljs-code":{color:"#66d9ef"},"hljs-class .hljs-title":{color:"white"},"hljs-attribute":{color:"#bf79db"},"hljs-symbol":{color:"#bf79db"},"hljs-regexp":{color:"#bf79db"},"hljs-link":{color:"#bf79db"},"hljs-string":{color:"#a6e22e"},"hljs-bullet":{color:"#a6e22e"},"hljs-subst":{color:"#a6e22e"},"hljs-title":{color:"#a6e22e",fontWeight:"bold"},"hljs-section":{color:"#a6e22e",fontWeight:"bold"},"hljs-emphasis":{color:"#a6e22e"},"hljs-type":{color:"#a6e22e",fontWeight:"bold"},"hljs-built_in":{color:"#a6e22e"},"hljs-builtin-name":{color:"#a6e22e"},"hljs-selector-attr":{color:"#a6e22e"},"hljs-selector-pseudo":{color:"#a6e22e"},"hljs-addition":{color:"#a6e22e"},"hljs-variable":{color:"#a6e22e"},"hljs-template-tag":{color:"#a6e22e"},"hljs-template-variable":{color:"#a6e22e"},"hljs-comment":{color:"#75715e"},"hljs-quote":{color:"#75715e"},"hljs-deletion":{color:"#75715e"},"hljs-meta":{color:"#75715e"},"hljs-doctag":{fontWeight:"bold"},"hljs-selector-id":{fontWeight:"bold"}},nord:{hljs:{display:"block",overflowX:"auto",padding:"0.5em",background:"#2E3440",color:"#D8DEE9"},"hljs-subst":{color:"#D8DEE9"},"hljs-selector-tag":{color:"#81A1C1"},"hljs-selector-id":{color:"#8FBCBB",fontWeight:"bold"},"hljs-selector-class":{color:"#8FBCBB"},"hljs-selector-attr":{color:"#8FBCBB"},"hljs-selector-pseudo":{color:"#88C0D0"},"hljs-addition":{backgroundColor:"rgba(163, 190, 140, 0.5)"},"hljs-deletion":{backgroundColor:"rgba(191, 97, 106, 0.5)"},"hljs-built_in":{color:"#8FBCBB"},"hljs-type":{color:"#8FBCBB"},"hljs-class":{color:"#8FBCBB"},"hljs-function":{color:"#88C0D0"},"hljs-function > .hljs-title":{color:"#88C0D0"},"hljs-keyword":{color:"#81A1C1"},"hljs-literal":{color:"#81A1C1"},"hljs-symbol":{color:"#81A1C1"},"hljs-number":{color:"#B48EAD"},"hljs-regexp":{color:"#EBCB8B"},"hljs-string":{color:"#A3BE8C"},"hljs-title":{color:"#8FBCBB"},"hljs-params":{color:"#D8DEE9"},"hljs-bullet":{color:"#81A1C1"},"hljs-code":{color:"#8FBCBB"},"hljs-emphasis":{fontStyle:"italic"},"hljs-formula":{color:"#8FBCBB"},"hljs-strong":{fontWeight:"bold"},"hljs-link:hover":{textDecoration:"underline"},"hljs-quote":{color:"#4C566A"},"hljs-comment":{color:"#4C566A"},"hljs-doctag":{color:"#8FBCBB"},"hljs-meta":{color:"#5E81AC"},"hljs-meta-keyword":{color:"#5E81AC"},"hljs-meta-string":{color:"#A3BE8C"},"hljs-attr":{color:"#8FBCBB"},"hljs-attribute":{color:"#D8DEE9"},"hljs-builtin-name":{color:"#81A1C1"},"hljs-name":{color:"#81A1C1"},"hljs-section":{color:"#88C0D0"},"hljs-tag":{color:"#81A1C1"},"hljs-variable":{color:"#D8DEE9"},"hljs-template-variable":{color:"#D8DEE9"},"hljs-template-tag":{color:"#5E81AC"},"abnf .hljs-attribute":{color:"#88C0D0"},"abnf .hljs-symbol":{color:"#EBCB8B"},"apache .hljs-attribute":{color:"#88C0D0"},"apache .hljs-section":{color:"#81A1C1"},"arduino .hljs-built_in":{color:"#88C0D0"},"aspectj .hljs-meta":{color:"#D08770"},"aspectj > .hljs-title":{color:"#88C0D0"},"bnf .hljs-attribute":{color:"#8FBCBB"},"clojure .hljs-name":{color:"#88C0D0"},"clojure .hljs-symbol":{color:"#EBCB8B"},"coq .hljs-built_in":{color:"#88C0D0"},"cpp .hljs-meta-string":{color:"#8FBCBB"},"css .hljs-built_in":{color:"#88C0D0"},"css .hljs-keyword":{color:"#D08770"},"diff .hljs-meta":{color:"#8FBCBB"},"ebnf .hljs-attribute":{color:"#8FBCBB"},"glsl .hljs-built_in":{color:"#88C0D0"},"groovy .hljs-meta:not(:first-child)":{color:"#D08770"},"haxe .hljs-meta":{color:"#D08770"},"java .hljs-meta":{color:"#D08770"},"ldif .hljs-attribute":{color:"#8FBCBB"},"lisp .hljs-name":{color:"#88C0D0"},"lua .hljs-built_in":{color:"#88C0D0"},"moonscript .hljs-built_in":{color:"#88C0D0"},"nginx .hljs-attribute":{color:"#88C0D0"},"nginx .hljs-section":{color:"#5E81AC"},"pf .hljs-built_in":{color:"#88C0D0"},"processing .hljs-built_in":{color:"#88C0D0"},"scss .hljs-keyword":{color:"#81A1C1"},"stylus .hljs-keyword":{color:"#81A1C1"},"swift .hljs-meta":{color:"#D08770"},"vim .hljs-built_in":{color:"#88C0D0",fontStyle:"italic"},"yaml .hljs-meta":{color:"#D08770"}},obsidian:{hljs:{display:"block",overflowX:"auto",padding:"0.5em",background:"#282b2e",color:"#e0e2e4"},"hljs-keyword":{color:"#93c763",fontWeight:"bold"},"hljs-selector-tag":{color:"#93c763",fontWeight:"bold"},"hljs-literal":{color:"#93c763",fontWeight:"bold"},"hljs-selector-id":{color:"#93c763"},"hljs-number":{color:"#ffcd22"},"hljs-attribute":{color:"#668bb0"},"hljs-code":{color:"white"},"hljs-class .hljs-title":{color:"white"},"hljs-section":{color:"white",fontWeight:"bold"},"hljs-regexp":{color:"#d39745"},"hljs-link":{color:"#d39745"},"hljs-meta":{color:"#557182"},"hljs-tag":{color:"#8cbbad"},"hljs-name":{color:"#8cbbad",fontWeight:"bold"},"hljs-bullet":{color:"#8cbbad"},"hljs-subst":{color:"#8cbbad"},"hljs-emphasis":{color:"#8cbbad"},"hljs-type":{color:"#8cbbad",fontWeight:"bold"},"hljs-built_in":{color:"#8cbbad"},"hljs-selector-attr":{color:"#8cbbad"},"hljs-selector-pseudo":{color:"#8cbbad"},"hljs-addition":{color:"#8cbbad"},"hljs-variable":{color:"#8cbbad"},"hljs-template-tag":{color:"#8cbbad"},"hljs-template-variable":{color:"#8cbbad"},"hljs-string":{color:"#ec7600"},"hljs-symbol":{color:"#ec7600"},"hljs-comment":{color:"#818e96"},"hljs-quote":{color:"#818e96"},"hljs-deletion":{color:"#818e96"},"hljs-selector-class":{color:"#A082BD"},"hljs-doctag":{fontWeight:"bold"},"hljs-title":{fontWeight:"bold"},"hljs-strong":{fontWeight:"bold"}},"tomorrow-night":{"hljs-comment":{color:"#969896"},"hljs-quote":{color:"#969896"},"hljs-variable":{color:"#cc6666"},"hljs-template-variable":{color:"#cc6666"},"hljs-tag":{color:"#cc6666"},"hljs-name":{color:"#cc6666"},"hljs-selector-id":{color:"#cc6666"},"hljs-selector-class":{color:"#cc6666"},"hljs-regexp":{color:"#cc6666"},"hljs-deletion":{color:"#cc6666"},"hljs-number":{color:"#de935f"},"hljs-built_in":{color:"#de935f"},"hljs-builtin-name":{color:"#de935f"},"hljs-literal":{color:"#de935f"},"hljs-type":{color:"#de935f"},"hljs-params":{color:"#de935f"},"hljs-meta":{color:"#de935f"},"hljs-link":{color:"#de935f"},"hljs-attribute":{color:"#f0c674"},"hljs-string":{color:"#b5bd68"},"hljs-symbol":{color:"#b5bd68"},"hljs-bullet":{color:"#b5bd68"},"hljs-addition":{color:"#b5bd68"},"hljs-title":{color:"#81a2be"},"hljs-section":{color:"#81a2be"},"hljs-keyword":{color:"#b294bb"},"hljs-selector-tag":{color:"#b294bb"},hljs:{display:"block",overflowX:"auto",background:"#1d1f21",color:"#c5c8c6",padding:"0.5em"},"hljs-emphasis":{fontStyle:"italic"},"hljs-strong":{fontWeight:"bold"}}},G=o()(K),Z=e=>i()(G).call(G,e)?K[e]:(console.warn(`Request style '${e}' is not available, returning default instead`),J)},90242:(e,t,r)=>{"use strict";r.d(t,{mz:()=>pe,oG:()=>fe,AF:()=>he,LQ:()=>de,Kn:()=>me,Wl:()=>ge,kJ:()=>ve,HP:()=>ye,Ay:()=>be,Q2:()=>we,_5:()=>Ee,iQ:()=>xe,gp:()=>_e,DR:()=>Se,Zl:()=>Ae,Ik:()=>Ce,xi:()=>Pe,UG:()=>Re,r3:()=>Me,wh:()=>De,GZ:()=>Le,be:()=>Be,Nm:()=>Fe,hW:()=>ze,QG:()=>Ue,oJ:()=>qe,J6:()=>Ve,nX:()=>$e,po:()=>We,XV:()=>He,Pz:()=>Je,D$:()=>Ke,V9:()=>Ge,cz:()=>Ze,Uj:()=>Ye,Xb:()=>Qe,O2:()=>et});var n=r(58309),o=r.n(n),a=r(97606),i=r.n(a),s=r(74386),l=r.n(s),u=r(86),c=r.n(u),p=r(14418),f=r.n(p),h=r(28222),d=r.n(h),m=(r(11189),r(24282)),g=r.n(m),v=r(76986),y=r.n(v),b=r(2578),w=r.n(b),E=r(24278),x=r.n(E),_=(r(39022),r(92039)),S=r.n(_),A=(r(58118),r(35627)),k=r.n(A),C=r(11882),O=r.n(C),j=r(51679),I=r.n(j),N=r(27043),T=r.n(N),P=r(81607),R=r.n(P),M=r(43393),D=r.n(M),L=r(17967),B=r(68929),F=r.n(B),z=r(11700),U=r.n(z),q=r(88306),V=r.n(q),$=r(13311),W=r.n($),H=r(59704),J=r.n(H),K=r(77813),G=r.n(K),Z=r(23560),Y=r.n(Z),Q=r(57050),X=r(27504),ee=r(8269),te=r.n(ee),re=r(19069),ne=r(92282),oe=r.n(ne),ae=r(89072),ie=r.n(ae),se=r(1272),le=r(48764).Buffer;const ue="default",ce=e=>D().Iterable.isIterable(e);function pe(e){return me(e)?ce(e)?e.toJS():e:{}}function fe(e){var t,r;if(ce(e))return e;if(e instanceof X.Z.File)return e;if(!me(e))return e;if(o()(e))return i()(r=D().Seq(e)).call(r,fe).toList();if(Y()(l()(e))){var n;const t=function(e){if(!Y()(l()(e)))return e;const t={},r="_**[]",n={};for(let o of l()(e).call(e))if(t[o[0]]||n[o[0]]&&n[o[0]].containsMultiple){if(!n[o[0]]){n[o[0]]={containsMultiple:!0,length:1},t[`${o[0]}${r}${n[o[0]].length}`]=t[o[0]],delete t[o[0]]}n[o[0]].length+=1,t[`${o[0]}${r}${n[o[0]].length}`]=o[1]}else t[o[0]]=o[1];return t}(e);return i()(n=D().OrderedMap(t)).call(n,fe)}return i()(t=D().OrderedMap(e)).call(t,fe)}function he(e){return o()(e)?e:[e]}function de(e){return"function"==typeof e}function me(e){return!!e&&"object"==typeof e}function ge(e){return"function"==typeof e}function ve(e){return o()(e)}const ye=V();function be(e,t){var r;return g()(r=d()(e)).call(r,((r,n)=>(r[n]=t(e[n],n),r)),{})}function we(e,t){var r;return g()(r=d()(e)).call(r,((r,n)=>{let o=t(e[n],n);return o&&"object"==typeof o&&y()(r,o),r}),{})}function Ee(e){return t=>{let{dispatch:r,getState:n}=t;return t=>r=>"function"==typeof r?r(e()):t(r)}}function xe(e){var t;let r=e.keySeq();return r.contains(ue)?ue:w()(t=f()(r).call(r,(e=>"2"===(e+"")[0]))).call(t).first()}function _e(e,t){if(!D().Iterable.isIterable(e))return D().List();let r=e.getIn(o()(t)?t:[t]);return D().List.isList(r)?r:D().List()}function Se(e){let t,r=[/filename\*=[^']+'\w*'"([^"]+)";?/i,/filename\*=[^']+'\w*'([^;]+);?/i,/filename="([^;]*);?"/i,/filename=([^;]*);?/i];if(S()(r).call(r,(r=>(t=r.exec(e),null!==t))),null!==t&&t.length>1)try{return decodeURIComponent(t[1])}catch(e){console.error(e)}return null}function Ae(e){return t=e.replace(/\.[^./]*$/,""),U()(F()(t));var t}function ke(e,t,r,n,a){if(!t)return[];let s=[],l=t.get("nullable"),u=t.get("required"),p=t.get("maximum"),h=t.get("minimum"),d=t.get("type"),m=t.get("format"),g=t.get("maxLength"),v=t.get("minLength"),y=t.get("uniqueItems"),b=t.get("maxItems"),w=t.get("minItems"),E=t.get("pattern");const x=r||!0===u,_=null!=e;if(l&&null===e||!d||!(x||_&&"array"===d||!(!x&&!_)))return[];let A="string"===d&&e,k="array"===d&&o()(e)&&e.length,C="array"===d&&D().List.isList(e)&&e.count();const O=[A,k,C,"array"===d&&"string"==typeof e&&e,"file"===d&&e instanceof X.Z.File,"boolean"===d&&(e||!1===e),"number"===d&&(e||0===e),"integer"===d&&(e||0===e),"object"===d&&"object"==typeof e&&null!==e,"object"===d&&"string"==typeof e&&e],j=S()(O).call(O,(e=>!!e));if(x&&!j&&!n)return s.push("Required field is not provided"),s;if("object"===d&&(null===a||"application/json"===a)){let r=e;if("string"==typeof e)try{r=JSON.parse(e)}catch(e){return s.push("Parameter string value must be valid JSON"),s}var I;if(t&&t.has("required")&&ge(u.isList)&&u.isList()&&c()(u).call(u,(e=>{void 0===r[e]&&s.push({propKey:e,error:"Required property not found"})})),t&&t.has("properties"))c()(I=t.get("properties")).call(I,((e,t)=>{const o=ke(r[t],e,!1,n,a);s.push(...i()(o).call(o,(e=>({propKey:t,error:e}))))}))}if(E){let t=((e,t)=>{if(!new RegExp(t).test(e))return"Value must follow pattern "+t})(e,E);t&&s.push(t)}if(w&&"array"===d){let t=((e,t)=>{if(!e&&t>=1||e&&e.length{if(e&&e.length>t)return`Array must not contain more then ${t} item${1===t?"":"s"}`})(e,b);t&&s.push({needRemove:!0,error:t})}if(y&&"array"===d){let t=((e,t)=>{if(e&&("true"===t||!0===t)){const t=(0,M.fromJS)(e),r=t.toSet();if(e.length>r.size){let e=(0,M.Set)();if(c()(t).call(t,((r,n)=>{f()(t).call(t,(e=>ge(e.equals)?e.equals(r):e===r)).size>1&&(e=e.add(n))})),0!==e.size)return i()(e).call(e,(e=>({index:e,error:"No duplicates allowed."}))).toArray()}}})(e,y);t&&s.push(...t)}if(g||0===g){let t=((e,t)=>{if(e.length>t)return`Value must be no longer than ${t} character${1!==t?"s":""}`})(e,g);t&&s.push(t)}if(v){let t=((e,t)=>{if(e.length{if(e>t)return`Value must be less than ${t}`})(e,p);t&&s.push(t)}if(h||0===h){let t=((e,t)=>{if(e{if(isNaN(Date.parse(e)))return"Value must be a DateTime"})(e):"uuid"===m?(e=>{if(e=e.toString().toLowerCase(),!/^[{(]?[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}[)}]?$/.test(e))return"Value must be a Guid"})(e):(e=>{if(e&&"string"!=typeof e)return"Value must be a string"})(e),!t)return s;s.push(t)}else if("boolean"===d){let t=(e=>{if("true"!==e&&"false"!==e&&!0!==e&&!1!==e)return"Value must be a boolean"})(e);if(!t)return s;s.push(t)}else if("number"===d){let t=(e=>{if(!/^-?\d+(\.?\d+)?$/.test(e))return"Value must be a number"})(e);if(!t)return s;s.push(t)}else if("integer"===d){let t=(e=>{if(!/^-?\d+$/.test(e))return"Value must be an integer"})(e);if(!t)return s;s.push(t)}else if("array"===d){if(!k&&!C)return s;e&&c()(e).call(e,((e,r)=>{const o=ke(e,t.get("items"),!1,n,a);s.push(...i()(o).call(o,(e=>({index:r,error:e}))))}))}else if("file"===d){let t=(e=>{if(e&&!(e instanceof X.Z.File))return"Value must be a file"})(e);if(!t)return s;s.push(t)}return s}const Ce=function(e,t){let{isOAS3:r=!1,bypassRequiredCheck:n=!1}=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},o=e.get("required"),{schema:a,parameterContentMediaType:i}=(0,re.Z)(e,{isOAS3:r});return ke(t,a,o,n,i)},Oe=(e,t,r)=>{if(e&&(!e.xml||!e.xml.name)){if(e.xml=e.xml||{},!e.$$ref)return e.type||e.items||e.properties||e.additionalProperties?'\n\x3c!-- XML example cannot be generated; root element name is undefined --\x3e':null;{let t=e.$$ref.match(/\S*\/(\S+)$/);e.xml.name=t[1]}}return(0,Q.memoizedCreateXMLExample)(e,t,r)},je=[{when:/json/,shouldStringifyTypes:["string"]}],Ie=["object"],Ne=(e,t,r,n)=>{const o=(0,Q.memoizedSampleFromSchema)(e,t,n),a=typeof o,i=g()(je).call(je,((e,t)=>t.when.test(r)?[...e,...t.shouldStringifyTypes]:e),Ie);return J()(i,(e=>e===a))?k()(o,null,2):o},Te=(e,t,r,n)=>{const o=Ne(e,t,r,n);let a;try{a=se.ZP.dump(se.ZP.load(o),{lineWidth:-1},{schema:se.A8}),"\n"===a[a.length-1]&&(a=x()(a).call(a,0,a.length-1))}catch(e){return console.error(e),"error: could not generate yaml example"}return a.replace(/\t/g," ")},Pe=function(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:void 0;return e&&ge(e.toJS)&&(e=e.toJS()),n&&ge(n.toJS)&&(n=n.toJS()),/xml/.test(t)?Oe(e,r,n):/(yaml|yml)/.test(t)?Te(e,r,t,n):Ne(e,r,t,n)},Re=()=>{let e={},t=X.Z.location.search;if(!t)return{};if(""!=t){let r=t.substr(1).split("&");for(let t in r)Object.prototype.hasOwnProperty.call(r,t)&&(t=r[t].split("="),e[decodeURIComponent(t[0])]=t[1]&&decodeURIComponent(t[1])||"")}return e},Me=e=>{let t;return t=e instanceof le?e:le.from(e.toString(),"utf-8"),t.toString("base64")},De={operationsSorter:{alpha:(e,t)=>e.get("path").localeCompare(t.get("path")),method:(e,t)=>e.get("method").localeCompare(t.get("method"))},tagsSorter:{alpha:(e,t)=>e.localeCompare(t)}},Le=e=>{let t=[];for(let r in e){let n=e[r];void 0!==n&&""!==n&&t.push([r,"=",encodeURIComponent(n).replace(/%20/g,"+")].join(""))}return t.join("&")},Be=(e,t,r)=>!!W()(r,(r=>G()(e[r],t[r])));function Fe(e){return"string"!=typeof e||""===e?"":(0,L.N)(e)}function ze(e){return!(!e||O()(e).call(e,"localhost")>=0||O()(e).call(e,"127.0.0.1")>=0||"none"===e)}function Ue(e){if(!D().OrderedMap.isOrderedMap(e))return null;if(!e.size)return null;const t=I()(e).call(e,((e,t)=>T()(t).call(t,"2")&&d()(e.get("content")||{}).length>0)),r=e.get("default")||D().OrderedMap(),n=(r.get("content")||D().OrderedMap()).keySeq().toJS().length?r:null;return t||n}const qe=e=>"string"==typeof e||e instanceof String?R()(e).call(e).replace(/\s/g,"%20"):"",Ve=e=>te()(qe(e).replace(/%20/g,"_")),$e=e=>f()(e).call(e,((e,t)=>/^x-/.test(t))),We=e=>f()(e).call(e,((e,t)=>/^pattern|maxLength|minLength|maximum|minimum/.test(t)));function He(e,t){var r;let n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:()=>!0;if("object"!=typeof e||o()(e)||null===e||!t)return e;const a=y()({},e);return c()(r=d()(a)).call(r,(e=>{e===t&&n(a[e],e)?delete a[e]:a[e]=He(a[e],t,n)})),a}function Je(e){if("string"==typeof e)return e;if(e&&e.toJS&&(e=e.toJS()),"object"==typeof e&&null!==e)try{return k()(e,null,2)}catch(t){return String(e)}return null==e?"":e.toString()}function Ke(e){return"number"==typeof e?e.toString():e}function Ge(e){let{returnAll:t=!1,allowHashes:r=!0}=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(!D().Map.isMap(e))throw new Error("paramToIdentifier: received a non-Im.Map parameter as input");const n=e.get("name"),o=e.get("in");let a=[];return e&&e.hashCode&&o&&n&&r&&a.push(`${o}.${n}.hash-${e.hashCode()}`),o&&n&&a.push(`${o}.${n}`),a.push(n),t?a:a[0]||""}function Ze(e,t){var r;const n=Ge(e,{returnAll:!0});return f()(r=i()(n).call(n,(e=>t[e]))).call(r,(e=>void 0!==e))[0]}function Ye(){return Xe(oe()(32).toString("base64"))}function Qe(e){return Xe(ie()("sha256").update(e).digest("base64"))}function Xe(e){return e.replace(/\+/g,"-").replace(/\//g,"_").replace(/=/g,"")}const et=e=>!e||!(!ce(e)||!e.isEmpty())},2518:(e,t,r)=>{"use strict";function n(e){return function(e){try{return!!JSON.parse(e)}catch(e){return null}}(e)?"json":null}r.d(t,{O:()=>n})},27504:(e,t,r)=>{"use strict";r.d(t,{Z:()=>n});const n=function(){var e={location:{},history:{},open:()=>{},close:()=>{},File:function(){}};if("undefined"==typeof window)return e;try{e=window;for(var t of["File","Blob","FormData"])t in window&&(e[t]=window[t])}catch(e){console.error(e)}return e}()},19069:(e,t,r)=>{"use strict";r.d(t,{Z:()=>c});var n=r(14418),o=r.n(n),a=r(58118),i=r.n(a),s=r(43393),l=r.n(s);const u=l().Set.of("type","format","items","default","maximum","exclusiveMaximum","minimum","exclusiveMinimum","maxLength","minLength","pattern","maxItems","minItems","uniqueItems","enum","multipleOf");function c(e){let{isOAS3:t}=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(!l().Map.isMap(e))return{schema:l().Map(),parameterContentMediaType:null};if(!t)return"body"===e.get("in")?{schema:e.get("schema",l().Map()),parameterContentMediaType:null}:{schema:o()(e).call(e,((e,t)=>i()(u).call(u,t))),parameterContentMediaType:null};if(e.get("content")){const t=e.get("content",l().Map({})).keySeq().first();return{schema:e.getIn(["content",t,"schema"],l().Map()),parameterContentMediaType:t}}return{schema:e.get("schema",l().Map()),parameterContentMediaType:null}}},60314:(e,t,r)=>{"use strict";r.d(t,{Z:()=>x});var n=r(58309),o=r.n(n),a=r(2250),i=r.n(a),s=r(25110),l=r.n(s),u=r(8712),c=r.n(u),p=r(51679),f=r.n(p),h=r(12373),d=r.n(h),m=r(18492),g=r.n(m),v=r(88306),y=r.n(v);const b=e=>t=>o()(e)&&o()(t)&&e.length===t.length&&i()(e).call(e,((e,r)=>e===t[r])),w=function(){for(var e=arguments.length,t=new Array(e),r=0;r1&&void 0!==arguments[1]?arguments[1]:w;const{Cache:r}=y();y().Cache=E;const n=y()(e,t);return y().Cache=r,n}},79742:(e,t)=>{"use strict";t.byteLength=function(e){var t=l(e),r=t[0],n=t[1];return 3*(r+n)/4-n},t.toByteArray=function(e){var t,r,a=l(e),i=a[0],s=a[1],u=new o(function(e,t,r){return 3*(t+r)/4-r}(0,i,s)),c=0,p=s>0?i-4:i;for(r=0;r>16&255,u[c++]=t>>8&255,u[c++]=255&t;2===s&&(t=n[e.charCodeAt(r)]<<2|n[e.charCodeAt(r+1)]>>4,u[c++]=255&t);1===s&&(t=n[e.charCodeAt(r)]<<10|n[e.charCodeAt(r+1)]<<4|n[e.charCodeAt(r+2)]>>2,u[c++]=t>>8&255,u[c++]=255&t);return u},t.fromByteArray=function(e){for(var t,n=e.length,o=n%3,a=[],i=16383,s=0,l=n-o;sl?l:s+i));1===o?(t=e[n-1],a.push(r[t>>2]+r[t<<4&63]+"==")):2===o&&(t=(e[n-2]<<8)+e[n-1],a.push(r[t>>10]+r[t>>4&63]+r[t<<2&63]+"="));return a.join("")};for(var r=[],n=[],o="undefined"!=typeof Uint8Array?Uint8Array:Array,a="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",i=0,s=a.length;i0)throw new Error("Invalid string. Length must be a multiple of 4");var r=e.indexOf("=");return-1===r&&(r=t),[r,r===t?0:4-r%4]}function u(e,t,n){for(var o,a,i=[],s=t;s>18&63]+r[a>>12&63]+r[a>>6&63]+r[63&a]);return i.join("")}n["-".charCodeAt(0)]=62,n["_".charCodeAt(0)]=63},48764:(e,t,r)=>{"use strict";const n=r(79742),o=r(80645),a="function"==typeof Symbol&&"function"==typeof Symbol.for?Symbol.for("nodejs.util.inspect.custom"):null;t.Buffer=l,t.SlowBuffer=function(e){+e!=e&&(e=0);return l.alloc(+e)},t.INSPECT_MAX_BYTES=50;const i=2147483647;function s(e){if(e>i)throw new RangeError('The value "'+e+'" is invalid for option "size"');const t=new Uint8Array(e);return Object.setPrototypeOf(t,l.prototype),t}function l(e,t,r){if("number"==typeof e){if("string"==typeof t)throw new TypeError('The "string" argument must be of type string. Received type number');return p(e)}return u(e,t,r)}function u(e,t,r){if("string"==typeof e)return function(e,t){"string"==typeof t&&""!==t||(t="utf8");if(!l.isEncoding(t))throw new TypeError("Unknown encoding: "+t);const r=0|m(e,t);let n=s(r);const o=n.write(e,t);o!==r&&(n=n.slice(0,o));return n}(e,t);if(ArrayBuffer.isView(e))return function(e){if(G(e,Uint8Array)){const t=new Uint8Array(e);return h(t.buffer,t.byteOffset,t.byteLength)}return f(e)}(e);if(null==e)throw new TypeError("The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object. Received type "+typeof e);if(G(e,ArrayBuffer)||e&&G(e.buffer,ArrayBuffer))return h(e,t,r);if("undefined"!=typeof SharedArrayBuffer&&(G(e,SharedArrayBuffer)||e&&G(e.buffer,SharedArrayBuffer)))return h(e,t,r);if("number"==typeof e)throw new TypeError('The "value" argument must not be of type number. Received type number');const n=e.valueOf&&e.valueOf();if(null!=n&&n!==e)return l.from(n,t,r);const o=function(e){if(l.isBuffer(e)){const t=0|d(e.length),r=s(t);return 0===r.length||e.copy(r,0,0,t),r}if(void 0!==e.length)return"number"!=typeof e.length||Z(e.length)?s(0):f(e);if("Buffer"===e.type&&Array.isArray(e.data))return f(e.data)}(e);if(o)return o;if("undefined"!=typeof Symbol&&null!=Symbol.toPrimitive&&"function"==typeof e[Symbol.toPrimitive])return l.from(e[Symbol.toPrimitive]("string"),t,r);throw new TypeError("The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object. Received type "+typeof e)}function c(e){if("number"!=typeof e)throw new TypeError('"size" argument must be of type number');if(e<0)throw new RangeError('The value "'+e+'" is invalid for option "size"')}function p(e){return c(e),s(e<0?0:0|d(e))}function f(e){const t=e.length<0?0:0|d(e.length),r=s(t);for(let n=0;n=i)throw new RangeError("Attempt to allocate Buffer larger than maximum size: 0x"+i.toString(16)+" bytes");return 0|e}function m(e,t){if(l.isBuffer(e))return e.length;if(ArrayBuffer.isView(e)||G(e,ArrayBuffer))return e.byteLength;if("string"!=typeof e)throw new TypeError('The "string" argument must be one of type string, Buffer, or ArrayBuffer. Received type '+typeof e);const r=e.length,n=arguments.length>2&&!0===arguments[2];if(!n&&0===r)return 0;let o=!1;for(;;)switch(t){case"ascii":case"latin1":case"binary":return r;case"utf8":case"utf-8":return H(e).length;case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return 2*r;case"hex":return r>>>1;case"base64":return J(e).length;default:if(o)return n?-1:H(e).length;t=(""+t).toLowerCase(),o=!0}}function g(e,t,r){let n=!1;if((void 0===t||t<0)&&(t=0),t>this.length)return"";if((void 0===r||r>this.length)&&(r=this.length),r<=0)return"";if((r>>>=0)<=(t>>>=0))return"";for(e||(e="utf8");;)switch(e){case"hex":return I(this,t,r);case"utf8":case"utf-8":return k(this,t,r);case"ascii":return O(this,t,r);case"latin1":case"binary":return j(this,t,r);case"base64":return A(this,t,r);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return N(this,t,r);default:if(n)throw new TypeError("Unknown encoding: "+e);e=(e+"").toLowerCase(),n=!0}}function v(e,t,r){const n=e[t];e[t]=e[r],e[r]=n}function y(e,t,r,n,o){if(0===e.length)return-1;if("string"==typeof r?(n=r,r=0):r>2147483647?r=2147483647:r<-2147483648&&(r=-2147483648),Z(r=+r)&&(r=o?0:e.length-1),r<0&&(r=e.length+r),r>=e.length){if(o)return-1;r=e.length-1}else if(r<0){if(!o)return-1;r=0}if("string"==typeof t&&(t=l.from(t,n)),l.isBuffer(t))return 0===t.length?-1:b(e,t,r,n,o);if("number"==typeof t)return t&=255,"function"==typeof Uint8Array.prototype.indexOf?o?Uint8Array.prototype.indexOf.call(e,t,r):Uint8Array.prototype.lastIndexOf.call(e,t,r):b(e,[t],r,n,o);throw new TypeError("val must be string, number or Buffer")}function b(e,t,r,n,o){let a,i=1,s=e.length,l=t.length;if(void 0!==n&&("ucs2"===(n=String(n).toLowerCase())||"ucs-2"===n||"utf16le"===n||"utf-16le"===n)){if(e.length<2||t.length<2)return-1;i=2,s/=2,l/=2,r/=2}function u(e,t){return 1===i?e[t]:e.readUInt16BE(t*i)}if(o){let n=-1;for(a=r;as&&(r=s-l),a=r;a>=0;a--){let r=!0;for(let n=0;no&&(n=o):n=o;const a=t.length;let i;for(n>a/2&&(n=a/2),i=0;i>8,o=r%256,a.push(o),a.push(n);return a}(t,e.length-r),e,r,n)}function A(e,t,r){return 0===t&&r===e.length?n.fromByteArray(e):n.fromByteArray(e.slice(t,r))}function k(e,t,r){r=Math.min(e.length,r);const n=[];let o=t;for(;o239?4:t>223?3:t>191?2:1;if(o+i<=r){let r,n,s,l;switch(i){case 1:t<128&&(a=t);break;case 2:r=e[o+1],128==(192&r)&&(l=(31&t)<<6|63&r,l>127&&(a=l));break;case 3:r=e[o+1],n=e[o+2],128==(192&r)&&128==(192&n)&&(l=(15&t)<<12|(63&r)<<6|63&n,l>2047&&(l<55296||l>57343)&&(a=l));break;case 4:r=e[o+1],n=e[o+2],s=e[o+3],128==(192&r)&&128==(192&n)&&128==(192&s)&&(l=(15&t)<<18|(63&r)<<12|(63&n)<<6|63&s,l>65535&&l<1114112&&(a=l))}}null===a?(a=65533,i=1):a>65535&&(a-=65536,n.push(a>>>10&1023|55296),a=56320|1023&a),n.push(a),o+=i}return function(e){const t=e.length;if(t<=C)return String.fromCharCode.apply(String,e);let r="",n=0;for(;nn.length?(l.isBuffer(t)||(t=l.from(t)),t.copy(n,o)):Uint8Array.prototype.set.call(n,t,o);else{if(!l.isBuffer(t))throw new TypeError('"list" argument must be an Array of Buffers');t.copy(n,o)}o+=t.length}return n},l.byteLength=m,l.prototype._isBuffer=!0,l.prototype.swap16=function(){const e=this.length;if(e%2!=0)throw new RangeError("Buffer size must be a multiple of 16-bits");for(let t=0;tr&&(e+=" ... "),""},a&&(l.prototype[a]=l.prototype.inspect),l.prototype.compare=function(e,t,r,n,o){if(G(e,Uint8Array)&&(e=l.from(e,e.offset,e.byteLength)),!l.isBuffer(e))throw new TypeError('The "target" argument must be one of type Buffer or Uint8Array. Received type '+typeof e);if(void 0===t&&(t=0),void 0===r&&(r=e?e.length:0),void 0===n&&(n=0),void 0===o&&(o=this.length),t<0||r>e.length||n<0||o>this.length)throw new RangeError("out of range index");if(n>=o&&t>=r)return 0;if(n>=o)return-1;if(t>=r)return 1;if(this===e)return 0;let a=(o>>>=0)-(n>>>=0),i=(r>>>=0)-(t>>>=0);const s=Math.min(a,i),u=this.slice(n,o),c=e.slice(t,r);for(let e=0;e>>=0,isFinite(r)?(r>>>=0,void 0===n&&(n="utf8")):(n=r,r=void 0)}const o=this.length-t;if((void 0===r||r>o)&&(r=o),e.length>0&&(r<0||t<0)||t>this.length)throw new RangeError("Attempt to write outside buffer bounds");n||(n="utf8");let a=!1;for(;;)switch(n){case"hex":return w(this,e,t,r);case"utf8":case"utf-8":return E(this,e,t,r);case"ascii":case"latin1":case"binary":return x(this,e,t,r);case"base64":return _(this,e,t,r);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return S(this,e,t,r);default:if(a)throw new TypeError("Unknown encoding: "+n);n=(""+n).toLowerCase(),a=!0}},l.prototype.toJSON=function(){return{type:"Buffer",data:Array.prototype.slice.call(this._arr||this,0)}};const C=4096;function O(e,t,r){let n="";r=Math.min(e.length,r);for(let o=t;on)&&(r=n);let o="";for(let n=t;nr)throw new RangeError("Trying to access beyond buffer length")}function P(e,t,r,n,o,a){if(!l.isBuffer(e))throw new TypeError('"buffer" argument must be a Buffer instance');if(t>o||te.length)throw new RangeError("Index out of range")}function R(e,t,r,n,o){q(t,n,o,e,r,7);let a=Number(t&BigInt(4294967295));e[r++]=a,a>>=8,e[r++]=a,a>>=8,e[r++]=a,a>>=8,e[r++]=a;let i=Number(t>>BigInt(32)&BigInt(4294967295));return e[r++]=i,i>>=8,e[r++]=i,i>>=8,e[r++]=i,i>>=8,e[r++]=i,r}function M(e,t,r,n,o){q(t,n,o,e,r,7);let a=Number(t&BigInt(4294967295));e[r+7]=a,a>>=8,e[r+6]=a,a>>=8,e[r+5]=a,a>>=8,e[r+4]=a;let i=Number(t>>BigInt(32)&BigInt(4294967295));return e[r+3]=i,i>>=8,e[r+2]=i,i>>=8,e[r+1]=i,i>>=8,e[r]=i,r+8}function D(e,t,r,n,o,a){if(r+n>e.length)throw new RangeError("Index out of range");if(r<0)throw new RangeError("Index out of range")}function L(e,t,r,n,a){return t=+t,r>>>=0,a||D(e,0,r,4),o.write(e,t,r,n,23,4),r+4}function B(e,t,r,n,a){return t=+t,r>>>=0,a||D(e,0,r,8),o.write(e,t,r,n,52,8),r+8}l.prototype.slice=function(e,t){const r=this.length;(e=~~e)<0?(e+=r)<0&&(e=0):e>r&&(e=r),(t=void 0===t?r:~~t)<0?(t+=r)<0&&(t=0):t>r&&(t=r),t>>=0,t>>>=0,r||T(e,t,this.length);let n=this[e],o=1,a=0;for(;++a>>=0,t>>>=0,r||T(e,t,this.length);let n=this[e+--t],o=1;for(;t>0&&(o*=256);)n+=this[e+--t]*o;return n},l.prototype.readUint8=l.prototype.readUInt8=function(e,t){return e>>>=0,t||T(e,1,this.length),this[e]},l.prototype.readUint16LE=l.prototype.readUInt16LE=function(e,t){return e>>>=0,t||T(e,2,this.length),this[e]|this[e+1]<<8},l.prototype.readUint16BE=l.prototype.readUInt16BE=function(e,t){return e>>>=0,t||T(e,2,this.length),this[e]<<8|this[e+1]},l.prototype.readUint32LE=l.prototype.readUInt32LE=function(e,t){return e>>>=0,t||T(e,4,this.length),(this[e]|this[e+1]<<8|this[e+2]<<16)+16777216*this[e+3]},l.prototype.readUint32BE=l.prototype.readUInt32BE=function(e,t){return e>>>=0,t||T(e,4,this.length),16777216*this[e]+(this[e+1]<<16|this[e+2]<<8|this[e+3])},l.prototype.readBigUInt64LE=Q((function(e){V(e>>>=0,"offset");const t=this[e],r=this[e+7];void 0!==t&&void 0!==r||$(e,this.length-8);const n=t+256*this[++e]+65536*this[++e]+this[++e]*2**24,o=this[++e]+256*this[++e]+65536*this[++e]+r*2**24;return BigInt(n)+(BigInt(o)<>>=0,"offset");const t=this[e],r=this[e+7];void 0!==t&&void 0!==r||$(e,this.length-8);const n=t*2**24+65536*this[++e]+256*this[++e]+this[++e],o=this[++e]*2**24+65536*this[++e]+256*this[++e]+r;return(BigInt(n)<>>=0,t>>>=0,r||T(e,t,this.length);let n=this[e],o=1,a=0;for(;++a=o&&(n-=Math.pow(2,8*t)),n},l.prototype.readIntBE=function(e,t,r){e>>>=0,t>>>=0,r||T(e,t,this.length);let n=t,o=1,a=this[e+--n];for(;n>0&&(o*=256);)a+=this[e+--n]*o;return o*=128,a>=o&&(a-=Math.pow(2,8*t)),a},l.prototype.readInt8=function(e,t){return e>>>=0,t||T(e,1,this.length),128&this[e]?-1*(255-this[e]+1):this[e]},l.prototype.readInt16LE=function(e,t){e>>>=0,t||T(e,2,this.length);const r=this[e]|this[e+1]<<8;return 32768&r?4294901760|r:r},l.prototype.readInt16BE=function(e,t){e>>>=0,t||T(e,2,this.length);const r=this[e+1]|this[e]<<8;return 32768&r?4294901760|r:r},l.prototype.readInt32LE=function(e,t){return e>>>=0,t||T(e,4,this.length),this[e]|this[e+1]<<8|this[e+2]<<16|this[e+3]<<24},l.prototype.readInt32BE=function(e,t){return e>>>=0,t||T(e,4,this.length),this[e]<<24|this[e+1]<<16|this[e+2]<<8|this[e+3]},l.prototype.readBigInt64LE=Q((function(e){V(e>>>=0,"offset");const t=this[e],r=this[e+7];void 0!==t&&void 0!==r||$(e,this.length-8);const n=this[e+4]+256*this[e+5]+65536*this[e+6]+(r<<24);return(BigInt(n)<>>=0,"offset");const t=this[e],r=this[e+7];void 0!==t&&void 0!==r||$(e,this.length-8);const n=(t<<24)+65536*this[++e]+256*this[++e]+this[++e];return(BigInt(n)<>>=0,t||T(e,4,this.length),o.read(this,e,!0,23,4)},l.prototype.readFloatBE=function(e,t){return e>>>=0,t||T(e,4,this.length),o.read(this,e,!1,23,4)},l.prototype.readDoubleLE=function(e,t){return e>>>=0,t||T(e,8,this.length),o.read(this,e,!0,52,8)},l.prototype.readDoubleBE=function(e,t){return e>>>=0,t||T(e,8,this.length),o.read(this,e,!1,52,8)},l.prototype.writeUintLE=l.prototype.writeUIntLE=function(e,t,r,n){if(e=+e,t>>>=0,r>>>=0,!n){P(this,e,t,r,Math.pow(2,8*r)-1,0)}let o=1,a=0;for(this[t]=255&e;++a>>=0,r>>>=0,!n){P(this,e,t,r,Math.pow(2,8*r)-1,0)}let o=r-1,a=1;for(this[t+o]=255&e;--o>=0&&(a*=256);)this[t+o]=e/a&255;return t+r},l.prototype.writeUint8=l.prototype.writeUInt8=function(e,t,r){return e=+e,t>>>=0,r||P(this,e,t,1,255,0),this[t]=255&e,t+1},l.prototype.writeUint16LE=l.prototype.writeUInt16LE=function(e,t,r){return e=+e,t>>>=0,r||P(this,e,t,2,65535,0),this[t]=255&e,this[t+1]=e>>>8,t+2},l.prototype.writeUint16BE=l.prototype.writeUInt16BE=function(e,t,r){return e=+e,t>>>=0,r||P(this,e,t,2,65535,0),this[t]=e>>>8,this[t+1]=255&e,t+2},l.prototype.writeUint32LE=l.prototype.writeUInt32LE=function(e,t,r){return e=+e,t>>>=0,r||P(this,e,t,4,4294967295,0),this[t+3]=e>>>24,this[t+2]=e>>>16,this[t+1]=e>>>8,this[t]=255&e,t+4},l.prototype.writeUint32BE=l.prototype.writeUInt32BE=function(e,t,r){return e=+e,t>>>=0,r||P(this,e,t,4,4294967295,0),this[t]=e>>>24,this[t+1]=e>>>16,this[t+2]=e>>>8,this[t+3]=255&e,t+4},l.prototype.writeBigUInt64LE=Q((function(e,t=0){return R(this,e,t,BigInt(0),BigInt("0xffffffffffffffff"))})),l.prototype.writeBigUInt64BE=Q((function(e,t=0){return M(this,e,t,BigInt(0),BigInt("0xffffffffffffffff"))})),l.prototype.writeIntLE=function(e,t,r,n){if(e=+e,t>>>=0,!n){const n=Math.pow(2,8*r-1);P(this,e,t,r,n-1,-n)}let o=0,a=1,i=0;for(this[t]=255&e;++o>0)-i&255;return t+r},l.prototype.writeIntBE=function(e,t,r,n){if(e=+e,t>>>=0,!n){const n=Math.pow(2,8*r-1);P(this,e,t,r,n-1,-n)}let o=r-1,a=1,i=0;for(this[t+o]=255&e;--o>=0&&(a*=256);)e<0&&0===i&&0!==this[t+o+1]&&(i=1),this[t+o]=(e/a>>0)-i&255;return t+r},l.prototype.writeInt8=function(e,t,r){return e=+e,t>>>=0,r||P(this,e,t,1,127,-128),e<0&&(e=255+e+1),this[t]=255&e,t+1},l.prototype.writeInt16LE=function(e,t,r){return e=+e,t>>>=0,r||P(this,e,t,2,32767,-32768),this[t]=255&e,this[t+1]=e>>>8,t+2},l.prototype.writeInt16BE=function(e,t,r){return e=+e,t>>>=0,r||P(this,e,t,2,32767,-32768),this[t]=e>>>8,this[t+1]=255&e,t+2},l.prototype.writeInt32LE=function(e,t,r){return e=+e,t>>>=0,r||P(this,e,t,4,2147483647,-2147483648),this[t]=255&e,this[t+1]=e>>>8,this[t+2]=e>>>16,this[t+3]=e>>>24,t+4},l.prototype.writeInt32BE=function(e,t,r){return e=+e,t>>>=0,r||P(this,e,t,4,2147483647,-2147483648),e<0&&(e=4294967295+e+1),this[t]=e>>>24,this[t+1]=e>>>16,this[t+2]=e>>>8,this[t+3]=255&e,t+4},l.prototype.writeBigInt64LE=Q((function(e,t=0){return R(this,e,t,-BigInt("0x8000000000000000"),BigInt("0x7fffffffffffffff"))})),l.prototype.writeBigInt64BE=Q((function(e,t=0){return M(this,e,t,-BigInt("0x8000000000000000"),BigInt("0x7fffffffffffffff"))})),l.prototype.writeFloatLE=function(e,t,r){return L(this,e,t,!0,r)},l.prototype.writeFloatBE=function(e,t,r){return L(this,e,t,!1,r)},l.prototype.writeDoubleLE=function(e,t,r){return B(this,e,t,!0,r)},l.prototype.writeDoubleBE=function(e,t,r){return B(this,e,t,!1,r)},l.prototype.copy=function(e,t,r,n){if(!l.isBuffer(e))throw new TypeError("argument should be a Buffer");if(r||(r=0),n||0===n||(n=this.length),t>=e.length&&(t=e.length),t||(t=0),n>0&&n=this.length)throw new RangeError("Index out of range");if(n<0)throw new RangeError("sourceEnd out of bounds");n>this.length&&(n=this.length),e.length-t>>=0,r=void 0===r?this.length:r>>>0,e||(e=0),"number"==typeof e)for(o=t;o=n+4;r-=3)t=`_${e.slice(r-3,r)}${t}`;return`${e.slice(0,r)}${t}`}function q(e,t,r,n,o,a){if(e>r||e3?0===t||t===BigInt(0)?`>= 0${n} and < 2${n} ** ${8*(a+1)}${n}`:`>= -(2${n} ** ${8*(a+1)-1}${n}) and < 2 ** ${8*(a+1)-1}${n}`:`>= ${t}${n} and <= ${r}${n}`,new F.ERR_OUT_OF_RANGE("value",o,e)}!function(e,t,r){V(t,"offset"),void 0!==e[t]&&void 0!==e[t+r]||$(t,e.length-(r+1))}(n,o,a)}function V(e,t){if("number"!=typeof e)throw new F.ERR_INVALID_ARG_TYPE(t,"number",e)}function $(e,t,r){if(Math.floor(e)!==e)throw V(e,r),new F.ERR_OUT_OF_RANGE(r||"offset","an integer",e);if(t<0)throw new F.ERR_BUFFER_OUT_OF_BOUNDS;throw new F.ERR_OUT_OF_RANGE(r||"offset",`>= ${r?1:0} and <= ${t}`,e)}z("ERR_BUFFER_OUT_OF_BOUNDS",(function(e){return e?`${e} is outside of buffer bounds`:"Attempt to access memory outside buffer bounds"}),RangeError),z("ERR_INVALID_ARG_TYPE",(function(e,t){return`The "${e}" argument must be of type number. Received type ${typeof t}`}),TypeError),z("ERR_OUT_OF_RANGE",(function(e,t,r){let n=`The value of "${e}" is out of range.`,o=r;return Number.isInteger(r)&&Math.abs(r)>2**32?o=U(String(r)):"bigint"==typeof r&&(o=String(r),(r>BigInt(2)**BigInt(32)||r<-(BigInt(2)**BigInt(32)))&&(o=U(o)),o+="n"),n+=` It must be ${t}. Received ${o}`,n}),RangeError);const W=/[^+/0-9A-Za-z-_]/g;function H(e,t){let r;t=t||1/0;const n=e.length;let o=null;const a=[];for(let i=0;i55295&&r<57344){if(!o){if(r>56319){(t-=3)>-1&&a.push(239,191,189);continue}if(i+1===n){(t-=3)>-1&&a.push(239,191,189);continue}o=r;continue}if(r<56320){(t-=3)>-1&&a.push(239,191,189),o=r;continue}r=65536+(o-55296<<10|r-56320)}else o&&(t-=3)>-1&&a.push(239,191,189);if(o=null,r<128){if((t-=1)<0)break;a.push(r)}else if(r<2048){if((t-=2)<0)break;a.push(r>>6|192,63&r|128)}else if(r<65536){if((t-=3)<0)break;a.push(r>>12|224,r>>6&63|128,63&r|128)}else{if(!(r<1114112))throw new Error("Invalid code point");if((t-=4)<0)break;a.push(r>>18|240,r>>12&63|128,r>>6&63|128,63&r|128)}}return a}function J(e){return n.toByteArray(function(e){if((e=(e=e.split("=")[0]).trim().replace(W,"")).length<2)return"";for(;e.length%4!=0;)e+="=";return e}(e))}function K(e,t,r,n){let o;for(o=0;o=t.length||o>=e.length);++o)t[o+r]=e[o];return o}function G(e,t){return e instanceof t||null!=e&&null!=e.constructor&&null!=e.constructor.name&&e.constructor.name===t.name}function Z(e){return e!=e}const Y=function(){const e="0123456789abcdef",t=new Array(256);for(let r=0;r<16;++r){const n=16*r;for(let o=0;o<16;++o)t[n+o]=e[r]+e[o]}return t}();function Q(e){return"undefined"==typeof BigInt?X:e}function X(){throw new Error("BigInt not supported")}},21924:(e,t,r)=>{"use strict";var n=r(40210),o=r(55559),a=o(n("String.prototype.indexOf"));e.exports=function(e,t){var r=n(e,!!t);return"function"==typeof r&&a(e,".prototype.")>-1?o(r):r}},55559:(e,t,r)=>{"use strict";var n=r(58612),o=r(40210),a=o("%Function.prototype.apply%"),i=o("%Function.prototype.call%"),s=o("%Reflect.apply%",!0)||n.call(i,a),l=o("%Object.getOwnPropertyDescriptor%",!0),u=o("%Object.defineProperty%",!0),c=o("%Math.max%");if(u)try{u({},"a",{value:1})}catch(e){u=null}e.exports=function(e){var t=s(n,i,arguments);if(l&&u){var r=l(t,"length");r.configurable&&u(t,"length",{value:1+c(0,e.length-(arguments.length-1))})}return t};var p=function(){return s(n,a,arguments)};u?u(e.exports,"apply",{value:p}):e.exports.apply=p},94184:(e,t)=>{var r;!function(){"use strict";var n={}.hasOwnProperty;function o(){for(var e=[],t=0;t{"use strict";var n=r(11742),o={"text/plain":"Text","text/html":"Url",default:"Text"};e.exports=function(e,t){var r,a,i,s,l,u,c=!1;t||(t={}),r=t.debug||!1;try{if(i=n(),s=document.createRange(),l=document.getSelection(),(u=document.createElement("span")).textContent=e,u.style.all="unset",u.style.position="fixed",u.style.top=0,u.style.clip="rect(0, 0, 0, 0)",u.style.whiteSpace="pre",u.style.webkitUserSelect="text",u.style.MozUserSelect="text",u.style.msUserSelect="text",u.style.userSelect="text",u.addEventListener("copy",(function(n){if(n.stopPropagation(),t.format)if(n.preventDefault(),void 0===n.clipboardData){r&&console.warn("unable to use e.clipboardData"),r&&console.warn("trying IE specific stuff"),window.clipboardData.clearData();var a=o[t.format]||o.default;window.clipboardData.setData(a,e)}else n.clipboardData.clearData(),n.clipboardData.setData(t.format,e);t.onCopy&&(n.preventDefault(),t.onCopy(n.clipboardData))})),document.body.appendChild(u),s.selectNodeContents(u),l.addRange(s),!document.execCommand("copy"))throw new Error("copy command was unsuccessful");c=!0}catch(n){r&&console.error("unable to copy using execCommand: ",n),r&&console.warn("trying IE specific stuff");try{window.clipboardData.setData(t.format||"text",e),t.onCopy&&t.onCopy(window.clipboardData),c=!0}catch(n){r&&console.error("unable to copy using clipboardData: ",n),r&&console.error("falling back to prompt"),a=function(e){var t=(/mac os x/i.test(navigator.userAgent)?"⌘":"Ctrl")+"+C";return e.replace(/#{\s*key\s*}/g,t)}("message"in t?t.message:"Copy to clipboard: #{key}, Enter"),window.prompt(a,e)}}finally{l&&("function"==typeof l.removeRange?l.removeRange(s):l.removeAllRanges()),u&&document.body.removeChild(u),i()}return c}},95299:(e,t,r)=>{var n=r(24848);e.exports=n},83450:(e,t,r)=>{var n=r(83363);e.exports=n},66820:(e,t,r)=>{var n=r(56243);e.exports=n},5023:(e,t,r)=>{var n=r(72369);e.exports=n},90093:(e,t,r)=>{var n=r(28196);e.exports=n},3688:(e,t,r)=>{var n=r(11955);e.exports=n},83838:(e,t,r)=>{var n=r(46279);e.exports=n},15684:(e,t,r)=>{var n=r(19373);e.exports=n},99826:(e,t,r)=>{var n=r(28427);e.exports=n},84234:(e,t,r)=>{var n=r(82073);e.exports=n},65362:(e,t,r)=>{var n=r(63383);e.exports=n},32271:(e,t,r)=>{var n=r(14471);e.exports=n},91254:(e,t,r)=>{var n=r(57396);e.exports=n},43536:(e,t,r)=>{var n=r(41910);e.exports=n},37331:(e,t,r)=>{var n=r(79427);e.exports=n},68522:(e,t,r)=>{var n=r(62857);e.exports=n},73151:(e,t,r)=>{var n=r(9534);e.exports=n},99565:(e,t,r)=>{var n=r(96507);e.exports=n},45012:(e,t,r)=>{var n=r(23059);e.exports=n},78690:(e,t,r)=>{var n=r(16670);e.exports=n},25626:(e,t,r)=>{var n=r(27460);e.exports=n},80281:(e,t,r)=>{var n=r(92547);e.exports=n},40031:(e,t,r)=>{var n=r(46509);e.exports=n},54493:(e,t,r)=>{r(77971),r(53242);var n=r(54058);e.exports=n.Array.from},24034:(e,t,r)=>{r(92737);var n=r(54058);e.exports=n.Array.isArray},15367:(e,t,r)=>{r(85906);var n=r(35703);e.exports=n("Array").concat},12710:(e,t,r)=>{r(66274),r(55967);var n=r(35703);e.exports=n("Array").entries},51459:(e,t,r)=>{r(48851);var n=r(35703);e.exports=n("Array").every},6172:(e,t,r)=>{r(80290);var n=r(35703);e.exports=n("Array").fill},62383:(e,t,r)=>{r(21501);var n=r(35703);e.exports=n("Array").filter},60009:(e,t,r)=>{r(44929);var n=r(35703);e.exports=n("Array").findIndex},17671:(e,t,r)=>{r(80833);var n=r(35703);e.exports=n("Array").find},99324:(e,t,r)=>{r(2437);var n=r(35703);e.exports=n("Array").forEach},80991:(e,t,r)=>{r(97690);var n=r(35703);e.exports=n("Array").includes},8700:(e,t,r)=>{r(99076);var n=r(35703);e.exports=n("Array").indexOf},95909:(e,t,r)=>{r(66274),r(55967);var n=r(35703);e.exports=n("Array").keys},6442:(e,t,r)=>{r(75915);var n=r(35703);e.exports=n("Array").lastIndexOf},23866:(e,t,r)=>{r(68787);var n=r(35703);e.exports=n("Array").map},52999:(e,t,r)=>{r(81876);var n=r(35703);e.exports=n("Array").reduce},91876:(e,t,r)=>{r(11490);var n=r(35703);e.exports=n("Array").reverse},24900:(e,t,r)=>{r(60186);var n=r(35703);e.exports=n("Array").slice},3824:(e,t,r)=>{r(36026);var n=r(35703);e.exports=n("Array").some},2948:(e,t,r)=>{r(4115);var n=r(35703);e.exports=n("Array").sort},78209:(e,t,r)=>{r(98611);var n=r(35703);e.exports=n("Array").splice},14423:(e,t,r)=>{r(66274),r(55967);var n=r(35703);e.exports=n("Array").values},81103:(e,t,r)=>{r(95160);var n=r(54058);e.exports=n.Date.now},27700:(e,t,r)=>{r(73381);var n=r(35703);e.exports=n("Function").bind},13830:(e,t,r)=>{r(66274),r(77971);var n=r(22902);e.exports=n},91031:(e,t,r)=>{r(52595),e.exports=r(21899)},16246:(e,t,r)=>{var n=r(7046),o=r(27700),a=Function.prototype;e.exports=function(e){var t=e.bind;return e===a||n(a,e)&&t===a.bind?o:t}},56043:(e,t,r)=>{var n=r(7046),o=r(15367),a=Array.prototype;e.exports=function(e){var t=e.concat;return e===a||n(a,e)&&t===a.concat?o:t}},13160:(e,t,r)=>{var n=r(7046),o=r(51459),a=Array.prototype;e.exports=function(e){var t=e.every;return e===a||n(a,e)&&t===a.every?o:t}},80446:(e,t,r)=>{var n=r(7046),o=r(6172),a=Array.prototype;e.exports=function(e){var t=e.fill;return e===a||n(a,e)&&t===a.fill?o:t}},2480:(e,t,r)=>{var n=r(7046),o=r(62383),a=Array.prototype;e.exports=function(e){var t=e.filter;return e===a||n(a,e)&&t===a.filter?o:t}},7147:(e,t,r)=>{var n=r(7046),o=r(60009),a=Array.prototype;e.exports=function(e){var t=e.findIndex;return e===a||n(a,e)&&t===a.findIndex?o:t}},32236:(e,t,r)=>{var n=r(7046),o=r(17671),a=Array.prototype;e.exports=function(e){var t=e.find;return e===a||n(a,e)&&t===a.find?o:t}},58557:(e,t,r)=>{var n=r(7046),o=r(80991),a=r(21631),i=Array.prototype,s=String.prototype;e.exports=function(e){var t=e.includes;return e===i||n(i,e)&&t===i.includes?o:"string"==typeof e||e===s||n(s,e)&&t===s.includes?a:t}},34570:(e,t,r)=>{var n=r(7046),o=r(8700),a=Array.prototype;e.exports=function(e){var t=e.indexOf;return e===a||n(a,e)&&t===a.indexOf?o:t}},57564:(e,t,r)=>{var n=r(7046),o=r(6442),a=Array.prototype;e.exports=function(e){var t=e.lastIndexOf;return e===a||n(a,e)&&t===a.lastIndexOf?o:t}},88287:(e,t,r)=>{var n=r(7046),o=r(23866),a=Array.prototype;e.exports=function(e){var t=e.map;return e===a||n(a,e)&&t===a.map?o:t}},68025:(e,t,r)=>{var n=r(7046),o=r(52999),a=Array.prototype;e.exports=function(e){var t=e.reduce;return e===a||n(a,e)&&t===a.reduce?o:t}},59257:(e,t,r)=>{var n=r(7046),o=r(80454),a=String.prototype;e.exports=function(e){var t=e.repeat;return"string"==typeof e||e===a||n(a,e)&&t===a.repeat?o:t}},91060:(e,t,r)=>{var n=r(7046),o=r(91876),a=Array.prototype;e.exports=function(e){var t=e.reverse;return e===a||n(a,e)&&t===a.reverse?o:t}},69601:(e,t,r)=>{var n=r(7046),o=r(24900),a=Array.prototype;e.exports=function(e){var t=e.slice;return e===a||n(a,e)&&t===a.slice?o:t}},28299:(e,t,r)=>{var n=r(7046),o=r(3824),a=Array.prototype;e.exports=function(e){var t=e.some;return e===a||n(a,e)&&t===a.some?o:t}},69355:(e,t,r)=>{var n=r(7046),o=r(2948),a=Array.prototype;e.exports=function(e){var t=e.sort;return e===a||n(a,e)&&t===a.sort?o:t}},18339:(e,t,r)=>{var n=r(7046),o=r(78209),a=Array.prototype;e.exports=function(e){var t=e.splice;return e===a||n(a,e)&&t===a.splice?o:t}},71611:(e,t,r)=>{var n=r(7046),o=r(3269),a=String.prototype;e.exports=function(e){var t=e.startsWith;return"string"==typeof e||e===a||n(a,e)&&t===a.startsWith?o:t}},62774:(e,t,r)=>{var n=r(7046),o=r(13348),a=String.prototype;e.exports=function(e){var t=e.trim;return"string"==typeof e||e===a||n(a,e)&&t===a.trim?o:t}},84426:(e,t,r)=>{r(32619);var n=r(54058),o=r(79730);n.JSON||(n.JSON={stringify:JSON.stringify}),e.exports=function(e,t,r){return o(n.JSON.stringify,null,arguments)}},91018:(e,t,r)=>{r(66274),r(37501),r(55967),r(77971);var n=r(54058);e.exports=n.Map},45999:(e,t,r)=>{r(49221);var n=r(54058);e.exports=n.Object.assign},35254:(e,t,r)=>{r(53882);var n=r(54058).Object;e.exports=function(e,t){return n.create(e,t)}},7702:(e,t,r)=>{r(74979);var n=r(54058).Object,o=e.exports=function(e,t){return n.defineProperties(e,t)};n.defineProperties.sham&&(o.sham=!0)},48171:(e,t,r)=>{r(86450);var n=r(54058).Object,o=e.exports=function(e,t,r){return n.defineProperty(e,t,r)};n.defineProperty.sham&&(o.sham=!0)},73081:(e,t,r)=>{r(94366);var n=r(54058);e.exports=n.Object.entries},286:(e,t,r)=>{r(46924);var n=r(54058).Object,o=e.exports=function(e,t){return n.getOwnPropertyDescriptor(e,t)};n.getOwnPropertyDescriptor.sham&&(o.sham=!0)},92766:(e,t,r)=>{r(88482);var n=r(54058);e.exports=n.Object.getOwnPropertyDescriptors},30498:(e,t,r)=>{r(35824);var n=r(54058);e.exports=n.Object.getOwnPropertySymbols},13966:(e,t,r)=>{r(17405);var n=r(54058);e.exports=n.Object.getPrototypeOf},48494:(e,t,r)=>{r(21724);var n=r(54058);e.exports=n.Object.keys},3065:(e,t,r)=>{r(90108);var n=r(54058);e.exports=n.Object.setPrototypeOf},98430:(e,t,r)=>{r(26614);var n=r(54058);e.exports=n.Object.values},52956:(e,t,r)=>{r(47627),r(66274),r(55967),r(98881),r(4560),r(91302),r(44349),r(77971);var n=r(54058);e.exports=n.Promise},21631:(e,t,r)=>{r(11035);var n=r(35703);e.exports=n("String").includes},80454:(e,t,r)=>{r(60986);var n=r(35703);e.exports=n("String").repeat},3269:(e,t,r)=>{r(94761);var n=r(35703);e.exports=n("String").startsWith},13348:(e,t,r)=>{r(57398);var n=r(35703);e.exports=n("String").trim},57473:(e,t,r)=>{r(85906),r(55967),r(35824),r(8555),r(52615),r(21732),r(35903),r(1825),r(28394),r(45915),r(61766),r(62737),r(89911),r(74315),r(63131),r(64714),r(70659),r(69120),r(79413),r(1502);var n=r(54058);e.exports=n.Symbol},24227:(e,t,r)=>{r(66274),r(55967),r(77971),r(1825);var n=r(11477);e.exports=n.f("iterator")},32304:(e,t,r)=>{r(66274),r(55967),r(54334);var n=r(54058);e.exports=n.WeakMap},27385:(e,t,r)=>{var n=r(95299);e.exports=n},81522:(e,t,r)=>{var n=r(83450);e.exports=n},32209:(e,t,r)=>{var n=r(66820);e.exports=n},30888:(e,t,r)=>{r(9668);var n=r(5023);e.exports=n},14122:(e,t,r)=>{var n=r(90093);e.exports=n},44442:(e,t,r)=>{var n=r(3688);e.exports=n},57152:(e,t,r)=>{var n=r(83838);e.exports=n},69447:(e,t,r)=>{var n=r(15684);e.exports=n},17579:(e,t,r)=>{var n=r(99826);e.exports=n},81493:(e,t,r)=>{var n=r(84234);e.exports=n},60269:(e,t,r)=>{var n=r(65362);e.exports=n},76094:(e,t,r)=>{var n=r(32271);e.exports=n},70573:(e,t,r)=>{var n=r(91254);e.exports=n},73685:(e,t,r)=>{var n=r(43536);e.exports=n},27533:(e,t,r)=>{var n=r(37331);e.exports=n},39057:(e,t,r)=>{var n=r(68522);e.exports=n},84710:(e,t,r)=>{var n=r(73151);e.exports=n},74303:(e,t,r)=>{var n=r(99565);e.exports=n},93799:(e,t,r)=>{var n=r(45012);e.exports=n},55122:(e,t,r)=>{var n=r(78690);e.exports=n},29531:(e,t,r)=>{var n=r(25626);r(89731),r(55708),r(30014),r(88731),e.exports=n},86600:(e,t,r)=>{var n=r(80281);r(28783),r(43975),r(65799),r(45414),r(46774),r(80620),r(36172),e.exports=n},9759:(e,t,r)=>{var n=r(40031);e.exports=n},24883:(e,t,r)=>{var n=r(21899),o=r(57475),a=r(69826),i=n.TypeError;e.exports=function(e){if(o(e))return e;throw i(a(e)+" is not a function")}},174:(e,t,r)=>{var n=r(21899),o=r(24284),a=r(69826),i=n.TypeError;e.exports=function(e){if(o(e))return e;throw i(a(e)+" is not a constructor")}},11851:(e,t,r)=>{var n=r(21899),o=r(57475),a=n.String,i=n.TypeError;e.exports=function(e){if("object"==typeof e||o(e))return e;throw i("Can't set "+a(e)+" as a prototype")}},18479:e=>{e.exports=function(){}},5743:(e,t,r)=>{var n=r(21899),o=r(7046),a=n.TypeError;e.exports=function(e,t){if(o(t,e))return e;throw a("Incorrect invocation")}},96059:(e,t,r)=>{var n=r(21899),o=r(10941),a=n.String,i=n.TypeError;e.exports=function(e){if(o(e))return e;throw i(a(e)+" is not an object")}},97135:(e,t,r)=>{var n=r(95981);e.exports=n((function(){if("function"==typeof ArrayBuffer){var e=new ArrayBuffer(8);Object.isExtensible(e)&&Object.defineProperty(e,"a",{value:8})}}))},91860:(e,t,r)=>{"use strict";var n=r(89678),o=r(59413),a=r(10623);e.exports=function(e){for(var t=n(this),r=a(t),i=arguments.length,s=o(i>1?arguments[1]:void 0,r),l=i>2?arguments[2]:void 0,u=void 0===l?r:o(l,r);u>s;)t[s++]=e;return t}},56837:(e,t,r)=>{"use strict";var n=r(3610).forEach,o=r(34194)("forEach");e.exports=o?[].forEach:function(e){return n(this,e,arguments.length>1?arguments[1]:void 0)}},11354:(e,t,r)=>{"use strict";var n=r(21899),o=r(86843),a=r(78834),i=r(89678),s=r(75196),l=r(6782),u=r(24284),c=r(10623),p=r(55449),f=r(53476),h=r(22902),d=n.Array;e.exports=function(e){var t=i(e),r=u(this),n=arguments.length,m=n>1?arguments[1]:void 0,g=void 0!==m;g&&(m=o(m,n>2?arguments[2]:void 0));var v,y,b,w,E,x,_=h(t),S=0;if(!_||this==d&&l(_))for(v=c(t),y=r?new this(v):d(v);v>S;S++)x=g?m(t[S],S):t[S],p(y,S,x);else for(E=(w=f(t,_)).next,y=r?new this:[];!(b=a(E,w)).done;S++)x=g?s(w,m,[b.value,S],!0):b.value,p(y,S,x);return y.length=S,y}},31692:(e,t,r)=>{var n=r(74529),o=r(59413),a=r(10623),i=function(e){return function(t,r,i){var s,l=n(t),u=a(l),c=o(i,u);if(e&&r!=r){for(;u>c;)if((s=l[c++])!=s)return!0}else for(;u>c;c++)if((e||c in l)&&l[c]===r)return e||c||0;return!e&&-1}};e.exports={includes:i(!0),indexOf:i(!1)}},3610:(e,t,r)=>{var n=r(86843),o=r(95329),a=r(37026),i=r(89678),s=r(10623),l=r(64692),u=o([].push),c=function(e){var t=1==e,r=2==e,o=3==e,c=4==e,p=6==e,f=7==e,h=5==e||p;return function(d,m,g,v){for(var y,b,w=i(d),E=a(w),x=n(m,g),_=s(E),S=0,A=v||l,k=t?A(d,_):r||f?A(d,0):void 0;_>S;S++)if((h||S in E)&&(b=x(y=E[S],S,w),e))if(t)k[S]=b;else if(b)switch(e){case 3:return!0;case 5:return y;case 6:return S;case 2:u(k,y)}else switch(e){case 4:return!1;case 7:u(k,y)}return p?-1:o||c?c:k}};e.exports={forEach:c(0),map:c(1),filter:c(2),some:c(3),every:c(4),find:c(5),findIndex:c(6),filterReject:c(7)}},67145:(e,t,r)=>{"use strict";var n=r(79730),o=r(74529),a=r(62435),i=r(10623),s=r(34194),l=Math.min,u=[].lastIndexOf,c=!!u&&1/[1].lastIndexOf(1,-0)<0,p=s("lastIndexOf"),f=c||!p;e.exports=f?function(e){if(c)return n(u,this,arguments)||0;var t=o(this),r=i(t),s=r-1;for(arguments.length>1&&(s=l(s,a(arguments[1]))),s<0&&(s=r+s);s>=0;s--)if(s in t&&t[s]===e)return s||0;return-1}:u},50568:(e,t,r)=>{var n=r(95981),o=r(99813),a=r(53385),i=o("species");e.exports=function(e){return a>=51||!n((function(){var t=[];return(t.constructor={})[i]=function(){return{foo:1}},1!==t[e](Boolean).foo}))}},34194:(e,t,r)=>{"use strict";var n=r(95981);e.exports=function(e,t){var r=[][e];return!!r&&n((function(){r.call(null,t||function(){throw 1},1)}))}},46499:(e,t,r)=>{var n=r(21899),o=r(24883),a=r(89678),i=r(37026),s=r(10623),l=n.TypeError,u=function(e){return function(t,r,n,u){o(r);var c=a(t),p=i(c),f=s(c),h=e?f-1:0,d=e?-1:1;if(n<2)for(;;){if(h in p){u=p[h],h+=d;break}if(h+=d,e?h<0:f<=h)throw l("Reduce of empty array with no initial value")}for(;e?h>=0:f>h;h+=d)h in p&&(u=r(u,p[h],h,c));return u}};e.exports={left:u(!1),right:u(!0)}},15790:(e,t,r)=>{var n=r(21899),o=r(59413),a=r(10623),i=r(55449),s=n.Array,l=Math.max;e.exports=function(e,t,r){for(var n=a(e),u=o(t,n),c=o(void 0===r?n:r,n),p=s(l(c-u,0)),f=0;u{var n=r(95329);e.exports=n([].slice)},61388:(e,t,r)=>{var n=r(15790),o=Math.floor,a=function(e,t){var r=e.length,l=o(r/2);return r<8?i(e,t):s(e,a(n(e,0,l),t),a(n(e,l),t),t)},i=function(e,t){for(var r,n,o=e.length,a=1;a0;)e[n]=e[--n];n!==a++&&(e[n]=r)}return e},s=function(e,t,r,n){for(var o=t.length,a=r.length,i=0,s=0;i{var n=r(21899),o=r(1052),a=r(24284),i=r(10941),s=r(99813)("species"),l=n.Array;e.exports=function(e){var t;return o(e)&&(t=e.constructor,(a(t)&&(t===l||o(t.prototype))||i(t)&&null===(t=t[s]))&&(t=void 0)),void 0===t?l:t}},64692:(e,t,r)=>{var n=r(5693);e.exports=function(e,t){return new(n(e))(0===t?0:t)}},75196:(e,t,r)=>{var n=r(96059),o=r(7609);e.exports=function(e,t,r,a){try{return a?t(n(r)[0],r[1]):t(r)}catch(t){o(e,"throw",t)}}},21385:(e,t,r)=>{var n=r(99813)("iterator"),o=!1;try{var a=0,i={next:function(){return{done:!!a++}},return:function(){o=!0}};i[n]=function(){return this},Array.from(i,(function(){throw 2}))}catch(e){}e.exports=function(e,t){if(!t&&!o)return!1;var r=!1;try{var a={};a[n]=function(){return{next:function(){return{done:r=!0}}}},e(a)}catch(e){}return r}},82532:(e,t,r)=>{var n=r(95329),o=n({}.toString),a=n("".slice);e.exports=function(e){return a(o(e),8,-1)}},9697:(e,t,r)=>{var n=r(21899),o=r(22885),a=r(57475),i=r(82532),s=r(99813)("toStringTag"),l=n.Object,u="Arguments"==i(function(){return arguments}());e.exports=o?i:function(e){var t,r,n;return void 0===e?"Undefined":null===e?"Null":"string"==typeof(r=function(e,t){try{return e[t]}catch(e){}}(t=l(e),s))?r:u?i(t):"Object"==(n=i(t))&&a(t.callee)?"Arguments":n}},38694:(e,t,r)=>{var n=r(95329)("".replace),o=String(Error("zxcasd").stack),a=/\n\s*at [^:]*:[^\n]*/,i=a.test(o);e.exports=function(e,t){if(i&&"string"==typeof e)for(;t--;)e=n(e,a,"");return e}},85616:(e,t,r)=>{"use strict";var n=r(65988).f,o=r(29290),a=r(87524),i=r(86843),s=r(5743),l=r(93091),u=r(47771),c=r(94431),p=r(55746),f=r(21647).fastKey,h=r(45402),d=h.set,m=h.getterFor;e.exports={getConstructor:function(e,t,r,u){var c=e((function(e,n){s(e,h),d(e,{type:t,index:o(null),first:void 0,last:void 0,size:0}),p||(e.size=0),null!=n&&l(n,e[u],{that:e,AS_ENTRIES:r})})),h=c.prototype,g=m(t),v=function(e,t,r){var n,o,a=g(e),i=y(e,t);return i?i.value=r:(a.last=i={index:o=f(t,!0),key:t,value:r,previous:n=a.last,next:void 0,removed:!1},a.first||(a.first=i),n&&(n.next=i),p?a.size++:e.size++,"F"!==o&&(a.index[o]=i)),e},y=function(e,t){var r,n=g(e),o=f(t);if("F"!==o)return n.index[o];for(r=n.first;r;r=r.next)if(r.key==t)return r};return a(h,{clear:function(){for(var e=g(this),t=e.index,r=e.first;r;)r.removed=!0,r.previous&&(r.previous=r.previous.next=void 0),delete t[r.index],r=r.next;e.first=e.last=void 0,p?e.size=0:this.size=0},delete:function(e){var t=this,r=g(t),n=y(t,e);if(n){var o=n.next,a=n.previous;delete r.index[n.index],n.removed=!0,a&&(a.next=o),o&&(o.previous=a),r.first==n&&(r.first=o),r.last==n&&(r.last=a),p?r.size--:t.size--}return!!n},forEach:function(e){for(var t,r=g(this),n=i(e,arguments.length>1?arguments[1]:void 0);t=t?t.next:r.first;)for(n(t.value,t.key,this);t&&t.removed;)t=t.previous},has:function(e){return!!y(this,e)}}),a(h,r?{get:function(e){var t=y(this,e);return t&&t.value},set:function(e,t){return v(this,0===e?0:e,t)}}:{add:function(e){return v(this,e=0===e?0:e,e)}}),p&&n(h,"size",{get:function(){return g(this).size}}),c},setStrong:function(e,t,r){var n=t+" Iterator",o=m(t),a=m(n);u(e,t,(function(e,t){d(this,{type:n,target:e,state:o(e),kind:t,last:void 0})}),(function(){for(var e=a(this),t=e.kind,r=e.last;r&&r.removed;)r=r.previous;return e.target&&(e.last=r=r?r.next:e.state.first)?"keys"==t?{value:r.key,done:!1}:"values"==t?{value:r.value,done:!1}:{value:[r.key,r.value],done:!1}:(e.target=void 0,{value:void 0,done:!0})}),r?"entries":"values",!r,!0),c(t)}}},8850:(e,t,r)=>{"use strict";var n=r(95329),o=r(87524),a=r(21647).getWeakData,i=r(96059),s=r(10941),l=r(5743),u=r(93091),c=r(3610),p=r(90953),f=r(45402),h=f.set,d=f.getterFor,m=c.find,g=c.findIndex,v=n([].splice),y=0,b=function(e){return e.frozen||(e.frozen=new w)},w=function(){this.entries=[]},E=function(e,t){return m(e.entries,(function(e){return e[0]===t}))};w.prototype={get:function(e){var t=E(this,e);if(t)return t[1]},has:function(e){return!!E(this,e)},set:function(e,t){var r=E(this,e);r?r[1]=t:this.entries.push([e,t])},delete:function(e){var t=g(this.entries,(function(t){return t[0]===e}));return~t&&v(this.entries,t,1),!!~t}},e.exports={getConstructor:function(e,t,r,n){var c=e((function(e,o){l(e,f),h(e,{type:t,id:y++,frozen:void 0}),null!=o&&u(o,e[n],{that:e,AS_ENTRIES:r})})),f=c.prototype,m=d(t),g=function(e,t,r){var n=m(e),o=a(i(t),!0);return!0===o?b(n).set(t,r):o[n.id]=r,e};return o(f,{delete:function(e){var t=m(this);if(!s(e))return!1;var r=a(e);return!0===r?b(t).delete(e):r&&p(r,t.id)&&delete r[t.id]},has:function(e){var t=m(this);if(!s(e))return!1;var r=a(e);return!0===r?b(t).has(e):r&&p(r,t.id)}}),o(f,r?{get:function(e){var t=m(this);if(s(e)){var r=a(e);return!0===r?b(t).get(e):r?r[t.id]:void 0}},set:function(e,t){return g(this,e,t)}}:{add:function(e){return g(this,e,!0)}}),c}}},24683:(e,t,r)=>{"use strict";var n=r(76887),o=r(21899),a=r(21647),i=r(95981),s=r(32029),l=r(93091),u=r(5743),c=r(57475),p=r(10941),f=r(90904),h=r(65988).f,d=r(3610).forEach,m=r(55746),g=r(45402),v=g.set,y=g.getterFor;e.exports=function(e,t,r){var g,b=-1!==e.indexOf("Map"),w=-1!==e.indexOf("Weak"),E=b?"set":"add",x=o[e],_=x&&x.prototype,S={};if(m&&c(x)&&(w||_.forEach&&!i((function(){(new x).entries().next()})))){var A=(g=t((function(t,r){v(u(t,A),{type:e,collection:new x}),null!=r&&l(r,t[E],{that:t,AS_ENTRIES:b})}))).prototype,k=y(e);d(["add","clear","delete","forEach","get","has","set","keys","values","entries"],(function(e){var t="add"==e||"set"==e;!(e in _)||w&&"clear"==e||s(A,e,(function(r,n){var o=k(this).collection;if(!t&&w&&!p(r))return"get"==e&&void 0;var a=o[e](0===r?0:r,n);return t?this:a}))})),w||h(A,"size",{configurable:!0,get:function(){return k(this).collection.size}})}else g=r.getConstructor(t,e,b,E),a.enable();return f(g,e,!1,!0),S[e]=g,n({global:!0,forced:!0},S),w||r.setStrong(g,e,b),g}},23489:(e,t,r)=>{var n=r(90953),o=r(31136),a=r(49677),i=r(65988);e.exports=function(e,t,r){for(var s=o(t),l=i.f,u=a.f,c=0;c{var n=r(99813)("match");e.exports=function(e){var t=/./;try{"/./"[e](t)}catch(r){try{return t[n]=!1,"/./"[e](t)}catch(e){}}return!1}},64160:(e,t,r)=>{var n=r(95981);e.exports=!n((function(){function e(){}return e.prototype.constructor=null,Object.getPrototypeOf(new e)!==e.prototype}))},31046:(e,t,r)=>{"use strict";var n=r(35143).IteratorPrototype,o=r(29290),a=r(31887),i=r(90904),s=r(12077),l=function(){return this};e.exports=function(e,t,r,u){var c=t+" Iterator";return e.prototype=o(n,{next:a(+!u,r)}),i(e,c,!1,!0),s[c]=l,e}},32029:(e,t,r)=>{var n=r(55746),o=r(65988),a=r(31887);e.exports=n?function(e,t,r){return o.f(e,t,a(1,r))}:function(e,t,r){return e[t]=r,e}},31887:e=>{e.exports=function(e,t){return{enumerable:!(1&e),configurable:!(2&e),writable:!(4&e),value:t}}},55449:(e,t,r)=>{"use strict";var n=r(83894),o=r(65988),a=r(31887);e.exports=function(e,t,r){var i=n(t);i in e?o.f(e,i,a(0,r)):e[i]=r}},47771:(e,t,r)=>{"use strict";var n=r(76887),o=r(78834),a=r(82529),i=r(79417),s=r(57475),l=r(31046),u=r(249),c=r(88929),p=r(90904),f=r(32029),h=r(99754),d=r(99813),m=r(12077),g=r(35143),v=i.PROPER,y=i.CONFIGURABLE,b=g.IteratorPrototype,w=g.BUGGY_SAFARI_ITERATORS,E=d("iterator"),x="keys",_="values",S="entries",A=function(){return this};e.exports=function(e,t,r,i,d,g,k){l(r,t,i);var C,O,j,I=function(e){if(e===d&&M)return M;if(!w&&e in P)return P[e];switch(e){case x:case _:case S:return function(){return new r(this,e)}}return function(){return new r(this)}},N=t+" Iterator",T=!1,P=e.prototype,R=P[E]||P["@@iterator"]||d&&P[d],M=!w&&R||I(d),D="Array"==t&&P.entries||R;if(D&&(C=u(D.call(new e)))!==Object.prototype&&C.next&&(a||u(C)===b||(c?c(C,b):s(C[E])||h(C,E,A)),p(C,N,!0,!0),a&&(m[N]=A)),v&&d==_&&R&&R.name!==_&&(!a&&y?f(P,"name",_):(T=!0,M=function(){return o(R,this)})),d)if(O={values:I(_),keys:g?M:I(x),entries:I(S)},k)for(j in O)(w||T||!(j in P))&&h(P,j,O[j]);else n({target:t,proto:!0,forced:w||T},O);return a&&!k||P[E]===M||h(P,E,M,{name:d}),m[t]=M,O}},66349:(e,t,r)=>{var n=r(54058),o=r(90953),a=r(11477),i=r(65988).f;e.exports=function(e){var t=n.Symbol||(n.Symbol={});o(t,e)||i(t,e,{value:a.f(e)})}},55746:(e,t,r)=>{var n=r(95981);e.exports=!n((function(){return 7!=Object.defineProperty({},1,{get:function(){return 7}})[1]}))},61333:(e,t,r)=>{var n=r(21899),o=r(10941),a=n.document,i=o(a)&&o(a.createElement);e.exports=function(e){return i?a.createElement(e):{}}},63281:e=>{e.exports={CSSRuleList:0,CSSStyleDeclaration:0,CSSValueList:0,ClientRectList:0,DOMRectList:0,DOMStringList:0,DOMTokenList:1,DataTransferItemList:0,FileList:0,HTMLAllCollection:0,HTMLCollection:0,HTMLFormElement:0,HTMLSelectElement:0,MediaList:0,MimeTypeArray:0,NamedNodeMap:0,NodeList:1,PaintRequestList:0,Plugin:0,PluginArray:0,SVGLengthList:0,SVGNumberList:0,SVGPathSegList:0,SVGPointList:0,SVGStringList:0,SVGTransformList:0,SourceBufferList:0,StyleSheetList:0,TextTrackCueList:0,TextTrackList:0,TouchList:0}},34342:(e,t,r)=>{var n=r(2861).match(/firefox\/(\d+)/i);e.exports=!!n&&+n[1]},23321:e=>{e.exports="object"==typeof window},81046:(e,t,r)=>{var n=r(2861);e.exports=/MSIE|Trident/.test(n)},4470:(e,t,r)=>{var n=r(2861),o=r(21899);e.exports=/ipad|iphone|ipod/i.test(n)&&void 0!==o.Pebble},22749:(e,t,r)=>{var n=r(2861);e.exports=/(?:ipad|iphone|ipod).*applewebkit/i.test(n)},6049:(e,t,r)=>{var n=r(82532),o=r(21899);e.exports="process"==n(o.process)},58045:(e,t,r)=>{var n=r(2861);e.exports=/web0s(?!.*chrome)/i.test(n)},2861:(e,t,r)=>{var n=r(626);e.exports=n("navigator","userAgent")||""},53385:(e,t,r)=>{var n,o,a=r(21899),i=r(2861),s=a.process,l=a.Deno,u=s&&s.versions||l&&l.version,c=u&&u.v8;c&&(o=(n=c.split("."))[0]>0&&n[0]<4?1:+(n[0]+n[1])),!o&&i&&(!(n=i.match(/Edge\/(\d+)/))||n[1]>=74)&&(n=i.match(/Chrome\/(\d+)/))&&(o=+n[1]),e.exports=o},18938:(e,t,r)=>{var n=r(2861).match(/AppleWebKit\/(\d+)\./);e.exports=!!n&&+n[1]},35703:(e,t,r)=>{var n=r(54058);e.exports=function(e){return n[e+"Prototype"]}},56759:e=>{e.exports=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"]},18780:(e,t,r)=>{var n=r(95981),o=r(31887);e.exports=!n((function(){var e=Error("a");return!("stack"in e)||(Object.defineProperty(e,"stack",o(1,7)),7!==e.stack)}))},76887:(e,t,r)=>{"use strict";var n=r(21899),o=r(79730),a=r(95329),i=r(57475),s=r(49677).f,l=r(37252),u=r(54058),c=r(86843),p=r(32029),f=r(90953),h=function(e){var t=function(r,n,a){if(this instanceof t){switch(arguments.length){case 0:return new e;case 1:return new e(r);case 2:return new e(r,n)}return new e(r,n,a)}return o(e,this,arguments)};return t.prototype=e.prototype,t};e.exports=function(e,t){var r,o,d,m,g,v,y,b,w=e.target,E=e.global,x=e.stat,_=e.proto,S=E?n:x?n[w]:(n[w]||{}).prototype,A=E?u:u[w]||p(u,w,{})[w],k=A.prototype;for(d in t)r=!l(E?d:w+(x?".":"#")+d,e.forced)&&S&&f(S,d),g=A[d],r&&(v=e.noTargetGet?(b=s(S,d))&&b.value:S[d]),m=r&&v?v:t[d],r&&typeof g==typeof m||(y=e.bind&&r?c(m,n):e.wrap&&r?h(m):_&&i(m)?a(m):m,(e.sham||m&&m.sham||g&&g.sham)&&p(y,"sham",!0),p(A,d,y),_&&(f(u,o=w+"Prototype")||p(u,o,{}),p(u[o],d,m),e.real&&k&&!k[d]&&p(k,d,m)))}},95981:e=>{e.exports=function(e){try{return!!e()}catch(e){return!0}}},45602:(e,t,r)=>{var n=r(95981);e.exports=!n((function(){return Object.isExtensible(Object.preventExtensions({}))}))},79730:(e,t,r)=>{var n=r(18285),o=Function.prototype,a=o.apply,i=o.call;e.exports="object"==typeof Reflect&&Reflect.apply||(n?i.bind(a):function(){return i.apply(a,arguments)})},86843:(e,t,r)=>{var n=r(95329),o=r(24883),a=r(18285),i=n(n.bind);e.exports=function(e,t){return o(e),void 0===t?e:a?i(e,t):function(){return e.apply(t,arguments)}}},18285:(e,t,r)=>{var n=r(95981);e.exports=!n((function(){var e=function(){}.bind();return"function"!=typeof e||e.hasOwnProperty("prototype")}))},98308:(e,t,r)=>{"use strict";var n=r(21899),o=r(95329),a=r(24883),i=r(10941),s=r(90953),l=r(93765),u=r(18285),c=n.Function,p=o([].concat),f=o([].join),h={},d=function(e,t,r){if(!s(h,t)){for(var n=[],o=0;o{var n=r(18285),o=Function.prototype.call;e.exports=n?o.bind(o):function(){return o.apply(o,arguments)}},79417:(e,t,r)=>{var n=r(55746),o=r(90953),a=Function.prototype,i=n&&Object.getOwnPropertyDescriptor,s=o(a,"name"),l=s&&"something"===function(){}.name,u=s&&(!n||n&&i(a,"name").configurable);e.exports={EXISTS:s,PROPER:l,CONFIGURABLE:u}},95329:(e,t,r)=>{var n=r(18285),o=Function.prototype,a=o.bind,i=o.call,s=n&&a.bind(i,i);e.exports=n?function(e){return e&&s(e)}:function(e){return e&&function(){return i.apply(e,arguments)}}},626:(e,t,r)=>{var n=r(54058),o=r(21899),a=r(57475),i=function(e){return a(e)?e:void 0};e.exports=function(e,t){return arguments.length<2?i(n[e])||i(o[e]):n[e]&&n[e][t]||o[e]&&o[e][t]}},22902:(e,t,r)=>{var n=r(9697),o=r(14229),a=r(12077),i=r(99813)("iterator");e.exports=function(e){if(null!=e)return o(e,i)||o(e,"@@iterator")||a[n(e)]}},53476:(e,t,r)=>{var n=r(21899),o=r(78834),a=r(24883),i=r(96059),s=r(69826),l=r(22902),u=n.TypeError;e.exports=function(e,t){var r=arguments.length<2?l(e):t;if(a(r))return i(o(r,e));throw u(s(e)+" is not iterable")}},14229:(e,t,r)=>{var n=r(24883);e.exports=function(e,t){var r=e[t];return null==r?void 0:n(r)}},21899:(e,t,r)=>{var n=function(e){return e&&e.Math==Math&&e};e.exports=n("object"==typeof globalThis&&globalThis)||n("object"==typeof window&&window)||n("object"==typeof self&&self)||n("object"==typeof r.g&&r.g)||function(){return this}()||Function("return this")()},90953:(e,t,r)=>{var n=r(95329),o=r(89678),a=n({}.hasOwnProperty);e.exports=Object.hasOwn||function(e,t){return a(o(e),t)}},27748:e=>{e.exports={}},34845:(e,t,r)=>{var n=r(21899);e.exports=function(e,t){var r=n.console;r&&r.error&&(1==arguments.length?r.error(e):r.error(e,t))}},15463:(e,t,r)=>{var n=r(626);e.exports=n("document","documentElement")},2840:(e,t,r)=>{var n=r(55746),o=r(95981),a=r(61333);e.exports=!n&&!o((function(){return 7!=Object.defineProperty(a("div"),"a",{get:function(){return 7}}).a}))},37026:(e,t,r)=>{var n=r(21899),o=r(95329),a=r(95981),i=r(82532),s=n.Object,l=o("".split);e.exports=a((function(){return!s("z").propertyIsEnumerable(0)}))?function(e){return"String"==i(e)?l(e,""):s(e)}:s},81302:(e,t,r)=>{var n=r(95329),o=r(57475),a=r(63030),i=n(Function.toString);o(a.inspectSource)||(a.inspectSource=function(e){return i(e)}),e.exports=a.inspectSource},53794:(e,t,r)=>{var n=r(10941),o=r(32029);e.exports=function(e,t){n(t)&&"cause"in t&&o(e,"cause",t.cause)}},21647:(e,t,r)=>{var n=r(76887),o=r(95329),a=r(27748),i=r(10941),s=r(90953),l=r(65988).f,u=r(10946),c=r(684),p=r(91584),f=r(99418),h=r(45602),d=!1,m=f("meta"),g=0,v=function(e){l(e,m,{value:{objectID:"O"+g++,weakData:{}}})},y=e.exports={enable:function(){y.enable=function(){},d=!0;var e=u.f,t=o([].splice),r={};r[m]=1,e(r).length&&(u.f=function(r){for(var n=e(r),o=0,a=n.length;o{var n,o,a,i=r(38019),s=r(21899),l=r(95329),u=r(10941),c=r(32029),p=r(90953),f=r(63030),h=r(44262),d=r(27748),m="Object already initialized",g=s.TypeError,v=s.WeakMap;if(i||f.state){var y=f.state||(f.state=new v),b=l(y.get),w=l(y.has),E=l(y.set);n=function(e,t){if(w(y,e))throw new g(m);return t.facade=e,E(y,e,t),t},o=function(e){return b(y,e)||{}},a=function(e){return w(y,e)}}else{var x=h("state");d[x]=!0,n=function(e,t){if(p(e,x))throw new g(m);return t.facade=e,c(e,x,t),t},o=function(e){return p(e,x)?e[x]:{}},a=function(e){return p(e,x)}}e.exports={set:n,get:o,has:a,enforce:function(e){return a(e)?o(e):n(e,{})},getterFor:function(e){return function(t){var r;if(!u(t)||(r=o(t)).type!==e)throw g("Incompatible receiver, "+e+" required");return r}}}},6782:(e,t,r)=>{var n=r(99813),o=r(12077),a=n("iterator"),i=Array.prototype;e.exports=function(e){return void 0!==e&&(o.Array===e||i[a]===e)}},1052:(e,t,r)=>{var n=r(82532);e.exports=Array.isArray||function(e){return"Array"==n(e)}},57475:e=>{e.exports=function(e){return"function"==typeof e}},24284:(e,t,r)=>{var n=r(95329),o=r(95981),a=r(57475),i=r(9697),s=r(626),l=r(81302),u=function(){},c=[],p=s("Reflect","construct"),f=/^\s*(?:class|function)\b/,h=n(f.exec),d=!f.exec(u),m=function(e){if(!a(e))return!1;try{return p(u,c,e),!0}catch(e){return!1}},g=function(e){if(!a(e))return!1;switch(i(e)){case"AsyncFunction":case"GeneratorFunction":case"AsyncGeneratorFunction":return!1}try{return d||!!h(f,l(e))}catch(e){return!0}};g.sham=!0,e.exports=!p||o((function(){var e;return m(m.call)||!m(Object)||!m((function(){e=!0}))||e}))?g:m},37252:(e,t,r)=>{var n=r(95981),o=r(57475),a=/#|\.prototype\./,i=function(e,t){var r=l[s(e)];return r==c||r!=u&&(o(t)?n(t):!!t)},s=i.normalize=function(e){return String(e).replace(a,".").toLowerCase()},l=i.data={},u=i.NATIVE="N",c=i.POLYFILL="P";e.exports=i},10941:(e,t,r)=>{var n=r(57475);e.exports=function(e){return"object"==typeof e?null!==e:n(e)}},82529:e=>{e.exports=!0},60685:(e,t,r)=>{var n=r(10941),o=r(82532),a=r(99813)("match");e.exports=function(e){var t;return n(e)&&(void 0!==(t=e[a])?!!t:"RegExp"==o(e))}},56664:(e,t,r)=>{var n=r(21899),o=r(626),a=r(57475),i=r(7046),s=r(32302),l=n.Object;e.exports=s?function(e){return"symbol"==typeof e}:function(e){var t=o("Symbol");return a(t)&&i(t.prototype,l(e))}},93091:(e,t,r)=>{var n=r(21899),o=r(86843),a=r(78834),i=r(96059),s=r(69826),l=r(6782),u=r(10623),c=r(7046),p=r(53476),f=r(22902),h=r(7609),d=n.TypeError,m=function(e,t){this.stopped=e,this.result=t},g=m.prototype;e.exports=function(e,t,r){var n,v,y,b,w,E,x,_=r&&r.that,S=!(!r||!r.AS_ENTRIES),A=!(!r||!r.IS_ITERATOR),k=!(!r||!r.INTERRUPTED),C=o(t,_),O=function(e){return n&&h(n,"normal",e),new m(!0,e)},j=function(e){return S?(i(e),k?C(e[0],e[1],O):C(e[0],e[1])):k?C(e,O):C(e)};if(A)n=e;else{if(!(v=f(e)))throw d(s(e)+" is not iterable");if(l(v)){for(y=0,b=u(e);b>y;y++)if((w=j(e[y]))&&c(g,w))return w;return new m(!1)}n=p(e,v)}for(E=n.next;!(x=a(E,n)).done;){try{w=j(x.value)}catch(e){h(n,"throw",e)}if("object"==typeof w&&w&&c(g,w))return w}return new m(!1)}},7609:(e,t,r)=>{var n=r(78834),o=r(96059),a=r(14229);e.exports=function(e,t,r){var i,s;o(e);try{if(!(i=a(e,"return"))){if("throw"===t)throw r;return r}i=n(i,e)}catch(e){s=!0,i=e}if("throw"===t)throw r;if(s)throw i;return o(i),r}},35143:(e,t,r)=>{"use strict";var n,o,a,i=r(95981),s=r(57475),l=r(29290),u=r(249),c=r(99754),p=r(99813),f=r(82529),h=p("iterator"),d=!1;[].keys&&("next"in(a=[].keys())?(o=u(u(a)))!==Object.prototype&&(n=o):d=!0),null==n||i((function(){var e={};return n[h].call(e)!==e}))?n={}:f&&(n=l(n)),s(n[h])||c(n,h,(function(){return this})),e.exports={IteratorPrototype:n,BUGGY_SAFARI_ITERATORS:d}},12077:e=>{e.exports={}},10623:(e,t,r)=>{var n=r(43057);e.exports=function(e){return n(e.length)}},66132:(e,t,r)=>{var n,o,a,i,s,l,u,c,p=r(21899),f=r(86843),h=r(49677).f,d=r(42941).set,m=r(22749),g=r(4470),v=r(58045),y=r(6049),b=p.MutationObserver||p.WebKitMutationObserver,w=p.document,E=p.process,x=p.Promise,_=h(p,"queueMicrotask"),S=_&&_.value;S||(n=function(){var e,t;for(y&&(e=E.domain)&&e.exit();o;){t=o.fn,o=o.next;try{t()}catch(e){throw o?i():a=void 0,e}}a=void 0,e&&e.enter()},m||y||v||!b||!w?!g&&x&&x.resolve?((u=x.resolve(void 0)).constructor=x,c=f(u.then,u),i=function(){c(n)}):y?i=function(){E.nextTick(n)}:(d=f(d,p),i=function(){d(n)}):(s=!0,l=w.createTextNode(""),new b(n).observe(l,{characterData:!0}),i=function(){l.data=s=!s})),e.exports=S||function(e){var t={fn:e,next:void 0};a&&(a.next=t),o||(o=t,i()),a=t}},19297:(e,t,r)=>{var n=r(21899);e.exports=n.Promise},72497:(e,t,r)=>{var n=r(53385),o=r(95981);e.exports=!!Object.getOwnPropertySymbols&&!o((function(){var e=Symbol();return!String(e)||!(Object(e)instanceof Symbol)||!Symbol.sham&&n&&n<41}))},28468:(e,t,r)=>{var n=r(95981),o=r(99813),a=r(82529),i=o("iterator");e.exports=!n((function(){var e=new URL("b?a=1&b=2&c=3","http://a"),t=e.searchParams,r="";return e.pathname="c%20d",t.forEach((function(e,n){t.delete("b"),r+=n+e})),a&&!e.toJSON||!t.sort||"http://a/c%20d?a=1&c=3"!==e.href||"3"!==t.get("c")||"a=1"!==String(new URLSearchParams("?a=1"))||!t[i]||"a"!==new URL("https://a@b").username||"b"!==new URLSearchParams(new URLSearchParams("a=b")).get("a")||"xn--e1aybc"!==new URL("http://тест").host||"#%D0%B1"!==new URL("http://a#б").hash||"a1c3"!==r||"x"!==new URL("http://x",void 0).host}))},38019:(e,t,r)=>{var n=r(21899),o=r(57475),a=r(81302),i=n.WeakMap;e.exports=o(i)&&/native code/.test(a(i))},69520:(e,t,r)=>{"use strict";var n=r(24883),o=function(e){var t,r;this.promise=new e((function(e,n){if(void 0!==t||void 0!==r)throw TypeError("Bad Promise constructor");t=e,r=n})),this.resolve=n(t),this.reject=n(r)};e.exports.f=function(e){return new o(e)}},14649:(e,t,r)=>{var n=r(85803);e.exports=function(e,t){return void 0===e?arguments.length<2?"":t:n(e)}},70344:(e,t,r)=>{var n=r(21899),o=r(60685),a=n.TypeError;e.exports=function(e){if(o(e))throw a("The method doesn't accept regular expressions");return e}},24420:(e,t,r)=>{"use strict";var n=r(55746),o=r(95329),a=r(78834),i=r(95981),s=r(14771),l=r(87857),u=r(36760),c=r(89678),p=r(37026),f=Object.assign,h=Object.defineProperty,d=o([].concat);e.exports=!f||i((function(){if(n&&1!==f({b:1},f(h({},"a",{enumerable:!0,get:function(){h(this,"b",{value:3,enumerable:!1})}}),{b:2})).b)return!0;var e={},t={},r=Symbol(),o="abcdefghijklmnopqrst";return e[r]=7,o.split("").forEach((function(e){t[e]=e})),7!=f({},e)[r]||s(f({},t)).join("")!=o}))?function(e,t){for(var r=c(e),o=arguments.length,i=1,f=l.f,h=u.f;o>i;)for(var m,g=p(arguments[i++]),v=f?d(s(g),f(g)):s(g),y=v.length,b=0;y>b;)m=v[b++],n&&!a(h,g,m)||(r[m]=g[m]);return r}:f},29290:(e,t,r)=>{var n,o=r(96059),a=r(59938),i=r(56759),s=r(27748),l=r(15463),u=r(61333),c=r(44262),p=c("IE_PROTO"),f=function(){},h=function(e){return"