diff --git a/README.md b/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..46ef29e90d51ce25fea35330fd07aaf0f6ec8376
--- /dev/null
+++ b/README.md
@@ -0,0 +1,182 @@
+API Flopbox
+Nathan Houzet
+2021
+
+# Introduction
+
+Développer la plate-forme FlopBox en adoptant le style architectural REST pour vous permettre de centraliser la gestion de vos fichiers distants stockés dans des serveurs FTP tiers.
+
+Vous utiliserez notamment JAX-RS (ou tout autre équivalent) pour développer cette plate-forme.
+
+Vous proposerez un mécanisme d'authentification adéquat tenant compte des différentes clés d'authentification envisageables (celles des différents serveurs FTP auquel on peut avoir accès, ainsi que celles de la plate-forme FlopBox).
+
+# Lancer le programme
+
+Une [démo du programme](./doc/Demo.mp4) est disponible dans le dossier doc.
+La démo illustre tout les fonctionnalités implémentés
+
+Pour lancer le serveur il faut :
+ - se placer à la racine du projet dans le dossier "flopboxProject"
+ - executer la commande `mvn package` ( si tout est bien configuré, un dossier target avec un executable "flopbox-exe-1.0-jar-with-dependencies.jar" sont générés )
+ - executer le jar avec la commande `java -jar target/flopbox-exe-1.0-jar-with-dependencies.jar`
+ - il est possible de choisir son URL de base et son port en spécifiant `java -jar
+ target/flopbox-exe-1.0-jar-with-dependencies.jar <url> <port>`
+ `
+
+Une copie de l'archive Jar est disponible dans le dossier doc.
+Votre server Flopbox est ainsi lancé, il attend sagement des requêtes à éxecuter.
+
+# Liste des requetes :
+
+Je précise que comme je n'étais pas du tout habitué à Curl, j'ai fait
+tout mes requêtes sur Postman. De plus j'ai utilisé Postman car en essayant avec Curl
+certaines requetes au début, elles ne fonctionnaient pas alors que sur Postman oui.
+Je ne sais donc pas du tout si ces requêtes vont fontionner sur Curl ...
+
+NB : Si vous souhaitez importer [mes requetes](.doc/flopbox.postman_collection.json) de la démo sous postman, elle sont
+disponibles dans le dossier doc.
+
+Véfifier la liste des serveurs que contient Flopbox (contient déjà free et ubuntu) :
+
+ * `GET localhost:8080/flopbox/servers`
+
+Ajouter un server :
+
+ * `POST localhost:8080/flopbox/servers?host=127.0.0.1&port=2121&alias=perso`
+
+Ajouter un identifiant et un mot de passe pour le server précédent :
+
+ * `GET localhost:8080/flopbox/servers/perso/login?user=nathan&pass=houzet`
+Renvoie un 'token' de connexion. Ne pas oublier de le mettre dans le header avec un
+ onglet 'token' pour toute les commandes suivantes.
+
+Afficher la racine d'un répertoire :
+
+ * `GET localhost:8080/flopbox/servers/perso`
+
+Supprimer un fichier ou dossier :
+
+ * `DEL localhost:8080/flopbox/servers/perso/files/delete?path=Desktop/toto.txt`
+
+Ajouter un dossier :
+
+* `PUT localhost:8080/flopbox/servers/perso/files/add?path=Desktop/toto`
+
+Renommer un fichier ou un dossier :
+
+* `POST localhost:8080/flopbox/servers/perso/files/rename?path=Desktop/toto.txt&newPath=Desktop/tata.txt`
+
+Récuperer le contenu d'un répertoire :
+
+* `GET localhost:8080/flopbox/servers/perso/files/getContentRep/?file=Desktop/website`
+
+Récuperer le contenu d'un fichier texte :
+
+* `GET localhost:8080/flopbox/servers/perso/files/getContentFile/?file=Desktop/memoire.txt`
+
+Modifier un alias :
+
+* `PUT localhost:8080/flopbox/servers/perso/change?newAlias=perso2`
+
+A noter que ici 'perso' est l'alias que j'ai utilisé pour mon serveur local de test.
+
+
+# Architechture
+
+Le programme est principalement composé de 5 classes.
+
+
+
+**Une classe FTPServerService** :
+
+Cette classe représente la première ressource `server`. Elle permet d'ajouter les
+serveurs, afficher les infos sur les serveurs et de changer les alias principalement
+
+**Une classe FilesServices** :
+
+Cette classe réprésente la ressource fichier/dossier. Elle permet de les modifiers,
+les supprimer, les effacers. Elle permet aussi d'afficher les contenus des répertoires
+et de affichier les fichier textes.
+
+NB : L'upload et le download de fichiers binaires n'as pas été implémenté.
+
+**Une classe FtpServer** :
+
+Cette classe représente un server FTP et donc contient tout les infos utiles à son
+fonctionnement comme l'hote, le port, l'alias mais aussi les liste des utilisateurs
+associés et leurs token de connexion respectifs.
+
+**Une classe FTPTool** :
+
+Cette classe est une classe outil permettant de gérer les connexions ftp avec serveurs
+FTP via la classe FTPClient.
+Elle gère également les authentifications des clients.
+
+**Une classe FtpServerList** :
+
+Cette classe est principalement la liste des serveurs FTP connus par la plateforme
+Flopbox.
+
+Diagrammes UML des classes :
+
+
+
+**La classe Main** :
+
+Cette classe permet de lancer le service flopbox et puis attends les requêtes.
+
+**Les exceptions** :
+
+De plus, 3 exceptions ont été créés pour préciser les différentes problèmes qu'il peut y
+avoir lors de l'éxecution du programme :
+
+- Une exception qui concerne les alias, si un alias n'est associé à aucun serveur, alors
+ l'exception
+ "NoServerFoundException" est levé.
+
+- Une exception par rapport aux fichiers des serveurs FTP. Si un fichier est introuvable
+ sur un server, alors l'exception
+ "FileDoesNotExistException" est levé.
+
+- La dernière, la connection au serveurs FTP. Si une connection échoue, alors
+ l'exception "cantConnectToServerException" est déclenché.
+
+
+# Parcours de code
+
+**Code 1**
+```java
+new FtpServer.FtpServerBuilder().id()
+ .host("91.189.88.152")
+ .port("22")
+ .alias("ubuntu")
+ .build()
+```
+
+Pour créer et ajouter dynamiquement mes objets FTPServer à la liste des servers connus
+par la plateforme, j'utilise le concept COO de builder.
+
+
+**Code 2**
+```java
+ public static FTPClient ConnectAndLogIn(String alias, int token)
+```
+
+La méthode `ConnectAndLogIn` de la classe FTPTool. Cette méthode va initialiser une
+connexion FTP et également connecter le client à partir de son token et de l'alias
+utilisé. Elle est très pratique car c'est une étape répétitive pour quasiment chaque
+services de l'API. Elle regroupe le code commun de plusieurs méthodes.
+
+
+
+
+# Tests
+
+Quelques tests ont été réalisé sur les méthodes ne nécéssitant pas d'avoir des clients
+qui envoient des requetes et des serverurs FTP en route pour y répondre.
+
+
+
+# Documentation
+
+La documentation est disponible dans le dossier doc via le fichier [*index.html*](./doc/index.html).
\ No newline at end of file
diff --git a/doc/Demo.mp4 b/doc/Demo.mp4
new file mode 100644
index 0000000000000000000000000000000000000000..8b93ec812d02d9ff3679a4e433f5813f888cc47e
Binary files /dev/null and b/doc/Demo.mp4 differ
diff --git a/doc/Tests.png b/doc/Tests.png
new file mode 100644
index 0000000000000000000000000000000000000000..4ba806a7c3362e882a228a5e42a795f6318d7f58
Binary files /dev/null and b/doc/Tests.png differ
diff --git a/doc/allclasses-index.html b/doc/allclasses-index.html
new file mode 100644
index 0000000000000000000000000000000000000000..b130b8c83b74b4d6b42832546367b0f5d701b63f
--- /dev/null
+++ b/doc/allclasses-index.html
@@ -0,0 +1,139 @@
+<!DOCTYPE HTML>
+<!-- NewPage -->
+<html lang="en">
+<head>
+<!-- Generated by javadoc (15) on Thu Apr 01 01:09:08 CEST 2021 -->
+<title>All Classes</title>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+<meta name="dc.created" content="2021-04-01">
+<meta name="description" content="class index">
+<meta name="generator" content="javadoc/AllClassesIndexWriter">
+<link rel="stylesheet" type="text/css" href="stylesheet.css" title="Style">
+<link rel="stylesheet" type="text/css" href="script-dir/jquery-ui.min.css" title="Style">
+<link rel="stylesheet" type="text/css" href="jquery-ui.overrides.css" title="Style">
+<script type="text/javascript" src="script.js"></script>
+<script type="text/javascript" src="script-dir/jquery-3.5.1.min.js"></script>
+<script type="text/javascript" src="script-dir/jquery-ui.min.js"></script>
+</head>
+<body class="all-classes-index-page">
+<script type="text/javascript">var data = {"i0":8,"i1":8,"i2":2,"i3":2,"i4":2,"i5":2,"i6":2,"i7":2,"i8":8};
+var tabs = {65535:["t0","All Classes"],2:["t2","Class Summary"],8:["t4","Exception Summary"]};
+var altColor = "alt-color";
+var rowColor = "row-color";
+var tableTab = "table-tab";
+var activeTableTab = "active-table-tab";
+var pathtoroot = "./";
+loadScripts(document, 'script');</script>
+<noscript>
+<div>JavaScript is disabled on your browser.</div>
+</noscript>
+<div class="flex-box">
+<header role="banner" class="flex-header">
+<nav role="navigation">
+<!-- ========= START OF TOP NAVBAR ======= -->
+<div class="top-nav" id="navbar.top">
+<div class="skip-nav"><a href="#skip.navbar.top" title="Skip navigation links">Skip navigation links</a></div>
+<ul id="navbar.top.firstrow" class="nav-list" title="Navigation">
+<li><a href="sr2/flopbox/package-summary.html">Package</a></li>
+<li>Class</li>
+<li><a href="overview-tree.html">Tree</a></li>
+<li><a href="deprecated-list.html">Deprecated</a></li>
+<li><a href="index-files/index-1.html">Index</a></li>
+<li><a href="help-doc.html">Help</a></li>
+</ul>
+</div>
+<div class="sub-nav">
+<div class="nav-list-search"><label for="search">SEARCH:</label>
+<input type="text" id="search" value="search" disabled="disabled">
+<input type="reset" id="reset" value="reset" disabled="disabled">
+</div>
+</div>
+<!-- ========= END OF TOP NAVBAR ========= -->
+<span class="skip-nav" id="skip.navbar.top">
+<!-- -->
+</span></nav>
+</header>
+<div class="flex-content">
+<main role="main">
+<div class="header">
+<h1 title="All&nbsp;Classes" class="title">All Classes</h1>
+</div>
+<div class="type-summary" id="all-classes-table">
+<div class="table-tabs" role="tablist" aria-orientation="horizontal"><button role="tab" aria-selected="true" aria-controls="all-classes-table.tabpanel" tabindex="0" onkeydown="switchTab(event)" id="t0" class="active-table-tab">All Classes</button><button role="tab" aria-selected="false" aria-controls="all-classes-table.tabpanel" tabindex="-1" onkeydown="switchTab(event)" id="t2" class="table-tab" onclick="show(2);">Class Summary</button><button role="tab" aria-selected="false" aria-controls="all-classes-table.tabpanel" tabindex="-1" onkeydown="switchTab(event)" id="t4" class="table-tab" onclick="show(8);">Exception Summary</button></div>
+<div id="all-classes-table.tabpanel" role="tabpanel">
+<table class="summary-table" aria-labelledby="t0">
+<thead>
+<tr>
+<th class="col-first" scope="col">Class</th>
+<th class="col-last" scope="col">Description</th>
+</tr>
+</thead>
+<tbody>
+<tr class="alt-color" id="i0">
+<td class="col-first"><a href="sr2/flopbox/cantConnectToServerException.html" title="class in sr2.flopbox">cantConnectToServerException</a></td>
+<th class="col-last" scope="row"> </th>
+</tr>
+<tr class="row-color" id="i1">
+<td class="col-first"><a href="sr2/flopbox/FileDoesNotExistException.html" title="class in sr2.flopbox">FileDoesNotExistException</a></td>
+<th class="col-last" scope="row"> </th>
+</tr>
+<tr class="alt-color" id="i2">
+<td class="col-first"><a href="sr2/flopbox/FilesServices.html" title="class in sr2.flopbox">FilesServices</a></td>
+<th class="col-last" scope="row"> </th>
+</tr>
+<tr class="row-color" id="i3">
+<td class="col-first"><a href="sr2/flopbox/FtpServer.html" title="class in sr2.flopbox">FtpServer</a></td>
+<th class="col-last" scope="row"> </th>
+</tr>
+<tr class="alt-color" id="i4">
+<td class="col-first"><a href="sr2/flopbox/FtpServer.FtpServerBuilder.html" title="class in sr2.flopbox">FtpServer.FtpServerBuilder</a></td>
+<th class="col-last" scope="row">
+<div class="block">Constructor of a FTP client builder</div>
+</th>
+</tr>
+<tr class="row-color" id="i5">
+<td class="col-first"><a href="sr2/flopbox/FtpServerList.html" title="class in sr2.flopbox">FtpServerList</a></td>
+<th class="col-last" scope="row"> </th>
+</tr>
+<tr class="alt-color" id="i6">
+<td class="col-first"><a href="sr2/flopbox/FtpServerService.html" title="class in sr2.flopbox">FtpServerService</a></td>
+<th class="col-last" scope="row"> </th>
+</tr>
+<tr class="row-color" id="i7">
+<td class="col-first"><a href="sr2/flopbox/Main.html" title="class in sr2.flopbox">Main</a></td>
+<th class="col-last" scope="row"> </th>
+</tr>
+<tr class="alt-color" id="i8">
+<td class="col-first"><a href="sr2/flopbox/NoServerFoundException.html" title="class in sr2.flopbox">NoServerFoundException</a></td>
+<th class="col-last" scope="row">
+<div class="block">Exception throws if the alias dont refer to server</div>
+</th>
+</tr>
+</tbody>
+</table>
+</div>
+</div>
+</main>
+<footer role="contentinfo">
+<nav role="navigation">
+<!-- ======= START OF BOTTOM NAVBAR ====== -->
+<div class="bottom-nav" id="navbar.bottom">
+<div class="skip-nav"><a href="#skip.navbar.bottom" title="Skip navigation links">Skip navigation links</a></div>
+<ul id="navbar.bottom.firstrow" class="nav-list" title="Navigation">
+<li><a href="sr2/flopbox/package-summary.html">Package</a></li>
+<li>Class</li>
+<li><a href="overview-tree.html">Tree</a></li>
+<li><a href="deprecated-list.html">Deprecated</a></li>
+<li><a href="index-files/index-1.html">Index</a></li>
+<li><a href="help-doc.html">Help</a></li>
+</ul>
+</div>
+<!-- ======== END OF BOTTOM NAVBAR ======= -->
+<span class="skip-nav" id="skip.navbar.bottom">
+<!-- -->
+</span></nav>
+</footer>
+</div>
+</div>
+</body>
+</html>
diff --git a/doc/allpackages-index.html b/doc/allpackages-index.html
new file mode 100644
index 0000000000000000000000000000000000000000..e4e0336c6e2a013b13db8b4c730ac97f5ad0ab47
--- /dev/null
+++ b/doc/allpackages-index.html
@@ -0,0 +1,95 @@
+<!DOCTYPE HTML>
+<!-- NewPage -->
+<html lang="en">
+<head>
+<!-- Generated by javadoc (15) on Thu Apr 01 01:09:08 CEST 2021 -->
+<title>All Packages</title>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+<meta name="dc.created" content="2021-04-01">
+<meta name="description" content="package index">
+<meta name="generator" content="javadoc/AllPackagesIndexWriter">
+<link rel="stylesheet" type="text/css" href="stylesheet.css" title="Style">
+<link rel="stylesheet" type="text/css" href="script-dir/jquery-ui.min.css" title="Style">
+<link rel="stylesheet" type="text/css" href="jquery-ui.overrides.css" title="Style">
+<script type="text/javascript" src="script.js"></script>
+<script type="text/javascript" src="script-dir/jquery-3.5.1.min.js"></script>
+<script type="text/javascript" src="script-dir/jquery-ui.min.js"></script>
+</head>
+<body class="all-packages-index-page">
+<script type="text/javascript">var pathtoroot = "./";
+loadScripts(document, 'script');</script>
+<noscript>
+<div>JavaScript is disabled on your browser.</div>
+</noscript>
+<div class="flex-box">
+<header role="banner" class="flex-header">
+<nav role="navigation">
+<!-- ========= START OF TOP NAVBAR ======= -->
+<div class="top-nav" id="navbar.top">
+<div class="skip-nav"><a href="#skip.navbar.top" title="Skip navigation links">Skip navigation links</a></div>
+<ul id="navbar.top.firstrow" class="nav-list" title="Navigation">
+<li><a href="sr2/flopbox/package-summary.html">Package</a></li>
+<li>Class</li>
+<li><a href="overview-tree.html">Tree</a></li>
+<li><a href="deprecated-list.html">Deprecated</a></li>
+<li><a href="index-files/index-1.html">Index</a></li>
+<li><a href="help-doc.html">Help</a></li>
+</ul>
+</div>
+<div class="sub-nav">
+<div class="nav-list-search"><label for="search">SEARCH:</label>
+<input type="text" id="search" value="search" disabled="disabled">
+<input type="reset" id="reset" value="reset" disabled="disabled">
+</div>
+</div>
+<!-- ========= END OF TOP NAVBAR ========= -->
+<span class="skip-nav" id="skip.navbar.top">
+<!-- -->
+</span></nav>
+</header>
+<div class="flex-content">
+<main role="main">
+<div class="header">
+<h1 title="All&nbsp;Packages" class="title">All Packages</h1>
+</div>
+<div class="packages-summary">
+<table class="summary-table">
+<caption><span>Package Summary</span></caption>
+<thead>
+<tr>
+<th class="col-first" scope="col">Package</th>
+<th class="col-last" scope="col">Description</th>
+</tr>
+</thead>
+<tbody>
+<tr class="alt-color">
+<th class="col-first" scope="row"><a href="sr2/flopbox/package-summary.html">sr2.flopbox</a></th>
+<td class="col-last"> </td>
+</tr>
+</tbody>
+</table>
+</div>
+</main>
+<footer role="contentinfo">
+<nav role="navigation">
+<!-- ======= START OF BOTTOM NAVBAR ====== -->
+<div class="bottom-nav" id="navbar.bottom">
+<div class="skip-nav"><a href="#skip.navbar.bottom" title="Skip navigation links">Skip navigation links</a></div>
+<ul id="navbar.bottom.firstrow" class="nav-list" title="Navigation">
+<li><a href="sr2/flopbox/package-summary.html">Package</a></li>
+<li>Class</li>
+<li><a href="overview-tree.html">Tree</a></li>
+<li><a href="deprecated-list.html">Deprecated</a></li>
+<li><a href="index-files/index-1.html">Index</a></li>
+<li><a href="help-doc.html">Help</a></li>
+</ul>
+</div>
+<!-- ======== END OF BOTTOM NAVBAR ======= -->
+<span class="skip-nav" id="skip.navbar.bottom">
+<!-- -->
+</span></nav>
+</footer>
+</div>
+</div>
+</body>
+</html>
diff --git a/doc/constant-values.html b/doc/constant-values.html
new file mode 100644
index 0000000000000000000000000000000000000000..66455a59628989bce531a5e80e46792d26fc6426
--- /dev/null
+++ b/doc/constant-values.html
@@ -0,0 +1,110 @@
+<!DOCTYPE HTML>
+<!-- NewPage -->
+<html lang="en">
+<head>
+<!-- Generated by javadoc (15) on Thu Apr 01 01:09:08 CEST 2021 -->
+<title>Constant Field Values</title>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+<meta name="dc.created" content="2021-04-01">
+<meta name="description" content="summary of constants">
+<meta name="generator" content="javadoc/ConstantsSummaryWriterImpl">
+<link rel="stylesheet" type="text/css" href="stylesheet.css" title="Style">
+<link rel="stylesheet" type="text/css" href="script-dir/jquery-ui.min.css" title="Style">
+<link rel="stylesheet" type="text/css" href="jquery-ui.overrides.css" title="Style">
+<script type="text/javascript" src="script.js"></script>
+<script type="text/javascript" src="script-dir/jquery-3.5.1.min.js"></script>
+<script type="text/javascript" src="script-dir/jquery-ui.min.js"></script>
+</head>
+<body class="constants-summary-page">
+<script type="text/javascript">var pathtoroot = "./";
+loadScripts(document, 'script');</script>
+<noscript>
+<div>JavaScript is disabled on your browser.</div>
+</noscript>
+<div class="flex-box">
+<header role="banner" class="flex-header">
+<nav role="navigation">
+<!-- ========= START OF TOP NAVBAR ======= -->
+<div class="top-nav" id="navbar.top">
+<div class="skip-nav"><a href="#skip.navbar.top" title="Skip navigation links">Skip navigation links</a></div>
+<ul id="navbar.top.firstrow" class="nav-list" title="Navigation">
+<li><a href="sr2/flopbox/package-summary.html">Package</a></li>
+<li>Class</li>
+<li><a href="overview-tree.html">Tree</a></li>
+<li><a href="deprecated-list.html">Deprecated</a></li>
+<li><a href="index-files/index-1.html">Index</a></li>
+<li><a href="help-doc.html">Help</a></li>
+</ul>
+</div>
+<div class="sub-nav">
+<div class="nav-list-search"><label for="search">SEARCH:</label>
+<input type="text" id="search" value="search" disabled="disabled">
+<input type="reset" id="reset" value="reset" disabled="disabled">
+</div>
+</div>
+<!-- ========= END OF TOP NAVBAR ========= -->
+<span class="skip-nav" id="skip.navbar.top">
+<!-- -->
+</span></nav>
+</header>
+<div class="flex-content">
+<main role="main">
+<div class="header">
+<h1 title="Constant Field Values" class="title">Constant Field Values</h1>
+<section class="packages">
+<h2 title="Contents">Contents</h2>
+<ul>
+<li><a href="#sr2.flopbox">sr2.flopbox.*</a></li>
+</ul>
+</section>
+</div>
+<section class="constants-summary" id="sr2.flopbox">
+<h2 title="sr2.flopbox">sr2.flopbox.*</h2>
+<ul class="block-list">
+<li>
+<div class="constants-summary">
+<table class="summary-table">
+<caption><span>sr2.flopbox.<a href="sr2/flopbox/Main.html" title="class in sr2.flopbox">Main</a></span></caption>
+<thead>
+<tr>
+<th class="col-first" scope="col">Modifier and Type</th>
+<th class="col-second" scope="col">Constant Field</th>
+<th class="col-last" scope="col">Value</th>
+</tr>
+</thead>
+<tbody>
+<tr class="alt-color">
+<td class="col-first"><code id="sr2.flopbox.Main.BASE_URI">public static final java.lang.String</code></td>
+<th class="col-second" scope="row"><code><a href="sr2/flopbox/Main.html#BASE_URI">BASE_URI</a></code></th>
+<td class="col-last"><code>"http://localhost:8080/flopbox/"</code></td>
+</tr>
+</tbody>
+</table>
+</div>
+</li>
+</ul>
+</section>
+</main>
+<footer role="contentinfo">
+<nav role="navigation">
+<!-- ======= START OF BOTTOM NAVBAR ====== -->
+<div class="bottom-nav" id="navbar.bottom">
+<div class="skip-nav"><a href="#skip.navbar.bottom" title="Skip navigation links">Skip navigation links</a></div>
+<ul id="navbar.bottom.firstrow" class="nav-list" title="Navigation">
+<li><a href="sr2/flopbox/package-summary.html">Package</a></li>
+<li>Class</li>
+<li><a href="overview-tree.html">Tree</a></li>
+<li><a href="deprecated-list.html">Deprecated</a></li>
+<li><a href="index-files/index-1.html">Index</a></li>
+<li><a href="help-doc.html">Help</a></li>
+</ul>
+</div>
+<!-- ======== END OF BOTTOM NAVBAR ======= -->
+<span class="skip-nav" id="skip.navbar.bottom">
+<!-- -->
+</span></nav>
+</footer>
+</div>
+</div>
+</body>
+</html>
diff --git a/doc/deprecated-list.html b/doc/deprecated-list.html
new file mode 100644
index 0000000000000000000000000000000000000000..d2b9aa09a3e4b56635e1bf58a2820243a0f9e6c7
--- /dev/null
+++ b/doc/deprecated-list.html
@@ -0,0 +1,79 @@
+<!DOCTYPE HTML>
+<!-- NewPage -->
+<html lang="en">
+<head>
+<!-- Generated by javadoc (15) on Thu Apr 01 01:09:08 CEST 2021 -->
+<title>Deprecated List</title>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+<meta name="dc.created" content="2021-04-01">
+<meta name="description" content="deprecated elements">
+<meta name="generator" content="javadoc/DeprecatedListWriter">
+<link rel="stylesheet" type="text/css" href="stylesheet.css" title="Style">
+<link rel="stylesheet" type="text/css" href="script-dir/jquery-ui.min.css" title="Style">
+<link rel="stylesheet" type="text/css" href="jquery-ui.overrides.css" title="Style">
+<script type="text/javascript" src="script.js"></script>
+<script type="text/javascript" src="script-dir/jquery-3.5.1.min.js"></script>
+<script type="text/javascript" src="script-dir/jquery-ui.min.js"></script>
+</head>
+<body class="deprecated-list-page">
+<script type="text/javascript">var pathtoroot = "./";
+loadScripts(document, 'script');</script>
+<noscript>
+<div>JavaScript is disabled on your browser.</div>
+</noscript>
+<div class="flex-box">
+<header role="banner" class="flex-header">
+<nav role="navigation">
+<!-- ========= START OF TOP NAVBAR ======= -->
+<div class="top-nav" id="navbar.top">
+<div class="skip-nav"><a href="#skip.navbar.top" title="Skip navigation links">Skip navigation links</a></div>
+<ul id="navbar.top.firstrow" class="nav-list" title="Navigation">
+<li><a href="sr2/flopbox/package-summary.html">Package</a></li>
+<li>Class</li>
+<li><a href="overview-tree.html">Tree</a></li>
+<li class="nav-bar-cell1-rev">Deprecated</li>
+<li><a href="index-files/index-1.html">Index</a></li>
+<li><a href="help-doc.html">Help</a></li>
+</ul>
+</div>
+<div class="sub-nav">
+<div class="nav-list-search"><label for="search">SEARCH:</label>
+<input type="text" id="search" value="search" disabled="disabled">
+<input type="reset" id="reset" value="reset" disabled="disabled">
+</div>
+</div>
+<!-- ========= END OF TOP NAVBAR ========= -->
+<span class="skip-nav" id="skip.navbar.top">
+<!-- -->
+</span></nav>
+</header>
+<div class="flex-content">
+<main role="main">
+<div class="header">
+<h1 title="Deprecated API" class="title">Deprecated API</h1>
+<h2 title="Contents">Contents</h2>
+</div>
+</main>
+<footer role="contentinfo">
+<nav role="navigation">
+<!-- ======= START OF BOTTOM NAVBAR ====== -->
+<div class="bottom-nav" id="navbar.bottom">
+<div class="skip-nav"><a href="#skip.navbar.bottom" title="Skip navigation links">Skip navigation links</a></div>
+<ul id="navbar.bottom.firstrow" class="nav-list" title="Navigation">
+<li><a href="sr2/flopbox/package-summary.html">Package</a></li>
+<li>Class</li>
+<li><a href="overview-tree.html">Tree</a></li>
+<li class="nav-bar-cell1-rev">Deprecated</li>
+<li><a href="index-files/index-1.html">Index</a></li>
+<li><a href="help-doc.html">Help</a></li>
+</ul>
+</div>
+<!-- ======== END OF BOTTOM NAVBAR ======= -->
+<span class="skip-nav" id="skip.navbar.bottom">
+<!-- -->
+</span></nav>
+</footer>
+</div>
+</div>
+</body>
+</html>
diff --git a/doc/element-list b/doc/element-list
new file mode 100644
index 0000000000000000000000000000000000000000..7415780942433d79525c6ecc34d1f84d48609503
--- /dev/null
+++ b/doc/element-list
@@ -0,0 +1 @@
+sr2.flopbox
diff --git a/doc/flopbox.png b/doc/flopbox.png
new file mode 100644
index 0000000000000000000000000000000000000000..c63a58cd011f7d4fa2f31a9695ca1de7be126a4d
Binary files /dev/null and b/doc/flopbox.png differ
diff --git a/doc/flopbox.postman_collection.json b/doc/flopbox.postman_collection.json
new file mode 100644
index 0000000000000000000000000000000000000000..61e9929162d5dfd8f92dcf514b996a9de4df4514
--- /dev/null
+++ b/doc/flopbox.postman_collection.json
@@ -0,0 +1,346 @@
+{
+ "info": {
+ "_postman_id": "3163675e-a9eb-4790-96bc-9a0ffbc9fac8",
+ "name": "flopbox",
+ "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json"
+ },
+ "item": [
+ {
+ "name": "Server list",
+ "request": {
+ "method": "GET",
+ "header": [
+ {
+ "key": "token",
+ "value": "-305776185",
+ "type": "text"
+ }
+ ],
+ "url": {
+ "raw": "localhost:8080/flopbox/servers",
+ "host": [
+ "localhost"
+ ],
+ "port": "8080",
+ "path": [
+ "flopbox",
+ "servers"
+ ]
+ }
+ },
+ "response": []
+ },
+ {
+ "name": "ajout Server",
+ "request": {
+ "method": "POST",
+ "header": [
+ {
+ "key": "token",
+ "value": "1234",
+ "type": "text",
+ "disabled": true
+ }
+ ],
+ "url": {
+ "raw": "localhost:8080/flopbox/servers?host=127.0.0.1&port=2121&alias=perso",
+ "host": [
+ "localhost"
+ ],
+ "port": "8080",
+ "path": [
+ "flopbox",
+ "servers"
+ ],
+ "query": [
+ {
+ "key": "host",
+ "value": "127.0.0.1"
+ },
+ {
+ "key": "port",
+ "value": "2121"
+ },
+ {
+ "key": "alias",
+ "value": "perso"
+ }
+ ]
+ }
+ },
+ "response": []
+ },
+ {
+ "name": "loginServerPythonPerso",
+ "request": {
+ "method": "GET",
+ "header": [
+ {
+ "key": "token",
+ "value": "-533833063",
+ "type": "text"
+ }
+ ],
+ "url": {
+ "raw": "localhost:8080/flopbox/servers/perso/login?user=nathan&pass=houzet",
+ "host": [
+ "localhost"
+ ],
+ "port": "8080",
+ "path": [
+ "flopbox",
+ "servers",
+ "perso",
+ "login"
+ ],
+ "query": [
+ {
+ "key": "user",
+ "value": "nathan"
+ },
+ {
+ "key": "pass",
+ "value": "houzet"
+ }
+ ]
+ }
+ },
+ "response": []
+ },
+ {
+ "name": "retrieveRootPerso",
+ "request": {
+ "method": "GET",
+ "header": [
+ {
+ "key": "token",
+ "value": "-1558171352",
+ "type": "text"
+ }
+ ],
+ "url": {
+ "raw": "localhost:8080/flopbox/servers/perso",
+ "host": [
+ "localhost"
+ ],
+ "port": "8080",
+ "path": [
+ "flopbox",
+ "servers",
+ "perso"
+ ]
+ }
+ },
+ "response": []
+ },
+ {
+ "name": "delete",
+ "request": {
+ "method": "DELETE",
+ "header": [
+ {
+ "key": "token",
+ "value": "-1558171352",
+ "type": "text"
+ }
+ ],
+ "url": {
+ "raw": "localhost:8080/flopbox/servers/perso/files/delete?path=Desktop/toto.txt",
+ "host": [
+ "localhost"
+ ],
+ "port": "8080",
+ "path": [
+ "flopbox",
+ "servers",
+ "perso",
+ "files",
+ "delete"
+ ],
+ "query": [
+ {
+ "key": "path",
+ "value": "Desktop/toto.txt"
+ }
+ ]
+ }
+ },
+ "response": []
+ },
+ {
+ "name": "newfolder",
+ "request": {
+ "method": "PUT",
+ "header": [
+ {
+ "key": "token",
+ "value": "-1558171352",
+ "type": "text"
+ }
+ ],
+ "url": {
+ "raw": "localhost:8080/flopbox/servers/perso/files/add?path=Desktop/toto",
+ "host": [
+ "localhost"
+ ],
+ "port": "8080",
+ "path": [
+ "flopbox",
+ "servers",
+ "perso",
+ "files",
+ "add"
+ ],
+ "query": [
+ {
+ "key": "path",
+ "value": "Desktop/toto"
+ }
+ ]
+ }
+ },
+ "response": []
+ },
+ {
+ "name": "RenamePerso",
+ "request": {
+ "method": "POST",
+ "header": [
+ {
+ "key": "token",
+ "value": "-1558171352",
+ "type": "text"
+ }
+ ],
+ "url": {
+ "raw": "localhost:8080/flopbox/servers/perso/files/rename?path=Desktop/toto.txt&newPath=Desktop/tata.txt",
+ "host": [
+ "localhost"
+ ],
+ "port": "8080",
+ "path": [
+ "flopbox",
+ "servers",
+ "perso",
+ "files",
+ "rename"
+ ],
+ "query": [
+ {
+ "key": "path",
+ "value": "Desktop/toto.txt"
+ },
+ {
+ "key": "newPath",
+ "value": "Desktop/tata.txt"
+ }
+ ]
+ }
+ },
+ "response": []
+ },
+ {
+ "name": "Retrieve Rep",
+ "request": {
+ "method": "GET",
+ "header": [
+ {
+ "key": "token",
+ "value": "-1558171352",
+ "type": "text"
+ }
+ ],
+ "url": {
+ "raw": "localhost:8080/flopbox/servers/perso/files/getContentRep/?file=Desktop/website",
+ "host": [
+ "localhost"
+ ],
+ "port": "8080",
+ "path": [
+ "flopbox",
+ "servers",
+ "perso",
+ "files",
+ "getContentRep",
+ ""
+ ],
+ "query": [
+ {
+ "key": "file",
+ "value": "Desktop/website"
+ }
+ ]
+ }
+ },
+ "response": []
+ },
+ {
+ "name": "Retrieve text",
+ "request": {
+ "method": "GET",
+ "header": [
+ {
+ "key": "token",
+ "value": "-1558171352",
+ "type": "text"
+ }
+ ],
+ "url": {
+ "raw": "localhost:8080/flopbox/servers/perso/files/getContentFile/?file=Desktop/memoire.txt",
+ "host": [
+ "localhost"
+ ],
+ "port": "8080",
+ "path": [
+ "flopbox",
+ "servers",
+ "perso",
+ "files",
+ "getContentFile",
+ ""
+ ],
+ "query": [
+ {
+ "key": "file",
+ "value": "Desktop/memoire.txt"
+ }
+ ]
+ }
+ },
+ "response": []
+ },
+ {
+ "name": "newAlias",
+ "request": {
+ "method": "PUT",
+ "header": [
+ {
+ "key": "token",
+ "value": "-1558171352",
+ "type": "text"
+ }
+ ],
+ "url": {
+ "raw": "localhost:8080/flopbox/servers/perso/change?newAlias=perso2",
+ "host": [
+ "localhost"
+ ],
+ "port": "8080",
+ "path": [
+ "flopbox",
+ "servers",
+ "perso",
+ "change"
+ ],
+ "query": [
+ {
+ "key": "newAlias",
+ "value": "perso2"
+ }
+ ]
+ }
+ },
+ "response": []
+ }
+ ]
+}
\ No newline at end of file
diff --git a/doc/help-doc.html b/doc/help-doc.html
new file mode 100644
index 0000000000000000000000000000000000000000..1523e9330b1eff9b2fe51412ae561889312b3c1d
--- /dev/null
+++ b/doc/help-doc.html
@@ -0,0 +1,175 @@
+<!DOCTYPE HTML>
+<!-- NewPage -->
+<html lang="en">
+<head>
+<!-- Generated by javadoc (15) on Thu Apr 01 01:09:08 CEST 2021 -->
+<title>API Help</title>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+<meta name="dc.created" content="2021-04-01">
+<meta name="description" content="help">
+<meta name="generator" content="javadoc/HelpWriter">
+<link rel="stylesheet" type="text/css" href="stylesheet.css" title="Style">
+<link rel="stylesheet" type="text/css" href="script-dir/jquery-ui.min.css" title="Style">
+<link rel="stylesheet" type="text/css" href="jquery-ui.overrides.css" title="Style">
+<script type="text/javascript" src="script.js"></script>
+<script type="text/javascript" src="script-dir/jquery-3.5.1.min.js"></script>
+<script type="text/javascript" src="script-dir/jquery-ui.min.js"></script>
+</head>
+<body class="help-page">
+<script type="text/javascript">var pathtoroot = "./";
+loadScripts(document, 'script');</script>
+<noscript>
+<div>JavaScript is disabled on your browser.</div>
+</noscript>
+<div class="flex-box">
+<header role="banner" class="flex-header">
+<nav role="navigation">
+<!-- ========= START OF TOP NAVBAR ======= -->
+<div class="top-nav" id="navbar.top">
+<div class="skip-nav"><a href="#skip.navbar.top" title="Skip navigation links">Skip navigation links</a></div>
+<ul id="navbar.top.firstrow" class="nav-list" title="Navigation">
+<li><a href="sr2/flopbox/package-summary.html">Package</a></li>
+<li>Class</li>
+<li><a href="overview-tree.html">Tree</a></li>
+<li><a href="deprecated-list.html">Deprecated</a></li>
+<li><a href="index-files/index-1.html">Index</a></li>
+<li class="nav-bar-cell1-rev">Help</li>
+</ul>
+</div>
+<div class="sub-nav">
+<div class="nav-list-search"><label for="search">SEARCH:</label>
+<input type="text" id="search" value="search" disabled="disabled">
+<input type="reset" id="reset" value="reset" disabled="disabled">
+</div>
+</div>
+<!-- ========= END OF TOP NAVBAR ========= -->
+<span class="skip-nav" id="skip.navbar.top">
+<!-- -->
+</span></nav>
+</header>
+<div class="flex-content">
+<main role="main">
+<div class="header">
+<h1 class="title">How This API Document Is Organized</h1>
+<div class="sub-title">This API (Application Programming Interface) document has pages corresponding to the items in the navigation bar, described as follows.</div>
+</div>
+<section class="help-section">
+<h2>Package</h2>
+<p>Each package has a page that contains a list of its classes and interfaces, with a summary for each. These pages may contain six categories:</p>
+<ul class="help-section-list">
+<li>Interfaces</li>
+<li>Classes</li>
+<li>Enums</li>
+<li>Exceptions</li>
+<li>Errors</li>
+<li>Annotation Types</li>
+</ul>
+</section>
+<section class="help-section">
+<h2>Class or Interface</h2>
+<p>Each class, interface, nested class and nested interface has its own separate page. Each of these pages has three sections consisting of a class/interface description, summary tables, and detailed member descriptions:</p>
+<ul class="help-section-list">
+<li>Class Inheritance Diagram</li>
+<li>Direct Subclasses</li>
+<li>All Known Subinterfaces</li>
+<li>All Known Implementing Classes</li>
+<li>Class or Interface Declaration</li>
+<li>Class or Interface Description</li>
+</ul>
+<br>
+<ul class="help-section-list">
+<li>Nested Class Summary</li>
+<li>Field Summary</li>
+<li>Property Summary</li>
+<li>Constructor Summary</li>
+<li>Method Summary</li>
+</ul>
+<br>
+<ul class="help-section-list">
+<li>Field Details</li>
+<li>Property Details</li>
+<li>Constructor Details</li>
+<li>Method Details</li>
+</ul>
+<p>The summary entries are alphabetical, while the detailed descriptions are in the order they appear in the source code. This preserves the logical groupings established by the programmer.</p>
+</section>
+<section class="help-section">
+<h2>Annotation Type</h2>
+<p>Each annotation type has its own separate page with the following sections:</p>
+<ul class="help-section-list">
+<li>Annotation Type Declaration</li>
+<li>Annotation Type Description</li>
+<li>Required Element Summary</li>
+<li>Optional Element Summary</li>
+<li>Element Details</li>
+</ul>
+</section>
+<section class="help-section">
+<h2>Enum</h2>
+<p>Each enum has its own separate page with the following sections:</p>
+<ul class="help-section-list">
+<li>Enum Declaration</li>
+<li>Enum Description</li>
+<li>Enum Constant Summary</li>
+<li>Enum Constant Details</li>
+</ul>
+</section>
+<section class="help-section">
+<h2>Tree (Class Hierarchy)</h2>
+<p>There is a <a href="overview-tree.html">Class Hierarchy</a> page for all packages, plus a hierarchy for each package. Each hierarchy page contains a list of classes and a list of interfaces. Classes are organized by inheritance structure starting with <code>java.lang.Object</code>. Interfaces do not inherit from <code>java.lang.Object</code>.</p>
+<ul class="help-section-list">
+<li>When viewing the Overview page, clicking on "Tree" displays the hierarchy for all packages.</li>
+<li>When viewing a particular package, class or interface page, clicking on "Tree" displays the hierarchy for only that package.</li>
+</ul>
+</section>
+<section class="help-section">
+<h2>Deprecated API</h2>
+<p>The <a href="deprecated-list.html">Deprecated API</a> page lists all of the API that have been deprecated. A deprecated API is not recommended for use, generally due to shortcomings, and a replacement API is usually given. Deprecated APIs may be removed in future implementations.</p>
+</section>
+<section class="help-section">
+<h2>Index</h2>
+<p>The <a href="index-files/index-1.html">Index</a> contains an alphabetic index of all classes, interfaces, constructors, methods, and fields, as well as lists of all packages and all classes.</p>
+</section>
+<section class="help-section">
+<h2>Serialized Form</h2>
+<p>Each serializable or externalizable class has a description of its serialization fields and methods. This information is of interest to those who implement rather than use the API. While there is no link in the navigation bar, you can get to this information by going to any serialized class and clicking "Serialized Form" in the "See Also" section of the class description.</p>
+</section>
+<section class="help-section">
+<h2>Constant Field Values</h2>
+<p>The <a href="constant-values.html">Constant Field Values</a> page lists the static final fields and their values.</p>
+</section>
+<section class="help-section">
+<h2>Search</h2>
+<p>You can search for definitions of modules, packages, types, fields, methods, system properties and other terms defined in the API, using some or all of the name, optionally using "camel-case" abbreviations. For example:</p>
+<ul class="help-section-list">
+<li><code>j.l.obj</code> will match "java.lang.Object"</li>
+<li><code>InpStr</code> will match "java.io.InputStream"</li>
+<li><code>HM.cK</code> will match "java.util.HashMap.containsKey(Object)"</li>
+</ul>
+<p>Refer to <a href="https://docs.oracle.com/en/java/javase/15/docs/specs/javadoc/javadoc-search-spec.html">the Javadoc Search Specification</a> for a full description of search features.</p>
+</section>
+<hr>
+<span class="help-footnote">This help file applies to API documentation generated by the standard doclet.</span></main>
+<footer role="contentinfo">
+<nav role="navigation">
+<!-- ======= START OF BOTTOM NAVBAR ====== -->
+<div class="bottom-nav" id="navbar.bottom">
+<div class="skip-nav"><a href="#skip.navbar.bottom" title="Skip navigation links">Skip navigation links</a></div>
+<ul id="navbar.bottom.firstrow" class="nav-list" title="Navigation">
+<li><a href="sr2/flopbox/package-summary.html">Package</a></li>
+<li>Class</li>
+<li><a href="overview-tree.html">Tree</a></li>
+<li><a href="deprecated-list.html">Deprecated</a></li>
+<li><a href="index-files/index-1.html">Index</a></li>
+<li class="nav-bar-cell1-rev">Help</li>
+</ul>
+</div>
+<!-- ======== END OF BOTTOM NAVBAR ======= -->
+<span class="skip-nav" id="skip.navbar.bottom">
+<!-- -->
+</span></nav>
+</footer>
+</div>
+</div>
+</body>
+</html>
diff --git a/doc/index-files/index-1.html b/doc/index-files/index-1.html
new file mode 100644
index 0000000000000000000000000000000000000000..53a78803a33355a13128792b1e039039ad1dc67d
--- /dev/null
+++ b/doc/index-files/index-1.html
@@ -0,0 +1,96 @@
+<!DOCTYPE HTML>
+<!-- NewPage -->
+<html lang="en">
+<head>
+<!-- Generated by javadoc (15) on Thu Apr 01 01:09:08 CEST 2021 -->
+<title>A-Index</title>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+<meta name="dc.created" content="2021-04-01">
+<meta name="description" content="index: A">
+<meta name="generator" content="javadoc/SplitIndexWriter">
+<link rel="stylesheet" type="text/css" href="../stylesheet.css" title="Style">
+<link rel="stylesheet" type="text/css" href="../script-dir/jquery-ui.min.css" title="Style">
+<link rel="stylesheet" type="text/css" href="../jquery-ui.overrides.css" title="Style">
+<script type="text/javascript" src="../script.js"></script>
+<script type="text/javascript" src="../script-dir/jquery-3.5.1.min.js"></script>
+<script type="text/javascript" src="../script-dir/jquery-ui.min.js"></script>
+</head>
+<body class="split-index-page">
+<script type="text/javascript">var pathtoroot = "../";
+loadScripts(document, 'script');</script>
+<noscript>
+<div>JavaScript is disabled on your browser.</div>
+</noscript>
+<div class="flex-box">
+<header role="banner" class="flex-header">
+<nav role="navigation">
+<!-- ========= START OF TOP NAVBAR ======= -->
+<div class="top-nav" id="navbar.top">
+<div class="skip-nav"><a href="#skip.navbar.top" title="Skip navigation links">Skip navigation links</a></div>
+<ul id="navbar.top.firstrow" class="nav-list" title="Navigation">
+<li><a href="../sr2/flopbox/package-summary.html">Package</a></li>
+<li>Class</li>
+<li><a href="../overview-tree.html">Tree</a></li>
+<li><a href="../deprecated-list.html">Deprecated</a></li>
+<li class="nav-bar-cell1-rev">Index</li>
+<li><a href="../help-doc.html">Help</a></li>
+</ul>
+</div>
+<div class="sub-nav">
+<div class="nav-list-search"><label for="search">SEARCH:</label>
+<input type="text" id="search" value="search" disabled="disabled">
+<input type="reset" id="reset" value="reset" disabled="disabled">
+</div>
+</div>
+<!-- ========= END OF TOP NAVBAR ========= -->
+<span class="skip-nav" id="skip.navbar.top">
+<!-- -->
+</span></nav>
+</header>
+<div class="flex-content">
+<main role="main">
+<div class="header">
+<h1>Index</h1>
+</div>
+<a href="index-1.html">A</a> <a href="index-2.html">B</a> <a href="index-3.html">C</a> <a href="index-4.html">D</a> <a href="index-5.html">F</a> <a href="index-6.html">G</a> <a href="index-7.html">H</a> <a href="index-8.html">I</a> <a href="index-9.html">L</a> <a href="index-10.html">M</a> <a href="index-11.html">N</a> <a href="index-12.html">P</a> <a href="index-13.html">R</a> <a href="index-14.html">S</a> <a href="index-15.html">T</a> <br><a href="../allclasses-index.html">All Classes</a><span class="vertical-separator">|</span><a href="../allpackages-index.html">All Packages</a>
+<h2 class="title" id="I:A">A</h2>
+<dl class="index">
+<dt><span class="member-name-link"><a href="../sr2/flopbox/FilesServices.html#addfile(java.lang.String,java.lang.String,java.lang.String)">addfile(String, String, String)</a></span> - Method in class sr2.flopbox.<a href="../sr2/flopbox/FilesServices.html" title="class in sr2.flopbox">FilesServices</a></dt>
+<dd>
+<div class="block">Method used to create repository</div>
+</dd>
+<dt><span class="member-name-link"><a href="../sr2/flopbox/FtpServerService.html#addServer(java.lang.String,java.lang.String,java.lang.String)">addServer(String, String, String)</a></span> - Method in class sr2.flopbox.<a href="../sr2/flopbox/FtpServerService.html" title="class in sr2.flopbox">FtpServerService</a></dt>
+<dd>
+<div class="block">Method used to add a server to the API</div>
+</dd>
+<dt><span class="member-name-link"><a href="../sr2/flopbox/FtpServer.html#addUser(int,java.lang.String,java.lang.String)">addUser(int, String, String)</a></span> - Method in class sr2.flopbox.<a href="../sr2/flopbox/FtpServer.html" title="class in sr2.flopbox">FtpServer</a></dt>
+<dd>
+<div class="block">Used to add a new user for this server</div>
+</dd>
+<dt><span class="member-name-link"><a href="../sr2/flopbox/FtpServer.FtpServerBuilder.html#alias(java.lang.String)">alias(String)</a></span> - Method in class sr2.flopbox.<a href="../sr2/flopbox/FtpServer.FtpServerBuilder.html" title="class in sr2.flopbox">FtpServer.FtpServerBuilder</a></dt>
+<dd> </dd>
+</dl>
+<a href="index-1.html">A</a> <a href="index-2.html">B</a> <a href="index-3.html">C</a> <a href="index-4.html">D</a> <a href="index-5.html">F</a> <a href="index-6.html">G</a> <a href="index-7.html">H</a> <a href="index-8.html">I</a> <a href="index-9.html">L</a> <a href="index-10.html">M</a> <a href="index-11.html">N</a> <a href="index-12.html">P</a> <a href="index-13.html">R</a> <a href="index-14.html">S</a> <a href="index-15.html">T</a> <br><a href="../allclasses-index.html">All Classes</a><span class="vertical-separator">|</span><a href="../allpackages-index.html">All Packages</a></main>
+<footer role="contentinfo">
+<nav role="navigation">
+<!-- ======= START OF BOTTOM NAVBAR ====== -->
+<div class="bottom-nav" id="navbar.bottom">
+<div class="skip-nav"><a href="#skip.navbar.bottom" title="Skip navigation links">Skip navigation links</a></div>
+<ul id="navbar.bottom.firstrow" class="nav-list" title="Navigation">
+<li><a href="../sr2/flopbox/package-summary.html">Package</a></li>
+<li>Class</li>
+<li><a href="../overview-tree.html">Tree</a></li>
+<li><a href="../deprecated-list.html">Deprecated</a></li>
+<li class="nav-bar-cell1-rev">Index</li>
+<li><a href="../help-doc.html">Help</a></li>
+</ul>
+</div>
+<!-- ======== END OF BOTTOM NAVBAR ======= -->
+<span class="skip-nav" id="skip.navbar.bottom">
+<!-- -->
+</span></nav>
+</footer>
+</div>
+</div>
+</body>
+</html>
diff --git a/doc/index-files/index-10.html b/doc/index-files/index-10.html
new file mode 100644
index 0000000000000000000000000000000000000000..680fd7fc94257b50a22577cda1ba6547c0d1f7eb
--- /dev/null
+++ b/doc/index-files/index-10.html
@@ -0,0 +1,90 @@
+<!DOCTYPE HTML>
+<!-- NewPage -->
+<html lang="en">
+<head>
+<!-- Generated by javadoc (15) on Thu Apr 01 01:09:08 CEST 2021 -->
+<title>M-Index</title>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+<meta name="dc.created" content="2021-04-01">
+<meta name="description" content="index: M">
+<meta name="generator" content="javadoc/SplitIndexWriter">
+<link rel="stylesheet" type="text/css" href="../stylesheet.css" title="Style">
+<link rel="stylesheet" type="text/css" href="../script-dir/jquery-ui.min.css" title="Style">
+<link rel="stylesheet" type="text/css" href="../jquery-ui.overrides.css" title="Style">
+<script type="text/javascript" src="../script.js"></script>
+<script type="text/javascript" src="../script-dir/jquery-3.5.1.min.js"></script>
+<script type="text/javascript" src="../script-dir/jquery-ui.min.js"></script>
+</head>
+<body class="split-index-page">
+<script type="text/javascript">var pathtoroot = "../";
+loadScripts(document, 'script');</script>
+<noscript>
+<div>JavaScript is disabled on your browser.</div>
+</noscript>
+<div class="flex-box">
+<header role="banner" class="flex-header">
+<nav role="navigation">
+<!-- ========= START OF TOP NAVBAR ======= -->
+<div class="top-nav" id="navbar.top">
+<div class="skip-nav"><a href="#skip.navbar.top" title="Skip navigation links">Skip navigation links</a></div>
+<ul id="navbar.top.firstrow" class="nav-list" title="Navigation">
+<li><a href="../sr2/flopbox/package-summary.html">Package</a></li>
+<li>Class</li>
+<li><a href="../overview-tree.html">Tree</a></li>
+<li><a href="../deprecated-list.html">Deprecated</a></li>
+<li class="nav-bar-cell1-rev">Index</li>
+<li><a href="../help-doc.html">Help</a></li>
+</ul>
+</div>
+<div class="sub-nav">
+<div class="nav-list-search"><label for="search">SEARCH:</label>
+<input type="text" id="search" value="search" disabled="disabled">
+<input type="reset" id="reset" value="reset" disabled="disabled">
+</div>
+</div>
+<!-- ========= END OF TOP NAVBAR ========= -->
+<span class="skip-nav" id="skip.navbar.top">
+<!-- -->
+</span></nav>
+</header>
+<div class="flex-content">
+<main role="main">
+<div class="header">
+<h1>Index</h1>
+</div>
+<a href="index-1.html">A</a> <a href="index-2.html">B</a> <a href="index-3.html">C</a> <a href="index-4.html">D</a> <a href="index-5.html">F</a> <a href="index-6.html">G</a> <a href="index-7.html">H</a> <a href="index-8.html">I</a> <a href="index-9.html">L</a> <a href="index-10.html">M</a> <a href="index-11.html">N</a> <a href="index-12.html">P</a> <a href="index-13.html">R</a> <a href="index-14.html">S</a> <a href="index-15.html">T</a> <br><a href="../allclasses-index.html">All Classes</a><span class="vertical-separator">|</span><a href="../allpackages-index.html">All Packages</a>
+<h2 class="title" id="I:M">M</h2>
+<dl class="index">
+<dt><span class="member-name-link"><a href="../sr2/flopbox/Main.html#main(java.lang.String%5B%5D)">main(String[])</a></span> - Static method in class sr2.flopbox.<a href="../sr2/flopbox/Main.html" title="class in sr2.flopbox">Main</a></dt>
+<dd>
+<div class="block">Main method.</div>
+</dd>
+<dt><a href="../sr2/flopbox/Main.html" title="class in sr2.flopbox"><span class="type-name-link">Main</span></a> - Class in <a href="../sr2/flopbox/package-summary.html">sr2.flopbox</a></dt>
+<dd> </dd>
+<dt><span class="member-name-link"><a href="../sr2/flopbox/Main.html#%3Cinit%3E()">Main()</a></span> - Constructor for class sr2.flopbox.<a href="../sr2/flopbox/Main.html" title="class in sr2.flopbox">Main</a></dt>
+<dd> </dd>
+</dl>
+<a href="index-1.html">A</a> <a href="index-2.html">B</a> <a href="index-3.html">C</a> <a href="index-4.html">D</a> <a href="index-5.html">F</a> <a href="index-6.html">G</a> <a href="index-7.html">H</a> <a href="index-8.html">I</a> <a href="index-9.html">L</a> <a href="index-10.html">M</a> <a href="index-11.html">N</a> <a href="index-12.html">P</a> <a href="index-13.html">R</a> <a href="index-14.html">S</a> <a href="index-15.html">T</a> <br><a href="../allclasses-index.html">All Classes</a><span class="vertical-separator">|</span><a href="../allpackages-index.html">All Packages</a></main>
+<footer role="contentinfo">
+<nav role="navigation">
+<!-- ======= START OF BOTTOM NAVBAR ====== -->
+<div class="bottom-nav" id="navbar.bottom">
+<div class="skip-nav"><a href="#skip.navbar.bottom" title="Skip navigation links">Skip navigation links</a></div>
+<ul id="navbar.bottom.firstrow" class="nav-list" title="Navigation">
+<li><a href="../sr2/flopbox/package-summary.html">Package</a></li>
+<li>Class</li>
+<li><a href="../overview-tree.html">Tree</a></li>
+<li><a href="../deprecated-list.html">Deprecated</a></li>
+<li class="nav-bar-cell1-rev">Index</li>
+<li><a href="../help-doc.html">Help</a></li>
+</ul>
+</div>
+<!-- ======== END OF BOTTOM NAVBAR ======= -->
+<span class="skip-nav" id="skip.navbar.bottom">
+<!-- -->
+</span></nav>
+</footer>
+</div>
+</div>
+</body>
+</html>
diff --git a/doc/index-files/index-11.html b/doc/index-files/index-11.html
new file mode 100644
index 0000000000000000000000000000000000000000..96eea8fbc80e81fe7c82f9d2a0b751b1755863f1
--- /dev/null
+++ b/doc/index-files/index-11.html
@@ -0,0 +1,88 @@
+<!DOCTYPE HTML>
+<!-- NewPage -->
+<html lang="en">
+<head>
+<!-- Generated by javadoc (15) on Thu Apr 01 01:09:08 CEST 2021 -->
+<title>N-Index</title>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+<meta name="dc.created" content="2021-04-01">
+<meta name="description" content="index: N">
+<meta name="generator" content="javadoc/SplitIndexWriter">
+<link rel="stylesheet" type="text/css" href="../stylesheet.css" title="Style">
+<link rel="stylesheet" type="text/css" href="../script-dir/jquery-ui.min.css" title="Style">
+<link rel="stylesheet" type="text/css" href="../jquery-ui.overrides.css" title="Style">
+<script type="text/javascript" src="../script.js"></script>
+<script type="text/javascript" src="../script-dir/jquery-3.5.1.min.js"></script>
+<script type="text/javascript" src="../script-dir/jquery-ui.min.js"></script>
+</head>
+<body class="split-index-page">
+<script type="text/javascript">var pathtoroot = "../";
+loadScripts(document, 'script');</script>
+<noscript>
+<div>JavaScript is disabled on your browser.</div>
+</noscript>
+<div class="flex-box">
+<header role="banner" class="flex-header">
+<nav role="navigation">
+<!-- ========= START OF TOP NAVBAR ======= -->
+<div class="top-nav" id="navbar.top">
+<div class="skip-nav"><a href="#skip.navbar.top" title="Skip navigation links">Skip navigation links</a></div>
+<ul id="navbar.top.firstrow" class="nav-list" title="Navigation">
+<li><a href="../sr2/flopbox/package-summary.html">Package</a></li>
+<li>Class</li>
+<li><a href="../overview-tree.html">Tree</a></li>
+<li><a href="../deprecated-list.html">Deprecated</a></li>
+<li class="nav-bar-cell1-rev">Index</li>
+<li><a href="../help-doc.html">Help</a></li>
+</ul>
+</div>
+<div class="sub-nav">
+<div class="nav-list-search"><label for="search">SEARCH:</label>
+<input type="text" id="search" value="search" disabled="disabled">
+<input type="reset" id="reset" value="reset" disabled="disabled">
+</div>
+</div>
+<!-- ========= END OF TOP NAVBAR ========= -->
+<span class="skip-nav" id="skip.navbar.top">
+<!-- -->
+</span></nav>
+</header>
+<div class="flex-content">
+<main role="main">
+<div class="header">
+<h1>Index</h1>
+</div>
+<a href="index-1.html">A</a> <a href="index-2.html">B</a> <a href="index-3.html">C</a> <a href="index-4.html">D</a> <a href="index-5.html">F</a> <a href="index-6.html">G</a> <a href="index-7.html">H</a> <a href="index-8.html">I</a> <a href="index-9.html">L</a> <a href="index-10.html">M</a> <a href="index-11.html">N</a> <a href="index-12.html">P</a> <a href="index-13.html">R</a> <a href="index-14.html">S</a> <a href="index-15.html">T</a> <br><a href="../allclasses-index.html">All Classes</a><span class="vertical-separator">|</span><a href="../allpackages-index.html">All Packages</a>
+<h2 class="title" id="I:N">N</h2>
+<dl class="index">
+<dt><a href="../sr2/flopbox/NoServerFoundException.html" title="class in sr2.flopbox"><span class="type-name-link">NoServerFoundException</span></a> - Exception in <a href="../sr2/flopbox/package-summary.html">sr2.flopbox</a></dt>
+<dd>
+<div class="block">Exception throws if the alias dont refer to server</div>
+</dd>
+<dt><span class="member-name-link"><a href="../sr2/flopbox/NoServerFoundException.html#%3Cinit%3E(java.lang.String)">NoServerFoundException(String)</a></span> - Constructor for exception sr2.flopbox.<a href="../sr2/flopbox/NoServerFoundException.html" title="class in sr2.flopbox">NoServerFoundException</a></dt>
+<dd> </dd>
+</dl>
+<a href="index-1.html">A</a> <a href="index-2.html">B</a> <a href="index-3.html">C</a> <a href="index-4.html">D</a> <a href="index-5.html">F</a> <a href="index-6.html">G</a> <a href="index-7.html">H</a> <a href="index-8.html">I</a> <a href="index-9.html">L</a> <a href="index-10.html">M</a> <a href="index-11.html">N</a> <a href="index-12.html">P</a> <a href="index-13.html">R</a> <a href="index-14.html">S</a> <a href="index-15.html">T</a> <br><a href="../allclasses-index.html">All Classes</a><span class="vertical-separator">|</span><a href="../allpackages-index.html">All Packages</a></main>
+<footer role="contentinfo">
+<nav role="navigation">
+<!-- ======= START OF BOTTOM NAVBAR ====== -->
+<div class="bottom-nav" id="navbar.bottom">
+<div class="skip-nav"><a href="#skip.navbar.bottom" title="Skip navigation links">Skip navigation links</a></div>
+<ul id="navbar.bottom.firstrow" class="nav-list" title="Navigation">
+<li><a href="../sr2/flopbox/package-summary.html">Package</a></li>
+<li>Class</li>
+<li><a href="../overview-tree.html">Tree</a></li>
+<li><a href="../deprecated-list.html">Deprecated</a></li>
+<li class="nav-bar-cell1-rev">Index</li>
+<li><a href="../help-doc.html">Help</a></li>
+</ul>
+</div>
+<!-- ======== END OF BOTTOM NAVBAR ======= -->
+<span class="skip-nav" id="skip.navbar.bottom">
+<!-- -->
+</span></nav>
+</footer>
+</div>
+</div>
+</body>
+</html>
diff --git a/doc/index-files/index-12.html b/doc/index-files/index-12.html
new file mode 100644
index 0000000000000000000000000000000000000000..39a79dcc9a89c97a5751ed116dd516f20f7ce1e2
--- /dev/null
+++ b/doc/index-files/index-12.html
@@ -0,0 +1,84 @@
+<!DOCTYPE HTML>
+<!-- NewPage -->
+<html lang="en">
+<head>
+<!-- Generated by javadoc (15) on Thu Apr 01 01:09:08 CEST 2021 -->
+<title>P-Index</title>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+<meta name="dc.created" content="2021-04-01">
+<meta name="description" content="index: P">
+<meta name="generator" content="javadoc/SplitIndexWriter">
+<link rel="stylesheet" type="text/css" href="../stylesheet.css" title="Style">
+<link rel="stylesheet" type="text/css" href="../script-dir/jquery-ui.min.css" title="Style">
+<link rel="stylesheet" type="text/css" href="../jquery-ui.overrides.css" title="Style">
+<script type="text/javascript" src="../script.js"></script>
+<script type="text/javascript" src="../script-dir/jquery-3.5.1.min.js"></script>
+<script type="text/javascript" src="../script-dir/jquery-ui.min.js"></script>
+</head>
+<body class="split-index-page">
+<script type="text/javascript">var pathtoroot = "../";
+loadScripts(document, 'script');</script>
+<noscript>
+<div>JavaScript is disabled on your browser.</div>
+</noscript>
+<div class="flex-box">
+<header role="banner" class="flex-header">
+<nav role="navigation">
+<!-- ========= START OF TOP NAVBAR ======= -->
+<div class="top-nav" id="navbar.top">
+<div class="skip-nav"><a href="#skip.navbar.top" title="Skip navigation links">Skip navigation links</a></div>
+<ul id="navbar.top.firstrow" class="nav-list" title="Navigation">
+<li><a href="../sr2/flopbox/package-summary.html">Package</a></li>
+<li>Class</li>
+<li><a href="../overview-tree.html">Tree</a></li>
+<li><a href="../deprecated-list.html">Deprecated</a></li>
+<li class="nav-bar-cell1-rev">Index</li>
+<li><a href="../help-doc.html">Help</a></li>
+</ul>
+</div>
+<div class="sub-nav">
+<div class="nav-list-search"><label for="search">SEARCH:</label>
+<input type="text" id="search" value="search" disabled="disabled">
+<input type="reset" id="reset" value="reset" disabled="disabled">
+</div>
+</div>
+<!-- ========= END OF TOP NAVBAR ========= -->
+<span class="skip-nav" id="skip.navbar.top">
+<!-- -->
+</span></nav>
+</header>
+<div class="flex-content">
+<main role="main">
+<div class="header">
+<h1>Index</h1>
+</div>
+<a href="index-1.html">A</a> <a href="index-2.html">B</a> <a href="index-3.html">C</a> <a href="index-4.html">D</a> <a href="index-5.html">F</a> <a href="index-6.html">G</a> <a href="index-7.html">H</a> <a href="index-8.html">I</a> <a href="index-9.html">L</a> <a href="index-10.html">M</a> <a href="index-11.html">N</a> <a href="index-12.html">P</a> <a href="index-13.html">R</a> <a href="index-14.html">S</a> <a href="index-15.html">T</a> <br><a href="../allclasses-index.html">All Classes</a><span class="vertical-separator">|</span><a href="../allpackages-index.html">All Packages</a>
+<h2 class="title" id="I:P">P</h2>
+<dl class="index">
+<dt><span class="member-name-link"><a href="../sr2/flopbox/FtpServer.FtpServerBuilder.html#port(java.lang.String)">port(String)</a></span> - Method in class sr2.flopbox.<a href="../sr2/flopbox/FtpServer.FtpServerBuilder.html" title="class in sr2.flopbox">FtpServer.FtpServerBuilder</a></dt>
+<dd> </dd>
+</dl>
+<a href="index-1.html">A</a> <a href="index-2.html">B</a> <a href="index-3.html">C</a> <a href="index-4.html">D</a> <a href="index-5.html">F</a> <a href="index-6.html">G</a> <a href="index-7.html">H</a> <a href="index-8.html">I</a> <a href="index-9.html">L</a> <a href="index-10.html">M</a> <a href="index-11.html">N</a> <a href="index-12.html">P</a> <a href="index-13.html">R</a> <a href="index-14.html">S</a> <a href="index-15.html">T</a> <br><a href="../allclasses-index.html">All Classes</a><span class="vertical-separator">|</span><a href="../allpackages-index.html">All Packages</a></main>
+<footer role="contentinfo">
+<nav role="navigation">
+<!-- ======= START OF BOTTOM NAVBAR ====== -->
+<div class="bottom-nav" id="navbar.bottom">
+<div class="skip-nav"><a href="#skip.navbar.bottom" title="Skip navigation links">Skip navigation links</a></div>
+<ul id="navbar.bottom.firstrow" class="nav-list" title="Navigation">
+<li><a href="../sr2/flopbox/package-summary.html">Package</a></li>
+<li>Class</li>
+<li><a href="../overview-tree.html">Tree</a></li>
+<li><a href="../deprecated-list.html">Deprecated</a></li>
+<li class="nav-bar-cell1-rev">Index</li>
+<li><a href="../help-doc.html">Help</a></li>
+</ul>
+</div>
+<!-- ======== END OF BOTTOM NAVBAR ======= -->
+<span class="skip-nav" id="skip.navbar.bottom">
+<!-- -->
+</span></nav>
+</footer>
+</div>
+</div>
+</body>
+</html>
diff --git a/doc/index-files/index-13.html b/doc/index-files/index-13.html
new file mode 100644
index 0000000000000000000000000000000000000000..2d332e79e354a5e706a154550bd49ff91a410402
--- /dev/null
+++ b/doc/index-files/index-13.html
@@ -0,0 +1,86 @@
+<!DOCTYPE HTML>
+<!-- NewPage -->
+<html lang="en">
+<head>
+<!-- Generated by javadoc (15) on Thu Apr 01 01:09:08 CEST 2021 -->
+<title>R-Index</title>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+<meta name="dc.created" content="2021-04-01">
+<meta name="description" content="index: R">
+<meta name="generator" content="javadoc/SplitIndexWriter">
+<link rel="stylesheet" type="text/css" href="../stylesheet.css" title="Style">
+<link rel="stylesheet" type="text/css" href="../script-dir/jquery-ui.min.css" title="Style">
+<link rel="stylesheet" type="text/css" href="../jquery-ui.overrides.css" title="Style">
+<script type="text/javascript" src="../script.js"></script>
+<script type="text/javascript" src="../script-dir/jquery-3.5.1.min.js"></script>
+<script type="text/javascript" src="../script-dir/jquery-ui.min.js"></script>
+</head>
+<body class="split-index-page">
+<script type="text/javascript">var pathtoroot = "../";
+loadScripts(document, 'script');</script>
+<noscript>
+<div>JavaScript is disabled on your browser.</div>
+</noscript>
+<div class="flex-box">
+<header role="banner" class="flex-header">
+<nav role="navigation">
+<!-- ========= START OF TOP NAVBAR ======= -->
+<div class="top-nav" id="navbar.top">
+<div class="skip-nav"><a href="#skip.navbar.top" title="Skip navigation links">Skip navigation links</a></div>
+<ul id="navbar.top.firstrow" class="nav-list" title="Navigation">
+<li><a href="../sr2/flopbox/package-summary.html">Package</a></li>
+<li>Class</li>
+<li><a href="../overview-tree.html">Tree</a></li>
+<li><a href="../deprecated-list.html">Deprecated</a></li>
+<li class="nav-bar-cell1-rev">Index</li>
+<li><a href="../help-doc.html">Help</a></li>
+</ul>
+</div>
+<div class="sub-nav">
+<div class="nav-list-search"><label for="search">SEARCH:</label>
+<input type="text" id="search" value="search" disabled="disabled">
+<input type="reset" id="reset" value="reset" disabled="disabled">
+</div>
+</div>
+<!-- ========= END OF TOP NAVBAR ========= -->
+<span class="skip-nav" id="skip.navbar.top">
+<!-- -->
+</span></nav>
+</header>
+<div class="flex-content">
+<main role="main">
+<div class="header">
+<h1>Index</h1>
+</div>
+<a href="index-1.html">A</a> <a href="index-2.html">B</a> <a href="index-3.html">C</a> <a href="index-4.html">D</a> <a href="index-5.html">F</a> <a href="index-6.html">G</a> <a href="index-7.html">H</a> <a href="index-8.html">I</a> <a href="index-9.html">L</a> <a href="index-10.html">M</a> <a href="index-11.html">N</a> <a href="index-12.html">P</a> <a href="index-13.html">R</a> <a href="index-14.html">S</a> <a href="index-15.html">T</a> <br><a href="../allclasses-index.html">All Classes</a><span class="vertical-separator">|</span><a href="../allpackages-index.html">All Packages</a>
+<h2 class="title" id="I:R">R</h2>
+<dl class="index">
+<dt><span class="member-name-link"><a href="../sr2/flopbox/FilesServices.html#rename(java.lang.String,java.lang.String,java.lang.String,java.lang.String)">rename(String, String, String, String)</a></span> - Method in class sr2.flopbox.<a href="../sr2/flopbox/FilesServices.html" title="class in sr2.flopbox">FilesServices</a></dt>
+<dd>
+<div class="block">Method used to rename a file or a repository</div>
+</dd>
+</dl>
+<a href="index-1.html">A</a> <a href="index-2.html">B</a> <a href="index-3.html">C</a> <a href="index-4.html">D</a> <a href="index-5.html">F</a> <a href="index-6.html">G</a> <a href="index-7.html">H</a> <a href="index-8.html">I</a> <a href="index-9.html">L</a> <a href="index-10.html">M</a> <a href="index-11.html">N</a> <a href="index-12.html">P</a> <a href="index-13.html">R</a> <a href="index-14.html">S</a> <a href="index-15.html">T</a> <br><a href="../allclasses-index.html">All Classes</a><span class="vertical-separator">|</span><a href="../allpackages-index.html">All Packages</a></main>
+<footer role="contentinfo">
+<nav role="navigation">
+<!-- ======= START OF BOTTOM NAVBAR ====== -->
+<div class="bottom-nav" id="navbar.bottom">
+<div class="skip-nav"><a href="#skip.navbar.bottom" title="Skip navigation links">Skip navigation links</a></div>
+<ul id="navbar.bottom.firstrow" class="nav-list" title="Navigation">
+<li><a href="../sr2/flopbox/package-summary.html">Package</a></li>
+<li>Class</li>
+<li><a href="../overview-tree.html">Tree</a></li>
+<li><a href="../deprecated-list.html">Deprecated</a></li>
+<li class="nav-bar-cell1-rev">Index</li>
+<li><a href="../help-doc.html">Help</a></li>
+</ul>
+</div>
+<!-- ======== END OF BOTTOM NAVBAR ======= -->
+<span class="skip-nav" id="skip.navbar.bottom">
+<!-- -->
+</span></nav>
+</footer>
+</div>
+</div>
+</body>
+</html>
diff --git a/doc/index-files/index-14.html b/doc/index-files/index-14.html
new file mode 100644
index 0000000000000000000000000000000000000000..7bfe24772c0743b7fceede0c067bbf78537d0968
--- /dev/null
+++ b/doc/index-files/index-14.html
@@ -0,0 +1,90 @@
+<!DOCTYPE HTML>
+<!-- NewPage -->
+<html lang="en">
+<head>
+<!-- Generated by javadoc (15) on Thu Apr 01 01:09:08 CEST 2021 -->
+<title>S-Index</title>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+<meta name="dc.created" content="2021-04-01">
+<meta name="description" content="index: S">
+<meta name="generator" content="javadoc/SplitIndexWriter">
+<link rel="stylesheet" type="text/css" href="../stylesheet.css" title="Style">
+<link rel="stylesheet" type="text/css" href="../script-dir/jquery-ui.min.css" title="Style">
+<link rel="stylesheet" type="text/css" href="../jquery-ui.overrides.css" title="Style">
+<script type="text/javascript" src="../script.js"></script>
+<script type="text/javascript" src="../script-dir/jquery-3.5.1.min.js"></script>
+<script type="text/javascript" src="../script-dir/jquery-ui.min.js"></script>
+</head>
+<body class="split-index-page">
+<script type="text/javascript">var pathtoroot = "../";
+loadScripts(document, 'script');</script>
+<noscript>
+<div>JavaScript is disabled on your browser.</div>
+</noscript>
+<div class="flex-box">
+<header role="banner" class="flex-header">
+<nav role="navigation">
+<!-- ========= START OF TOP NAVBAR ======= -->
+<div class="top-nav" id="navbar.top">
+<div class="skip-nav"><a href="#skip.navbar.top" title="Skip navigation links">Skip navigation links</a></div>
+<ul id="navbar.top.firstrow" class="nav-list" title="Navigation">
+<li><a href="../sr2/flopbox/package-summary.html">Package</a></li>
+<li>Class</li>
+<li><a href="../overview-tree.html">Tree</a></li>
+<li><a href="../deprecated-list.html">Deprecated</a></li>
+<li class="nav-bar-cell1-rev">Index</li>
+<li><a href="../help-doc.html">Help</a></li>
+</ul>
+</div>
+<div class="sub-nav">
+<div class="nav-list-search"><label for="search">SEARCH:</label>
+<input type="text" id="search" value="search" disabled="disabled">
+<input type="reset" id="reset" value="reset" disabled="disabled">
+</div>
+</div>
+<!-- ========= END OF TOP NAVBAR ========= -->
+<span class="skip-nav" id="skip.navbar.top">
+<!-- -->
+</span></nav>
+</header>
+<div class="flex-content">
+<main role="main">
+<div class="header">
+<h1>Index</h1>
+</div>
+<a href="index-1.html">A</a> <a href="index-2.html">B</a> <a href="index-3.html">C</a> <a href="index-4.html">D</a> <a href="index-5.html">F</a> <a href="index-6.html">G</a> <a href="index-7.html">H</a> <a href="index-8.html">I</a> <a href="index-9.html">L</a> <a href="index-10.html">M</a> <a href="index-11.html">N</a> <a href="index-12.html">P</a> <a href="index-13.html">R</a> <a href="index-14.html">S</a> <a href="index-15.html">T</a> <br><a href="../allclasses-index.html">All Classes</a><span class="vertical-separator">|</span><a href="../allpackages-index.html">All Packages</a>
+<h2 class="title" id="I:S">S</h2>
+<dl class="index">
+<dt><span class="member-name-link"><a href="../sr2/flopbox/FtpServer.html#setAlias(java.lang.String)">setAlias(String)</a></span> - Method in class sr2.flopbox.<a href="../sr2/flopbox/FtpServer.html" title="class in sr2.flopbox">FtpServer</a></dt>
+<dd> </dd>
+<dt><a href="../sr2/flopbox/package-summary.html">sr2.flopbox</a> - package sr2.flopbox</dt>
+<dd> </dd>
+<dt><span class="member-name-link"><a href="../sr2/flopbox/Main.html#startServer()">startServer()</a></span> - Static method in class sr2.flopbox.<a href="../sr2/flopbox/Main.html" title="class in sr2.flopbox">Main</a></dt>
+<dd>
+<div class="block">Starts Grizzly HTTP server exposing JAX-RS resources defined in this application.</div>
+</dd>
+</dl>
+<a href="index-1.html">A</a> <a href="index-2.html">B</a> <a href="index-3.html">C</a> <a href="index-4.html">D</a> <a href="index-5.html">F</a> <a href="index-6.html">G</a> <a href="index-7.html">H</a> <a href="index-8.html">I</a> <a href="index-9.html">L</a> <a href="index-10.html">M</a> <a href="index-11.html">N</a> <a href="index-12.html">P</a> <a href="index-13.html">R</a> <a href="index-14.html">S</a> <a href="index-15.html">T</a> <br><a href="../allclasses-index.html">All Classes</a><span class="vertical-separator">|</span><a href="../allpackages-index.html">All Packages</a></main>
+<footer role="contentinfo">
+<nav role="navigation">
+<!-- ======= START OF BOTTOM NAVBAR ====== -->
+<div class="bottom-nav" id="navbar.bottom">
+<div class="skip-nav"><a href="#skip.navbar.bottom" title="Skip navigation links">Skip navigation links</a></div>
+<ul id="navbar.bottom.firstrow" class="nav-list" title="Navigation">
+<li><a href="../sr2/flopbox/package-summary.html">Package</a></li>
+<li>Class</li>
+<li><a href="../overview-tree.html">Tree</a></li>
+<li><a href="../deprecated-list.html">Deprecated</a></li>
+<li class="nav-bar-cell1-rev">Index</li>
+<li><a href="../help-doc.html">Help</a></li>
+</ul>
+</div>
+<!-- ======== END OF BOTTOM NAVBAR ======= -->
+<span class="skip-nav" id="skip.navbar.bottom">
+<!-- -->
+</span></nav>
+</footer>
+</div>
+</div>
+</body>
+</html>
diff --git a/doc/index-files/index-15.html b/doc/index-files/index-15.html
new file mode 100644
index 0000000000000000000000000000000000000000..e015e08213079743bc3802f9a1f086c65aaa4208
--- /dev/null
+++ b/doc/index-files/index-15.html
@@ -0,0 +1,88 @@
+<!DOCTYPE HTML>
+<!-- NewPage -->
+<html lang="en">
+<head>
+<!-- Generated by javadoc (15) on Thu Apr 01 01:09:08 CEST 2021 -->
+<title>T-Index</title>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+<meta name="dc.created" content="2021-04-01">
+<meta name="description" content="index: T">
+<meta name="generator" content="javadoc/SplitIndexWriter">
+<link rel="stylesheet" type="text/css" href="../stylesheet.css" title="Style">
+<link rel="stylesheet" type="text/css" href="../script-dir/jquery-ui.min.css" title="Style">
+<link rel="stylesheet" type="text/css" href="../jquery-ui.overrides.css" title="Style">
+<script type="text/javascript" src="../script.js"></script>
+<script type="text/javascript" src="../script-dir/jquery-3.5.1.min.js"></script>
+<script type="text/javascript" src="../script-dir/jquery-ui.min.js"></script>
+</head>
+<body class="split-index-page">
+<script type="text/javascript">var pathtoroot = "../";
+loadScripts(document, 'script');</script>
+<noscript>
+<div>JavaScript is disabled on your browser.</div>
+</noscript>
+<div class="flex-box">
+<header role="banner" class="flex-header">
+<nav role="navigation">
+<!-- ========= START OF TOP NAVBAR ======= -->
+<div class="top-nav" id="navbar.top">
+<div class="skip-nav"><a href="#skip.navbar.top" title="Skip navigation links">Skip navigation links</a></div>
+<ul id="navbar.top.firstrow" class="nav-list" title="Navigation">
+<li><a href="../sr2/flopbox/package-summary.html">Package</a></li>
+<li>Class</li>
+<li><a href="../overview-tree.html">Tree</a></li>
+<li><a href="../deprecated-list.html">Deprecated</a></li>
+<li class="nav-bar-cell1-rev">Index</li>
+<li><a href="../help-doc.html">Help</a></li>
+</ul>
+</div>
+<div class="sub-nav">
+<div class="nav-list-search"><label for="search">SEARCH:</label>
+<input type="text" id="search" value="search" disabled="disabled">
+<input type="reset" id="reset" value="reset" disabled="disabled">
+</div>
+</div>
+<!-- ========= END OF TOP NAVBAR ========= -->
+<span class="skip-nav" id="skip.navbar.top">
+<!-- -->
+</span></nav>
+</header>
+<div class="flex-content">
+<main role="main">
+<div class="header">
+<h1>Index</h1>
+</div>
+<a href="index-1.html">A</a> <a href="index-2.html">B</a> <a href="index-3.html">C</a> <a href="index-4.html">D</a> <a href="index-5.html">F</a> <a href="index-6.html">G</a> <a href="index-7.html">H</a> <a href="index-8.html">I</a> <a href="index-9.html">L</a> <a href="index-10.html">M</a> <a href="index-11.html">N</a> <a href="index-12.html">P</a> <a href="index-13.html">R</a> <a href="index-14.html">S</a> <a href="index-15.html">T</a> <br><a href="../allclasses-index.html">All Classes</a><span class="vertical-separator">|</span><a href="../allpackages-index.html">All Packages</a>
+<h2 class="title" id="I:T">T</h2>
+<dl class="index">
+<dt><span class="member-name-link"><a href="../sr2/flopbox/FilesServices.html#test(java.lang.String,java.lang.String)">test(String, String)</a></span> - Method in class sr2.flopbox.<a href="../sr2/flopbox/FilesServices.html" title="class in sr2.flopbox">FilesServices</a></dt>
+<dd>
+<div class="block">Method to check is the resource is ok</div>
+</dd>
+<dt><span class="member-name-link"><a href="../sr2/flopbox/FtpServer.html#toString()">toString()</a></span> - Method in class sr2.flopbox.<a href="../sr2/flopbox/FtpServer.html" title="class in sr2.flopbox">FtpServer</a></dt>
+<dd> </dd>
+</dl>
+<a href="index-1.html">A</a> <a href="index-2.html">B</a> <a href="index-3.html">C</a> <a href="index-4.html">D</a> <a href="index-5.html">F</a> <a href="index-6.html">G</a> <a href="index-7.html">H</a> <a href="index-8.html">I</a> <a href="index-9.html">L</a> <a href="index-10.html">M</a> <a href="index-11.html">N</a> <a href="index-12.html">P</a> <a href="index-13.html">R</a> <a href="index-14.html">S</a> <a href="index-15.html">T</a> <br><a href="../allclasses-index.html">All Classes</a><span class="vertical-separator">|</span><a href="../allpackages-index.html">All Packages</a></main>
+<footer role="contentinfo">
+<nav role="navigation">
+<!-- ======= START OF BOTTOM NAVBAR ====== -->
+<div class="bottom-nav" id="navbar.bottom">
+<div class="skip-nav"><a href="#skip.navbar.bottom" title="Skip navigation links">Skip navigation links</a></div>
+<ul id="navbar.bottom.firstrow" class="nav-list" title="Navigation">
+<li><a href="../sr2/flopbox/package-summary.html">Package</a></li>
+<li>Class</li>
+<li><a href="../overview-tree.html">Tree</a></li>
+<li><a href="../deprecated-list.html">Deprecated</a></li>
+<li class="nav-bar-cell1-rev">Index</li>
+<li><a href="../help-doc.html">Help</a></li>
+</ul>
+</div>
+<!-- ======== END OF BOTTOM NAVBAR ======= -->
+<span class="skip-nav" id="skip.navbar.bottom">
+<!-- -->
+</span></nav>
+</footer>
+</div>
+</div>
+</body>
+</html>
diff --git a/doc/index-files/index-2.html b/doc/index-files/index-2.html
new file mode 100644
index 0000000000000000000000000000000000000000..72c5b28631951984e6283db6ab22d9ec8e6f4e06
--- /dev/null
+++ b/doc/index-files/index-2.html
@@ -0,0 +1,88 @@
+<!DOCTYPE HTML>
+<!-- NewPage -->
+<html lang="en">
+<head>
+<!-- Generated by javadoc (15) on Thu Apr 01 01:09:08 CEST 2021 -->
+<title>B-Index</title>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+<meta name="dc.created" content="2021-04-01">
+<meta name="description" content="index: B">
+<meta name="generator" content="javadoc/SplitIndexWriter">
+<link rel="stylesheet" type="text/css" href="../stylesheet.css" title="Style">
+<link rel="stylesheet" type="text/css" href="../script-dir/jquery-ui.min.css" title="Style">
+<link rel="stylesheet" type="text/css" href="../jquery-ui.overrides.css" title="Style">
+<script type="text/javascript" src="../script.js"></script>
+<script type="text/javascript" src="../script-dir/jquery-3.5.1.min.js"></script>
+<script type="text/javascript" src="../script-dir/jquery-ui.min.js"></script>
+</head>
+<body class="split-index-page">
+<script type="text/javascript">var pathtoroot = "../";
+loadScripts(document, 'script');</script>
+<noscript>
+<div>JavaScript is disabled on your browser.</div>
+</noscript>
+<div class="flex-box">
+<header role="banner" class="flex-header">
+<nav role="navigation">
+<!-- ========= START OF TOP NAVBAR ======= -->
+<div class="top-nav" id="navbar.top">
+<div class="skip-nav"><a href="#skip.navbar.top" title="Skip navigation links">Skip navigation links</a></div>
+<ul id="navbar.top.firstrow" class="nav-list" title="Navigation">
+<li><a href="../sr2/flopbox/package-summary.html">Package</a></li>
+<li>Class</li>
+<li><a href="../overview-tree.html">Tree</a></li>
+<li><a href="../deprecated-list.html">Deprecated</a></li>
+<li class="nav-bar-cell1-rev">Index</li>
+<li><a href="../help-doc.html">Help</a></li>
+</ul>
+</div>
+<div class="sub-nav">
+<div class="nav-list-search"><label for="search">SEARCH:</label>
+<input type="text" id="search" value="search" disabled="disabled">
+<input type="reset" id="reset" value="reset" disabled="disabled">
+</div>
+</div>
+<!-- ========= END OF TOP NAVBAR ========= -->
+<span class="skip-nav" id="skip.navbar.top">
+<!-- -->
+</span></nav>
+</header>
+<div class="flex-content">
+<main role="main">
+<div class="header">
+<h1>Index</h1>
+</div>
+<a href="index-1.html">A</a> <a href="index-2.html">B</a> <a href="index-3.html">C</a> <a href="index-4.html">D</a> <a href="index-5.html">F</a> <a href="index-6.html">G</a> <a href="index-7.html">H</a> <a href="index-8.html">I</a> <a href="index-9.html">L</a> <a href="index-10.html">M</a> <a href="index-11.html">N</a> <a href="index-12.html">P</a> <a href="index-13.html">R</a> <a href="index-14.html">S</a> <a href="index-15.html">T</a> <br><a href="../allclasses-index.html">All Classes</a><span class="vertical-separator">|</span><a href="../allpackages-index.html">All Packages</a>
+<h2 class="title" id="I:B">B</h2>
+<dl class="index">
+<dt><span class="member-name-link"><a href="../sr2/flopbox/Main.html#BASE_URI">BASE_URI</a></span> - Static variable in class sr2.flopbox.<a href="../sr2/flopbox/Main.html" title="class in sr2.flopbox">Main</a></dt>
+<dd> </dd>
+<dt><span class="member-name-link"><a href="../sr2/flopbox/FtpServer.FtpServerBuilder.html#build()">build()</a></span> - Method in class sr2.flopbox.<a href="../sr2/flopbox/FtpServer.FtpServerBuilder.html" title="class in sr2.flopbox">FtpServer.FtpServerBuilder</a></dt>
+<dd>
+<div class="block">Building method</div>
+</dd>
+</dl>
+<a href="index-1.html">A</a> <a href="index-2.html">B</a> <a href="index-3.html">C</a> <a href="index-4.html">D</a> <a href="index-5.html">F</a> <a href="index-6.html">G</a> <a href="index-7.html">H</a> <a href="index-8.html">I</a> <a href="index-9.html">L</a> <a href="index-10.html">M</a> <a href="index-11.html">N</a> <a href="index-12.html">P</a> <a href="index-13.html">R</a> <a href="index-14.html">S</a> <a href="index-15.html">T</a> <br><a href="../allclasses-index.html">All Classes</a><span class="vertical-separator">|</span><a href="../allpackages-index.html">All Packages</a></main>
+<footer role="contentinfo">
+<nav role="navigation">
+<!-- ======= START OF BOTTOM NAVBAR ====== -->
+<div class="bottom-nav" id="navbar.bottom">
+<div class="skip-nav"><a href="#skip.navbar.bottom" title="Skip navigation links">Skip navigation links</a></div>
+<ul id="navbar.bottom.firstrow" class="nav-list" title="Navigation">
+<li><a href="../sr2/flopbox/package-summary.html">Package</a></li>
+<li>Class</li>
+<li><a href="../overview-tree.html">Tree</a></li>
+<li><a href="../deprecated-list.html">Deprecated</a></li>
+<li class="nav-bar-cell1-rev">Index</li>
+<li><a href="../help-doc.html">Help</a></li>
+</ul>
+</div>
+<!-- ======== END OF BOTTOM NAVBAR ======= -->
+<span class="skip-nav" id="skip.navbar.bottom">
+<!-- -->
+</span></nav>
+</footer>
+</div>
+</div>
+</body>
+</html>
diff --git a/doc/index-files/index-3.html b/doc/index-files/index-3.html
new file mode 100644
index 0000000000000000000000000000000000000000..facc7f524dff2824da1a48d80924a56f73dc2951
--- /dev/null
+++ b/doc/index-files/index-3.html
@@ -0,0 +1,94 @@
+<!DOCTYPE HTML>
+<!-- NewPage -->
+<html lang="en">
+<head>
+<!-- Generated by javadoc (15) on Thu Apr 01 01:09:08 CEST 2021 -->
+<title>C-Index</title>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+<meta name="dc.created" content="2021-04-01">
+<meta name="description" content="index: C">
+<meta name="generator" content="javadoc/SplitIndexWriter">
+<link rel="stylesheet" type="text/css" href="../stylesheet.css" title="Style">
+<link rel="stylesheet" type="text/css" href="../script-dir/jquery-ui.min.css" title="Style">
+<link rel="stylesheet" type="text/css" href="../jquery-ui.overrides.css" title="Style">
+<script type="text/javascript" src="../script.js"></script>
+<script type="text/javascript" src="../script-dir/jquery-3.5.1.min.js"></script>
+<script type="text/javascript" src="../script-dir/jquery-ui.min.js"></script>
+</head>
+<body class="split-index-page">
+<script type="text/javascript">var pathtoroot = "../";
+loadScripts(document, 'script');</script>
+<noscript>
+<div>JavaScript is disabled on your browser.</div>
+</noscript>
+<div class="flex-box">
+<header role="banner" class="flex-header">
+<nav role="navigation">
+<!-- ========= START OF TOP NAVBAR ======= -->
+<div class="top-nav" id="navbar.top">
+<div class="skip-nav"><a href="#skip.navbar.top" title="Skip navigation links">Skip navigation links</a></div>
+<ul id="navbar.top.firstrow" class="nav-list" title="Navigation">
+<li><a href="../sr2/flopbox/package-summary.html">Package</a></li>
+<li>Class</li>
+<li><a href="../overview-tree.html">Tree</a></li>
+<li><a href="../deprecated-list.html">Deprecated</a></li>
+<li class="nav-bar-cell1-rev">Index</li>
+<li><a href="../help-doc.html">Help</a></li>
+</ul>
+</div>
+<div class="sub-nav">
+<div class="nav-list-search"><label for="search">SEARCH:</label>
+<input type="text" id="search" value="search" disabled="disabled">
+<input type="reset" id="reset" value="reset" disabled="disabled">
+</div>
+</div>
+<!-- ========= END OF TOP NAVBAR ========= -->
+<span class="skip-nav" id="skip.navbar.top">
+<!-- -->
+</span></nav>
+</header>
+<div class="flex-content">
+<main role="main">
+<div class="header">
+<h1>Index</h1>
+</div>
+<a href="index-1.html">A</a> <a href="index-2.html">B</a> <a href="index-3.html">C</a> <a href="index-4.html">D</a> <a href="index-5.html">F</a> <a href="index-6.html">G</a> <a href="index-7.html">H</a> <a href="index-8.html">I</a> <a href="index-9.html">L</a> <a href="index-10.html">M</a> <a href="index-11.html">N</a> <a href="index-12.html">P</a> <a href="index-13.html">R</a> <a href="index-14.html">S</a> <a href="index-15.html">T</a> <br><a href="../allclasses-index.html">All Classes</a><span class="vertical-separator">|</span><a href="../allpackages-index.html">All Packages</a>
+<h2 class="title" id="I:C">C</h2>
+<dl class="index">
+<dt><a href="../sr2/flopbox/cantConnectToServerException.html" title="class in sr2.flopbox"><span class="type-name-link">cantConnectToServerException</span></a> - Exception in <a href="../sr2/flopbox/package-summary.html">sr2.flopbox</a></dt>
+<dd> </dd>
+<dt><span class="member-name-link"><a href="../sr2/flopbox/cantConnectToServerException.html#%3Cinit%3E(java.lang.String)">cantConnectToServerException(String)</a></span> - Constructor for exception sr2.flopbox.<a href="../sr2/flopbox/cantConnectToServerException.html" title="class in sr2.flopbox">cantConnectToServerException</a></dt>
+<dd> </dd>
+<dt><span class="member-name-link"><a href="../sr2/flopbox/FtpServerService.html#changeAlias(java.lang.String,java.lang.String,java.lang.String)">changeAlias(String, String, String)</a></span> - Method in class sr2.flopbox.<a href="../sr2/flopbox/FtpServerService.html" title="class in sr2.flopbox">FtpServerService</a></dt>
+<dd>
+<div class="block">Method to change a alias of a FTP server</div>
+</dd>
+<dt><span class="member-name-link"><a href="../sr2/flopbox/FtpServer.html#checkIfUserExist(int)">checkIfUserExist(int)</a></span> - Method in class sr2.flopbox.<a href="../sr2/flopbox/FtpServer.html" title="class in sr2.flopbox">FtpServer</a></dt>
+<dd>
+<div class="block">check if an user exist for the server from his token</div>
+</dd>
+</dl>
+<a href="index-1.html">A</a> <a href="index-2.html">B</a> <a href="index-3.html">C</a> <a href="index-4.html">D</a> <a href="index-5.html">F</a> <a href="index-6.html">G</a> <a href="index-7.html">H</a> <a href="index-8.html">I</a> <a href="index-9.html">L</a> <a href="index-10.html">M</a> <a href="index-11.html">N</a> <a href="index-12.html">P</a> <a href="index-13.html">R</a> <a href="index-14.html">S</a> <a href="index-15.html">T</a> <br><a href="../allclasses-index.html">All Classes</a><span class="vertical-separator">|</span><a href="../allpackages-index.html">All Packages</a></main>
+<footer role="contentinfo">
+<nav role="navigation">
+<!-- ======= START OF BOTTOM NAVBAR ====== -->
+<div class="bottom-nav" id="navbar.bottom">
+<div class="skip-nav"><a href="#skip.navbar.bottom" title="Skip navigation links">Skip navigation links</a></div>
+<ul id="navbar.bottom.firstrow" class="nav-list" title="Navigation">
+<li><a href="../sr2/flopbox/package-summary.html">Package</a></li>
+<li>Class</li>
+<li><a href="../overview-tree.html">Tree</a></li>
+<li><a href="../deprecated-list.html">Deprecated</a></li>
+<li class="nav-bar-cell1-rev">Index</li>
+<li><a href="../help-doc.html">Help</a></li>
+</ul>
+</div>
+<!-- ======== END OF BOTTOM NAVBAR ======= -->
+<span class="skip-nav" id="skip.navbar.bottom">
+<!-- -->
+</span></nav>
+</footer>
+</div>
+</div>
+</body>
+</html>
diff --git a/doc/index-files/index-4.html b/doc/index-files/index-4.html
new file mode 100644
index 0000000000000000000000000000000000000000..905e47ede911c211e2e9e68fc49cdf7d10e0adf8
--- /dev/null
+++ b/doc/index-files/index-4.html
@@ -0,0 +1,86 @@
+<!DOCTYPE HTML>
+<!-- NewPage -->
+<html lang="en">
+<head>
+<!-- Generated by javadoc (15) on Thu Apr 01 01:09:08 CEST 2021 -->
+<title>D-Index</title>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+<meta name="dc.created" content="2021-04-01">
+<meta name="description" content="index: D">
+<meta name="generator" content="javadoc/SplitIndexWriter">
+<link rel="stylesheet" type="text/css" href="../stylesheet.css" title="Style">
+<link rel="stylesheet" type="text/css" href="../script-dir/jquery-ui.min.css" title="Style">
+<link rel="stylesheet" type="text/css" href="../jquery-ui.overrides.css" title="Style">
+<script type="text/javascript" src="../script.js"></script>
+<script type="text/javascript" src="../script-dir/jquery-3.5.1.min.js"></script>
+<script type="text/javascript" src="../script-dir/jquery-ui.min.js"></script>
+</head>
+<body class="split-index-page">
+<script type="text/javascript">var pathtoroot = "../";
+loadScripts(document, 'script');</script>
+<noscript>
+<div>JavaScript is disabled on your browser.</div>
+</noscript>
+<div class="flex-box">
+<header role="banner" class="flex-header">
+<nav role="navigation">
+<!-- ========= START OF TOP NAVBAR ======= -->
+<div class="top-nav" id="navbar.top">
+<div class="skip-nav"><a href="#skip.navbar.top" title="Skip navigation links">Skip navigation links</a></div>
+<ul id="navbar.top.firstrow" class="nav-list" title="Navigation">
+<li><a href="../sr2/flopbox/package-summary.html">Package</a></li>
+<li>Class</li>
+<li><a href="../overview-tree.html">Tree</a></li>
+<li><a href="../deprecated-list.html">Deprecated</a></li>
+<li class="nav-bar-cell1-rev">Index</li>
+<li><a href="../help-doc.html">Help</a></li>
+</ul>
+</div>
+<div class="sub-nav">
+<div class="nav-list-search"><label for="search">SEARCH:</label>
+<input type="text" id="search" value="search" disabled="disabled">
+<input type="reset" id="reset" value="reset" disabled="disabled">
+</div>
+</div>
+<!-- ========= END OF TOP NAVBAR ========= -->
+<span class="skip-nav" id="skip.navbar.top">
+<!-- -->
+</span></nav>
+</header>
+<div class="flex-content">
+<main role="main">
+<div class="header">
+<h1>Index</h1>
+</div>
+<a href="index-1.html">A</a> <a href="index-2.html">B</a> <a href="index-3.html">C</a> <a href="index-4.html">D</a> <a href="index-5.html">F</a> <a href="index-6.html">G</a> <a href="index-7.html">H</a> <a href="index-8.html">I</a> <a href="index-9.html">L</a> <a href="index-10.html">M</a> <a href="index-11.html">N</a> <a href="index-12.html">P</a> <a href="index-13.html">R</a> <a href="index-14.html">S</a> <a href="index-15.html">T</a> <br><a href="../allclasses-index.html">All Classes</a><span class="vertical-separator">|</span><a href="../allpackages-index.html">All Packages</a>
+<h2 class="title" id="I:D">D</h2>
+<dl class="index">
+<dt><span class="member-name-link"><a href="../sr2/flopbox/FilesServices.html#delete(java.lang.String,java.lang.String,java.lang.String)">delete(String, String, String)</a></span> - Method in class sr2.flopbox.<a href="../sr2/flopbox/FilesServices.html" title="class in sr2.flopbox">FilesServices</a></dt>
+<dd>
+<div class="block">method used to delete any file or repository of the server 'alias'</div>
+</dd>
+</dl>
+<a href="index-1.html">A</a> <a href="index-2.html">B</a> <a href="index-3.html">C</a> <a href="index-4.html">D</a> <a href="index-5.html">F</a> <a href="index-6.html">G</a> <a href="index-7.html">H</a> <a href="index-8.html">I</a> <a href="index-9.html">L</a> <a href="index-10.html">M</a> <a href="index-11.html">N</a> <a href="index-12.html">P</a> <a href="index-13.html">R</a> <a href="index-14.html">S</a> <a href="index-15.html">T</a> <br><a href="../allclasses-index.html">All Classes</a><span class="vertical-separator">|</span><a href="../allpackages-index.html">All Packages</a></main>
+<footer role="contentinfo">
+<nav role="navigation">
+<!-- ======= START OF BOTTOM NAVBAR ====== -->
+<div class="bottom-nav" id="navbar.bottom">
+<div class="skip-nav"><a href="#skip.navbar.bottom" title="Skip navigation links">Skip navigation links</a></div>
+<ul id="navbar.bottom.firstrow" class="nav-list" title="Navigation">
+<li><a href="../sr2/flopbox/package-summary.html">Package</a></li>
+<li>Class</li>
+<li><a href="../overview-tree.html">Tree</a></li>
+<li><a href="../deprecated-list.html">Deprecated</a></li>
+<li class="nav-bar-cell1-rev">Index</li>
+<li><a href="../help-doc.html">Help</a></li>
+</ul>
+</div>
+<!-- ======== END OF BOTTOM NAVBAR ======= -->
+<span class="skip-nav" id="skip.navbar.bottom">
+<!-- -->
+</span></nav>
+</footer>
+</div>
+</div>
+</body>
+</html>
diff --git a/doc/index-files/index-5.html b/doc/index-files/index-5.html
new file mode 100644
index 0000000000000000000000000000000000000000..404e6cefd2dc49fbcd06be180f3a8049ffa3483c
--- /dev/null
+++ b/doc/index-files/index-5.html
@@ -0,0 +1,116 @@
+<!DOCTYPE HTML>
+<!-- NewPage -->
+<html lang="en">
+<head>
+<!-- Generated by javadoc (15) on Thu Apr 01 01:09:08 CEST 2021 -->
+<title>F-Index</title>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+<meta name="dc.created" content="2021-04-01">
+<meta name="description" content="index: F">
+<meta name="generator" content="javadoc/SplitIndexWriter">
+<link rel="stylesheet" type="text/css" href="../stylesheet.css" title="Style">
+<link rel="stylesheet" type="text/css" href="../script-dir/jquery-ui.min.css" title="Style">
+<link rel="stylesheet" type="text/css" href="../jquery-ui.overrides.css" title="Style">
+<script type="text/javascript" src="../script.js"></script>
+<script type="text/javascript" src="../script-dir/jquery-3.5.1.min.js"></script>
+<script type="text/javascript" src="../script-dir/jquery-ui.min.js"></script>
+</head>
+<body class="split-index-page">
+<script type="text/javascript">var pathtoroot = "../";
+loadScripts(document, 'script');</script>
+<noscript>
+<div>JavaScript is disabled on your browser.</div>
+</noscript>
+<div class="flex-box">
+<header role="banner" class="flex-header">
+<nav role="navigation">
+<!-- ========= START OF TOP NAVBAR ======= -->
+<div class="top-nav" id="navbar.top">
+<div class="skip-nav"><a href="#skip.navbar.top" title="Skip navigation links">Skip navigation links</a></div>
+<ul id="navbar.top.firstrow" class="nav-list" title="Navigation">
+<li><a href="../sr2/flopbox/package-summary.html">Package</a></li>
+<li>Class</li>
+<li><a href="../overview-tree.html">Tree</a></li>
+<li><a href="../deprecated-list.html">Deprecated</a></li>
+<li class="nav-bar-cell1-rev">Index</li>
+<li><a href="../help-doc.html">Help</a></li>
+</ul>
+</div>
+<div class="sub-nav">
+<div class="nav-list-search"><label for="search">SEARCH:</label>
+<input type="text" id="search" value="search" disabled="disabled">
+<input type="reset" id="reset" value="reset" disabled="disabled">
+</div>
+</div>
+<!-- ========= END OF TOP NAVBAR ========= -->
+<span class="skip-nav" id="skip.navbar.top">
+<!-- -->
+</span></nav>
+</header>
+<div class="flex-content">
+<main role="main">
+<div class="header">
+<h1>Index</h1>
+</div>
+<a href="index-1.html">A</a> <a href="index-2.html">B</a> <a href="index-3.html">C</a> <a href="index-4.html">D</a> <a href="index-5.html">F</a> <a href="index-6.html">G</a> <a href="index-7.html">H</a> <a href="index-8.html">I</a> <a href="index-9.html">L</a> <a href="index-10.html">M</a> <a href="index-11.html">N</a> <a href="index-12.html">P</a> <a href="index-13.html">R</a> <a href="index-14.html">S</a> <a href="index-15.html">T</a> <br><a href="../allclasses-index.html">All Classes</a><span class="vertical-separator">|</span><a href="../allpackages-index.html">All Packages</a>
+<h2 class="title" id="I:F">F</h2>
+<dl class="index">
+<dt><a href="../sr2/flopbox/FileDoesNotExistException.html" title="class in sr2.flopbox"><span class="type-name-link">FileDoesNotExistException</span></a> - Exception in <a href="../sr2/flopbox/package-summary.html">sr2.flopbox</a></dt>
+<dd> </dd>
+<dt><span class="member-name-link"><a href="../sr2/flopbox/FileDoesNotExistException.html#%3Cinit%3E(java.lang.String)">FileDoesNotExistException(String)</a></span> - Constructor for exception sr2.flopbox.<a href="../sr2/flopbox/FileDoesNotExistException.html" title="class in sr2.flopbox">FileDoesNotExistException</a></dt>
+<dd> </dd>
+<dt><a href="../sr2/flopbox/FilesServices.html" title="class in sr2.flopbox"><span class="type-name-link">FilesServices</span></a> - Class in <a href="../sr2/flopbox/package-summary.html">sr2.flopbox</a></dt>
+<dd> </dd>
+<dt><span class="member-name-link"><a href="../sr2/flopbox/FilesServices.html#%3Cinit%3E()">FilesServices()</a></span> - Constructor for class sr2.flopbox.<a href="../sr2/flopbox/FilesServices.html" title="class in sr2.flopbox">FilesServices</a></dt>
+<dd> </dd>
+<dt><a href="../sr2/flopbox/FtpServer.html" title="class in sr2.flopbox"><span class="type-name-link">FtpServer</span></a> - Class in <a href="../sr2/flopbox/package-summary.html">sr2.flopbox</a></dt>
+<dd> </dd>
+<dt><span class="member-name-link"><a href="../sr2/flopbox/FtpServer.html#%3Cinit%3E()">FtpServer()</a></span> - Constructor for class sr2.flopbox.<a href="../sr2/flopbox/FtpServer.html" title="class in sr2.flopbox">FtpServer</a></dt>
+<dd>
+<div class="block">Constructor from a builder for the class</div>
+</dd>
+<dt><span class="member-name-link"><a href="../sr2/flopbox/FtpServer.html#%3Cinit%3E(long,java.lang.String,java.lang.String,java.lang.String)">FtpServer(long, String, String, String)</a></span> - Constructor for class sr2.flopbox.<a href="../sr2/flopbox/FtpServer.html" title="class in sr2.flopbox">FtpServer</a></dt>
+<dd>
+<div class="block">classic constructor for this class</div>
+</dd>
+<dt><a href="../sr2/flopbox/FtpServer.FtpServerBuilder.html" title="class in sr2.flopbox"><span class="type-name-link">FtpServer.FtpServerBuilder</span></a> - Class in <a href="../sr2/flopbox/package-summary.html">sr2.flopbox</a></dt>
+<dd>
+<div class="block">Constructor of a FTP client builder</div>
+</dd>
+<dt><span class="member-name-link"><a href="../sr2/flopbox/FtpServer.FtpServerBuilder.html#%3Cinit%3E()">FtpServerBuilder()</a></span> - Constructor for class sr2.flopbox.<a href="../sr2/flopbox/FtpServer.FtpServerBuilder.html" title="class in sr2.flopbox">FtpServer.FtpServerBuilder</a></dt>
+<dd> </dd>
+<dt><a href="../sr2/flopbox/FtpServerList.html" title="class in sr2.flopbox"><span class="type-name-link">FtpServerList</span></a> - Class in <a href="../sr2/flopbox/package-summary.html">sr2.flopbox</a></dt>
+<dd> </dd>
+<dt><span class="member-name-link"><a href="../sr2/flopbox/FtpServerList.html#%3Cinit%3E()">FtpServerList()</a></span> - Constructor for class sr2.flopbox.<a href="../sr2/flopbox/FtpServerList.html" title="class in sr2.flopbox">FtpServerList</a></dt>
+<dd> </dd>
+<dt><a href="../sr2/flopbox/FtpServerService.html" title="class in sr2.flopbox"><span class="type-name-link">FtpServerService</span></a> - Class in <a href="../sr2/flopbox/package-summary.html">sr2.flopbox</a></dt>
+<dd> </dd>
+<dt><span class="member-name-link"><a href="../sr2/flopbox/FtpServerService.html#%3Cinit%3E()">FtpServerService()</a></span> - Constructor for class sr2.flopbox.<a href="../sr2/flopbox/FtpServerService.html" title="class in sr2.flopbox">FtpServerService</a></dt>
+<dd> </dd>
+<dt><span class="member-name-link"><a href="../sr2/flopbox/Main.html#FTPtool">FTPtool</a></span> - Static variable in class sr2.flopbox.<a href="../sr2/flopbox/Main.html" title="class in sr2.flopbox">Main</a></dt>
+<dd> </dd>
+</dl>
+<a href="index-1.html">A</a> <a href="index-2.html">B</a> <a href="index-3.html">C</a> <a href="index-4.html">D</a> <a href="index-5.html">F</a> <a href="index-6.html">G</a> <a href="index-7.html">H</a> <a href="index-8.html">I</a> <a href="index-9.html">L</a> <a href="index-10.html">M</a> <a href="index-11.html">N</a> <a href="index-12.html">P</a> <a href="index-13.html">R</a> <a href="index-14.html">S</a> <a href="index-15.html">T</a> <br><a href="../allclasses-index.html">All Classes</a><span class="vertical-separator">|</span><a href="../allpackages-index.html">All Packages</a></main>
+<footer role="contentinfo">
+<nav role="navigation">
+<!-- ======= START OF BOTTOM NAVBAR ====== -->
+<div class="bottom-nav" id="navbar.bottom">
+<div class="skip-nav"><a href="#skip.navbar.bottom" title="Skip navigation links">Skip navigation links</a></div>
+<ul id="navbar.bottom.firstrow" class="nav-list" title="Navigation">
+<li><a href="../sr2/flopbox/package-summary.html">Package</a></li>
+<li>Class</li>
+<li><a href="../overview-tree.html">Tree</a></li>
+<li><a href="../deprecated-list.html">Deprecated</a></li>
+<li class="nav-bar-cell1-rev">Index</li>
+<li><a href="../help-doc.html">Help</a></li>
+</ul>
+</div>
+<!-- ======== END OF BOTTOM NAVBAR ======= -->
+<span class="skip-nav" id="skip.navbar.bottom">
+<!-- -->
+</span></nav>
+</footer>
+</div>
+</div>
+</body>
+</html>
diff --git a/doc/index-files/index-6.html b/doc/index-files/index-6.html
new file mode 100644
index 0000000000000000000000000000000000000000..80cb617c33d93c9d481ac6e6bd30d67f0ad7d7c6
--- /dev/null
+++ b/doc/index-files/index-6.html
@@ -0,0 +1,104 @@
+<!DOCTYPE HTML>
+<!-- NewPage -->
+<html lang="en">
+<head>
+<!-- Generated by javadoc (15) on Thu Apr 01 01:09:08 CEST 2021 -->
+<title>G-Index</title>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+<meta name="dc.created" content="2021-04-01">
+<meta name="description" content="index: G">
+<meta name="generator" content="javadoc/SplitIndexWriter">
+<link rel="stylesheet" type="text/css" href="../stylesheet.css" title="Style">
+<link rel="stylesheet" type="text/css" href="../script-dir/jquery-ui.min.css" title="Style">
+<link rel="stylesheet" type="text/css" href="../jquery-ui.overrides.css" title="Style">
+<script type="text/javascript" src="../script.js"></script>
+<script type="text/javascript" src="../script-dir/jquery-3.5.1.min.js"></script>
+<script type="text/javascript" src="../script-dir/jquery-ui.min.js"></script>
+</head>
+<body class="split-index-page">
+<script type="text/javascript">var pathtoroot = "../";
+loadScripts(document, 'script');</script>
+<noscript>
+<div>JavaScript is disabled on your browser.</div>
+</noscript>
+<div class="flex-box">
+<header role="banner" class="flex-header">
+<nav role="navigation">
+<!-- ========= START OF TOP NAVBAR ======= -->
+<div class="top-nav" id="navbar.top">
+<div class="skip-nav"><a href="#skip.navbar.top" title="Skip navigation links">Skip navigation links</a></div>
+<ul id="navbar.top.firstrow" class="nav-list" title="Navigation">
+<li><a href="../sr2/flopbox/package-summary.html">Package</a></li>
+<li>Class</li>
+<li><a href="../overview-tree.html">Tree</a></li>
+<li><a href="../deprecated-list.html">Deprecated</a></li>
+<li class="nav-bar-cell1-rev">Index</li>
+<li><a href="../help-doc.html">Help</a></li>
+</ul>
+</div>
+<div class="sub-nav">
+<div class="nav-list-search"><label for="search">SEARCH:</label>
+<input type="text" id="search" value="search" disabled="disabled">
+<input type="reset" id="reset" value="reset" disabled="disabled">
+</div>
+</div>
+<!-- ========= END OF TOP NAVBAR ========= -->
+<span class="skip-nav" id="skip.navbar.top">
+<!-- -->
+</span></nav>
+</header>
+<div class="flex-content">
+<main role="main">
+<div class="header">
+<h1>Index</h1>
+</div>
+<a href="index-1.html">A</a> <a href="index-2.html">B</a> <a href="index-3.html">C</a> <a href="index-4.html">D</a> <a href="index-5.html">F</a> <a href="index-6.html">G</a> <a href="index-7.html">H</a> <a href="index-8.html">I</a> <a href="index-9.html">L</a> <a href="index-10.html">M</a> <a href="index-11.html">N</a> <a href="index-12.html">P</a> <a href="index-13.html">R</a> <a href="index-14.html">S</a> <a href="index-15.html">T</a> <br><a href="../allclasses-index.html">All Classes</a><span class="vertical-separator">|</span><a href="../allpackages-index.html">All Packages</a>
+<h2 class="title" id="I:G">G</h2>
+<dl class="index">
+<dt><span class="member-name-link"><a href="../sr2/flopbox/FtpServer.html#getAlias()">getAlias()</a></span> - Method in class sr2.flopbox.<a href="../sr2/flopbox/FtpServer.html" title="class in sr2.flopbox">FtpServer</a></dt>
+<dd> </dd>
+<dt><span class="member-name-link"><a href="../sr2/flopbox/FtpServerService.html#getAllFTPServers()">getAllFTPServers()</a></span> - Method in class sr2.flopbox.<a href="../sr2/flopbox/FtpServerService.html" title="class in sr2.flopbox">FtpServerService</a></dt>
+<dd>
+<div class="block">method that return all the FTP server know by the API</div>
+</dd>
+<dt><span class="member-name-link"><a href="../sr2/flopbox/FtpServer.html#getHost()">getHost()</a></span> - Method in class sr2.flopbox.<a href="../sr2/flopbox/FtpServer.html" title="class in sr2.flopbox">FtpServer</a></dt>
+<dd> </dd>
+<dt><span class="member-name-link"><a href="../sr2/flopbox/FtpServer.html#getId()">getId()</a></span> - Method in class sr2.flopbox.<a href="../sr2/flopbox/FtpServer.html" title="class in sr2.flopbox">FtpServer</a></dt>
+<dd> </dd>
+<dt><span class="member-name-link"><a href="../sr2/flopbox/FtpServerList.html#getInstance()">getInstance()</a></span> - Static method in class sr2.flopbox.<a href="../sr2/flopbox/FtpServerList.html" title="class in sr2.flopbox">FtpServerList</a></dt>
+<dd> </dd>
+<dt><span class="member-name-link"><a href="../sr2/flopbox/FtpServer.html#getPort()">getPort()</a></span> - Method in class sr2.flopbox.<a href="../sr2/flopbox/FtpServer.html" title="class in sr2.flopbox">FtpServer</a></dt>
+<dd> </dd>
+<dt><span class="member-name-link"><a href="../sr2/flopbox/FtpServerService.html#getServer(java.lang.String)">getServer(String)</a></span> - Method in class sr2.flopbox.<a href="../sr2/flopbox/FtpServerService.html" title="class in sr2.flopbox">FtpServerService</a></dt>
+<dd>
+<div class="block">Method that gives information about one FTP server</div>
+</dd>
+<dt><span class="member-name-link"><a href="../sr2/flopbox/FtpServer.html#getUserAndPass(int)">getUserAndPass(int)</a></span> - Method in class sr2.flopbox.<a href="../sr2/flopbox/FtpServer.html" title="class in sr2.flopbox">FtpServer</a></dt>
+<dd>
+<div class="block">Getter for the user name and password of a client</div>
+</dd>
+</dl>
+<a href="index-1.html">A</a> <a href="index-2.html">B</a> <a href="index-3.html">C</a> <a href="index-4.html">D</a> <a href="index-5.html">F</a> <a href="index-6.html">G</a> <a href="index-7.html">H</a> <a href="index-8.html">I</a> <a href="index-9.html">L</a> <a href="index-10.html">M</a> <a href="index-11.html">N</a> <a href="index-12.html">P</a> <a href="index-13.html">R</a> <a href="index-14.html">S</a> <a href="index-15.html">T</a> <br><a href="../allclasses-index.html">All Classes</a><span class="vertical-separator">|</span><a href="../allpackages-index.html">All Packages</a></main>
+<footer role="contentinfo">
+<nav role="navigation">
+<!-- ======= START OF BOTTOM NAVBAR ====== -->
+<div class="bottom-nav" id="navbar.bottom">
+<div class="skip-nav"><a href="#skip.navbar.bottom" title="Skip navigation links">Skip navigation links</a></div>
+<ul id="navbar.bottom.firstrow" class="nav-list" title="Navigation">
+<li><a href="../sr2/flopbox/package-summary.html">Package</a></li>
+<li>Class</li>
+<li><a href="../overview-tree.html">Tree</a></li>
+<li><a href="../deprecated-list.html">Deprecated</a></li>
+<li class="nav-bar-cell1-rev">Index</li>
+<li><a href="../help-doc.html">Help</a></li>
+</ul>
+</div>
+<!-- ======== END OF BOTTOM NAVBAR ======= -->
+<span class="skip-nav" id="skip.navbar.bottom">
+<!-- -->
+</span></nav>
+</footer>
+</div>
+</div>
+</body>
+</html>
diff --git a/doc/index-files/index-7.html b/doc/index-files/index-7.html
new file mode 100644
index 0000000000000000000000000000000000000000..885e213e1e1d8fefbff9560651c85298cb3e15e0
--- /dev/null
+++ b/doc/index-files/index-7.html
@@ -0,0 +1,84 @@
+<!DOCTYPE HTML>
+<!-- NewPage -->
+<html lang="en">
+<head>
+<!-- Generated by javadoc (15) on Thu Apr 01 01:09:08 CEST 2021 -->
+<title>H-Index</title>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+<meta name="dc.created" content="2021-04-01">
+<meta name="description" content="index: H">
+<meta name="generator" content="javadoc/SplitIndexWriter">
+<link rel="stylesheet" type="text/css" href="../stylesheet.css" title="Style">
+<link rel="stylesheet" type="text/css" href="../script-dir/jquery-ui.min.css" title="Style">
+<link rel="stylesheet" type="text/css" href="../jquery-ui.overrides.css" title="Style">
+<script type="text/javascript" src="../script.js"></script>
+<script type="text/javascript" src="../script-dir/jquery-3.5.1.min.js"></script>
+<script type="text/javascript" src="../script-dir/jquery-ui.min.js"></script>
+</head>
+<body class="split-index-page">
+<script type="text/javascript">var pathtoroot = "../";
+loadScripts(document, 'script');</script>
+<noscript>
+<div>JavaScript is disabled on your browser.</div>
+</noscript>
+<div class="flex-box">
+<header role="banner" class="flex-header">
+<nav role="navigation">
+<!-- ========= START OF TOP NAVBAR ======= -->
+<div class="top-nav" id="navbar.top">
+<div class="skip-nav"><a href="#skip.navbar.top" title="Skip navigation links">Skip navigation links</a></div>
+<ul id="navbar.top.firstrow" class="nav-list" title="Navigation">
+<li><a href="../sr2/flopbox/package-summary.html">Package</a></li>
+<li>Class</li>
+<li><a href="../overview-tree.html">Tree</a></li>
+<li><a href="../deprecated-list.html">Deprecated</a></li>
+<li class="nav-bar-cell1-rev">Index</li>
+<li><a href="../help-doc.html">Help</a></li>
+</ul>
+</div>
+<div class="sub-nav">
+<div class="nav-list-search"><label for="search">SEARCH:</label>
+<input type="text" id="search" value="search" disabled="disabled">
+<input type="reset" id="reset" value="reset" disabled="disabled">
+</div>
+</div>
+<!-- ========= END OF TOP NAVBAR ========= -->
+<span class="skip-nav" id="skip.navbar.top">
+<!-- -->
+</span></nav>
+</header>
+<div class="flex-content">
+<main role="main">
+<div class="header">
+<h1>Index</h1>
+</div>
+<a href="index-1.html">A</a> <a href="index-2.html">B</a> <a href="index-3.html">C</a> <a href="index-4.html">D</a> <a href="index-5.html">F</a> <a href="index-6.html">G</a> <a href="index-7.html">H</a> <a href="index-8.html">I</a> <a href="index-9.html">L</a> <a href="index-10.html">M</a> <a href="index-11.html">N</a> <a href="index-12.html">P</a> <a href="index-13.html">R</a> <a href="index-14.html">S</a> <a href="index-15.html">T</a> <br><a href="../allclasses-index.html">All Classes</a><span class="vertical-separator">|</span><a href="../allpackages-index.html">All Packages</a>
+<h2 class="title" id="I:H">H</h2>
+<dl class="index">
+<dt><span class="member-name-link"><a href="../sr2/flopbox/FtpServer.FtpServerBuilder.html#host(java.lang.String)">host(String)</a></span> - Method in class sr2.flopbox.<a href="../sr2/flopbox/FtpServer.FtpServerBuilder.html" title="class in sr2.flopbox">FtpServer.FtpServerBuilder</a></dt>
+<dd> </dd>
+</dl>
+<a href="index-1.html">A</a> <a href="index-2.html">B</a> <a href="index-3.html">C</a> <a href="index-4.html">D</a> <a href="index-5.html">F</a> <a href="index-6.html">G</a> <a href="index-7.html">H</a> <a href="index-8.html">I</a> <a href="index-9.html">L</a> <a href="index-10.html">M</a> <a href="index-11.html">N</a> <a href="index-12.html">P</a> <a href="index-13.html">R</a> <a href="index-14.html">S</a> <a href="index-15.html">T</a> <br><a href="../allclasses-index.html">All Classes</a><span class="vertical-separator">|</span><a href="../allpackages-index.html">All Packages</a></main>
+<footer role="contentinfo">
+<nav role="navigation">
+<!-- ======= START OF BOTTOM NAVBAR ====== -->
+<div class="bottom-nav" id="navbar.bottom">
+<div class="skip-nav"><a href="#skip.navbar.bottom" title="Skip navigation links">Skip navigation links</a></div>
+<ul id="navbar.bottom.firstrow" class="nav-list" title="Navigation">
+<li><a href="../sr2/flopbox/package-summary.html">Package</a></li>
+<li>Class</li>
+<li><a href="../overview-tree.html">Tree</a></li>
+<li><a href="../deprecated-list.html">Deprecated</a></li>
+<li class="nav-bar-cell1-rev">Index</li>
+<li><a href="../help-doc.html">Help</a></li>
+</ul>
+</div>
+<!-- ======== END OF BOTTOM NAVBAR ======= -->
+<span class="skip-nav" id="skip.navbar.bottom">
+<!-- -->
+</span></nav>
+</footer>
+</div>
+</div>
+</body>
+</html>
diff --git a/doc/index-files/index-8.html b/doc/index-files/index-8.html
new file mode 100644
index 0000000000000000000000000000000000000000..4ca11bc2397780a24c0bc133c8d4fbdb954dbe4b
--- /dev/null
+++ b/doc/index-files/index-8.html
@@ -0,0 +1,86 @@
+<!DOCTYPE HTML>
+<!-- NewPage -->
+<html lang="en">
+<head>
+<!-- Generated by javadoc (15) on Thu Apr 01 01:09:08 CEST 2021 -->
+<title>I-Index</title>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+<meta name="dc.created" content="2021-04-01">
+<meta name="description" content="index: I">
+<meta name="generator" content="javadoc/SplitIndexWriter">
+<link rel="stylesheet" type="text/css" href="../stylesheet.css" title="Style">
+<link rel="stylesheet" type="text/css" href="../script-dir/jquery-ui.min.css" title="Style">
+<link rel="stylesheet" type="text/css" href="../jquery-ui.overrides.css" title="Style">
+<script type="text/javascript" src="../script.js"></script>
+<script type="text/javascript" src="../script-dir/jquery-3.5.1.min.js"></script>
+<script type="text/javascript" src="../script-dir/jquery-ui.min.js"></script>
+</head>
+<body class="split-index-page">
+<script type="text/javascript">var pathtoroot = "../";
+loadScripts(document, 'script');</script>
+<noscript>
+<div>JavaScript is disabled on your browser.</div>
+</noscript>
+<div class="flex-box">
+<header role="banner" class="flex-header">
+<nav role="navigation">
+<!-- ========= START OF TOP NAVBAR ======= -->
+<div class="top-nav" id="navbar.top">
+<div class="skip-nav"><a href="#skip.navbar.top" title="Skip navigation links">Skip navigation links</a></div>
+<ul id="navbar.top.firstrow" class="nav-list" title="Navigation">
+<li><a href="../sr2/flopbox/package-summary.html">Package</a></li>
+<li>Class</li>
+<li><a href="../overview-tree.html">Tree</a></li>
+<li><a href="../deprecated-list.html">Deprecated</a></li>
+<li class="nav-bar-cell1-rev">Index</li>
+<li><a href="../help-doc.html">Help</a></li>
+</ul>
+</div>
+<div class="sub-nav">
+<div class="nav-list-search"><label for="search">SEARCH:</label>
+<input type="text" id="search" value="search" disabled="disabled">
+<input type="reset" id="reset" value="reset" disabled="disabled">
+</div>
+</div>
+<!-- ========= END OF TOP NAVBAR ========= -->
+<span class="skip-nav" id="skip.navbar.top">
+<!-- -->
+</span></nav>
+</header>
+<div class="flex-content">
+<main role="main">
+<div class="header">
+<h1>Index</h1>
+</div>
+<a href="index-1.html">A</a> <a href="index-2.html">B</a> <a href="index-3.html">C</a> <a href="index-4.html">D</a> <a href="index-5.html">F</a> <a href="index-6.html">G</a> <a href="index-7.html">H</a> <a href="index-8.html">I</a> <a href="index-9.html">L</a> <a href="index-10.html">M</a> <a href="index-11.html">N</a> <a href="index-12.html">P</a> <a href="index-13.html">R</a> <a href="index-14.html">S</a> <a href="index-15.html">T</a> <br><a href="../allclasses-index.html">All Classes</a><span class="vertical-separator">|</span><a href="../allpackages-index.html">All Packages</a>
+<h2 class="title" id="I:I">I</h2>
+<dl class="index">
+<dt><span class="member-name-link"><a href="../sr2/flopbox/FtpServer.FtpServerBuilder.html#id()">id()</a></span> - Method in class sr2.flopbox.<a href="../sr2/flopbox/FtpServer.FtpServerBuilder.html" title="class in sr2.flopbox">FtpServer.FtpServerBuilder</a></dt>
+<dd> </dd>
+<dt><span class="member-name-link"><a href="../sr2/flopbox/FtpServer.FtpServerBuilder.html#id(long)">id(long)</a></span> - Method in class sr2.flopbox.<a href="../sr2/flopbox/FtpServer.FtpServerBuilder.html" title="class in sr2.flopbox">FtpServer.FtpServerBuilder</a></dt>
+<dd> </dd>
+</dl>
+<a href="index-1.html">A</a> <a href="index-2.html">B</a> <a href="index-3.html">C</a> <a href="index-4.html">D</a> <a href="index-5.html">F</a> <a href="index-6.html">G</a> <a href="index-7.html">H</a> <a href="index-8.html">I</a> <a href="index-9.html">L</a> <a href="index-10.html">M</a> <a href="index-11.html">N</a> <a href="index-12.html">P</a> <a href="index-13.html">R</a> <a href="index-14.html">S</a> <a href="index-15.html">T</a> <br><a href="../allclasses-index.html">All Classes</a><span class="vertical-separator">|</span><a href="../allpackages-index.html">All Packages</a></main>
+<footer role="contentinfo">
+<nav role="navigation">
+<!-- ======= START OF BOTTOM NAVBAR ====== -->
+<div class="bottom-nav" id="navbar.bottom">
+<div class="skip-nav"><a href="#skip.navbar.bottom" title="Skip navigation links">Skip navigation links</a></div>
+<ul id="navbar.bottom.firstrow" class="nav-list" title="Navigation">
+<li><a href="../sr2/flopbox/package-summary.html">Package</a></li>
+<li>Class</li>
+<li><a href="../overview-tree.html">Tree</a></li>
+<li><a href="../deprecated-list.html">Deprecated</a></li>
+<li class="nav-bar-cell1-rev">Index</li>
+<li><a href="../help-doc.html">Help</a></li>
+</ul>
+</div>
+<!-- ======== END OF BOTTOM NAVBAR ======= -->
+<span class="skip-nav" id="skip.navbar.bottom">
+<!-- -->
+</span></nav>
+</footer>
+</div>
+</div>
+</body>
+</html>
diff --git a/doc/index-files/index-9.html b/doc/index-files/index-9.html
new file mode 100644
index 0000000000000000000000000000000000000000..ed9a4926394a824bacf036046a31eca0e74d8735
--- /dev/null
+++ b/doc/index-files/index-9.html
@@ -0,0 +1,99 @@
+<!DOCTYPE HTML>
+<!-- NewPage -->
+<html lang="en">
+<head>
+<!-- Generated by javadoc (15) on Thu Apr 01 01:09:08 CEST 2021 -->
+<title>L-Index</title>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+<meta name="dc.created" content="2021-04-01">
+<meta name="description" content="index: L">
+<meta name="generator" content="javadoc/SplitIndexWriter">
+<link rel="stylesheet" type="text/css" href="../stylesheet.css" title="Style">
+<link rel="stylesheet" type="text/css" href="../script-dir/jquery-ui.min.css" title="Style">
+<link rel="stylesheet" type="text/css" href="../jquery-ui.overrides.css" title="Style">
+<script type="text/javascript" src="../script.js"></script>
+<script type="text/javascript" src="../script-dir/jquery-3.5.1.min.js"></script>
+<script type="text/javascript" src="../script-dir/jquery-ui.min.js"></script>
+</head>
+<body class="split-index-page">
+<script type="text/javascript">var pathtoroot = "../";
+loadScripts(document, 'script');</script>
+<noscript>
+<div>JavaScript is disabled on your browser.</div>
+</noscript>
+<div class="flex-box">
+<header role="banner" class="flex-header">
+<nav role="navigation">
+<!-- ========= START OF TOP NAVBAR ======= -->
+<div class="top-nav" id="navbar.top">
+<div class="skip-nav"><a href="#skip.navbar.top" title="Skip navigation links">Skip navigation links</a></div>
+<ul id="navbar.top.firstrow" class="nav-list" title="Navigation">
+<li><a href="../sr2/flopbox/package-summary.html">Package</a></li>
+<li>Class</li>
+<li><a href="../overview-tree.html">Tree</a></li>
+<li><a href="../deprecated-list.html">Deprecated</a></li>
+<li class="nav-bar-cell1-rev">Index</li>
+<li><a href="../help-doc.html">Help</a></li>
+</ul>
+</div>
+<div class="sub-nav">
+<div class="nav-list-search"><label for="search">SEARCH:</label>
+<input type="text" id="search" value="search" disabled="disabled">
+<input type="reset" id="reset" value="reset" disabled="disabled">
+</div>
+</div>
+<!-- ========= END OF TOP NAVBAR ========= -->
+<span class="skip-nav" id="skip.navbar.top">
+<!-- -->
+</span></nav>
+</header>
+<div class="flex-content">
+<main role="main">
+<div class="header">
+<h1>Index</h1>
+</div>
+<a href="index-1.html">A</a> <a href="index-2.html">B</a> <a href="index-3.html">C</a> <a href="index-4.html">D</a> <a href="index-5.html">F</a> <a href="index-6.html">G</a> <a href="index-7.html">H</a> <a href="index-8.html">I</a> <a href="index-9.html">L</a> <a href="index-10.html">M</a> <a href="index-11.html">N</a> <a href="index-12.html">P</a> <a href="index-13.html">R</a> <a href="index-14.html">S</a> <a href="index-15.html">T</a> <br><a href="../allclasses-index.html">All Classes</a><span class="vertical-separator">|</span><a href="../allpackages-index.html">All Packages</a>
+<h2 class="title" id="I:L">L</h2>
+<dl class="index">
+<dt><span class="member-name-link"><a href="../sr2/flopbox/FilesServices.html#listFile(java.lang.String,java.lang.String,java.lang.String)">listFile(String, String, String)</a></span> - Method in class sr2.flopbox.<a href="../sr2/flopbox/FilesServices.html" title="class in sr2.flopbox">FilesServices</a></dt>
+<dd>
+<div class="block">Method to list the content of any text file</div>
+</dd>
+<dt><span class="member-name-link"><a href="../sr2/flopbox/FilesServices.html#listrepository(java.lang.String,java.lang.String,java.lang.String)">listrepository(String, String, String)</a></span> - Method in class sr2.flopbox.<a href="../sr2/flopbox/FilesServices.html" title="class in sr2.flopbox">FilesServices</a></dt>
+<dd>
+<div class="block">Method to list the content of any repository</div>
+</dd>
+<dt><span class="member-name-link"><a href="../sr2/flopbox/FtpServerService.html#listRoot(java.lang.String,java.lang.String)">listRoot(String, String)</a></span> - Method in class sr2.flopbox.<a href="../sr2/flopbox/FtpServerService.html" title="class in sr2.flopbox">FtpServerService</a></dt>
+<dd>
+<div class="block">Method to get the content of the root repertory of a server</div>
+</dd>
+<dt><span class="member-name-link"><a href="../sr2/flopbox/FtpServerService.html#login(java.lang.String,java.lang.String,java.lang.String)">login(String, String, String)</a></span> - Method in class sr2.flopbox.<a href="../sr2/flopbox/FtpServerService.html" title="class in sr2.flopbox">FtpServerService</a></dt>
+<dd>
+<div class="block">Method the register a username and a password for the server 'alias'
+ The credentials will be only save for this server</div>
+</dd>
+</dl>
+<a href="index-1.html">A</a> <a href="index-2.html">B</a> <a href="index-3.html">C</a> <a href="index-4.html">D</a> <a href="index-5.html">F</a> <a href="index-6.html">G</a> <a href="index-7.html">H</a> <a href="index-8.html">I</a> <a href="index-9.html">L</a> <a href="index-10.html">M</a> <a href="index-11.html">N</a> <a href="index-12.html">P</a> <a href="index-13.html">R</a> <a href="index-14.html">S</a> <a href="index-15.html">T</a> <br><a href="../allclasses-index.html">All Classes</a><span class="vertical-separator">|</span><a href="../allpackages-index.html">All Packages</a></main>
+<footer role="contentinfo">
+<nav role="navigation">
+<!-- ======= START OF BOTTOM NAVBAR ====== -->
+<div class="bottom-nav" id="navbar.bottom">
+<div class="skip-nav"><a href="#skip.navbar.bottom" title="Skip navigation links">Skip navigation links</a></div>
+<ul id="navbar.bottom.firstrow" class="nav-list" title="Navigation">
+<li><a href="../sr2/flopbox/package-summary.html">Package</a></li>
+<li>Class</li>
+<li><a href="../overview-tree.html">Tree</a></li>
+<li><a href="../deprecated-list.html">Deprecated</a></li>
+<li class="nav-bar-cell1-rev">Index</li>
+<li><a href="../help-doc.html">Help</a></li>
+</ul>
+</div>
+<!-- ======== END OF BOTTOM NAVBAR ======= -->
+<span class="skip-nav" id="skip.navbar.bottom">
+<!-- -->
+</span></nav>
+</footer>
+</div>
+</div>
+</body>
+</html>
diff --git a/doc/index.html b/doc/index.html
new file mode 100644
index 0000000000000000000000000000000000000000..c61e1a6c57e3ace0b864f837902a62240412fba1
--- /dev/null
+++ b/doc/index.html
@@ -0,0 +1,26 @@
+<!DOCTYPE HTML>
+<!-- NewPage -->
+<html lang="en">
+<head>
+<!-- Generated by javadoc (15) on Thu Apr 01 01:09:08 CEST 2021 -->
+<title>Generated Documentation (Untitled)</title>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+<meta name="dc.created" content="2021-04-01">
+<meta name="description" content="index redirect">
+<meta name="generator" content="javadoc/IndexRedirectWriter">
+<link rel="canonical" href="sr2/flopbox/package-summary.html">
+<link rel="stylesheet" type="text/css" href="stylesheet.css" title="Style">
+<script type="text/javascript">window.location.replace('sr2/flopbox/package-summary.html')</script>
+<noscript>
+<meta http-equiv="Refresh" content="0;sr2/flopbox/package-summary.html">
+</noscript>
+</head>
+<body class="index-redirect-page">
+<main role="main">
+<noscript>
+<p>JavaScript is disabled on your browser.</p>
+</noscript>
+<p><a href="sr2/flopbox/package-summary.html">sr2/flopbox/package-summary.html</a></p>
+</main>
+</body>
+</html>
diff --git a/doc/jquery-ui.overrides.css b/doc/jquery-ui.overrides.css
new file mode 100644
index 0000000000000000000000000000000000000000..f89acb6320cc24f4e849c38b88fe8f6c15abb087
--- /dev/null
+++ b/doc/jquery-ui.overrides.css
@@ -0,0 +1,34 @@
+/*
+ * Copyright (c) 2020, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation. Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+.ui-state-active,
+.ui-widget-content .ui-state-active,
+.ui-widget-header .ui-state-active,
+a.ui-button:active,
+.ui-button:active,
+.ui-button.ui-state-active:hover {
+ /* Overrides the color of selection used in jQuery UI */
+ background: #F8981D;
+}
diff --git a/doc/member-search-index.js b/doc/member-search-index.js
new file mode 100644
index 0000000000000000000000000000000000000000..f58d78ed9db5527b5e4041d8ca6359ffed62e05d
--- /dev/null
+++ b/doc/member-search-index.js
@@ -0,0 +1 @@
+memberSearchIndex = [{"p":"sr2.flopbox","c":"FilesServices","l":"addfile(String, String, String)","u":"addfile(java.lang.String,java.lang.String,java.lang.String)"},{"p":"sr2.flopbox","c":"FtpServerService","l":"addServer(String, String, String)","u":"addServer(java.lang.String,java.lang.String,java.lang.String)"},{"p":"sr2.flopbox","c":"FtpServer","l":"addUser(int, String, String)","u":"addUser(int,java.lang.String,java.lang.String)"},{"p":"sr2.flopbox","c":"FtpServer.FtpServerBuilder","l":"alias(String)","u":"alias(java.lang.String)"},{"p":"sr2.flopbox","c":"Main","l":"BASE_URI"},{"p":"sr2.flopbox","c":"FtpServer.FtpServerBuilder","l":"build()"},{"p":"sr2.flopbox","c":"cantConnectToServerException","l":"cantConnectToServerException(String)","u":"%3Cinit%3E(java.lang.String)"},{"p":"sr2.flopbox","c":"FtpServerService","l":"changeAlias(String, String, String)","u":"changeAlias(java.lang.String,java.lang.String,java.lang.String)"},{"p":"sr2.flopbox","c":"FtpServer","l":"checkIfUserExist(int)"},{"p":"sr2.flopbox","c":"FilesServices","l":"delete(String, String, String)","u":"delete(java.lang.String,java.lang.String,java.lang.String)"},{"p":"sr2.flopbox","c":"FileDoesNotExistException","l":"FileDoesNotExistException(String)","u":"%3Cinit%3E(java.lang.String)"},{"p":"sr2.flopbox","c":"FilesServices","l":"FilesServices()","u":"%3Cinit%3E()"},{"p":"sr2.flopbox","c":"FtpServer","l":"FtpServer()","u":"%3Cinit%3E()"},{"p":"sr2.flopbox","c":"FtpServer","l":"FtpServer(long, String, String, String)","u":"%3Cinit%3E(long,java.lang.String,java.lang.String,java.lang.String)"},{"p":"sr2.flopbox","c":"FtpServer.FtpServerBuilder","l":"FtpServerBuilder()","u":"%3Cinit%3E()"},{"p":"sr2.flopbox","c":"FtpServerList","l":"FtpServerList()","u":"%3Cinit%3E()"},{"p":"sr2.flopbox","c":"FtpServerService","l":"FtpServerService()","u":"%3Cinit%3E()"},{"p":"sr2.flopbox","c":"Main","l":"FTPtool"},{"p":"sr2.flopbox","c":"FtpServer","l":"getAlias()"},{"p":"sr2.flopbox","c":"FtpServerService","l":"getAllFTPServers()"},{"p":"sr2.flopbox","c":"FtpServer","l":"getHost()"},{"p":"sr2.flopbox","c":"FtpServer","l":"getId()"},{"p":"sr2.flopbox","c":"FtpServerList","l":"getInstance()"},{"p":"sr2.flopbox","c":"FtpServer","l":"getPort()"},{"p":"sr2.flopbox","c":"FtpServerService","l":"getServer(String)","u":"getServer(java.lang.String)"},{"p":"sr2.flopbox","c":"FtpServer","l":"getUserAndPass(int)"},{"p":"sr2.flopbox","c":"FtpServer.FtpServerBuilder","l":"host(String)","u":"host(java.lang.String)"},{"p":"sr2.flopbox","c":"FtpServer.FtpServerBuilder","l":"id()"},{"p":"sr2.flopbox","c":"FtpServer.FtpServerBuilder","l":"id(long)"},{"p":"sr2.flopbox","c":"FilesServices","l":"listFile(String, String, String)","u":"listFile(java.lang.String,java.lang.String,java.lang.String)"},{"p":"sr2.flopbox","c":"FilesServices","l":"listrepository(String, String, String)","u":"listrepository(java.lang.String,java.lang.String,java.lang.String)"},{"p":"sr2.flopbox","c":"FtpServerService","l":"listRoot(String, String)","u":"listRoot(java.lang.String,java.lang.String)"},{"p":"sr2.flopbox","c":"FtpServerService","l":"login(String, String, String)","u":"login(java.lang.String,java.lang.String,java.lang.String)"},{"p":"sr2.flopbox","c":"Main","l":"Main()","u":"%3Cinit%3E()"},{"p":"sr2.flopbox","c":"Main","l":"main(String[])","u":"main(java.lang.String[])"},{"p":"sr2.flopbox","c":"NoServerFoundException","l":"NoServerFoundException(String)","u":"%3Cinit%3E(java.lang.String)"},{"p":"sr2.flopbox","c":"FtpServer.FtpServerBuilder","l":"port(String)","u":"port(java.lang.String)"},{"p":"sr2.flopbox","c":"FilesServices","l":"rename(String, String, String, String)","u":"rename(java.lang.String,java.lang.String,java.lang.String,java.lang.String)"},{"p":"sr2.flopbox","c":"FtpServer","l":"setAlias(String)","u":"setAlias(java.lang.String)"},{"p":"sr2.flopbox","c":"Main","l":"startServer()"},{"p":"sr2.flopbox","c":"FilesServices","l":"test(String, String)","u":"test(java.lang.String,java.lang.String)"},{"p":"sr2.flopbox","c":"FtpServer","l":"toString()"}];updateSearchResults();
\ No newline at end of file
diff --git a/doc/module-search-index.js b/doc/module-search-index.js
new file mode 100644
index 0000000000000000000000000000000000000000..0d59754fc4adb2e15c50f5f6a6ff2e509e6af170
--- /dev/null
+++ b/doc/module-search-index.js
@@ -0,0 +1 @@
+moduleSearchIndex = [];updateSearchResults();
\ No newline at end of file
diff --git a/doc/overview-tree.html b/doc/overview-tree.html
new file mode 100644
index 0000000000000000000000000000000000000000..b8c954c031492fbfeb91851786532e7f983dc92a
--- /dev/null
+++ b/doc/overview-tree.html
@@ -0,0 +1,108 @@
+<!DOCTYPE HTML>
+<!-- NewPage -->
+<html lang="en">
+<head>
+<!-- Generated by javadoc (15) on Thu Apr 01 01:09:08 CEST 2021 -->
+<title>Class Hierarchy</title>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+<meta name="dc.created" content="2021-04-01">
+<meta name="description" content="class tree">
+<meta name="generator" content="javadoc/TreeWriter">
+<link rel="stylesheet" type="text/css" href="stylesheet.css" title="Style">
+<link rel="stylesheet" type="text/css" href="script-dir/jquery-ui.min.css" title="Style">
+<link rel="stylesheet" type="text/css" href="jquery-ui.overrides.css" title="Style">
+<script type="text/javascript" src="script.js"></script>
+<script type="text/javascript" src="script-dir/jquery-3.5.1.min.js"></script>
+<script type="text/javascript" src="script-dir/jquery-ui.min.js"></script>
+</head>
+<body class="tree-page">
+<script type="text/javascript">var pathtoroot = "./";
+loadScripts(document, 'script');</script>
+<noscript>
+<div>JavaScript is disabled on your browser.</div>
+</noscript>
+<div class="flex-box">
+<header role="banner" class="flex-header">
+<nav role="navigation">
+<!-- ========= START OF TOP NAVBAR ======= -->
+<div class="top-nav" id="navbar.top">
+<div class="skip-nav"><a href="#skip.navbar.top" title="Skip navigation links">Skip navigation links</a></div>
+<ul id="navbar.top.firstrow" class="nav-list" title="Navigation">
+<li>Package</li>
+<li>Class</li>
+<li class="nav-bar-cell1-rev">Tree</li>
+<li><a href="deprecated-list.html">Deprecated</a></li>
+<li><a href="index-files/index-1.html">Index</a></li>
+<li><a href="help-doc.html">Help</a></li>
+</ul>
+</div>
+<div class="sub-nav">
+<div class="nav-list-search"><label for="search">SEARCH:</label>
+<input type="text" id="search" value="search" disabled="disabled">
+<input type="reset" id="reset" value="reset" disabled="disabled">
+</div>
+</div>
+<!-- ========= END OF TOP NAVBAR ========= -->
+<span class="skip-nav" id="skip.navbar.top">
+<!-- -->
+</span></nav>
+</header>
+<div class="flex-content">
+<main role="main">
+<div class="header">
+<h1 class="title">Hierarchy For All Packages</h1>
+<span class="package-hierarchy-label">Package Hierarchies:</span>
+<ul class="horizontal">
+<li><a href="sr2/flopbox/package-tree.html">sr2.flopbox</a></li>
+</ul>
+</div>
+<section class="hierarchy">
+<h2 title="Class Hierarchy">Class Hierarchy</h2>
+<ul>
+<li class="circle">java.lang.Object
+<ul>
+<li class="circle">sr2.flopbox.<a href="sr2/flopbox/FilesServices.html" title="class in sr2.flopbox"><span class="type-name-link">FilesServices</span></a></li>
+<li class="circle">sr2.flopbox.<a href="sr2/flopbox/FtpServer.html" title="class in sr2.flopbox"><span class="type-name-link">FtpServer</span></a></li>
+<li class="circle">sr2.flopbox.<a href="sr2/flopbox/FtpServer.FtpServerBuilder.html" title="class in sr2.flopbox"><span class="type-name-link">FtpServer.FtpServerBuilder</span></a></li>
+<li class="circle">sr2.flopbox.<a href="sr2/flopbox/FtpServerList.html" title="class in sr2.flopbox"><span class="type-name-link">FtpServerList</span></a></li>
+<li class="circle">sr2.flopbox.<a href="sr2/flopbox/FtpServerService.html" title="class in sr2.flopbox"><span class="type-name-link">FtpServerService</span></a></li>
+<li class="circle">sr2.flopbox.<a href="sr2/flopbox/Main.html" title="class in sr2.flopbox"><span class="type-name-link">Main</span></a></li>
+<li class="circle">java.lang.Throwable (implements java.io.Serializable)
+<ul>
+<li class="circle">java.lang.Exception
+<ul>
+<li class="circle">sr2.flopbox.<a href="sr2/flopbox/cantConnectToServerException.html" title="class in sr2.flopbox"><span class="type-name-link">cantConnectToServerException</span></a></li>
+<li class="circle">sr2.flopbox.<a href="sr2/flopbox/FileDoesNotExistException.html" title="class in sr2.flopbox"><span class="type-name-link">FileDoesNotExistException</span></a></li>
+<li class="circle">sr2.flopbox.<a href="sr2/flopbox/NoServerFoundException.html" title="class in sr2.flopbox"><span class="type-name-link">NoServerFoundException</span></a></li>
+</ul>
+</li>
+</ul>
+</li>
+</ul>
+</li>
+</ul>
+</section>
+</main>
+<footer role="contentinfo">
+<nav role="navigation">
+<!-- ======= START OF BOTTOM NAVBAR ====== -->
+<div class="bottom-nav" id="navbar.bottom">
+<div class="skip-nav"><a href="#skip.navbar.bottom" title="Skip navigation links">Skip navigation links</a></div>
+<ul id="navbar.bottom.firstrow" class="nav-list" title="Navigation">
+<li>Package</li>
+<li>Class</li>
+<li class="nav-bar-cell1-rev">Tree</li>
+<li><a href="deprecated-list.html">Deprecated</a></li>
+<li><a href="index-files/index-1.html">Index</a></li>
+<li><a href="help-doc.html">Help</a></li>
+</ul>
+</div>
+<!-- ======== END OF BOTTOM NAVBAR ======= -->
+<span class="skip-nav" id="skip.navbar.bottom">
+<!-- -->
+</span></nav>
+</footer>
+</div>
+</div>
+</body>
+</html>
diff --git a/doc/package-search-index.js b/doc/package-search-index.js
new file mode 100644
index 0000000000000000000000000000000000000000..47663c6c2eea4663f7ce1e48fa8f86cf79af59a8
--- /dev/null
+++ b/doc/package-search-index.js
@@ -0,0 +1 @@
+packageSearchIndex = [{"l":"All Packages","u":"allpackages-index.html"},{"l":"sr2.flopbox"}];updateSearchResults();
\ No newline at end of file
diff --git a/doc/resources/glass.png b/doc/resources/glass.png
new file mode 100644
index 0000000000000000000000000000000000000000..a7f591f467a1c0c949bbc510156a0c1afb860a6e
Binary files /dev/null and b/doc/resources/glass.png differ
diff --git a/doc/resources/x.png b/doc/resources/x.png
new file mode 100644
index 0000000000000000000000000000000000000000..30548a756e151be4e927e8d28c508cc5b3514bf3
Binary files /dev/null and b/doc/resources/x.png differ
diff --git a/doc/script-dir/images/ui-bg_glass_55_fbf9ee_1x400.png b/doc/script-dir/images/ui-bg_glass_55_fbf9ee_1x400.png
new file mode 100644
index 0000000000000000000000000000000000000000..34abd18f32d3a55a297fdcf93409bd033ae573e7
Binary files /dev/null and b/doc/script-dir/images/ui-bg_glass_55_fbf9ee_1x400.png differ
diff --git a/doc/script-dir/images/ui-bg_glass_65_dadada_1x400.png b/doc/script-dir/images/ui-bg_glass_65_dadada_1x400.png
new file mode 100644
index 0000000000000000000000000000000000000000..f058a938533344e5d93e06b7ced2725344bb1102
Binary files /dev/null and b/doc/script-dir/images/ui-bg_glass_65_dadada_1x400.png differ
diff --git a/doc/script-dir/images/ui-bg_glass_75_dadada_1x400.png b/doc/script-dir/images/ui-bg_glass_75_dadada_1x400.png
new file mode 100644
index 0000000000000000000000000000000000000000..2ce04c165179bde302921ca361f5c75163d9caa0
Binary files /dev/null and b/doc/script-dir/images/ui-bg_glass_75_dadada_1x400.png differ
diff --git a/doc/script-dir/images/ui-bg_glass_75_e6e6e6_1x400.png b/doc/script-dir/images/ui-bg_glass_75_e6e6e6_1x400.png
new file mode 100644
index 0000000000000000000000000000000000000000..a90afb8bf8028404d206114965669b023dcb85ea
Binary files /dev/null and b/doc/script-dir/images/ui-bg_glass_75_e6e6e6_1x400.png differ
diff --git a/doc/script-dir/images/ui-bg_glass_95_fef1ec_1x400.png b/doc/script-dir/images/ui-bg_glass_95_fef1ec_1x400.png
new file mode 100644
index 0000000000000000000000000000000000000000..dbe091f6dc036fc1dc11b005738e951e27a43f7a
Binary files /dev/null and b/doc/script-dir/images/ui-bg_glass_95_fef1ec_1x400.png differ
diff --git a/doc/script-dir/images/ui-bg_highlight-soft_75_cccccc_1x100.png b/doc/script-dir/images/ui-bg_highlight-soft_75_cccccc_1x100.png
new file mode 100644
index 0000000000000000000000000000000000000000..5dc3593e4620dd41f9f1f0c7e81316d10ed8f0c7
Binary files /dev/null and b/doc/script-dir/images/ui-bg_highlight-soft_75_cccccc_1x100.png differ
diff --git a/doc/script-dir/images/ui-icons_222222_256x240.png b/doc/script-dir/images/ui-icons_222222_256x240.png
new file mode 100644
index 0000000000000000000000000000000000000000..e723e17cb5428094de75a0d3c6f4f3c07dbd3bbe
Binary files /dev/null and b/doc/script-dir/images/ui-icons_222222_256x240.png differ
diff --git a/doc/script-dir/images/ui-icons_2e83ff_256x240.png b/doc/script-dir/images/ui-icons_2e83ff_256x240.png
new file mode 100644
index 0000000000000000000000000000000000000000..1f5f49756ca64bd20a1048bd7a3a584457d4bf00
Binary files /dev/null and b/doc/script-dir/images/ui-icons_2e83ff_256x240.png differ
diff --git a/doc/script-dir/images/ui-icons_454545_256x240.png b/doc/script-dir/images/ui-icons_454545_256x240.png
new file mode 100644
index 0000000000000000000000000000000000000000..618f5b0ca756789f81bc276426805df6f61b91d7
Binary files /dev/null and b/doc/script-dir/images/ui-icons_454545_256x240.png differ
diff --git a/doc/script-dir/images/ui-icons_888888_256x240.png b/doc/script-dir/images/ui-icons_888888_256x240.png
new file mode 100644
index 0000000000000000000000000000000000000000..ee5e33f27235d1b5cf0259f63f3894a6be33c679
Binary files /dev/null and b/doc/script-dir/images/ui-icons_888888_256x240.png differ
diff --git a/doc/script-dir/images/ui-icons_cd0a0a_256x240.png b/doc/script-dir/images/ui-icons_cd0a0a_256x240.png
new file mode 100644
index 0000000000000000000000000000000000000000..7e8ebc180a2d2a74739059799407b8b7b57a9092
Binary files /dev/null and b/doc/script-dir/images/ui-icons_cd0a0a_256x240.png differ
diff --git a/doc/script-dir/jquery-3.5.1.min.js b/doc/script-dir/jquery-3.5.1.min.js
new file mode 100644
index 0000000000000000000000000000000000000000..b0614034ad3a95e4ae9f53c2b015eeb3e8d68bde
--- /dev/null
+++ b/doc/script-dir/jquery-3.5.1.min.js
@@ -0,0 +1,2 @@
+/*! jQuery v3.5.1 | (c) JS Foundation and other contributors | jquery.org/license */
+!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.5.1",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0<t&&t-1 in e)}S.fn=S.prototype={jquery:f,constructor:S,length:0,toArray:function(){return s.call(this)},get:function(e){return null==e?s.call(this):e<0?this[e+this.length]:this[e]},pushStack:function(e){var t=S.merge(this.constructor(),e);return t.prevObject=this,t},each:function(e){return S.each(this,e)},map:function(n){return this.pushStack(S.map(this,function(e,t){return n.call(e,t,e)}))},slice:function(){return this.pushStack(s.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},even:function(){return this.pushStack(S.grep(this,function(e,t){return(t+1)%2}))},odd:function(){return this.pushStack(S.grep(this,function(e,t){return t%2}))},eq:function(e){var t=this.length,n=+e+(e<0?t:0);return this.pushStack(0<=n&&n<t?[this[n]]:[])},end:function(){return this.prevObject||this.constructor()},push:u,sort:t.sort,splice:t.splice},S.extend=S.fn.extend=function(){var e,t,n,r,i,o,a=arguments[0]||{},s=1,u=arguments.length,l=!1;for("boolean"==typeof a&&(l=a,a=arguments[s]||{},s++),"object"==typeof a||m(a)||(a={}),s===u&&(a=this,s--);s<u;s++)if(null!=(e=arguments[s]))for(t in e)r=e[t],"__proto__"!==t&&a!==r&&(l&&r&&(S.isPlainObject(r)||(i=Array.isArray(r)))?(n=a[t],o=i&&!Array.isArray(n)?[]:i||S.isPlainObject(n)?n:{},i=!1,a[t]=S.extend(l,o,r)):void 0!==r&&(a[t]=r));return a},S.extend({expando:"jQuery"+(f+Math.random()).replace(/\D/g,""),isReady:!0,error:function(e){throw new Error(e)},noop:function(){},isPlainObject:function(e){var t,n;return!(!e||"[object Object]"!==o.call(e))&&(!(t=r(e))||"function"==typeof(n=v.call(t,"constructor")&&t.constructor)&&a.call(n)===l)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},globalEval:function(e,t,n){b(e,{nonce:t&&t.nonce},n)},each:function(e,t){var n,r=0;if(p(e)){for(n=e.length;r<n;r++)if(!1===t.call(e[r],r,e[r]))break}else for(r in e)if(!1===t.call(e[r],r,e[r]))break;return e},makeArray:function(e,t){var n=t||[];return null!=e&&(p(Object(e))?S.merge(n,"string"==typeof e?[e]:e):u.call(n,e)),n},inArray:function(e,t,n){return null==t?-1:i.call(t,e,n)},merge:function(e,t){for(var n=+t.length,r=0,i=e.length;r<n;r++)e[i++]=t[r];return e.length=i,e},grep:function(e,t,n){for(var r=[],i=0,o=e.length,a=!n;i<o;i++)!t(e[i],i)!==a&&r.push(e[i]);return r},map:function(e,t,n){var r,i,o=0,a=[];if(p(e))for(r=e.length;o<r;o++)null!=(i=t(e[o],o,n))&&a.push(i);else for(o in e)null!=(i=t(e[o],o,n))&&a.push(i);return g(a)},guid:1,support:y}),"function"==typeof Symbol&&(S.fn[Symbol.iterator]=t[Symbol.iterator]),S.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(e,t){n["[object "+t+"]"]=t.toLowerCase()});var d=function(n){var e,d,b,o,i,h,f,g,w,u,l,T,C,a,E,v,s,c,y,S="sizzle"+1*new Date,p=n.document,k=0,r=0,m=ue(),x=ue(),A=ue(),N=ue(),D=function(e,t){return e===t&&(l=!0),0},j={}.hasOwnProperty,t=[],q=t.pop,L=t.push,H=t.push,O=t.slice,P=function(e,t){for(var n=0,r=e.length;n<r;n++)if(e[n]===t)return n;return-1},R="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",M="[\\x20\\t\\r\\n\\f]",I="(?:\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\[^\\r\\n\\f]|[\\w-]|[^\0-\\x7f])+",W="\\["+M+"*("+I+")(?:"+M+"*([*^$|!~]?=)"+M+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+I+"))|)"+M+"*\\]",F=":("+I+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+W+")*)|.*)\\)|)",B=new RegExp(M+"+","g"),$=new RegExp("^"+M+"+|((?:^|[^\\\\])(?:\\\\.)*)"+M+"+$","g"),_=new RegExp("^"+M+"*,"+M+"*"),z=new RegExp("^"+M+"*([>+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e.namespaceURI,n=(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="<a id='"+S+"'></a><select id='"+S+"-\r\\' msallowcapture=''><option selected=''></option></select>",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="<a href='' disabled='disabled'></a><select disabled='disabled'><option/></select>";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},D=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0<se(t,C,null,[e]).length},se.contains=function(e,t){return(e.ownerDocument||e)!=C&&T(e),y(e,t)},se.attr=function(e,t){(e.ownerDocument||e)!=C&&T(e);var n=b.attrHandle[t.toLowerCase()],r=n&&j.call(b.attrHandle,t.toLowerCase())?n(e,t,!E):void 0;return void 0!==r?r:d.attributes||!E?e.getAttribute(t):(r=e.getAttributeNode(t))&&r.specified?r.value:null},se.escape=function(e){return(e+"").replace(re,ie)},se.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)},se.uniqueSort=function(e){var t,n=[],r=0,i=0;if(l=!d.detectDuplicates,u=!d.sortStable&&e.slice(0),e.sort(D),l){while(t=e[i++])t===e[i]&&(r=n.push(i));while(r--)e.splice(n[r],1)}return u=null,e},o=se.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(1===i||9===i||11===i){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=o(e)}else if(3===i||4===i)return e.nodeValue}else while(t=e[r++])n+=o(t);return n},(b=se.selectors={cacheLength:50,createPseudo:le,match:G,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1<t.indexOf(i):"$="===r?i&&t.slice(-i.length)===i:"~="===r?-1<(" "+t.replace(B," ")+" ").indexOf(i):"|="===r&&(t===i||t.slice(0,i.length+1)===i+"-"))}},CHILD:function(h,e,t,g,v){var y="nth"!==h.slice(0,3),m="last"!==h.slice(-4),x="of-type"===e;return 1===g&&0===v?function(e){return!!e.parentNode}:function(e,t,n){var r,i,o,a,s,u,l=y!==m?"nextSibling":"previousSibling",c=e.parentNode,f=x&&e.nodeName.toLowerCase(),p=!n&&!x,d=!1;if(c){if(y){while(l){a=e;while(a=a[l])if(x?a.nodeName.toLowerCase()===f:1===a.nodeType)return!1;u=l="only"===h&&!u&&"nextSibling"}return!0}if(u=[m?c.firstChild:c.lastChild],m&&p){d=(s=(r=(i=(o=(a=c)[S]||(a[S]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]||[])[0]===k&&r[1])&&r[2],a=s&&c.childNodes[s];while(a=++s&&a&&a[l]||(d=s=0)||u.pop())if(1===a.nodeType&&++d&&a===e){i[h]=[k,s,d];break}}else if(p&&(d=s=(r=(i=(o=(a=e)[S]||(a[S]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]||[])[0]===k&&r[1]),!1===d)while(a=++s&&a&&a[l]||(d=s=0)||u.pop())if((x?a.nodeName.toLowerCase()===f:1===a.nodeType)&&++d&&(p&&((i=(o=a[S]||(a[S]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]=[k,d]),a===e))break;return(d-=v)===g||d%g==0&&0<=d/g}}},PSEUDO:function(e,o){var t,a=b.pseudos[e]||b.setFilters[e.toLowerCase()]||se.error("unsupported pseudo: "+e);return a[S]?a(o):1<a.length?(t=[e,e,"",o],b.setFilters.hasOwnProperty(e.toLowerCase())?le(function(e,t){var n,r=a(e,o),i=r.length;while(i--)e[n=P(e,r[i])]=!(t[n]=r[i])}):function(e){return a(e,0,t)}):a}},pseudos:{not:le(function(e){var r=[],i=[],s=f(e.replace($,"$1"));return s[S]?le(function(e,t,n,r){var i,o=s(e,null,r,[]),a=e.length;while(a--)(i=o[a])&&(e[a]=!(t[a]=i))}):function(e,t,n){return r[0]=e,s(r,null,n,i),r[0]=null,!i.pop()}}),has:le(function(t){return function(e){return 0<se(t,e).length}}),contains:le(function(t){return t=t.replace(te,ne),function(e){return-1<(e.textContent||o(e)).indexOf(t)}}),lang:le(function(n){return V.test(n||"")||se.error("unsupported lang: "+n),n=n.replace(te,ne).toLowerCase(),function(e){var t;do{if(t=E?e.lang:e.getAttribute("xml:lang")||e.getAttribute("lang"))return(t=t.toLowerCase())===n||0===t.indexOf(n+"-")}while((e=e.parentNode)&&1===e.nodeType);return!1}}),target:function(e){var t=n.location&&n.location.hash;return t&&t.slice(1)===e.id},root:function(e){return e===a},focus:function(e){return e===C.activeElement&&(!C.hasFocus||C.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:ge(!1),disabled:ge(!0),checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,!0===e.selected},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeType<6)return!1;return!0},parent:function(e){return!b.pseudos.empty(e)},header:function(e){return J.test(e.nodeName)},input:function(e){return Q.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||"text"===t.toLowerCase())},first:ve(function(){return[0]}),last:ve(function(e,t){return[t-1]}),eq:ve(function(e,t,n){return[n<0?n+t:n]}),even:ve(function(e,t){for(var n=0;n<t;n+=2)e.push(n);return e}),odd:ve(function(e,t){for(var n=1;n<t;n+=2)e.push(n);return e}),lt:ve(function(e,t,n){for(var r=n<0?n+t:t<n?t:n;0<=--r;)e.push(r);return e}),gt:ve(function(e,t,n){for(var r=n<0?n+t:n;++r<t;)e.push(r);return e})}}).pseudos.nth=b.pseudos.eq,{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})b.pseudos[e]=de(e);for(e in{submit:!0,reset:!0})b.pseudos[e]=he(e);function me(){}function xe(e){for(var t=0,n=e.length,r="";t<n;t++)r+=e[t].value;return r}function be(s,e,t){var u=e.dir,l=e.next,c=l||u,f=t&&"parentNode"===c,p=r++;return e.first?function(e,t,n){while(e=e[u])if(1===e.nodeType||f)return s(e,t,n);return!1}:function(e,t,n){var r,i,o,a=[k,p];if(n){while(e=e[u])if((1===e.nodeType||f)&&s(e,t,n))return!0}else while(e=e[u])if(1===e.nodeType||f)if(i=(o=e[S]||(e[S]={}))[e.uniqueID]||(o[e.uniqueID]={}),l&&l===e.nodeName.toLowerCase())e=e[u]||e;else{if((r=i[c])&&r[0]===k&&r[1]===p)return a[2]=r[2];if((i[c]=a)[2]=s(e,t,n))return!0}return!1}}function we(i){return 1<i.length?function(e,t,n){var r=i.length;while(r--)if(!i[r](e,t,n))return!1;return!0}:i[0]}function Te(e,t,n,r,i){for(var o,a=[],s=0,u=e.length,l=null!=t;s<u;s++)(o=e[s])&&(n&&!n(o,r,i)||(a.push(o),l&&t.push(s)));return a}function Ce(d,h,g,v,y,e){return v&&!v[S]&&(v=Ce(v)),y&&!y[S]&&(y=Ce(y,e)),le(function(e,t,n,r){var i,o,a,s=[],u=[],l=t.length,c=e||function(e,t,n){for(var r=0,i=t.length;r<i;r++)se(e,t[r],n);return n}(h||"*",n.nodeType?[n]:n,[]),f=!d||!e&&h?c:Te(c,s,d,n,r),p=g?y||(e?d:l||v)?[]:t:f;if(g&&g(f,p,n,r),v){i=Te(p,u),v(i,[],n,r),o=i.length;while(o--)(a=i[o])&&(p[u[o]]=!(f[u[o]]=a))}if(e){if(y||d){if(y){i=[],o=p.length;while(o--)(a=p[o])&&i.push(f[o]=a);y(null,p=[],i,r)}o=p.length;while(o--)(a=p[o])&&-1<(i=y?P(e,a):s[o])&&(e[i]=!(t[i]=a))}}else p=Te(p===t?p.splice(l,p.length):p),y?y(null,t,p,r):H.apply(t,p)})}function Ee(e){for(var i,t,n,r=e.length,o=b.relative[e[0].type],a=o||b.relative[" "],s=o?1:0,u=be(function(e){return e===i},a,!0),l=be(function(e){return-1<P(i,e)},a,!0),c=[function(e,t,n){var r=!o&&(n||t!==w)||((i=t).nodeType?u(e,t,n):l(e,t,n));return i=null,r}];s<r;s++)if(t=b.relative[e[s].type])c=[be(we(c),t)];else{if((t=b.filter[e[s].type].apply(null,e[s].matches))[S]){for(n=++s;n<r;n++)if(b.relative[e[n].type])break;return Ce(1<s&&we(c),1<s&&xe(e.slice(0,s-1).concat({value:" "===e[s-2].type?"*":""})).replace($,"$1"),t,s<n&&Ee(e.slice(s,n)),n<r&&Ee(e=e.slice(n)),n<r&&xe(e))}c.push(t)}return we(c)}return me.prototype=b.filters=b.pseudos,b.setFilters=new me,h=se.tokenize=function(e,t){var n,r,i,o,a,s,u,l=x[e+" "];if(l)return t?0:l.slice(0);a=e,s=[],u=b.preFilter;while(a){for(o in n&&!(r=_.exec(a))||(r&&(a=a.slice(r[0].length)||a),s.push(i=[])),n=!1,(r=z.exec(a))&&(n=r.shift(),i.push({value:n,type:r[0].replace($," ")}),a=a.slice(n.length)),b.filter)!(r=G[o].exec(a))||u[o]&&!(r=u[o](r))||(n=r.shift(),i.push({value:n,type:o,matches:r}),a=a.slice(n.length));if(!n)break}return t?a.length:a?se.error(e):x(e,s).slice(0)},f=se.compile=function(e,t){var n,v,y,m,x,r,i=[],o=[],a=A[e+" "];if(!a){t||(t=h(e)),n=t.length;while(n--)(a=Ee(t[n]))[S]?i.push(a):o.push(a);(a=A(e,(v=o,m=0<(y=i).length,x=0<v.length,r=function(e,t,n,r,i){var o,a,s,u=0,l="0",c=e&&[],f=[],p=w,d=e||x&&b.find.TAG("*",i),h=k+=null==p?1:Math.random()||.1,g=d.length;for(i&&(w=t==C||t||i);l!==g&&null!=(o=d[l]);l++){if(x&&o){a=0,t||o.ownerDocument==C||(T(o),n=!E);while(s=v[a++])if(s(o,t||C,n)){r.push(o);break}i&&(k=h)}m&&((o=!s&&o)&&u--,e&&c.push(o))}if(u+=l,m&&l!==u){a=0;while(s=y[a++])s(c,f,t,n);if(e){if(0<u)while(l--)c[l]||f[l]||(f[l]=q.call(r));f=Te(f)}H.apply(r,f),i&&!e&&0<f.length&&1<u+y.length&&se.uniqueSort(r)}return i&&(k=h,w=p),c},m?le(r):r))).selector=e}return a},g=se.select=function(e,t,n,r){var i,o,a,s,u,l="function"==typeof e&&e,c=!r&&h(e=l.selector||e);if(n=n||[],1===c.length){if(2<(o=c[0]=c[0].slice(0)).length&&"ID"===(a=o[0]).type&&9===t.nodeType&&E&&b.relative[o[1].type]){if(!(t=(b.find.ID(a.matches[0].replace(te,ne),t)||[])[0]))return n;l&&(t=t.parentNode),e=e.slice(o.shift().value.length)}i=G.needsContext.test(e)?0:o.length;while(i--){if(a=o[i],b.relative[s=a.type])break;if((u=b.find[s])&&(r=u(a.matches[0].replace(te,ne),ee.test(o[0].type)&&ye(t.parentNode)||t))){if(o.splice(i,1),!(e=r.length&&xe(o)))return H.apply(n,r),n;break}}}return(l||f(e,c))(r,t,!E,n,!t||ee.test(e)&&ye(t.parentNode)||t),n},d.sortStable=S.split("").sort(D).join("")===S,d.detectDuplicates=!!l,T(),d.sortDetached=ce(function(e){return 1&e.compareDocumentPosition(C.createElement("fieldset"))}),ce(function(e){return e.innerHTML="<a href='#'></a>","#"===e.firstChild.getAttribute("href")})||fe("type|href|height|width",function(e,t,n){if(!n)return e.getAttribute(t,"type"===t.toLowerCase()?1:2)}),d.attributes&&ce(function(e){return e.innerHTML="<input/>",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")})||fe("value",function(e,t,n){if(!n&&"input"===e.nodeName.toLowerCase())return e.defaultValue}),ce(function(e){return null==e.getAttribute("disabled")})||fe(R,function(e,t,n){var r;if(!n)return!0===e[t]?t.toLowerCase():(r=e.getAttributeNode(t))&&r.specified?r.value:null}),se}(C);S.find=d,S.expr=d.selectors,S.expr[":"]=S.expr.pseudos,S.uniqueSort=S.unique=d.uniqueSort,S.text=d.getText,S.isXMLDoc=d.isXML,S.contains=d.contains,S.escapeSelector=d.escape;var h=function(e,t,n){var r=[],i=void 0!==n;while((e=e[t])&&9!==e.nodeType)if(1===e.nodeType){if(i&&S(e).is(n))break;r.push(e)}return r},T=function(e,t){for(var n=[];e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n},k=S.expr.match.needsContext;function A(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()}var N=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function D(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1<i.call(n,e)!==r}):S.filter(n,e,r)}S.filter=function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?S.find.matchesSelector(r,e)?[r]:[]:S.find.matches(e,S.grep(t,function(e){return 1===e.nodeType}))},S.fn.extend({find:function(e){var t,n,r=this.length,i=this;if("string"!=typeof e)return this.pushStack(S(e).filter(function(){for(t=0;t<r;t++)if(S.contains(i[t],this))return!0}));for(n=this.pushStack([]),t=0;t<r;t++)S.find(e,i[t],n);return 1<r?S.uniqueSort(n):n},filter:function(e){return this.pushStack(D(this,e||[],!1))},not:function(e){return this.pushStack(D(this,e||[],!0))},is:function(e){return!!D(this,"string"==typeof e&&k.test(e)?S(e):e||[],!1).length}});var j,q=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||j,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,j=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e<n;e++)if(S.contains(this,t[e]))return!0})},closest:function(e,t){var n,r=0,i=this.length,o=[],a="string"!=typeof e&&S(e);if(!k.test(e))for(;r<i;r++)for(n=this[r];n&&n!==t;n=n.parentNode)if(n.nodeType<11&&(a?-1<a.index(n):1===n.nodeType&&S.find.matchesSelector(n,e))){o.push(n);break}return this.pushStack(1<o.length?S.uniqueSort(o):o)},index:function(e){return e?"string"==typeof e?i.call(S(e),this[0]):i.call(this,e.jquery?e[0]:e):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){return this.pushStack(S.uniqueSort(S.merge(this.get(),S(e,t))))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}}),S.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return h(e,"parentNode")},parentsUntil:function(e,t,n){return h(e,"parentNode",n)},next:function(e){return O(e,"nextSibling")},prev:function(e){return O(e,"previousSibling")},nextAll:function(e){return h(e,"nextSibling")},prevAll:function(e){return h(e,"previousSibling")},nextUntil:function(e,t,n){return h(e,"nextSibling",n)},prevUntil:function(e,t,n){return h(e,"previousSibling",n)},siblings:function(e){return T((e.parentNode||{}).firstChild,e)},children:function(e){return T(e.firstChild)},contents:function(e){return null!=e.contentDocument&&r(e.contentDocument)?e.contentDocument:(A(e,"template")&&(e=e.content||e),S.merge([],e.childNodes))}},function(r,i){S.fn[r]=function(e,t){var n=S.map(this,i,e);return"Until"!==r.slice(-5)&&(t=e),t&&"string"==typeof t&&(n=S.filter(t,n)),1<this.length&&(H[r]||S.uniqueSort(n),L.test(r)&&n.reverse()),this.pushStack(n)}});var P=/[^\x20\t\r\n\f]+/g;function R(e){return e}function M(e){throw e}function I(e,t,n,r){var i;try{e&&m(i=e.promise)?i.call(e).done(t).fail(n):e&&m(i=e.then)?i.call(e,t,n):t.apply(void 0,[e].slice(r))}catch(e){n.apply(void 0,[e])}}S.Callbacks=function(r){var e,n;r="string"==typeof r?(e=r,n={},S.each(e.match(P)||[],function(e,t){n[t]=!0}),n):S.extend({},r);var i,t,o,a,s=[],u=[],l=-1,c=function(){for(a=a||r.once,o=i=!0;u.length;l=-1){t=u.shift();while(++l<s.length)!1===s[l].apply(t[0],t[1])&&r.stopOnFalse&&(l=s.length,t=!1)}r.memory||(t=!1),i=!1,a&&(s=t?[]:"")},f={add:function(){return s&&(t&&!i&&(l=s.length-1,u.push(t)),function n(e){S.each(e,function(e,t){m(t)?r.unique&&f.has(t)||s.push(t):t&&t.length&&"string"!==w(t)&&n(t)})}(arguments),t&&!i&&c()),this},remove:function(){return S.each(arguments,function(e,t){var n;while(-1<(n=S.inArray(t,s,n)))s.splice(n,1),n<=l&&l--}),this},has:function(e){return e?-1<S.inArray(e,s):0<s.length},empty:function(){return s&&(s=[]),this},disable:function(){return a=u=[],s=t="",this},disabled:function(){return!s},lock:function(){return a=u=[],t||i||(s=t=""),this},locked:function(){return!!a},fireWith:function(e,t){return a||(t=[e,(t=t||[]).slice?t.slice():t],u.push(t),i||c()),this},fire:function(){return f.fireWith(this,arguments),this},fired:function(){return!!o}};return f},S.extend({Deferred:function(e){var o=[["notify","progress",S.Callbacks("memory"),S.Callbacks("memory"),2],["resolve","done",S.Callbacks("once memory"),S.Callbacks("once memory"),0,"resolved"],["reject","fail",S.Callbacks("once memory"),S.Callbacks("once memory"),1,"rejected"]],i="pending",a={state:function(){return i},always:function(){return s.done(arguments).fail(arguments),this},"catch":function(e){return a.then(null,e)},pipe:function(){var i=arguments;return S.Deferred(function(r){S.each(o,function(e,t){var n=m(i[t[4]])&&i[t[4]];s[t[1]](function(){var e=n&&n.apply(this,arguments);e&&m(e.promise)?e.promise().progress(r.notify).done(r.resolve).fail(r.reject):r[t[0]+"With"](this,n?[e]:arguments)})}),i=null}).promise()},then:function(t,n,r){var u=0;function l(i,o,a,s){return function(){var n=this,r=arguments,e=function(){var e,t;if(!(i<u)){if((e=a.apply(n,r))===o.promise())throw new TypeError("Thenable self-resolution");t=e&&("object"==typeof e||"function"==typeof e)&&e.then,m(t)?s?t.call(e,l(u,o,R,s),l(u,o,M,s)):(u++,t.call(e,l(u,o,R,s),l(u,o,M,s),l(u,o,R,o.notifyWith))):(a!==R&&(n=void 0,r=[e]),(s||o.resolveWith)(n,r))}},t=s?e:function(){try{e()}catch(e){S.Deferred.exceptionHook&&S.Deferred.exceptionHook(e,t.stackTrace),u<=i+1&&(a!==M&&(n=void 0,r=[e]),o.rejectWith(n,r))}};i?t():(S.Deferred.getStackHook&&(t.stackTrace=S.Deferred.getStackHook()),C.setTimeout(t))}}return S.Deferred(function(e){o[0][3].add(l(0,e,m(r)?r:R,e.notifyWith)),o[1][3].add(l(0,e,m(t)?t:R)),o[2][3].add(l(0,e,m(n)?n:M))}).promise()},promise:function(e){return null!=e?S.extend(e,a):a}},s={};return S.each(o,function(e,t){var n=t[2],r=t[5];a[t[1]]=n.add,r&&n.add(function(){i=r},o[3-e][2].disable,o[3-e][3].disable,o[0][2].lock,o[0][3].lock),n.add(t[3].fire),s[t[0]]=function(){return s[t[0]+"With"](this===s?void 0:this,arguments),this},s[t[0]+"With"]=n.fireWith}),a.promise(s),e&&e.call(s,s),s},when:function(e){var n=arguments.length,t=n,r=Array(t),i=s.call(arguments),o=S.Deferred(),a=function(t){return function(e){r[t]=this,i[t]=1<arguments.length?s.call(arguments):e,--n||o.resolveWith(r,i)}};if(n<=1&&(I(e,o.done(a(t)).resolve,o.reject,!n),"pending"===o.state()||m(i[t]&&i[t].then)))return o.then();while(t--)I(i[t],a(t),o.reject);return o.promise()}});var W=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;S.Deferred.exceptionHook=function(e,t){C.console&&C.console.warn&&e&&W.test(e.name)&&C.console.warn("jQuery.Deferred exception: "+e.message,e.stack,t)},S.readyException=function(e){C.setTimeout(function(){throw e})};var F=S.Deferred();function B(){E.removeEventListener("DOMContentLoaded",B),C.removeEventListener("load",B),S.ready()}S.fn.ready=function(e){return F.then(e)["catch"](function(e){S.readyException(e)}),this},S.extend({isReady:!1,readyWait:1,ready:function(e){(!0===e?--S.readyWait:S.isReady)||(S.isReady=!0)!==e&&0<--S.readyWait||F.resolveWith(E,[S])}}),S.ready.then=F.then,"complete"===E.readyState||"loading"!==E.readyState&&!E.documentElement.doScroll?C.setTimeout(S.ready):(E.addEventListener("DOMContentLoaded",B),C.addEventListener("load",B));var $=function(e,t,n,r,i,o,a){var s=0,u=e.length,l=null==n;if("object"===w(n))for(s in i=!0,n)$(e,t,s,n[s],!0,o,a);else if(void 0!==r&&(i=!0,m(r)||(a=!0),l&&(a?(t.call(e,r),t=null):(l=t,t=function(e,t,n){return l.call(S(e),n)})),t))for(;s<u;s++)t(e[s],n,a?r:r.call(e[s],s,t(e[s],n)));return i?e:l?t.call(e):u?t(e[0],n):o},_=/^-ms-/,z=/-([a-z])/g;function U(e,t){return t.toUpperCase()}function X(e){return e.replace(_,"ms-").replace(z,U)}var V=function(e){return 1===e.nodeType||9===e.nodeType||!+e.nodeType};function G(){this.expando=S.expando+G.uid++}G.uid=1,G.prototype={cache:function(e){var t=e[this.expando];return t||(t={},V(e)&&(e.nodeType?e[this.expando]=t:Object.defineProperty(e,this.expando,{value:t,configurable:!0}))),t},set:function(e,t,n){var r,i=this.cache(e);if("string"==typeof t)i[X(t)]=n;else for(r in t)i[X(r)]=t[r];return i},get:function(e,t){return void 0===t?this.cache(e):e[this.expando]&&e[this.expando][X(t)]},access:function(e,t,n){return void 0===t||t&&"string"==typeof t&&void 0===n?this.get(e,t):(this.set(e,t,n),void 0!==n?n:t)},remove:function(e,t){var n,r=e[this.expando];if(void 0!==r){if(void 0!==t){n=(t=Array.isArray(t)?t.map(X):(t=X(t))in r?[t]:t.match(P)||[]).length;while(n--)delete r[t[n]]}(void 0===t||S.isEmptyObject(r))&&(e.nodeType?e[this.expando]=void 0:delete e[this.expando])}},hasData:function(e){var t=e[this.expando];return void 0!==t&&!S.isEmptyObject(t)}};var Y=new G,Q=new G,J=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,K=/[A-Z]/g;function Z(e,t,n){var r,i;if(void 0===n&&1===e.nodeType)if(r="data-"+t.replace(K,"-$&").toLowerCase(),"string"==typeof(n=e.getAttribute(r))){try{n="true"===(i=n)||"false"!==i&&("null"===i?null:i===+i+""?+i:J.test(i)?JSON.parse(i):i)}catch(e){}Q.set(e,t,n)}else n=void 0;return n}S.extend({hasData:function(e){return Q.hasData(e)||Y.hasData(e)},data:function(e,t,n){return Q.access(e,t,n)},removeData:function(e,t){Q.remove(e,t)},_data:function(e,t,n){return Y.access(e,t,n)},_removeData:function(e,t){Y.remove(e,t)}}),S.fn.extend({data:function(n,e){var t,r,i,o=this[0],a=o&&o.attributes;if(void 0===n){if(this.length&&(i=Q.get(o),1===o.nodeType&&!Y.get(o,"hasDataAttrs"))){t=a.length;while(t--)a[t]&&0===(r=a[t].name).indexOf("data-")&&(r=X(r.slice(5)),Z(o,r,i[r]));Y.set(o,"hasDataAttrs",!0)}return i}return"object"==typeof n?this.each(function(){Q.set(this,n)}):$(this,function(e){var t;if(o&&void 0===e)return void 0!==(t=Q.get(o,n))?t:void 0!==(t=Z(o,n))?t:void 0;this.each(function(){Q.set(this,n,e)})},null,e,1<arguments.length,null,!0)},removeData:function(e){return this.each(function(){Q.remove(this,e)})}}),S.extend({queue:function(e,t,n){var r;if(e)return t=(t||"fx")+"queue",r=Y.get(e,t),n&&(!r||Array.isArray(n)?r=Y.access(e,t,S.makeArray(n)):r.push(n)),r||[]},dequeue:function(e,t){t=t||"fx";var n=S.queue(e,t),r=n.length,i=n.shift(),o=S._queueHooks(e,t);"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,function(){S.dequeue(e,t)},o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return Y.get(e,n)||Y.access(e,n,{empty:S.Callbacks("once memory").add(function(){Y.remove(e,[t+"queue",n])})})}}),S.fn.extend({queue:function(t,n){var e=2;return"string"!=typeof t&&(n=t,t="fx",e--),arguments.length<e?S.queue(this[0],t):void 0===n?this:this.each(function(){var e=S.queue(this,t,n);S._queueHooks(this,t),"fx"===t&&"inprogress"!==e[0]&&S.dequeue(this,t)})},dequeue:function(e){return this.each(function(){S.dequeue(this,e)})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,t){var n,r=1,i=S.Deferred(),o=this,a=this.length,s=function(){--r||i.resolveWith(o,[o])};"string"!=typeof e&&(t=e,e=void 0),e=e||"fx";while(a--)(n=Y.get(o[a],e+"queueHooks"))&&n.empty&&(r++,n.empty.add(s));return s(),i.promise(t)}});var ee=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,te=new RegExp("^(?:([+-])=|)("+ee+")([a-z%]*)$","i"),ne=["Top","Right","Bottom","Left"],re=E.documentElement,ie=function(e){return S.contains(e.ownerDocument,e)},oe={composed:!0};re.getRootNode&&(ie=function(e){return S.contains(e.ownerDocument,e)||e.getRootNode(oe)===e.ownerDocument});var ae=function(e,t){return"none"===(e=t||e).style.display||""===e.style.display&&ie(e)&&"none"===S.css(e,"display")};function se(e,t,n,r){var i,o,a=20,s=r?function(){return r.cur()}:function(){return S.css(e,t,"")},u=s(),l=n&&n[3]||(S.cssNumber[t]?"":"px"),c=e.nodeType&&(S.cssNumber[t]||"px"!==l&&+u)&&te.exec(S.css(e,t));if(c&&c[3]!==l){u/=2,l=l||c[3],c=+u||1;while(a--)S.style(e,t,c+l),(1-o)*(1-(o=s()/u||.5))<=0&&(a=0),c/=o;c*=2,S.style(e,t,c+l),n=n||[]}return n&&(c=+c||+u||0,i=n[1]?c+(n[1]+1)*n[2]:+n[2],r&&(r.unit=l,r.start=c,r.end=i)),i}var ue={};function le(e,t){for(var n,r,i,o,a,s,u,l=[],c=0,f=e.length;c<f;c++)(r=e[c]).style&&(n=r.style.display,t?("none"===n&&(l[c]=Y.get(r,"display")||null,l[c]||(r.style.display="")),""===r.style.display&&ae(r)&&(l[c]=(u=a=o=void 0,a=(i=r).ownerDocument,s=i.nodeName,(u=ue[s])||(o=a.body.appendChild(a.createElement(s)),u=S.css(o,"display"),o.parentNode.removeChild(o),"none"===u&&(u="block"),ue[s]=u)))):"none"!==n&&(l[c]="none",Y.set(r,"display",n)));for(c=0;c<f;c++)null!=l[c]&&(e[c].style.display=l[c]);return e}S.fn.extend({show:function(){return le(this,!0)},hide:function(){return le(this)},toggle:function(e){return"boolean"==typeof e?e?this.show():this.hide():this.each(function(){ae(this)?S(this).show():S(this).hide()})}});var ce,fe,pe=/^(?:checkbox|radio)$/i,de=/<([a-z][^\/\0>\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="<textarea>x</textarea>",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="<option></option>",y.option=!!ce.lastChild;var ge={thead:[1,"<table>","</table>"],col:[2,"<table><colgroup>","</colgroup></table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n<r;n++)Y.set(e[n],"globalEval",!t||Y.get(t[n],"globalEval"))}ge.tbody=ge.tfoot=ge.colgroup=ge.caption=ge.thead,ge.th=ge.td,y.option||(ge.optgroup=ge.option=[1,"<select multiple='multiple'>","</select>"]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d<h;d++)if((o=e[d])||0===o)if("object"===w(o))S.merge(p,o.nodeType?[o]:o);else if(me.test(o)){a=a||f.appendChild(t.createElement("div")),s=(de.exec(o)||["",""])[1].toLowerCase(),u=ge[s]||ge._default,a.innerHTML=u[1]+S.htmlPrefilter(o)+u[2],c=u[0];while(c--)a=a.lastChild;S.merge(p,a.childNodes),(a=f.firstChild).textContent=""}else p.push(t.createTextNode(o));f.textContent="",d=0;while(o=p[d++])if(r&&-1<S.inArray(o,r))i&&i.push(o);else if(l=ie(o),a=ve(f.appendChild(o),"script"),l&&ye(a),n){c=0;while(o=a[c++])he.test(o.type||"")&&n.push(o)}return f}var be=/^key/,we=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Te=/^([^.]*)(?:\.(.+)|)/;function Ce(){return!0}function Ee(){return!1}function Se(e,t){return e===function(){try{return E.activeElement}catch(e){}}()==("focus"===t)}function ke(e,t,n,r,i,o){var a,s;if("object"==typeof t){for(s in"string"!=typeof n&&(r=r||n,n=void 0),t)ke(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=Ee;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return S().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=S.guid++)),e.each(function(){S.event.add(this,t,i,r,n)})}function Ae(e,i,o){o?(Y.set(e,i,!1),S.event.add(e,i,{namespace:!1,handler:function(e){var t,n,r=Y.get(this,i);if(1&e.isTrigger&&this[i]){if(r.length)(S.event.special[i]||{}).delegateType&&e.stopPropagation();else if(r=s.call(arguments),Y.set(this,i,r),t=o(this,i),this[i](),r!==(n=Y.get(this,i))||t?Y.set(this,i,!1):n={},r!==n)return e.stopImmediatePropagation(),e.preventDefault(),n.value}else r.length&&(Y.set(this,i,{value:S.event.trigger(S.extend(r[0],S.Event.prototype),r.slice(1),this)}),e.stopImmediatePropagation())}})):void 0===Y.get(e,i)&&S.event.add(e,i,Ce)}S.event={global:{},add:function(t,e,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Y.get(t);if(V(t)){n.handler&&(n=(o=n).handler,i=o.selector),i&&S.find.matchesSelector(re,i),n.guid||(n.guid=S.guid++),(u=v.events)||(u=v.events=Object.create(null)),(a=v.handle)||(a=v.handle=function(e){return"undefined"!=typeof S&&S.event.triggered!==e.type?S.event.dispatch.apply(t,arguments):void 0}),l=(e=(e||"").match(P)||[""]).length;while(l--)d=g=(s=Te.exec(e[l])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=S.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=S.event.special[d]||{},c=S.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&S.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,r,h,a)||t.addEventListener&&t.addEventListener(d,a)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),S.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Y.hasData(e)&&Y.get(e);if(v&&(u=v.events)){l=(t=(t||"").match(P)||[""]).length;while(l--)if(d=g=(s=Te.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d){f=S.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,v.handle)||S.removeEvent(e,d,v.handle),delete u[d])}else for(d in u)S.event.remove(e,d+t[l],n,r,!0);S.isEmptyObject(u)&&Y.remove(e,"handle events")}},dispatch:function(e){var t,n,r,i,o,a,s=new Array(arguments.length),u=S.event.fix(e),l=(Y.get(this,"events")||Object.create(null))[u.type]||[],c=S.event.special[u.type]||{};for(s[0]=u,t=1;t<arguments.length;t++)s[t]=arguments[t];if(u.delegateTarget=this,!c.preDispatch||!1!==c.preDispatch.call(this,u)){a=S.event.handlers.call(this,u,l),t=0;while((i=a[t++])&&!u.isPropagationStopped()){u.currentTarget=i.elem,n=0;while((o=i.handlers[n++])&&!u.isImmediatePropagationStopped())u.rnamespace&&!1!==o.namespace&&!u.rnamespace.test(o.namespace)||(u.handleObj=o,u.data=o.data,void 0!==(r=((S.event.special[o.origType]||{}).handle||o.handler).apply(i.elem,s))&&!1===(u.result=r)&&(u.preventDefault(),u.stopPropagation()))}return c.postDispatch&&c.postDispatch.call(this,u),u.result}},handlers:function(e,t){var n,r,i,o,a,s=[],u=t.delegateCount,l=e.target;if(u&&l.nodeType&&!("click"===e.type&&1<=e.button))for(;l!==this;l=l.parentNode||this)if(1===l.nodeType&&("click"!==e.type||!0!==l.disabled)){for(o=[],a={},n=0;n<u;n++)void 0===a[i=(r=t[n]).selector+" "]&&(a[i]=r.needsContext?-1<S(i,this).index(l):S.find(i,this,null,[l]).length),a[i]&&o.push(r);o.length&&s.push({elem:l,handlers:o})}return l=this,u<t.length&&s.push({elem:l,handlers:t.slice(u)}),s},addProp:function(t,e){Object.defineProperty(S.Event.prototype,t,{enumerable:!0,configurable:!0,get:m(e)?function(){if(this.originalEvent)return e(this.originalEvent)}:function(){if(this.originalEvent)return this.originalEvent[t]},set:function(e){Object.defineProperty(this,t,{enumerable:!0,configurable:!0,writable:!0,value:e})}})},fix:function(e){return e[S.expando]?e:new S.Event(e)},special:{load:{noBubble:!0},click:{setup:function(e){var t=this||e;return pe.test(t.type)&&t.click&&A(t,"input")&&Ae(t,"click",Ce),!1},trigger:function(e){var t=this||e;return pe.test(t.type)&&t.click&&A(t,"input")&&Ae(t,"click"),!0},_default:function(e){var t=e.target;return pe.test(t.type)&&t.click&&A(t,"input")&&Y.get(t,"click")||A(t,"a")}},beforeunload:{postDispatch:function(e){void 0!==e.result&&e.originalEvent&&(e.originalEvent.returnValue=e.result)}}}},S.removeEvent=function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n)},S.Event=function(e,t){if(!(this instanceof S.Event))return new S.Event(e,t);e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||void 0===e.defaultPrevented&&!1===e.returnValue?Ce:Ee,this.target=e.target&&3===e.target.nodeType?e.target.parentNode:e.target,this.currentTarget=e.currentTarget,this.relatedTarget=e.relatedTarget):this.type=e,t&&S.extend(this,t),this.timeStamp=e&&e.timeStamp||Date.now(),this[S.expando]=!0},S.Event.prototype={constructor:S.Event,isDefaultPrevented:Ee,isPropagationStopped:Ee,isImmediatePropagationStopped:Ee,isSimulated:!1,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=Ce,e&&!this.isSimulated&&e.preventDefault()},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=Ce,e&&!this.isSimulated&&e.stopPropagation()},stopImmediatePropagation:function(){var e=this.originalEvent;this.isImmediatePropagationStopped=Ce,e&&!this.isSimulated&&e.stopImmediatePropagation(),this.stopPropagation()}},S.each({altKey:!0,bubbles:!0,cancelable:!0,changedTouches:!0,ctrlKey:!0,detail:!0,eventPhase:!0,metaKey:!0,pageX:!0,pageY:!0,shiftKey:!0,view:!0,"char":!0,code:!0,charCode:!0,key:!0,keyCode:!0,button:!0,buttons:!0,clientX:!0,clientY:!0,offsetX:!0,offsetY:!0,pointerId:!0,pointerType:!0,screenX:!0,screenY:!0,targetTouches:!0,toElement:!0,touches:!0,which:function(e){var t=e.button;return null==e.which&&be.test(e.type)?null!=e.charCode?e.charCode:e.keyCode:!e.which&&void 0!==t&&we.test(e.type)?1&t?1:2&t?3:4&t?2:0:e.which}},S.event.addProp),S.each({focus:"focusin",blur:"focusout"},function(e,t){S.event.special[e]={setup:function(){return Ae(this,e,Se),!1},trigger:function(){return Ae(this,e),!0},delegateType:t}}),S.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(e,i){S.event.special[e]={delegateType:i,bindType:i,handle:function(e){var t,n=e.relatedTarget,r=e.handleObj;return n&&(n===this||S.contains(this,n))||(e.type=r.origType,t=r.handler.apply(this,arguments),e.type=i),t}}}),S.fn.extend({on:function(e,t,n,r){return ke(this,e,t,n,r)},one:function(e,t,n,r){return ke(this,e,t,n,r,1)},off:function(e,t,n){var r,i;if(e&&e.preventDefault&&e.handleObj)return r=e.handleObj,S(e.delegateTarget).off(r.namespace?r.origType+"."+r.namespace:r.origType,r.selector,r.handler),this;if("object"==typeof e){for(i in e)this.off(i,t,e[i]);return this}return!1!==t&&"function"!=typeof t||(n=t,t=void 0),!1===n&&(n=Ee),this.each(function(){S.event.remove(this,e,n,t)})}});var Ne=/<script|<style|<link/i,De=/checked\s*(?:[^=]|=\s*.checked.)/i,je=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g;function qe(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function Le(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function He(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Oe(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n<r;n++)S.event.add(t,i,s[i][n]);Q.hasData(e)&&(o=Q.access(e),a=S.extend({},o),Q.set(t,a))}}function Pe(n,r,i,o){r=g(r);var e,t,a,s,u,l,c=0,f=n.length,p=f-1,d=r[0],h=m(d);if(h||1<f&&"string"==typeof d&&!y.checkClone&&De.test(d))return n.each(function(e){var t=n.eq(e);h&&(r[0]=d.call(this,e,t.html())),Pe(t,r,i,o)});if(f&&(t=(e=xe(r,n[0].ownerDocument,!1,n,o)).firstChild,1===e.childNodes.length&&(e=t),t||o)){for(s=(a=S.map(ve(e,"script"),Le)).length;c<f;c++)u=e,c!==p&&(u=S.clone(u,!0,!0),s&&S.merge(a,ve(u,"script"))),i.call(n[c],u,c);if(s)for(l=a[a.length-1].ownerDocument,S.map(a,He),c=0;c<s;c++)u=a[c],he.test(u.type||"")&&!Y.access(u,"globalEval")&&S.contains(l,u)&&(u.src&&"module"!==(u.type||"").toLowerCase()?S._evalUrl&&!u.noModule&&S._evalUrl(u.src,{nonce:u.nonce||u.getAttribute("nonce")},l):b(u.textContent.replace(je,""),u,l))}return n}function Re(e,t,n){for(var r,i=t?S.filter(t,e):e,o=0;null!=(r=i[o]);o++)n||1!==r.nodeType||S.cleanData(ve(r)),r.parentNode&&(n&&ie(r)&&ye(ve(r,"script")),r.parentNode.removeChild(r));return e}S.extend({htmlPrefilter:function(e){return e},clone:function(e,t,n){var r,i,o,a,s,u,l,c=e.cloneNode(!0),f=ie(e);if(!(y.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||S.isXMLDoc(e)))for(a=ve(c),r=0,i=(o=ve(e)).length;r<i;r++)s=o[r],u=a[r],void 0,"input"===(l=u.nodeName.toLowerCase())&&pe.test(s.type)?u.checked=s.checked:"input"!==l&&"textarea"!==l||(u.defaultValue=s.defaultValue);if(t)if(n)for(o=o||ve(e),a=a||ve(c),r=0,i=o.length;r<i;r++)Oe(o[r],a[r]);else Oe(e,c);return 0<(a=ve(c,"script")).length&&ye(a,!f&&ve(e,"script")),c},cleanData:function(e){for(var t,n,r,i=S.event.special,o=0;void 0!==(n=e[o]);o++)if(V(n)){if(t=n[Y.expando]){if(t.events)for(r in t.events)i[r]?S.event.remove(n,r):S.removeEvent(n,r,t.handle);n[Y.expando]=void 0}n[Q.expando]&&(n[Q.expando]=void 0)}}}),S.fn.extend({detach:function(e){return Re(this,e,!0)},remove:function(e){return Re(this,e)},text:function(e){return $(this,function(e){return void 0===e?S.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=e)})},null,e,arguments.length)},append:function(){return Pe(this,arguments,function(e){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||qe(this,e).appendChild(e)})},prepend:function(){return Pe(this,arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=qe(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return Pe(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return Pe(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},empty:function(){for(var e,t=0;null!=(e=this[t]);t++)1===e.nodeType&&(S.cleanData(ve(e,!1)),e.textContent="");return this},clone:function(e,t){return e=null!=e&&e,t=null==t?e:t,this.map(function(){return S.clone(this,e,t)})},html:function(e){return $(this,function(e){var t=this[0]||{},n=0,r=this.length;if(void 0===e&&1===t.nodeType)return t.innerHTML;if("string"==typeof e&&!Ne.test(e)&&!ge[(de.exec(e)||["",""])[1].toLowerCase()]){e=S.htmlPrefilter(e);try{for(;n<r;n++)1===(t=this[n]||{}).nodeType&&(S.cleanData(ve(t,!1)),t.innerHTML=e);t=0}catch(e){}}t&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(){var n=[];return Pe(this,arguments,function(e){var t=this.parentNode;S.inArray(this,n)<0&&(S.cleanData(ve(this)),t&&t.replaceChild(e,this))},n)}}),S.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,a){S.fn[e]=function(e){for(var t,n=[],r=S(e),i=r.length-1,o=0;o<=i;o++)t=o===i?this:this.clone(!0),S(r[o])[a](t),u.apply(n,t.get());return this.pushStack(n)}});var Me=new RegExp("^("+ee+")(?!px)[a-z%]+$","i"),Ie=function(e){var t=e.ownerDocument.defaultView;return t&&t.opener||(t=C),t.getComputedStyle(e)},We=function(e,t,n){var r,i,o={};for(i in t)o[i]=e.style[i],e.style[i]=t[i];for(i in r=n.call(e),t)e.style[i]=o[i];return r},Fe=new RegExp(ne.join("|"),"i");function Be(e,t,n){var r,i,o,a,s=e.style;return(n=n||Ie(e))&&(""!==(a=n.getPropertyValue(t)||n[t])||ie(e)||(a=S.style(e,t)),!y.pixelBoxStyles()&&Me.test(a)&&Fe.test(t)&&(r=s.width,i=s.minWidth,o=s.maxWidth,s.minWidth=s.maxWidth=s.width=a,a=n.width,s.width=r,s.minWidth=i,s.maxWidth=o)),void 0!==a?a+"":a}function $e(e,t){return{get:function(){if(!e())return(this.get=t).apply(this,arguments);delete this.get}}}!function(){function e(){if(l){u.style.cssText="position:absolute;left:-11111px;width:60px;margin-top:1px;padding:0;border:0",l.style.cssText="position:relative;display:block;box-sizing:border-box;overflow:scroll;margin:auto;border:1px;padding:1px;width:60%;top:1%",re.appendChild(u).appendChild(l);var e=C.getComputedStyle(l);n="1%"!==e.top,s=12===t(e.marginLeft),l.style.right="60%",o=36===t(e.right),r=36===t(e.width),l.style.position="absolute",i=12===t(l.offsetWidth/3),re.removeChild(u),l=null}}function t(e){return Math.round(parseFloat(e))}var n,r,i,o,a,s,u=E.createElement("div"),l=E.createElement("div");l.style&&(l.style.backgroundClip="content-box",l.cloneNode(!0).style.backgroundClip="",y.clearCloneStyle="content-box"===l.style.backgroundClip,S.extend(y,{boxSizingReliable:function(){return e(),r},pixelBoxStyles:function(){return e(),o},pixelPosition:function(){return e(),n},reliableMarginLeft:function(){return e(),s},scrollboxSize:function(){return e(),i},reliableTrDimensions:function(){var e,t,n,r;return null==a&&(e=E.createElement("table"),t=E.createElement("tr"),n=E.createElement("div"),e.style.cssText="position:absolute;left:-11111px",t.style.height="1px",n.style.height="9px",re.appendChild(e).appendChild(t).appendChild(n),r=C.getComputedStyle(t),a=3<parseInt(r.height),re.removeChild(e)),a}}))}();var _e=["Webkit","Moz","ms"],ze=E.createElement("div").style,Ue={};function Xe(e){var t=S.cssProps[e]||Ue[e];return t||(e in ze?e:Ue[e]=function(e){var t=e[0].toUpperCase()+e.slice(1),n=_e.length;while(n--)if((e=_e[n]+t)in ze)return e}(e)||e)}var Ve=/^(none|table(?!-c[ea]).+)/,Ge=/^--/,Ye={position:"absolute",visibility:"hidden",display:"block"},Qe={letterSpacing:"0",fontWeight:"400"};function Je(e,t,n){var r=te.exec(t);return r?Math.max(0,r[2]-(n||0))+(r[3]||"px"):t}function Ke(e,t,n,r,i,o){var a="width"===t?1:0,s=0,u=0;if(n===(r?"border":"content"))return 0;for(;a<4;a+=2)"margin"===n&&(u+=S.css(e,n+ne[a],!0,i)),r?("content"===n&&(u-=S.css(e,"padding"+ne[a],!0,i)),"margin"!==n&&(u-=S.css(e,"border"+ne[a]+"Width",!0,i))):(u+=S.css(e,"padding"+ne[a],!0,i),"padding"!==n?u+=S.css(e,"border"+ne[a]+"Width",!0,i):s+=S.css(e,"border"+ne[a]+"Width",!0,i));return!r&&0<=o&&(u+=Math.max(0,Math.ceil(e["offset"+t[0].toUpperCase()+t.slice(1)]-o-u-s-.5))||0),u}function Ze(e,t,n){var r=Ie(e),i=(!y.boxSizingReliable()||n)&&"border-box"===S.css(e,"boxSizing",!1,r),o=i,a=Be(e,t,r),s="offset"+t[0].toUpperCase()+t.slice(1);if(Me.test(a)){if(!n)return a;a="auto"}return(!y.boxSizingReliable()&&i||!y.reliableTrDimensions()&&A(e,"tr")||"auto"===a||!parseFloat(a)&&"inline"===S.css(e,"display",!1,r))&&e.getClientRects().length&&(i="border-box"===S.css(e,"boxSizing",!1,r),(o=s in e)&&(a=e[s])),(a=parseFloat(a)||0)+Ke(e,t,n||(i?"border":"content"),o,r,a)+"px"}function et(e,t,n,r,i){return new et.prototype.init(e,t,n,r,i)}S.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=Be(e,"opacity");return""===n?"1":n}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,gridArea:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnStart:!0,gridRow:!0,gridRowEnd:!0,gridRowStart:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{},style:function(e,t,n,r){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var i,o,a,s=X(t),u=Ge.test(t),l=e.style;if(u||(t=Xe(s)),a=S.cssHooks[t]||S.cssHooks[s],void 0===n)return a&&"get"in a&&void 0!==(i=a.get(e,!1,r))?i:l[t];"string"===(o=typeof n)&&(i=te.exec(n))&&i[1]&&(n=se(e,t,i),o="number"),null!=n&&n==n&&("number"!==o||u||(n+=i&&i[3]||(S.cssNumber[s]?"":"px")),y.clearCloneStyle||""!==n||0!==t.indexOf("background")||(l[t]="inherit"),a&&"set"in a&&void 0===(n=a.set(e,n,r))||(u?l.setProperty(t,n):l[t]=n))}},css:function(e,t,n,r){var i,o,a,s=X(t);return Ge.test(t)||(t=Xe(s)),(a=S.cssHooks[t]||S.cssHooks[s])&&"get"in a&&(i=a.get(e,!0,n)),void 0===i&&(i=Be(e,t,r)),"normal"===i&&t in Qe&&(i=Qe[t]),""===n||n?(o=parseFloat(i),!0===n||isFinite(o)?o||0:i):i}}),S.each(["height","width"],function(e,u){S.cssHooks[u]={get:function(e,t,n){if(t)return!Ve.test(S.css(e,"display"))||e.getClientRects().length&&e.getBoundingClientRect().width?Ze(e,u,n):We(e,Ye,function(){return Ze(e,u,n)})},set:function(e,t,n){var r,i=Ie(e),o=!y.scrollboxSize()&&"absolute"===i.position,a=(o||n)&&"border-box"===S.css(e,"boxSizing",!1,i),s=n?Ke(e,u,n,a,i):0;return a&&o&&(s-=Math.ceil(e["offset"+u[0].toUpperCase()+u.slice(1)]-parseFloat(i[u])-Ke(e,u,"border",!1,i)-.5)),s&&(r=te.exec(t))&&"px"!==(r[3]||"px")&&(e.style[u]=t,t=S.css(e,u)),Je(0,t,s)}}}),S.cssHooks.marginLeft=$e(y.reliableMarginLeft,function(e,t){if(t)return(parseFloat(Be(e,"marginLeft"))||e.getBoundingClientRect().left-We(e,{marginLeft:0},function(){return e.getBoundingClientRect().left}))+"px"}),S.each({margin:"",padding:"",border:"Width"},function(i,o){S.cssHooks[i+o]={expand:function(e){for(var t=0,n={},r="string"==typeof e?e.split(" "):[e];t<4;t++)n[i+ne[t]+o]=r[t]||r[t-2]||r[0];return n}},"margin"!==i&&(S.cssHooks[i+o].set=Je)}),S.fn.extend({css:function(e,t){return $(this,function(e,t,n){var r,i,o={},a=0;if(Array.isArray(t)){for(r=Ie(e),i=t.length;a<i;a++)o[t[a]]=S.css(e,t[a],!1,r);return o}return void 0!==n?S.style(e,t,n):S.css(e,t)},e,t,1<arguments.length)}}),((S.Tween=et).prototype={constructor:et,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||S.easing._default,this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(S.cssNumber[n]?"":"px")},cur:function(){var e=et.propHooks[this.prop];return e&&e.get?e.get(this):et.propHooks._default.get(this)},run:function(e){var t,n=et.propHooks[this.prop];return this.options.duration?this.pos=t=S.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):this.pos=t=e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):et.propHooks._default.set(this),this}}).init.prototype=et.prototype,(et.propHooks={_default:{get:function(e){var t;return 1!==e.elem.nodeType||null!=e.elem[e.prop]&&null==e.elem.style[e.prop]?e.elem[e.prop]:(t=S.css(e.elem,e.prop,""))&&"auto"!==t?t:0},set:function(e){S.fx.step[e.prop]?S.fx.step[e.prop](e):1!==e.elem.nodeType||!S.cssHooks[e.prop]&&null==e.elem.style[Xe(e.prop)]?e.elem[e.prop]=e.now:S.style(e.elem,e.prop,e.now+e.unit)}}}).scrollTop=et.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},S.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2},_default:"swing"},S.fx=et.prototype.init,S.fx.step={};var tt,nt,rt,it,ot=/^(?:toggle|show|hide)$/,at=/queueHooks$/;function st(){nt&&(!1===E.hidden&&C.requestAnimationFrame?C.requestAnimationFrame(st):C.setTimeout(st,S.fx.interval),S.fx.tick())}function ut(){return C.setTimeout(function(){tt=void 0}),tt=Date.now()}function lt(e,t){var n,r=0,i={height:e};for(t=t?1:0;r<4;r+=2-t)i["margin"+(n=ne[r])]=i["padding"+n]=e;return t&&(i.opacity=i.width=e),i}function ct(e,t,n){for(var r,i=(ft.tweeners[t]||[]).concat(ft.tweeners["*"]),o=0,a=i.length;o<a;o++)if(r=i[o].call(n,t,e))return r}function ft(o,e,t){var n,a,r=0,i=ft.prefilters.length,s=S.Deferred().always(function(){delete u.elem}),u=function(){if(a)return!1;for(var e=tt||ut(),t=Math.max(0,l.startTime+l.duration-e),n=1-(t/l.duration||0),r=0,i=l.tweens.length;r<i;r++)l.tweens[r].run(n);return s.notifyWith(o,[l,n,t]),n<1&&i?t:(i||s.notifyWith(o,[l,1,0]),s.resolveWith(o,[l]),!1)},l=s.promise({elem:o,props:S.extend({},e),opts:S.extend(!0,{specialEasing:{},easing:S.easing._default},t),originalProperties:e,originalOptions:t,startTime:tt||ut(),duration:t.duration,tweens:[],createTween:function(e,t){var n=S.Tween(o,l.opts,e,t,l.opts.specialEasing[e]||l.opts.easing);return l.tweens.push(n),n},stop:function(e){var t=0,n=e?l.tweens.length:0;if(a)return this;for(a=!0;t<n;t++)l.tweens[t].run(1);return e?(s.notifyWith(o,[l,1,0]),s.resolveWith(o,[l,e])):s.rejectWith(o,[l,e]),this}}),c=l.props;for(!function(e,t){var n,r,i,o,a;for(n in e)if(i=t[r=X(n)],o=e[n],Array.isArray(o)&&(i=o[1],o=e[n]=o[0]),n!==r&&(e[r]=o,delete e[n]),(a=S.cssHooks[r])&&"expand"in a)for(n in o=a.expand(o),delete e[r],o)n in e||(e[n]=o[n],t[n]=i);else t[r]=i}(c,l.opts.specialEasing);r<i;r++)if(n=ft.prefilters[r].call(l,o,c,l.opts))return m(n.stop)&&(S._queueHooks(l.elem,l.opts.queue).stop=n.stop.bind(n)),n;return S.map(c,ct,l),m(l.opts.start)&&l.opts.start.call(o,l),l.progress(l.opts.progress).done(l.opts.done,l.opts.complete).fail(l.opts.fail).always(l.opts.always),S.fx.timer(S.extend(u,{elem:o,anim:l,queue:l.opts.queue})),l}S.Animation=S.extend(ft,{tweeners:{"*":[function(e,t){var n=this.createTween(e,t);return se(n.elem,e,te.exec(t),n),n}]},tweener:function(e,t){m(e)?(t=e,e=["*"]):e=e.match(P);for(var n,r=0,i=e.length;r<i;r++)n=e[r],ft.tweeners[n]=ft.tweeners[n]||[],ft.tweeners[n].unshift(t)},prefilters:[function(e,t,n){var r,i,o,a,s,u,l,c,f="width"in t||"height"in t,p=this,d={},h=e.style,g=e.nodeType&&ae(e),v=Y.get(e,"fxshow");for(r in n.queue||(null==(a=S._queueHooks(e,"fx")).unqueued&&(a.unqueued=0,s=a.empty.fire,a.empty.fire=function(){a.unqueued||s()}),a.unqueued++,p.always(function(){p.always(function(){a.unqueued--,S.queue(e,"fx").length||a.empty.fire()})})),t)if(i=t[r],ot.test(i)){if(delete t[r],o=o||"toggle"===i,i===(g?"hide":"show")){if("show"!==i||!v||void 0===v[r])continue;g=!0}d[r]=v&&v[r]||S.style(e,r)}if((u=!S.isEmptyObject(t))||!S.isEmptyObject(d))for(r in f&&1===e.nodeType&&(n.overflow=[h.overflow,h.overflowX,h.overflowY],null==(l=v&&v.display)&&(l=Y.get(e,"display")),"none"===(c=S.css(e,"display"))&&(l?c=l:(le([e],!0),l=e.style.display||l,c=S.css(e,"display"),le([e]))),("inline"===c||"inline-block"===c&&null!=l)&&"none"===S.css(e,"float")&&(u||(p.done(function(){h.display=l}),null==l&&(c=h.display,l="none"===c?"":c)),h.display="inline-block")),n.overflow&&(h.overflow="hidden",p.always(function(){h.overflow=n.overflow[0],h.overflowX=n.overflow[1],h.overflowY=n.overflow[2]})),u=!1,d)u||(v?"hidden"in v&&(g=v.hidden):v=Y.access(e,"fxshow",{display:l}),o&&(v.hidden=!g),g&&le([e],!0),p.done(function(){for(r in g||le([e]),Y.remove(e,"fxshow"),d)S.style(e,r,d[r])})),u=ct(g?v[r]:0,r,p),r in v||(v[r]=u.start,g&&(u.end=u.start,u.start=0))}],prefilter:function(e,t){t?ft.prefilters.unshift(e):ft.prefilters.push(e)}}),S.speed=function(e,t,n){var r=e&&"object"==typeof e?S.extend({},e):{complete:n||!n&&t||m(e)&&e,duration:e,easing:n&&t||t&&!m(t)&&t};return S.fx.off?r.duration=0:"number"!=typeof r.duration&&(r.duration in S.fx.speeds?r.duration=S.fx.speeds[r.duration]:r.duration=S.fx.speeds._default),null!=r.queue&&!0!==r.queue||(r.queue="fx"),r.old=r.complete,r.complete=function(){m(r.old)&&r.old.call(this),r.queue&&S.dequeue(this,r.queue)},r},S.fn.extend({fadeTo:function(e,t,n,r){return this.filter(ae).css("opacity",0).show().end().animate({opacity:t},e,n,r)},animate:function(t,e,n,r){var i=S.isEmptyObject(t),o=S.speed(e,n,r),a=function(){var e=ft(this,S.extend({},t),o);(i||Y.get(this,"finish"))&&e.stop(!0)};return a.finish=a,i||!1===o.queue?this.each(a):this.queue(o.queue,a)},stop:function(i,e,o){var a=function(e){var t=e.stop;delete e.stop,t(o)};return"string"!=typeof i&&(o=e,e=i,i=void 0),e&&this.queue(i||"fx",[]),this.each(function(){var e=!0,t=null!=i&&i+"queueHooks",n=S.timers,r=Y.get(this);if(t)r[t]&&r[t].stop&&a(r[t]);else for(t in r)r[t]&&r[t].stop&&at.test(t)&&a(r[t]);for(t=n.length;t--;)n[t].elem!==this||null!=i&&n[t].queue!==i||(n[t].anim.stop(o),e=!1,n.splice(t,1));!e&&o||S.dequeue(this,i)})},finish:function(a){return!1!==a&&(a=a||"fx"),this.each(function(){var e,t=Y.get(this),n=t[a+"queue"],r=t[a+"queueHooks"],i=S.timers,o=n?n.length:0;for(t.finish=!0,S.queue(this,a,[]),r&&r.stop&&r.stop.call(this,!0),e=i.length;e--;)i[e].elem===this&&i[e].queue===a&&(i[e].anim.stop(!0),i.splice(e,1));for(e=0;e<o;e++)n[e]&&n[e].finish&&n[e].finish.call(this);delete t.finish})}}),S.each(["toggle","show","hide"],function(e,r){var i=S.fn[r];S.fn[r]=function(e,t,n){return null==e||"boolean"==typeof e?i.apply(this,arguments):this.animate(lt(r,!0),e,t,n)}}),S.each({slideDown:lt("show"),slideUp:lt("hide"),slideToggle:lt("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(e,r){S.fn[e]=function(e,t,n){return this.animate(r,e,t,n)}}),S.timers=[],S.fx.tick=function(){var e,t=0,n=S.timers;for(tt=Date.now();t<n.length;t++)(e=n[t])()||n[t]!==e||n.splice(t--,1);n.length||S.fx.stop(),tt=void 0},S.fx.timer=function(e){S.timers.push(e),S.fx.start()},S.fx.interval=13,S.fx.start=function(){nt||(nt=!0,st())},S.fx.stop=function(){nt=null},S.fx.speeds={slow:600,fast:200,_default:400},S.fn.delay=function(r,e){return r=S.fx&&S.fx.speeds[r]||r,e=e||"fx",this.queue(e,function(e,t){var n=C.setTimeout(e,r);t.stop=function(){C.clearTimeout(n)}})},rt=E.createElement("input"),it=E.createElement("select").appendChild(E.createElement("option")),rt.type="checkbox",y.checkOn=""!==rt.value,y.optSelected=it.selected,(rt=E.createElement("input")).value="t",rt.type="radio",y.radioValue="t"===rt.value;var pt,dt=S.expr.attrHandle;S.fn.extend({attr:function(e,t){return $(this,S.attr,e,t,1<arguments.length)},removeAttr:function(e){return this.each(function(){S.removeAttr(this,e)})}}),S.extend({attr:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return"undefined"==typeof e.getAttribute?S.prop(e,t,n):(1===o&&S.isXMLDoc(e)||(i=S.attrHooks[t.toLowerCase()]||(S.expr.match.bool.test(t)?pt:void 0)),void 0!==n?null===n?void S.removeAttr(e,t):i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:(e.setAttribute(t,n+""),n):i&&"get"in i&&null!==(r=i.get(e,t))?r:null==(r=S.find.attr(e,t))?void 0:r)},attrHooks:{type:{set:function(e,t){if(!y.radioValue&&"radio"===t&&A(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},removeAttr:function(e,t){var n,r=0,i=t&&t.match(P);if(i&&1===e.nodeType)while(n=i[r++])e.removeAttribute(n)}}),pt={set:function(e,t,n){return!1===t?S.removeAttr(e,n):e.setAttribute(n,n),n}},S.each(S.expr.match.bool.source.match(/\w+/g),function(e,t){var a=dt[t]||S.find.attr;dt[t]=function(e,t,n){var r,i,o=t.toLowerCase();return n||(i=dt[o],dt[o]=r,r=null!=a(e,t,n)?o:null,dt[o]=i),r}});var ht=/^(?:input|select|textarea|button)$/i,gt=/^(?:a|area)$/i;function vt(e){return(e.match(P)||[]).join(" ")}function yt(e){return e.getAttribute&&e.getAttribute("class")||""}function mt(e){return Array.isArray(e)?e:"string"==typeof e&&e.match(P)||[]}S.fn.extend({prop:function(e,t){return $(this,S.prop,e,t,1<arguments.length)},removeProp:function(e){return this.each(function(){delete this[S.propFix[e]||e]})}}),S.extend({prop:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return 1===o&&S.isXMLDoc(e)||(t=S.propFix[t]||t,i=S.propHooks[t]),void 0!==n?i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:e[t]=n:i&&"get"in i&&null!==(r=i.get(e,t))?r:e[t]},propHooks:{tabIndex:{get:function(e){var t=S.find.attr(e,"tabindex");return t?parseInt(t,10):ht.test(e.nodeName)||gt.test(e.nodeName)&&e.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),y.optSelected||(S.propHooks.selected={get:function(e){var t=e.parentNode;return t&&t.parentNode&&t.parentNode.selectedIndex,null},set:function(e){var t=e.parentNode;t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex)}}),S.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){S.propFix[this.toLowerCase()]=this}),S.fn.extend({addClass:function(t){var e,n,r,i,o,a,s,u=0;if(m(t))return this.each(function(e){S(this).addClass(t.call(this,e,yt(this)))});if((e=mt(t)).length)while(n=this[u++])if(i=yt(n),r=1===n.nodeType&&" "+vt(i)+" "){a=0;while(o=e[a++])r.indexOf(" "+o+" ")<0&&(r+=o+" ");i!==(s=vt(r))&&n.setAttribute("class",s)}return this},removeClass:function(t){var e,n,r,i,o,a,s,u=0;if(m(t))return this.each(function(e){S(this).removeClass(t.call(this,e,yt(this)))});if(!arguments.length)return this.attr("class","");if((e=mt(t)).length)while(n=this[u++])if(i=yt(n),r=1===n.nodeType&&" "+vt(i)+" "){a=0;while(o=e[a++])while(-1<r.indexOf(" "+o+" "))r=r.replace(" "+o+" "," ");i!==(s=vt(r))&&n.setAttribute("class",s)}return this},toggleClass:function(i,t){var o=typeof i,a="string"===o||Array.isArray(i);return"boolean"==typeof t&&a?t?this.addClass(i):this.removeClass(i):m(i)?this.each(function(e){S(this).toggleClass(i.call(this,e,yt(this),t),t)}):this.each(function(){var e,t,n,r;if(a){t=0,n=S(this),r=mt(i);while(e=r[t++])n.hasClass(e)?n.removeClass(e):n.addClass(e)}else void 0!==i&&"boolean"!==o||((e=yt(this))&&Y.set(this,"__className__",e),this.setAttribute&&this.setAttribute("class",e||!1===i?"":Y.get(this,"__className__")||""))})},hasClass:function(e){var t,n,r=0;t=" "+e+" ";while(n=this[r++])if(1===n.nodeType&&-1<(" "+vt(yt(n))+" ").indexOf(t))return!0;return!1}});var xt=/\r/g;S.fn.extend({val:function(n){var r,e,i,t=this[0];return arguments.length?(i=m(n),this.each(function(e){var t;1===this.nodeType&&(null==(t=i?n.call(this,e,S(this).val()):n)?t="":"number"==typeof t?t+="":Array.isArray(t)&&(t=S.map(t,function(e){return null==e?"":e+""})),(r=S.valHooks[this.type]||S.valHooks[this.nodeName.toLowerCase()])&&"set"in r&&void 0!==r.set(this,t,"value")||(this.value=t))})):t?(r=S.valHooks[t.type]||S.valHooks[t.nodeName.toLowerCase()])&&"get"in r&&void 0!==(e=r.get(t,"value"))?e:"string"==typeof(e=t.value)?e.replace(xt,""):null==e?"":e:void 0}}),S.extend({valHooks:{option:{get:function(e){var t=S.find.attr(e,"value");return null!=t?t:vt(S.text(e))}},select:{get:function(e){var t,n,r,i=e.options,o=e.selectedIndex,a="select-one"===e.type,s=a?null:[],u=a?o+1:i.length;for(r=o<0?u:a?o:0;r<u;r++)if(((n=i[r]).selected||r===o)&&!n.disabled&&(!n.parentNode.disabled||!A(n.parentNode,"optgroup"))){if(t=S(n).val(),a)return t;s.push(t)}return s},set:function(e,t){var n,r,i=e.options,o=S.makeArray(t),a=i.length;while(a--)((r=i[a]).selected=-1<S.inArray(S.valHooks.option.get(r),o))&&(n=!0);return n||(e.selectedIndex=-1),o}}}}),S.each(["radio","checkbox"],function(){S.valHooks[this]={set:function(e,t){if(Array.isArray(t))return e.checked=-1<S.inArray(S(e).val(),t)}},y.checkOn||(S.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})}),y.focusin="onfocusin"in C;var bt=/^(?:focusinfocus|focusoutblur)$/,wt=function(e){e.stopPropagation()};S.extend(S.event,{trigger:function(e,t,n,r){var i,o,a,s,u,l,c,f,p=[n||E],d=v.call(e,"type")?e.type:e,h=v.call(e,"namespace")?e.namespace.split("."):[];if(o=f=a=n=n||E,3!==n.nodeType&&8!==n.nodeType&&!bt.test(d+S.event.triggered)&&(-1<d.indexOf(".")&&(d=(h=d.split(".")).shift(),h.sort()),u=d.indexOf(":")<0&&"on"+d,(e=e[S.expando]?e:new S.Event(d,"object"==typeof e&&e)).isTrigger=r?2:3,e.namespace=h.join("."),e.rnamespace=e.namespace?new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,e.result=void 0,e.target||(e.target=n),t=null==t?[e]:S.makeArray(t,[e]),c=S.event.special[d]||{},r||!c.trigger||!1!==c.trigger.apply(n,t))){if(!r&&!c.noBubble&&!x(n)){for(s=c.delegateType||d,bt.test(s+d)||(o=o.parentNode);o;o=o.parentNode)p.push(o),a=o;a===(n.ownerDocument||E)&&p.push(a.defaultView||a.parentWindow||C)}i=0;while((o=p[i++])&&!e.isPropagationStopped())f=o,e.type=1<i?s:c.bindType||d,(l=(Y.get(o,"events")||Object.create(null))[e.type]&&Y.get(o,"handle"))&&l.apply(o,t),(l=u&&o[u])&&l.apply&&V(o)&&(e.result=l.apply(o,t),!1===e.result&&e.preventDefault());return e.type=d,r||e.isDefaultPrevented()||c._default&&!1!==c._default.apply(p.pop(),t)||!V(n)||u&&m(n[d])&&!x(n)&&((a=n[u])&&(n[u]=null),S.event.triggered=d,e.isPropagationStopped()&&f.addEventListener(d,wt),n[d](),e.isPropagationStopped()&&f.removeEventListener(d,wt),S.event.triggered=void 0,a&&(n[u]=a)),e.result}},simulate:function(e,t,n){var r=S.extend(new S.Event,n,{type:e,isSimulated:!0});S.event.trigger(r,null,t)}}),S.fn.extend({trigger:function(e,t){return this.each(function(){S.event.trigger(e,t,this)})},triggerHandler:function(e,t){var n=this[0];if(n)return S.event.trigger(e,t,n,!0)}}),y.focusin||S.each({focus:"focusin",blur:"focusout"},function(n,r){var i=function(e){S.event.simulate(r,e.target,S.event.fix(e))};S.event.special[r]={setup:function(){var e=this.ownerDocument||this.document||this,t=Y.access(e,r);t||e.addEventListener(n,i,!0),Y.access(e,r,(t||0)+1)},teardown:function(){var e=this.ownerDocument||this.document||this,t=Y.access(e,r)-1;t?Y.access(e,r,t):(e.removeEventListener(n,i,!0),Y.remove(e,r))}}});var Tt=C.location,Ct={guid:Date.now()},Et=/\?/;S.parseXML=function(e){var t;if(!e||"string"!=typeof e)return null;try{t=(new C.DOMParser).parseFromString(e,"text/xml")}catch(e){t=void 0}return t&&!t.getElementsByTagName("parsererror").length||S.error("Invalid XML: "+e),t};var St=/\[\]$/,kt=/\r?\n/g,At=/^(?:submit|button|image|reset|file)$/i,Nt=/^(?:input|select|textarea|keygen)/i;function Dt(n,e,r,i){var t;if(Array.isArray(e))S.each(e,function(e,t){r||St.test(n)?i(n,t):Dt(n+"["+("object"==typeof t&&null!=t?e:"")+"]",t,r,i)});else if(r||"object"!==w(e))i(n,e);else for(t in e)Dt(n+"["+t+"]",e[t],r,i)}S.param=function(e,t){var n,r=[],i=function(e,t){var n=m(t)?t():t;r[r.length]=encodeURIComponent(e)+"="+encodeURIComponent(null==n?"":n)};if(null==e)return"";if(Array.isArray(e)||e.jquery&&!S.isPlainObject(e))S.each(e,function(){i(this.name,this.value)});else for(n in e)Dt(n,e[n],t,i);return r.join("&")},S.fn.extend({serialize:function(){return S.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=S.prop(this,"elements");return e?S.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!S(this).is(":disabled")&&Nt.test(this.nodeName)&&!At.test(e)&&(this.checked||!pe.test(e))}).map(function(e,t){var n=S(this).val();return null==n?null:Array.isArray(n)?S.map(n,function(e){return{name:t.name,value:e.replace(kt,"\r\n")}}):{name:t.name,value:n.replace(kt,"\r\n")}}).get()}});var jt=/%20/g,qt=/#.*$/,Lt=/([?&])_=[^&]*/,Ht=/^(.*?):[ \t]*([^\r\n]*)$/gm,Ot=/^(?:GET|HEAD)$/,Pt=/^\/\//,Rt={},Mt={},It="*/".concat("*"),Wt=E.createElement("a");function Ft(o){return function(e,t){"string"!=typeof e&&(t=e,e="*");var n,r=0,i=e.toLowerCase().match(P)||[];if(m(t))while(n=i[r++])"+"===n[0]?(n=n.slice(1)||"*",(o[n]=o[n]||[]).unshift(t)):(o[n]=o[n]||[]).push(t)}}function Bt(t,i,o,a){var s={},u=t===Mt;function l(e){var r;return s[e]=!0,S.each(t[e]||[],function(e,t){var n=t(i,o,a);return"string"!=typeof n||u||s[n]?u?!(r=n):void 0:(i.dataTypes.unshift(n),l(n),!1)}),r}return l(i.dataTypes[0])||!s["*"]&&l("*")}function $t(e,t){var n,r,i=S.ajaxSettings.flatOptions||{};for(n in t)void 0!==t[n]&&((i[n]?e:r||(r={}))[n]=t[n]);return r&&S.extend(!0,e,r),e}Wt.href=Tt.href,S.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:Tt.href,type:"GET",isLocal:/^(?:about|app|app-storage|.+-extension|file|res|widget):$/.test(Tt.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":It,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":S.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?$t($t(e,S.ajaxSettings),t):$t(S.ajaxSettings,e)},ajaxPrefilter:Ft(Rt),ajaxTransport:Ft(Mt),ajax:function(e,t){"object"==typeof e&&(t=e,e=void 0),t=t||{};var c,f,p,n,d,r,h,g,i,o,v=S.ajaxSetup({},t),y=v.context||v,m=v.context&&(y.nodeType||y.jquery)?S(y):S.event,x=S.Deferred(),b=S.Callbacks("once memory"),w=v.statusCode||{},a={},s={},u="canceled",T={readyState:0,getResponseHeader:function(e){var t;if(h){if(!n){n={};while(t=Ht.exec(p))n[t[1].toLowerCase()+" "]=(n[t[1].toLowerCase()+" "]||[]).concat(t[2])}t=n[e.toLowerCase()+" "]}return null==t?null:t.join(", ")},getAllResponseHeaders:function(){return h?p:null},setRequestHeader:function(e,t){return null==h&&(e=s[e.toLowerCase()]=s[e.toLowerCase()]||e,a[e]=t),this},overrideMimeType:function(e){return null==h&&(v.mimeType=e),this},statusCode:function(e){var t;if(e)if(h)T.always(e[T.status]);else for(t in e)w[t]=[w[t],e[t]];return this},abort:function(e){var t=e||u;return c&&c.abort(t),l(0,t),this}};if(x.promise(T),v.url=((e||v.url||Tt.href)+"").replace(Pt,Tt.protocol+"//"),v.type=t.method||t.type||v.method||v.type,v.dataTypes=(v.dataType||"*").toLowerCase().match(P)||[""],null==v.crossDomain){r=E.createElement("a");try{r.href=v.url,r.href=r.href,v.crossDomain=Wt.protocol+"//"+Wt.host!=r.protocol+"//"+r.host}catch(e){v.crossDomain=!0}}if(v.data&&v.processData&&"string"!=typeof v.data&&(v.data=S.param(v.data,v.traditional)),Bt(Rt,v,t,T),h)return T;for(i in(g=S.event&&v.global)&&0==S.active++&&S.event.trigger("ajaxStart"),v.type=v.type.toUpperCase(),v.hasContent=!Ot.test(v.type),f=v.url.replace(qt,""),v.hasContent?v.data&&v.processData&&0===(v.contentType||"").indexOf("application/x-www-form-urlencoded")&&(v.data=v.data.replace(jt,"+")):(o=v.url.slice(f.length),v.data&&(v.processData||"string"==typeof v.data)&&(f+=(Et.test(f)?"&":"?")+v.data,delete v.data),!1===v.cache&&(f=f.replace(Lt,"$1"),o=(Et.test(f)?"&":"?")+"_="+Ct.guid+++o),v.url=f+o),v.ifModified&&(S.lastModified[f]&&T.setRequestHeader("If-Modified-Since",S.lastModified[f]),S.etag[f]&&T.setRequestHeader("If-None-Match",S.etag[f])),(v.data&&v.hasContent&&!1!==v.contentType||t.contentType)&&T.setRequestHeader("Content-Type",v.contentType),T.setRequestHeader("Accept",v.dataTypes[0]&&v.accepts[v.dataTypes[0]]?v.accepts[v.dataTypes[0]]+("*"!==v.dataTypes[0]?", "+It+"; q=0.01":""):v.accepts["*"]),v.headers)T.setRequestHeader(i,v.headers[i]);if(v.beforeSend&&(!1===v.beforeSend.call(y,T,v)||h))return T.abort();if(u="abort",b.add(v.complete),T.done(v.success),T.fail(v.error),c=Bt(Mt,v,t,T)){if(T.readyState=1,g&&m.trigger("ajaxSend",[T,v]),h)return T;v.async&&0<v.timeout&&(d=C.setTimeout(function(){T.abort("timeout")},v.timeout));try{h=!1,c.send(a,l)}catch(e){if(h)throw e;l(-1,e)}}else l(-1,"No Transport");function l(e,t,n,r){var i,o,a,s,u,l=t;h||(h=!0,d&&C.clearTimeout(d),c=void 0,p=r||"",T.readyState=0<e?4:0,i=200<=e&&e<300||304===e,n&&(s=function(e,t,n){var r,i,o,a,s=e.contents,u=e.dataTypes;while("*"===u[0])u.shift(),void 0===r&&(r=e.mimeType||t.getResponseHeader("Content-Type"));if(r)for(i in s)if(s[i]&&s[i].test(r)){u.unshift(i);break}if(u[0]in n)o=u[0];else{for(i in n){if(!u[0]||e.converters[i+" "+u[0]]){o=i;break}a||(a=i)}o=o||a}if(o)return o!==u[0]&&u.unshift(o),n[o]}(v,T,n)),!i&&-1<S.inArray("script",v.dataTypes)&&(v.converters["text script"]=function(){}),s=function(e,t,n,r){var i,o,a,s,u,l={},c=e.dataTypes.slice();if(c[1])for(a in e.converters)l[a.toLowerCase()]=e.converters[a];o=c.shift();while(o)if(e.responseFields[o]&&(n[e.responseFields[o]]=t),!u&&r&&e.dataFilter&&(t=e.dataFilter(t,e.dataType)),u=o,o=c.shift())if("*"===o)o=u;else if("*"!==u&&u!==o){if(!(a=l[u+" "+o]||l["* "+o]))for(i in l)if((s=i.split(" "))[1]===o&&(a=l[u+" "+s[0]]||l["* "+s[0]])){!0===a?a=l[i]:!0!==l[i]&&(o=s[0],c.unshift(s[1]));break}if(!0!==a)if(a&&e["throws"])t=a(t);else try{t=a(t)}catch(e){return{state:"parsererror",error:a?e:"No conversion from "+u+" to "+o}}}return{state:"success",data:t}}(v,s,T,i),i?(v.ifModified&&((u=T.getResponseHeader("Last-Modified"))&&(S.lastModified[f]=u),(u=T.getResponseHeader("etag"))&&(S.etag[f]=u)),204===e||"HEAD"===v.type?l="nocontent":304===e?l="notmodified":(l=s.state,o=s.data,i=!(a=s.error))):(a=l,!e&&l||(l="error",e<0&&(e=0))),T.status=e,T.statusText=(t||l)+"",i?x.resolveWith(y,[o,l,T]):x.rejectWith(y,[T,l,a]),T.statusCode(w),w=void 0,g&&m.trigger(i?"ajaxSuccess":"ajaxError",[T,v,i?o:a]),b.fireWith(y,[T,l]),g&&(m.trigger("ajaxComplete",[T,v]),--S.active||S.event.trigger("ajaxStop")))}return T},getJSON:function(e,t,n){return S.get(e,t,n,"json")},getScript:function(e,t){return S.get(e,void 0,t,"script")}}),S.each(["get","post"],function(e,i){S[i]=function(e,t,n,r){return m(t)&&(r=r||n,n=t,t=void 0),S.ajax(S.extend({url:e,type:i,dataType:r,data:t,success:n},S.isPlainObject(e)&&e))}}),S.ajaxPrefilter(function(e){var t;for(t in e.headers)"content-type"===t.toLowerCase()&&(e.contentType=e.headers[t]||"")}),S._evalUrl=function(e,t,n){return S.ajax({url:e,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,converters:{"text script":function(){}},dataFilter:function(e){S.globalEval(e,t,n)}})},S.fn.extend({wrapAll:function(e){var t;return this[0]&&(m(e)&&(e=e.call(this[0])),t=S(e,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstElementChild)e=e.firstElementChild;return e}).append(this)),this},wrapInner:function(n){return m(n)?this.each(function(e){S(this).wrapInner(n.call(this,e))}):this.each(function(){var e=S(this),t=e.contents();t.length?t.wrapAll(n):e.append(n)})},wrap:function(t){var n=m(t);return this.each(function(e){S(this).wrapAll(n?t.call(this,e):t)})},unwrap:function(e){return this.parent(e).not("body").each(function(){S(this).replaceWith(this.childNodes)}),this}}),S.expr.pseudos.hidden=function(e){return!S.expr.pseudos.visible(e)},S.expr.pseudos.visible=function(e){return!!(e.offsetWidth||e.offsetHeight||e.getClientRects().length)},S.ajaxSettings.xhr=function(){try{return new C.XMLHttpRequest}catch(e){}};var _t={0:200,1223:204},zt=S.ajaxSettings.xhr();y.cors=!!zt&&"withCredentials"in zt,y.ajax=zt=!!zt,S.ajaxTransport(function(i){var o,a;if(y.cors||zt&&!i.crossDomain)return{send:function(e,t){var n,r=i.xhr();if(r.open(i.type,i.url,i.async,i.username,i.password),i.xhrFields)for(n in i.xhrFields)r[n]=i.xhrFields[n];for(n in i.mimeType&&r.overrideMimeType&&r.overrideMimeType(i.mimeType),i.crossDomain||e["X-Requested-With"]||(e["X-Requested-With"]="XMLHttpRequest"),e)r.setRequestHeader(n,e[n]);o=function(e){return function(){o&&(o=a=r.onload=r.onerror=r.onabort=r.ontimeout=r.onreadystatechange=null,"abort"===e?r.abort():"error"===e?"number"!=typeof r.status?t(0,"error"):t(r.status,r.statusText):t(_t[r.status]||r.status,r.statusText,"text"!==(r.responseType||"text")||"string"!=typeof r.responseText?{binary:r.response}:{text:r.responseText},r.getAllResponseHeaders()))}},r.onload=o(),a=r.onerror=r.ontimeout=o("error"),void 0!==r.onabort?r.onabort=a:r.onreadystatechange=function(){4===r.readyState&&C.setTimeout(function(){o&&a()})},o=o("abort");try{r.send(i.hasContent&&i.data||null)}catch(e){if(o)throw e}},abort:function(){o&&o()}}}),S.ajaxPrefilter(function(e){e.crossDomain&&(e.contents.script=!1)}),S.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(e){return S.globalEval(e),e}}}),S.ajaxPrefilter("script",function(e){void 0===e.cache&&(e.cache=!1),e.crossDomain&&(e.type="GET")}),S.ajaxTransport("script",function(n){var r,i;if(n.crossDomain||n.scriptAttrs)return{send:function(e,t){r=S("<script>").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var Ut,Xt=[],Vt=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Xt.pop()||S.expando+"_"+Ct.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Vt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Vt.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Vt,"$1"+r):!1!==e.jsonp&&(e.url+=(Et.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Xt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((Ut=E.implementation.createHTMLDocument("").body).innerHTML="<form></form><form></form>",2===Ut.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1<s&&(r=vt(e.slice(s)),e=e.slice(0,s)),m(t)?(n=t,t=void 0):t&&"object"==typeof t&&(i="POST"),0<a.length&&S.ajax({url:e,type:i||"GET",dataType:"html",data:t}).done(function(e){o=arguments,a.html(r?S("<div>").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):("number"==typeof f.top&&(f.top+="px"),"number"==typeof f.left&&(f.left+="px"),c.css(f))}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=$e(y.pixelPosition,function(e,t){if(t)return t=Be(e,n),Me.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0<arguments.length?this.on(n,null,e,t):this.trigger(n)}});var Gt=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;S.proxy=function(e,t){var n,r,i;if("string"==typeof t&&(n=e[t],t=e,e=n),m(e))return r=s.call(arguments,2),(i=function(){return e.apply(t||this,r.concat(s.call(arguments)))}).guid=e.guid=e.guid||S.guid++,i},S.holdReady=function(e){e?S.readyWait++:S.ready(!0)},S.isArray=Array.isArray,S.parseJSON=JSON.parse,S.nodeName=A,S.isFunction=m,S.isWindow=x,S.camelCase=X,S.type=w,S.now=Date.now,S.isNumeric=function(e){var t=S.type(e);return("number"===t||"string"===t)&&!isNaN(e-parseFloat(e))},S.trim=function(e){return null==e?"":(e+"").replace(Gt,"")},"function"==typeof define&&define.amd&&define("jquery",[],function(){return S});var Yt=C.jQuery,Qt=C.$;return S.noConflict=function(e){return C.$===S&&(C.$=Qt),e&&C.jQuery===S&&(C.jQuery=Yt),S},"undefined"==typeof e&&(C.jQuery=C.$=S),S});
diff --git a/doc/script-dir/jquery-ui.min.css b/doc/script-dir/jquery-ui.min.css
new file mode 100644
index 0000000000000000000000000000000000000000..6be72f58c02d8f73e8c757d1bb56793d586e8c46
--- /dev/null
+++ b/doc/script-dir/jquery-ui.min.css
@@ -0,0 +1,7 @@
+/*! jQuery UI - v1.12.1 - 2018-12-06
+* http://jqueryui.com
+* Includes: core.css, autocomplete.css, menu.css, theme.css
+* To view and modify this theme, visit http://jqueryui.com/themeroller/?scope=&folderName=custom-theme&bgImgOpacityError=95&bgImgOpacityHighlight=55&bgImgOpacityActive=65&bgImgOpacityHover=75&bgImgOpacityDefault=75&bgImgOpacityContent=75&bgImgOpacityHeader=75&cornerRadiusShadow=8px&offsetLeftShadow=-8px&offsetTopShadow=-8px&thicknessShadow=8px&opacityShadow=30&bgImgOpacityShadow=0&bgTextureShadow=flat&bgColorShadow=%23aaaaaa&opacityOverlay=30&bgImgOpacityOverlay=0&bgTextureOverlay=flat&bgColorOverlay=%23aaaaaa&iconColorError=%23cd0a0a&fcError=%23cd0a0a&borderColorError=%23cd0a0a&bgTextureError=glass&bgColorError=%23fef1ec&iconColorHighlight=%232e83ff&fcHighlight=%23363636&borderColorHighlight=%23fcefa1&bgTextureHighlight=glass&bgColorHighlight=%23fbf9ee&iconColorActive=%23454545&fcActive=%23212121&borderColorActive=%23aaaaaa&bgTextureActive=glass&bgColorActive=%23dadada&iconColorHover=%23454545&fcHover=%23212121&borderColorHover=%23999999&bgTextureHover=glass&bgColorHover=%23dadada&iconColorDefault=%23888888&fcDefault=%23555555&borderColorDefault=%23d3d3d3&bgTextureDefault=glass&bgColorDefault=%23e6e6e6&iconColorContent=%23222222&fcContent=%23222222&borderColorContent=%23aaaaaa&bgTextureContent=flat&bgColorContent=%23ffffff&iconColorHeader=%23222222&fcHeader=%23222222&borderColorHeader=%23aaaaaa&bgTextureHeader=highlight_soft&bgColorHeader=%23cccccc&cornerRadius=4px&fwDefault=normal&fsDefault=1.1em&ffDefault=Verdana%2CArial%2Csans-serif
+* Copyright jQuery Foundation and other contributors; Licensed MIT */
+
+.ui-helper-hidden{display:none}.ui-helper-hidden-accessible{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.ui-helper-reset{margin:0;padding:0;border:0;outline:0;line-height:1.3;text-decoration:none;font-size:100%;list-style:none}.ui-helper-clearfix:before,.ui-helper-clearfix:after{content:"";display:table;border-collapse:collapse}.ui-helper-clearfix:after{clear:both}.ui-helper-zfix{width:100%;height:100%;top:0;left:0;position:absolute;opacity:0;filter:Alpha(Opacity=0)}.ui-front{z-index:100}.ui-state-disabled{cursor:default!important;pointer-events:none}.ui-icon{display:inline-block;vertical-align:middle;margin-top:-.25em;position:relative;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat}.ui-widget-icon-block{left:50%;margin-left:-8px;display:block}.ui-widget-overlay{position:fixed;top:0;left:0;width:100%;height:100%}.ui-autocomplete{position:absolute;top:0;left:0;cursor:default}.ui-menu{list-style:none;padding:0;margin:0;display:block;outline:0}.ui-menu .ui-menu{position:absolute}.ui-menu .ui-menu-item{margin:0;cursor:pointer;list-style-image:url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7")}.ui-menu .ui-menu-item-wrapper{position:relative;padding:3px 1em 3px .4em}.ui-menu .ui-menu-divider{margin:5px 0;height:0;font-size:0;line-height:0;border-width:1px 0 0 0}.ui-menu .ui-state-focus,.ui-menu .ui-state-active{margin:-1px}.ui-menu-icons{position:relative}.ui-menu-icons .ui-menu-item-wrapper{padding-left:2em}.ui-menu .ui-icon{position:absolute;top:0;bottom:0;left:.2em;margin:auto 0}.ui-menu .ui-menu-icon{left:auto;right:0}.ui-widget{font-family:Verdana,Arial,sans-serif;font-size:1.1em}.ui-widget .ui-widget{font-size:1em}.ui-widget input,.ui-widget select,.ui-widget textarea,.ui-widget button{font-family:Verdana,Arial,sans-serif;font-size:1em}.ui-widget.ui-widget-content{border:1px solid #d3d3d3}.ui-widget-content{border:1px solid #aaa;background:#fff;color:#222}.ui-widget-content a{color:#222}.ui-widget-header{border:1px solid #aaa;background:#ccc url("images/ui-bg_highlight-soft_75_cccccc_1x100.png") 50% 50% repeat-x;color:#222;font-weight:bold}.ui-widget-header a{color:#222}.ui-state-default,.ui-widget-content .ui-state-default,.ui-widget-header .ui-state-default,.ui-button,html .ui-button.ui-state-disabled:hover,html .ui-button.ui-state-disabled:active{border:1px solid #d3d3d3;background:#e6e6e6 url("images/ui-bg_glass_75_e6e6e6_1x400.png") 50% 50% repeat-x;font-weight:normal;color:#555}.ui-state-default a,.ui-state-default a:link,.ui-state-default a:visited,a.ui-button,a:link.ui-button,a:visited.ui-button,.ui-button{color:#555;text-decoration:none}.ui-state-hover,.ui-widget-content .ui-state-hover,.ui-widget-header .ui-state-hover,.ui-state-focus,.ui-widget-content .ui-state-focus,.ui-widget-header .ui-state-focus,.ui-button:hover,.ui-button:focus{border:1px solid #999;background:#dadada url("images/ui-bg_glass_75_dadada_1x400.png") 50% 50% repeat-x;font-weight:normal;color:#212121}.ui-state-hover a,.ui-state-hover a:hover,.ui-state-hover a:link,.ui-state-hover a:visited,.ui-state-focus a,.ui-state-focus a:hover,.ui-state-focus a:link,.ui-state-focus a:visited,a.ui-button:hover,a.ui-button:focus{color:#212121;text-decoration:none}.ui-visual-focus{box-shadow:0 0 3px 1px rgb(94,158,214)}.ui-state-active,.ui-widget-content .ui-state-active,.ui-widget-header .ui-state-active,a.ui-button:active,.ui-button:active,.ui-button.ui-state-active:hover{border:1px solid #aaa;background:#dadada url("images/ui-bg_glass_65_dadada_1x400.png") 50% 50% repeat-x;font-weight:normal;color:#212121}.ui-icon-background,.ui-state-active .ui-icon-background{border:#aaa;background-color:#212121}.ui-state-active a,.ui-state-active a:link,.ui-state-active a:visited{color:#212121;text-decoration:none}.ui-state-highlight,.ui-widget-content .ui-state-highlight,.ui-widget-header .ui-state-highlight{border:1px solid #fcefa1;background:#fbf9ee url("images/ui-bg_glass_55_fbf9ee_1x400.png") 50% 50% repeat-x;color:#363636}.ui-state-checked{border:1px solid #fcefa1;background:#fbf9ee}.ui-state-highlight a,.ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a{color:#363636}.ui-state-error,.ui-widget-content .ui-state-error,.ui-widget-header .ui-state-error{border:1px solid #cd0a0a;background:#fef1ec url("images/ui-bg_glass_95_fef1ec_1x400.png") 50% 50% repeat-x;color:#cd0a0a}.ui-state-error a,.ui-widget-content .ui-state-error a,.ui-widget-header .ui-state-error a{color:#cd0a0a}.ui-state-error-text,.ui-widget-content .ui-state-error-text,.ui-widget-header .ui-state-error-text{color:#cd0a0a}.ui-priority-primary,.ui-widget-content .ui-priority-primary,.ui-widget-header .ui-priority-primary{font-weight:bold}.ui-priority-secondary,.ui-widget-content .ui-priority-secondary,.ui-widget-header .ui-priority-secondary{opacity:.7;filter:Alpha(Opacity=70);font-weight:normal}.ui-state-disabled,.ui-widget-content .ui-state-disabled,.ui-widget-header .ui-state-disabled{opacity:.35;filter:Alpha(Opacity=35);background-image:none}.ui-state-disabled .ui-icon{filter:Alpha(Opacity=35)}.ui-icon{width:16px;height:16px}.ui-icon,.ui-widget-content .ui-icon{background-image:url("images/ui-icons_222222_256x240.png")}.ui-widget-header .ui-icon{background-image:url("images/ui-icons_222222_256x240.png")}.ui-state-hover .ui-icon,.ui-state-focus .ui-icon,.ui-button:hover .ui-icon,.ui-button:focus .ui-icon{background-image:url("images/ui-icons_454545_256x240.png")}.ui-state-active .ui-icon,.ui-button:active .ui-icon{background-image:url("images/ui-icons_454545_256x240.png")}.ui-state-highlight .ui-icon,.ui-button .ui-state-highlight.ui-icon{background-image:url("images/ui-icons_2e83ff_256x240.png")}.ui-state-error .ui-icon,.ui-state-error-text .ui-icon{background-image:url("images/ui-icons_cd0a0a_256x240.png")}.ui-button .ui-icon{background-image:url("images/ui-icons_888888_256x240.png")}.ui-icon-blank{background-position:16px 16px}.ui-icon-caret-1-n{background-position:0 0}.ui-icon-caret-1-ne{background-position:-16px 0}.ui-icon-caret-1-e{background-position:-32px 0}.ui-icon-caret-1-se{background-position:-48px 0}.ui-icon-caret-1-s{background-position:-65px 0}.ui-icon-caret-1-sw{background-position:-80px 0}.ui-icon-caret-1-w{background-position:-96px 0}.ui-icon-caret-1-nw{background-position:-112px 0}.ui-icon-caret-2-n-s{background-position:-128px 0}.ui-icon-caret-2-e-w{background-position:-144px 0}.ui-icon-triangle-1-n{background-position:0 -16px}.ui-icon-triangle-1-ne{background-position:-16px -16px}.ui-icon-triangle-1-e{background-position:-32px -16px}.ui-icon-triangle-1-se{background-position:-48px -16px}.ui-icon-triangle-1-s{background-position:-65px -16px}.ui-icon-triangle-1-sw{background-position:-80px -16px}.ui-icon-triangle-1-w{background-position:-96px -16px}.ui-icon-triangle-1-nw{background-position:-112px -16px}.ui-icon-triangle-2-n-s{background-position:-128px -16px}.ui-icon-triangle-2-e-w{background-position:-144px -16px}.ui-icon-arrow-1-n{background-position:0 -32px}.ui-icon-arrow-1-ne{background-position:-16px -32px}.ui-icon-arrow-1-e{background-position:-32px -32px}.ui-icon-arrow-1-se{background-position:-48px -32px}.ui-icon-arrow-1-s{background-position:-65px -32px}.ui-icon-arrow-1-sw{background-position:-80px -32px}.ui-icon-arrow-1-w{background-position:-96px -32px}.ui-icon-arrow-1-nw{background-position:-112px -32px}.ui-icon-arrow-2-n-s{background-position:-128px -32px}.ui-icon-arrow-2-ne-sw{background-position:-144px -32px}.ui-icon-arrow-2-e-w{background-position:-160px -32px}.ui-icon-arrow-2-se-nw{background-position:-176px -32px}.ui-icon-arrowstop-1-n{background-position:-192px -32px}.ui-icon-arrowstop-1-e{background-position:-208px -32px}.ui-icon-arrowstop-1-s{background-position:-224px -32px}.ui-icon-arrowstop-1-w{background-position:-240px -32px}.ui-icon-arrowthick-1-n{background-position:1px -48px}.ui-icon-arrowthick-1-ne{background-position:-16px -48px}.ui-icon-arrowthick-1-e{background-position:-32px -48px}.ui-icon-arrowthick-1-se{background-position:-48px -48px}.ui-icon-arrowthick-1-s{background-position:-64px -48px}.ui-icon-arrowthick-1-sw{background-position:-80px -48px}.ui-icon-arrowthick-1-w{background-position:-96px -48px}.ui-icon-arrowthick-1-nw{background-position:-112px -48px}.ui-icon-arrowthick-2-n-s{background-position:-128px -48px}.ui-icon-arrowthick-2-ne-sw{background-position:-144px -48px}.ui-icon-arrowthick-2-e-w{background-position:-160px -48px}.ui-icon-arrowthick-2-se-nw{background-position:-176px -48px}.ui-icon-arrowthickstop-1-n{background-position:-192px -48px}.ui-icon-arrowthickstop-1-e{background-position:-208px -48px}.ui-icon-arrowthickstop-1-s{background-position:-224px -48px}.ui-icon-arrowthickstop-1-w{background-position:-240px -48px}.ui-icon-arrowreturnthick-1-w{background-position:0 -64px}.ui-icon-arrowreturnthick-1-n{background-position:-16px -64px}.ui-icon-arrowreturnthick-1-e{background-position:-32px -64px}.ui-icon-arrowreturnthick-1-s{background-position:-48px -64px}.ui-icon-arrowreturn-1-w{background-position:-64px -64px}.ui-icon-arrowreturn-1-n{background-position:-80px -64px}.ui-icon-arrowreturn-1-e{background-position:-96px -64px}.ui-icon-arrowreturn-1-s{background-position:-112px -64px}.ui-icon-arrowrefresh-1-w{background-position:-128px -64px}.ui-icon-arrowrefresh-1-n{background-position:-144px -64px}.ui-icon-arrowrefresh-1-e{background-position:-160px -64px}.ui-icon-arrowrefresh-1-s{background-position:-176px -64px}.ui-icon-arrow-4{background-position:0 -80px}.ui-icon-arrow-4-diag{background-position:-16px -80px}.ui-icon-extlink{background-position:-32px -80px}.ui-icon-newwin{background-position:-48px -80px}.ui-icon-refresh{background-position:-64px -80px}.ui-icon-shuffle{background-position:-80px -80px}.ui-icon-transfer-e-w{background-position:-96px -80px}.ui-icon-transferthick-e-w{background-position:-112px -80px}.ui-icon-folder-collapsed{background-position:0 -96px}.ui-icon-folder-open{background-position:-16px -96px}.ui-icon-document{background-position:-32px -96px}.ui-icon-document-b{background-position:-48px -96px}.ui-icon-note{background-position:-64px -96px}.ui-icon-mail-closed{background-position:-80px -96px}.ui-icon-mail-open{background-position:-96px -96px}.ui-icon-suitcase{background-position:-112px -96px}.ui-icon-comment{background-position:-128px -96px}.ui-icon-person{background-position:-144px -96px}.ui-icon-print{background-position:-160px -96px}.ui-icon-trash{background-position:-176px -96px}.ui-icon-locked{background-position:-192px -96px}.ui-icon-unlocked{background-position:-208px -96px}.ui-icon-bookmark{background-position:-224px -96px}.ui-icon-tag{background-position:-240px -96px}.ui-icon-home{background-position:0 -112px}.ui-icon-flag{background-position:-16px -112px}.ui-icon-calendar{background-position:-32px -112px}.ui-icon-cart{background-position:-48px -112px}.ui-icon-pencil{background-position:-64px -112px}.ui-icon-clock{background-position:-80px -112px}.ui-icon-disk{background-position:-96px -112px}.ui-icon-calculator{background-position:-112px -112px}.ui-icon-zoomin{background-position:-128px -112px}.ui-icon-zoomout{background-position:-144px -112px}.ui-icon-search{background-position:-160px -112px}.ui-icon-wrench{background-position:-176px -112px}.ui-icon-gear{background-position:-192px -112px}.ui-icon-heart{background-position:-208px -112px}.ui-icon-star{background-position:-224px -112px}.ui-icon-link{background-position:-240px -112px}.ui-icon-cancel{background-position:0 -128px}.ui-icon-plus{background-position:-16px -128px}.ui-icon-plusthick{background-position:-32px -128px}.ui-icon-minus{background-position:-48px -128px}.ui-icon-minusthick{background-position:-64px -128px}.ui-icon-close{background-position:-80px -128px}.ui-icon-closethick{background-position:-96px -128px}.ui-icon-key{background-position:-112px -128px}.ui-icon-lightbulb{background-position:-128px -128px}.ui-icon-scissors{background-position:-144px -128px}.ui-icon-clipboard{background-position:-160px -128px}.ui-icon-copy{background-position:-176px -128px}.ui-icon-contact{background-position:-192px -128px}.ui-icon-image{background-position:-208px -128px}.ui-icon-video{background-position:-224px -128px}.ui-icon-script{background-position:-240px -128px}.ui-icon-alert{background-position:0 -144px}.ui-icon-info{background-position:-16px -144px}.ui-icon-notice{background-position:-32px -144px}.ui-icon-help{background-position:-48px -144px}.ui-icon-check{background-position:-64px -144px}.ui-icon-bullet{background-position:-80px -144px}.ui-icon-radio-on{background-position:-96px -144px}.ui-icon-radio-off{background-position:-112px -144px}.ui-icon-pin-w{background-position:-128px -144px}.ui-icon-pin-s{background-position:-144px -144px}.ui-icon-play{background-position:0 -160px}.ui-icon-pause{background-position:-16px -160px}.ui-icon-seek-next{background-position:-32px -160px}.ui-icon-seek-prev{background-position:-48px -160px}.ui-icon-seek-end{background-position:-64px -160px}.ui-icon-seek-start{background-position:-80px -160px}.ui-icon-seek-first{background-position:-80px -160px}.ui-icon-stop{background-position:-96px -160px}.ui-icon-eject{background-position:-112px -160px}.ui-icon-volume-off{background-position:-128px -160px}.ui-icon-volume-on{background-position:-144px -160px}.ui-icon-power{background-position:0 -176px}.ui-icon-signal-diag{background-position:-16px -176px}.ui-icon-signal{background-position:-32px -176px}.ui-icon-battery-0{background-position:-48px -176px}.ui-icon-battery-1{background-position:-64px -176px}.ui-icon-battery-2{background-position:-80px -176px}.ui-icon-battery-3{background-position:-96px -176px}.ui-icon-circle-plus{background-position:0 -192px}.ui-icon-circle-minus{background-position:-16px -192px}.ui-icon-circle-close{background-position:-32px -192px}.ui-icon-circle-triangle-e{background-position:-48px -192px}.ui-icon-circle-triangle-s{background-position:-64px -192px}.ui-icon-circle-triangle-w{background-position:-80px -192px}.ui-icon-circle-triangle-n{background-position:-96px -192px}.ui-icon-circle-arrow-e{background-position:-112px -192px}.ui-icon-circle-arrow-s{background-position:-128px -192px}.ui-icon-circle-arrow-w{background-position:-144px -192px}.ui-icon-circle-arrow-n{background-position:-160px -192px}.ui-icon-circle-zoomin{background-position:-176px -192px}.ui-icon-circle-zoomout{background-position:-192px -192px}.ui-icon-circle-check{background-position:-208px -192px}.ui-icon-circlesmall-plus{background-position:0 -208px}.ui-icon-circlesmall-minus{background-position:-16px -208px}.ui-icon-circlesmall-close{background-position:-32px -208px}.ui-icon-squaresmall-plus{background-position:-48px -208px}.ui-icon-squaresmall-minus{background-position:-64px -208px}.ui-icon-squaresmall-close{background-position:-80px -208px}.ui-icon-grip-dotted-vertical{background-position:0 -224px}.ui-icon-grip-dotted-horizontal{background-position:-16px -224px}.ui-icon-grip-solid-vertical{background-position:-32px -224px}.ui-icon-grip-solid-horizontal{background-position:-48px -224px}.ui-icon-gripsmall-diagonal-se{background-position:-64px -224px}.ui-icon-grip-diagonal-se{background-position:-80px -224px}.ui-corner-all,.ui-corner-top,.ui-corner-left,.ui-corner-tl{border-top-left-radius:4px}.ui-corner-all,.ui-corner-top,.ui-corner-right,.ui-corner-tr{border-top-right-radius:4px}.ui-corner-all,.ui-corner-bottom,.ui-corner-left,.ui-corner-bl{border-bottom-left-radius:4px}.ui-corner-all,.ui-corner-bottom,.ui-corner-right,.ui-corner-br{border-bottom-right-radius:4px}.ui-widget-overlay{background:#aaa;opacity:.3;filter:Alpha(Opacity=30)}.ui-widget-shadow{-webkit-box-shadow:-8px -8px 8px #aaa;box-shadow:-8px -8px 8px #aaa}
\ No newline at end of file
diff --git a/doc/script-dir/jquery-ui.min.js b/doc/script-dir/jquery-ui.min.js
new file mode 100644
index 0000000000000000000000000000000000000000..54d4beb85548ca427eb45ce54b6517e04404c8a6
--- /dev/null
+++ b/doc/script-dir/jquery-ui.min.js
@@ -0,0 +1,6 @@
+/*! jQuery UI - v1.12.1 - 2018-12-06
+* http://jqueryui.com
+* Includes: widget.js, position.js, keycode.js, unique-id.js, widgets/autocomplete.js, widgets/menu.js
+* Copyright jQuery Foundation and other contributors; Licensed MIT */
+
+(function(t){"function"==typeof define&&define.amd?define(["jquery"],t):t(jQuery)})(function(t){t.ui=t.ui||{},t.ui.version="1.12.1";var e=0,i=Array.prototype.slice;t.cleanData=function(e){return function(i){var s,n,o;for(o=0;null!=(n=i[o]);o++)try{s=t._data(n,"events"),s&&s.remove&&t(n).triggerHandler("remove")}catch(a){}e(i)}}(t.cleanData),t.widget=function(e,i,s){var n,o,a,r={},l=e.split(".")[0];e=e.split(".")[1];var h=l+"-"+e;return s||(s=i,i=t.Widget),t.isArray(s)&&(s=t.extend.apply(null,[{}].concat(s))),t.expr[":"][h.toLowerCase()]=function(e){return!!t.data(e,h)},t[l]=t[l]||{},n=t[l][e],o=t[l][e]=function(t,e){return this._createWidget?(arguments.length&&this._createWidget(t,e),void 0):new o(t,e)},t.extend(o,n,{version:s.version,_proto:t.extend({},s),_childConstructors:[]}),a=new i,a.options=t.widget.extend({},a.options),t.each(s,function(e,s){return t.isFunction(s)?(r[e]=function(){function t(){return i.prototype[e].apply(this,arguments)}function n(t){return i.prototype[e].apply(this,t)}return function(){var e,i=this._super,o=this._superApply;return this._super=t,this._superApply=n,e=s.apply(this,arguments),this._super=i,this._superApply=o,e}}(),void 0):(r[e]=s,void 0)}),o.prototype=t.widget.extend(a,{widgetEventPrefix:n?a.widgetEventPrefix||e:e},r,{constructor:o,namespace:l,widgetName:e,widgetFullName:h}),n?(t.each(n._childConstructors,function(e,i){var s=i.prototype;t.widget(s.namespace+"."+s.widgetName,o,i._proto)}),delete n._childConstructors):i._childConstructors.push(o),t.widget.bridge(e,o),o},t.widget.extend=function(e){for(var s,n,o=i.call(arguments,1),a=0,r=o.length;r>a;a++)for(s in o[a])n=o[a][s],o[a].hasOwnProperty(s)&&void 0!==n&&(e[s]=t.isPlainObject(n)?t.isPlainObject(e[s])?t.widget.extend({},e[s],n):t.widget.extend({},n):n);return e},t.widget.bridge=function(e,s){var n=s.prototype.widgetFullName||e;t.fn[e]=function(o){var a="string"==typeof o,r=i.call(arguments,1),l=this;return a?this.length||"instance"!==o?this.each(function(){var i,s=t.data(this,n);return"instance"===o?(l=s,!1):s?t.isFunction(s[o])&&"_"!==o.charAt(0)?(i=s[o].apply(s,r),i!==s&&void 0!==i?(l=i&&i.jquery?l.pushStack(i.get()):i,!1):void 0):t.error("no such method '"+o+"' for "+e+" widget instance"):t.error("cannot call methods on "+e+" prior to initialization; "+"attempted to call method '"+o+"'")}):l=void 0:(r.length&&(o=t.widget.extend.apply(null,[o].concat(r))),this.each(function(){var e=t.data(this,n);e?(e.option(o||{}),e._init&&e._init()):t.data(this,n,new s(o,this))})),l}},t.Widget=function(){},t.Widget._childConstructors=[],t.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",defaultElement:"<div>",options:{classes:{},disabled:!1,create:null},_createWidget:function(i,s){s=t(s||this.defaultElement||this)[0],this.element=t(s),this.uuid=e++,this.eventNamespace="."+this.widgetName+this.uuid,this.bindings=t(),this.hoverable=t(),this.focusable=t(),this.classesElementLookup={},s!==this&&(t.data(s,this.widgetFullName,this),this._on(!0,this.element,{remove:function(t){t.target===s&&this.destroy()}}),this.document=t(s.style?s.ownerDocument:s.document||s),this.window=t(this.document[0].defaultView||this.document[0].parentWindow)),this.options=t.widget.extend({},this.options,this._getCreateOptions(),i),this._create(),this.options.disabled&&this._setOptionDisabled(this.options.disabled),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:function(){return{}},_getCreateEventData:t.noop,_create:t.noop,_init:t.noop,destroy:function(){var e=this;this._destroy(),t.each(this.classesElementLookup,function(t,i){e._removeClass(i,t)}),this.element.off(this.eventNamespace).removeData(this.widgetFullName),this.widget().off(this.eventNamespace).removeAttr("aria-disabled"),this.bindings.off(this.eventNamespace)},_destroy:t.noop,widget:function(){return this.element},option:function(e,i){var s,n,o,a=e;if(0===arguments.length)return t.widget.extend({},this.options);if("string"==typeof e)if(a={},s=e.split("."),e=s.shift(),s.length){for(n=a[e]=t.widget.extend({},this.options[e]),o=0;s.length-1>o;o++)n[s[o]]=n[s[o]]||{},n=n[s[o]];if(e=s.pop(),1===arguments.length)return void 0===n[e]?null:n[e];n[e]=i}else{if(1===arguments.length)return void 0===this.options[e]?null:this.options[e];a[e]=i}return this._setOptions(a),this},_setOptions:function(t){var e;for(e in t)this._setOption(e,t[e]);return this},_setOption:function(t,e){return"classes"===t&&this._setOptionClasses(e),this.options[t]=e,"disabled"===t&&this._setOptionDisabled(e),this},_setOptionClasses:function(e){var i,s,n;for(i in e)n=this.classesElementLookup[i],e[i]!==this.options.classes[i]&&n&&n.length&&(s=t(n.get()),this._removeClass(n,i),s.addClass(this._classes({element:s,keys:i,classes:e,add:!0})))},_setOptionDisabled:function(t){this._toggleClass(this.widget(),this.widgetFullName+"-disabled",null,!!t),t&&(this._removeClass(this.hoverable,null,"ui-state-hover"),this._removeClass(this.focusable,null,"ui-state-focus"))},enable:function(){return this._setOptions({disabled:!1})},disable:function(){return this._setOptions({disabled:!0})},_classes:function(e){function i(i,o){var a,r;for(r=0;i.length>r;r++)a=n.classesElementLookup[i[r]]||t(),a=e.add?t(t.unique(a.get().concat(e.element.get()))):t(a.not(e.element).get()),n.classesElementLookup[i[r]]=a,s.push(i[r]),o&&e.classes[i[r]]&&s.push(e.classes[i[r]])}var s=[],n=this;return e=t.extend({element:this.element,classes:this.options.classes||{}},e),this._on(e.element,{remove:"_untrackClassesElement"}),e.keys&&i(e.keys.match(/\S+/g)||[],!0),e.extra&&i(e.extra.match(/\S+/g)||[]),s.join(" ")},_untrackClassesElement:function(e){var i=this;t.each(i.classesElementLookup,function(s,n){-1!==t.inArray(e.target,n)&&(i.classesElementLookup[s]=t(n.not(e.target).get()))})},_removeClass:function(t,e,i){return this._toggleClass(t,e,i,!1)},_addClass:function(t,e,i){return this._toggleClass(t,e,i,!0)},_toggleClass:function(t,e,i,s){s="boolean"==typeof s?s:i;var n="string"==typeof t||null===t,o={extra:n?e:i,keys:n?t:e,element:n?this.element:t,add:s};return o.element.toggleClass(this._classes(o),s),this},_on:function(e,i,s){var n,o=this;"boolean"!=typeof e&&(s=i,i=e,e=!1),s?(i=n=t(i),this.bindings=this.bindings.add(i)):(s=i,i=this.element,n=this.widget()),t.each(s,function(s,a){function r(){return e||o.options.disabled!==!0&&!t(this).hasClass("ui-state-disabled")?("string"==typeof a?o[a]:a).apply(o,arguments):void 0}"string"!=typeof a&&(r.guid=a.guid=a.guid||r.guid||t.guid++);var l=s.match(/^([\w:-]*)\s*(.*)$/),h=l[1]+o.eventNamespace,c=l[2];c?n.on(h,c,r):i.on(h,r)})},_off:function(e,i){i=(i||"").split(" ").join(this.eventNamespace+" ")+this.eventNamespace,e.off(i).off(i),this.bindings=t(this.bindings.not(e).get()),this.focusable=t(this.focusable.not(e).get()),this.hoverable=t(this.hoverable.not(e).get())},_delay:function(t,e){function i(){return("string"==typeof t?s[t]:t).apply(s,arguments)}var s=this;return setTimeout(i,e||0)},_hoverable:function(e){this.hoverable=this.hoverable.add(e),this._on(e,{mouseenter:function(e){this._addClass(t(e.currentTarget),null,"ui-state-hover")},mouseleave:function(e){this._removeClass(t(e.currentTarget),null,"ui-state-hover")}})},_focusable:function(e){this.focusable=this.focusable.add(e),this._on(e,{focusin:function(e){this._addClass(t(e.currentTarget),null,"ui-state-focus")},focusout:function(e){this._removeClass(t(e.currentTarget),null,"ui-state-focus")}})},_trigger:function(e,i,s){var n,o,a=this.options[e];if(s=s||{},i=t.Event(i),i.type=(e===this.widgetEventPrefix?e:this.widgetEventPrefix+e).toLowerCase(),i.target=this.element[0],o=i.originalEvent)for(n in o)n in i||(i[n]=o[n]);return this.element.trigger(i,s),!(t.isFunction(a)&&a.apply(this.element[0],[i].concat(s))===!1||i.isDefaultPrevented())}},t.each({show:"fadeIn",hide:"fadeOut"},function(e,i){t.Widget.prototype["_"+e]=function(s,n,o){"string"==typeof n&&(n={effect:n});var a,r=n?n===!0||"number"==typeof n?i:n.effect||i:e;n=n||{},"number"==typeof n&&(n={duration:n}),a=!t.isEmptyObject(n),n.complete=o,n.delay&&s.delay(n.delay),a&&t.effects&&t.effects.effect[r]?s[e](n):r!==e&&s[r]?s[r](n.duration,n.easing,o):s.queue(function(i){t(this)[e](),o&&o.call(s[0]),i()})}}),t.widget,function(){function e(t,e,i){return[parseFloat(t[0])*(u.test(t[0])?e/100:1),parseFloat(t[1])*(u.test(t[1])?i/100:1)]}function i(e,i){return parseInt(t.css(e,i),10)||0}function s(e){var i=e[0];return 9===i.nodeType?{width:e.width(),height:e.height(),offset:{top:0,left:0}}:t.isWindow(i)?{width:e.width(),height:e.height(),offset:{top:e.scrollTop(),left:e.scrollLeft()}}:i.preventDefault?{width:0,height:0,offset:{top:i.pageY,left:i.pageX}}:{width:e.outerWidth(),height:e.outerHeight(),offset:e.offset()}}var n,o=Math.max,a=Math.abs,r=/left|center|right/,l=/top|center|bottom/,h=/[\+\-]\d+(\.[\d]+)?%?/,c=/^\w+/,u=/%$/,d=t.fn.position;t.position={scrollbarWidth:function(){if(void 0!==n)return n;var e,i,s=t("<div style='display:block;position:absolute;width:50px;height:50px;overflow:hidden;'><div style='height:100px;width:auto;'></div></div>"),o=s.children()[0];return t("body").append(s),e=o.offsetWidth,s.css("overflow","scroll"),i=o.offsetWidth,e===i&&(i=s[0].clientWidth),s.remove(),n=e-i},getScrollInfo:function(e){var i=e.isWindow||e.isDocument?"":e.element.css("overflow-x"),s=e.isWindow||e.isDocument?"":e.element.css("overflow-y"),n="scroll"===i||"auto"===i&&e.width<e.element[0].scrollWidth,o="scroll"===s||"auto"===s&&e.height<e.element[0].scrollHeight;return{width:o?t.position.scrollbarWidth():0,height:n?t.position.scrollbarWidth():0}},getWithinInfo:function(e){var i=t(e||window),s=t.isWindow(i[0]),n=!!i[0]&&9===i[0].nodeType,o=!s&&!n;return{element:i,isWindow:s,isDocument:n,offset:o?t(e).offset():{left:0,top:0},scrollLeft:i.scrollLeft(),scrollTop:i.scrollTop(),width:i.outerWidth(),height:i.outerHeight()}}},t.fn.position=function(n){if(!n||!n.of)return d.apply(this,arguments);n=t.extend({},n);var u,p,f,g,m,_,v=t(n.of),b=t.position.getWithinInfo(n.within),y=t.position.getScrollInfo(b),w=(n.collision||"flip").split(" "),k={};return _=s(v),v[0].preventDefault&&(n.at="left top"),p=_.width,f=_.height,g=_.offset,m=t.extend({},g),t.each(["my","at"],function(){var t,e,i=(n[this]||"").split(" ");1===i.length&&(i=r.test(i[0])?i.concat(["center"]):l.test(i[0])?["center"].concat(i):["center","center"]),i[0]=r.test(i[0])?i[0]:"center",i[1]=l.test(i[1])?i[1]:"center",t=h.exec(i[0]),e=h.exec(i[1]),k[this]=[t?t[0]:0,e?e[0]:0],n[this]=[c.exec(i[0])[0],c.exec(i[1])[0]]}),1===w.length&&(w[1]=w[0]),"right"===n.at[0]?m.left+=p:"center"===n.at[0]&&(m.left+=p/2),"bottom"===n.at[1]?m.top+=f:"center"===n.at[1]&&(m.top+=f/2),u=e(k.at,p,f),m.left+=u[0],m.top+=u[1],this.each(function(){var s,r,l=t(this),h=l.outerWidth(),c=l.outerHeight(),d=i(this,"marginLeft"),_=i(this,"marginTop"),x=h+d+i(this,"marginRight")+y.width,C=c+_+i(this,"marginBottom")+y.height,D=t.extend({},m),T=e(k.my,l.outerWidth(),l.outerHeight());"right"===n.my[0]?D.left-=h:"center"===n.my[0]&&(D.left-=h/2),"bottom"===n.my[1]?D.top-=c:"center"===n.my[1]&&(D.top-=c/2),D.left+=T[0],D.top+=T[1],s={marginLeft:d,marginTop:_},t.each(["left","top"],function(e,i){t.ui.position[w[e]]&&t.ui.position[w[e]][i](D,{targetWidth:p,targetHeight:f,elemWidth:h,elemHeight:c,collisionPosition:s,collisionWidth:x,collisionHeight:C,offset:[u[0]+T[0],u[1]+T[1]],my:n.my,at:n.at,within:b,elem:l})}),n.using&&(r=function(t){var e=g.left-D.left,i=e+p-h,s=g.top-D.top,r=s+f-c,u={target:{element:v,left:g.left,top:g.top,width:p,height:f},element:{element:l,left:D.left,top:D.top,width:h,height:c},horizontal:0>i?"left":e>0?"right":"center",vertical:0>r?"top":s>0?"bottom":"middle"};h>p&&p>a(e+i)&&(u.horizontal="center"),c>f&&f>a(s+r)&&(u.vertical="middle"),u.important=o(a(e),a(i))>o(a(s),a(r))?"horizontal":"vertical",n.using.call(this,t,u)}),l.offset(t.extend(D,{using:r}))})},t.ui.position={fit:{left:function(t,e){var i,s=e.within,n=s.isWindow?s.scrollLeft:s.offset.left,a=s.width,r=t.left-e.collisionPosition.marginLeft,l=n-r,h=r+e.collisionWidth-a-n;e.collisionWidth>a?l>0&&0>=h?(i=t.left+l+e.collisionWidth-a-n,t.left+=l-i):t.left=h>0&&0>=l?n:l>h?n+a-e.collisionWidth:n:l>0?t.left+=l:h>0?t.left-=h:t.left=o(t.left-r,t.left)},top:function(t,e){var i,s=e.within,n=s.isWindow?s.scrollTop:s.offset.top,a=e.within.height,r=t.top-e.collisionPosition.marginTop,l=n-r,h=r+e.collisionHeight-a-n;e.collisionHeight>a?l>0&&0>=h?(i=t.top+l+e.collisionHeight-a-n,t.top+=l-i):t.top=h>0&&0>=l?n:l>h?n+a-e.collisionHeight:n:l>0?t.top+=l:h>0?t.top-=h:t.top=o(t.top-r,t.top)}},flip:{left:function(t,e){var i,s,n=e.within,o=n.offset.left+n.scrollLeft,r=n.width,l=n.isWindow?n.scrollLeft:n.offset.left,h=t.left-e.collisionPosition.marginLeft,c=h-l,u=h+e.collisionWidth-r-l,d="left"===e.my[0]?-e.elemWidth:"right"===e.my[0]?e.elemWidth:0,p="left"===e.at[0]?e.targetWidth:"right"===e.at[0]?-e.targetWidth:0,f=-2*e.offset[0];0>c?(i=t.left+d+p+f+e.collisionWidth-r-o,(0>i||a(c)>i)&&(t.left+=d+p+f)):u>0&&(s=t.left-e.collisionPosition.marginLeft+d+p+f-l,(s>0||u>a(s))&&(t.left+=d+p+f))},top:function(t,e){var i,s,n=e.within,o=n.offset.top+n.scrollTop,r=n.height,l=n.isWindow?n.scrollTop:n.offset.top,h=t.top-e.collisionPosition.marginTop,c=h-l,u=h+e.collisionHeight-r-l,d="top"===e.my[1],p=d?-e.elemHeight:"bottom"===e.my[1]?e.elemHeight:0,f="top"===e.at[1]?e.targetHeight:"bottom"===e.at[1]?-e.targetHeight:0,g=-2*e.offset[1];0>c?(s=t.top+p+f+g+e.collisionHeight-r-o,(0>s||a(c)>s)&&(t.top+=p+f+g)):u>0&&(i=t.top-e.collisionPosition.marginTop+p+f+g-l,(i>0||u>a(i))&&(t.top+=p+f+g))}},flipfit:{left:function(){t.ui.position.flip.left.apply(this,arguments),t.ui.position.fit.left.apply(this,arguments)},top:function(){t.ui.position.flip.top.apply(this,arguments),t.ui.position.fit.top.apply(this,arguments)}}}}(),t.ui.position,t.ui.keyCode={BACKSPACE:8,COMMA:188,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,LEFT:37,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SPACE:32,TAB:9,UP:38},t.fn.extend({uniqueId:function(){var t=0;return function(){return this.each(function(){this.id||(this.id="ui-id-"+ ++t)})}}(),removeUniqueId:function(){return this.each(function(){/^ui-id-\d+$/.test(this.id)&&t(this).removeAttr("id")})}}),t.ui.safeActiveElement=function(t){var e;try{e=t.activeElement}catch(i){e=t.body}return e||(e=t.body),e.nodeName||(e=t.body),e},t.widget("ui.menu",{version:"1.12.1",defaultElement:"<ul>",delay:300,options:{icons:{submenu:"ui-icon-caret-1-e"},items:"> *",menus:"ul",position:{my:"left top",at:"right top"},role:"menu",blur:null,focus:null,select:null},_create:function(){this.activeMenu=this.element,this.mouseHandled=!1,this.element.uniqueId().attr({role:this.options.role,tabIndex:0}),this._addClass("ui-menu","ui-widget ui-widget-content"),this._on({"mousedown .ui-menu-item":function(t){t.preventDefault()},"click .ui-menu-item":function(e){var i=t(e.target),s=t(t.ui.safeActiveElement(this.document[0]));!this.mouseHandled&&i.not(".ui-state-disabled").length&&(this.select(e),e.isPropagationStopped()||(this.mouseHandled=!0),i.has(".ui-menu").length?this.expand(e):!this.element.is(":focus")&&s.closest(".ui-menu").length&&(this.element.trigger("focus",[!0]),this.active&&1===this.active.parents(".ui-menu").length&&clearTimeout(this.timer)))},"mouseenter .ui-menu-item":function(e){if(!this.previousFilter){var i=t(e.target).closest(".ui-menu-item"),s=t(e.currentTarget);i[0]===s[0]&&(this._removeClass(s.siblings().children(".ui-state-active"),null,"ui-state-active"),this.focus(e,s))}},mouseleave:"collapseAll","mouseleave .ui-menu":"collapseAll",focus:function(t,e){var i=this.active||this.element.find(this.options.items).eq(0);e||this.focus(t,i)},blur:function(e){this._delay(function(){var i=!t.contains(this.element[0],t.ui.safeActiveElement(this.document[0]));i&&this.collapseAll(e)})},keydown:"_keydown"}),this.refresh(),this._on(this.document,{click:function(t){this._closeOnDocumentClick(t)&&this.collapseAll(t),this.mouseHandled=!1}})},_destroy:function(){var e=this.element.find(".ui-menu-item").removeAttr("role aria-disabled"),i=e.children(".ui-menu-item-wrapper").removeUniqueId().removeAttr("tabIndex role aria-haspopup");this.element.removeAttr("aria-activedescendant").find(".ui-menu").addBack().removeAttr("role aria-labelledby aria-expanded aria-hidden aria-disabled tabIndex").removeUniqueId().show(),i.children().each(function(){var e=t(this);e.data("ui-menu-submenu-caret")&&e.remove()})},_keydown:function(e){var i,s,n,o,a=!0;switch(e.keyCode){case t.ui.keyCode.PAGE_UP:this.previousPage(e);break;case t.ui.keyCode.PAGE_DOWN:this.nextPage(e);break;case t.ui.keyCode.HOME:this._move("first","first",e);break;case t.ui.keyCode.END:this._move("last","last",e);break;case t.ui.keyCode.UP:this.previous(e);break;case t.ui.keyCode.DOWN:this.next(e);break;case t.ui.keyCode.LEFT:this.collapse(e);break;case t.ui.keyCode.RIGHT:this.active&&!this.active.is(".ui-state-disabled")&&this.expand(e);break;case t.ui.keyCode.ENTER:case t.ui.keyCode.SPACE:this._activate(e);break;case t.ui.keyCode.ESCAPE:this.collapse(e);break;default:a=!1,s=this.previousFilter||"",o=!1,n=e.keyCode>=96&&105>=e.keyCode?""+(e.keyCode-96):String.fromCharCode(e.keyCode),clearTimeout(this.filterTimer),n===s?o=!0:n=s+n,i=this._filterMenuItems(n),i=o&&-1!==i.index(this.active.next())?this.active.nextAll(".ui-menu-item"):i,i.length||(n=String.fromCharCode(e.keyCode),i=this._filterMenuItems(n)),i.length?(this.focus(e,i),this.previousFilter=n,this.filterTimer=this._delay(function(){delete this.previousFilter},1e3)):delete this.previousFilter}a&&e.preventDefault()},_activate:function(t){this.active&&!this.active.is(".ui-state-disabled")&&(this.active.children("[aria-haspopup='true']").length?this.expand(t):this.select(t))},refresh:function(){var e,i,s,n,o,a=this,r=this.options.icons.submenu,l=this.element.find(this.options.menus);this._toggleClass("ui-menu-icons",null,!!this.element.find(".ui-icon").length),s=l.filter(":not(.ui-menu)").hide().attr({role:this.options.role,"aria-hidden":"true","aria-expanded":"false"}).each(function(){var e=t(this),i=e.prev(),s=t("<span>").data("ui-menu-submenu-caret",!0);a._addClass(s,"ui-menu-icon","ui-icon "+r),i.attr("aria-haspopup","true").prepend(s),e.attr("aria-labelledby",i.attr("id"))}),this._addClass(s,"ui-menu","ui-widget ui-widget-content ui-front"),e=l.add(this.element),i=e.find(this.options.items),i.not(".ui-menu-item").each(function(){var e=t(this);a._isDivider(e)&&a._addClass(e,"ui-menu-divider","ui-widget-content")}),n=i.not(".ui-menu-item, .ui-menu-divider"),o=n.children().not(".ui-menu").uniqueId().attr({tabIndex:-1,role:this._itemRole()}),this._addClass(n,"ui-menu-item")._addClass(o,"ui-menu-item-wrapper"),i.filter(".ui-state-disabled").attr("aria-disabled","true"),this.active&&!t.contains(this.element[0],this.active[0])&&this.blur()},_itemRole:function(){return{menu:"menuitem",listbox:"option"}[this.options.role]},_setOption:function(t,e){if("icons"===t){var i=this.element.find(".ui-menu-icon");this._removeClass(i,null,this.options.icons.submenu)._addClass(i,null,e.submenu)}this._super(t,e)},_setOptionDisabled:function(t){this._super(t),this.element.attr("aria-disabled",t+""),this._toggleClass(null,"ui-state-disabled",!!t)},focus:function(t,e){var i,s,n;this.blur(t,t&&"focus"===t.type),this._scrollIntoView(e),this.active=e.first(),s=this.active.children(".ui-menu-item-wrapper"),this._addClass(s,null,"ui-state-active"),this.options.role&&this.element.attr("aria-activedescendant",s.attr("id")),n=this.active.parent().closest(".ui-menu-item").children(".ui-menu-item-wrapper"),this._addClass(n,null,"ui-state-active"),t&&"keydown"===t.type?this._close():this.timer=this._delay(function(){this._close()},this.delay),i=e.children(".ui-menu"),i.length&&t&&/^mouse/.test(t.type)&&this._startOpening(i),this.activeMenu=e.parent(),this._trigger("focus",t,{item:e})},_scrollIntoView:function(e){var i,s,n,o,a,r;this._hasScroll()&&(i=parseFloat(t.css(this.activeMenu[0],"borderTopWidth"))||0,s=parseFloat(t.css(this.activeMenu[0],"paddingTop"))||0,n=e.offset().top-this.activeMenu.offset().top-i-s,o=this.activeMenu.scrollTop(),a=this.activeMenu.height(),r=e.outerHeight(),0>n?this.activeMenu.scrollTop(o+n):n+r>a&&this.activeMenu.scrollTop(o+n-a+r))},blur:function(t,e){e||clearTimeout(this.timer),this.active&&(this._removeClass(this.active.children(".ui-menu-item-wrapper"),null,"ui-state-active"),this._trigger("blur",t,{item:this.active}),this.active=null)},_startOpening:function(t){clearTimeout(this.timer),"true"===t.attr("aria-hidden")&&(this.timer=this._delay(function(){this._close(),this._open(t)},this.delay))},_open:function(e){var i=t.extend({of:this.active},this.options.position);clearTimeout(this.timer),this.element.find(".ui-menu").not(e.parents(".ui-menu")).hide().attr("aria-hidden","true"),e.show().removeAttr("aria-hidden").attr("aria-expanded","true").position(i)},collapseAll:function(e,i){clearTimeout(this.timer),this.timer=this._delay(function(){var s=i?this.element:t(e&&e.target).closest(this.element.find(".ui-menu"));s.length||(s=this.element),this._close(s),this.blur(e),this._removeClass(s.find(".ui-state-active"),null,"ui-state-active"),this.activeMenu=s},this.delay)},_close:function(t){t||(t=this.active?this.active.parent():this.element),t.find(".ui-menu").hide().attr("aria-hidden","true").attr("aria-expanded","false")},_closeOnDocumentClick:function(e){return!t(e.target).closest(".ui-menu").length},_isDivider:function(t){return!/[^\-\u2014\u2013\s]/.test(t.text())},collapse:function(t){var e=this.active&&this.active.parent().closest(".ui-menu-item",this.element);e&&e.length&&(this._close(),this.focus(t,e))},expand:function(t){var e=this.active&&this.active.children(".ui-menu ").find(this.options.items).first();e&&e.length&&(this._open(e.parent()),this._delay(function(){this.focus(t,e)}))},next:function(t){this._move("next","first",t)},previous:function(t){this._move("prev","last",t)},isFirstItem:function(){return this.active&&!this.active.prevAll(".ui-menu-item").length},isLastItem:function(){return this.active&&!this.active.nextAll(".ui-menu-item").length},_move:function(t,e,i){var s;this.active&&(s="first"===t||"last"===t?this.active["first"===t?"prevAll":"nextAll"](".ui-menu-item").eq(-1):this.active[t+"All"](".ui-menu-item").eq(0)),s&&s.length&&this.active||(s=this.activeMenu.find(this.options.items)[e]()),this.focus(i,s)},nextPage:function(e){var i,s,n;return this.active?(this.isLastItem()||(this._hasScroll()?(s=this.active.offset().top,n=this.element.height(),this.active.nextAll(".ui-menu-item").each(function(){return i=t(this),0>i.offset().top-s-n}),this.focus(e,i)):this.focus(e,this.activeMenu.find(this.options.items)[this.active?"last":"first"]())),void 0):(this.next(e),void 0)},previousPage:function(e){var i,s,n;return this.active?(this.isFirstItem()||(this._hasScroll()?(s=this.active.offset().top,n=this.element.height(),this.active.prevAll(".ui-menu-item").each(function(){return i=t(this),i.offset().top-s+n>0}),this.focus(e,i)):this.focus(e,this.activeMenu.find(this.options.items).first())),void 0):(this.next(e),void 0)},_hasScroll:function(){return this.element.outerHeight()<this.element.prop("scrollHeight")},select:function(e){this.active=this.active||t(e.target).closest(".ui-menu-item");var i={item:this.active};this.active.has(".ui-menu").length||this.collapseAll(e,!0),this._trigger("select",e,i)},_filterMenuItems:function(e){var i=e.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g,"\\$&"),s=RegExp("^"+i,"i");return this.activeMenu.find(this.options.items).filter(".ui-menu-item").filter(function(){return s.test(t.trim(t(this).children(".ui-menu-item-wrapper").text()))})}}),t.widget("ui.autocomplete",{version:"1.12.1",defaultElement:"<input>",options:{appendTo:null,autoFocus:!1,delay:300,minLength:1,position:{my:"left top",at:"left bottom",collision:"none"},source:null,change:null,close:null,focus:null,open:null,response:null,search:null,select:null},requestIndex:0,pending:0,_create:function(){var e,i,s,n=this.element[0].nodeName.toLowerCase(),o="textarea"===n,a="input"===n;this.isMultiLine=o||!a&&this._isContentEditable(this.element),this.valueMethod=this.element[o||a?"val":"text"],this.isNewMenu=!0,this._addClass("ui-autocomplete-input"),this.element.attr("autocomplete","off"),this._on(this.element,{keydown:function(n){if(this.element.prop("readOnly"))return e=!0,s=!0,i=!0,void 0;e=!1,s=!1,i=!1;var o=t.ui.keyCode;switch(n.keyCode){case o.PAGE_UP:e=!0,this._move("previousPage",n);break;case o.PAGE_DOWN:e=!0,this._move("nextPage",n);break;case o.UP:e=!0,this._keyEvent("previous",n);break;case o.DOWN:e=!0,this._keyEvent("next",n);break;case o.ENTER:this.menu.active&&(e=!0,n.preventDefault(),this.menu.select(n));break;case o.TAB:this.menu.active&&this.menu.select(n);break;case o.ESCAPE:this.menu.element.is(":visible")&&(this.isMultiLine||this._value(this.term),this.close(n),n.preventDefault());break;default:i=!0,this._searchTimeout(n)}},keypress:function(s){if(e)return e=!1,(!this.isMultiLine||this.menu.element.is(":visible"))&&s.preventDefault(),void 0;if(!i){var n=t.ui.keyCode;switch(s.keyCode){case n.PAGE_UP:this._move("previousPage",s);break;case n.PAGE_DOWN:this._move("nextPage",s);break;case n.UP:this._keyEvent("previous",s);break;case n.DOWN:this._keyEvent("next",s)}}},input:function(t){return s?(s=!1,t.preventDefault(),void 0):(this._searchTimeout(t),void 0)},focus:function(){this.selectedItem=null,this.previous=this._value()},blur:function(t){return this.cancelBlur?(delete this.cancelBlur,void 0):(clearTimeout(this.searching),this.close(t),this._change(t),void 0)}}),this._initSource(),this.menu=t("<ul>").appendTo(this._appendTo()).menu({role:null}).hide().menu("instance"),this._addClass(this.menu.element,"ui-autocomplete","ui-front"),this._on(this.menu.element,{mousedown:function(e){e.preventDefault(),this.cancelBlur=!0,this._delay(function(){delete this.cancelBlur,this.element[0]!==t.ui.safeActiveElement(this.document[0])&&this.element.trigger("focus")})},menufocus:function(e,i){var s,n;return this.isNewMenu&&(this.isNewMenu=!1,e.originalEvent&&/^mouse/.test(e.originalEvent.type))?(this.menu.blur(),this.document.one("mousemove",function(){t(e.target).trigger(e.originalEvent)}),void 0):(n=i.item.data("ui-autocomplete-item"),!1!==this._trigger("focus",e,{item:n})&&e.originalEvent&&/^key/.test(e.originalEvent.type)&&this._value(n.value),s=i.item.attr("aria-label")||n.value,s&&t.trim(s).length&&(this.liveRegion.children().hide(),t("<div>").text(s).appendTo(this.liveRegion)),void 0)},menuselect:function(e,i){var s=i.item.data("ui-autocomplete-item"),n=this.previous;this.element[0]!==t.ui.safeActiveElement(this.document[0])&&(this.element.trigger("focus"),this.previous=n,this._delay(function(){this.previous=n,this.selectedItem=s})),!1!==this._trigger("select",e,{item:s})&&this._value(s.value),this.term=this._value(),this.close(e),this.selectedItem=s}}),this.liveRegion=t("<div>",{role:"status","aria-live":"assertive","aria-relevant":"additions"}).appendTo(this.document[0].body),this._addClass(this.liveRegion,null,"ui-helper-hidden-accessible"),this._on(this.window,{beforeunload:function(){this.element.removeAttr("autocomplete")}})},_destroy:function(){clearTimeout(this.searching),this.element.removeAttr("autocomplete"),this.menu.element.remove(),this.liveRegion.remove()},_setOption:function(t,e){this._super(t,e),"source"===t&&this._initSource(),"appendTo"===t&&this.menu.element.appendTo(this._appendTo()),"disabled"===t&&e&&this.xhr&&this.xhr.abort()},_isEventTargetInWidget:function(e){var i=this.menu.element[0];return e.target===this.element[0]||e.target===i||t.contains(i,e.target)},_closeOnClickOutside:function(t){this._isEventTargetInWidget(t)||this.close()},_appendTo:function(){var e=this.options.appendTo;return e&&(e=e.jquery||e.nodeType?t(e):this.document.find(e).eq(0)),e&&e[0]||(e=this.element.closest(".ui-front, dialog")),e.length||(e=this.document[0].body),e},_initSource:function(){var e,i,s=this;t.isArray(this.options.source)?(e=this.options.source,this.source=function(i,s){s(t.ui.autocomplete.filter(e,i.term))}):"string"==typeof this.options.source?(i=this.options.source,this.source=function(e,n){s.xhr&&s.xhr.abort(),s.xhr=t.ajax({url:i,data:e,dataType:"json",success:function(t){n(t)},error:function(){n([])}})}):this.source=this.options.source},_searchTimeout:function(t){clearTimeout(this.searching),this.searching=this._delay(function(){var e=this.term===this._value(),i=this.menu.element.is(":visible"),s=t.altKey||t.ctrlKey||t.metaKey||t.shiftKey;(!e||e&&!i&&!s)&&(this.selectedItem=null,this.search(null,t))},this.options.delay)},search:function(t,e){return t=null!=t?t:this._value(),this.term=this._value(),t.length<this.options.minLength?this.close(e):this._trigger("search",e)!==!1?this._search(t):void 0},_search:function(t){this.pending++,this._addClass("ui-autocomplete-loading"),this.cancelSearch=!1,this.source({term:t},this._response())},_response:function(){var e=++this.requestIndex;return t.proxy(function(t){e===this.requestIndex&&this.__response(t),this.pending--,this.pending||this._removeClass("ui-autocomplete-loading")},this)},__response:function(t){t&&(t=this._normalize(t)),this._trigger("response",null,{content:t}),!this.options.disabled&&t&&t.length&&!this.cancelSearch?(this._suggest(t),this._trigger("open")):this._close()},close:function(t){this.cancelSearch=!0,this._close(t)},_close:function(t){this._off(this.document,"mousedown"),this.menu.element.is(":visible")&&(this.menu.element.hide(),this.menu.blur(),this.isNewMenu=!0,this._trigger("close",t))},_change:function(t){this.previous!==this._value()&&this._trigger("change",t,{item:this.selectedItem})},_normalize:function(e){return e.length&&e[0].label&&e[0].value?e:t.map(e,function(e){return"string"==typeof e?{label:e,value:e}:t.extend({},e,{label:e.label||e.value,value:e.value||e.label})})},_suggest:function(e){var i=this.menu.element.empty();this._renderMenu(i,e),this.isNewMenu=!0,this.menu.refresh(),i.show(),this._resizeMenu(),i.position(t.extend({of:this.element},this.options.position)),this.options.autoFocus&&this.menu.next(),this._on(this.document,{mousedown:"_closeOnClickOutside"})},_resizeMenu:function(){var t=this.menu.element;t.outerWidth(Math.max(t.width("").outerWidth()+1,this.element.outerWidth()))},_renderMenu:function(e,i){var s=this;t.each(i,function(t,i){s._renderItemData(e,i)})},_renderItemData:function(t,e){return this._renderItem(t,e).data("ui-autocomplete-item",e)},_renderItem:function(e,i){return t("<li>").append(t("<div>").text(i.label)).appendTo(e)},_move:function(t,e){return this.menu.element.is(":visible")?this.menu.isFirstItem()&&/^previous/.test(t)||this.menu.isLastItem()&&/^next/.test(t)?(this.isMultiLine||this._value(this.term),this.menu.blur(),void 0):(this.menu[t](e),void 0):(this.search(null,e),void 0)},widget:function(){return this.menu.element},_value:function(){return this.valueMethod.apply(this.element,arguments)},_keyEvent:function(t,e){(!this.isMultiLine||this.menu.element.is(":visible"))&&(this._move(t,e),e.preventDefault())},_isContentEditable:function(t){if(!t.length)return!1;var e=t.prop("contentEditable");return"inherit"===e?this._isContentEditable(t.parent()):"true"===e}}),t.extend(t.ui.autocomplete,{escapeRegex:function(t){return t.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g,"\\$&")},filter:function(e,i){var s=RegExp(t.ui.autocomplete.escapeRegex(i),"i");return t.grep(e,function(t){return s.test(t.label||t.value||t)})}}),t.widget("ui.autocomplete",t.ui.autocomplete,{options:{messages:{noResults:"No search results.",results:function(t){return t+(t>1?" results are":" result is")+" available, use up and down arrow keys to navigate."}}},__response:function(e){var i;this._superApply(arguments),this.options.disabled||this.cancelSearch||(i=e&&e.length?this.options.messages.results(e.length):this.options.messages.noResults,this.liveRegion.children().hide(),t("<div>").text(i).appendTo(this.liveRegion))}}),t.ui.autocomplete});
\ No newline at end of file
diff --git a/doc/script-dir/jquery-ui.structure.min.css b/doc/script-dir/jquery-ui.structure.min.css
new file mode 100644
index 0000000000000000000000000000000000000000..e8808927f7c417d2be2b67fde5ee49521dc361d9
--- /dev/null
+++ b/doc/script-dir/jquery-ui.structure.min.css
@@ -0,0 +1,5 @@
+/*! jQuery UI - v1.12.1 - 2018-12-06
+* http://jqueryui.com
+* Copyright jQuery Foundation and other contributors; Licensed MIT */
+
+.ui-helper-hidden{display:none}.ui-helper-hidden-accessible{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.ui-helper-reset{margin:0;padding:0;border:0;outline:0;line-height:1.3;text-decoration:none;font-size:100%;list-style:none}.ui-helper-clearfix:before,.ui-helper-clearfix:after{content:"";display:table;border-collapse:collapse}.ui-helper-clearfix:after{clear:both}.ui-helper-zfix{width:100%;height:100%;top:0;left:0;position:absolute;opacity:0;filter:Alpha(Opacity=0)}.ui-front{z-index:100}.ui-state-disabled{cursor:default!important;pointer-events:none}.ui-icon{display:inline-block;vertical-align:middle;margin-top:-.25em;position:relative;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat}.ui-widget-icon-block{left:50%;margin-left:-8px;display:block}.ui-widget-overlay{position:fixed;top:0;left:0;width:100%;height:100%}.ui-autocomplete{position:absolute;top:0;left:0;cursor:default}.ui-menu{list-style:none;padding:0;margin:0;display:block;outline:0}.ui-menu .ui-menu{position:absolute}.ui-menu .ui-menu-item{margin:0;cursor:pointer;list-style-image:url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7")}.ui-menu .ui-menu-item-wrapper{position:relative;padding:3px 1em 3px .4em}.ui-menu .ui-menu-divider{margin:5px 0;height:0;font-size:0;line-height:0;border-width:1px 0 0 0}.ui-menu .ui-state-focus,.ui-menu .ui-state-active{margin:-1px}.ui-menu-icons{position:relative}.ui-menu-icons .ui-menu-item-wrapper{padding-left:2em}.ui-menu .ui-icon{position:absolute;top:0;bottom:0;left:.2em;margin:auto 0}.ui-menu .ui-menu-icon{left:auto;right:0}
\ No newline at end of file
diff --git a/doc/script.js b/doc/script.js
new file mode 100644
index 0000000000000000000000000000000000000000..44284087cb17dbfddcad1712287e1806b719cb3c
--- /dev/null
+++ b/doc/script.js
@@ -0,0 +1,103 @@
+/*
+ * Copyright (c) 2013, 2020, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation. Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+var moduleSearchIndex;
+var packageSearchIndex;
+var typeSearchIndex;
+var memberSearchIndex;
+var tagSearchIndex;
+function loadScripts(doc, tag) {
+ createElem(doc, tag, 'search.js');
+
+ createElem(doc, tag, 'module-search-index.js');
+ createElem(doc, tag, 'package-search-index.js');
+ createElem(doc, tag, 'type-search-index.js');
+ createElem(doc, tag, 'member-search-index.js');
+ createElem(doc, tag, 'tag-search-index.js');
+}
+
+function createElem(doc, tag, path) {
+ var script = doc.createElement(tag);
+ var scriptElement = doc.getElementsByTagName(tag)[0];
+ script.src = pathtoroot + path;
+ scriptElement.parentNode.insertBefore(script, scriptElement);
+}
+
+function show(type) {
+ count = 0;
+ for (var key in data) {
+ var row = document.getElementById(key);
+ if ((data[key] & type) !== 0) {
+ row.style.display = '';
+ row.className = (count++ % 2) ? rowColor : altColor;
+ }
+ else
+ row.style.display = 'none';
+ }
+ updateTabs(type);
+}
+
+function updateTabs(type) {
+ var firstRow = document.getElementById(Object.keys(data)[0]);
+ var table = firstRow.closest('table');
+ for (var value in tabs) {
+ var tab = document.getElementById(tabs[value][0]);
+ if (value == type) {
+ tab.className = activeTableTab;
+ tab.innerHTML = tabs[value][1];
+ tab.setAttribute('aria-selected', true);
+ tab.setAttribute('tabindex',0);
+ table.setAttribute('aria-labelledby', tabs[value][0]);
+ }
+ else {
+ tab.className = tableTab;
+ tab.setAttribute('aria-selected', false);
+ tab.setAttribute('tabindex',-1);
+ tab.setAttribute('onclick', "show("+ value + ")");
+ tab.innerHTML = tabs[value][1];
+ }
+ }
+}
+
+function switchTab(e) {
+ if (e.keyCode == 37 || e.keyCode == 38) {
+ $("[aria-selected=true]").prev().click().focus();
+ e.preventDefault();
+ }
+ if (e.keyCode == 39 || e.keyCode == 40) {
+ $("[aria-selected=true]").next().click().focus();
+ e.preventDefault();
+ }
+}
+
+var updateSearchResults = function() {};
+
+function indexFilesLoaded() {
+ return moduleSearchIndex
+ && packageSearchIndex
+ && typeSearchIndex
+ && memberSearchIndex
+ && tagSearchIndex;
+}
diff --git a/doc/search.js b/doc/search.js
new file mode 100644
index 0000000000000000000000000000000000000000..9d19ba17f82ca37e54954ad17bfc8ceccc73cdb6
--- /dev/null
+++ b/doc/search.js
@@ -0,0 +1,378 @@
+/*
+ * Copyright (c) 2015, 2020, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation. Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+var noResult = {l: "No results found"};
+var loading = {l: "Loading search index..."};
+var catModules = "Modules";
+var catPackages = "Packages";
+var catTypes = "Types";
+var catMembers = "Members";
+var catSearchTags = "SearchTags";
+var highlight = "<span class=\"result-highlight\">$&</span>";
+var searchPattern = "";
+var RANKING_THRESHOLD = 2;
+var NO_MATCH = 0xffff;
+var MAX_RESULTS_PER_CATEGORY = 500;
+var UNNAMED = "<Unnamed>";
+function escapeHtml(str) {
+ return str.replace(/</g, "<").replace(/>/g, ">");
+}
+function getHighlightedText(item, matcher) {
+ var escapedItem = escapeHtml(item);
+ return escapedItem.replace(matcher, highlight);
+}
+function getURLPrefix(ui) {
+ var urlPrefix="";
+ var slash = "/";
+ if (ui.item.category === catModules) {
+ return ui.item.l + slash;
+ } else if (ui.item.category === catPackages && ui.item.m) {
+ return ui.item.m + slash;
+ } else if (ui.item.category === catTypes || ui.item.category === catMembers) {
+ if (ui.item.m) {
+ urlPrefix = ui.item.m + slash;
+ } else {
+ $.each(packageSearchIndex, function(index, item) {
+ if (item.m && ui.item.p === item.l) {
+ urlPrefix = item.m + slash;
+ }
+ });
+ }
+ return urlPrefix;
+ }
+ return urlPrefix;
+}
+function makeCamelCaseRegex(term) {
+ var pattern = "";
+ var isWordToken = false;
+ term.replace(/,\s*/g, ", ").trim().split(/\s+/).forEach(function(w, index) {
+ if (index > 0) {
+ // whitespace between identifiers is significant
+ pattern += (isWordToken && /^\w/.test(w)) ? "\\s+" : "\\s*";
+ }
+ var tokens = w.split(/(?=[A-Z,.()<>[\/])/);
+ for (var i = 0; i < tokens.length; i++) {
+ var s = tokens[i];
+ if (s === "") {
+ continue;
+ }
+ pattern += $.ui.autocomplete.escapeRegex(s);
+ isWordToken = /\w$/.test(s);
+ if (isWordToken) {
+ pattern += "([a-z0-9_$<>\\[\\]]*?)";
+ }
+ }
+ });
+ return pattern;
+}
+function createMatcher(pattern, flags) {
+ var isCamelCase = /[A-Z]/.test(pattern);
+ return new RegExp(pattern, flags + (isCamelCase ? "" : "i"));
+}
+var watermark = 'Search';
+$(function() {
+ $("#search").val('');
+ $("#search").prop("disabled", false);
+ $("#reset").prop("disabled", false);
+ $("#search").val(watermark).addClass('watermark');
+ $("#search").blur(function() {
+ if ($(this).val().length == 0) {
+ $(this).val(watermark).addClass('watermark');
+ }
+ });
+ $("#search").on('click keydown paste', function() {
+ if ($(this).val() == watermark) {
+ $(this).val('').removeClass('watermark');
+ }
+ });
+ $("#reset").click(function() {
+ $("#search").val('');
+ $("#search").focus();
+ });
+ $("#search").focus();
+ $("#search")[0].setSelectionRange(0, 0);
+});
+$.widget("custom.catcomplete", $.ui.autocomplete, {
+ _create: function() {
+ this._super();
+ this.widget().menu("option", "items", "> :not(.ui-autocomplete-category)");
+ },
+ _renderMenu: function(ul, items) {
+ var rMenu = this;
+ var currentCategory = "";
+ rMenu.menu.bindings = $();
+ $.each(items, function(index, item) {
+ var li;
+ if (item.category && item.category !== currentCategory) {
+ ul.append("<li class=\"ui-autocomplete-category\">" + item.category + "</li>");
+ currentCategory = item.category;
+ }
+ li = rMenu._renderItemData(ul, item);
+ if (item.category) {
+ li.attr("aria-label", item.category + " : " + item.l);
+ li.attr("class", "result-item");
+ } else {
+ li.attr("aria-label", item.l);
+ li.attr("class", "result-item");
+ }
+ });
+ },
+ _renderItem: function(ul, item) {
+ var label = "";
+ var matcher = createMatcher(escapeHtml(searchPattern), "g");
+ if (item.category === catModules) {
+ label = getHighlightedText(item.l, matcher);
+ } else if (item.category === catPackages) {
+ label = getHighlightedText(item.l, matcher);
+ } else if (item.category === catTypes) {
+ label = (item.p && item.p !== UNNAMED)
+ ? getHighlightedText(item.p + "." + item.l, matcher)
+ : getHighlightedText(item.l, matcher);
+ } else if (item.category === catMembers) {
+ label = (item.p && item.p !== UNNAMED)
+ ? getHighlightedText(item.p + "." + item.c + "." + item.l, matcher)
+ : getHighlightedText(item.c + "." + item.l, matcher);
+ } else if (item.category === catSearchTags) {
+ label = getHighlightedText(item.l, matcher);
+ } else {
+ label = item.l;
+ }
+ var li = $("<li/>").appendTo(ul);
+ var div = $("<div/>").appendTo(li);
+ if (item.category === catSearchTags) {
+ if (item.d) {
+ div.html(label + "<span class=\"search-tag-holder-result\"> (" + item.h + ")</span><br><span class=\"search-tag-desc-result\">"
+ + item.d + "</span><br>");
+ } else {
+ div.html(label + "<span class=\"search-tag-holder-result\"> (" + item.h + ")</span>");
+ }
+ } else {
+ if (item.m) {
+ div.html(item.m + "/" + label);
+ } else {
+ div.html(label);
+ }
+ }
+ return li;
+ }
+});
+function rankMatch(match, category) {
+ if (!match) {
+ return NO_MATCH;
+ }
+ var index = match.index;
+ var input = match.input;
+ var leftBoundaryMatch = 2;
+ var periferalMatch = 0;
+ var delta = 0;
+ // make sure match is anchored on a left word boundary
+ if (index === 0 || /\W/.test(input[index - 1]) || "_" === input[index - 1] || "_" === input[index]) {
+ leftBoundaryMatch = 0;
+ } else if (input[index] === input[index].toUpperCase() && !/^[A-Z0-9_$]+$/.test(input)) {
+ leftBoundaryMatch = 1;
+ }
+ var matchEnd = index + match[0].length;
+ var leftParen = input.indexOf("(");
+ // exclude peripheral matches
+ if (category !== catModules && category !== catSearchTags) {
+ var endOfName = leftParen > -1 ? leftParen : input.length;
+ var delim = category === catPackages ? "/" : ".";
+ if (leftParen > -1 && leftParen < index) {
+ periferalMatch += 2;
+ } else if (input.lastIndexOf(delim, endOfName) >= matchEnd) {
+ periferalMatch += 2;
+ }
+ }
+ for (var i = 1; i < match.length; i++) {
+ // lower ranking if parts of the name are missing
+ if (match[i])
+ delta += match[i].length;
+ }
+ if (category === catTypes) {
+ // lower ranking if a type name contains unmatched camel-case parts
+ if (/[A-Z]/.test(input.substring(matchEnd)))
+ delta += 5;
+ if (/[A-Z]/.test(input.substring(0, index)))
+ delta += 5;
+ }
+ return leftBoundaryMatch + periferalMatch + (delta / 200);
+
+}
+function doSearch(request, response) {
+ var result = [];
+ var newResults = [];
+
+ searchPattern = makeCamelCaseRegex(request.term);
+ if (searchPattern === "") {
+ return this.close();
+ }
+ var camelCaseMatcher = createMatcher(searchPattern, "");
+ var boundaryMatcher = createMatcher("\\b" + searchPattern, "");
+
+ function concatResults(a1, a2) {
+ a2.sort(function(e1, e2) {
+ return e1.ranking - e2.ranking;
+ });
+ a1 = a1.concat(a2.map(function(e) { return e.item; }));
+ a2.length = 0;
+ return a1;
+ }
+
+ if (moduleSearchIndex) {
+ $.each(moduleSearchIndex, function(index, item) {
+ item.category = catModules;
+ var ranking = rankMatch(boundaryMatcher.exec(item.l), catModules);
+ if (ranking < RANKING_THRESHOLD) {
+ newResults.push({ ranking: ranking, item: item });
+ }
+ return newResults.length < MAX_RESULTS_PER_CATEGORY;
+ });
+ result = concatResults(result, newResults);
+ }
+ if (packageSearchIndex) {
+ $.each(packageSearchIndex, function(index, item) {
+ item.category = catPackages;
+ var name = (item.m && request.term.indexOf("/") > -1)
+ ? (item.m + "/" + item.l)
+ : item.l;
+ var ranking = rankMatch(boundaryMatcher.exec(name), catPackages);
+ if (ranking < RANKING_THRESHOLD) {
+ newResults.push({ ranking: ranking, item: item });
+ }
+ return newResults.length < MAX_RESULTS_PER_CATEGORY;
+ });
+ result = concatResults(result, newResults);
+ }
+ if (typeSearchIndex) {
+ $.each(typeSearchIndex, function(index, item) {
+ item.category = catTypes;
+ var name = request.term.indexOf(".") > -1
+ ? item.p + "." + item.l
+ : item.l;
+ var ranking = rankMatch(camelCaseMatcher.exec(name), catTypes);
+ if (ranking < RANKING_THRESHOLD) {
+ newResults.push({ ranking: ranking, item: item });
+ }
+ return newResults.length < MAX_RESULTS_PER_CATEGORY;
+ });
+ result = concatResults(result, newResults);
+ }
+ if (memberSearchIndex) {
+ $.each(memberSearchIndex, function(index, item) {
+ item.category = catMembers;
+ var name = request.term.indexOf(".") > -1
+ ? item.p + "." + item.c + "." + item.l
+ : item.l;
+ var ranking = rankMatch(camelCaseMatcher.exec(name), catMembers);
+ if (ranking < RANKING_THRESHOLD) {
+ newResults.push({ ranking: ranking, item: item });
+ }
+ return newResults.length < MAX_RESULTS_PER_CATEGORY;
+ });
+ result = concatResults(result, newResults);
+ }
+ if (tagSearchIndex) {
+ $.each(tagSearchIndex, function(index, item) {
+ item.category = catSearchTags;
+ var ranking = rankMatch(boundaryMatcher.exec(item.l), catSearchTags);
+ if (ranking < RANKING_THRESHOLD) {
+ newResults.push({ ranking: ranking, item: item });
+ }
+ return newResults.length < MAX_RESULTS_PER_CATEGORY;
+ });
+ result = concatResults(result, newResults);
+ }
+ if (!indexFilesLoaded()) {
+ updateSearchResults = function() {
+ doSearch(request, response);
+ }
+ result.unshift(loading);
+ } else {
+ updateSearchResults = function() {};
+ }
+ response(result);
+}
+$(function() {
+ $("#search").catcomplete({
+ minLength: 1,
+ delay: 300,
+ source: doSearch,
+ response: function(event, ui) {
+ if (!ui.content.length) {
+ ui.content.push(noResult);
+ } else {
+ $("#search").empty();
+ }
+ },
+ autoFocus: true,
+ focus: function(event, ui) {
+ return false;
+ },
+ position: {
+ collision: "flip"
+ },
+ select: function(event, ui) {
+ if (ui.item.category) {
+ var url = getURLPrefix(ui);
+ if (ui.item.category === catModules) {
+ url += "module-summary.html";
+ } else if (ui.item.category === catPackages) {
+ if (ui.item.u) {
+ url = ui.item.u;
+ } else {
+ url += ui.item.l.replace(/\./g, '/') + "/package-summary.html";
+ }
+ } else if (ui.item.category === catTypes) {
+ if (ui.item.u) {
+ url = ui.item.u;
+ } else if (ui.item.p === UNNAMED) {
+ url += ui.item.l + ".html";
+ } else {
+ url += ui.item.p.replace(/\./g, '/') + "/" + ui.item.l + ".html";
+ }
+ } else if (ui.item.category === catMembers) {
+ if (ui.item.p === UNNAMED) {
+ url += ui.item.c + ".html" + "#";
+ } else {
+ url += ui.item.p.replace(/\./g, '/') + "/" + ui.item.c + ".html" + "#";
+ }
+ if (ui.item.u) {
+ url += ui.item.u;
+ } else {
+ url += ui.item.l;
+ }
+ } else if (ui.item.category === catSearchTags) {
+ url += ui.item.u;
+ }
+ if (top !== window) {
+ parent.classFrame.location = pathtoroot + url;
+ } else {
+ window.location.href = pathtoroot + url;
+ }
+ $("#search").focus();
+ }
+ }
+ });
+});
diff --git a/doc/serialized-form.html b/doc/serialized-form.html
new file mode 100644
index 0000000000000000000000000000000000000000..f0bd756b138b0d0eace99fb8f735ff25f87a4d82
--- /dev/null
+++ b/doc/serialized-form.html
@@ -0,0 +1,102 @@
+<!DOCTYPE HTML>
+<!-- NewPage -->
+<html lang="en">
+<head>
+<!-- Generated by javadoc (15) on Thu Apr 01 01:09:08 CEST 2021 -->
+<title>Serialized Form</title>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+<meta name="dc.created" content="2021-04-01">
+<meta name="description" content="serialized forms">
+<meta name="generator" content="javadoc/SerializedFormWriterImpl">
+<link rel="stylesheet" type="text/css" href="stylesheet.css" title="Style">
+<link rel="stylesheet" type="text/css" href="script-dir/jquery-ui.min.css" title="Style">
+<link rel="stylesheet" type="text/css" href="jquery-ui.overrides.css" title="Style">
+<script type="text/javascript" src="script.js"></script>
+<script type="text/javascript" src="script-dir/jquery-3.5.1.min.js"></script>
+<script type="text/javascript" src="script-dir/jquery-ui.min.js"></script>
+</head>
+<body class="serialized-form-page">
+<script type="text/javascript">var pathtoroot = "./";
+loadScripts(document, 'script');</script>
+<noscript>
+<div>JavaScript is disabled on your browser.</div>
+</noscript>
+<div class="flex-box">
+<header role="banner" class="flex-header">
+<nav role="navigation">
+<!-- ========= START OF TOP NAVBAR ======= -->
+<div class="top-nav" id="navbar.top">
+<div class="skip-nav"><a href="#skip.navbar.top" title="Skip navigation links">Skip navigation links</a></div>
+<ul id="navbar.top.firstrow" class="nav-list" title="Navigation">
+<li><a href="sr2/flopbox/package-summary.html">Package</a></li>
+<li>Class</li>
+<li><a href="overview-tree.html">Tree</a></li>
+<li><a href="deprecated-list.html">Deprecated</a></li>
+<li><a href="index-files/index-1.html">Index</a></li>
+<li><a href="help-doc.html">Help</a></li>
+</ul>
+</div>
+<div class="sub-nav">
+<div class="nav-list-search"><label for="search">SEARCH:</label>
+<input type="text" id="search" value="search" disabled="disabled">
+<input type="reset" id="reset" value="reset" disabled="disabled">
+</div>
+</div>
+<!-- ========= END OF TOP NAVBAR ========= -->
+<span class="skip-nav" id="skip.navbar.top">
+<!-- -->
+</span></nav>
+</header>
+<div class="flex-content">
+<main role="main">
+<div class="header">
+<h1 title="Serialized Form" class="title">Serialized Form</h1>
+</div>
+<ul class="block-list">
+<li>
+<section class="serialized-package-container">
+<h2 title="Package">Package sr2.flopbox</h2>
+<ul class="block-list">
+<li>
+<section class="serialized-class-details" id="sr2.flopbox.cantConnectToServerException">
+<h3>Class <a href="sr2/flopbox/cantConnectToServerException.html" title="class in sr2.flopbox">sr2.flopbox.cantConnectToServerException</a> extends java.lang.Exception implements Serializable</h3>
+</section>
+</li>
+<li>
+<section class="serialized-class-details" id="sr2.flopbox.FileDoesNotExistException">
+<h3>Class <a href="sr2/flopbox/FileDoesNotExistException.html" title="class in sr2.flopbox">sr2.flopbox.FileDoesNotExistException</a> extends java.lang.Exception implements Serializable</h3>
+</section>
+</li>
+<li>
+<section class="serialized-class-details" id="sr2.flopbox.NoServerFoundException">
+<h3>Class <a href="sr2/flopbox/NoServerFoundException.html" title="class in sr2.flopbox">sr2.flopbox.NoServerFoundException</a> extends java.lang.Exception implements Serializable</h3>
+</section>
+</li>
+</ul>
+</section>
+</li>
+</ul>
+</main>
+<footer role="contentinfo">
+<nav role="navigation">
+<!-- ======= START OF BOTTOM NAVBAR ====== -->
+<div class="bottom-nav" id="navbar.bottom">
+<div class="skip-nav"><a href="#skip.navbar.bottom" title="Skip navigation links">Skip navigation links</a></div>
+<ul id="navbar.bottom.firstrow" class="nav-list" title="Navigation">
+<li><a href="sr2/flopbox/package-summary.html">Package</a></li>
+<li>Class</li>
+<li><a href="overview-tree.html">Tree</a></li>
+<li><a href="deprecated-list.html">Deprecated</a></li>
+<li><a href="index-files/index-1.html">Index</a></li>
+<li><a href="help-doc.html">Help</a></li>
+</ul>
+</div>
+<!-- ======== END OF BOTTOM NAVBAR ======= -->
+<span class="skip-nav" id="skip.navbar.bottom">
+<!-- -->
+</span></nav>
+</footer>
+</div>
+</div>
+</body>
+</html>
diff --git a/doc/sr2/flopbox/FileDoesNotExistException.html b/doc/sr2/flopbox/FileDoesNotExistException.html
new file mode 100644
index 0000000000000000000000000000000000000000..8b3f9324d06c51edc1b15ef55c12685312313fb2
--- /dev/null
+++ b/doc/sr2/flopbox/FileDoesNotExistException.html
@@ -0,0 +1,190 @@
+<!DOCTYPE HTML>
+<!-- NewPage -->
+<html lang="en">
+<head>
+<!-- Generated by javadoc (15) on Thu Apr 01 01:09:08 CEST 2021 -->
+<title>FileDoesNotExistException</title>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+<meta name="dc.created" content="2021-04-01">
+<meta name="description" content="declaration: package: sr2.flopbox, class: FileDoesNotExistException">
+<meta name="generator" content="javadoc/ClassWriterImpl">
+<link rel="stylesheet" type="text/css" href="../../stylesheet.css" title="Style">
+<link rel="stylesheet" type="text/css" href="../../script-dir/jquery-ui.min.css" title="Style">
+<link rel="stylesheet" type="text/css" href="../../jquery-ui.overrides.css" title="Style">
+<script type="text/javascript" src="../../script.js"></script>
+<script type="text/javascript" src="../../script-dir/jquery-3.5.1.min.js"></script>
+<script type="text/javascript" src="../../script-dir/jquery-ui.min.js"></script>
+</head>
+<body class="class-declaration-page">
+<script type="text/javascript">var pathtoroot = "../../";
+loadScripts(document, 'script');</script>
+<noscript>
+<div>JavaScript is disabled on your browser.</div>
+</noscript>
+<div class="flex-box">
+<header role="banner" class="flex-header">
+<nav role="navigation">
+<!-- ========= START OF TOP NAVBAR ======= -->
+<div class="top-nav" id="navbar.top">
+<div class="skip-nav"><a href="#skip.navbar.top" title="Skip navigation links">Skip navigation links</a></div>
+<ul id="navbar.top.firstrow" class="nav-list" title="Navigation">
+<li><a href="package-summary.html">Package</a></li>
+<li class="nav-bar-cell1-rev">Class</li>
+<li><a href="package-tree.html">Tree</a></li>
+<li><a href="../../deprecated-list.html">Deprecated</a></li>
+<li><a href="../../index-files/index-1.html">Index</a></li>
+<li><a href="../../help-doc.html">Help</a></li>
+</ul>
+</div>
+<div class="sub-nav">
+<div>
+<ul class="sub-nav-list">
+<li>Summary: </li>
+<li>Nested | </li>
+<li>Field | </li>
+<li><a href="#constructor.summary">Constr</a> | </li>
+<li><a href="#method.summary">Method</a></li>
+</ul>
+<ul class="sub-nav-list">
+<li>Detail: </li>
+<li>Field | </li>
+<li><a href="#constructor.detail">Constr</a> | </li>
+<li>Method</li>
+</ul>
+</div>
+<div class="nav-list-search"><label for="search">SEARCH:</label>
+<input type="text" id="search" value="search" disabled="disabled">
+<input type="reset" id="reset" value="reset" disabled="disabled">
+</div>
+</div>
+<!-- ========= END OF TOP NAVBAR ========= -->
+<span class="skip-nav" id="skip.navbar.top">
+<!-- -->
+</span></nav>
+</header>
+<div class="flex-content">
+<main role="main">
+<!-- ======== START OF CLASS DATA ======== -->
+<div class="header">
+<div class="sub-title"><span class="package-label-in-type">Package</span> <a href="package-summary.html">sr2.flopbox</a></div>
+<h1 title="Class FileDoesNotExistException" class="title">Class FileDoesNotExistException</h1>
+</div>
+<div class="inheritance" title="Inheritance Tree">java.lang.Object
+<div class="inheritance">java.lang.Throwable
+<div class="inheritance">java.lang.Exception
+<div class="inheritance">sr2.flopbox.FileDoesNotExistException</div>
+</div>
+</div>
+</div>
+<section class="description">
+<dl class="notes">
+<dt>All Implemented Interfaces:</dt>
+<dd><code>java.io.Serializable</code></dd>
+</dl>
+<hr>
+<pre>public class <span class="type-name-label">FileDoesNotExistException</span>
+extends java.lang.Exception</pre>
+<dl class="notes">
+<dt>See Also:</dt>
+<dd><a href="../../serialized-form.html#sr2.flopbox.FileDoesNotExistException">Serialized Form</a></dd>
+</dl>
+</section>
+<section class="summary">
+<ul class="summary-list">
+<!-- ======== CONSTRUCTOR SUMMARY ======== -->
+<li>
+<section class="constructor-summary" id="constructor.summary">
+<h2>Constructor Summary</h2>
+<div class="member-summary">
+<table class="summary-table">
+<caption><span>Constructors</span></caption>
+<thead>
+<tr>
+<th class="col-first" scope="col">Constructor</th>
+<th class="col-last" scope="col">Description</th>
+</tr>
+</thead>
+<tbody>
+<tr class="alt-color">
+<th class="col-constructor-name" scope="row"><code><span class="member-name-link"><a href="#%3Cinit%3E(java.lang.String)">FileDoesNotExistException</a></span>​(java.lang.String errorMessage)</code></th>
+<td class="col-last"> </td>
+</tr>
+</tbody>
+</table>
+</div>
+</section>
+</li>
+<!-- ========== METHOD SUMMARY =========== -->
+<li>
+<section class="method-summary" id="method.summary">
+<h2>Method Summary</h2>
+<div class="inherited-list">
+<h3 id="methods.inherited.from.class.java.lang.Throwable">Methods inherited from class java.lang.Throwable</h3>
+<code>addSuppressed, fillInStackTrace, getCause, getLocalizedMessage, getMessage, getStackTrace, getSuppressed, initCause, printStackTrace, printStackTrace, printStackTrace, setStackTrace, toString</code></div>
+<div class="inherited-list">
+<h3 id="methods.inherited.from.class.java.lang.Object">Methods inherited from class java.lang.Object</h3>
+<code>clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait</code></div>
+</section>
+</li>
+</ul>
+</section>
+<section class="details">
+<ul class="details-list">
+<!-- ========= CONSTRUCTOR DETAIL ======== -->
+<li>
+<section class="constructor-details" id="constructor.detail">
+<h2>Constructor Details</h2>
+<ul class="member-list">
+<li>
+<section class="detail" id="<init>(java.lang.String)">
+<h3>FileDoesNotExistException</h3>
+<div class="member-signature"><span class="modifiers">public</span> <span class="member-name">FileDoesNotExistException</span>​(<span class="parameters">java.lang.String errorMessage)</span></div>
+</section>
+</li>
+</ul>
+</section>
+</li>
+</ul>
+</section>
+<!-- ========= END OF CLASS DATA ========= -->
+</main>
+<footer role="contentinfo">
+<nav role="navigation">
+<!-- ======= START OF BOTTOM NAVBAR ====== -->
+<div class="bottom-nav" id="navbar.bottom">
+<div class="skip-nav"><a href="#skip.navbar.bottom" title="Skip navigation links">Skip navigation links</a></div>
+<ul id="navbar.bottom.firstrow" class="nav-list" title="Navigation">
+<li><a href="package-summary.html">Package</a></li>
+<li class="nav-bar-cell1-rev">Class</li>
+<li><a href="package-tree.html">Tree</a></li>
+<li><a href="../../deprecated-list.html">Deprecated</a></li>
+<li><a href="../../index-files/index-1.html">Index</a></li>
+<li><a href="../../help-doc.html">Help</a></li>
+</ul>
+</div>
+<div class="sub-nav">
+<div>
+<ul class="sub-nav-list">
+<li>Summary: </li>
+<li>Nested | </li>
+<li>Field | </li>
+<li><a href="#constructor.summary">Constr</a> | </li>
+<li><a href="#method.summary">Method</a></li>
+</ul>
+<ul class="sub-nav-list">
+<li>Detail: </li>
+<li>Field | </li>
+<li><a href="#constructor.detail">Constr</a> | </li>
+<li>Method</li>
+</ul>
+</div>
+</div>
+<!-- ======== END OF BOTTOM NAVBAR ======= -->
+<span class="skip-nav" id="skip.navbar.bottom">
+<!-- -->
+</span></nav>
+</footer>
+</div>
+</div>
+</body>
+</html>
diff --git a/doc/sr2/flopbox/FilesServices.html b/doc/sr2/flopbox/FilesServices.html
new file mode 100644
index 0000000000000000000000000000000000000000..af3b385332277284b71882f726e85d0c9b7f21a1
--- /dev/null
+++ b/doc/sr2/flopbox/FilesServices.html
@@ -0,0 +1,431 @@
+<!DOCTYPE HTML>
+<!-- NewPage -->
+<html lang="en">
+<head>
+<!-- Generated by javadoc (15) on Thu Apr 01 01:09:08 CEST 2021 -->
+<title>FilesServices</title>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+<meta name="dc.created" content="2021-04-01">
+<meta name="description" content="declaration: package: sr2.flopbox, class: FilesServices">
+<meta name="generator" content="javadoc/ClassWriterImpl">
+<link rel="stylesheet" type="text/css" href="../../stylesheet.css" title="Style">
+<link rel="stylesheet" type="text/css" href="../../script-dir/jquery-ui.min.css" title="Style">
+<link rel="stylesheet" type="text/css" href="../../jquery-ui.overrides.css" title="Style">
+<script type="text/javascript" src="../../script.js"></script>
+<script type="text/javascript" src="../../script-dir/jquery-3.5.1.min.js"></script>
+<script type="text/javascript" src="../../script-dir/jquery-ui.min.js"></script>
+</head>
+<body class="class-declaration-page">
+<script type="text/javascript">var data = {"i0":10,"i1":10,"i2":10,"i3":10,"i4":10,"i5":10};
+var tabs = {65535:["t0","All Methods"],2:["t2","Instance Methods"],8:["t4","Concrete Methods"]};
+var altColor = "alt-color";
+var rowColor = "row-color";
+var tableTab = "table-tab";
+var activeTableTab = "active-table-tab";
+var pathtoroot = "../../";
+loadScripts(document, 'script');</script>
+<noscript>
+<div>JavaScript is disabled on your browser.</div>
+</noscript>
+<div class="flex-box">
+<header role="banner" class="flex-header">
+<nav role="navigation">
+<!-- ========= START OF TOP NAVBAR ======= -->
+<div class="top-nav" id="navbar.top">
+<div class="skip-nav"><a href="#skip.navbar.top" title="Skip navigation links">Skip navigation links</a></div>
+<ul id="navbar.top.firstrow" class="nav-list" title="Navigation">
+<li><a href="package-summary.html">Package</a></li>
+<li class="nav-bar-cell1-rev">Class</li>
+<li><a href="package-tree.html">Tree</a></li>
+<li><a href="../../deprecated-list.html">Deprecated</a></li>
+<li><a href="../../index-files/index-1.html">Index</a></li>
+<li><a href="../../help-doc.html">Help</a></li>
+</ul>
+</div>
+<div class="sub-nav">
+<div>
+<ul class="sub-nav-list">
+<li>Summary: </li>
+<li>Nested | </li>
+<li>Field | </li>
+<li><a href="#constructor.summary">Constr</a> | </li>
+<li><a href="#method.summary">Method</a></li>
+</ul>
+<ul class="sub-nav-list">
+<li>Detail: </li>
+<li>Field | </li>
+<li><a href="#constructor.detail">Constr</a> | </li>
+<li><a href="#method.detail">Method</a></li>
+</ul>
+</div>
+<div class="nav-list-search"><label for="search">SEARCH:</label>
+<input type="text" id="search" value="search" disabled="disabled">
+<input type="reset" id="reset" value="reset" disabled="disabled">
+</div>
+</div>
+<!-- ========= END OF TOP NAVBAR ========= -->
+<span class="skip-nav" id="skip.navbar.top">
+<!-- -->
+</span></nav>
+</header>
+<div class="flex-content">
+<main role="main">
+<!-- ======== START OF CLASS DATA ======== -->
+<div class="header">
+<div class="sub-title"><span class="package-label-in-type">Package</span> <a href="package-summary.html">sr2.flopbox</a></div>
+<h1 title="Class FilesServices" class="title">Class FilesServices</h1>
+</div>
+<div class="inheritance" title="Inheritance Tree">java.lang.Object
+<div class="inheritance">sr2.flopbox.FilesServices</div>
+</div>
+<section class="description">
+<hr>
+<pre>@Path("servers/{alias}/files")
+public class <span class="type-name-label">FilesServices</span>
+extends java.lang.Object</pre>
+</section>
+<section class="summary">
+<ul class="summary-list">
+<!-- ======== CONSTRUCTOR SUMMARY ======== -->
+<li>
+<section class="constructor-summary" id="constructor.summary">
+<h2>Constructor Summary</h2>
+<div class="member-summary">
+<table class="summary-table">
+<caption><span>Constructors</span></caption>
+<thead>
+<tr>
+<th class="col-first" scope="col">Constructor</th>
+<th class="col-last" scope="col">Description</th>
+</tr>
+</thead>
+<tbody>
+<tr class="alt-color">
+<th class="col-constructor-name" scope="row"><code><span class="member-name-link"><a href="#%3Cinit%3E()">FilesServices</a></span>()</code></th>
+<td class="col-last"> </td>
+</tr>
+</tbody>
+</table>
+</div>
+</section>
+</li>
+<!-- ========== METHOD SUMMARY =========== -->
+<li>
+<section class="method-summary" id="method.summary">
+<h2>Method Summary</h2>
+<div class="member-summary" id="method-summary-table">
+<div class="table-tabs" role="tablist" aria-orientation="horizontal"><button role="tab" aria-selected="true" aria-controls="method-summary-table.tabpanel" tabindex="0" onkeydown="switchTab(event)" id="t0" class="active-table-tab">All Methods</button><button role="tab" aria-selected="false" aria-controls="method-summary-table.tabpanel" tabindex="-1" onkeydown="switchTab(event)" id="t2" class="table-tab" onclick="show(2);">Instance Methods</button><button role="tab" aria-selected="false" aria-controls="method-summary-table.tabpanel" tabindex="-1" onkeydown="switchTab(event)" id="t4" class="table-tab" onclick="show(8);">Concrete Methods</button></div>
+<div id="method-summary-table.tabpanel" role="tabpanel">
+<table class="summary-table" aria-labelledby="t0">
+<thead>
+<tr>
+<th class="col-first" scope="col">Modifier and Type</th>
+<th class="col-second" scope="col">Method</th>
+<th class="col-last" scope="col">Description</th>
+</tr>
+</thead>
+<tbody>
+<tr class="alt-color" id="i0">
+<td class="col-first"><code>java.lang.Object</code></td>
+<th class="col-second" scope="row"><code><span class="member-name-link"><a href="#addfile(java.lang.String,java.lang.String,java.lang.String)">addfile</a></span>​(java.lang.String token,
+java.lang.String path,
+java.lang.String alias)</code></th>
+<td class="col-last">
+<div class="block">Method used to create repository</div>
+</td>
+</tr>
+<tr class="row-color" id="i1">
+<td class="col-first"><code>java.lang.Object</code></td>
+<th class="col-second" scope="row"><code><span class="member-name-link"><a href="#delete(java.lang.String,java.lang.String,java.lang.String)">delete</a></span>​(java.lang.String token,
+java.lang.String path,
+java.lang.String alias)</code></th>
+<td class="col-last">
+<div class="block">method used to delete any file or repository of the server 'alias'</div>
+</td>
+</tr>
+<tr class="alt-color" id="i2">
+<td class="col-first"><code>java.lang.Object</code></td>
+<th class="col-second" scope="row"><code><span class="member-name-link"><a href="#listFile(java.lang.String,java.lang.String,java.lang.String)">listFile</a></span>​(java.lang.String token,
+java.lang.String file,
+java.lang.String alias)</code></th>
+<td class="col-last">
+<div class="block">Method to list the content of any text file</div>
+</td>
+</tr>
+<tr class="row-color" id="i3">
+<td class="col-first"><code>java.lang.String</code></td>
+<th class="col-second" scope="row"><code><span class="member-name-link"><a href="#listrepository(java.lang.String,java.lang.String,java.lang.String)">listrepository</a></span>​(java.lang.String token,
+java.lang.String file,
+java.lang.String alias)</code></th>
+<td class="col-last">
+<div class="block">Method to list the content of any repository</div>
+</td>
+</tr>
+<tr class="alt-color" id="i4">
+<td class="col-first"><code>java.lang.String</code></td>
+<th class="col-second" scope="row"><code><span class="member-name-link"><a href="#rename(java.lang.String,java.lang.String,java.lang.String,java.lang.String)">rename</a></span>​(java.lang.String token,
+java.lang.String path,
+java.lang.String alias,
+java.lang.String newPath)</code></th>
+<td class="col-last">
+<div class="block">Method used to rename a file or a repository</div>
+</td>
+</tr>
+<tr class="row-color" id="i5">
+<td class="col-first"><code>java.lang.String</code></td>
+<th class="col-second" scope="row"><code><span class="member-name-link"><a href="#test(java.lang.String,java.lang.String)">test</a></span>​(java.lang.String token,
+java.lang.String alias)</code></th>
+<td class="col-last">
+<div class="block">Method to check is the resource is ok</div>
+</td>
+</tr>
+</tbody>
+</table>
+</div>
+</div>
+<div class="inherited-list">
+<h3 id="methods.inherited.from.class.java.lang.Object">Methods inherited from class java.lang.Object</h3>
+<code>clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait</code></div>
+</section>
+</li>
+</ul>
+</section>
+<section class="details">
+<ul class="details-list">
+<!-- ========= CONSTRUCTOR DETAIL ======== -->
+<li>
+<section class="constructor-details" id="constructor.detail">
+<h2>Constructor Details</h2>
+<ul class="member-list">
+<li>
+<section class="detail" id="<init>()">
+<h3>FilesServices</h3>
+<div class="member-signature"><span class="modifiers">public</span> <span class="member-name">FilesServices</span>()</div>
+</section>
+</li>
+</ul>
+</section>
+</li>
+<!-- ============ METHOD DETAIL ========== -->
+<li>
+<section class="method-details" id="method.detail">
+<h2>Method Details</h2>
+<ul class="member-list">
+<li>
+<section class="detail" id="listrepository(java.lang.String,java.lang.String,java.lang.String)">
+<h3>listrepository</h3>
+<div class="member-signature"><span class="annotations">@GET
+@Path("getContentRep")
+@Produces("text/plain")
+</span><span class="modifiers">public</span> <span class="return-type">java.lang.String</span> <span class="member-name">listrepository</span>​(<span class="parameters">@HeaderParam("token")
+java.lang.String token,
+@QueryParam("file")
+java.lang.String file,
+@PathParam("alias")
+java.lang.String alias)</span>
+ throws <span class="exceptions"><a href="NoServerFoundException.html" title="class in sr2.flopbox">NoServerFoundException</a>,
+java.io.IOException,
+<a href="FileDoesNotExistException.html" title="class in sr2.flopbox">FileDoesNotExistException</a></span></div>
+<div class="block">Method to list the content of any repository</div>
+<dl class="notes">
+<dt>Parameters:</dt>
+<dd><code>token</code> - the client token from the header</dd>
+<dd><code>file</code> - the repository to display</dd>
+<dd><code>alias</code> - the ftp server alias</dd>
+<dt>Returns:</dt>
+<dd>The content of the `file` repository</dd>
+<dt>Throws:</dt>
+<dd><code><a href="NoServerFoundException.html" title="class in sr2.flopbox">NoServerFoundException</a></code> - If the alias refer to no server known</dd>
+<dd><code>java.io.IOException</code> - if they are a FTP command fail during the function process</dd>
+<dd><code><a href="FileDoesNotExistException.html" title="class in sr2.flopbox">FileDoesNotExistException</a></code> - is the repository doesnt exist</dd>
+</dl>
+</section>
+</li>
+<li>
+<section class="detail" id="listFile(java.lang.String,java.lang.String,java.lang.String)">
+<h3>listFile</h3>
+<div class="member-signature"><span class="annotations">@GET
+@Path("getContentFile")
+@Produces("application/octet-stream")
+</span><span class="modifiers">public</span> <span class="return-type">java.lang.Object</span> <span class="member-name">listFile</span>​(<span class="parameters">@HeaderParam("token")
+java.lang.String token,
+@QueryParam("file")
+java.lang.String file,
+@PathParam("alias")
+java.lang.String alias)</span>
+ throws <span class="exceptions"><a href="NoServerFoundException.html" title="class in sr2.flopbox">NoServerFoundException</a>,
+java.io.IOException,
+<a href="FileDoesNotExistException.html" title="class in sr2.flopbox">FileDoesNotExistException</a></span></div>
+<div class="block">Method to list the content of any text file</div>
+<dl class="notes">
+<dt>Parameters:</dt>
+<dd><code>token</code> - the client token from the header</dd>
+<dd><code>file</code> - the file to display</dd>
+<dd><code>alias</code> - the ftp server alias</dd>
+<dt>Returns:</dt>
+<dd>The content of the `file`</dd>
+<dt>Throws:</dt>
+<dd><code><a href="NoServerFoundException.html" title="class in sr2.flopbox">NoServerFoundException</a></code> - If the alias refer to no server known</dd>
+<dd><code>java.io.IOException</code> - if they are a FTP command fail during the function process</dd>
+<dd><code><a href="FileDoesNotExistException.html" title="class in sr2.flopbox">FileDoesNotExistException</a></code> - is the file doesnt exist</dd>
+</dl>
+</section>
+</li>
+<li>
+<section class="detail" id="rename(java.lang.String,java.lang.String,java.lang.String,java.lang.String)">
+<h3>rename</h3>
+<div class="member-signature"><span class="annotations">@POST
+@Path("rename")
+@Produces({"text/plain","application/octet-stream"})
+</span><span class="modifiers">public</span> <span class="return-type">java.lang.String</span> <span class="member-name">rename</span>​(<span class="parameters">@HeaderParam("token")
+java.lang.String token,
+@QueryParam("path")
+java.lang.String path,
+@PathParam("alias")
+java.lang.String alias,
+@QueryParam("newPath")
+java.lang.String newPath)</span>
+ throws <span class="exceptions"><a href="NoServerFoundException.html" title="class in sr2.flopbox">NoServerFoundException</a>,
+java.io.IOException,
+<a href="FileDoesNotExistException.html" title="class in sr2.flopbox">FileDoesNotExistException</a></span></div>
+<div class="block">Method used to rename a file or a repository</div>
+<dl class="notes">
+<dt>Parameters:</dt>
+<dd><code>token</code> - the client token from the header</dd>
+<dd><code>path</code> - the path of the file to rename</dd>
+<dd><code>alias</code> - the ftp server alias</dd>
+<dd><code>newPath</code> - the new name of the repository</dd>
+<dt>Returns:</dt>
+<dd>a String about the success or the fail of the method</dd>
+<dt>Throws:</dt>
+<dd><code><a href="NoServerFoundException.html" title="class in sr2.flopbox">NoServerFoundException</a></code> - If the alias refer to no server known</dd>
+<dd><code>java.io.IOException</code> - if they are a FTP command fail during the function process</dd>
+<dd><code><a href="FileDoesNotExistException.html" title="class in sr2.flopbox">FileDoesNotExistException</a></code> - is the file doesnt exist</dd>
+</dl>
+</section>
+</li>
+<li>
+<section class="detail" id="delete(java.lang.String,java.lang.String,java.lang.String)">
+<h3>delete</h3>
+<div class="member-signature"><span class="annotations">@DELETE
+@Path("delete")
+@Produces({"text/plain","application/octet-stream"})
+</span><span class="modifiers">public</span> <span class="return-type">java.lang.Object</span> <span class="member-name">delete</span>​(<span class="parameters">@HeaderParam("token")
+java.lang.String token,
+@QueryParam("path")
+java.lang.String path,
+@PathParam("alias")
+java.lang.String alias)</span>
+ throws <span class="exceptions"><a href="NoServerFoundException.html" title="class in sr2.flopbox">NoServerFoundException</a>,
+java.io.IOException</span></div>
+<div class="block">method used to delete any file or repository of the server 'alias'</div>
+<dl class="notes">
+<dt>Parameters:</dt>
+<dd><code>token</code> - the client token from the header</dd>
+<dd><code>path</code> - the path of the file to delete</dd>
+<dd><code>alias</code> - the ftp server alias</dd>
+<dt>Returns:</dt>
+<dd>a String about the success or the fail of the method</dd>
+<dt>Throws:</dt>
+<dd><code><a href="NoServerFoundException.html" title="class in sr2.flopbox">NoServerFoundException</a></code> - If the alias refer to no server known</dd>
+<dd><code>java.io.IOException</code> - if they are a FTP command fail during the function process</dd>
+</dl>
+</section>
+</li>
+<li>
+<section class="detail" id="addfile(java.lang.String,java.lang.String,java.lang.String)">
+<h3>addfile</h3>
+<div class="member-signature"><span class="annotations">@PUT
+@Path("add")
+@Produces({"text/plain","application/octet-stream"})
+</span><span class="modifiers">public</span> <span class="return-type">java.lang.Object</span> <span class="member-name">addfile</span>​(<span class="parameters">@HeaderParam("token")
+java.lang.String token,
+@QueryParam("path")
+java.lang.String path,
+@PathParam("alias")
+java.lang.String alias)</span>
+ throws <span class="exceptions"><a href="NoServerFoundException.html" title="class in sr2.flopbox">NoServerFoundException</a>,
+java.io.IOException</span></div>
+<div class="block">Method used to create repository</div>
+<dl class="notes">
+<dt>Parameters:</dt>
+<dd><code>token</code> - the client token from the header</dd>
+<dd><code>path</code> - the path of the repository to create</dd>
+<dd><code>alias</code> - the ftp server alias</dd>
+<dt>Returns:</dt>
+<dd>a String about the success or the fail of the method</dd>
+<dt>Throws:</dt>
+<dd><code><a href="NoServerFoundException.html" title="class in sr2.flopbox">NoServerFoundException</a></code> - If the alias refer to no server known</dd>
+<dd><code>java.io.IOException</code> - if they are a FTP command fail during the function process</dd>
+</dl>
+</section>
+</li>
+<li>
+<section class="detail" id="test(java.lang.String,java.lang.String)">
+<h3>test</h3>
+<div class="member-signature"><span class="annotations">@GET
+@Produces("text/plain")
+</span><span class="modifiers">public</span> <span class="return-type">java.lang.String</span> <span class="member-name">test</span>​(<span class="parameters">@HeaderParam("token")
+java.lang.String token,
+@PathParam("alias")
+java.lang.String alias)</span>
+ throws <span class="exceptions"><a href="NoServerFoundException.html" title="class in sr2.flopbox">NoServerFoundException</a></span></div>
+<div class="block">Method to check is the resource is ok</div>
+<dl class="notes">
+<dt>Parameters:</dt>
+<dd><code>token</code> - the client token</dd>
+<dd><code>alias</code> - the ftp server alias</dd>
+<dt>Returns:</dt>
+<dd>a string about the resource</dd>
+<dt>Throws:</dt>
+<dd><code><a href="NoServerFoundException.html" title="class in sr2.flopbox">NoServerFoundException</a></code> - is the alias doesnt refer to a ftp server known</dd>
+</dl>
+</section>
+</li>
+</ul>
+</section>
+</li>
+</ul>
+</section>
+<!-- ========= END OF CLASS DATA ========= -->
+</main>
+<footer role="contentinfo">
+<nav role="navigation">
+<!-- ======= START OF BOTTOM NAVBAR ====== -->
+<div class="bottom-nav" id="navbar.bottom">
+<div class="skip-nav"><a href="#skip.navbar.bottom" title="Skip navigation links">Skip navigation links</a></div>
+<ul id="navbar.bottom.firstrow" class="nav-list" title="Navigation">
+<li><a href="package-summary.html">Package</a></li>
+<li class="nav-bar-cell1-rev">Class</li>
+<li><a href="package-tree.html">Tree</a></li>
+<li><a href="../../deprecated-list.html">Deprecated</a></li>
+<li><a href="../../index-files/index-1.html">Index</a></li>
+<li><a href="../../help-doc.html">Help</a></li>
+</ul>
+</div>
+<div class="sub-nav">
+<div>
+<ul class="sub-nav-list">
+<li>Summary: </li>
+<li>Nested | </li>
+<li>Field | </li>
+<li><a href="#constructor.summary">Constr</a> | </li>
+<li><a href="#method.summary">Method</a></li>
+</ul>
+<ul class="sub-nav-list">
+<li>Detail: </li>
+<li>Field | </li>
+<li><a href="#constructor.detail">Constr</a> | </li>
+<li><a href="#method.detail">Method</a></li>
+</ul>
+</div>
+</div>
+<!-- ======== END OF BOTTOM NAVBAR ======= -->
+<span class="skip-nav" id="skip.navbar.bottom">
+<!-- -->
+</span></nav>
+</footer>
+</div>
+</div>
+</body>
+</html>
diff --git a/doc/sr2/flopbox/FtpServer.FtpServerBuilder.html b/doc/sr2/flopbox/FtpServer.FtpServerBuilder.html
new file mode 100644
index 0000000000000000000000000000000000000000..8749d3516995737ea83eecf4a99b78ac081d0efe
--- /dev/null
+++ b/doc/sr2/flopbox/FtpServer.FtpServerBuilder.html
@@ -0,0 +1,311 @@
+<!DOCTYPE HTML>
+<!-- NewPage -->
+<html lang="en">
+<head>
+<!-- Generated by javadoc (15) on Thu Apr 01 01:09:08 CEST 2021 -->
+<title>FtpServer.FtpServerBuilder</title>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+<meta name="dc.created" content="2021-04-01">
+<meta name="description" content="declaration: package: sr2.flopbox, class: FtpServer, class: FtpServerBuilder">
+<meta name="generator" content="javadoc/ClassWriterImpl">
+<link rel="stylesheet" type="text/css" href="../../stylesheet.css" title="Style">
+<link rel="stylesheet" type="text/css" href="../../script-dir/jquery-ui.min.css" title="Style">
+<link rel="stylesheet" type="text/css" href="../../jquery-ui.overrides.css" title="Style">
+<script type="text/javascript" src="../../script.js"></script>
+<script type="text/javascript" src="../../script-dir/jquery-3.5.1.min.js"></script>
+<script type="text/javascript" src="../../script-dir/jquery-ui.min.js"></script>
+</head>
+<body class="class-declaration-page">
+<script type="text/javascript">var data = {"i0":10,"i1":10,"i2":10,"i3":10,"i4":10,"i5":10};
+var tabs = {65535:["t0","All Methods"],2:["t2","Instance Methods"],8:["t4","Concrete Methods"]};
+var altColor = "alt-color";
+var rowColor = "row-color";
+var tableTab = "table-tab";
+var activeTableTab = "active-table-tab";
+var pathtoroot = "../../";
+loadScripts(document, 'script');</script>
+<noscript>
+<div>JavaScript is disabled on your browser.</div>
+</noscript>
+<div class="flex-box">
+<header role="banner" class="flex-header">
+<nav role="navigation">
+<!-- ========= START OF TOP NAVBAR ======= -->
+<div class="top-nav" id="navbar.top">
+<div class="skip-nav"><a href="#skip.navbar.top" title="Skip navigation links">Skip navigation links</a></div>
+<ul id="navbar.top.firstrow" class="nav-list" title="Navigation">
+<li><a href="package-summary.html">Package</a></li>
+<li class="nav-bar-cell1-rev">Class</li>
+<li><a href="package-tree.html">Tree</a></li>
+<li><a href="../../deprecated-list.html">Deprecated</a></li>
+<li><a href="../../index-files/index-1.html">Index</a></li>
+<li><a href="../../help-doc.html">Help</a></li>
+</ul>
+</div>
+<div class="sub-nav">
+<div>
+<ul class="sub-nav-list">
+<li>Summary: </li>
+<li>Nested | </li>
+<li>Field | </li>
+<li><a href="#constructor.summary">Constr</a> | </li>
+<li><a href="#method.summary">Method</a></li>
+</ul>
+<ul class="sub-nav-list">
+<li>Detail: </li>
+<li>Field | </li>
+<li><a href="#constructor.detail">Constr</a> | </li>
+<li><a href="#method.detail">Method</a></li>
+</ul>
+</div>
+<div class="nav-list-search"><label for="search">SEARCH:</label>
+<input type="text" id="search" value="search" disabled="disabled">
+<input type="reset" id="reset" value="reset" disabled="disabled">
+</div>
+</div>
+<!-- ========= END OF TOP NAVBAR ========= -->
+<span class="skip-nav" id="skip.navbar.top">
+<!-- -->
+</span></nav>
+</header>
+<div class="flex-content">
+<main role="main">
+<!-- ======== START OF CLASS DATA ======== -->
+<div class="header">
+<div class="sub-title"><span class="package-label-in-type">Package</span> <a href="package-summary.html">sr2.flopbox</a></div>
+<h1 title="Class FtpServer.FtpServerBuilder" class="title">Class FtpServer.FtpServerBuilder</h1>
+</div>
+<div class="inheritance" title="Inheritance Tree">java.lang.Object
+<div class="inheritance">sr2.flopbox.FtpServer.FtpServerBuilder</div>
+</div>
+<section class="description">
+<dl class="notes">
+<dt>Enclosing class:</dt>
+<dd><a href="FtpServer.html" title="class in sr2.flopbox">FtpServer</a></dd>
+</dl>
+<hr>
+<pre>public static class <span class="type-name-label">FtpServer.FtpServerBuilder</span>
+extends java.lang.Object</pre>
+<div class="block">Constructor of a FTP client builder</div>
+</section>
+<section class="summary">
+<ul class="summary-list">
+<!-- ======== CONSTRUCTOR SUMMARY ======== -->
+<li>
+<section class="constructor-summary" id="constructor.summary">
+<h2>Constructor Summary</h2>
+<div class="member-summary">
+<table class="summary-table">
+<caption><span>Constructors</span></caption>
+<thead>
+<tr>
+<th class="col-first" scope="col">Constructor</th>
+<th class="col-last" scope="col">Description</th>
+</tr>
+</thead>
+<tbody>
+<tr class="alt-color">
+<th class="col-constructor-name" scope="row"><code><span class="member-name-link"><a href="#%3Cinit%3E()">FtpServerBuilder</a></span>()</code></th>
+<td class="col-last"> </td>
+</tr>
+</tbody>
+</table>
+</div>
+</section>
+</li>
+<!-- ========== METHOD SUMMARY =========== -->
+<li>
+<section class="method-summary" id="method.summary">
+<h2>Method Summary</h2>
+<div class="member-summary" id="method-summary-table">
+<div class="table-tabs" role="tablist" aria-orientation="horizontal"><button role="tab" aria-selected="true" aria-controls="method-summary-table.tabpanel" tabindex="0" onkeydown="switchTab(event)" id="t0" class="active-table-tab">All Methods</button><button role="tab" aria-selected="false" aria-controls="method-summary-table.tabpanel" tabindex="-1" onkeydown="switchTab(event)" id="t2" class="table-tab" onclick="show(2);">Instance Methods</button><button role="tab" aria-selected="false" aria-controls="method-summary-table.tabpanel" tabindex="-1" onkeydown="switchTab(event)" id="t4" class="table-tab" onclick="show(8);">Concrete Methods</button></div>
+<div id="method-summary-table.tabpanel" role="tabpanel">
+<table class="summary-table" aria-labelledby="t0">
+<thead>
+<tr>
+<th class="col-first" scope="col">Modifier and Type</th>
+<th class="col-second" scope="col">Method</th>
+<th class="col-last" scope="col">Description</th>
+</tr>
+</thead>
+<tbody>
+<tr class="alt-color" id="i0">
+<td class="col-first"><code><a href="FtpServer.FtpServerBuilder.html" title="class in sr2.flopbox">FtpServer.FtpServerBuilder</a></code></td>
+<th class="col-second" scope="row"><code><span class="member-name-link"><a href="#alias(java.lang.String)">alias</a></span>​(java.lang.String alias)</code></th>
+<td class="col-last"> </td>
+</tr>
+<tr class="row-color" id="i1">
+<td class="col-first"><code><a href="FtpServer.html" title="class in sr2.flopbox">FtpServer</a></code></td>
+<th class="col-second" scope="row"><code><span class="member-name-link"><a href="#build()">build</a></span>()</code></th>
+<td class="col-last">
+<div class="block">Building method</div>
+</td>
+</tr>
+<tr class="alt-color" id="i2">
+<td class="col-first"><code><a href="FtpServer.FtpServerBuilder.html" title="class in sr2.flopbox">FtpServer.FtpServerBuilder</a></code></td>
+<th class="col-second" scope="row"><code><span class="member-name-link"><a href="#host(java.lang.String)">host</a></span>​(java.lang.String host)</code></th>
+<td class="col-last"> </td>
+</tr>
+<tr class="row-color" id="i3">
+<td class="col-first"><code><a href="FtpServer.FtpServerBuilder.html" title="class in sr2.flopbox">FtpServer.FtpServerBuilder</a></code></td>
+<th class="col-second" scope="row"><code><span class="member-name-link"><a href="#id()">id</a></span>()</code></th>
+<td class="col-last"> </td>
+</tr>
+<tr class="alt-color" id="i4">
+<td class="col-first"><code><a href="FtpServer.FtpServerBuilder.html" title="class in sr2.flopbox">FtpServer.FtpServerBuilder</a></code></td>
+<th class="col-second" scope="row"><code><span class="member-name-link"><a href="#id(long)">id</a></span>​(long id)</code></th>
+<td class="col-last"> </td>
+</tr>
+<tr class="row-color" id="i5">
+<td class="col-first"><code><a href="FtpServer.FtpServerBuilder.html" title="class in sr2.flopbox">FtpServer.FtpServerBuilder</a></code></td>
+<th class="col-second" scope="row"><code><span class="member-name-link"><a href="#port(java.lang.String)">port</a></span>​(java.lang.String port)</code></th>
+<td class="col-last"> </td>
+</tr>
+</tbody>
+</table>
+</div>
+</div>
+<div class="inherited-list">
+<h3 id="methods.inherited.from.class.java.lang.Object">Methods inherited from class java.lang.Object</h3>
+<code>clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait</code></div>
+</section>
+</li>
+</ul>
+</section>
+<section class="details">
+<ul class="details-list">
+<!-- ========= CONSTRUCTOR DETAIL ======== -->
+<li>
+<section class="constructor-details" id="constructor.detail">
+<h2>Constructor Details</h2>
+<ul class="member-list">
+<li>
+<section class="detail" id="<init>()">
+<h3>FtpServerBuilder</h3>
+<div class="member-signature"><span class="modifiers">public</span> <span class="member-name">FtpServerBuilder</span>()</div>
+</section>
+</li>
+</ul>
+</section>
+</li>
+<!-- ============ METHOD DETAIL ========== -->
+<li>
+<section class="method-details" id="method.detail">
+<h2>Method Details</h2>
+<ul class="member-list">
+<li>
+<section class="detail" id="id()">
+<h3>id</h3>
+<div class="member-signature"><span class="modifiers">public</span> <span class="return-type"><a href="FtpServer.FtpServerBuilder.html" title="class in sr2.flopbox">FtpServer.FtpServerBuilder</a></span> <span class="member-name">id</span>()</div>
+<dl class="notes">
+<dt>Returns:</dt>
+<dd>a id incremented from 1 comparing to the last id given</dd>
+</dl>
+</section>
+</li>
+<li>
+<section class="detail" id="id(long)">
+<h3>id</h3>
+<div class="member-signature"><span class="modifiers">public</span> <span class="return-type"><a href="FtpServer.FtpServerBuilder.html" title="class in sr2.flopbox">FtpServer.FtpServerBuilder</a></span> <span class="member-name">id</span>​(<span class="parameters">long id)</span></div>
+<dl class="notes">
+<dt>Parameters:</dt>
+<dd><code>id</code> - The id of the server</dd>
+<dt>Returns:</dt>
+<dd>the id of the server</dd>
+</dl>
+</section>
+</li>
+<li>
+<section class="detail" id="host(java.lang.String)">
+<h3>host</h3>
+<div class="member-signature"><span class="modifiers">public</span> <span class="return-type"><a href="FtpServer.FtpServerBuilder.html" title="class in sr2.flopbox">FtpServer.FtpServerBuilder</a></span> <span class="member-name">host</span>​(<span class="parameters">java.lang.String host)</span></div>
+<dl class="notes">
+<dt>Parameters:</dt>
+<dd><code>host</code> - The host of the server</dd>
+<dt>Returns:</dt>
+<dd>the host of the server</dd>
+</dl>
+</section>
+</li>
+<li>
+<section class="detail" id="port(java.lang.String)">
+<h3>port</h3>
+<div class="member-signature"><span class="modifiers">public</span> <span class="return-type"><a href="FtpServer.FtpServerBuilder.html" title="class in sr2.flopbox">FtpServer.FtpServerBuilder</a></span> <span class="member-name">port</span>​(<span class="parameters">java.lang.String port)</span></div>
+<dl class="notes">
+<dt>Parameters:</dt>
+<dd><code>port</code> - The port of the server</dd>
+<dt>Returns:</dt>
+<dd>the port of the server</dd>
+</dl>
+</section>
+</li>
+<li>
+<section class="detail" id="alias(java.lang.String)">
+<h3>alias</h3>
+<div class="member-signature"><span class="modifiers">public</span> <span class="return-type"><a href="FtpServer.FtpServerBuilder.html" title="class in sr2.flopbox">FtpServer.FtpServerBuilder</a></span> <span class="member-name">alias</span>​(<span class="parameters">java.lang.String alias)</span></div>
+<dl class="notes">
+<dt>Parameters:</dt>
+<dd><code>alias</code> - The alias of the server</dd>
+<dt>Returns:</dt>
+<dd>the alias of the server</dd>
+</dl>
+</section>
+</li>
+<li>
+<section class="detail" id="build()">
+<h3>build</h3>
+<div class="member-signature"><span class="modifiers">public</span> <span class="return-type"><a href="FtpServer.html" title="class in sr2.flopbox">FtpServer</a></span> <span class="member-name">build</span>()</div>
+<div class="block">Building method</div>
+<dl class="notes">
+<dt>Returns:</dt>
+<dd>a FTPServer</dd>
+</dl>
+</section>
+</li>
+</ul>
+</section>
+</li>
+</ul>
+</section>
+<!-- ========= END OF CLASS DATA ========= -->
+</main>
+<footer role="contentinfo">
+<nav role="navigation">
+<!-- ======= START OF BOTTOM NAVBAR ====== -->
+<div class="bottom-nav" id="navbar.bottom">
+<div class="skip-nav"><a href="#skip.navbar.bottom" title="Skip navigation links">Skip navigation links</a></div>
+<ul id="navbar.bottom.firstrow" class="nav-list" title="Navigation">
+<li><a href="package-summary.html">Package</a></li>
+<li class="nav-bar-cell1-rev">Class</li>
+<li><a href="package-tree.html">Tree</a></li>
+<li><a href="../../deprecated-list.html">Deprecated</a></li>
+<li><a href="../../index-files/index-1.html">Index</a></li>
+<li><a href="../../help-doc.html">Help</a></li>
+</ul>
+</div>
+<div class="sub-nav">
+<div>
+<ul class="sub-nav-list">
+<li>Summary: </li>
+<li>Nested | </li>
+<li>Field | </li>
+<li><a href="#constructor.summary">Constr</a> | </li>
+<li><a href="#method.summary">Method</a></li>
+</ul>
+<ul class="sub-nav-list">
+<li>Detail: </li>
+<li>Field | </li>
+<li><a href="#constructor.detail">Constr</a> | </li>
+<li><a href="#method.detail">Method</a></li>
+</ul>
+</div>
+</div>
+<!-- ======== END OF BOTTOM NAVBAR ======= -->
+<span class="skip-nav" id="skip.navbar.bottom">
+<!-- -->
+</span></nav>
+</footer>
+</div>
+</div>
+</body>
+</html>
diff --git a/doc/sr2/flopbox/FtpServer.html b/doc/sr2/flopbox/FtpServer.html
new file mode 100644
index 0000000000000000000000000000000000000000..dc4a2a661088413a6f768ab535d750ad6dfc93e0
--- /dev/null
+++ b/doc/sr2/flopbox/FtpServer.html
@@ -0,0 +1,418 @@
+<!DOCTYPE HTML>
+<!-- NewPage -->
+<html lang="en">
+<head>
+<!-- Generated by javadoc (15) on Thu Apr 01 01:09:08 CEST 2021 -->
+<title>FtpServer</title>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+<meta name="dc.created" content="2021-04-01">
+<meta name="description" content="declaration: package: sr2.flopbox, class: FtpServer">
+<meta name="generator" content="javadoc/ClassWriterImpl">
+<link rel="stylesheet" type="text/css" href="../../stylesheet.css" title="Style">
+<link rel="stylesheet" type="text/css" href="../../script-dir/jquery-ui.min.css" title="Style">
+<link rel="stylesheet" type="text/css" href="../../jquery-ui.overrides.css" title="Style">
+<script type="text/javascript" src="../../script.js"></script>
+<script type="text/javascript" src="../../script-dir/jquery-3.5.1.min.js"></script>
+<script type="text/javascript" src="../../script-dir/jquery-ui.min.js"></script>
+</head>
+<body class="class-declaration-page">
+<script type="text/javascript">var data = {"i0":10,"i1":10,"i2":10,"i3":10,"i4":10,"i5":10,"i6":10,"i7":10,"i8":10};
+var tabs = {65535:["t0","All Methods"],2:["t2","Instance Methods"],8:["t4","Concrete Methods"]};
+var altColor = "alt-color";
+var rowColor = "row-color";
+var tableTab = "table-tab";
+var activeTableTab = "active-table-tab";
+var pathtoroot = "../../";
+loadScripts(document, 'script');</script>
+<noscript>
+<div>JavaScript is disabled on your browser.</div>
+</noscript>
+<div class="flex-box">
+<header role="banner" class="flex-header">
+<nav role="navigation">
+<!-- ========= START OF TOP NAVBAR ======= -->
+<div class="top-nav" id="navbar.top">
+<div class="skip-nav"><a href="#skip.navbar.top" title="Skip navigation links">Skip navigation links</a></div>
+<ul id="navbar.top.firstrow" class="nav-list" title="Navigation">
+<li><a href="package-summary.html">Package</a></li>
+<li class="nav-bar-cell1-rev">Class</li>
+<li><a href="package-tree.html">Tree</a></li>
+<li><a href="../../deprecated-list.html">Deprecated</a></li>
+<li><a href="../../index-files/index-1.html">Index</a></li>
+<li><a href="../../help-doc.html">Help</a></li>
+</ul>
+</div>
+<div class="sub-nav">
+<div>
+<ul class="sub-nav-list">
+<li>Summary: </li>
+<li><a href="#nested.class.summary">Nested</a> | </li>
+<li>Field | </li>
+<li><a href="#constructor.summary">Constr</a> | </li>
+<li><a href="#method.summary">Method</a></li>
+</ul>
+<ul class="sub-nav-list">
+<li>Detail: </li>
+<li>Field | </li>
+<li><a href="#constructor.detail">Constr</a> | </li>
+<li><a href="#method.detail">Method</a></li>
+</ul>
+</div>
+<div class="nav-list-search"><label for="search">SEARCH:</label>
+<input type="text" id="search" value="search" disabled="disabled">
+<input type="reset" id="reset" value="reset" disabled="disabled">
+</div>
+</div>
+<!-- ========= END OF TOP NAVBAR ========= -->
+<span class="skip-nav" id="skip.navbar.top">
+<!-- -->
+</span></nav>
+</header>
+<div class="flex-content">
+<main role="main">
+<!-- ======== START OF CLASS DATA ======== -->
+<div class="header">
+<div class="sub-title"><span class="package-label-in-type">Package</span> <a href="package-summary.html">sr2.flopbox</a></div>
+<h1 title="Class FtpServer" class="title">Class FtpServer</h1>
+</div>
+<div class="inheritance" title="Inheritance Tree">java.lang.Object
+<div class="inheritance">sr2.flopbox.FtpServer</div>
+</div>
+<section class="description">
+<hr>
+<pre>public class <span class="type-name-label">FtpServer</span>
+extends java.lang.Object</pre>
+</section>
+<section class="summary">
+<ul class="summary-list">
+<!-- ======== NESTED CLASS SUMMARY ======== -->
+<li>
+<section class="nested-class-summary" id="nested.class.summary">
+<h2>Nested Class Summary</h2>
+<div class="member-summary">
+<table class="summary-table">
+<caption><span>Nested Classes</span></caption>
+<thead>
+<tr>
+<th class="col-first" scope="col">Modifier and Type</th>
+<th class="col-second" scope="col">Class</th>
+<th class="col-last" scope="col">Description</th>
+</tr>
+</thead>
+<tbody>
+<tr class="alt-color">
+<td class="col-first"><code>static class </code></td>
+<th class="col-second" scope="row"><code><span class="member-name-link"><a href="FtpServer.FtpServerBuilder.html" title="class in sr2.flopbox">FtpServer.FtpServerBuilder</a></span></code></th>
+<td class="col-last">
+<div class="block">Constructor of a FTP client builder</div>
+</td>
+</tr>
+</tbody>
+</table>
+</div>
+</section>
+</li>
+<!-- ======== CONSTRUCTOR SUMMARY ======== -->
+<li>
+<section class="constructor-summary" id="constructor.summary">
+<h2>Constructor Summary</h2>
+<div class="member-summary">
+<table class="summary-table">
+<caption><span>Constructors</span></caption>
+<thead>
+<tr>
+<th class="col-first" scope="col">Constructor</th>
+<th class="col-last" scope="col">Description</th>
+</tr>
+</thead>
+<tbody>
+<tr class="alt-color">
+<th class="col-constructor-name" scope="row"><code><span class="member-name-link"><a href="#%3Cinit%3E()">FtpServer</a></span>()</code></th>
+<td class="col-last">
+<div class="block">Constructor from a builder for the class</div>
+</td>
+</tr>
+<tr class="row-color">
+<th class="col-constructor-name" scope="row"><code><span class="member-name-link"><a href="#%3Cinit%3E(long,java.lang.String,java.lang.String,java.lang.String)">FtpServer</a></span>​(long id,
+java.lang.String host,
+java.lang.String port,
+java.lang.String alias)</code></th>
+<td class="col-last">
+<div class="block">classic constructor for this class</div>
+</td>
+</tr>
+</tbody>
+</table>
+</div>
+</section>
+</li>
+<!-- ========== METHOD SUMMARY =========== -->
+<li>
+<section class="method-summary" id="method.summary">
+<h2>Method Summary</h2>
+<div class="member-summary" id="method-summary-table">
+<div class="table-tabs" role="tablist" aria-orientation="horizontal"><button role="tab" aria-selected="true" aria-controls="method-summary-table.tabpanel" tabindex="0" onkeydown="switchTab(event)" id="t0" class="active-table-tab">All Methods</button><button role="tab" aria-selected="false" aria-controls="method-summary-table.tabpanel" tabindex="-1" onkeydown="switchTab(event)" id="t2" class="table-tab" onclick="show(2);">Instance Methods</button><button role="tab" aria-selected="false" aria-controls="method-summary-table.tabpanel" tabindex="-1" onkeydown="switchTab(event)" id="t4" class="table-tab" onclick="show(8);">Concrete Methods</button></div>
+<div id="method-summary-table.tabpanel" role="tabpanel">
+<table class="summary-table" aria-labelledby="t0">
+<thead>
+<tr>
+<th class="col-first" scope="col">Modifier and Type</th>
+<th class="col-second" scope="col">Method</th>
+<th class="col-last" scope="col">Description</th>
+</tr>
+</thead>
+<tbody>
+<tr class="alt-color" id="i0">
+<td class="col-first"><code>void</code></td>
+<th class="col-second" scope="row"><code><span class="member-name-link"><a href="#addUser(int,java.lang.String,java.lang.String)">addUser</a></span>​(int token,
+java.lang.String user,
+java.lang.String pass)</code></th>
+<td class="col-last">
+<div class="block">Used to add a new user for this server</div>
+</td>
+</tr>
+<tr class="row-color" id="i1">
+<td class="col-first"><code>boolean</code></td>
+<th class="col-second" scope="row"><code><span class="member-name-link"><a href="#checkIfUserExist(int)">checkIfUserExist</a></span>​(int token)</code></th>
+<td class="col-last">
+<div class="block">check if an user exist for the server from his token</div>
+</td>
+</tr>
+<tr class="alt-color" id="i2">
+<td class="col-first"><code>java.lang.String</code></td>
+<th class="col-second" scope="row"><code><span class="member-name-link"><a href="#getAlias()">getAlias</a></span>()</code></th>
+<td class="col-last"> </td>
+</tr>
+<tr class="row-color" id="i3">
+<td class="col-first"><code>java.lang.String</code></td>
+<th class="col-second" scope="row"><code><span class="member-name-link"><a href="#getHost()">getHost</a></span>()</code></th>
+<td class="col-last"> </td>
+</tr>
+<tr class="alt-color" id="i4">
+<td class="col-first"><code>long</code></td>
+<th class="col-second" scope="row"><code><span class="member-name-link"><a href="#getId()">getId</a></span>()</code></th>
+<td class="col-last"> </td>
+</tr>
+<tr class="row-color" id="i5">
+<td class="col-first"><code>java.lang.String</code></td>
+<th class="col-second" scope="row"><code><span class="member-name-link"><a href="#getPort()">getPort</a></span>()</code></th>
+<td class="col-last"> </td>
+</tr>
+<tr class="alt-color" id="i6">
+<td class="col-first"><code>java.lang.String</code></td>
+<th class="col-second" scope="row"><code><span class="member-name-link"><a href="#getUserAndPass(int)">getUserAndPass</a></span>​(int token)</code></th>
+<td class="col-last">
+<div class="block">Getter for the user name and password of a client</div>
+</td>
+</tr>
+<tr class="row-color" id="i7">
+<td class="col-first"><code>void</code></td>
+<th class="col-second" scope="row"><code><span class="member-name-link"><a href="#setAlias(java.lang.String)">setAlias</a></span>​(java.lang.String newAlias)</code></th>
+<td class="col-last"> </td>
+</tr>
+<tr class="alt-color" id="i8">
+<td class="col-first"><code>java.lang.String</code></td>
+<th class="col-second" scope="row"><code><span class="member-name-link"><a href="#toString()">toString</a></span>()</code></th>
+<td class="col-last"> </td>
+</tr>
+</tbody>
+</table>
+</div>
+</div>
+<div class="inherited-list">
+<h3 id="methods.inherited.from.class.java.lang.Object">Methods inherited from class java.lang.Object</h3>
+<code>clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait</code></div>
+</section>
+</li>
+</ul>
+</section>
+<section class="details">
+<ul class="details-list">
+<!-- ========= CONSTRUCTOR DETAIL ======== -->
+<li>
+<section class="constructor-details" id="constructor.detail">
+<h2>Constructor Details</h2>
+<ul class="member-list">
+<li>
+<section class="detail" id="<init>()">
+<h3>FtpServer</h3>
+<div class="member-signature"><span class="modifiers">public</span> <span class="member-name">FtpServer</span>()</div>
+<div class="block">Constructor from a builder for the class</div>
+</section>
+</li>
+<li>
+<section class="detail" id="<init>(long,java.lang.String,java.lang.String,java.lang.String)">
+<h3>FtpServer</h3>
+<div class="member-signature"><span class="modifiers">public</span> <span class="member-name">FtpServer</span>​(<span class="parameters">long id,
+java.lang.String host,
+java.lang.String port,
+java.lang.String alias)</span></div>
+<div class="block">classic constructor for this class</div>
+<dl class="notes">
+<dt>Parameters:</dt>
+<dd><code>id</code> - the if of the FTP server</dd>
+<dd><code>host</code> - the host of the FTP server</dd>
+<dd><code>port</code> - the port of the ftp server</dd>
+<dd><code>alias</code> - the alias of the ftp server</dd>
+</dl>
+</section>
+</li>
+</ul>
+</section>
+</li>
+<!-- ============ METHOD DETAIL ========== -->
+<li>
+<section class="method-details" id="method.detail">
+<h2>Method Details</h2>
+<ul class="member-list">
+<li>
+<section class="detail" id="getId()">
+<h3>getId</h3>
+<div class="member-signature"><span class="modifiers">public</span> <span class="return-type">long</span> <span class="member-name">getId</span>()</div>
+<dl class="notes">
+<dt>Returns:</dt>
+<dd>the if of the server</dd>
+</dl>
+</section>
+</li>
+<li>
+<section class="detail" id="getHost()">
+<h3>getHost</h3>
+<div class="member-signature"><span class="modifiers">public</span> <span class="return-type">java.lang.String</span> <span class="member-name">getHost</span>()</div>
+<dl class="notes">
+<dt>Returns:</dt>
+<dd>the host of the server</dd>
+</dl>
+</section>
+</li>
+<li>
+<section class="detail" id="getPort()">
+<h3>getPort</h3>
+<div class="member-signature"><span class="modifiers">public</span> <span class="return-type">java.lang.String</span> <span class="member-name">getPort</span>()</div>
+<dl class="notes">
+<dt>Returns:</dt>
+<dd>the port of the server</dd>
+</dl>
+</section>
+</li>
+<li>
+<section class="detail" id="getAlias()">
+<h3>getAlias</h3>
+<div class="member-signature"><span class="modifiers">public</span> <span class="return-type">java.lang.String</span> <span class="member-name">getAlias</span>()</div>
+<dl class="notes">
+<dt>Returns:</dt>
+<dd>the alias of the server</dd>
+</dl>
+</section>
+</li>
+<li>
+<section class="detail" id="addUser(int,java.lang.String,java.lang.String)">
+<h3>addUser</h3>
+<div class="member-signature"><span class="modifiers">public</span> <span class="return-type">void</span> <span class="member-name">addUser</span>​(<span class="parameters">int token,
+java.lang.String user,
+java.lang.String pass)</span></div>
+<div class="block">Used to add a new user for this server</div>
+<dl class="notes">
+<dt>Parameters:</dt>
+<dd><code>token</code> - the user token</dd>
+<dd><code>user</code> - the user name</dd>
+<dd><code>pass</code> - the user password</dd>
+</dl>
+</section>
+</li>
+<li>
+<section class="detail" id="checkIfUserExist(int)">
+<h3>checkIfUserExist</h3>
+<div class="member-signature"><span class="modifiers">public</span> <span class="return-type">boolean</span> <span class="member-name">checkIfUserExist</span>​(<span class="parameters">int token)</span></div>
+<div class="block">check if an user exist for the server from his token</div>
+<dl class="notes">
+<dt>Parameters:</dt>
+<dd><code>token</code> - the token to check</dd>
+<dt>Returns:</dt>
+<dd>true if the token and so the user is know by this server
+ else false</dd>
+</dl>
+</section>
+</li>
+<li>
+<section class="detail" id="getUserAndPass(int)">
+<h3>getUserAndPass</h3>
+<div class="member-signature"><span class="modifiers">public</span> <span class="return-type">java.lang.String</span> <span class="member-name">getUserAndPass</span>​(<span class="parameters">int token)</span></div>
+<div class="block">Getter for the user name and password of a client</div>
+<dl class="notes">
+<dt>Parameters:</dt>
+<dd><code>token</code> - the client's token that allow to find the credentials of the client</dd>
+<dt>Returns:</dt>
+<dd>the user name and the password of the client user the form "user;password"</dd>
+</dl>
+</section>
+</li>
+<li>
+<section class="detail" id="toString()">
+<h3>toString</h3>
+<div class="member-signature"><span class="modifiers">public</span> <span class="return-type">java.lang.String</span> <span class="member-name">toString</span>()</div>
+<dl class="notes">
+<dt>Overrides:</dt>
+<dd><code>toString</code> in class <code>java.lang.Object</code></dd>
+<dt>Returns:</dt>
+<dd>a string that describe the server</dd>
+</dl>
+</section>
+</li>
+<li>
+<section class="detail" id="setAlias(java.lang.String)">
+<h3>setAlias</h3>
+<div class="member-signature"><span class="modifiers">public</span> <span class="return-type">void</span> <span class="member-name">setAlias</span>​(<span class="parameters">java.lang.String newAlias)</span></div>
+<dl class="notes">
+<dt>Parameters:</dt>
+<dd><code>newAlias</code> - The new alias of the server</dd>
+</dl>
+</section>
+</li>
+</ul>
+</section>
+</li>
+</ul>
+</section>
+<!-- ========= END OF CLASS DATA ========= -->
+</main>
+<footer role="contentinfo">
+<nav role="navigation">
+<!-- ======= START OF BOTTOM NAVBAR ====== -->
+<div class="bottom-nav" id="navbar.bottom">
+<div class="skip-nav"><a href="#skip.navbar.bottom" title="Skip navigation links">Skip navigation links</a></div>
+<ul id="navbar.bottom.firstrow" class="nav-list" title="Navigation">
+<li><a href="package-summary.html">Package</a></li>
+<li class="nav-bar-cell1-rev">Class</li>
+<li><a href="package-tree.html">Tree</a></li>
+<li><a href="../../deprecated-list.html">Deprecated</a></li>
+<li><a href="../../index-files/index-1.html">Index</a></li>
+<li><a href="../../help-doc.html">Help</a></li>
+</ul>
+</div>
+<div class="sub-nav">
+<div>
+<ul class="sub-nav-list">
+<li>Summary: </li>
+<li><a href="#nested.class.summary">Nested</a> | </li>
+<li>Field | </li>
+<li><a href="#constructor.summary">Constr</a> | </li>
+<li><a href="#method.summary">Method</a></li>
+</ul>
+<ul class="sub-nav-list">
+<li>Detail: </li>
+<li>Field | </li>
+<li><a href="#constructor.detail">Constr</a> | </li>
+<li><a href="#method.detail">Method</a></li>
+</ul>
+</div>
+</div>
+<!-- ======== END OF BOTTOM NAVBAR ======= -->
+<span class="skip-nav" id="skip.navbar.bottom">
+<!-- -->
+</span></nav>
+</footer>
+</div>
+</div>
+</body>
+</html>
diff --git a/doc/sr2/flopbox/FtpServerList.html b/doc/sr2/flopbox/FtpServerList.html
new file mode 100644
index 0000000000000000000000000000000000000000..fbaecd45fcc63b88d75dcdab2ba878d6461237c3
--- /dev/null
+++ b/doc/sr2/flopbox/FtpServerList.html
@@ -0,0 +1,220 @@
+<!DOCTYPE HTML>
+<!-- NewPage -->
+<html lang="en">
+<head>
+<!-- Generated by javadoc (15) on Thu Apr 01 01:09:08 CEST 2021 -->
+<title>FtpServerList</title>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+<meta name="dc.created" content="2021-04-01">
+<meta name="description" content="declaration: package: sr2.flopbox, class: FtpServerList">
+<meta name="generator" content="javadoc/ClassWriterImpl">
+<link rel="stylesheet" type="text/css" href="../../stylesheet.css" title="Style">
+<link rel="stylesheet" type="text/css" href="../../script-dir/jquery-ui.min.css" title="Style">
+<link rel="stylesheet" type="text/css" href="../../jquery-ui.overrides.css" title="Style">
+<script type="text/javascript" src="../../script.js"></script>
+<script type="text/javascript" src="../../script-dir/jquery-3.5.1.min.js"></script>
+<script type="text/javascript" src="../../script-dir/jquery-ui.min.js"></script>
+</head>
+<body class="class-declaration-page">
+<script type="text/javascript">var data = {"i0":9};
+var tabs = {65535:["t0","All Methods"],1:["t1","Static Methods"],8:["t4","Concrete Methods"]};
+var altColor = "alt-color";
+var rowColor = "row-color";
+var tableTab = "table-tab";
+var activeTableTab = "active-table-tab";
+var pathtoroot = "../../";
+loadScripts(document, 'script');</script>
+<noscript>
+<div>JavaScript is disabled on your browser.</div>
+</noscript>
+<div class="flex-box">
+<header role="banner" class="flex-header">
+<nav role="navigation">
+<!-- ========= START OF TOP NAVBAR ======= -->
+<div class="top-nav" id="navbar.top">
+<div class="skip-nav"><a href="#skip.navbar.top" title="Skip navigation links">Skip navigation links</a></div>
+<ul id="navbar.top.firstrow" class="nav-list" title="Navigation">
+<li><a href="package-summary.html">Package</a></li>
+<li class="nav-bar-cell1-rev">Class</li>
+<li><a href="package-tree.html">Tree</a></li>
+<li><a href="../../deprecated-list.html">Deprecated</a></li>
+<li><a href="../../index-files/index-1.html">Index</a></li>
+<li><a href="../../help-doc.html">Help</a></li>
+</ul>
+</div>
+<div class="sub-nav">
+<div>
+<ul class="sub-nav-list">
+<li>Summary: </li>
+<li>Nested | </li>
+<li>Field | </li>
+<li><a href="#constructor.summary">Constr</a> | </li>
+<li><a href="#method.summary">Method</a></li>
+</ul>
+<ul class="sub-nav-list">
+<li>Detail: </li>
+<li>Field | </li>
+<li><a href="#constructor.detail">Constr</a> | </li>
+<li><a href="#method.detail">Method</a></li>
+</ul>
+</div>
+<div class="nav-list-search"><label for="search">SEARCH:</label>
+<input type="text" id="search" value="search" disabled="disabled">
+<input type="reset" id="reset" value="reset" disabled="disabled">
+</div>
+</div>
+<!-- ========= END OF TOP NAVBAR ========= -->
+<span class="skip-nav" id="skip.navbar.top">
+<!-- -->
+</span></nav>
+</header>
+<div class="flex-content">
+<main role="main">
+<!-- ======== START OF CLASS DATA ======== -->
+<div class="header">
+<div class="sub-title"><span class="package-label-in-type">Package</span> <a href="package-summary.html">sr2.flopbox</a></div>
+<h1 title="Class FtpServerList" class="title">Class FtpServerList</h1>
+</div>
+<div class="inheritance" title="Inheritance Tree">java.lang.Object
+<div class="inheritance">sr2.flopbox.FtpServerList</div>
+</div>
+<section class="description">
+<hr>
+<pre>public class <span class="type-name-label">FtpServerList</span>
+extends java.lang.Object</pre>
+</section>
+<section class="summary">
+<ul class="summary-list">
+<!-- ======== CONSTRUCTOR SUMMARY ======== -->
+<li>
+<section class="constructor-summary" id="constructor.summary">
+<h2>Constructor Summary</h2>
+<div class="member-summary">
+<table class="summary-table">
+<caption><span>Constructors</span></caption>
+<thead>
+<tr>
+<th class="col-first" scope="col">Constructor</th>
+<th class="col-last" scope="col">Description</th>
+</tr>
+</thead>
+<tbody>
+<tr class="alt-color">
+<th class="col-constructor-name" scope="row"><code><span class="member-name-link"><a href="#%3Cinit%3E()">FtpServerList</a></span>()</code></th>
+<td class="col-last"> </td>
+</tr>
+</tbody>
+</table>
+</div>
+</section>
+</li>
+<!-- ========== METHOD SUMMARY =========== -->
+<li>
+<section class="method-summary" id="method.summary">
+<h2>Method Summary</h2>
+<div class="member-summary" id="method-summary-table">
+<div class="table-tabs" role="tablist" aria-orientation="horizontal"><button role="tab" aria-selected="true" aria-controls="method-summary-table.tabpanel" tabindex="0" onkeydown="switchTab(event)" id="t0" class="active-table-tab">All Methods</button><button role="tab" aria-selected="false" aria-controls="method-summary-table.tabpanel" tabindex="-1" onkeydown="switchTab(event)" id="t1" class="table-tab" onclick="show(1);">Static Methods</button><button role="tab" aria-selected="false" aria-controls="method-summary-table.tabpanel" tabindex="-1" onkeydown="switchTab(event)" id="t4" class="table-tab" onclick="show(8);">Concrete Methods</button></div>
+<div id="method-summary-table.tabpanel" role="tabpanel">
+<table class="summary-table" aria-labelledby="t0">
+<thead>
+<tr>
+<th class="col-first" scope="col">Modifier and Type</th>
+<th class="col-second" scope="col">Method</th>
+<th class="col-last" scope="col">Description</th>
+</tr>
+</thead>
+<tbody>
+<tr class="alt-color" id="i0">
+<td class="col-first"><code>static java.util.concurrent.CopyOnWriteArrayList<<a href="FtpServer.html" title="class in sr2.flopbox">FtpServer</a>></code></td>
+<th class="col-second" scope="row"><code><span class="member-name-link"><a href="#getInstance()">getInstance</a></span>()</code></th>
+<td class="col-last"> </td>
+</tr>
+</tbody>
+</table>
+</div>
+</div>
+<div class="inherited-list">
+<h3 id="methods.inherited.from.class.java.lang.Object">Methods inherited from class java.lang.Object</h3>
+<code>clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait</code></div>
+</section>
+</li>
+</ul>
+</section>
+<section class="details">
+<ul class="details-list">
+<!-- ========= CONSTRUCTOR DETAIL ======== -->
+<li>
+<section class="constructor-details" id="constructor.detail">
+<h2>Constructor Details</h2>
+<ul class="member-list">
+<li>
+<section class="detail" id="<init>()">
+<h3>FtpServerList</h3>
+<div class="member-signature"><span class="modifiers">public</span> <span class="member-name">FtpServerList</span>()</div>
+</section>
+</li>
+</ul>
+</section>
+</li>
+<!-- ============ METHOD DETAIL ========== -->
+<li>
+<section class="method-details" id="method.detail">
+<h2>Method Details</h2>
+<ul class="member-list">
+<li>
+<section class="detail" id="getInstance()">
+<h3>getInstance</h3>
+<div class="member-signature"><span class="modifiers">public static</span> <span class="return-type">java.util.concurrent.CopyOnWriteArrayList<<a href="FtpServer.html" title="class in sr2.flopbox">FtpServer</a>></span> <span class="member-name">getInstance</span>()</div>
+<dl class="notes">
+<dt>Returns:</dt>
+<dd>an instance of the servers list</dd>
+</dl>
+</section>
+</li>
+</ul>
+</section>
+</li>
+</ul>
+</section>
+<!-- ========= END OF CLASS DATA ========= -->
+</main>
+<footer role="contentinfo">
+<nav role="navigation">
+<!-- ======= START OF BOTTOM NAVBAR ====== -->
+<div class="bottom-nav" id="navbar.bottom">
+<div class="skip-nav"><a href="#skip.navbar.bottom" title="Skip navigation links">Skip navigation links</a></div>
+<ul id="navbar.bottom.firstrow" class="nav-list" title="Navigation">
+<li><a href="package-summary.html">Package</a></li>
+<li class="nav-bar-cell1-rev">Class</li>
+<li><a href="package-tree.html">Tree</a></li>
+<li><a href="../../deprecated-list.html">Deprecated</a></li>
+<li><a href="../../index-files/index-1.html">Index</a></li>
+<li><a href="../../help-doc.html">Help</a></li>
+</ul>
+</div>
+<div class="sub-nav">
+<div>
+<ul class="sub-nav-list">
+<li>Summary: </li>
+<li>Nested | </li>
+<li>Field | </li>
+<li><a href="#constructor.summary">Constr</a> | </li>
+<li><a href="#method.summary">Method</a></li>
+</ul>
+<ul class="sub-nav-list">
+<li>Detail: </li>
+<li>Field | </li>
+<li><a href="#constructor.detail">Constr</a> | </li>
+<li><a href="#method.detail">Method</a></li>
+</ul>
+</div>
+</div>
+<!-- ======== END OF BOTTOM NAVBAR ======= -->
+<span class="skip-nav" id="skip.navbar.bottom">
+<!-- -->
+</span></nav>
+</footer>
+</div>
+</div>
+</body>
+</html>
diff --git a/doc/sr2/flopbox/FtpServerService.html b/doc/sr2/flopbox/FtpServerService.html
new file mode 100644
index 0000000000000000000000000000000000000000..ae59844e410cad8b16ed476ad5605b6ed64413f0
--- /dev/null
+++ b/doc/sr2/flopbox/FtpServerService.html
@@ -0,0 +1,389 @@
+<!DOCTYPE HTML>
+<!-- NewPage -->
+<html lang="en">
+<head>
+<!-- Generated by javadoc (15) on Thu Apr 01 01:09:08 CEST 2021 -->
+<title>FtpServerService</title>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+<meta name="dc.created" content="2021-04-01">
+<meta name="description" content="declaration: package: sr2.flopbox, class: FtpServerService">
+<meta name="generator" content="javadoc/ClassWriterImpl">
+<link rel="stylesheet" type="text/css" href="../../stylesheet.css" title="Style">
+<link rel="stylesheet" type="text/css" href="../../script-dir/jquery-ui.min.css" title="Style">
+<link rel="stylesheet" type="text/css" href="../../jquery-ui.overrides.css" title="Style">
+<script type="text/javascript" src="../../script.js"></script>
+<script type="text/javascript" src="../../script-dir/jquery-3.5.1.min.js"></script>
+<script type="text/javascript" src="../../script-dir/jquery-ui.min.js"></script>
+</head>
+<body class="class-declaration-page">
+<script type="text/javascript">var data = {"i0":10,"i1":10,"i2":10,"i3":10,"i4":10,"i5":10};
+var tabs = {65535:["t0","All Methods"],2:["t2","Instance Methods"],8:["t4","Concrete Methods"]};
+var altColor = "alt-color";
+var rowColor = "row-color";
+var tableTab = "table-tab";
+var activeTableTab = "active-table-tab";
+var pathtoroot = "../../";
+loadScripts(document, 'script');</script>
+<noscript>
+<div>JavaScript is disabled on your browser.</div>
+</noscript>
+<div class="flex-box">
+<header role="banner" class="flex-header">
+<nav role="navigation">
+<!-- ========= START OF TOP NAVBAR ======= -->
+<div class="top-nav" id="navbar.top">
+<div class="skip-nav"><a href="#skip.navbar.top" title="Skip navigation links">Skip navigation links</a></div>
+<ul id="navbar.top.firstrow" class="nav-list" title="Navigation">
+<li><a href="package-summary.html">Package</a></li>
+<li class="nav-bar-cell1-rev">Class</li>
+<li><a href="package-tree.html">Tree</a></li>
+<li><a href="../../deprecated-list.html">Deprecated</a></li>
+<li><a href="../../index-files/index-1.html">Index</a></li>
+<li><a href="../../help-doc.html">Help</a></li>
+</ul>
+</div>
+<div class="sub-nav">
+<div>
+<ul class="sub-nav-list">
+<li>Summary: </li>
+<li>Nested | </li>
+<li>Field | </li>
+<li><a href="#constructor.summary">Constr</a> | </li>
+<li><a href="#method.summary">Method</a></li>
+</ul>
+<ul class="sub-nav-list">
+<li>Detail: </li>
+<li>Field | </li>
+<li><a href="#constructor.detail">Constr</a> | </li>
+<li><a href="#method.detail">Method</a></li>
+</ul>
+</div>
+<div class="nav-list-search"><label for="search">SEARCH:</label>
+<input type="text" id="search" value="search" disabled="disabled">
+<input type="reset" id="reset" value="reset" disabled="disabled">
+</div>
+</div>
+<!-- ========= END OF TOP NAVBAR ========= -->
+<span class="skip-nav" id="skip.navbar.top">
+<!-- -->
+</span></nav>
+</header>
+<div class="flex-content">
+<main role="main">
+<!-- ======== START OF CLASS DATA ======== -->
+<div class="header">
+<div class="sub-title"><span class="package-label-in-type">Package</span> <a href="package-summary.html">sr2.flopbox</a></div>
+<h1 title="Class FtpServerService" class="title">Class FtpServerService</h1>
+</div>
+<div class="inheritance" title="Inheritance Tree">java.lang.Object
+<div class="inheritance">sr2.flopbox.FtpServerService</div>
+</div>
+<section class="description">
+<hr>
+<pre>@Path("/servers")
+public class <span class="type-name-label">FtpServerService</span>
+extends java.lang.Object</pre>
+</section>
+<section class="summary">
+<ul class="summary-list">
+<!-- ======== CONSTRUCTOR SUMMARY ======== -->
+<li>
+<section class="constructor-summary" id="constructor.summary">
+<h2>Constructor Summary</h2>
+<div class="member-summary">
+<table class="summary-table">
+<caption><span>Constructors</span></caption>
+<thead>
+<tr>
+<th class="col-first" scope="col">Constructor</th>
+<th class="col-last" scope="col">Description</th>
+</tr>
+</thead>
+<tbody>
+<tr class="alt-color">
+<th class="col-constructor-name" scope="row"><code><span class="member-name-link"><a href="#%3Cinit%3E()">FtpServerService</a></span>()</code></th>
+<td class="col-last"> </td>
+</tr>
+</tbody>
+</table>
+</div>
+</section>
+</li>
+<!-- ========== METHOD SUMMARY =========== -->
+<li>
+<section class="method-summary" id="method.summary">
+<h2>Method Summary</h2>
+<div class="member-summary" id="method-summary-table">
+<div class="table-tabs" role="tablist" aria-orientation="horizontal"><button role="tab" aria-selected="true" aria-controls="method-summary-table.tabpanel" tabindex="0" onkeydown="switchTab(event)" id="t0" class="active-table-tab">All Methods</button><button role="tab" aria-selected="false" aria-controls="method-summary-table.tabpanel" tabindex="-1" onkeydown="switchTab(event)" id="t2" class="table-tab" onclick="show(2);">Instance Methods</button><button role="tab" aria-selected="false" aria-controls="method-summary-table.tabpanel" tabindex="-1" onkeydown="switchTab(event)" id="t4" class="table-tab" onclick="show(8);">Concrete Methods</button></div>
+<div id="method-summary-table.tabpanel" role="tabpanel">
+<table class="summary-table" aria-labelledby="t0">
+<thead>
+<tr>
+<th class="col-first" scope="col">Modifier and Type</th>
+<th class="col-second" scope="col">Method</th>
+<th class="col-last" scope="col">Description</th>
+</tr>
+</thead>
+<tbody>
+<tr class="alt-color" id="i0">
+<td class="col-first"><code>java.lang.String</code></td>
+<th class="col-second" scope="row"><code><span class="member-name-link"><a href="#addServer(java.lang.String,java.lang.String,java.lang.String)">addServer</a></span>​(java.lang.String host,
+java.lang.String port,
+java.lang.String alias)</code></th>
+<td class="col-last">
+<div class="block">Method used to add a server to the API</div>
+</td>
+</tr>
+<tr class="row-color" id="i1">
+<td class="col-first"><code>java.lang.String</code></td>
+<th class="col-second" scope="row"><code><span class="member-name-link"><a href="#changeAlias(java.lang.String,java.lang.String,java.lang.String)">changeAlias</a></span>​(java.lang.String token,
+java.lang.String alias,
+java.lang.String newAlias)</code></th>
+<td class="col-last">
+<div class="block">Method to change a alias of a FTP server</div>
+</td>
+</tr>
+<tr class="alt-color" id="i2">
+<td class="col-first"><code>java.lang.String</code></td>
+<th class="col-second" scope="row"><code><span class="member-name-link"><a href="#getAllFTPServers()">getAllFTPServers</a></span>()</code></th>
+<td class="col-last">
+<div class="block">method that return all the FTP server know by the API</div>
+</td>
+</tr>
+<tr class="row-color" id="i3">
+<td class="col-first"><code>java.lang.String</code></td>
+<th class="col-second" scope="row"><code><span class="member-name-link"><a href="#getServer(java.lang.String)">getServer</a></span>​(java.lang.String alias)</code></th>
+<td class="col-last">
+<div class="block">Method that gives information about one FTP server</div>
+</td>
+</tr>
+<tr class="alt-color" id="i4">
+<td class="col-first"><code>java.lang.String</code></td>
+<th class="col-second" scope="row"><code><span class="member-name-link"><a href="#listRoot(java.lang.String,java.lang.String)">listRoot</a></span>​(java.lang.String token,
+java.lang.String alias)</code></th>
+<td class="col-last">
+<div class="block">Method to get the content of the root repertory of a server</div>
+</td>
+</tr>
+<tr class="row-color" id="i5">
+<td class="col-first"><code>java.lang.String</code></td>
+<th class="col-second" scope="row"><code><span class="member-name-link"><a href="#login(java.lang.String,java.lang.String,java.lang.String)">login</a></span>​(java.lang.String user,
+java.lang.String pass,
+java.lang.String alias)</code></th>
+<td class="col-last">
+<div class="block">Method the register a username and a password for the server 'alias'
+ The credentials will be only save for this server</div>
+</td>
+</tr>
+</tbody>
+</table>
+</div>
+</div>
+<div class="inherited-list">
+<h3 id="methods.inherited.from.class.java.lang.Object">Methods inherited from class java.lang.Object</h3>
+<code>clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait</code></div>
+</section>
+</li>
+</ul>
+</section>
+<section class="details">
+<ul class="details-list">
+<!-- ========= CONSTRUCTOR DETAIL ======== -->
+<li>
+<section class="constructor-details" id="constructor.detail">
+<h2>Constructor Details</h2>
+<ul class="member-list">
+<li>
+<section class="detail" id="<init>()">
+<h3>FtpServerService</h3>
+<div class="member-signature"><span class="modifiers">public</span> <span class="member-name">FtpServerService</span>()</div>
+</section>
+</li>
+</ul>
+</section>
+</li>
+<!-- ============ METHOD DETAIL ========== -->
+<li>
+<section class="method-details" id="method.detail">
+<h2>Method Details</h2>
+<ul class="member-list">
+<li>
+<section class="detail" id="addServer(java.lang.String,java.lang.String,java.lang.String)">
+<h3>addServer</h3>
+<div class="member-signature"><span class="annotations">@POST
+@Produces("text/plain")
+@Consumes("application/x-www-form-urlencoded")
+</span><span class="modifiers">public</span> <span class="return-type">java.lang.String</span> <span class="member-name">addServer</span>​(<span class="parameters">@NotNull @QueryParam("host")
+java.lang.String host,
+@NotNull @QueryParam("port")
+java.lang.String port,
+@NotNull @QueryParam("alias")
+java.lang.String alias)</span></div>
+<div class="block">Method used to add a server to the API</div>
+<dl class="notes">
+<dt>Parameters:</dt>
+<dd><code>host</code> - The hst name of the new server</dd>
+<dd><code>port</code> - the port of the new server</dd>
+<dd><code>alias</code> - the alias of the new server</dd>
+<dt>Returns:</dt>
+<dd>A string about the success of the adding</dd>
+</dl>
+</section>
+</li>
+<li>
+<section class="detail" id="getAllFTPServers()">
+<h3>getAllFTPServers</h3>
+<div class="member-signature"><span class="annotations">@GET
+@Produces("text/plain")
+</span><span class="modifiers">public</span> <span class="return-type">java.lang.String</span> <span class="member-name">getAllFTPServers</span>()</div>
+<div class="block">method that return all the FTP server know by the API</div>
+<dl class="notes">
+<dt>Returns:</dt>
+<dd>A string about each servers</dd>
+</dl>
+</section>
+</li>
+<li>
+<section class="detail" id="getServer(java.lang.String)">
+<h3>getServer</h3>
+<div class="member-signature"><span class="annotations">@GET
+@Path("{alias}/info")
+@Produces("text/plain")
+</span><span class="modifiers">public</span> <span class="return-type">java.lang.String</span> <span class="member-name">getServer</span>​(<span class="parameters">@PathParam("alias")
+java.lang.String alias)</span></div>
+<div class="block">Method that gives information about one FTP server</div>
+<dl class="notes">
+<dt>Parameters:</dt>
+<dd><code>alias</code> - the alias of the server</dd>
+<dt>Returns:</dt>
+<dd>information about the FTP server</dd>
+</dl>
+</section>
+</li>
+<li>
+<section class="detail" id="login(java.lang.String,java.lang.String,java.lang.String)">
+<h3>login</h3>
+<div class="member-signature"><span class="annotations">@GET
+@Path("{alias}/login")
+@Produces("text/plain")
+</span><span class="modifiers">public</span> <span class="return-type">java.lang.String</span> <span class="member-name">login</span>​(<span class="parameters">@QueryParam("user")
+java.lang.String user,
+@QueryParam("pass")
+java.lang.String pass,
+@PathParam("alias")
+java.lang.String alias)</span>
+ throws <span class="exceptions"><a href="NoServerFoundException.html" title="class in sr2.flopbox">NoServerFoundException</a></span></div>
+<div class="block">Method the register a username and a password for the server 'alias'
+ The credentials will be only save for this server</div>
+<dl class="notes">
+<dt>Parameters:</dt>
+<dd><code>user</code> - the username of the client</dd>
+<dd><code>pass</code> - the password of the client</dd>
+<dd><code>alias</code> - the alias of the FTP server</dd>
+<dt>Returns:</dt>
+<dd>a token that the client will have to send in each request in the header</dd>
+<dt>Throws:</dt>
+<dd><code><a href="NoServerFoundException.html" title="class in sr2.flopbox">NoServerFoundException</a></code> - if the alias doesnt refer to a known server</dd>
+</dl>
+</section>
+</li>
+<li>
+<section class="detail" id="listRoot(java.lang.String,java.lang.String)">
+<h3>listRoot</h3>
+<div class="member-signature"><span class="annotations">@GET
+@Path("{alias}")
+@Produces("text/plain")
+</span><span class="modifiers">public</span> <span class="return-type">java.lang.String</span> <span class="member-name">listRoot</span>​(<span class="parameters">@HeaderParam("token")
+java.lang.String token,
+@PathParam("alias")
+java.lang.String alias)</span>
+ throws <span class="exceptions"><a href="NoServerFoundException.html" title="class in sr2.flopbox">NoServerFoundException</a>,
+java.io.IOException,
+<a href="cantConnectToServerException.html" title="class in sr2.flopbox">cantConnectToServerException</a></span></div>
+<div class="block">Method to get the content of the root repertory of a server</div>
+<dl class="notes">
+<dt>Parameters:</dt>
+<dd><code>token</code> - the client connexion token</dd>
+<dd><code>alias</code> - the FTP server alias</dd>
+<dt>Returns:</dt>
+<dd>The content of the root of the repertory</dd>
+<dt>Throws:</dt>
+<dd><code><a href="NoServerFoundException.html" title="class in sr2.flopbox">NoServerFoundException</a></code> - if the alias doesnt refer to a known server</dd>
+<dd><code>java.io.IOException</code> - If a FTP command fails in the execution</dd>
+<dd><code><a href="cantConnectToServerException.html" title="class in sr2.flopbox">cantConnectToServerException</a></code> - if they are a problem of connection with the server</dd>
+</dl>
+</section>
+</li>
+<li>
+<section class="detail" id="changeAlias(java.lang.String,java.lang.String,java.lang.String)">
+<h3>changeAlias</h3>
+<div class="member-signature"><span class="annotations">@PUT
+@Path("{alias}/change")
+@Produces("text/plain")
+</span><span class="modifiers">public</span> <span class="return-type">java.lang.String</span> <span class="member-name">changeAlias</span>​(<span class="parameters">@HeaderParam("token")
+java.lang.String token,
+@PathParam("alias")
+java.lang.String alias,
+@QueryParam("newAlias")
+java.lang.String newAlias)</span>
+ throws <span class="exceptions"><a href="NoServerFoundException.html" title="class in sr2.flopbox">NoServerFoundException</a></span></div>
+<div class="block">Method to change a alias of a FTP server</div>
+<dl class="notes">
+<dt>Parameters:</dt>
+<dd><code>token</code> - the client connexion token</dd>
+<dd><code>alias</code> - the alias of the server to change the alias</dd>
+<dd><code>newAlias</code> - the new alias</dd>
+<dt>Returns:</dt>
+<dd>a String about the success of the function</dd>
+<dt>Throws:</dt>
+<dd><code><a href="NoServerFoundException.html" title="class in sr2.flopbox">NoServerFoundException</a></code> - if the alias doesnt refer to a server known</dd>
+</dl>
+</section>
+</li>
+</ul>
+</section>
+</li>
+</ul>
+</section>
+<!-- ========= END OF CLASS DATA ========= -->
+</main>
+<footer role="contentinfo">
+<nav role="navigation">
+<!-- ======= START OF BOTTOM NAVBAR ====== -->
+<div class="bottom-nav" id="navbar.bottom">
+<div class="skip-nav"><a href="#skip.navbar.bottom" title="Skip navigation links">Skip navigation links</a></div>
+<ul id="navbar.bottom.firstrow" class="nav-list" title="Navigation">
+<li><a href="package-summary.html">Package</a></li>
+<li class="nav-bar-cell1-rev">Class</li>
+<li><a href="package-tree.html">Tree</a></li>
+<li><a href="../../deprecated-list.html">Deprecated</a></li>
+<li><a href="../../index-files/index-1.html">Index</a></li>
+<li><a href="../../help-doc.html">Help</a></li>
+</ul>
+</div>
+<div class="sub-nav">
+<div>
+<ul class="sub-nav-list">
+<li>Summary: </li>
+<li>Nested | </li>
+<li>Field | </li>
+<li><a href="#constructor.summary">Constr</a> | </li>
+<li><a href="#method.summary">Method</a></li>
+</ul>
+<ul class="sub-nav-list">
+<li>Detail: </li>
+<li>Field | </li>
+<li><a href="#constructor.detail">Constr</a> | </li>
+<li><a href="#method.detail">Method</a></li>
+</ul>
+</div>
+</div>
+<!-- ======== END OF BOTTOM NAVBAR ======= -->
+<span class="skip-nav" id="skip.navbar.bottom">
+<!-- -->
+</span></nav>
+</footer>
+</div>
+</div>
+</body>
+</html>
diff --git a/doc/sr2/flopbox/Main.html b/doc/sr2/flopbox/Main.html
new file mode 100644
index 0000000000000000000000000000000000000000..ddcad443037a66e69b1750d40eb0464b8203733f
--- /dev/null
+++ b/doc/sr2/flopbox/Main.html
@@ -0,0 +1,298 @@
+<!DOCTYPE HTML>
+<!-- NewPage -->
+<html lang="en">
+<head>
+<!-- Generated by javadoc (15) on Thu Apr 01 01:09:08 CEST 2021 -->
+<title>Main</title>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+<meta name="dc.created" content="2021-04-01">
+<meta name="description" content="declaration: package: sr2.flopbox, class: Main">
+<meta name="generator" content="javadoc/ClassWriterImpl">
+<link rel="stylesheet" type="text/css" href="../../stylesheet.css" title="Style">
+<link rel="stylesheet" type="text/css" href="../../script-dir/jquery-ui.min.css" title="Style">
+<link rel="stylesheet" type="text/css" href="../../jquery-ui.overrides.css" title="Style">
+<script type="text/javascript" src="../../script.js"></script>
+<script type="text/javascript" src="../../script-dir/jquery-3.5.1.min.js"></script>
+<script type="text/javascript" src="../../script-dir/jquery-ui.min.js"></script>
+</head>
+<body class="class-declaration-page">
+<script type="text/javascript">var data = {"i0":9,"i1":9};
+var tabs = {65535:["t0","All Methods"],1:["t1","Static Methods"],8:["t4","Concrete Methods"]};
+var altColor = "alt-color";
+var rowColor = "row-color";
+var tableTab = "table-tab";
+var activeTableTab = "active-table-tab";
+var pathtoroot = "../../";
+loadScripts(document, 'script');</script>
+<noscript>
+<div>JavaScript is disabled on your browser.</div>
+</noscript>
+<div class="flex-box">
+<header role="banner" class="flex-header">
+<nav role="navigation">
+<!-- ========= START OF TOP NAVBAR ======= -->
+<div class="top-nav" id="navbar.top">
+<div class="skip-nav"><a href="#skip.navbar.top" title="Skip navigation links">Skip navigation links</a></div>
+<ul id="navbar.top.firstrow" class="nav-list" title="Navigation">
+<li><a href="package-summary.html">Package</a></li>
+<li class="nav-bar-cell1-rev">Class</li>
+<li><a href="package-tree.html">Tree</a></li>
+<li><a href="../../deprecated-list.html">Deprecated</a></li>
+<li><a href="../../index-files/index-1.html">Index</a></li>
+<li><a href="../../help-doc.html">Help</a></li>
+</ul>
+</div>
+<div class="sub-nav">
+<div>
+<ul class="sub-nav-list">
+<li>Summary: </li>
+<li>Nested | </li>
+<li><a href="#field.summary">Field</a> | </li>
+<li><a href="#constructor.summary">Constr</a> | </li>
+<li><a href="#method.summary">Method</a></li>
+</ul>
+<ul class="sub-nav-list">
+<li>Detail: </li>
+<li><a href="#field.detail">Field</a> | </li>
+<li><a href="#constructor.detail">Constr</a> | </li>
+<li><a href="#method.detail">Method</a></li>
+</ul>
+</div>
+<div class="nav-list-search"><label for="search">SEARCH:</label>
+<input type="text" id="search" value="search" disabled="disabled">
+<input type="reset" id="reset" value="reset" disabled="disabled">
+</div>
+</div>
+<!-- ========= END OF TOP NAVBAR ========= -->
+<span class="skip-nav" id="skip.navbar.top">
+<!-- -->
+</span></nav>
+</header>
+<div class="flex-content">
+<main role="main">
+<!-- ======== START OF CLASS DATA ======== -->
+<div class="header">
+<div class="sub-title"><span class="package-label-in-type">Package</span> <a href="package-summary.html">sr2.flopbox</a></div>
+<h1 title="Class Main" class="title">Class Main</h1>
+</div>
+<div class="inheritance" title="Inheritance Tree">java.lang.Object
+<div class="inheritance">sr2.flopbox.Main</div>
+</div>
+<section class="description">
+<hr>
+<pre>public class <span class="type-name-label">Main</span>
+extends java.lang.Object</pre>
+</section>
+<section class="summary">
+<ul class="summary-list">
+<!-- =========== FIELD SUMMARY =========== -->
+<li>
+<section class="field-summary" id="field.summary">
+<h2>Field Summary</h2>
+<div class="member-summary">
+<table class="summary-table">
+<caption><span>Fields</span></caption>
+<thead>
+<tr>
+<th class="col-first" scope="col">Modifier and Type</th>
+<th class="col-second" scope="col">Field</th>
+<th class="col-last" scope="col">Description</th>
+</tr>
+</thead>
+<tbody>
+<tr class="alt-color">
+<td class="col-first"><code>static java.lang.String</code></td>
+<th class="col-second" scope="row"><code><span class="member-name-link"><a href="#BASE_URI">BASE_URI</a></span></code></th>
+<td class="col-last"> </td>
+</tr>
+<tr class="row-color">
+<td class="col-first"><code>static sr2.flopbox.FTPTool</code></td>
+<th class="col-second" scope="row"><code><span class="member-name-link"><a href="#FTPtool">FTPtool</a></span></code></th>
+<td class="col-last"> </td>
+</tr>
+</tbody>
+</table>
+</div>
+</section>
+</li>
+<!-- ======== CONSTRUCTOR SUMMARY ======== -->
+<li>
+<section class="constructor-summary" id="constructor.summary">
+<h2>Constructor Summary</h2>
+<div class="member-summary">
+<table class="summary-table">
+<caption><span>Constructors</span></caption>
+<thead>
+<tr>
+<th class="col-first" scope="col">Constructor</th>
+<th class="col-last" scope="col">Description</th>
+</tr>
+</thead>
+<tbody>
+<tr class="alt-color">
+<th class="col-constructor-name" scope="row"><code><span class="member-name-link"><a href="#%3Cinit%3E()">Main</a></span>()</code></th>
+<td class="col-last"> </td>
+</tr>
+</tbody>
+</table>
+</div>
+</section>
+</li>
+<!-- ========== METHOD SUMMARY =========== -->
+<li>
+<section class="method-summary" id="method.summary">
+<h2>Method Summary</h2>
+<div class="member-summary" id="method-summary-table">
+<div class="table-tabs" role="tablist" aria-orientation="horizontal"><button role="tab" aria-selected="true" aria-controls="method-summary-table.tabpanel" tabindex="0" onkeydown="switchTab(event)" id="t0" class="active-table-tab">All Methods</button><button role="tab" aria-selected="false" aria-controls="method-summary-table.tabpanel" tabindex="-1" onkeydown="switchTab(event)" id="t1" class="table-tab" onclick="show(1);">Static Methods</button><button role="tab" aria-selected="false" aria-controls="method-summary-table.tabpanel" tabindex="-1" onkeydown="switchTab(event)" id="t4" class="table-tab" onclick="show(8);">Concrete Methods</button></div>
+<div id="method-summary-table.tabpanel" role="tabpanel">
+<table class="summary-table" aria-labelledby="t0">
+<thead>
+<tr>
+<th class="col-first" scope="col">Modifier and Type</th>
+<th class="col-second" scope="col">Method</th>
+<th class="col-last" scope="col">Description</th>
+</tr>
+</thead>
+<tbody>
+<tr class="alt-color" id="i0">
+<td class="col-first"><code>static void</code></td>
+<th class="col-second" scope="row"><code><span class="member-name-link"><a href="#main(java.lang.String%5B%5D)">main</a></span>​(java.lang.String[] args)</code></th>
+<td class="col-last">
+<div class="block">Main method.</div>
+</td>
+</tr>
+<tr class="row-color" id="i1">
+<td class="col-first"><code>static org.glassfish.grizzly.http.server.HttpServer</code></td>
+<th class="col-second" scope="row"><code><span class="member-name-link"><a href="#startServer()">startServer</a></span>()</code></th>
+<td class="col-last">
+<div class="block">Starts Grizzly HTTP server exposing JAX-RS resources defined in this application.</div>
+</td>
+</tr>
+</tbody>
+</table>
+</div>
+</div>
+<div class="inherited-list">
+<h3 id="methods.inherited.from.class.java.lang.Object">Methods inherited from class java.lang.Object</h3>
+<code>clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait</code></div>
+</section>
+</li>
+</ul>
+</section>
+<section class="details">
+<ul class="details-list">
+<!-- ============ FIELD DETAIL =========== -->
+<li>
+<section class="field-details" id="field.detail">
+<h2>Field Details</h2>
+<ul class="member-list">
+<li>
+<section class="detail" id="BASE_URI">
+<h3>BASE_URI</h3>
+<div class="member-signature"><span class="modifiers">public static final</span> <span class="return-type">java.lang.String</span> <span class="member-name">BASE_URI</span></div>
+<dl class="notes">
+<dt>See Also:</dt>
+<dd><a href="../../constant-values.html#sr2.flopbox.Main.BASE_URI">Constant Field Values</a></dd>
+</dl>
+</section>
+</li>
+<li>
+<section class="detail" id="FTPtool">
+<h3>FTPtool</h3>
+<div class="member-signature"><span class="modifiers">public static final</span> <span class="return-type">sr2.flopbox.FTPTool</span> <span class="member-name">FTPtool</span></div>
+</section>
+</li>
+</ul>
+</section>
+</li>
+<!-- ========= CONSTRUCTOR DETAIL ======== -->
+<li>
+<section class="constructor-details" id="constructor.detail">
+<h2>Constructor Details</h2>
+<ul class="member-list">
+<li>
+<section class="detail" id="<init>()">
+<h3>Main</h3>
+<div class="member-signature"><span class="modifiers">public</span> <span class="member-name">Main</span>()</div>
+</section>
+</li>
+</ul>
+</section>
+</li>
+<!-- ============ METHOD DETAIL ========== -->
+<li>
+<section class="method-details" id="method.detail">
+<h2>Method Details</h2>
+<ul class="member-list">
+<li>
+<section class="detail" id="startServer()">
+<h3>startServer</h3>
+<div class="member-signature"><span class="modifiers">public static</span> <span class="return-type">org.glassfish.grizzly.http.server.HttpServer</span> <span class="member-name">startServer</span>()</div>
+<div class="block">Starts Grizzly HTTP server exposing JAX-RS resources defined in this application.</div>
+<dl class="notes">
+<dt>Returns:</dt>
+<dd>Grizzly HTTP server.</dd>
+</dl>
+</section>
+</li>
+<li>
+<section class="detail" id="main(java.lang.String[])">
+<h3>main</h3>
+<div class="member-signature"><span class="modifiers">public static</span> <span class="return-type">void</span> <span class="member-name">main</span>​(<span class="parameters">java.lang.String[] args)</span>
+ throws <span class="exceptions">java.io.IOException</span></div>
+<div class="block">Main method.</div>
+<dl class="notes">
+<dt>Parameters:</dt>
+<dd><code>args</code> - the arguments of the main : NONE here</dd>
+<dt>Throws:</dt>
+<dd><code>java.io.IOException</code> - if they are a problem while starting the HTTP server</dd>
+</dl>
+</section>
+</li>
+</ul>
+</section>
+</li>
+</ul>
+</section>
+<!-- ========= END OF CLASS DATA ========= -->
+</main>
+<footer role="contentinfo">
+<nav role="navigation">
+<!-- ======= START OF BOTTOM NAVBAR ====== -->
+<div class="bottom-nav" id="navbar.bottom">
+<div class="skip-nav"><a href="#skip.navbar.bottom" title="Skip navigation links">Skip navigation links</a></div>
+<ul id="navbar.bottom.firstrow" class="nav-list" title="Navigation">
+<li><a href="package-summary.html">Package</a></li>
+<li class="nav-bar-cell1-rev">Class</li>
+<li><a href="package-tree.html">Tree</a></li>
+<li><a href="../../deprecated-list.html">Deprecated</a></li>
+<li><a href="../../index-files/index-1.html">Index</a></li>
+<li><a href="../../help-doc.html">Help</a></li>
+</ul>
+</div>
+<div class="sub-nav">
+<div>
+<ul class="sub-nav-list">
+<li>Summary: </li>
+<li>Nested | </li>
+<li><a href="#field.summary">Field</a> | </li>
+<li><a href="#constructor.summary">Constr</a> | </li>
+<li><a href="#method.summary">Method</a></li>
+</ul>
+<ul class="sub-nav-list">
+<li>Detail: </li>
+<li><a href="#field.detail">Field</a> | </li>
+<li><a href="#constructor.detail">Constr</a> | </li>
+<li><a href="#method.detail">Method</a></li>
+</ul>
+</div>
+</div>
+<!-- ======== END OF BOTTOM NAVBAR ======= -->
+<span class="skip-nav" id="skip.navbar.bottom">
+<!-- -->
+</span></nav>
+</footer>
+</div>
+</div>
+</body>
+</html>
diff --git a/doc/sr2/flopbox/NoServerFoundException.html b/doc/sr2/flopbox/NoServerFoundException.html
new file mode 100644
index 0000000000000000000000000000000000000000..8d58611e2a1c310bcf7ed4a0cde7659064a71bbd
--- /dev/null
+++ b/doc/sr2/flopbox/NoServerFoundException.html
@@ -0,0 +1,191 @@
+<!DOCTYPE HTML>
+<!-- NewPage -->
+<html lang="en">
+<head>
+<!-- Generated by javadoc (15) on Thu Apr 01 01:09:08 CEST 2021 -->
+<title>NoServerFoundException</title>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+<meta name="dc.created" content="2021-04-01">
+<meta name="description" content="declaration: package: sr2.flopbox, class: NoServerFoundException">
+<meta name="generator" content="javadoc/ClassWriterImpl">
+<link rel="stylesheet" type="text/css" href="../../stylesheet.css" title="Style">
+<link rel="stylesheet" type="text/css" href="../../script-dir/jquery-ui.min.css" title="Style">
+<link rel="stylesheet" type="text/css" href="../../jquery-ui.overrides.css" title="Style">
+<script type="text/javascript" src="../../script.js"></script>
+<script type="text/javascript" src="../../script-dir/jquery-3.5.1.min.js"></script>
+<script type="text/javascript" src="../../script-dir/jquery-ui.min.js"></script>
+</head>
+<body class="class-declaration-page">
+<script type="text/javascript">var pathtoroot = "../../";
+loadScripts(document, 'script');</script>
+<noscript>
+<div>JavaScript is disabled on your browser.</div>
+</noscript>
+<div class="flex-box">
+<header role="banner" class="flex-header">
+<nav role="navigation">
+<!-- ========= START OF TOP NAVBAR ======= -->
+<div class="top-nav" id="navbar.top">
+<div class="skip-nav"><a href="#skip.navbar.top" title="Skip navigation links">Skip navigation links</a></div>
+<ul id="navbar.top.firstrow" class="nav-list" title="Navigation">
+<li><a href="package-summary.html">Package</a></li>
+<li class="nav-bar-cell1-rev">Class</li>
+<li><a href="package-tree.html">Tree</a></li>
+<li><a href="../../deprecated-list.html">Deprecated</a></li>
+<li><a href="../../index-files/index-1.html">Index</a></li>
+<li><a href="../../help-doc.html">Help</a></li>
+</ul>
+</div>
+<div class="sub-nav">
+<div>
+<ul class="sub-nav-list">
+<li>Summary: </li>
+<li>Nested | </li>
+<li>Field | </li>
+<li><a href="#constructor.summary">Constr</a> | </li>
+<li><a href="#method.summary">Method</a></li>
+</ul>
+<ul class="sub-nav-list">
+<li>Detail: </li>
+<li>Field | </li>
+<li><a href="#constructor.detail">Constr</a> | </li>
+<li>Method</li>
+</ul>
+</div>
+<div class="nav-list-search"><label for="search">SEARCH:</label>
+<input type="text" id="search" value="search" disabled="disabled">
+<input type="reset" id="reset" value="reset" disabled="disabled">
+</div>
+</div>
+<!-- ========= END OF TOP NAVBAR ========= -->
+<span class="skip-nav" id="skip.navbar.top">
+<!-- -->
+</span></nav>
+</header>
+<div class="flex-content">
+<main role="main">
+<!-- ======== START OF CLASS DATA ======== -->
+<div class="header">
+<div class="sub-title"><span class="package-label-in-type">Package</span> <a href="package-summary.html">sr2.flopbox</a></div>
+<h1 title="Class NoServerFoundException" class="title">Class NoServerFoundException</h1>
+</div>
+<div class="inheritance" title="Inheritance Tree">java.lang.Object
+<div class="inheritance">java.lang.Throwable
+<div class="inheritance">java.lang.Exception
+<div class="inheritance">sr2.flopbox.NoServerFoundException</div>
+</div>
+</div>
+</div>
+<section class="description">
+<dl class="notes">
+<dt>All Implemented Interfaces:</dt>
+<dd><code>java.io.Serializable</code></dd>
+</dl>
+<hr>
+<pre>public class <span class="type-name-label">NoServerFoundException</span>
+extends java.lang.Exception</pre>
+<div class="block">Exception throws if the alias dont refer to server</div>
+<dl class="notes">
+<dt>See Also:</dt>
+<dd><a href="../../serialized-form.html#sr2.flopbox.NoServerFoundException">Serialized Form</a></dd>
+</dl>
+</section>
+<section class="summary">
+<ul class="summary-list">
+<!-- ======== CONSTRUCTOR SUMMARY ======== -->
+<li>
+<section class="constructor-summary" id="constructor.summary">
+<h2>Constructor Summary</h2>
+<div class="member-summary">
+<table class="summary-table">
+<caption><span>Constructors</span></caption>
+<thead>
+<tr>
+<th class="col-first" scope="col">Constructor</th>
+<th class="col-last" scope="col">Description</th>
+</tr>
+</thead>
+<tbody>
+<tr class="alt-color">
+<th class="col-constructor-name" scope="row"><code><span class="member-name-link"><a href="#%3Cinit%3E(java.lang.String)">NoServerFoundException</a></span>​(java.lang.String errorMessage)</code></th>
+<td class="col-last"> </td>
+</tr>
+</tbody>
+</table>
+</div>
+</section>
+</li>
+<!-- ========== METHOD SUMMARY =========== -->
+<li>
+<section class="method-summary" id="method.summary">
+<h2>Method Summary</h2>
+<div class="inherited-list">
+<h3 id="methods.inherited.from.class.java.lang.Throwable">Methods inherited from class java.lang.Throwable</h3>
+<code>addSuppressed, fillInStackTrace, getCause, getLocalizedMessage, getMessage, getStackTrace, getSuppressed, initCause, printStackTrace, printStackTrace, printStackTrace, setStackTrace, toString</code></div>
+<div class="inherited-list">
+<h3 id="methods.inherited.from.class.java.lang.Object">Methods inherited from class java.lang.Object</h3>
+<code>clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait</code></div>
+</section>
+</li>
+</ul>
+</section>
+<section class="details">
+<ul class="details-list">
+<!-- ========= CONSTRUCTOR DETAIL ======== -->
+<li>
+<section class="constructor-details" id="constructor.detail">
+<h2>Constructor Details</h2>
+<ul class="member-list">
+<li>
+<section class="detail" id="<init>(java.lang.String)">
+<h3>NoServerFoundException</h3>
+<div class="member-signature"><span class="modifiers">public</span> <span class="member-name">NoServerFoundException</span>​(<span class="parameters">java.lang.String errorMessage)</span></div>
+</section>
+</li>
+</ul>
+</section>
+</li>
+</ul>
+</section>
+<!-- ========= END OF CLASS DATA ========= -->
+</main>
+<footer role="contentinfo">
+<nav role="navigation">
+<!-- ======= START OF BOTTOM NAVBAR ====== -->
+<div class="bottom-nav" id="navbar.bottom">
+<div class="skip-nav"><a href="#skip.navbar.bottom" title="Skip navigation links">Skip navigation links</a></div>
+<ul id="navbar.bottom.firstrow" class="nav-list" title="Navigation">
+<li><a href="package-summary.html">Package</a></li>
+<li class="nav-bar-cell1-rev">Class</li>
+<li><a href="package-tree.html">Tree</a></li>
+<li><a href="../../deprecated-list.html">Deprecated</a></li>
+<li><a href="../../index-files/index-1.html">Index</a></li>
+<li><a href="../../help-doc.html">Help</a></li>
+</ul>
+</div>
+<div class="sub-nav">
+<div>
+<ul class="sub-nav-list">
+<li>Summary: </li>
+<li>Nested | </li>
+<li>Field | </li>
+<li><a href="#constructor.summary">Constr</a> | </li>
+<li><a href="#method.summary">Method</a></li>
+</ul>
+<ul class="sub-nav-list">
+<li>Detail: </li>
+<li>Field | </li>
+<li><a href="#constructor.detail">Constr</a> | </li>
+<li>Method</li>
+</ul>
+</div>
+</div>
+<!-- ======== END OF BOTTOM NAVBAR ======= -->
+<span class="skip-nav" id="skip.navbar.bottom">
+<!-- -->
+</span></nav>
+</footer>
+</div>
+</div>
+</body>
+</html>
diff --git a/doc/sr2/flopbox/cantConnectToServerException.html b/doc/sr2/flopbox/cantConnectToServerException.html
new file mode 100644
index 0000000000000000000000000000000000000000..bf394464a5f2176826666b831c79e685bcfb5ab2
--- /dev/null
+++ b/doc/sr2/flopbox/cantConnectToServerException.html
@@ -0,0 +1,190 @@
+<!DOCTYPE HTML>
+<!-- NewPage -->
+<html lang="en">
+<head>
+<!-- Generated by javadoc (15) on Thu Apr 01 01:09:08 CEST 2021 -->
+<title>cantConnectToServerException</title>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+<meta name="dc.created" content="2021-04-01">
+<meta name="description" content="declaration: package: sr2.flopbox, class: cantConnectToServerException">
+<meta name="generator" content="javadoc/ClassWriterImpl">
+<link rel="stylesheet" type="text/css" href="../../stylesheet.css" title="Style">
+<link rel="stylesheet" type="text/css" href="../../script-dir/jquery-ui.min.css" title="Style">
+<link rel="stylesheet" type="text/css" href="../../jquery-ui.overrides.css" title="Style">
+<script type="text/javascript" src="../../script.js"></script>
+<script type="text/javascript" src="../../script-dir/jquery-3.5.1.min.js"></script>
+<script type="text/javascript" src="../../script-dir/jquery-ui.min.js"></script>
+</head>
+<body class="class-declaration-page">
+<script type="text/javascript">var pathtoroot = "../../";
+loadScripts(document, 'script');</script>
+<noscript>
+<div>JavaScript is disabled on your browser.</div>
+</noscript>
+<div class="flex-box">
+<header role="banner" class="flex-header">
+<nav role="navigation">
+<!-- ========= START OF TOP NAVBAR ======= -->
+<div class="top-nav" id="navbar.top">
+<div class="skip-nav"><a href="#skip.navbar.top" title="Skip navigation links">Skip navigation links</a></div>
+<ul id="navbar.top.firstrow" class="nav-list" title="Navigation">
+<li><a href="package-summary.html">Package</a></li>
+<li class="nav-bar-cell1-rev">Class</li>
+<li><a href="package-tree.html">Tree</a></li>
+<li><a href="../../deprecated-list.html">Deprecated</a></li>
+<li><a href="../../index-files/index-1.html">Index</a></li>
+<li><a href="../../help-doc.html">Help</a></li>
+</ul>
+</div>
+<div class="sub-nav">
+<div>
+<ul class="sub-nav-list">
+<li>Summary: </li>
+<li>Nested | </li>
+<li>Field | </li>
+<li><a href="#constructor.summary">Constr</a> | </li>
+<li><a href="#method.summary">Method</a></li>
+</ul>
+<ul class="sub-nav-list">
+<li>Detail: </li>
+<li>Field | </li>
+<li><a href="#constructor.detail">Constr</a> | </li>
+<li>Method</li>
+</ul>
+</div>
+<div class="nav-list-search"><label for="search">SEARCH:</label>
+<input type="text" id="search" value="search" disabled="disabled">
+<input type="reset" id="reset" value="reset" disabled="disabled">
+</div>
+</div>
+<!-- ========= END OF TOP NAVBAR ========= -->
+<span class="skip-nav" id="skip.navbar.top">
+<!-- -->
+</span></nav>
+</header>
+<div class="flex-content">
+<main role="main">
+<!-- ======== START OF CLASS DATA ======== -->
+<div class="header">
+<div class="sub-title"><span class="package-label-in-type">Package</span> <a href="package-summary.html">sr2.flopbox</a></div>
+<h1 title="Class cantConnectToServerException" class="title">Class cantConnectToServerException</h1>
+</div>
+<div class="inheritance" title="Inheritance Tree">java.lang.Object
+<div class="inheritance">java.lang.Throwable
+<div class="inheritance">java.lang.Exception
+<div class="inheritance">sr2.flopbox.cantConnectToServerException</div>
+</div>
+</div>
+</div>
+<section class="description">
+<dl class="notes">
+<dt>All Implemented Interfaces:</dt>
+<dd><code>java.io.Serializable</code></dd>
+</dl>
+<hr>
+<pre>public class <span class="type-name-label">cantConnectToServerException</span>
+extends java.lang.Exception</pre>
+<dl class="notes">
+<dt>See Also:</dt>
+<dd><a href="../../serialized-form.html#sr2.flopbox.cantConnectToServerException">Serialized Form</a></dd>
+</dl>
+</section>
+<section class="summary">
+<ul class="summary-list">
+<!-- ======== CONSTRUCTOR SUMMARY ======== -->
+<li>
+<section class="constructor-summary" id="constructor.summary">
+<h2>Constructor Summary</h2>
+<div class="member-summary">
+<table class="summary-table">
+<caption><span>Constructors</span></caption>
+<thead>
+<tr>
+<th class="col-first" scope="col">Constructor</th>
+<th class="col-last" scope="col">Description</th>
+</tr>
+</thead>
+<tbody>
+<tr class="alt-color">
+<th class="col-constructor-name" scope="row"><code><span class="member-name-link"><a href="#%3Cinit%3E(java.lang.String)">cantConnectToServerException</a></span>​(java.lang.String errorMessage)</code></th>
+<td class="col-last"> </td>
+</tr>
+</tbody>
+</table>
+</div>
+</section>
+</li>
+<!-- ========== METHOD SUMMARY =========== -->
+<li>
+<section class="method-summary" id="method.summary">
+<h2>Method Summary</h2>
+<div class="inherited-list">
+<h3 id="methods.inherited.from.class.java.lang.Throwable">Methods inherited from class java.lang.Throwable</h3>
+<code>addSuppressed, fillInStackTrace, getCause, getLocalizedMessage, getMessage, getStackTrace, getSuppressed, initCause, printStackTrace, printStackTrace, printStackTrace, setStackTrace, toString</code></div>
+<div class="inherited-list">
+<h3 id="methods.inherited.from.class.java.lang.Object">Methods inherited from class java.lang.Object</h3>
+<code>clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait</code></div>
+</section>
+</li>
+</ul>
+</section>
+<section class="details">
+<ul class="details-list">
+<!-- ========= CONSTRUCTOR DETAIL ======== -->
+<li>
+<section class="constructor-details" id="constructor.detail">
+<h2>Constructor Details</h2>
+<ul class="member-list">
+<li>
+<section class="detail" id="<init>(java.lang.String)">
+<h3>cantConnectToServerException</h3>
+<div class="member-signature"><span class="modifiers">public</span> <span class="member-name">cantConnectToServerException</span>​(<span class="parameters">java.lang.String errorMessage)</span></div>
+</section>
+</li>
+</ul>
+</section>
+</li>
+</ul>
+</section>
+<!-- ========= END OF CLASS DATA ========= -->
+</main>
+<footer role="contentinfo">
+<nav role="navigation">
+<!-- ======= START OF BOTTOM NAVBAR ====== -->
+<div class="bottom-nav" id="navbar.bottom">
+<div class="skip-nav"><a href="#skip.navbar.bottom" title="Skip navigation links">Skip navigation links</a></div>
+<ul id="navbar.bottom.firstrow" class="nav-list" title="Navigation">
+<li><a href="package-summary.html">Package</a></li>
+<li class="nav-bar-cell1-rev">Class</li>
+<li><a href="package-tree.html">Tree</a></li>
+<li><a href="../../deprecated-list.html">Deprecated</a></li>
+<li><a href="../../index-files/index-1.html">Index</a></li>
+<li><a href="../../help-doc.html">Help</a></li>
+</ul>
+</div>
+<div class="sub-nav">
+<div>
+<ul class="sub-nav-list">
+<li>Summary: </li>
+<li>Nested | </li>
+<li>Field | </li>
+<li><a href="#constructor.summary">Constr</a> | </li>
+<li><a href="#method.summary">Method</a></li>
+</ul>
+<ul class="sub-nav-list">
+<li>Detail: </li>
+<li>Field | </li>
+<li><a href="#constructor.detail">Constr</a> | </li>
+<li>Method</li>
+</ul>
+</div>
+</div>
+<!-- ======== END OF BOTTOM NAVBAR ======= -->
+<span class="skip-nav" id="skip.navbar.bottom">
+<!-- -->
+</span></nav>
+</footer>
+</div>
+</div>
+</body>
+</html>
diff --git a/doc/sr2/flopbox/package-summary.html b/doc/sr2/flopbox/package-summary.html
new file mode 100644
index 0000000000000000000000000000000000000000..9d1b84937ff9157c7bd15bda0b04f5123be7874d
--- /dev/null
+++ b/doc/sr2/flopbox/package-summary.html
@@ -0,0 +1,152 @@
+<!DOCTYPE HTML>
+<!-- NewPage -->
+<html lang="en">
+<head>
+<!-- Generated by javadoc (15) on Thu Apr 01 01:09:08 CEST 2021 -->
+<title>sr2.flopbox</title>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+<meta name="dc.created" content="2021-04-01">
+<meta name="description" content="declaration: package: sr2.flopbox">
+<meta name="generator" content="javadoc/PackageWriterImpl">
+<link rel="stylesheet" type="text/css" href="../../stylesheet.css" title="Style">
+<link rel="stylesheet" type="text/css" href="../../script-dir/jquery-ui.min.css" title="Style">
+<link rel="stylesheet" type="text/css" href="../../jquery-ui.overrides.css" title="Style">
+<script type="text/javascript" src="../../script.js"></script>
+<script type="text/javascript" src="../../script-dir/jquery-3.5.1.min.js"></script>
+<script type="text/javascript" src="../../script-dir/jquery-ui.min.js"></script>
+</head>
+<body class="package-declaration-page">
+<script type="text/javascript">var pathtoroot = "../../";
+loadScripts(document, 'script');</script>
+<noscript>
+<div>JavaScript is disabled on your browser.</div>
+</noscript>
+<div class="flex-box">
+<header role="banner" class="flex-header">
+<nav role="navigation">
+<!-- ========= START OF TOP NAVBAR ======= -->
+<div class="top-nav" id="navbar.top">
+<div class="skip-nav"><a href="#skip.navbar.top" title="Skip navigation links">Skip navigation links</a></div>
+<ul id="navbar.top.firstrow" class="nav-list" title="Navigation">
+<li class="nav-bar-cell1-rev">Package</li>
+<li>Class</li>
+<li><a href="package-tree.html">Tree</a></li>
+<li><a href="../../deprecated-list.html">Deprecated</a></li>
+<li><a href="../../index-files/index-1.html">Index</a></li>
+<li><a href="../../help-doc.html">Help</a></li>
+</ul>
+</div>
+<div class="sub-nav">
+<div class="nav-list-search"><label for="search">SEARCH:</label>
+<input type="text" id="search" value="search" disabled="disabled">
+<input type="reset" id="reset" value="reset" disabled="disabled">
+</div>
+</div>
+<!-- ========= END OF TOP NAVBAR ========= -->
+<span class="skip-nav" id="skip.navbar.top">
+<!-- -->
+</span></nav>
+</header>
+<div class="flex-content">
+<main role="main">
+<div class="header">
+<h1 title="Package" class="title">Package sr2.flopbox</h1>
+</div>
+<section class="summary">
+<ul class="summary-list">
+<li>
+<div class="type-summary">
+<table class="summary-table">
+<caption><span>Class Summary</span></caption>
+<thead>
+<tr>
+<th class="col-first" scope="col">Class</th>
+<th class="col-last" scope="col">Description</th>
+</tr>
+</thead>
+<tbody>
+<tr class="alt-color">
+<th class="col-first" scope="row"><a href="FilesServices.html" title="class in sr2.flopbox">FilesServices</a></th>
+<td class="col-last"> </td>
+</tr>
+<tr class="row-color">
+<th class="col-first" scope="row"><a href="FtpServer.html" title="class in sr2.flopbox">FtpServer</a></th>
+<td class="col-last"> </td>
+</tr>
+<tr class="alt-color">
+<th class="col-first" scope="row"><a href="FtpServer.FtpServerBuilder.html" title="class in sr2.flopbox">FtpServer.FtpServerBuilder</a></th>
+<td class="col-last">
+<div class="block">Constructor of a FTP client builder</div>
+</td>
+</tr>
+<tr class="row-color">
+<th class="col-first" scope="row"><a href="FtpServerList.html" title="class in sr2.flopbox">FtpServerList</a></th>
+<td class="col-last"> </td>
+</tr>
+<tr class="alt-color">
+<th class="col-first" scope="row"><a href="FtpServerService.html" title="class in sr2.flopbox">FtpServerService</a></th>
+<td class="col-last"> </td>
+</tr>
+<tr class="row-color">
+<th class="col-first" scope="row"><a href="Main.html" title="class in sr2.flopbox">Main</a></th>
+<td class="col-last"> </td>
+</tr>
+</tbody>
+</table>
+</div>
+</li>
+<li>
+<div class="type-summary">
+<table class="summary-table">
+<caption><span>Exception Summary</span></caption>
+<thead>
+<tr>
+<th class="col-first" scope="col">Exception</th>
+<th class="col-last" scope="col">Description</th>
+</tr>
+</thead>
+<tbody>
+<tr class="alt-color">
+<th class="col-first" scope="row"><a href="cantConnectToServerException.html" title="class in sr2.flopbox">cantConnectToServerException</a></th>
+<td class="col-last"> </td>
+</tr>
+<tr class="row-color">
+<th class="col-first" scope="row"><a href="FileDoesNotExistException.html" title="class in sr2.flopbox">FileDoesNotExistException</a></th>
+<td class="col-last"> </td>
+</tr>
+<tr class="alt-color">
+<th class="col-first" scope="row"><a href="NoServerFoundException.html" title="class in sr2.flopbox">NoServerFoundException</a></th>
+<td class="col-last">
+<div class="block">Exception throws if the alias dont refer to server</div>
+</td>
+</tr>
+</tbody>
+</table>
+</div>
+</li>
+</ul>
+</section>
+</main>
+<footer role="contentinfo">
+<nav role="navigation">
+<!-- ======= START OF BOTTOM NAVBAR ====== -->
+<div class="bottom-nav" id="navbar.bottom">
+<div class="skip-nav"><a href="#skip.navbar.bottom" title="Skip navigation links">Skip navigation links</a></div>
+<ul id="navbar.bottom.firstrow" class="nav-list" title="Navigation">
+<li class="nav-bar-cell1-rev">Package</li>
+<li>Class</li>
+<li><a href="package-tree.html">Tree</a></li>
+<li><a href="../../deprecated-list.html">Deprecated</a></li>
+<li><a href="../../index-files/index-1.html">Index</a></li>
+<li><a href="../../help-doc.html">Help</a></li>
+</ul>
+</div>
+<!-- ======== END OF BOTTOM NAVBAR ======= -->
+<span class="skip-nav" id="skip.navbar.bottom">
+<!-- -->
+</span></nav>
+</footer>
+</div>
+</div>
+</body>
+</html>
diff --git a/doc/sr2/flopbox/package-tree.html b/doc/sr2/flopbox/package-tree.html
new file mode 100644
index 0000000000000000000000000000000000000000..2f2acbafa012bef71fd0745c62f2a79b143a0785
--- /dev/null
+++ b/doc/sr2/flopbox/package-tree.html
@@ -0,0 +1,104 @@
+<!DOCTYPE HTML>
+<!-- NewPage -->
+<html lang="en">
+<head>
+<!-- Generated by javadoc (15) on Thu Apr 01 01:09:08 CEST 2021 -->
+<title>sr2.flopbox Class Hierarchy</title>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+<meta name="dc.created" content="2021-04-01">
+<meta name="description" content="tree: package: sr2.flopbox">
+<meta name="generator" content="javadoc/PackageTreeWriter">
+<link rel="stylesheet" type="text/css" href="../../stylesheet.css" title="Style">
+<link rel="stylesheet" type="text/css" href="../../script-dir/jquery-ui.min.css" title="Style">
+<link rel="stylesheet" type="text/css" href="../../jquery-ui.overrides.css" title="Style">
+<script type="text/javascript" src="../../script.js"></script>
+<script type="text/javascript" src="../../script-dir/jquery-3.5.1.min.js"></script>
+<script type="text/javascript" src="../../script-dir/jquery-ui.min.js"></script>
+</head>
+<body class="package-tree-page">
+<script type="text/javascript">var pathtoroot = "../../";
+loadScripts(document, 'script');</script>
+<noscript>
+<div>JavaScript is disabled on your browser.</div>
+</noscript>
+<div class="flex-box">
+<header role="banner" class="flex-header">
+<nav role="navigation">
+<!-- ========= START OF TOP NAVBAR ======= -->
+<div class="top-nav" id="navbar.top">
+<div class="skip-nav"><a href="#skip.navbar.top" title="Skip navigation links">Skip navigation links</a></div>
+<ul id="navbar.top.firstrow" class="nav-list" title="Navigation">
+<li><a href="package-summary.html">Package</a></li>
+<li>Class</li>
+<li class="nav-bar-cell1-rev">Tree</li>
+<li><a href="../../deprecated-list.html">Deprecated</a></li>
+<li><a href="../../index-files/index-1.html">Index</a></li>
+<li><a href="../../help-doc.html">Help</a></li>
+</ul>
+</div>
+<div class="sub-nav">
+<div class="nav-list-search"><label for="search">SEARCH:</label>
+<input type="text" id="search" value="search" disabled="disabled">
+<input type="reset" id="reset" value="reset" disabled="disabled">
+</div>
+</div>
+<!-- ========= END OF TOP NAVBAR ========= -->
+<span class="skip-nav" id="skip.navbar.top">
+<!-- -->
+</span></nav>
+</header>
+<div class="flex-content">
+<main role="main">
+<div class="header">
+<h1 class="title">Hierarchy For Package sr2.flopbox</h1>
+</div>
+<section class="hierarchy">
+<h2 title="Class Hierarchy">Class Hierarchy</h2>
+<ul>
+<li class="circle">java.lang.Object
+<ul>
+<li class="circle">sr2.flopbox.<a href="FilesServices.html" title="class in sr2.flopbox"><span class="type-name-link">FilesServices</span></a></li>
+<li class="circle">sr2.flopbox.<a href="FtpServer.html" title="class in sr2.flopbox"><span class="type-name-link">FtpServer</span></a></li>
+<li class="circle">sr2.flopbox.<a href="FtpServer.FtpServerBuilder.html" title="class in sr2.flopbox"><span class="type-name-link">FtpServer.FtpServerBuilder</span></a></li>
+<li class="circle">sr2.flopbox.<a href="FtpServerList.html" title="class in sr2.flopbox"><span class="type-name-link">FtpServerList</span></a></li>
+<li class="circle">sr2.flopbox.<a href="FtpServerService.html" title="class in sr2.flopbox"><span class="type-name-link">FtpServerService</span></a></li>
+<li class="circle">sr2.flopbox.<a href="Main.html" title="class in sr2.flopbox"><span class="type-name-link">Main</span></a></li>
+<li class="circle">java.lang.Throwable (implements java.io.Serializable)
+<ul>
+<li class="circle">java.lang.Exception
+<ul>
+<li class="circle">sr2.flopbox.<a href="cantConnectToServerException.html" title="class in sr2.flopbox"><span class="type-name-link">cantConnectToServerException</span></a></li>
+<li class="circle">sr2.flopbox.<a href="FileDoesNotExistException.html" title="class in sr2.flopbox"><span class="type-name-link">FileDoesNotExistException</span></a></li>
+<li class="circle">sr2.flopbox.<a href="NoServerFoundException.html" title="class in sr2.flopbox"><span class="type-name-link">NoServerFoundException</span></a></li>
+</ul>
+</li>
+</ul>
+</li>
+</ul>
+</li>
+</ul>
+</section>
+</main>
+<footer role="contentinfo">
+<nav role="navigation">
+<!-- ======= START OF BOTTOM NAVBAR ====== -->
+<div class="bottom-nav" id="navbar.bottom">
+<div class="skip-nav"><a href="#skip.navbar.bottom" title="Skip navigation links">Skip navigation links</a></div>
+<ul id="navbar.bottom.firstrow" class="nav-list" title="Navigation">
+<li><a href="package-summary.html">Package</a></li>
+<li>Class</li>
+<li class="nav-bar-cell1-rev">Tree</li>
+<li><a href="../../deprecated-list.html">Deprecated</a></li>
+<li><a href="../../index-files/index-1.html">Index</a></li>
+<li><a href="../../help-doc.html">Help</a></li>
+</ul>
+</div>
+<!-- ======== END OF BOTTOM NAVBAR ======= -->
+<span class="skip-nav" id="skip.navbar.bottom">
+<!-- -->
+</span></nav>
+</footer>
+</div>
+</div>
+</body>
+</html>
diff --git a/doc/stylesheet.css b/doc/stylesheet.css
new file mode 100644
index 0000000000000000000000000000000000000000..79a9d970c8b49dfa07bf4f7ea607f57839762011
--- /dev/null
+++ b/doc/stylesheet.css
@@ -0,0 +1,792 @@
+/*
+ * Javadoc style sheet
+ */
+
+@import url('resources/fonts/dejavu.css');
+
+/*
+ * Styles for individual HTML elements.
+ *
+ * These are styles that are specific to individual HTML elements. Changing them affects the style of a particular
+ * HTML element throughout the page.
+ */
+
+body {
+ background-color:#ffffff;
+ color:#353833;
+ font-family:'DejaVu Sans', Arial, Helvetica, sans-serif;
+ font-size:14px;
+ margin:0;
+ padding:0;
+ height:100%;
+ width:100%;
+}
+iframe {
+ margin:0;
+ padding:0;
+ height:100%;
+ width:100%;
+ overflow-y:scroll;
+ border:none;
+}
+a:link, a:visited {
+ text-decoration:none;
+ color:#4A6782;
+}
+a[href]:hover, a[href]:focus {
+ text-decoration:none;
+ color:#bb7a2a;
+}
+a[name] {
+ color:#353833;
+}
+pre {
+ font-family:'DejaVu Sans Mono', monospace;
+ font-size:14px;
+}
+h1 {
+ font-size:20px;
+}
+h2 {
+ font-size:18px;
+}
+h3 {
+ font-size:16px;
+}
+h4 {
+ font-size:13px;
+}
+h5 {
+ font-size:12px;
+}
+h6 {
+ font-size:11px;
+}
+ul {
+ list-style-type:disc;
+}
+code, tt {
+ font-family:'DejaVu Sans Mono', monospace;
+ font-size:14px;
+ padding-top:4px;
+ margin-top:8px;
+ line-height:1.4em;
+}
+dt code {
+ font-family:'DejaVu Sans Mono', monospace;
+ font-size:14px;
+ padding-top:4px;
+}
+table tr td dt code {
+ font-family:'DejaVu Sans Mono', monospace;
+ font-size:14px;
+ vertical-align:top;
+ padding-top:4px;
+}
+sup {
+ font-size:8px;
+}
+button {
+ font-family: 'DejaVu Sans', Arial, Helvetica, sans-serif;
+ font-size: 14px;
+}
+/*
+ * Styles for HTML generated by javadoc.
+ *
+ * These are style classes that are used by the standard doclet to generate HTML documentation.
+ */
+
+/*
+ * Styles for document title and copyright.
+ */
+.clear {
+ clear:both;
+ height:0px;
+ overflow:hidden;
+}
+.about-language {
+ float:right;
+ padding:0px 21px;
+ font-size:11px;
+ z-index:200;
+ margin-top:-9px;
+}
+.legal-copy {
+ margin-left:.5em;
+}
+.tab {
+ background-color:#0066FF;
+ color:#ffffff;
+ padding:8px;
+ width:5em;
+ font-weight:bold;
+}
+/*
+ * Styles for navigation bar.
+ */
+@media screen {
+ .flex-box {
+ position:fixed;
+ display:flex;
+ flex-direction:column;
+ height: 100%;
+ width: 100%;
+ }
+ .flex-header {
+ flex: 0 0 auto;
+ }
+ .flex-content {
+ flex: 1 1 auto;
+ overflow-y: auto;
+ }
+}
+.top-nav {
+ background-color:#4D7A97;
+ color:#FFFFFF;
+ float:left;
+ padding:0;
+ width:100%;
+ clear:right;
+ height:2.8em;
+ padding-top:10px;
+ overflow:hidden;
+ font-size:12px;
+}
+.bottom-nav {
+ margin-top:10px;
+ background-color:#4D7A97;
+ color:#FFFFFF;
+ float:left;
+ padding:0;
+ width:100%;
+ clear:right;
+ height:2.8em;
+ padding-top:10px;
+ overflow:hidden;
+ font-size:12px;
+}
+.sub-nav {
+ background-color:#dee3e9;
+ float:left;
+ width:100%;
+ overflow:hidden;
+ font-size:12px;
+}
+.sub-nav div {
+ clear:left;
+ float:left;
+ padding:0 0 5px 6px;
+ text-transform:uppercase;
+}
+.sub-nav .nav-list {
+ padding-top:5px;
+}
+ul.nav-list, ul.sub-nav-list {
+ float:left;
+ margin:0 25px 0 0;
+ padding:0;
+}
+ul.nav-list li{
+ list-style:none;
+ float:left;
+ padding: 5px 6px;
+ text-transform:uppercase;
+}
+.sub-nav .nav-list-search {
+ float:right;
+ margin:0 0 0 0;
+ padding:5px 6px;
+ clear:none;
+}
+.nav-list-search label {
+ position:relative;
+ right:-16px;
+}
+ul.sub-nav-list li {
+ list-style:none;
+ float:left;
+ padding-top:10px;
+}
+.top-nav a:link, .top-nav a:active, .top-nav a:visited, .bottom-nav a:link, .bottom-nav a:active, .bottom-nav a:visited {
+ color:#FFFFFF;
+ text-decoration:none;
+ text-transform:uppercase;
+}
+.top-nav a:hover, .bottom-nav a:hover {
+ text-decoration:none;
+ color:#bb7a2a;
+ text-transform:uppercase;
+}
+.nav-bar-cell1-rev {
+ background-color:#F8981D;
+ color:#253441;
+ margin: auto 5px;
+}
+.skip-nav {
+ position:absolute;
+ top:auto;
+ left:-9999px;
+ overflow:hidden;
+}
+/*
+ * Hide navigation links and search box in print layout
+ */
+@media print {
+ ul.nav-list, div.sub-nav {
+ display:none;
+ }
+}
+/*
+ * Styles for page header and footer.
+ */
+.title {
+ color:#2c4557;
+ margin:10px 0;
+}
+.sub-title {
+ margin:5px 0 0 0;
+}
+.header ul {
+ margin:0 0 15px 0;
+ padding:0;
+}
+.header ul li, .footer ul li {
+ list-style:none;
+ font-size:13px;
+}
+/*
+ * Styles for headings.
+ */
+body.class-declaration-page .summary h2,
+body.class-declaration-page .details h2,
+body.class-use-page h2,
+body.module-declaration-page .block-list h2 {
+ font-style: italic;
+ padding:0;
+ margin:15px 0;
+}
+body.class-declaration-page .summary h3,
+body.class-declaration-page .details h3,
+body.class-declaration-page .summary .inherited-list h2 {
+ background-color:#dee3e9;
+ border:1px solid #d0d9e0;
+ margin:0 0 6px -8px;
+ padding:7px 5px;
+}
+/*
+ * Styles for page layout containers.
+ */
+main {
+ clear:both;
+ padding:10px 20px;
+ position:relative;
+}
+dl.notes > dt {
+ font-family: 'DejaVu Sans', Arial, Helvetica, sans-serif;
+ font-size:12px;
+ font-weight:bold;
+ margin:10px 0 0 0;
+ color:#4E4E4E;
+}
+dl.notes > dd {
+ margin:5px 0 10px 0px;
+ font-size:14px;
+ font-family:'DejaVu Serif', Georgia, "Times New Roman", Times, serif;
+}
+dl.name-value > dt {
+ margin-left:1px;
+ font-size:1.1em;
+ display:inline;
+ font-weight:bold;
+}
+dl.name-value > dd {
+ margin:0 0 0 1px;
+ font-size:1.1em;
+ display:inline;
+}
+/*
+ * Styles for lists.
+ */
+li.circle {
+ list-style:circle;
+}
+ul.horizontal li {
+ display:inline;
+ font-size:0.9em;
+}
+div.inheritance {
+ margin:0;
+ padding:0;
+}
+div.inheritance div.inheritance {
+ margin-left:2em;
+}
+ul.block-list,
+ul.details-list,
+ul.member-list,
+ul.summary-list {
+ margin:10px 0 10px 0;
+ padding:0;
+}
+ul.block-list > li,
+ul.details-list > li,
+ul.member-list > li,
+ul.summary-list > li {
+ list-style:none;
+ margin-bottom:15px;
+ line-height:1.4;
+}
+table tr td dl, table tr td dl dt, table tr td dl dd {
+ margin-top:0;
+ margin-bottom:1px;
+}
+/*
+ * Styles for tables.
+ */
+.overview-summary table, .member-summary table, .type-summary table, .use-summary table, .constants-summary table, .deprecated-summary table,
+.requires-summary table, .packages-summary table, .provides-summary table, .uses-summary table, .system-properties-summary table {
+ width:100%;
+ border-spacing:0;
+ border-left:1px solid #EEE;
+ border-right:1px solid #EEE;
+ border-bottom:1px solid #EEE;
+}
+.overview-summary table, .member-summary table, .requires-summary table, .packages-summary table,
+.provides-summary table, .uses-summary table, .system-properties-summary table {
+ padding:0px;
+}
+.overview-summary caption, .member-summary caption, .type-summary caption,
+.use-summary caption, .constants-summary caption, .deprecated-summary caption,
+.requires-summary caption, .packages-summary caption, .provides-summary caption,
+.uses-summary caption, .system-properties-summary caption {
+ position:relative;
+ text-align:left;
+ background-repeat:no-repeat;
+ color:#253441;
+ font-weight:bold;
+ clear:none;
+ overflow:hidden;
+ padding:0px;
+ padding-top:10px;
+ padding-left:1px;
+ margin:0px;
+ white-space:pre;
+}
+.constants-summary caption a:link, .constants-summary caption a:visited,
+.use-summary caption a:link, .use-summary caption a:visited {
+ color:#1f389c;
+}
+.overview-summary caption a:link, .member-summary caption a:link, .type-summary caption a:link,
+.deprecated-summary caption a:link,
+.requires-summary caption a:link, .packages-summary caption a:link, .provides-summary caption a:link,
+.uses-summary caption a:link,
+.overview-summary caption a:hover, .member-summary caption a:hover, .type-summary caption a:hover,
+.use-summary caption a:hover, .constants-summary caption a:hover, .deprecated-summary caption a:hover,
+.requires-summary caption a:hover, .packages-summary caption a:hover, .provides-summary caption a:hover,
+.uses-summary caption a:hover,
+.overview-summary caption a:active, .member-summary caption a:active, .type-summary caption a:active,
+.use-summary caption a:active, .constants-summary caption a:active, .deprecated-summary caption a:active,
+.requires-summary caption a:active, .packages-summary caption a:active, .provides-summary caption a:active,
+.uses-summary caption a:active,
+.overview-summary caption a:visited, .member-summary caption a:visited, .type-summary caption a:visited,
+.deprecated-summary caption a:visited,
+.requires-summary caption a:visited, .packages-summary caption a:visited, .provides-summary caption a:visited,
+.uses-summary caption a:visited {
+ color:#FFFFFF;
+}
+.overview-summary caption span, .member-summary caption span, .type-summary caption span,
+.use-summary caption span, .constants-summary caption span, .deprecated-summary caption span,
+.requires-summary caption span, .packages-summary caption span, .provides-summary caption span,
+.uses-summary caption span, .system-properties-summary caption span {
+ white-space:nowrap;
+ padding-top:5px;
+ padding-left:12px;
+ padding-right:12px;
+ padding-bottom:7px;
+ display:inline-block;
+ float:left;
+ background-color:#F8981D;
+ border: none;
+ height:16px;
+}
+
+div.table-tabs > button {
+ border: none;
+ cursor: pointer;
+ padding: 5px 12px 7px 12px;
+ font-weight: bold;
+ margin-right: 3px;
+}
+div.table-tabs > button.active-table-tab {
+ background: #F8981D;
+ color: #253441;
+}
+div.table-tabs > button.table-tab {
+ background: #4D7A97;
+ color: #FFFFFF;
+}
+
+.row-color th,
+.alt-color th {
+ font-weight:normal;
+}
+.overview-summary td, .member-summary td, .type-summary td,
+.use-summary td, .constants-summary td, .deprecated-summary td,
+.requires-summary td, .packages-summary td, .provides-summary td,
+.uses-summary td, .system-properties-summary td {
+ text-align:left;
+ padding:0px 0px 12px 10px;
+}
+th.col-first, th.col-second, th.col-last, th.col-constructor-name, th.col-deprecated-item-name, .use-summary th,
+.constants-summary th, .packages-summary th, td.col-first, td.col-second, td.col-last, .use-summary td,
+.constants-summary td, .system-properties-summary th {
+ vertical-align:top;
+ padding-right:0px;
+ padding-top:8px;
+ padding-bottom:3px;
+}
+th.col-first, th.col-second, th.col-last, th.col-constructor-name, th.col-deprecated-item-name, .constants-summary th,
+.packages-summary th {
+ background:#dee3e9;
+ text-align:left;
+ padding:8px 3px 3px 7px;
+}
+td.col-first, th.col-first {
+ font-size:13px;
+}
+td.col-second, th.col-second, td.col-last, th.col-constructor-name, th.col-deprecated-item-name, th.col-last {
+ font-size:13px;
+}
+.constants-summary th, .packages-summary th {
+ font-size:13px;
+}
+.provides-summary th.col-first, .provides-summary th.col-last, .provides-summary td.col-first,
+.provides-summary td.col-last {
+ white-space:normal;
+ font-size:13px;
+}
+.overview-summary td.col-first, .overview-summary th.col-first,
+.requires-summary td.col-first, .requires-summary th.col-first,
+.packages-summary td.col-first, .packages-summary td.col-second, .packages-summary th.col-first, .packages-summary th,
+.uses-summary td.col-first, .uses-summary th.col-first,
+.provides-summary td.col-first, .provides-summary th.col-first,
+.member-summary td.col-first, .member-summary th.col-first,
+.member-summary td.col-second, .member-summary th.col-second, .member-summary th.col-constructor-name,
+.type-summary td.col-first, .type-summary th.col-first {
+ vertical-align:top;
+}
+.packages-summary th.col-last, .packages-summary td.col-last {
+ white-space:normal;
+}
+td.col-first a:link, td.col-first a:visited,
+td.col-second a:link, td.col-second a:visited,
+th.col-first a:link, th.col-first a:visited,
+th.col-second a:link, th.col-second a:visited,
+th.col-constructor-name a:link, th.col-constructor-name a:visited,
+th.col-deprecated-item-name a:link, th.col-deprecated-item-name a:visited,
+.constant-values-container td a:link, .constant-values-container td a:visited,
+.all-classes-container td a:link, .all-classes-container td a:visited,
+.all-packages-container td a:link, .all-packages-container td a:visited {
+ font-weight:bold;
+}
+.table-sub-heading-color {
+ background-color:#EEEEFF;
+}
+.alt-color, .alt-color th {
+ background-color:#FFFFFF;
+}
+.row-color, .row-color th {
+ background-color:#EEEEEF;
+}
+/*
+ * Styles for contents.
+ */
+.description pre {
+ margin-top:0;
+}
+.deprecated-content {
+ margin:0;
+ padding:10px 0;
+}
+div.block {
+ font-size:14px;
+ font-family:'DejaVu Serif', Georgia, "Times New Roman", Times, serif;
+}
+td.col-last div {
+ padding-top:0px;
+}
+td.col-last a {
+ padding-bottom:3px;
+}
+div.member-signature {
+ font-family:'DejaVu Sans Mono', monospace;
+ font-size:14px;
+ margin:14px 0;
+ white-space: pre-wrap;
+}
+div.member-signature span.annotations {
+ white-space: pre-wrap;
+}
+div.member-signature span.type-parameters-long,
+div.member-signature span.parameters,
+div.member-signature span.exceptions {
+ display: inline-block;
+ vertical-align: top;
+ white-space: pre;
+}
+div.member-signature span.type-parameters {
+ white-space: normal;
+}
+/*
+ * Styles for formatting effect.
+ */
+.source-line-no {
+ color:green;
+ padding:0 30px 0 0;
+}
+h1.hidden {
+ visibility:hidden;
+ overflow:hidden;
+ font-size:10px;
+}
+.block {
+ display:block;
+ margin:0 10px 5px 0;
+ color:#474747;
+}
+.deprecated-label, .descfrm-type-label, .implementation-label, .member-name-label, .member-name-link,
+.module-label-in-package, .module-label-in-type, .override-specify-label, .package-label-in-type,
+.package-hierarchy-label, .type-name-label, .type-name-link, .search-tag-link {
+ font-weight:bold;
+}
+.deprecation-comment, .help-footnote, .interface-name {
+ font-style:italic;
+}
+.deprecation-block {
+ font-size:14px;
+ font-family:'DejaVu Serif', Georgia, "Times New Roman", Times, serif;
+ border-style:solid;
+ border-width:thin;
+ border-radius:10px;
+ padding:10px;
+ margin-bottom:10px;
+ margin-right:10px;
+ display:inline-block;
+}
+div.block div.deprecation-comment, div.block div.block span.emphasized-phrase,
+div.block div.block span.interface-name {
+ font-style:normal;
+}
+/*
+ * Styles specific to HTML5 elements.
+ */
+main, nav, header, footer, section {
+ display:block;
+}
+/*
+ * Styles for javadoc search.
+ */
+.ui-autocomplete-category {
+ font-weight:bold;
+ font-size:15px;
+ padding:7px 0 7px 3px;
+ background-color:#4D7A97;
+ color:#FFFFFF;
+}
+.result-item {
+ font-size:13px;
+}
+.ui-autocomplete {
+ max-height:85%;
+ max-width:65%;
+ overflow-y:scroll;
+ overflow-x:scroll;
+ white-space:nowrap;
+ box-shadow: 0 3px 6px rgba(0,0,0,0.16), 0 3px 6px rgba(0,0,0,0.23);
+}
+ul.ui-autocomplete {
+ position:fixed;
+ z-index:999999;
+}
+ul.ui-autocomplete li {
+ float:left;
+ clear:both;
+ width:100%;
+}
+.result-highlight {
+ font-weight:bold;
+}
+#search {
+ background-image:url('resources/glass.png');
+ background-size:13px;
+ background-repeat:no-repeat;
+ background-position:2px 3px;
+ padding-left:20px;
+ position:relative;
+ right:-18px;
+ width:400px;
+}
+#reset {
+ background-color: rgb(255,255,255);
+ background-image:url('resources/x.png');
+ background-position:center;
+ background-repeat:no-repeat;
+ background-size:12px;
+ border:0 none;
+ width:16px;
+ height:16px;
+ position:relative;
+ left:-4px;
+ top:-4px;
+ font-size:0px;
+}
+.watermark {
+ color:#545454;
+}
+.search-tag-desc-result {
+ font-style:italic;
+ font-size:11px;
+}
+.search-tag-holder-result {
+ font-style:italic;
+ font-size:12px;
+}
+.search-tag-result:target {
+ background-color:yellow;
+}
+.module-graph span {
+ display:none;
+ position:absolute;
+}
+.module-graph:hover span {
+ display:block;
+ margin: -100px 0 0 100px;
+ z-index: 1;
+}
+.inherited-list {
+ margin: 10px 0 10px 0;
+}
+section.description {
+ line-height: 1.4;
+}
+.summary section[class$="-summary"], .details section[class$="-details"],
+.class-uses .detail, .serialized-class-details {
+ padding: 0px 20px 5px 10px;
+ border: 1px solid #ededed;
+ background-color: #f8f8f8;
+}
+.inherited-list, section[class$="-details"] .detail {
+ padding:0 0 5px 8px;
+ background-color:#ffffff;
+ border:none;
+}
+.vertical-separator {
+ padding: 0 5px;
+}
+ul.help-section-list {
+ margin: 0;
+}
+/*
+ * Indicator icon for external links.
+ */
+main a[href*="://"]::after {
+ content:"";
+ display:inline-block;
+ background-image:url('data:image/svg+xml; utf8, \
+ <svg xmlns="http://www.w3.org/2000/svg" width="768" height="768">\
+ <path d="M584 664H104V184h216V80H0v688h688V448H584zM384 0l132 \
+ 132-240 240 120 120 240-240 132 132V0z" fill="%234a6782"/>\
+ </svg>');
+ background-size:100% 100%;
+ width:7px;
+ height:7px;
+ margin-left:2px;
+ margin-bottom:4px;
+}
+main a[href*="://"]:hover::after,
+main a[href*="://"]:focus::after {
+ background-image:url('data:image/svg+xml; utf8, \
+ <svg xmlns="http://www.w3.org/2000/svg" width="768" height="768">\
+ <path d="M584 664H104V184h216V80H0v688h688V448H584zM384 0l132 \
+ 132-240 240 120 120 240-240 132 132V0z" fill="%23bb7a2a"/>\
+ </svg>');
+}
+
+/*
+ * Styles for user-provided tables.
+ *
+ * borderless:
+ * No borders, vertical margins, styled caption.
+ * This style is provided for use with existing doc comments.
+ * In general, borderless tables should not be used for layout purposes.
+ *
+ * plain:
+ * Plain borders around table and cells, vertical margins, styled caption.
+ * Best for small tables or for complex tables for tables with cells that span
+ * rows and columns, when the "striped" style does not work well.
+ *
+ * striped:
+ * Borders around the table and vertical borders between cells, striped rows,
+ * vertical margins, styled caption.
+ * Best for tables that have a header row, and a body containing a series of simple rows.
+ */
+
+table.borderless,
+table.plain,
+table.striped {
+ margin-top: 10px;
+ margin-bottom: 10px;
+}
+table.borderless > caption,
+table.plain > caption,
+table.striped > caption {
+ font-weight: bold;
+ font-size: smaller;
+}
+table.borderless th, table.borderless td,
+table.plain th, table.plain td,
+table.striped th, table.striped td {
+ padding: 2px 5px;
+}
+table.borderless,
+table.borderless > thead > tr > th, table.borderless > tbody > tr > th, table.borderless > tr > th,
+table.borderless > thead > tr > td, table.borderless > tbody > tr > td, table.borderless > tr > td {
+ border: none;
+}
+table.borderless > thead > tr, table.borderless > tbody > tr, table.borderless > tr {
+ background-color: transparent;
+}
+table.plain {
+ border-collapse: collapse;
+ border: 1px solid black;
+}
+table.plain > thead > tr, table.plain > tbody tr, table.plain > tr {
+ background-color: transparent;
+}
+table.plain > thead > tr > th, table.plain > tbody > tr > th, table.plain > tr > th,
+table.plain > thead > tr > td, table.plain > tbody > tr > td, table.plain > tr > td {
+ border: 1px solid black;
+}
+table.striped {
+ border-collapse: collapse;
+ border: 1px solid black;
+}
+table.striped > thead {
+ background-color: #E3E3E3;
+}
+table.striped > thead > tr > th, table.striped > thead > tr > td {
+ border: 1px solid black;
+}
+table.striped > tbody > tr:nth-child(even) {
+ background-color: #EEE
+}
+table.striped > tbody > tr:nth-child(odd) {
+ background-color: #FFF
+}
+table.striped > tbody > tr > th, table.striped > tbody > tr > td {
+ border-left: 1px solid black;
+ border-right: 1px solid black;
+}
+table.striped > tbody > tr > th {
+ font-weight: normal;
+}
diff --git a/doc/tag-search-index.js b/doc/tag-search-index.js
new file mode 100644
index 0000000000000000000000000000000000000000..0367dae65da41cd0c50d2f337b4768a43a66c079
--- /dev/null
+++ b/doc/tag-search-index.js
@@ -0,0 +1 @@
+tagSearchIndex = [];updateSearchResults();
\ No newline at end of file
diff --git a/doc/type-search-index.js b/doc/type-search-index.js
new file mode 100644
index 0000000000000000000000000000000000000000..91172b6338a6fab5d631ab4ee3f6ddbda5eabee6
--- /dev/null
+++ b/doc/type-search-index.js
@@ -0,0 +1 @@
+typeSearchIndex = [{"l":"All Classes","u":"allclasses-index.html"},{"p":"sr2.flopbox","l":"cantConnectToServerException"},{"p":"sr2.flopbox","l":"FileDoesNotExistException"},{"p":"sr2.flopbox","l":"FilesServices"},{"p":"sr2.flopbox","l":"FtpServer"},{"p":"sr2.flopbox","l":"FtpServer.FtpServerBuilder"},{"p":"sr2.flopbox","l":"FtpServerList"},{"p":"sr2.flopbox","l":"FtpServerService"},{"p":"sr2.flopbox","l":"Main"},{"p":"sr2.flopbox","l":"NoServerFoundException"}];updateSearchResults();
\ No newline at end of file
diff --git a/flopboxProject.iml b/flopboxProject.iml
index 01efd7e74bde00a35c84d925950e0fba8ec35cee..f55eb029f7648a540b82069202a4cce2bc765497 100644
--- a/flopboxProject.iml
+++ b/flopboxProject.iml
@@ -6,8 +6,8 @@
<content url="file://$MODULE_DIR$">
<sourceFolder url="file://$MODULE_DIR$/src/main/java" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/test/java" isTestSource="true" />
- <excludeFolder url="file://$MODULE_DIR$/target" />
<excludeFolder url="file://$MODULE_DIR$/.idea/libraries" />
+ <excludeFolder url="file://$MODULE_DIR$/target" />
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
@@ -32,5 +32,12 @@
<orderEntry type="library" name="Maven: javax.ws.rs:javax.ws.rs-api:2.0.1" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: junit:junit:4.9" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.hamcrest:hamcrest-core:1.1" level="project" />
+ <orderEntry type="library" name="Maven: javax.activation:activation:1.1.1" level="project" />
+ <orderEntry type="library" name="Maven: javax.xml.bind:jaxb-api:2.3.0" level="project" />
+ <orderEntry type="library" name="Maven: commons-net:commons-net:3.6" level="project" />
+ <orderEntry type="library" name="Maven: commons-io:commons-io:2.6" level="project" />
+ <orderEntry type="library" name="Maven: com.sun.xml.bind:jaxb-core:2.3.0" level="project" />
+ <orderEntry type="library" name="Maven: com.sun.xml.bind:jaxb-impl:2.3.0" level="project" />
+ <orderEntry type="library" name="Maven: org.jetbrains:annotations:20.1.0" level="project" />
</component>
</module>
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
index 55e4e5732a63de7870d3cae0464e5e1d308e0366..4748aaa4defae53ccb8db0cf3aa337ebd7f52e99 100644
--- a/pom.xml
+++ b/pom.xml
@@ -51,6 +51,18 @@
<version>2.3.0</version>
</dependency>
+ <dependency>
+ <groupId>commons-net</groupId>
+ <artifactId>commons-net</artifactId>
+ <version>3.6</version>
+ </dependency>
+
+ <dependency>
+ <groupId>commons-io</groupId>
+ <artifactId>commons-io</artifactId>
+ <version>2.6</version>
+ </dependency>
+
<dependency>
<groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-core</artifactId>
diff --git a/src/main/java/sr2/flopbox/FTPTool.java b/src/main/java/sr2/flopbox/FTPTool.java
new file mode 100644
index 0000000000000000000000000000000000000000..4e4423dd2c58e9ebdc2915fb5efcffcb8524bb7a
--- /dev/null
+++ b/src/main/java/sr2/flopbox/FTPTool.java
@@ -0,0 +1,326 @@
+package sr2.flopbox;
+
+import org.apache.commons.io.IOUtils;
+import org.apache.commons.net.ftp.FTPClient;
+import org.apache.commons.net.ftp.FTPFile;
+import org.apache.commons.net.ftp.FTPReply;
+
+import javax.ws.rs.core.Response;
+import java.io.*;
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
+import java.util.Optional;
+import java.util.concurrent.CopyOnWriteArrayList;
+
+/**
+ * @author Nathan Houzet
+ * Class used as a tool box
+ * It is used to communicate with the ftp client
+ * And contain also other usefull methods.
+ */
+
+class FTPTool {
+
+ private static final CopyOnWriteArrayList<FtpServer> servList = FtpServerList.getInstance();
+
+ /***
+ * Verifie is the user is well now by the server
+ * @param alias the ftp server alias
+ * @param user the username of the client
+ * @param pass the password of the client
+ * @return true if the client is know by the server, false else
+ * @throws NoServerFoundException if the alias doesnt refer to a server
+ */
+ public static boolean CheckAuthentication(String alias, String user, String pass) throws NoServerFoundException {
+ FTPClient ftp = new FTPClient();
+ FtpServer ftpServ = getFTServerFromAlias(alias);
+ boolean error = false;
+ try {
+ int reply;
+ ftp.connect(ftpServ.getHost(),Integer.parseInt(ftpServ.getPort()));
+ System.out.println("Connected to " + ftpServ.getHost() + ".");
+ System.out.print(ftp.getReplyString());
+
+ // After connection attempt, you should check the reply code to verify
+ // success.
+ reply = ftp.getReplyCode();
+
+ if (!FTPReply.isPositiveCompletion(reply)) {
+ ftp.disconnect();
+ System.err.println("FTP server refused connection.");
+ System.exit(1);
+ }
+
+ boolean success = ftp.login(user, pass);
+ reply = ftp.getReplyCode();
+ if (!success) {
+ System.out.println("Could not login to the server");
+ return false;
+ }
+
+ ftp.logout();
+ } catch (IOException e) {
+ error = true;
+ }
+ return error;
+ }
+
+ /***
+ * Method the return the FTPServer from its alias
+ * @param alias the alias of the FTP server
+ * @return The FTP server corresponding to the alias
+ * @throws NoServerFoundException If the alias is not know
+ */
+ public static FtpServer getFTServerFromAlias(String alias) throws NoServerFoundException {
+ Optional<FtpServer> match
+ = servList.stream()
+ .filter(c -> c.getAlias().equals(alias))
+ .findFirst();
+ if (match.isPresent()) {
+ return match.get();
+ }else{
+ throw new NoServerFoundException("Error, cant find the server called "+alias);
+ }
+ }
+
+ /***
+ * Method used to list the root of a ftp server
+ * @param alias the alias of the server
+ * @param token the connexion token of the client
+ * @return the content of the root directory
+ * @throws NoServerFoundException is the alias given doesnt represent a know server
+ */
+ public static String listRoot(String alias,int token) throws NoServerFoundException {
+ String res = null;
+ try {
+ FTPClient ftp = FTPTool.ConnectAndLogIn(alias,token);
+ // list files of the server
+ FTPFile[] files = ftp.listFiles();
+
+ res = ArrangeListing(files);
+
+ ftp.logout();
+ return res;
+ } catch (IOException e) {
+ res = e.toString();
+
+ }
+ return res;
+ }
+
+ /***
+ * Method used to well print the content of a directory
+ * @param files a array of FTPFiles
+ * @return a nice string representing the content
+ */
+ private static String ArrangeListing(FTPFile[] files) {
+ String res=null;
+ DateFormat dateFormater = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+ // iterates over the files and prints details for each
+ for (FTPFile file : files) {
+ String details = file.getName();
+ if (file.isDirectory()) {
+ details = "[" + details + "]";
+ }
+ details += "\t\t" + file.getSize();
+ details += "\t\t" + dateFormater.format(file.getTimestamp().getTime());
+ res += details + "\n";
+ }
+ return res;
+ }
+
+ /***
+ * Create a connexion token from the user name, the password and the alias of the server
+ * @param alias the alias of the server
+ * @param user the user name of the client
+ * @param pass the password of the client
+ * @return a connexion token
+ */
+ public static int createToken(String alias, String user, String pass) {
+ return (alias+user+pass).hashCode();
+ }
+
+ /***
+ * Method to retrieve the content of anyone repository
+ * @param alias the alias of the FTP server
+ * @param token the client token
+ * @param file the repository to see the content
+ * @return The repository description
+ * @throws NoServerFoundException
+ * @throws IOException
+ * @throws FileDoesNotExistException
+ */
+ public static String listRepository(String alias, int token, String file) throws NoServerFoundException, IOException, FileDoesNotExistException {
+ FTPClient ftp = FTPTool.ConnectAndLogIn(alias,token);
+ String res;
+
+ //on avance de dossier en dossier
+ String [] tab = file.split("/");
+ for (int i = 0;i<tab.length-1;i++){
+ ftp.changeWorkingDirectory(tab[i]);
+ int returnCode = ftp.getReplyCode();
+ if (returnCode == 550) {
+ throw new FileDoesNotExistException("Error, cant find the file called "+tab[i]+"on the server"+alias);
+ }
+
+ }
+ // on récupère le contenu du repertoire du dernier répertoire
+ ftp.changeWorkingDirectory(tab[tab.length-1]);
+ int returnCode = ftp.getReplyCode();
+
+ if (!FTPReply.isPositiveCompletion(returnCode)) {
+ ftp.disconnect();
+ System.exit(1);
+ }
+ FTPFile[] files = ftp.listFiles();
+ res = ArrangeListing(files);
+
+ ftp.logout();
+ return res;
+
+ }
+ /***
+ * Method to retrieve the content of anyone text file
+ * @param alias the alias of the FTP server
+ * @param token the client token
+ * @param file the file to see the content
+ * @return a array of byte with the file content
+ * @throws NoServerFoundException if the alias is not linked to a server
+ * @throws IOException If they are a problem while the classic ftp commands
+ * @throws FileDoesNotExistException If the file given in parameter doesnt exist
+ */
+ public static byte[] listFile(String alias, int token, String file) throws NoServerFoundException, IOException, FileDoesNotExistException {
+ FTPClient ftp = FTPTool.ConnectAndLogIn(alias,token);
+
+ InputStream inputStream = ftp.retrieveFileStream(file);
+ int returnCode = ftp.getReplyCode();
+ if (returnCode == 550) {
+ throw new FileDoesNotExistException("Error, cant find the file called "+file+"on the server "+alias);
+ }
+ byte[] bytes = IOUtils.toByteArray(inputStream);
+ ftp.logout();
+ return bytes;
+
+ }
+
+ /***
+ * Method used to rename an file or a directory from a ftp server.
+ * @param alias the alias of the ftp server
+ * @param token the connexion token of the client
+ * @param path the path of the file to be deleted
+ * @param newPath the new name of the file
+ * @return true if the file is deleted
+ * @throws IOException if they are problem with the ftp server connection like a bad port or host
+ * @throws NoServerFoundException if the alias dont represent a server.
+ */
+ public static Boolean renameFile(String alias, int token, String path,String newPath) throws NoServerFoundException, IOException {
+
+ System.out.println("in Connect and test");
+ FTPClient ftp = FTPTool.ConnectAndLogIn(alias,token);
+
+ ftp.rename(path,newPath);
+ int reply = ftp.getReplyCode();
+ if (!FTPReply.isPositiveCompletion(reply)) {
+ ftp.disconnect();
+ System.err.println("FTP server refused to rename.");
+ return false;
+ }
+ ftp.logout();
+ ftp.disconnect();
+ return true;
+ }
+
+
+ /***
+ * Method used to init the ftp connection and the logging the client.
+ * avoid to repeat it in all the ftp commands functions
+ * @param alias the alias of the ftp server
+ * @param token the connexion token of the client
+ * @return The Ftp client created and logged in
+ * @throws NoServerFoundException if they are problem with the ftp server connection like a bad port or host
+ * @throws IOException if the alias dont represent a server.
+ */
+ public static FTPClient ConnectAndLogIn(String alias, int token) throws NoServerFoundException, IOException {
+
+ FTPClient ftp = new FTPClient();
+ FtpServer ftpServ = getFTServerFromAlias(alias);
+ int reply;
+
+
+ ftp.connect(ftpServ.getHost(), Integer.parseInt(ftpServ.getPort()));
+ System.out.println("Connected to " + ftpServ.getHost() + ".");
+ System.out.print(ftp.getReplyString());
+ String user = ftpServ.getUserAndPass(token);
+ String [] tmp= user.split(";");
+ user = tmp[0];
+ String pass = tmp[1];
+
+ // After connection attempt, you should check the reply code to verify
+ // success.
+ reply = ftp.getReplyCode();
+
+ if (!FTPReply.isPositiveCompletion(reply)) {
+ ftp.disconnect();
+ System.err.println("FTP server refused connection.");
+ System.exit(1);
+ }
+ boolean success = ftp.login(user, pass);
+ reply = ftp.getReplyCode();
+
+ if (!success) {
+ System.err.println(reply+"Could not login to the server");
+ System.exit(1);
+ }
+ return ftp;
+ }
+
+ /***
+ * Method used to delete an file or a directory from a ftp server.
+ * The program will firstly try to remove the file like a file and if its fails to remove it like a directory and else fail.
+ * @param alias the alias of the ftp server
+ * @param token the connexion token of the client
+ * @param path the path of the file to be deleted
+ * @return true if the file is deleted
+ * @throws IOException if they are problem with the ftp server connection like a bad port or host
+ * @throws NoServerFoundException if the alias dont represent a server.
+ */
+ public static Boolean deleteFile(String alias, int token, String path) throws IOException, NoServerFoundException {
+ FTPClient ftp = FTPTool.ConnectAndLogIn(alias,token);
+
+ ftp.deleteFile(path);
+ int reply = ftp.getReplyCode();
+ if (!FTPReply.isPositiveCompletion(reply)) {
+ ftp.removeDirectory(path);
+ reply = ftp.getReplyCode();
+ if (!FTPReply.isPositiveCompletion(reply)) {
+ System.err.println("FTP server refused to rename.");
+ return false;
+ }
+ }
+ ftp.logout();
+ return true;
+ }
+
+ /***
+ * Method used to add a new directory to the FTP server
+ * @param alias the alias of the FTP server
+ * @param token the client token
+ * @param path the path of the new file to add
+ * @return true if the file is well created else false
+ * @throws IOException if the mkd ftp comment fail
+ * @throws NoServerFoundException is the server named by the alias doesnt exist
+ */
+ public static Boolean addFile(String alias, int token, String path) throws IOException, NoServerFoundException {
+ FTPClient ftp = FTPTool.ConnectAndLogIn(alias,token);
+
+ ftp.makeDirectory(path);
+ int reply = ftp.getReplyCode();
+ if (!FTPReply.isPositiveCompletion(reply)) {
+ System.err.println("FTP server refused to create the file.");
+ return false;
+ }
+ ftp.logout();
+ return true;
+ }
+
+}
\ No newline at end of file
diff --git a/src/main/java/sr2/flopbox/FileDoesNotExistException.java b/src/main/java/sr2/flopbox/FileDoesNotExistException.java
new file mode 100644
index 0000000000000000000000000000000000000000..0691286a4551e840f92635453a1cf30c4ec9d552
--- /dev/null
+++ b/src/main/java/sr2/flopbox/FileDoesNotExistException.java
@@ -0,0 +1,11 @@
+package sr2.flopbox;
+
+/***
+ * @author Nathan Houzet
+ * Exception for the case where the client want to retrieve a file that doent exist
+ */
+public class FileDoesNotExistException extends Exception{
+ public FileDoesNotExistException(String errorMessage) {
+ super(errorMessage);
+ }
+}
diff --git a/src/main/java/sr2/flopbox/FilesServices.java b/src/main/java/sr2/flopbox/FilesServices.java
index 0cadb4c5a03ff0e8e47878e80b6037aee20feb7b..ada9d2b6d21dc561e1663e64492616af5ebd6ed6 100644
--- a/src/main/java/sr2/flopbox/FilesServices.java
+++ b/src/main/java/sr2/flopbox/FilesServices.java
@@ -1,11 +1,166 @@
package sr2.flopbox;
-import javax.ws.rs.Path;
+import org.apache.commons.io.IOUtils;
-@Path("servers/{id}/files")
+import javax.ws.rs.*;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import java.io.IOException;
+import java.io.InputStream;
+
+/***
+ * @author Nathan Houzet
+ * Second Ressource of the API
+ * Its manage all files findind and displaying exept the root repository of a server
+ */
+@Path("servers/{alias}/files")
public class FilesServices {
+ /***
+ * Method to list the content of any repository
+ * @param token the client token from the header
+ * @param file the repository to display
+ * @param alias the ftp server alias
+ * @return The content of the `file` repository
+ * @throws NoServerFoundException If the alias refer to no server known
+ * @throws IOException if they are a FTP command fail during the function process
+ * @throws FileDoesNotExistException is the repository doesnt exist
+ */
+ @GET
+ @Path("getContentRep")
+ @Produces(MediaType.TEXT_PLAIN)
+ public String listrepository(@HeaderParam("token")String token, @QueryParam("file")String file, @PathParam("alias") String alias) throws NoServerFoundException, IOException, FileDoesNotExistException {
+ if (!FTPTool.getFTServerFromAlias(alias).checkIfUserExist(Integer.parseInt(token))) {
+ return "400 please authenticate yourself for the server" + alias + " via " + alias + "/login";
+ }
+ String res = FTPTool.listRepository(alias,Integer.parseInt(token),file);
+ System.out.println(res);
+ return res;
+ }
+
+ /***
+ * Method to list the content of any text file
+ * @param token the client token from the header
+ * @param file the file to display
+ * @param alias the ftp server alias
+ * @return The content of the `file`
+ * @throws NoServerFoundException If the alias refer to no server known
+ * @throws IOException if they are a FTP command fail during the function process
+ * @throws FileDoesNotExistException is the file doesnt exist
+ */
+ @GET
+ @Path("getContentFile")
+ @Produces(MediaType.APPLICATION_OCTET_STREAM)
+ public Object listFile(@HeaderParam("token")String token, @QueryParam("file")String file, @PathParam("alias") String alias) throws NoServerFoundException, IOException, FileDoesNotExistException {
+ if (!FTPTool.getFTServerFromAlias(alias).checkIfUserExist(Integer.parseInt(token))){
+ return "400 please authenticate yourself for the server"+ alias+" via " +alias+"/login";
+ }
+ byte[] res = FTPTool.listFile(alias,Integer.parseInt(token),file);
+ Response.ResponseBuilder builder = Response.ok(res);
+ builder.header("Content-Disposition", "attachment; filename=" + file);
+
+ return res;
+ }
+
+ /***
+ * Method used to rename a file or a repository
+ * @param token the client token from the header
+ * @param path the path of the file to rename
+ * @param alias the ftp server alias
+ * @param newPath the new name of the repository
+ * @return a String about the success or the fail of the method
+ * @throws NoServerFoundException If the alias refer to no server known
+ * @throws IOException if they are a FTP command fail during the function process
+ * @throws FileDoesNotExistException is the file doesnt exist
+ */
+ @POST
+ @Path("rename")
+ @Produces({MediaType.TEXT_PLAIN, MediaType.APPLICATION_OCTET_STREAM})
+ public String rename(
+ @HeaderParam("token")String token,
+ @QueryParam("path")String path,
+ @PathParam("alias") String alias,
+ @QueryParam("newPath") String newPath) throws NoServerFoundException, IOException, FileDoesNotExistException {
+
+ if (!FTPTool.getFTServerFromAlias(alias).checkIfUserExist(Integer.parseInt(token))){
+ return "400 please authenticate yourself for the server"+ alias+" via " +alias+"/login";
+ }
+ Boolean res = FTPTool.renameFile(alias,Integer.parseInt(token),path,newPath);
+
+ return res? "200 File well renamed": "400 Failed to rename that File";
+ }
+
+ /***
+ * method used to delete any file or repository of the server 'alias'
+ * @param token the client token from the header
+ * @param path the path of the file to delete
+ * @param alias the ftp server alias
+ * @return a String about the success or the fail of the method
+ * @throws NoServerFoundException If the alias refer to no server known
+ * @throws IOException if they are a FTP command fail during the function process
+ */
+ @DELETE
+ @Path("delete")
+ @Produces({MediaType.TEXT_PLAIN, MediaType.APPLICATION_OCTET_STREAM})
+ public Object delete(
+ @HeaderParam("token")String token,
+ @QueryParam("path")String path,
+ @PathParam("alias") String alias
+ ) throws NoServerFoundException, IOException {
+
+ if (!FTPTool.getFTServerFromAlias(alias).checkIfUserExist(Integer.parseInt(token))){
+ return "400 please authenticate yourself for the server"+ alias+" via " +alias+"/login";
+ }
+ Boolean res = FTPTool.deleteFile(alias,Integer.parseInt(token),path);
+
+ return res? "200 File well deleted": "400 Failed to deleted that File";
+ }
+
+ /***
+ * Method used to create repository
+ * @param token the client token from the header
+ * @param path the path of the repository to create
+ * @param alias the ftp server alias
+ * @return a String about the success or the fail of the method
+ * @throws NoServerFoundException If the alias refer to no server known
+ * @throws IOException if they are a FTP command fail during the function process
+ */
+ @PUT
+ @Path("add")
+ @Produces({MediaType.TEXT_PLAIN, MediaType.APPLICATION_OCTET_STREAM})
+ public Object addfile(
+ @HeaderParam("token")String token,
+ @QueryParam("path")String path,
+ @PathParam("alias") String alias
+ ) throws NoServerFoundException, IOException {
+
+ if (!FTPTool.getFTServerFromAlias(alias).checkIfUserExist(Integer.parseInt(token))){
+ return "400 please authenticate yourself for the server"+ alias+" via " +alias+"/login";
+ }
+ Boolean res = FTPTool.addFile(alias,Integer.parseInt(token),path);
+
+ return res? "200 File well created": "400 Failed to create that File";
+ }
+
+ /***
+ * Method to check is the resource is ok
+ * @param token the client token
+ * @param alias the ftp server alias
+ * @return a string about the resource
+ * @throws NoServerFoundException is the alias doesnt refer to a ftp server known
+ */
+ @GET
+ @Produces({MediaType.TEXT_PLAIN})
+ public String test( @HeaderParam("token")String token,
+ @PathParam("alias") String alias) throws NoServerFoundException {
+
+ if (!FTPTool.getFTServerFromAlias(alias).checkIfUserExist(Integer.parseInt(token))) {
+ return "400 please authenticate yourself for the server" + alias + " via " + alias + "/login";
+ }
+ return "200 you're inn the file resource!!";
+ }
+
}
diff --git a/src/main/java/sr2/flopbox/FtpServer.java b/src/main/java/sr2/flopbox/FtpServer.java
index 66bb4693787bc65a67d1d40fd751c723168d7083..a679d4124d8cadc33eeec6a8079f54d6458cff52 100644
--- a/src/main/java/sr2/flopbox/FtpServer.java
+++ b/src/main/java/sr2/flopbox/FtpServer.java
@@ -1,90 +1,212 @@
package sr2.flopbox;
+import java.util.HashMap;
import java.util.ServiceConfigurationError;
import java.util.concurrent.atomic.AtomicLong;
+/***
+ * @author Nathan Houzet
+ * Class that represent a FTP server and all its informations
+ */
+
public class FtpServer {
private final long id;
private final String host;
private final String port;
-
+ private String alias;
+ private HashMap<Integer,String> auth;
private static final AtomicLong counter = new AtomicLong(100);
+ /***
+ * Constructor from a builder for the class
+ * @param builder the FTP builder
+ */
private FtpServer(FtpServerBuilder builder){
this.id = builder.id;
this.host = builder.host;
this.port = builder.port;
+ this.alias = builder.alias;
+ this.auth = new HashMap<Integer,String>();
}
+ /***
+ * Constructor from a builder for the class
+ */
public FtpServer(){
FtpServer ser = new FtpServer.FtpServerBuilder().id().build();
this.id = ser.getId();
this.host = ser.getHost();
this.port = ser.getPort();
+ this.alias = ser.getAlias();
+ this.auth = new HashMap<Integer,String>();
}
- public FtpServer(long id, String host, String port){
+ /***
+ * classic constructor for this class
+ * @param id the if of the FTP server
+ * @param host the host of the FTP server
+ * @param port the port of the ftp server
+ * @param alias the alias of the ftp server
+ */
+ public FtpServer(long id, String host, String port,String alias){
FtpServer ser = new FtpServer.FtpServerBuilder().id()
.host(host)
.port(port)
+ .alias(alias)
.build();
this.id = ser.getId();
this.host = ser.getHost();
this.port = ser.getPort();
+ this.alias = ser.getAlias();
+ this.auth = new HashMap<Integer,String>();
}
-
+ /***
+ *
+ * @return the if of the server
+ */
public long getId(){
return this.id;
}
+ /***
+ *
+ * @return the host of the server
+ */
public String getHost() {
return this.host;
}
+ /***
+ *
+ * @return the port of the server
+ */
public String getPort() {
return this.port;
}
+ /***
+ *
+ * @return the alias of the server
+ */
+ public String getAlias() {return this.alias;}
+
+ /**
+ * Used to add a new user for this server
+ * @param token the user token
+ * @param user the user name
+ * @param pass the user password
+ */
+ public void addUser(int token, String user, String pass){
+ this.auth.put(token,user+";"+pass);
+ }
+
+ /***
+ * check if an user exist for the server from his token
+ * @param token the token to check
+ * @return true if the token and so the user is know by this server
+ * else false
+ */
+ public boolean checkIfUserExist(int token){
+ return this.auth.containsKey(token);
+ }
+
+ /***
+ * Getter for the user name and password of a client
+ * @param token the client's token that allow to find the credentials of the client
+ * @return the user name and the password of the client user the form "user;password"
+ */
+ public String getUserAndPass(int token){
+ return this.auth.get(token);
+ }
+ /***
+ *
+ * @return a string that describe the server
+ */
@Override
public String toString(){
return "ID: " + id
+ " Host: " + host
- + " Port: " + String.valueOf(port) + "\n"
+ + " Port: " + port
+ + " Alias " + alias + "\n"
;
}
+ /***
+ *
+ * @param newAlias The new alias of the server
+ */
+ public void setAlias(String newAlias) {
+ this.alias=newAlias;
+ }
+
+ /***
+ * Constructor of a FTP client builder
+ */
public static class FtpServerBuilder{
private long id;
private String host = "";
private String port = "";
+ private String alias = "";
+ /***
+ *
+ * @return a id incremented from 1 comparing to the last id given
+ */
public FtpServerBuilder id(){
this.id = FtpServer.counter.getAndIncrement();
return this;
}
+ /***
+ *
+ * @param id The id of the server
+ * @return the id of the server
+ */
public FtpServerBuilder id(long id){
this.id = id;
return this;
}
+ /***
+ *
+ * @param host The host of the server
+ * @return the host of the server
+ */
public FtpServerBuilder host(String host){
this.host = host;
return this;
}
+ /****
+ *
+ * @param port The port of the server
+ * @return the port of the server
+ */
public FtpServerBuilder port(String port){
this.port = port;
return this;
}
+ /***
+ *
+ * @param alias The alias of the server
+ * @return the alias of the server
+ */
+ public FtpServerBuilder alias(String alias){
+ this.alias = alias;
+ return this;
+ }
+ /***
+ * Building method
+ * @return a FTPServer
+ */
public FtpServer build(){
return new FtpServer(this);
}
diff --git a/src/main/java/sr2/flopbox/FtpServerList.java b/src/main/java/sr2/flopbox/FtpServerList.java
index e0ab907a9b98fb597b2aa47dbcaf7518611a619b..9c956c317b4e109ecd6e59c6626064fe0b22deac 100644
--- a/src/main/java/sr2/flopbox/FtpServerList.java
+++ b/src/main/java/sr2/flopbox/FtpServerList.java
@@ -3,56 +3,42 @@ package sr2.flopbox;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.stream.Collectors;
-
+/***
+ * @author Nathan Houzet
+ * Class that contain the servers known by the API
+ */
public class FtpServerList {
- private static final CopyOnWriteArrayList<FtpServer> cList = new CopyOnWriteArrayList<>();
+ private static final CopyOnWriteArrayList<FtpServer> sList = new CopyOnWriteArrayList<>();
static {
// Create list of customers
- cList.add(
+ sList.add(
new FtpServer.FtpServerBuilder().id()
- .host("http://ftp.free.fr/")
+ .host("212.27.60.27")
.port("22")
+ .alias("free")
.build()
);
- cList.add(
+ sList.add(
new FtpServer.FtpServerBuilder().id()
- .host("http://ftp.ubuntu.com/")
+ .host("91.189.88.152")
.port("22")
+ .alias("ubuntu")
.build()
);
- cList.add(
- new FtpServer.FtpServerBuilder().id()
- .host("127.0.0.1")
- .port("2121")
- .build()
- );
}
- private FtpServerList(){}
-
+ /***
+ * @return an instance of the servers list
+ */
public static CopyOnWriteArrayList<FtpServer> getInstance(){
- return cList;
- }
-
- public static void testList(){
- CopyOnWriteArrayList<FtpServer> list = FtpServerList.getInstance();
- list.stream()
- .forEach(i -> System.out.println(i));
- String cString =
- list.stream()
- .map( c -> c.toString())
- .collect(Collectors.joining("\n"));
- System.out.println(cString);
+ return sList;
}
- public static void main(String[] args) {
- FtpServerList.testList();
- }
}
diff --git a/src/main/java/sr2/flopbox/FtpServerService.java b/src/main/java/sr2/flopbox/FtpServerService.java
index 389d7a8165add2aa8e11fa7ceac961854f7a8e0a..1bc24a9d519bc162c22dfc39b2cec8bf4bf293b6 100644
--- a/src/main/java/sr2/flopbox/FtpServerService.java
+++ b/src/main/java/sr2/flopbox/FtpServerService.java
@@ -1,48 +1,70 @@
package sr2.flopbox;
+import java.io.IOException;
import java.util.Optional;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.stream.Collectors;
import javax.ws.rs.*;
import javax.ws.rs.core.MediaType;
+import javax.ws.rs.QueryParam;
+import javax.validation.constraints.NotNull;
+
+/***
+ * @author Nathan Houzet
+ * Main ressource of the API
+ * Its manage the server part
+ */
@Path("/servers")
public class FtpServerService {
private final CopyOnWriteArrayList<FtpServer> servList = FtpServerList.getInstance();
-
+ /***
+ * Method used to add a server to the API
+ * @param host The hst name of the new server
+ * @param port the port of the new server
+ * @param alias the alias of the new server
+ * @return A string about the success of the adding
+ */
@POST
- @Path("/create")
@Produces(MediaType.TEXT_PLAIN)
- public String addServer( @QueryParam("host") String host, @QueryParam("port") String port){
- System.out.println("in the add");
- if(host.equals("") || port.equals(""))
- return "400 an empty host or an empty port is given";
+ @Consumes(MediaType.APPLICATION_FORM_URLENCODED)
+ public String addServer(@NotNull @QueryParam("host") String host, @NotNull @QueryParam("port") String port,@NotNull @QueryParam("alias") String alias){
+ if(host==null || port==null|| alias ==null)
+ return "400 an empty host or an empty port or an empty alias is given";
else {
- servList.add(new FtpServer.FtpServerBuilder().id().host(host).port(port).build());
+ servList.add(new FtpServer.FtpServerBuilder().id().host(host).port(port).alias(alias).build());
return "200 server " + host + " on the port " + port + " is well add to the flopbox";
}
}
+ /***
+ * method that return all the FTP server know by the API
+ * @return A string about each servers
+ */
@GET
@Produces(MediaType.TEXT_PLAIN)
public String getAllFTPServers() {
- System.out.println("in the all");
return "---FTP Server---\n"
+ servList.stream()
.map(c -> c.toString())
.collect(Collectors.joining("\n"));
}
+ /***
+ * Method that gives information about one FTP server
+ * @param alias the alias of the server
+ * @return information about the FTP server
+ */
@GET
- @Path("{id}")
+ @Path("{alias}/info")
@Produces(MediaType.TEXT_PLAIN)
- public String getServer(@PathParam("id") long id) {
+ public String getServer(@PathParam("alias") String alias) {
Optional<FtpServer> match
= servList.stream()
- .filter(c -> c.getId() == id)
+ .filter(c -> c.getAlias().equals(alias))
.findFirst();
if (match.isPresent()) {
return "---FTP Server---\n" + match.get().toString();
@@ -51,5 +73,71 @@ public class FtpServerService {
}
}
+ /***
+ * Method the register a username and a password for the server 'alias'
+ * The credentials will be only save for this server
+ * @param user the username of the client
+ * @param pass the password of the client
+ * @param alias the alias of the FTP server
+ * @return a token that the client will have to send in each request in the header
+ * @throws NoServerFoundException if the alias doesnt refer to a known server
+ */
+ @GET
+ @Path("{alias}/login")
+ @Produces(MediaType.TEXT_PLAIN)
+ public String login(@QueryParam("user") String user,@QueryParam("pass") String pass,@PathParam("alias")String alias) throws NoServerFoundException {
+ boolean error = FTPTool.CheckAuthentication(alias,user,pass);
+ if (!error ){
+ int token = FTPTool.createToken(alias,user,pass);
+ FTPTool.getFTServerFromAlias(alias).addUser(token,user,pass);
+ return "200 Authentication to "+alias+" is done, your token to put in " +
+ "header is "+token;
+ }else{
+ return "400 the server don't recognize these credentials";
+ }
+
+ }
+
+ /***
+ * Method to get the content of the root repertory of a server
+ * @param token the client connexion token
+ * @param alias the FTP server alias
+ * @return The content of the root of the repertory
+ * @throws NoServerFoundException if the alias doesnt refer to a known server
+ * @throws IOException If a FTP command fails in the execution
+ * @throws cantConnectToServerException if they are a problem of connection with the server
+ */
+ @GET
+ @Path("{alias}")
+ @Produces(MediaType.TEXT_PLAIN)
+ public String listRoot(@HeaderParam("token")String token,@PathParam("alias") String alias) throws NoServerFoundException, IOException, cantConnectToServerException {
+ if (!FTPTool.getFTServerFromAlias(alias).checkIfUserExist(Integer.parseInt(token))){
+ return "400 please authenticate yourself for the server"+ alias+" via " +alias+"/login";
+ }
+ return FTPTool.listRoot(alias, Integer.parseInt(token));
+
+ }
+
+ /***
+ * Method to change a alias of a FTP server
+ * @param token the client connexion token
+ * @param alias the alias of the server to change the alias
+ * @param newAlias the new alias
+ * @return a String about the success of the function
+ * @throws NoServerFoundException if the alias doesnt refer to a server known
+ */
+ @PUT
+ @Path("{alias}/change")
+ @Produces(MediaType.TEXT_PLAIN)
+ public String changeAlias(@HeaderParam("token")String token,@PathParam("alias") String alias,@QueryParam("newAlias") String newAlias) throws NoServerFoundException{
+ if (!FTPTool.getFTServerFromAlias(alias).checkIfUserExist(Integer.parseInt(token))){
+ return "400 please authenticate yourself for the server"+ alias+" via " +alias+"/login";
+ }
+ FtpServer ser = FTPTool.getFTServerFromAlias(alias);
+ ser.setAlias(newAlias);
+ return "200 alias was well changed in "+newAlias + " for the server "+ser.getHost();
+
+ }
+
}
diff --git a/src/main/java/sr2/flopbox/Main.java b/src/main/java/sr2/flopbox/Main.java
index 5c3646ef25ced579e64881e51e50b1725e925e72..bca501066ed0a986f4a4567ce9327dbd48fdaef3 100644
--- a/src/main/java/sr2/flopbox/Main.java
+++ b/src/main/java/sr2/flopbox/Main.java
@@ -7,19 +7,22 @@ import org.glassfish.jersey.server.ResourceConfig;
import java.io.IOException;
import java.net.URI;
+
/**
+ * @author Nathan Houzet
* Main class.
- *
+ * Init the API and launch it
*/
public class Main {
// Base URI the Grizzly HTTP server will listen on
- public static final String BASE_URI = "http://localhost:8080/flopbox/";
+ public static final FTPTool FTPtool = new FTPTool();
/**
* Starts Grizzly HTTP server exposing JAX-RS resources defined in this application.
* @return Grizzly HTTP server.
+ * @param BASE_URI
*/
- public static HttpServer startServer() {
+ public static HttpServer startServer(String BASE_URI) {
// create a resource config that scans for JAX-RS resources and providers
// in sr2.flopbox package
final ResourceConfig rc = new ResourceConfig().packages("sr2.flopbox");
@@ -31,15 +34,34 @@ public class Main {
/**
* Main method.
- * @param args
- * @throws IOException
+ * @param args the arguments of the main : NONE here
+ * @throws IOException if they are a problem while starting the HTTP server
*/
public static void main(String[] args) throws IOException {
- final HttpServer server = startServer();
+ String url;
+ String port;
+ if (args.length==2) {
+ url = args[0];
+ port = args[1];
+ }
+ else{
+ url = "flopbox";
+ port = "8080";
+ }
+ String BASE_URI = "http://localhost:"+port +"/"+url+"/";
+
+ final HttpServer server = startServer(BASE_URI);
System.out.println(String.format("Jersey app started with WADL available at "
+ "%sapplication.wadl\nHit enter to stop it...", BASE_URI));
- System.in.read();
- server.stop();
+ try {
+ System.in.read();
+ }
+ catch (Exception e){
+ System.out.println(e.getMessage());
+ }finally {
+ server.stop();
+ }
+
}
}
diff --git a/src/main/java/sr2/flopbox/MyResource.java b/src/main/java/sr2/flopbox/MyResource.java
deleted file mode 100644
index 1c07049f138d0593857e350d718cdcde7ae26979..0000000000000000000000000000000000000000
--- a/src/main/java/sr2/flopbox/MyResource.java
+++ /dev/null
@@ -1,25 +0,0 @@
-package sr2.flopbox;
-
-import javax.ws.rs.GET;
-import javax.ws.rs.Path;
-import javax.ws.rs.Produces;
-import javax.ws.rs.core.MediaType;
-
-/**
- * Root resource (exposed at "myresource" path)
- */
-@Path("myresource")
-public class MyResource {
-
- /**
- * Method handling HTTP GET requests. The returned object will be sent
- * to the client as "text/plain" media type.
- *
- * @return String that will be returned as a text/plain response.
- */
- @GET
- @Produces(MediaType.TEXT_PLAIN)
- public String getIt() {
- return "Got it!";
- }
-}
diff --git a/src/main/java/sr2/flopbox/NoServerFoundException.java b/src/main/java/sr2/flopbox/NoServerFoundException.java
new file mode 100644
index 0000000000000000000000000000000000000000..478a3c651bcda84406e1dba2a9d0251b9819bf86
--- /dev/null
+++ b/src/main/java/sr2/flopbox/NoServerFoundException.java
@@ -0,0 +1,10 @@
+package sr2.flopbox;
+
+/***
+ * Exception throws if the alias dont refer to server
+ */
+public class NoServerFoundException extends Exception {
+ public NoServerFoundException(String errorMessage) {
+ super(errorMessage);
+ }
+}
diff --git a/src/main/java/sr2/flopbox/cantConnectToServerException.java b/src/main/java/sr2/flopbox/cantConnectToServerException.java
new file mode 100644
index 0000000000000000000000000000000000000000..c6e1940ded8055b0067e2da7451135f1531ac6bb
--- /dev/null
+++ b/src/main/java/sr2/flopbox/cantConnectToServerException.java
@@ -0,0 +1,11 @@
+package sr2.flopbox;
+
+/***
+ * @author Nathan Houzet
+ * Exception for the case where the client can't connect to the server
+ */
+public class cantConnectToServerException extends Exception{
+ public cantConnectToServerException(String errorMessage) {
+ super(errorMessage);
+ }
+}
diff --git a/src/test/java/sr2/flopbox/MyResourceTest.java b/src/test/java/sr2/flopbox/MyResourceTest.java
deleted file mode 100644
index 2fd592a915d055573d948a7f9a13fb6fdcf0bf1c..0000000000000000000000000000000000000000
--- a/src/test/java/sr2/flopbox/MyResourceTest.java
+++ /dev/null
@@ -1,48 +0,0 @@
-package sr2.flopbox;
-
-import javax.ws.rs.client.Client;
-import javax.ws.rs.client.ClientBuilder;
-import javax.ws.rs.client.WebTarget;
-
-import org.glassfish.grizzly.http.server.HttpServer;
-
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-import static org.junit.Assert.assertEquals;
-
-public class MyResourceTest {
-
- private HttpServer server;
- private WebTarget target;
-
- @Before
- public void setUp() throws Exception {
- // start the server
- server = Main.startServer();
- // create the client
- Client c = ClientBuilder.newClient();
-
- // uncomment the following line if you want to enable
- // support for JSON in the client (you also have to uncomment
- // dependency on jersey-media-json module in pom.xml and Main.startServer())
- // --
- // c.configuration().enable(new org.glassfish.jersey.media.json.JsonJaxbFeature());
-
- target = c.target(Main.BASE_URI);
- }
-
- @After
- public void tearDown() throws Exception {
- server.stop();
- }
-
- /**
- * Test to see that the message "Got it!" is sent in the response.
- */
- @Test
- public void testGetIt() {
- String responseMsg = target.path("myresource").request().get(String.class);
- assertEquals("Got it!", responseMsg);
- }
-}
diff --git a/src/test/java/sr2/flopbox/Tests.java b/src/test/java/sr2/flopbox/Tests.java
new file mode 100644
index 0000000000000000000000000000000000000000..743614a633d2bb50af1ff644f6437a4d8fb3f216
--- /dev/null
+++ b/src/test/java/sr2/flopbox/Tests.java
@@ -0,0 +1,89 @@
+
+package sr2.flopbox;
+
+import javax.ws.rs.client.Client;
+import javax.ws.rs.client.ClientBuilder;
+import javax.ws.rs.client.WebTarget;
+
+import org.glassfish.grizzly.http.server.HttpServer;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+import static org.junit.Assert.*;
+
+public class Tests {
+
+ FtpServer ser= new FtpServer.FtpServerBuilder().id().host("212.27.60.27").port("22").alias("free").build();
+ FTPTool FTPtool = new FTPTool();
+
+ /**
+ * Test the token of a client is well generated.
+ */
+
+ @Test
+ public void testTokenOK() {
+ FTPTool FTPtool = new FTPTool();
+ String tmp = "alias"+"nathan"+"houzet";
+ assertEquals(tmp.hashCode(), FTPtool.createToken("alias","nathan","houzet") );
+ }
+
+ /**
+ * Test the token of a client is well generated.
+ */
+
+ @Test
+ public void testTokenKO() {
+
+ String tmp = "alias"+"nathan"+"houze";
+ assertFalse(tmp.hashCode()== FTPtool.createToken("alias","nathan","houzet") );
+ }
+
+ @Test
+ public void testAuthKOBecauseNotregister(){
+ int token = FTPtool.createToken("alias","nathan","houzet");
+ assertFalse(ser.checkIfUserExist(token));
+ }
+
+ @Test
+ public void testAuthKOBecauseNotGoodToken(){
+ int token = FTPtool.createToken("alias","nathan","houzet");
+ ser.addUser(token,"nathan", "houzet");
+ assertFalse(ser.checkIfUserExist(token-1));
+ }
+
+ @Test
+ public void testAuthOK(){
+ int token = FTPtool.createToken("alias","nathan","houzet");
+ ser.addUser(token,"nathan", "houzet");
+ assertTrue(ser.checkIfUserExist(token));
+ }
+
+ @Test
+ public void testGetterAuth(){
+ int token = FTPtool.createToken("alias","nathan","houzet");
+ ser.addUser(token,"nathan", "houzet");
+ assertEquals("nathan;houzet",ser.getUserAndPass(token));
+ }
+
+ @Test
+ public void testFTPServerGetter(){
+ assertEquals("212.27.60.27",ser.getHost());
+ assertEquals("22",ser.getPort());
+ assertEquals("free",ser.getAlias());
+ }
+
+ @Test
+ public void testFTPServerSetter(){
+ assertEquals("free",ser.getAlias());
+ ser.setAlias("toto");
+ assertEquals("toto",ser.getAlias());
+ }
+
+
+
+}
+
+
+